@schandlergarcia/sf-web-components 1.7.0 → 1.9.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 (188) hide show
  1. package/dist/components/library/cards/ActionList.d.ts +10 -10
  2. package/dist/components/library/cards/ActionList.js +2 -3
  3. package/dist/components/library/cards/ActionList.js.map +1 -1
  4. package/dist/components/library/cards/ActivityCard.d.ts +18 -5
  5. package/dist/components/library/cards/ActivityCard.js +3 -4
  6. package/dist/components/library/cards/ActivityCard.js.map +1 -1
  7. package/dist/components/library/cards/BaseCard.d.ts +30 -24
  8. package/dist/components/library/cards/BaseCard.js +2 -3
  9. package/dist/components/library/cards/BaseCard.js.map +1 -1
  10. package/dist/components/library/cards/CalloutCard.d.ts +11 -9
  11. package/dist/components/library/cards/CalloutCard.js +2 -3
  12. package/dist/components/library/cards/CalloutCard.js.map +1 -1
  13. package/dist/components/library/cards/ChartCard.d.ts +29 -17
  14. package/dist/components/library/cards/ChartCard.js +13 -14
  15. package/dist/components/library/cards/ChartCard.js.map +1 -1
  16. package/dist/components/library/cards/FeedPanel.d.ts +12 -11
  17. package/dist/components/library/cards/FeedPanel.js +3 -4
  18. package/dist/components/library/cards/FeedPanel.js.map +1 -1
  19. package/dist/components/library/cards/ListCard.d.ts +33 -20
  20. package/dist/components/library/cards/ListCard.js +35 -35
  21. package/dist/components/library/cards/ListCard.js.map +1 -1
  22. package/dist/components/library/cards/MetricCard.d.ts +23 -17
  23. package/dist/components/library/cards/MetricCard.js +10 -11
  24. package/dist/components/library/cards/MetricCard.js.map +1 -1
  25. package/dist/components/library/cards/MetricsStrip.d.ts +11 -11
  26. package/dist/components/library/cards/MetricsStrip.js +1 -1
  27. package/dist/components/library/cards/MetricsStrip.js.map +1 -1
  28. package/dist/components/library/cards/SectionCard.d.ts +17 -12
  29. package/dist/components/library/cards/SectionCard.js +18 -19
  30. package/dist/components/library/cards/SectionCard.js.map +1 -1
  31. package/dist/components/library/cards/SemanticMetricCard.d.ts +15 -20
  32. package/dist/components/library/cards/SemanticMetricCardWithLoading.d.ts +8 -7
  33. package/dist/components/library/cards/SemanticTableCard.d.ts +13 -18
  34. package/dist/components/library/cards/SemanticTableCardWithLoading.d.ts +8 -7
  35. package/dist/components/library/cards/StatusCard.d.ts +29 -15
  36. package/dist/components/library/cards/StatusCard.js +16 -17
  37. package/dist/components/library/cards/StatusCard.js.map +1 -1
  38. package/dist/components/library/cards/TableCard.d.ts +40 -23
  39. package/dist/components/library/cards/TableCard.js +59 -59
  40. package/dist/components/library/cards/TableCard.js.map +1 -1
  41. package/dist/components/library/cards/WidgetCard.d.ts +19 -11
  42. package/dist/components/library/cards/WidgetCard.js.map +1 -1
  43. package/dist/components/library/charts/D3Chart.d.ts +23 -16
  44. package/dist/components/library/charts/D3Chart.js.map +1 -1
  45. package/dist/components/library/charts/D3ChartTemplates.d.ts +33 -3
  46. package/dist/components/library/charts/D3ChartTemplates.js +7 -7
  47. package/dist/components/library/charts/D3ChartTemplates.js.map +1 -1
  48. package/dist/components/library/charts/GeoMap.d.ts +81 -18
  49. package/dist/components/library/charts/GeoMap.js +28 -26
  50. package/dist/components/library/charts/GeoMap.js.map +1 -1
  51. package/dist/components/library/chat/ChatBar.d.ts +14 -11
  52. package/dist/components/library/chat/ChatBar.js +2 -3
  53. package/dist/components/library/chat/ChatBar.js.map +1 -1
  54. package/dist/components/library/chat/ChatInput.d.ts +9 -8
  55. package/dist/components/library/chat/ChatInput.js.map +1 -1
  56. package/dist/components/library/chat/ChatMessage.d.ts +17 -4
  57. package/dist/components/library/chat/ChatMessage.js.map +1 -1
  58. package/dist/components/library/chat/ChatMessageList.d.ts +11 -8
  59. package/dist/components/library/chat/ChatMessageList.js.map +1 -1
  60. package/dist/components/library/chat/ChatPanel.d.ts +16 -12
  61. package/dist/components/library/chat/ChatPanel.js +8 -9
  62. package/dist/components/library/chat/ChatPanel.js.map +1 -1
  63. package/dist/components/library/chat/ChatSuggestions.d.ts +5 -4
  64. package/dist/components/library/chat/ChatSuggestions.js +2 -3
  65. package/dist/components/library/chat/ChatSuggestions.js.map +1 -1
  66. package/dist/components/library/chat/ChatToolCall.d.ts +11 -3
  67. package/dist/components/library/chat/ChatToolCall.js.map +1 -1
  68. package/dist/components/library/chat/ChatTypingIndicator.d.ts +4 -3
  69. package/dist/components/library/chat/ChatTypingIndicator.js +2 -3
  70. package/dist/components/library/chat/ChatTypingIndicator.js.map +1 -1
  71. package/dist/components/library/chat/ChatWelcome.d.ts +9 -7
  72. package/dist/components/library/chat/ChatWelcome.js +6 -7
  73. package/dist/components/library/chat/ChatWelcome.js.map +1 -1
  74. package/dist/components/library/chat/index.d.ts +10 -0
  75. package/dist/components/library/chat/useChatState.d.ts +36 -11
  76. package/dist/components/library/chat/useChatState.js +63 -46
  77. package/dist/components/library/chat/useChatState.js.map +1 -1
  78. package/dist/components/library/data/DataModeProvider.d.ts +15 -11
  79. package/dist/components/library/data/DataModeProvider.js +1 -1
  80. package/dist/components/library/data/DataModeProvider.js.map +1 -1
  81. package/dist/components/library/data/DataModeToggle.d.ts +4 -3
  82. package/dist/components/library/data/DataModeToggle.js +4 -5
  83. package/dist/components/library/data/DataModeToggle.js.map +1 -1
  84. package/dist/components/library/data/chartDataProvider.d.ts +41 -3
  85. package/dist/components/library/data/filterUtils.d.ts +38 -9
  86. package/dist/components/library/data/filterUtils.js.map +1 -1
  87. package/dist/components/library/data/useDataSource.d.ts +6 -4
  88. package/dist/components/library/data/useDataSource.js.map +1 -1
  89. package/dist/components/library/data/usePageFilters.d.ts +31 -5
  90. package/dist/components/library/data/usePageFilters.js +6 -2
  91. package/dist/components/library/data/usePageFilters.js.map +1 -1
  92. package/dist/components/library/filters/FilterBar.d.ts +18 -8
  93. package/dist/components/library/filters/FilterBar.js +2 -3
  94. package/dist/components/library/filters/FilterBar.js.map +1 -1
  95. package/dist/components/library/filters/SearchFilter.d.ts +7 -6
  96. package/dist/components/library/filters/SearchFilter.js +2 -3
  97. package/dist/components/library/filters/SearchFilter.js.map +1 -1
  98. package/dist/components/library/filters/SelectFilter.d.ts +13 -7
  99. package/dist/components/library/filters/SelectFilter.js +2 -3
  100. package/dist/components/library/filters/SelectFilter.js.map +1 -1
  101. package/dist/components/library/filters/ToggleFilter.d.ts +7 -5
  102. package/dist/components/library/filters/ToggleFilter.js +2 -3
  103. package/dist/components/library/filters/ToggleFilter.js.map +1 -1
  104. package/dist/components/library/forms/FormField.d.ts +10 -8
  105. package/dist/components/library/forms/FormField.js +3 -4
  106. package/dist/components/library/forms/FormField.js.map +1 -1
  107. package/dist/components/library/forms/FormModal.d.ts +23 -14
  108. package/dist/components/library/forms/FormModal.js.map +1 -1
  109. package/dist/components/library/forms/FormRenderer.d.ts +29 -9
  110. package/dist/components/library/forms/FormRenderer.js +6 -7
  111. package/dist/components/library/forms/FormRenderer.js.map +1 -1
  112. package/dist/components/library/forms/FormSection.d.ts +10 -8
  113. package/dist/components/library/forms/FormSection.js +2 -3
  114. package/dist/components/library/forms/FormSection.js.map +1 -1
  115. package/dist/components/library/forms/index.d.ts +5 -0
  116. package/dist/components/library/forms/useFormState.d.ts +23 -15
  117. package/dist/components/library/forms/useFormState.js +53 -47
  118. package/dist/components/library/forms/useFormState.js.map +1 -1
  119. package/dist/components/library/index.d.ts +92 -73
  120. package/dist/components/library/index.js +25 -25
  121. package/dist/components/library/index.js.map +1 -1
  122. package/dist/components/library/layout/PageContainer.d.ts +6 -4
  123. package/dist/components/library/layout/PageContainer.js +4 -5
  124. package/dist/components/library/layout/PageContainer.js.map +1 -1
  125. package/dist/components/library/skeletons/CardSkeleton.d.ts +5 -4
  126. package/dist/components/library/skeletons/CardSkeleton.js +2 -3
  127. package/dist/components/library/skeletons/CardSkeleton.js.map +1 -1
  128. package/dist/components/library/theme/AppThemeProvider.d.ts +13 -50
  129. package/dist/components/library/theme/AppThemeProvider.js.map +1 -1
  130. package/dist/components/library/theme/tokens.d.ts +45 -44
  131. package/dist/components/library/theme/tokens.js.map +1 -1
  132. package/package.json +4 -1
  133. package/src/components/library/cards/{ActionList.jsx → ActionList.tsx} +13 -9
  134. package/src/components/library/cards/{ActivityCard.jsx → ActivityCard.tsx} +33 -4
  135. package/src/components/library/cards/{BaseCard.jsx → BaseCard.tsx} +33 -6
  136. package/src/components/library/cards/{CalloutCard.jsx → CalloutCard.tsx} +12 -10
  137. package/src/components/library/cards/{ChartCard.jsx → ChartCard.tsx} +32 -6
  138. package/src/components/library/cards/{FeedPanel.jsx → FeedPanel.tsx} +13 -2
  139. package/src/components/library/cards/{ListCard.jsx → ListCard.tsx} +43 -7
  140. package/src/components/library/cards/{MetricCard.jsx → MetricCard.tsx} +25 -6
  141. package/src/components/library/cards/{MetricsStrip.jsx → MetricsStrip.tsx} +22 -12
  142. package/src/components/library/cards/{SectionCard.jsx → SectionCard.tsx} +27 -8
  143. package/src/components/library/cards/{SemanticMetricCard.jsx → SemanticMetricCard.tsx} +18 -6
  144. package/src/components/library/cards/{SemanticMetricCardWithLoading.jsx → SemanticMetricCardWithLoading.tsx} +9 -3
  145. package/src/components/library/cards/{SemanticTableCard.jsx → SemanticTableCard.tsx} +16 -5
  146. package/src/components/library/cards/{SemanticTableCardWithLoading.jsx → SemanticTableCardWithLoading.tsx} +9 -5
  147. package/src/components/library/cards/{StatusCard.jsx → StatusCard.tsx} +61 -12
  148. package/src/components/library/cards/{TableCard.jsx → TableCard.tsx} +51 -12
  149. package/src/components/library/cards/{WidgetCard.jsx → WidgetCard.tsx} +28 -5
  150. package/src/components/library/charts/{D3Chart.jsx → D3Chart.tsx} +27 -7
  151. package/src/components/library/charts/{D3ChartTemplates.jsx → D3ChartTemplates.tsx} +60 -28
  152. package/src/components/library/charts/{GeoMap.jsx → GeoMap.tsx} +106 -17
  153. package/src/components/library/chat/{ChatBar.jsx → ChatBar.tsx} +19 -8
  154. package/src/components/library/chat/{ChatInput.jsx → ChatInput.tsx} +13 -11
  155. package/src/components/library/chat/{ChatMessage.jsx → ChatMessage.tsx} +22 -9
  156. package/src/components/library/chat/{ChatMessageList.jsx → ChatMessageList.tsx} +13 -11
  157. package/src/components/library/chat/{ChatPanel.jsx → ChatPanel.tsx} +16 -13
  158. package/src/components/library/chat/{ChatSuggestions.jsx → ChatSuggestions.tsx} +6 -5
  159. package/src/components/library/chat/{ChatToolCall.jsx → ChatToolCall.tsx} +14 -4
  160. package/src/components/library/chat/{ChatTypingIndicator.jsx → ChatTypingIndicator.tsx} +5 -2
  161. package/src/components/library/chat/{ChatWelcome.jsx → ChatWelcome.tsx} +9 -7
  162. package/src/components/library/chat/index.tsx +26 -0
  163. package/src/components/library/chat/useChatState.tsx +181 -0
  164. package/src/components/library/data/{DataModeProvider.jsx → DataModeProvider.tsx} +25 -8
  165. package/src/components/library/data/{DataModeToggle.jsx → DataModeToggle.tsx} +5 -2
  166. package/src/components/library/data/{chartDataProvider.jsx → chartDataProvider.tsx} +49 -5
  167. package/src/components/library/data/{filterUtils.jsx → filterUtils.tsx} +58 -12
  168. package/src/components/library/data/{useDataSource.jsx → useDataSource.tsx} +9 -2
  169. package/src/components/library/data/{usePageFilters.jsx → usePageFilters.tsx} +49 -9
  170. package/src/components/library/filters/{FilterBar.jsx → FilterBar.tsx} +21 -11
  171. package/src/components/library/filters/{SearchFilter.jsx → SearchFilter.tsx} +8 -2
  172. package/src/components/library/filters/{SelectFilter.jsx → SelectFilter.tsx} +15 -8
  173. package/src/components/library/filters/{ToggleFilter.jsx → ToggleFilter.tsx} +7 -6
  174. package/src/components/library/forms/{FormField.jsx → FormField.tsx} +91 -45
  175. package/src/components/library/forms/{FormModal.jsx → FormModal.tsx} +21 -20
  176. package/src/components/library/forms/{FormRenderer.jsx → FormRenderer.tsx} +32 -10
  177. package/src/components/library/forms/{FormSection.jsx → FormSection.tsx} +13 -7
  178. package/src/components/library/forms/index.tsx +11 -0
  179. package/src/components/library/forms/{useFormState.jsx → useFormState.tsx} +43 -23
  180. package/src/components/library/{index.jsx → index.ts} +14 -14
  181. package/src/components/library/layout/{PageContainer.jsx → PageContainer.tsx} +6 -3
  182. package/src/components/library/skeletons/{CardSkeleton.jsx → CardSkeleton.tsx} +5 -4
  183. package/src/components/library/theme/{AppThemeProvider.jsx → AppThemeProvider.tsx} +20 -7
  184. package/src/components/library/theme/{tokens.jsx → tokens.tsx} +37 -3
  185. package/src/components/library/chat/index.jsx +0 -10
  186. package/src/components/library/chat/useChatState.jsx +0 -130
  187. package/src/components/library/forms/index.jsx +0 -5
  188. /package/src/components/library/filters/{index.jsx → index.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"CardSkeleton.js","sources":["../../../../src/components/library/skeletons/CardSkeleton.jsx"],"sourcesContent":["import React from \"react\";\n\nexport default function CardSkeleton({ lines = 3, className = \"\" }) {\n return (\n <div\n className={[\n \"rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-slate-800 dark:bg-slate-900\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-busy=\"true\"\n aria-label=\"Loading\"\n >\n <div className=\"space-y-3\">\n {Array.from({ length: lines }).map((_, i) => (\n <div\n key={i}\n className={[\n \"h-4 animate-pulse rounded bg-slate-200 dark:bg-slate-800\",\n i === 0 ? \"w-1/3\" : i === 1 ? \"w-2/3\" : \"w-1/2\"\n ].join(\" \")}\n />\n ))}\n </div>\n </div>\n );\n}\n\n\n"],"names":["CardSkeleton","lines","className","jsx","_","i"],"mappings":";;AAEA,SAAwBA,EAAa,EAAE,OAAAC,IAAQ,GAAG,WAAAC,IAAY,MAAM;AAClE,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACAD;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,aAAU;AAAA,MACV,cAAW;AAAA,MAEX,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,aACZ,gBAAM,KAAK,EAAE,QAAQF,GAAO,EAAE,IAAI,CAACG,GAAGC,MACrC,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW;AAAA,YACT;AAAA,YACAE,MAAM,IAAI,UAAUA,MAAM,IAAI,UAAU;AAAA,UAAA,EACxC,KAAK,GAAG;AAAA,QAAA;AAAA,QAJLA;AAAA,MAAA,CAMR,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"CardSkeleton.js","sources":["../../../../src/components/library/skeletons/CardSkeleton.tsx"],"sourcesContent":["export interface CardSkeletonProps {\n lines?: number;\n className?: string;\n}\n\nexport default function CardSkeleton({ lines = 3, className = \"\" }: CardSkeletonProps) {\n return (\n <div\n className={[\n \"rounded-2xl border border-slate-200 bg-white p-5 shadow-sm dark:border-slate-800 dark:bg-slate-900\",\n className\n ]\n .filter(Boolean)\n .join(\" \")}\n aria-busy=\"true\"\n aria-label=\"Loading\"\n >\n <div className=\"space-y-3\">\n {Array.from({ length: lines }).map((_, i) => (\n <div\n key={i}\n className={[\n \"h-4 animate-pulse rounded bg-slate-200 dark:bg-slate-800\",\n i === 0 ? \"w-1/3\" : i === 1 ? \"w-2/3\" : \"w-1/2\"\n ].join(\" \")}\n />\n ))}\n </div>\n </div>\n );\n}\n"],"names":["CardSkeleton","lines","className","jsx","_","i"],"mappings":";AAKA,SAAwBA,EAAa,EAAE,OAAAC,IAAQ,GAAG,WAAAC,IAAY,MAAyB;AACrF,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACAD;AAAA,MAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,MACX,aAAU;AAAA,MACV,cAAW;AAAA,MAEX,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,aACZ,gBAAM,KAAK,EAAE,QAAQF,GAAO,EAAE,IAAI,CAACG,GAAGC,MACrC,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAW;AAAA,YACT;AAAA,YACAE,MAAM,IAAI,UAAUA,MAAM,IAAI,UAAU;AAAA,UAAA,EACxC,KAAK,GAAG;AAAA,QAAA;AAAA,QAJLA;AAAA,MAAA,CAMR,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -1,51 +1,14 @@
1
- export function useThemeMode(): {
2
- mode: string;
3
- theme: {
4
- colors: {
5
- brand: {
6
- 50: string;
7
- 100: string;
8
- 200: string;
9
- 300: string;
10
- 400: string;
11
- 500: string;
12
- 600: string;
13
- 700: string;
14
- 800: string;
15
- 900: string;
16
- 950: string;
17
- };
18
- accent: {
19
- 50: string;
20
- 100: string;
21
- 200: string;
22
- 300: string;
23
- 400: string;
24
- 500: string;
25
- 600: string;
26
- 700: string;
27
- 800: string;
28
- 900: string;
29
- 950: string;
30
- };
31
- };
32
- fonts: {
33
- sans: string;
34
- mono: string;
35
- };
36
- radius: {
37
- sm: string;
38
- md: string;
39
- lg: string;
40
- };
41
- spacing: {
42
- pageX: string;
43
- pageY: string;
44
- };
45
- };
1
+ import React from "react";
2
+ import { Tokens } from "./tokens";
3
+ export type ThemeMode = "light" | "dark";
4
+ export interface ThemeModeContextValue {
5
+ mode: ThemeMode;
6
+ theme: Tokens;
46
7
  toggle: () => void;
47
- };
48
- export default function AppThemeProvider({ initialMode, children }: {
49
- initialMode?: string | undefined;
50
- children: any;
51
- }): import("react/jsx-runtime").JSX.Element;
8
+ }
9
+ export declare function useThemeMode(): ThemeModeContextValue;
10
+ export interface AppThemeProviderProps {
11
+ initialMode?: ThemeMode;
12
+ children: React.ReactNode;
13
+ }
14
+ export default function AppThemeProvider({ initialMode, children }: AppThemeProviderProps): import("react/jsx-runtime").JSX.Element;
@@ -1 +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;AAElDb,EAAAA,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;"}
1
+ {"version":3,"file":"AppThemeProvider.js","sources":["../../../../src/components/library/theme/AppThemeProvider.tsx"],"sourcesContent":["import React from \"react\";\nimport { tokens, getTokenCSSProperties, Tokens } from \"./tokens\";\n\nexport type ThemeMode = \"light\" | \"dark\";\n\nexport interface ThemeModeContextValue {\n mode: ThemeMode;\n theme: Tokens;\n toggle: () => void;\n}\n\nconst ThemeModeContext = React.createContext<ThemeModeContextValue>({\n mode: \"light\",\n theme: tokens,\n toggle: () => {}\n});\n\nconst STORAGE_KEY = \"app-color-mode\";\n\nfunction applyHtmlDarkClass(mode: ThemeMode): void {\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(): void {\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(): ThemeModeContextValue {\n return React.useContext(ThemeModeContext);\n}\n\nexport interface AppThemeProviderProps {\n initialMode?: ThemeMode;\n children: React.ReactNode;\n}\n\nexport default function AppThemeProvider({ initialMode = \"light\", children }: AppThemeProviderProps) {\n const [mode, setMode] = React.useState<ThemeMode>(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":";;;AAWA,MAAMA,IAAmBC,EAAM,cAAqC;AAAA,EAClE,MAAM;AAAA,EACN,OAAOC;AAAA,EACP,QAAQ,MAAM;AAAA,EAAC;AACjB,CAAC,GAEKC,IAAc;AAEpB,SAASC,EAAmBC,GAAuB;AACjD,MAAI,OAAO,WAAa,IAAa;AACrC,QAAMC,IAAO,SAAS;AACtB,EAAID,MAAS,SAAQC,EAAK,UAAU,IAAI,MAAM,IACzCA,EAAK,UAAU,OAAO,MAAM;AACnC;AAEA,SAASC,IAAgC;AACvC,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,IAAsC;AACpD,SAAOX,EAAM,WAAWD,CAAgB;AAC1C;AAOA,SAAwBa,EAAiB,EAAE,aAAAC,IAAc,SAAS,UAAAC,KAAmC;AACnG,QAAM,CAACV,GAAMW,CAAO,IAAIf,EAAM,SAAoBa,CAAW;AAE7Db,EAAAA,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;"}
@@ -1,48 +1,49 @@
1
+ /**
2
+ * Design tokens — single source of truth for branding.
3
+ *
4
+ * To rebrand a command center:
5
+ * 1. Swap the `brand` palette (use any Tailwind-style color scale)
6
+ * 2. Swap the `accent` palette
7
+ * 3. Change `fonts.sans` in _app.js (next/font import)
8
+ *
9
+ * AppThemeProvider injects these as CSS custom properties on :root,
10
+ * and tailwind.config.js references them via var(--color-brand-*).
11
+ */
12
+ export interface ColorShades {
13
+ 50: string;
14
+ 100: string;
15
+ 200: string;
16
+ 300: string;
17
+ 400: string;
18
+ 500: string;
19
+ 600: string;
20
+ 700: string;
21
+ 800: string;
22
+ 900: string;
23
+ 950: string;
24
+ }
25
+ export interface Tokens {
26
+ colors: {
27
+ brand: ColorShades;
28
+ accent: ColorShades;
29
+ };
30
+ fonts: {
31
+ sans: string;
32
+ mono: string;
33
+ };
34
+ radius: {
35
+ sm: string;
36
+ md: string;
37
+ lg: string;
38
+ };
39
+ spacing: {
40
+ pageX: string;
41
+ pageY: string;
42
+ };
43
+ }
44
+ export declare const tokens: Tokens;
1
45
  /**
2
46
  * Generates CSS custom property assignments from the token palettes.
3
47
  * Used by AppThemeProvider to inject on :root at runtime.
4
48
  */
5
- export function getTokenCSSProperties(): {};
6
- export namespace tokens {
7
- namespace colors {
8
- let brand: {
9
- 50: string;
10
- 100: string;
11
- 200: string;
12
- 300: string;
13
- 400: string;
14
- 500: string;
15
- 600: string;
16
- 700: string;
17
- 800: string;
18
- 900: string;
19
- 950: string;
20
- };
21
- let accent: {
22
- 50: string;
23
- 100: string;
24
- 200: string;
25
- 300: string;
26
- 400: string;
27
- 500: string;
28
- 600: string;
29
- 700: string;
30
- 800: string;
31
- 900: string;
32
- 950: string;
33
- };
34
- }
35
- namespace fonts {
36
- let sans: string;
37
- let mono: string;
38
- }
39
- namespace radius {
40
- let sm: string;
41
- let md: string;
42
- let lg: string;
43
- }
44
- namespace spacing {
45
- let pageX: string;
46
- let pageY: string;
47
- }
48
- }
49
+ export declare function getTokenCSSProperties(): Record<string, string>;
@@ -1 +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;"}
1
+ {"version":3,"file":"tokens.js","sources":["../../../../src/components/library/theme/tokens.tsx"],"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 interface ColorShades {\n 50: string;\n 100: string;\n 200: string;\n 300: string;\n 400: string;\n 500: string;\n 600: string;\n 700: string;\n 800: string;\n 900: string;\n 950: string;\n}\n\nexport interface Tokens {\n colors: {\n brand: ColorShades;\n accent: ColorShades;\n };\n fonts: {\n sans: string;\n mono: string;\n };\n radius: {\n sm: string;\n md: string;\n lg: string;\n };\n spacing: {\n pageX: string;\n pageY: string;\n };\n}\n\nexport const tokens: 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(): Record<string, string> {\n const props: Record<string, string> = {};\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":"AA8CO,MAAMA,IAAiB;AAAA,EAC5B,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,IAAgD;AAC9D,QAAMC,IAAgC,CAAA;AACtC,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;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schandlergarcia/sf-web-components",
3
- "version": "1.7.0",
3
+ "version": "1.9.0",
4
4
  "description": "Reusable Salesforce web components library with Tailwind CSS v4 and shadcn/ui",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -75,8 +75,11 @@
75
75
  "@radix-ui/react-dialog": "^1.1.15",
76
76
  "@radix-ui/react-popover": "^1.1.15",
77
77
  "@radix-ui/react-select": "^2.2.6",
78
+ "@types/d3": "^7.4.3",
78
79
  "@types/react": "^19.2.5",
79
80
  "@types/react-dom": "^19.2.3",
81
+ "@types/topojson-client": "^3.1.5",
82
+ "@types/topojson-specification": "^1.0.5",
80
83
  "@vitejs/plugin-react": "^5.1.1",
81
84
  "date-fns": "^4.0.0",
82
85
  "react-day-picker": "^9.14.0",
@@ -1,19 +1,23 @@
1
- import React from "react";
2
1
  import UIButton from "../ui/UIButton";
3
2
 
4
- /**
5
- * Row of action buttons — typically used at the bottom of a dashboard section.
6
- *
7
- * @param {{ label: string, [key]: any }[] | string[]} actions
8
- * @param {string} title
9
- * @param {Function} onAction Called with the action object/string when clicked
10
- */
3
+ export interface Action {
4
+ label: string;
5
+ [key: string]: unknown;
6
+ }
7
+
8
+ export interface ActionListProps {
9
+ actions?: (Action | string)[];
10
+ title?: string;
11
+ onAction?: (action: Action | string) => void;
12
+ className?: string;
13
+ }
14
+
11
15
  export default function ActionList({
12
16
  actions = [],
13
17
  title,
14
18
  onAction,
15
19
  className = "",
16
- }) {
20
+ }: ActionListProps) {
17
21
  return (
18
22
  <div className={`rounded-2xl border border-slate-200 bg-white p-4 dark:border-slate-800 dark:bg-slate-900 ${className}`}>
19
23
  {title && (
@@ -3,14 +3,37 @@ import { motion, AnimatePresence } from "framer-motion";
3
3
  import { ArrowPathIcon, CheckCircleIcon, ExclamationCircleIcon, ClockIcon } from "@heroicons/react/24/outline";
4
4
  import UIText from "../ui/Text";
5
5
 
6
- const STATUS_ICON = {
6
+ type ActionStatus = "working" | "pending" | "complete" | "error";
7
+
8
+ interface StatusIconConfig {
9
+ Icon: React.ComponentType<{ className?: string }>;
10
+ color: string;
11
+ spin: boolean;
12
+ }
13
+
14
+ const STATUS_ICON: Record<ActionStatus, StatusIconConfig> = {
7
15
  working: { Icon: ArrowPathIcon, color: "text-indigo-500", spin: true },
8
16
  pending: { Icon: ClockIcon, color: "text-slate-400", spin: false },
9
17
  complete: { Icon: CheckCircleIcon, color: "text-emerald-500", spin: false },
10
18
  error: { Icon: ExclamationCircleIcon, color: "text-red-500", spin: false },
11
19
  };
12
20
 
13
- function ActionItem({ action }) {
21
+ export interface ActivityAction {
22
+ id: string;
23
+ status: ActionStatus;
24
+ title?: string;
25
+ action?: string;
26
+ subtitle?: string;
27
+ traveler?: string;
28
+ timestamp?: string;
29
+ startedAt?: string;
30
+ }
31
+
32
+ interface ActionItemProps {
33
+ action: ActivityAction;
34
+ }
35
+
36
+ function ActionItem({ action }: ActionItemProps) {
14
37
  const s = STATUS_ICON[action.status] ?? STATUS_ICON.pending;
15
38
  return (
16
39
  <motion.div
@@ -34,13 +57,19 @@ function ActionItem({ action }) {
34
57
  );
35
58
  }
36
59
 
37
- export default function ActivityCard({ title = "Activity", actions = [], className = "" }) {
60
+ export interface ActivityCardProps {
61
+ title?: string;
62
+ actions?: ActivityAction[];
63
+ className?: string;
64
+ }
65
+
66
+ export default function ActivityCard({ title = "Activity", actions = [], className = "" }: ActivityCardProps) {
38
67
  if (actions.length === 0) return null;
39
68
 
40
69
  return (
41
70
  <div className={className}>
42
71
  {title && (
43
- <UIText as="div" size="xs" weight="semibold" muted className="mb-2 uppercase tracking-wider">
72
+ <UIText as="div" size="xs" weight="medium" muted className="mb-2 uppercase tracking-wider">
44
73
  {title}
45
74
  </UIText>
46
75
  )}
@@ -1,6 +1,11 @@
1
1
  import React from "react";
2
2
 
3
- const VARIANT_CLASSES = {
3
+ type Variant = "default" | "metric" | "chart" | "table" | "widget" | "status";
4
+ type Size = "xs" | "sm" | "md" | "lg" | "xl" | "full";
5
+ type Padding = "none" | "xs" | "sm" | "default" | "lg" | "xl";
6
+ type Radius = "none" | "sm" | "md" | "lg" | "xl" | "2xl" | "3xl";
7
+
8
+ const VARIANT_CLASSES: Record<Variant, string> = {
4
9
  default: "",
5
10
  metric: "",
6
11
  chart: "",
@@ -9,7 +14,7 @@ const VARIANT_CLASSES = {
9
14
  status: ""
10
15
  };
11
16
 
12
- const SIZE_CLASSES = {
17
+ const SIZE_CLASSES: Record<Size, string> = {
13
18
  xs: "",
14
19
  sm: "min-h-[80px]",
15
20
  md: "min-h-[120px]",
@@ -18,7 +23,7 @@ const SIZE_CLASSES = {
18
23
  full: ""
19
24
  };
20
25
 
21
- const PADDING_CLASSES = {
26
+ const PADDING_CLASSES: Record<Padding, string> = {
22
27
  none: "p-0",
23
28
  xs: "p-2",
24
29
  sm: "p-3",
@@ -27,6 +32,30 @@ const PADDING_CLASSES = {
27
32
  xl: "p-8"
28
33
  };
29
34
 
35
+ export interface BaseCardProps extends Omit<React.HTMLAttributes<HTMLDivElement | HTMLButtonElement>, "onPress"> {
36
+ header?: React.ReactNode;
37
+ body?: React.ReactNode;
38
+ footer?: React.ReactNode;
39
+ children?: React.ReactNode;
40
+ variant?: Variant;
41
+ size?: Size;
42
+ padding?: Padding;
43
+ shadow?: boolean;
44
+ radius?: Radius;
45
+ border?: boolean;
46
+ isHoverable?: boolean;
47
+ isPressable?: boolean;
48
+ isLoading?: boolean;
49
+ isDisabled?: boolean;
50
+ isSelected?: boolean;
51
+ className?: string;
52
+ headerClassName?: string;
53
+ bodyClassName?: string;
54
+ footerClassName?: string;
55
+ onPress?: () => void;
56
+ onHover?: () => void;
57
+ }
58
+
30
59
  export default function BaseCard({
31
60
  header,
32
61
  body,
@@ -50,7 +79,7 @@ export default function BaseCard({
50
79
  onPress,
51
80
  onHover,
52
81
  ...rest
53
- }) {
82
+ }: BaseCardProps) {
54
83
  const Comp = isPressable ? "button" : "div";
55
84
 
56
85
  const radiusClass = radius ? `rounded-${radius}` : "rounded-2xl";
@@ -105,5 +134,3 @@ export default function BaseCard({
105
134
  </Comp>
106
135
  );
107
136
  }
108
-
109
-
@@ -1,6 +1,8 @@
1
1
  import React from "react";
2
2
 
3
- const TONE_CLASSES = {
3
+ type Tone = "neutral" | "success" | "warning" | "danger" | "info";
4
+
5
+ const TONE_CLASSES: Record<Tone, string> = {
4
6
  neutral: "border-slate-200 bg-slate-50 text-slate-700 dark:border-slate-800 dark:bg-slate-950/30 dark:text-slate-200",
5
7
  success: "border-emerald-200 bg-emerald-50 text-emerald-800 dark:border-emerald-900/40 dark:bg-emerald-950/20 dark:text-emerald-200",
6
8
  warning: "border-amber-200 bg-amber-50 text-amber-800 dark:border-amber-900/40 dark:bg-amber-950/20 dark:text-amber-200",
@@ -8,21 +10,21 @@ const TONE_CLASSES = {
8
10
  info: "border-blue-200 bg-blue-50 text-blue-800 dark:border-blue-900/40 dark:bg-blue-950/20 dark:text-blue-200",
9
11
  };
10
12
 
11
- /**
12
- * Highlighted callout box for important inline messages.
13
- *
14
- * @param {string} title
15
- * @param {string|ReactNode} message
16
- * @param {"neutral"|"success"|"warning"|"danger"|"info"} tone
17
- * @param {ReactNode} icon Optional leading icon
18
- */
13
+ export interface CalloutCardProps {
14
+ title?: string;
15
+ message: string | React.ReactNode;
16
+ tone?: Tone;
17
+ icon?: React.ReactNode;
18
+ className?: string;
19
+ }
20
+
19
21
  export default function CalloutCard({
20
22
  title,
21
23
  message,
22
24
  tone = "neutral",
23
25
  icon,
24
26
  className = "",
25
- }) {
27
+ }: CalloutCardProps) {
26
28
  return (
27
29
  <div className={`rounded-xl border p-4 ${TONE_CLASSES[tone] ?? TONE_CLASSES.neutral} ${className}`}>
28
30
  <div className="flex gap-3">
@@ -1,8 +1,36 @@
1
1
  import React from "react";
2
- import BaseCard from "./BaseCard";
2
+ import BaseCard, { BaseCardProps } from "./BaseCard";
3
3
  import UIText from "../ui/Text";
4
4
  import UIChip from "../ui/Chip";
5
5
 
6
+ interface TimeRangeOption {
7
+ value: string;
8
+ label: string;
9
+ }
10
+
11
+ export interface TimeRange {
12
+ current: string;
13
+ options?: (TimeRangeOption | string)[];
14
+ onChange?: (value: string) => void;
15
+ }
16
+
17
+ export interface ChartCardProps extends Omit<BaseCardProps, "variant" | "header" | "body"> {
18
+ chart: React.ReactNode;
19
+ chartType?: string;
20
+ title?: string;
21
+ subtitle?: string;
22
+ filters?: React.ReactNode;
23
+ timeRange?: TimeRange;
24
+ actions?: React.ReactNode;
25
+ legend?: React.ReactNode;
26
+ height?: number;
27
+ showGrid?: boolean;
28
+ showAxes?: boolean;
29
+ data?: unknown[];
30
+ loading?: boolean;
31
+ error?: string | Error;
32
+ }
33
+
6
34
  export default function ChartCard({
7
35
  chart,
8
36
  chartType,
@@ -19,7 +47,7 @@ export default function ChartCard({
19
47
  loading = false,
20
48
  error,
21
49
  ...cardProps
22
- }) {
50
+ }: ChartCardProps) {
23
51
  const header = (
24
52
  <div className="flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between">
25
53
  <div className="min-w-0">
@@ -44,8 +72,8 @@ export default function ChartCard({
44
72
  aria-label="Time range"
45
73
  >
46
74
  {timeRange.options?.map((opt) => (
47
- <option key={opt.value ?? opt} value={opt.value ?? opt}>
48
- {opt.label ?? opt}
75
+ <option key={typeof opt === "string" ? opt : opt.value} value={typeof opt === "string" ? opt : opt.value}>
76
+ {typeof opt === "string" ? opt : opt.label}
49
77
  </option>
50
78
  ))}
51
79
  </select>
@@ -101,5 +129,3 @@ export default function ChartCard({
101
129
  />
102
130
  );
103
131
  }
104
-
105
-
@@ -1,6 +1,17 @@
1
1
  import React from "react";
2
2
  import UIText from "../ui/Text";
3
3
 
4
+ export interface FeedPanelProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "title"> {
5
+ title?: string;
6
+ subtitle?: string;
7
+ actions?: React.ReactNode;
8
+ children?: React.ReactNode;
9
+ width?: number | string;
10
+ className?: string;
11
+ headerClassName?: string;
12
+ bodyClassName?: string;
13
+ }
14
+
4
15
  export default function FeedPanel({
5
16
  title,
6
17
  subtitle,
@@ -11,7 +22,7 @@ export default function FeedPanel({
11
22
  headerClassName = "",
12
23
  bodyClassName = "",
13
24
  ...rest
14
- }) {
25
+ }: FeedPanelProps) {
15
26
  const widthStyle = width ? (typeof width === "number" ? { width: `${width}px` } : { width }) : undefined;
16
27
 
17
28
  return (
@@ -24,7 +35,7 @@ export default function FeedPanel({
24
35
  <div className={`shrink-0 border-b border-slate-100 px-4 py-3 dark:border-slate-800 ${headerClassName}`}>
25
36
  <div className="flex items-start justify-between gap-3">
26
37
  <div className="min-w-0">
27
- {title && <UIText as="div" size="sm" weight="semibold">{title}</UIText>}
38
+ {title && <UIText as="div" size="sm" weight="medium">{title}</UIText>}
28
39
  {subtitle && <UIText as="div" size="xs" muted className="mt-0.5">{subtitle}</UIText>}
29
40
  </div>
30
41
  {actions && <div className="shrink-0">{actions}</div>}
@@ -1,9 +1,9 @@
1
1
  import React from "react";
2
- import BaseCard from "./BaseCard";
2
+ import BaseCard, { BaseCardProps } from "./BaseCard";
3
3
  import UIText from "../ui/Text";
4
4
  import UIChip from "../ui/Chip";
5
5
 
6
- function formatTimestamp(ts) {
6
+ function formatTimestamp(ts: string | Date | undefined): string {
7
7
  if (!ts) return "";
8
8
  try {
9
9
  const d = ts instanceof Date ? ts : new Date(ts);
@@ -14,7 +14,11 @@ function formatTimestamp(ts) {
14
14
  }
15
15
  }
16
16
 
17
- function Avatar({ item }) {
17
+ interface AvatarProps {
18
+ item: ListItem;
19
+ }
20
+
21
+ function Avatar({ item }: AvatarProps) {
18
22
  const avatar = item?.avatar;
19
23
  const name = item?.title ?? item?.name ?? "Item";
20
24
  if (!avatar) return null;
@@ -41,6 +45,38 @@ function Avatar({ item }) {
41
45
  );
42
46
  }
43
47
 
48
+ export interface ListItem {
49
+ id?: string | number;
50
+ title?: string;
51
+ name?: string;
52
+ description?: string;
53
+ status?: string;
54
+ timestamp?: string | Date;
55
+ value?: string | number;
56
+ unit?: string;
57
+ avatar?: string | React.ReactNode;
58
+ }
59
+
60
+ export interface ListCardProps extends Omit<BaseCardProps, "variant" | "header" | "body"> {
61
+ items?: ListItem[];
62
+ title?: string;
63
+ subtitle?: string;
64
+ showAvatars?: boolean;
65
+ showStatus?: boolean;
66
+ showActions?: boolean;
67
+ showTimestamp?: boolean;
68
+ dense?: boolean;
69
+ divided?: boolean;
70
+ actions?: React.ReactNode;
71
+ itemActions?: (item: ListItem, index: number) => React.ReactNode;
72
+ onItemClick?: (item: ListItem, index: number) => void;
73
+ loading?: boolean;
74
+ error?: string | Error;
75
+ emptyMessage?: string;
76
+ emptyIcon?: React.ReactNode;
77
+ maxBodyHeight?: string | number;
78
+ }
79
+
44
80
  export default function ListCard({
45
81
  items = [],
46
82
  title,
@@ -60,7 +96,7 @@ export default function ListCard({
60
96
  emptyIcon,
61
97
  maxBodyHeight,
62
98
  ...cardProps
63
- }) {
99
+ }: ListCardProps) {
64
100
  const header = (
65
101
  <div className="flex items-start justify-between gap-3">
66
102
  <div className="min-w-0">
@@ -96,7 +132,9 @@ export default function ListCard({
96
132
 
97
133
  const padY = dense ? "py-2" : "py-3";
98
134
 
99
- const scrollStyle = maxBodyHeight ? { maxHeight: maxBodyHeight, overflowY: "auto" } : {};
135
+ const scrollStyle: React.CSSProperties = maxBodyHeight
136
+ ? { maxHeight: typeof maxBodyHeight === "number" ? `${maxBodyHeight}px` : maxBodyHeight, overflowY: "auto" }
137
+ : {};
100
138
 
101
139
  const body =
102
140
  loading ? (
@@ -189,5 +227,3 @@ export default function ListCard({
189
227
 
190
228
  return <BaseCard variant="widget" header={header} body={body} isLoading={false} {...cardProps} />;
191
229
  }
192
-
193
-