gp_design 0.1.0 copy "gp_design: ^0.1.0" to clipboard
gp_design: ^0.1.0 copied to clipboard

Colección de componentes, temas, tokens visuales y utilidades responsivas para construir apps Flutter consistentes con el sistema de diseño GP.

0.1.0 #

  • Nuevo (export): GpProfilePhotoAvatarFrame — existía en src/widgets/profile/ pero no estaba en el barrel público (gp_design.dart), así que ninguna app consumidora podía usarlo. Es un avatar circular con anillo de degradé y sombra, pensado como hero de pantallas de perfil; ahora exportado.

  • Nuevo: GpTheme.light/dark pasan a parámetros nombrados (antes 1-2 posicionales opcionales; ningún call site del repo los usaba posicional, así que no rompe nada) y aceptan textSize (GpTextSizeScale, misma idea que GpColorPalette pero para la escala tipográfica — a diferencia de GpSpacing/GpBorderRadius, GpTextSize solo se usaba adentro de gp_theme.dart, así que fue seguro/barato hacerlo inyectable sin tocar el resto de la librería) y fontFamily (String?, hoy sin soporte en absoluto — usa la fuente default de Flutter si no se pasa).

  • Fix: GpText, GpOtpInput y GpPinInput tenían fallbacks de color de último recurso (?? GpColors.grey4/primary/danger/etc.) que ignoraban el theme activo — casi inalcanzables en uso normal (el theme de GpTheme.light/dark siempre los deja resueltos antes), pero si alguna vez se activaban, caían al color fijo de la paleta default en vez de al modo oscuro/paleta custom. Ahora usan theme.colorScheme.xxx como último recurso.

  • Fix: GpSnackBar resolvía el ThemeData solo si le pasaban context directo (context != null ? Theme.of(context) : null) — si se llamaba sin context (el caso "desde un servicio/interceptor"), el estilo caía a los defaults fijos de GpColors, ignorando modo oscuro y cualquier paleta custom inyectada vía GpTheme.light(colors:)/dark(colors:). Ahora usa GpNavigator.resolve(), igual que el resto de la librería.

  • Nuevo: GpColors/GpDarkColors (los defaults, sin cambios) ahora tienen versión instanciable — GpColorPalette/GpDarkColorPalette — que se le puede pasar a GpTheme.light(colors:)/dark(colors:) para que una app consumidora inyecte su propia paleta de marca sin tocar la librería. Los tonos "container" de banners/badges (éxito, error, warning, info) ahora se derivan del color inyectado (Color.lerp hacia blanco/negro) en vez de quedar fijos, para que combinen con cualquier paleta.

  • Nuevo: GpQrCode({data:}) — pinta un código QR local a partir de un texto (package:qr_flutter), sin red ni nada asíncrono de por medio. Para el caso inverso (leer un QR con la cámara) seguí usando el scanner de package:gp_design/scanner.dart — son casos separados, GpQrCode no depende de cámara ni de permisos. Personalizable: tamaño, colores, radio del borde, nivel de corrección de errores, e imagen embebida centrada (ej. el logo de la app).

  • Nuevo: GpPageScaffold/GpNavigationShell aceptan appBarBackgroundColor/appBarForegroundColor — antes backgroundColor solo pintaba el Scaffold (el body); no había forma de cambiar el color del AppBar en sí sin salirse de GpAppBar directo.

  • Fix (doc): GpNavigationShell — documentado que cuando cada tab de body arma su propia pantalla completa (showAppBar: false en el shell), también conviene pasar useSafeArea: false y bodyPadding: EdgeInsets.zero: por defecto el shell agrega su propio safe-area top inset y 16dp de padding genérico alrededor del body, pensados para un body "suelto" sin chrome propio — dejarlos prendidos deja un marco en blanco alrededor de cada tab.

  • Nuevo: GpWebView/GpWebViewScreen/GpWebViewModal aceptan showLoadingOverlay (bool, default true) — mientras carga, muestra un overlay con GpProgress circular (con porcentaje) sobre un fondo sólido, tapando la página en blanco que se ve por default hasta que el sitio pinta su primer frame. Poné esto en false para volver a la barra fina de progreso arriba que había antes.

  • Nuevo: GpWebView/GpWebViewScreen/GpWebViewModal aceptan disableInputZoom (bool, default true) — fuerza el viewport del sitio a maximum-scale=1, user-scalable=no (creando el <meta name="viewport"> si no existe) para que el navegador no haga zoom automático al enfocar un input, sin importar qué viewport traiga el sitio. Como efecto secundario también desactiva el pinch-to-zoom manual — poné esto en false si tu contenido sí necesita zoom (ej. un PDF o una imagen grande).

  • Fix: GpCoachMarks, GpSignatureScreen y GpPopupCarousel (agregados en esta misma tanda) usaban TextButton/IconButton de Flutter en vez de GpButton/GpIconButton propios en un par de botones — quedaba inconsistente con el resto del sistema de diseño (tono/tamaño/estados no salían del theme compartido). Ya usan los widgets GP.

  • Nuevo: GpSignatureScreen — pantalla para capturar una firma a mano alzada; al tocar "Guardar" hace Navigator.pop con el PNG capturado como Uint8List (null si se cancela sin guardar). No sube nada a ningún backend ni depende de ningún paquete de terceros (usa dart:ui/CustomPainter directo) — la app decide qué hacer con los bytes (ej. mandarlos por multipart con GpHttpClient). Personalizable: color/grosor del trazo, color de fondo de la imagen exportada, textos, resolución (pixelRatio) de la exportación.

  • Nuevo: GpPopupCarousel.show(context:, items:) — carrusel de popups deslizable en un diálogo centrado (vía GpModal.show), pensado para anuncios/promos que se buscan después del login y pueden ser varios. Cada GpPopupCarouselItem es una imagen (GpImage, con loading/error ya resueltos) con su propio onTap opcional — la librería no sabe nada de rutas ni de cómo navegar, solo avisa que se tocó el slide (y cierra el popup antes de avisar); la app decide qué hacer (abrir un link externo, navegar a una pantalla propia, etc.). Puntitos de posición solo si hay más de 1 item, botón de cerrar opcional (dismissible). El tamaño se elige con size: GpPopupCarouselSize (compact/medium/fullscreen, default medium) — cada preset es un % del ancho/alto de pantalla (con un tope en píxeles para que no se vea absurdo en tablet/desktop), no un valor fijo, para que se vea consistente en cualquier dispositivo.

  • Nuevo: GpNavigationShell acepta itemKeys (List<GlobalKey>?, mismo orden que destinations) — se adjuntan a cada ítem de la bottom navigation bar (mobile) para que la app pueda medir su posición real en pantalla después del build, por ejemplo para armar un coach mark/tutorial que señale cada tab la primera vez que aparece. No aplica a la variante de rail/drawer (tablet/desktop) todavía.

  • Nuevo: GpCoachMarks.show(context:, steps:) — tutorial de "primera vez" tipo spotlight, recorta un hueco alrededor de un widget ya construido (vía GlobalKey, ej. las itemKeys de GpNavigationShell de arriba) con una tarjeta explicando qué es, y avanza paso a paso. Devuelve una función para cerrarlo antes de tiempo. Los textos de los botones (skipLabel/nextLabel/doneLabel) son parámetros con default en español, igual que GpModal.showConfirm — no dependen de ningún mecanismo de i18n de la app consumidora.

  • Cambio: context pasa a ser opcional (antes required) en GpModal.show/showCustomModal/showConfirm/showAlert, GpWebViewModal.show, GpLinkLauncher.open y GpCoachMarks.show — unifica el criterio que ya usaban GpNotification/GpSnackBar: si no lo pasás, se resuelve solo vía GpNavigator.navigatorKey (nuevo GpNavigator.resolve()), para poder llamarlos desde donde no hay un BuildContext a mano (un servicio, un interceptor). Pasarlo explícito sigue siendo lo normal y recomendado al llamar desde dentro de un widget — no cambia el comportamiento de ningún call site existente. No es breaking excepto en GpLinkLauncher.open: context pasa de ser el primer parámetro posicional a uno nombrado (GpLinkLauncher.open(context: context, url: ...)), para quedar consistente con el resto — antes era el único de esta familia que no usaba nombrado.

  • Fix: GpHttpClient agregaba su ErrorInterceptor primero en la cadena de interceptores. Como usa handler.reject() (que por defecto no deja pasar el error a los interceptores siguientes), el RetryInterceptor y el TokenRefreshInterceptor nunca llegaban a ejecutarse cuando enableErrorInterceptor estaba activo (el default): retryOptions no tenía ningún efecto. Ahora el ErrorInterceptor se agrega al final, después de Auth, Retry, TokenRefresh y los interceptores custom.

  • network.dart ahora re-exporta los tipos de dio necesarios para escribir interceptores propios (Interceptor, DioException, DioExceptionType, RequestOptions, RequestInterceptorHandler, ResponseInterceptorHandler, ErrorInterceptorHandler, Response, Options, CancelToken), para no obligar a los consumidores a declarar dio como dependencia aparte.

  • Fix: GpNotification.show() reemplazaba de inmediato cualquier notificación visible (_overlayEntry.remove() antes de mostrar la nueva). Si llegaban dos notificaciones seguidas (ej. dos pushes casi al mismo tiempo), la primera desaparecía sin que el usuario llegara a verla. Ahora se encola y se muestra automáticamente cuando la actual termina de cerrarse; hide() también avanza la cola.

  • Nuevo: GpToneIcons.iconFor(GpSemanticTone) centraliza el mapeo tono → ícono que antes vivía duplicado y privado dentro de GpBanner (_iconForTone). Queda público para que apps consumidoras que arman sus propias tarjetas/estados reusen el mismo criterio en vez de reimplementarlo. GpBanner ahora delega en este helper.

  • Nuevo módulo package:gp_design/webview.dart (entry point aparte, igual que auth.dart/profile.dart, para no forzar webview_flutter a quien no lo use): GpWebViewScreen (pantalla completa con el chrome estándar), GpWebViewModal (mismo contenido en un bottom sheet vía GpModal) y GpWebView (el widget base, por si alguna pantalla lo necesita embebido en un layout propio). Los tres resuelven loading (barra de progreso) y error-con-reintento sin que cada pantalla repita ese boilerplate, y exponen onNavigationRequest para que la app decida qué navegaciones deja seguir dentro del WebView y cuáles bloquea (para, por ejemplo, abrirlas en el navegador del sistema). Usa webview_flutter ^4.14.1 (última versión estable, requiere Flutter >=3.38.0 — se subió el mínimo del paquete de ese entorno).

  • Nuevo módulo package:gp_design/permissions.dart: GpPermissions.request(context, permission: ...) pide un permiso del sistema (cámara, ubicación, etc.) mostrando antes una explicación con el diálogo estándar (GpModal.showConfirm) — mismo look sin importar qué módulo lo dispare — y, si el usuario ya lo negó permanentemente, ofrece ir a Ajustes en vez de reintentar un prompt nativo que el SO ya no va a volver a mostrar. Usa permission_handler ^13.0.1 y re-exporta Permission/PermissionStatus para no obligar a declarar esa dependencia aparte.

  • Nuevo módulo package:gp_design/scanner.dart: GpQrScannerScreen, pantalla de escaneo (QR y códigos de barra) con marco de escaneo (esquinas en L), botón de linterna reactivo al estado real de la cámara y mensaje de guía configurable. Pide permiso de cámara vía GpPermissions antes de encender la cámara (autoStart: false). Usa mobile_scanner ^7.4.0.

  • Nuevo módulo package:gp_design/html.dart: GpHtmlView renderiza HTML (términos y condiciones, contenido remoto) con la tipografía del tema GP en vez de que cada pantalla arme su propio estilo. Usa flutter_widget_from_html ^0.17.2.

  • Nuevo módulo package:gp_design/launcher.dart: GpLinkLauncher.open(context, url: ..., mode: ...) decide entre navegador externo, GpWebViewScreen o GpWebViewModal (la política de cuál usar la define la app, la librería solo da el mecanismo); GpWhatsApp.open(phone: ..., message: ...) abre un chat de WhatsApp vía wa.me. Usa url_launcher ^6.3.2; los modos internos reusan webview.dart y por lo tanto también cargan webview_flutter si se usan.

  • Fix: GpProgress crasheaba ('widget.tween.end != null') en modo indeterminado (sin value, ej. un spinner mientras se resuelve un permiso) porque armaba un Tween<double?>(end: null) y se lo pasaba a TweenAnimationBuilder, que no acepta un end nulo. Ahora, cuando no hay value, se salta la animación y se renderiza el indicador nativo de Flutter con value: null (que sí soporta el modo indeterminado por su cuenta); la animación con TweenAnimationBuilder se sigue usando solo para transiciones entre valores conocidos (modo determinado).

  • GpWebViewScreen ahora reenvía titleWidget, actions, leading y centerTitle a GpPageScaffold — antes solo aceptaba un title de texto y no había forma de agregar botones ni cambiar el título por un widget propio.

  • Nuevo: GpWebView/GpWebViewScreen/GpWebViewModal aceptan headers (Map<String, String>?) para la carga inicial — pensado para SSO, pasando algo como {'Authorization': 'Bearer $token'} a un sitio que valida el mismo token que ya tiene la app. Solo aplica a esa primera petición: si el sitio es una SPA que hace sus propias llamadas después, no las va a heredar automáticamente. También se corrigió _retry() para que re-envíe esos headers (antes usaba controller.reload(), que no los reenvía).

  • Nuevo: GpWebView/GpWebViewScreen/GpWebViewModal también aceptan cookies (List<WebViewCookie>?, tipo re-exportado por webview.dart) — alternativa a headers para sitios que arman su sesión leyendo una cookie del dominio en vez de un header. Se setean vía WebViewCookieManager antes de la carga inicial (y en cada retry).

  • Nuevo: debugLogConsole (bool, default false) en GpWebView/GpWebViewScreen/GpWebViewModal — si está activo, manda cada console.log/warn/error de la página por debugPrint, para poder ver en la consola de Flutter qué está logueando el sitio (útil para diagnosticar librerías como MSAL.js sin acceso a las devtools del navegador).

  • Nuevo: debugLogNetwork (bool, default false) en GpWebView/GpWebViewScreen/GpWebViewModal — inyecta JS que sobreescribe fetch/XMLHttpRequest para loguear método, URL y respuesta de cada pedido de la página (por el mismo canal que debugLogConsole, ya que webview_flutter no expone las llamadas de red de la página nativamente). Útil para diagnosticar un pedido que se queda colgado sin acceso a las devtools del navegador.

  • Fix: con debugLogConsole activo, un console.error('algo', unError) de la página llegaba como {} — el message/stack de un Error de JS no son propiedades enumerables, así que se pierden al serializar el objeto para pasarlo al puente nativo. Ahora se inyecta un script que sobreescribe console.log/warn/error/info para extraer esos campos (y los de cualquier objeto, vía getOwnPropertyNames) antes de loguear, así el mensaje real llega completo.

  • Nuevo: debugLogStorage (bool, default false) en GpWebView/GpWebViewScreen/GpWebViewModal — vuelca sessionStorage/localStorage por el mismo canal que debugLogConsole cada vez que la página termina de cargar. Útil para confirmar de dónde lee (o no encuentra) datos una página sin acceso a las devtools del navegador.

  • Nuevo: onControllerReady (void Function(WebViewController)?) en GpWebView/GpWebViewScreen/GpWebViewModal — entrega el WebViewController una vez creado, para casos que el widget no cubre de fábrica (recargar desde un botón propio, correr JS custom, limpiar localStorage/cookies para reiniciar una sesión de prueba, etc.).

0.0.3 #

  • Se amplía el sistema de tematización global con extensiones para inputs y superficies, permitiendo personalizar tipografía, bordes, radios, sombras y estilos de componentes desde GpTheme.
  • Se alinean múltiples widgets al tema compartido, incluyendo inputs, badges, banners, mensajes inline, cards, navegación, modal, drawer, floating navigation bar y tabla responsive.
  • Se mejora la estrategia responsive separando clase de dispositivo y ancho de layout para evitar clasificaciones incorrectas en teléfonos landscape.
  • Se fortalecen componentes adaptativos y de productividad como GpPageHeader, GpSegmentedControl, GpCommandBar, GpStatsGrid, GpSplitView, GpMasterDetailLayout, GpSectionCard, GpBreadcrumb y GpInlineMessage.
  • Se añaden primitives reutilizables para notificaciones y navegación, incluyendo modelos y widgets de notification center, presenter, permission card, route metadata y page transitions.
  • Se refuerza la capa HTTP basada en dio con mejor manejo de errores, soporte para PATCH, CancelToken, requests genéricos y helpers para extraer data de respuestas.

0.0.2 #

  • GpButton ahora acepta íconos provenientes de assets mediante iconAsset y iconAssetColor, manteniendo la lógica de estados y loaders integrada.
  • Nuevo GpPhoneInput con selector de país basado en country_picker, validación integrada y callback para recibir el número y códigos seleccionados.

0.0.1 #

  • Primera publicación del sistema de diseño GP.
  • Incluye componentes de UI como botones, tipografía, diálogos, tiles, app bar, inputs y loaders.
  • Añade temas claro/oscuro, helpers de espaciado, radios y tamaños de texto.
  • Proporciona layout responsive con GpRow y GpResponsive.
  • Integra interceptores dio para autenticación y manejo de errores.
0
likes
120
points
270
downloads

Documentation

Documentation
API reference

Publisher

unverified uploader

Weekly Downloads

Colección de componentes, temas, tokens visuales y utilidades responsivas para construir apps Flutter consistentes con el sistema de diseño GP.

Repository (GitHub)
View/report issues

Topics

#design-system #ui-widgets #responsive

License

unknown (license)

Dependencies

cached_network_image, collection, country_picker, dio, flutter, flutter_svg, flutter_widget_from_html, mobile_scanner, permission_handler, qr_flutter, url_launcher, webview_flutter

More

Packages that depend on gp_design