Entrypoints
Los tipos core no se incluyen en el barrel de widgets, para mantener el límite de dominio y evitar conflictos con excepciones del consumidor.
material.dart tampoco se reexporta. Los nombres de app que aparecen en tutoriales (AppIsselController, CustomerEntity, etc.) son ejemplos locales.
IsselAppConfig
Configuración inmutable del kit para una app. Importa desdeissel_app.dart o el barrel de widgets.
copyWith({title, lightTheme, darkTheme, themeMode, desktop}) devuelve otra configuración; todos sus argumentos son opcionales y nulos para conservar el valor existente. No contiene endpoints, destinos, sesión, permisos ni persistencia.
IsselAppController
ExtiendeIsselController; concentra configuración, tema y navegación.
updateConfig conserva identidad de .theme, .navigation y navigatorKey. El controlador también observa cambios directos del tema y los copia a .config. La raíz escucha al controlador de app para reconstruir MaterialApp. updateConfig tras dispose lanza StateError.
Si tienes listeners directos de .theme, cada actualización clara/oscura puede notificarlos durante updateConfig; la notificación única indicada corresponde al controlador de app. La fachada del producto concentra métodos específicos usando config.copyWith.
IsselController
Clase abstracta de presentación basada enChangeNotifier. No pertenece al dominio.
Hereda listeners de
ChangeNotifier. notifyIfActive evita avisos tardíos, pero no impide por sí mismo mutar campos ni cancela Futures. Comprueba isDisposed antes de asignar tras un await, libera recursos propios antes de super.dispose() y mantén un único dueño.
IsselColors
Claseabstract final de constantes. No se instancia. Los controles leen el tema en vez de depender de estas constantes.
Úsalas para construir defaults cuando sea necesario. En las vistas prefiere los roles efectivos del tema y los overrides centralizados.
IsselThemeColors
Paleta semántica inmutable. El constructor general exige todos los roles exceptooutlineVariant:
const IsselThemeColors.light({...}) y .dark({...}) permiten overrides opcionales de todos los colores y fijan brightness respectivamente a claro y oscuro. Los defaults completos están en tema y configuración.
scaffoldBackground se aplica en ThemeData.scaffoldBackgroundColor, no como una propiedad extra del ColorScheme. outlineVariant: null en un constructor utiliza el generado por semilla; en copyWith null conserva el anterior. Para volver al valor generado crea una paleta nueva según tu configuración.
La igualdad de scaffoldBackground y surfaceContainer es un contrato visual de la skill/defaults. La clase no obliga a esa igualdad mediante assertions.
IsselTextThemeConfig
Configuración inmutable que construye unTextTheme. Constructor const y copyWith con los siguientes parámetros:
build({Color? onSurface, required Color outline}) devuelve el TextTheme con tamaños/pesos del kit, escala global y familia. outline pinta labels. Consulta la tabla de tamaños para las 15 variantes.
copyWith recibe los mismos campos con tipos nulos para conservar valores. No permite limpiar fontFamily pasando null; crea una configuración nueva para quitarla. El paquete no descarga fuentes y no valida rangos de escala en este tipo. La app limita su editor y revisa accesibilidad/layout.
IsselThemeConfig
El tema configura fondo, esquema, AppBar sin surface tint, FAB circular, Card con superficie/radio, divisores, ListTile y TextTheme.
borderRadius afecta a ListTileTheme y cardBorderRadius a CardThemeData; los widgets que fijan radios propios conservan esos valores.
IsselThemeController
Controlador basado directamente enChangeNotifier, con constructor:
light o dark, esa configuración tiene prioridad sobre el color/texto abreviado de su variante. Si falta, construye una configuración con los defaults o los argumentos abreviados.
No ofrece
isDisposed de IsselController. Cuando pertenece a IsselAppController, éste es su dueño y lo libera. No dispongas .theme por separado desde una vista. El modo sistema no convierte una llamada a updateLightColors en edición de ambas paletas; esa política se implementa en la fachada del producto.
IsselDesktopConfig
copyWith de las cuatro. Assertions: sidebarWidth > 0, captionHeight >= 28, sidebarBreakpoint > sidebarWidth. La curva del shell es easeOutCubic; no es propiedad configurable en este tipo.
Modelos auxiliares de selección y escritorio
Estos tipos no implementan repositorios, destinos ni almacenamiento. Los genéricos comparan selección mediante
== de sus valores; usa identificadores estables o define igualdad apropiada en tus entidades.
IsselNavigationService
navigatorKey es final. Conecta la misma clave a MaterialApp.
Las operaciones requieren Navigator montado o lanzan
StateError. El nombre predeterminado es runtimeType.toString; settings.arguments se conserva. goBack: true puede indicar un retroceso atendido por PopScope que mantuvo la ruta. La guía de navegación incluye el ejemplo tipado y explica cuándo utilizar un router.
AppException
Tipo Dart que implementaException. Importa issel_core.dart.
message es seguro para UI; causa/traza conservan diagnóstico. toString() muestra AppException: mensaje o AppException (código): mensaje; no incluye automáticamente causa o traza. El mensaje seguro depende del texto que suministre el consumidor.
AppFailure
Tiene el mismo constructor y propiedades queAppException, pero representa un fallo esperado que se devuelve como dato:
toString() utiliza el prefijo AppFailure, con código opcional. La app define los códigos y recuperación. Ni este tipo ni la excepción implementan igualdad por valor o serialización personalizada.
AppResult<T>, AppSuccess<T> y AppError<T>
AppResult<T> es sealed y tiene constructor base const y dos fábricas:
Un éxito de tipo nullable puede contener null; eso no es un error. No hay propiedades
data, isError ni métodos map/when en esta API. Puedes utilizar switch exhaustivo o fold, sin dartz.