@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,37 @@
1
+ import { type BoardDisplayProps } from "./board-display";
2
+ export interface ScaledBoardDisplayProps extends BoardDisplayProps {
3
+ /** Accessible label for the Fit / Actual size toggle group (note arrays only). */
4
+ previewSizeLabel?: string;
5
+ /** Label for the fit-to-container mode toggle button. */
6
+ fitModeLabel?: string;
7
+ /** Label for the actual-size mode toggle button. */
8
+ actualModeLabel?: string;
9
+ }
10
+ /**
11
+ * Wraps {@link BoardDisplay} so it shrinks to fit a narrow parent.
12
+ *
13
+ * BoardDisplay sizes its tiles via viewport breakpoints
14
+ * (`sm:w-[20px] md:w-[24px]…`). That works on a full-width page but
15
+ * stops responding when the editor pane is squeezed by, say, the
16
+ * resizable AI chat panel — the board overflows or gets clipped.
17
+ *
18
+ * In the default **fit** mode we keep the natural tile rendering and just
19
+ * apply `transform: scale()` based on the actual parent width measured at
20
+ * runtime. We never scale UP — full size is always the cap, so the board
21
+ * looks identical in roomy layouts.
22
+ *
23
+ * For note-array boards (which can be very wide, e.g. 3×60, or very tall,
24
+ * e.g. 12×15) a small toggle switches to **actual** mode: tiles render at
25
+ * their natural readable size inside a horizontally-scrollable container,
26
+ * with no vertical clipping. The toggle is only rendered for note arrays,
27
+ * so flagship/note previews are visually unchanged.
28
+ */
29
+ declare function ScaledBoardDisplayImpl({ previewSizeLabel, fitModeLabel, actualModeLabel, ...props }: ScaledBoardDisplayProps): import("react").JSX.Element;
30
+ /**
31
+ * Memoized so a parent re-render with unchanged props doesn't re-render the
32
+ * wrapper (its children include the toggle UI). The heavyweight
33
+ * {@link BoardDisplay} below is already memoized with a custom comparator;
34
+ * this keeps the wrapper from being the weak link in that chain.
35
+ */
36
+ export declare const ScaledBoardDisplay: import("react").MemoExoticComponent<typeof ScaledBoardDisplayImpl>;
37
+ export {};
@@ -0,0 +1,118 @@
1
+ "use client";
2
+ import { cn as e } from "../../lib/utils.js";
3
+ import { isNoteArray as t } from "../../lib/board-dimensions.js";
4
+ import { BoardDisplay as n } from "./board-display.js";
5
+ import { memo as r, useLayoutEffect as i, useRef as a, useState as o } from "react";
6
+ import { jsx as s, jsxs as c } from "react/jsx-runtime";
7
+ //#region src/components/board/scaled-board-display.tsx
8
+ var l = "fiestaboard:boardPreviewMode";
9
+ function u() {
10
+ if (typeof window > "u") return "fit";
11
+ try {
12
+ return window.sessionStorage.getItem(l) === "actual" ? "actual" : "fit";
13
+ } catch {
14
+ return "fit";
15
+ }
16
+ }
17
+ function d(e) {
18
+ if (!(typeof window > "u")) try {
19
+ window.sessionStorage.setItem(l, e);
20
+ } catch {}
21
+ }
22
+ function f({ previewSizeLabel: r = "Preview size", fitModeLabel: l = "Fit", actualModeLabel: f = "Actual size", ...p }) {
23
+ let m = a(null), h = a(null), [g, _] = o(1), [v, y] = o(null), [b, x] = o(null), S = t(p.deviceType ?? "flagship"), [C, w] = o(() => u()), T = S ? C : "fit", E = (e) => {
24
+ w(e), d(e);
25
+ };
26
+ i(() => {
27
+ if (T !== "fit") return;
28
+ let e = m.current, t = h.current;
29
+ if (!e || !t) return;
30
+ let n = (() => {
31
+ let t = e.parentElement;
32
+ for (; t;) {
33
+ let e = getComputedStyle(t);
34
+ if (e.overflowX === "hidden" || e.overflowX === "scroll" || e.overflowX === "auto") return t;
35
+ t = t.parentElement;
36
+ }
37
+ return e;
38
+ })(), r = null, i = () => {
39
+ r = null;
40
+ let i = getComputedStyle(n), a = n.clientWidth - parseFloat(i.paddingLeft) - parseFloat(i.paddingRight), o = e.clientWidth > 0 ? Math.min(a, e.clientWidth) : a, s = t.firstElementChild, c = s ? s.offsetWidth : t.offsetWidth, l = s ? s.offsetHeight : t.offsetHeight;
41
+ if (!c || !o) return;
42
+ let u = Math.min(1, o / c);
43
+ _((e) => Math.abs(e - u) > .001 ? u : e), y(c * u), x(l * u);
44
+ }, a = () => {
45
+ r === null && (r = requestAnimationFrame(i));
46
+ };
47
+ i();
48
+ let o = new ResizeObserver(a);
49
+ return o.observe(n), o.observe(e), o.observe(t), () => {
50
+ o.disconnect(), r !== null && cancelAnimationFrame(r);
51
+ };
52
+ }, [
53
+ p.message,
54
+ p.size,
55
+ p.deviceType,
56
+ p.notesWide,
57
+ p.notesTall,
58
+ T
59
+ ]);
60
+ let D = S ? /* @__PURE__ */ s("div", {
61
+ className: "mb-1 flex w-full justify-center",
62
+ role: "group",
63
+ "aria-label": r,
64
+ children: /* @__PURE__ */ c("div", {
65
+ className: "flex gap-1",
66
+ children: [/* @__PURE__ */ s("button", {
67
+ type: "button",
68
+ onClick: () => E("fit"),
69
+ "aria-pressed": T === "fit",
70
+ className: e("rounded-full border px-2.5 py-1 text-[11px] transition-colors focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none", T === "fit" ? "border-primary bg-primary/10 text-foreground" : "border-transparent text-muted-foreground hover:text-foreground"),
71
+ children: l
72
+ }), /* @__PURE__ */ s("button", {
73
+ type: "button",
74
+ onClick: () => E("actual"),
75
+ "aria-pressed": T === "actual",
76
+ className: e("rounded-full border px-2.5 py-1 text-[11px] transition-colors focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none", T === "actual" ? "border-primary bg-primary/10 text-foreground" : "border-transparent text-muted-foreground hover:text-foreground"),
77
+ children: f
78
+ })]
79
+ })
80
+ }) : null;
81
+ return T === "actual" ? /* @__PURE__ */ c("div", {
82
+ "data-slot": "scaled-board-display",
83
+ className: "w-full min-w-0",
84
+ children: [D, /* @__PURE__ */ s("div", {
85
+ "data-testid": "actual-size-scroll",
86
+ className: "w-full overflow-x-auto",
87
+ style: { overflowY: "visible" },
88
+ children: /* @__PURE__ */ s(n, { ...p })
89
+ })]
90
+ }) : /* @__PURE__ */ c("div", {
91
+ "data-slot": "scaled-board-display",
92
+ className: "w-full min-w-0",
93
+ children: [D, /* @__PURE__ */ s("div", {
94
+ ref: m,
95
+ className: "flex w-full min-w-0 justify-center overflow-hidden",
96
+ children: /* @__PURE__ */ s("div", {
97
+ style: {
98
+ width: v ?? void 0,
99
+ height: b ?? void 0
100
+ },
101
+ children: /* @__PURE__ */ s("div", {
102
+ ref: h,
103
+ style: {
104
+ transform: `scale(${g})`,
105
+ transformOrigin: "top left",
106
+ width: "fit-content"
107
+ },
108
+ children: /* @__PURE__ */ s(n, { ...p })
109
+ })
110
+ })
111
+ })]
112
+ });
113
+ }
114
+ var p = r(f);
115
+ //#endregion
116
+ export { p as ScaledBoardDisplay };
117
+
118
+ //# sourceMappingURL=scaled-board-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaled-board-display.js","names":[],"sources":["../../../src/components/board/scaled-board-display.tsx"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type DeviceType } from "../../lib/board-dimensions";
2
+ export interface StaticBoardDisplayProps {
3
+ message: string | null;
4
+ size?: "sm" | "md" | "lg";
5
+ boardType?: "black" | "white";
6
+ deviceType?: DeviceType;
7
+ className?: string;
8
+ /** Notes wide (for note_array device; ignored otherwise). */
9
+ notesWide?: number;
10
+ /** Notes tall (for note_array device; ignored otherwise). */
11
+ notesTall?: number;
12
+ /** Accessible label when a message is shown. */
13
+ previewLabel?: string;
14
+ /** Accessible label when the board has no message. */
15
+ emptyLabel?: string;
16
+ }
17
+ export declare const StaticBoardDisplay: import("react").MemoExoticComponent<({ message, size, boardType, deviceType, className, notesWide, notesTall, previewLabel, emptyLabel, }: StaticBoardDisplayProps) => import("react").JSX.Element>;
@@ -0,0 +1,140 @@
1
+ "use client";
2
+ import { resolveColorCode as e } from "../../lib/board-colors.js";
3
+ import { messageToGrid as t } from "../../lib/board-characters.js";
4
+ import { isNoteArray as n, resolveDimensions as r } from "../../lib/board-dimensions.js";
5
+ import { gapClasses as i, paddingClasses as a, sizeClasses as o, textSizeClasses as s } from "../../lib/board-metrics.js";
6
+ import { memo as c, useMemo as l } from "react";
7
+ import { jsx as u, jsxs as d } from "react/jsx-runtime";
8
+ //#region src/components/board/static-board-display.tsx
9
+ var f = c(function({ message: c, size: f = "sm", boardType: p = "black", deviceType: m = "flagship", className: h = "", notesWide: g = 1, notesTall: _ = 1, previewLabel: v = "Board preview", emptyLabel: y = "Empty board display" }) {
10
+ let b = r(m, g, _), x = n(m), S = p === "white", C = S ? "var(--color-board-surface-light)" : "var(--color-board-surface-dark)", w = S ? "var(--color-board-text-on-light)" : "var(--color-board-text-on-dark)", T = l(() => t(c ?? "", b.rows, b.cols, m), [
11
+ c,
12
+ b.rows,
13
+ b.cols,
14
+ m
15
+ ]), E = f === "sm" ? "6px" : f === "md" ? "8px" : "10px", D = S ? "var(--color-board-bezel-light)" : "var(--color-board-bezel-dark)", O = S ? "var(--color-board-bezel-border-light)" : "var(--color-board-bezel-border-dark)", k = f === "sm" ? S ? "0 2px 8px rgba(0,0,0,0.1), inset 0 1px 2px rgba(255,255,255,0.9)" : "0 2px 8px rgba(0,0,0,0.4), inset 0 1px 1px rgba(255,255,255,0.06)" : S ? "0 8px 32px rgba(0,0,0,0.12), 0 4px 16px rgba(0,0,0,0.08), inset 0 1px 2px rgba(255,255,255,0.9), inset 0 0 0 1px rgba(255,255,255,0.5)" : "0 8px 32px rgba(0,0,0,0.6), 0 4px 16px rgba(0,0,0,0.4), inset 0 1px 1px rgba(255,255,255,0.08), inset 0 0 0 1px rgba(255,255,255,0.03)", A = f === "sm" ? S ? "0 1px 2px rgba(0,0,0,0.15)" : "0 1px 2px rgba(0,0,0,0.4)" : S ? "0 2px 4px rgba(0,0,0,0.2), inset 0 1px 2px rgba(0,0,0,0.1), inset 0 -1px 2px rgba(255,255,255,0.5), inset 1px 0 1px rgba(0,0,0,0.08), inset -1px 0 1px rgba(255,255,255,0.4)" : "0 2px 4px rgba(0,0,0,0.5), inset 0 1px 2px rgba(0,0,0,0.8), inset 0 -1px 1px rgba(255,255,255,0.08), inset 1px 0 1px rgba(0,0,0,0.5), inset -1px 0 1px rgba(255,255,255,0.05)";
16
+ return /* @__PURE__ */ u("div", {
17
+ className: "w-full flex justify-center",
18
+ children: /* @__PURE__ */ u("div", {
19
+ role: "img",
20
+ "aria-label": c ? v : y,
21
+ "data-slot": "static-board-display",
22
+ className: `${f === "sm" ? "rounded-lg border-[3px]" : "rounded-lg sm:rounded-xl border-[3px] sm:border-[4px] lg:border-[5px]"} ${h} max-w-full`,
23
+ style: {
24
+ backgroundColor: D,
25
+ borderColor: O,
26
+ boxShadow: k,
27
+ width: "fit-content"
28
+ },
29
+ children: /* @__PURE__ */ u("div", {
30
+ className: `${a[f]} relative`,
31
+ "aria-hidden": "true",
32
+ style: { background: S ? "linear-gradient(135deg, var(--color-board-surface-light) 0%, var(--color-board-bezel-border-light) 100%)" : "linear-gradient(135deg, var(--color-board-surface-dark) 0%, var(--color-board-black) 100%)" },
33
+ children: /* @__PURE__ */ u("div", {
34
+ className: `flex flex-col ${i[f]}`,
35
+ children: T.map((t, n) => {
36
+ let r = x && n > 0 && n % 3 == 0;
37
+ return /* @__PURE__ */ u("div", {
38
+ "data-note-row": "",
39
+ ...r ? { "data-note-row-seam": "true" } : {},
40
+ className: `flex ${i[f]} justify-center`,
41
+ style: r ? { marginTop: E } : void 0,
42
+ children: t.map((t, n) => {
43
+ let r = x && n > 0 && n % 15 == 0, i = r ? { marginLeft: E } : void 0, a = r ? { "data-note-col-seam": "true" } : {};
44
+ if (t.type === "color") {
45
+ let r = e(t.code, S);
46
+ return f === "sm" ? /* @__PURE__ */ u("div", {
47
+ "data-note-tile": "",
48
+ ...a,
49
+ className: `${o[f]} rounded-[3px]`,
50
+ style: {
51
+ backgroundColor: r,
52
+ boxShadow: A,
53
+ contain: "layout style paint",
54
+ ...i
55
+ }
56
+ }, n) : /* @__PURE__ */ u("div", {
57
+ "data-note-tile": "",
58
+ ...a,
59
+ className: `relative ${o[f]} rounded-[3px] overflow-hidden`,
60
+ style: {
61
+ backgroundColor: C,
62
+ boxShadow: A,
63
+ contain: "layout style paint",
64
+ ...i
65
+ },
66
+ children: /* @__PURE__ */ u("div", {
67
+ className: "absolute rounded-[3px] overflow-hidden",
68
+ style: {
69
+ top: "3px",
70
+ bottom: "4px",
71
+ left: "1px",
72
+ right: "1px",
73
+ backgroundColor: r,
74
+ boxShadow: "0 2px 4px rgba(0,0,0,0.3), inset 0 1px 1px rgba(255,255,255,0.15), inset 0 -1px 1px rgba(0,0,0,0.25)"
75
+ },
76
+ children: /* @__PURE__ */ u("div", { className: "absolute top-1/2 left-0 right-0 h-[1px] bg-black/10" })
77
+ })
78
+ }, n);
79
+ }
80
+ let c = t.value, l = c === "♥";
81
+ return f === "sm" ? /* @__PURE__ */ u("div", {
82
+ "data-note-tile": "",
83
+ ...a,
84
+ className: `${o[f]} rounded-[3px] flex items-center justify-center`,
85
+ style: {
86
+ backgroundColor: C,
87
+ boxShadow: A,
88
+ contain: "layout style paint",
89
+ ...i
90
+ },
91
+ children: c !== " " && /* @__PURE__ */ u("span", {
92
+ className: `${s[f]} font-mono font-semibold select-none leading-none`,
93
+ style: { color: l ? "#eb4034" : w },
94
+ children: c
95
+ })
96
+ }, n) : /* @__PURE__ */ d("div", {
97
+ "data-note-tile": "",
98
+ ...a,
99
+ className: `relative ${o[f]} rounded-[3px] overflow-hidden`,
100
+ style: {
101
+ backgroundColor: C,
102
+ boxShadow: A,
103
+ contain: "layout style paint",
104
+ ...i
105
+ },
106
+ children: [
107
+ /* @__PURE__ */ u("div", {
108
+ className: "absolute inset-0 flex items-center justify-center",
109
+ style: { zIndex: 2 },
110
+ children: c !== " " && /* @__PURE__ */ u("span", {
111
+ className: `${s[f]} font-mono font-semibold select-none leading-none`,
112
+ style: { color: l ? "#eb4034" : w },
113
+ children: c
114
+ })
115
+ }),
116
+ /* @__PURE__ */ u("div", {
117
+ className: `absolute top-1/2 left-0 right-0 h-[1px] ${S ? "bg-black/10" : "bg-black/30"}`,
118
+ style: { zIndex: 3 }
119
+ }),
120
+ /* @__PURE__ */ u("div", {
121
+ className: "absolute inset-0 pointer-events-none",
122
+ style: {
123
+ zIndex: 1,
124
+ background: S ? "linear-gradient(180deg, rgba(255,255,255,0.3) 0%, transparent 50%, rgba(0,0,0,0.05) 100%)" : "linear-gradient(180deg, rgba(255,255,255,0.05) 0%, transparent 50%, rgba(0,0,0,0.2) 100%)"
125
+ }
126
+ })
127
+ ]
128
+ }, n);
129
+ })
130
+ }, n);
131
+ })
132
+ })
133
+ })
134
+ })
135
+ });
136
+ });
137
+ //#endregion
138
+ export { f as StaticBoardDisplay };
139
+
140
+ //# sourceMappingURL=static-board-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-board-display.js","names":[],"sources":["../../../src/components/board/static-board-display.tsx"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Vestaboard-shaped icon: a wide rounded frame with rows of split-flap tile
3
+ * dots. Used wherever the UI points at a physical board (board switcher,
4
+ * active-board indicator) instead of lucide's Monitor, which reads as a TV.
5
+ *
6
+ * Drawn in the lucide style (24×24 viewBox, stroke-based, currentColor) so it
7
+ * sits seamlessly next to real lucide icons.
8
+ */
9
+ export declare const BoardIcon: import("react").MemoExoticComponent<({ className }: {
10
+ className?: string;
11
+ }) => import("react").JSX.Element>;
@@ -0,0 +1,31 @@
1
+ import { memo as e } from "react";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ //#region src/components/chrome/board-icon.tsx
4
+ var r = e(function({ className: e }) {
5
+ return /* @__PURE__ */ n("svg", {
6
+ viewBox: "0 0 24 24",
7
+ fill: "none",
8
+ stroke: "currentColor",
9
+ strokeWidth: "2",
10
+ strokeLinecap: "round",
11
+ strokeLinejoin: "round",
12
+ className: e,
13
+ "data-testid": "board-icon",
14
+ "aria-hidden": "true",
15
+ children: [
16
+ /* @__PURE__ */ t("rect", {
17
+ x: "2",
18
+ y: "5",
19
+ width: "20",
20
+ height: "14",
21
+ rx: "2"
22
+ }),
23
+ /* @__PURE__ */ t("path", { d: "M6.5 9.5h.01M10.17 9.5h.01M13.84 9.5h.01M17.5 9.5h.01" }),
24
+ /* @__PURE__ */ t("path", { d: "M6.5 14.5h.01M10.17 14.5h.01M13.84 14.5h.01M17.5 14.5h.01" })
25
+ ]
26
+ });
27
+ });
28
+ //#endregion
29
+ export { r as BoardIcon };
30
+
31
+ //# sourceMappingURL=board-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-icon.js","names":[],"sources":["../../../src/components/chrome/board-icon.tsx"],"mappings":";;;AAUA,IAAa,IAAY,EAAK,SAAmB,EAAE,gBAAqC;CACtF,OACE,kBAAC,OAAD;EACE,SAAQ;EACR,MAAK;EACL,QAAO;EACP,aAAY;EACZ,eAAc;EACd,gBAAe;EACJ;EACX,eAAY;EACZ,eAAY;EATd,UAAA;GAWE,kBAAC,QAAD;IAAM,GAAE;IAAI,GAAE;IAAI,OAAM;IAAK,QAAO;IAAK,IAAG;GAAK,CAAA;GACjD,kBAAC,QAAD,EAAM,GAAE,wDAAyD,CAAA;GACjE,kBAAC,QAAD,EAAM,GAAE,4DAA6D,CAAA;EAClE;;AAET,CAAC"}
@@ -0,0 +1,30 @@
1
+ export interface BoardOption {
2
+ id: string;
3
+ name?: string;
4
+ }
5
+ export interface BoardSelectorLabels {
6
+ /** aria-label for the trigger, e.g. "Select board". */
7
+ boardSelector: string;
8
+ /** Placeholder when nothing selected, e.g. "Select a board". */
9
+ selectBoard: string;
10
+ /** Fallback display name for unnamed boards. */
11
+ unnamedBoard: string;
12
+ }
13
+ interface BoardSelectorProps {
14
+ boards: BoardOption[];
15
+ value: string;
16
+ onChange: (id: string) => void;
17
+ labels: BoardSelectorLabels;
18
+ collapsed?: boolean;
19
+ variant?: "sidebar" | "mobileHeader";
20
+ }
21
+ /**
22
+ * Board picker — the app-wide context switcher, presentational half.
23
+ * FiestaBoard wires it to its current-board context and renders it only
24
+ * for multi-board installs. Sits at the TOP of the sidebar menu because it
25
+ * scopes everything below it — the same slot workspace switchers occupy in
26
+ * multi-tenant apps. Collapsed, it shrinks to an icon-only trigger with a
27
+ * tooltip showing the current board name.
28
+ */
29
+ export declare const BoardSelector: import("react").MemoExoticComponent<({ boards, value, onChange, labels, collapsed, variant, }: BoardSelectorProps) => import("react").JSX.Element>;
30
+ export {};
@@ -0,0 +1,37 @@
1
+ "use client";
2
+ import { cn as e } from "../../lib/utils.js";
3
+ import { Select as t, SelectContent as n, SelectItem as r, SelectTrigger as i, SelectValue as a } from "../ui/select.js";
4
+ import { Tooltip as o, TooltipContent as s, TooltipTrigger as c } from "../ui/tooltip.js";
5
+ import { BoardIcon as l } from "./board-icon.js";
6
+ import { memo as u, useMemo as d } from "react";
7
+ import { jsx as f, jsxs as p } from "react/jsx-runtime";
8
+ //#region src/components/chrome/board-selector.tsx
9
+ var m = u(function({ boards: u, value: m, onChange: h, labels: g, collapsed: _ = !1, variant: v = "sidebar" }) {
10
+ let y = d(() => u.map((e) => /* @__PURE__ */ f(r, {
11
+ value: e.id,
12
+ children: e.name || g.unnamedBoard
13
+ }, e.id)), [u, g.unnamedBoard]), b = /* @__PURE__ */ p(i, {
14
+ "aria-label": g.boardSelector,
15
+ className: e("gap-2 border-sidebar-border/70 bg-sidebar-accent/40 font-medium text-sidebar-foreground shadow-none transition-[width,padding] duration-100 hover:bg-sidebar-accent/70", v === "mobileHeader" && "h-9 w-auto min-w-0 max-w-[170px] px-2.5 max-[479px]:gap-1 max-[479px]:px-2", v === "sidebar" && (_ ? "h-9 w-full justify-center gap-0 px-0 [&>span:last-child]:hidden" : "h-10 w-full")),
16
+ children: [/* @__PURE__ */ f(l, { className: "h-5 w-5 flex-shrink-0 text-sidebar-foreground/70" }), /* @__PURE__ */ f("span", {
17
+ className: e("min-w-0 flex-1 overflow-hidden whitespace-nowrap text-left transition-opacity duration-100", v === "sidebar" && _ ? "max-w-0 opacity-0" : "max-w-48 opacity-100 delay-150", v === "mobileHeader" && "max-[479px]:hidden!"),
18
+ children: /* @__PURE__ */ f(a, { placeholder: g.selectBoard })
19
+ })]
20
+ });
21
+ return /* @__PURE__ */ p(t, {
22
+ value: m,
23
+ onValueChange: h,
24
+ children: [_ ? /* @__PURE__ */ p(o, { children: [/* @__PURE__ */ f(c, {
25
+ asChild: !0,
26
+ children: b
27
+ }), /* @__PURE__ */ f(s, {
28
+ side: "right",
29
+ className: "font-medium",
30
+ children: u.find((e) => e.id === m)?.name || g.unnamedBoard
31
+ })] }) : b, /* @__PURE__ */ f(n, { children: y })]
32
+ });
33
+ });
34
+ //#endregion
35
+ export { m as BoardSelector };
36
+
37
+ //# sourceMappingURL=board-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"board-selector.js","names":[],"sources":["../../../src/components/chrome/board-selector.tsx"],"mappings":";;;;;;;;AAwCA,IAAa,IAAgB,EAAK,SAAuB,EACvD,WACA,UACA,aACA,WACA,eAAY,IACZ,aAAU,aACW;CAIrB,IAAM,IAAQ,QAEV,EAAO,KAAK,MACV,kBAAC,GAAD;EAA2B,OAAO,EAAM;EACrC,UAAA,EAAM,QAAQ,EAAO;CACZ,GAFK,EAAM,EAEX,CACb,GACH,CAAC,GAAQ,EAAO,YAAY,CAC9B,GAEM,IACJ,kBAAC,GAAD;EACE,cAAY,EAAO;EACnB,WAAW,EACT,0KAGA,MAAY,kBAAkB,8EAC9B,MAAY,cACT,IAQG,oEACA,cACR;EAlBF,UAAA,CAoBE,kBAAC,GAAD,EAAW,WAAU,mDAAoD,CAAA,GACzE,kBAAC,QAAD;GACE,WAAW,EACT,8FACA,MAAY,aAAa,IAAY,sBAAsB,kCAG3D,MAAY,kBAAkB,qBAChC;GAEA,UAAA,kBAAC,GAAD,EAAa,aAAa,EAAO,YAAc,CAAA;EAC3C,CAAA,CACO;;CAGjB,OACE,kBAAC,GAAD;EAAe;EAAO,eAAe;EAArC,UAAA,CACG,IACC,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;GAAgB,SAAA;GAAS,UAAA;EAAwB,CAAA,GACjD,kBAAC,GAAD;GAAgB,MAAK;GAAQ,WAAU;GACpC,UAAA,EAAO,MAAM,MAAM,EAAE,OAAO,CAAK,CAAC,EAAE,QAAQ,EAAO;EACtC,CAAA,CACT,EAAA,CAAA,IAET,GAEF,kBAAC,GAAD,EAAA,UAAgB,EAAqB,CAAA,CAC/B;;AAEZ,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The brand palette: semantic slot name → CSS custom property → default hex.
3
+ * Override any `cssVar` on an ancestor element to re-tint that slot.
4
+ */
5
+ export declare const FIESTA_ICON_PALETTE: {
6
+ name: string;
7
+ cssVar: string;
8
+ hex: string;
9
+ }[];
10
+ /**
11
+ * The brand mark as standalone SVG markup — the source of truth for the
12
+ * data URI below and for anything that needs the mark outside React.
13
+ */
14
+ export declare const FIESTA_ICON_SVG: string;
15
+ /**
16
+ * The mark as a `data:image/svg+xml` URI for `<img src>` consumers (Sidebar
17
+ * `logoIconSrc`, Storybook `brandImage`). Inside an `<img>` the CSS custom
18
+ * properties can't be themed, so the palette fallbacks apply — the classic
19
+ * brand colors. Minimally escaped (quotes become apostrophes; only `%`, `#`,
20
+ * `<`, `>` are percent-encoded) so the URI stays readable and compact.
21
+ */
22
+ export declare const FIESTA_ICON_DATA_URI: string;
23
+ interface FiestaIconProps {
24
+ size?: number;
25
+ className?: string;
26
+ }
27
+ export declare const FiestaIcon: import("react").MemoExoticComponent<({ size, className }: FiestaIconProps) => import("react").JSX.Element>;
28
+ export {};
@@ -0,0 +1,129 @@
1
+ import { memo as e } from "react";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ //#region src/components/chrome/fiesta-icon.tsx
4
+ var n = [
5
+ {
6
+ name: "outline",
7
+ hex: "#1e1434",
8
+ rects: "11,3,1,1,2 12,3,11,1,5 9,4,2,1,3 16,4,1,1 23,4,1,1,4 24,4,1,1,1 8,5,1,1,2 9,5,2,1 23,5,1,1 24,5,1,1,4 25,5,1,1,1 7,6,1,1,3 8,6,1,1 24,6,1,1 25,6,1,1,5 6,7,1,1,4 26,7,1,1,5 5,8,1,1,4 27,8,1,1,4 28,8,1,2,1 5,9,1,1,7 27,9,1,1 3,10,1,2,1 4,10,1,1,5 28,10,1,1,6 29,10,1,1,2 4,11,1,2 28,11,1,7 29,11,1,1,4 3,12,1,1,2 29,12,1,3,3 2,13,1,2,3 3,13,1,3 0,15,1,1,2 1,15,1,1,4 2,15,1,1,6 29,15,1,1,4 0,16,1,9,3 1,16,1,9 29,16,1,1,3 29,17,1,1,6 27,18,1,1 30,18,1,1,3 31,18,1,1,1 25,19,2,1 30,19,1,6 31,19,1,6,3 22,20,2,1 19,21,4,1 18,22,3,1 16,23,1,1,6 17,23,1,1,7 18,23,2,1 12,24,3,1 15,24,1,1,7 18,24,1,2 0,25,1,1,2 1,25,1,1,6 2,25,1,1,7 9,25,2,1 11,25,1,1,7 12,25,2,1,6 14,25,2,1,1 17,25,1,2,1 30,25,1,1,6 31,25,1,1,2 2,26,1,1,3 3,26,1,1 9,26,2,1,7 11,26,1,1,4 18,26,1,1,7 19,26,1,1 28,26,1,1 29,26,1,1,7 3,27,1,1,2 4,27,4,1 8,27,1,1,7 9,27,2,1,1 18,27,1,1,1 19,27,1,1,4 20,27,1,1,7 27,27,1,1,7 28,27,1,1,4 29,27,1,1,1 4,28,5,1,2 20,28,1,1,3 21,28,6,1,7 27,28,1,1,3"
9
+ },
10
+ {
11
+ name: "shell",
12
+ hex: "#e8a520",
13
+ rects: "17,8,1,4 25,8,1,1 18,9,7,1 16,10,1,11 18,10,2,2 22,10,5,3 14,11,2,5 5,12,1,1 19,12,3,3 27,12,1,3 13,13,1,6 17,13,2,4 22,13,2,4 26,13,1,3 11,15,1,1 19,15,1,2 24,15,2,1 12,16,1,2 14,16,1,5 20,16,2,2 24,16,1,1 3,17,1,8 10,17,1,1 17,17,1,3 22,17,1,2 15,18,1,3 20,18,1,1 10,19,2,4 18,19,2,1 12,20,2,1 12,21,1,2 10,23,1,1 8,24,1,2 4,25,1,2 6,26,1,1"
14
+ },
15
+ {
16
+ name: "shell-shade",
17
+ hex: "#cf8014",
18
+ rects: "11,5,1,4 17,7,1,1 16,8,1,1 6,9,1,2 9,9,1,1 5,10,1,1,7 7,10,1,1 20,10,2,2 27,10,1,1 13,11,1,1 17,12,2,1 11,13,1,2 24,13,2,2 10,15,1,1 20,15,2,1 27,15,1,2 3,16,1,1 15,16,1,2 25,16,2,2 18,17,2,2 23,17,2,1 12,18,1,2 21,18,1,3 23,18,1,2 13,19,1,1 20,19,1,2 22,19,1,1 17,20,3,1 13,21,5,1 13,22,3,1 11,23,1,1 13,23,2,1 4,24,1,1 9,24,2,1 7,25,1,2 5,26,1,1 8,26,1,1"
19
+ },
20
+ {
21
+ name: "shell-light",
22
+ hex: "#f2b836",
23
+ rects: "12,5,3,1 8,7,1,1 18,7,7,2 7,9,1,1 25,9,2,1 5,11,1,1 27,11,1,1 4,13,1,1 12,15,1,1 10,16,2,1 11,17,1,2 10,18,1,1 9,21,1,1 9,23,1,1"
24
+ },
25
+ {
26
+ name: "shell-glint",
27
+ hex: "#fbd04f",
28
+ rects: "9,6,2,1 16,9,1,1 15,10,1,1 13,12,1,1 12,13,1,2 4,14,1,1 9,19,1,2 9,22,1,1"
29
+ },
30
+ {
31
+ name: "filling",
32
+ hex: "#5a220a",
33
+ rects: "17,4,3,1 17,6,7,1 16,7,1,1 10,14,1,1 2,16,1,1 9,16,1,2 4,17,2,1 27,17,1,1 5,18,2,2 26,18,1,1 4,19,1,2 7,19,2,2 5,21,1,2 8,21,1,2 4,22,1,2 6,22,2,2 16,22,2,1 5,24,1,1 11,24,1,1 17,24,1,1,1 3,25,1,1 6,25,1,1"
34
+ },
35
+ {
36
+ name: "filling-dark",
37
+ hex: "#440b00",
38
+ rects: "13,10,1,1 6,24,1,1"
39
+ },
40
+ {
41
+ name: "tomato",
42
+ hex: "#a82115",
43
+ rects: "19,5,1,1 12,6,2,1 13,7,1,1 15,9,1,1 14,10,1,1 9,11,1,1 12,12,1,1 5,13,4,2 6,15,2,1 2,17,1,1 4,18,1,1 9,18,1,1 24,18,2,1 2,20,1,1 5,20,2,1 4,21,1,1 6,21,2,1 18,21,1,1 5,23,1,1 8,23,1,1 12,23,1,1 15,23,1,1 7,24,1,1 5,25,1,1"
44
+ },
45
+ {
46
+ name: "tomato-bright",
47
+ hex: "#dc2813",
48
+ rects: "17,5,2,1 12,7,1,1 10,8,1,2 8,10,2,1"
49
+ },
50
+ {
51
+ name: "lettuce",
52
+ hex: "#54a31b",
53
+ rects: "16,5,1,1 20,5,1,1 15,6,1,1 9,7,2,1 13,8,2,1 11,9,1,1 13,9,1,1 12,10,1,1 10,11,1,2 6,12,1,1 9,13,1,2 5,16,1,1 7,17,2,1 20,23,1,1 21,26,1,1 27,26,1,1"
54
+ },
55
+ {
56
+ name: "lettuce-bright",
57
+ hex: "#6ec421",
58
+ rects: "21,5,1,1 16,6,1,1 15,7,1,1 12,9,1,1 10,10,2,1 6,11,1,1 8,11,1,2 9,12,1,1 8,15,1,2 27,22,1,1 22,24,1,1 25,24,1,1"
59
+ },
60
+ {
61
+ name: "lettuce-deep",
62
+ hex: "#3f7717",
63
+ rects: "22,5,1,1 14,6,1,2 15,8,1,1 8,9,1,1 14,9,1,1 7,11,1,2 11,11,2,1 11,12,1,1 10,13,1,1 5,15,1,1 9,15,1,1 4,16,1,1 6,16,2,1 6,17,1,1 7,18,2,1 2,19,1,1 2,21,1,2 29,24,1,1 19,25,1,1"
64
+ },
65
+ {
66
+ name: "lime-flesh",
67
+ hex: "#c4e574",
68
+ rects: "29,19,1,4 25,20,2,1 28,20,1,1 24,21,2,1 23,22,2,1 26,23,1,1 20,24,1,1 23,24,1,3 27,24,2,1 27,25,1,1 22,26,1,1 24,26,3,1"
69
+ },
70
+ {
71
+ name: "lime",
72
+ hex: "#9cd23e",
73
+ rects: "15,5,1,1 7,8,3,1 12,8,1,1 4,15,1,1 27,19,2,1 24,20,1,1 27,20,1,2 23,21,1,1 26,21,1,2 28,21,1,3 25,22,1,2 21,23,4,1 27,23,1,1 29,23,1,1 19,24,1,1 21,24,1,2 24,24,1,2 26,24,1,2 20,25,1,1 22,25,1,1 25,25,1,1 28,25,1,1"
74
+ },
75
+ {
76
+ name: "lime-rind",
77
+ hex: "#365e31",
78
+ rects: "11,4,1,1,6 12,4,4,1 20,4,3,1 7,7,1,1,7 25,7,1,1,7 6,8,1,1,7 26,8,1,1 2,18,1,1 28,18,2,1 24,19,1,1 21,22,2,1 2,23,1,2 29,25,1,1 20,26,1,1 21,27,6,1"
79
+ }
80
+ ], r = (e) => `--fiesta-icon-${e}`, i = n.map(({ name: e, hex: t }) => ({
81
+ name: e,
82
+ cssVar: r(e),
83
+ hex: t
84
+ }));
85
+ function a(e) {
86
+ return e.split(" ").map((e) => {
87
+ let [t, n, r, i, a] = e.split(",").map(Number);
88
+ return {
89
+ x: t,
90
+ y: n,
91
+ width: r,
92
+ height: i,
93
+ ...a === void 0 ? {} : { opacity: a / 8 }
94
+ };
95
+ });
96
+ }
97
+ var o = n.map((e) => ({
98
+ name: e.name,
99
+ fill: `var(${r(e.name)}, ${e.hex})`,
100
+ rects: a(e.rects)
101
+ })), s = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 32 32\" shape-rendering=\"crispEdges\">" + o.map((e) => `<g fill="${e.fill}">` + e.rects.map((e) => `<rect x="${e.x}" y="${e.y}" width="${e.width}" height="${e.height}"` + (e.opacity === void 0 ? "" : ` opacity="${e.opacity}"`) + "/>").join("") + "</g>").join("") + "</svg>", c = `data:image/svg+xml,${s.replace(/"/g, "'").replace(/%/g, "%25").replace(/#/g, "%23").replace(/</g, "%3C").replace(/>/g, "%3E")}`, l = null;
102
+ function u() {
103
+ return l === null && (l = o.map((e) => /* @__PURE__ */ t("g", {
104
+ fill: e.fill,
105
+ children: e.rects.map((e, n) => /* @__PURE__ */ t("rect", {
106
+ x: e.x,
107
+ y: e.y,
108
+ width: e.width,
109
+ height: e.height,
110
+ opacity: e.opacity
111
+ }, n))
112
+ }, e.name))), l;
113
+ }
114
+ var d = e(function({ size: e = 32, className: n }) {
115
+ return /* @__PURE__ */ t("svg", {
116
+ viewBox: "0 0 32 32",
117
+ width: e,
118
+ height: e,
119
+ shapeRendering: "crispEdges",
120
+ "aria-hidden": "true",
121
+ focusable: "false",
122
+ className: n,
123
+ children: u()
124
+ });
125
+ });
126
+ //#endregion
127
+ export { c as FIESTA_ICON_DATA_URI, i as FIESTA_ICON_PALETTE, s as FIESTA_ICON_SVG, d as FiestaIcon };
128
+
129
+ //# sourceMappingURL=fiesta-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiesta-icon.js","names":[],"sources":["../../../src/components/chrome/fiesta-icon.tsx"],"mappings":";;;AAuBA,IAAM,IAA0B;CAC9B;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;CACA;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;CACA;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;CACA;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;CACA;EACE,MAAM;EACN,KAAK;EACL,OAAO;CACT;CACA;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;CACA;EAAE,MAAM;EAAgB,KAAK;EAAW,OAAO;CAAqB;CACpE;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;CACA;EAAE,MAAM;EAAiB,KAAK;EAAW,OAAO;CAAsC;CACtF;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;CACA;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;CACA;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;CACA;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;CACA;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;CACA;EACE,MAAM;EACN,KAAK;EACL,OACE;CACJ;AACF,GAEM,KAAa,MAAiB,iBAAiB,KAMxC,IAAsB,EAAM,KAAK,EAAE,SAAM,cAAW;CAAE;CAAM,QAAQ,EAAU,CAAI;CAAG;AAAI,EAAE;AAUxG,SAAS,EAAW,GAA6B;CAC/C,OAAO,EAAQ,MAAM,GAAG,CAAC,CAAC,KAAK,MAAU;EACvC,IAAM,CAAC,GAAG,GAAG,GAAO,GAAQ,KAAW,EAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM;EAClE,OAAO;GAAE;GAAG;GAAG;GAAO;GAAQ,GAAI,MAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,IAAU,EAAE;EAAG;CAC3F,CAAC;AACH;AAEA,IAAM,IAAS,EAAM,KAAK,OAAU;CAClC,MAAM,EAAK;CACX,MAAM,OAAO,EAAU,EAAK,IAAI,EAAE,IAAI,EAAK,IAAI;CAC/C,OAAO,EAAW,EAAK,KAAK;AAC9B,EAAE,GAMW,IACX,oGACA,EAAO,KACJ,MACC,YAAY,EAAM,KAAK,MACvB,EAAM,MACH,KACE,MACC,YAAY,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,MAAM,YAAY,EAAE,OAAO,MAClE,EAAE,YAAY,KAAA,IAAY,KAAK,aAAa,EAAE,QAAQ,MACvD,IACJ,CAAC,CACA,KAAK,EAAE,IACV,MACJ,CAAC,CAAC,KAAK,EAAE,IACT,UASW,IAAuB,sBAAsB,EAAgB,QAAQ,MAAM,GAAG,CAAC,CACzF,QAAQ,MAAM,KAAK,CAAC,CACpB,QAAQ,MAAM,KAAK,CAAC,CACpB,QAAQ,MAAM,KAAK,CAAC,CACpB,QAAQ,MAAM,KAAK,KAOlB,IAAiC;AASrC,SAAS,IAA6B;CAUpC,OATI,MAAiB,SACnB,IAAe,EAAO,KAAK,MACzB,kBAAC,KAAD;EAAoB,MAAM,EAAM;EAC7B,UAAA,EAAM,MAAM,KAAK,GAAG,MACnB,kBAAC,QAAD;GAAc,GAAG,EAAE;GAAG,GAAG,EAAE;GAAG,OAAO,EAAE;GAAO,QAAQ,EAAE;GAAQ,SAAS,EAAE;EAAU,GAA1E,CAA0E,CACtF;CACA,GAJK,EAAM,IAIX,CACJ,IAEI;AACT;AAOA,IAAa,IAAa,EAAK,SAAoB,EAAE,UAAO,IAAI,gBAA8B;CAC5F,OACE,kBAAC,OAAD;EACE,SAAQ;EACR,OAAO;EACP,QAAQ;EACR,gBAAe;EACf,eAAY;EACZ,WAAU;EACC;EAEV,UAAA,EAAgB;CACd,CAAA;AAET,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface FiestaLogoProps {
2
+ size?: "sm" | "md";
3
+ className?: string;
4
+ }
5
+ export declare const FiestaLogo: import("react").MemoExoticComponent<({ size, className }: FiestaLogoProps) => import("react").JSX.Element>;
6
+ export {};
@@ -0,0 +1,20 @@
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/fiesta-logo.tsx
5
+ var i = t(function({ size: t = "md", className: i }) {
6
+ return /* @__PURE__ */ r("span", {
7
+ className: e("inline-flex items-baseline select-none leading-none tracking-tight", t === "sm" ? "text-lg" : "text-xl", i),
8
+ children: [/* @__PURE__ */ n("span", {
9
+ className: "font-black text-brand logo-fiesta-text",
10
+ children: "Fiesta"
11
+ }), /* @__PURE__ */ n("span", {
12
+ className: "font-light text-sidebar-foreground",
13
+ children: "Board"
14
+ })]
15
+ });
16
+ });
17
+ //#endregion
18
+ export { i as FiestaLogo };
19
+
20
+ //# sourceMappingURL=fiesta-logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fiesta-logo.js","names":[],"sources":["../../../src/components/chrome/fiesta-logo.tsx"],"mappings":";;;;AASA,IAAa,IAAa,EAAK,SAAoB,EAAE,UAAO,MAAM,gBAA8B;CAG9F,OACE,kBAAC,QAAD;EACE,WAAW,EACT,sEALO,MAAS,OAMT,YAAY,WACnB,CACF;EALF,UAAA,CAOE,kBAAC,QAAD;GAAM,WAAU;GAAyC,UAAA;EAAY,CAAA,GACrE,kBAAC,QAAD;GAAM,WAAU;GAAqC,UAAA;EAAW,CAAA,CAC5D;;AAEV,CAAC"}