@ -21,7 +21,7 @@ La idea es que, cuando creemos un componente nuevo, no inventemos otro patron di
- el estado complejo vive fuera del markup, normalmente en clases `State`
- los componentes hijos (`Input`, `Trigger`, `Content`, `Segment`, etc.) leen estado mediante contexto, no por prop drilling
- los defaults globales viven en `TerraConfig`, pero los componentes no deben acoplarse a `actx`
- la logica de dominio compartida debe ir a `glob` o a `utils`, no enterrada en un componente concreto
- la logica de dominio compartida debe vivir fuera del componente; si `terra` necesita un dominio externo, debe entrar por un adapter claro
- los wrappers `.svelte` deben ser pequenos: recibir props, crear estado, mezclar atributos y renderizar
## 2. Estructura base de la libreria
@ -211,7 +211,7 @@ Ejemplos comunes:
- `DateFieldRootState`
- `DateFieldInputState`
- `DateFieldLabelState`
- `DateFieldLabe$state`
- `DateFieldSegmentState`
- `TimeFieldRootState`
@ -500,7 +500,7 @@ export class MyComponentRootState {
Si hay subpiezas con comportamiento, crea clases como:
- `MyComponentInputState`
- `MyComponentLabelState`
- `MyComponentLabe$state`
- `MyComponentItemState`
Cada una hace `MyComponentRootContext.get()` y deriva lo que necesita.
@ -523,7 +523,7 @@ Ejemplo:
```ts
export { default as Root } from './components/mi-componente.svelte';
export { default as Item } from './components/mi-componente-item.svelte';
export { default as Item } from './components/mi-componente-virtual-list-item.svelte';
export type {
MyComponentRootProps as RootProps,
@ -559,6 +559,21 @@ Esto es especialmente importante para:
- componentes con teclado complejo
- componentes configurables por `TerraConfig`
## 13. Frontera de dominio: adapters
Cuando `terra` depende de una libreria de dominio externa (por ejemplo fechas), no debe importar sus archivos directamente desde cada componente. La regla es:
- el dominio vive fuera de `terra`
- `terra` define un adapter local y estable
- los componentes importan del adapter, no de la libreria externa
Ejemplo actual:
- `src/uix/terra/adapters/dates/index.ts`
Ese adapter actua como frontera para toda la familia date/time. Si la libreria compartida cambia de estructura, el impacto se concentra ahi y no se propaga a veinte componentes.
## 13. Convencion especial para date/time
La familia date/time tiene una regla extra:
@ -566,7 +581,7 @@ La familia date/time tiene una regla extra:
- no debe acoplarse a `actx`
- debe aceptar props explicitas
- debe heredar defaults desde `TerraConfig`
- debe apoyarse en `glob/date` para tipos y helpers de dominio
- debe apoyarse en un adapter de dominio de `terra`, no en imports dispersos a la libreria externa
Hoy esto afecta especialmente a:
@ -579,7 +594,7 @@ Hoy esto afecta especialmente a:
Para estos componentes, si necesitas formato/locale:
- usa `glob/lib` para tipos y helpers (`DatiDateOrder`, `DatiTimeFormat`, `getDefaultDate`, `getDefaultTime`, etc.)
- usa `src/uix/terra/adapters/dates` como frontera unica hacia la libreria de fechas
- usa `resolveDateOrderProp`, `resolveHourCycleProp`, `resolveLocaleProp`
- no importes `actx` dentro del modulo
@ -623,7 +638,7 @@ Antes de dar por bueno un componente, revisar:
- hay `mergeProps` en los wrappers
- la accesibilidad base (`role`, `aria-*`, `data-*`) sale del estado, no del usuario final
- si soporta defaults globales, usa `TerraConfig`
- si es date/time, usa `glob/date`
- si es date/time, importa desde `src/uix/terra/adapters/dates`
- tiene demo en `src/routes/test/`
## 17. Ejemplo minimo de lectura del sistema
@ -737,7 +752,7 @@ export class XRootState {
Patron habitual:
- `XInputState`
- `XLabelState`
- `XLabe$state`
- `XSegmentState`
- `XHiddenInputState`
@ -973,3 +988,155 @@ Si quieres una version ultra resumida para trabajar rapido, piensa en `terra` as
- `exports.ts` define la API `Elemento.SubElemento`
- `src/routes/test/` valida que el componente existe de verdad
## 21. Estado actual de la arquitectura
A fecha de hoy, `terra` ya no debe entenderse como una migracion desde `uisv` o `acel`, sino como la base estable del framework.