@eduardoalvarez/arrecife 0.5.1 → 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/CHANGELOG.md +45 -0
- package/README.md +706 -470
- package/dist/brand/index.cjs +112 -95
- package/dist/brand/index.d.cts +40 -39
- package/dist/brand/index.d.ts +40 -39
- package/dist/brand/index.js +5 -4
- package/dist/catalog-D13txprv.d.cts +78 -0
- package/dist/catalog-D13txprv.d.ts +78 -0
- package/dist/chart/index.cjs +100 -83
- package/dist/chart/index.d.cts +66 -66
- package/dist/chart/index.d.ts +66 -66
- package/dist/chart/index.js +14 -12
- package/dist/chunk-25YNFCIF.js +141 -0
- package/dist/{chunk-YZ2SDOVZ.js → chunk-6O3KWB6P.js} +30 -30
- package/dist/chunk-CKRSQPTX.js +36 -0
- package/dist/{chunk-ZEOQKRQ7.js → chunk-DKCN7BAL.js} +1 -1
- package/dist/chunk-GCRII2KQ.js +86 -0
- package/dist/chunk-JMOOFZ3B.js +42 -0
- package/dist/chunk-O4TAH7YJ.js +276 -0
- package/dist/chunk-ODBFN44D.js +45 -0
- package/dist/{chunk-VPT32GPG.js → chunk-PMN7NR3G.js} +2 -2
- package/dist/chunk-XKYHTOUJ.js +27 -0
- package/dist/form/index.cjs +109 -92
- package/dist/form/index.d.cts +43 -42
- package/dist/form/index.d.ts +43 -42
- package/dist/form/index.js +25 -23
- package/dist/index.cjs +1047 -914
- package/dist/index.d.cts +769 -777
- package/dist/index.d.ts +769 -777
- package/dist/index.js +608 -660
- package/dist/{label-DuTvJGxD.d.ts → label-MgHFKnFy.d.cts} +3 -3
- package/dist/{label-DuTvJGxD.d.cts → label-MgHFKnFy.d.ts} +3 -3
- package/dist/og/index.cjs +130 -130
- package/dist/og/index.d.cts +93 -89
- package/dist/og/index.d.ts +93 -89
- package/dist/og/index.js +106 -106
- package/dist/shiki/index.cjs +28 -30
- package/dist/shiki/index.d.cts +4 -4
- package/dist/shiki/index.d.ts +4 -4
- package/dist/shiki/index.js +12 -12
- package/dist/theme/index.cjs +97 -0
- package/dist/theme/index.d.cts +144 -0
- package/dist/theme/index.d.ts +144 -0
- package/dist/theme/index.js +2 -0
- package/dist/tokens/index.cjs +133 -86
- package/dist/tokens/index.d.cts +246 -161
- package/dist/tokens/index.d.ts +246 -161
- package/dist/tokens/index.js +2 -2
- package/dist/tokens/theme.css +133 -98
- package/dist/variants/index.cjs +192 -0
- package/dist/variants/index.d.cts +192 -0
- package/dist/variants/index.d.ts +192 -0
- package/dist/variants/index.js +3 -0
- package/llms.txt +810 -744
- package/package.json +20 -11
- package/dist/catalogo-Du5ID-Hi.d.cts +0 -77
- package/dist/catalogo-Du5ID-Hi.d.ts +0 -77
- package/dist/chunk-E3OMP2DL.js +0 -36
- package/dist/chunk-KPZNNMV5.js +0 -83
- package/dist/chunk-NHS7ETKJ.js +0 -27
- package/dist/chunk-TSPJOM6K.js +0 -229
- package/dist/chunk-UOWIDFCB.js +0 -81
- package/dist/tema/index.cjs +0 -94
- package/dist/tema/index.d.cts +0 -110
- package/dist/tema/index.d.ts +0 -110
- package/dist/tema/index.js +0 -2
package/dist/index.js
CHANGED
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export {
|
|
7
|
-
import {
|
|
8
|
-
export {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
export {
|
|
1
|
+
'use client';
|
|
2
|
+
export { tokens } from './chunk-PMN7NR3G.js';
|
|
3
|
+
import { toggleTheme, currentTheme, watchTheme } from './chunk-GCRII2KQ.js';
|
|
4
|
+
export { THEME_ATTRIBUTE, THEME_EVENT, THEME_KEY, applyTheme, currentTheme, preferredTheme, storedTheme, themeScript, toggleTheme, watchTheme } from './chunk-GCRII2KQ.js';
|
|
5
|
+
import { alert, button, avatar, badge, category, metric, CARD_SURFACE, CARD } from './chunk-25YNFCIF.js';
|
|
6
|
+
export { CARD, CARD_HOVER, CARD_SURFACE, alert as alertVariants, avatar as avatarVariants, badge as badgeVariants, button as buttonVariants, category as categoryBadgeVariants, metric as metricBadgeVariants } from './chunk-25YNFCIF.js';
|
|
7
|
+
import { MascotFace, Mascot } from './chunk-6O3KWB6P.js';
|
|
8
|
+
export { Isotype, Logo, Mascot, MascotFace } from './chunk-6O3KWB6P.js';
|
|
9
|
+
export { ASSETS_PATH, faceList, faceUsage, faces, fins, poseList, poses } from './chunk-CKRSQPTX.js';
|
|
10
|
+
import { Label } from './chunk-DKCN7BAL.js';
|
|
11
|
+
export { Label } from './chunk-DKCN7BAL.js';
|
|
12
|
+
import { Text } from './chunk-JMOOFZ3B.js';
|
|
13
|
+
export { Text } from './chunk-JMOOFZ3B.js';
|
|
14
|
+
export { text as textVariants } from './chunk-ODBFN44D.js';
|
|
15
|
+
import { cn } from './chunk-XKYHTOUJ.js';
|
|
16
|
+
export { cn } from './chunk-XKYHTOUJ.js';
|
|
17
|
+
import { naming } from './chunk-O4TAH7YJ.js';
|
|
18
|
+
export { brand, colors, control, dark, fonts, gradient, light, limits, motion, naming, radius, series, shadow, size, spacing, syntax, tagline, typeScale } from './chunk-O4TAH7YJ.js';
|
|
15
19
|
import { __export } from './chunk-MLKGABMK.js';
|
|
16
20
|
import * as AccordionPrimitive from '@radix-ui/react-accordion';
|
|
17
21
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
18
22
|
import { cva } from 'class-variance-authority';
|
|
19
23
|
import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
|
|
20
|
-
import { Slot } from '@radix-ui/react-slot';
|
|
21
24
|
import * as AvatarPrimitive from '@radix-ui/react-avatar';
|
|
22
25
|
import { useId, useState, useEffect, useSyncExternalStore, useRef, useCallback } from 'react';
|
|
26
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
23
27
|
import { es } from 'date-fns/locale';
|
|
24
28
|
import { DayPicker } from 'react-day-picker';
|
|
25
29
|
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
|
@@ -88,16 +92,16 @@ var Spinner = (props) => /* @__PURE__ */ jsxs(
|
|
|
88
92
|
]
|
|
89
93
|
}
|
|
90
94
|
);
|
|
91
|
-
var
|
|
95
|
+
var Camera = (props) => /* @__PURE__ */ jsxs(Glyph, { ...props, children: [
|
|
92
96
|
/* @__PURE__ */ jsx("path", { d: "M2 5.5h2.6l1-1.5h4.8l1 1.5H14v7.5H2z" }),
|
|
93
97
|
/* @__PURE__ */ jsx("circle", { cx: "8", cy: "9", r: "2.4" })
|
|
94
98
|
] });
|
|
95
|
-
var
|
|
99
|
+
var Sun = (props) => /* @__PURE__ */ jsxs(Glyph, { ...props, children: [
|
|
96
100
|
/* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "3" }),
|
|
97
101
|
/* @__PURE__ */ jsx("path", { d: "M8 1.5v1.2M8 13.3v1.2M14.5 8h-1.2M2.7 8H1.5M12.6 3.4l-.85.85M4.25 11.75l-.85.85M12.6 12.6l-.85-.85M4.25 4.25l-.85-.85" })
|
|
98
102
|
] });
|
|
99
|
-
var
|
|
100
|
-
function
|
|
103
|
+
var Moon = (props) => /* @__PURE__ */ jsx(Glyph, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M13.5 9.4A5.8 5.8 0 0 1 6.6 2.5a5.8 5.8 0 1 0 6.9 6.9Z" }) });
|
|
104
|
+
function MediaGlyph({ children, ...props }) {
|
|
101
105
|
return /* @__PURE__ */ jsx(
|
|
102
106
|
"svg",
|
|
103
107
|
{
|
|
@@ -111,10 +115,10 @@ function GlifoMedia({ children, ...props }) {
|
|
|
111
115
|
}
|
|
112
116
|
);
|
|
113
117
|
}
|
|
114
|
-
var Play = (props) => /* @__PURE__ */ jsx(
|
|
115
|
-
var Pause = (props) => /* @__PURE__ */ jsx(
|
|
118
|
+
var Play = (props) => /* @__PURE__ */ jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsx("path", { d: "M8 5v14l11-7z" }) });
|
|
119
|
+
var Pause = (props) => /* @__PURE__ */ jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsx("path", { d: "M6 4h4v16H6V4zm8 0h4v16h-4V4z" }) });
|
|
116
120
|
var Retry = (props) => /* @__PURE__ */ jsx(
|
|
117
|
-
|
|
121
|
+
MediaGlyph,
|
|
118
122
|
{
|
|
119
123
|
stroke: "currentColor",
|
|
120
124
|
strokeWidth: 2,
|
|
@@ -124,7 +128,7 @@ var Retry = (props) => /* @__PURE__ */ jsx(
|
|
|
124
128
|
children: /* @__PURE__ */ jsx("path", { d: "M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15" })
|
|
125
129
|
}
|
|
126
130
|
);
|
|
127
|
-
var GoBackSeconds = (props) => /* @__PURE__ */ jsxs(
|
|
131
|
+
var GoBackSeconds = (props) => /* @__PURE__ */ jsxs(MediaGlyph, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
|
|
128
132
|
/* @__PURE__ */ jsx("path", { d: "M16.5 8.5H13.8604C13.6452 8.5 13.4541 8.63772 13.386 8.84189L12.7194 10.8419C12.6114 11.1657 12.8524 11.5 13.1937 11.5H14.5C15.6046 11.5 16.5 12.3954 16.5 13.5C16.5 14.6046 15.6046 15.5 14.5 15.5H12.5" }),
|
|
129
133
|
/* @__PURE__ */ jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
|
|
130
134
|
/* @__PURE__ */ jsx(
|
|
@@ -135,7 +139,7 @@ var GoBackSeconds = (props) => /* @__PURE__ */ jsxs(GlifoMedia, { stroke: "curre
|
|
|
135
139
|
}
|
|
136
140
|
)
|
|
137
141
|
] });
|
|
138
|
-
var AdvanceSeconds = (props) => /* @__PURE__ */ jsxs(
|
|
142
|
+
var AdvanceSeconds = (props) => /* @__PURE__ */ jsxs(MediaGlyph, { stroke: "currentColor", strokeWidth: 1.5, strokeLinecap: "round", ...props, children: [
|
|
139
143
|
/* @__PURE__ */ jsx("path", { d: "M16.5 8.5H13.8604C13.6452 8.5 13.4541 8.63772 13.386 8.84189L12.7194 10.8419C12.6114 11.1657 12.8524 11.5 13.1937 11.5H14.5C15.6046 11.5 16.5 12.3954 16.5 13.5C16.5 14.6046 15.6046 15.5 14.5 15.5H12.5" }),
|
|
140
144
|
/* @__PURE__ */ jsx("path", { d: "M7.5 10.5L10 8.5V15.5", strokeLinejoin: "round" }),
|
|
141
145
|
/* @__PURE__ */ jsx(
|
|
@@ -146,8 +150,8 @@ var AdvanceSeconds = (props) => /* @__PURE__ */ jsxs(GlifoMedia, { stroke: "curr
|
|
|
146
150
|
}
|
|
147
151
|
)
|
|
148
152
|
] });
|
|
149
|
-
var VolumeOn = (props) => /* @__PURE__ */ jsx(
|
|
150
|
-
var VolumeMuted = (props) => /* @__PURE__ */ jsx(
|
|
153
|
+
var VolumeOn = (props) => /* @__PURE__ */ jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsx("path", { d: "M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z" }) });
|
|
154
|
+
var VolumeMuted = (props) => /* @__PURE__ */ jsx(MediaGlyph, { fill: "currentColor", ...props, children: /* @__PURE__ */ jsx("path", { d: "M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z" }) });
|
|
151
155
|
function Accordion({ className, ...props }) {
|
|
152
156
|
return /* @__PURE__ */ jsx(
|
|
153
157
|
AccordionPrimitive.Root,
|
|
@@ -169,8 +173,8 @@ function AccordionTrigger({
|
|
|
169
173
|
headingLevel = 3,
|
|
170
174
|
...props
|
|
171
175
|
}) {
|
|
172
|
-
const
|
|
173
|
-
return /* @__PURE__ */ jsx(AccordionPrimitive.Header, { asChild: true, children: /* @__PURE__ */ jsx(
|
|
176
|
+
const Heading = `h${headingLevel}`;
|
|
177
|
+
return /* @__PURE__ */ jsx(AccordionPrimitive.Header, { asChild: true, children: /* @__PURE__ */ jsx(Heading, { children: /* @__PURE__ */ jsxs(
|
|
174
178
|
AccordionPrimitive.Trigger,
|
|
175
179
|
{
|
|
176
180
|
className: cn(
|
|
@@ -201,45 +205,20 @@ function AccordionContent({
|
|
|
201
205
|
{
|
|
202
206
|
className: cn(
|
|
203
207
|
"overflow-hidden",
|
|
204
|
-
"motion-safe:data-[state=open]:
|
|
208
|
+
"motion-safe:data-[state=open]:expand motion-safe:data-[state=closed]:collapse"
|
|
205
209
|
),
|
|
206
210
|
...props,
|
|
207
211
|
children: /* @__PURE__ */ jsx("div", { className: cn("pb-step-md font-sans text-ui text-text-secondary max-w-measure", className), children })
|
|
208
212
|
}
|
|
209
213
|
);
|
|
210
214
|
}
|
|
211
|
-
var
|
|
212
|
-
variants: {
|
|
213
|
-
variant: {
|
|
214
|
-
accent: "text-text-secondary",
|
|
215
|
-
success: "text-text-secondary",
|
|
216
|
-
warning: "text-text-secondary",
|
|
217
|
-
error: "text-text-secondary"
|
|
218
|
-
},
|
|
219
|
-
enfasis: {
|
|
220
|
-
sutil: "",
|
|
221
|
-
fuerte: ""
|
|
222
|
-
}
|
|
223
|
-
},
|
|
224
|
-
compoundVariants: [
|
|
225
|
-
{ variant: "accent", enfasis: "sutil", class: "border-accent/22 bg-accent/8" },
|
|
226
|
-
{ variant: "success", enfasis: "sutil", class: "border-success/22 bg-success/8" },
|
|
227
|
-
{ variant: "warning", enfasis: "sutil", class: "border-warning/22 bg-warning/8" },
|
|
228
|
-
{ variant: "error", enfasis: "sutil", class: "border-error/22 bg-error/8" },
|
|
229
|
-
{ variant: "accent", enfasis: "fuerte", class: "border-accent bg-accent/10" },
|
|
230
|
-
{ variant: "success", enfasis: "fuerte", class: "border-success bg-success/10" },
|
|
231
|
-
{ variant: "warning", enfasis: "fuerte", class: "border-warning bg-warning/10" },
|
|
232
|
-
{ variant: "error", enfasis: "fuerte", class: "border-error bg-error/10" }
|
|
233
|
-
],
|
|
234
|
-
defaultVariants: { variant: "accent", enfasis: "sutil" }
|
|
235
|
-
});
|
|
236
|
-
var glifoColor = {
|
|
215
|
+
var colorGlyph = {
|
|
237
216
|
accent: "text-accent",
|
|
238
217
|
success: "text-success",
|
|
239
218
|
warning: "text-warning",
|
|
240
219
|
error: "text-error"
|
|
241
220
|
};
|
|
242
|
-
var
|
|
221
|
+
var GLYPH = {
|
|
243
222
|
accent: "\u2726",
|
|
244
223
|
success: "\u2713",
|
|
245
224
|
warning: "!",
|
|
@@ -248,26 +227,26 @@ var GLIFO = {
|
|
|
248
227
|
function Alert({
|
|
249
228
|
className,
|
|
250
229
|
variant,
|
|
251
|
-
|
|
230
|
+
emphasis,
|
|
252
231
|
title,
|
|
253
232
|
icon,
|
|
254
233
|
children,
|
|
255
234
|
...props
|
|
256
235
|
}) {
|
|
257
|
-
const
|
|
236
|
+
const tone = variant ?? "accent";
|
|
258
237
|
return /* @__PURE__ */ jsx(
|
|
259
238
|
"div",
|
|
260
239
|
{
|
|
261
|
-
role:
|
|
262
|
-
className: cn(alert({ variant,
|
|
240
|
+
role: tone === "error" ? "alert" : "status",
|
|
241
|
+
className: cn(alert({ variant, emphasis }), className),
|
|
263
242
|
...props,
|
|
264
243
|
children: /* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex items-start", children: [
|
|
265
244
|
/* @__PURE__ */ jsx(
|
|
266
245
|
"span",
|
|
267
246
|
{
|
|
268
247
|
"aria-hidden": "true",
|
|
269
|
-
className: cn("font-mono text-ui leading-normal select-none",
|
|
270
|
-
children: icon ??
|
|
248
|
+
className: cn("font-mono text-ui leading-normal select-none", colorGlyph[tone]),
|
|
249
|
+
children: icon ?? GLYPH[tone]
|
|
271
250
|
}
|
|
272
251
|
),
|
|
273
252
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
@@ -278,79 +257,6 @@ function Alert({
|
|
|
278
257
|
}
|
|
279
258
|
);
|
|
280
259
|
}
|
|
281
|
-
var button = cva(
|
|
282
|
-
[
|
|
283
|
-
"inline-flex cursor-pointer items-center justify-center gap-step-xs whitespace-nowrap select-none",
|
|
284
|
-
"rounded-control font-sans font-medium",
|
|
285
|
-
"transition-standard",
|
|
286
|
-
"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
|
|
287
|
-
"disabled:pointer-events-none disabled:opacity-50",
|
|
288
|
-
"[&_svg]:shrink-0"
|
|
289
|
-
],
|
|
290
|
-
{
|
|
291
|
-
variants: {
|
|
292
|
-
variant: {
|
|
293
|
-
primary: [
|
|
294
|
-
"bg-accent text-accent-on hover:bg-accent-hover",
|
|
295
|
-
"light:bg-brand-hull light:text-accent-on light:hover:bg-text-secondary"
|
|
296
|
-
],
|
|
297
|
-
conversion: "bg-warm text-warm-on hover:bg-warm-hover",
|
|
298
|
-
secondary: [
|
|
299
|
-
"border-hairline-hover border bg-transparent text-text-primary",
|
|
300
|
-
"hover:border-accent hover:text-accent"
|
|
301
|
-
],
|
|
302
|
-
tertiary: [
|
|
303
|
-
"bg-transparent font-mono font-normal text-text-secondary",
|
|
304
|
-
"hover:text-accent hover:underline hover:underline-offset-4"
|
|
305
|
-
]
|
|
306
|
-
},
|
|
307
|
-
size: {
|
|
308
|
-
sm: "h-8 px-control-sm text-label",
|
|
309
|
-
md: "h-10 px-control-md text-ui",
|
|
310
|
-
lg: "h-12 px-control-lg text-lead",
|
|
311
|
-
/** Cuadrado 42×42, sin texto. Lleva `aria-label` obligatorio. */
|
|
312
|
-
icon: "size-control-icon p-0"
|
|
313
|
-
}
|
|
314
|
-
},
|
|
315
|
-
compoundVariants: [
|
|
316
|
-
/**
|
|
317
|
-
* El terciario no tiene caja: ni padding horizontal ni alto de control.
|
|
318
|
-
* Va aquí y no como `px-0` en la variante para que gane al `px-*` del
|
|
319
|
-
* tamaño sin depender del orden en que cva concatena las clases.
|
|
320
|
-
*/
|
|
321
|
-
{ variant: "tertiary", size: ["sm", "md", "lg"], class: "h-auto px-0" }
|
|
322
|
-
],
|
|
323
|
-
defaultVariants: { variant: "primary", size: "md" }
|
|
324
|
-
}
|
|
325
|
-
);
|
|
326
|
-
function Button({
|
|
327
|
-
className,
|
|
328
|
-
variant,
|
|
329
|
-
size: size2,
|
|
330
|
-
asChild = false,
|
|
331
|
-
loading = false,
|
|
332
|
-
icon,
|
|
333
|
-
children,
|
|
334
|
-
disabled,
|
|
335
|
-
...props
|
|
336
|
-
}) {
|
|
337
|
-
if (asChild) {
|
|
338
|
-
return /* @__PURE__ */ jsx(Slot, { className: cn(button({ variant, size: size2 }), className), ...props, children });
|
|
339
|
-
}
|
|
340
|
-
return /* @__PURE__ */ jsxs(
|
|
341
|
-
"button",
|
|
342
|
-
{
|
|
343
|
-
className: cn(button({ variant, size: size2 }), className),
|
|
344
|
-
disabled: disabled === true || loading,
|
|
345
|
-
"aria-busy": loading || void 0,
|
|
346
|
-
...props,
|
|
347
|
-
children: [
|
|
348
|
-
loading ? /* @__PURE__ */ jsx(Spinner, {}) : icon,
|
|
349
|
-
children
|
|
350
|
-
]
|
|
351
|
-
}
|
|
352
|
-
);
|
|
353
|
-
}
|
|
354
260
|
var AlertDialog = AlertDialogPrimitive.Root;
|
|
355
261
|
var AlertDialogTrigger = AlertDialogPrimitive.Trigger;
|
|
356
262
|
function AlertDialogOverlay({
|
|
@@ -448,20 +354,6 @@ function AlertDialogAction({
|
|
|
448
354
|
}
|
|
449
355
|
);
|
|
450
356
|
}
|
|
451
|
-
var avatar = cva(
|
|
452
|
-
"relative flex shrink-0 overflow-hidden rounded-pill bg-surface-raised border border-hairline",
|
|
453
|
-
{
|
|
454
|
-
variants: {
|
|
455
|
-
size: {
|
|
456
|
-
sm: "size-8",
|
|
457
|
-
md: "size-10",
|
|
458
|
-
lg: "size-14",
|
|
459
|
-
xl: "size-24"
|
|
460
|
-
}
|
|
461
|
-
},
|
|
462
|
-
defaultVariants: { size: "md" }
|
|
463
|
-
}
|
|
464
|
-
);
|
|
465
357
|
function Avatar({ className, size: size2, ...props }) {
|
|
466
358
|
return /* @__PURE__ */ jsx(AvatarPrimitive.Root, { className: cn(avatar({ size: size2 }), className), ...props });
|
|
467
359
|
}
|
|
@@ -498,22 +390,22 @@ function AvatarUpload({
|
|
|
498
390
|
...props
|
|
499
391
|
}) {
|
|
500
392
|
const id = useId();
|
|
501
|
-
const [
|
|
393
|
+
const [preview, setPreview] = useState(null);
|
|
502
394
|
useEffect(() => {
|
|
503
|
-
if (!
|
|
504
|
-
return () => URL.revokeObjectURL(
|
|
505
|
-
}, [
|
|
506
|
-
function
|
|
507
|
-
const
|
|
508
|
-
if (!
|
|
509
|
-
|
|
510
|
-
onSelectFile?.(
|
|
511
|
-
|
|
395
|
+
if (!preview) return;
|
|
396
|
+
return () => URL.revokeObjectURL(preview);
|
|
397
|
+
}, [preview]);
|
|
398
|
+
function pick(event) {
|
|
399
|
+
const file = event.target.files?.[0];
|
|
400
|
+
if (!file) return;
|
|
401
|
+
setPreview(URL.createObjectURL(file));
|
|
402
|
+
onSelectFile?.(file);
|
|
403
|
+
event.target.value = "";
|
|
512
404
|
}
|
|
513
|
-
const
|
|
405
|
+
const image = preview ?? src;
|
|
514
406
|
return /* @__PURE__ */ jsxs("div", { className: cn("relative inline-flex", className), ...props, children: [
|
|
515
407
|
/* @__PURE__ */ jsxs(Avatar, { size: size2, children: [
|
|
516
|
-
|
|
408
|
+
image ? /* @__PURE__ */ jsx(AvatarImage, { src: image, alt: "" }) : null,
|
|
517
409
|
/* @__PURE__ */ jsx(AvatarFallback, { children: fallback })
|
|
518
410
|
] }),
|
|
519
411
|
/* @__PURE__ */ jsxs(
|
|
@@ -524,13 +416,13 @@ function AvatarUpload({
|
|
|
524
416
|
"rounded-pill absolute -right-1 -bottom-1 flex size-6 cursor-pointer items-center justify-center",
|
|
525
417
|
"border-hairline bg-surface-raised text-text-secondary border",
|
|
526
418
|
"transition-standard hover:text-accent hover:border-accent",
|
|
527
|
-
//
|
|
528
|
-
//
|
|
419
|
+
// Focus lives on the input, which is hidden: without this, tabbing to
|
|
420
|
+
// the control shows up nowhere.
|
|
529
421
|
"has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-accent",
|
|
530
422
|
disabled && "pointer-events-none opacity-50"
|
|
531
423
|
),
|
|
532
424
|
children: [
|
|
533
|
-
/* @__PURE__ */ jsx(
|
|
425
|
+
/* @__PURE__ */ jsx(Camera, { "aria-hidden": "true" }),
|
|
534
426
|
/* @__PURE__ */ jsx("span", { className: "sr-only", children: label }),
|
|
535
427
|
/* @__PURE__ */ jsx(
|
|
536
428
|
"input",
|
|
@@ -539,7 +431,7 @@ function AvatarUpload({
|
|
|
539
431
|
type: "file",
|
|
540
432
|
accept,
|
|
541
433
|
disabled,
|
|
542
|
-
onChange:
|
|
434
|
+
onChange: pick,
|
|
543
435
|
className: "sr-only"
|
|
544
436
|
}
|
|
545
437
|
)
|
|
@@ -548,62 +440,56 @@ function AvatarUpload({
|
|
|
548
440
|
)
|
|
549
441
|
] });
|
|
550
442
|
}
|
|
551
|
-
var badge = cva(
|
|
552
|
-
["inline-flex items-center gap-step-xs", "rounded-chip px-step-xs py-0.5", "font-sans text-tag", "transition-standard"],
|
|
553
|
-
{
|
|
554
|
-
variants: {
|
|
555
|
-
variant: {
|
|
556
|
-
neutral: "bg-surface-raised text-text-secondary",
|
|
557
|
-
accent: "bg-accent/8 text-text-primary",
|
|
558
|
-
warm: "bg-warm/8 text-text-primary",
|
|
559
|
-
success: "bg-success/8 text-text-primary",
|
|
560
|
-
warning: "bg-warning/8 text-text-primary",
|
|
561
|
-
error: "bg-error/8 text-text-primary"
|
|
562
|
-
}
|
|
563
|
-
},
|
|
564
|
-
defaultVariants: { variant: "neutral" }
|
|
565
|
-
}
|
|
566
|
-
);
|
|
567
443
|
function Badge({ className, variant, ...props }) {
|
|
568
444
|
return /* @__PURE__ */ jsx("span", { className: cn(badge({ variant }), className), ...props });
|
|
569
445
|
}
|
|
570
|
-
var categoria = cva(
|
|
571
|
-
[
|
|
572
|
-
"inline-flex items-center gap-step-xs",
|
|
573
|
-
"rounded-pill px-step-sm py-0.5",
|
|
574
|
-
"font-mono text-chip",
|
|
575
|
-
"border transition-standard"
|
|
576
|
-
],
|
|
577
|
-
{
|
|
578
|
-
variants: {
|
|
579
|
-
active: {
|
|
580
|
-
false: "border-warm/28 bg-transparent text-warm",
|
|
581
|
-
true: "border-warm bg-warm text-warm-on"
|
|
582
|
-
}
|
|
583
|
-
},
|
|
584
|
-
defaultVariants: { active: false }
|
|
585
|
-
}
|
|
586
|
-
);
|
|
587
446
|
function CategoryBadge({ className, active = false, ...props }) {
|
|
588
447
|
return /* @__PURE__ */ jsx(
|
|
589
448
|
"span",
|
|
590
449
|
{
|
|
591
450
|
"data-active": active || void 0,
|
|
592
|
-
className: cn(
|
|
451
|
+
className: cn(category({ active }), className),
|
|
593
452
|
...props
|
|
594
453
|
}
|
|
595
454
|
);
|
|
596
455
|
}
|
|
597
|
-
var metrica = ["inline-flex items-center gap-step-xs", "rounded-pill", "font-mono text-chip text-text-muted"];
|
|
598
456
|
function MetricBadge({ className, boxed = false, ...props }) {
|
|
599
457
|
return /* @__PURE__ */ jsx(
|
|
600
458
|
"span",
|
|
601
459
|
{
|
|
602
|
-
className: cn(
|
|
460
|
+
className: cn(metric, boxed && "border-hairline px-step-sm py-0.5 border", className),
|
|
603
461
|
...props
|
|
604
462
|
}
|
|
605
463
|
);
|
|
606
464
|
}
|
|
465
|
+
function Button({
|
|
466
|
+
className,
|
|
467
|
+
variant,
|
|
468
|
+
size: size2,
|
|
469
|
+
asChild = false,
|
|
470
|
+
loading = false,
|
|
471
|
+
icon,
|
|
472
|
+
children,
|
|
473
|
+
disabled,
|
|
474
|
+
...props
|
|
475
|
+
}) {
|
|
476
|
+
if (asChild) {
|
|
477
|
+
return /* @__PURE__ */ jsx(Slot, { className: cn(button({ variant, size: size2 }), className), ...props, children });
|
|
478
|
+
}
|
|
479
|
+
return /* @__PURE__ */ jsxs(
|
|
480
|
+
"button",
|
|
481
|
+
{
|
|
482
|
+
className: cn(button({ variant, size: size2 }), className),
|
|
483
|
+
disabled: disabled === true || loading,
|
|
484
|
+
"aria-busy": loading || void 0,
|
|
485
|
+
...props,
|
|
486
|
+
children: [
|
|
487
|
+
loading ? /* @__PURE__ */ jsx(Spinner, {}) : icon,
|
|
488
|
+
children
|
|
489
|
+
]
|
|
490
|
+
}
|
|
491
|
+
);
|
|
492
|
+
}
|
|
607
493
|
function Calendar({
|
|
608
494
|
className,
|
|
609
495
|
classNames,
|
|
@@ -611,12 +497,12 @@ function Calendar({
|
|
|
611
497
|
fullWidth = false,
|
|
612
498
|
...props
|
|
613
499
|
}) {
|
|
614
|
-
const
|
|
500
|
+
const day = [
|
|
615
501
|
"relative p-0 text-center",
|
|
616
502
|
fullWidth ? "h-9 flex-1" : "size-9",
|
|
617
503
|
"text-ui font-sans text-text-primary"
|
|
618
504
|
].join(" ");
|
|
619
|
-
const
|
|
505
|
+
const dayButton = [
|
|
620
506
|
fullWidth ? "h-9 w-full" : "size-9",
|
|
621
507
|
"rounded-chip inline-flex items-center justify-center",
|
|
622
508
|
"transition-standard cursor-pointer",
|
|
@@ -624,7 +510,7 @@ function Calendar({
|
|
|
624
510
|
"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
|
|
625
511
|
"disabled:pointer-events-none disabled:opacity-50"
|
|
626
512
|
].join(" ");
|
|
627
|
-
const
|
|
513
|
+
const navigation = [
|
|
628
514
|
"size-8 rounded-chip inline-flex items-center justify-center",
|
|
629
515
|
"text-text-secondary transition-standard cursor-pointer",
|
|
630
516
|
"hover:bg-surface-raised hover:text-text-primary",
|
|
@@ -638,32 +524,32 @@ function Calendar({
|
|
|
638
524
|
showOutsideDays,
|
|
639
525
|
className: cn("font-sans", className),
|
|
640
526
|
classNames: {
|
|
641
|
-
// `relative`
|
|
642
|
-
//
|
|
643
|
-
// viewport—
|
|
527
|
+
// `relative` is mandatory: the navigation is absolutely positioned
|
|
528
|
+
// against the root, and without this it anchors to the first positioned
|
|
529
|
+
// ancestor — or to the viewport — and the arrows end up at the page edges.
|
|
644
530
|
root: cn("relative", fullWidth ? "w-full" : "w-fit"),
|
|
645
531
|
months: cn("gap-step-md flex flex-col sm:flex-row", fullWidth && "w-full"),
|
|
646
532
|
month: cn("gap-step-sm flex flex-col", fullWidth && "min-w-0 flex-1"),
|
|
647
533
|
month_caption: "h-8 flex items-center justify-center",
|
|
648
534
|
caption_label: "text-ui font-sans font-medium text-text-primary capitalize",
|
|
649
535
|
nav: "absolute inset-x-0 top-0 flex items-center justify-between",
|
|
650
|
-
button_previous:
|
|
651
|
-
button_next:
|
|
536
|
+
button_previous: navigation,
|
|
537
|
+
button_next: navigation,
|
|
652
538
|
month_grid: "w-full border-collapse",
|
|
653
539
|
weekdays: cn("flex", fullWidth && "w-full"),
|
|
654
|
-
// `textMuted`
|
|
655
|
-
//
|
|
540
|
+
// `textMuted` does not go over `surfaceRaised` — 4.07:1 — and a calendar
|
|
541
|
+
// inside a Popover lives exactly there.
|
|
656
542
|
weekday: cn(
|
|
657
543
|
"h-9 text-eyebrow font-mono text-text-secondary uppercase flex items-center justify-center",
|
|
658
544
|
fullWidth ? "flex-1" : "w-9"
|
|
659
545
|
),
|
|
660
546
|
week: "flex w-full",
|
|
661
|
-
day
|
|
662
|
-
day_button:
|
|
547
|
+
day,
|
|
548
|
+
day_button: dayButton,
|
|
663
549
|
today: "text-accent font-medium",
|
|
664
|
-
//
|
|
665
|
-
// `textSecondary`
|
|
666
|
-
// `surfaceRaised`.
|
|
550
|
+
// Days from neighbouring months are dimmed, but not below AA:
|
|
551
|
+
// `textSecondary` at 85 % gives 5.09:1 in the worst case, which is over
|
|
552
|
+
// `surfaceRaised`. At 75 % it no longer passes in light mode.
|
|
667
553
|
outside: "text-text-secondary opacity-85",
|
|
668
554
|
disabled: "opacity-50",
|
|
669
555
|
hidden: "invisible",
|
|
@@ -681,10 +567,8 @@ function Calendar({
|
|
|
681
567
|
}
|
|
682
568
|
);
|
|
683
569
|
}
|
|
684
|
-
var SUPERFICIE_TARJETA = "rounded-card border-hairline bg-surface border";
|
|
685
|
-
var HOVER_TARJETA = "transition-standard hover:border-hairline-hover";
|
|
686
570
|
function Card({ className, ...props }) {
|
|
687
|
-
return /* @__PURE__ */ jsx("div", { className: cn(
|
|
571
|
+
return /* @__PURE__ */ jsx("div", { className: cn(CARD_SURFACE, className), ...props });
|
|
688
572
|
}
|
|
689
573
|
function CardHeader({ className, ...props }) {
|
|
690
574
|
return /* @__PURE__ */ jsx("div", { className: cn("gap-step-xs p-step-lg flex flex-col", className), ...props });
|
|
@@ -761,7 +645,7 @@ function DateField({
|
|
|
761
645
|
"focus-visible:border-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
|
|
762
646
|
"disabled:pointer-events-none disabled:opacity-50",
|
|
763
647
|
"data-[invalid]:border-error data-[invalid]:focus-visible:outline-error",
|
|
764
|
-
//
|
|
648
|
+
// The native indicator inherits the active theme's scheme.
|
|
765
649
|
"scheme-light dark:scheme-dark [&::-webkit-calendar-picker-indicator]:cursor-pointer",
|
|
766
650
|
className
|
|
767
651
|
),
|
|
@@ -1013,7 +897,7 @@ function PaginationPrevious({ className, ...props }) {
|
|
|
1013
897
|
] });
|
|
1014
898
|
}
|
|
1015
899
|
function PaginationNext({ className, ...props }) {
|
|
1016
|
-
return /* @__PURE__ */ jsxs(PaginationLink, { "aria-label": "P\xE1gina
|
|
900
|
+
return /* @__PURE__ */ jsxs(PaginationLink, { "aria-label": "P\xE1gina next", className: cn("gap-step-xs", className), ...props, children: [
|
|
1017
901
|
"Siguiente",
|
|
1018
902
|
/* @__PURE__ */ jsx(ChevronRight, {})
|
|
1019
903
|
] });
|
|
@@ -1224,23 +1108,23 @@ var panel2 = cva(
|
|
|
1224
1108
|
side: {
|
|
1225
1109
|
right: [
|
|
1226
1110
|
"inset-y-0 right-0 h-full w-3/4 max-w-content border-l",
|
|
1227
|
-
"motion-safe:data-[state=open]:
|
|
1228
|
-
"motion-safe:data-[state=closed]:
|
|
1111
|
+
"motion-safe:data-[state=open]:slide-in-right",
|
|
1112
|
+
"motion-safe:data-[state=closed]:slide-out-right"
|
|
1229
1113
|
],
|
|
1230
1114
|
left: [
|
|
1231
1115
|
"inset-y-0 left-0 h-full w-3/4 max-w-content border-r",
|
|
1232
|
-
"motion-safe:data-[state=open]:
|
|
1233
|
-
"motion-safe:data-[state=closed]:
|
|
1116
|
+
"motion-safe:data-[state=open]:slide-in-left",
|
|
1117
|
+
"motion-safe:data-[state=closed]:slide-out-left"
|
|
1234
1118
|
],
|
|
1235
1119
|
top: [
|
|
1236
1120
|
"inset-x-0 top-0 border-b",
|
|
1237
|
-
"motion-safe:data-[state=open]:
|
|
1238
|
-
"motion-safe:data-[state=closed]:
|
|
1121
|
+
"motion-safe:data-[state=open]:slide-in-top",
|
|
1122
|
+
"motion-safe:data-[state=closed]:slide-out-top"
|
|
1239
1123
|
],
|
|
1240
1124
|
bottom: [
|
|
1241
1125
|
"inset-x-0 bottom-0 border-t",
|
|
1242
|
-
"motion-safe:data-[state=open]:
|
|
1243
|
-
"motion-safe:data-[state=closed]:
|
|
1126
|
+
"motion-safe:data-[state=open]:slide-in-bottom",
|
|
1127
|
+
"motion-safe:data-[state=closed]:slide-out-bottom"
|
|
1244
1128
|
]
|
|
1245
1129
|
}
|
|
1246
1130
|
},
|
|
@@ -1552,62 +1436,62 @@ function ToastDescription({
|
|
|
1552
1436
|
}) {
|
|
1553
1437
|
return /* @__PURE__ */ jsx(ToastPrimitive.Description, { className: cn("max-w-measure", className), ...props });
|
|
1554
1438
|
}
|
|
1555
|
-
var
|
|
1556
|
-
var
|
|
1557
|
-
var
|
|
1558
|
-
function
|
|
1559
|
-
|
|
1560
|
-
for (const
|
|
1439
|
+
var warnings = [];
|
|
1440
|
+
var subscribers = /* @__PURE__ */ new Set();
|
|
1441
|
+
var counter = 0;
|
|
1442
|
+
function emit(next) {
|
|
1443
|
+
warnings = next;
|
|
1444
|
+
for (const warn of subscribers) warn();
|
|
1561
1445
|
}
|
|
1562
|
-
var
|
|
1563
|
-
|
|
1446
|
+
var subscribe = (warn) => {
|
|
1447
|
+
subscribers.add(warn);
|
|
1564
1448
|
return () => {
|
|
1565
|
-
|
|
1449
|
+
subscribers.delete(warn);
|
|
1566
1450
|
};
|
|
1567
1451
|
};
|
|
1568
|
-
var
|
|
1569
|
-
var
|
|
1570
|
-
var
|
|
1571
|
-
function
|
|
1572
|
-
|
|
1573
|
-
const id = `arrecife-toast-${
|
|
1574
|
-
const { description, ...
|
|
1575
|
-
|
|
1576
|
-
...
|
|
1577
|
-
{
|
|
1578
|
-
...
|
|
1579
|
-
//
|
|
1580
|
-
//
|
|
1581
|
-
// `toast('No se pudo guardar', { title: 'Error' })`
|
|
1582
|
-
...
|
|
1452
|
+
var read = () => warnings;
|
|
1453
|
+
var EMPTY = [];
|
|
1454
|
+
var onServer = () => EMPTY;
|
|
1455
|
+
function create(message, options = {}) {
|
|
1456
|
+
counter += 1;
|
|
1457
|
+
const id = `arrecife-toast-${counter}`;
|
|
1458
|
+
const { description, ...rest } = options;
|
|
1459
|
+
emit([
|
|
1460
|
+
...warnings,
|
|
1461
|
+
{
|
|
1462
|
+
...rest,
|
|
1463
|
+
// The first argument is the main line. If a `title` also arrives, the
|
|
1464
|
+
// message becomes the description: that way `toast('Guardado')` and
|
|
1465
|
+
// `toast('No se pudo guardar', { title: 'Error' })` both read well.
|
|
1466
|
+
...options.title ? { description: description ?? message } : { title: message, ...description === void 0 ? {} : { description } },
|
|
1583
1467
|
id,
|
|
1584
|
-
|
|
1468
|
+
open: true
|
|
1585
1469
|
}
|
|
1586
1470
|
]);
|
|
1587
1471
|
return id;
|
|
1588
1472
|
}
|
|
1589
|
-
function
|
|
1590
|
-
|
|
1473
|
+
function discard(id) {
|
|
1474
|
+
emit(warnings.map((a) => id === void 0 || a.id === id ? { ...a, open: false } : a));
|
|
1591
1475
|
}
|
|
1592
|
-
function
|
|
1593
|
-
|
|
1476
|
+
function remove(id) {
|
|
1477
|
+
emit(warnings.filter((a) => a.id !== id));
|
|
1594
1478
|
}
|
|
1595
|
-
var toast2 = Object.assign(
|
|
1596
|
-
success: (
|
|
1597
|
-
error: (
|
|
1598
|
-
dismiss:
|
|
1479
|
+
var toast2 = Object.assign(create, {
|
|
1480
|
+
success: (message, options = {}) => create(message, { ...options, variant: "success" }),
|
|
1481
|
+
error: (message, options = {}) => create(message, { ...options, variant: "error" }),
|
|
1482
|
+
dismiss: discard
|
|
1599
1483
|
});
|
|
1600
1484
|
function Toaster({ duration = 5e3, label = "Avisos" }) {
|
|
1601
|
-
const
|
|
1485
|
+
const list = useSyncExternalStore(subscribe, read, onServer);
|
|
1602
1486
|
return /* @__PURE__ */ jsxs(ToastProvider, { duration, label, children: [
|
|
1603
|
-
|
|
1487
|
+
list.map(({ id, title, description, variant, duration: own, action, open }) => /* @__PURE__ */ jsxs(
|
|
1604
1488
|
Toast,
|
|
1605
1489
|
{
|
|
1606
|
-
open
|
|
1490
|
+
open,
|
|
1607
1491
|
variant: variant ?? "neutral",
|
|
1608
|
-
...
|
|
1609
|
-
onOpenChange: (
|
|
1610
|
-
if (!
|
|
1492
|
+
...own === void 0 ? {} : { duration: own },
|
|
1493
|
+
onOpenChange: (stillOpen) => {
|
|
1494
|
+
if (!stillOpen) remove(id);
|
|
1611
1495
|
},
|
|
1612
1496
|
children: [
|
|
1613
1497
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
@@ -1644,15 +1528,9 @@ function TooltipContent({
|
|
|
1644
1528
|
}
|
|
1645
1529
|
) });
|
|
1646
1530
|
}
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
HOVER_TARJETA,
|
|
1651
|
-
"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
|
|
1652
|
-
];
|
|
1653
|
-
function Tarjeta({ asChild = false, className, children, ...props }) {
|
|
1654
|
-
const Raiz = asChild ? Slot : "a";
|
|
1655
|
-
return /* @__PURE__ */ jsx(Raiz, { className: cn(TARJETA, className), ...props, children });
|
|
1531
|
+
function CardShell({ asChild = false, className, children, ...props }) {
|
|
1532
|
+
const Root17 = asChild ? Slot : "a";
|
|
1533
|
+
return /* @__PURE__ */ jsx(Root17, { className: cn(CARD, className), ...props, children });
|
|
1656
1534
|
}
|
|
1657
1535
|
function ArticleCard({
|
|
1658
1536
|
title,
|
|
@@ -1662,17 +1540,18 @@ function ArticleCard({
|
|
|
1662
1540
|
readingMinutes,
|
|
1663
1541
|
tags,
|
|
1664
1542
|
headingLevel = 3,
|
|
1543
|
+
tagAsChild,
|
|
1665
1544
|
className,
|
|
1666
1545
|
...props
|
|
1667
1546
|
}) {
|
|
1668
1547
|
const meta = [
|
|
1669
|
-
date ? /* @__PURE__ */ jsx("time", { dateTime, children: date }, "
|
|
1548
|
+
date ? /* @__PURE__ */ jsx("time", { dateTime, children: date }, "date") : null,
|
|
1670
1549
|
readingMinutes ? /* @__PURE__ */ jsxs("span", { children: [
|
|
1671
1550
|
readingMinutes,
|
|
1672
1551
|
" min de lectura"
|
|
1673
1552
|
] }, "lectura") : null
|
|
1674
1553
|
].filter(Boolean);
|
|
1675
|
-
return /* @__PURE__ */ jsx(
|
|
1554
|
+
return /* @__PURE__ */ jsx(CardShell, { className: cn("p-step-lg", className), ...props, children: /* @__PURE__ */ jsxs("article", { className: "gap-step-sm flex h-full flex-col", children: [
|
|
1676
1555
|
meta.length > 0 ? /* @__PURE__ */ jsx(Text, { variant: "meta", tone: "muted", as: "p", className: "gap-step-xs flex items-center", children: meta.map((m, i) => /* @__PURE__ */ jsxs("span", { className: "gap-step-xs flex items-center", children: [
|
|
1677
1556
|
i > 0 ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }) : null,
|
|
1678
1557
|
m
|
|
@@ -1687,18 +1566,20 @@ function ArticleCard({
|
|
|
1687
1566
|
}
|
|
1688
1567
|
),
|
|
1689
1568
|
excerpt ? /* @__PURE__ */ jsx(Text, { variant: "ui", tone: "secondary", className: "line-clamp-2", children: excerpt }) : null,
|
|
1690
|
-
tags && tags.length > 0 ? /* @__PURE__ */ jsx("div", { className: "gap-step-xs mt-auto flex flex-wrap pt-step-sm", children: tags.map(
|
|
1569
|
+
tags && tags.length > 0 ? /* @__PURE__ */ jsx("div", { className: "gap-step-xs mt-auto flex flex-wrap pt-step-sm", children: tags.map(
|
|
1570
|
+
(t) => tagAsChild ? /* @__PURE__ */ jsx(Slot, { className: category({ active: false }), children: tagAsChild({ tag: t, children: t }) }, t) : /* @__PURE__ */ jsx(CategoryBadge, { children: t }, t)
|
|
1571
|
+
) }) : null
|
|
1691
1572
|
] }) });
|
|
1692
1573
|
}
|
|
1693
1574
|
var AVATAR = "size-[52px]";
|
|
1694
|
-
function
|
|
1695
|
-
return
|
|
1575
|
+
function initials(name) {
|
|
1576
|
+
return name.split(/\s+/).slice(0, 2).map((p) => p[0] ?? "").join("").toUpperCase();
|
|
1696
1577
|
}
|
|
1697
1578
|
function AuthorCard({ name, role, src, bio, action, className, ...props }) {
|
|
1698
|
-
return /* @__PURE__ */ jsxs("div", { className: cn(
|
|
1579
|
+
return /* @__PURE__ */ jsxs("div", { className: cn(CARD_SURFACE, "p-step-lg gap-step-md flex items-start", className), ...props, children: [
|
|
1699
1580
|
/* @__PURE__ */ jsxs(Avatar, { className: cn(AVATAR, "shrink-0"), children: [
|
|
1700
1581
|
src ? /* @__PURE__ */ jsx(AvatarImage, { src, alt: "" }) : null,
|
|
1701
|
-
/* @__PURE__ */ jsx(AvatarFallback, { children:
|
|
1582
|
+
/* @__PURE__ */ jsx(AvatarFallback, { children: initials(name) })
|
|
1702
1583
|
] }),
|
|
1703
1584
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-xs flex min-w-0 flex-1 flex-col", children: [
|
|
1704
1585
|
/* @__PURE__ */ jsx(Text, { variant: "ui", as: "p", className: "font-medium", children: name }),
|
|
@@ -1716,45 +1597,45 @@ function formatTime(seconds) {
|
|
|
1716
1597
|
}
|
|
1717
1598
|
var WAVEFORM_HEIGHTS = [35, 65, 100, 65, 35];
|
|
1718
1599
|
var RATES = [1, 1.25, 1.5, 1.75, 2];
|
|
1719
|
-
function
|
|
1720
|
-
return /* @__PURE__ */ jsx("div", { className: cn("flex items-end gap-[2px]",
|
|
1600
|
+
function Wave({ strokeWidth, height, playing }) {
|
|
1601
|
+
return /* @__PURE__ */ jsx("div", { className: cn("flex items-end gap-[2px]", height), "aria-hidden": "true", children: WAVEFORM_HEIGHTS.map((h, i) => /* @__PURE__ */ jsx(
|
|
1721
1602
|
"span",
|
|
1722
1603
|
{
|
|
1723
|
-
className: cn("rounded-pill bg-accent transition-standard",
|
|
1724
|
-
style: { height: `${h}%`, opacity:
|
|
1604
|
+
className: cn("rounded-pill bg-accent transition-standard", strokeWidth),
|
|
1605
|
+
style: { height: `${h}%`, opacity: playing ? 1 : 0.3 + h / 100 * 0.4 }
|
|
1725
1606
|
},
|
|
1726
1607
|
i
|
|
1727
1608
|
)) });
|
|
1728
1609
|
}
|
|
1729
|
-
function
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1610
|
+
function ProgressBar({
|
|
1611
|
+
height,
|
|
1612
|
+
knob,
|
|
1613
|
+
progress,
|
|
1733
1614
|
redondeada = true,
|
|
1734
1615
|
tabIndex = 0,
|
|
1735
|
-
...
|
|
1616
|
+
...pointer
|
|
1736
1617
|
}) {
|
|
1737
1618
|
return /* @__PURE__ */ jsxs(
|
|
1738
1619
|
"div",
|
|
1739
1620
|
{
|
|
1740
1621
|
className: cn(
|
|
1741
1622
|
"group bg-surface-raised relative cursor-pointer",
|
|
1742
|
-
|
|
1623
|
+
height,
|
|
1743
1624
|
redondeada && "rounded-pill"
|
|
1744
1625
|
),
|
|
1745
1626
|
role: "slider",
|
|
1746
1627
|
"aria-label": "Progreso del audio",
|
|
1747
1628
|
"aria-valuemin": 0,
|
|
1748
1629
|
"aria-valuemax": 100,
|
|
1749
|
-
"aria-valuenow": Math.round(
|
|
1630
|
+
"aria-valuenow": Math.round(progress),
|
|
1750
1631
|
tabIndex,
|
|
1751
|
-
...
|
|
1632
|
+
...pointer,
|
|
1752
1633
|
children: [
|
|
1753
1634
|
/* @__PURE__ */ jsx(
|
|
1754
1635
|
"div",
|
|
1755
1636
|
{
|
|
1756
1637
|
className: cn("bg-accent absolute h-full", redondeada && "rounded-pill"),
|
|
1757
|
-
style: { width: `${
|
|
1638
|
+
style: { width: `${progress}%` }
|
|
1758
1639
|
}
|
|
1759
1640
|
),
|
|
1760
1641
|
/* @__PURE__ */ jsx(
|
|
@@ -1762,9 +1643,9 @@ function BarraProgreso({
|
|
|
1762
1643
|
{
|
|
1763
1644
|
className: "rounded-pill bg-text-primary absolute top-1/2 -translate-y-1/2 opacity-0 transition-opacity group-hover:opacity-100",
|
|
1764
1645
|
style: {
|
|
1765
|
-
width:
|
|
1766
|
-
height:
|
|
1767
|
-
left: `calc(${
|
|
1646
|
+
width: knob,
|
|
1647
|
+
height: knob,
|
|
1648
|
+
left: `calc(${progress}% - ${knob / 2}px)`
|
|
1768
1649
|
}
|
|
1769
1650
|
}
|
|
1770
1651
|
)
|
|
@@ -1773,10 +1654,10 @@ function BarraProgreso({
|
|
|
1773
1654
|
);
|
|
1774
1655
|
}
|
|
1775
1656
|
var CONTROL = "rounded-chip transition-standard cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent";
|
|
1776
|
-
function
|
|
1657
|
+
function SkipButton({
|
|
1777
1658
|
segundos,
|
|
1778
1659
|
className,
|
|
1779
|
-
|
|
1660
|
+
size: size2,
|
|
1780
1661
|
onSaltar
|
|
1781
1662
|
}) {
|
|
1782
1663
|
return /* @__PURE__ */ jsx(
|
|
@@ -1786,52 +1667,52 @@ function BotonSalto({
|
|
|
1786
1667
|
onClick: () => onSaltar(segundos),
|
|
1787
1668
|
className: cn("text-text-muted hover:text-text-primary", CONTROL, className),
|
|
1788
1669
|
"aria-label": segundos < 0 ? "Retroceder 15 segundos" : "Adelantar 15 segundos",
|
|
1789
|
-
children: segundos < 0 ? /* @__PURE__ */ jsx(GoBackSeconds, { className:
|
|
1670
|
+
children: segundos < 0 ? /* @__PURE__ */ jsx(GoBackSeconds, { className: size2 }) : /* @__PURE__ */ jsx(AdvanceSeconds, { className: size2 })
|
|
1790
1671
|
}
|
|
1791
1672
|
);
|
|
1792
1673
|
}
|
|
1793
|
-
function
|
|
1674
|
+
function SpeedButton({
|
|
1794
1675
|
className,
|
|
1795
|
-
|
|
1796
|
-
|
|
1676
|
+
speed,
|
|
1677
|
+
onChange
|
|
1797
1678
|
}) {
|
|
1798
1679
|
return /* @__PURE__ */ jsxs(
|
|
1799
1680
|
"button",
|
|
1800
1681
|
{
|
|
1801
1682
|
type: "button",
|
|
1802
|
-
onClick:
|
|
1683
|
+
onClick: onChange,
|
|
1803
1684
|
className: cn(
|
|
1804
|
-
// `textMuted`
|
|
1805
|
-
//
|
|
1685
|
+
// `textMuted` over `surfaceRaised` gives 4.07:1 in dark and fails AA.
|
|
1686
|
+
// The portfolio original carries that same failure.
|
|
1806
1687
|
"text-text-secondary hover:text-text-primary bg-surface-raised",
|
|
1807
1688
|
CONTROL,
|
|
1808
1689
|
className
|
|
1809
1690
|
),
|
|
1810
1691
|
"aria-label": "Cambiar velocidad de reproducci\xF3n",
|
|
1811
1692
|
children: [
|
|
1812
|
-
|
|
1693
|
+
speed,
|
|
1813
1694
|
"x"
|
|
1814
1695
|
]
|
|
1815
1696
|
}
|
|
1816
1697
|
);
|
|
1817
1698
|
}
|
|
1818
|
-
function
|
|
1819
|
-
|
|
1820
|
-
|
|
1699
|
+
function Volume({
|
|
1700
|
+
size: size2,
|
|
1701
|
+
width,
|
|
1821
1702
|
silenciado,
|
|
1822
1703
|
volumen,
|
|
1823
|
-
|
|
1824
|
-
|
|
1704
|
+
onMute,
|
|
1705
|
+
onVolumeChange
|
|
1825
1706
|
}) {
|
|
1826
1707
|
return /* @__PURE__ */ jsxs("div", { className: "gap-step-xs hidden items-center sm:flex", children: [
|
|
1827
1708
|
/* @__PURE__ */ jsx(
|
|
1828
1709
|
"button",
|
|
1829
1710
|
{
|
|
1830
1711
|
type: "button",
|
|
1831
|
-
onClick:
|
|
1712
|
+
onClick: onMute,
|
|
1832
1713
|
className: cn("text-text-muted hover:text-text-primary p-1", CONTROL),
|
|
1833
1714
|
"aria-label": silenciado ? "Activar sonido" : "Silenciar",
|
|
1834
|
-
children: silenciado || volumen === 0 ? /* @__PURE__ */ jsx(VolumeMuted, { className:
|
|
1715
|
+
children: silenciado || volumen === 0 ? /* @__PURE__ */ jsx(VolumeMuted, { className: size2 }) : /* @__PURE__ */ jsx(VolumeOn, { className: size2 })
|
|
1835
1716
|
}
|
|
1836
1717
|
),
|
|
1837
1718
|
/* @__PURE__ */ jsx(
|
|
@@ -1842,46 +1723,46 @@ function Volumen({
|
|
|
1842
1723
|
max: "1",
|
|
1843
1724
|
step: "0.1",
|
|
1844
1725
|
value: silenciado ? 0 : volumen,
|
|
1845
|
-
onChange:
|
|
1726
|
+
onChange: onVolumeChange,
|
|
1846
1727
|
className: cn(
|
|
1847
1728
|
"bg-surface-raised rounded-pill h-1 cursor-pointer appearance-none",
|
|
1848
1729
|
"[accent-color:var(--color-accent)]",
|
|
1849
|
-
|
|
1730
|
+
width
|
|
1850
1731
|
),
|
|
1851
|
-
"aria-label": "
|
|
1732
|
+
"aria-label": "Volume"
|
|
1852
1733
|
}
|
|
1853
1734
|
)
|
|
1854
1735
|
] });
|
|
1855
1736
|
}
|
|
1856
|
-
function
|
|
1737
|
+
function PlayIcon({ className, cargando, error, playing }) {
|
|
1857
1738
|
if (cargando) return /* @__PURE__ */ jsx(Spinner, { className: cn("motion-safe:animate-spin", className) });
|
|
1858
1739
|
if (error) return /* @__PURE__ */ jsx(Retry, { className });
|
|
1859
|
-
if (
|
|
1740
|
+
if (playing) return /* @__PURE__ */ jsx(Pause, { className });
|
|
1860
1741
|
return /* @__PURE__ */ jsx(Play, { className });
|
|
1861
1742
|
}
|
|
1862
|
-
function
|
|
1743
|
+
function PlayButton({
|
|
1863
1744
|
className,
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
...
|
|
1745
|
+
size: size2,
|
|
1746
|
+
label,
|
|
1747
|
+
text: text2,
|
|
1748
|
+
onToggle,
|
|
1749
|
+
...state
|
|
1869
1750
|
}) {
|
|
1870
1751
|
return /* @__PURE__ */ jsxs(
|
|
1871
1752
|
"button",
|
|
1872
1753
|
{
|
|
1873
1754
|
type: "button",
|
|
1874
|
-
onClick:
|
|
1755
|
+
onClick: onToggle,
|
|
1875
1756
|
className: cn(
|
|
1876
1757
|
"text-accent-on transition-standard cursor-pointer",
|
|
1877
1758
|
"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
|
|
1878
|
-
|
|
1759
|
+
state.error ? "bg-error hover:bg-error/80" : "bg-accent hover:bg-accent-hover",
|
|
1879
1760
|
className
|
|
1880
1761
|
),
|
|
1881
|
-
"aria-label":
|
|
1762
|
+
"aria-label": label,
|
|
1882
1763
|
children: [
|
|
1883
|
-
/* @__PURE__ */ jsx(
|
|
1884
|
-
|
|
1764
|
+
/* @__PURE__ */ jsx(PlayIcon, { className: size2, ...state }),
|
|
1765
|
+
text2 ? /* @__PURE__ */ jsx("span", { children: text2 }) : null
|
|
1885
1766
|
]
|
|
1886
1767
|
}
|
|
1887
1768
|
);
|
|
@@ -1900,7 +1781,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
|
|
|
1900
1781
|
const [isMuted, setIsMuted] = useState(false);
|
|
1901
1782
|
const [playbackRate, setPlaybackRate] = useState(1);
|
|
1902
1783
|
const [isStaticVisible, setIsStaticVisible] = useState(true);
|
|
1903
|
-
const
|
|
1784
|
+
const floating = mode === "banner" || mode === "compact";
|
|
1904
1785
|
useEffect(() => {
|
|
1905
1786
|
const audio = audioRef.current;
|
|
1906
1787
|
if (!audio) return;
|
|
@@ -1943,7 +1824,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
|
|
|
1943
1824
|
};
|
|
1944
1825
|
}, []);
|
|
1945
1826
|
useEffect(() => {
|
|
1946
|
-
if (!
|
|
1827
|
+
if (!floating || !staticRef.current) return;
|
|
1947
1828
|
const observer = new IntersectionObserver(
|
|
1948
1829
|
(entries) => {
|
|
1949
1830
|
const entry = entries[0];
|
|
@@ -1953,7 +1834,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
|
|
|
1953
1834
|
);
|
|
1954
1835
|
observer.observe(staticRef.current);
|
|
1955
1836
|
return () => observer.disconnect();
|
|
1956
|
-
}, [
|
|
1837
|
+
}, [floating]);
|
|
1957
1838
|
const togglePlay = useCallback(async () => {
|
|
1958
1839
|
const audio = audioRef.current;
|
|
1959
1840
|
if (!audio) return;
|
|
@@ -2042,37 +1923,37 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
|
|
|
2042
1923
|
[duration]
|
|
2043
1924
|
);
|
|
2044
1925
|
const progress = duration > 0 ? currentTime / duration * 100 : 0;
|
|
2045
|
-
const
|
|
2046
|
-
const
|
|
2047
|
-
const
|
|
1926
|
+
const playLabel = hasError ? "Reintentar" : isPlaying ? "Pausar" : "Reproducir";
|
|
1927
|
+
const playState = { cargando: isLoading, error: hasError, playing: isPlaying };
|
|
1928
|
+
const pointer = {
|
|
2048
1929
|
onPointerDown: handlePointerDown,
|
|
2049
1930
|
onPointerMove: handlePointerMove,
|
|
2050
1931
|
onPointerUp: handlePointerUp
|
|
2051
1932
|
};
|
|
2052
|
-
const
|
|
1933
|
+
const floatingJsx = /* @__PURE__ */ jsxs(
|
|
2053
1934
|
"div",
|
|
2054
1935
|
{
|
|
2055
1936
|
"aria-hidden": isStaticVisible,
|
|
2056
1937
|
className: cn(
|
|
2057
1938
|
"fixed inset-x-0 bottom-0 z-40 xl:hidden",
|
|
2058
|
-
//
|
|
1939
|
+
// It appears and disappears: the system does not animate displacement.
|
|
2059
1940
|
isStaticVisible && "hidden"
|
|
2060
1941
|
),
|
|
2061
1942
|
children: [
|
|
2062
1943
|
/* @__PURE__ */ jsx(
|
|
2063
|
-
|
|
1944
|
+
ProgressBar,
|
|
2064
1945
|
{
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
1946
|
+
height: "h-1",
|
|
1947
|
+
knob: 10,
|
|
1948
|
+
progress,
|
|
2068
1949
|
redondeada: false,
|
|
2069
1950
|
tabIndex: -1,
|
|
2070
|
-
...
|
|
1951
|
+
...pointer
|
|
2071
1952
|
}
|
|
2072
1953
|
),
|
|
2073
1954
|
/* @__PURE__ */ jsx("div", { className: "bg-surface/95 border-accent/25 border-t backdrop-blur-md", children: /* @__PURE__ */ jsxs("div", { className: "gap-step-sm px-step-md flex items-center py-5", children: [
|
|
2074
1955
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-xs flex shrink-0 items-center", children: [
|
|
2075
|
-
/* @__PURE__ */ jsx(
|
|
1956
|
+
/* @__PURE__ */ jsx(Wave, { strokeWidth: "w-[2px]", height: "h-4", playing: isPlaying }),
|
|
2076
1957
|
/* @__PURE__ */ jsx("span", { className: "text-eyebrow font-mono text-accent hidden uppercase sm:block", children: "Narraci\xF3n" })
|
|
2077
1958
|
] }),
|
|
2078
1959
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
|
|
@@ -2084,24 +1965,24 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
|
|
|
2084
1965
|
] })
|
|
2085
1966
|
] }),
|
|
2086
1967
|
/* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-1", children: [
|
|
2087
|
-
/* @__PURE__ */ jsx(
|
|
1968
|
+
/* @__PURE__ */ jsx(SkipButton, { segundos: -15, className: "p-1.5", size: "w-5 h-5", onSaltar: skip }),
|
|
2088
1969
|
/* @__PURE__ */ jsx(
|
|
2089
|
-
|
|
1970
|
+
PlayButton,
|
|
2090
1971
|
{
|
|
2091
1972
|
className: "rounded-pill px-step-sm gap-step-xs flex items-center py-1.5",
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
...
|
|
1973
|
+
size: "w-4 h-4",
|
|
1974
|
+
label: playLabel,
|
|
1975
|
+
onToggle: togglePlay,
|
|
1976
|
+
...playState
|
|
2096
1977
|
}
|
|
2097
1978
|
),
|
|
2098
|
-
/* @__PURE__ */ jsx(
|
|
1979
|
+
/* @__PURE__ */ jsx(SkipButton, { segundos: 15, className: "p-1.5", size: "w-5 h-5", onSaltar: skip }),
|
|
2099
1980
|
/* @__PURE__ */ jsx(
|
|
2100
|
-
|
|
1981
|
+
SpeedButton,
|
|
2101
1982
|
{
|
|
2102
1983
|
className: "text-label ml-0.5 px-1.5 py-0.5",
|
|
2103
|
-
|
|
2104
|
-
|
|
1984
|
+
speed: playbackRate,
|
|
1985
|
+
onChange: handlePlaybackRateChange
|
|
2105
1986
|
}
|
|
2106
1987
|
)
|
|
2107
1988
|
] })
|
|
@@ -2114,7 +1995,7 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
|
|
|
2114
1995
|
/* @__PURE__ */ jsx("audio", { ref: audioRef, src, preload: "metadata" }),
|
|
2115
1996
|
/* @__PURE__ */ jsxs("div", { ref: staticRef, children: [
|
|
2116
1997
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-sm mb-step-md flex items-center", children: [
|
|
2117
|
-
/* @__PURE__ */ jsx(
|
|
1998
|
+
/* @__PURE__ */ jsx(Wave, { strokeWidth: "w-[3px]", height: "h-5", playing: isPlaying }),
|
|
2118
1999
|
/* @__PURE__ */ jsx("span", { className: "text-eyebrow font-mono text-accent uppercase", children: "Narraci\xF3n de audio" }),
|
|
2119
2000
|
/* @__PURE__ */ jsxs("span", { className: "text-chip font-mono text-text-muted ml-auto tabular-nums", children: [
|
|
2120
2001
|
formatTime(currentTime),
|
|
@@ -2122,125 +2003,125 @@ function AudioPlayer({ src, title, mode = "full", onFirstPlay }) {
|
|
|
2122
2003
|
formatTime(duration)
|
|
2123
2004
|
] })
|
|
2124
2005
|
] }),
|
|
2125
|
-
/* @__PURE__ */ jsx("div", { className: "mb-step-md", children: /* @__PURE__ */ jsx(
|
|
2006
|
+
/* @__PURE__ */ jsx("div", { className: "mb-step-md", children: /* @__PURE__ */ jsx(ProgressBar, { height: "h-1.5", knob: 14, progress, ...pointer }) }),
|
|
2126
2007
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex items-center", children: [
|
|
2127
|
-
/* @__PURE__ */ jsx(
|
|
2008
|
+
/* @__PURE__ */ jsx(SkipButton, { segundos: -15, className: "p-2", size: "w-6 h-6", onSaltar: skip }),
|
|
2128
2009
|
/* @__PURE__ */ jsx(
|
|
2129
|
-
|
|
2010
|
+
PlayButton,
|
|
2130
2011
|
{
|
|
2131
2012
|
className: "rounded-pill px-step-lg gap-step-xs text-ui flex items-center py-2 font-medium",
|
|
2132
|
-
|
|
2133
|
-
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
...
|
|
2013
|
+
size: "w-4 h-4",
|
|
2014
|
+
label: playLabel,
|
|
2015
|
+
text: playLabel,
|
|
2016
|
+
onToggle: togglePlay,
|
|
2017
|
+
...playState
|
|
2137
2018
|
}
|
|
2138
2019
|
),
|
|
2139
|
-
/* @__PURE__ */ jsx(
|
|
2020
|
+
/* @__PURE__ */ jsx(SkipButton, { segundos: 15, className: "p-2", size: "w-6 h-6", onSaltar: skip }),
|
|
2140
2021
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-sm ml-auto flex items-center", children: [
|
|
2141
2022
|
/* @__PURE__ */ jsx(
|
|
2142
|
-
|
|
2023
|
+
SpeedButton,
|
|
2143
2024
|
{
|
|
2144
2025
|
className: "text-label px-2 py-1",
|
|
2145
|
-
|
|
2146
|
-
|
|
2026
|
+
speed: playbackRate,
|
|
2027
|
+
onChange: handlePlaybackRateChange
|
|
2147
2028
|
}
|
|
2148
2029
|
),
|
|
2149
2030
|
/* @__PURE__ */ jsx(
|
|
2150
|
-
|
|
2031
|
+
Volume,
|
|
2151
2032
|
{
|
|
2152
|
-
|
|
2153
|
-
|
|
2033
|
+
size: "w-4 h-4",
|
|
2034
|
+
width: "w-16",
|
|
2154
2035
|
silenciado: isMuted,
|
|
2155
2036
|
volumen: volume,
|
|
2156
|
-
|
|
2157
|
-
|
|
2037
|
+
onMute: toggleMute,
|
|
2038
|
+
onVolumeChange: handleVolumeChange
|
|
2158
2039
|
}
|
|
2159
2040
|
)
|
|
2160
2041
|
] })
|
|
2161
2042
|
] })
|
|
2162
2043
|
] }),
|
|
2163
|
-
|
|
2044
|
+
floatingJsx
|
|
2164
2045
|
] });
|
|
2165
2046
|
}
|
|
2166
2047
|
if (mode === "compact") {
|
|
2167
2048
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
2168
2049
|
/* @__PURE__ */ jsx("audio", { ref: audioRef, src, preload: "metadata" }),
|
|
2169
2050
|
/* @__PURE__ */ jsxs("div", { ref: staticRef, className: "w-full", children: [
|
|
2170
|
-
/* @__PURE__ */ jsx("div", { className: "mb-step-xs", children: /* @__PURE__ */ jsx(
|
|
2051
|
+
/* @__PURE__ */ jsx("div", { className: "mb-step-xs", children: /* @__PURE__ */ jsx(ProgressBar, { height: "h-1.5", knob: 12, progress, ...pointer }) }),
|
|
2171
2052
|
/* @__PURE__ */ jsxs("div", { className: "text-chip font-mono text-text-muted mb-step-sm flex justify-between", children: [
|
|
2172
2053
|
/* @__PURE__ */ jsx("span", { children: formatTime(currentTime) }),
|
|
2173
2054
|
/* @__PURE__ */ jsx("span", { children: formatTime(duration) })
|
|
2174
2055
|
] }),
|
|
2175
2056
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
2176
2057
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
2177
|
-
/* @__PURE__ */ jsx(
|
|
2058
|
+
/* @__PURE__ */ jsx(SkipButton, { segundos: -15, className: "p-1.5", size: "w-5 h-5", onSaltar: skip }),
|
|
2178
2059
|
/* @__PURE__ */ jsx(
|
|
2179
|
-
|
|
2060
|
+
PlayButton,
|
|
2180
2061
|
{
|
|
2181
2062
|
className: "rounded-pill flex size-[34px] items-center justify-center",
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
...
|
|
2063
|
+
size: "w-4 h-4",
|
|
2064
|
+
label: playLabel,
|
|
2065
|
+
onToggle: togglePlay,
|
|
2066
|
+
...playState
|
|
2186
2067
|
}
|
|
2187
2068
|
),
|
|
2188
|
-
/* @__PURE__ */ jsx(
|
|
2069
|
+
/* @__PURE__ */ jsx(SkipButton, { segundos: 15, className: "p-1.5", size: "w-5 h-5", onSaltar: skip })
|
|
2189
2070
|
] }),
|
|
2190
2071
|
/* @__PURE__ */ jsx(
|
|
2191
|
-
|
|
2072
|
+
SpeedButton,
|
|
2192
2073
|
{
|
|
2193
2074
|
className: "text-label px-1.5 py-0.5",
|
|
2194
|
-
|
|
2195
|
-
|
|
2075
|
+
speed: playbackRate,
|
|
2076
|
+
onChange: handlePlaybackRateChange
|
|
2196
2077
|
}
|
|
2197
2078
|
)
|
|
2198
2079
|
] })
|
|
2199
2080
|
] }),
|
|
2200
|
-
|
|
2081
|
+
floatingJsx
|
|
2201
2082
|
] });
|
|
2202
2083
|
}
|
|
2203
2084
|
return /* @__PURE__ */ jsxs("div", { className: "bg-surface rounded-control border-border p-step-md w-full border", children: [
|
|
2204
2085
|
/* @__PURE__ */ jsx("audio", { ref: audioRef, src, preload: "metadata" }),
|
|
2205
2086
|
title ? /* @__PURE__ */ jsx("p", { className: "text-ui font-sans text-text-secondary mb-step-sm truncate", children: title }) : null,
|
|
2206
|
-
/* @__PURE__ */ jsx("div", { className: "mb-step-sm", children: /* @__PURE__ */ jsx(
|
|
2087
|
+
/* @__PURE__ */ jsx("div", { className: "mb-step-sm", children: /* @__PURE__ */ jsx(ProgressBar, { height: "h-2", knob: 16, progress, ...pointer }) }),
|
|
2207
2088
|
/* @__PURE__ */ jsxs("div", { className: "text-chip font-mono text-text-muted mb-step-sm flex justify-between", children: [
|
|
2208
2089
|
/* @__PURE__ */ jsx("span", { children: formatTime(currentTime) }),
|
|
2209
2090
|
/* @__PURE__ */ jsx("span", { children: formatTime(duration) })
|
|
2210
2091
|
] }),
|
|
2211
2092
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
|
|
2212
2093
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-xs flex items-center", children: [
|
|
2213
|
-
/* @__PURE__ */ jsx(
|
|
2094
|
+
/* @__PURE__ */ jsx(SkipButton, { segundos: -15, className: "p-2", size: "w-5 h-5", onSaltar: skip }),
|
|
2214
2095
|
/* @__PURE__ */ jsx(
|
|
2215
|
-
|
|
2096
|
+
PlayButton,
|
|
2216
2097
|
{
|
|
2217
2098
|
className: "rounded-pill flex size-12 items-center justify-center",
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
...
|
|
2099
|
+
size: "w-6 h-6",
|
|
2100
|
+
label: playLabel,
|
|
2101
|
+
onToggle: togglePlay,
|
|
2102
|
+
...playState
|
|
2222
2103
|
}
|
|
2223
2104
|
),
|
|
2224
|
-
/* @__PURE__ */ jsx(
|
|
2105
|
+
/* @__PURE__ */ jsx(SkipButton, { segundos: 15, className: "p-2", size: "w-5 h-5", onSaltar: skip })
|
|
2225
2106
|
] }),
|
|
2226
2107
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex items-center", children: [
|
|
2227
2108
|
/* @__PURE__ */ jsx(
|
|
2228
|
-
|
|
2109
|
+
SpeedButton,
|
|
2229
2110
|
{
|
|
2230
2111
|
className: "text-label px-2 py-1",
|
|
2231
|
-
|
|
2232
|
-
|
|
2112
|
+
speed: playbackRate,
|
|
2113
|
+
onChange: handlePlaybackRateChange
|
|
2233
2114
|
}
|
|
2234
2115
|
),
|
|
2235
2116
|
/* @__PURE__ */ jsx(
|
|
2236
|
-
|
|
2117
|
+
Volume,
|
|
2237
2118
|
{
|
|
2238
|
-
|
|
2239
|
-
|
|
2119
|
+
size: "w-5 h-5",
|
|
2120
|
+
width: "w-20",
|
|
2240
2121
|
silenciado: isMuted,
|
|
2241
2122
|
volumen: volume,
|
|
2242
|
-
|
|
2243
|
-
|
|
2123
|
+
onMute: toggleMute,
|
|
2124
|
+
onVolumeChange: handleVolumeChange
|
|
2244
2125
|
}
|
|
2245
2126
|
)
|
|
2246
2127
|
] })
|
|
@@ -2264,7 +2145,7 @@ function Blockquote({ children, author, source, className, ...props }) {
|
|
|
2264
2145
|
}
|
|
2265
2146
|
);
|
|
2266
2147
|
}
|
|
2267
|
-
var
|
|
2148
|
+
var LINK = "transition-standard hover:text-accent focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent rounded-chip cursor-pointer";
|
|
2268
2149
|
function Breadcrumb({
|
|
2269
2150
|
items,
|
|
2270
2151
|
homeHref = "/",
|
|
@@ -2273,28 +2154,28 @@ function Breadcrumb({
|
|
|
2273
2154
|
className,
|
|
2274
2155
|
...props
|
|
2275
2156
|
}) {
|
|
2276
|
-
const
|
|
2157
|
+
const link = (href, content) => linkAsChild ? /* @__PURE__ */ jsx(Slot, { className: LINK, children: linkAsChild({ href, children: content }) }) : /* @__PURE__ */ jsx("a", { href, className: LINK, children: content });
|
|
2277
2158
|
return /* @__PURE__ */ jsx("nav", { "aria-label": "Ruta", className: cn("font-mono text-meta text-text-muted", className), ...props, children: /* @__PURE__ */ jsxs("ol", { className: "gap-step-xs flex flex-wrap items-center", children: [
|
|
2278
|
-
/* @__PURE__ */ jsx("li", { children:
|
|
2159
|
+
/* @__PURE__ */ jsx("li", { children: link(homeHref, /* @__PURE__ */ jsx("span", { "aria-label": homeLabel, children: "~" })) }),
|
|
2279
2160
|
items.map((item2, i) => {
|
|
2280
|
-
const
|
|
2161
|
+
const last = i === items.length - 1;
|
|
2281
2162
|
return /* @__PURE__ */ jsxs("li", { className: "gap-step-xs flex items-center", children: [
|
|
2282
2163
|
/* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: "text-border", children: "/" }),
|
|
2283
|
-
item2.href && !
|
|
2164
|
+
item2.href && !last ? link(item2.href, item2.label) : /* @__PURE__ */ jsx("span", { "aria-current": last ? "page" : void 0, className: "text-text-secondary", children: item2.label })
|
|
2284
2165
|
] }, i);
|
|
2285
2166
|
})
|
|
2286
2167
|
] }) });
|
|
2287
2168
|
}
|
|
2288
2169
|
function CodeBlock({ children, language, copyText, className, ...props }) {
|
|
2289
2170
|
const [copiado, setCopiado] = useState(false);
|
|
2290
|
-
const
|
|
2291
|
-
const
|
|
2171
|
+
const timer = useRef(null);
|
|
2172
|
+
const copy = useCallback(async () => {
|
|
2292
2173
|
if (!copyText) return;
|
|
2293
2174
|
try {
|
|
2294
2175
|
await navigator.clipboard.writeText(copyText);
|
|
2295
2176
|
setCopiado(true);
|
|
2296
|
-
if (
|
|
2297
|
-
|
|
2177
|
+
if (timer.current) clearTimeout(timer.current);
|
|
2178
|
+
timer.current = setTimeout(() => setCopiado(false), 2e3);
|
|
2298
2179
|
} catch {
|
|
2299
2180
|
}
|
|
2300
2181
|
}, [copyText]);
|
|
@@ -2318,7 +2199,7 @@ function CodeBlock({ children, language, copyText, className, ...props }) {
|
|
|
2318
2199
|
"button",
|
|
2319
2200
|
{
|
|
2320
2201
|
type: "button",
|
|
2321
|
-
onClick:
|
|
2202
|
+
onClick: copy,
|
|
2322
2203
|
"aria-label": copiado ? "C\xF3digo copiado" : "Copiar c\xF3digo",
|
|
2323
2204
|
"aria-live": "polite",
|
|
2324
2205
|
className: cn(
|
|
@@ -2348,7 +2229,7 @@ function CourseCard({
|
|
|
2348
2229
|
className,
|
|
2349
2230
|
...props
|
|
2350
2231
|
}) {
|
|
2351
|
-
return /* @__PURE__ */ jsx(
|
|
2232
|
+
return /* @__PURE__ */ jsx(CardShell, { className: cn("p-step-lg", className), ...props, children: /* @__PURE__ */ jsxs("article", { className: "gap-step-sm flex h-full flex-col", children: [
|
|
2352
2233
|
status ? /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Badge, { variant: "warm", children: status }) }) : null,
|
|
2353
2234
|
/* @__PURE__ */ jsx(Text, { as: "h3", variant: "h3", className: "group-hover:text-accent transition-standard", children: title }),
|
|
2354
2235
|
summary ? /* @__PURE__ */ jsx(Text, { variant: "ui", tone: "secondary", className: "line-clamp-3", children: summary }) : null,
|
|
@@ -2365,9 +2246,9 @@ function CourseCard({
|
|
|
2365
2246
|
] }) : null
|
|
2366
2247
|
] }) });
|
|
2367
2248
|
}
|
|
2368
|
-
var
|
|
2249
|
+
var FACE = "w-[66px] max-w-none";
|
|
2369
2250
|
function EmptyState({
|
|
2370
|
-
|
|
2251
|
+
expression,
|
|
2371
2252
|
title,
|
|
2372
2253
|
description,
|
|
2373
2254
|
action,
|
|
@@ -2378,10 +2259,10 @@ function EmptyState({
|
|
|
2378
2259
|
return /* @__PURE__ */ jsxs(
|
|
2379
2260
|
"div",
|
|
2380
2261
|
{
|
|
2381
|
-
className: cn(
|
|
2262
|
+
className: cn(CARD_SURFACE, "p-step-lg gap-step-sm flex flex-col items-center text-center", className),
|
|
2382
2263
|
...props,
|
|
2383
2264
|
children: [
|
|
2384
|
-
/* @__PURE__ */ jsx(
|
|
2265
|
+
/* @__PURE__ */ jsx(MascotFace, { expression, className: FACE, basePath }),
|
|
2385
2266
|
/* @__PURE__ */ jsx(Text, { variant: "ui", as: "p", className: "font-medium", children: title }),
|
|
2386
2267
|
description ? /* @__PURE__ */ jsx(Text, { variant: "label", tone: "muted", as: "p", className: "max-w-measure font-normal", children: description }) : null,
|
|
2387
2268
|
action ? /* @__PURE__ */ jsx("div", { className: "mt-step-xs", children: action }) : null
|
|
@@ -2389,12 +2270,12 @@ function EmptyState({
|
|
|
2389
2270
|
}
|
|
2390
2271
|
);
|
|
2391
2272
|
}
|
|
2392
|
-
var
|
|
2393
|
-
function
|
|
2394
|
-
const
|
|
2395
|
-
return `${
|
|
2396
|
-
|
|
2397
|
-
)}:${
|
|
2273
|
+
var sameDay = (a, b) => a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
2274
|
+
function toFieldValue(date) {
|
|
2275
|
+
const two = (n) => String(n).padStart(2, "0");
|
|
2276
|
+
return `${date.getFullYear()}-${two(date.getMonth() + 1)}-${two(date.getDate())}T${two(
|
|
2277
|
+
date.getHours()
|
|
2278
|
+
)}:${two(date.getMinutes())}`;
|
|
2398
2279
|
}
|
|
2399
2280
|
function EventCalendar({
|
|
2400
2281
|
events,
|
|
@@ -2403,68 +2284,68 @@ function EventCalendar({
|
|
|
2403
2284
|
onDeleteEvent,
|
|
2404
2285
|
selected,
|
|
2405
2286
|
onSelectDay,
|
|
2406
|
-
formatDay = (
|
|
2407
|
-
formatTime: formatTime2 = (
|
|
2287
|
+
formatDay = (day) => format(day, "EEEE d 'de' MMMM", { locale: es }),
|
|
2288
|
+
formatTime: formatTime2 = (date) => format(date, "HH:mm", { locale: es }),
|
|
2408
2289
|
emptyMessage = "Nada en este d\xEDa.",
|
|
2409
2290
|
className,
|
|
2410
2291
|
...props
|
|
2411
2292
|
}) {
|
|
2412
2293
|
const id = useId();
|
|
2413
2294
|
const [diaInterno, setDiaInterno] = useState(() => selected ?? /* @__PURE__ */ new Date());
|
|
2414
|
-
const
|
|
2415
|
-
const [
|
|
2416
|
-
const [
|
|
2417
|
-
const [
|
|
2418
|
-
const [
|
|
2295
|
+
const day = selected ?? diaInterno;
|
|
2296
|
+
const [month, setMonth] = useState(() => day);
|
|
2297
|
+
const [editing, setEditing] = useState(null);
|
|
2298
|
+
const [title, setTitle] = useState("");
|
|
2299
|
+
const [when, setWhen] = useState("");
|
|
2419
2300
|
const editable = Boolean(onCreateEvent ?? onUpdateEvent);
|
|
2420
|
-
const
|
|
2421
|
-
function
|
|
2301
|
+
const ofTheDay = events.filter((e) => sameDay(e.start, day)).sort((a, b) => a.start.getTime() - b.start.getTime());
|
|
2302
|
+
function pickDay(nuevo) {
|
|
2422
2303
|
if (!nuevo) return;
|
|
2423
2304
|
setDiaInterno(nuevo);
|
|
2424
|
-
|
|
2305
|
+
setMonth(nuevo);
|
|
2425
2306
|
onSelectDay?.(nuevo);
|
|
2426
|
-
|
|
2307
|
+
cancel();
|
|
2427
2308
|
}
|
|
2428
|
-
function
|
|
2429
|
-
|
|
2430
|
-
|
|
2431
|
-
|
|
2309
|
+
function cancel() {
|
|
2310
|
+
setEditing(null);
|
|
2311
|
+
setTitle("");
|
|
2312
|
+
setWhen("");
|
|
2432
2313
|
}
|
|
2433
|
-
function
|
|
2434
|
-
|
|
2435
|
-
|
|
2436
|
-
|
|
2314
|
+
function edit(event) {
|
|
2315
|
+
setEditing(event.id);
|
|
2316
|
+
setTitle(event.title);
|
|
2317
|
+
setWhen(toFieldValue(event.start));
|
|
2437
2318
|
}
|
|
2438
|
-
function
|
|
2319
|
+
function submit(e) {
|
|
2439
2320
|
e.preventDefault();
|
|
2440
|
-
if (!
|
|
2441
|
-
const start = new Date(
|
|
2321
|
+
if (!title.trim() || !when) return;
|
|
2322
|
+
const start = new Date(when);
|
|
2442
2323
|
if (Number.isNaN(start.getTime())) return;
|
|
2443
|
-
if (
|
|
2444
|
-
const
|
|
2445
|
-
if (
|
|
2324
|
+
if (editing) {
|
|
2325
|
+
const previous = events.find((ev) => ev.id === editing);
|
|
2326
|
+
if (previous) onUpdateEvent?.({ ...previous, title: title.trim(), start });
|
|
2446
2327
|
} else {
|
|
2447
|
-
onCreateEvent?.({ title:
|
|
2328
|
+
onCreateEvent?.({ title: title.trim(), start });
|
|
2448
2329
|
}
|
|
2449
|
-
|
|
2330
|
+
cancel();
|
|
2450
2331
|
}
|
|
2451
|
-
const
|
|
2332
|
+
const withEvent = events.map((e) => e.start);
|
|
2452
2333
|
return /* @__PURE__ */ jsxs("div", { className: cn("gap-step-lg flex flex-col md:flex-row md:items-start", className), ...props, children: [
|
|
2453
2334
|
/* @__PURE__ */ jsx(
|
|
2454
2335
|
Calendar,
|
|
2455
2336
|
{
|
|
2456
2337
|
mode: "single",
|
|
2457
|
-
selected:
|
|
2458
|
-
onSelect:
|
|
2459
|
-
month
|
|
2460
|
-
onMonthChange:
|
|
2461
|
-
modifiers: {
|
|
2338
|
+
selected: day,
|
|
2339
|
+
onSelect: pickDay,
|
|
2340
|
+
month,
|
|
2341
|
+
onMonthChange: setMonth,
|
|
2342
|
+
modifiers: { withEvent },
|
|
2462
2343
|
modifiersClassNames: {
|
|
2463
|
-
//
|
|
2464
|
-
//
|
|
2465
|
-
// `after:`
|
|
2466
|
-
//
|
|
2467
|
-
|
|
2344
|
+
// The dot goes under the number, not on top of the day's background:
|
|
2345
|
+
// over the selected one — which is solid biolume — an accent dot
|
|
2346
|
+
// disappears. `after:` in Tailwind v4 already ships `content: ""`, so
|
|
2347
|
+
// there is no need to declare it with an arbitrary value.
|
|
2348
|
+
withEvent: cn(
|
|
2468
2349
|
"after:bg-accent after:absolute after:bottom-1 after:left-1/2",
|
|
2469
2350
|
"after:size-1 after:-translate-x-1/2 after:rounded-pill",
|
|
2470
2351
|
"[&[data-selected=true]]:after:bg-accent-on"
|
|
@@ -2479,8 +2360,8 @@ function EventCalendar({
|
|
|
2479
2360
|
"aria-labelledby": `${id}-dia`,
|
|
2480
2361
|
className: "border-hairline rounded-card p-step-md gap-step-md flex min-w-0 flex-1 flex-col border",
|
|
2481
2362
|
children: [
|
|
2482
|
-
/* @__PURE__ */ jsx(Text, { as: "h3", variant: "h3", id: `${id}-dia`, className: "first-letter:uppercase", children: formatDay(
|
|
2483
|
-
|
|
2363
|
+
/* @__PURE__ */ jsx(Text, { as: "h3", variant: "h3", id: `${id}-dia`, className: "first-letter:uppercase", children: formatDay(day) }),
|
|
2364
|
+
ofTheDay.length > 0 ? /* @__PURE__ */ jsx("ul", { className: "gap-step-xs flex flex-col", children: ofTheDay.map((event) => /* @__PURE__ */ jsxs(
|
|
2484
2365
|
"li",
|
|
2485
2366
|
{
|
|
2486
2367
|
className: "border-hairline gap-step-sm py-step-xs flex items-center border-b last:border-b-0",
|
|
@@ -2490,85 +2371,85 @@ function EventCalendar({
|
|
|
2490
2371
|
{
|
|
2491
2372
|
as: "span",
|
|
2492
2373
|
variant: "meta",
|
|
2493
|
-
tone:
|
|
2374
|
+
tone: event.tone === "warm" ? "warm" : "accent",
|
|
2494
2375
|
className: "shrink-0 tabular-nums",
|
|
2495
|
-
children: /* @__PURE__ */ jsx("time", { dateTime:
|
|
2376
|
+
children: /* @__PURE__ */ jsx("time", { dateTime: event.start.toISOString(), children: formatTime2(event.start) })
|
|
2496
2377
|
}
|
|
2497
2378
|
),
|
|
2498
|
-
/* @__PURE__ */ jsx(Text, { as: "span", variant: "ui", className: "min-w-0 flex-1 truncate", children:
|
|
2379
|
+
/* @__PURE__ */ jsx(Text, { as: "span", variant: "ui", className: "min-w-0 flex-1 truncate", children: event.title }),
|
|
2499
2380
|
onUpdateEvent ? /* @__PURE__ */ jsx(
|
|
2500
2381
|
Button,
|
|
2501
2382
|
{
|
|
2502
2383
|
variant: "tertiary",
|
|
2503
2384
|
size: "sm",
|
|
2504
|
-
onClick: () =>
|
|
2505
|
-
"aria-label": `Editar \xAB${
|
|
2506
|
-
children: "./
|
|
2385
|
+
onClick: () => edit(event),
|
|
2386
|
+
"aria-label": `Editar \xAB${event.title}\xBB`,
|
|
2387
|
+
children: "./edit"
|
|
2507
2388
|
}
|
|
2508
2389
|
) : null,
|
|
2509
2390
|
onDeleteEvent ? /* @__PURE__ */ jsxs(AlertDialog, { children: [
|
|
2510
|
-
/* @__PURE__ */ jsx(AlertDialogTrigger, { asChild: true, children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", size: "sm", "aria-label": `Borrar \xAB${
|
|
2391
|
+
/* @__PURE__ */ jsx(AlertDialogTrigger, { asChild: true, children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", size: "sm", "aria-label": `Borrar \xAB${event.title}\xBB`, children: "./borrar" }) }),
|
|
2511
2392
|
/* @__PURE__ */ jsxs(AlertDialogContent, { children: [
|
|
2512
2393
|
/* @__PURE__ */ jsxs(AlertDialogHeader, { children: [
|
|
2513
2394
|
/* @__PURE__ */ jsxs(AlertDialogTitle, { children: [
|
|
2514
2395
|
"Borrar \xAB",
|
|
2515
|
-
|
|
2396
|
+
event.title,
|
|
2516
2397
|
"\xBB"
|
|
2517
2398
|
] }),
|
|
2518
2399
|
/* @__PURE__ */ jsxs(AlertDialogDescription, { children: [
|
|
2519
2400
|
"Se borra del ",
|
|
2520
|
-
formatDay(
|
|
2401
|
+
formatDay(event.start),
|
|
2521
2402
|
" a las ",
|
|
2522
|
-
formatTime2(
|
|
2403
|
+
formatTime2(event.start),
|
|
2523
2404
|
". No se puede deshacer."
|
|
2524
2405
|
] })
|
|
2525
2406
|
] }),
|
|
2526
2407
|
/* @__PURE__ */ jsxs(AlertDialogFooter, { children: [
|
|
2527
2408
|
/* @__PURE__ */ jsx(AlertDialogCancel, { children: "Mejor no" }),
|
|
2528
|
-
/* @__PURE__ */ jsx(AlertDialogAction, { onClick: () => onDeleteEvent(
|
|
2409
|
+
/* @__PURE__ */ jsx(AlertDialogAction, { onClick: () => onDeleteEvent(event.id), children: "Borrar el event" })
|
|
2529
2410
|
] })
|
|
2530
2411
|
] })
|
|
2531
2412
|
] }) : null
|
|
2532
2413
|
]
|
|
2533
2414
|
},
|
|
2534
|
-
|
|
2415
|
+
event.id
|
|
2535
2416
|
)) }) : (
|
|
2536
|
-
// `EmptyState`
|
|
2537
|
-
//
|
|
2538
|
-
//
|
|
2539
|
-
//
|
|
2417
|
+
// `EmptyState` is not used: it carries a mascot face, and the mascot
|
|
2418
|
+
// has seven counted places where it may appear. An empty day in a
|
|
2419
|
+
// schedule is not one of them — and in a thirty-day month, half of them
|
|
2420
|
+
// would be.
|
|
2540
2421
|
/* @__PURE__ */ jsx(Text, { as: "p", variant: "ui", tone: "muted", children: emptyMessage })
|
|
2541
2422
|
),
|
|
2542
|
-
editable ? /* @__PURE__ */ jsxs("form", { onSubmit:
|
|
2423
|
+
editable ? /* @__PURE__ */ jsxs("form", { onSubmit: submit, className: "gap-step-sm border-hairline pt-step-md flex flex-col border-t", children: [
|
|
2543
2424
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-xs flex flex-col", children: [
|
|
2544
|
-
/* @__PURE__ */ jsx(Label, { htmlFor: `${id}-
|
|
2425
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: `${id}-title`, children: "T\xEDtulo" }),
|
|
2545
2426
|
/* @__PURE__ */ jsx(
|
|
2546
2427
|
Input,
|
|
2547
2428
|
{
|
|
2548
|
-
id: `${id}-
|
|
2549
|
-
value:
|
|
2550
|
-
onChange: (e) =>
|
|
2429
|
+
id: `${id}-title`,
|
|
2430
|
+
value: title,
|
|
2431
|
+
onChange: (e) => setTitle(e.target.value),
|
|
2551
2432
|
placeholder: "Publicar el art\xEDculo",
|
|
2552
2433
|
required: true
|
|
2553
2434
|
}
|
|
2554
2435
|
)
|
|
2555
2436
|
] }),
|
|
2556
2437
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-xs flex flex-col", children: [
|
|
2557
|
-
/* @__PURE__ */ jsx(Label, { htmlFor: `${id}-
|
|
2438
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: `${id}-when`, children: "Cu\xE1ndo" }),
|
|
2558
2439
|
/* @__PURE__ */ jsx(
|
|
2559
2440
|
DateField,
|
|
2560
2441
|
{
|
|
2561
|
-
id: `${id}-
|
|
2442
|
+
id: `${id}-when`,
|
|
2562
2443
|
withTime: true,
|
|
2563
|
-
value:
|
|
2564
|
-
onChange: (e) =>
|
|
2444
|
+
value: when,
|
|
2445
|
+
onChange: (e) => setWhen(e.target.value),
|
|
2565
2446
|
required: true
|
|
2566
2447
|
}
|
|
2567
2448
|
)
|
|
2568
2449
|
] }),
|
|
2569
2450
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex flex-wrap items-center", children: [
|
|
2570
|
-
/* @__PURE__ */ jsx(Button, { type: "submit", size: "sm", children:
|
|
2571
|
-
|
|
2451
|
+
/* @__PURE__ */ jsx(Button, { type: "submit", size: "sm", children: editing ? "Guardar" : "A\xF1adir" }),
|
|
2452
|
+
editing ? /* @__PURE__ */ jsx(Button, { type: "button", variant: "tertiary", size: "sm", onClick: cancel, children: "./cancel" }) : null
|
|
2572
2453
|
] })
|
|
2573
2454
|
] }) : null
|
|
2574
2455
|
]
|
|
@@ -2584,7 +2465,7 @@ function Footer({
|
|
|
2584
2465
|
className,
|
|
2585
2466
|
...props
|
|
2586
2467
|
}) {
|
|
2587
|
-
const
|
|
2468
|
+
const signature = /* @__PURE__ */ jsxs(Text, { variant: "meta", tone: "muted", as: "p", className: "ml-auto shrink-0", children: [
|
|
2588
2469
|
/* @__PURE__ */ jsxs("span", { "aria-hidden": "true", className: "text-accent", children: [
|
|
2589
2470
|
"$",
|
|
2590
2471
|
" "
|
|
@@ -2592,41 +2473,48 @@ function Footer({
|
|
|
2592
2473
|
"cd ~/",
|
|
2593
2474
|
naming.domain,
|
|
2594
2475
|
"/",
|
|
2595
|
-
year
|
|
2476
|
+
year,
|
|
2477
|
+
/* @__PURE__ */ jsx(
|
|
2478
|
+
"span",
|
|
2479
|
+
{
|
|
2480
|
+
"aria-hidden": "true",
|
|
2481
|
+
className: "bg-accent motion-safe:caret ml-[0.2em] inline-block h-[1em] w-[0.5em] translate-y-[0.15em]"
|
|
2482
|
+
}
|
|
2483
|
+
)
|
|
2596
2484
|
] });
|
|
2597
|
-
const
|
|
2485
|
+
const rows = [
|
|
2598
2486
|
brand2 ? /* @__PURE__ */ jsx("div", { className: "flex items-center", children: brand2 }, "marca") : null,
|
|
2599
2487
|
children ? /* @__PURE__ */ jsx("div", { className: "gap-step-md flex flex-wrap items-center", children }, "enlaces") : null,
|
|
2600
2488
|
social && social.length > 0 ? (
|
|
2601
|
-
// 18px
|
|
2602
|
-
//
|
|
2603
|
-
/* @__PURE__ */ jsx("ul", { className: "flex items-center gap-[18px]", children: social.map((
|
|
2489
|
+
// 18px of separation, from the document. It is not a `spacing` step: it is
|
|
2490
|
+
// the rhythm of a row of icons, not that of a page.
|
|
2491
|
+
/* @__PURE__ */ jsx("ul", { className: "flex items-center gap-[18px]", children: social.map((socialLink) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
|
|
2604
2492
|
"a",
|
|
2605
2493
|
{
|
|
2606
|
-
href:
|
|
2607
|
-
"aria-label":
|
|
2494
|
+
href: socialLink.href,
|
|
2495
|
+
"aria-label": socialLink.label,
|
|
2608
2496
|
className: cn(
|
|
2609
2497
|
"text-text-muted hover:text-accent transition-standard block cursor-pointer text-[19px]",
|
|
2610
2498
|
"rounded-chip focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent"
|
|
2611
2499
|
),
|
|
2612
|
-
children:
|
|
2500
|
+
children: socialLink.icon
|
|
2613
2501
|
}
|
|
2614
|
-
) },
|
|
2502
|
+
) }, socialLink.href)) }, "socialLinks")
|
|
2615
2503
|
) : null
|
|
2616
2504
|
].filter(Boolean);
|
|
2617
|
-
const [
|
|
2505
|
+
const [first, ...rest] = rows;
|
|
2618
2506
|
return /* @__PURE__ */ jsx("footer", { className: cn("border-hairline w-full border-t", className), ...props, children: /* @__PURE__ */ jsxs("div", { className: "max-w-wide px-step-md py-step-xl gap-step-lg mx-auto flex flex-col", children: [
|
|
2619
2507
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-md flex flex-wrap items-center", children: [
|
|
2620
|
-
|
|
2621
|
-
|
|
2508
|
+
first ?? null,
|
|
2509
|
+
signature
|
|
2622
2510
|
] }),
|
|
2623
|
-
|
|
2511
|
+
rest
|
|
2624
2512
|
] }) });
|
|
2625
2513
|
}
|
|
2626
2514
|
function FooterLink({ asChild = false, className, ...props }) {
|
|
2627
|
-
const
|
|
2515
|
+
const Root17 = asChild ? Slot : "a";
|
|
2628
2516
|
return /* @__PURE__ */ jsx(
|
|
2629
|
-
|
|
2517
|
+
Root17,
|
|
2630
2518
|
{
|
|
2631
2519
|
className: cn(
|
|
2632
2520
|
"font-mono text-meta text-text-secondary hover:text-accent transition-standard cursor-pointer",
|
|
@@ -2644,24 +2532,24 @@ function Hero({
|
|
|
2644
2532
|
action,
|
|
2645
2533
|
pose,
|
|
2646
2534
|
basePath,
|
|
2647
|
-
variant = "
|
|
2535
|
+
variant = "header",
|
|
2648
2536
|
className,
|
|
2649
2537
|
...props
|
|
2650
2538
|
}) {
|
|
2651
|
-
const
|
|
2539
|
+
const centered = variant === "centered";
|
|
2652
2540
|
return /* @__PURE__ */ jsxs(
|
|
2653
2541
|
"section",
|
|
2654
2542
|
{
|
|
2655
2543
|
className: cn(
|
|
2656
|
-
"
|
|
2657
|
-
// 44
|
|
2544
|
+
"gradient-hero rounded-panel border-hairline relative overflow-hidden border",
|
|
2545
|
+
// 44 top, 40 on the sides and bottom. From the document.
|
|
2658
2546
|
"px-step-xl pt-[44px] pb-step-xl",
|
|
2659
2547
|
className
|
|
2660
2548
|
),
|
|
2661
2549
|
...props,
|
|
2662
2550
|
children: [
|
|
2663
|
-
|
|
2664
|
-
|
|
2551
|
+
centered && pose ? /* @__PURE__ */ jsx(
|
|
2552
|
+
Mascot,
|
|
2665
2553
|
{
|
|
2666
2554
|
pose,
|
|
2667
2555
|
basePath,
|
|
@@ -2673,7 +2561,7 @@ function Hero({
|
|
|
2673
2561
|
{
|
|
2674
2562
|
className: cn(
|
|
2675
2563
|
"gap-step-md flex flex-col",
|
|
2676
|
-
|
|
2564
|
+
centered ? "items-center text-center" : "md:max-w-[62%]"
|
|
2677
2565
|
),
|
|
2678
2566
|
children: [
|
|
2679
2567
|
eyebrow ? /* @__PURE__ */ jsx(Text, { variant: "eyebrow", tone: "accent", as: "p", children: eyebrow }) : null,
|
|
@@ -2684,7 +2572,7 @@ function Hero({
|
|
|
2684
2572
|
{
|
|
2685
2573
|
className: cn(
|
|
2686
2574
|
"gap-step-sm mt-step-xs flex flex-wrap items-center",
|
|
2687
|
-
|
|
2575
|
+
centered && "justify-center"
|
|
2688
2576
|
),
|
|
2689
2577
|
children: action
|
|
2690
2578
|
}
|
|
@@ -2692,14 +2580,14 @@ function Hero({
|
|
|
2692
2580
|
]
|
|
2693
2581
|
}
|
|
2694
2582
|
),
|
|
2695
|
-
!
|
|
2696
|
-
|
|
2583
|
+
!centered && pose ? /* @__PURE__ */ jsx(
|
|
2584
|
+
Mascot,
|
|
2697
2585
|
{
|
|
2698
2586
|
pose,
|
|
2699
2587
|
basePath,
|
|
2700
2588
|
className: cn(
|
|
2701
|
-
//
|
|
2702
|
-
//
|
|
2589
|
+
// On mobile, in the flow and below the buttons. From md up, bleeding
|
|
2590
|
+
// off the bottom-right corner.
|
|
2703
2591
|
"mt-step-lg mx-auto w-40",
|
|
2704
2592
|
"md:mt-0 md:absolute md:right-0 md:-bottom-4 md:mx-0 md:w-64"
|
|
2705
2593
|
)
|
|
@@ -2720,7 +2608,7 @@ function LinkRow({
|
|
|
2720
2608
|
const rel = external ? "noopener noreferrer" : props.rel;
|
|
2721
2609
|
const target = external ? "_blank" : props.target;
|
|
2722
2610
|
return /* @__PURE__ */ jsx(
|
|
2723
|
-
|
|
2611
|
+
CardShell,
|
|
2724
2612
|
{
|
|
2725
2613
|
className: cn("px-step-md py-step-sm", className),
|
|
2726
2614
|
...props,
|
|
@@ -2749,8 +2637,8 @@ function Nav({ brand: brand2, children, actions, className, ...props }) {
|
|
|
2749
2637
|
{
|
|
2750
2638
|
className: cn(
|
|
2751
2639
|
"sticky top-0 z-50 w-full",
|
|
2752
|
-
//
|
|
2753
|
-
//
|
|
2640
|
+
// Abyss at 86 % with 14px of blur behind. The alpha rides on the token,
|
|
2641
|
+
// so it follows the mode: in light it is paper at 86 %.
|
|
2754
2642
|
"bg-background/86 backdrop-blur-[14px]",
|
|
2755
2643
|
"border-hairline border-b",
|
|
2756
2644
|
className
|
|
@@ -2768,9 +2656,9 @@ function Nav({ brand: brand2, children, actions, className, ...props }) {
|
|
|
2768
2656
|
);
|
|
2769
2657
|
}
|
|
2770
2658
|
function NavItem({ active = false, asChild = false, className, children, ...props }) {
|
|
2771
|
-
const
|
|
2659
|
+
const Root17 = asChild ? Slot : "a";
|
|
2772
2660
|
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
2773
|
-
|
|
2661
|
+
Root17,
|
|
2774
2662
|
{
|
|
2775
2663
|
"aria-current": active ? "page" : void 0,
|
|
2776
2664
|
className: cn(
|
|
@@ -2792,39 +2680,49 @@ function NavItem({ active = false, asChild = false, className, children, ...prop
|
|
|
2792
2680
|
function NewsletterForm({
|
|
2793
2681
|
title,
|
|
2794
2682
|
description,
|
|
2795
|
-
state = "
|
|
2683
|
+
state = "idle",
|
|
2796
2684
|
onSubmitEmail,
|
|
2797
|
-
successMessage = "Ya est\xE1s dentro. Te llega un
|
|
2798
|
-
errorMessage = "No se pudo suscribir ese
|
|
2685
|
+
successMessage = "Ya est\xE1s dentro. Te llega un email cada dos semanas, y nada m\xE1s.",
|
|
2686
|
+
errorMessage = "No se pudo suscribir ese email. Rev\xEDsalo y vuelve a intentar.",
|
|
2799
2687
|
disclaimer,
|
|
2800
|
-
|
|
2688
|
+
expression,
|
|
2801
2689
|
basePath,
|
|
2802
2690
|
submitLabel = "Suscribirme",
|
|
2803
|
-
placeholder = "tu@
|
|
2804
|
-
fieldLabel = "
|
|
2691
|
+
placeholder = "tu@email.dev",
|
|
2692
|
+
fieldLabel = "Email electr\xF3nico",
|
|
2805
2693
|
nameField = false,
|
|
2806
2694
|
nameLabel = "Nombre",
|
|
2807
2695
|
namePlaceholder = "C\xF3mo te llamas",
|
|
2808
2696
|
nameInputProps,
|
|
2697
|
+
aside,
|
|
2698
|
+
resetOnSuccess = true,
|
|
2699
|
+
onFieldChange,
|
|
2700
|
+
fieldErrors,
|
|
2809
2701
|
className,
|
|
2810
2702
|
...props
|
|
2811
2703
|
}) {
|
|
2812
2704
|
const id = useId();
|
|
2813
|
-
const
|
|
2705
|
+
const form = useRef(null);
|
|
2706
|
+
const sending = state === "sending";
|
|
2814
2707
|
const error = state === "error";
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2818
|
-
|
|
2819
|
-
|
|
2820
|
-
|
|
2708
|
+
const nameError = fieldErrors?.name;
|
|
2709
|
+
const emailError = fieldErrors?.email;
|
|
2710
|
+
useEffect(() => {
|
|
2711
|
+
if (state === "success" && resetOnSuccess) form.current?.reset();
|
|
2712
|
+
}, [state, resetOnSuccess]);
|
|
2713
|
+
function submit(event) {
|
|
2714
|
+
event.preventDefault();
|
|
2715
|
+
const data = new FormData(event.currentTarget);
|
|
2716
|
+
const email = String(data.get("email") ?? "");
|
|
2717
|
+
const name = nameField ? String(data.get("name") ?? "") : void 0;
|
|
2718
|
+
onSubmitEmail?.(email, name);
|
|
2821
2719
|
}
|
|
2822
|
-
const
|
|
2720
|
+
const button2 = /* @__PURE__ */ jsx(
|
|
2823
2721
|
Button,
|
|
2824
2722
|
{
|
|
2825
2723
|
type: "submit",
|
|
2826
2724
|
variant: "conversion",
|
|
2827
|
-
loading:
|
|
2725
|
+
loading: sending,
|
|
2828
2726
|
className: cn("disabled:opacity-60", nameField && "sm:self-start"),
|
|
2829
2727
|
children: submitLabel
|
|
2830
2728
|
}
|
|
@@ -2833,65 +2731,79 @@ function NewsletterForm({
|
|
|
2833
2731
|
"section",
|
|
2834
2732
|
{
|
|
2835
2733
|
className: cn(
|
|
2836
|
-
"
|
|
2734
|
+
"gradient-section rounded-panel border-hairline p-step-lg border",
|
|
2735
|
+
// Two columns from `md` up when there is an illustration, one otherwise.
|
|
2736
|
+
// `items-center` centres the pose against the block of text and form
|
|
2737
|
+
// rather than against the panel, which is what the blog was doing by
|
|
2738
|
+
// hand with an absolute position and a reserved `pr`.
|
|
2739
|
+
aside ? "gap-step-lg flex flex-col md:flex-row md:items-center" : "gap-step-md flex flex-col",
|
|
2837
2740
|
className
|
|
2838
2741
|
),
|
|
2839
2742
|
...props,
|
|
2840
2743
|
children: [
|
|
2841
|
-
/* @__PURE__ */ jsxs("div", { className: "gap-step-
|
|
2842
|
-
/* @__PURE__ */
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
/* @__PURE__ */ jsxs("
|
|
2847
|
-
|
|
2848
|
-
/* @__PURE__ */
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
|
|
2853
|
-
|
|
2854
|
-
|
|
2855
|
-
|
|
2856
|
-
|
|
2857
|
-
|
|
2858
|
-
|
|
2859
|
-
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
|
|
2870
|
-
|
|
2871
|
-
|
|
2872
|
-
|
|
2873
|
-
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
|
|
2877
|
-
|
|
2878
|
-
|
|
2744
|
+
/* @__PURE__ */ jsxs("div", { className: cn("gap-step-md flex min-w-0 flex-1 flex-col"), children: [
|
|
2745
|
+
/* @__PURE__ */ jsxs("div", { className: "gap-step-xs flex flex-col", children: [
|
|
2746
|
+
/* @__PURE__ */ jsx(Text, { as: "h2", variant: "h3", children: title }),
|
|
2747
|
+
description ? /* @__PURE__ */ jsx(Text, { variant: "ui", tone: "secondary", children: description }) : null
|
|
2748
|
+
] }),
|
|
2749
|
+
/* @__PURE__ */ jsxs("form", { ref: form, onSubmit: submit, className: "gap-step-sm flex flex-col", noValidate: true, children: [
|
|
2750
|
+
/* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex flex-col sm:flex-row sm:items-start", children: [
|
|
2751
|
+
nameField ? /* @__PURE__ */ jsxs("div", { className: "gap-step-xs flex flex-1 flex-col", children: [
|
|
2752
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: `${id}-name`, children: nameLabel }),
|
|
2753
|
+
/* @__PURE__ */ jsx(
|
|
2754
|
+
Input,
|
|
2755
|
+
{
|
|
2756
|
+
id: `${id}-name`,
|
|
2757
|
+
name: "name",
|
|
2758
|
+
type: "text",
|
|
2759
|
+
autoComplete: "name",
|
|
2760
|
+
required: true,
|
|
2761
|
+
placeholder: namePlaceholder,
|
|
2762
|
+
disabled: sending,
|
|
2763
|
+
invalid: Boolean(nameError),
|
|
2764
|
+
"aria-describedby": nameError ? `${id}-name-error` : void 0,
|
|
2765
|
+
onChange: (e) => onFieldChange?.("name", e.currentTarget.value),
|
|
2766
|
+
...nameInputProps
|
|
2767
|
+
}
|
|
2768
|
+
),
|
|
2769
|
+
nameError ? /* @__PURE__ */ jsx(Text, { id: `${id}-name-error`, variant: "label", tone: "error", as: "p", role: "alert", children: nameError }) : null
|
|
2770
|
+
] }) : null,
|
|
2771
|
+
/* @__PURE__ */ jsxs("div", { className: "gap-step-xs flex flex-1 flex-col", children: [
|
|
2772
|
+
/* @__PURE__ */ jsx(Label, { htmlFor: id, children: fieldLabel }),
|
|
2773
|
+
/* @__PURE__ */ jsx(
|
|
2774
|
+
Input,
|
|
2775
|
+
{
|
|
2776
|
+
id,
|
|
2777
|
+
name: "email",
|
|
2778
|
+
type: "email",
|
|
2779
|
+
autoComplete: "email",
|
|
2780
|
+
required: true,
|
|
2781
|
+
placeholder,
|
|
2782
|
+
disabled: sending,
|
|
2783
|
+
invalid: error || Boolean(emailError),
|
|
2784
|
+
onChange: (e) => onFieldChange?.("email", e.currentTarget.value),
|
|
2785
|
+
"aria-describedby": emailError ? `${id}-email-error` : state === "success" || error ? `${id}-notice` : void 0
|
|
2786
|
+
}
|
|
2787
|
+
),
|
|
2788
|
+
emailError ? /* @__PURE__ */ jsx(Text, { id: `${id}-email-error`, variant: "label", tone: "error", as: "p", role: "alert", children: emailError }) : null
|
|
2789
|
+
] }),
|
|
2790
|
+
nameField ? null : /* @__PURE__ */ jsx("div", { className: "sm:mt-[26px]", children: button2 })
|
|
2879
2791
|
] }),
|
|
2880
|
-
nameField ?
|
|
2792
|
+
nameField ? button2 : null
|
|
2881
2793
|
] }),
|
|
2882
|
-
|
|
2794
|
+
state === "success" ? /* @__PURE__ */ jsx(Alert, { id: `${id}-notice`, variant: "success", emphasis: "strong", children: successMessage }) : null,
|
|
2795
|
+
error ? /* @__PURE__ */ jsx(Alert, { id: `${id}-notice`, variant: "error", emphasis: "strong", children: errorMessage }) : null,
|
|
2796
|
+
disclaimer ? /* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex items-center", children: [
|
|
2797
|
+
expression ? /* @__PURE__ */ jsx(MascotFace, { expression, basePath, className: "w-10 max-w-none" }) : null,
|
|
2798
|
+
/* @__PURE__ */ jsx(Text, { variant: "label", tone: "muted", as: "p", className: "font-normal", children: disclaimer })
|
|
2799
|
+
] }) : null
|
|
2883
2800
|
] }),
|
|
2884
|
-
|
|
2885
|
-
error ? /* @__PURE__ */ jsx(Alert, { id: `${id}-aviso`, variant: "error", enfasis: "fuerte", children: errorMessage }) : null,
|
|
2886
|
-
disclaimer ? /* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex items-center", children: [
|
|
2887
|
-
expresion ? /* @__PURE__ */ jsx(CaraDeMascota, { expresion, basePath, className: "w-10 max-w-none" }) : null,
|
|
2888
|
-
/* @__PURE__ */ jsx(Text, { variant: "label", tone: "muted", as: "p", className: "font-normal", children: disclaimer })
|
|
2889
|
-
] }) : null
|
|
2801
|
+
aside ? /* @__PURE__ */ jsx("div", { className: "shrink-0 md:max-w-[42%]", children: aside }) : null
|
|
2890
2802
|
]
|
|
2891
2803
|
}
|
|
2892
2804
|
);
|
|
2893
2805
|
}
|
|
2894
|
-
var
|
|
2806
|
+
var header = cva("gap-step-sm flex flex-col", {
|
|
2895
2807
|
variants: {
|
|
2896
2808
|
size: {
|
|
2897
2809
|
display: "py-section",
|
|
@@ -2910,7 +2822,7 @@ function PageHeader({
|
|
|
2910
2822
|
className,
|
|
2911
2823
|
...props
|
|
2912
2824
|
}) {
|
|
2913
|
-
return /* @__PURE__ */ jsxs("header", { className: cn(
|
|
2825
|
+
return /* @__PURE__ */ jsxs("header", { className: cn(header({ size: size2 }), className), ...props, children: [
|
|
2914
2826
|
eyebrow ? /* @__PURE__ */ jsx(Text, { variant: "eyebrow", tone: "accent", as: "p", children: eyebrow }) : null,
|
|
2915
2827
|
/* @__PURE__ */ jsx(Text, { as, variant: size2 === "display" ? "display" : "h1", className: "max-w-measure", children: title }),
|
|
2916
2828
|
description ? /* @__PURE__ */ jsx(Text, { variant: "body", tone: "secondary", children: description }) : null,
|
|
@@ -2924,33 +2836,33 @@ function ScrollingProgressBar({
|
|
|
2924
2836
|
className,
|
|
2925
2837
|
...props
|
|
2926
2838
|
}) {
|
|
2927
|
-
const [
|
|
2928
|
-
const
|
|
2839
|
+
const [seek, setAvance] = useState(0);
|
|
2840
|
+
const pendingOne = useRef(0);
|
|
2929
2841
|
useEffect(() => {
|
|
2930
|
-
const
|
|
2931
|
-
|
|
2932
|
-
const
|
|
2933
|
-
const
|
|
2934
|
-
const
|
|
2935
|
-
const
|
|
2936
|
-
if (
|
|
2937
|
-
setAvance(scrollY >=
|
|
2842
|
+
const measure = () => {
|
|
2843
|
+
pendingOne.current = 0;
|
|
2844
|
+
const element = target?.current;
|
|
2845
|
+
const start = element ? element.getBoundingClientRect().top + scrollY : 0;
|
|
2846
|
+
const height = element ? element.offsetHeight : document.documentElement.scrollHeight;
|
|
2847
|
+
const walkable = height - innerHeight;
|
|
2848
|
+
if (walkable <= 0) {
|
|
2849
|
+
setAvance(scrollY >= start ? 100 : 0);
|
|
2938
2850
|
return;
|
|
2939
2851
|
}
|
|
2940
|
-
const
|
|
2941
|
-
setAvance(Math.min(100, Math.max(0,
|
|
2852
|
+
const walk = scrollY - start;
|
|
2853
|
+
setAvance(Math.min(100, Math.max(0, walk / walkable * 100)));
|
|
2942
2854
|
};
|
|
2943
|
-
const
|
|
2944
|
-
if (
|
|
2945
|
-
|
|
2855
|
+
const onMove = () => {
|
|
2856
|
+
if (pendingOne.current) return;
|
|
2857
|
+
pendingOne.current = requestAnimationFrame(measure);
|
|
2946
2858
|
};
|
|
2947
|
-
|
|
2948
|
-
addEventListener("scroll",
|
|
2949
|
-
addEventListener("resize",
|
|
2859
|
+
measure();
|
|
2860
|
+
addEventListener("scroll", onMove, { passive: true });
|
|
2861
|
+
addEventListener("resize", onMove);
|
|
2950
2862
|
return () => {
|
|
2951
|
-
if (
|
|
2952
|
-
removeEventListener("scroll",
|
|
2953
|
-
removeEventListener("resize",
|
|
2863
|
+
if (pendingOne.current) cancelAnimationFrame(pendingOne.current);
|
|
2864
|
+
removeEventListener("scroll", onMove);
|
|
2865
|
+
removeEventListener("resize", onMove);
|
|
2954
2866
|
};
|
|
2955
2867
|
}, [target]);
|
|
2956
2868
|
return /* @__PURE__ */ jsx(
|
|
@@ -2967,7 +2879,7 @@ function ScrollingProgressBar({
|
|
|
2967
2879
|
"div",
|
|
2968
2880
|
{
|
|
2969
2881
|
className: cn("h-full", tone === "warm" ? "bg-warm" : "bg-accent"),
|
|
2970
|
-
style: { width: `${
|
|
2882
|
+
style: { width: `${seek}%` }
|
|
2971
2883
|
}
|
|
2972
2884
|
)
|
|
2973
2885
|
}
|
|
@@ -2981,20 +2893,21 @@ function SidebarItem({
|
|
|
2981
2893
|
children,
|
|
2982
2894
|
...props
|
|
2983
2895
|
}) {
|
|
2984
|
-
const
|
|
2896
|
+
const Root17 = asChild ? Slot : "a";
|
|
2985
2897
|
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
|
|
2986
|
-
|
|
2898
|
+
Root17,
|
|
2987
2899
|
{
|
|
2988
2900
|
"aria-current": active ? "page" : void 0,
|
|
2989
2901
|
className: cn(
|
|
2990
2902
|
"rounded-chip px-step-sm gap-step-xs flex cursor-pointer items-center py-1.5",
|
|
2991
2903
|
"font-mono text-meta transition-standard",
|
|
2992
2904
|
"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
|
|
2993
|
-
//
|
|
2994
|
-
// `TabsTrigger`.
|
|
2995
|
-
//
|
|
2996
|
-
// surfaceRaised
|
|
2997
|
-
//
|
|
2905
|
+
// The active item is `surfaceRaised` with primary ink, same as
|
|
2906
|
+
// `TabsTrigger`. NOT biolume: `tokens.ts` says so explicitly — light
|
|
2907
|
+
// accent passes over background and over surface, but over
|
|
2908
|
+
// surfaceRaised it measures 4.2 and is not a text color there. The
|
|
2909
|
+
// accent stays on the `▸`, which is decorative and gets the 3:1
|
|
2910
|
+
// threshold.
|
|
2998
2911
|
active ? "bg-surface-raised text-text-primary" : "text-text-secondary hover:text-text-primary hover:bg-surface-raised",
|
|
2999
2912
|
className
|
|
3000
2913
|
),
|
|
@@ -3015,7 +2928,7 @@ function SidebarNav({
|
|
|
3015
2928
|
className,
|
|
3016
2929
|
...props
|
|
3017
2930
|
}) {
|
|
3018
|
-
const
|
|
2931
|
+
const footer = [version, branch].filter(Boolean);
|
|
3019
2932
|
return /* @__PURE__ */ jsxs(
|
|
3020
2933
|
"nav",
|
|
3021
2934
|
{
|
|
@@ -3028,7 +2941,7 @@ function SidebarNav({
|
|
|
3028
2941
|
children: [
|
|
3029
2942
|
title ? /* @__PURE__ */ jsx(Text, { variant: "eyebrow", tone: "muted", as: "p", className: "px-step-sm", children: title }) : null,
|
|
3030
2943
|
/* @__PURE__ */ jsx("ul", { className: "gap-0.5 flex flex-1 flex-col", children }),
|
|
3031
|
-
|
|
2944
|
+
footer.length > 0 ? /* @__PURE__ */ jsx(Text, { variant: "meta", tone: "muted", as: "p", className: "border-hairline px-step-sm pt-step-sm border-t", children: footer.map((p, i) => /* @__PURE__ */ jsxs("span", { children: [
|
|
3032
2945
|
i > 0 ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: " \xB7 " }) : null,
|
|
3033
2946
|
p
|
|
3034
2947
|
] }, i)) }) : null
|
|
@@ -3046,12 +2959,12 @@ function Stat({
|
|
|
3046
2959
|
className,
|
|
3047
2960
|
...props
|
|
3048
2961
|
}) {
|
|
3049
|
-
return /* @__PURE__ */ jsxs("div", { className: cn(
|
|
2962
|
+
return /* @__PURE__ */ jsxs("div", { className: cn(CARD_SURFACE, "p-step-lg gap-step-xs flex flex-col", className), ...props, children: [
|
|
3050
2963
|
/* @__PURE__ */ jsxs(Text, { variant: "eyebrow", tone: "muted", as: "p", className: "gap-step-xs flex items-center", children: [
|
|
3051
2964
|
icon ? (
|
|
3052
|
-
// `aria-hidden`
|
|
3053
|
-
//
|
|
3054
|
-
//
|
|
2965
|
+
// `aria-hidden` is not needed: the system's glyphs already carry it.
|
|
2966
|
+
// What IS needed is that it does not shrink next to a long title,
|
|
2967
|
+
// because a squashed icon reads as a different icon.
|
|
3055
2968
|
/* @__PURE__ */ jsx("span", { className: "shrink-0", children: icon })
|
|
3056
2969
|
) : null,
|
|
3057
2970
|
label
|
|
@@ -3077,28 +2990,58 @@ function TalkCard({
|
|
|
3077
2990
|
location,
|
|
3078
2991
|
status,
|
|
3079
2992
|
description,
|
|
2993
|
+
resources,
|
|
3080
2994
|
className,
|
|
3081
2995
|
...props
|
|
3082
2996
|
}) {
|
|
3083
|
-
const
|
|
3084
|
-
date ? /* @__PURE__ */ jsx("time", { dateTime, children: date }, "
|
|
3085
|
-
location ? /* @__PURE__ */ jsx("span", { children: location }, "
|
|
2997
|
+
const footer = [
|
|
2998
|
+
date ? /* @__PURE__ */ jsx("time", { dateTime, children: date }, "date") : null,
|
|
2999
|
+
location ? /* @__PURE__ */ jsx("span", { children: location }, "location") : null
|
|
3086
3000
|
].filter(Boolean);
|
|
3087
|
-
|
|
3001
|
+
const body = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
3088
3002
|
/* @__PURE__ */ jsxs("div", { className: "gap-step-sm flex items-start justify-between", children: [
|
|
3089
3003
|
/* @__PURE__ */ jsx(Text, { variant: "eyebrow", tone: "accent", as: "p", children: event }),
|
|
3090
3004
|
status ? /* @__PURE__ */ jsx(Badge, { variant: "neutral", children: status }) : null
|
|
3091
3005
|
] }),
|
|
3092
|
-
/* @__PURE__ */ jsx(
|
|
3006
|
+
/* @__PURE__ */ jsx(
|
|
3007
|
+
Text,
|
|
3008
|
+
{
|
|
3009
|
+
as: "h3",
|
|
3010
|
+
variant: "h3",
|
|
3011
|
+
className: cn(!resources && "group-hover:text-accent transition-standard"),
|
|
3012
|
+
children: title
|
|
3013
|
+
}
|
|
3014
|
+
),
|
|
3093
3015
|
description ? /* @__PURE__ */ jsx(Text, { variant: "ui", tone: "secondary", className: "line-clamp-2", children: description }) : null,
|
|
3094
|
-
|
|
3095
|
-
|
|
3096
|
-
|
|
3097
|
-
|
|
3098
|
-
|
|
3016
|
+
footer.length > 0 ? /* @__PURE__ */ jsx(
|
|
3017
|
+
Text,
|
|
3018
|
+
{
|
|
3019
|
+
variant: "label",
|
|
3020
|
+
tone: "muted",
|
|
3021
|
+
as: "p",
|
|
3022
|
+
className: cn("gap-step-xs flex items-center pt-step-sm", !resources && "mt-auto"),
|
|
3023
|
+
children: footer.map((m, i) => /* @__PURE__ */ jsxs("span", { className: "gap-step-xs flex items-center", children: [
|
|
3024
|
+
i > 0 ? /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }) : null,
|
|
3025
|
+
m
|
|
3026
|
+
] }, i))
|
|
3027
|
+
}
|
|
3028
|
+
) : null,
|
|
3029
|
+
resources ? /* @__PURE__ */ jsx("div", { className: "gap-step-md mt-auto flex flex-wrap items-center pt-step-sm", children: resources }) : null
|
|
3030
|
+
] });
|
|
3031
|
+
if (resources) {
|
|
3032
|
+
return /* @__PURE__ */ jsx(
|
|
3033
|
+
"article",
|
|
3034
|
+
{
|
|
3035
|
+
className: cn(CARD_SURFACE, "p-step-lg gap-step-sm flex h-full flex-col", className),
|
|
3036
|
+
...props,
|
|
3037
|
+
children: body
|
|
3038
|
+
}
|
|
3039
|
+
);
|
|
3040
|
+
}
|
|
3041
|
+
return /* @__PURE__ */ jsx(CardShell, { className: cn("p-step-lg", className), ...props, children: /* @__PURE__ */ jsx("article", { className: "gap-step-sm flex h-full flex-col", children: body }) });
|
|
3099
3042
|
}
|
|
3100
3043
|
function ThemeToggle({
|
|
3101
|
-
label = "Cambiar de
|
|
3044
|
+
label = "Cambiar de theme",
|
|
3102
3045
|
onThemeChange,
|
|
3103
3046
|
variant = "secondary",
|
|
3104
3047
|
size: size2 = "icon",
|
|
@@ -3113,20 +3056,20 @@ function ThemeToggle({
|
|
|
3113
3056
|
size: size2,
|
|
3114
3057
|
"aria-label": label,
|
|
3115
3058
|
className: cn("[&_svg]:size-[19px]", className),
|
|
3116
|
-
onClick: () => onThemeChange?.(
|
|
3059
|
+
onClick: () => onThemeChange?.(toggleTheme()),
|
|
3117
3060
|
...props,
|
|
3118
3061
|
children: [
|
|
3119
|
-
/* @__PURE__ */ jsx(
|
|
3120
|
-
/* @__PURE__ */ jsx(
|
|
3062
|
+
/* @__PURE__ */ jsx(Sun, { className: "light:hidden" }),
|
|
3063
|
+
/* @__PURE__ */ jsx(Moon, { className: "hidden light:block" })
|
|
3121
3064
|
]
|
|
3122
3065
|
}
|
|
3123
3066
|
);
|
|
3124
3067
|
}
|
|
3125
|
-
function
|
|
3126
|
-
return useSyncExternalStore(
|
|
3068
|
+
function useTheme() {
|
|
3069
|
+
return useSyncExternalStore(subscribe2, currentTheme, server);
|
|
3127
3070
|
}
|
|
3128
|
-
var
|
|
3129
|
-
var
|
|
3071
|
+
var subscribe2 = (warn) => watchTheme(() => warn());
|
|
3072
|
+
var server = () => "dark";
|
|
3130
3073
|
function TableOfContents({
|
|
3131
3074
|
items,
|
|
3132
3075
|
title = "En esta p\xE1gina",
|
|
@@ -3138,20 +3081,20 @@ function TableOfContents({
|
|
|
3138
3081
|
return /* @__PURE__ */ jsxs("nav", { "aria-label": typeof title === "string" ? title : "En esta p\xE1gina", className: cn("gap-step-sm flex flex-col", className), ...props, children: [
|
|
3139
3082
|
/* @__PURE__ */ jsx(Text, { variant: "eyebrow", tone: "muted", as: "p", children: title }),
|
|
3140
3083
|
/* @__PURE__ */ jsx("ul", { className: "border-hairline gap-step-xs flex flex-col border-l", children: items.map((item2) => {
|
|
3141
|
-
const
|
|
3142
|
-
const
|
|
3084
|
+
const active = item2.href === activeHref;
|
|
3085
|
+
const classes = cn(
|
|
3143
3086
|
"px-step-sm -ml-px block border-l",
|
|
3144
3087
|
"font-sans text-label transition-standard",
|
|
3145
3088
|
"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-accent",
|
|
3146
3089
|
"cursor-pointer",
|
|
3147
3090
|
item2.nested && "pl-step-lg",
|
|
3148
3091
|
"border-transparent text-text-secondary hover:text-text-primary",
|
|
3149
|
-
//
|
|
3150
|
-
//
|
|
3151
|
-
//
|
|
3092
|
+
// The active hover is declared with both variants together so it
|
|
3093
|
+
// beats the `hover:` above by specificity and not by the order
|
|
3094
|
+
// Tailwind happens to emit the rules in.
|
|
3152
3095
|
"aria-[current]:border-accent aria-[current]:text-accent aria-[current]:hover:text-accent"
|
|
3153
3096
|
);
|
|
3154
|
-
return /* @__PURE__ */ jsx("li", { children: linkAsChild ? /* @__PURE__ */ jsx(Slot, { className:
|
|
3097
|
+
return /* @__PURE__ */ jsx("li", { children: linkAsChild ? /* @__PURE__ */ jsx(Slot, { className: classes, "aria-current": active ? "location" : void 0, children: linkAsChild({ href: item2.href, children: item2.label }) }) : /* @__PURE__ */ jsx("a", { href: item2.href, className: classes, "aria-current": active ? "location" : void 0, children: item2.label }) }, item2.href);
|
|
3155
3098
|
}) })
|
|
3156
3099
|
] });
|
|
3157
3100
|
}
|
|
@@ -3159,16 +3102,17 @@ function TableOfContents({
|
|
|
3159
3102
|
// src/lib/social.tsx
|
|
3160
3103
|
var social_exports = {};
|
|
3161
3104
|
__export(social_exports, {
|
|
3162
|
-
Correo: () => Correo,
|
|
3163
3105
|
Discord: () => Discord,
|
|
3106
|
+
Email: () => Email,
|
|
3164
3107
|
GitHub: () => GitHub,
|
|
3165
3108
|
Instagram: () => Instagram,
|
|
3166
3109
|
LinkedIn: () => LinkedIn,
|
|
3110
|
+
Newsletter: () => Newsletter,
|
|
3167
3111
|
Rss: () => Rss,
|
|
3168
3112
|
X: () => X,
|
|
3169
3113
|
YouTube: () => YouTube
|
|
3170
3114
|
});
|
|
3171
|
-
function
|
|
3115
|
+
function Brand({ children, ...props }) {
|
|
3172
3116
|
return /* @__PURE__ */ jsx(
|
|
3173
3117
|
"svg",
|
|
3174
3118
|
{
|
|
@@ -3183,7 +3127,7 @@ function Marca({ children, ...props }) {
|
|
|
3183
3127
|
}
|
|
3184
3128
|
);
|
|
3185
3129
|
}
|
|
3186
|
-
function
|
|
3130
|
+
function Functional({ children, ...props }) {
|
|
3187
3131
|
return /* @__PURE__ */ jsx(
|
|
3188
3132
|
"svg",
|
|
3189
3133
|
{
|
|
@@ -3202,19 +3146,23 @@ function Funcional({ children, ...props }) {
|
|
|
3202
3146
|
}
|
|
3203
3147
|
);
|
|
3204
3148
|
}
|
|
3205
|
-
var GitHub = (props) => /* @__PURE__ */ jsx(
|
|
3206
|
-
var LinkedIn = (props) => /* @__PURE__ */ jsx(
|
|
3207
|
-
var X = (props) => /* @__PURE__ */ jsx(
|
|
3208
|
-
var Instagram = (props) => /* @__PURE__ */ jsx(
|
|
3209
|
-
var Discord = (props) => /* @__PURE__ */ jsx(
|
|
3210
|
-
var YouTube = (props) => /* @__PURE__ */ jsx(
|
|
3211
|
-
var Rss = (props) => /* @__PURE__ */ jsxs(
|
|
3149
|
+
var GitHub = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M12 .5C5.73.5.5 5.73.5 12a11.5 11.5 0 0 0 7.86 10.91c.58.1.79-.25.79-.55 0-.27-.01-1.18-.02-2.14-3.2.7-3.88-1.36-3.88-1.36-.52-1.33-1.28-1.68-1.28-1.68-1.05-.72.08-.7.08-.7 1.16.08 1.77 1.19 1.77 1.19 1.03 1.77 2.7 1.26 3.36.96.1-.75.4-1.26.73-1.55-2.55-.29-5.24-1.28-5.24-5.69 0-1.26.45-2.29 1.19-3.09-.12-.29-.52-1.46.11-3.05 0 0 .97-.31 3.18 1.18a11 11 0 0 1 5.79 0c2.2-1.49 3.17-1.18 3.17-1.18.63 1.59.23 2.76.12 3.05.74.8 1.18 1.83 1.18 3.09 0 4.42-2.69 5.39-5.25 5.68.41.36.78 1.06.78 2.14 0 1.55-.01 2.79-.01 3.17 0 .3.2.66.79.55A11.5 11.5 0 0 0 23.5 12C23.5 5.73 18.27.5 12 .5Z" }) });
|
|
3150
|
+
var LinkedIn = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M4.98 3.5a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5ZM3 9h4v12H3V9Zm7 0h3.8v1.71h.05a4.17 4.17 0 0 1 3.75-2.06c4.01 0 4.75 2.64 4.75 6.07V21h-4v-5.4c0-1.29-.02-2.95-1.8-2.95-1.8 0-2.08 1.4-2.08 2.85V21h-3.97V9Z" }) });
|
|
3151
|
+
var X = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M17.53 3h3.06l-6.69 7.64L21.75 21h-6.16l-4.83-6.3L5.25 21H2.19l7.15-8.17L2.5 3h6.32l4.36 5.77L17.53 3Zm-1.07 16.17h1.7L7.62 4.74H5.8l10.66 14.43Z" }) });
|
|
3152
|
+
var Instagram = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M12 2.16c3.2 0 3.58.01 4.85.07 1.17.05 1.8.25 2.23.41.56.22.96.48 1.38.9.42.42.68.82.9 1.38.16.42.36 1.06.41 2.23.06 1.27.07 1.65.07 4.85s-.01 3.58-.07 4.85c-.05 1.17-.25 1.8-.41 2.23-.22.56-.48.96-.9 1.38-.42.42-.82.68-1.38.9-.42.16-1.06.36-2.23.41-1.27.06-1.65.07-4.85.07s-3.58-.01-4.85-.07c-1.17-.05-1.8-.25-2.23-.41-.56-.22-.96-.48-1.38-.9-.42-.42-.68-.82-.9-1.38-.16-.42-.36-1.06-.41-2.23C2.17 15.58 2.16 15.2 2.16 12s.01-3.58.07-4.85c.05-1.17.25-1.8.41-2.23.22-.56.48-.96.9-1.38.42-.42.82-.68 1.38-.9.42-.16 1.06-.36 2.23-.41C8.42 2.17 8.8 2.16 12 2.16Zm0 3.68a6.16 6.16 0 1 0 0 12.32 6.16 6.16 0 0 0 0-12.32Zm0 10.16a4 4 0 1 1 0-8 4 4 0 0 1 0 8Zm7.85-10.4a1.44 1.44 0 1 1-2.88 0 1.44 1.44 0 0 1 2.88 0Z" }) });
|
|
3153
|
+
var Discord = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M20.32 5.56A18.5 18.5 0 0 0 15.7 4.1a.07.07 0 0 0-.07.04c-.2.36-.42.82-.58 1.19a17 17 0 0 0-5.1 0c-.16-.38-.39-.83-.59-1.19a.07.07 0 0 0-.07-.04c-1.6.28-3.15.77-4.62 1.46a.06.06 0 0 0-.03.03C1.66 10 .9 14.28 1.28 18.5a.08.08 0 0 0 .03.05 18.6 18.6 0 0 0 5.6 2.84.07.07 0 0 0 .08-.03c.43-.59.81-1.21 1.14-1.86a.07.07 0 0 0-.04-.1c-.6-.23-1.18-.51-1.74-.83a.07.07 0 0 1-.01-.12l.35-.27a.07.07 0 0 1 .07-.01 13.3 13.3 0 0 0 11.3 0 .07.07 0 0 1 .08.01l.34.27c.04.04.04.1-.01.12-.55.33-1.13.6-1.74.83a.07.07 0 0 0-.04.1c.34.65.72 1.27 1.14 1.86a.07.07 0 0 0 .08.03 18.5 18.5 0 0 0 5.6-2.84.07.07 0 0 0 .04-.05c.45-4.88-.75-9.12-3.18-12.88a.06.06 0 0 0-.03-.03ZM8.4 15.93c-1.1 0-2.01-1.01-2.01-2.25 0-1.24.89-2.25 2.01-2.25 1.13 0 2.03 1.02 2.02 2.25 0 1.24-.9 2.25-2.02 2.25Zm7.22 0c-1.1 0-2.01-1.01-2.01-2.25 0-1.24.89-2.25 2.01-2.25 1.13 0 2.03 1.02 2.02 2.25 0 1.24-.89 2.25-2.02 2.25Z" }) });
|
|
3154
|
+
var YouTube = (props) => /* @__PURE__ */ jsx(Brand, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M23.5 6.9a3 3 0 0 0-2.12-2.12C19.5 4.27 12 4.27 12 4.27s-7.5 0-9.38.51A3 3 0 0 0 .5 6.9 31.3 31.3 0 0 0 0 12a31.3 31.3 0 0 0 .5 5.1 3 3 0 0 0 2.12 2.12c1.88.51 9.38.51 9.38.51s7.5 0 9.38-.51a3 3 0 0 0 2.12-2.12A31.3 31.3 0 0 0 24 12a31.3 31.3 0 0 0-.5-5.1ZM9.6 15.6V8.4l6.24 3.6-6.24 3.6Z" }) });
|
|
3155
|
+
var Rss = (props) => /* @__PURE__ */ jsxs(Functional, { ...props, children: [
|
|
3212
3156
|
/* @__PURE__ */ jsx("path", { d: "M4 11a9 9 0 0 1 9 9M4 4a16 16 0 0 1 16 16" }),
|
|
3213
3157
|
/* @__PURE__ */ jsx("circle", { cx: "5", cy: "19", r: "1.6", fill: "currentColor", stroke: "none" })
|
|
3214
3158
|
] });
|
|
3215
|
-
var
|
|
3159
|
+
var Email = (props) => /* @__PURE__ */ jsxs(Functional, { ...props, children: [
|
|
3216
3160
|
/* @__PURE__ */ jsx("rect", { x: "2.75", y: "4.75", width: "18.5", height: "14.5", rx: "2" }),
|
|
3217
3161
|
/* @__PURE__ */ jsx("path", { d: "m3.5 7.5 7.4 5.2a2 2 0 0 0 2.2 0l7.4-5.2" })
|
|
3218
3162
|
] });
|
|
3163
|
+
var Newsletter = (props) => /* @__PURE__ */ jsxs(Functional, { ...props, children: [
|
|
3164
|
+
/* @__PURE__ */ jsx("path", { d: "M18 8.5a6 6 0 1 0-12 0c0 5-2 6.5-2 6.5h16s-2-1.5-2-6.5" }),
|
|
3165
|
+
/* @__PURE__ */ jsx("path", { d: "M13.7 19a2 2 0 0 1-3.4 0" })
|
|
3166
|
+
] });
|
|
3219
3167
|
|
|
3220
|
-
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, ArticleCard, AudioPlayer, AuthorCard, Avatar, AvatarFallback, AvatarImage, AvatarUpload, Badge, Blockquote, Breadcrumb, Button, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CategoryBadge, Checkbox, Code, CodeBlock, CourseCard, DateField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EventCalendar, Footer, FooterLink,
|
|
3168
|
+
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, ArticleCard, AudioPlayer, AuthorCard, Avatar, AvatarFallback, AvatarImage, AvatarUpload, Badge, Blockquote, Breadcrumb, Button, Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CategoryBadge, Checkbox, Code, CodeBlock, CourseCard, DateField, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EventCalendar, Footer, FooterLink, Hero, Input, LinkRow, MetricBadge, Nav, NavItem, NewsletterForm, PageHeader, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, Progress, RadioGroup2 as RadioGroup, RadioGroupItem, ScrollingProgressBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Separator3 as Separator, Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, SidebarItem, SidebarNav, Skeleton, Stat, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableOfContents, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TalkCard, Textarea, ThemeToggle, ToastAction, Toaster, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, social_exports as social, toast2 as toast, useTheme };
|