@fiestaboard/ui 1.6.3

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 (201) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +153 -0
  3. package/dist/components/board/board-display.d.ts +35 -0
  4. package/dist/components/board/board-display.js +514 -0
  5. package/dist/components/board/board-display.js.map +1 -0
  6. package/dist/components/board/board-teaser.d.ts +10 -0
  7. package/dist/components/board/board-teaser.js +110 -0
  8. package/dist/components/board/board-teaser.js.map +1 -0
  9. package/dist/components/board/scaled-board-display.d.ts +37 -0
  10. package/dist/components/board/scaled-board-display.js +118 -0
  11. package/dist/components/board/scaled-board-display.js.map +1 -0
  12. package/dist/components/board/static-board-display.d.ts +17 -0
  13. package/dist/components/board/static-board-display.js +140 -0
  14. package/dist/components/board/static-board-display.js.map +1 -0
  15. package/dist/components/chrome/board-icon.d.ts +11 -0
  16. package/dist/components/chrome/board-icon.js +31 -0
  17. package/dist/components/chrome/board-icon.js.map +1 -0
  18. package/dist/components/chrome/board-selector.d.ts +30 -0
  19. package/dist/components/chrome/board-selector.js +37 -0
  20. package/dist/components/chrome/board-selector.js.map +1 -0
  21. package/dist/components/chrome/fiesta-icon.d.ts +28 -0
  22. package/dist/components/chrome/fiesta-icon.js +129 -0
  23. package/dist/components/chrome/fiesta-icon.js.map +1 -0
  24. package/dist/components/chrome/fiesta-logo.d.ts +6 -0
  25. package/dist/components/chrome/fiesta-logo.js +20 -0
  26. package/dist/components/chrome/fiesta-logo.js.map +1 -0
  27. package/dist/components/chrome/language-selector.d.ts +21 -0
  28. package/dist/components/chrome/language-selector.js +29 -0
  29. package/dist/components/chrome/language-selector.js.map +1 -0
  30. package/dist/components/chrome/main-content.d.ts +28 -0
  31. package/dist/components/chrome/main-content.js +33 -0
  32. package/dist/components/chrome/main-content.js.map +1 -0
  33. package/dist/components/chrome/page-header.d.ts +23 -0
  34. package/dist/components/chrome/page-header.js +69 -0
  35. package/dist/components/chrome/page-header.js.map +1 -0
  36. package/dist/components/chrome/page-layout.d.ts +10 -0
  37. package/dist/components/chrome/page-layout.js +17 -0
  38. package/dist/components/chrome/page-layout.js.map +1 -0
  39. package/dist/components/chrome/page-toolbar.d.ts +7 -0
  40. package/dist/components/chrome/page-toolbar.js +21 -0
  41. package/dist/components/chrome/page-toolbar.js.map +1 -0
  42. package/dist/components/chrome/sidebar.d.ts +83 -0
  43. package/dist/components/chrome/sidebar.js +318 -0
  44. package/dist/components/chrome/sidebar.js.map +1 -0
  45. package/dist/components/chrome/skip-to-content.d.ts +8 -0
  46. package/dist/components/chrome/skip-to-content.js +15 -0
  47. package/dist/components/chrome/skip-to-content.js.map +1 -0
  48. package/dist/components/chrome/theme-toggle.d.ts +22 -0
  49. package/dist/components/chrome/theme-toggle.js +28 -0
  50. package/dist/components/chrome/theme-toggle.js.map +1 -0
  51. package/dist/components/seasons/aurora-canvas.d.ts +22 -0
  52. package/dist/components/seasons/aurora-canvas.js +88 -0
  53. package/dist/components/seasons/aurora-canvas.js.map +1 -0
  54. package/dist/components/seasons/sidebar-aurora-horizontal.d.ts +3 -0
  55. package/dist/components/seasons/sidebar-aurora-horizontal.js +47 -0
  56. package/dist/components/seasons/sidebar-aurora-horizontal.js.map +1 -0
  57. package/dist/components/seasons/sidebar-aurora.d.ts +3 -0
  58. package/dist/components/seasons/sidebar-aurora.js +57 -0
  59. package/dist/components/seasons/sidebar-aurora.js.map +1 -0
  60. package/dist/components/ui/accordion.d.ts +16 -0
  61. package/dist/components/ui/accordion.js +55 -0
  62. package/dist/components/ui/accordion.js.map +1 -0
  63. package/dist/components/ui/alert-dialog.d.ts +16 -0
  64. package/dist/components/ui/alert-dialog.js +78 -0
  65. package/dist/components/ui/alert-dialog.js.map +1 -0
  66. package/dist/components/ui/alert.d.ts +9 -0
  67. package/dist/components/ui/alert.js +41 -0
  68. package/dist/components/ui/alert.js.map +1 -0
  69. package/dist/components/ui/aurora.d.ts +9 -0
  70. package/dist/components/ui/aurora.js +105 -0
  71. package/dist/components/ui/aurora.js.map +1 -0
  72. package/dist/components/ui/badge.d.ts +9 -0
  73. package/dist/components/ui/badge.js +35 -0
  74. package/dist/components/ui/badge.js.map +1 -0
  75. package/dist/components/ui/box.d.ts +20 -0
  76. package/dist/components/ui/box.js +14 -0
  77. package/dist/components/ui/box.js.map +1 -0
  78. package/dist/components/ui/button.d.ts +10 -0
  79. package/dist/components/ui/button.js +52 -0
  80. package/dist/components/ui/button.js.map +1 -0
  81. package/dist/components/ui/card.d.ts +11 -0
  82. package/dist/components/ui/card.js +57 -0
  83. package/dist/components/ui/card.js.map +1 -0
  84. package/dist/components/ui/checkbox.d.ts +4 -0
  85. package/dist/components/ui/checkbox.js +16 -0
  86. package/dist/components/ui/checkbox.js.map +1 -0
  87. package/dist/components/ui/code.d.ts +8 -0
  88. package/dist/components/ui/code.js +15 -0
  89. package/dist/components/ui/code.js.map +1 -0
  90. package/dist/components/ui/collapsible.d.ts +8 -0
  91. package/dist/components/ui/collapsible.js +28 -0
  92. package/dist/components/ui/collapsible.js.map +1 -0
  93. package/dist/components/ui/dialog.d.ts +17 -0
  94. package/dist/components/ui/dialog.js +77 -0
  95. package/dist/components/ui/dialog.js.map +1 -0
  96. package/dist/components/ui/dropdown-menu.d.ts +32 -0
  97. package/dist/components/ui/dropdown-menu.js +129 -0
  98. package/dist/components/ui/dropdown-menu.js.map +1 -0
  99. package/dist/components/ui/empty-state.d.ts +23 -0
  100. package/dist/components/ui/empty-state.js +49 -0
  101. package/dist/components/ui/empty-state.js.map +1 -0
  102. package/dist/components/ui/flex.d.ts +24 -0
  103. package/dist/components/ui/flex.js +61 -0
  104. package/dist/components/ui/flex.js.map +1 -0
  105. package/dist/components/ui/grid.d.ts +20 -0
  106. package/dist/components/ui/grid.js +77 -0
  107. package/dist/components/ui/grid.js.map +1 -0
  108. package/dist/components/ui/heading.d.ts +18 -0
  109. package/dist/components/ui/heading.js +26 -0
  110. package/dist/components/ui/heading.js.map +1 -0
  111. package/dist/components/ui/input.d.ts +4 -0
  112. package/dist/components/ui/input.js +16 -0
  113. package/dist/components/ui/input.js.map +1 -0
  114. package/dist/components/ui/label.d.ts +4 -0
  115. package/dist/components/ui/label.js +15 -0
  116. package/dist/components/ui/label.js.map +1 -0
  117. package/dist/components/ui/list.d.ts +25 -0
  118. package/dist/components/ui/list.js +46 -0
  119. package/dist/components/ui/list.js.map +1 -0
  120. package/dist/components/ui/react-bits/decrypted-text.d.ts +14 -0
  121. package/dist/components/ui/react-bits/decrypted-text.js +88 -0
  122. package/dist/components/ui/react-bits/decrypted-text.js.map +1 -0
  123. package/dist/components/ui/react-bits/fade-content.d.ts +11 -0
  124. package/dist/components/ui/react-bits/fade-content.js +48 -0
  125. package/dist/components/ui/react-bits/fade-content.js.map +1 -0
  126. package/dist/components/ui/scroll-area.d.ts +5 -0
  127. package/dist/components/ui/scroll-area.js +39 -0
  128. package/dist/components/ui/scroll-area.js.map +1 -0
  129. package/dist/components/ui/select.d.ts +26 -0
  130. package/dist/components/ui/select.js +132 -0
  131. package/dist/components/ui/select.js.map +1 -0
  132. package/dist/components/ui/sheet.d.ts +29 -0
  133. package/dist/components/ui/sheet.js +114 -0
  134. package/dist/components/ui/sheet.js.map +1 -0
  135. package/dist/components/ui/skeleton.d.ts +2 -0
  136. package/dist/components/ui/skeleton.js +14 -0
  137. package/dist/components/ui/skeleton.js.map +1 -0
  138. package/dist/components/ui/slider.d.ts +9 -0
  139. package/dist/components/ui/slider.js +39 -0
  140. package/dist/components/ui/slider.js.map +1 -0
  141. package/dist/components/ui/stack.d.ts +16 -0
  142. package/dist/components/ui/stack.js +44 -0
  143. package/dist/components/ui/stack.js.map +1 -0
  144. package/dist/components/ui/switch.d.ts +4 -0
  145. package/dist/components/ui/switch.js +24 -0
  146. package/dist/components/ui/switch.js.map +1 -0
  147. package/dist/components/ui/table.d.ts +13 -0
  148. package/dist/components/ui/table.js +54 -0
  149. package/dist/components/ui/table.js.map +1 -0
  150. package/dist/components/ui/tabs.d.ts +7 -0
  151. package/dist/components/ui/tabs.js +37 -0
  152. package/dist/components/ui/tabs.js.map +1 -0
  153. package/dist/components/ui/text-link.d.ts +9 -0
  154. package/dist/components/ui/text-link.js +15 -0
  155. package/dist/components/ui/text-link.js.map +1 -0
  156. package/dist/components/ui/text.d.ts +22 -0
  157. package/dist/components/ui/text.js +48 -0
  158. package/dist/components/ui/text.js.map +1 -0
  159. package/dist/components/ui/textarea.d.ts +3 -0
  160. package/dist/components/ui/textarea.js +15 -0
  161. package/dist/components/ui/textarea.js.map +1 -0
  162. package/dist/components/ui/tooltip.d.ts +16 -0
  163. package/dist/components/ui/tooltip.js +38 -0
  164. package/dist/components/ui/tooltip.js.map +1 -0
  165. package/dist/fonts.css +16 -0
  166. package/dist/index.d.ts +66 -0
  167. package/dist/index.js +59 -0
  168. package/dist/lib/board-characters.d.ts +55 -0
  169. package/dist/lib/board-characters.js +151 -0
  170. package/dist/lib/board-characters.js.map +1 -0
  171. package/dist/lib/board-colors.d.ts +48 -0
  172. package/dist/lib/board-colors.js +93 -0
  173. package/dist/lib/board-colors.js.map +1 -0
  174. package/dist/lib/board-dimensions.d.ts +41 -0
  175. package/dist/lib/board-dimensions.js +38 -0
  176. package/dist/lib/board-dimensions.js.map +1 -0
  177. package/dist/lib/board-metrics.d.ts +19 -0
  178. package/dist/lib/board-metrics.js +22 -0
  179. package/dist/lib/board-metrics.js.map +1 -0
  180. package/dist/lib/seasons-drafts.d.ts +26 -0
  181. package/dist/lib/seasons-drafts.js +106 -0
  182. package/dist/lib/seasons-drafts.js.map +1 -0
  183. package/dist/lib/seasons.d.ts +52 -0
  184. package/dist/lib/seasons.js +59 -0
  185. package/dist/lib/seasons.js.map +1 -0
  186. package/dist/lib/select-items.d.ts +29 -0
  187. package/dist/lib/select-items.js +35 -0
  188. package/dist/lib/select-items.js.map +1 -0
  189. package/dist/lib/utils.d.ts +2 -0
  190. package/dist/lib/utils.js +11 -0
  191. package/dist/lib/utils.js.map +1 -0
  192. package/dist/seasons/christmas.css +64 -0
  193. package/dist/seasons/easter.css +62 -0
  194. package/dist/seasons/fathers-day.css +62 -0
  195. package/dist/seasons/halloween.css +69 -0
  196. package/dist/seasons/mothers-day.css +63 -0
  197. package/dist/seasons/new-year.css +66 -0
  198. package/dist/seasons/pride.css +68 -0
  199. package/dist/seasons/thanksgiving.css +64 -0
  200. package/dist/theme.css +1174 -0
  201. package/package.json +108 -0
@@ -0,0 +1,21 @@
1
+ export interface LanguageOption {
2
+ value: string;
3
+ label: string;
4
+ }
5
+ interface LanguageSelectorProps {
6
+ /** Current locale value. */
7
+ value: string;
8
+ /** Available locales with display names, in menu order. */
9
+ options: LanguageOption[];
10
+ /** Called with the newly selected locale value. */
11
+ onChange: (value: string) => void;
12
+ /** Localized accessible label for the trigger, e.g. "Language". */
13
+ label: string;
14
+ disabled?: boolean;
15
+ }
16
+ /**
17
+ * Controlled presentational language picker. Locale registry, cookie
18
+ * persistence, and the i18next mutation stay in the app wrapper.
19
+ */
20
+ export declare const LanguageSelector: import("react").MemoExoticComponent<({ value, options, onChange, label, disabled, }: LanguageSelectorProps) => import("react").JSX.Element>;
21
+ export {};
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { Select as e, SelectContent as t, SelectItem as n, SelectTrigger as r, SelectValue as i } from "../ui/select.js";
3
+ import { Globe as a } from "lucide-react";
4
+ import { memo as o } from "react";
5
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
6
+ //#region src/components/chrome/language-selector.tsx
7
+ var l = o(function({ value: o, options: l, onChange: u, label: d, disabled: f }) {
8
+ return /* @__PURE__ */ c(e, {
9
+ value: o,
10
+ onValueChange: u,
11
+ disabled: f,
12
+ children: [/* @__PURE__ */ c(r, {
13
+ className: "h-8 w-[130px] text-xs gap-1",
14
+ "aria-label": d,
15
+ children: [/* @__PURE__ */ s(a, {
16
+ className: "h-3.5 w-3.5 flex-shrink-0",
17
+ "aria-hidden": "true"
18
+ }), /* @__PURE__ */ s(i, {})]
19
+ }), /* @__PURE__ */ s(t, { children: l.map((e) => /* @__PURE__ */ s(n, {
20
+ value: e.value,
21
+ className: "text-xs",
22
+ children: e.label
23
+ }, e.value)) })]
24
+ });
25
+ });
26
+ //#endregion
27
+ export { l as LanguageSelector };
28
+
29
+ //# sourceMappingURL=language-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language-selector.js","names":[],"sources":["../../../src/components/chrome/language-selector.tsx"],"mappings":";;;;;;AA4BA,IAAa,IAAmB,EAAK,SAA0B,EAC7D,UACA,YACA,aACA,UACA,eACwB;CACxB,OACE,kBAAC,GAAD;EAAe;EAAO,eAAe;EAAoB;EAAzD,UAAA,CACE,kBAAC,GAAD;GAAe,WAAU;GAA8B,cAAY;GAAnE,UAAA,CACE,kBAAC,GAAD;IAAO,WAAU;IAA4B,eAAY;GAAQ,CAAA,GACjE,kBAAC,GAAD,CAAc,CAAA,CACD;EACf,CAAA,GAAA,kBAAC,GAAD,EAAA,UACG,EAAQ,KAAK,MACZ,kBAAC,GAAD;GAA4B,OAAO,EAAI;GAAO,WAAU;GACrD,UAAA,EAAI;EACK,GAFK,EAAI,KAET,CACb,EACY,CAAA,CACT;;AAEZ,CAAC"}
@@ -0,0 +1,28 @@
1
+ interface MainContentProps {
2
+ children: React.ReactNode;
3
+ /** Sidebar collapse state (drives left padding). */
4
+ collapsed: boolean;
5
+ /** True while the sidebar width transition is running. */
6
+ transitioning?: boolean;
7
+ /** Whether the app-wide AI panel is open (drives right padding). */
8
+ aiPanelOpen?: boolean;
9
+ /** Auth screens render edge-to-edge with no chrome padding. */
10
+ isAuthScreen?: boolean;
11
+ /** App max width in px (FiestaBoard passes MAX_APP_WIDTH). */
12
+ maxWidth?: number;
13
+ /** Fired when the collapse/expand slide completes. */
14
+ onTransitionEnd?: () => void;
15
+ }
16
+ /**
17
+ * The app's main landmark. Layout math is presentational; collapse/AI-panel
18
+ * state and route awareness are injected by the app shell.
19
+ *
20
+ * Sidebar collapse/expand (#92): the paddings on <main> snap instantly (one
21
+ * layout pass) and an inner wrapper FLIPs — it starts translated at the old
22
+ * visual offset and slides to identity via a compositor-only transform
23
+ * transition — instead of transitioning padding-left, which relayouted the
24
+ * entire content subtree on every animation frame. The settled state carries
25
+ * no transform (the inline style is cleared, so computed transform is none).
26
+ */
27
+ export declare const MainContent: import("react").MemoExoticComponent<({ children, collapsed, transitioning, aiPanelOpen, isAuthScreen, maxWidth, onTransitionEnd, }: MainContentProps) => import("react").JSX.Element>;
28
+ export {};
@@ -0,0 +1,33 @@
1
+ "use client";
2
+ import { cn as e } from "../../lib/utils.js";
3
+ import { memo as t, useLayoutEffect as n, useRef as r } from "react";
4
+ import { jsx as i } from "react/jsx-runtime";
5
+ //#region src/components/chrome/main-content.tsx
6
+ var a = t(function({ children: t, collapsed: a, transitioning: o = !1, aiPanelOpen: s = !1, isAuthScreen: c = !1, maxWidth: l, onTransitionEnd: u }) {
7
+ let d = r(null), f = r(null), p = r(a);
8
+ return n(() => {
9
+ if (p.current === a) return;
10
+ p.current = a;
11
+ let e = d.current, t = f.current;
12
+ if (!e || !t || c || !window.matchMedia("(min-width: 1024px)").matches || parseFloat(getComputedStyle(t).transitionDuration) === 0) return;
13
+ let n = new DOMMatrixReadOnly(getComputedStyle(t).transform).e, r = (a ? 192 : -192) + n;
14
+ e.style.overflowX = "clip", t.style.transition = "none", t.style.transform = `translateX(${r}px)`, t.getBoundingClientRect(), t.style.transition = "", t.style.transform = "";
15
+ }, [a, c]), /* @__PURE__ */ i("main", {
16
+ ref: d,
17
+ id: "main-content",
18
+ className: e("min-h-dvh flex flex-col w-full mx-auto", !c && "pt-[calc(var(--mobile-header-height,56px)+16px)] lg:pt-0 content-root", !c && (a ? "lg:pl-[76px]" : "lg:pl-[268px]"), !c && (s ? "lg:pr-[384px]" : "lg:pr-0")),
19
+ style: { maxWidth: c ? void 0 : l },
20
+ children: /* @__PURE__ */ i("div", {
21
+ ref: f,
22
+ className: e("flex grow flex-col content-shift", !c && o && "is-transitioning"),
23
+ onTransitionEnd: (e) => {
24
+ e.target === e.currentTarget && e.propertyName === "transform" && (d.current && (d.current.style.overflowX = ""), u?.());
25
+ },
26
+ children: t
27
+ })
28
+ });
29
+ });
30
+ //#endregion
31
+ export { a as MainContent };
32
+
33
+ //# sourceMappingURL=main-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-content.js","names":[],"sources":["../../../src/components/chrome/main-content.tsx"],"mappings":";;;;;AAqCA,IAAa,IAAc,EAAK,SAAqB,EACnD,aACA,cACA,mBAAgB,IAChB,iBAAc,IACd,kBAAe,IACf,aACA,sBACmB;CACnB,IAAM,IAAU,EAAoB,IAAI,GAClC,IAAW,EAAuB,IAAI,GACtC,IAAgB,EAAO,CAAS;CAkCtC,OAhCA,QAAsB;EACpB,IAAI,EAAc,YAAY,GAAW;EACzC,EAAc,UAAU;EACxB,IAAM,IAAO,EAAQ,SACf,IAAQ,EAAS;EAMvB,IALI,CAAC,KAAQ,CAAC,KAAS,KAEnB,CAAC,OAAO,WAAW,qBAAqB,CAAC,CAAC,WAG1C,WAAW,iBAAiB,CAAK,CAAC,CAAC,kBAAkB,MAAM,GAAG;EAUlE,IAAM,IAAW,IAAI,kBAAkB,iBAAiB,CAAK,CAAC,CAAC,SAAS,CAAC,CAAC,GACpE,KAAS,IAAY,MAA6B,QAA8B;EAQtF,AALA,EAAK,MAAM,YAAY,QACvB,EAAM,MAAM,aAAa,QACzB,EAAM,MAAM,YAAY,cAAc,EAAM,MAC5C,EAAW,sBAAsB,GACjC,EAAM,MAAM,aAAa,IACzB,EAAM,MAAM,YAAY;CAC1B,GAAG,CAAC,GAAW,CAAY,CAAC,GAG1B,kBAAC,QAAD;EACE,KAAK;EACL,IAAG;EACH,WAAW,EACT,0CACA,CAAC,KAAgB,yEACjB,CAAC,MAAiB,IAAY,iBAAiB,kBAC/C,CAAC,MAAiB,IAAc,kBAAkB,UACpD;EACA,OAAO,EAAE,UAAU,IAAe,KAAA,IAAY,EAAS;EAEvD,UAAA,kBAAC,OAAD;GACE,KAAK;GACL,WAAW,EAAG,oCAAoC,CAAC,KAAgB,KAAiB,kBAAkB;GACtG,kBAAkB,MAAM;IACtB,AAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,iBAAiB,gBACjD,EAAQ,YAAS,EAAQ,QAAQ,MAAM,YAAY,KACvD,IAAkB;GAEtB;GAEC;EACE,CAAA;CACD,CAAA;AAEV,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { LucideIcon } from "lucide-react";
2
+ interface PageHeaderProps {
3
+ icon: LucideIcon;
4
+ title: string;
5
+ description: string | React.ReactNode;
6
+ children?: React.ReactNode;
7
+ className?: string;
8
+ animationDelay?: string;
9
+ }
10
+ /**
11
+ * The icon stroke references the `page-icon-gradient` SVG gradient.
12
+ * Mount <PageIconGradientDefs /> once near the app root (FiestaBoard does
13
+ * this in root.tsx) or the icon falls back to an unstroked glyph.
14
+ */
15
+ export declare const PageHeader: import("react").MemoExoticComponent<({ icon: Icon, title, description, children, className, animationDelay, }: PageHeaderProps) => import("react").JSX.Element>;
16
+ /**
17
+ * Global SVG defs for the page-icon gradient. Stops read the --icon-g1..6
18
+ * custom properties from theme.css, so the gradient follows the theme
19
+ * (including the pride-month rainbow override). Render exactly once,
20
+ * anywhere in the document.
21
+ */
22
+ export declare const PageIconGradientDefs: import("react").MemoExoticComponent<() => import("react").JSX.Element>;
23
+ export {};
@@ -0,0 +1,69 @@
1
+ import { cn as e } from "../../lib/utils.js";
2
+ import { memo as t } from "react";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ //#region src/components/chrome/page-header.tsx
5
+ var i = { stroke: "url(#page-icon-gradient)" }, a = { position: "absolute" }, o = t(function({ icon: t, title: a, description: o, children: s, className: c, animationDelay: l = "0ms" }) {
6
+ return /* @__PURE__ */ r("div", {
7
+ className: e("mb-5 rounded-xl border bg-card text-card-foreground px-6 py-4 animate-card-fade-in", c),
8
+ style: { animationDelay: l },
9
+ children: [/* @__PURE__ */ r("div", {
10
+ className: "min-w-0",
11
+ children: [/* @__PURE__ */ r("h1", {
12
+ className: "page-title flex items-center gap-3",
13
+ children: [/* @__PURE__ */ n(t, {
14
+ className: "h-5 w-5 flex-shrink-0",
15
+ style: i,
16
+ "aria-hidden": "true"
17
+ }), a]
18
+ }), /* @__PURE__ */ n("p", {
19
+ className: "page-description",
20
+ children: o
21
+ })]
22
+ }), s]
23
+ });
24
+ }), s = t(function() {
25
+ return /* @__PURE__ */ n("svg", {
26
+ width: "0",
27
+ height: "0",
28
+ "aria-hidden": "true",
29
+ style: a,
30
+ children: /* @__PURE__ */ n("defs", { children: /* @__PURE__ */ r("linearGradient", {
31
+ id: "page-icon-gradient",
32
+ gradientUnits: "userSpaceOnUse",
33
+ x1: "0",
34
+ y1: "0",
35
+ x2: "24",
36
+ y2: "24",
37
+ children: [
38
+ /* @__PURE__ */ n("stop", {
39
+ offset: "0%",
40
+ stopColor: "var(--icon-g1)"
41
+ }),
42
+ /* @__PURE__ */ n("stop", {
43
+ offset: "20%",
44
+ stopColor: "var(--icon-g2)"
45
+ }),
46
+ /* @__PURE__ */ n("stop", {
47
+ offset: "40%",
48
+ stopColor: "var(--icon-g3)"
49
+ }),
50
+ /* @__PURE__ */ n("stop", {
51
+ offset: "60%",
52
+ stopColor: "var(--icon-g4)"
53
+ }),
54
+ /* @__PURE__ */ n("stop", {
55
+ offset: "80%",
56
+ stopColor: "var(--icon-g5)"
57
+ }),
58
+ /* @__PURE__ */ n("stop", {
59
+ offset: "100%",
60
+ stopColor: "var(--icon-g6)"
61
+ })
62
+ ]
63
+ }) })
64
+ });
65
+ });
66
+ //#endregion
67
+ export { o as PageHeader, s as PageIconGradientDefs };
68
+
69
+ //# sourceMappingURL=page-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-header.js","names":[],"sources":["../../../src/components/chrome/page-header.tsx"],"mappings":";;;;AAMA,IAAM,IAA2C,EAAE,QAAQ,2BAA2B,GAChF,IAAsC,EAAE,UAAU,WAAW,GAgBtD,IAAa,EAAK,SAAoB,EACjD,MAAM,GACN,UACA,gBACA,aACA,cACA,oBAAiB,SACC;CAClB,OACE,kBAAC,OAAD;EACE,WAAW,EAAG,sFAAsF,CAAS;EAC7G,OAAO,EAAE,kBAAe;EAF1B,UAAA,CAIE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;IAAd,UAAA,CACE,kBAAC,GAAD;KAAM,WAAU;KAAwB,OAAO;KAAqB,eAAY;IAAQ,CAAA,GACvF,CACC;GACJ,CAAA,GAAA,kBAAC,KAAD;IAAG,WAAU;IAAoB,UAAA;GAAe,CAAA,CAC7C;EACJ,CAAA,GAAA,CACE;;AAET,CAAC,GAQY,IAAuB,EAAK,WAAgC;CACvE,OACE,kBAAC,OAAD;EAAK,OAAM;EAAI,QAAO;EAAI,eAAY;EAAO,OAAO;EAClD,UAAA,kBAAC,QAAD,EAAA,UACE,kBAAC,kBAAD;GAAgB,IAAG;GAAqB,eAAc;GAAiB,IAAG;GAAI,IAAG;GAAI,IAAG;GAAK,IAAG;GAAhG,UAAA;IACE,kBAAC,QAAD;KAAM,QAAO;KAAK,WAAU;IAAkB,CAAA;IAC9C,kBAAC,QAAD;KAAM,QAAO;KAAM,WAAU;IAAkB,CAAA;IAC/C,kBAAC,QAAD;KAAM,QAAO;KAAM,WAAU;IAAkB,CAAA;IAC/C,kBAAC,QAAD;KAAM,QAAO;KAAM,WAAU;IAAkB,CAAA;IAC/C,kBAAC,QAAD;KAAM,QAAO;KAAM,WAAU;IAAkB,CAAA;IAC/C,kBAAC,QAAD;KAAM,QAAO;KAAO,WAAU;IAAkB,CAAA;GAClC;EACZ,CAAA,EAAA,CAAA;CACH,CAAA;AAET,CAAC"}
@@ -0,0 +1,10 @@
1
+ interface PageLayoutProps {
2
+ children: React.ReactNode;
3
+ className?: string;
4
+ outerClassName?: string;
5
+ /** When true, the layout fills the viewport height and hides overflow so
6
+ * inner content (e.g. the schedule calendar) can scroll independently. */
7
+ fillHeight?: boolean;
8
+ }
9
+ export declare const PageLayout: import("react").MemoExoticComponent<({ children, className, outerClassName, fillHeight, }: PageLayoutProps) => import("react").JSX.Element>;
10
+ export {};
@@ -0,0 +1,17 @@
1
+ import { cn as e } from "../../lib/utils.js";
2
+ import { memo as t } from "react";
3
+ import { jsx as n } from "react/jsx-runtime";
4
+ //#region src/components/chrome/page-layout.tsx
5
+ var r = t(function({ children: t, className: r, outerClassName: i, fillHeight: a }) {
6
+ return /* @__PURE__ */ n("div", {
7
+ className: e("bg-background overflow-x-hidden", a ? "min-h-full sm:h-[calc(100dvh-72px)] sm:flex sm:flex-col sm:overflow-hidden lg:h-dvh" : "min-h-full", i),
8
+ children: /* @__PURE__ */ n("div", {
9
+ className: e("container mx-auto px-3 sm:px-4 md:px-6 py-4 sm:py-6 md:py-8 lg:py-3 max-w-full", a && "py-2 sm:py-3 sm:flex-1 sm:min-h-0 sm:flex sm:flex-col sm:overflow-hidden", r),
10
+ children: t
11
+ })
12
+ });
13
+ });
14
+ //#endregion
15
+ export { r as PageLayout };
16
+
17
+ //# sourceMappingURL=page-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-layout.js","names":[],"sources":["../../../src/components/chrome/page-layout.tsx"],"mappings":";;;;AAaA,IAAa,IAAa,EAAK,SAAoB,EACjD,aACA,cACA,mBACA,iBACkB;CAClB,OACE,kBAAC,OAAD;EACE,WAAW,EACT,mCAKA,IACI,wFACA,cACJ,CACF;EAEA,UAAA,kBAAC,OAAD;GACE,WAAW,EACT,kFAIA,KAAc,4EACd,CACF;GAEC;EACE,CAAA;CACF,CAAA;AAET,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface PageToolbarProps {
2
+ left?: React.ReactNode;
3
+ right?: React.ReactNode;
4
+ className?: string;
5
+ }
6
+ export declare const PageToolbar: import("react").MemoExoticComponent<({ left, right, className }: PageToolbarProps) => import("react").JSX.Element>;
7
+ export {};
@@ -0,0 +1,21 @@
1
+ import { cn as e } from "../../lib/utils.js";
2
+ import { memo as t } from "react";
3
+ import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
+ //#region src/components/chrome/page-toolbar.tsx
5
+ var i = { animationDelay: "50ms" }, a = t(function({ left: t, right: a, className: o }) {
6
+ return /* @__PURE__ */ r("div", {
7
+ className: e("mb-4 flex items-center animate-card-fade-in", t && a ? "justify-between" : a ? "justify-end" : "justify-start", o),
8
+ style: i,
9
+ children: [t && /* @__PURE__ */ n("div", {
10
+ className: "flex items-center gap-3",
11
+ children: t
12
+ }), a && /* @__PURE__ */ n("div", {
13
+ className: "flex items-center gap-3",
14
+ children: a
15
+ })]
16
+ });
17
+ });
18
+ //#endregion
19
+ export { a as PageToolbar };
20
+
21
+ //# sourceMappingURL=page-toolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-toolbar.js","names":[],"sources":["../../../src/components/chrome/page-toolbar.tsx"],"mappings":";;;;AAKA,IAAM,IAAqC,EAAE,gBAAgB,OAAO,GAQvD,IAAc,EAAK,SAAqB,EAAE,SAAM,UAAO,gBAA+B;CACjG,OACE,kBAAC,OAAD;EACE,WAAW,EACT,+CACA,KAAQ,IAAQ,oBAAoB,IAAQ,gBAAgB,iBAC5D,CACF;EACA,OAAO;EANT,UAAA,CAQG,KAAQ,kBAAC,OAAD;GAAK,WAAU;GAA2B,UAAA;EAAU,CAAA,GAC5D,KAAS,kBAAC,OAAD;GAAK,WAAU;GAA2B,UAAA;EAAW,CAAA,CAC5D;;AAET,CAAC"}
@@ -0,0 +1,83 @@
1
+ import type { Season } from "../../lib/seasons";
2
+ export interface SidebarNavItem {
3
+ key: string;
4
+ href: string;
5
+ icon: React.ComponentType<{
6
+ className?: string;
7
+ }>;
8
+ /** Localized display name (the app resolves i18n). */
9
+ label: string;
10
+ external?: boolean;
11
+ /** Active-route state (the app derives this from its router). */
12
+ active?: boolean;
13
+ /** Optional data-prefetch handler fired on hover/focus. */
14
+ onPrefetch?: () => void;
15
+ }
16
+ export interface SidebarLinkProps {
17
+ href: string;
18
+ className?: string;
19
+ "aria-label"?: string;
20
+ onClick?: () => void;
21
+ onMouseEnter?: () => void;
22
+ onFocus?: () => void;
23
+ children: React.ReactNode;
24
+ }
25
+ export interface SidebarLabels {
26
+ mainNavigation: string;
27
+ primaryNavigation: string;
28
+ secondaryNavigation: string;
29
+ navigationMenu: string;
30
+ openMenu: string;
31
+ closeMenu: string;
32
+ expandSidebar: string;
33
+ collapseSidebar: string;
34
+ aiAssistant: string;
35
+ logoButtonAriaLabel?: string;
36
+ }
37
+ export interface SidebarProps {
38
+ labels: SidebarLabels;
39
+ primaryItems: SidebarNavItem[];
40
+ secondaryItems: SidebarNavItem[];
41
+ /**
42
+ * Renders internal navigation links — inject your router's Link here
43
+ * (FiestaBoard passes its ViewTransitionLink). External items render a
44
+ * plain <a target="_blank"> internally and never hit this.
45
+ */
46
+ renderLink: (props: SidebarLinkProps, item: SidebarNavItem) => React.ReactNode;
47
+ collapsed: boolean;
48
+ transitioning?: boolean;
49
+ onToggleCollapsed: () => void;
50
+ onTransitionEnd?: () => void;
51
+ /**
52
+ * src for the 32×32 brand icon next to the logo. Defaults to the
53
+ * embedded pixel-taco brand mark; apps may override (e.g. base-path
54
+ * aware asset URLs).
55
+ */
56
+ logoIconSrc?: string;
57
+ /** Active season: auroras render in its colors and the logo becomes a button. */
58
+ season?: Season | null;
59
+ /** Click handler for the seasonal logo button (celebration lives in the app). */
60
+ onLogoClick?: (e: React.MouseEvent) => void;
61
+ /** AI assistant nav entry; omit to hide. */
62
+ ai?: {
63
+ active: boolean;
64
+ onOpen: () => void;
65
+ };
66
+ /** Board switcher slots (rendered only when provided). */
67
+ boardSelector?: React.ReactNode;
68
+ mobileBoardSelector?: React.ReactNode;
69
+ /** Account row inside the secondary nav. */
70
+ renderAccount?: (ctx: {
71
+ variant: "mobile" | "desktop";
72
+ collapsed: boolean;
73
+ }) => React.ReactNode;
74
+ /** Version indicator in the footer row. */
75
+ versionSlot?: React.ReactNode;
76
+ /** Theme toggle in the footer row. */
77
+ themeToggleSlot?: React.ReactNode;
78
+ /** App max width in px — the sidebar centers itself against it. */
79
+ maxWidth: number;
80
+ /** Gap between the app edge and the sidebar in px. */
81
+ sidebarInset: number;
82
+ }
83
+ export declare const Sidebar: import("react").MemoExoticComponent<({ labels, primaryItems, secondaryItems, renderLink, collapsed, transitioning, onToggleCollapsed, onTransitionEnd, logoIconSrc, season, onLogoClick, ai, boardSelector, mobileBoardSelector, renderAccount, versionSlot, themeToggleSlot, maxWidth, sidebarInset, }: SidebarProps) => import("react").JSX.Element>;