orbital-ds 0.5.0 → 0.6.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/README.md +73 -64
- package/components.manifest.json +12 -1
- package/dist/styles.css +18 -0
- package/dist/themes/friendly.guide.md +38 -0
- package/dist/themes/friendly.meta.json +14 -0
- package/dist/themes/qratia.guide.md +34 -0
- package/dist/themes/qratia.meta.json +12 -0
- package/dist/themes/tactile.css +399 -0
- package/dist/themes/tactile.fonts.css +2 -0
- package/dist/themes/tactile.guide.md +49 -0
- package/dist/themes/tactile.meta.json +16 -0
- package/dist/themes/tactile.scoped.css +399 -0
- package/dist/themes/twitter.guide.md +35 -0
- package/dist/themes/twitter.meta.json +14 -0
- package/dist/themes/zyro.guide.md +33 -0
- package/dist/themes/zyro.meta.json +14 -0
- package/dist/ui/attachment.d.ts +1 -1
- package/dist/ui/button.d.ts +1 -1
- package/dist/ui/icon-tile.d.ts +11 -0
- package/dist/ui/icon-tile.js +47 -0
- package/dist/ui/input-group.d.ts +1 -1
- package/dist/ui/item.d.ts +1 -1
- package/dist/ui/marker.d.ts +1 -1
- package/package.json +3 -1
- package/scripts/doctor.mjs +237 -224
- package/scripts/init.mjs +89 -55
package/README.md
CHANGED
|
@@ -1,64 +1,73 @@
|
|
|
1
|
-
# orbital-ds
|
|
2
|
-
|
|
3
|
-
Sistema de diseño genérico: **estructura común + temas intercambiables + ~60 componentes**
|
|
4
|
-
sobre [Base UI](https://base-ui.com) y Tailwind v4 (los de shadcn en su versión Base UI).
|
|
5
|
-
|
|
6
|
-
- `styles.css` — la ESTRUCTURA: mapea variables de tema a utilidades de Tailwind y define los
|
|
7
|
-
tokens semánticos (radios, alturas, sombras, espaciado, capas, movimiento, foco, materiales)
|
|
8
|
-
y la capa base. No lleva colores ni fuentes.
|
|
9
|
-
- `themes/<tema>.css` — un TEMA: paleta (claro/oscuro), radio base y tipografía.
|
|
10
|
-
Hoy: `qratia` y `zyro` (cristal). Añadir otro = añadir otro fichero.
|
|
11
|
-
- `themes/<tema>.fonts.css` — las fuentes del tema (un `@import url()`; va el primero).
|
|
12
|
-
- `ui/*` — componentes, uno por fichero (`orbital-ds/ui/button`, …): quien no usa gráficos
|
|
13
|
-
no necesita `recharts`, quien no usa el calendario no necesita `react-day-picker`.
|
|
14
|
-
- `contract.json` + `pnpm check:ds` — el contrato de tema y su comprobación.
|
|
15
|
-
|
|
16
|
-
## Uso en una app (Tailwind v4)
|
|
17
|
-
|
|
18
|
-
```css
|
|
19
|
-
@import 'orbital-ds/themes/qratia.fonts.css'; /* fuentes: lo primero */
|
|
20
|
-
@import 'tailwindcss';
|
|
21
|
-
@plugin '@tailwindcss/typography';
|
|
22
|
-
@import 'tw-animate-css';
|
|
23
|
-
@import 'orbital-ds/styles.css'; /* estructura */
|
|
24
|
-
@import 'orbital-ds/themes/qratia.css'; /* tema (después de la estructura) */
|
|
25
|
-
@source '../node_modules/orbital-ds/dist'; /* que Tailwind vea las clases del paquete */
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
```tsx
|
|
29
|
-
import { Button } from 'orbital-ds/ui/button';
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Cambiar de identidad = cambiar `qratia` por `zyro` en esas dos líneas de tema/fuentes.
|
|
33
|
-
Detalle del contrato, tokens y reglas de nombres en [`docs/CONTRACT.md`](docs/CONTRACT.md).
|
|
34
|
-
|
|
35
|
-
##
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
1
|
+
# orbital-ds
|
|
2
|
+
|
|
3
|
+
Sistema de diseño genérico: **estructura común + temas intercambiables + ~60 componentes**
|
|
4
|
+
sobre [Base UI](https://base-ui.com) y Tailwind v4 (los de shadcn en su versión Base UI).
|
|
5
|
+
|
|
6
|
+
- `styles.css` — la ESTRUCTURA: mapea variables de tema a utilidades de Tailwind y define los
|
|
7
|
+
tokens semánticos (radios, alturas, sombras, espaciado, capas, movimiento, foco, materiales)
|
|
8
|
+
y la capa base. No lleva colores ni fuentes.
|
|
9
|
+
- `themes/<tema>.css` — un TEMA: paleta (claro/oscuro), radio base y tipografía.
|
|
10
|
+
Hoy: `qratia` y `zyro` (cristal). Añadir otro = añadir otro fichero.
|
|
11
|
+
- `themes/<tema>.fonts.css` — las fuentes del tema (un `@import url()`; va el primero).
|
|
12
|
+
- `ui/*` — componentes, uno por fichero (`orbital-ds/ui/button`, …): quien no usa gráficos
|
|
13
|
+
no necesita `recharts`, quien no usa el calendario no necesita `react-day-picker`.
|
|
14
|
+
- `contract.json` + `pnpm check:ds` — el contrato de tema y su comprobación.
|
|
15
|
+
|
|
16
|
+
## Uso en una app (Tailwind v4)
|
|
17
|
+
|
|
18
|
+
```css
|
|
19
|
+
@import 'orbital-ds/themes/qratia.fonts.css'; /* fuentes: lo primero */
|
|
20
|
+
@import 'tailwindcss';
|
|
21
|
+
@plugin '@tailwindcss/typography';
|
|
22
|
+
@import 'tw-animate-css';
|
|
23
|
+
@import 'orbital-ds/styles.css'; /* estructura */
|
|
24
|
+
@import 'orbital-ds/themes/qratia.css'; /* tema (después de la estructura) */
|
|
25
|
+
@source '../node_modules/orbital-ds/dist'; /* que Tailwind vea las clases del paquete */
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```tsx
|
|
29
|
+
import { Button } from 'orbital-ds/ui/button';
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Cambiar de identidad = cambiar `qratia` por `zyro` en esas dos líneas de tema/fuentes.
|
|
33
|
+
Detalle del contrato, tokens y reglas de nombres en [`docs/CONTRACT.md`](docs/CONTRACT.md).
|
|
34
|
+
|
|
35
|
+
## Guía de cada tema
|
|
36
|
+
|
|
37
|
+
Cada tema lleva su documentación, que viaja con el paquete:
|
|
38
|
+
|
|
39
|
+
- `orbital-ds/themes/<tema>.guide.md` — guía de diseño: esencia, gesto firma, principios, referencias (qué se tomó de cada una), paleta, tipografía, formas, accesibilidad y estado de los valores (confirmados, aproximados o de diseño propio).
|
|
40
|
+
- `orbital-ds/themes/<tema>.meta.json` — la misma ficha legible por máquina.
|
|
41
|
+
|
|
42
|
+
`pnpm check:ds` falla si a un tema le falta alguna de las dos. Un tema nuevo debe nacer con ambas.
|
|
43
|
+
|
|
44
|
+
## Marca de una app
|
|
45
|
+
|
|
46
|
+
Lo propio de cada app (color principal, acento, radio, fuentes) va en **su** `src/brand.css`,
|
|
47
|
+
importado después del tema. Ninguna actualización de orbital-ds lo toca. `pnpm exec orbital-ds-init`
|
|
48
|
+
lo crea la primera vez. Detalle en [`docs/CONTRACT.md`](docs/CONTRACT.md).
|
|
49
|
+
|
|
50
|
+
## Regla
|
|
51
|
+
|
|
52
|
+
Ningún componente lleva valores propios (colores, medidas, sombras, z-index, duraciones):
|
|
53
|
+
pide un hueco a una variable. Para cambiar el aspecto se cambia el tema, no el componente.
|
|
54
|
+
Si un componente necesita un hueco nuevo, se AÑADE el token con un valor que deje el aspecto
|
|
55
|
+
como estaba. `pnpm check:ds` lo comprueba.
|
|
56
|
+
|
|
57
|
+
## Desarrollo
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
pnpm install
|
|
61
|
+
pnpm verify # doctor + typecheck + build
|
|
62
|
+
pnpm check:ds # solo el contrato de tema y los valores fijos
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Peers obligatorios: `react`, `react-dom`, `@base-ui/react`, `tailwindcss`, `tailwind-merge`,
|
|
66
|
+
`class-variance-authority`, `clsx`, `lucide-react`, `tw-animate-css`.
|
|
67
|
+
Opcionales (solo si usas ese componente): `recharts`, `sonner`, `next-themes`, `cmdk`,
|
|
68
|
+
`date-fns` + `react-day-picker`, `embla-carousel-react`, `input-otp`,
|
|
69
|
+
`react-resizable-panels`, `@shadcn/react`.
|
|
70
|
+
|
|
71
|
+
## Licencia
|
|
72
|
+
|
|
73
|
+
MIT © Fractalia Systems
|
package/components.manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "orbital-ds",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"engine": "@base-ui/react",
|
|
5
5
|
"docs": [
|
|
6
6
|
"README.md",
|
|
@@ -582,6 +582,17 @@
|
|
|
582
582
|
],
|
|
583
583
|
"optionalPeers": []
|
|
584
584
|
},
|
|
585
|
+
"icon-tile": {
|
|
586
|
+
"import": "orbital-ds/ui/icon-tile",
|
|
587
|
+
"exports": [
|
|
588
|
+
"IconTile",
|
|
589
|
+
"iconTileVariants"
|
|
590
|
+
],
|
|
591
|
+
"slots": [
|
|
592
|
+
"icon-tile"
|
|
593
|
+
],
|
|
594
|
+
"optionalPeers": []
|
|
595
|
+
},
|
|
585
596
|
"input-group": {
|
|
586
597
|
"import": "orbital-ds/ui/input-group",
|
|
587
598
|
"exports": [
|
package/dist/styles.css
CHANGED
|
@@ -195,6 +195,17 @@
|
|
|
195
195
|
--ds-sidebar-item-radius: var(--ds-radius-md);
|
|
196
196
|
--ds-sidebar-item-h: 2.5rem;
|
|
197
197
|
|
|
198
|
+
/* ── BALDOSA DE ICONO ───────────────────────────────────────────────────
|
|
199
|
+
* Un icono grande (Lucide) dentro de una baldosa tintada: la «mascota» barata.
|
|
200
|
+
* sm / md / lg: lado de la baldosa; radius: su esquina; fill: cuánto relleno
|
|
201
|
+
* lleva el icono (0 = solo trazo; 0.2 = aspecto duotono suave).
|
|
202
|
+
*/
|
|
203
|
+
--ds-icon-tile-sm: 2rem;
|
|
204
|
+
--ds-icon-tile-md: 2.75rem;
|
|
205
|
+
--ds-icon-tile-lg: 3.75rem;
|
|
206
|
+
--ds-icon-tile-radius: var(--ds-radius-lg);
|
|
207
|
+
--ds-icon-tile-fill: 0;
|
|
208
|
+
|
|
198
209
|
/* ── COLOR (mapeo de las variables del tema a utilidades) ─────────────── */
|
|
199
210
|
--color-background: var(--background);
|
|
200
211
|
--color-foreground: var(--foreground);
|
|
@@ -484,3 +495,10 @@
|
|
|
484
495
|
}
|
|
485
496
|
}
|
|
486
497
|
}
|
|
498
|
+
|
|
499
|
+
/* Baldosa de icono: el relleno del icono lo decide el tema (--ds-icon-tile-fill). */
|
|
500
|
+
@layer base {
|
|
501
|
+
[data-slot='icon-tile'] svg {
|
|
502
|
+
fill: color-mix(in oklch, currentColor calc(var(--ds-icon-tile-fill) * 100%), transparent);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Tema `friendly` — guía de diseño
|
|
2
|
+
|
|
3
|
+
## Esencia
|
|
4
|
+
SaaS amable con personalidad: lienzo lila muy claro, tinta índigo, botones en píldora con brillo de color y un segundo acento naranja.
|
|
5
|
+
|
|
6
|
+
## Gesto firma
|
|
7
|
+
Botón primario en **píldora con mayúsculas y brillo de color debajo**; tarjetas de esquina pequeña frente a botones del todo redondos.
|
|
8
|
+
|
|
9
|
+
## Principios
|
|
10
|
+
- Contraste de formas: tarjetas casi rectas, acciones totalmente redondeadas.
|
|
11
|
+
- Sombras teñidas de índigo, nunca grises neutras.
|
|
12
|
+
- El naranja `#FBB232` es un segundo acento puntual.
|
|
13
|
+
|
|
14
|
+
## Referencias y qué se tomó de cada una
|
|
15
|
+
- **SerpWatch v2** (analizada en navegador): lienzo `#F5F6FC`, tinta `#232450`, fuente Rubik, botón periwinkle en píldora con mayúsculas, sombras teñidas, naranja como segundo acento, tarjetas de radio pequeño.
|
|
16
|
+
- Se **corrigió** de la referencia: el periwinkle original `#7987CE` con texto blanco da ≈3:1; aquí el primario es `#5F6EC9` (AA) y el original se conserva como brillo (`--brand-bright`).
|
|
17
|
+
|
|
18
|
+
## Paleta
|
|
19
|
+
- Claro: fondo `#F5F6FC`, tinta `#232450`, tarjeta `#FFFFFF`, primario `#5F6EC9`, borde `rgba(35,36,80,.08)`.
|
|
20
|
+
- Oscuro: fondo `#16173B`, tarjeta `#1F2150`, texto `#ECEDFA`.
|
|
21
|
+
|
|
22
|
+
## Tipografía
|
|
23
|
+
**Rubik** para titulares y cuerpo (`friendly.fonts.css`, lo primero del CSS de la app).
|
|
24
|
+
|
|
25
|
+
## Formas y profundidad
|
|
26
|
+
Radio base 8px; botones en píldora; sombras teñidas de índigo.
|
|
27
|
+
|
|
28
|
+
## Qué evita
|
|
29
|
+
Primario con contraste insuficiente, grises neutros en sombras.
|
|
30
|
+
|
|
31
|
+
## Accesibilidad
|
|
32
|
+
Primario `#5F6EC9` con texto blanco: AA. Texto atenuado y de estado también con AA.
|
|
33
|
+
|
|
34
|
+
## Estado de los valores
|
|
35
|
+
- **Leídos de la referencia**: lienzo, tinta, fuente, naranja, forma de botón.
|
|
36
|
+
- **Ajustados**: primario (para contraste).
|
|
37
|
+
- **Pendiente**: la piel oscura no procede de la referencia (diseño propio).
|
|
38
|
+
- Limitación conocida: su sombra de botón anula el anillo de foco (corrección prevista en el paquete).
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "friendly",
|
|
3
|
+
"label": "Amable",
|
|
4
|
+
"essence": "SaaS amable con personalidad: lienzo lila, tinta índigo, botones en píldora con brillo.",
|
|
5
|
+
"signature": ["botón en píldora con mayúsculas y brillo de color", "tarjetas de esquina pequeña frente a botones redondos"],
|
|
6
|
+
"fonts": { "display": "Rubik", "body": "Rubik", "file": "friendly.fonts.css", "distributable": true },
|
|
7
|
+
"palette": { "light": { "background": "#F5F6FC", "foreground": "#232450", "primary": "#5F6EC9" }, "dark": { "background": "#16173B" } },
|
|
8
|
+
"radii": [8, 999],
|
|
9
|
+
"references": [
|
|
10
|
+
{ "name": "SerpWatch v2", "tookFromIt": "lienzo, tinta, Rubik, botón en píldora, naranja, sombras teñidas", "source": "análisis en navegador" }
|
|
11
|
+
],
|
|
12
|
+
"status": { "verified": ["lienzo #F5F6FC", "tinta #232450", "fuente Rubik", "naranja #FBB232"], "approximate": [], "designed": ["primario #5F6EC9 (ajustado a AA)", "piel oscura"], "pending": ["anillo de foco en botones"] },
|
|
13
|
+
"guide": "friendly.guide.md"
|
|
14
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Tema `qratia` — guía de diseño
|
|
2
|
+
|
|
3
|
+
## Esencia
|
|
4
|
+
Tema base de la suite: sobrio, corporativo, de tinta azul marino y lienzo azulado claro. Es el tema que siempre está aplicado (`contract.baseTheme`); los demás solo lo sobrescriben.
|
|
5
|
+
|
|
6
|
+
## Gesto firma
|
|
7
|
+
Sidebar de **marca** (tinta `#0A1128`, igual en claro y oscuro) y tarjetas con **sombras en dos capas teñidas de la tinta**.
|
|
8
|
+
|
|
9
|
+
## Principios
|
|
10
|
+
- Valores del «centro» de la identidad: lienzo `#EEF5FB`, tarjeta `#FFFFFF`, borde `#DCE6F0`, primario/tinta `#0A1128`.
|
|
11
|
+
- Paleta en OKLCH, validada en contraste WCAG por el verify de la app.
|
|
12
|
+
- Sombras tintadas con la tinta del tema, nunca negro.
|
|
13
|
+
|
|
14
|
+
## Referencias y qué se tomó de cada una
|
|
15
|
+
Sin referencia externa: es la identidad propia (Qratia / Fractalia).
|
|
16
|
+
|
|
17
|
+
## Paleta
|
|
18
|
+
- Claro: fondo `oklch(0.967 0.011 244)`, primario `oklch(0.186 0.048 269)`, anillo de foco `oklch(0.534 0.107 231)`.
|
|
19
|
+
- Oscuro: tarjeta `#111B36`, texto `#E9F0F8`.
|
|
20
|
+
|
|
21
|
+
## Tipografía
|
|
22
|
+
**Instrument Sans** (`qratia.fonts.css`, lo primero del CSS de la app).
|
|
23
|
+
|
|
24
|
+
## Formas y profundidad
|
|
25
|
+
Radio base 0,625 rem; dos sombras de tarjeta (reposo y realce).
|
|
26
|
+
|
|
27
|
+
## Qué evita
|
|
28
|
+
Estridencias de color; sombras negras.
|
|
29
|
+
|
|
30
|
+
## Accesibilidad
|
|
31
|
+
Contraste WCAG validado con `check:contraste` en la app que lo consume.
|
|
32
|
+
|
|
33
|
+
## Estado de los valores
|
|
34
|
+
Provienen de la identidad propia de Qratia; son el punto de partida del contrato.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "qratia",
|
|
3
|
+
"label": "Qratia",
|
|
4
|
+
"essence": "Tema base: sobrio y corporativo, tinta azul marino y lienzo azulado.",
|
|
5
|
+
"signature": ["sidebar de marca (tinta #0A1128)", "sombras de tarjeta en dos capas teñidas"],
|
|
6
|
+
"fonts": { "display": "Instrument Sans", "body": "Instrument Sans", "file": "qratia.fonts.css", "distributable": true },
|
|
7
|
+
"palette": { "light": { "background": "#EEF5FB", "foreground": "#0A1128", "primary": "#0A1128" }, "dark": { "background": "#0A1128" } },
|
|
8
|
+
"radii": [10],
|
|
9
|
+
"references": [],
|
|
10
|
+
"status": { "verified": ["identidad Qratia"], "approximate": [], "designed": [], "pending": [] },
|
|
11
|
+
"guide": "qratia.guide.md"
|
|
12
|
+
}
|