@kapiuara/ui 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2026 Nicolás Arquiel
2
+
3
+ Todos los derechos reservados.
4
+
5
+ Esta licencia cubre el paquete `@kapiuara/ui`: su código fuente, los artefactos
6
+ compilados que distribuye, su documentación y sus recursos.
7
+
8
+ La obra es propiedad del titular del copyright. No se concede ninguna licencia
9
+ ni derecho de uso, copia, modificación, fusión, publicación, distribución,
10
+ sublicencia ni venta, total o parcial, por el solo hecho de que un paquete esté
11
+ disponible públicamente en un registro.
12
+
13
+ La publicación en npm existe únicamente para que el titular distribuya e instale
14
+ la obra en sus propios sistemas. Cualquier otro uso requiere permiso escrito y
15
+ previo del titular, que puede solicitarse a través de su cuenta de npm
16
+ (`nicolas.arquiel`).
17
+
18
+ EL SOFTWARE SE ENTREGA "TAL CUAL", SIN GARANTÍA DE NINGÚN TIPO, EXPRESA O
19
+ IMPLÍCITA, INCLUIDAS ENTRE OTRAS LAS GARANTÍAS DE COMERCIABILIDAD, APTITUD PARA
20
+ UN PROPÓSITO PARTICULAR Y NO INFRACCIÓN.
package/README.md CHANGED
@@ -4,7 +4,7 @@ Design system extraído del v2 de `ucugestionfront`. React 19 + TypeScript + Vit
4
4
  CSS nativo propio scopeado bajo `.kapi` (tokens como custom properties). Sin Radix / Bootstrap /
5
5
  Tailwind / Mantine. Iconos: sólo `lucide-react`. Fuente: Nunito.
6
6
 
7
- > Paquete privado del monorepo `kapiuara`. Todavía no se publica: es `private: true` y no hay nada publicado en el scope `@kapiuara` de npm. Ver `BRANDING.md` en la raíz del repo.
7
+ > Publicado en npm como `@kapiuara/ui` (`0.1.0`, público): `npm i @kapiuara/ui`. El repo sigue siendo privado y el tarball lleva sólo `dist`. Ver `BRANDING.md` en la raíz del repo.
8
8
 
9
9
  ## Comandos
10
10
 
@@ -66,6 +66,43 @@ demo/ # playground: index.html, main.tsx, App.tsx, catalog.tsx, view
66
66
  - `.kapi-row` ya existe (space-between); para filas con gap usá `.kapi-cluster`.
67
67
  - Para sumar un componente al playground: una sección en `demo/catalog.tsx`.
68
68
 
69
+ ## Accesibilidad: nombrar lo que se repite
70
+
71
+ Los componentes que emiten un **landmark** traen un nombre por defecto. Si ponés **dos del mismo tipo
72
+ en la misma página**, dejan de distinguirse para un lector de pantalla y hay que nombrarlos:
73
+
74
+ | Componente | Landmark | Nombre por defecto | Cómo se pisa |
75
+ | ------------------------------- | -------- | ---------------------- | ---------------------------------- |
76
+ | `KapiRail` | `nav` | "Navegación principal" | `aria-label` o `labels.navigation` |
77
+ | `KapiContextSlot` | `aside` | "Panel contextual" | `aria-label` o `labels.region` |
78
+ | `KapiBreadcrumb` | `nav` | "Ubicación" | `aria-label` o `labels.navigation` |
79
+ | `KapiPagination` | `nav` | "Paginación" | `aria-label` o `labels.nav` |
80
+ | `KapiTableFilter` | `search` | "Filtro de la tabla" | `aria-label` o `labels.region` |
81
+ | `KapiFacetedSearch` | `search` | "Búsqueda" | `aria-label` o `labels.region` |
82
+ | `KapiTable` (su filtro interno) | `search` | "Filtro de la tabla" | `labels.region` |
83
+
84
+ ```tsx
85
+ <KapiTable columns={columns} rows={alumnos} filterable labels={{ region: "Filtro de alumnos" }} />
86
+ <KapiTable columns={columns} rows={cursos} filterable labels={{ region: "Filtro de cursos" }} />
87
+ ```
88
+
89
+ Para texto que sólo tienen que leer los lectores de pantalla (la cabecera de una columna de acción,
90
+ por ejemplo) está la clase `.kapi-sr-only`:
91
+
92
+ ```tsx
93
+ { key: "abrir", label: <span className="kapi-sr-only">Abrir</span>, width: 90, align: "right", render: … }
94
+ ```
95
+
96
+ ### Paradas de tabulación de las regiones con scroll
97
+
98
+ `main.kapi-content` (el contenedor que scrollea de `KapiShell`) y `.kapi-tablewrap` llevan
99
+ `tabIndex={0}`. Es deliberado: una región que scrollea y no tiene nada enfocable adentro deja a un
100
+ teclado sin forma de recorrerla. El costo es **una parada de tabulación por página** en el `main`,
101
+ que además sirve de destino de salto.
102
+
103
+ El contraste de los tokens de texto se verifica en `visual/a11y.spec.ts` (axe en Chromium real); los
104
+ tests DOM no pueden hacerlo porque jsdom no resuelve colores computados.
105
+
69
106
  ## Referencia de props
70
107
 
71
108
  El playground trae una vista **Referencia → Referencia de props** (`#/referencia/props/KapiButton`): elige un
@@ -88,9 +88,15 @@ export type KapiTableLabels = {
88
88
  prevPage: string;
89
89
  nextPage: string;
90
90
  expandRow: string;
91
+ /** Cabecera de la columna de expandir: no se ve, la leen los lectores de pantalla. */
92
+ expandColumn: string;
91
93
  columns: string;
92
94
  resizeColumn: string;
93
95
  filter: string;
96
+ /** Nombre accesible de la región `role="search"` del filtro. Dos tablas filtrables en la misma
97
+ * página necesitan nombres distintos para que sus regiones se distingan. Se reenvía tal cual a
98
+ * `KapiTableFilter`, que define el default. */
99
+ region: string;
94
100
  filterPlaceholder: string;
95
101
  filterColumn: string;
96
102
  filterAll: string;