@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,276 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { TrendItem } from './TrendItem';
3
+
4
+ const meta = {
5
+ title: 'Components/TrendItem',
6
+ component: TrendItem,
7
+ parameters: {
8
+ layout: 'padded',
9
+ docs: {
10
+ description: {
11
+ component:
12
+ 'A component for displaying trend information with title, subtitle, and value text.',
13
+ },
14
+ },
15
+ },
16
+ tags: ['autodocs'],
17
+ argTypes: {
18
+ title: {
19
+ control: 'text',
20
+ description: 'Main title text',
21
+ table: {
22
+ category: 'Content',
23
+ },
24
+ },
25
+ subtitle: {
26
+ control: 'text',
27
+ description: 'Subtitle text (optional)',
28
+ table: {
29
+ category: 'Content',
30
+ },
31
+ },
32
+ text: {
33
+ control: 'text',
34
+ description: 'Value text displayed on the right side',
35
+ table: {
36
+ category: 'Content',
37
+ },
38
+ },
39
+ background: {
40
+ control: 'color',
41
+ description: 'Background color of the component',
42
+ table: {
43
+ category: 'Styling',
44
+ defaultValue: { summary: '#f9f9f9' },
45
+ },
46
+ },
47
+ titleStyle: {
48
+ control: 'object',
49
+ description: 'Custom styles for the title',
50
+ table: {
51
+ category: 'Styling',
52
+ },
53
+ },
54
+ subtitleStyle: {
55
+ control: 'object',
56
+ description: 'Custom styles for the subtitle',
57
+ table: {
58
+ category: 'Styling',
59
+ },
60
+ },
61
+ textStyle: {
62
+ control: 'object',
63
+ description: 'Custom styles for the value text',
64
+ table: {
65
+ category: 'Styling',
66
+ },
67
+ },
68
+ itemStyle: {
69
+ control: 'object',
70
+ description: 'Custom styles for the entire component container',
71
+ table: {
72
+ category: 'Styling',
73
+ },
74
+ },
75
+ },
76
+ args: {
77
+ title: 'Revenue Growth',
78
+ subtitle: 'Quarterly',
79
+ text: '+15.2%',
80
+ background: '#f9f9f9',
81
+ },
82
+ } satisfies Meta<typeof TrendItem>;
83
+
84
+ export default meta;
85
+ type Story = StoryObj<typeof meta>;
86
+
87
+ export const Default: Story = {
88
+ parameters: {
89
+ docs: {
90
+ description: {
91
+ story: 'Default TrendItem with title, subtitle, and value text',
92
+ },
93
+ },
94
+ },
95
+ };
96
+
97
+ export const WithoutSubtitle: Story = {
98
+ args: {
99
+ subtitle: undefined,
100
+ },
101
+ parameters: {
102
+ docs: {
103
+ description: {
104
+ story: 'TrendItem without a subtitle',
105
+ },
106
+ },
107
+ },
108
+ };
109
+
110
+ export const ColoredBackground: Story = {
111
+ args: {
112
+ background: '#e8f5e9',
113
+ itemStyle: { borderRadius: '12px', padding: '16px' },
114
+ },
115
+ parameters: {
116
+ docs: {
117
+ description: {
118
+ story: 'TrendItem with custom background color and container styling',
119
+ },
120
+ },
121
+ },
122
+ };
123
+
124
+ export const PositiveTrend: Story = {
125
+ args: {
126
+ title: 'User Growth',
127
+ subtitle: 'Monthly',
128
+ text: '+23.5%',
129
+ textStyle: { color: '#4CAF50', fontWeight: 'bold' },
130
+ background: '#f1f8e9',
131
+ },
132
+ parameters: {
133
+ docs: {
134
+ description: {
135
+ story: 'TrendItem with positive value styling and light green background',
136
+ },
137
+ },
138
+ },
139
+ };
140
+
141
+ export const NegativeTrend: Story = {
142
+ args: {
143
+ title: 'Bounce Rate',
144
+ subtitle: 'Weekly',
145
+ text: '-8.3%',
146
+ textStyle: { color: '#F44336', fontWeight: 'bold' },
147
+ background: '#ffebee',
148
+ },
149
+ parameters: {
150
+ docs: {
151
+ description: {
152
+ story: 'TrendItem with negative value styling and light red background',
153
+ },
154
+ },
155
+ },
156
+ };
157
+
158
+ export const CustomStyles: Story = {
159
+ args: {
160
+ title: 'Custom Styled',
161
+ subtitle: 'Example',
162
+ text: 'Value',
163
+ background: '#f3e5f5',
164
+ itemStyle: {
165
+ borderRadius: '8px',
166
+ padding: '12px 16px',
167
+ border: '2px solid #9C27B0',
168
+ },
169
+ titleStyle: {
170
+ color: '#7B1FA2',
171
+ fontSize: '1.2rem',
172
+ fontWeight: 'bold',
173
+ },
174
+ subtitleStyle: {
175
+ color: '#9C27B0',
176
+ fontStyle: 'italic',
177
+ },
178
+ textStyle: {
179
+ color: '#2196F3',
180
+ fontSize: '1.3rem',
181
+ fontWeight: 'bold',
182
+ },
183
+ },
184
+ parameters: {
185
+ docs: {
186
+ description: {
187
+ story: 'TrendItem with custom styling for all elements including background and container',
188
+ },
189
+ },
190
+ },
191
+ };
192
+
193
+ export const FinancialData: Story = {
194
+ args: {
195
+ title: 'Stock Price',
196
+ subtitle: 'AAPL',
197
+ text: '$175.34',
198
+ background: '#e3f2fd',
199
+ textStyle: { color: '#2E7D32', fontWeight: 'bold' },
200
+ itemStyle: { borderRadius: '10px' },
201
+ },
202
+ parameters: {
203
+ docs: {
204
+ description: {
205
+ story: 'TrendItem displaying financial data with blue background',
206
+ },
207
+ },
208
+ },
209
+ };
210
+
211
+ export const PerformanceMetric: Story = {
212
+ args: {
213
+ title: 'Load Time',
214
+ subtitle: 'Average',
215
+ text: '1.2s',
216
+ background: '#fff3e0',
217
+ textStyle: { color: '#FF9800', fontWeight: 'bold' },
218
+ },
219
+ parameters: {
220
+ docs: {
221
+ description: {
222
+ story: 'TrendItem displaying performance metrics with orange background',
223
+ },
224
+ },
225
+ },
226
+ };
227
+
228
+ export const Compact: Story = {
229
+ args: {
230
+ title: 'Compact',
231
+ subtitle: undefined,
232
+ text: '42',
233
+ background: '#f5f5f5',
234
+ itemStyle: { padding: '8px' },
235
+ titleStyle: { fontSize: '0.9rem' },
236
+ textStyle: { fontSize: '0.9rem' },
237
+ },
238
+ parameters: {
239
+ docs: {
240
+ description: {
241
+ story: 'Compact version of TrendItem without subtitle and minimal padding',
242
+ },
243
+ },
244
+ },
245
+ };
246
+
247
+ export const WithLongText: Story = {
248
+ args: {
249
+ title: 'This is a very long title that might wrap',
250
+ subtitle: 'A lengthy subtitle that provides additional context',
251
+ text: 'An exceptionally long value that might need truncation',
252
+ background: '#f0f0f0',
253
+ itemStyle: { padding: '16px' },
254
+ },
255
+ parameters: {
256
+ docs: {
257
+ description: {
258
+ story: 'TrendItem with long text content to test text wrapping and truncation',
259
+ },
260
+ },
261
+ },
262
+ };
263
+
264
+ export const TransparentBackground: Story = {
265
+ args: {
266
+ background: 'transparent',
267
+ itemStyle: { border: '1px solid #e0e0e0' },
268
+ },
269
+ parameters: {
270
+ docs: {
271
+ description: {
272
+ story: 'TrendItem with transparent background and border',
273
+ },
274
+ },
275
+ },
276
+ };
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+ import './TrendItem.css';
3
+
4
+ export type TrendItemProps = {
5
+ title: string;
6
+ subtitle?: string;
7
+ text: string;
8
+
9
+ background?: string;
10
+ titleStyle?: React.CSSProperties;
11
+ subtitleStyle?: React.CSSProperties;
12
+ textStyle?: React.CSSProperties;
13
+ itemStyle?: React.CSSProperties;
14
+ };
15
+
16
+ export const TrendItem: React.FC<TrendItemProps> = ({
17
+ title,
18
+ subtitle,
19
+ text,
20
+ background = '#f9f9f9',
21
+ titleStyle,
22
+ subtitleStyle,
23
+ textStyle,
24
+ itemStyle,
25
+ }) => {
26
+ const [leftPart, rightPart] = text ? text.split('/') : [];
27
+ return (
28
+ <div className='trend-item' style={{ background, ...itemStyle }}>
29
+ <div className='trend-texts'>
30
+ <span className='trend-title' style={titleStyle}>
31
+ {title}
32
+ </span>
33
+ {subtitle && (
34
+ <span className='trend-subtitle' style={subtitleStyle}>
35
+ {subtitle}
36
+ </span>
37
+ )}
38
+ </div>
39
+ <div className='trend-right' style={textStyle}>
40
+ <span className='trend-right-left'>{leftPart}</span>
41
+ <span className='trend-right-separator'> / </span>
42
+ <span className='trend-right-right'>{rightPart}</span>
43
+ </div>
44
+ </div>
45
+ );
46
+ };
@@ -0,0 +1 @@
1
+ export * from './TrendItem';
@@ -0,0 +1,16 @@
1
+ .trend-list {
2
+ background: #fff;
3
+ padding: 1rem;
4
+ border-radius: 10px;
5
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
6
+ display: flex;
7
+ flex-direction: column;
8
+ justify-content: space-between;
9
+ }
10
+
11
+ .trend-header {
12
+ font-family: var(--font-primary);
13
+ font-weight: var(--font-bold);
14
+ font-size: var(--text-paragraph);
15
+ margin-bottom: 0.5rem;
16
+ }
@@ -0,0 +1,337 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { TrendList } from './TrendList';
3
+
4
+ const meta = {
5
+ title: 'Components/TrendList',
6
+ component: TrendList,
7
+ parameters: {
8
+ layout: 'padded',
9
+ docs: {
10
+ description: {
11
+ component:
12
+ 'A list component that displays multiple TrendItem components with an optional header, customizable width and gap between items.',
13
+ },
14
+ },
15
+ },
16
+ tags: ['autodocs'],
17
+ argTypes: {
18
+ items: {
19
+ control: 'object',
20
+ description: 'Array of TrendItem props to display in the list',
21
+ table: {
22
+ category: 'Content',
23
+ },
24
+ },
25
+ header: {
26
+ control: 'text',
27
+ description: 'Header text for the list (optional)',
28
+ table: {
29
+ category: 'Content',
30
+ },
31
+ },
32
+ headerStyle: {
33
+ control: 'object',
34
+ description: 'Custom styles for the header',
35
+ table: {
36
+ category: 'Styling',
37
+ },
38
+ },
39
+ listStyle: {
40
+ control: 'object',
41
+ description: 'Custom styles for the entire list container',
42
+ table: {
43
+ category: 'Styling',
44
+ },
45
+ },
46
+ size: {
47
+ control: { type: 'number', min: 200, max: 600, step: 50 },
48
+ description: 'Width of the TrendList container in pixels',
49
+ table: {
50
+ category: 'Dimensions',
51
+ },
52
+ },
53
+ gap: {
54
+ control: { type: 'number', min: 0, max: 30, step: 2 },
55
+ description: 'Gap between TrendItems in pixels',
56
+ table: {
57
+ category: 'Dimensions',
58
+ },
59
+ },
60
+ },
61
+ args: {
62
+ header: 'Tendance',
63
+ size: 300,
64
+ gap: 8,
65
+ items: [
66
+ {
67
+ title: 'Revenue Growth',
68
+ subtitle: 'Quarterly',
69
+ text: '+15.2%',
70
+ background: '#f1f8e9',
71
+ textStyle: { color: '#4CAF50', fontWeight: 'bold' },
72
+ },
73
+ {
74
+ title: 'User Acquisition',
75
+ subtitle: 'Monthly',
76
+ text: '+8.7%',
77
+ background: '#e8f5e9',
78
+ textStyle: { color: '#4CAF50', fontWeight: 'bold' },
79
+ },
80
+ {
81
+ title: 'Bounce Rate',
82
+ subtitle: 'Weekly',
83
+ text: '-3.5%',
84
+ background: '#ffebee',
85
+ textStyle: { color: '#F44336', fontWeight: 'bold' },
86
+ },
87
+ ],
88
+ },
89
+ } satisfies Meta<typeof TrendList>;
90
+
91
+ export default meta;
92
+ type Story = StoryObj<typeof meta>;
93
+
94
+ export const Default: Story = {
95
+ parameters: {
96
+ docs: {
97
+ description: {
98
+ story: 'Default TrendList with multiple TrendItems, a header, and default size and gap',
99
+ },
100
+ },
101
+ },
102
+ };
103
+
104
+ export const CustomSizeAndGap: Story = {
105
+ args: {
106
+ size: 400,
107
+ gap: 16,
108
+ },
109
+ parameters: {
110
+ docs: {
111
+ description: {
112
+ story: 'TrendList with custom width and increased gap between items',
113
+ },
114
+ },
115
+ },
116
+ };
117
+
118
+ export const WithoutHeader: Story = {
119
+ args: {
120
+ header: undefined,
121
+ },
122
+ parameters: {
123
+ docs: {
124
+ description: {
125
+ story: 'TrendList without a header',
126
+ },
127
+ },
128
+ },
129
+ };
130
+
131
+ export const CustomHeader: Story = {
132
+ args: {
133
+ header: 'Performance Metrics',
134
+ headerStyle: {
135
+ color: '#3f51b5',
136
+ fontSize: '1.5rem',
137
+ fontWeight: 'bold',
138
+ marginBottom: '1rem',
139
+ },
140
+ },
141
+ parameters: {
142
+ docs: {
143
+ description: {
144
+ story: 'TrendList with a custom styled header',
145
+ },
146
+ },
147
+ },
148
+ };
149
+
150
+ export const StyledList: Story = {
151
+ args: {
152
+ listStyle: {
153
+ backgroundColor: '#f5f5f5',
154
+ borderRadius: '12px',
155
+ padding: '20px',
156
+ boxShadow: '0 2px 8px rgba(0,0,0,0.1)',
157
+ },
158
+ },
159
+ parameters: {
160
+ docs: {
161
+ description: {
162
+ story: 'TrendList with custom container styling',
163
+ },
164
+ },
165
+ },
166
+ };
167
+
168
+ export const MixedTrends: Story = {
169
+ args: {
170
+ items: [
171
+ {
172
+ title: 'Revenue',
173
+ subtitle: 'This Month',
174
+ text: '+12.5%',
175
+ background: '#f1f8e9',
176
+ textStyle: { color: '#4CAF50', fontWeight: 'bold' },
177
+ },
178
+ {
179
+ title: 'Expenses',
180
+ subtitle: 'This Month',
181
+ text: '+5.2%',
182
+ background: '#ffebee',
183
+ textStyle: { color: '#F44336', fontWeight: 'bold' },
184
+ },
185
+ {
186
+ title: 'Profit',
187
+ subtitle: 'This Month',
188
+ text: '+18.3%',
189
+ background: '#e8f5e9',
190
+ textStyle: { color: '#4CAF50', fontWeight: 'bold' },
191
+ },
192
+ {
193
+ title: 'Customer Satisfaction',
194
+ text: '92%',
195
+ background: '#e3f2fd',
196
+ textStyle: { color: '#2196F3', fontWeight: 'bold' },
197
+ },
198
+ ],
199
+ },
200
+ parameters: {
201
+ docs: {
202
+ description: {
203
+ story: 'TrendList with mixed positive and negative trends',
204
+ },
205
+ },
206
+ },
207
+ };
208
+
209
+ export const SingleItem: Story = {
210
+ args: {
211
+ items: [
212
+ {
213
+ title: 'Overall Performance',
214
+ subtitle: 'Quarterly Review',
215
+ text: 'A+',
216
+ background: '#f3e5f5',
217
+ textStyle: { color: '#9C27B0', fontWeight: 'bold', fontSize: '1.2rem' },
218
+ },
219
+ ],
220
+ },
221
+ parameters: {
222
+ docs: {
223
+ description: {
224
+ story: 'TrendList with only one item',
225
+ },
226
+ },
227
+ },
228
+ };
229
+
230
+ export const FinancialDashboard: Story = {
231
+ args: {
232
+ header: 'Financial Dashboard',
233
+ headerStyle: {
234
+ color: '#2E7D32',
235
+ fontSize: '1.5rem',
236
+ fontWeight: 'bold',
237
+ borderBottom: '2px solid #4CAF50',
238
+ paddingBottom: '0.5rem',
239
+ },
240
+ listStyle: {
241
+ backgroundColor: '#e8f5e9',
242
+ borderRadius: '8px',
243
+ padding: '16px',
244
+ },
245
+ items: [
246
+ {
247
+ title: 'Stock Price',
248
+ subtitle: 'AAPL',
249
+ text: '$175.34',
250
+ background: '#ffffff',
251
+ textStyle: { color: '#2E7D32', fontWeight: 'bold' },
252
+ },
253
+ {
254
+ title: 'Market Cap',
255
+ subtitle: 'Current',
256
+ text: '$2.7T',
257
+ background: '#ffffff',
258
+ textStyle: { color: '#2E7D32', fontWeight: 'bold' },
259
+ },
260
+ {
261
+ title: 'Dividend Yield',
262
+ subtitle: 'Annual',
263
+ text: '0.5%',
264
+ background: '#ffffff',
265
+ textStyle: { color: '#2E7D32', fontWeight: 'bold' },
266
+ },
267
+ ],
268
+ },
269
+ parameters: {
270
+ docs: {
271
+ description: {
272
+ story: 'TrendList styled as a financial dashboard',
273
+ },
274
+ },
275
+ },
276
+ };
277
+
278
+ export const CompactList: Story = {
279
+ args: {
280
+ size: 250,
281
+ gap: 4,
282
+ listStyle: {
283
+ padding: '8px',
284
+ },
285
+ items: [
286
+ {
287
+ title: 'Metric 1',
288
+ text: '42',
289
+ background: '#f5f5f5',
290
+ },
291
+ {
292
+ title: 'Metric 2',
293
+ text: '87',
294
+ background: '#f5f5f5',
295
+ },
296
+ {
297
+ title: 'Metric 3',
298
+ text: '23',
299
+ background: '#f5f5f5',
300
+ },
301
+ ],
302
+ },
303
+ parameters: {
304
+ docs: {
305
+ description: {
306
+ story: 'Compact TrendList with minimal width, gap and padding',
307
+ },
308
+ },
309
+ },
310
+ };
311
+
312
+ export const WideList: Story = {
313
+ args: {
314
+ size: 500,
315
+ gap: 12,
316
+ },
317
+ parameters: {
318
+ docs: {
319
+ description: {
320
+ story: 'Wide TrendList with moderate gap between items',
321
+ },
322
+ },
323
+ },
324
+ };
325
+
326
+ export const NoGap: Story = {
327
+ args: {
328
+ gap: 0,
329
+ },
330
+ parameters: {
331
+ docs: {
332
+ description: {
333
+ story: 'TrendList with no gap between items',
334
+ },
335
+ },
336
+ },
337
+ };
@@ -0,0 +1,45 @@
1
+ import React from 'react';
2
+ import './TrendList.css';
3
+ import { TrendItem } from '../TrendItem/TrendItem';
4
+ import type { TrendItemProps } from '../TrendItem/TrendItem';
5
+
6
+ type TrendListProps = {
7
+ items: TrendItemProps[];
8
+ header?: string;
9
+ headerStyle?: React.CSSProperties;
10
+ listStyle?: React.CSSProperties;
11
+ size?: number | string;
12
+ gap?: number;
13
+ className?: string;
14
+ background?: string; // Nouvelle prop pour le background
15
+ };
16
+
17
+ export const TrendList: React.FC<TrendListProps> = ({
18
+ items,
19
+ header = 'Tendance',
20
+ headerStyle,
21
+ listStyle,
22
+ size,
23
+ gap,
24
+ className = '',
25
+ background = 'var(--color-card-background)',
26
+ }) => {
27
+ return (
28
+ <div
29
+ className={`trend-list ${className}`}
30
+ style={{
31
+ width: size,
32
+ gap: `${gap}px`,
33
+ background,
34
+ ...listStyle,
35
+ }}
36
+ >
37
+ <h3 className='trend-header' style={headerStyle}>
38
+ {header}
39
+ </h3>
40
+ {items.map((item, idx) => (
41
+ <TrendItem key={idx} {...item} />
42
+ ))}
43
+ </div>
44
+ );
45
+ };