quickit-ui 0.1.12 → 0.1.14

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/README.md CHANGED
@@ -1,94 +1,77 @@
1
1
  # Quickit UI
2
2
 
3
- Quickit UI es una libreria de componentes para React pensada para construir interfaces consistentes, limpias y rapidas de integrar.
3
+ Quickit UI es una librería de componentes para React enfocada en interfaces consistentes, con una API semántica, tema `light` y `dark`, documentación local y soporte TypeScript vía `.d.ts`.
4
4
 
5
- Incluye componentes base como `Button`, `Input`, `Modal`, `Dropdown`, `Tabs`, `Tooltip`, `Avatar`, `Badge`, `Skeleton` y mas.
6
-
7
- ## Documentacion local
8
-
9
- La libreria incluye una documentacion local con ejemplos, API y fundamentos del sistema.
10
-
11
- ```bash
12
- npm install
13
- npm run dev
14
- ```
15
-
16
- Para generar la version estatica de la documentacion:
5
+ ## Instalación
17
6
 
18
7
  ```bash
19
- npm run build:docs
8
+ npm install quickit-ui react react-dom
20
9
  ```
21
10
 
22
- ## Instalacion
11
+ Importa los estilos una sola vez:
23
12
 
24
- Instala el paquete junto con sus dependencias peer:
25
-
26
- ```bash
27
- npm install quickit-ui react react-dom
13
+ ```jsx
14
+ import "quickit-ui/styles.css";
28
15
  ```
29
16
 
30
- ## Uso rapido
31
-
32
- Importa los estilos del paquete una sola vez y empieza a usar los componentes:
17
+ ## Uso rápido
33
18
 
34
19
  ```jsx
35
- import 'quickit-ui/styles.css'
36
- import { Button, Input, QuickitProvider } from 'quickit-ui'
20
+ import "quickit-ui/styles.css";
21
+ import { Button, Input, QuickitProvider } from "quickit-ui";
37
22
 
38
23
  export default function App() {
39
24
  return (
40
25
  <QuickitProvider theme="light">
41
26
  <main className="space-y-4 p-6">
42
- <Input placeholder="Correo electronico" />
43
- <Button color="neutral">Continuar</Button>
27
+ <Input color="neutral" placeholder="Correo electrónico" />
28
+ <Button color="brand">Continuar</Button>
44
29
  </main>
45
30
  </QuickitProvider>
46
- )
31
+ );
47
32
  }
48
33
  ```
49
34
 
50
35
  ## Tema
51
36
 
52
- Quickit UI soporta `light` y `dark` desde `QuickitProvider`.
37
+ Quickit UI trabaja con `light` y `dark`. El estado del tema vive en tu app; `QuickitProvider` solo lo distribuye al resto de componentes.
53
38
 
54
39
  ```jsx
55
- import 'quickit-ui/styles.css'
56
- import { Button, QuickitProvider } from 'quickit-ui'
40
+ import "quickit-ui/styles.css";
41
+ import { Button, QuickitProvider } from "quickit-ui";
57
42
 
58
43
  export default function App() {
59
44
  return (
60
45
  <QuickitProvider theme="dark">
61
- <Button>Guardar cambios</Button>
46
+ <Button color="neutral">Guardar cambios</Button>
62
47
  </QuickitProvider>
63
- )
48
+ );
64
49
  }
65
50
  ```
66
51
 
67
- ## Personalizar colores
52
+ ## Colores semánticos
68
53
 
69
- La API de color es semántica: `neutral`, `primary`, `brand`, `success`, `danger`, `warning`, `info`, `light` y `dark`.
70
-
71
- La lógica recomendada es esta:
72
- - cada color semántico usa una familia Tailwind interna
73
- - si reemplazas esa familia, cambias ese color en toda la librería
74
- - `brand` existe precisamente para tu color de marca y consume `brand-*`
75
- - si quieres usar tu color de marca en otro slot, reemplaza la familia que consume ese slot semántico
76
- - si quieres un color nuevo solo en un caso puntual, usa `className`
77
- - si quieres soportar un nuevo valor como `color="gray"` o `color="clientA"` en toda la librería, eso requiere ampliar la API
78
-
79
- Mapa actual:
54
+ La API pública soporta:
80
55
 
81
56
  ```txt
82
- neutral -> neutral-*
83
- primary -> blue-*
84
- brand -> brand-*
85
- success -> emerald-*
86
- danger -> red-*
87
- warning -> amber-*
88
- info -> sky-*
57
+ neutral | slate | zinc | primary | brand | success | danger | warning | info | light | dark | black
89
58
  ```
90
59
 
91
- Ejemplo recomendado: si tu marca debe vivir en `brand`, reemplaza `brand-*`:
60
+ Criterio actual:
61
+
62
+ - `neutral` mantiene la base premium de la librería.
63
+ - `slate` y `zinc` exponen neutrales explícitos.
64
+ - `primary` usa `sky-*`.
65
+ - `brand` usa `brand-*`.
66
+ - `success` usa `emerald-*`.
67
+ - `danger` usa `rose-*`.
68
+ - `warning` usa `amber-*`.
69
+ - `info` usa `cyan-*`.
70
+ - `light` usa una escala clara basada en `stone-*`.
71
+ - `dark` es una variante oscura intermedia.
72
+ - `black` es la opción más densa y de mayor contraste.
73
+
74
+ Ejemplo recomendado para conectar tu marca:
92
75
 
93
76
  ```css
94
77
  @import "quickit-ui/styles.css";
@@ -103,55 +86,11 @@ Ejemplo recomendado: si tu marca debe vivir en `brand`, reemplaza `brand-*`:
103
86
  }
104
87
  ```
105
88
 
106
- Si prefieres que tu marca viva en `primary`, entonces reemplaza `blue-*`.
89
+ Si quieres que `primary` use tu marca, reemplaza `sky-*`.
107
90
 
108
- Si quieres cambiar `neutral`, reemplaza `neutral-*`:
91
+ Si necesitas neutrales más explícitos y previsibles, usa `color="slate"` o `color="zinc"` en lugar de asumir que `neutral` es una escala plana.
109
92
 
110
- ```css
111
- :root {
112
- --color-neutral-50: oklch(0.985 0.002 247);
113
- --color-neutral-100: oklch(0.97 0.004 247);
114
- --color-neutral-200: oklch(0.93 0.01 252);
115
- --color-neutral-300: oklch(0.87 0.018 253);
116
- --color-neutral-700: oklch(0.37 0.03 257);
117
- --color-neutral-800: oklch(0.28 0.028 260);
118
- --color-neutral-900: oklch(0.21 0.026 265);
119
- }
120
- ```
121
-
122
- También puedes reutilizar otro slot semántico como color de marca:
123
-
124
- ```css
125
- :root {
126
- /* color="info" */
127
- --color-sky-600: oklch(62% 0.19 330);
128
- --color-sky-700: oklch(55% 0.18 330);
129
- }
130
- ```
131
-
132
- Si creas una paleta nueva como `gray-*`, podrás usarla en clases Tailwind, pero no aparece sola en la API de Quickit:
133
-
134
- ```css
135
- @theme {
136
- --color-gray-50: oklch(0.984 0.003 247.858);
137
- --color-gray-100: oklch(0.968 0.007 247.896);
138
- --color-gray-200: oklch(0.929 0.013 255.508);
139
- --color-gray-300: oklch(0.869 0.022 252.894);
140
- --color-gray-400: oklch(0.704 0.04 256.788);
141
- --color-gray-500: oklch(0.554 0.046 257.417);
142
- --color-gray-600: oklch(0.446 0.043 257.281);
143
- --color-gray-700: oklch(0.372 0.044 257.287);
144
- --color-gray-800: oklch(0.279 0.041 260.031);
145
- --color-gray-900: oklch(0.208 0.042 265.755);
146
- --color-gray-950: oklch(0.129 0.042 264.695);
147
- }
148
- ```
149
-
150
- Eso significa:
151
- - sí puedes usar `bg-gray-500`, `text-gray-700`, etc. en `className`
152
- - no puedes usar `color="gray"` a menos que la librería amplíe su mapa de colores
153
-
154
- Si quieres un color nuevo puntual, puedes sobreescribir estilos con `className`:
93
+ Si necesitas un color puntual fuera de la API semántica, sobrescribe con `className`:
155
94
 
156
95
  ```jsx
157
96
  <Button
@@ -162,12 +101,29 @@ Si quieres un color nuevo puntual, puedes sobreescribir estilos con `className`:
162
101
  </Button>
163
102
  ```
164
103
 
165
- ## Ejemplos rapidos
104
+ ## Hooks y utilidades
105
+
106
+ Quickit también exporta hooks y utilidades para componer tu app o tu propia documentación:
107
+
108
+ ```jsx
109
+ import {
110
+ QUICKIT_BREAKPOINTS,
111
+ QUICKIT_BUTTON_SHAPES,
112
+ QUICKIT_CONTROL_SIZES,
113
+ QUICKIT_SEMANTIC_COLORS,
114
+ QuickitProvider,
115
+ useBreakpoint,
116
+ useMediaQuery,
117
+ useQuickitTheme,
118
+ } from "quickit-ui";
119
+ ```
120
+
121
+ ## Ejemplos
166
122
 
167
123
  ### Button
168
124
 
169
125
  ```jsx
170
- import { Button } from 'quickit-ui'
126
+ import { Button } from "quickit-ui";
171
127
 
172
128
  export function Actions() {
173
129
  return (
@@ -180,7 +136,7 @@ export function Actions() {
180
136
  Guardar
181
137
  </Button>
182
138
  </div>
183
- )
139
+ );
184
140
  }
185
141
  ```
186
142
 
@@ -195,20 +151,21 @@ import {
195
151
  Label,
196
152
  Select,
197
153
  Textarea,
198
- } from 'quickit-ui'
154
+ } from "quickit-ui";
199
155
 
200
156
  export function ContactForm() {
201
157
  return (
202
158
  <div className="space-y-4">
203
159
  <FormControl>
204
160
  <Label htmlFor="name">Nombre</Label>
205
- <Input id="name" placeholder="Tu nombre" />
161
+ <Input id="name" color="neutral" placeholder="Tu nombre" />
206
162
  </FormControl>
207
163
 
208
164
  <FormControl>
209
165
  <Label htmlFor="topic">Tema</Label>
210
166
  <Select
211
167
  id="topic"
168
+ color="slate"
212
169
  defaultValue="support"
213
170
  onValueChange={(value) => console.log(value)}
214
171
  >
@@ -220,22 +177,22 @@ export function ContactForm() {
220
177
 
221
178
  <FormControl invalid>
222
179
  <Label htmlFor="message">Mensaje</Label>
223
- <Textarea id="message" placeholder="Escribe tu mensaje" />
180
+ <Textarea id="message" color="danger" placeholder="Escribe tu mensaje" />
224
181
  <FormMessage>Este campo es obligatorio.</FormMessage>
225
182
  </FormControl>
226
183
  </div>
227
- )
184
+ );
228
185
  }
229
186
  ```
230
187
 
231
- ### Navegacion
188
+ ### Navegación
232
189
 
233
190
  ```jsx
234
- import { Tabs, TabsContent, TabsList, TabsTrigger } from 'quickit-ui'
191
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from "quickit-ui";
235
192
 
236
193
  export function SettingsTabs() {
237
194
  return (
238
- <Tabs defaultValue="general" activationMode="manual">
195
+ <Tabs defaultValue="general" activationMode="manual" color="brand">
239
196
  <TabsList>
240
197
  <TabsTrigger value="general">General</TabsTrigger>
241
198
  <TabsTrigger value="security">Seguridad</TabsTrigger>
@@ -244,7 +201,33 @@ export function SettingsTabs() {
244
201
  <TabsContent value="general">Contenido general</TabsContent>
245
202
  <TabsContent value="security">Contenido de seguridad</TabsContent>
246
203
  </Tabs>
247
- )
204
+ );
205
+ }
206
+ ```
207
+
208
+ ### Lógica declarativa
209
+
210
+ ```jsx
211
+ import { Default, For, Match, RenderSwitch, Show } from "quickit-ui";
212
+
213
+ export function States({ items, status, user }) {
214
+ return (
215
+ <>
216
+ <Show when={user} fallback={<p>Inicia sesión</p>}>
217
+ {(value) => <p>Hola, {value.name}</p>}
218
+ </Show>
219
+
220
+ <RenderSwitch value={status}>
221
+ <Match when="idle">Idle</Match>
222
+ <Match when="loading">Loading</Match>
223
+ <Default>Done</Default>
224
+ </RenderSwitch>
225
+
226
+ <For each={items} fallback={<p>Sin resultados</p>}>
227
+ {(item) => <div key={item.id}>{item.label}</div>}
228
+ </For>
229
+ </>
230
+ );
248
231
  }
249
232
  ```
250
233
 
@@ -264,13 +247,13 @@ import {
264
247
  ModalContent,
265
248
  ModalHeader,
266
249
  ModalTitle,
267
- } from 'quickit-ui'
250
+ } from "quickit-ui";
268
251
 
269
252
  export function OverlayExamples() {
270
253
  return (
271
254
  <div className="flex gap-4">
272
255
  <Dropdown>
273
- <DropdownTrigger>
256
+ <DropdownTrigger asChild>
274
257
  <Button color="neutral" variant="outline">
275
258
  Opciones
276
259
  </Button>
@@ -284,11 +267,13 @@ export function OverlayExamples() {
284
267
  </Dropdown>
285
268
 
286
269
  <Modal>
287
- <Button color="neutral">Abrir modal</Button>
270
+ <Modal.Trigger asChild>
271
+ <Button color="neutral">Abrir modal</Button>
272
+ </Modal.Trigger>
288
273
 
289
- <ModalContent>
274
+ <Modal.Content>
290
275
  <ModalHeader>
291
- <ModalTitle>Confirmar accion</ModalTitle>
276
+ <ModalTitle>Confirmar acción</ModalTitle>
292
277
  </ModalHeader>
293
278
 
294
279
  <ModalBody>Este cambio no se puede deshacer.</ModalBody>
@@ -299,17 +284,29 @@ export function OverlayExamples() {
299
284
  </ModalAction>
300
285
  <ModalAction color="danger">Eliminar</ModalAction>
301
286
  </ModalActions>
302
- </ModalContent>
287
+ </Modal.Content>
303
288
  </Modal>
304
289
  </div>
305
- )
290
+ );
306
291
  }
307
292
  ```
308
293
 
294
+ ## Identidad
295
+
296
+ Quickit incluye primitives y compuestos de identidad:
297
+
298
+ - `Avatar`
299
+ - `AvatarGroup`
300
+ - `AvatarPresence`
301
+ - `Initials`
302
+ - `UserChip`
303
+
309
304
  ## Componentes disponibles
310
305
 
311
306
  - `Accordion`
312
307
  - `Avatar`
308
+ - `AvatarGroup`
309
+ - `AvatarPresence`
313
310
  - `Badge`
314
311
  - `Breadcrumb`
315
312
  - `Button`
@@ -317,6 +314,9 @@ export function OverlayExamples() {
317
314
  - `Dropdown`
318
315
  - `EmptyState`
319
316
  - `FormControl`
317
+ - `FormDescription`
318
+ - `FormMessage`
319
+ - `Initials`
320
320
  - `Input`
321
321
  - `Label`
322
322
  - `Link`
@@ -330,6 +330,25 @@ export function OverlayExamples() {
330
330
  - `Tabs`
331
331
  - `Textarea`
332
332
  - `Tooltip`
333
+ - `UserChip`
334
+ - `Show`
335
+ - `RenderSwitch`
336
+ - `Match`
337
+ - `Default`
338
+ - `For`
339
+
340
+ ## Documentación local
341
+
342
+ ```bash
343
+ npm install
344
+ npm run dev
345
+ ```
346
+
347
+ Para generar la versión estática:
348
+
349
+ ```bash
350
+ npm run build:docs
351
+ ```
333
352
 
334
353
  ## Requisitos
335
354
 
@@ -337,26 +356,15 @@ export function OverlayExamples() {
337
356
  - `react-dom` `^19.0.0`
338
357
  - Node.js `18` o superior
339
358
 
340
- ## Exportaciones utiles
341
-
342
- El paquete exporta componentes, hooks y utilidades desde:
343
-
344
- ```jsx
345
- import {
346
- Button,
347
- Input,
348
- QuickitProvider,
349
- useQuickitTheme,
350
- } from 'quickit-ui'
351
- ```
352
-
353
- ## Scripts utiles
359
+ ## Scripts útiles
354
360
 
355
361
  - `npm run dev`: entorno local de desarrollo.
356
- - `npm run build`: build de la libreria para distribucion. El paquete publicado no incluye sourcemaps para reducir el peso en npm.
357
- - `npm run build:docs`: build estatico de la documentacion.
358
- - `npm run lint`: validacion con ESLint.
359
- - `npm run pack:check`: vista previa del paquete que se publicaria en npm.
362
+ - `npm run build`: build de la librería para distribución.
363
+ - `npm run build:docs`: build estático de la documentación.
364
+ - `npm run lint`: validación con ESLint.
365
+ - `npm run test`: pruebas runtime.
366
+ - `npm run test:types`: validación del consumo TypeScript.
367
+ - `npm run pack:check`: vista previa del paquete que se publicaría en npm.
360
368
 
361
369
  ## Licencia
362
370