@eduardoalvarez/arrecife 0.6.0 → 0.8.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 +112 -0
- package/README.md +288 -49
- package/dist/brand/index.cjs +2 -2
- package/dist/brand/index.js +3 -3
- package/dist/chart/index.cjs +129 -2
- package/dist/chart/index.d.cts +114 -4
- package/dist/chart/index.d.ts +114 -4
- package/dist/chart/index.js +129 -5
- package/dist/{chunk-PMN7NR3G.js → chunk-5A5GH2PF.js} +1 -1
- package/dist/{chunk-DKCN7BAL.js → chunk-6IGD5REB.js} +1 -1
- package/dist/{chunk-XKYHTOUJ.js → chunk-FAAGZG7A.js} +1 -1
- package/dist/{chunk-O4TAH7YJ.js → chunk-FGFNK72B.js} +29 -5
- package/dist/chunk-HOADZ6GS.js +72 -0
- package/dist/chunk-LXRGQKMG.js +145 -0
- package/dist/{chunk-6O3KWB6P.js → chunk-MPZBF2TZ.js} +2 -2
- package/dist/{chunk-JMOOFZ3B.js → chunk-TRPBID2W.js} +1 -1
- package/dist/{chunk-25YNFCIF.js → chunk-XXDATT3A.js} +6 -3
- package/dist/doctor.mjs +248 -0
- package/dist/form/index.cjs +2 -2
- package/dist/form/index.d.cts +1 -1
- package/dist/form/index.d.ts +1 -1
- package/dist/form/index.js +4 -4
- package/dist/icons/index.cjs +149 -0
- package/dist/icons/index.d.cts +94 -0
- package/dist/icons/index.d.ts +94 -0
- package/dist/icons/index.js +28 -0
- package/dist/index-BbRplw_B.d.cts +58 -0
- package/dist/index-BbRplw_B.d.ts +58 -0
- package/dist/index.cjs +425 -251
- package/dist/index.d.cts +303 -104
- package/dist/index.d.ts +303 -104
- package/dist/index.js +283 -285
- package/dist/{label-MgHFKnFy.d.ts → label-DJ4HuD-R.d.cts} +3 -2
- package/dist/{label-MgHFKnFy.d.cts → label-DJ4HuD-R.d.ts} +3 -2
- package/dist/og/index.cjs +3 -2
- package/dist/og/index.js +1 -1
- package/dist/shiki/index.js +1 -1
- package/dist/social/data.cjs +161 -0
- package/dist/social/data.d.cts +161 -0
- package/dist/social/data.d.ts +161 -0
- package/dist/social/data.js +2 -0
- package/dist/social/index.cjs +153 -0
- package/dist/social/index.d.cts +2 -0
- package/dist/social/index.d.ts +2 -0
- package/dist/social/index.js +3 -0
- package/dist/tokens/index.cjs +29 -5
- package/dist/tokens/index.d.cts +37 -10
- package/dist/tokens/index.d.ts +37 -10
- package/dist/tokens/index.js +2 -2
- package/dist/tokens/theme.css +79 -22
- package/dist/variants/index.cjs +6 -3
- package/dist/variants/index.d.cts +6 -3
- package/dist/variants/index.d.ts +6 -3
- package/dist/variants/index.js +1 -1
- package/llms.txt +530 -80
- package/package.json +29 -2
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ export { THEME_ATTRIBUTE, THEME_EVENT, THEME_KEY, ThemeOptions, applyTheme, curr
|
|
|
4
4
|
import { alertVariants as alert, avatarVariants as avatar, badgeVariants as badge, buttonVariants as button, textVariants as text } from './variants/index.js';
|
|
5
5
|
export { CARD, CARD_HOVER, CARD_SURFACE, categoryBadgeVariants, metricBadgeVariants } from './variants/index.js';
|
|
6
6
|
import * as react from 'react';
|
|
7
|
-
import { ComponentPropsWithoutRef, ReactNode, ComponentProps, RefObject
|
|
7
|
+
import { ComponentPropsWithoutRef, ReactNode, ComponentProps, RefObject } from 'react';
|
|
8
8
|
import * as AccordionPrimitive from '@radix-ui/react-accordion';
|
|
9
9
|
import { VariantProps } from 'class-variance-authority';
|
|
10
10
|
import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
|
|
@@ -13,7 +13,7 @@ import { DayPicker } from 'react-day-picker';
|
|
|
13
13
|
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
|
14
14
|
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
15
15
|
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
|
|
16
|
-
export { L as Label, a as LabelProps } from './label-
|
|
16
|
+
export { L as Label, a as LabelProps } from './label-DJ4HuD-R.js';
|
|
17
17
|
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
18
18
|
import * as ProgressPrimitive from '@radix-ui/react-progress';
|
|
19
19
|
import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
|
|
@@ -28,6 +28,7 @@ import { F as Face, P as Pose } from './catalog-D13txprv.js';
|
|
|
28
28
|
export { A as ASSETS_PATH, B as Background, a as Fin, f as faceList, b as faceUsage, c as faces, d as fins, p as poseList, e as poses } from './catalog-D13txprv.js';
|
|
29
29
|
export { Isotype, IsotypeProps, Logo, LogoProps, Mascot, MascotFace, MascotFaceProps, MascotProps } from './brand/index.js';
|
|
30
30
|
import { ClassValue } from 'clsx';
|
|
31
|
+
export { i as social } from './index-BbRplw_B.js';
|
|
31
32
|
import '@radix-ui/react-label';
|
|
32
33
|
|
|
33
34
|
/**
|
|
@@ -48,7 +49,7 @@ import '@radix-ui/react-label';
|
|
|
48
49
|
* `--ease-standard`, so it introduces neither a new timing nor a new curve.
|
|
49
50
|
* Whoever asked for less motion still sees the panel appear where it will stay.
|
|
50
51
|
*
|
|
51
|
-
* See `docs/decisions.md` § 20.
|
|
52
|
+
* See `docs/decisions/0.6.md` § 20.
|
|
52
53
|
*
|
|
53
54
|
* The chevron, by contrast, rotates with no transition: `transition-standard`
|
|
54
55
|
* only covers color and border, so `rotate` snaps even with the class in place.
|
|
@@ -111,7 +112,7 @@ declare function Alert({ className, variant, emphasis, title, icon, children, ..
|
|
|
111
112
|
* «Borrar el artículo», not «Aceptar».
|
|
112
113
|
*
|
|
113
114
|
* `destructive` is for the destructive button that has none of that around it:
|
|
114
|
-
* a table row, a toolbar. See `docs/decisions.md` § 21.
|
|
115
|
+
* a table row, a toolbar. See `docs/decisions/0.6.md` § 21.
|
|
115
116
|
*/
|
|
116
117
|
declare const AlertDialog: react.FC<AlertDialogPrimitive.AlertDialogProps>;
|
|
117
118
|
declare const AlertDialogTrigger: react.ForwardRefExoticComponent<AlertDialogPrimitive.AlertDialogTriggerProps & react.RefAttributes<HTMLButtonElement>>;
|
|
@@ -266,7 +267,8 @@ declare function Checkbox({ className, ...props }: CheckboxProps): react.JSX.Ele
|
|
|
266
267
|
type CodeProps = ComponentPropsWithoutRef<'code'>;
|
|
267
268
|
declare function Code({ className, ...props }: CodeProps): react.JSX.Element;
|
|
268
269
|
|
|
269
|
-
|
|
270
|
+
/** `ComponentProps` carries `ref`, which React 19 passes as a prop. See `InputProps`. */
|
|
271
|
+
type DateFieldProps = Omit<ComponentProps<'input'>, 'type'> & {
|
|
270
272
|
invalid?: boolean | undefined;
|
|
271
273
|
/** Adds the time to the field. It is the native `datetime-local`. */
|
|
272
274
|
withTime?: boolean | undefined;
|
|
@@ -315,7 +317,29 @@ declare function DropdownMenuSeparator({ className, ...props }: ComponentPropsWi
|
|
|
315
317
|
declare function DropdownMenuSubTrigger({ className, children, ...props }: ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger>): react.JSX.Element;
|
|
316
318
|
declare function DropdownMenuSubContent({ className, ...props }: ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>): react.JSX.Element;
|
|
317
319
|
|
|
318
|
-
|
|
320
|
+
/**
|
|
321
|
+
* `ComponentProps` and not `ComponentPropsWithoutRef`, and the difference is a
|
|
322
|
+
* bug and not a preference.
|
|
323
|
+
*
|
|
324
|
+
* `WithoutRef` is what React 18 required: `ref` was not a prop there, it arrived
|
|
325
|
+
* through `forwardRef`, and a type that included it promised something the
|
|
326
|
+
* component could not deliver. React 19 passes `ref` as an ordinary prop, so the
|
|
327
|
+
* `...props` spread below already forwards it — the type was the only thing
|
|
328
|
+
* still saying otherwise. It WORKED at runtime and failed at `tsc` with
|
|
329
|
+
* «Property 'ref' does not exist», which is the worst half of the two: the
|
|
330
|
+
* escape route is a cast or a wrapper element, and both are detours around a
|
|
331
|
+
* type rather than around a behaviour.
|
|
332
|
+
*
|
|
333
|
+
* `blog-content-manager` took the second one — its Giphy dialog focuses the
|
|
334
|
+
* search field 50 ms after opening, because Radix claims focus first, and it had
|
|
335
|
+
* to take the `ref` on the wrapping `div` and reach the input with a
|
|
336
|
+
* `querySelector`.
|
|
337
|
+
*
|
|
338
|
+
* The same applies to every primitive that wraps a native control you can focus:
|
|
339
|
+
* `Textarea`, `Label` and `DateField` change with it. See `docs/decisions/`
|
|
340
|
+
* § 41.
|
|
341
|
+
*/
|
|
342
|
+
type InputProps = ComponentProps<'input'> & {
|
|
319
343
|
/** Marks the control as invalid and tints the border. */
|
|
320
344
|
invalid?: boolean;
|
|
321
345
|
};
|
|
@@ -446,7 +470,50 @@ type SwitchProps = ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>;
|
|
|
446
470
|
*/
|
|
447
471
|
declare function Switch({ className, ...props }: SwitchProps): react.JSX.Element;
|
|
448
472
|
|
|
449
|
-
/**
|
|
473
|
+
/**
|
|
474
|
+
* The table, and the surface it sits on. The two are one piece.
|
|
475
|
+
*
|
|
476
|
+
* The container has always scrolled horizontally so the PAGE never does. What it
|
|
477
|
+
* did not carry was a shape, and that turned out to be the same omission twice:
|
|
478
|
+
* `TableRow` tints a `<tr>` on hover, a `<tr>` is a rectangle, and nothing
|
|
479
|
+
* clipped it — so every project wrapped the table in its own `rounded-xl border`
|
|
480
|
+
* and the hover of the header row and of the last row spilled out through the
|
|
481
|
+
* rounded corner. The fix from outside is `overflow-hidden` on that wrapper, and
|
|
482
|
+
* it worked exactly as far as somebody remembering it: five tables in `cursos`
|
|
483
|
+
* had it and the nine in `blog-content-manager` did not.
|
|
484
|
+
*
|
|
485
|
+
* So the surface comes with the table. `rounded-card` and `border-hairline` are
|
|
486
|
+
* the same two the system already gives a card — a table IS a panel of content,
|
|
487
|
+
* not a bare grid — and the clip comes free with the scroll: an element with
|
|
488
|
+
* `overflow-x: auto` clips its content to the border box, corners included. The
|
|
489
|
+
* hover cannot spill because there is nowhere left to spill to, and fourteen
|
|
490
|
+
* copies of the same `div` stop existing.
|
|
491
|
+
*
|
|
492
|
+
* There is NO background token on it, and that is not an oversight: `TableRow`'s
|
|
493
|
+
* hover is `bg-surface`, so painting the container `surface` too would make the
|
|
494
|
+
* hover invisible. The table sits on the page and the row lifts off it, which is
|
|
495
|
+
* the direction the tint was written for.
|
|
496
|
+
*
|
|
497
|
+
* `className` reaches the `<table>` and not the container, which is the trap
|
|
498
|
+
* `Nav`'s `size` documents: a `rounded-none` passed from the call site does
|
|
499
|
+
* nothing, silently. There is one shape on purpose — fourteen call sites wanted
|
|
500
|
+
* the same one — and a second gets a prop when a second consumer exists, not
|
|
501
|
+
* before. See `docs/decisions/0.8.md` § 39.
|
|
502
|
+
*
|
|
503
|
+
* THE `tabIndex` IS NOT DECORATION and it is not new behaviour dressed up as
|
|
504
|
+
* markup. A region you can pan with a mouse has to be reachable with a keyboard
|
|
505
|
+
* — WCAG 2.1.1 — and a table of text contains nothing focusable to land on, so
|
|
506
|
+
* without it a keyboard user simply cannot read the columns that are off screen.
|
|
507
|
+
* It has been true since the container started scrolling; it went unseen because
|
|
508
|
+
* no story had more columns than width, and the first one that did failed axe on
|
|
509
|
+
* `scrollable-region-focusable` at once.
|
|
510
|
+
*
|
|
511
|
+
* It is unconditional because the alternative is worse. Whether the table
|
|
512
|
+
* overflows depends on the viewport, so the only way to set this correctly at
|
|
513
|
+
* render is to measure in an effect and re-measure on resize — a ResizeObserver
|
|
514
|
+
* on every table in the system to avoid a tab stop. A stop that scrolls nothing
|
|
515
|
+
* is a small cost; a region a keyboard cannot reach is content that is not there.
|
|
516
|
+
*/
|
|
450
517
|
declare function Table({ className, ...props }: ComponentPropsWithoutRef<'table'>): react.JSX.Element;
|
|
451
518
|
declare function TableHeader({ className, ...props }: ComponentPropsWithoutRef<'thead'>): react.JSX.Element;
|
|
452
519
|
declare function TableBody({ className, ...props }: ComponentPropsWithoutRef<'tbody'>): react.JSX.Element;
|
|
@@ -454,6 +521,15 @@ declare function TableFooter({ className, ...props }: ComponentPropsWithoutRef<'
|
|
|
454
521
|
declare function TableRow({ className, ...props }: ComponentPropsWithoutRef<'tr'>): react.JSX.Element;
|
|
455
522
|
declare function TableHead({ className, ...props }: ComponentPropsWithoutRef<'th'>): react.JSX.Element;
|
|
456
523
|
declare function TableCell({ className, ...props }: ComponentPropsWithoutRef<'td'>): react.JSX.Element;
|
|
524
|
+
/**
|
|
525
|
+
* The caption, at the bottom and INSIDE the surface.
|
|
526
|
+
*
|
|
527
|
+
* It carries its own horizontal padding, which the cells get from `px-step-sm`
|
|
528
|
+
* and it used to get from nobody: with no border drawn around the table it read
|
|
529
|
+
* as a line under a grid, and with one it would sit flush against the left edge.
|
|
530
|
+
* The bottom padding is the same reasoning — a caption touching the border below
|
|
531
|
+
* it reads as an overflow, not as a caption.
|
|
532
|
+
*/
|
|
457
533
|
declare function TableCaption({ className, ...props }: ComponentPropsWithoutRef<'caption'>): react.JSX.Element;
|
|
458
534
|
|
|
459
535
|
type TabsProps = ComponentPropsWithoutRef<typeof TabsPrimitive.Root>;
|
|
@@ -462,7 +538,8 @@ declare function TabsList({ className, ...props }: ComponentPropsWithoutRef<type
|
|
|
462
538
|
declare function TabsTrigger({ className, ...props }: ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>): react.JSX.Element;
|
|
463
539
|
declare function TabsContent({ className, ...props }: ComponentPropsWithoutRef<typeof TabsPrimitive.Content>): react.JSX.Element;
|
|
464
540
|
|
|
465
|
-
|
|
541
|
+
/** `ComponentProps` carries `ref`, which React 19 passes as a prop. See `InputProps`. */
|
|
542
|
+
type TextareaProps = ComponentProps<'textarea'> & {
|
|
466
543
|
invalid?: boolean;
|
|
467
544
|
};
|
|
468
545
|
declare function Textarea({ className, invalid, ...props }: TextareaProps): react.JSX.Element;
|
|
@@ -571,7 +648,7 @@ type CardShellProps = ComponentPropsWithoutRef<'a'> & {
|
|
|
571
648
|
children: ReactNode;
|
|
572
649
|
};
|
|
573
650
|
|
|
574
|
-
type ArticleCardProps = Omit<CardShellProps,
|
|
651
|
+
type ArticleCardProps = Omit<CardShellProps, "children" | "title"> & {
|
|
575
652
|
title: ReactNode;
|
|
576
653
|
/** Standfirst. Clamped to two lines so the grid does not fall out of line. */
|
|
577
654
|
excerpt?: ReactNode;
|
|
@@ -616,8 +693,8 @@ type ArticleCardProps = Omit<CardShellProps, 'children' | 'title'> & {
|
|
|
616
693
|
}) => ReactNode) | undefined;
|
|
617
694
|
};
|
|
618
695
|
/**
|
|
619
|
-
* The metadata line uses `meta` and not `eyebrow`: `18 ago 2026 · 8 min de
|
|
620
|
-
*
|
|
696
|
+
* The metadata line uses `meta` and not `eyebrow`: `18 ago 2026 · 8 min de lectura`
|
|
697
|
+
* is a datum, not an overline, and in small caps it was neither.
|
|
621
698
|
*
|
|
622
699
|
* The tags are the CATEGORY family — a lowercase sand pill — not the status one.
|
|
623
700
|
* A slug is something you read as `engineering-culture`.
|
|
@@ -778,23 +855,50 @@ declare function CourseCard({ title, summary, meta, status, progress, className,
|
|
|
778
855
|
* not exist, so the rule lived in a comment about a ghost component. Once the
|
|
779
856
|
* brand story started repeating the sentence, it was also a published promise.
|
|
780
857
|
*
|
|
781
|
-
* `
|
|
782
|
-
* half the component. It is the only
|
|
783
|
-
*
|
|
784
|
-
* a face may appear.
|
|
858
|
+
* `page` keeps that rule intact and `expression` stays MANDATORY there: an empty
|
|
859
|
+
* state that IS the screen without a face is half the component. It is the only
|
|
860
|
+
* place, alongside the 404, the server error, course progress, celebration, the
|
|
861
|
+
* toast and the newsletter's «sin spam», where a face may appear.
|
|
862
|
+
*
|
|
863
|
+
* `inline` is the other situation, and it is a different one rather than a
|
|
864
|
+
* smaller one: the hole inside a table page or a dashboard widget, competing with
|
|
865
|
+
* a dozen elements around it. An admin panel has twenty of those on one screen,
|
|
866
|
+
* and twenty faces is not the humour contract, it is a zoo. The variant carries
|
|
867
|
+
* no face, and the type does not let one through. See `docs/decisions/0.7.md` § 27.
|
|
785
868
|
*/
|
|
786
|
-
type
|
|
787
|
-
/** The face. Mandatory: without it this is a centred paragraph. */
|
|
788
|
-
expression: Face;
|
|
869
|
+
type EmptyStateBase = Omit<ComponentPropsWithoutRef<'div'>, 'title'> & {
|
|
789
870
|
title: ReactNode;
|
|
790
871
|
/** One line explaining what is missing or what to do. */
|
|
791
872
|
description?: ReactNode;
|
|
792
873
|
/** The action that gets you out of the empty state. Usually a tertiary button. */
|
|
793
874
|
action?: ReactNode;
|
|
875
|
+
};
|
|
876
|
+
type EmptyStateProps = EmptyStateBase & ({
|
|
877
|
+
/** `page`, the default: the empty state IS the screen or the section, and it carries the face. */
|
|
878
|
+
variant?: 'page' | undefined;
|
|
879
|
+
/**
|
|
880
|
+
* The face. Mandatory on `page` and impossible on `inline` — the props
|
|
881
|
+
* are a union, so the generated table cannot show a per-variant «req.»
|
|
882
|
+
* and the sentence has to carry it. Without it, `page` is a centred
|
|
883
|
+
* paragraph.
|
|
884
|
+
*/
|
|
885
|
+
expression: Face;
|
|
794
886
|
/** Where the brand PNGs are served from. */
|
|
795
887
|
basePath?: string | undefined;
|
|
796
|
-
|
|
797
|
-
|
|
888
|
+
icon?: never;
|
|
889
|
+
} | {
|
|
890
|
+
/** `inline`: the hole inside a table or a widget. No face, and no way to pass one. */
|
|
891
|
+
variant: 'inline';
|
|
892
|
+
/**
|
|
893
|
+
* A glyph above the line. It measures 1em and inherits `currentColor`,
|
|
894
|
+
* like `Stat`'s: the project passes its own and sizes it, because the
|
|
895
|
+
* system has no icon library and is not getting one.
|
|
896
|
+
*/
|
|
897
|
+
icon?: ReactNode;
|
|
898
|
+
expression?: never;
|
|
899
|
+
basePath?: never;
|
|
900
|
+
});
|
|
901
|
+
declare function EmptyState(props: EmptyStateProps): react.JSX.Element;
|
|
798
902
|
|
|
799
903
|
/**
|
|
800
904
|
* The calendar with events: seeing them, creating, editing and deleting them.
|
|
@@ -854,10 +958,23 @@ declare function EventCalendar({ events, onCreateEvent, onUpdateEvent, onDeleteE
|
|
|
854
958
|
* improvement: it is the only thing that makes them legible. Which is why it is
|
|
855
959
|
* mandatory in the type and not an optional prop that gets forgotten.
|
|
856
960
|
*
|
|
857
|
-
*
|
|
858
|
-
*
|
|
859
|
-
* footer
|
|
860
|
-
*
|
|
961
|
+
* IT HAS TWO SHAPES, and the one that already existed is the one you get by
|
|
962
|
+
* passing nothing. That is not a courtesy: of the three projects that draw a
|
|
963
|
+
* footer, two want what was already there — `eduardoalvarez.dev` in 56 lines and
|
|
964
|
+
* `links` in a 64-line Astro replica — and only `cursos` wanted more. Changing
|
|
965
|
+
* the default would have broken the two that work to serve the one that did not.
|
|
966
|
+
*
|
|
967
|
+
* It is the third time the system answers «one component, two shapes» and the
|
|
968
|
+
* answer has not moved: `EmptyState` is a discriminated union where `page` is
|
|
969
|
+
* the default and `inline` cannot be handed a face; `Nav` takes a `size` where
|
|
970
|
+
* `default` is the bar it always was. Both left what was written before exactly
|
|
971
|
+
* where it was. See `docs/decisions/0.8.md` § 44.
|
|
972
|
+
*
|
|
973
|
+
* The union is what holds the rule up. `columns`, `description` and `action`
|
|
974
|
+
* exist only on `full`, and the default form cannot be handed one. As loose
|
|
975
|
+
* optional props they would compose into a third shape that nobody designed and
|
|
976
|
+
* nothing describes — a footer with columns and no description, or with a
|
|
977
|
+
* description and no columns, laid out by whichever branch happened to run.
|
|
861
978
|
*/
|
|
862
979
|
type SocialLink = {
|
|
863
980
|
/** What replaces the visible text. Mandatory. */
|
|
@@ -869,12 +986,40 @@ type SocialLink = {
|
|
|
869
986
|
*/
|
|
870
987
|
icon: ReactNode;
|
|
871
988
|
};
|
|
872
|
-
|
|
989
|
+
/** One link in a column of the full footer. */
|
|
990
|
+
type FooterColumnLink = {
|
|
991
|
+
label: ReactNode;
|
|
992
|
+
href: string;
|
|
993
|
+
/** Opens in a new tab, with the `rel` that has to go with it. */
|
|
994
|
+
external?: boolean | undefined;
|
|
995
|
+
};
|
|
996
|
+
/**
|
|
997
|
+
* A column of the full footer: a mono heading in small caps and its links.
|
|
998
|
+
*
|
|
999
|
+
* The columns are not decoration and they are not a sitemap. Two of the three in
|
|
1000
|
+
* `cursos` change with who is looking — «Administración» with panel and metrics
|
|
1001
|
+
* for an admin, «Cuenta» with my courses and my diplomas for everybody else —
|
|
1002
|
+
* and a flat row of nine links cannot express that. Which is why this is data
|
|
1003
|
+
* the project builds and not a `children` the library walks.
|
|
1004
|
+
*/
|
|
1005
|
+
type FooterColumn = {
|
|
1006
|
+
title: string;
|
|
1007
|
+
links: readonly FooterColumnLink[];
|
|
1008
|
+
};
|
|
1009
|
+
/**
|
|
1010
|
+
* `children` is OMITTED, and it is the point of the type rather than an
|
|
1011
|
+
* oversight.
|
|
1012
|
+
*
|
|
1013
|
+
* The footer used to take a row of loose text links this way — `./rss`,
|
|
1014
|
+
* `./aviso-legal` — and that row is what `variant="full"`'s columns replace. A
|
|
1015
|
+
* flat row cannot say which block a link belongs to, cannot carry a heading a
|
|
1016
|
+
* screen reader can jump to, and made whoever wrote the label type the `./`
|
|
1017
|
+
* themselves, which the columns put there. See docs/decisions/0.8.md § 47.
|
|
1018
|
+
*/
|
|
1019
|
+
type FooterBase = Omit<ComponentPropsWithoutRef<'footer'>, 'children'> & {
|
|
873
1020
|
social?: readonly SocialLink[];
|
|
874
1021
|
/** The signature's year. */
|
|
875
1022
|
year?: number;
|
|
876
|
-
/** Text links: legal notice, RSS, sitemap. */
|
|
877
|
-
children?: ReactNode;
|
|
878
1023
|
/**
|
|
879
1024
|
* The brand row: the fin and the wordmark, at the very top.
|
|
880
1025
|
*
|
|
@@ -884,12 +1029,51 @@ type FooterProps = ComponentPropsWithoutRef<'footer'> & {
|
|
|
884
1029
|
* type.
|
|
885
1030
|
*/
|
|
886
1031
|
brand?: ReactNode;
|
|
1032
|
+
/**
|
|
1033
|
+
* Makes the domain inside the signature a link, keeping the `$`, the path and
|
|
1034
|
+
* the prompt's mark as text.
|
|
1035
|
+
*
|
|
1036
|
+
* Only the domain: linking the whole line would turn a prompt into a button
|
|
1037
|
+
* and put `cd ~/` inside the accessible name of the link. Without it the
|
|
1038
|
+
* signature is text, which is what it has always been.
|
|
1039
|
+
*/
|
|
1040
|
+
signatureHref?: string | undefined;
|
|
887
1041
|
};
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
1042
|
+
type FooterProps = FooterBase & ({
|
|
1043
|
+
/** The shape the library has always had: stacked rows and the signature at the top right. */
|
|
1044
|
+
variant?: 'default' | undefined;
|
|
1045
|
+
columns?: never;
|
|
1046
|
+
description?: never;
|
|
1047
|
+
action?: never;
|
|
1048
|
+
linkAsChild?: never;
|
|
1049
|
+
} | {
|
|
1050
|
+
/** `full`: brand and description on the left, link columns on the right, signature closing it. */
|
|
1051
|
+
variant: 'full';
|
|
1052
|
+
/** The link columns. Mandatory: without them `full` is the default form with extra steps. */
|
|
1053
|
+
columns: readonly FooterColumn[];
|
|
1054
|
+
/** One line under the brand, saying what the site is. */
|
|
1055
|
+
description?: ReactNode;
|
|
1056
|
+
/** An action under the row of icons — «Reportar un problema». Usually a tertiary button. */
|
|
1057
|
+
action?: ReactNode;
|
|
1058
|
+
/**
|
|
1059
|
+
* Renders the column links through the child, to plug in the framework's
|
|
1060
|
+
* `Link`. It receives each `href` in the Slot's `props`.
|
|
1061
|
+
*
|
|
1062
|
+
* It is § 24's rule applied where it now bites: a column turns data into
|
|
1063
|
+
* markup, so without a slot the only way to reach one of those links
|
|
1064
|
+
* from a project is to select it by structure or by a style class, and
|
|
1065
|
+
* neither is a contract. `Breadcrumb` and `ArticleCard` have the same
|
|
1066
|
+
* signature on purpose.
|
|
1067
|
+
*
|
|
1068
|
+
* It is also what a client-side transition needs: `cursos` reached for
|
|
1069
|
+
* it the moment its columns stopped being `<a>` tags.
|
|
1070
|
+
*/
|
|
1071
|
+
linkAsChild?: ((props: {
|
|
1072
|
+
href: string;
|
|
1073
|
+
children: ReactNode;
|
|
1074
|
+
}) => ReactNode) | undefined;
|
|
1075
|
+
});
|
|
1076
|
+
declare function Footer({ variant, columns, description, action, linkAsChild, social, brand, year, signatureHref, className, ...rest }: FooterProps): react.JSX.Element;
|
|
893
1077
|
|
|
894
1078
|
/**
|
|
895
1079
|
* ONE per site. It is the only piece in the system that is spent like the
|
|
@@ -950,7 +1134,8 @@ type LinkRowProps = Omit<CardShellProps, 'children'> & {
|
|
|
950
1134
|
declare function LinkRow({ name, description, icon, external, className, ...props }: LinkRowProps): react.JSX.Element;
|
|
951
1135
|
|
|
952
1136
|
/**
|
|
953
|
-
* The site bar: 64px, abyss at 86 % and a 14px blur behind it
|
|
1137
|
+
* The site bar: 64px, abyss at 86 % and a 14px blur behind it — 56 when it
|
|
1138
|
+
* shares the screen with a sidebar.
|
|
954
1139
|
*
|
|
955
1140
|
* It is page composition and not a primitive, but it lives in the library for a
|
|
956
1141
|
* concrete reason: the CLI aesthetic of the items — mono, `./section` format —
|
|
@@ -966,6 +1151,13 @@ declare function LinkRow({ name, description, icon, external, className, ...prop
|
|
|
966
1151
|
* floats in the middle of the bar and the eye has to cross the gap twice: once
|
|
967
1152
|
* to read the brand and once to come back and find the section. Grouped on the
|
|
968
1153
|
* right, brand and navigation are two anchors instead of three.
|
|
1154
|
+
*
|
|
1155
|
+
* `brand` and `actions` are `ReactNode` slots and they are the answer to almost
|
|
1156
|
+
* everything an app shell asks for: a `~/cursos` wordmark goes in `brand`, and a
|
|
1157
|
+
* user menu or a «Entrar» button goes in `actions`. Session state does not get a
|
|
1158
|
+
* prop of its own — it is project infrastructure, which is the third clause of
|
|
1159
|
+
* the criterion that decides what enters this library. See `docs/decisions/`
|
|
1160
|
+
* § 30.
|
|
969
1161
|
*/
|
|
970
1162
|
type NavProps = ComponentPropsWithoutRef<'header'> & {
|
|
971
1163
|
/** The logo, on the left. */
|
|
@@ -974,8 +1166,19 @@ type NavProps = ComponentPropsWithoutRef<'header'> & {
|
|
|
974
1166
|
children?: ReactNode;
|
|
975
1167
|
/** Actions on the right: conversion, theme switch, search. */
|
|
976
1168
|
actions?: ReactNode;
|
|
1169
|
+
/**
|
|
1170
|
+
* `compact` is 56px instead of 64, for a bar that shares the screen with a
|
|
1171
|
+
* sidebar: at 64 the two compete for the same corner and together they eat the
|
|
1172
|
+
* top of the content area.
|
|
1173
|
+
*
|
|
1174
|
+
* It is a prop and not a `className` because the height lives on the inner
|
|
1175
|
+
* container, which never sees one — `className` reaches the `<header>` and
|
|
1176
|
+
* stops there. Passing `h-14` from outside did nothing, silently, which is the
|
|
1177
|
+
* kind of failure this repo writes checks for.
|
|
1178
|
+
*/
|
|
1179
|
+
size?: 'default' | 'compact' | undefined;
|
|
977
1180
|
};
|
|
978
|
-
declare function Nav({ brand, children, actions, className, ...props }: NavProps): react.JSX.Element;
|
|
1181
|
+
declare function Nav({ brand, children, actions, size, className, ...props }: NavProps): react.JSX.Element;
|
|
979
1182
|
type NavItemProps = ComponentPropsWithoutRef<'a'> & {
|
|
980
1183
|
/** Current section: biolume with a 1px underline. */
|
|
981
1184
|
active?: boolean | undefined;
|
|
@@ -996,6 +1199,15 @@ type NavItemProps = ComponentPropsWithoutRef<'a'> & {
|
|
|
996
1199
|
* than it looks in a mockup. Brackets are how a terminal marks the active path,
|
|
997
1200
|
* so they say «you are here» without relying on the color being told apart. They
|
|
998
1201
|
* are `aria-hidden`, because whoever is listening already has `aria-current`.
|
|
1202
|
+
*
|
|
1203
|
+
* `children` goes through `Slottable`, and that is what makes `asChild` work at
|
|
1204
|
+
* all. The prompt and the brackets are the component's own nodes, so a plain
|
|
1205
|
+
* `Slot` saw four children where it needs one and threw «Slot failed to slot
|
|
1206
|
+
* onto its children» on EVERY render — the prop was declared, typed and
|
|
1207
|
+
* impossible to call. It passed `tsc` and it passed the build, because the shape
|
|
1208
|
+
* of the children is not something either one looks at. `Slottable` is Radix's
|
|
1209
|
+
* answer to exactly this: it marks which child the router's `Link` replaces and
|
|
1210
|
+
* leaves the decoration where it is. See `docs/decisions/0.8.md` § 40.
|
|
999
1211
|
*/
|
|
1000
1212
|
declare function NavItem({ active, asChild, className, children, ...props }: NavItemProps): react.JSX.Element;
|
|
1001
1213
|
|
|
@@ -1190,34 +1402,6 @@ type ScrollingProgressBarProps = Omit<ComponentPropsWithoutRef<'div'>, 'children
|
|
|
1190
1402
|
};
|
|
1191
1403
|
declare function ScrollingProgressBar({ target, tone, sticky, className, ...props }: ScrollingProgressBarProps): react.JSX.Element;
|
|
1192
1404
|
|
|
1193
|
-
/**
|
|
1194
|
-
* The blog admin's sidebar.
|
|
1195
|
-
*
|
|
1196
|
-
* The `▸` is put there by the component, same as `NavItem`'s `./` and the
|
|
1197
|
-
* breadcrumb's `~`: it is the same CLI aesthetic and the same decision — the
|
|
1198
|
-
* format is part of the piece, not a convention to be remembered. It is
|
|
1199
|
-
* `aria-hidden`.
|
|
1200
|
-
*
|
|
1201
|
-
* The footer carries the version and the branch (`v5.0.1 · main`) in the `meta`
|
|
1202
|
-
* scale. It is not decoration: in an admin it is the first thing anyone asks
|
|
1203
|
-
* when something looks off.
|
|
1204
|
-
*/
|
|
1205
|
-
type SidebarItemProps = ComponentPropsWithoutRef<'a'> & {
|
|
1206
|
-
active?: boolean | undefined;
|
|
1207
|
-
asChild?: boolean | undefined;
|
|
1208
|
-
/** Counter on the right: pending drafts, unused media. */
|
|
1209
|
-
badge?: ReactNode;
|
|
1210
|
-
};
|
|
1211
|
-
declare function SidebarItem({ active, asChild, badge, className, children, ...props }: SidebarItemProps): react.JSX.Element;
|
|
1212
|
-
type SidebarNavProps = ComponentPropsWithoutRef<'nav'> & {
|
|
1213
|
-
/** The panel's heading. */
|
|
1214
|
-
title?: ReactNode;
|
|
1215
|
-
/** Version and branch, at the bottom. */
|
|
1216
|
-
version?: ReactNode;
|
|
1217
|
-
branch?: ReactNode;
|
|
1218
|
-
};
|
|
1219
|
-
declare function SidebarNav({ title, version, branch, children, className, ...props }: SidebarNavProps): react.JSX.Element;
|
|
1220
|
-
|
|
1221
1405
|
/**
|
|
1222
1406
|
* A large metric: the number in the `stat` scale and its name underneath.
|
|
1223
1407
|
*
|
|
@@ -1227,24 +1411,50 @@ declare function SidebarNav({ title, version, branch, children, className, ...pr
|
|
|
1227
1411
|
* about. That is why `tone` is not an open palette — there are two values and
|
|
1228
1412
|
* they mean different things.
|
|
1229
1413
|
*
|
|
1230
|
-
* The reading order is
|
|
1231
|
-
*
|
|
1414
|
+
* The reading order is title, the big number, and the standfirst below. The
|
|
1415
|
+
* number goes in the MIDDLE and not at the end on purpose: it is what people
|
|
1232
1416
|
* came to read, and a two-line standfirst between the title and the figure
|
|
1233
1417
|
* buries it. The top says what it is about, the middle says how much, and the
|
|
1234
1418
|
* bottom holds the nuance only someone who stops will read.
|
|
1419
|
+
*
|
|
1420
|
+
* `delta` and `spark` sit with the number and not with the standfirst, because
|
|
1421
|
+
* both are about the number: how it moved and what shape the movement had. The
|
|
1422
|
+
* order survives — top what, middle how much, bottom the nuance.
|
|
1423
|
+
*
|
|
1424
|
+
* THE ICON IS A BADGE IN THE OPPOSITE CORNER, not a glyph before the title, and
|
|
1425
|
+
* the tone rides on it rather than on the number. In a panel of ten of these the
|
|
1426
|
+
* eyebrow is the same length in none of them, so an inline icon puts the only
|
|
1427
|
+
* coloured mark on a different x in every card; pinned to the corner it lands on
|
|
1428
|
+
* a grid. The circle is the tint pattern the system already has — `bg-accent/10`
|
|
1429
|
+
* as a surface and the colour on the GLYPH, per `docs/decisions/0.6.md` § 4b — and a
|
|
1430
|
+
* glyph clears the 3:1 graphical threshold where text would not clear 4.5.
|
|
1431
|
+
*
|
|
1432
|
+
* WHICH IS WHY A NEUTRAL NUMBER IS PRIMARY INK AND NOT BIOLUME. With a biolume
|
|
1433
|
+
* badge and a biolume sparkline, a biolume number is the third accent in a card
|
|
1434
|
+
* the size of a postcard, and the thing you came to read stops being the loudest
|
|
1435
|
+
* thing in it. `alert` and `achievement` DO still paint the number sand, so the
|
|
1436
|
+
* document's rule survives exactly where it matters: sand when the number is not
|
|
1437
|
+
* just a number. See `docs/decisions/0.7.md` § 31.
|
|
1235
1438
|
*/
|
|
1236
1439
|
type StatProps = Omit<ComponentPropsWithoutRef<'div'>, 'title'> & {
|
|
1237
1440
|
/** The number, already formatted. The library imposes no locale. */
|
|
1238
1441
|
value: ReactNode;
|
|
1239
1442
|
/** What is being counted. It goes in mono small caps. */
|
|
1240
1443
|
label: ReactNode;
|
|
1241
|
-
/**
|
|
1242
|
-
|
|
1444
|
+
/**
|
|
1445
|
+
* `alert` ONLY when the number is the problem, and `achievement` when it is
|
|
1446
|
+
* the opposite — the diplomas issued, the modules finished. The two paint the
|
|
1447
|
+
* same sand today and they are still two names: a system that names by meaning
|
|
1448
|
+
* cannot make «this is bad» the only way to say «this stands out». See
|
|
1449
|
+
* `docs/decisions/0.7.md` § 28.
|
|
1450
|
+
*/
|
|
1451
|
+
tone?: 'neutral' | 'alert' | 'achievement';
|
|
1243
1452
|
/** With `progress`, the metric reads as progress and adds the bar. */
|
|
1244
1453
|
progress?: number | undefined;
|
|
1245
1454
|
/**
|
|
1246
|
-
* Glyph
|
|
1247
|
-
*
|
|
1455
|
+
* Glyph in a tinted circle, in the corner opposite the title. At 1em, and it
|
|
1456
|
+
* inherits `currentColor` from the badge, so it takes the tone without being
|
|
1457
|
+
* tinted separately.
|
|
1248
1458
|
*/
|
|
1249
1459
|
icon?: ReactNode;
|
|
1250
1460
|
/**
|
|
@@ -1252,8 +1462,31 @@ type StatProps = Omit<ComponentPropsWithoutRef<'div'>, 'title'> & {
|
|
|
1252
1462
|
* does not say whether that is a lot, and this is where that gets said.
|
|
1253
1463
|
*/
|
|
1254
1464
|
description?: ReactNode;
|
|
1465
|
+
/** How the number moved since last time. */
|
|
1466
|
+
delta?: StatDelta | undefined;
|
|
1467
|
+
/**
|
|
1468
|
+
* The number's shape over time, under it. A `ReactNode` and not a data prop:
|
|
1469
|
+
* a sparkline needs a charting library, and this component lives in the barrel
|
|
1470
|
+
* that four projects install. The one project that draws them passes its own,
|
|
1471
|
+
* exactly like `icon`.
|
|
1472
|
+
*/
|
|
1473
|
+
spark?: ReactNode;
|
|
1255
1474
|
};
|
|
1256
|
-
|
|
1475
|
+
type StatDelta = {
|
|
1476
|
+
/**
|
|
1477
|
+
* Already formatted — «+12 esta semana», «↑8 %». The library imposes no
|
|
1478
|
+
* locale, same as `value`.
|
|
1479
|
+
*/
|
|
1480
|
+
value: ReactNode;
|
|
1481
|
+
/**
|
|
1482
|
+
* Which way it moved. It picks the GLYPH and never the colour, because a rise
|
|
1483
|
+
* is not automatically good: «+12 alumnos» and «+12 errores» point the same
|
|
1484
|
+
* way and mean opposite things. Whether the number matters is `tone`'s job,
|
|
1485
|
+
* and it is a decision the call site has already made.
|
|
1486
|
+
*/
|
|
1487
|
+
direction: 'up' | 'down' | 'flat';
|
|
1488
|
+
};
|
|
1489
|
+
declare function Stat({ value, label, tone, progress, icon, description, delta, spark, className, ...props }: StatProps): react.JSX.Element;
|
|
1257
1490
|
|
|
1258
1491
|
type TalkContent = {
|
|
1259
1492
|
title: ReactNode;
|
|
@@ -1399,38 +1632,4 @@ declare function TableOfContents({ items, title, activeHref, linkAsChild, classN
|
|
|
1399
1632
|
|
|
1400
1633
|
declare function cn(...inputs: ClassValue[]): string;
|
|
1401
1634
|
|
|
1402
|
-
type
|
|
1403
|
-
declare const GitHub: (props: IconProps) => react.JSX.Element;
|
|
1404
|
-
declare const LinkedIn: (props: IconProps) => react.JSX.Element;
|
|
1405
|
-
declare const X: (props: IconProps) => react.JSX.Element;
|
|
1406
|
-
declare const Instagram: (props: IconProps) => react.JSX.Element;
|
|
1407
|
-
declare const Discord: (props: IconProps) => react.JSX.Element;
|
|
1408
|
-
declare const YouTube: (props: IconProps) => react.JSX.Element;
|
|
1409
|
-
declare const Rss: (props: IconProps) => react.JSX.Element;
|
|
1410
|
-
declare const Email: (props: IconProps) => react.JSX.Element;
|
|
1411
|
-
/**
|
|
1412
|
-
* The newsletter. It plays the same role as `Rss` — a way to follow, not a
|
|
1413
|
-
* social network — which is why it belongs in this catalogue and does not open
|
|
1414
|
-
* the door to an icon library.
|
|
1415
|
-
*
|
|
1416
|
-
* It is named for what it means and not for what it draws, like everything else
|
|
1417
|
-
* in the system: it is a bell, and it is called `Newsletter`. `eduardoalvarez.dev`
|
|
1418
|
-
* had it drawn in the project, following the contract by hand so it would not
|
|
1419
|
-
* clash while it waited.
|
|
1420
|
-
*/
|
|
1421
|
-
declare const Newsletter: (props: IconProps) => react.JSX.Element;
|
|
1422
|
-
|
|
1423
|
-
declare const social_Discord: typeof Discord;
|
|
1424
|
-
declare const social_Email: typeof Email;
|
|
1425
|
-
declare const social_GitHub: typeof GitHub;
|
|
1426
|
-
declare const social_Instagram: typeof Instagram;
|
|
1427
|
-
declare const social_LinkedIn: typeof LinkedIn;
|
|
1428
|
-
declare const social_Newsletter: typeof Newsletter;
|
|
1429
|
-
declare const social_Rss: typeof Rss;
|
|
1430
|
-
declare const social_X: typeof X;
|
|
1431
|
-
declare const social_YouTube: typeof YouTube;
|
|
1432
|
-
declare namespace social {
|
|
1433
|
-
export { social_Discord as Discord, social_Email as Email, social_GitHub as GitHub, social_Instagram as Instagram, social_LinkedIn as LinkedIn, social_Newsletter as Newsletter, social_Rss as Rss, social_X as X, social_YouTube as YouTube };
|
|
1434
|
-
}
|
|
1435
|
-
|
|
1436
|
-
export { Accordion, AccordionContent, AccordionItem, type AccordionProps, AccordionTrigger, type AccordionTriggerProps, Alert, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, type AlertProps, ArticleCard, type ArticleCardProps, AudioPlayer, type AudioPlayerMode, type AudioPlayerProps, AuthorCard, type AuthorCardProps, Avatar, AvatarFallback, AvatarImage, type AvatarProps, AvatarUpload, type AvatarUploadProps, Badge, type BadgeProps, Blockquote, type BlockquoteProps, Breadcrumb, type BreadcrumbProps, Button, type ButtonProps, Calendar, type CalendarEvent, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CategoryBadge, type CategoryBadgeProps, Checkbox, type CheckboxProps, Code, CodeBlock, type CodeBlockProps, type CodeProps, CourseCard, type CourseCardProps, type Crumb, DateField, type DateFieldProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, EventCalendar, type EventCalendarProps, Face, Footer, FooterLink, type FooterLinkProps, type FooterProps, Hero, type HeroProps, Input, type InputProps, LinkRow, type LinkRowProps, MetricBadge, type MetricBadgeProps, Nav, NavItem, type NavItemProps, type NavProps, NewsletterForm, type NewsletterFormProps, type NewsletterState, PageHeader, type PageHeaderProps, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, type PaginationLinkProps, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, type PopoverContentProps, PopoverTrigger, Pose, Progress, type ProgressProps, RadioGroup, RadioGroupItem, type RadioGroupItemProps, type RadioGroupProps, ScrollingProgressBar, type ScrollingProgressBarProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Separator, type SeparatorProps, Sheet, SheetBody, SheetClose, SheetContent, type SheetContentProps, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, SidebarItem, type SidebarItemProps, SidebarNav, type SidebarNavProps, Skeleton, type SkeletonProps, type SocialLink, Stat, type StatProps, Switch, type SwitchProps, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableOfContents, type TableOfContentsProps, TableRow, Tabs, TabsContent, TabsList, type TabsProps, TabsTrigger, TalkCard, type TalkCardProps, Text, type TextProps, Textarea, type TextareaProps, Theme, ThemeToggle, type ThemeToggleProps, ToastAction, type ToastOptions, type ToastVariant, Toaster, type ToasterProps, type TocEntry, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, alert as alertVariants, avatar as avatarVariants, badge as badgeVariants, button as buttonVariants, cn, social, text as textVariants, toast, useTheme };
|
|
1635
|
+
export { Accordion, AccordionContent, AccordionItem, type AccordionProps, AccordionTrigger, type AccordionTriggerProps, Alert, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, type AlertProps, ArticleCard, type ArticleCardProps, AudioPlayer, type AudioPlayerMode, type AudioPlayerProps, AuthorCard, type AuthorCardProps, Avatar, AvatarFallback, AvatarImage, type AvatarProps, AvatarUpload, type AvatarUploadProps, Badge, type BadgeProps, Blockquote, type BlockquoteProps, Breadcrumb, type BreadcrumbProps, Button, type ButtonProps, Calendar, type CalendarEvent, type CalendarProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CategoryBadge, type CategoryBadgeProps, Checkbox, type CheckboxProps, Code, CodeBlock, type CodeBlockProps, type CodeProps, CourseCard, type CourseCardProps, type Crumb, DateField, type DateFieldProps, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogTitle, DialogTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, type EmptyStateProps, EventCalendar, type EventCalendarProps, Face, Footer, type FooterColumn, type FooterColumnLink, type FooterProps, Hero, type HeroProps, Input, type InputProps, LinkRow, type LinkRowProps, MetricBadge, type MetricBadgeProps, Nav, NavItem, type NavItemProps, type NavProps, NewsletterForm, type NewsletterFormProps, type NewsletterState, PageHeader, type PageHeaderProps, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, type PaginationLinkProps, PaginationNext, PaginationPrevious, Popover, PopoverAnchor, PopoverContent, type PopoverContentProps, PopoverTrigger, Pose, Progress, type ProgressProps, RadioGroup, RadioGroupItem, type RadioGroupItemProps, type RadioGroupProps, ScrollingProgressBar, type ScrollingProgressBarProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Separator, type SeparatorProps, Sheet, SheetBody, SheetClose, SheetContent, type SheetContentProps, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Skeleton, type SkeletonProps, type SocialLink, Stat, type StatDelta, type StatProps, Switch, type SwitchProps, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableOfContents, type TableOfContentsProps, TableRow, Tabs, TabsContent, TabsList, type TabsProps, TabsTrigger, TalkCard, type TalkCardProps, Text, type TextProps, Textarea, type TextareaProps, Theme, ThemeToggle, type ThemeToggleProps, ToastAction, type ToastOptions, type ToastVariant, Toaster, type ToasterProps, type TocEntry, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, alert as alertVariants, avatar as avatarVariants, badge as badgeVariants, button as buttonVariants, cn, text as textVariants, toast, useTheme };
|