@tsiky/components-r19 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 (287) hide show
  1. package/.prettierignore +4 -0
  2. package/.prettierrc +9 -0
  3. package/.storybook/main.ts +17 -0
  4. package/.storybook/preview.ts +21 -0
  5. package/.storybook/vitest.setup.ts +7 -0
  6. package/README.md +69 -0
  7. package/chart.ts +1 -0
  8. package/eslint.config.js +40 -0
  9. package/index.html +13 -0
  10. package/index.ts +33 -0
  11. package/package.json +63 -0
  12. package/public/vite.svg +1 -0
  13. package/src/App.css +42 -0
  14. package/src/App.tsx +12 -0
  15. package/src/assets/accessibility.png +0 -0
  16. package/src/assets/accessibility.svg +1 -0
  17. package/src/assets/addon-library.png +0 -0
  18. package/src/assets/assets.png +0 -0
  19. package/src/assets/avif-test-image.avif +0 -0
  20. package/src/assets/context.png +0 -0
  21. package/src/assets/discord.svg +1 -0
  22. package/src/assets/docs.png +0 -0
  23. package/src/assets/figma-plugin.png +0 -0
  24. package/src/assets/github.svg +1 -0
  25. package/src/assets/react.svg +1 -0
  26. package/src/assets/share.png +0 -0
  27. package/src/assets/styling.png +0 -0
  28. package/src/assets/testing.png +0 -0
  29. package/src/assets/theming.png +0 -0
  30. package/src/assets/tutorials.svg +1 -0
  31. package/src/assets/youtube.svg +1 -0
  32. package/src/components/AddItemModal/AddItemModal.module.css +72 -0
  33. package/src/components/AddItemModal/AddItemModal.tsx +82 -0
  34. package/src/components/AddItemModal/index.ts +1 -0
  35. package/src/components/Alert/Alert.css +54 -0
  36. package/src/components/Alert/Alert.stories.tsx +82 -0
  37. package/src/components/Alert/Alert.tsx +85 -0
  38. package/src/components/Alert/AlertContext.tsx +200 -0
  39. package/src/components/Alert/AlertModels.ts +34 -0
  40. package/src/components/Alert/index.ts +3 -0
  41. package/src/components/AnnouncementPanel/FlexRowContainer.css +17 -0
  42. package/src/components/AnnouncementPanel/FlexRowContainer.stories.tsx +329 -0
  43. package/src/components/AnnouncementPanel/FlexRowContainer.tsx +24 -0
  44. package/src/components/AnnouncementPanel/ListBox/CounterListBox.css +56 -0
  45. package/src/components/AnnouncementPanel/ListBox/CounterListBox.stories.tsx +292 -0
  46. package/src/components/AnnouncementPanel/ListBox/CounterListBox.tsx +106 -0
  47. package/src/components/AnnouncementPanel/ListBox/SimpleListBox.css +57 -0
  48. package/src/components/AnnouncementPanel/ListBox/SimpleListBox.stories.tsx +189 -0
  49. package/src/components/AnnouncementPanel/ListBox/SimpleListBox.tsx +138 -0
  50. package/src/components/AnnouncementPanel/ListBox/TrendListBox.css +61 -0
  51. package/src/components/AnnouncementPanel/ListBox/TrendListBox.stories.tsx +257 -0
  52. package/src/components/AnnouncementPanel/ListBox/TrendListBox.tsx +90 -0
  53. package/src/components/AnnouncementPanel/ListBox/index.ts +3 -0
  54. package/src/components/AnnouncementPanel/ListContentContainer.css +23 -0
  55. package/src/components/AnnouncementPanel/ListContentContainer.stories.tsx +212 -0
  56. package/src/components/AnnouncementPanel/ListContentContainer.tsx +33 -0
  57. package/src/components/AnnouncementPanel/index.ts +3 -0
  58. package/src/components/BandChart/index.tsx +282 -0
  59. package/src/components/Button/Button.module.css +165 -0
  60. package/src/components/Button/Button.stories.ts +132 -0
  61. package/src/components/Button/Button.tsx +55 -0
  62. package/src/components/Button/button.css +29 -0
  63. package/src/components/Button/index.ts +2 -0
  64. package/src/components/ChartContainer/ChartContainer.css +116 -0
  65. package/src/components/ChartContainer/ChartContainer.stories.tsx +159 -0
  66. package/src/components/ChartContainer/ChartContainer.tsx +155 -0
  67. package/src/components/ChartContainer/index.ts +1 -0
  68. package/src/components/Charts/area-chart-admission/AreaChartAdmission.stories.tsx +65 -0
  69. package/src/components/Charts/area-chart-admission/AreaChartAdmission.tsx +89 -0
  70. package/src/components/Charts/area-chart-admission/content.json +48 -0
  71. package/src/components/Charts/area-chart-hospitalisation/AreaChartHospitalisation.stories.tsx +141 -0
  72. package/src/components/Charts/area-chart-hospitalisation/AreaChartHospitalisation.tsx +262 -0
  73. package/src/components/Charts/area-chart-hospitalisation/content.json +55 -0
  74. package/src/components/Charts/bar-chart/BarChart.stories.tsx +50 -0
  75. package/src/components/Charts/bar-chart/BarChart.tsx +132 -0
  76. package/src/components/Charts/bar-chart/content.json +15 -0
  77. package/src/components/Charts/boxplot-chart/BoxPlotChart.stories.tsx +63 -0
  78. package/src/components/Charts/boxplot-chart/BoxPlotChart.tsx +114 -0
  79. package/src/components/Charts/boxplot-chart/boxUtils.ts +22 -0
  80. package/src/components/Charts/boxplot-chart/content.json +11 -0
  81. package/src/components/Charts/mixed-chart/MixedChart.stories.tsx +83 -0
  82. package/src/components/Charts/mixed-chart/MixedChart.tsx +625 -0
  83. package/src/components/Charts/mixed-chart/content.json +34 -0
  84. package/src/components/Charts/sankey-adaptation/sankey.tsx +70 -0
  85. package/src/components/Charts/sankey-chart/SankeyChart.stories.tsx +69 -0
  86. package/src/components/Charts/sankey-chart/SankeyChart.tsx +155 -0
  87. package/src/components/Charts/sankey-chart/content.json +15 -0
  88. package/src/components/Charts/stacked-column/StackedColumn.stories.tsx +72 -0
  89. package/src/components/Charts/stacked-column/StackedColumn.tsx +406 -0
  90. package/src/components/Charts/stacked-column/content.json +37 -0
  91. package/src/components/Charts/stacked-column-one-hundred-percent/StackedColumnOneHundredPercent.stories.tsx +43 -0
  92. package/src/components/Charts/stacked-column-one-hundred-percent/StackedColumnOneHundredPercent.tsx +75 -0
  93. package/src/components/Charts/stacked-column-one-hundred-percent/content.json +6 -0
  94. package/src/components/CircularProgress/CircularProgress.css +79 -0
  95. package/src/components/CircularProgress/CircularProgress.stories.tsx +251 -0
  96. package/src/components/CircularProgress/CircularProgress.tsx +101 -0
  97. package/src/components/CircularProgress/index.ts +2 -0
  98. package/src/components/Configure.mdx +369 -0
  99. package/src/components/DayStatCard/DayStatCard.css +50 -0
  100. package/src/components/DayStatCard/DayStatCard.stories.tsx +273 -0
  101. package/src/components/DayStatCard/DayStatCard.tsx +69 -0
  102. package/src/components/DayStatCard/index.ts +2 -0
  103. package/src/components/DraggableSwitcher/DraggableSwitcherButton.tsx +58 -0
  104. package/src/components/DraggableSwitcher/context/useDraggableSwitcher.tsx +45 -0
  105. package/src/components/DraggableSwitcher/index.ts +2 -0
  106. package/src/components/DropdownMenu/DropdownMenu.css +100 -0
  107. package/src/components/DropdownMenu/DropdownMenu.stories.tsx +174 -0
  108. package/src/components/DropdownMenu/DropdownMenu.tsx +106 -0
  109. package/src/components/DropdownMenu/index.ts +1 -0
  110. package/src/components/DynamicForm/DynamicFom.stories.ts +773 -0
  111. package/src/components/DynamicForm/DynamicForm.module.css +468 -0
  112. package/src/components/DynamicForm/DynamicForm.tsx +224 -0
  113. package/src/components/DynamicForm/index.ts +3 -0
  114. package/src/components/DynamicForm/tools/form-metadata.ts +82 -0
  115. package/src/components/DynamicForm/tools/validation.ts +168 -0
  116. package/src/components/DynamicInput/DynamicInput.module.css +126 -0
  117. package/src/components/DynamicInput/DynamicInput.stories.ts +350 -0
  118. package/src/components/DynamicInput/DynamicInput.tsx +144 -0
  119. package/src/components/DynamicInput/index.ts +2 -0
  120. package/src/components/DynamicInput/input/CheckboxInput.tsx +41 -0
  121. package/src/components/DynamicInput/input/ColorInput.tsx +46 -0
  122. package/src/components/DynamicInput/input/DateInput.tsx +57 -0
  123. package/src/components/DynamicInput/input/FileInput.tsx +174 -0
  124. package/src/components/DynamicInput/input/InputWrapper.tsx +26 -0
  125. package/src/components/DynamicInput/input/RadioInput.tsx +46 -0
  126. package/src/components/DynamicInput/input/RangeInput.tsx +46 -0
  127. package/src/components/DynamicInput/input/SelectInput.tsx +75 -0
  128. package/src/components/DynamicInput/input/TextInput.tsx +101 -0
  129. package/src/components/DynamicInput/input/TextareaInput.tsx +47 -0
  130. package/src/components/DynamicInput/input/assets/ColorInput.module.css +48 -0
  131. package/src/components/DynamicInput/input/assets/DateInput.module.css +83 -0
  132. package/src/components/DynamicInput/input/assets/FileInput.module.css +133 -0
  133. package/src/components/DynamicInput/input/assets/RangeInput.module.css +169 -0
  134. package/src/components/DynamicInput/input/assets/SelectInput.module.css +95 -0
  135. package/src/components/DynamicInput/input/index.ts +10 -0
  136. package/src/components/DynamicTable/AdvancedFilters.tsx +196 -0
  137. package/src/components/DynamicTable/ColumnSorter.tsx +185 -0
  138. package/src/components/DynamicTable/Pagination.tsx +115 -0
  139. package/src/components/DynamicTable/TableBody.tsx +42 -0
  140. package/src/components/DynamicTable/TableCell.tsx +30 -0
  141. package/src/components/DynamicTable/TableHeader.tsx +34 -0
  142. package/src/components/DynamicTable/TableRow.tsx +56 -0
  143. package/src/components/DynamicTable/TableauDynamic.stories.ts +1014 -0
  144. package/src/components/DynamicTable/TableauDynamique.module.css +1287 -0
  145. package/src/components/DynamicTable/TableauDynamique.tsx +154 -0
  146. package/src/components/DynamicTable/filters/BooleanFilter.tsx +30 -0
  147. package/src/components/DynamicTable/filters/DateFilter.tsx +28 -0
  148. package/src/components/DynamicTable/filters/DateRangeFilter.tsx +51 -0
  149. package/src/components/DynamicTable/filters/FilterRenderer.tsx +117 -0
  150. package/src/components/DynamicTable/filters/MultiSelectFilter.tsx +59 -0
  151. package/src/components/DynamicTable/filters/NumberFilter.tsx +37 -0
  152. package/src/components/DynamicTable/filters/OperatorFilter.tsx +64 -0
  153. package/src/components/DynamicTable/filters/SelectFilter.tsx +69 -0
  154. package/src/components/DynamicTable/filters/TextFilter.tsx +39 -0
  155. package/src/components/DynamicTable/filters/index.ts +9 -0
  156. package/src/components/DynamicTable/hooks/index.ts +2 -0
  157. package/src/components/DynamicTable/hooks/useAsyncActions.ts +36 -0
  158. package/src/components/DynamicTable/hooks/useFilters.ts +142 -0
  159. package/src/components/DynamicTable/hooks/useTableData.ts +216 -0
  160. package/src/components/DynamicTable/index.ts +11 -0
  161. package/src/components/DynamicTable/tools/filterTypes.ts +118 -0
  162. package/src/components/DynamicTable/tools/index.ts +3 -0
  163. package/src/components/DynamicTable/tools/tableConfig.ts +96 -0
  164. package/src/components/DynamicTable/tools/tableTypes.ts +63 -0
  165. package/src/components/EntryControl/EntryControl.module.css +218 -0
  166. package/src/components/EntryControl/EntryControl.stories.tsx +71 -0
  167. package/src/components/EntryControl/EntryControl.tsx +117 -0
  168. package/src/components/EntryControl/index.ts +2 -0
  169. package/src/components/Grid/Grid.stories.tsx +94 -0
  170. package/src/components/Grid/Grid.tsx +214 -0
  171. package/src/components/Grid/grid.css +285 -0
  172. package/src/components/Grid/index.ts +2 -0
  173. package/src/components/Header/Header.stories.tsx +164 -0
  174. package/src/components/Header/Header.tsx +59 -0
  175. package/src/components/Header/header.css +31 -0
  176. package/src/components/Header/index.ts +1 -0
  177. package/src/components/IconText/IconText..stories.tsx +135 -0
  178. package/src/components/IconText/IconText.css +43 -0
  179. package/src/components/IconText/IconText.tsx +43 -0
  180. package/src/components/IconText/index.ts +1 -0
  181. package/src/components/LanguageSelector/LanguageSelector.css +31 -0
  182. package/src/components/LanguageSelector/LanguageSelector.stories.tsx +38 -0
  183. package/src/components/LanguageSelector/LanguageSelector.tsx +37 -0
  184. package/src/components/LanguageSelector/index.ts +1 -0
  185. package/src/components/Logo/Logo.css +89 -0
  186. package/src/components/Logo/Logo.stories.tsx +79 -0
  187. package/src/components/Logo/Logo.tsx +22 -0
  188. package/src/components/Logo/index.ts +2 -0
  189. package/src/components/MetricsPanel/MetricsItem.tsx +128 -0
  190. package/src/components/MetricsPanel/MetricsPanel.module.css +636 -0
  191. package/src/components/MetricsPanel/MetricsPanel.stories.tsx +692 -0
  192. package/src/components/MetricsPanel/MetricsPanel.tsx +282 -0
  193. package/src/components/MetricsPanel/PanelHeader.tsx +19 -0
  194. package/src/components/MetricsPanel/SummaryCard.tsx +61 -0
  195. package/src/components/MetricsPanel/index.ts +4 -0
  196. package/src/components/MetricsPanel/renderers/CompactRenderer.tsx +125 -0
  197. package/src/components/MetricsPanel/renderers/ImageCard.tsx +62 -0
  198. package/src/components/MetricsPanel/renderers/PertinenceCard.tsx +55 -0
  199. package/src/components/MetricsPanel/tools/MetricsPanelTypes.ts +62 -0
  200. package/src/components/MetricsPanel/tools/chooseDefaultRender.ts +50 -0
  201. package/src/components/MetricsPanel/tools/colorUtils.ts +39 -0
  202. package/src/components/MetricsPanel/tools/index.ts +2 -0
  203. package/src/components/ModuleHeader/ModuleHeader.css +37 -0
  204. package/src/components/ModuleHeader/ModuleHeader.stories.tsx +37 -0
  205. package/src/components/ModuleHeader/ModuleHeader.tsx +42 -0
  206. package/src/components/ModuleHeader/index.ts +1 -0
  207. package/src/components/ModuleSideBar/ModuleSideBar.css +227 -0
  208. package/src/components/ModuleSideBar/ModuleSideBar.stories.tsx +40 -0
  209. package/src/components/ModuleSideBar/ModuleSideBar.tsx +155 -0
  210. package/src/components/ModuleSideBar/index.ts +1 -0
  211. package/src/components/NavBar/NavBar.css +58 -0
  212. package/src/components/NavBar/NavBar.stories.tsx +169 -0
  213. package/src/components/NavBar/NavBar.tsx +100 -0
  214. package/src/components/NavBar/NavContext.tsx +30 -0
  215. package/src/components/NavBar/index.ts +2 -0
  216. package/src/components/NavItem/NavItem.css +29 -0
  217. package/src/components/NavItem/NavItem.tsx +58 -0
  218. package/src/components/NavItem/index.ts +1 -0
  219. package/src/components/Page/Dashboard.tsx +93 -0
  220. package/src/components/Page/Page.stories.ts +33 -0
  221. package/src/components/Page/Page.tsx +73 -0
  222. package/src/components/Page/page.css +81 -0
  223. package/src/components/PerformanceCard/PerformanceCard.module.css +232 -0
  224. package/src/components/PerformanceCard/PerformanceCard.stories.tsx +441 -0
  225. package/src/components/PerformanceCard/PerformanceCard.tsx +198 -0
  226. package/src/components/PerformanceCard/defaultHistogramRenderer.tsx +32 -0
  227. package/src/components/PerformanceCard/tools/types.ts +50 -0
  228. package/src/components/PerformanceCard/tools/usePerformanceCard.ts +93 -0
  229. package/src/components/PeriodRange/PeriodRange.module.css +158 -0
  230. package/src/components/PeriodRange/PeriodRange.stories.tsx +66 -0
  231. package/src/components/PeriodRange/PeriodRange.tsx +130 -0
  232. package/src/components/PeriodSelect/PeriodSelect.module.css +65 -0
  233. package/src/components/PeriodSelect/PeriodSelect.stories.tsx +40 -0
  234. package/src/components/PeriodSelect/PeriodSelect.tsx +42 -0
  235. package/src/components/PeriodSelect/index.ts +1 -0
  236. package/src/components/ScrollableHorizontale/ScrollableHorizontale.css +40 -0
  237. package/src/components/ScrollableHorizontale/ScrollableHorizontale.stories.tsx +133 -0
  238. package/src/components/ScrollableHorizontale/ScrollableHorizontale.tsx +29 -0
  239. package/src/components/ScrollableHorizontale/index.ts +1 -0
  240. package/src/components/SearchBar/SearchBar.css +40 -0
  241. package/src/components/SearchBar/SearchBar.stories.tsx +36 -0
  242. package/src/components/SearchBar/SearchBar.tsx +30 -0
  243. package/src/components/SearchBar/index.ts +1 -0
  244. package/src/components/SectionTitle/SectionTitle.css +21 -0
  245. package/src/components/SectionTitle/SectionTitle.stories.tsx +39 -0
  246. package/src/components/SectionTitle/SectionTitle.tsx +18 -0
  247. package/src/components/SideComponent/PatientEditor.tsx +64 -0
  248. package/src/components/SideComponent/SideComponent.css +179 -0
  249. package/src/components/SideComponent/SideComponent.stories.tsx +547 -0
  250. package/src/components/SideComponent/SideComponent.tsx +243 -0
  251. package/src/components/SideComponent/hooks/useBodyScrollLock.ts +15 -0
  252. package/src/components/SideComponent/index.ts +2 -0
  253. package/src/components/SideComponent/portal.ts +11 -0
  254. package/src/components/SubNavBar/SubNavBar.tsx +41 -0
  255. package/src/components/SubNavBar/index.ts +1 -0
  256. package/src/components/Switcher/Switcher.css +65 -0
  257. package/src/components/Switcher/Switcher.stories.tsx +153 -0
  258. package/src/components/Switcher/Switcher.tsx +83 -0
  259. package/src/components/Switcher/index.ts +1 -0
  260. package/src/components/Title/Title.stories.tsx +18 -0
  261. package/src/components/Title/Title.tsx +26 -0
  262. package/src/components/Title/index.ts +1 -0
  263. package/src/components/TranslationKey/TranslationKey.css +272 -0
  264. package/src/components/TranslationKey/TranslationKey.stories.tsx +50 -0
  265. package/src/components/TranslationKey/TranslationKey.tsx +245 -0
  266. package/src/components/TranslationKey/index.ts +1 -0
  267. package/src/components/TrendItem/TrendItem.css +36 -0
  268. package/src/components/TrendItem/TrendItem.stories.tsx +276 -0
  269. package/src/components/TrendItem/TrendItem.tsx +46 -0
  270. package/src/components/TrendItem/index.ts +1 -0
  271. package/src/components/TrendList/TrendList.css +16 -0
  272. package/src/components/TrendList/TrendList.stories.tsx +337 -0
  273. package/src/components/TrendList/TrendList.tsx +45 -0
  274. package/src/components/TrendList/index.ts +1 -0
  275. package/src/components/theme/ThemeSwitcherButton.tsx +64 -0
  276. package/src/components/theme/context/ThemeContext.tsx +61 -0
  277. package/src/components/theme/context/index.ts +2 -0
  278. package/src/components/theme/context/useThemeSwitcher.ts +18 -0
  279. package/src/components/theme/index.ts +1 -0
  280. package/src/index.css +68 -0
  281. package/src/main.tsx +10 -0
  282. package/src/vite-env.d.ts +1 -0
  283. package/tsconfig.app.json +27 -0
  284. package/tsconfig.json +4 -0
  285. package/tsconfig.node.json +25 -0
  286. package/vite.config.ts +43 -0
  287. package/vitest.shims.d.ts +1 -0
@@ -0,0 +1,257 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { TrendListBox } from './TrendListBox';
3
+ import {
4
+ ArrowUp,
5
+ ArrowDown,
6
+ Minus,
7
+ TrendingUp,
8
+ Users,
9
+ DollarSign,
10
+ Activity,
11
+ Star,
12
+ AlertTriangle,
13
+ Zap,
14
+ Clock,
15
+ Target,
16
+ } from 'lucide-react';
17
+
18
+ const meta: Meta<typeof TrendListBox> = {
19
+ title: 'Components/ListBox/TrendListBox',
20
+ component: TrendListBox,
21
+ parameters: {
22
+ layout: 'centered',
23
+ docs: {
24
+ description: {
25
+ component: 'A component to display trends with icons, values, and variations.',
26
+ },
27
+ },
28
+ },
29
+ tags: ['autodocs'],
30
+ argTypes: {
31
+ items: {
32
+ control: 'object',
33
+ description: 'Array of trend items with label, value, delta, and optional icon',
34
+ },
35
+ titleBg: {
36
+ control: 'color',
37
+ description: 'Background color of the title',
38
+ },
39
+ titleColor: {
40
+ control: 'color',
41
+ description: 'Text color of the title',
42
+ },
43
+ },
44
+ };
45
+
46
+ export default meta;
47
+ type Story = StoryObj<typeof meta>;
48
+
49
+ export const Default: Story = {
50
+ name: 'Default',
51
+ args: {
52
+ title: "Today's Trends",
53
+ items: [
54
+ { label: 'Sales', value: '+12%', delta: 12, icon: <ArrowUp size={16} /> },
55
+ { label: 'Visits', value: '-3%', delta: -3, icon: <ArrowDown size={16} /> },
56
+ { label: 'Conversion', value: '+5%', delta: 5, icon: <ArrowUp size={16} /> },
57
+ { label: 'Bounce Rate', value: '-2%', delta: -2, icon: <ArrowDown size={16} /> },
58
+ ],
59
+ },
60
+ };
61
+
62
+ export const PerformanceTrends: Story = {
63
+ name: 'Performance Trends',
64
+ args: {
65
+ title: 'Department Performance',
66
+ items: [
67
+ { label: 'Marketing', value: '+15%', delta: 15, icon: <TrendingUp size={16} /> },
68
+ { label: 'Sales', value: '+8%', delta: 8, icon: <ArrowUp size={16} /> },
69
+ { label: 'Support', value: '-2%', delta: -2, icon: <ArrowDown size={16} /> },
70
+ { label: 'IT', value: '+22%', delta: 22, icon: <Zap size={16} /> },
71
+ ],
72
+ lineClasses: {
73
+ 0: 'trend-excellent',
74
+ 1: 'trend-good',
75
+ 2: 'trend-warning',
76
+ 3: 'trend-outstanding',
77
+ },
78
+ },
79
+ decorators: [
80
+ (Story) => (
81
+ <>
82
+ <style>
83
+ {`
84
+ .trend-excellent { background-color: #f0fdf4; }
85
+ .trend-good { background-color: #f0f9ff; }
86
+ .trend-warning { background-color: #fffbeb; }
87
+ .trend-outstanding { background-color: #faf5ff; }
88
+ `}
89
+ </style>
90
+ <Story />
91
+ </>
92
+ ),
93
+ ],
94
+ };
95
+
96
+ export const StatusMonitoring: Story = {
97
+ name: 'Status Monitoring',
98
+ args: {
99
+ title: 'System Health',
100
+ items: [
101
+ { label: 'Availability', value: '99.9%', delta: 0.1, icon: <Activity size={16} /> },
102
+ { label: 'Performance', value: '96%', delta: -2, icon: <AlertTriangle size={16} /> },
103
+ { label: 'Security', value: '100%', delta: 0, icon: <Star size={16} /> },
104
+ { label: 'Capacity', value: '78%', delta: 8, icon: <TrendingUp size={16} /> },
105
+ ],
106
+ },
107
+ };
108
+
109
+ export const AlertLevels: Story = {
110
+ name: 'Alert Levels',
111
+ args: {
112
+ title: 'Real-time Alerts',
113
+ items: [
114
+ {
115
+ label: 'Security',
116
+ value: 'High',
117
+ delta: 3,
118
+ icon: <AlertTriangle size={16} color='#dc2626' />,
119
+ },
120
+ {
121
+ label: 'Performance',
122
+ value: 'Medium',
123
+ delta: -1,
124
+ icon: <Activity size={16} color='#f59e0b' />,
125
+ },
126
+ { label: 'Network', value: 'Normal', delta: 0, icon: <Zap size={16} color='#22c55e' /> },
127
+ {
128
+ label: 'Storage',
129
+ value: 'Critical',
130
+ delta: 15,
131
+ icon: <AlertTriangle size={16} color='#dc2626' />,
132
+ },
133
+ ],
134
+ lineClasses: {
135
+ 0: 'alert-high',
136
+ 2: 'alert-normal',
137
+ 3: 'alert-critical',
138
+ },
139
+ },
140
+ decorators: [
141
+ (Story) => (
142
+ <>
143
+ <style>
144
+ {`
145
+ .alert-high { background-color: #fef2f2; }
146
+ .alert-normal { background-color: #f0fdf4; }
147
+ .alert-critical { background-color: #fef2f2; border-left: 3px solid #dc2626; }
148
+ `}
149
+ </style>
150
+ <Story />
151
+ </>
152
+ ),
153
+ ],
154
+ };
155
+
156
+ export const CustomIcons: Story = {
157
+ name: 'Custom Icons',
158
+ args: {
159
+ title: 'Business Indicators',
160
+ items: [
161
+ { label: 'Revenue', value: '€45.2K', delta: 12.5 },
162
+ { label: 'New Customers', value: '+24', delta: 8 },
163
+ { label: 'Satisfaction', value: '4.8/5', delta: 0.3 },
164
+ { label: 'Avg. Delay', value: '-15%', delta: -15 },
165
+ ],
166
+ renderTrendIcon: (item) => {
167
+ if (item.delta && item.delta > 10) {
168
+ return <Zap size={16} color='#f59e0b' />;
169
+ } else if (item.delta && item.delta > 0) {
170
+ return <ArrowUp size={16} color='#10b981' />;
171
+ } else if (item.delta && item.delta < 0) {
172
+ return <ArrowDown size={16} color='#ef4444' />;
173
+ }
174
+ return <Minus size={16} color='#6b7280' />;
175
+ },
176
+ },
177
+ };
178
+
179
+ export const RatingTrends: Story = {
180
+ name: 'Rating Trends',
181
+ args: {
182
+ title: 'Ratings Evolution',
183
+ items: [
184
+ { label: 'Product Quality', value: '4.8→4.9', delta: 0.1, icon: <ArrowUp size={16} /> },
185
+ { label: 'Customer Service', value: '4.5→4.3', delta: -0.2, icon: <ArrowDown size={16} /> },
186
+ { label: 'Speed', value: '4.7→4.7', delta: 0, icon: <Minus size={16} /> },
187
+ { label: 'Value for Money', value: '4.2→4.6', delta: 0.4, icon: <ArrowUp size={16} /> },
188
+ ],
189
+ },
190
+ };
191
+
192
+ export const FinancialMetrics: Story = {
193
+ name: 'Financial Metrics',
194
+ args: {
195
+ title: 'Financial Indicators',
196
+ titleBg: '#059669',
197
+ titleColor: 'white',
198
+ items: [
199
+ { label: 'Revenue Q1', value: '€125K', delta: 8.5, icon: <DollarSign size={16} /> },
200
+ { label: 'Gross Margin', value: '42%', delta: 2.1, icon: <TrendingUp size={16} /> },
201
+ { label: 'Expenses', value: '€89K', delta: -1.2, icon: <ArrowDown size={16} /> },
202
+ { label: 'ROI', value: '18%', delta: 3.4, icon: <Zap size={16} /> },
203
+ ],
204
+ },
205
+ };
206
+
207
+ export const UserAnalytics: Story = {
208
+ name: 'User Analytics',
209
+ args: {
210
+ title: 'User Engagement',
211
+ items: [
212
+ { label: 'New Signups', value: '+156', delta: 12, icon: <Users size={16} /> },
213
+ { label: 'Active Users', value: '1.2K', delta: 8, icon: <Activity size={16} /> },
214
+ { label: 'Retention Rate', value: '78%', delta: 4, icon: <TrendingUp size={16} /> },
215
+ { label: 'Churn Rate', value: '2.1%', delta: -0.5, icon: <ArrowDown size={16} /> },
216
+ ],
217
+ },
218
+ };
219
+
220
+ export const TimeMetrics: Story = {
221
+ name: 'Time Metrics',
222
+ args: {
223
+ title: 'Time Performance',
224
+ items: [
225
+ { label: 'Load Time', value: '1.2s', delta: -0.3, icon: <ArrowDown size={16} /> },
226
+ { label: 'Response Time', value: '245ms', delta: 15, icon: <ArrowUp size={16} /> },
227
+ { label: 'Availability', value: '99.95%', delta: 0.05, icon: <ArrowUp size={16} /> },
228
+ { label: 'Avg. Session', value: '4m 12s', delta: 23, icon: <Clock size={16} /> },
229
+ ],
230
+ },
231
+ };
232
+
233
+ export const GoalTracking: Story = {
234
+ name: 'Goal Tracking',
235
+ args: {
236
+ title: 'Objective Progress',
237
+ items: [
238
+ { label: 'Monthly Sales', value: '85%', delta: 5, icon: <Target size={16} /> },
239
+ { label: 'New Clients', value: '120%', delta: 20, icon: <Target size={16} /> },
240
+ { label: 'Customer Satisfaction', value: '92%', delta: -3, icon: <Target size={16} /> },
241
+ { label: 'Operational Efficiency', value: '78%', delta: 8, icon: <Target size={16} /> },
242
+ ],
243
+ },
244
+ };
245
+
246
+ export const WithoutDeltas: Story = {
247
+ name: 'Without Variations',
248
+ args: {
249
+ title: 'Current Stats',
250
+ items: [
251
+ { label: 'Online Users', value: '423', icon: <Users size={16} /> },
252
+ { label: 'Orders Today', value: '156', icon: <DollarSign size={16} /> },
253
+ { label: 'Open Tickets', value: '24', icon: <Activity size={16} /> },
254
+ { label: 'Active Servers', value: '8', icon: <Zap size={16} /> },
255
+ ],
256
+ },
257
+ };
@@ -0,0 +1,90 @@
1
+ import React from 'react';
2
+ import './TrendListBox.css';
3
+
4
+ export type TrendBoxItem = {
5
+ label: string;
6
+ value: string;
7
+ delta?: number;
8
+ deltaLabel?: string;
9
+ icon?: React.ReactNode;
10
+ className?: string;
11
+ };
12
+
13
+ export type TrendListBoxProps = {
14
+ className?: string;
15
+ style?: React.CSSProperties;
16
+ title?: string;
17
+ items?: TrendBoxItem[];
18
+ titleBg?: string;
19
+ titleColor?: string;
20
+ itemBg?: string;
21
+ lineClasses?: { [index: number]: string };
22
+ renderTrendIcon?: (it: TrendBoxItem) => React.ReactNode;
23
+ colGap?: string;
24
+ };
25
+
26
+ export const TrendListBox: React.FC<TrendListBoxProps> = ({
27
+ className = '',
28
+ style = {},
29
+ title,
30
+ items = [],
31
+ titleBg,
32
+ titleColor,
33
+ itemBg,
34
+ lineClasses = {},
35
+ renderTrendIcon,
36
+ colGap = '1rem',
37
+ }) => {
38
+ const gridStyle: React.CSSProperties | undefined = colGap
39
+ ? ({ ['--col-gap' as any]: colGap } as React.CSSProperties)
40
+ : undefined;
41
+
42
+ return (
43
+ <div className={`tlb-root ${className}`} style={{ ...style, background: itemBg ?? undefined }}>
44
+ {title && (
45
+ <div
46
+ className='tlb-title'
47
+ style={{
48
+ background: titleBg ?? undefined,
49
+ color: titleColor ?? undefined,
50
+ }}
51
+ >
52
+ {title}
53
+ </div>
54
+ )}
55
+
56
+ <div className='tlb-grid' style={gridStyle}>
57
+ {items.map((it, idx) => {
58
+ const lineClass = lineClasses[idx] || '';
59
+
60
+ return (
61
+ <div
62
+ key={idx}
63
+ className={`tlb-row ${lineClass}`}
64
+ style={{ background: itemBg ?? undefined }}
65
+ >
66
+ <div className='tlb-label'>{it.label}</div>
67
+
68
+ <div className='tlb-value-group'>
69
+ <div className='tlb-icon-col'>
70
+ {renderTrendIcon ? renderTrendIcon(it) : (it.icon ?? null)}
71
+ </div>
72
+
73
+ <div className='tlb-value-wrap'>
74
+ <div className='tlb-value'>{it.value}</div>
75
+ {typeof it.delta !== 'undefined' && (
76
+ <div
77
+ className={`tlb-delta ${it.delta > 0 ? 'positive' : it.delta < 0 ? 'negative' : 'neutral'}`}
78
+ >
79
+ {it.deltaLabel ?? String(it.delta)}
80
+ </div>
81
+ )}
82
+ </div>
83
+ </div>
84
+ </div>
85
+ );
86
+ })}
87
+ </div>
88
+ </div>
89
+ );
90
+ };
@@ -0,0 +1,3 @@
1
+ export * from './SimpleListBox';
2
+ export * from './CounterListBox';
3
+ export * from './TrendListBox';
@@ -0,0 +1,23 @@
1
+ .lcc-root {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ align-items: flex-start;
5
+ justify-content: space-between;
6
+ border-radius: 8px;
7
+ padding: 0.5rem;
8
+ box-shadow: 0 2px 4px #0000001a;
9
+ box-sizing: border-box;
10
+ width: 100%;
11
+ }
12
+
13
+ .lcc-cell {
14
+ display: flex;
15
+ align-items: flex-start;
16
+ margin-left: auto;
17
+ margin-right: auto;
18
+ }
19
+
20
+ .lcc-cell > * {
21
+ width: 100%;
22
+ box-sizing: border-box;
23
+ }
@@ -0,0 +1,212 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { ArrowUp, ArrowDown, TrendingUp, Users, Star } from 'lucide-react';
3
+ import { ListContentContainer } from './ListContentContainer';
4
+ import { SimpleListBox } from './ListBox/SimpleListBox';
5
+ import { CounterListBox } from './ListBox/CounterListBox';
6
+ import { TrendListBox } from './ListBox/TrendListBox';
7
+
8
+ const meta: Meta<typeof ListContentContainer> = {
9
+ title: 'Components/ListContentContainer',
10
+ component: ListContentContainer,
11
+ parameters: {
12
+ layout: 'centered',
13
+ docs: {
14
+ description: {
15
+ component:
16
+ 'A horizontal container for grouping list components with consistent spacing and background.',
17
+ },
18
+ },
19
+ },
20
+ tags: ['autodocs'],
21
+ argTypes: {
22
+ gap: {
23
+ control: { type: 'text' },
24
+ description: 'Space between items (e.g., "1rem", "10px")',
25
+ },
26
+ background: {
27
+ control: { type: 'color' },
28
+ description: 'Background color of the container',
29
+ },
30
+ },
31
+ };
32
+
33
+ export default meta;
34
+ type Story = StoryObj<typeof meta>;
35
+
36
+ export const Default: Story = {
37
+ args: {
38
+ gap: '1rem',
39
+ background: '#008FBB',
40
+ },
41
+ render: (args) => (
42
+ <ListContentContainer {...args} style={{ width: 520 }}>
43
+ <SimpleListBox title='Admissions' data={['63 Patients']} />
44
+ <CounterListBox title='Summary' data={[['63', 'Patients']]} badgeColor='#06b6d4' />
45
+ <TrendListBox
46
+ title='Trend'
47
+ items={[
48
+ { label: 'MED', value: '+3', delta: 3, icon: <ArrowUp size={16} /> },
49
+ { label: 'SURG', value: '-2', delta: -2, icon: <ArrowDown size={16} /> },
50
+ ]}
51
+ />
52
+ </ListContentContainer>
53
+ ),
54
+ };
55
+
56
+ export const HealthcareDashboard: Story = {
57
+ name: 'Healthcare Dashboard',
58
+ args: {
59
+ background: '#0369a1',
60
+ gap: '0.8rem',
61
+ },
62
+ render: (args) => (
63
+ <ListContentContainer {...args} style={{ width: 600 }}>
64
+ <SimpleListBox title='Operating Rooms' data={['4 Occupied', '2 Available']} />
65
+ <CounterListBox title='Patients' data={[['128', 'Hospitalized']]} badgeColor='#dc2626' />
66
+ <TrendListBox
67
+ title='Admissions'
68
+ items={[
69
+ { label: 'Emergency', value: '+8', delta: 8, icon: <ArrowUp size={16} /> },
70
+ { label: 'Scheduled', value: '+3', delta: 3, icon: <ArrowUp size={16} /> },
71
+ ]}
72
+ />
73
+ <SimpleListBox title='Staff' data={['18 Doctors', '32 Nurses']} />
74
+ </ListContentContainer>
75
+ ),
76
+ };
77
+
78
+ export const BusinessMetrics: Story = {
79
+ name: 'Business Metrics',
80
+ args: {
81
+ background: '#059669',
82
+ gap: '1rem',
83
+ },
84
+ render: (args) => (
85
+ <ListContentContainer {...args} style={{ width: 650 }}>
86
+ <TrendListBox
87
+ title='Performance'
88
+ items={[
89
+ { label: 'Revenue', value: '€12.5K', delta: 12, icon: <TrendingUp size={16} /> },
90
+ { label: 'Users', value: '+42', delta: 8, icon: <Users size={16} /> },
91
+ { label: 'Growth', value: '+8.1%', delta: 8.1, icon: <ArrowUp size={16} /> },
92
+ ]}
93
+ />
94
+ <CounterListBox
95
+ title='Monthly Summary'
96
+ data={[
97
+ ['156', 'Orders Completed'],
98
+ ['€2.4K', 'Revenue Generated'],
99
+ ['24', 'Pending Orders'],
100
+ ]}
101
+ badgeColor='#f59e0b'
102
+ />
103
+ <SimpleListBox
104
+ title='Quick Stats'
105
+ data={[
106
+ ['Conversion Rate', '3.2%'],
107
+ ['Customer Satisfaction', '4.8/5'],
108
+ ]}
109
+ />
110
+ </ListContentContainer>
111
+ ),
112
+ };
113
+
114
+ export const RatingSystem: Story = {
115
+ name: 'Rating System',
116
+ args: {
117
+ background: '#7c3aed',
118
+ gap: '1.2rem',
119
+ },
120
+ render: (args) => (
121
+ <ListContentContainer {...args} style={{ width: 580 }}>
122
+ <TrendListBox
123
+ title='Quality Ratings'
124
+ items={[
125
+ {
126
+ label: 'Service',
127
+ value: '4.8/5',
128
+ delta: 0.2,
129
+ icon: <Star size={16} color='#f59e0b' fill='#f59e0b' />,
130
+ },
131
+ {
132
+ label: 'Response',
133
+ value: '4.5/5',
134
+ delta: -0.1,
135
+ icon: <Star size={16} color='#f59e0b' fill='#f59e0b' />,
136
+ },
137
+ {
138
+ label: 'Support',
139
+ value: '4.9/5',
140
+ delta: 0.3,
141
+ icon: <Star size={16} color='#f59e0b' fill='#f59e0b' />,
142
+ },
143
+ ]}
144
+ />
145
+ <CounterListBox
146
+ title='Review Summary'
147
+ data={[
148
+ ['156', '5-Star Reviews'],
149
+ ['24', '4-Star Reviews'],
150
+ ['8', '3-Star Reviews'],
151
+ ]}
152
+ badgeColor='#ec4899'
153
+ />
154
+ </ListContentContainer>
155
+ ),
156
+ };
157
+
158
+ export const SystemMonitoring: Story = {
159
+ name: 'System Monitoring',
160
+ args: {
161
+ background: '#dc2626',
162
+ gap: '0.8rem',
163
+ },
164
+ render: (args) => (
165
+ <ListContentContainer {...args} style={{ width: 550 }}>
166
+ <TrendListBox
167
+ title='System Metrics'
168
+ items={[
169
+ { label: 'CPU', value: '68%', delta: 2, icon: <ArrowUp size={16} /> },
170
+ { label: 'Memory', value: '45%', delta: -5, icon: <ArrowDown size={16} /> },
171
+ { label: 'Disk', value: '82%', delta: 1, icon: <ArrowUp size={16} /> },
172
+ ]}
173
+ />
174
+ <CounterListBox
175
+ title='Alerts'
176
+ data={[
177
+ ['3', 'Critical'],
178
+ ['7', 'Warning'],
179
+ ['12', 'Info'],
180
+ ]}
181
+ badgeColor='#ef4444'
182
+ />
183
+ <SimpleListBox title='Status' data={['All systems operational', 'Last updated: 2 min ago']} />
184
+ </ListContentContainer>
185
+ ),
186
+ };
187
+
188
+ export const CustomGap: Story = {
189
+ name: 'Custom Gap Sizes',
190
+ args: {
191
+ background: '#f59e0b',
192
+ },
193
+ render: (args) => (
194
+ <div style={{ display: 'flex', flexDirection: 'column', gap: '2rem' }}>
195
+ <div>
196
+ <h4 style={{ marginBottom: '0.5rem' }}>Small Gap (0.5rem)</h4>
197
+ <ListContentContainer {...args} gap='0.5rem' style={{ width: 500 }}>
198
+ <SimpleListBox title='Compact' data={['Item 1', 'Item 2']} />
199
+ <CounterListBox title='Counters' data={[['1', 'First']]} badgeColor='#3b82f6' />
200
+ </ListContentContainer>
201
+ </div>
202
+
203
+ <div>
204
+ <h4 style={{ marginBottom: '0.5rem' }}>Large Gap (2rem)</h4>
205
+ <ListContentContainer {...args} gap='2rem' style={{ width: 500 }}>
206
+ <SimpleListBox title='Spacious' data={['Item 1', 'Item 2']} />
207
+ <CounterListBox title='Counters' data={[['1', 'First']]} badgeColor='#3b82f6' />
208
+ </ListContentContainer>
209
+ </div>
210
+ </div>
211
+ ),
212
+ };
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import './ListContentContainer.css';
3
+
4
+ export type ListContentContainerProps = {
5
+ className?: string;
6
+ style?: React.CSSProperties;
7
+ children?: React.ReactNode; // normally SimpleListBox/CounterListBox/TrendListBox
8
+ gap?: string;
9
+ background?: string;
10
+ };
11
+
12
+ export const ListContentContainer: React.FC<ListContentContainerProps> = ({
13
+ className = '',
14
+ style = {},
15
+ children,
16
+ gap = '1rem',
17
+ background = '#D9EEF5',
18
+ }) => {
19
+ return (
20
+ <div
21
+ className={`lcc-root ${className}`}
22
+ style={{
23
+ background,
24
+ ...style,
25
+ ['--lcc-gap' as any]: gap,
26
+ }}
27
+ >
28
+ {React.Children.map(children, (child) => (
29
+ <div className='lcc-cell'>{child}</div>
30
+ ))}
31
+ </div>
32
+ );
33
+ };
@@ -0,0 +1,3 @@
1
+ export * from './ListBox';
2
+ export * from './FlexRowContainer';
3
+ export * from './ListContentContainer';