mautourco-components 0.2.4 → 0.2.7

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 (297) hide show
  1. package/README.md +190 -190
  2. package/dist/components/atoms/Avatar/Avatar.d.ts +14 -14
  3. package/dist/components/atoms/Avatar/Avatar.js +31 -31
  4. package/dist/components/atoms/Button/Button.css +320 -320
  5. package/dist/components/atoms/Button/Button.d.ts +27 -27
  6. package/dist/components/atoms/Button/Button.js +35 -35
  7. package/dist/components/atoms/Checkbox/Checkbox.d.ts +13 -13
  8. package/dist/components/atoms/Checkbox/Checkbox.js +39 -39
  9. package/dist/components/atoms/Icon/Icon.d.ts +10 -10
  10. package/dist/components/atoms/Icon/Icon.js +123 -123
  11. package/dist/components/atoms/Icon/icons/ArrivalIcon.d.ts +8 -8
  12. package/dist/components/atoms/Icon/icons/ArrivalIcon.js +31 -31
  13. package/dist/components/atoms/Icon/icons/BuildingIcon.d.ts +8 -8
  14. package/dist/components/atoms/Icon/icons/BuildingIcon.js +36 -36
  15. package/dist/components/atoms/Icon/icons/CalendarIcon.d.ts +12 -12
  16. package/dist/components/atoms/Icon/icons/CalendarIcon.js +41 -41
  17. package/dist/components/atoms/Icon/icons/CalendarOutlineIcon.d.ts +8 -8
  18. package/dist/components/atoms/Icon/icons/CalendarOutlineIcon.js +36 -36
  19. package/dist/components/atoms/Icon/icons/CarIcon.d.ts +8 -8
  20. package/dist/components/atoms/Icon/icons/CarIcon.js +30 -30
  21. package/dist/components/atoms/Icon/icons/Check.d.ts +8 -8
  22. package/dist/components/atoms/Icon/icons/Check.js +30 -30
  23. package/dist/components/atoms/Icon/icons/CheckCircleIcon.d.ts +8 -8
  24. package/dist/components/atoms/Icon/icons/CheckCircleIcon.js +30 -30
  25. package/dist/components/atoms/Icon/icons/Chevron.d.ts +9 -9
  26. package/dist/components/atoms/Icon/icons/Chevron.js +54 -54
  27. package/dist/components/atoms/Icon/icons/ChevronDownIcon.d.ts +8 -8
  28. package/dist/components/atoms/Icon/icons/ChevronDownIcon.js +30 -30
  29. package/dist/components/atoms/Icon/icons/Close.d.ts +8 -8
  30. package/dist/components/atoms/Icon/icons/Close.js +30 -30
  31. package/dist/components/atoms/Icon/icons/DeleteIcon.d.ts +8 -8
  32. package/dist/components/atoms/Icon/icons/DeleteIcon.js +30 -30
  33. package/dist/components/atoms/Icon/icons/DepartureIcon.d.ts +8 -8
  34. package/dist/components/atoms/Icon/icons/DepartureIcon.js +30 -30
  35. package/dist/components/atoms/Icon/icons/EyeIcon.d.ts +8 -8
  36. package/dist/components/atoms/Icon/icons/EyeIcon.js +30 -30
  37. package/dist/components/atoms/Icon/icons/FacebookIcon.d.ts +8 -8
  38. package/dist/components/atoms/Icon/icons/FacebookIcon.js +36 -36
  39. package/dist/components/atoms/Icon/icons/HomeIcon.d.ts +8 -8
  40. package/dist/components/atoms/Icon/icons/HomeIcon.js +25 -25
  41. package/dist/components/atoms/Icon/icons/InfoIcon.d.ts +8 -8
  42. package/dist/components/atoms/Icon/icons/InfoIcon.js +30 -30
  43. package/dist/components/atoms/Icon/icons/LinkedInIcon.d.ts +8 -8
  44. package/dist/components/atoms/Icon/icons/LinkedInIcon.js +36 -36
  45. package/dist/components/atoms/Icon/icons/MapPinIcon.d.ts +8 -8
  46. package/dist/components/atoms/Icon/icons/MapPinIcon.js +30 -30
  47. package/dist/components/atoms/Icon/icons/MautoucoLogo.d.ts +8 -8
  48. package/dist/components/atoms/Icon/icons/MautoucoLogo.js +37 -37
  49. package/dist/components/atoms/Icon/icons/MenuIcon.d.ts +8 -8
  50. package/dist/components/atoms/Icon/icons/MenuIcon.js +37 -37
  51. package/dist/components/atoms/Icon/icons/MinusIcon.d.ts +8 -8
  52. package/dist/components/atoms/Icon/icons/MinusIcon.js +25 -25
  53. package/dist/components/atoms/Icon/icons/MoreIcon.d.ts +8 -8
  54. package/dist/components/atoms/Icon/icons/MoreIcon.js +30 -30
  55. package/dist/components/atoms/Icon/icons/PlaneIcon.d.ts +8 -8
  56. package/dist/components/atoms/Icon/icons/PlaneIcon.js +36 -36
  57. package/dist/components/atoms/Icon/icons/PlusIcon.d.ts +8 -8
  58. package/dist/components/atoms/Icon/icons/PlusIcon.js +25 -25
  59. package/dist/components/atoms/Icon/icons/Search.d.ts +8 -8
  60. package/dist/components/atoms/Icon/icons/Search.js +30 -30
  61. package/dist/components/atoms/Icon/icons/Settings.d.ts +8 -8
  62. package/dist/components/atoms/Icon/icons/Settings.js +30 -30
  63. package/dist/components/atoms/Icon/icons/ShipIcon.d.ts +8 -8
  64. package/dist/components/atoms/Icon/icons/ShipIcon.js +36 -36
  65. package/dist/components/atoms/Icon/icons/StrollerIcon.d.ts +8 -8
  66. package/dist/components/atoms/Icon/icons/StrollerIcon.js +30 -30
  67. package/dist/components/atoms/Icon/icons/TwitterIcon.d.ts +8 -8
  68. package/dist/components/atoms/Icon/icons/TwitterIcon.js +36 -36
  69. package/dist/components/atoms/Icon/icons/User.d.ts +8 -8
  70. package/dist/components/atoms/Icon/icons/User.js +30 -30
  71. package/dist/components/atoms/Icon/icons/UserIcon.d.ts +12 -12
  72. package/dist/components/atoms/Icon/icons/UserIcon.js +41 -41
  73. package/dist/components/atoms/Icon/icons/Youtube.d.ts +8 -8
  74. package/dist/components/atoms/Icon/icons/Youtube.js +36 -36
  75. package/dist/components/atoms/Illustration/Illustration.d.ts +14 -14
  76. package/dist/components/atoms/Illustration/Illustration.js +33 -33
  77. package/dist/components/atoms/Illustration/illustrations.d.ts +51 -51
  78. package/dist/components/atoms/Illustration/illustrations.js +97 -97
  79. package/dist/components/atoms/Inputs/DropdownInput/DropdownInput.d.ts +12 -12
  80. package/dist/components/atoms/Inputs/DropdownInput/DropdownInput.js +53 -53
  81. package/dist/components/atoms/Inputs/Input/Input.d.ts +15 -15
  82. package/dist/components/atoms/Inputs/Input/Input.js +27 -27
  83. package/dist/components/atoms/Inputs/Textarea/Textarea.d.ts +14 -14
  84. package/dist/components/atoms/Inputs/Textarea/Textarea.js +15 -15
  85. package/dist/components/atoms/Link/Link.d.ts +44 -44
  86. package/dist/components/atoms/Link/Link.js +76 -76
  87. package/dist/components/atoms/RatingStar/RatingStar.d.ts +40 -40
  88. package/dist/components/atoms/RatingStar/RatingStar.js +54 -54
  89. package/dist/components/atoms/SegmentedButton/SegmentedButton.d.ts +27 -27
  90. package/dist/components/atoms/SegmentedButton/SegmentedButton.js +49 -49
  91. package/dist/components/atoms/SelectedValue/SelectedValue.d.ts +11 -11
  92. package/dist/components/atoms/SelectedValue/SelectedValue.js +29 -29
  93. package/dist/components/atoms/Slider/Slider.d.ts +52 -52
  94. package/dist/components/atoms/Slider/Slider.js +30 -30
  95. package/dist/components/atoms/Spinner/Spinner.d.ts +9 -9
  96. package/dist/components/atoms/Spinner/Spinner.js +38 -38
  97. package/dist/components/atoms/Spinner/variants/ButtonSpinner.d.ts +8 -8
  98. package/dist/components/atoms/Spinner/variants/ButtonSpinner.js +19 -19
  99. package/dist/components/atoms/Spinner/variants/LoadingSpinner.d.ts +7 -7
  100. package/dist/components/atoms/Spinner/variants/LoadingSpinner.js +7 -7
  101. package/dist/components/atoms/Tab/Tab.css +266 -266
  102. package/dist/components/atoms/Tab/Tab.d.ts +22 -22
  103. package/dist/components/atoms/Tab/Tab.js +54 -54
  104. package/dist/components/atoms/Typography/Typography.d.ts +24 -24
  105. package/dist/components/atoms/Typography/Typography.js +100 -100
  106. package/dist/components/molecules/Calendar/CalendarInput.d.ts +34 -34
  107. package/dist/components/molecules/Calendar/CalendarInput.js +49 -49
  108. package/dist/components/molecules/Calendar/DateTime.d.ts +25 -25
  109. package/dist/components/molecules/Calendar/DateTime.js +106 -106
  110. package/dist/components/molecules/Calendar/TimePicker.d.ts +16 -16
  111. package/dist/components/molecules/Calendar/TimePicker.js +91 -91
  112. package/dist/components/molecules/LocationDropdown/LocationDropdown.d.ts +34 -34
  113. package/dist/components/molecules/LocationDropdown/LocationDropdown.js +120 -120
  114. package/dist/components/molecules/LocationDropdown/index.d.ts +2 -2
  115. package/dist/components/molecules/LocationDropdown/index.js +1 -1
  116. package/dist/components/molecules/MultiSelectDropdown/MultiSelectDropdown.d.ts +29 -29
  117. package/dist/components/molecules/MultiSelectDropdown/MultiSelectDropdown.js +106 -106
  118. package/dist/components/molecules/RatingTab/RatingTab.d.ts +39 -39
  119. package/dist/components/molecules/RatingTab/RatingTab.js +41 -41
  120. package/dist/components/molecules/TabGroup/TabGroup.d.ts +17 -17
  121. package/dist/components/molecules/TabGroup/TabGroup.js +30 -30
  122. package/dist/components/molecules/UserCard/UserCard.d.ts +20 -20
  123. package/dist/components/molecules/UserCard/UserCard.js +57 -57
  124. package/dist/components/organisms/CardContainer/CardContainer.d.ts +37 -37
  125. package/dist/components/organisms/CardContainer/CardContainer.js +27 -27
  126. package/dist/components/organisms/DateTimePicker/DateTimePicker.d.ts +15 -15
  127. package/dist/components/organisms/DateTimePicker/DateTimePicker.js +66 -66
  128. package/dist/components/organisms/Dialog/Dialog.d.ts +103 -103
  129. package/dist/components/organisms/Dialog/Dialog.js +162 -162
  130. package/dist/components/organisms/Footer/Footer.d.ts +38 -38
  131. package/dist/components/organisms/Footer/Footer.js +74 -74
  132. package/dist/components/organisms/PaxSelector/PaxSelector.d.ts +63 -63
  133. package/dist/components/organisms/PaxSelector/PaxSelector.js +402 -402
  134. package/dist/components/organisms/RoundTrip/RoundTrip.d.ts +54 -54
  135. package/dist/components/organisms/RoundTrip/RoundTrip.js +179 -179
  136. package/dist/components/organisms/RoundTrip/index.d.ts +2 -2
  137. package/dist/components/organisms/RoundTrip/index.js +1 -1
  138. package/dist/components/organisms/SearchBarTransfer/SearchBarTransfer.d.ts +35 -35
  139. package/dist/components/organisms/SearchBarTransfer/SearchBarTransfer.js +192 -192
  140. package/dist/components/organisms/SearchBarTransfer/index.d.ts +2 -2
  141. package/dist/components/organisms/SearchBarTransfer/index.js +1 -1
  142. package/dist/components/organisms/TopNavigation/DesktopNav.d.ts +33 -33
  143. package/dist/components/organisms/TopNavigation/DesktopNav.js +32 -26
  144. package/dist/components/organisms/TopNavigation/MobileNav.d.ts +32 -32
  145. package/dist/components/organisms/TopNavigation/MobileNav.js +45 -45
  146. package/dist/components/organisms/TopNavigation/TopNavigation.d.ts +33 -33
  147. package/dist/components/organisms/TopNavigation/TopNavigation.js +20 -20
  148. package/dist/components/organisms/TransferLine/TransferLine.d.ts +53 -53
  149. package/dist/components/organisms/TransferLine/TransferLine.js +179 -179
  150. package/dist/components/ui/button.d.ts +10 -10
  151. package/dist/components/ui/button.js +56 -56
  152. package/dist/components/ui/calendar.d.ts +8 -8
  153. package/dist/components/ui/calendar.js +87 -87
  154. package/dist/components/ui/popover.d.ts +7 -7
  155. package/dist/components/ui/popover.js +42 -42
  156. package/dist/hooks/useMobile.d.ts +5 -5
  157. package/dist/hooks/useMobile.js +26 -26
  158. package/dist/index.d.ts +49 -49
  159. package/dist/index.js +46 -46
  160. package/dist/lib/utils.d.ts +7 -7
  161. package/dist/lib/utils.js +13 -13
  162. package/dist/styles/components/avatar.css +122 -122
  163. package/dist/styles/components/calendar.css +140 -140
  164. package/dist/styles/components/checkbox.css +206 -206
  165. package/dist/styles/components/dropdown.css +269 -269
  166. package/dist/styles/components/forms.css +209 -209
  167. package/dist/styles/components/illustration.css +123 -123
  168. package/dist/styles/components/molecule/calendarInput.css +133 -133
  169. package/dist/styles/components/molecule/dateTime.css +126 -126
  170. package/dist/styles/components/molecule/location-dropdown.css +132 -132
  171. package/dist/styles/components/molecule/timePicker.css +122 -122
  172. package/dist/styles/components/multiselect-dropdown.css +286 -286
  173. package/dist/styles/components/organism/card-container.css +148 -148
  174. package/dist/styles/components/organism/dialog.css +168 -168
  175. package/dist/styles/components/organism/footer.css +119 -119
  176. package/dist/styles/components/organism/pax-selector.css +617 -617
  177. package/dist/styles/components/organism/round-trip.css +139 -139
  178. package/dist/styles/components/organism/search-bar-transfer.css +158 -161
  179. package/dist/styles/components/organism/topnavigation.css +143 -143
  180. package/dist/styles/components/organism/transfer-line.css +138 -138
  181. package/dist/styles/components/rating-star.css +145 -145
  182. package/dist/styles/components/rating-tab.css +179 -179
  183. package/dist/styles/components/scrollbar.css +155 -155
  184. package/dist/styles/components/segmented-button.css +214 -214
  185. package/dist/styles/components/selected-value.css +175 -175
  186. package/dist/styles/components/slider.css +182 -182
  187. package/dist/styles/components/typography.css +245 -245
  188. package/dist/styles/tokens/tokens.css +119 -119
  189. package/dist/styles/tokens/tokens.d.ts +3108 -3108
  190. package/dist/styles/tokens/tokens.js +2652 -2652
  191. package/package.json +103 -103
  192. package/src/components/atoms/Avatar/Avatar.tsx +60 -60
  193. package/src/components/atoms/Button/Button.css +200 -200
  194. package/src/components/atoms/Button/Button.tsx +82 -82
  195. package/src/components/atoms/Checkbox/Checkbox.tsx +83 -83
  196. package/src/components/atoms/Icon/Icon.tsx +163 -163
  197. package/src/components/atoms/Icon/icons/ArrivalIcon.tsx +52 -52
  198. package/src/components/atoms/Icon/icons/BuildingIcon.tsx +50 -50
  199. package/src/components/atoms/Icon/icons/CalendarIcon.tsx +63 -63
  200. package/src/components/atoms/Icon/icons/CalendarOutlineIcon.tsx +50 -50
  201. package/src/components/atoms/Icon/icons/CarIcon.tsx +44 -44
  202. package/src/components/atoms/Icon/icons/Check.tsx +36 -36
  203. package/src/components/atoms/Icon/icons/CheckCircleIcon.tsx +48 -48
  204. package/src/components/atoms/Icon/icons/Chevron.tsx +73 -73
  205. package/src/components/atoms/Icon/icons/ChevronDownIcon.tsx +46 -46
  206. package/src/components/atoms/Icon/icons/Close.tsx +39 -39
  207. package/src/components/atoms/Icon/icons/DeleteIcon.tsx +44 -44
  208. package/src/components/atoms/Icon/icons/DepartureIcon.tsx +50 -50
  209. package/src/components/atoms/Icon/icons/EyeIcon.tsx +44 -44
  210. package/src/components/atoms/Icon/icons/FacebookIcon.tsx +50 -50
  211. package/src/components/atoms/Icon/icons/HomeIcon.tsx +52 -52
  212. package/src/components/atoms/Icon/icons/InfoIcon.tsx +44 -44
  213. package/src/components/atoms/Icon/icons/LinkedInIcon.tsx +50 -50
  214. package/src/components/atoms/Icon/icons/MapPinIcon.tsx +44 -44
  215. package/src/components/atoms/Icon/icons/MautoucoLogo.tsx +93 -93
  216. package/src/components/atoms/Icon/icons/MenuIcon.tsx +49 -49
  217. package/src/components/atoms/Icon/icons/MinusIcon.tsx +45 -45
  218. package/src/components/atoms/Icon/icons/MoreIcon.tsx +44 -44
  219. package/src/components/atoms/Icon/icons/PlaneIcon.tsx +50 -50
  220. package/src/components/atoms/Icon/icons/PlusIcon.tsx +45 -45
  221. package/src/components/atoms/Icon/icons/Search.tsx +37 -37
  222. package/src/components/atoms/Icon/icons/Settings.tsx +38 -38
  223. package/src/components/atoms/Icon/icons/ShipIcon.tsx +50 -50
  224. package/src/components/atoms/Icon/icons/StrollerIcon.tsx +44 -44
  225. package/src/components/atoms/Icon/icons/TwitterIcon.tsx +50 -50
  226. package/src/components/atoms/Icon/icons/User.tsx +37 -37
  227. package/src/components/atoms/Icon/icons/UserIcon.tsx +63 -63
  228. package/src/components/atoms/Icon/icons/Youtube.tsx +50 -50
  229. package/src/components/atoms/Illustration/Illustration.tsx +28 -28
  230. package/src/components/atoms/Illustration/illustrations.ts +116 -116
  231. package/src/components/atoms/Inputs/DropdownInput/DropdownInput.tsx +96 -96
  232. package/src/components/atoms/Inputs/Textarea/Textarea.tsx +51 -51
  233. package/src/components/atoms/Link/Link.tsx +168 -168
  234. package/src/components/atoms/RatingStar/RatingStar.tsx +114 -114
  235. package/src/components/atoms/SegmentedButton/SegmentedButton.tsx +94 -94
  236. package/src/components/atoms/SelectedValue/SelectedValue.tsx +59 -59
  237. package/src/components/atoms/Slider/Slider.tsx +95 -95
  238. package/src/components/atoms/Spinner/Spinner.tsx +56 -56
  239. package/src/components/atoms/Spinner/variants/ButtonSpinner.tsx +37 -37
  240. package/src/components/atoms/Spinner/variants/LoadingSpinner.tsx +22 -22
  241. package/src/components/atoms/Tab/Tab.css +147 -147
  242. package/src/components/atoms/Tab/Tab.tsx +96 -96
  243. package/src/components/atoms/Typography/Typography.tsx +153 -153
  244. package/src/components/molecules/Calendar/CalendarInput.tsx +135 -135
  245. package/src/components/molecules/Calendar/DateTime.tsx +172 -172
  246. package/src/components/molecules/Calendar/TimePicker.tsx +174 -174
  247. package/src/components/molecules/LocationDropdown/LocationDropdown.tsx +234 -234
  248. package/src/components/molecules/LocationDropdown/index.ts +2 -2
  249. package/src/components/molecules/RatingTab/RatingTab.tsx +96 -96
  250. package/src/components/molecules/TabGroup/TabGroup.tsx +60 -60
  251. package/src/components/molecules/UserCard/UserCard.stories.tsx +36 -36
  252. package/src/components/molecules/UserCard/UserCard.tsx +173 -173
  253. package/src/components/organisms/CardContainer/CardContainer.tsx +66 -66
  254. package/src/components/organisms/DateTimePicker/DateTimePicker.tsx +110 -110
  255. package/src/components/organisms/Dialog/Dialog.tsx +352 -352
  256. package/src/components/organisms/Footer/Footer.tsx +290 -290
  257. package/src/components/organisms/PaxSelector/PaxSelector.tsx +979 -979
  258. package/src/components/organisms/RoundTrip/RoundTrip.tsx +335 -335
  259. package/src/components/organisms/RoundTrip/index.ts +2 -2
  260. package/src/components/organisms/SearchBarTransfer/SearchBarTransfer.tsx +388 -388
  261. package/src/components/organisms/SearchBarTransfer/index.ts +2 -2
  262. package/src/components/organisms/TopNavigation/DesktopNav.tsx +133 -122
  263. package/src/components/organisms/TopNavigation/MobileNav.tsx +212 -212
  264. package/src/components/organisms/TopNavigation/TopNavigation.tsx +45 -45
  265. package/src/components/organisms/TransferLine/TransferLine.tsx +369 -369
  266. package/src/components/ui/button.tsx +60 -60
  267. package/src/components/ui/calendar.tsx +246 -246
  268. package/src/components/ui/popover.tsx +46 -46
  269. package/src/styles/components/avatar.css +58 -58
  270. package/src/styles/components/calendar.css +85 -85
  271. package/src/styles/components/checkbox.css +130 -130
  272. package/src/styles/components/dropdown.css +214 -214
  273. package/src/styles/components/forms.css +147 -147
  274. package/src/styles/components/illustration.css +7 -7
  275. package/src/styles/components/molecule/calendarInput.css +156 -156
  276. package/src/styles/components/molecule/dateTime.css +14 -14
  277. package/src/styles/components/molecule/location-dropdown.css +204 -204
  278. package/src/styles/components/molecule/timePicker.css +78 -78
  279. package/src/styles/components/multiselect-dropdown.css +230 -230
  280. package/src/styles/components/organism/card-container.css +49 -49
  281. package/src/styles/components/organism/dialog.css +241 -241
  282. package/src/styles/components/organism/footer.css +113 -113
  283. package/src/styles/components/organism/pax-selector.css +702 -702
  284. package/src/styles/components/organism/round-trip.css +55 -55
  285. package/src/styles/components/organism/search-bar-transfer.css +128 -127
  286. package/src/styles/components/organism/topnavigation.css +161 -161
  287. package/src/styles/components/organism/transfer-line.css +86 -86
  288. package/src/styles/components/rating-star.css +39 -39
  289. package/src/styles/components/rating-tab.css +83 -83
  290. package/src/styles/components/scrollbar.css +63 -63
  291. package/src/styles/components/segmented-button.css +134 -134
  292. package/src/styles/components/selected-value.css +80 -80
  293. package/src/styles/components/slider.css +86 -86
  294. package/src/styles/components/typography.css +251 -251
  295. package/src/styles/fonts.css +50 -0
  296. package/src/styles/tokens/tokens.css +119 -119
  297. package/src/styles/tokens/tokens.js +12 -6
@@ -1,352 +1,352 @@
1
- import React, { useEffect, useCallback, useRef } from 'react';
2
- import { createPortal } from 'react-dom';
3
- import { useMobile } from '../../../hooks/useMobile';
4
- import Button from '../../atoms/Button/Button';
5
- import Icon from '../../atoms/Icon/Icon';
6
- import '../../../styles/components/organism/dialog.css';
7
-
8
- /**
9
- * Size variants for the Dialog component
10
- */
11
- export type DialogSize = 'desktop' | 'tablet' | 'mobile' | 'full' | 'responsive';
12
-
13
- /**
14
- * Props for the Dialog component
15
- */
16
- export interface DialogProps {
17
- /**
18
- * Whether the dialog is open
19
- */
20
- isOpen: boolean;
21
- /**
22
- * Callback when the dialog should close
23
- */
24
- onClose: () => void;
25
- /**
26
- * Title displayed in the dialog header
27
- */
28
- title: string;
29
- /**
30
- * Content to be rendered in the dialog body
31
- */
32
- children: React.ReactNode;
33
- /**
34
- * Footer content or buttons. If not provided, default Cancel/Save buttons are shown
35
- */
36
- footer?: React.ReactNode;
37
- /**
38
- * Size variant of the dialog
39
- * @default 'responsive'
40
- */
41
- size?: DialogSize;
42
- /**
43
- * Text for the primary action button (when using default footer)
44
- * @default 'Save and update'
45
- */
46
- primaryButtonText?: string;
47
- /**
48
- * Text for the secondary action button (when using default footer)
49
- * @default 'Cancel'
50
- */
51
- secondaryButtonText?: string;
52
- /**
53
- * Callback for primary button click (when using default footer)
54
- */
55
- onPrimaryClick?: () => void;
56
- /**
57
- * Callback for secondary button click (when using default footer)
58
- */
59
- onSecondaryClick?: () => void;
60
- /**
61
- * Whether to show the footer
62
- * @default true
63
- */
64
- showFooter?: boolean;
65
- /**
66
- * Whether to show the close button in the header
67
- * @default true
68
- */
69
- showCloseButton?: boolean;
70
- /**
71
- * Whether clicking the overlay closes the dialog
72
- * @default true
73
- */
74
- closeOnOverlayClick?: boolean;
75
- /**
76
- * Whether pressing Escape closes the dialog
77
- * @default true
78
- */
79
- closeOnEscape?: boolean;
80
- /**
81
- * Additional CSS classes for the dialog content
82
- */
83
- className?: string;
84
- /**
85
- * ID for aria-labelledby
86
- */
87
- ariaLabelledBy?: string;
88
- /**
89
- * ID for aria-describedby
90
- */
91
- ariaDescribedBy?: string;
92
- }
93
-
94
- /**
95
- * Dialog component - A modal dialog that adapts to different screen sizes
96
- *
97
- * @example
98
- * ```tsx
99
- * <Dialog
100
- * isOpen={isOpen}
101
- * onClose={() => setIsOpen(false)}
102
- * title="Edit Information"
103
- * onPrimaryClick={handleSave}
104
- * >
105
- * <p>Your content here</p>
106
- * </Dialog>
107
- * ```
108
- */
109
- export const Dialog: React.FC<DialogProps> = ({
110
- isOpen,
111
- onClose,
112
- title,
113
- children,
114
- footer,
115
- size = 'responsive',
116
- primaryButtonText = 'Save and update',
117
- secondaryButtonText = 'Cancel',
118
- onPrimaryClick,
119
- onSecondaryClick,
120
- showFooter = true,
121
- showCloseButton = true,
122
- closeOnOverlayClick = true,
123
- closeOnEscape = true,
124
- className = '',
125
- ariaLabelledBy,
126
- ariaDescribedBy,
127
- }) => {
128
- const { isMobile, isTablet, isDesktop } = useMobile();
129
- const dialogRef = useRef<HTMLDivElement>(null);
130
- const previousFocusRef = useRef<HTMLElement | null>(null);
131
-
132
- // Determine the actual size based on responsive setting
133
- const getActualSize = (): Exclude<DialogSize, 'responsive'> => {
134
- if (size !== 'responsive') return size;
135
- if (isMobile) return 'mobile';
136
- if (isTablet) return 'tablet';
137
- return 'desktop';
138
- };
139
-
140
- const actualSize = getActualSize();
141
- const isMobileSize = actualSize === 'mobile';
142
- const isTabletSize = actualSize === 'tablet';
143
-
144
- // Handle escape key
145
- const handleKeyDown = useCallback(
146
- (event: KeyboardEvent) => {
147
- if (closeOnEscape && event.key === 'Escape') {
148
- onClose();
149
- }
150
- },
151
- [closeOnEscape, onClose]
152
- );
153
-
154
- // Handle overlay click
155
- const handleOverlayClick = useCallback(
156
- (event: React.MouseEvent<HTMLDivElement>) => {
157
- if (closeOnOverlayClick && event.target === event.currentTarget) {
158
- onClose();
159
- }
160
- },
161
- [closeOnOverlayClick, onClose]
162
- );
163
-
164
- // Focus management and scroll lock
165
- useEffect(() => {
166
- if (isOpen) {
167
- // Store current focus
168
- previousFocusRef.current = document.activeElement as HTMLElement;
169
-
170
- // Focus the dialog
171
- if (dialogRef.current) {
172
- dialogRef.current.focus();
173
- }
174
-
175
- // Lock body scroll
176
- document.body.style.overflow = 'hidden';
177
-
178
- // Add escape listener
179
- document.addEventListener('keydown', handleKeyDown);
180
- } else {
181
- // Unlock body scroll
182
- document.body.style.overflow = '';
183
-
184
- // Restore focus
185
- if (previousFocusRef.current) {
186
- previousFocusRef.current.focus();
187
- }
188
- }
189
-
190
- return () => {
191
- document.body.style.overflow = '';
192
- document.removeEventListener('keydown', handleKeyDown);
193
- };
194
- }, [isOpen, handleKeyDown]);
195
-
196
- // Handle secondary button click
197
- const handleSecondaryClick = () => {
198
- if (onSecondaryClick) {
199
- onSecondaryClick();
200
- } else {
201
- onClose();
202
- }
203
- };
204
-
205
- // Handle primary button click
206
- const handlePrimaryClick = () => {
207
- if (onPrimaryClick) {
208
- onPrimaryClick();
209
- }
210
- };
211
-
212
- // Generate unique IDs for accessibility
213
- const titleId = ariaLabelledBy || `dialog-title-${title.replace(/\s+/g, '-').toLowerCase()}`;
214
- const bodyId = ariaDescribedBy || `dialog-body-${title.replace(/\s+/g, '-').toLowerCase()}`;
215
-
216
- // Build class names
217
- const contentClasses = [
218
- 'dialog__content',
219
- `dialog__content--${actualSize}`,
220
- size === 'responsive' ? 'dialog__content--responsive' : '',
221
- className,
222
- ]
223
- .filter(Boolean)
224
- .join(' ');
225
-
226
- const headerClasses = [
227
- 'dialog__header',
228
- isMobileSize ? 'dialog__header--mobile' : '',
229
- size === 'responsive' ? 'dialog__header--responsive' : '',
230
- ]
231
- .filter(Boolean)
232
- .join(' ');
233
-
234
- const titleClasses = [
235
- 'dialog__title',
236
- isMobileSize ? 'dialog__title--mobile' : '',
237
- isTabletSize ? 'dialog__title--tablet' : '',
238
- size === 'responsive' ? 'dialog__title--responsive' : '',
239
- ]
240
- .filter(Boolean)
241
- .join(' ');
242
-
243
- const closeButtonClasses = 'dialog__close-button';
244
-
245
- const bodyClasses = [
246
- 'dialog__body',
247
- isMobileSize ? 'dialog__body--mobile' : '',
248
- size === 'responsive' ? 'dialog__body--responsive' : '',
249
- ]
250
- .filter(Boolean)
251
- .join(' ');
252
-
253
- const footerClasses = [
254
- 'dialog__footer',
255
- isMobileSize ? 'dialog__footer--mobile' : '',
256
- size === 'responsive' ? 'dialog__footer--responsive' : '',
257
- ]
258
- .filter(Boolean)
259
- .join(' ');
260
-
261
- const footerButtonsClasses = [
262
- 'dialog__footer-buttons',
263
- isMobileSize ? 'dialog__footer-buttons--mobile' : '',
264
- size === 'responsive' ? 'dialog__footer-buttons--responsive' : '',
265
- ]
266
- .filter(Boolean)
267
- .join(' ');
268
-
269
- if (!isOpen) {
270
- return null;
271
- }
272
-
273
- const dialogContent = (
274
- <>
275
- {/* Overlay */}
276
- <div
277
- className="dialog-overlay"
278
- onClick={handleOverlayClick}
279
- aria-hidden="true"
280
- />
281
-
282
- {/* Dialog container */}
283
- <div
284
- className="dialog"
285
- role="dialog"
286
- aria-modal="true"
287
- aria-labelledby={titleId}
288
- aria-describedby={bodyId}
289
- ref={dialogRef}
290
- tabIndex={-1}
291
- onClick={handleOverlayClick}
292
- >
293
- {/* Dialog content */}
294
- <div className={contentClasses}>
295
- {/* Header */}
296
- <div className={headerClasses}>
297
- <h2 id={titleId} className={titleClasses}>
298
- {title}
299
- </h2>
300
- {showCloseButton && (
301
- <button
302
- type="button"
303
- className={closeButtonClasses}
304
- onClick={onClose}
305
- aria-label="Close dialog"
306
- >
307
- <Icon name="close" size="md" />
308
- </button>
309
- )}
310
- </div>
311
-
312
- {/* Body */}
313
- <div id={bodyId} className={bodyClasses}>
314
- <div className="dialog__body-content">{children}</div>
315
- </div>
316
-
317
- {/* Footer */}
318
- {showFooter && (
319
- <div className={footerClasses}>
320
- {footer ? (
321
- footer
322
- ) : (
323
- <div className={footerButtonsClasses}>
324
- <Button
325
- variant="outline-secondary"
326
- size={isMobileSize ? 'sm' : 'md'}
327
- onClick={handleSecondaryClick}
328
- >
329
- {secondaryButtonText}
330
- </Button>
331
- <Button
332
- variant="secondary"
333
- size={isMobileSize ? 'sm' : 'md'}
334
- onClick={handlePrimaryClick}
335
- >
336
- {primaryButtonText}
337
- </Button>
338
- </div>
339
- )}
340
- </div>
341
- )}
342
- </div>
343
- </div>
344
- </>
345
- );
346
-
347
- // Use portal to render at the document body level
348
- return createPortal(dialogContent, document.body);
349
- };
350
-
351
- export default Dialog;
352
-
1
+ import React, { useEffect, useCallback, useRef } from 'react';
2
+ import { createPortal } from 'react-dom';
3
+ import { useMobile } from '../../../hooks/useMobile';
4
+ import Button from '../../atoms/Button/Button';
5
+ import Icon from '../../atoms/Icon/Icon';
6
+ import '../../../styles/components/organism/dialog.css';
7
+
8
+ /**
9
+ * Size variants for the Dialog component
10
+ */
11
+ export type DialogSize = 'desktop' | 'tablet' | 'mobile' | 'full' | 'responsive';
12
+
13
+ /**
14
+ * Props for the Dialog component
15
+ */
16
+ export interface DialogProps {
17
+ /**
18
+ * Whether the dialog is open
19
+ */
20
+ isOpen: boolean;
21
+ /**
22
+ * Callback when the dialog should close
23
+ */
24
+ onClose: () => void;
25
+ /**
26
+ * Title displayed in the dialog header
27
+ */
28
+ title: string;
29
+ /**
30
+ * Content to be rendered in the dialog body
31
+ */
32
+ children: React.ReactNode;
33
+ /**
34
+ * Footer content or buttons. If not provided, default Cancel/Save buttons are shown
35
+ */
36
+ footer?: React.ReactNode;
37
+ /**
38
+ * Size variant of the dialog
39
+ * @default 'responsive'
40
+ */
41
+ size?: DialogSize;
42
+ /**
43
+ * Text for the primary action button (when using default footer)
44
+ * @default 'Save and update'
45
+ */
46
+ primaryButtonText?: string;
47
+ /**
48
+ * Text for the secondary action button (when using default footer)
49
+ * @default 'Cancel'
50
+ */
51
+ secondaryButtonText?: string;
52
+ /**
53
+ * Callback for primary button click (when using default footer)
54
+ */
55
+ onPrimaryClick?: () => void;
56
+ /**
57
+ * Callback for secondary button click (when using default footer)
58
+ */
59
+ onSecondaryClick?: () => void;
60
+ /**
61
+ * Whether to show the footer
62
+ * @default true
63
+ */
64
+ showFooter?: boolean;
65
+ /**
66
+ * Whether to show the close button in the header
67
+ * @default true
68
+ */
69
+ showCloseButton?: boolean;
70
+ /**
71
+ * Whether clicking the overlay closes the dialog
72
+ * @default true
73
+ */
74
+ closeOnOverlayClick?: boolean;
75
+ /**
76
+ * Whether pressing Escape closes the dialog
77
+ * @default true
78
+ */
79
+ closeOnEscape?: boolean;
80
+ /**
81
+ * Additional CSS classes for the dialog content
82
+ */
83
+ className?: string;
84
+ /**
85
+ * ID for aria-labelledby
86
+ */
87
+ ariaLabelledBy?: string;
88
+ /**
89
+ * ID for aria-describedby
90
+ */
91
+ ariaDescribedBy?: string;
92
+ }
93
+
94
+ /**
95
+ * Dialog component - A modal dialog that adapts to different screen sizes
96
+ *
97
+ * @example
98
+ * ```tsx
99
+ * <Dialog
100
+ * isOpen={isOpen}
101
+ * onClose={() => setIsOpen(false)}
102
+ * title="Edit Information"
103
+ * onPrimaryClick={handleSave}
104
+ * >
105
+ * <p>Your content here</p>
106
+ * </Dialog>
107
+ * ```
108
+ */
109
+ export const Dialog: React.FC<DialogProps> = ({
110
+ isOpen,
111
+ onClose,
112
+ title,
113
+ children,
114
+ footer,
115
+ size = 'responsive',
116
+ primaryButtonText = 'Save and update',
117
+ secondaryButtonText = 'Cancel',
118
+ onPrimaryClick,
119
+ onSecondaryClick,
120
+ showFooter = true,
121
+ showCloseButton = true,
122
+ closeOnOverlayClick = true,
123
+ closeOnEscape = true,
124
+ className = '',
125
+ ariaLabelledBy,
126
+ ariaDescribedBy,
127
+ }) => {
128
+ const { isMobile, isTablet, isDesktop } = useMobile();
129
+ const dialogRef = useRef<HTMLDivElement>(null);
130
+ const previousFocusRef = useRef<HTMLElement | null>(null);
131
+
132
+ // Determine the actual size based on responsive setting
133
+ const getActualSize = (): Exclude<DialogSize, 'responsive'> => {
134
+ if (size !== 'responsive') return size;
135
+ if (isMobile) return 'mobile';
136
+ if (isTablet) return 'tablet';
137
+ return 'desktop';
138
+ };
139
+
140
+ const actualSize = getActualSize();
141
+ const isMobileSize = actualSize === 'mobile';
142
+ const isTabletSize = actualSize === 'tablet';
143
+
144
+ // Handle escape key
145
+ const handleKeyDown = useCallback(
146
+ (event: KeyboardEvent) => {
147
+ if (closeOnEscape && event.key === 'Escape') {
148
+ onClose();
149
+ }
150
+ },
151
+ [closeOnEscape, onClose]
152
+ );
153
+
154
+ // Handle overlay click
155
+ const handleOverlayClick = useCallback(
156
+ (event: React.MouseEvent<HTMLDivElement>) => {
157
+ if (closeOnOverlayClick && event.target === event.currentTarget) {
158
+ onClose();
159
+ }
160
+ },
161
+ [closeOnOverlayClick, onClose]
162
+ );
163
+
164
+ // Focus management and scroll lock
165
+ useEffect(() => {
166
+ if (isOpen) {
167
+ // Store current focus
168
+ previousFocusRef.current = document.activeElement as HTMLElement;
169
+
170
+ // Focus the dialog
171
+ if (dialogRef.current) {
172
+ dialogRef.current.focus();
173
+ }
174
+
175
+ // Lock body scroll
176
+ document.body.style.overflow = 'hidden';
177
+
178
+ // Add escape listener
179
+ document.addEventListener('keydown', handleKeyDown);
180
+ } else {
181
+ // Unlock body scroll
182
+ document.body.style.overflow = '';
183
+
184
+ // Restore focus
185
+ if (previousFocusRef.current) {
186
+ previousFocusRef.current.focus();
187
+ }
188
+ }
189
+
190
+ return () => {
191
+ document.body.style.overflow = '';
192
+ document.removeEventListener('keydown', handleKeyDown);
193
+ };
194
+ }, [isOpen, handleKeyDown]);
195
+
196
+ // Handle secondary button click
197
+ const handleSecondaryClick = () => {
198
+ if (onSecondaryClick) {
199
+ onSecondaryClick();
200
+ } else {
201
+ onClose();
202
+ }
203
+ };
204
+
205
+ // Handle primary button click
206
+ const handlePrimaryClick = () => {
207
+ if (onPrimaryClick) {
208
+ onPrimaryClick();
209
+ }
210
+ };
211
+
212
+ // Generate unique IDs for accessibility
213
+ const titleId = ariaLabelledBy || `dialog-title-${title.replace(/\s+/g, '-').toLowerCase()}`;
214
+ const bodyId = ariaDescribedBy || `dialog-body-${title.replace(/\s+/g, '-').toLowerCase()}`;
215
+
216
+ // Build class names
217
+ const contentClasses = [
218
+ 'dialog__content',
219
+ `dialog__content--${actualSize}`,
220
+ size === 'responsive' ? 'dialog__content--responsive' : '',
221
+ className,
222
+ ]
223
+ .filter(Boolean)
224
+ .join(' ');
225
+
226
+ const headerClasses = [
227
+ 'dialog__header',
228
+ isMobileSize ? 'dialog__header--mobile' : '',
229
+ size === 'responsive' ? 'dialog__header--responsive' : '',
230
+ ]
231
+ .filter(Boolean)
232
+ .join(' ');
233
+
234
+ const titleClasses = [
235
+ 'dialog__title',
236
+ isMobileSize ? 'dialog__title--mobile' : '',
237
+ isTabletSize ? 'dialog__title--tablet' : '',
238
+ size === 'responsive' ? 'dialog__title--responsive' : '',
239
+ ]
240
+ .filter(Boolean)
241
+ .join(' ');
242
+
243
+ const closeButtonClasses = 'dialog__close-button';
244
+
245
+ const bodyClasses = [
246
+ 'dialog__body',
247
+ isMobileSize ? 'dialog__body--mobile' : '',
248
+ size === 'responsive' ? 'dialog__body--responsive' : '',
249
+ ]
250
+ .filter(Boolean)
251
+ .join(' ');
252
+
253
+ const footerClasses = [
254
+ 'dialog__footer',
255
+ isMobileSize ? 'dialog__footer--mobile' : '',
256
+ size === 'responsive' ? 'dialog__footer--responsive' : '',
257
+ ]
258
+ .filter(Boolean)
259
+ .join(' ');
260
+
261
+ const footerButtonsClasses = [
262
+ 'dialog__footer-buttons',
263
+ isMobileSize ? 'dialog__footer-buttons--mobile' : '',
264
+ size === 'responsive' ? 'dialog__footer-buttons--responsive' : '',
265
+ ]
266
+ .filter(Boolean)
267
+ .join(' ');
268
+
269
+ if (!isOpen) {
270
+ return null;
271
+ }
272
+
273
+ const dialogContent = (
274
+ <>
275
+ {/* Overlay */}
276
+ <div
277
+ className="dialog-overlay"
278
+ onClick={handleOverlayClick}
279
+ aria-hidden="true"
280
+ />
281
+
282
+ {/* Dialog container */}
283
+ <div
284
+ className="dialog"
285
+ role="dialog"
286
+ aria-modal="true"
287
+ aria-labelledby={titleId}
288
+ aria-describedby={bodyId}
289
+ ref={dialogRef}
290
+ tabIndex={-1}
291
+ onClick={handleOverlayClick}
292
+ >
293
+ {/* Dialog content */}
294
+ <div className={contentClasses}>
295
+ {/* Header */}
296
+ <div className={headerClasses}>
297
+ <h2 id={titleId} className={titleClasses}>
298
+ {title}
299
+ </h2>
300
+ {showCloseButton && (
301
+ <button
302
+ type="button"
303
+ className={closeButtonClasses}
304
+ onClick={onClose}
305
+ aria-label="Close dialog"
306
+ >
307
+ <Icon name="close" size="md" />
308
+ </button>
309
+ )}
310
+ </div>
311
+
312
+ {/* Body */}
313
+ <div id={bodyId} className={bodyClasses}>
314
+ <div className="dialog__body-content">{children}</div>
315
+ </div>
316
+
317
+ {/* Footer */}
318
+ {showFooter && (
319
+ <div className={footerClasses}>
320
+ {footer ? (
321
+ footer
322
+ ) : (
323
+ <div className={footerButtonsClasses}>
324
+ <Button
325
+ variant="outline-secondary"
326
+ size={isMobileSize ? 'sm' : 'md'}
327
+ onClick={handleSecondaryClick}
328
+ >
329
+ {secondaryButtonText}
330
+ </Button>
331
+ <Button
332
+ variant="secondary"
333
+ size={isMobileSize ? 'sm' : 'md'}
334
+ onClick={handlePrimaryClick}
335
+ >
336
+ {primaryButtonText}
337
+ </Button>
338
+ </div>
339
+ )}
340
+ </div>
341
+ )}
342
+ </div>
343
+ </div>
344
+ </>
345
+ );
346
+
347
+ // Use portal to render at the document body level
348
+ return createPortal(dialogContent, document.body);
349
+ };
350
+
351
+ export default Dialog;
352
+