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 +143 -135
- package/dist/quickit-ui.css +1 -1
- package/dist/quickit-ui.d.ts +8 -3
- package/dist/quickit-ui.js +416 -210
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,94 +1,77 @@
|
|
|
1
1
|
# Quickit UI
|
|
2
2
|
|
|
3
|
-
Quickit UI es una
|
|
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
|
-
|
|
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
|
|
8
|
+
npm install quickit-ui react react-dom
|
|
20
9
|
```
|
|
21
10
|
|
|
22
|
-
|
|
11
|
+
Importa los estilos una sola vez:
|
|
23
12
|
|
|
24
|
-
|
|
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
|
|
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
|
|
36
|
-
import { Button, Input, QuickitProvider } from
|
|
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
|
|
43
|
-
<Button color="
|
|
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
|
|
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
|
|
56
|
-
import { Button, QuickitProvider } from
|
|
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
|
-
##
|
|
52
|
+
## Colores semánticos
|
|
68
53
|
|
|
69
|
-
La API
|
|
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
|
|
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
|
-
|
|
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
|
|
89
|
+
Si quieres que `primary` use tu marca, reemplaza `sky-*`.
|
|
107
90
|
|
|
108
|
-
Si
|
|
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
|
-
|
|
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
|
-
##
|
|
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
|
|
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
|
|
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
|
-
###
|
|
188
|
+
### Navegación
|
|
232
189
|
|
|
233
190
|
```jsx
|
|
234
|
-
import { Tabs, TabsContent, TabsList, TabsTrigger } from
|
|
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
|
|
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
|
-
<
|
|
270
|
+
<Modal.Trigger asChild>
|
|
271
|
+
<Button color="neutral">Abrir modal</Button>
|
|
272
|
+
</Modal.Trigger>
|
|
288
273
|
|
|
289
|
-
<
|
|
274
|
+
<Modal.Content>
|
|
290
275
|
<ModalHeader>
|
|
291
|
-
<ModalTitle>Confirmar
|
|
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
|
-
</
|
|
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
|
-
##
|
|
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
|
|
357
|
-
- `npm run build:docs`: build
|
|
358
|
-
- `npm run lint`:
|
|
359
|
-
- `npm run
|
|
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
|
|