@voltro/ui-shadcn 0.1.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.
Files changed (72) hide show
  1. package/CHANGELOG.md +52 -0
  2. package/LICENSE +57 -0
  3. package/README.md +26 -0
  4. package/SECURITY.md +56 -0
  5. package/THIRD-PARTY-NOTICES.md +3016 -0
  6. package/dist/brand.d.ts +73 -0
  7. package/dist/brand.js +177 -0
  8. package/dist/cn.d.ts +11 -0
  9. package/dist/cn.js +6 -0
  10. package/dist/index.d.ts +1183 -0
  11. package/dist/index.js +2636 -0
  12. package/dist/tokens.css +532 -0
  13. package/package.json +64 -0
  14. package/src/brand/README.md +60 -0
  15. package/src/brand/assets/voltro-favicon.svg +30 -0
  16. package/src/brand/assets/voltro-icon-dark.svg +26 -0
  17. package/src/brand/assets/voltro-icon.svg +14 -0
  18. package/src/brand/assets/voltro-mark-mono.svg +5 -0
  19. package/src/brand/assets/voltro-mark.svg +14 -0
  20. package/src/brand/voltroLogo.tsx +244 -0
  21. package/src/cn.ts +10 -0
  22. package/src/compositions/appShell.tsx +72 -0
  23. package/src/compositions/codeCompare.tsx +88 -0
  24. package/src/compositions/docShell.tsx +112 -0
  25. package/src/compositions/docsLayout.tsx +577 -0
  26. package/src/compositions/featureBento.tsx +103 -0
  27. package/src/compositions/featureGrid.tsx +41 -0
  28. package/src/compositions/heroSection.tsx +55 -0
  29. package/src/compositions/landingCta.tsx +85 -0
  30. package/src/compositions/landingHero.tsx +174 -0
  31. package/src/compositions/landingStats.tsx +99 -0
  32. package/src/compositions/loginCard.tsx +139 -0
  33. package/src/compositions/pageHeader.tsx +58 -0
  34. package/src/compositions/profileMenu.tsx +316 -0
  35. package/src/compositions/siteFooter.tsx +250 -0
  36. package/src/compositions/themeToggle.tsx +82 -0
  37. package/src/cookies.ts +109 -0
  38. package/src/index.ts +160 -0
  39. package/src/primitives/animatedNumber.tsx +73 -0
  40. package/src/primitives/avatar.tsx +39 -0
  41. package/src/primitives/badge.tsx +39 -0
  42. package/src/primitives/button.tsx +53 -0
  43. package/src/primitives/callout.tsx +97 -0
  44. package/src/primitives/card.tsx +68 -0
  45. package/src/primitives/checkbox.tsx +55 -0
  46. package/src/primitives/codeBlock.tsx +134 -0
  47. package/src/primitives/codeWindow.tsx +84 -0
  48. package/src/primitives/dialog.tsx +43 -0
  49. package/src/primitives/docCard.tsx +109 -0
  50. package/src/primitives/docIcons.tsx +268 -0
  51. package/src/primitives/dropdownMenu.tsx +162 -0
  52. package/src/primitives/gridOverlay.tsx +51 -0
  53. package/src/primitives/highlightedCode.tsx +112 -0
  54. package/src/primitives/input.tsx +25 -0
  55. package/src/primitives/label.tsx +19 -0
  56. package/src/primitives/localeSwitcher.tsx +90 -0
  57. package/src/primitives/meshBackdrop.tsx +62 -0
  58. package/src/primitives/scrollReveal.tsx +70 -0
  59. package/src/primitives/searchModal.tsx +304 -0
  60. package/src/primitives/select.tsx +24 -0
  61. package/src/primitives/separator.tsx +24 -0
  62. package/src/primitives/skeleton.tsx +12 -0
  63. package/src/primitives/sparkles.tsx +105 -0
  64. package/src/primitives/steps.tsx +55 -0
  65. package/src/primitives/tabs.tsx +102 -0
  66. package/src/primitives/textarea.tsx +24 -0
  67. package/src/primitives/toast.tsx +44 -0
  68. package/src/primitives/tocScrollSpy.tsx +110 -0
  69. package/src/primitives/toggle.tsx +50 -0
  70. package/src/primitives/toggleGroup.tsx +62 -0
  71. package/src/tokens.css +532 -0
  72. package/src/widgets.tsx +297 -0
@@ -0,0 +1,1183 @@
1
+ import { ButtonHTMLAttributes } from 'react';
2
+ import { ClassProp } from 'class-variance-authority/types';
3
+ import { ClassValue } from 'clsx';
4
+ import { ComponentPropsWithoutRef } from 'react';
5
+ import { ComponentType } from 'react';
6
+ import { CSSProperties } from 'react';
7
+ import { DialogHTMLAttributes } from 'react';
8
+ import { FC } from 'react';
9
+ import { FormHTMLAttributes } from 'react';
10
+ import { ForwardRefExoticComponent } from 'react';
11
+ import { HTMLAttributes } from 'react';
12
+ import { InputHTMLAttributes } from 'react';
13
+ import { LabelHTMLAttributes } from 'react';
14
+ import * as RDM from '@radix-ui/react-dropdown-menu';
15
+ import { ReactNode } from 'react';
16
+ import { RefAttributes } from 'react';
17
+ import * as RT from '@radix-ui/react-toggle';
18
+ import * as RTG from '@radix-ui/react-toggle-group';
19
+ import { SelectHTMLAttributes } from 'react';
20
+ import { SVGProps } from 'react';
21
+ import { TextareaHTMLAttributes } from 'react';
22
+ import { VariantProps } from 'class-variance-authority';
23
+ import { WidgetRegistry } from '@voltro/ui';
24
+
25
+ export declare const AnimatedNumber: ({ value, format, duration, }: AnimatedNumberProps) => ReactNode;
26
+
27
+ declare interface AnimatedNumberProps {
28
+ /** Target value. */
29
+ readonly value: number;
30
+ /** Formatting — `'integer'` (default), `'percent'`, or a custom
31
+ * formatter. */
32
+ readonly format?: 'integer' | 'percent' | ((n: number) => string);
33
+ /** Animation duration in ms. Default 800. */
34
+ readonly duration?: number;
35
+ }
36
+
37
+ /** Apply a theme preference to `<html>` (browser only) — adds/removes the
38
+ * `dark` class, resolving `system` against `prefers-color-scheme`. The kit's
39
+ * ProfileMenu / ThemeToggle call this after writing the cookie so the change
40
+ * is immediate (the pre-paint `themeBootScript` handles the first load). */
41
+ export declare const applyTheme: (theme: ThemePreference) => void;
42
+
43
+ export declare const AppShell: ({ brand, nav, right, children, className, LinkComponent, }: AppShellProps) => ReactNode;
44
+
45
+ declare interface AppShellProps {
46
+ readonly brand: ReactNode;
47
+ readonly nav?: ReadonlyArray<NavLink>;
48
+ readonly right?: ReactNode;
49
+ readonly children: ReactNode;
50
+ readonly className?: string;
51
+ readonly LinkComponent?: ComponentType<ShellLinkProps>;
52
+ }
53
+
54
+ export declare const ArrowReturnIcon: (p: DocIconProps) => ReactNode;
55
+
56
+ export declare const Avatar: ({ src, alt, fallback, size, className, ...props }: AvatarProps) => ReactNode;
57
+
58
+ declare interface AvatarProps extends HTMLAttributes<HTMLDivElement> {
59
+ readonly src?: string;
60
+ readonly alt?: string;
61
+ readonly fallback?: string;
62
+ readonly size?: 'sm' | 'md' | 'lg';
63
+ }
64
+
65
+ export declare const Badge: ({ className, variant, children, ...props }: BadgeProps) => ReactNode;
66
+
67
+ export declare interface BadgeProps extends HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {
68
+ }
69
+
70
+ export declare const badgeVariants: (props?: ({
71
+ variant?: "default" | "destructive" | "outline" | "secondary" | null | undefined;
72
+ } & ClassProp) | undefined) => string;
73
+
74
+ export declare const BellIcon: (p: DocIconProps) => ReactNode;
75
+
76
+ export declare const Bento: ({ children, className }: BentoProps) => ReactNode;
77
+
78
+ export declare const BentoCell: ({ title, description, icon, accent, size, className, children, }: BentoCellProps) => ReactNode;
79
+
80
+ export declare interface BentoCellProps {
81
+ readonly title: ReactNode;
82
+ readonly description: ReactNode;
83
+ /** Icon shown in the top-left chip. */
84
+ readonly icon?: ReactNode;
85
+ /** Custom hero/illustration on the cell. */
86
+ readonly accent?: ReactNode;
87
+ /** Cell size: 'wide' (cols 1-2 on desktop), 'tall' (rows 1-2),
88
+ * 'square' (1×1). Default 'square'. */
89
+ readonly size?: 'wide' | 'tall' | 'square';
90
+ /** Optional extra content rendered below the description in the text
91
+ * column — e.g. a "Learn more" link. */
92
+ readonly children?: ReactNode;
93
+ readonly className?: string;
94
+ }
95
+
96
+ declare interface BentoProps {
97
+ readonly children: ReactNode;
98
+ readonly className?: string;
99
+ }
100
+
101
+ export declare const BotIcon: (p: DocIconProps) => ReactNode;
102
+
103
+ export declare const BroadcastIcon: (p: DocIconProps) => ReactNode;
104
+
105
+ export declare const BuildingIcon: (p: DocIconProps) => ReactNode;
106
+
107
+ export declare const Button: ({ className, variant, size, children, ...props }: ButtonProps) => ReactNode;
108
+
109
+ export declare interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, VariantProps<typeof buttonVariants> {
110
+ }
111
+
112
+ export declare const buttonVariants: (props?: ({
113
+ variant?: "default" | "link" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
114
+ size?: "default" | "sm" | "lg" | "icon" | null | undefined;
115
+ } & ClassProp) | undefined) => string;
116
+
117
+ export declare const Callout: ({ type, title, children, className, }: CalloutProps) => ReactNode;
118
+
119
+ declare interface CalloutProps {
120
+ readonly type?: CalloutType;
121
+ readonly title?: ReactNode;
122
+ readonly children: ReactNode;
123
+ readonly className?: string;
124
+ }
125
+
126
+ declare type CalloutType = 'info' | 'tip' | 'warning' | 'danger' | 'note';
127
+
128
+ export declare const Card: ({ className, children, ...props }: HTMLAttributes<HTMLDivElement>) => ReactNode;
129
+
130
+ export declare const CardContent: ({ className, children, ...props }: HTMLAttributes<HTMLDivElement>) => ReactNode;
131
+
132
+ export declare const CardDescription: ({ className, children, ...props }: HTMLAttributes<HTMLParagraphElement>) => ReactNode;
133
+
134
+ export declare const CardFooter: ({ className, children, ...props }: HTMLAttributes<HTMLDivElement>) => ReactNode;
135
+
136
+ export declare const CardHeader: ({ className, children, ...props }: HTMLAttributes<HTMLDivElement>) => ReactNode;
137
+
138
+ export declare const CardTitle: ({ className, children, ...props }: HTMLAttributes<HTMLHeadingElement>) => ReactNode;
139
+
140
+ export declare const ChartIcon: (p: DocIconProps) => ReactNode;
141
+
142
+ export declare const Checkbox: ({ className, indeterminate, ...props }: CheckboxProps) => ReactNode;
143
+
144
+ export declare interface CheckboxProps extends InputHTMLAttributes<HTMLInputElement> {
145
+ /** Tri-state middle: renders a dash. Wired to the DOM `indeterminate`
146
+ * property (not an attribute) via a ref effect. */
147
+ readonly indeterminate?: boolean;
148
+ }
149
+
150
+ export declare const ChevronLeftIcon: (p: DocIconProps) => ReactNode;
151
+
152
+ export declare const ChevronRightIcon: (p: DocIconProps) => ReactNode;
153
+
154
+ export declare const CloudIcon: (p: DocIconProps) => ReactNode;
155
+
156
+ export declare const cn: (...inputs: ClassValue[]) => string;
157
+
158
+ export declare const CodeBlock: ({ filename, language, html, code, className, copyLabel, copyAriaLabel, copiedLabel, copiedAriaLabel, }: CodeBlockProps) => ReactNode;
159
+
160
+ declare interface CodeBlockProps {
161
+ /** Filename label shown in the header. Optional. */
162
+ readonly filename?: string;
163
+ /** Language label shown in the top-right. Optional. */
164
+ readonly language?: string;
165
+ /** Pre-highlighted HTML (e.g. from Shiki) — rendered via
166
+ * dangerouslySetInnerHTML. Pick this OR `code`, not both. */
167
+ readonly html?: string;
168
+ /** Plain code text — renders inside a styled <pre><code>. */
169
+ readonly code?: string;
170
+ readonly className?: string;
171
+ /** Copy-button caption + `aria-label` before a copy. Default `'Copy'` /
172
+ * `'Copy code'`. */
173
+ readonly copyLabel?: string;
174
+ readonly copyAriaLabel?: string;
175
+ /** Copy-button caption + `aria-label` after a successful copy. Default
176
+ * `'Copied'`. */
177
+ readonly copiedLabel?: string;
178
+ readonly copiedAriaLabel?: string;
179
+ }
180
+
181
+ export declare const CodeCompare: ({ before, after, className, }: CodeCompareProps) => ReactNode;
182
+
183
+ declare interface CodeComparePanelProps {
184
+ readonly label: ReactNode;
185
+ /** Pre-highlighted HTML (Shiki) — skips internal highlighting. */
186
+ readonly html?: string;
187
+ /** Plain code text. When `lang` is also provided, the panel
188
+ * runs Shiki syntax highlighting automatically. */
189
+ readonly code?: string;
190
+ /** Shiki language. Triggers syntax highlighting on `code`. */
191
+ readonly lang?: ShikiLang;
192
+ /** Visual treatment — `'muted'` is dimmed (the "before"),
193
+ * `'highlight'` keeps the full styling + adds a primary border. */
194
+ readonly tone?: 'muted' | 'highlight';
195
+ }
196
+
197
+ declare interface CodeCompareProps {
198
+ readonly before: CodeComparePanelProps;
199
+ readonly after: CodeComparePanelProps;
200
+ readonly className?: string;
201
+ }
202
+
203
+ export declare const CodeWindow: ({ title, tag, code, lang, html, caret, className, }: CodeWindowProps) => ReactNode;
204
+
205
+ declare interface CodeWindowProps {
206
+ /** Title shown in the chrome — usually a filename. */
207
+ readonly title?: string;
208
+ /** Tag in the corner — language label, e.g. "TypeScript". */
209
+ readonly tag?: string;
210
+ /** Plain code text. When `lang` is also provided, the component
211
+ * runs Shiki syntax highlighting automatically. */
212
+ readonly code?: string;
213
+ /** Shiki language. Triggers syntax highlighting on `code`. */
214
+ readonly lang?: ShikiLang;
215
+ /** Pre-highlighted HTML (skips Shiki). */
216
+ readonly html?: string;
217
+ /** Show a blinking caret after the code. Default false. Only
218
+ * applies to plain (non-highlighted) rendering. */
219
+ readonly caret?: boolean;
220
+ /** Outer wrapper class — useful for sizing. */
221
+ readonly className?: string;
222
+ }
223
+
224
+ export declare const CogIcon: (p: DocIconProps) => ReactNode;
225
+
226
+ export declare const CompassIcon: (p: DocIconProps) => ReactNode;
227
+
228
+ declare interface CtaSpec {
229
+ readonly label: string;
230
+ readonly href: string;
231
+ }
232
+
233
+ export declare const DatabaseIcon: (p: DocIconProps) => ReactNode;
234
+
235
+ /** Expire a cookie (Max-Age=0). Same isomorphic contract as `setCookie`:
236
+ * writes `document.cookie` in the browser, returns the header string. */
237
+ export declare const deleteCookie: (name: string, path?: string) => string;
238
+
239
+ export declare const Dialog: ({ className, children, ...props }: DialogHTMLAttributes<HTMLDialogElement>) => ReactNode;
240
+
241
+ export declare const DialogDescription: ({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) => ReactNode;
242
+
243
+ export declare const DialogFooter: ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => ReactNode;
244
+
245
+ export declare const DialogHeader: ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => ReactNode;
246
+
247
+ export declare const DialogTitle: ({ className, ...props }: HTMLAttributes<HTMLHeadingElement>) => ReactNode;
248
+
249
+ export declare const DiscordIcon: (p: DocIconProps) => ReactNode;
250
+
251
+ export declare const DocCard: ({ title, description, href, icon, className, LinkComponent, }: DocCardProps) => ReactNode;
252
+
253
+ declare interface DocCardProps {
254
+ readonly title: ReactNode;
255
+ readonly description?: ReactNode;
256
+ readonly href: string;
257
+ readonly icon?: ReactNode;
258
+ readonly className?: string;
259
+ /** Optional client-router Link; falls back to plain <a>. */
260
+ readonly LinkComponent?: ComponentType<ShellLinkProps>;
261
+ }
262
+
263
+ export declare const DocCards: ({ children, className, cols, stagger, }: DocCardsProps) => ReactNode;
264
+
265
+ declare interface DocCardsProps {
266
+ readonly children: ReactNode;
267
+ readonly className?: string;
268
+ /** Override the grid columns. Default: 1 on mobile, 2 on md+. */
269
+ readonly cols?: 1 | 2 | 3;
270
+ /** Stagger the first paint — each card fades + slides up with a
271
+ * ~40ms delay. Respects prefers-reduced-motion. Default true. */
272
+ readonly stagger?: boolean;
273
+ }
274
+
275
+ declare interface DocIconProps {
276
+ readonly className?: string;
277
+ /** Accessible label. When omitted the icon is `aria-hidden` and
278
+ * should sit next to text. */
279
+ readonly title?: string;
280
+ }
281
+
282
+ export declare interface DocNavEntry {
283
+ readonly label: string;
284
+ readonly href: string;
285
+ }
286
+
287
+ export declare interface DocNavGroup {
288
+ readonly section: string;
289
+ readonly entries: ReadonlyArray<DocNavEntry>;
290
+ }
291
+
292
+ export declare interface DocsBreadcrumb {
293
+ readonly label: string;
294
+ readonly href?: string;
295
+ }
296
+
297
+ export declare const DocShell: ({ brand, nav, children, currentPath, className, searchAction, searchPlaceholder, searchLabel, LinkComponent, }: DocShellProps) => ReactNode;
298
+
299
+ declare interface DocShellProps {
300
+ readonly brand: ReactNode;
301
+ readonly nav: ReadonlyArray<DocNavGroup>;
302
+ readonly children: ReactNode;
303
+ readonly currentPath?: string;
304
+ readonly className?: string;
305
+ /** Search form GET action. When set, renders a search input that
306
+ * POSTs ?q=… to this URL. */
307
+ readonly searchAction?: string;
308
+ /** Placeholder for the search input. Default `'Search docs…'`. */
309
+ readonly searchPlaceholder?: string;
310
+ /** `aria-label` for the search input. Default `'Search docs'`. */
311
+ readonly searchLabel?: string;
312
+ /** Optional client-router Link. Passing `Link` from `@voltro/web`
313
+ * upgrades every sidebar entry to client-side navigation with
314
+ * loader prefetch. */
315
+ readonly LinkComponent?: ComponentType<ShellLinkProps>;
316
+ }
317
+
318
+ export declare const DocsLayout: ({ brand, nav, children, currentPath, topNav, topRight, search, page, LinkComponent, className, labels, footer, sidebarHeader, }: DocsLayoutProps) => ReactNode;
319
+
320
+ /** User-facing strings for the layout's own chrome. Defaults are English
321
+ * so the layout works unconfigured; pass catalog values to localize. */
322
+ export declare interface DocsLayoutLabels {
323
+ /** `aria-label` of the mobile menu-open button. Default `'Toggle menu'`. */
324
+ readonly toggleMenu?: string;
325
+ /** `aria-label` of the mobile drawer backdrop. Default `'Close menu'`. */
326
+ readonly closeMenu?: string;
327
+ /** `aria-label` of the drawer close button. Default `'Close'`. */
328
+ readonly close?: string;
329
+ /** Heading of the mobile drawer. Default `'Menu'`. */
330
+ readonly menu?: string;
331
+ /** Heading above the table of contents. Default `'On this page'`. */
332
+ readonly onThisPage?: string;
333
+ /** Edit-on-GitHub link text. Default `'Edit this page on GitHub →'`. */
334
+ readonly editPage?: string;
335
+ /** Prefix before the last-updated date. Default `'Updated'`. */
336
+ readonly updated?: string;
337
+ /** "Previous page" pager caption. Default `'Previous'`. */
338
+ readonly previous?: string;
339
+ /** "Next page" pager caption. Default `'Next'`. */
340
+ readonly next?: string;
341
+ /** `aria-label` of the prev/next pager nav. Default `'Pagination'`. */
342
+ readonly pagination?: string;
343
+ /** `aria-label` of the breadcrumb nav. Default `'Breadcrumb'`. */
344
+ readonly breadcrumb?: string;
345
+ }
346
+
347
+ declare interface DocsLayoutProps {
348
+ readonly brand: ReactNode;
349
+ readonly nav: ReadonlyArray<DocsNavGroup>;
350
+ readonly children: ReactNode;
351
+ /** Current pathname — used to highlight the active nav entry +
352
+ * decide which group opens by default. */
353
+ readonly currentPath?: string;
354
+ /** Top-bar slots — render between brand and the right-hand actions. */
355
+ readonly topNav?: ReactNode;
356
+ /** Right-hand actions in the top bar (theme toggle, github link, …). */
357
+ readonly topRight?: ReactNode;
358
+ /** Optional search slot in the top bar. Drop in `<SearchTrigger
359
+ * onClick={…} />` to wire up the kit's cmd-k modal, or any custom
360
+ * search button you want. */
361
+ readonly search?: ReactNode;
362
+ /** Per-page metadata — when set, the layout renders the breadcrumbs,
363
+ * title, description, TOC, prev/next pager, and edit-on-github
364
+ * link. Drop this for landing-style index pages. */
365
+ readonly page?: {
366
+ readonly title: string;
367
+ readonly description?: string;
368
+ readonly section?: string;
369
+ readonly breadcrumbs?: ReadonlyArray<DocsBreadcrumb>;
370
+ readonly toc?: ReadonlyArray<DocsTocEntry>;
371
+ readonly prev?: {
372
+ readonly href: string;
373
+ readonly label: string;
374
+ readonly description?: string;
375
+ };
376
+ readonly next?: {
377
+ readonly href: string;
378
+ readonly label: string;
379
+ readonly description?: string;
380
+ };
381
+ readonly editUrl?: string;
382
+ readonly lastUpdated?: string;
383
+ };
384
+ /** Optional client-router Link. Same contract as DocShell. */
385
+ readonly LinkComponent?: ComponentType<ShellLinkProps>;
386
+ readonly className?: string;
387
+ /** Override the layout's own chrome strings. Defaults are English. */
388
+ readonly labels?: DocsLayoutLabels;
389
+ /** Optional footer node — rendered at the very bottom inside the
390
+ * content column. */
391
+ readonly footer?: ReactNode;
392
+ /** Optional node pinned to the TOP of the sidebar (above the nav
393
+ * groups), in BOTH the desktop aside and the mobile drawer. Use for
394
+ * a section/category switcher ("root toggle"). Omitted → the sidebar
395
+ * renders exactly as before. */
396
+ readonly sidebarHeader?: ReactNode;
397
+ }
398
+
399
+ export declare interface DocsNavGroup {
400
+ readonly section: string;
401
+ /** Entries shown directly under the section header, ABOVE the first
402
+ * sub-group. Use for a section's 1-2 intro pages. May be empty. */
403
+ readonly entries: ReadonlyArray<DocsNavItem>;
404
+ /** Optional nested sub-groups. When present they render as
405
+ * collapsible sub-headings below `entries`. Sections with no
406
+ * meaningful taxonomy leave this empty and render flat. */
407
+ readonly subgroups?: ReadonlyArray<DocsNavSubGroup>;
408
+ /** Flat entries rendered AFTER the sub-groups — a section's trailing
409
+ * ungrouped tail (e.g. plugins not assigned to a sub-group). Keeps
410
+ * them visible + in order without forcing every page into a group. */
411
+ readonly trailingEntries?: ReadonlyArray<DocsNavItem>;
412
+ /** Collapse the group by default. Open groups stay open across
413
+ * navigations because the layout keeps its state in React. */
414
+ readonly defaultOpen?: boolean;
415
+ /** Render the contents WITHOUT the section header (promoted one level),
416
+ * always expanded. Use when the sidebar is already scoped to this one
417
+ * section by an external switcher, so repeating the section name as a
418
+ * header would be redundant. */
419
+ readonly headerless?: boolean;
420
+ }
421
+
422
+ export declare interface DocsNavItem {
423
+ readonly label: string;
424
+ readonly href: string;
425
+ /** Visual hint shown next to the label (e.g. "new", "beta"). */
426
+ readonly badge?: string;
427
+ }
428
+
429
+ /** A collapsible sub-heading nested one level under a section. Its
430
+ * entries render indented; the chevron + open/close affordance mirror
431
+ * the top-level section. */
432
+ export declare interface DocsNavSubGroup {
433
+ readonly label: string;
434
+ readonly entries: ReadonlyArray<DocsNavItem>;
435
+ readonly defaultOpen?: boolean;
436
+ }
437
+
438
+ export declare interface DocsTocEntry {
439
+ readonly id: string;
440
+ readonly text: string;
441
+ readonly level: 2 | 3;
442
+ }
443
+
444
+ export declare const DropdownMenu: FC<RDM.DropdownMenuProps>;
445
+
446
+ export declare const DropdownMenuContent: ForwardRefExoticComponent<Omit<RDM.DropdownMenuContentProps & RefAttributes<HTMLDivElement>, "ref"> & RefAttributes<HTMLDivElement>>;
447
+
448
+ export declare const DropdownMenuGroup: ForwardRefExoticComponent<RDM.DropdownMenuGroupProps & RefAttributes<HTMLDivElement>>;
449
+
450
+ export declare const DropdownMenuItem: ForwardRefExoticComponent<Omit<RDM.DropdownMenuItemProps & RefAttributes<HTMLDivElement>, "ref"> & {
451
+ readonly inset?: boolean;
452
+ readonly destructive?: boolean;
453
+ } & RefAttributes<HTMLDivElement>>;
454
+
455
+ export declare const DropdownMenuLabel: ForwardRefExoticComponent<Omit<RDM.DropdownMenuLabelProps & RefAttributes<HTMLDivElement>, "ref"> & {
456
+ readonly inset?: boolean;
457
+ } & RefAttributes<HTMLDivElement>>;
458
+
459
+ export declare const DropdownMenuPortal: FC<RDM.DropdownMenuPortalProps>;
460
+
461
+ export declare const DropdownMenuRadioGroup: ForwardRefExoticComponent<RDM.DropdownMenuRadioGroupProps & RefAttributes<HTMLDivElement>>;
462
+
463
+ export declare const DropdownMenuRadioItem: ForwardRefExoticComponent<Omit<RDM.DropdownMenuRadioItemProps & RefAttributes<HTMLDivElement>, "ref"> & RefAttributes<HTMLDivElement>>;
464
+
465
+ export declare const DropdownMenuSeparator: ForwardRefExoticComponent<Omit<RDM.DropdownMenuSeparatorProps & RefAttributes<HTMLDivElement>, "ref"> & RefAttributes<HTMLDivElement>>;
466
+
467
+ export declare const DropdownMenuTrigger: ForwardRefExoticComponent<RDM.DropdownMenuTriggerProps & RefAttributes<HTMLButtonElement>>;
468
+
469
+ declare interface Feature {
470
+ readonly title: string;
471
+ readonly body: string;
472
+ readonly icon?: ReactNode;
473
+ }
474
+
475
+ export declare const FeatureGrid: ({ sectionTitle, features, className, }: FeatureGridProps) => ReactNode;
476
+
477
+ declare interface FeatureGridProps {
478
+ readonly sectionTitle?: string;
479
+ readonly features: ReadonlyArray<Feature>;
480
+ readonly className?: string;
481
+ }
482
+
483
+ export declare const FileIcon: (p: DocIconProps) => ReactNode;
484
+
485
+ export declare const FolderIcon: (p: DocIconProps) => ReactNode;
486
+
487
+ /** Read a cookie by name from a header string (SSR: the request `Cookie`
488
+ * header) or, when omitted, `document.cookie` (browser). Returns undefined
489
+ * when absent or off-document. */
490
+ export declare const getCookie: (name: string, cookieHeader?: string) => string | undefined;
491
+
492
+ export declare const GitHubIcon: (p: DocIconProps) => ReactNode;
493
+
494
+ export declare const GlobeIcon: (p: DocIconProps) => ReactNode;
495
+
496
+ export declare const GridOverlay: ({ className, variant, size, }: GridOverlayProps) => ReactNode;
497
+
498
+ declare interface GridOverlayProps {
499
+ readonly className?: string;
500
+ /** Grid style — dotted (default, gentler) or lined (stronger
501
+ * blueprint feel). */
502
+ readonly variant?: 'dots' | 'lines';
503
+ /** Cell size in px. Default 32. */
504
+ readonly size?: number;
505
+ }
506
+
507
+ declare interface HeroCta {
508
+ readonly label: string;
509
+ readonly href: string;
510
+ }
511
+
512
+ export declare const HeroSection: ({ eyebrow, title, subtitle, primaryCta, secondaryCta, footnote, className, }: HeroSectionProps) => ReactNode;
513
+
514
+ declare interface HeroSectionProps {
515
+ readonly eyebrow?: string;
516
+ readonly title: ReactNode;
517
+ readonly subtitle?: ReactNode;
518
+ readonly primaryCta?: HeroCta;
519
+ readonly secondaryCta?: HeroCta;
520
+ readonly footnote?: ReactNode;
521
+ readonly className?: string;
522
+ }
523
+
524
+ export declare const HighlightedCode: ({ code, lang, className, }: HighlightedCodeProps) => ReactNode;
525
+
526
+ declare interface HighlightedCodeProps {
527
+ readonly code: string;
528
+ readonly lang?: ShikiLang;
529
+ /** Outer wrapper class. */
530
+ readonly className?: string;
531
+ }
532
+
533
+ export declare const HomeIcon: (p: DocIconProps) => ReactNode;
534
+
535
+ export declare const HookIcon: (p: DocIconProps) => ReactNode;
536
+
537
+ export declare const Input: ({ className, type, ...props }: InputHTMLAttributes<HTMLInputElement>) => ReactNode;
538
+
539
+ export declare const Label: ({ className, children, ...props }: LabelHTMLAttributes<HTMLLabelElement>) => ReactNode;
540
+
541
+ export declare const LandingCta: ({ title, subtitle, primaryCta, secondaryCta, footnote, className, LinkComponent, }: LandingCtaProps) => ReactNode;
542
+
543
+ declare interface LandingCtaProps {
544
+ readonly title: ReactNode;
545
+ readonly subtitle?: ReactNode;
546
+ readonly primaryCta: {
547
+ readonly label: string;
548
+ readonly href: string;
549
+ };
550
+ readonly secondaryCta?: {
551
+ readonly label: string;
552
+ readonly href: string;
553
+ };
554
+ readonly footnote?: ReactNode;
555
+ readonly className?: string;
556
+ readonly LinkComponent?: ComponentType<ShellLinkProps>;
557
+ }
558
+
559
+ export declare const LandingHero: ({ eyebrow, title, titleAccent, subtitle, primaryCta, secondaryCta, footnote, aside, scrollAnchor, scrollLabel, scrollAriaLabel, className, LinkComponent, }: LandingHeroProps) => ReactNode;
560
+
561
+ declare interface LandingHeroProps {
562
+ readonly eyebrow?: ReactNode;
563
+ /** Two-line heading: the second line gets the gradient + animation. */
564
+ readonly title: ReactNode;
565
+ /** Optional second line — when set, the layout renders title on
566
+ * line 1 and this on line 2 with the gradient/animation. */
567
+ readonly titleAccent?: ReactNode;
568
+ readonly subtitle?: ReactNode;
569
+ readonly primaryCta?: CtaSpec;
570
+ readonly secondaryCta?: CtaSpec;
571
+ readonly footnote?: ReactNode;
572
+ /** Code window / illustration slot — sits on the right at md+, below
573
+ * the CTAs on mobile. */
574
+ readonly aside?: ReactNode;
575
+ /** Anchor link for "scroll down" hint. */
576
+ readonly scrollAnchor?: string;
577
+ /** Visible caption on the scroll-down hint. Default `'Scroll'`. */
578
+ readonly scrollLabel?: ReactNode;
579
+ /** `aria-label` for the scroll-down hint. Default `'Scroll down'`. */
580
+ readonly scrollAriaLabel?: string;
581
+ readonly className?: string;
582
+ readonly LinkComponent?: ComponentType<ShellLinkProps>;
583
+ }
584
+
585
+ export declare const LandingStats: ({ stats, className, }: LandingStatsProps) => ReactNode;
586
+
587
+ declare interface LandingStatsProps {
588
+ readonly stats: ReadonlyArray<StatSpec>;
589
+ readonly className?: string;
590
+ }
591
+
592
+ export declare const LANG_COOKIE = "voltro:lang";
593
+
594
+ export declare const LayersIcon: (p: DocIconProps) => ReactNode;
595
+
596
+ export declare const LinkedInIcon: (p: DocIconProps) => ReactNode;
597
+
598
+ export declare interface LocaleOption {
599
+ /** Language code written to the cookie (e.g. 'en', 'de'). */
600
+ readonly code: string;
601
+ /** Human label shown in the picker (e.g. 'English', 'Deutsch'). */
602
+ readonly label: string;
603
+ }
604
+
605
+ export declare const LocaleSwitcher: {
606
+ ({ locales, current, onChange, ariaLabel, className, }: LocaleSwitcherProps): ReactNode;
607
+ displayName: string;
608
+ };
609
+
610
+ export declare interface LocaleSwitcherProps {
611
+ /** The languages to offer. */
612
+ readonly locales: ReadonlyArray<LocaleOption>;
613
+ /** Override the active code. When omitted, hydrates from the `voltro:lang`
614
+ * cookie on mount (falling back to the first option until then). Pass
615
+ * `useLocale()` for a flash-free, mismatch-free control. */
616
+ readonly current?: string;
617
+ /** Called with the chosen code before the reload. Return `false` to suppress
618
+ * the reload (e.g. when the consumer has a hot-swap i18n runtime). */
619
+ readonly onChange?: (code: string) => boolean | void;
620
+ /** Accessible label for the control. Default `'Language'`. */
621
+ readonly ariaLabel?: string;
622
+ readonly className?: string;
623
+ }
624
+
625
+ export declare const LockIcon: (p: DocIconProps) => ReactNode;
626
+
627
+ export declare const LoginCard: ({ title, description, eyebrow, submitLabel, oauthProviders, onOAuth, signUpHref, forgotHref, className, labels, ...formProps }: LoginCardProps) => ReactNode;
628
+
629
+ /** User-facing strings — pass catalog values to localize. Defaults are
630
+ * English so the card works unconfigured. */
631
+ export declare interface LoginCardLabels {
632
+ /** Email field label. Default `'Email'`. */
633
+ readonly email?: string;
634
+ /** Email input placeholder. Default `'you@company.com'`. */
635
+ readonly emailPlaceholder?: string;
636
+ /** Password field label. Default `'Password'`. */
637
+ readonly password?: string;
638
+ /** "Forgot password?" link text (shown when `forgotHref` is set).
639
+ * Default `'Forgot?'`. */
640
+ readonly forgot?: string;
641
+ /** OAuth divider caption. Default `'or continue with'`. */
642
+ readonly oauthDivider?: string;
643
+ /** Sign-up footer prompt (shown when `signUpHref` is set).
644
+ * Default `'New here?'`. */
645
+ readonly signUpPrompt?: string;
646
+ /** Sign-up footer link text. Default `'Create an account'`. */
647
+ readonly signUp?: string;
648
+ }
649
+
650
+ declare interface LoginCardProps extends Omit<FormHTMLAttributes<HTMLFormElement>, 'children'> {
651
+ readonly title?: string;
652
+ readonly description?: string;
653
+ readonly eyebrow?: string;
654
+ readonly submitLabel?: string;
655
+ readonly oauthProviders?: ReadonlyArray<OAuthProvider>;
656
+ readonly onOAuth?: (providerId: string) => void;
657
+ readonly signUpHref?: string;
658
+ readonly forgotHref?: string;
659
+ readonly className?: string;
660
+ /** Override the card's own chrome strings. Defaults are English. */
661
+ readonly labels?: LoginCardLabels;
662
+ }
663
+
664
+ export declare const MeshBackdrop: ({ className, tone, }: MeshBackdropProps) => ReactNode;
665
+
666
+ declare interface MeshBackdropProps {
667
+ readonly className?: string;
668
+ /** Brand mode — picks the colour palette. `cool` = violet/cyan
669
+ * (default), `warm` = amber/rose. The kit's `--primary` is honoured
670
+ * via the `from-primary/*` Tailwind utility callers can pass via
671
+ * className. */
672
+ readonly tone?: 'cool' | 'warm';
673
+ }
674
+
675
+ declare interface NavLink {
676
+ readonly label: string;
677
+ readonly href: string;
678
+ }
679
+
680
+ declare interface OAuthProvider {
681
+ readonly id: string;
682
+ readonly label: string;
683
+ }
684
+
685
+ export declare const PackageIcon: (p: DocIconProps) => ReactNode;
686
+
687
+ export declare const PageHeader: ({ children, className }: PageHeaderProps) => ReactNode;
688
+
689
+ declare interface PageHeaderProps {
690
+ readonly children: ReactNode;
691
+ readonly className?: string;
692
+ }
693
+
694
+ /** Extract both preference cookies (theme + lang) from a cookie header (or
695
+ * `document.cookie` when omitted). Tolerates `null`/`undefined` headers.
696
+ * An invalid theme value is dropped (not coerced); an empty lang is dropped. */
697
+ export declare const parsePreferenceCookies: (cookieHeader?: string | null) => PreferenceCookies;
698
+
699
+ export declare const PencilIcon: (p: DocIconProps) => ReactNode;
700
+
701
+ export declare interface PreferenceCookies {
702
+ /** undefined → server should fall back to its default (typically the
703
+ * app config's theme). 'system' means the client's pre-paint script
704
+ * decides against `prefers-color-scheme`. */
705
+ readonly theme?: ThemePreference;
706
+ /** Language code as written by the client. Consumer decides which codes
707
+ * are valid + how to fall back if the value is unknown. */
708
+ readonly lang?: string;
709
+ }
710
+
711
+ export declare const ProfileMenu: ({ identity, links, languages, currentLanguage, onLanguageChange, logoutUrl, onLogout, signInUrl, labels, }: ProfileMenuProps) => ReactNode;
712
+
713
+ export declare interface ProfileMenuLabels {
714
+ /** Section label for the theme switch. Default `'Theme'`. */
715
+ readonly theme?: string;
716
+ /** Section label for the language switch. Default `'Language'`. */
717
+ readonly language?: string;
718
+ /** Sign-out menu item. Default `'Sign out'`. */
719
+ readonly signOut?: string;
720
+ /** Sign-in menu item. Default `'Sign in'`. */
721
+ readonly signIn?: string;
722
+ /** `aria-label` of the avatar trigger. Default `'Open profile menu'`. */
723
+ readonly openMenu?: string;
724
+ /** Labels of the three theme options. Defaults `'System'`/`'Light'`/`'Dark'`. */
725
+ readonly themes?: {
726
+ readonly system?: string;
727
+ readonly light?: string;
728
+ readonly dark?: string;
729
+ };
730
+ }
731
+
732
+ export declare interface ProfileMenuLanguage {
733
+ readonly code: string;
734
+ readonly label: string;
735
+ }
736
+
737
+ export declare interface ProfileMenuLink {
738
+ readonly key: string;
739
+ readonly label: string;
740
+ readonly href: string;
741
+ readonly icon?: ReactNode;
742
+ readonly external?: boolean;
743
+ }
744
+
745
+ export declare interface ProfileMenuProps {
746
+ readonly identity?: {
747
+ readonly name: string;
748
+ readonly sublabel?: string;
749
+ };
750
+ readonly links?: ReadonlyArray<ProfileMenuLink>;
751
+ readonly languages?: ReadonlyArray<ProfileMenuLanguage>;
752
+ /** Override the cookie-derived language (e.g. when the consumer
753
+ * knows the SSR-resolved value before the cookie round-trips). */
754
+ readonly currentLanguage?: string;
755
+ /** Optional hook that fires AFTER the cookie is written. Default
756
+ * behaviour: `window.location.reload()` so the SSR re-runs in the
757
+ * new locale. Return `false` to suppress the reload (useful when
758
+ * a client-side i18n runtime can hot-swap). */
759
+ readonly onLanguageChange?: (code: string) => boolean | void;
760
+ /** URL the logout form posts to. Triggers a full page nav. For
761
+ * apps that have a soft-logout RPC + in-place UI swap (no reload),
762
+ * pass `onLogout` instead — it takes precedence over `logoutUrl`. */
763
+ readonly logoutUrl?: string;
764
+ /** Callback-style logout — fires when the user picks "Log out". When
765
+ * supplied, replaces the form-post-to-`logoutUrl` flow with a pure
766
+ * JS handler. Use this for soft-logout flows that re-issue
767
+ * subscriptions on the same WebSocket without navigating away. */
768
+ readonly onLogout?: () => void;
769
+ readonly signInUrl?: string;
770
+ /** User-facing strings — pass values from the consuming app's catalog
771
+ * to localize the menu's own chrome. Defaults are English. */
772
+ readonly labels?: ProfileMenuLabels;
773
+ }
774
+
775
+ export declare const PuzzleIcon: (p: DocIconProps) => ReactNode;
776
+
777
+ export declare const RocketIcon: (p: DocIconProps) => ReactNode;
778
+
779
+ export declare const RssIcon: (p: DocIconProps) => ReactNode;
780
+
781
+ export declare const ScrollReveal: ({ children, className, distance, delay, threshold, disabled, }: ScrollRevealProps) => ReactNode;
782
+
783
+ declare interface ScrollRevealProps {
784
+ readonly children: ReactNode;
785
+ readonly className?: string;
786
+ /** Pixel distance the element rises from. Default 24. */
787
+ readonly distance?: number;
788
+ /** Delay before the animation runs, in ms. Default 0. */
789
+ readonly delay?: number;
790
+ /** Intersection threshold 0…1. Default 0.15 — element starts
791
+ * animating when 15% of it is in view. */
792
+ readonly threshold?: number;
793
+ /** Disable the animation entirely (passthrough). Useful when the
794
+ * parent is already a stagger container. */
795
+ readonly disabled?: boolean;
796
+ }
797
+
798
+ export declare const SearchIcon: (p: DocIconProps) => ReactNode;
799
+
800
+ export declare const SearchModal: <TItem>({ search, renderItem, itemKey, onSelect, placeholder, emptyLabel, empty, open: controlledOpen, onOpenChange, labels, }: SearchModalProps<TItem>) => ReactNode;
801
+
802
+ export declare interface SearchModalLabels {
803
+ /** `aria-label` of the dialog. Default `'Search'`. */
804
+ readonly dialog?: string;
805
+ /** `aria-label` of the click-to-close backdrop. Default `'Close search'`. */
806
+ readonly close?: string;
807
+ /** Prompt shown when the input is empty (and no `empty` node given).
808
+ * Default `'Start typing to search.'`. */
809
+ readonly startTyping?: string;
810
+ /** Footer caption next to the ↑↓ keys. Default `'navigate'`. */
811
+ readonly navigate?: string;
812
+ /** Footer caption next to the return key. Default `'select'`. */
813
+ readonly select?: string;
814
+ /** Footer caption next to the ⌘K key. Default `'toggle'`. */
815
+ readonly toggle?: string;
816
+ }
817
+
818
+ export declare interface SearchModalProps<TItem> {
819
+ /** Search function — called on every keystroke. Should return
820
+ * results synchronously (the kit doesn't manage async state here;
821
+ * if you need async, debounce + useState in the caller). */
822
+ readonly search: (query: string) => ReadonlyArray<TItem>;
823
+ /** Renders a single hit. Receives the item + whether it's currently
824
+ * highlighted (for hover/keyboard focus styles). */
825
+ readonly renderItem: (item: TItem, isActive: boolean) => ReactNode;
826
+ /** Stable key for an item — used for React keys + the active index
827
+ * match across renders. */
828
+ readonly itemKey: (item: TItem) => string;
829
+ /** Selecting a hit (click OR Enter). Caller typically navigates. */
830
+ readonly onSelect: (item: TItem) => void;
831
+ /** Placeholder for the input. */
832
+ readonly placeholder?: string;
833
+ /** Label shown when there are no hits + the query has 1+ char. */
834
+ readonly emptyLabel?: string;
835
+ /** Initial empty state — when the input is empty. Show recent
836
+ * searches, sections, whatever fits. */
837
+ readonly empty?: ReactNode;
838
+ /** Open state — controlled. Default uses internal state. */
839
+ readonly open?: boolean;
840
+ readonly onOpenChange?: (open: boolean) => void;
841
+ /** User-facing strings for the modal's own chrome (dialog/backdrop
842
+ * aria-labels, footer hint captions, initial-state prompt). Defaults
843
+ * are English so the modal works unconfigured. */
844
+ readonly labels?: SearchModalLabels;
845
+ }
846
+
847
+ export declare const SearchTrigger: ({ onClick, placeholder, openLabel, className, }: SearchTriggerProps) => ReactNode;
848
+
849
+ declare interface SearchTriggerProps {
850
+ readonly onClick: () => void;
851
+ readonly placeholder?: string;
852
+ /** `aria-label` for the trigger button. Default `'Open search'`. */
853
+ readonly openLabel?: string;
854
+ readonly className?: string;
855
+ }
856
+
857
+ export declare const Select: ({ className, children, ...props }: SelectHTMLAttributes<HTMLSelectElement>) => ReactNode;
858
+
859
+ export declare const Separator: ({ className, orientation, ...props }: SeparatorProps) => ReactNode;
860
+
861
+ declare interface SeparatorProps extends HTMLAttributes<HTMLDivElement> {
862
+ readonly orientation?: 'horizontal' | 'vertical';
863
+ }
864
+
865
+ /** Build a `Set-Cookie`-style string AND, in the browser, write it to
866
+ * `document.cookie`. Returns the string so SSR callers can emit a header. */
867
+ export declare const setCookie: (name: string, value: string, options?: SetCookieOptions) => string;
868
+
869
+ export declare interface SetCookieOptions {
870
+ /** Default: 400 days (Chrome's cap). Pass 0 to delete the cookie. */
871
+ readonly maxAgeSeconds?: number;
872
+ /** Default: '/' — preference applies app-wide. */
873
+ readonly path?: string;
874
+ /** Default: 'lax' — allows top-level navigation but blocks cross-site
875
+ * XHR, which is what preference cookies want. 'none' implies `Secure`
876
+ * (modern browsers reject a SameSite=None cookie without it). */
877
+ readonly sameSite?: 'lax' | 'strict' | 'none';
878
+ }
879
+
880
+ /** Tailwind-styled widgets keyed by widget kind. Pass to
881
+ * `<WidgetRegistryProvider widgets={shadcnWidgets}>`. Any kind not listed
882
+ * here falls back to @voltro/ui's plain accessible default — today that is
883
+ * only `hidden` (invisible anyway) and `custom` (the render-prop signal).
884
+ * Value contracts mirror the plain defaults exactly: `daterange` and
885
+ * `async-select` are styled text inputs until the framework grows richer
886
+ * bindings for those kinds (same ceiling as @voltro/ui's defaults). */
887
+ export declare const shadcnWidgets: WidgetRegistry;
888
+
889
+ export declare interface ShellLinkProps {
890
+ readonly to: string;
891
+ readonly className?: string;
892
+ readonly children: ReactNode;
893
+ /** Pre-warm the destination on hover/focus. */
894
+ readonly prefetch?: boolean;
895
+ }
896
+
897
+ export declare const SHIKI_LANGS: readonly ["text", "ts", "tsx", "typescript", "js", "jsx", "json", "bash", "sh", "shell", "sql", "yaml", "toml", "md", "mdx", "html", "css", "diff"];
898
+
899
+ export declare type ShikiLang = typeof SHIKI_LANGS[number];
900
+
901
+ export declare const SiteFooter: ({ brand, tagline, social, columns, bottomLeft, bottomRight, copyrightHolder, socialLabel, LinkComponent, className, }: SiteFooterProps) => ReactNode;
902
+
903
+ export declare interface SiteFooterColumn {
904
+ /** Section heading — rendered as small uppercase tracking. */
905
+ readonly title: ReactNode;
906
+ readonly links: ReadonlyArray<SiteFooterLink>;
907
+ }
908
+
909
+ export declare interface SiteFooterLink {
910
+ readonly label: ReactNode;
911
+ readonly href: string;
912
+ /** External links bypass the internal Link (router) so they navigate
913
+ * via plain <a>. Defaults to detecting `http:`/`https:` prefix in
914
+ * the href. */
915
+ readonly external?: boolean;
916
+ /** Small label shown next to the link text (e.g. "new", "beta"). */
917
+ readonly badge?: ReactNode;
918
+ }
919
+
920
+ declare interface SiteFooterProps {
921
+ /** Brand mark — usually a small wordmark + Badge. */
922
+ readonly brand: ReactNode;
923
+ /** Short paragraph under the brand. ~2 lines of prose. */
924
+ readonly tagline?: ReactNode;
925
+ /** Social / external profile links. Rendered as a row of 32×32
926
+ * icon buttons under the tagline. */
927
+ readonly social?: ReadonlyArray<SiteFooterSocial>;
928
+ /** The column groups. 3 columns is the visual sweet spot; 4 fits
929
+ * but starts feeling busy. */
930
+ readonly columns: ReadonlyArray<SiteFooterColumn>;
931
+ /** Bottom strip slots. Left typically holds the copyright; right
932
+ * holds status / language / theme toggle. When `bottomLeft` is
933
+ * omitted, a default `© {year} {copyrightHolder}` line renders. */
934
+ readonly bottomLeft?: ReactNode;
935
+ readonly bottomRight?: ReactNode;
936
+ /** Copyright holder shown in the default bottom-left line (only when
937
+ * `bottomLeft` is not supplied). Default `'Voltro. Built on the
938
+ * framework.'`. Pass your own so the shipped footer isn't Voltro-
939
+ * branded. */
940
+ readonly copyrightHolder?: ReactNode;
941
+ /** `aria-label` for the social-links list. Default `'Social links'`. */
942
+ readonly socialLabel?: string;
943
+ /** Optional client-router Link. Same contract as the other kit
944
+ * compositions. Defaults to plain <a>. */
945
+ readonly LinkComponent?: ComponentType<ShellLinkProps>;
946
+ readonly className?: string;
947
+ }
948
+
949
+ export declare interface SiteFooterSocial {
950
+ /** Accessible label, e.g. "GitHub". */
951
+ readonly label: string;
952
+ readonly href: string;
953
+ readonly icon: ReactNode;
954
+ }
955
+
956
+ export declare const Skeleton: ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => ReactNode;
957
+
958
+ export declare const Sparkles: ({ count, tone, intensity, className, }: SparklesProps) => ReactNode;
959
+
960
+ declare interface SparklesProps {
961
+ /** How many dots to render. Default 22. Sweet spot is 16–28 —
962
+ * fewer feels accidental, more starts to feel busy. */
963
+ readonly count?: number;
964
+ /** Brand mode. Cool = violet/cyan accents (default); warm = amber/rose. */
965
+ readonly tone?: 'cool' | 'warm';
966
+ /** Density tier. `'subtle'` is the default and what most heros want;
967
+ * `'normal'` bumps the max-opacity peak a bit; `'strong'` makes
968
+ * the field more obvious. Each tier still respects the
969
+ * "professional, not playful" budget. */
970
+ readonly intensity?: 'subtle' | 'normal' | 'strong';
971
+ readonly className?: string;
972
+ }
973
+
974
+ export declare interface StatSpec {
975
+ /** Numeric value — drives the count-up animation. */
976
+ readonly value: number;
977
+ /** Optional unit suffix shown next to the value (e.g. "ms", "%"). */
978
+ readonly unit?: string;
979
+ /** Static prefix (e.g. "<", "~"). Useful for things like "<5ms". */
980
+ readonly prefix?: string;
981
+ /** Formatter — passed through to AnimatedNumber. */
982
+ readonly format?: 'integer' | 'percent' | ((n: number) => string);
983
+ /** Caption below the number (becomes the eyebrow label at the top
984
+ * of the cell). */
985
+ readonly label: ReactNode;
986
+ /** Small sub-caption below the number. */
987
+ readonly sub?: ReactNode;
988
+ /** Optional icon — pass any kit icon. Sized to the eyebrow's
989
+ * cap-height so it reads as part of the label, not as decoration. */
990
+ readonly icon?: ReactNode;
991
+ }
992
+
993
+ export declare const StatusBadge: ({ href, label, tone, }: StatusBadgeProps) => ReactNode;
994
+
995
+ declare interface StatusBadgeProps {
996
+ readonly href: string;
997
+ readonly label?: ReactNode;
998
+ /** `'ok' | 'degraded' | 'down'` — colours the dot accordingly. */
999
+ readonly tone?: 'ok' | 'degraded' | 'down';
1000
+ }
1001
+
1002
+ export declare const Step: ({ title, children, className }: StepProps) => ReactNode;
1003
+
1004
+ declare interface StepProps {
1005
+ readonly title?: ReactNode;
1006
+ readonly children: ReactNode;
1007
+ readonly className?: string;
1008
+ }
1009
+
1010
+ export declare const Steps: ({ children, className }: StepsProps) => ReactNode;
1011
+
1012
+ declare interface StepsProps {
1013
+ readonly children: ReactNode;
1014
+ readonly className?: string;
1015
+ }
1016
+
1017
+ export declare const Tabs: ({ defaultValue, value, onValueChange, className, children, ...props }: TabsProps) => ReactNode;
1018
+
1019
+ export declare const TabsContent: ({ value, className, children, ...props }: TabsContentProps) => ReactNode;
1020
+
1021
+ declare interface TabsContentProps extends HTMLAttributes<HTMLDivElement> {
1022
+ readonly value: string;
1023
+ }
1024
+
1025
+ export declare const TabsList: ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => ReactNode;
1026
+
1027
+ declare interface TabsProps extends HTMLAttributes<HTMLDivElement> {
1028
+ readonly defaultValue: string;
1029
+ readonly value?: string;
1030
+ readonly onValueChange?: (v: string) => void;
1031
+ }
1032
+
1033
+ export declare const TabsTrigger: ({ value, className, children, ...props }: TabsTriggerProps) => ReactNode;
1034
+
1035
+ declare interface TabsTriggerProps extends HTMLAttributes<HTMLButtonElement> {
1036
+ readonly value: string;
1037
+ }
1038
+
1039
+ export declare const TerminalIcon: (p: DocIconProps) => ReactNode;
1040
+
1041
+ export declare const Textarea: ({ className, ...props }: TextareaHTMLAttributes<HTMLTextAreaElement>) => ReactNode;
1042
+
1043
+ export declare const THEME_COOKIE = "voltro:theme";
1044
+
1045
+ /**
1046
+ * Inline script to drop into <head>. Reads the `voltro:theme` cookie
1047
+ * (set by ThemeToggle / ProfileMenu) BEFORE React hydrates so the
1048
+ * initial paint matches — no FOUC even when the server hasn't yet
1049
+ * baked the cookie-derived class.
1050
+ *
1051
+ * <script dangerouslySetInnerHTML={{ __html: themeBootScript() }} />
1052
+ *
1053
+ * Cookie wins over matchMedia: 'system' (or absent) falls back to
1054
+ * the OS preference; 'light' / 'dark' are absolute.
1055
+ */
1056
+ export declare const themeBootScript: () => string;
1057
+
1058
+ export declare type ThemePreference = 'system' | 'light' | 'dark';
1059
+
1060
+ export declare const ThemeToggle: ({ className, lightLabel, darkLabel, switchToLightLabel, switchToDarkLabel, ...props }: ThemeToggleProps) => ReactNode;
1061
+
1062
+ declare interface ThemeToggleProps extends HTMLAttributes<HTMLButtonElement> {
1063
+ readonly lightLabel?: ReactNode;
1064
+ readonly darkLabel?: ReactNode;
1065
+ /** `aria-label` while dark is active (the action = go light).
1066
+ * Default `'Switch to light theme'` — pass a catalog value to localize. */
1067
+ readonly switchToLightLabel?: string;
1068
+ /** `aria-label` while light is active (the action = go dark).
1069
+ * Default `'Switch to dark theme'` — pass a catalog value to localize. */
1070
+ readonly switchToDarkLabel?: string;
1071
+ }
1072
+
1073
+ export declare const Toast: ({ variant, className, children, ...props }: ToastProps) => ReactNode;
1074
+
1075
+ export declare const ToastDescription: ({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) => ReactNode;
1076
+
1077
+ declare interface ToastProps extends HTMLAttributes<HTMLDivElement> {
1078
+ readonly variant?: 'default' | 'destructive' | 'success';
1079
+ }
1080
+
1081
+ export declare const ToastTitle: ({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) => ReactNode;
1082
+
1083
+ export declare const TocScrollSpy: ({ contentSelector }: TocScrollSpyProps) => ReactNode;
1084
+
1085
+ declare interface TocScrollSpyProps {
1086
+ /** CSS selector for the content container holding the headings.
1087
+ * Defaults to `main` since the layout's content lives there. */
1088
+ readonly contentSelector?: string;
1089
+ }
1090
+
1091
+ export declare const Toggle: ForwardRefExoticComponent<Omit<RT.ToggleProps & RefAttributes<HTMLButtonElement>, "ref"> & VariantProps<(props?: ({
1092
+ variant?: "default" | "outline" | null | undefined;
1093
+ size?: "default" | "sm" | "lg" | null | undefined;
1094
+ } & ClassProp) | undefined) => string> & RefAttributes<HTMLButtonElement>>;
1095
+
1096
+ export declare const ToggleGroup: ForwardRefExoticComponent<(ComponentPropsWithoutRef< ForwardRefExoticComponent<(RTG.ToggleGroupSingleProps | RTG.ToggleGroupMultipleProps) & RefAttributes<HTMLDivElement>>> & ToggleGroupVariants) & RefAttributes<HTMLDivElement>>;
1097
+
1098
+ export declare const ToggleGroupItem: ForwardRefExoticComponent<Omit<RTG.ToggleGroupItemProps & RefAttributes<HTMLButtonElement>, "ref"> & ToggleGroupVariants & RefAttributes<HTMLButtonElement>>;
1099
+
1100
+ declare type ToggleGroupVariants = VariantProps<typeof toggleVariants>;
1101
+
1102
+ export declare const toggleVariants: (props?: ({
1103
+ variant?: "default" | "outline" | null | undefined;
1104
+ size?: "default" | "sm" | "lg" | null | undefined;
1105
+ } & ClassProp) | undefined) => string;
1106
+
1107
+ export declare const UI_SHADCN_NAME: "framework-ui-shadcn";
1108
+
1109
+ /** Raw bolt path data, for apps that need to compose their own SVG. */
1110
+ export declare const VOLTRO_BOLT_PATH: {
1111
+ readonly full: "M28 5 13 27 22 26 20 43 35 21 26 22Z";
1112
+ readonly front: "M28 5 13 27 22 26 20 43Z";
1113
+ readonly back: "M28 5 20 43 35 21 26 22Z";
1114
+ };
1115
+
1116
+ /** Brand violet — the canonical primary. Exposed for ad-hoc usage. */
1117
+ export declare const VOLTRO_VIOLET = "#7C3AED";
1118
+
1119
+ /**
1120
+ * The app / advertising icon: the bolt centred on a rounded square with
1121
+ * its own background, so it stands on a home screen, store listing, or
1122
+ * ad placement regardless of the surface behind it.
1123
+ */
1124
+ export declare const VoltroIcon: ({ size, tone, radius, title, className, style, }: VoltroIconProps) => ReactNode;
1125
+
1126
+ export declare interface VoltroIconProps {
1127
+ /** Pixel size (square). Default 40. */
1128
+ readonly size?: number;
1129
+ /** `brand` (violet squircle + white bolt — works on any surface) · `dark` (near-black squircle + glowing violet bolt). */
1130
+ readonly tone?: VoltroIconTone;
1131
+ /** Corner radius as a fraction of size. Default 0.225 (iOS-style squircle look). */
1132
+ readonly radius?: number;
1133
+ readonly title?: string;
1134
+ readonly className?: string;
1135
+ readonly style?: CSSProperties;
1136
+ }
1137
+
1138
+ export declare type VoltroIconTone = 'brand' | 'dark';
1139
+
1140
+ /** The bolt mark on a transparent background. */
1141
+ export declare const VoltroMark: ({ size, variant, title, className, ...rest }: VoltroMarkProps) => ReactNode;
1142
+
1143
+ export declare interface VoltroMarkProps extends Omit<SVGProps<SVGSVGElement>, 'width' | 'height' | 'viewBox' | 'fill' | 'xmlns' | 'children' | 'ref' | 'role' | 'aria-label' | 'aria-hidden'> {
1144
+ /** Pixel size (square). Default 32. Pass a string like '1em' to track font-size. */
1145
+ readonly size?: number | string;
1146
+ /** `gradient` (default, two-facet violet) · `mono` (currentColor) · `white`. */
1147
+ readonly variant?: VoltroMarkVariant;
1148
+ /** Accessible label. Omit + set `aria-hidden` when paired with a text label. */
1149
+ readonly title?: string;
1150
+ }
1151
+
1152
+ export declare type VoltroMarkVariant = 'gradient' | 'mono' | 'white';
1153
+
1154
+ /**
1155
+ * Mark + wordmark lock-up for headers / marketing. The text is real
1156
+ * type set in the surrounding font and `currentColor`, so it inherits
1157
+ * the app's typography and is correct in light + dark automatically.
1158
+ */
1159
+ export declare const VoltroWordmark: ({ size, markVariant, label, className, style, }: VoltroWordmarkProps) => ReactNode;
1160
+
1161
+ export declare interface VoltroWordmarkProps {
1162
+ /** Mark height in px; the wordmark text scales with it. Default 28. */
1163
+ readonly size?: number;
1164
+ readonly markVariant?: VoltroMarkVariant;
1165
+ /** Wordmark label. Default "Voltro". */
1166
+ readonly label?: string;
1167
+ readonly className?: string;
1168
+ readonly style?: CSSProperties;
1169
+ }
1170
+
1171
+ /** Promise that resolves once Shiki has loaded — for SSR/build callers
1172
+ * that want to await before rendering. */
1173
+ export declare const whenHighlighterReady: () => Promise<void>;
1174
+
1175
+ export declare const XIcon: (p: DocIconProps) => ReactNode;
1176
+
1177
+ export { }
1178
+
1179
+
1180
+ declare global {
1181
+ var __voltroShikiHighlighter: Highlighter | null | undefined;
1182
+ var __voltroShikiHighlighterPromise: Promise<Highlighter | null> | null | undefined;
1183
+ }