@eduardoalvarez/arrecife 0.4.0 → 0.5.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.5.1](https://github.com/Proskynete/arrecife/compare/v0.5.0...v0.5.1) (2026-08-31)
4
+
5
+
6
+ ### 🐛 Correcciones
7
+
8
+ * **components:** la firma del pie va con la primera fila, no la última ([1a854ab](https://github.com/Proskynete/arrecife/commit/1a854ab7d71e66ab4998802ae3dc498f96e47b57))
9
+
10
+ ## [0.5.0](https://github.com/Proskynete/arrecife/compare/v0.4.0...v0.5.0) (2026-08-31)
11
+
12
+
13
+ ### ⚠ BREAKING CHANGES
14
+
15
+ * **primitives:** `Toast`, `ToastProvider`, `ToastViewport`, `ToastTitle` y `ToastDescription` dejan de exportarse; se usa `<Toaster />` una vez y `toast()` desde donde haga falta. `ToastAction` no cambia. Migración en docs/migracion-0.5.md.
16
+
17
+ ### 🚀 Novedades
18
+
19
+ * **components:** EventCalendar, la agenda con crear, editar y borrar ([6190700](https://github.com/Proskynete/arrecife/commit/61907003eeef777ba86c594791b2e95d225eda1f))
20
+ * **components:** la barra, el pie y las métricas como en el documento ([203b669](https://github.com/Proskynete/arrecife/commit/203b669379f63048ce4b34fce9a9411aebec3279))
21
+ * **primitives:** AvatarUpload, el avatar que se puede cambiar ([f888b4c](https://github.com/Proskynete/arrecife/commit/f888b4c0fadeddfb885f0b4651bf56000da7d430))
22
+ * **primitives:** el plegable anima la altura, como cuarta excepción ([b9dd44c](https://github.com/Proskynete/arrecife/commit/b9dd44ccb99ccb2c0f00ec99fefa17bc838cca52))
23
+ * **primitives:** Toaster es la única forma de mostrar un aviso ([2ec1d23](https://github.com/Proskynete/arrecife/commit/2ec1d2383ecd87c58a88c9e32543dc2112df2321))
24
+
25
+
26
+ ### 📚 Documentación
27
+
28
+ * los iconos de redes van agrupados, y por qué ([1939455](https://github.com/Proskynete/arrecife/commit/19394554185a54e4e752a86e27e60f1a60acec26))
29
+
3
30
  ## [0.4.0](https://github.com/Proskynete/arrecife/compare/v0.3.0...v0.4.0) (2026-08-31)
4
31
 
5
32
 
package/README.md CHANGED
@@ -83,6 +83,11 @@ con la hoja en `src/styles/` sube dos niveles y no uno. Lo detectaron los tests
83
83
  E2E del blog, no el build, y hasta la 0.3.0 esto solo estaba escrito en
84
84
  `llms.txt` — el archivo que lee un agente y no una persona.
85
85
 
86
+ > **Vienes de la 0.4.0 o anterior.** `Toast`, `ToastProvider`, `ToastViewport`,
87
+ > `ToastTitle` y `ToastDescription` dejaron de ser API pública en la 0.5.0: se
88
+ > usa `Toaster` y `toast()`. `ToastAction` se queda. La migración, con el porqué
89
+ > y los ejemplos, está en [`docs/migracion-0.5.md`](docs/migracion-0.5.md).
90
+
86
91
  > **Vienes de la 0.2.0 o anterior.** Los cinco escalones de espaciado se
87
92
  > renombraron: `p-md` es ahora `p-step-md`, `gap-sm` es `gap-step-sm`. Es un
88
93
  > cambio incompatible, y si tu proyecto usa `max-w-sm`, `max-w-md` o `max-w-lg`,
@@ -253,6 +258,34 @@ Comprobado empaquetando la librería con `pnpm pack` e instalándola en un proye
253
258
  aparte: los tipos resuelven desde `dist/`, `./tokens` carga sin arrastrar React y
254
259
  `./tokens/theme.css` se resuelve por subruta.
255
260
 
261
+ ### Los iconos de redes van agrupados
262
+
263
+ Es lo primero con lo que tropieza quien consume la librería, porque la forma
264
+ natural no funciona:
265
+
266
+ ```tsx
267
+ // ❌ no existe
268
+ import { GitHub, LinkedIn } from '@eduardoalvarez/arrecife';
269
+
270
+ // ✅
271
+ import { social } from '@eduardoalvarez/arrecife';
272
+
273
+ <social.GitHub />
274
+ <social.LinkedIn />
275
+ ```
276
+
277
+ Los ocho son `GitHub`, `LinkedIn`, `X`, `Instagram`, `Discord`, `YouTube`, `Rss`
278
+ y `Correo`. Van bajo un namespace por un motivo concreto: **uno se llama `X`**.
279
+ Un `export const X` en la raíz de una librería de componentes colisiona con
280
+ cualquier cosa —una variable de un genérico, un `import { X }` de otro sitio— y
281
+ el fallo aparece lejos de aquí.
282
+
283
+ **Los glifos internos NO se exportan.** `Close`, `ChevronDown`, `Copy`, `Sol` y
284
+ compañía son el juego mínimo que necesitan los primitivos y se quedan dentro.
285
+ Publicarlos convertiría `lib/glyphs.tsx` en la librería de iconos que el sistema
286
+ decidió no tener, y a partir de ahí crece sola. Un proyecto que necesite un icono
287
+ pasa el suyo: `Stat` recibe `icon`, `Footer` recibe el `icon` de cada red.
288
+
256
289
  ### Las dos subrutas que piden una dependencia
257
290
 
258
291
  `./form` y `./chart` no cuelgan de la raíz, y es a propósito. Cada una pide una
@@ -286,7 +319,7 @@ grep sobre esas dos líneas no encuentra React ni aunque el chunk lo importe.
286
319
  | `pnpm typecheck` | `tsc --noEmit` |
287
320
  | `pnpm lint` | ESLint, incluido el veto a hex literales fuera de `tokens.ts` |
288
321
  | `pnpm check:tokens` | falla si `src/tokens/` importa algo de fuera |
289
- | `pnpm test` | compila Tailwind y corre axe sobre las 193 stories, en los dos modos |
322
+ | `pnpm test` | compila Tailwind y corre axe sobre las 206 stories, en los dos modos |
290
323
  | `pnpm check:exports` | verifica que `dist/` tiene lo que `exports` promete |
291
324
  | `pnpm check:release` | valida `release-please-config.json` contra el esquema oficial |
292
325
  | `pnpm storybook` | genera los tokens y levanta Storybook en el 6006 |
@@ -116,6 +116,9 @@ var spacing = {
116
116
  stepXl: 40,
117
117
  section: 96
118
118
  };
119
+ var tagline = {
120
+ /** Header, una línea. */
121
+ corto: "Ayudo a equipos a escalar con criterio"};
119
122
  var naming = {
120
123
  wordmark: "Eduardo \xC1lvarez"};
121
124
 
@@ -165,20 +168,36 @@ function Logo({
165
168
  sobre = "oscuro",
166
169
  basePath = RUTA_ASSETS,
167
170
  soloIsotipo = false,
171
+ conLema = false,
168
172
  className,
169
173
  ...props
170
174
  }) {
175
+ const conAleta = /* @__PURE__ */ jsxRuntime.jsx(
176
+ Isotipo,
177
+ {
178
+ sobre,
179
+ basePath,
180
+ alt: soloIsotipo ? naming.wordmark : "",
181
+ className: conLema ? "h-9 w-auto" : "h-7 w-auto"
182
+ }
183
+ );
184
+ const wordmark = /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-ui font-display text-text-primary font-bold tracking-[-0.02em]", children: naming.wordmark });
185
+ if (soloIsotipo) {
186
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: conAleta });
187
+ }
188
+ if (conLema) {
189
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("gap-step-sm inline-flex items-center", className), ...props, children: [
190
+ conAleta,
191
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "bg-hairline h-8 w-px shrink-0" }),
192
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [
193
+ wordmark,
194
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-eyebrow font-mono text-text-muted uppercase", children: tagline.corto })
195
+ ] })
196
+ ] });
197
+ }
171
198
  return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: [
172
- /* @__PURE__ */ jsxRuntime.jsx(
173
- Isotipo,
174
- {
175
- sobre,
176
- basePath,
177
- alt: soloIsotipo ? naming.wordmark : "",
178
- className: "h-7 w-auto"
179
- }
180
- ),
181
- soloIsotipo ? null : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-ui font-display text-text-primary font-bold tracking-[-0.02em]", children: naming.wordmark })
199
+ conAleta,
200
+ wordmark
182
201
  ] });
183
202
  }
184
203
  function Mascota({
@@ -22,6 +22,14 @@ type LogoProps = Omit<ComponentPropsWithoutRef<'span'>, 'children'> & {
22
22
  basePath?: string | undefined;
23
23
  /** Oculta el wordmark y deja solo la aleta, para barras muy estrechas. */
24
24
  soloIsotipo?: boolean | undefined;
25
+ /**
26
+ * Añade el lema bajo el wordmark, separado de la aleta por una divisoria.
27
+ *
28
+ * Es la forma que toma la marca en la barra del sitio. El texto sale de
29
+ * `tagline.corto` y no se puede pasar por prop, por lo mismo que el wordmark:
30
+ * un lema escrito a mano en cinco proyectos son cinco lemas en seis meses.
31
+ */
32
+ conLema?: boolean | undefined;
25
33
  };
26
34
  /**
27
35
  * El wordmark sale de `naming.wordmark`, no de una cadena escrita a mano, y
@@ -31,7 +39,7 @@ type LogoProps = Omit<ComponentPropsWithoutRef<'span'>, 'children'> & {
31
39
  * Cuando se oculta el wordmark, el nombre sigue llegando al lector de pantalla
32
40
  * por el `alt` del isotipo. Un logo sin nombre accesible es un logo invisible.
33
41
  */
34
- declare function Logo({ sobre, basePath, soloIsotipo, className, ...props }: LogoProps): react.JSX.Element;
42
+ declare function Logo({ sobre, basePath, soloIsotipo, conLema, className, ...props }: LogoProps): react.JSX.Element;
35
43
 
36
44
  type Base = Omit<ComponentPropsWithoutRef<'img'>, 'src' | 'alt'> & {
37
45
  basePath?: string | undefined;
@@ -22,6 +22,14 @@ type LogoProps = Omit<ComponentPropsWithoutRef<'span'>, 'children'> & {
22
22
  basePath?: string | undefined;
23
23
  /** Oculta el wordmark y deja solo la aleta, para barras muy estrechas. */
24
24
  soloIsotipo?: boolean | undefined;
25
+ /**
26
+ * Añade el lema bajo el wordmark, separado de la aleta por una divisoria.
27
+ *
28
+ * Es la forma que toma la marca en la barra del sitio. El texto sale de
29
+ * `tagline.corto` y no se puede pasar por prop, por lo mismo que el wordmark:
30
+ * un lema escrito a mano en cinco proyectos son cinco lemas en seis meses.
31
+ */
32
+ conLema?: boolean | undefined;
25
33
  };
26
34
  /**
27
35
  * El wordmark sale de `naming.wordmark`, no de una cadena escrita a mano, y
@@ -31,7 +39,7 @@ type LogoProps = Omit<ComponentPropsWithoutRef<'span'>, 'children'> & {
31
39
  * Cuando se oculta el wordmark, el nombre sigue llegando al lector de pantalla
32
40
  * por el `alt` del isotipo. Un logo sin nombre accesible es un logo invisible.
33
41
  */
34
- declare function Logo({ sobre, basePath, soloIsotipo, className, ...props }: LogoProps): react.JSX.Element;
42
+ declare function Logo({ sobre, basePath, soloIsotipo, conLema, className, ...props }: LogoProps): react.JSX.Element;
35
43
 
36
44
  type Base = Omit<ComponentPropsWithoutRef<'img'>, 'src' | 'alt'> & {
37
45
  basePath?: string | undefined;
@@ -1,4 +1,4 @@
1
- export { CaraDeMascota, Isotipo, Logo, Mascota } from '../chunk-TB3IYPOD.js';
1
+ export { CaraDeMascota, Isotipo, Logo, Mascota } from '../chunk-YZ2SDOVZ.js';
2
2
  export { RUTA_ASSETS, aletas, caras, listaCaras, listaPoses, poses, usoDeCara } from '../chunk-E3OMP2DL.js';
3
3
  import '../chunk-NHS7ETKJ.js';
4
4
  import '../chunk-TSPJOM6K.js';
@@ -1,6 +1,6 @@
1
1
  import { aletas, RUTA_ASSETS, poses, caras } from './chunk-E3OMP2DL.js';
2
2
  import { cn } from './chunk-NHS7ETKJ.js';
3
- import { naming } from './chunk-TSPJOM6K.js';
3
+ import { naming, tagline } from './chunk-TSPJOM6K.js';
4
4
  import { jsx, jsxs } from 'react/jsx-runtime';
5
5
 
6
6
  function Isotipo({
@@ -27,20 +27,36 @@ function Logo({
27
27
  sobre = "oscuro",
28
28
  basePath = RUTA_ASSETS,
29
29
  soloIsotipo = false,
30
+ conLema = false,
30
31
  className,
31
32
  ...props
32
33
  }) {
34
+ const conAleta = /* @__PURE__ */ jsx(
35
+ Isotipo,
36
+ {
37
+ sobre,
38
+ basePath,
39
+ alt: soloIsotipo ? naming.wordmark : "",
40
+ className: conLema ? "h-9 w-auto" : "h-7 w-auto"
41
+ }
42
+ );
43
+ const wordmark = /* @__PURE__ */ jsx("span", { className: "text-ui font-display text-text-primary font-bold tracking-[-0.02em]", children: naming.wordmark });
44
+ if (soloIsotipo) {
45
+ return /* @__PURE__ */ jsx("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: conAleta });
46
+ }
47
+ if (conLema) {
48
+ return /* @__PURE__ */ jsxs("span", { className: cn("gap-step-sm inline-flex items-center", className), ...props, children: [
49
+ conAleta,
50
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "bg-hairline h-8 w-px shrink-0" }),
51
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col", children: [
52
+ wordmark,
53
+ /* @__PURE__ */ jsx("span", { className: "text-eyebrow font-mono text-text-muted uppercase", children: tagline.corto })
54
+ ] })
55
+ ] });
56
+ }
33
57
  return /* @__PURE__ */ jsxs("span", { className: cn("gap-step-xs inline-flex items-center", className), ...props, children: [
34
- /* @__PURE__ */ jsx(
35
- Isotipo,
36
- {
37
- sobre,
38
- basePath,
39
- alt: soloIsotipo ? naming.wordmark : "",
40
- className: "h-7 w-auto"
41
- }
42
- ),
43
- soloIsotipo ? null : /* @__PURE__ */ jsx("span", { className: "text-ui font-display text-text-primary font-bold tracking-[-0.02em]", children: naming.wordmark })
58
+ conAleta,
59
+ wordmark
44
60
  ] });
45
61
  }
46
62
  function Mascota({