@schandlergarcia/sf-web-components 1.0.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 (195) hide show
  1. package/.a4drules/skills/building-data-visualization/SKILL.md +72 -0
  2. package/.a4drules/skills/building-data-visualization/implementation/bar-line-chart.md +316 -0
  3. package/.a4drules/skills/building-data-visualization/implementation/dashboard-layout.md +189 -0
  4. package/.a4drules/skills/building-data-visualization/implementation/donut-chart.md +181 -0
  5. package/.a4drules/skills/building-data-visualization/implementation/stat-card.md +150 -0
  6. package/.a4drules/skills/building-react-components/SKILL.md +96 -0
  7. package/.a4drules/skills/building-react-components/implementation/component.md +78 -0
  8. package/.a4drules/skills/building-react-components/implementation/header-footer.md +132 -0
  9. package/.a4drules/skills/building-react-components/implementation/page.md +93 -0
  10. package/.a4drules/skills/configuring-csp-trusted-sites/SKILL.md +90 -0
  11. package/.a4drules/skills/configuring-csp-trusted-sites/implementation/metadata-format.md +281 -0
  12. package/.a4drules/skills/configuring-webapp-metadata/SKILL.md +158 -0
  13. package/.a4drules/skills/creating-webapp/SKILL.md +140 -0
  14. package/.a4drules/skills/deploying-to-salesforce/SKILL.md +226 -0
  15. package/.a4drules/skills/implementing-file-upload/SKILL.md +396 -0
  16. package/.a4drules/skills/installing-webapp-features/SKILL.md +210 -0
  17. package/.a4drules/skills/managing-agentforce-conversation-client/SKILL.md +186 -0
  18. package/.a4drules/skills/managing-agentforce-conversation-client/references/constraints.md +134 -0
  19. package/.a4drules/skills/managing-agentforce-conversation-client/references/examples.md +132 -0
  20. package/.a4drules/skills/managing-agentforce-conversation-client/references/style-tokens.md +101 -0
  21. package/.a4drules/skills/managing-agentforce-conversation-client/references/troubleshooting.md +57 -0
  22. package/.a4drules/skills/using-salesforce-data/SKILL.md +363 -0
  23. package/.a4drules/skills/using-salesforce-data/graphql-search.sh +139 -0
  24. package/.a4drules/webapp-data.md +353 -0
  25. package/.a4drules/webapp-ui.md +16 -0
  26. package/README.md +124 -0
  27. package/dist/components/library/cards/ActionList.js +27 -0
  28. package/dist/components/library/cards/ActionList.js.map +1 -0
  29. package/dist/components/library/cards/ActivityCard.js +40 -0
  30. package/dist/components/library/cards/ActivityCard.js.map +1 -0
  31. package/dist/components/library/cards/BaseCard.js +89 -0
  32. package/dist/components/library/cards/BaseCard.js.map +1 -0
  33. package/dist/components/library/cards/CalloutCard.js +28 -0
  34. package/dist/components/library/cards/CalloutCard.js.map +1 -0
  35. package/dist/components/library/cards/ChartCard.js +79 -0
  36. package/dist/components/library/cards/ChartCard.js.map +1 -0
  37. package/dist/components/library/cards/FeedPanel.js +38 -0
  38. package/dist/components/library/cards/FeedPanel.js.map +1 -0
  39. package/dist/components/library/cards/ListCard.js +112 -0
  40. package/dist/components/library/cards/ListCard.js.map +1 -0
  41. package/dist/components/library/cards/MetricCard.js +86 -0
  42. package/dist/components/library/cards/MetricCard.js.map +1 -0
  43. package/dist/components/library/cards/MetricsStrip.js +60 -0
  44. package/dist/components/library/cards/MetricsStrip.js.map +1 -0
  45. package/dist/components/library/cards/SectionCard.js +59 -0
  46. package/dist/components/library/cards/SectionCard.js.map +1 -0
  47. package/dist/components/library/cards/StatusCard.js +137 -0
  48. package/dist/components/library/cards/StatusCard.js.map +1 -0
  49. package/dist/components/library/cards/TableCard.js +244 -0
  50. package/dist/components/library/cards/TableCard.js.map +1 -0
  51. package/dist/components/library/cards/WidgetCard.js +60 -0
  52. package/dist/components/library/cards/WidgetCard.js.map +1 -0
  53. package/dist/components/library/charts/D3Chart.js +74 -0
  54. package/dist/components/library/charts/D3Chart.js.map +1 -0
  55. package/dist/components/library/charts/D3ChartTemplates.js +44 -0
  56. package/dist/components/library/charts/D3ChartTemplates.js.map +1 -0
  57. package/dist/components/library/charts/GeoMap.js +229 -0
  58. package/dist/components/library/charts/GeoMap.js.map +1 -0
  59. package/dist/components/library/chat/ChatBar.js +194 -0
  60. package/dist/components/library/chat/ChatBar.js.map +1 -0
  61. package/dist/components/library/chat/ChatInput.js +67 -0
  62. package/dist/components/library/chat/ChatInput.js.map +1 -0
  63. package/dist/components/library/chat/ChatMessage.js +112 -0
  64. package/dist/components/library/chat/ChatMessage.js.map +1 -0
  65. package/dist/components/library/chat/ChatMessageList.js +50 -0
  66. package/dist/components/library/chat/ChatMessageList.js.map +1 -0
  67. package/dist/components/library/chat/ChatPanel.js +77 -0
  68. package/dist/components/library/chat/ChatPanel.js.map +1 -0
  69. package/dist/components/library/chat/ChatSuggestions.js +22 -0
  70. package/dist/components/library/chat/ChatSuggestions.js.map +1 -0
  71. package/dist/components/library/chat/ChatToolCall.js +87 -0
  72. package/dist/components/library/chat/ChatToolCall.js.map +1 -0
  73. package/dist/components/library/chat/ChatTypingIndicator.js +20 -0
  74. package/dist/components/library/chat/ChatTypingIndicator.js.map +1 -0
  75. package/dist/components/library/chat/ChatWelcome.js +24 -0
  76. package/dist/components/library/chat/ChatWelcome.js.map +1 -0
  77. package/dist/components/library/chat/useChatState.js +77 -0
  78. package/dist/components/library/chat/useChatState.js.map +1 -0
  79. package/dist/components/library/data/DataModeProvider.js +47 -0
  80. package/dist/components/library/data/DataModeProvider.js.map +1 -0
  81. package/dist/components/library/data/DataModeToggle.js +28 -0
  82. package/dist/components/library/data/DataModeToggle.js.map +1 -0
  83. package/dist/components/library/data/filterUtils.js +71 -0
  84. package/dist/components/library/data/filterUtils.js.map +1 -0
  85. package/dist/components/library/data/useDataSource.js +13 -0
  86. package/dist/components/library/data/useDataSource.js.map +1 -0
  87. package/dist/components/library/data/usePageFilters.js +46 -0
  88. package/dist/components/library/data/usePageFilters.js.map +1 -0
  89. package/dist/components/library/filters/FilterBar.js +89 -0
  90. package/dist/components/library/filters/FilterBar.js.map +1 -0
  91. package/dist/components/library/filters/SearchFilter.js +44 -0
  92. package/dist/components/library/filters/SearchFilter.js.map +1 -0
  93. package/dist/components/library/filters/SelectFilter.js +44 -0
  94. package/dist/components/library/filters/SelectFilter.js.map +1 -0
  95. package/dist/components/library/filters/ToggleFilter.js +48 -0
  96. package/dist/components/library/filters/ToggleFilter.js.map +1 -0
  97. package/dist/components/library/forms/FormField.js +256 -0
  98. package/dist/components/library/forms/FormField.js.map +1 -0
  99. package/dist/components/library/forms/FormModal.js +161 -0
  100. package/dist/components/library/forms/FormModal.js.map +1 -0
  101. package/dist/components/library/forms/FormRenderer.js +32 -0
  102. package/dist/components/library/forms/FormRenderer.js.map +1 -0
  103. package/dist/components/library/forms/FormSection.js +49 -0
  104. package/dist/components/library/forms/FormSection.js.map +1 -0
  105. package/dist/components/library/forms/useFormState.js +85 -0
  106. package/dist/components/library/forms/useFormState.js.map +1 -0
  107. package/dist/components/library/heroui/Accordion.js +12 -0
  108. package/dist/components/library/heroui/Accordion.js.map +1 -0
  109. package/dist/components/library/heroui/Alert.js +12 -0
  110. package/dist/components/library/heroui/Alert.js.map +1 -0
  111. package/dist/components/library/heroui/Badge.js +12 -0
  112. package/dist/components/library/heroui/Badge.js.map +1 -0
  113. package/dist/components/library/heroui/Breadcrumbs.js +12 -0
  114. package/dist/components/library/heroui/Breadcrumbs.js.map +1 -0
  115. package/dist/components/library/heroui/Button.js +18 -0
  116. package/dist/components/library/heroui/Button.js.map +1 -0
  117. package/dist/components/library/heroui/Card.js +12 -0
  118. package/dist/components/library/heroui/Card.js.map +1 -0
  119. package/dist/components/library/heroui/Drawer.js +12 -0
  120. package/dist/components/library/heroui/Drawer.js.map +1 -0
  121. package/dist/components/library/heroui/Dropdown.js +12 -0
  122. package/dist/components/library/heroui/Dropdown.js.map +1 -0
  123. package/dist/components/library/heroui/Input.js +10 -0
  124. package/dist/components/library/heroui/Input.js.map +1 -0
  125. package/dist/components/library/heroui/Kbd.js +12 -0
  126. package/dist/components/library/heroui/Kbd.js.map +1 -0
  127. package/dist/components/library/heroui/Meter.js +12 -0
  128. package/dist/components/library/heroui/Meter.js.map +1 -0
  129. package/dist/components/library/heroui/Modal.js +12 -0
  130. package/dist/components/library/heroui/Modal.js.map +1 -0
  131. package/dist/components/library/heroui/Pagination.js +12 -0
  132. package/dist/components/library/heroui/Pagination.js.map +1 -0
  133. package/dist/components/library/heroui/ProgressBar.js +12 -0
  134. package/dist/components/library/heroui/ProgressBar.js.map +1 -0
  135. package/dist/components/library/heroui/ProgressCircle.js +12 -0
  136. package/dist/components/library/heroui/ProgressCircle.js.map +1 -0
  137. package/dist/components/library/heroui/ScrollShadow.js +12 -0
  138. package/dist/components/library/heroui/ScrollShadow.js.map +1 -0
  139. package/dist/components/library/heroui/Select.js +12 -0
  140. package/dist/components/library/heroui/Select.js.map +1 -0
  141. package/dist/components/library/heroui/Separator.js +12 -0
  142. package/dist/components/library/heroui/Separator.js.map +1 -0
  143. package/dist/components/library/heroui/Skeleton.js +12 -0
  144. package/dist/components/library/heroui/Skeleton.js.map +1 -0
  145. package/dist/components/library/heroui/Tabs.js +12 -0
  146. package/dist/components/library/heroui/Tabs.js.map +1 -0
  147. package/dist/components/library/heroui/Toast.js +13 -0
  148. package/dist/components/library/heroui/Toast.js.map +1 -0
  149. package/dist/components/library/heroui/Toggle.js +12 -0
  150. package/dist/components/library/heroui/Toggle.js.map +1 -0
  151. package/dist/components/library/heroui/Tooltip.js +12 -0
  152. package/dist/components/library/heroui/Tooltip.js.map +1 -0
  153. package/dist/components/library/layout/PageContainer.js +9 -0
  154. package/dist/components/library/layout/PageContainer.js.map +1 -0
  155. package/dist/components/library/skeletons/CardSkeleton.js +29 -0
  156. package/dist/components/library/skeletons/CardSkeleton.js.map +1 -0
  157. package/dist/components/library/theme/AppThemeProvider.js +55 -0
  158. package/dist/components/library/theme/AppThemeProvider.js.map +1 -0
  159. package/dist/components/library/theme/tokens.js +55 -0
  160. package/dist/components/library/theme/tokens.js.map +1 -0
  161. package/dist/components/library/ui/Avatar.js +33 -0
  162. package/dist/components/library/ui/Avatar.js.map +1 -0
  163. package/dist/components/library/ui/Button.js +50 -0
  164. package/dist/components/library/ui/Button.js.map +1 -0
  165. package/dist/components/library/ui/Card.js +21 -0
  166. package/dist/components/library/ui/Card.js.map +1 -0
  167. package/dist/components/library/ui/Chip.js +31 -0
  168. package/dist/components/library/ui/Chip.js.map +1 -0
  169. package/dist/components/library/ui/Container.js +42 -0
  170. package/dist/components/library/ui/Container.js.map +1 -0
  171. package/dist/components/library/ui/EmptyState.js +27 -0
  172. package/dist/components/library/ui/EmptyState.js.map +1 -0
  173. package/dist/components/library/ui/Input.js +22 -0
  174. package/dist/components/library/ui/Input.js.map +1 -0
  175. package/dist/components/library/ui/Spinner.js +64 -0
  176. package/dist/components/library/ui/Spinner.js.map +1 -0
  177. package/dist/components/library/ui/Text.js +43 -0
  178. package/dist/components/library/ui/Text.js.map +1 -0
  179. package/dist/components/library/ui/Toggle.js +47 -0
  180. package/dist/components/library/ui/Toggle.js.map +1 -0
  181. package/dist/components/workspace/ComponentRegistry.js +231 -0
  182. package/dist/components/workspace/ComponentRegistry.js.map +1 -0
  183. package/dist/index.js +185 -0
  184. package/dist/index.js.map +1 -0
  185. package/dist/lib/utils.js +9 -0
  186. package/dist/lib/utils.js.map +1 -0
  187. package/dist/node_modules/clsx/dist/clsx.js +17 -0
  188. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  189. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +2925 -0
  190. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  191. package/package.json +81 -0
  192. package/scripts/get-graphql-schema.mjs +68 -0
  193. package/scripts/reset-command-center.sh +358 -0
  194. package/scripts/rewrite-e2e-assets.mjs +23 -0
  195. package/scripts/validate-dashboard.sh +290 -0
@@ -0,0 +1,55 @@
1
+ import { jsx as i } from "react/jsx-runtime";
2
+ import t from "react";
3
+ import { tokens as d, getTokenCSSProperties as u } from "./tokens.js";
4
+ const a = t.createContext({
5
+ mode: "light",
6
+ theme: d,
7
+ toggle: () => {
8
+ }
9
+ }), c = "app-color-mode";
10
+ function f(r) {
11
+ if (typeof document > "u") return;
12
+ const o = document.documentElement;
13
+ r === "dark" ? o.classList.add("dark") : o.classList.remove("dark");
14
+ }
15
+ function l() {
16
+ if (typeof document > "u") return;
17
+ const r = document.documentElement, o = u();
18
+ for (const [e, s] of Object.entries(o))
19
+ r.style.setProperty(e, s);
20
+ }
21
+ function k() {
22
+ return t.useContext(a);
23
+ }
24
+ function y({ initialMode: r = "light", children: o }) {
25
+ const [e, s] = t.useState(r);
26
+ t.useEffect(() => {
27
+ l();
28
+ }, []), t.useEffect(() => {
29
+ try {
30
+ const n = window.localStorage.getItem(c);
31
+ (n === "light" || n === "dark") && s(n);
32
+ } catch {
33
+ }
34
+ }, []), t.useEffect(() => {
35
+ f(e);
36
+ try {
37
+ window.localStorage.setItem(c, e);
38
+ } catch {
39
+ }
40
+ }, [e]);
41
+ const m = t.useMemo(
42
+ () => ({
43
+ mode: e,
44
+ theme: d,
45
+ toggle: () => s((n) => n === "dark" ? "light" : "dark")
46
+ }),
47
+ [e]
48
+ );
49
+ return /* @__PURE__ */ i(a.Provider, { value: m, children: o });
50
+ }
51
+ export {
52
+ y as default,
53
+ k as useThemeMode
54
+ };
55
+ //# sourceMappingURL=AppThemeProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppThemeProvider.js","sources":["../../../../src/components/library/theme/AppThemeProvider.jsx"],"sourcesContent":["import React from \"react\";\nimport { tokens, getTokenCSSProperties } from \"./tokens\";\n\nconst ThemeModeContext = React.createContext({\n mode: \"light\",\n theme: tokens,\n toggle: () => {}\n});\n\nconst STORAGE_KEY = \"app-color-mode\";\n\nfunction applyHtmlDarkClass(mode) {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n if (mode === \"dark\") root.classList.add(\"dark\");\n else root.classList.remove(\"dark\");\n}\n\nfunction applyTokenCSSProperties() {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const props = getTokenCSSProperties();\n for (const [key, value] of Object.entries(props)) {\n root.style.setProperty(key, value);\n }\n}\n\nexport function useThemeMode() {\n return React.useContext(ThemeModeContext);\n}\n\nexport default function AppThemeProvider({ initialMode = \"light\", children }) {\n const [mode, setMode] = React.useState(initialMode);\n\n React.useEffect(() => {\n applyTokenCSSProperties();\n }, []);\n\n React.useEffect(() => {\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n if (stored === \"light\" || stored === \"dark\") setMode(stored);\n } catch {\n // ignore\n }\n }, []);\n\n React.useEffect(() => {\n applyHtmlDarkClass(mode);\n try {\n window.localStorage.setItem(STORAGE_KEY, mode);\n } catch {\n // ignore\n }\n }, [mode]);\n\n const value = React.useMemo(\n () => ({\n mode,\n theme: tokens,\n toggle: () => setMode((m) => (m === \"dark\" ? \"light\" : \"dark\"))\n }),\n [mode]\n );\n\n return <ThemeModeContext.Provider value={value}>{children}</ThemeModeContext.Provider>;\n}\n"],"names":["ThemeModeContext","React","tokens","STORAGE_KEY","applyHtmlDarkClass","mode","root","applyTokenCSSProperties","props","getTokenCSSProperties","key","value","useThemeMode","AppThemeProvider","initialMode","children","setMode","stored","m","jsx"],"mappings":";;;AAGA,MAAMA,IAAmBC,EAAM,cAAc;AAAA,EAC3C,MAAM;AAAA,EACN,OAAOC;AAAA,EACP,QAAQ,MAAM;AAAA,EAAC;AACjB,CAAC,GAEKC,IAAc;AAEpB,SAASC,EAAmBC,GAAM;AAChC,MAAI,OAAO,WAAa,IAAa;AACrC,QAAMC,IAAO,SAAS;AACtB,EAAID,MAAS,SAAQC,EAAK,UAAU,IAAI,MAAM,IACzCA,EAAK,UAAU,OAAO,MAAM;AACnC;AAEA,SAASC,IAA0B;AACjC,MAAI,OAAO,WAAa,IAAa;AACrC,QAAMD,IAAO,SAAS,iBAChBE,IAAQC,EAAA;AACd,aAAW,CAACC,GAAKC,CAAK,KAAK,OAAO,QAAQH,CAAK;AAC7C,IAAAF,EAAK,MAAM,YAAYI,GAAKC,CAAK;AAErC;AAEO,SAASC,IAAe;AAC7B,SAAOX,EAAM,WAAWD,CAAgB;AAC1C;AAEA,SAAwBa,EAAiB,EAAE,aAAAC,IAAc,SAAS,UAAAC,KAAY;AAC5E,QAAM,CAACV,GAAMW,CAAO,IAAIf,EAAM,SAASa,CAAW;AAElD,EAAAb,EAAM,UAAU,MAAM;AACpB,IAAAM,EAAA;AAAA,EACF,GAAG,CAAA,CAAE,GAELN,EAAM,UAAU,MAAM;AACpB,QAAI;AACF,YAAMgB,IAAS,OAAO,aAAa,QAAQd,CAAW;AACtD,OAAIc,MAAW,WAAWA,MAAW,aAAgBA,CAAM;AAAA,IAC7D,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAA,CAAE,GAELhB,EAAM,UAAU,MAAM;AACpB,IAAAG,EAAmBC,CAAI;AACvB,QAAI;AACF,aAAO,aAAa,QAAQF,GAAaE,CAAI;AAAA,IAC/C,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAACA,CAAI,CAAC;AAET,QAAMM,IAAQV,EAAM;AAAA,IAClB,OAAO;AAAA,MACL,MAAAI;AAAA,MACA,OAAOH;AAAA,MACP,QAAQ,MAAMc,EAAQ,CAACE,MAAOA,MAAM,SAAS,UAAU,MAAO;AAAA,IAAA;AAAA,IAEhE,CAACb,CAAI;AAAA,EAAA;AAGP,SAAO,gBAAAc,EAACnB,EAAiB,UAAjB,EAA0B,OAAAW,GAAe,UAAAI,EAAA,CAAS;AAC5D;"}
@@ -0,0 +1,55 @@
1
+ const t = {
2
+ colors: {
3
+ brand: {
4
+ 50: "#EEF2FF",
5
+ 100: "#E0E7FF",
6
+ 200: "#C7D2FE",
7
+ 300: "#A5B4FC",
8
+ 400: "#818CF8",
9
+ 500: "#6366F1",
10
+ 600: "#4F46E5",
11
+ 700: "#4338CA",
12
+ 800: "#3730A3",
13
+ 900: "#312E81",
14
+ 950: "#1E1B4E"
15
+ },
16
+ accent: {
17
+ 50: "#ECFEFF",
18
+ 100: "#CFFAFE",
19
+ 200: "#A5F3FC",
20
+ 300: "#67E8F9",
21
+ 400: "#22D3EE",
22
+ 500: "#06B6D4",
23
+ 600: "#0891B2",
24
+ 700: "#0E7490",
25
+ 800: "#155E75",
26
+ 900: "#164E63",
27
+ 950: "#083344"
28
+ }
29
+ },
30
+ fonts: {
31
+ sans: "Inter",
32
+ mono: "JetBrains Mono"
33
+ },
34
+ radius: {
35
+ sm: "0.5rem",
36
+ md: "0.75rem",
37
+ lg: "1rem"
38
+ },
39
+ spacing: {
40
+ pageX: "1.25rem",
41
+ pageY: "1.25rem"
42
+ }
43
+ };
44
+ function F() {
45
+ const e = {};
46
+ for (const [o, r] of Object.entries(t.colors))
47
+ for (const [s, n] of Object.entries(r))
48
+ e[`--color-${o}-${s}`] = n;
49
+ return e;
50
+ }
51
+ export {
52
+ F as getTokenCSSProperties,
53
+ t as tokens
54
+ };
55
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sources":["../../../../src/components/library/theme/tokens.jsx"],"sourcesContent":["/**\n * Design tokens — single source of truth for branding.\n *\n * To rebrand a command center:\n * 1. Swap the `brand` palette (use any Tailwind-style color scale)\n * 2. Swap the `accent` palette\n * 3. Change `fonts.sans` in _app.js (next/font import)\n *\n * AppThemeProvider injects these as CSS custom properties on :root,\n * and tailwind.config.js references them via var(--color-brand-*).\n */\n\nexport const tokens = {\n colors: {\n brand: {\n 50: \"#EEF2FF\",\n 100: \"#E0E7FF\",\n 200: \"#C7D2FE\",\n 300: \"#A5B4FC\",\n 400: \"#818CF8\",\n 500: \"#6366F1\",\n 600: \"#4F46E5\",\n 700: \"#4338CA\",\n 800: \"#3730A3\",\n 900: \"#312E81\",\n 950: \"#1E1B4E\",\n },\n accent: {\n 50: \"#ECFEFF\",\n 100: \"#CFFAFE\",\n 200: \"#A5F3FC\",\n 300: \"#67E8F9\",\n 400: \"#22D3EE\",\n 500: \"#06B6D4\",\n 600: \"#0891B2\",\n 700: \"#0E7490\",\n 800: \"#155E75\",\n 900: \"#164E63\",\n 950: \"#083344\",\n },\n },\n\n fonts: {\n sans: \"Inter\",\n mono: \"JetBrains Mono\",\n },\n\n radius: {\n sm: \"0.5rem\",\n md: \"0.75rem\",\n lg: \"1rem\",\n },\n\n spacing: {\n pageX: \"1.25rem\",\n pageY: \"1.25rem\",\n },\n};\n\n/**\n * Generates CSS custom property assignments from the token palettes.\n * Used by AppThemeProvider to inject on :root at runtime.\n */\nexport function getTokenCSSProperties() {\n const props = {};\n for (const [palette, shades] of Object.entries(tokens.colors)) {\n for (const [shade, value] of Object.entries(shades)) {\n props[`--color-${palette}-${shade}`] = value;\n }\n }\n return props;\n}\n"],"names":["tokens","getTokenCSSProperties","props","palette","shades","shade","value"],"mappings":"AAYO,MAAMA,IAAS;AAAA,EACpB,QAAQ;AAAA,IACN,OAAO;AAAA,MACL,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA;AAAA,IAEP,QAAQ;AAAA,MACN,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA;AAAA,EACP;AAAA,EAGF,OAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA,EAGR,QAAQ;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAGN,SAAS;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EAAA;AAEX;AAMO,SAASC,IAAwB;AACtC,QAAMC,IAAQ,CAAA;AACd,aAAW,CAACC,GAASC,CAAM,KAAK,OAAO,QAAQJ,EAAO,MAAM;AAC1D,eAAW,CAACK,GAAOC,CAAK,KAAK,OAAO,QAAQF,CAAM;AAChD,MAAAF,EAAM,WAAWC,CAAO,IAAIE,CAAK,EAAE,IAAIC;AAG3C,SAAOJ;AACT;"}
@@ -0,0 +1,33 @@
1
+ import { jsx as a } from "react/jsx-runtime";
2
+ import m from "react";
3
+ const o = {
4
+ xs: "h-6 w-6 text-[9px]",
5
+ sm: "h-8 w-8 text-[10px]",
6
+ md: "h-9 w-9 text-xs",
7
+ lg: "h-11 w-11 text-sm"
8
+ }, t = {
9
+ slate: "bg-slate-800 text-white",
10
+ brand: "bg-brand-500 text-white",
11
+ neutral: "bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-200"
12
+ };
13
+ function p({ src: i, name: e, initials: x, icon: n, size: c = "sm", tone: d = "slate", className: s = "", ...r }) {
14
+ const l = o[c] ?? o.sm;
15
+ if (i)
16
+ return /* @__PURE__ */ a(
17
+ "img",
18
+ {
19
+ src: i,
20
+ alt: e ?? "",
21
+ className: `${l} shrink-0 rounded-full border border-slate-200 object-cover dark:border-slate-800 ${s}`,
22
+ ...r
23
+ }
24
+ );
25
+ if (m.isValidElement(n))
26
+ return /* @__PURE__ */ a("div", { className: `${l} ${t[d] ?? t.slate} flex shrink-0 items-center justify-center rounded-full ${s}`, ...r, children: n });
27
+ const f = x ?? (e ? e.split(" ").map((u) => u[0]).join("").slice(0, 2).toUpperCase() : "?");
28
+ return /* @__PURE__ */ a("div", { className: `${l} ${t[d] ?? t.slate} flex shrink-0 items-center justify-center rounded-full font-bold ${s}`, ...r, children: f });
29
+ }
30
+ export {
31
+ p as default
32
+ };
33
+ //# sourceMappingURL=Avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Avatar.js","sources":["../../../../src/components/library/ui/Avatar.jsx"],"sourcesContent":["import React from \"react\";\n\nconst SIZE_MAP = {\n xs: \"h-6 w-6 text-[9px]\",\n sm: \"h-8 w-8 text-[10px]\",\n md: \"h-9 w-9 text-xs\",\n lg: \"h-11 w-11 text-sm\",\n};\n\nconst TONE_MAP = {\n slate: \"bg-slate-800 text-white\",\n brand: \"bg-brand-500 text-white\",\n neutral: \"bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-200\",\n};\n\nexport default function Avatar({ src, name, initials, icon, size = \"sm\", tone = \"slate\", className = \"\", ...rest }) {\n const sizeClass = SIZE_MAP[size] ?? SIZE_MAP.sm;\n\n if (src) {\n return (\n <img\n src={src}\n alt={name ?? \"\"}\n className={`${sizeClass} shrink-0 rounded-full border border-slate-200 object-cover dark:border-slate-800 ${className}`}\n {...rest}\n />\n );\n }\n\n if (React.isValidElement(icon)) {\n return (\n <div className={`${sizeClass} ${TONE_MAP[tone] ?? TONE_MAP.slate} flex shrink-0 items-center justify-center rounded-full ${className}`} {...rest}>\n {icon}\n </div>\n );\n }\n\n const label = initials ?? (name ? name.split(\" \").map(w => w[0]).join(\"\").slice(0, 2).toUpperCase() : \"?\");\n return (\n <div className={`${sizeClass} ${TONE_MAP[tone] ?? TONE_MAP.slate} flex shrink-0 items-center justify-center rounded-full font-bold ${className}`} {...rest}>\n {label}\n </div>\n );\n}\n"],"names":["SIZE_MAP","TONE_MAP","Avatar","src","name","initials","icon","size","tone","className","rest","sizeClass","jsx","React","label","w"],"mappings":";;AAEA,MAAMA,IAAW;AAAA,EACf,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAW;AAAA,EACf,OAAS;AAAA,EACT,OAAS;AAAA,EACT,SAAS;AACX;AAEA,SAAwBC,EAAO,EAAE,KAAAC,GAAK,MAAAC,GAAM,UAAAC,GAAU,MAAAC,GAAM,MAAAC,IAAO,MAAM,MAAAC,IAAO,SAAS,WAAAC,IAAY,IAAI,GAAGC,KAAQ;AAClH,QAAMC,IAAYX,EAASO,CAAI,KAAKP,EAAS;AAE7C,MAAIG;AACF,WACE,gBAAAS;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAAT;AAAA,QACA,KAAKC,KAAQ;AAAA,QACb,WAAW,GAAGO,CAAS,qFAAqFF,CAAS;AAAA,QACpH,GAAGC;AAAA,MAAA;AAAA,IAAA;AAKV,MAAIG,EAAM,eAAeP,CAAI;AAC3B,6BACG,OAAA,EAAI,WAAW,GAAGK,CAAS,IAAIV,EAASO,CAAI,KAAKP,EAAS,KAAK,2DAA2DQ,CAAS,IAAK,GAAGC,GACzI,UAAAJ,GACH;AAIJ,QAAMQ,IAAQT,MAAaD,IAAOA,EAAK,MAAM,GAAG,EAAE,IAAI,CAAAW,MAAKA,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,YAAA,IAAgB;AACtG,2BACG,OAAA,EAAI,WAAW,GAAGJ,CAAS,IAAIV,EAASO,CAAI,KAAKP,EAAS,KAAK,qEAAqEQ,CAAS,IAAK,GAAGC,GACnJ,UAAAI,GACH;AAEJ;"}
@@ -0,0 +1,50 @@
1
+ import { jsx as u } from "react/jsx-runtime";
2
+ import "react";
3
+ const t = {
4
+ primary: "bg-brand-600 text-white hover:bg-brand-500 dark:bg-brand-500 dark:hover:bg-brand-400 border-transparent",
5
+ secondary: "bg-slate-900 text-white hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-900 dark:hover:bg-slate-200 border-transparent",
6
+ outline: "bg-transparent text-slate-900 hover:bg-slate-50 dark:text-slate-50 dark:hover:bg-slate-900 border-slate-200 dark:border-slate-800",
7
+ ghost: "bg-transparent text-slate-900 hover:bg-slate-100 dark:text-slate-50 dark:hover:bg-slate-900 border-transparent"
8
+ }, e = {
9
+ sm: "h-8 px-3 text-sm",
10
+ md: "h-10 px-4 text-sm",
11
+ lg: "h-12 px-5 text-base"
12
+ };
13
+ function c({
14
+ variant: r = "primary",
15
+ size: a = "md",
16
+ fullWidth: s = !1,
17
+ disabled: o = !1,
18
+ onClick: n = () => {
19
+ },
20
+ children: l,
21
+ style: d = void 0,
22
+ className: i = "",
23
+ ...b
24
+ }) {
25
+ const g = t[r] ?? t.primary, f = e[a] ?? e.md;
26
+ return /* @__PURE__ */ u(
27
+ "button",
28
+ {
29
+ type: "button",
30
+ onClick: n,
31
+ disabled: o,
32
+ style: d,
33
+ className: [
34
+ "inline-flex items-center justify-center gap-2 rounded-lg border font-medium shadow-sm transition",
35
+ "focus:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-slate-950",
36
+ "disabled:cursor-not-allowed disabled:opacity-60",
37
+ g,
38
+ f,
39
+ s ? "w-full" : "",
40
+ i
41
+ ].filter(Boolean).join(" "),
42
+ ...b,
43
+ children: l
44
+ }
45
+ );
46
+ }
47
+ export {
48
+ c as default
49
+ };
50
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sources":["../../../../src/components/library/ui/Button.jsx"],"sourcesContent":["import React from \"react\";\n\nconst VARIANT_CLASSES = {\n primary:\n \"bg-brand-600 text-white hover:bg-brand-500 dark:bg-brand-500 dark:hover:bg-brand-400 border-transparent\",\n secondary:\n \"bg-slate-900 text-white hover:bg-slate-800 dark:bg-slate-100 dark:text-slate-900 dark:hover:bg-slate-200 border-transparent\",\n outline:\n \"bg-transparent text-slate-900 hover:bg-slate-50 dark:text-slate-50 dark:hover:bg-slate-900 border-slate-200 dark:border-slate-800\",\n ghost:\n \"bg-transparent text-slate-900 hover:bg-slate-100 dark:text-slate-50 dark:hover:bg-slate-900 border-transparent\"\n};\n\nconst SIZE_CLASSES = {\n sm: \"h-8 px-3 text-sm\",\n md: \"h-10 px-4 text-sm\",\n lg: \"h-12 px-5 text-base\"\n};\n\nexport default function UIButton({\n variant = \"primary\",\n size = \"md\",\n fullWidth = false,\n disabled = false,\n onClick = () => {},\n children,\n style = undefined,\n className = \"\",\n ...rest\n}) {\n const variantClass = VARIANT_CLASSES[variant] ?? VARIANT_CLASSES.primary;\n const sizeClass = SIZE_CLASSES[size] ?? SIZE_CLASSES.md;\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n style={style}\n className={[\n \"inline-flex items-center justify-center gap-2 rounded-lg border font-medium shadow-sm transition\",\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-slate-950\",\n \"disabled:cursor-not-allowed disabled:opacity-60\",\n variantClass,\n sizeClass,\n fullWidth ? \"w-full\" : \"\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n {...rest}\n >\n {children}\n </button>\n );\n}\n\n\n"],"names":["VARIANT_CLASSES","SIZE_CLASSES","UIButton","variant","size","fullWidth","disabled","onClick","children","style","className","rest","variantClass","sizeClass","jsx"],"mappings":";;AAEA,MAAMA,IAAkB;AAAA,EACtB,SACE;AAAA,EACF,WACE;AAAA,EACF,SACE;AAAA,EACF,OACE;AACJ,GAEMC,IAAe;AAAA,EACnB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,SAAwBC,EAAS;AAAA,EAC/B,SAAAC,IAAU;AAAA,EACV,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,SAAAC,IAAU,MAAM;AAAA,EAAC;AAAA,EACjB,UAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,GAAG;AACD,QAAMC,IAAeZ,EAAgBG,CAAO,KAAKH,EAAgB,SAC3Da,IAAYZ,EAAaG,CAAI,KAAKH,EAAa;AAErD,SACE,gBAAAa;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAAAP;AAAA,MACA,UAAAD;AAAA,MACA,OAAAG;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACAG;AAAA,QACAC;AAAA,QACAR,IAAY,WAAW;AAAA,QACvBK;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGC;AAAA,MAEH,UAAAH;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -0,0 +1,21 @@
1
+ import { jsx as t } from "react/jsx-runtime";
2
+ import "react";
3
+ function i({ children: r, padding: e = "p-5", style: o, className: a = "", ...d }) {
4
+ return /* @__PURE__ */ t(
5
+ "div",
6
+ {
7
+ style: o,
8
+ className: [
9
+ "rounded-2xl border border-slate-200 bg-white shadow-sm dark:border-slate-800 dark:bg-slate-900",
10
+ e,
11
+ a
12
+ ].filter(Boolean).join(" "),
13
+ ...d,
14
+ children: r
15
+ }
16
+ );
17
+ }
18
+ export {
19
+ i as default
20
+ };
21
+ //# sourceMappingURL=Card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.js","sources":["../../../../src/components/library/ui/Card.jsx"],"sourcesContent":["import React from \"react\";\n\nexport default function UICard({ children, padding = \"p-5\", style, className = \"\", ...rest }) {\n return (\n <div\n style={style}\n className={[\n \"rounded-2xl border border-slate-200 bg-white shadow-sm dark:border-slate-800 dark:bg-slate-900\",\n padding,\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\n\n"],"names":["UICard","children","padding","style","className","rest","jsx"],"mappings":";;AAEA,SAAwBA,EAAO,EAAE,UAAAC,GAAU,SAAAC,IAAU,OAAO,OAAAC,GAAO,WAAAC,IAAY,IAAI,GAAGC,KAAQ;AAC5F,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAAH;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACAD;AAAA,QACAE;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGC;AAAA,MAEH,UAAAJ;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -0,0 +1,31 @@
1
+ import { jsx as n } from "react/jsx-runtime";
2
+ import "react";
3
+ const r = {
4
+ neutral: "border-slate-200/80 bg-white/60 text-slate-700 ring-black/5 hover:bg-white/80 dark:border-slate-800/80 dark:bg-slate-950/30 dark:text-slate-200 dark:ring-white/10 dark:hover:bg-slate-900/50",
5
+ primary: "border-brand-200/80 bg-brand-50/70 text-brand-800 ring-brand-900/5 hover:bg-brand-50 dark:border-brand-900/40 dark:bg-brand-950/25 dark:text-brand-200 dark:ring-brand-300/10 dark:hover:bg-brand-950/35",
6
+ success: "border-emerald-200/80 bg-emerald-50/70 text-emerald-800 ring-emerald-900/5 hover:bg-emerald-50 dark:border-emerald-900/40 dark:bg-emerald-950/20 dark:text-emerald-200 dark:ring-emerald-300/10 dark:hover:bg-emerald-950/30",
7
+ warning: "border-amber-200/80 bg-amber-50/70 text-amber-900 ring-amber-900/5 hover:bg-amber-50 dark:border-amber-900/40 dark:bg-amber-950/20 dark:text-amber-200 dark:ring-amber-300/10 dark:hover:bg-amber-950/30",
8
+ danger: "border-rose-200/80 bg-rose-50/70 text-rose-900 ring-rose-900/5 hover:bg-rose-50 dark:border-rose-900/40 dark:bg-rose-950/20 dark:text-rose-200 dark:ring-rose-300/10 dark:hover:bg-rose-950/30"
9
+ }, e = {
10
+ xs: "px-2 py-0.5 text-[11px]",
11
+ sm: "px-2.5 py-1 text-xs"
12
+ };
13
+ function l({ tone: a = "neutral", size: d = "xs", className: b = "", children: t, ...o }) {
14
+ return /* @__PURE__ */ n(
15
+ "span",
16
+ {
17
+ className: [
18
+ "inline-flex items-center gap-1 rounded-full border font-semibold shadow-sm ring-1 transition",
19
+ e[d] ?? e.xs,
20
+ r[a] ?? r.neutral,
21
+ b
22
+ ].filter(Boolean).join(" "),
23
+ ...o,
24
+ children: t
25
+ }
26
+ );
27
+ }
28
+ export {
29
+ l as default
30
+ };
31
+ //# sourceMappingURL=Chip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chip.js","sources":["../../../../src/components/library/ui/Chip.jsx"],"sourcesContent":["import React from \"react\";\n\nconst TONE_STYLES = {\n neutral:\n \"border-slate-200/80 bg-white/60 text-slate-700 ring-black/5 hover:bg-white/80 dark:border-slate-800/80 dark:bg-slate-950/30 dark:text-slate-200 dark:ring-white/10 dark:hover:bg-slate-900/50\",\n primary:\n \"border-brand-200/80 bg-brand-50/70 text-brand-800 ring-brand-900/5 hover:bg-brand-50 dark:border-brand-900/40 dark:bg-brand-950/25 dark:text-brand-200 dark:ring-brand-300/10 dark:hover:bg-brand-950/35\",\n success:\n \"border-emerald-200/80 bg-emerald-50/70 text-emerald-800 ring-emerald-900/5 hover:bg-emerald-50 dark:border-emerald-900/40 dark:bg-emerald-950/20 dark:text-emerald-200 dark:ring-emerald-300/10 dark:hover:bg-emerald-950/30\",\n warning:\n \"border-amber-200/80 bg-amber-50/70 text-amber-900 ring-amber-900/5 hover:bg-amber-50 dark:border-amber-900/40 dark:bg-amber-950/20 dark:text-amber-200 dark:ring-amber-300/10 dark:hover:bg-amber-950/30\",\n danger:\n \"border-rose-200/80 bg-rose-50/70 text-rose-900 ring-rose-900/5 hover:bg-rose-50 dark:border-rose-900/40 dark:bg-rose-950/20 dark:text-rose-200 dark:ring-rose-300/10 dark:hover:bg-rose-950/30\"\n};\n\nconst SIZE_STYLES = {\n xs: \"px-2 py-0.5 text-[11px]\",\n sm: \"px-2.5 py-1 text-xs\"\n};\n\nexport default function UIChip({ tone = \"neutral\", size = \"xs\", className = \"\", children, ...rest }) {\n return (\n <span\n className={[\n \"inline-flex items-center gap-1 rounded-full border font-semibold shadow-sm ring-1 transition\",\n SIZE_STYLES[size] ?? SIZE_STYLES.xs,\n TONE_STYLES[tone] ?? TONE_STYLES.neutral,\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n {...rest}\n >\n {children}\n </span>\n );\n}\n\n"],"names":["TONE_STYLES","SIZE_STYLES","UIChip","tone","size","className","children","rest","jsx"],"mappings":";;AAEA,MAAMA,IAAc;AAAA,EAClB,SACE;AAAA,EACF,SACE;AAAA,EACF,SACE;AAAA,EACF,SACE;AAAA,EACF,QACE;AACJ,GAEMC,IAAc;AAAA,EAClB,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,SAAwBC,EAAO,EAAE,MAAAC,IAAO,WAAW,MAAAC,IAAO,MAAM,WAAAC,IAAY,IAAI,UAAAC,GAAU,GAAGC,KAAQ;AACnG,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACAP,EAAYG,CAAI,KAAKH,EAAY;AAAA,QACjCD,EAAYG,CAAI,KAAKH,EAAY;AAAA,QACjCK;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGE;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -0,0 +1,42 @@
1
+ import { jsxs as s, jsx as e } from "react/jsx-runtime";
2
+ import "react";
3
+ import i from "./Text.js";
4
+ function N({
5
+ title: r,
6
+ subtitle: a,
7
+ description: m,
8
+ actions: l,
9
+ empty: n = !1,
10
+ emptyText: c = "Nothing here yet.",
11
+ emptyIcon: d,
12
+ emptyHeight: o = 160,
13
+ className: h = "",
14
+ style: f,
15
+ children: u
16
+ }) {
17
+ const t = a ?? m;
18
+ return /* @__PURE__ */ s("section", { className: h, style: f, children: [
19
+ (r || t || l) && /* @__PURE__ */ s("div", { className: "mb-4 flex flex-col gap-2 sm:flex-row sm:items-end sm:justify-between", children: [
20
+ /* @__PURE__ */ s("div", { className: "min-w-0", children: [
21
+ r && /* @__PURE__ */ e(i, { as: "h2", size: "lg", weight: "bold", className: "truncate", children: r }),
22
+ t && /* @__PURE__ */ e(i, { as: "p", size: "sm", muted: !0, className: "mt-1", children: t })
23
+ ] }),
24
+ l && /* @__PURE__ */ e("div", { className: "flex shrink-0 items-center gap-2", children: l })
25
+ ] }),
26
+ n ? /* @__PURE__ */ s(
27
+ "div",
28
+ {
29
+ className: "flex w-full flex-col items-center justify-center rounded-2xl border border-dashed border-slate-300 bg-slate-50 px-6 text-center dark:border-slate-700 dark:bg-slate-900/40",
30
+ style: { minHeight: o },
31
+ children: [
32
+ d ? /* @__PURE__ */ e("div", { className: "mb-2", children: d }) : null,
33
+ /* @__PURE__ */ e(i, { size: "sm", muted: !0, children: c })
34
+ ]
35
+ }
36
+ ) : u
37
+ ] });
38
+ }
39
+ export {
40
+ N as default
41
+ };
42
+ //# sourceMappingURL=Container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Container.js","sources":["../../../../src/components/library/ui/Container.jsx"],"sourcesContent":["import React from \"react\";\nimport UIText from \"./Text\";\n\nexport default function UIContainer({\n title,\n subtitle,\n description,\n actions,\n empty = false,\n emptyText = \"Nothing here yet.\",\n emptyIcon,\n emptyHeight = 160,\n className = \"\",\n style,\n children\n}) {\n const sub = subtitle ?? description;\n\n return (\n <section className={className} style={style}>\n {(title || sub || actions) && (\n <div className=\"mb-4 flex flex-col gap-2 sm:flex-row sm:items-end sm:justify-between\">\n <div className=\"min-w-0\">\n {title && (\n <UIText as=\"h2\" size=\"lg\" weight=\"bold\" className=\"truncate\">\n {title}\n </UIText>\n )}\n {sub && (\n <UIText as=\"p\" size=\"sm\" muted className=\"mt-1\">\n {sub}\n </UIText>\n )}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-2\">{actions}</div>}\n </div>\n )}\n\n {empty ? (\n <div\n className=\"flex w-full flex-col items-center justify-center rounded-2xl border border-dashed border-slate-300 bg-slate-50 px-6 text-center dark:border-slate-700 dark:bg-slate-900/40\"\n style={{ minHeight: emptyHeight }}\n >\n {emptyIcon ? <div className=\"mb-2\">{emptyIcon}</div> : null}\n <UIText size=\"sm\" muted>\n {emptyText}\n </UIText>\n </div>\n ) : (\n children\n )}\n </section>\n );\n}\n\n\n"],"names":["UIContainer","title","subtitle","description","actions","empty","emptyText","emptyIcon","emptyHeight","className","style","children","sub","jsxs","jsx","UIText"],"mappings":";;;AAGA,SAAwBA,EAAY;AAAA,EAClC,OAAAC;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,WAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,WAAAC,IAAY;AAAA,EACZ,OAAAC;AAAA,EACA,UAAAC;AACF,GAAG;AACD,QAAMC,IAAMV,KAAYC;AAExB,SACE,gBAAAU,EAAC,WAAA,EAAQ,WAAAJ,GAAsB,OAAAC,GAC3B,UAAA;AAAA,KAAAT,KAASW,KAAOR,MAChB,gBAAAS,EAAC,OAAA,EAAI,WAAU,wEACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,WACZ,UAAA;AAAA,QAAAZ,KACC,gBAAAa,EAACC,GAAA,EAAO,IAAG,MAAK,MAAK,MAAK,QAAO,QAAO,WAAU,YAC/C,UAAAd,EAAA,CACH;AAAA,QAEDW,KACC,gBAAAE,EAACC,GAAA,EAAO,IAAG,KAAI,MAAK,MAAK,OAAK,IAAC,WAAU,QACtC,UAAAH,EAAA,CACH;AAAA,MAAA,GAEJ;AAAA,MACCR,KAAW,gBAAAU,EAAC,OAAA,EAAI,WAAU,oCAAoC,UAAAV,EAAA,CAAQ;AAAA,IAAA,GACzE;AAAA,IAGDC,IACC,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,WAAWL,EAAA;AAAA,QAEnB,UAAA;AAAA,UAAAD,IAAY,gBAAAO,EAAC,OAAA,EAAI,WAAU,QAAQ,aAAU,IAAS;AAAA,4BACtDC,GAAA,EAAO,MAAK,MAAK,OAAK,IACpB,UAAAT,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,IAGFK;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -0,0 +1,27 @@
1
+ import { jsxs as x, jsx as t } from "react/jsx-runtime";
2
+ import "react";
3
+ const i = {
4
+ sm: { icon: "h-8 w-8", heading: "text-sm", body: "text-xs", gap: "gap-2", pad: "py-6" },
5
+ md: { icon: "h-10 w-10", heading: "text-base", body: "text-sm", gap: "gap-3", pad: "py-10" },
6
+ lg: { icon: "h-14 w-14", heading: "text-lg", body: "text-sm", gap: "gap-4", pad: "py-16" }
7
+ };
8
+ function r({
9
+ icon: a,
10
+ heading: l = "Nothing here yet",
11
+ body: s,
12
+ action: d,
13
+ size: m = "md",
14
+ className: n = ""
15
+ }) {
16
+ const e = i[m] ?? i.md;
17
+ return /* @__PURE__ */ x("div", { className: `flex flex-col items-center justify-center text-center ${e.pad} ${e.gap} ${n}`, children: [
18
+ a && /* @__PURE__ */ t("div", { className: `${e.icon} text-slate-300 dark:text-slate-600`, children: a }),
19
+ /* @__PURE__ */ t("div", { className: `${e.heading} font-semibold text-slate-700 dark:text-slate-200`, children: l }),
20
+ s && /* @__PURE__ */ t("div", { className: `${e.body} max-w-sm text-slate-500 dark:text-slate-400`, children: s }),
21
+ d && /* @__PURE__ */ t("div", { className: "mt-1", children: d })
22
+ ] });
23
+ }
24
+ export {
25
+ r as default
26
+ };
27
+ //# sourceMappingURL=EmptyState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyState.js","sources":["../../../../src/components/library/ui/EmptyState.jsx"],"sourcesContent":["import React from \"react\";\n\nconst SIZES = {\n sm: { icon: \"h-8 w-8\", heading: \"text-sm\", body: \"text-xs\", gap: \"gap-2\", pad: \"py-6\" },\n md: { icon: \"h-10 w-10\", heading: \"text-base\", body: \"text-sm\", gap: \"gap-3\", pad: \"py-10\" },\n lg: { icon: \"h-14 w-14\", heading: \"text-lg\", body: \"text-sm\", gap: \"gap-4\", pad: \"py-16\" },\n};\n\n/**\n * Empty state placeholder — shows when a list, table, or section has no content.\n *\n * @param {ReactNode} icon Optional icon element\n * @param {string} heading Primary message\n * @param {string} body Secondary description\n * @param {ReactNode} action Optional CTA (button, link, etc.)\n * @param {\"sm\"|\"md\"|\"lg\"} size Visual density\n */\nexport default function EmptyState({\n icon,\n heading = \"Nothing here yet\",\n body,\n action,\n size = \"md\",\n className = \"\",\n}) {\n const s = SIZES[size] ?? SIZES.md;\n\n return (\n <div className={`flex flex-col items-center justify-center text-center ${s.pad} ${s.gap} ${className}`}>\n {icon && (\n <div className={`${s.icon} text-slate-300 dark:text-slate-600`}>\n {icon}\n </div>\n )}\n <div className={`${s.heading} font-semibold text-slate-700 dark:text-slate-200`}>\n {heading}\n </div>\n {body && (\n <div className={`${s.body} max-w-sm text-slate-500 dark:text-slate-400`}>\n {body}\n </div>\n )}\n {action && <div className=\"mt-1\">{action}</div>}\n </div>\n );\n}\n"],"names":["SIZES","EmptyState","icon","heading","body","action","size","className","s","jsxs","jsx"],"mappings":";;AAEA,MAAMA,IAAQ;AAAA,EACZ,IAAI,EAAE,MAAM,WAAW,SAAS,WAAW,MAAM,WAAW,KAAK,SAAS,KAAK,OAAA;AAAA,EAC/E,IAAI,EAAE,MAAM,aAAa,SAAS,aAAa,MAAM,WAAW,KAAK,SAAS,KAAK,QAAA;AAAA,EACnF,IAAI,EAAE,MAAM,aAAa,SAAS,WAAW,MAAM,WAAW,KAAK,SAAS,KAAK,QAAA;AACnF;AAWA,SAAwBC,EAAW;AAAA,EACjC,MAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,WAAAC,IAAY;AACd,GAAG;AACD,QAAMC,IAAIR,EAAMM,CAAI,KAAKN,EAAM;AAE/B,SACE,gBAAAS,EAAC,OAAA,EAAI,WAAW,yDAAyDD,EAAE,GAAG,IAAIA,EAAE,GAAG,IAAID,CAAS,IACjG,UAAA;AAAA,IAAAL,uBACE,OAAA,EAAI,WAAW,GAAGM,EAAE,IAAI,uCACtB,UAAAN,EAAA,CACH;AAAA,sBAED,OAAA,EAAI,WAAW,GAAGM,EAAE,OAAO,qDACzB,UAAAL,GACH;AAAA,IACCC,uBACE,OAAA,EAAI,WAAW,GAAGI,EAAE,IAAI,gDACtB,UAAAJ,EAAA,CACH;AAAA,IAEDC,KAAU,gBAAAK,EAAC,OAAA,EAAI,WAAU,QAAQ,UAAAL,EAAA,CAAO;AAAA,EAAA,GAC3C;AAEJ;"}
@@ -0,0 +1,22 @@
1
+ import { jsx as o } from "react/jsx-runtime";
2
+ import "react";
3
+ function l({ style: e = void 0, className: t = "", ...r }) {
4
+ return /* @__PURE__ */ o(
5
+ "input",
6
+ {
7
+ style: e,
8
+ className: [
9
+ "h-10 w-full rounded-lg border border-slate-200 bg-white px-3 text-sm text-slate-900 shadow-sm",
10
+ "placeholder:text-slate-400",
11
+ "focus:outline-none focus:ring-2 focus:ring-brand-500 focus:ring-offset-2 dark:focus:ring-offset-slate-950",
12
+ "dark:border-slate-800 dark:bg-slate-900 dark:text-slate-50 dark:placeholder:text-slate-500",
13
+ t
14
+ ].filter(Boolean).join(" "),
15
+ ...r
16
+ }
17
+ );
18
+ }
19
+ export {
20
+ l as default
21
+ };
22
+ //# sourceMappingURL=Input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Input.js","sources":["../../../../src/components/library/ui/Input.jsx"],"sourcesContent":["import React from \"react\";\n\nexport default function UIInput({ style = undefined, className = \"\", ...rest }) {\n return (\n <input\n style={style}\n className={[\n \"h-10 w-full rounded-lg border border-slate-200 bg-white px-3 text-sm text-slate-900 shadow-sm\",\n \"placeholder:text-slate-400\",\n \"focus:outline-none focus:ring-2 focus:ring-brand-500 focus:ring-offset-2 dark:focus:ring-offset-slate-950\",\n \"dark:border-slate-800 dark:bg-slate-900 dark:text-slate-50 dark:placeholder:text-slate-500\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n {...rest}\n />\n );\n}\n\n\n"],"names":["UIInput","style","className","rest","jsx"],"mappings":";;AAEA,SAAwBA,EAAQ,EAAE,OAAAC,IAAQ,QAAW,WAAAC,IAAY,IAAI,GAAGC,KAAQ;AAC9E,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAAH;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;"}
@@ -0,0 +1,64 @@
1
+ import { jsxs as i, jsx as t } from "react/jsx-runtime";
2
+ import "react";
3
+ const e = {
4
+ xs: "h-3 w-3",
5
+ sm: "h-4 w-4",
6
+ md: "h-5 w-5",
7
+ lg: "h-6 w-6",
8
+ xl: "h-8 w-8"
9
+ }, r = {
10
+ brand: "text-brand-500",
11
+ white: "text-white",
12
+ muted: "text-slate-400 dark:text-slate-500",
13
+ current: "text-current"
14
+ };
15
+ function m({
16
+ size: a = "md",
17
+ tone: n = "brand",
18
+ label: s = "Loading",
19
+ className: l = "",
20
+ ...o
21
+ }) {
22
+ return /* @__PURE__ */ i(
23
+ "svg",
24
+ {
25
+ ...o,
26
+ className: [
27
+ "animate-spin",
28
+ e[a] ?? e.md,
29
+ r[n] ?? r.brand,
30
+ l
31
+ ].filter(Boolean).join(" "),
32
+ xmlns: "http://www.w3.org/2000/svg",
33
+ fill: "none",
34
+ viewBox: "0 0 24 24",
35
+ role: "status",
36
+ "aria-label": s,
37
+ children: [
38
+ /* @__PURE__ */ t(
39
+ "circle",
40
+ {
41
+ className: "opacity-25",
42
+ cx: "12",
43
+ cy: "12",
44
+ r: "10",
45
+ stroke: "currentColor",
46
+ strokeWidth: "4"
47
+ }
48
+ ),
49
+ /* @__PURE__ */ t(
50
+ "path",
51
+ {
52
+ className: "opacity-75",
53
+ fill: "currentColor",
54
+ d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
55
+ }
56
+ )
57
+ ]
58
+ }
59
+ );
60
+ }
61
+ export {
62
+ m as default
63
+ };
64
+ //# sourceMappingURL=Spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Spinner.js","sources":["../../../../src/components/library/ui/Spinner.jsx"],"sourcesContent":["import React from \"react\";\n\nconst SIZE_CLASSES = {\n xs: \"h-3 w-3\",\n sm: \"h-4 w-4\",\n md: \"h-5 w-5\",\n lg: \"h-6 w-6\",\n xl: \"h-8 w-8\",\n};\n\nconst TONE_CLASSES = {\n brand: \"text-brand-500\",\n white: \"text-white\",\n muted: \"text-slate-400 dark:text-slate-500\",\n current: \"text-current\",\n};\n\n/**\n * Animated spinner.\n *\n * @param {\"xs\"|\"sm\"|\"md\"|\"lg\"|\"xl\"} size\n * @param {\"brand\"|\"white\"|\"muted\"|\"current\"} tone\n * @param {string} label — screen-reader label\n */\nexport default function Spinner({\n size = \"md\",\n tone = \"brand\",\n label = \"Loading\",\n className = \"\",\n ...rest\n}) {\n return (\n <svg\n {...rest}\n className={[\n \"animate-spin\",\n SIZE_CLASSES[size] ?? SIZE_CLASSES.md,\n TONE_CLASSES[tone] ?? TONE_CLASSES.brand,\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n role=\"status\"\n aria-label={label}\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n"],"names":["SIZE_CLASSES","TONE_CLASSES","Spinner","size","tone","label","className","rest","jsxs","jsx"],"mappings":";;AAEA,MAAMA,IAAe;AAAA,EACnB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN,GAEMC,IAAe;AAAA,EACnB,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACX;AASA,SAAwBC,EAAQ;AAAA,EAC9B,MAAAC,IAAO;AAAA,EACP,MAAAC,IAAO;AAAA,EACP,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,GAAGC;AACL,GAAG;AACD,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAGD;AAAA,MACJ,WAAW;AAAA,QACT;AAAA,QACAP,EAAaG,CAAI,KAAKH,EAAa;AAAA,QACnCC,EAAaG,CAAI,KAAKH,EAAa;AAAA,QACnCK;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,OAAM;AAAA,MACN,MAAK;AAAA,MACL,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,cAAYD;AAAA,MAEZ,UAAA;AAAA,QAAA,gBAAAI;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,IAAG;AAAA,YACH,IAAG;AAAA,YACH,GAAE;AAAA,YACF,QAAO;AAAA,YACP,aAAY;AAAA,UAAA;AAAA,QAAA;AAAA,QAEd,gBAAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,MAAK;AAAA,YACL,GAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,43 @@
1
+ import { jsx as d } from "react/jsx-runtime";
2
+ import "react";
3
+ const t = {
4
+ xs: "text-xs",
5
+ sm: "text-sm",
6
+ md: "text-base",
7
+ lg: "text-lg",
8
+ xl: "text-xl",
9
+ xxl: "text-2xl"
10
+ }, e = {
11
+ regular: "font-normal",
12
+ medium: "font-medium",
13
+ bold: "font-semibold"
14
+ };
15
+ function u({
16
+ as: l = "span",
17
+ size: x = "md",
18
+ weight: a = "regular",
19
+ muted: s = !1,
20
+ style: o,
21
+ className: r = "",
22
+ children: m,
23
+ ...n
24
+ }) {
25
+ return /* @__PURE__ */ d(
26
+ l,
27
+ {
28
+ style: o,
29
+ className: [
30
+ t[x] ?? t.md,
31
+ e[a] ?? e.regular,
32
+ s ? "text-slate-600 dark:text-slate-300" : "text-slate-900 dark:text-slate-50",
33
+ r
34
+ ].filter(Boolean).join(" "),
35
+ ...n,
36
+ children: m
37
+ }
38
+ );
39
+ }
40
+ export {
41
+ u as default
42
+ };
43
+ //# sourceMappingURL=Text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Text.js","sources":["../../../../src/components/library/ui/Text.jsx"],"sourcesContent":["import React from \"react\";\n\nconst SIZE_CLASSES = {\n xs: \"text-xs\",\n sm: \"text-sm\",\n md: \"text-base\",\n lg: \"text-lg\",\n xl: \"text-xl\",\n xxl: \"text-2xl\"\n};\n\nconst WEIGHT_CLASSES = {\n regular: \"font-normal\",\n medium: \"font-medium\",\n bold: \"font-semibold\"\n};\n\nexport default function UIText({\n as: Comp = \"span\",\n size = \"md\",\n weight = \"regular\",\n muted = false,\n style,\n className = \"\",\n children,\n ...rest\n}) {\n return (\n <Comp\n style={style}\n className={[\n SIZE_CLASSES[size] ?? SIZE_CLASSES.md,\n WEIGHT_CLASSES[weight] ?? WEIGHT_CLASSES.regular,\n muted ? \"text-slate-600 dark:text-slate-300\" : \"text-slate-900 dark:text-slate-50\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n {...rest}\n >\n {children}\n </Comp>\n );\n}\n\n\n"],"names":["SIZE_CLASSES","WEIGHT_CLASSES","UIText","Comp","size","weight","muted","style","className","children","rest","jsx"],"mappings":";;AAEA,MAAMA,IAAe;AAAA,EACnB,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AACP,GAEMC,IAAiB;AAAA,EACrB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AACR;AAEA,SAAwBC,EAAO;AAAA,EAC7B,IAAIC,IAAO;AAAA,EACX,MAAAC,IAAO;AAAA,EACP,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,OAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,GAAGC;AACL,GAAG;AACD,SACE,gBAAAC;AAAA,IAACR;AAAA,IAAA;AAAA,MACC,OAAAI;AAAA,MACA,WAAW;AAAA,QACTP,EAAaI,CAAI,KAAKJ,EAAa;AAAA,QACnCC,EAAeI,CAAM,KAAKJ,EAAe;AAAA,QACzCK,IAAQ,uCAAuC;AAAA,QAC/CE;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACV,GAAGE;AAAA,MAEH,UAAAD;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -0,0 +1,47 @@
1
+ import { jsxs as i, jsx as s } from "react/jsx-runtime";
2
+ import "react";
3
+ import { useThemeMode as l } from "../theme/AppThemeProvider.js";
4
+ function f({ label: r = "Dark mode", style: t, className: a = "" }) {
5
+ const { mode: n, toggle: o } = l(), e = n === "dark";
6
+ return /* @__PURE__ */ i(
7
+ "button",
8
+ {
9
+ type: "button",
10
+ onClick: o,
11
+ style: t,
12
+ className: [
13
+ "inline-flex items-center gap-2 rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm font-medium text-slate-900 shadow-sm",
14
+ "hover:bg-slate-50 focus:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-slate-950",
15
+ "dark:border-slate-800 dark:bg-slate-900 dark:text-slate-50 dark:hover:bg-slate-800",
16
+ a
17
+ ].filter(Boolean).join(" "),
18
+ "aria-pressed": e,
19
+ "aria-label": r,
20
+ children: [
21
+ /* @__PURE__ */ s(
22
+ "span",
23
+ {
24
+ className: [
25
+ "inline-flex h-5 w-9 items-center rounded-full border transition",
26
+ e ? "border-brand-400 bg-brand-500" : "border-slate-300 bg-slate-200"
27
+ ].join(" "),
28
+ children: /* @__PURE__ */ s(
29
+ "span",
30
+ {
31
+ className: [
32
+ "h-4 w-4 rounded-full bg-white shadow-sm transition",
33
+ e ? "translate-x-4" : "translate-x-1"
34
+ ].join(" ")
35
+ }
36
+ )
37
+ }
38
+ ),
39
+ /* @__PURE__ */ s("span", { className: "hidden sm:inline", children: r })
40
+ ]
41
+ }
42
+ );
43
+ }
44
+ export {
45
+ f as default
46
+ };
47
+ //# sourceMappingURL=Toggle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Toggle.js","sources":["../../../../src/components/library/ui/Toggle.jsx"],"sourcesContent":["import React from \"react\";\nimport { useThemeMode } from \"../theme/AppThemeProvider\";\n\nexport default function UIToggle({ label = \"Dark mode\", style, className = \"\" }) {\n const { mode, toggle } = useThemeMode();\n const isDark = mode === \"dark\";\n\n return (\n <button\n type=\"button\"\n onClick={toggle}\n style={style}\n className={[\n \"inline-flex items-center gap-2 rounded-lg border border-slate-200 bg-white px-3 py-2 text-sm font-medium text-slate-900 shadow-sm\",\n \"hover:bg-slate-50 focus:outline-none focus-visible:ring-2 focus-visible:ring-brand-500 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-slate-950\",\n \"dark:border-slate-800 dark:bg-slate-900 dark:text-slate-50 dark:hover:bg-slate-800\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-pressed={isDark}\n aria-label={label}\n >\n <span\n className={[\n \"inline-flex h-5 w-9 items-center rounded-full border transition\",\n isDark ? \"border-brand-400 bg-brand-500\" : \"border-slate-300 bg-slate-200\"\n ].join(\" \")}\n >\n <span\n className={[\n \"h-4 w-4 rounded-full bg-white shadow-sm transition\",\n isDark ? \"translate-x-4\" : \"translate-x-1\"\n ].join(\" \")}\n />\n </span>\n <span className=\"hidden sm:inline\">{label}</span>\n </button>\n );\n}\n\n\n"],"names":["UIToggle","label","style","className","mode","toggle","useThemeMode","isDark","jsxs","jsx"],"mappings":";;;AAGA,SAAwBA,EAAS,EAAE,OAAAC,IAAQ,aAAa,OAAAC,GAAO,WAAAC,IAAY,MAAM;AAC/E,QAAM,EAAE,MAAAC,GAAM,QAAAC,EAAA,IAAWC,EAAA,GACnBC,IAASH,MAAS;AAExB,SACE,gBAAAI;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,SAASH;AAAA,MACT,OAAAH;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACAC;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,gBAAcI;AAAA,MACd,cAAYN;AAAA,MAEZ,UAAA;AAAA,QAAA,gBAAAQ;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACAF,IAAS,kCAAkC;AAAA,YAAA,EAC3C,KAAK,GAAG;AAAA,YAEV,UAAA,gBAAAE;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAW;AAAA,kBACT;AAAA,kBACAF,IAAS,kBAAkB;AAAA,gBAAA,EAC3B,KAAK,GAAG;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ;AAAA,QAAA;AAAA,QAEF,gBAAAE,EAAC,QAAA,EAAK,WAAU,oBAAoB,UAAAR,EAAA,CAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGhD;"}