@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,285 @@
1
+ /* Conteneur flex qui wrap */
2
+ .grid-container {
3
+ display: flex;
4
+ flex-wrap: wrap;
5
+ gap: var(--gap, 0px);
6
+ align-items: flex-start;
7
+ box-sizing: border-box;
8
+ }
9
+
10
+ /* Chaque item */
11
+ .grid-item {
12
+ box-sizing: border-box;
13
+ cursor: grab;
14
+ transition:
15
+ transform 0.2s ease,
16
+ box-shadow 0.2s ease,
17
+ opacity 0.2s ease;
18
+ user-select: none;
19
+ padding: 0;
20
+ }
21
+
22
+ .grid-item-grabbing:active {
23
+ cursor: grabbing;
24
+ opacity: 0.6;
25
+ transform: scale(1.02);
26
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.12);
27
+ }
28
+
29
+ /* ===== XS (mobile par défaut) ===== */
30
+ .grid-xs-1 {
31
+ flex: 0 0 calc(8.3333% - (var(--gap) * 11 / 12));
32
+ max-width: calc(8.3333% - (var(--gap) * 11 / 12));
33
+ }
34
+ .grid-xs-2 {
35
+ flex: 0 0 calc(16.6666% - (var(--gap) * 10 / 12));
36
+ max-width: calc(16.6666% - (var(--gap) * 10 / 12));
37
+ }
38
+ .grid-xs-3 {
39
+ flex: 0 0 calc(25% - (var(--gap) * 9 / 12));
40
+ max-width: calc(25% - (var(--gap) * 9 / 12));
41
+ }
42
+ .grid-xs-4 {
43
+ flex: 0 0 calc(33.3333% - (var(--gap) * 8 / 12));
44
+ max-width: calc(33.3333% - (var(--gap) * 8 / 12));
45
+ }
46
+ .grid-xs-5 {
47
+ flex: 0 0 calc(41.6666% - (var(--gap) * 7 / 12));
48
+ max-width: calc(41.6666% - (var(--gap) * 7 / 12));
49
+ }
50
+ .grid-xs-6 {
51
+ flex: 0 0 calc(50% - (var(--gap) * 6 / 12));
52
+ max-width: calc(50% - (var(--gap) * 6 / 12));
53
+ }
54
+ .grid-xs-7 {
55
+ flex: 0 0 calc(58.3333% - (var(--gap) * 5 / 12));
56
+ max-width: calc(58.3333% - (var(--gap) * 5 / 12));
57
+ }
58
+ .grid-xs-8 {
59
+ flex: 0 0 calc(66.6666% - (var(--gap) * 4 / 12));
60
+ max-width: calc(66.6666% - (var(--gap) * 4 / 12));
61
+ }
62
+ .grid-xs-9 {
63
+ flex: 0 0 calc(75% - (var(--gap) * 3 / 12));
64
+ max-width: calc(75% - (var(--gap) * 3 / 12));
65
+ }
66
+ .grid-xs-10 {
67
+ flex: 0 0 calc(83.3333% - (var(--gap) * 2 / 12));
68
+ max-width: calc(83.3333% - (var(--gap) * 2 / 12));
69
+ }
70
+ .grid-xs-11 {
71
+ flex: 0 0 calc(91.6666% - (var(--gap) * 1 / 12));
72
+ max-width: calc(91.6666% - (var(--gap) * 1 / 12));
73
+ }
74
+ .grid-xs-12 {
75
+ flex: 0 0 100%;
76
+ max-width: 100%;
77
+ }
78
+
79
+ /* ===== SM ≥ 600px ===== */
80
+ @media (min-width: 600px) {
81
+ .grid-sm-1 {
82
+ flex: 0 0 calc(8.3333% - (var(--gap) * 11 / 12));
83
+ max-width: calc(8.3333% - (var(--gap) * 11 / 12));
84
+ }
85
+ .grid-sm-2 {
86
+ flex: 0 0 calc(16.6666% - (var(--gap) * 10 / 12));
87
+ max-width: calc(16.6666% - (var(--gap) * 10 / 12));
88
+ }
89
+ .grid-sm-3 {
90
+ flex: 0 0 calc(25% - (var(--gap) * 9 / 12));
91
+ max-width: calc(25% - (var(--gap) * 9 / 12));
92
+ }
93
+ .grid-sm-4 {
94
+ flex: 0 0 calc(33.3333% - (var(--gap) * 8 / 12));
95
+ max-width: calc(33.3333% - (var(--gap) * 8 / 12));
96
+ }
97
+ .grid-sm-5 {
98
+ flex: 0 0 calc(41.6666% - (var(--gap) * 7 / 12));
99
+ max-width: calc(41.6666% - (var(--gap) * 7 / 12));
100
+ }
101
+ .grid-sm-6 {
102
+ flex: 0 0 calc(50% - (var(--gap) * 6 / 12));
103
+ max-width: calc(50% - (var(--gap) * 6 / 12));
104
+ }
105
+ .grid-sm-7 {
106
+ flex: 0 0 calc(58.3333% - (var(--gap) * 5 / 12));
107
+ max-width: calc(58.3333% - (var(--gap) * 5 / 12));
108
+ }
109
+ .grid-sm-8 {
110
+ flex: 0 0 calc(66.6666% - (var(--gap) * 4 / 12));
111
+ max-width: calc(66.6666% - (var(--gap) * 4 / 12));
112
+ }
113
+ .grid-sm-9 {
114
+ flex: 0 0 calc(75% - (var(--gap) * 3 / 12));
115
+ max-width: calc(75% - (var(--gap) * 3 / 12));
116
+ }
117
+ .grid-sm-10 {
118
+ flex: 0 0 calc(83.3333% - (var(--gap) * 2 / 12));
119
+ max-width: calc(83.3333% - (var(--gap) * 2 / 12));
120
+ }
121
+ .grid-sm-11 {
122
+ flex: 0 0 calc(91.6666% - (var(--gap) * 1 / 12));
123
+ max-width: calc(91.6666% - (var(--gap) * 1 / 12));
124
+ }
125
+ .grid-sm-12 {
126
+ flex: 0 0 100%;
127
+ max-width: 100%;
128
+ }
129
+ }
130
+
131
+ /* ===== MD ≥ 900px ===== */
132
+ @media (min-width: 900px) {
133
+ .grid-md-1 {
134
+ flex: 0 0 calc(8.3333% - (var(--gap) * 11 / 12));
135
+ max-width: calc(8.3333% - (var(--gap) * 11 / 12));
136
+ }
137
+ .grid-md-2 {
138
+ flex: 0 0 calc(16.6666% - (var(--gap) * 10 / 12));
139
+ max-width: calc(16.6666% - (var(--gap) * 10 / 12));
140
+ }
141
+ .grid-md-3 {
142
+ flex: 0 0 calc(25% - (var(--gap) * 9 / 12));
143
+ max-width: calc(25% - (var(--gap) * 9 / 12));
144
+ }
145
+ .grid-md-4 {
146
+ flex: 0 0 calc(33.3333% - (var(--gap) * 8 / 12));
147
+ max-width: calc(33.3333% - (var(--gap) * 8 / 12));
148
+ }
149
+ .grid-md-5 {
150
+ flex: 0 0 calc(41.6666% - (var(--gap) * 7 / 12));
151
+ max-width: calc(41.6666% - (var(--gap) * 7 / 12));
152
+ }
153
+ .grid-md-6 {
154
+ flex: 0 0 calc(50% - (var(--gap) * 6 / 12));
155
+ max-width: calc(50% - (var(--gap) * 6 / 12));
156
+ }
157
+ .grid-md-7 {
158
+ flex: 0 0 calc(58.3333% - (var(--gap) * 5 / 12));
159
+ max-width: calc(58.3333% - (var(--gap) * 5 / 12));
160
+ }
161
+ .grid-md-8 {
162
+ flex: 0 0 calc(66.6666% - (var(--gap) * 4 / 12));
163
+ max-width: calc(66.6666% - (var(--gap) * 4 / 12));
164
+ }
165
+ .grid-md-9 {
166
+ flex: 0 0 calc(75% - (var(--gap) * 3 / 12));
167
+ max-width: calc(75% - (var(--gap) * 3 / 12));
168
+ }
169
+ .grid-md-10 {
170
+ flex: 0 0 calc(83.3333% - (var(--gap) * 2 / 12));
171
+ max-width: calc(83.3333% - (var(--gap) * 2 / 12));
172
+ }
173
+ .grid-md-11 {
174
+ flex: 0 0 calc(91.6666% - (var(--gap) * 1 / 12));
175
+ max-width: calc(91.6666% - (var(--gap) * 1 / 12));
176
+ }
177
+ .grid-md-12 {
178
+ flex: 0 0 100%;
179
+ max-width: 100%;
180
+ }
181
+ }
182
+
183
+ /* ===== LG ≥ 1200px ===== */
184
+ @media (min-width: 1200px) {
185
+ .grid-lg-1 {
186
+ flex: 0 0 calc(8.3333% - (var(--gap) * 11 / 12));
187
+ max-width: calc(8.3333% - (var(--gap) * 11 / 12));
188
+ }
189
+ .grid-lg-2 {
190
+ flex: 0 0 calc(16.6666% - (var(--gap) * 10 / 12));
191
+ max-width: calc(16.6666% - (var(--gap) * 10 / 12));
192
+ }
193
+ .grid-lg-3 {
194
+ flex: 0 0 calc(25% - (var(--gap) * 9 / 12));
195
+ max-width: calc(25% - (var(--gap) * 9 / 12));
196
+ }
197
+ .grid-lg-4 {
198
+ flex: 0 0 calc(33.3333% - (var(--gap) * 8 / 12));
199
+ max-width: calc(33.3333% - (var(--gap) * 8 / 12));
200
+ }
201
+ .grid-lg-5 {
202
+ flex: 0 0 calc(41.6666% - (var(--gap) * 7 / 12));
203
+ max-width: calc(41.6666% - (var(--gap) * 7 / 12));
204
+ }
205
+ .grid-lg-6 {
206
+ flex: 0 0 calc(50% - (var(--gap) * 6 / 12));
207
+ max-width: calc(50% - (var(--gap) * 6 / 12));
208
+ }
209
+ .grid-lg-7 {
210
+ flex: 0 0 calc(58.3333% - (var(--gap) * 5 / 12));
211
+ max-width: calc(58.3333% - (var(--gap) * 5 / 12));
212
+ }
213
+ .grid-lg-8 {
214
+ flex: 0 0 calc(66.6666% - (var(--gap) * 4 / 12));
215
+ max-width: calc(66.6666% - (var(--gap) * 4 / 12));
216
+ }
217
+ .grid-lg-9 {
218
+ flex: 0 0 calc(75% - (var(--gap) * 3 / 12));
219
+ max-width: calc(75% - (var(--gap) * 3 / 12));
220
+ }
221
+ .grid-lg-10 {
222
+ flex: 0 0 calc(83.3333% - (var(--gap) * 2 / 12));
223
+ max-width: calc(83.3333% - (var(--gap) * 2 / 12));
224
+ }
225
+ .grid-lg-11 {
226
+ flex: 0 0 calc(91.6666% - (var(--gap) * 1 / 12));
227
+ max-width: calc(91.6666% - (var(--gap) * 1 / 12));
228
+ }
229
+ .grid-lg-12 {
230
+ flex: 0 0 100%;
231
+ max-width: 100%;
232
+ }
233
+ }
234
+
235
+ /* ===== XL ≥ 1536px ===== */
236
+ @media (min-width: 1536px) {
237
+ .grid-xl-1 {
238
+ flex: 0 0 calc(8.3333% - (var(--gap) * 11 / 12));
239
+ max-width: calc(8.3333% - (var(--gap) * 11 / 12));
240
+ }
241
+ .grid-xl-2 {
242
+ flex: 0 0 calc(16.6666% - (var(--gap) * 10 / 12));
243
+ max-width: calc(16.6666% - (var(--gap) * 10 / 12));
244
+ }
245
+ .grid-xl-3 {
246
+ flex: 0 0 calc(25% - (var(--gap) * 9 / 12));
247
+ max-width: calc(25% - (var(--gap) * 9 / 12));
248
+ }
249
+ .grid-xl-4 {
250
+ flex: 0 0 calc(33.3333% - (var(--gap) * 8 / 12));
251
+ max-width: calc(33.3333% - (var(--gap) * 8 / 12));
252
+ }
253
+ .grid-xl-5 {
254
+ flex: 0 0 calc(41.6666% - (var(--gap) * 7 / 12));
255
+ max-width: calc(41.6666% - (var(--gap) * 7 / 12));
256
+ }
257
+ .grid-xl-6 {
258
+ flex: 0 0 calc(50% - (var(--gap) * 6 / 12));
259
+ max-width: calc(50% - (var(--gap) * 6 / 12));
260
+ }
261
+ .grid-xl-7 {
262
+ flex: 0 0 calc(58.3333% - (var(--gap) * 5 / 12));
263
+ max-width: calc(58.3333% - (var(--gap) * 5 / 12));
264
+ }
265
+ .grid-xl-8 {
266
+ flex: 0 0 calc(66.6666% - (var(--gap) * 4 / 12));
267
+ max-width: calc(66.6666% - (var(--gap) * 4 / 12));
268
+ }
269
+ .grid-xl-9 {
270
+ flex: 0 0 calc(75% - (var(--gap) * 3 / 12));
271
+ max-width: calc(75% - (var(--gap) * 3 / 12));
272
+ }
273
+ .grid-xl-10 {
274
+ flex: 0 0 calc(83.3333% - (var(--gap) * 2 / 12));
275
+ max-width: calc(83.3333% - (var(--gap) * 2 / 12));
276
+ }
277
+ .grid-xl-11 {
278
+ flex: 0 0 calc(91.6666% - (var(--gap) * 1 / 12));
279
+ max-width: calc(91.6666% - (var(--gap) * 1 / 12));
280
+ }
281
+ .grid-xl-12 {
282
+ flex: 0 0 100%;
283
+ max-width: 100%;
284
+ }
285
+ }
@@ -0,0 +1,2 @@
1
+ export { default as Grid } from './Grid';
2
+ export * from './Grid';
@@ -0,0 +1,164 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Header } from './Header';
3
+ import { NavProvider } from '../NavBar/NavContext';
4
+
5
+ // Mock data for dropdown menu - corrigé avec les bons types
6
+ const mockDropdownItems = {
7
+ categories: [
8
+ {
9
+ title: 'Account',
10
+ items: [
11
+ { label: 'Profile', href: '/profile', type: 'link' as const },
12
+ { label: 'Settings', href: '/settings', type: 'link' as const },
13
+ { label: 'Logout', type: 'button' as const },
14
+ ],
15
+ },
16
+ {
17
+ title: 'Support',
18
+ items: [
19
+ { label: 'Help Center', href: '/help', type: 'link' as const },
20
+ { label: 'Contact Us', href: '/contact', type: 'link' as const },
21
+ { label: 'Feedback', type: 'button' as const },
22
+ ],
23
+ },
24
+ ],
25
+ buttonContent: 'Menu',
26
+ };
27
+
28
+ const meta = {
29
+ title: 'Components/Header',
30
+ component: Header,
31
+ parameters: {
32
+ layout: 'fullscreen',
33
+ },
34
+ tags: ['autodocs'],
35
+ argTypes: {
36
+ logoPath: {
37
+ control: 'text',
38
+ description: 'Path to the logo image',
39
+ table: {
40
+ category: 'Content',
41
+ },
42
+ },
43
+ navItems: {
44
+ control: 'object',
45
+ description: 'Array of navigation items for the main navigation',
46
+ table: {
47
+ category: 'Content',
48
+ },
49
+ },
50
+ headerBg: {
51
+ control: 'color',
52
+ description: 'Background color for the header',
53
+ table: {
54
+ category: 'Appearance',
55
+ },
56
+ },
57
+ highlightColor: {
58
+ control: 'color',
59
+ description: 'Highlight color for active navigation items',
60
+ table: {
61
+ category: 'Appearance',
62
+ },
63
+ },
64
+ onNavClick: {
65
+ action: 'navItemClicked',
66
+ description: 'Callback function when a navigation item is clicked',
67
+ table: {
68
+ category: 'Events',
69
+ },
70
+ },
71
+ dropdownItems: {
72
+ control: 'object',
73
+ description: 'Items for the dropdown menu',
74
+ table: {
75
+ category: 'Content',
76
+ },
77
+ },
78
+ },
79
+ args: {
80
+ logoPath: '/logo.png',
81
+ navItems: [
82
+ { id: 'home', label: 'Home' },
83
+ { id: 'about', label: 'About' },
84
+ { id: 'services', label: 'Services' },
85
+ { id: 'contact', label: 'Contact' },
86
+ ],
87
+ highlightColor: '#1387C8',
88
+ onNavClick: (item: string) => console.log(`Clicked on ${item}`),
89
+ },
90
+ decorators: [
91
+ (Story) => (
92
+ <NavProvider>
93
+ <Story />
94
+ </NavProvider>
95
+ ),
96
+ ],
97
+ } satisfies Meta<typeof Header>;
98
+
99
+ export default meta;
100
+ type Story = StoryObj<typeof meta>;
101
+
102
+ export const Default: Story = {
103
+ parameters: {
104
+ docs: {
105
+ description: {
106
+ story: 'Default header with logo and main navigation',
107
+ },
108
+ },
109
+ },
110
+ };
111
+
112
+ export const WithDropdownMenu: Story = {
113
+ args: {
114
+ dropdownItems: mockDropdownItems,
115
+ },
116
+ parameters: {
117
+ docs: {
118
+ description: {
119
+ story: 'Header with a dropdown menu on the right side',
120
+ },
121
+ },
122
+ },
123
+ };
124
+
125
+ export const WithCustomBackground: Story = {
126
+ args: {
127
+ headerBg: '#2c3e50',
128
+ },
129
+ parameters: {
130
+ docs: {
131
+ description: {
132
+ story: 'Header with custom background color',
133
+ },
134
+ },
135
+ },
136
+ };
137
+
138
+ export const CompleteHeader: Story = {
139
+ args: {
140
+ dropdownItems: mockDropdownItems,
141
+ headerBg: '#f8f9fa',
142
+ },
143
+ parameters: {
144
+ docs: {
145
+ description: {
146
+ story:
147
+ 'Complete header with all elements: logo, navigation, dropdown menu, and sub-navigation',
148
+ },
149
+ },
150
+ },
151
+ };
152
+
153
+ export const MobileView: Story = {
154
+ parameters: {
155
+ viewport: {
156
+ defaultViewport: 'mobile1',
157
+ },
158
+ docs: {
159
+ description: {
160
+ story: 'Header in mobile view with responsive navigation',
161
+ },
162
+ },
163
+ },
164
+ };
@@ -0,0 +1,59 @@
1
+ import React from 'react';
2
+ import './header.css';
3
+ import { Logo } from '../Logo/Logo';
4
+ import { NavBar } from '../NavBar/NavBar';
5
+ import type { NavItemType } from '../NavItem/NavItem';
6
+ import DropdownMenu from '../DropdownMenu/DropdownMenu';
7
+ import type { DropdownMenuProps } from '../DropdownMenu/DropdownMenu';
8
+ import ThemeSwitcherButton from '../theme/ThemeSwitcherButton';
9
+ import { DraggableSwitcherButton } from '../DraggableSwitcher';
10
+
11
+ export type HeaderProps = {
12
+ logoPath?: string;
13
+ navItems: NavItemType[];
14
+ activeNav?: string;
15
+ onNavClick?: (id: string) => void;
16
+ headerBg?: string;
17
+ highlightColor?: string;
18
+ dropdownItems?: DropdownMenuProps;
19
+ moduleConfig?: Record<string, boolean>;
20
+ };
21
+
22
+ export const Header: React.FC<HeaderProps> = ({
23
+ logoPath,
24
+ navItems,
25
+ onNavClick,
26
+ dropdownItems,
27
+ headerBg,
28
+ highlightColor = '#1387C8',
29
+ moduleConfig = {},
30
+ }) => {
31
+ return (
32
+ <header className='header' style={{ backgroundColor: headerBg }}>
33
+ <div className='header-container'>
34
+ {/* Gauche : logo + nav */}
35
+ <div className='header-left'>
36
+ <a href='/'>
37
+ <Logo imagePath={logoPath} />
38
+ </a>
39
+ <NavBar
40
+ moduleConfig={moduleConfig}
41
+ items={navItems}
42
+ onNavClick={onNavClick}
43
+ highlightColor={highlightColor}
44
+ />
45
+ </div>
46
+
47
+ {/* Droite : menu */}
48
+ <div className='header-right'>
49
+ <DraggableSwitcherButton />
50
+ <ThemeSwitcherButton />
51
+ <DropdownMenu
52
+ categories={dropdownItems?.categories}
53
+ buttonContent={dropdownItems?.buttonContent}
54
+ />
55
+ </div>
56
+ </div>
57
+ </header>
58
+ );
59
+ };
@@ -0,0 +1,31 @@
1
+ .header {
2
+ background: var(--headerBg);
3
+ border-bottom: 1px solid rgba(0, 0, 0, 0.06);
4
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.04);
5
+ max-width: 100vw;
6
+ font-size: var(--text-small);
7
+ }
8
+
9
+ /* container centré */
10
+ .header-container {
11
+ margin: 0 auto;
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: space-between;
15
+ padding: 15px 17px;
16
+ gap: 20px;
17
+ }
18
+
19
+ /* gauche : logo + nav */
20
+ .header-left {
21
+ display: flex;
22
+ align-items: center;
23
+ gap: 22px;
24
+ }
25
+
26
+ /* droite : menu bouton */
27
+ .header-right {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: 12px;
31
+ }
@@ -0,0 +1 @@
1
+ export * from './Header';
@@ -0,0 +1,135 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { IconText } from './IconText';
3
+
4
+ const meta = {
5
+ title: 'Components/IconText',
6
+ component: IconText,
7
+ parameters: {
8
+ layout: 'centered',
9
+ },
10
+ tags: ['autodocs'],
11
+ argTypes: {
12
+ icon: {
13
+ control: 'select',
14
+ options: ['Home', 'User', 'Settings', 'Search', 'Bell', 'Mail'],
15
+ description: 'Lucide icon name',
16
+ table: {
17
+ category: 'Content',
18
+ },
19
+ },
20
+ text: {
21
+ control: 'text',
22
+ description: 'Text to display alongside the icon',
23
+ table: {
24
+ category: 'Content',
25
+ },
26
+ },
27
+ size: {
28
+ control: { type: 'number', min: 8, max: 32, step: 2 },
29
+ description: 'Icon size in pixels',
30
+ table: {
31
+ category: 'Appearance',
32
+ },
33
+ },
34
+ color: {
35
+ control: 'color',
36
+ description: 'Color for both icon and text',
37
+ table: {
38
+ category: 'Appearance',
39
+ },
40
+ },
41
+ className: {
42
+ control: 'text',
43
+ description: 'Additional CSS classes',
44
+ table: {
45
+ category: 'Styling',
46
+ },
47
+ },
48
+ active: {
49
+ control: 'boolean',
50
+ description: 'Whether the component is in active state',
51
+ table: {
52
+ category: 'State',
53
+ },
54
+ },
55
+ href: {
56
+ control: 'text',
57
+ description: 'URL if the component should render as a link',
58
+ table: {
59
+ category: 'Behavior',
60
+ },
61
+ },
62
+ },
63
+ args: {
64
+ text: 'Menu Item',
65
+ size: 16,
66
+ },
67
+ } satisfies Meta<typeof IconText>;
68
+
69
+ export default meta;
70
+ type Story = StoryObj<typeof meta>;
71
+
72
+ export const Default: Story = {
73
+ args: {
74
+ icon: 'Home',
75
+ text: 'Home',
76
+ },
77
+ };
78
+
79
+ export const WithCustomColor: Story = {
80
+ args: {
81
+ icon: 'User',
82
+ text: 'Profile',
83
+ color: '#3b82f6',
84
+ },
85
+ parameters: {
86
+ docs: {
87
+ description: {
88
+ story: 'IconText with custom color applied to both icon and text',
89
+ },
90
+ },
91
+ },
92
+ };
93
+
94
+ export const ActiveState: Story = {
95
+ args: {
96
+ icon: 'Settings',
97
+ text: 'Settings',
98
+ active: true,
99
+ },
100
+ parameters: {
101
+ docs: {
102
+ description: {
103
+ story: 'IconText in active state with highlighted appearance',
104
+ },
105
+ },
106
+ },
107
+ };
108
+
109
+ export const AsLink: Story = {
110
+ args: {
111
+ icon: 'Mail',
112
+ text: 'Contact',
113
+ href: '/contact',
114
+ },
115
+ parameters: {
116
+ docs: {
117
+ description: {
118
+ story: 'IconText rendered as a link with href attribute',
119
+ },
120
+ },
121
+ },
122
+ };
123
+
124
+ export const WithoutIcon: Story = {
125
+ args: {
126
+ text: 'Text Only',
127
+ },
128
+ parameters: {
129
+ docs: {
130
+ description: {
131
+ story: 'IconText without an icon (text only)',
132
+ },
133
+ },
134
+ },
135
+ };