@gnome-ui/react 1.45.1 → 1.45.2

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 (574) hide show
  1. package/dist/components/AboutDialog/AboutDialog.cjs +1 -1
  2. package/dist/components/AboutDialog/AboutDialog.cjs.map +1 -1
  3. package/dist/components/AboutDialog/AboutDialog.d.ts +1 -1
  4. package/dist/components/AboutDialog/AboutDialog.js +2 -3
  5. package/dist/components/AboutDialog/AboutDialog.js.map +1 -1
  6. package/dist/components/AboutDialog/AboutDialog.module.css.cjs +1 -1
  7. package/dist/components/AboutDialog/AboutDialog.module.css.js +28 -29
  8. package/dist/components/AboutDialog.cjs +1 -1
  9. package/dist/components/ActionRow/ActionRow.cjs +1 -1
  10. package/dist/components/ActionRow/ActionRow.cjs.map +1 -1
  11. package/dist/components/ActionRow/ActionRow.d.ts +1 -1
  12. package/dist/components/ActionRow/ActionRow.js +2 -2
  13. package/dist/components/ActionRow/ActionRow.js.map +1 -1
  14. package/dist/components/ActionRow.cjs +1 -1
  15. package/dist/components/Avatar/Avatar.cjs +1 -1
  16. package/dist/components/Avatar/Avatar.cjs.map +1 -1
  17. package/dist/components/Avatar/Avatar.d.ts +1 -1
  18. package/dist/components/Avatar/Avatar.js +2 -2
  19. package/dist/components/Avatar/Avatar.js.map +1 -1
  20. package/dist/components/Avatar.cjs +1 -1
  21. package/dist/components/AvatarRotator/AvatarRotator.cjs +1 -1
  22. package/dist/components/AvatarRotator/AvatarRotator.cjs.map +1 -1
  23. package/dist/components/AvatarRotator/AvatarRotator.d.ts +1 -1
  24. package/dist/components/AvatarRotator/AvatarRotator.js +2 -2
  25. package/dist/components/AvatarRotator/AvatarRotator.js.map +1 -1
  26. package/dist/components/AvatarRotator.cjs +1 -1
  27. package/dist/components/Badge/Badge.cjs +1 -1
  28. package/dist/components/Badge/Badge.cjs.map +1 -1
  29. package/dist/components/Badge/Badge.d.ts +1 -1
  30. package/dist/components/Badge/Badge.js +2 -2
  31. package/dist/components/Badge/Badge.js.map +1 -1
  32. package/dist/components/Badge.cjs +1 -1
  33. package/dist/components/Banner/Banner.cjs +1 -1
  34. package/dist/components/Banner/Banner.cjs.map +1 -1
  35. package/dist/components/Banner/Banner.d.ts +1 -1
  36. package/dist/components/Banner/Banner.js +34 -36
  37. package/dist/components/Banner/Banner.js.map +1 -1
  38. package/dist/components/Banner/Banner.module.css.cjs +1 -1
  39. package/dist/components/Banner/Banner.module.css.js +11 -12
  40. package/dist/components/Banner.cjs +1 -1
  41. package/dist/components/Bin/Bin.cjs +1 -1
  42. package/dist/components/Bin/Bin.cjs.map +1 -1
  43. package/dist/components/Bin/Bin.d.ts +1 -1
  44. package/dist/components/Bin/Bin.js +4 -6
  45. package/dist/components/Bin/Bin.js.map +1 -1
  46. package/dist/components/Bin.cjs +1 -1
  47. package/dist/components/Blockquote/Blockquote.cjs +1 -1
  48. package/dist/components/Blockquote/Blockquote.cjs.map +1 -1
  49. package/dist/components/Blockquote/Blockquote.d.ts +1 -1
  50. package/dist/components/Blockquote/Blockquote.js +24 -26
  51. package/dist/components/Blockquote/Blockquote.js.map +1 -1
  52. package/dist/components/Blockquote.cjs +1 -1
  53. package/dist/components/BottomSheet/BottomSheet.cjs +1 -1
  54. package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
  55. package/dist/components/BottomSheet/BottomSheet.d.ts +1 -1
  56. package/dist/components/BottomSheet/BottomSheet.js +2 -3
  57. package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
  58. package/dist/components/BottomSheet/BottomSheet.module.css.cjs +1 -1
  59. package/dist/components/BottomSheet/BottomSheet.module.css.js +8 -9
  60. package/dist/components/BottomSheet.cjs +1 -1
  61. package/dist/components/Box/Box.cjs +1 -1
  62. package/dist/components/Box/Box.cjs.map +1 -1
  63. package/dist/components/Box/Box.d.ts +1 -1
  64. package/dist/components/Box/Box.js +2 -2
  65. package/dist/components/Box/Box.js.map +1 -1
  66. package/dist/components/Box.cjs +1 -1
  67. package/dist/components/BoxedList/BoxedList.cjs +1 -1
  68. package/dist/components/BoxedList/BoxedList.cjs.map +1 -1
  69. package/dist/components/BoxedList/BoxedList.d.ts +1 -1
  70. package/dist/components/BoxedList/BoxedList.js +2 -2
  71. package/dist/components/BoxedList/BoxedList.js.map +1 -1
  72. package/dist/components/BoxedList.cjs +1 -1
  73. package/dist/components/BreakpointBin/BreakpointBin.cjs +1 -1
  74. package/dist/components/BreakpointBin/BreakpointBin.cjs.map +1 -1
  75. package/dist/components/BreakpointBin/BreakpointBin.d.ts +1 -1
  76. package/dist/components/BreakpointBin/BreakpointBin.js +2 -2
  77. package/dist/components/BreakpointBin/BreakpointBin.js.map +1 -1
  78. package/dist/components/BreakpointBin.cjs +1 -1
  79. package/dist/components/Button/Button.cjs +1 -1
  80. package/dist/components/Button/Button.cjs.map +1 -1
  81. package/dist/components/Button/Button.js.map +1 -1
  82. package/dist/components/Button.cjs +1 -1
  83. package/dist/components/ButtonContent/ButtonContent.cjs +1 -1
  84. package/dist/components/ButtonContent/ButtonContent.cjs.map +1 -1
  85. package/dist/components/ButtonContent/ButtonContent.d.ts +1 -1
  86. package/dist/components/ButtonContent/ButtonContent.js +24 -26
  87. package/dist/components/ButtonContent/ButtonContent.js.map +1 -1
  88. package/dist/components/ButtonContent.cjs +1 -1
  89. package/dist/components/ButtonRow/ButtonRow.cjs +1 -1
  90. package/dist/components/ButtonRow/ButtonRow.cjs.map +1 -1
  91. package/dist/components/ButtonRow/ButtonRow.d.ts +1 -1
  92. package/dist/components/ButtonRow/ButtonRow.js +22 -24
  93. package/dist/components/ButtonRow/ButtonRow.js.map +1 -1
  94. package/dist/components/ButtonRow.cjs +1 -1
  95. package/dist/components/Card/Card.cjs +1 -1
  96. package/dist/components/Card/Card.cjs.map +1 -1
  97. package/dist/components/Card/Card.d.ts +1 -1
  98. package/dist/components/Card/Card.js +10 -12
  99. package/dist/components/Card/Card.js.map +1 -1
  100. package/dist/components/Card/Card.module.css.cjs +1 -1
  101. package/dist/components/Card/Card.module.css.js +4 -5
  102. package/dist/components/Card.cjs +1 -1
  103. package/dist/components/Carousel/Carousel.cjs +1 -1
  104. package/dist/components/Carousel/Carousel.cjs.map +1 -1
  105. package/dist/components/Carousel/Carousel.d.ts +3 -3
  106. package/dist/components/Carousel/Carousel.js +28 -34
  107. package/dist/components/Carousel/Carousel.js.map +1 -1
  108. package/dist/components/Carousel.cjs +1 -1
  109. package/dist/components/CheckRow/CheckRow.cjs +1 -1
  110. package/dist/components/CheckRow/CheckRow.cjs.map +1 -1
  111. package/dist/components/CheckRow/CheckRow.d.ts +1 -1
  112. package/dist/components/CheckRow/CheckRow.js +7 -7
  113. package/dist/components/CheckRow/CheckRow.js.map +1 -1
  114. package/dist/components/CheckRow.cjs +1 -1
  115. package/dist/components/Checkbox/Checkbox.cjs +1 -1
  116. package/dist/components/Checkbox/Checkbox.cjs.map +1 -1
  117. package/dist/components/Checkbox/Checkbox.d.ts +1 -1
  118. package/dist/components/Checkbox/Checkbox.js +2 -2
  119. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  120. package/dist/components/Checkbox.cjs +1 -1
  121. package/dist/components/Chip/Chip.cjs +1 -1
  122. package/dist/components/Chip/Chip.cjs.map +1 -1
  123. package/dist/components/Chip/Chip.d.ts +1 -1
  124. package/dist/components/Chip/Chip.js +2 -2
  125. package/dist/components/Chip/Chip.js.map +1 -1
  126. package/dist/components/Chip.cjs +1 -1
  127. package/dist/components/Clamp/Clamp.cjs +1 -1
  128. package/dist/components/Clamp/Clamp.cjs.map +1 -1
  129. package/dist/components/Clamp/Clamp.d.ts +1 -1
  130. package/dist/components/Clamp/Clamp.js +9 -11
  131. package/dist/components/Clamp/Clamp.js.map +1 -1
  132. package/dist/components/Clamp.cjs +1 -1
  133. package/dist/components/ColorPicker/ColorPicker.cjs +1 -1
  134. package/dist/components/ColorPicker/ColorPicker.cjs.map +1 -1
  135. package/dist/components/ColorPicker/ColorPicker.d.ts +2 -2
  136. package/dist/components/ColorPicker/ColorPicker.js +33 -37
  137. package/dist/components/ColorPicker/ColorPicker.js.map +1 -1
  138. package/dist/components/ColorPicker/ColorPicker.module.css.cjs +1 -1
  139. package/dist/components/ColorPicker/ColorPicker.module.css.js +9 -10
  140. package/dist/components/ColorPicker.cjs +1 -1
  141. package/dist/components/ColumnView/ColumnView.cjs +1 -1
  142. package/dist/components/ColumnView/ColumnView.cjs.map +1 -1
  143. package/dist/components/ColumnView/ColumnView.d.ts +1 -1
  144. package/dist/components/ColumnView/ColumnView.js +24 -28
  145. package/dist/components/ColumnView/ColumnView.js.map +1 -1
  146. package/dist/components/ColumnView.cjs +1 -1
  147. package/dist/components/ComboRow/ComboRow.cjs +1 -1
  148. package/dist/components/ComboRow/ComboRow.cjs.map +1 -1
  149. package/dist/components/ComboRow/ComboRow.d.ts +1 -1
  150. package/dist/components/ComboRow/ComboRow.js +2 -2
  151. package/dist/components/ComboRow/ComboRow.js.map +1 -1
  152. package/dist/components/ComboRow/ComboRow.module.css.cjs +1 -1
  153. package/dist/components/ComboRow/ComboRow.module.css.js +24 -25
  154. package/dist/components/ComboRow.cjs +1 -1
  155. package/dist/components/ContributionGraph/ContributionGraph.cjs +1 -1
  156. package/dist/components/ContributionGraph/ContributionGraph.cjs.map +1 -1
  157. package/dist/components/ContributionGraph/ContributionGraph.d.ts +1 -1
  158. package/dist/components/ContributionGraph/ContributionGraph.js +2 -2
  159. package/dist/components/ContributionGraph/ContributionGraph.js.map +1 -1
  160. package/dist/components/ContributionGraph.cjs +1 -1
  161. package/dist/components/CountDownTimer/CountDownTimer.cjs +1 -1
  162. package/dist/components/CountDownTimer/CountDownTimer.cjs.map +1 -1
  163. package/dist/components/CountDownTimer/CountDownTimer.d.ts +1 -1
  164. package/dist/components/CountDownTimer/CountDownTimer.js +2 -2
  165. package/dist/components/CountDownTimer/CountDownTimer.js.map +1 -1
  166. package/dist/components/CountDownTimer.cjs +1 -1
  167. package/dist/components/Dialog/Dialog.cjs +1 -1
  168. package/dist/components/Dialog/Dialog.cjs.map +1 -1
  169. package/dist/components/Dialog/Dialog.d.ts +1 -1
  170. package/dist/components/Dialog/Dialog.js +2 -2
  171. package/dist/components/Dialog/Dialog.js.map +1 -1
  172. package/dist/components/Dialog/Dialog.module.css.cjs +1 -1
  173. package/dist/components/Dialog/Dialog.module.css.js +8 -9
  174. package/dist/components/Dialog/dialogUtils.cjs +1 -1
  175. package/dist/components/Dialog/dialogUtils.cjs.map +1 -1
  176. package/dist/components/Dialog/dialogUtils.js.map +1 -1
  177. package/dist/components/Dialog.cjs +1 -1
  178. package/dist/components/Drawer/Drawer.cjs +1 -1
  179. package/dist/components/Drawer/Drawer.cjs.map +1 -1
  180. package/dist/components/Drawer/Drawer.d.ts +1 -1
  181. package/dist/components/Drawer/Drawer.js +2 -2
  182. package/dist/components/Drawer/Drawer.js.map +1 -1
  183. package/dist/components/Drawer/Drawer.module.css.cjs +1 -1
  184. package/dist/components/Drawer/Drawer.module.css.js +11 -12
  185. package/dist/components/Drawer.cjs +1 -1
  186. package/dist/components/Dropdown/Dropdown.cjs +1 -1
  187. package/dist/components/Dropdown/Dropdown.cjs.map +1 -1
  188. package/dist/components/Dropdown/Dropdown.d.ts +1 -1
  189. package/dist/components/Dropdown/Dropdown.js +2 -2
  190. package/dist/components/Dropdown/Dropdown.js.map +1 -1
  191. package/dist/components/Dropdown/Dropdown.module.css.cjs +1 -1
  192. package/dist/components/Dropdown/Dropdown.module.css.js +20 -21
  193. package/dist/components/Dropdown.cjs +1 -1
  194. package/dist/components/EntryRow/EntryRow.cjs +1 -1
  195. package/dist/components/EntryRow/EntryRow.cjs.map +1 -1
  196. package/dist/components/EntryRow/EntryRow.d.ts +1 -1
  197. package/dist/components/EntryRow/EntryRow.js +2 -2
  198. package/dist/components/EntryRow/EntryRow.js.map +1 -1
  199. package/dist/components/EntryRow.cjs +1 -1
  200. package/dist/components/ExpanderRow/ExpanderRow.cjs +1 -1
  201. package/dist/components/ExpanderRow/ExpanderRow.cjs.map +1 -1
  202. package/dist/components/ExpanderRow/ExpanderRow.d.ts +1 -1
  203. package/dist/components/ExpanderRow/ExpanderRow.js +2 -2
  204. package/dist/components/ExpanderRow/ExpanderRow.js.map +1 -1
  205. package/dist/components/ExpanderRow.cjs +1 -1
  206. package/dist/components/Footer/Footer.cjs +1 -1
  207. package/dist/components/Footer/Footer.cjs.map +1 -1
  208. package/dist/components/Footer/Footer.d.ts +1 -1
  209. package/dist/components/Footer/Footer.js +22 -24
  210. package/dist/components/Footer/Footer.js.map +1 -1
  211. package/dist/components/Footer.cjs +1 -1
  212. package/dist/components/Frame/Frame.cjs +1 -1
  213. package/dist/components/Frame/Frame.cjs.map +1 -1
  214. package/dist/components/Frame/Frame.d.ts +1 -1
  215. package/dist/components/Frame/Frame.js +5 -7
  216. package/dist/components/Frame/Frame.js.map +1 -1
  217. package/dist/components/Frame.cjs +1 -1
  218. package/dist/components/GnomeProvider/GnomeContext.cjs +1 -1
  219. package/dist/components/GnomeProvider/GnomeContext.cjs.map +1 -1
  220. package/dist/components/GnomeProvider/GnomeContext.js.map +1 -1
  221. package/dist/components/GnomeProvider/GnomeProvider.cjs +1 -1
  222. package/dist/components/GnomeProvider/GnomeProvider.cjs.map +1 -1
  223. package/dist/components/GnomeProvider/GnomeProvider.d.ts +1 -1
  224. package/dist/components/GnomeProvider/GnomeProvider.js +2 -2
  225. package/dist/components/GnomeProvider/GnomeProvider.js.map +1 -1
  226. package/dist/components/HeaderBar/HeaderBar.cjs +1 -1
  227. package/dist/components/HeaderBar/HeaderBar.cjs.map +1 -1
  228. package/dist/components/HeaderBar/HeaderBar.d.ts +1 -1
  229. package/dist/components/HeaderBar/HeaderBar.js +26 -28
  230. package/dist/components/HeaderBar/HeaderBar.js.map +1 -1
  231. package/dist/components/HeaderBar.cjs +1 -1
  232. package/dist/components/Icon/Icon.cjs +1 -1
  233. package/dist/components/Icon/Icon.cjs.map +1 -1
  234. package/dist/components/Icon/Icon.d.ts +1 -1
  235. package/dist/components/Icon/Icon.js +2 -2
  236. package/dist/components/Icon/Icon.js.map +1 -1
  237. package/dist/components/Icon.cjs +1 -1
  238. package/dist/components/IconButton/IconButton.cjs +1 -1
  239. package/dist/components/IconButton/IconButton.cjs.map +1 -1
  240. package/dist/components/IconButton/IconButton.js +4 -4
  241. package/dist/components/IconButton/IconButton.js.map +1 -1
  242. package/dist/components/IconButton.cjs +1 -1
  243. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.cjs +1 -1
  244. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.cjs.map +1 -1
  245. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.d.ts +1 -1
  246. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.js +2 -2
  247. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.js.map +1 -1
  248. package/dist/components/InlineViewSwitcher/InlineViewSwitcherItem.cjs +1 -1
  249. package/dist/components/InlineViewSwitcher/InlineViewSwitcherItem.cjs.map +1 -1
  250. package/dist/components/InlineViewSwitcher/InlineViewSwitcherItem.d.ts +1 -1
  251. package/dist/components/InlineViewSwitcher/InlineViewSwitcherItem.js +2 -2
  252. package/dist/components/InlineViewSwitcher/InlineViewSwitcherItem.js.map +1 -1
  253. package/dist/components/InlineViewSwitcher.cjs +1 -1
  254. package/dist/components/Link/Link.cjs +1 -1
  255. package/dist/components/Link/Link.cjs.map +1 -1
  256. package/dist/components/Link/Link.d.ts +1 -1
  257. package/dist/components/Link/Link.js +2 -2
  258. package/dist/components/Link/Link.js.map +1 -1
  259. package/dist/components/Link.cjs +1 -1
  260. package/dist/components/LinkedGroup/LinkedGroup.cjs +1 -1
  261. package/dist/components/LinkedGroup/LinkedGroup.cjs.map +1 -1
  262. package/dist/components/LinkedGroup/LinkedGroup.d.ts +1 -1
  263. package/dist/components/LinkedGroup/LinkedGroup.js +9 -11
  264. package/dist/components/LinkedGroup/LinkedGroup.js.map +1 -1
  265. package/dist/components/LinkedGroup.cjs +1 -1
  266. package/dist/components/NavigationSplitView/NavigationSplitView.cjs +1 -1
  267. package/dist/components/NavigationSplitView/NavigationSplitView.cjs.map +1 -1
  268. package/dist/components/NavigationSplitView/NavigationSplitView.d.ts +1 -1
  269. package/dist/components/NavigationSplitView/NavigationSplitView.js +2 -2
  270. package/dist/components/NavigationSplitView/NavigationSplitView.js.map +1 -1
  271. package/dist/components/NavigationSplitView.cjs +1 -1
  272. package/dist/components/NavigationView/NavigationView.cjs +1 -1
  273. package/dist/components/NavigationView/NavigationView.cjs.map +1 -1
  274. package/dist/components/NavigationView/NavigationView.d.ts +2 -2
  275. package/dist/components/NavigationView/NavigationView.js +3 -4
  276. package/dist/components/NavigationView/NavigationView.js.map +1 -1
  277. package/dist/components/NavigationView/NavigationView.module.css.cjs +1 -1
  278. package/dist/components/NavigationView/NavigationView.module.css.js +9 -10
  279. package/dist/components/NavigationView.cjs +1 -1
  280. package/dist/components/OverlaySplitView/OverlaySplitView.cjs +1 -1
  281. package/dist/components/OverlaySplitView/OverlaySplitView.cjs.map +1 -1
  282. package/dist/components/OverlaySplitView/OverlaySplitView.d.ts +1 -1
  283. package/dist/components/OverlaySplitView/OverlaySplitView.js +2 -2
  284. package/dist/components/OverlaySplitView/OverlaySplitView.js.map +1 -1
  285. package/dist/components/OverlaySplitView.cjs +1 -1
  286. package/dist/components/PasswordEntryRow/PasswordEntryRow.cjs +1 -1
  287. package/dist/components/PasswordEntryRow/PasswordEntryRow.cjs.map +1 -1
  288. package/dist/components/PasswordEntryRow/PasswordEntryRow.d.ts +1 -1
  289. package/dist/components/PasswordEntryRow/PasswordEntryRow.js +2 -2
  290. package/dist/components/PasswordEntryRow/PasswordEntryRow.js.map +1 -1
  291. package/dist/components/PasswordEntryRow.cjs +1 -1
  292. package/dist/components/PathBar/PathBar.cjs +1 -1
  293. package/dist/components/PathBar/PathBar.cjs.map +1 -1
  294. package/dist/components/PathBar/PathBar.d.ts +1 -1
  295. package/dist/components/PathBar/PathBar.js +48 -50
  296. package/dist/components/PathBar/PathBar.js.map +1 -1
  297. package/dist/components/PathBar.cjs +1 -1
  298. package/dist/components/Popover/Popover.cjs +1 -1
  299. package/dist/components/Popover/Popover.cjs.map +1 -1
  300. package/dist/components/Popover/Popover.d.ts +1 -1
  301. package/dist/components/Popover/Popover.js +5 -5
  302. package/dist/components/Popover/Popover.js.map +1 -1
  303. package/dist/components/Popover.cjs +1 -1
  304. package/dist/components/PreferencesDialog/PreferencesDialog.cjs +1 -1
  305. package/dist/components/PreferencesDialog/PreferencesDialog.cjs.map +1 -1
  306. package/dist/components/PreferencesDialog/PreferencesDialog.d.ts +1 -1
  307. package/dist/components/PreferencesDialog/PreferencesDialog.js +2 -2
  308. package/dist/components/PreferencesDialog/PreferencesDialog.js.map +1 -1
  309. package/dist/components/PreferencesDialog/PreferencesDialog.module.css.cjs +1 -1
  310. package/dist/components/PreferencesDialog/PreferencesDialog.module.css.js +18 -19
  311. package/dist/components/PreferencesDialog.cjs +1 -1
  312. package/dist/components/PreferencesGroup/PreferencesGroup.cjs +1 -1
  313. package/dist/components/PreferencesGroup/PreferencesGroup.cjs.map +1 -1
  314. package/dist/components/PreferencesGroup/PreferencesGroup.d.ts +1 -1
  315. package/dist/components/PreferencesGroup/PreferencesGroup.js +2 -2
  316. package/dist/components/PreferencesGroup/PreferencesGroup.js.map +1 -1
  317. package/dist/components/PreferencesGroup.cjs +1 -1
  318. package/dist/components/PreferencesPage/PreferencesPage.cjs +1 -1
  319. package/dist/components/PreferencesPage/PreferencesPage.cjs.map +1 -1
  320. package/dist/components/PreferencesPage/PreferencesPage.d.ts +1 -1
  321. package/dist/components/PreferencesPage/PreferencesPage.js +9 -11
  322. package/dist/components/PreferencesPage/PreferencesPage.js.map +1 -1
  323. package/dist/components/PreferencesPage.cjs +1 -1
  324. package/dist/components/ProgressBar/ProgressBar.cjs +1 -1
  325. package/dist/components/ProgressBar/ProgressBar.cjs.map +1 -1
  326. package/dist/components/ProgressBar/ProgressBar.d.ts +1 -1
  327. package/dist/components/ProgressBar/ProgressBar.js +2 -2
  328. package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
  329. package/dist/components/ProgressBar.cjs +1 -1
  330. package/dist/components/RadioButton/RadioButton.cjs +1 -1
  331. package/dist/components/RadioButton/RadioButton.cjs.map +1 -1
  332. package/dist/components/RadioButton/RadioButton.d.ts +1 -1
  333. package/dist/components/RadioButton/RadioButton.js +5 -7
  334. package/dist/components/RadioButton/RadioButton.js.map +1 -1
  335. package/dist/components/RadioButton.cjs +1 -1
  336. package/dist/components/SearchBar/SearchBar.cjs +1 -1
  337. package/dist/components/SearchBar/SearchBar.cjs.map +1 -1
  338. package/dist/components/SearchBar/SearchBar.d.ts +1 -1
  339. package/dist/components/SearchBar/SearchBar.js +2 -2
  340. package/dist/components/SearchBar/SearchBar.js.map +1 -1
  341. package/dist/components/SearchBar.cjs +1 -1
  342. package/dist/components/SegmentedBar/SegmentedBar.cjs +1 -1
  343. package/dist/components/SegmentedBar/SegmentedBar.cjs.map +1 -1
  344. package/dist/components/SegmentedBar/SegmentedBar.js.map +1 -1
  345. package/dist/components/SegmentedBar.cjs +1 -1
  346. package/dist/components/Separator/Separator.cjs +1 -1
  347. package/dist/components/Separator/Separator.cjs.map +1 -1
  348. package/dist/components/Separator/Separator.d.ts +1 -1
  349. package/dist/components/Separator/Separator.js +2 -2
  350. package/dist/components/Separator/Separator.js.map +1 -1
  351. package/dist/components/Separator.cjs +1 -1
  352. package/dist/components/ShortcutLabel/ShortcutLabel.cjs +1 -1
  353. package/dist/components/ShortcutLabel/ShortcutLabel.cjs.map +1 -1
  354. package/dist/components/ShortcutLabel/ShortcutLabel.d.ts +1 -1
  355. package/dist/components/ShortcutLabel/ShortcutLabel.js +2 -3
  356. package/dist/components/ShortcutLabel/ShortcutLabel.js.map +1 -1
  357. package/dist/components/ShortcutLabel.cjs +1 -1
  358. package/dist/components/ShortcutsDialog/ShortcutsDialog.cjs +1 -1
  359. package/dist/components/ShortcutsDialog/ShortcutsDialog.cjs.map +1 -1
  360. package/dist/components/ShortcutsDialog/ShortcutsDialog.d.ts +1 -1
  361. package/dist/components/ShortcutsDialog/ShortcutsDialog.js +2 -3
  362. package/dist/components/ShortcutsDialog/ShortcutsDialog.js.map +1 -1
  363. package/dist/components/ShortcutsDialog/ShortcutsDialog.module.css.cjs +1 -1
  364. package/dist/components/ShortcutsDialog/ShortcutsDialog.module.css.js +21 -22
  365. package/dist/components/ShortcutsDialog.cjs +1 -1
  366. package/dist/components/Sidebar/Sidebar.cjs +1 -1
  367. package/dist/components/Sidebar/Sidebar.cjs.map +1 -1
  368. package/dist/components/Sidebar/Sidebar.d.ts +1 -1
  369. package/dist/components/Sidebar/Sidebar.js +2 -3
  370. package/dist/components/Sidebar/Sidebar.js.map +1 -1
  371. package/dist/components/Sidebar/Sidebar.module.css.cjs +1 -1
  372. package/dist/components/Sidebar/Sidebar.module.css.js +33 -34
  373. package/dist/components/Sidebar/SidebarItem.cjs +1 -1
  374. package/dist/components/Sidebar/SidebarItem.cjs.map +1 -1
  375. package/dist/components/Sidebar/SidebarItem.d.ts +1 -1
  376. package/dist/components/Sidebar/SidebarItem.js +16 -16
  377. package/dist/components/Sidebar/SidebarItem.js.map +1 -1
  378. package/dist/components/Sidebar/SidebarSection.cjs +1 -1
  379. package/dist/components/Sidebar/SidebarSection.cjs.map +1 -1
  380. package/dist/components/Sidebar/SidebarSection.js.map +1 -1
  381. package/dist/components/Sidebar.cjs +1 -1
  382. package/dist/components/Skeleton/Skeleton.cjs +1 -1
  383. package/dist/components/Skeleton/Skeleton.cjs.map +1 -1
  384. package/dist/components/Skeleton/Skeleton.d.ts +1 -1
  385. package/dist/components/Skeleton/Skeleton.js +9 -10
  386. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  387. package/dist/components/Skeleton.cjs +1 -1
  388. package/dist/components/Slider/Slider.cjs +1 -1
  389. package/dist/components/Slider/Slider.cjs.map +1 -1
  390. package/dist/components/Slider/Slider.d.ts +1 -1
  391. package/dist/components/Slider/Slider.js +2 -2
  392. package/dist/components/Slider/Slider.js.map +1 -1
  393. package/dist/components/Slider.cjs +1 -1
  394. package/dist/components/SpinButton/SpinButton.cjs +1 -1
  395. package/dist/components/SpinButton/SpinButton.cjs.map +1 -1
  396. package/dist/components/SpinButton/SpinButton.d.ts +1 -1
  397. package/dist/components/SpinButton/SpinButton.js +2 -2
  398. package/dist/components/SpinButton/SpinButton.js.map +1 -1
  399. package/dist/components/SpinButton.cjs +1 -1
  400. package/dist/components/SpinRow/SpinRow.cjs +1 -1
  401. package/dist/components/SpinRow/SpinRow.cjs.map +1 -1
  402. package/dist/components/SpinRow/SpinRow.d.ts +1 -1
  403. package/dist/components/SpinRow/SpinRow.js +2 -2
  404. package/dist/components/SpinRow/SpinRow.js.map +1 -1
  405. package/dist/components/SpinRow.cjs +1 -1
  406. package/dist/components/Spinner/Spinner.cjs +1 -1
  407. package/dist/components/Spinner/Spinner.cjs.map +1 -1
  408. package/dist/components/Spinner/Spinner.d.ts +1 -1
  409. package/dist/components/Spinner/Spinner.js +2 -2
  410. package/dist/components/Spinner/Spinner.js.map +1 -1
  411. package/dist/components/Spinner.cjs +1 -1
  412. package/dist/components/SplitButton/SplitButton.cjs +1 -1
  413. package/dist/components/SplitButton/SplitButton.cjs.map +1 -1
  414. package/dist/components/SplitButton/SplitButton.d.ts +1 -1
  415. package/dist/components/SplitButton/SplitButton.js +2 -2
  416. package/dist/components/SplitButton/SplitButton.js.map +1 -1
  417. package/dist/components/SplitButton.cjs +1 -1
  418. package/dist/components/StatusBadge/StatusBadge.cjs +1 -1
  419. package/dist/components/StatusBadge/StatusBadge.cjs.map +1 -1
  420. package/dist/components/StatusBadge/StatusBadge.d.ts +1 -1
  421. package/dist/components/StatusBadge/StatusBadge.js +9 -11
  422. package/dist/components/StatusBadge/StatusBadge.js.map +1 -1
  423. package/dist/components/StatusBadge.cjs +1 -1
  424. package/dist/components/StatusPage/StatusPage.cjs +1 -1
  425. package/dist/components/StatusPage/StatusPage.cjs.map +1 -1
  426. package/dist/components/StatusPage/StatusPage.d.ts +1 -1
  427. package/dist/components/StatusPage/StatusPage.js +2 -2
  428. package/dist/components/StatusPage/StatusPage.js.map +1 -1
  429. package/dist/components/StatusPage.cjs +1 -1
  430. package/dist/components/Switch/Switch.cjs +1 -1
  431. package/dist/components/Switch/Switch.cjs.map +1 -1
  432. package/dist/components/Switch/Switch.d.ts +1 -1
  433. package/dist/components/Switch/Switch.js +6 -8
  434. package/dist/components/Switch/Switch.js.map +1 -1
  435. package/dist/components/Switch.cjs +1 -1
  436. package/dist/components/SwitchRow/SwitchRow.cjs +1 -1
  437. package/dist/components/SwitchRow/SwitchRow.cjs.map +1 -1
  438. package/dist/components/SwitchRow/SwitchRow.d.ts +1 -1
  439. package/dist/components/SwitchRow/SwitchRow.js +7 -7
  440. package/dist/components/SwitchRow/SwitchRow.js.map +1 -1
  441. package/dist/components/SwitchRow.cjs +1 -1
  442. package/dist/components/Tabs/TabBar.cjs +1 -1
  443. package/dist/components/Tabs/TabBar.cjs.map +1 -1
  444. package/dist/components/Tabs/TabBar.d.ts +1 -1
  445. package/dist/components/Tabs/TabBar.js +2 -2
  446. package/dist/components/Tabs/TabBar.js.map +1 -1
  447. package/dist/components/Tabs/TabItem.cjs +1 -1
  448. package/dist/components/Tabs/TabItem.cjs.map +1 -1
  449. package/dist/components/Tabs/TabItem.js.map +1 -1
  450. package/dist/components/Tabs/TabPanel.cjs +1 -1
  451. package/dist/components/Tabs/TabPanel.cjs.map +1 -1
  452. package/dist/components/Tabs/TabPanel.d.ts +1 -1
  453. package/dist/components/Tabs/TabPanel.js +8 -10
  454. package/dist/components/Tabs/TabPanel.js.map +1 -1
  455. package/dist/components/Tabs.cjs +1 -1
  456. package/dist/components/TerminalView/TerminalView.cjs +1 -1
  457. package/dist/components/TerminalView/TerminalView.cjs.map +1 -1
  458. package/dist/components/TerminalView/TerminalView.d.ts +1 -1
  459. package/dist/components/TerminalView/TerminalView.js +2 -2
  460. package/dist/components/TerminalView/TerminalView.js.map +1 -1
  461. package/dist/components/TerminalView.cjs +1 -1
  462. package/dist/components/Text/Text.cjs +1 -1
  463. package/dist/components/Text/Text.cjs.map +1 -1
  464. package/dist/components/Text/Text.d.ts +1 -1
  465. package/dist/components/Text/Text.js +10 -13
  466. package/dist/components/Text/Text.js.map +1 -1
  467. package/dist/components/Text/Text.module.css.cjs +1 -1
  468. package/dist/components/Text/Text.module.css.js +9 -10
  469. package/dist/components/Text.cjs +1 -1
  470. package/dist/components/TextField/TextField.cjs +1 -1
  471. package/dist/components/TextField/TextField.cjs.map +1 -1
  472. package/dist/components/TextField/TextField.d.ts +1 -1
  473. package/dist/components/TextField/TextField.js +2 -2
  474. package/dist/components/TextField/TextField.js.map +1 -1
  475. package/dist/components/TextField.cjs +1 -1
  476. package/dist/components/Timeline/Timeline.cjs +1 -1
  477. package/dist/components/Timeline/Timeline.cjs.map +1 -1
  478. package/dist/components/Timeline/Timeline.d.ts +1 -1
  479. package/dist/components/Timeline/Timeline.js +2 -2
  480. package/dist/components/Timeline/Timeline.js.map +1 -1
  481. package/dist/components/Timeline.cjs +1 -1
  482. package/dist/components/Toast/Toast.cjs +1 -1
  483. package/dist/components/Toast/Toast.cjs.map +1 -1
  484. package/dist/components/Toast/Toast.d.ts +1 -1
  485. package/dist/components/Toast/Toast.js +2 -2
  486. package/dist/components/Toast/Toast.js.map +1 -1
  487. package/dist/components/Toast/Toast.module.css.cjs +1 -1
  488. package/dist/components/Toast/Toast.module.css.js +10 -11
  489. package/dist/components/Toast/Toaster.cjs +1 -1
  490. package/dist/components/Toast/Toaster.cjs.map +1 -1
  491. package/dist/components/Toast/Toaster.d.ts +1 -1
  492. package/dist/components/Toast/Toaster.js +2 -2
  493. package/dist/components/Toast/Toaster.js.map +1 -1
  494. package/dist/components/Toast.cjs +1 -1
  495. package/dist/components/ToggleGroup/ToggleGroup.cjs +1 -1
  496. package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -1
  497. package/dist/components/ToggleGroup/ToggleGroup.d.ts +1 -1
  498. package/dist/components/ToggleGroup/ToggleGroup.js +2 -2
  499. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  500. package/dist/components/ToggleGroup/ToggleGroupItem.cjs +1 -1
  501. package/dist/components/ToggleGroup/ToggleGroupItem.cjs.map +1 -1
  502. package/dist/components/ToggleGroup/ToggleGroupItem.d.ts +1 -1
  503. package/dist/components/ToggleGroup/ToggleGroupItem.js +2 -2
  504. package/dist/components/ToggleGroup/ToggleGroupItem.js.map +1 -1
  505. package/dist/components/ToggleGroup.cjs +1 -1
  506. package/dist/components/Toolbar/Spacer.cjs +1 -1
  507. package/dist/components/Toolbar/Spacer.cjs.map +1 -1
  508. package/dist/components/Toolbar/Spacer.d.ts +1 -1
  509. package/dist/components/Toolbar/Spacer.js +5 -7
  510. package/dist/components/Toolbar/Spacer.js.map +1 -1
  511. package/dist/components/Toolbar/Toolbar.cjs +1 -1
  512. package/dist/components/Toolbar/Toolbar.cjs.map +1 -1
  513. package/dist/components/Toolbar/Toolbar.d.ts +1 -1
  514. package/dist/components/Toolbar/Toolbar.js +5 -7
  515. package/dist/components/Toolbar/Toolbar.js.map +1 -1
  516. package/dist/components/Toolbar.cjs +1 -1
  517. package/dist/components/ToolbarView/ToolbarView.cjs +1 -1
  518. package/dist/components/ToolbarView/ToolbarView.cjs.map +1 -1
  519. package/dist/components/ToolbarView/ToolbarView.d.ts +1 -1
  520. package/dist/components/ToolbarView/ToolbarView.js +18 -20
  521. package/dist/components/ToolbarView/ToolbarView.js.map +1 -1
  522. package/dist/components/ToolbarView.cjs +1 -1
  523. package/dist/components/Tooltip/Tooltip.cjs +1 -1
  524. package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
  525. package/dist/components/Tooltip/Tooltip.d.ts +1 -1
  526. package/dist/components/Tooltip/Tooltip.js +2 -2
  527. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  528. package/dist/components/Tooltip.cjs +1 -1
  529. package/dist/components/ViewSwitcher/ViewSwitcher.cjs +1 -1
  530. package/dist/components/ViewSwitcher/ViewSwitcher.cjs.map +1 -1
  531. package/dist/components/ViewSwitcher/ViewSwitcher.d.ts +1 -1
  532. package/dist/components/ViewSwitcher/ViewSwitcher.js +2 -2
  533. package/dist/components/ViewSwitcher/ViewSwitcher.js.map +1 -1
  534. package/dist/components/ViewSwitcher/ViewSwitcherItem.cjs +1 -1
  535. package/dist/components/ViewSwitcher/ViewSwitcherItem.cjs.map +1 -1
  536. package/dist/components/ViewSwitcher/ViewSwitcherItem.d.ts +1 -1
  537. package/dist/components/ViewSwitcher/ViewSwitcherItem.js +24 -26
  538. package/dist/components/ViewSwitcher/ViewSwitcherItem.js.map +1 -1
  539. package/dist/components/ViewSwitcher.cjs +1 -1
  540. package/dist/components/ViewSwitcherBar/ViewSwitcherBar.cjs +1 -1
  541. package/dist/components/ViewSwitcherBar/ViewSwitcherBar.cjs.map +1 -1
  542. package/dist/components/ViewSwitcherBar/ViewSwitcherBar.d.ts +1 -1
  543. package/dist/components/ViewSwitcherBar/ViewSwitcherBar.js +7 -9
  544. package/dist/components/ViewSwitcherBar/ViewSwitcherBar.js.map +1 -1
  545. package/dist/components/ViewSwitcherBar.cjs +1 -1
  546. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.cjs +1 -1
  547. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.cjs.map +1 -1
  548. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.d.ts +1 -1
  549. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.js +2 -2
  550. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.js.map +1 -1
  551. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebarItem.cjs +1 -1
  552. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebarItem.cjs.map +1 -1
  553. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebarItem.d.ts +1 -1
  554. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebarItem.js +2 -2
  555. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebarItem.js.map +1 -1
  556. package/dist/components/ViewSwitcherSidebar.cjs +1 -1
  557. package/dist/components/WindowTitle/WindowTitle.cjs +1 -1
  558. package/dist/components/WindowTitle/WindowTitle.cjs.map +1 -1
  559. package/dist/components/WindowTitle/WindowTitle.d.ts +1 -1
  560. package/dist/components/WindowTitle/WindowTitle.js +11 -13
  561. package/dist/components/WindowTitle/WindowTitle.js.map +1 -1
  562. package/dist/components/WindowTitle.cjs +1 -1
  563. package/dist/components/WrapBox/WrapBox.cjs +1 -1
  564. package/dist/components/WrapBox/WrapBox.cjs.map +1 -1
  565. package/dist/components/WrapBox/WrapBox.d.ts +1 -1
  566. package/dist/components/WrapBox/WrapBox.js +5 -5
  567. package/dist/components/WrapBox/WrapBox.js.map +1 -1
  568. package/dist/components/WrapBox.cjs +1 -1
  569. package/dist/hooks/useBreakpoint.cjs +1 -1
  570. package/dist/hooks/useBreakpoint.cjs.map +1 -1
  571. package/dist/hooks/useBreakpoint.js.map +1 -1
  572. package/dist/hooks.cjs +1 -1
  573. package/dist/index.cjs +1 -1
  574. package/package.json +2 -2
@@ -1,2 +1,2 @@
1
- const e=require(`../GnomeProvider/GnomeContext.cjs`),t=require(`./CountDownTimer.module.css.cjs`);let n=require(`react`),r=require(`react/jsx-runtime`);function i({start:i,end:a,format:o=`time`,variant:s=`accent`,action:c,className:l,...u}){let d=e.useDateTimeFormatter(),[f,p]=(0,n.useState)(null),[m,h]=(0,n.useState)(!1);if((0,n.useEffect)(()=>{let e=()=>{let e=new Date,t=new Date(a).getTime()-e.getTime();return t<=0?{days:0,hours:0,minutes:0,seconds:0,isFinished:!0}:{days:Math.floor(t/(1e3*60*60*24)),hours:Math.floor(t/(1e3*60*60)%24),minutes:Math.floor(t/1e3/60%60),seconds:Math.floor(t/1e3%60),isFinished:!1}};p(e());let t=setInterval(()=>{let t=e();p(t),t.isFinished&&!m&&(c?.(),h(!0))},1e3);return()=>clearInterval(t)},[a,c,m]),!f)return null;let g=()=>{if(o===`date`){let e=new Date(a);return d.format(e)}let{days:e,hours:t,minutes:n,seconds:r,isFinished:i}=f;if(i)return`00:00:00`;if(o===`datetime`){let e=new Date(a);return`${d.format(e)} ${`${String(t).padStart(2,`0`)}:${String(n).padStart(2,`0`)}:${String(r).padStart(2,`0`)}`}`}return e>0?`${e}d ${String(t).padStart(2,`0`)}h ${String(n).padStart(2,`0`)}m`:`${String(t).padStart(2,`0`)}:${String(n).padStart(2,`0`)}:${String(r).padStart(2,`0`)}`},_=f.isFinished?`destructive`:s;return(0,r.jsx)(`div`,{className:[t.default.countdownTimer,t.default[_],f.isFinished?t.default.finished:null,l].filter(Boolean).join(` `),...u,children:(0,r.jsx)(`span`,{className:t.default.value,children:g()})})}exports.CountDownTimer=i;
1
+ const e=require("../GnomeProvider/GnomeContext.cjs"),t=require("./CountDownTimer.module.css.cjs");let n=require("react"),r=require("react/jsx-runtime");var i=({start:i,end:a,format:o=`time`,variant:s=`accent`,action:c,className:l,...u})=>{let d=e.useDateTimeFormatter(),[f,p]=(0,n.useState)(null),[m,h]=(0,n.useState)(!1);if((0,n.useEffect)(()=>{let e=()=>{let e=new Date,t=new Date(a).getTime()-e.getTime();return t<=0?{days:0,hours:0,minutes:0,seconds:0,isFinished:!0}:{days:Math.floor(t/(1e3*60*60*24)),hours:Math.floor(t/(1e3*60*60)%24),minutes:Math.floor(t/1e3/60%60),seconds:Math.floor(t/1e3%60),isFinished:!1}};p(e());let t=setInterval(()=>{let t=e();p(t),t.isFinished&&!m&&(c?.(),h(!0))},1e3);return()=>clearInterval(t)},[a,c,m]),!f)return null;let g=()=>{if(o===`date`){let e=new Date(a);return d.format(e)}let{days:e,hours:t,minutes:n,seconds:r,isFinished:i}=f;if(i)return`00:00:00`;if(o===`datetime`){let e=new Date(a);return`${d.format(e)} ${`${String(t).padStart(2,`0`)}:${String(n).padStart(2,`0`)}:${String(r).padStart(2,`0`)}`}`}return e>0?`${e}d ${String(t).padStart(2,`0`)}h ${String(n).padStart(2,`0`)}m`:`${String(t).padStart(2,`0`)}:${String(n).padStart(2,`0`)}:${String(r).padStart(2,`0`)}`},_=f.isFinished?`destructive`:s;return(0,r.jsx)(`div`,{className:[t.default.countdownTimer,t.default[_],f.isFinished?t.default.finished:null,l].filter(Boolean).join(` `),...u,children:(0,r.jsx)(`span`,{className:t.default.value,children:g()})})};exports.CountDownTimer=i;
2
2
  //# sourceMappingURL=CountDownTimer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"CountDownTimer.cjs","names":[],"sources":["../../../src/components/CountDownTimer/CountDownTimer.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react';\nimport { useEffect, useState } from 'react';\n\nimport { useDateTimeFormatter } from '../GnomeProvider/GnomeContext';\n\nimport styles from './CountDownTimer.module.css';\n\nexport type CountDownVariant = 'accent' | 'destructive' | 'success' | 'warning';\n\nexport interface CountDownTimerProps extends HTMLAttributes<HTMLDivElement> {\n /** Start date for the countdown */\n start: Date;\n /** End date for the countdown */\n end: Date;\n /** Format to display: \"date\", \"time\", or \"datetime\" */\n format?: 'date' | 'time' | 'datetime';\n /** Visual style variant. Defaults to `\"accent\"`. */\n variant?: CountDownVariant;\n /** Callback action to execute when countdown reaches zero */\n action?: () => void;\n}\n\ninterface TimeRemaining {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n isFinished: boolean;\n}\n\n/**\n * CountDown timer component that displays remaining time and executes an action when time runs out.\n *\n * @see https://developer.gnome.org/hig/patterns/\n */\nexport function CountDownTimer({\n start: _start,\n end,\n format = 'time',\n variant = 'accent',\n action,\n className,\n ...props\n}: CountDownTimerProps) {\n const dateFormatter = useDateTimeFormatter();\n const [timeRemaining, setTimeRemaining] = useState<TimeRemaining | null>(null);\n const [hasExecutedAction, setHasExecutedAction] = useState(false);\n\n useEffect(() => {\n const calculateTimeRemaining = (): TimeRemaining => {\n const now = new Date();\n const endTime = new Date(end).getTime();\n const nowTime = now.getTime();\n const difference = endTime - nowTime;\n\n if (difference <= 0) {\n return {\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n isFinished: true,\n };\n }\n\n const days = Math.floor(difference / (1000 * 60 * 60 * 24));\n const hours = Math.floor((difference / (1000 * 60 * 60)) % 24);\n const minutes = Math.floor((difference / 1000 / 60) % 60);\n const seconds = Math.floor((difference / 1000) % 60);\n\n return {\n days,\n hours,\n minutes,\n seconds,\n isFinished: false,\n };\n };\n\n // Initial calculation\n setTimeRemaining(calculateTimeRemaining());\n\n // Update every second\n const interval = setInterval(() => {\n const remaining = calculateTimeRemaining();\n\n setTimeRemaining(remaining);\n\n // Execute action when countdown finishes\n if (remaining.isFinished && !hasExecutedAction) {\n action?.();\n setHasExecutedAction(true);\n }\n }, 1000);\n\n return () => clearInterval(interval);\n }, [end, action, hasExecutedAction]);\n\n if (!timeRemaining) {\n return null;\n }\n\n const formatTime = (): string => {\n if (format === 'date') {\n const endDate = new Date(end);\n\n return dateFormatter.format(endDate);\n }\n\n const { days, hours, minutes, seconds, isFinished } = timeRemaining;\n\n if (isFinished) {\n return '00:00:00';\n }\n\n if (format === 'datetime') {\n const endDate = new Date(end);\n const dateString = dateFormatter.format(endDate);\n const timeString = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n\n return `${dateString} ${timeString}`;\n }\n\n if (days > 0) {\n return `${days}d ${String(hours).padStart(2, '0')}h ${String(minutes).padStart(2, '0')}m`;\n }\n\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n };\n\n const displayVariant = timeRemaining.isFinished ? 'destructive' : variant;\n\n return (\n <div\n className={[\n styles.countdownTimer,\n styles[displayVariant],\n timeRemaining.isFinished ? styles.finished : null,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n <span className={styles.value}>{formatTime()}</span>\n </div>\n );\n}\n"],"mappings":"wJAmCA,SAAgB,EAAe,CAC7B,MAAO,EACP,MACA,SAAS,OACT,UAAU,SACV,SACA,YACA,GAAG,GACmB,CACtB,IAAM,EAAgB,EAAA,sBAAsB,CACtC,CAAC,EAAe,IAAA,EAAA,EAAA,UAAmD,KAAK,CACxE,CAAC,EAAmB,IAAA,EAAA,EAAA,UAAiC,GAAM,CAoDjE,IAlDA,EAAA,EAAA,eAAgB,CACd,IAAM,MAA8C,CAClD,IAAM,EAAM,IAAI,KAGV,EAFU,IAAI,KAAK,EAAI,CAAC,SAAS,CACvB,EAAI,SAAS,CAkB7B,OAfI,GAAc,EACT,CACL,KAAM,EACN,MAAO,EACP,QAAS,EACT,QAAS,EACT,WAAY,GACb,CAQI,CACL,KANW,KAAK,MAAM,GAAc,IAAO,GAAK,GAAK,IAAI,CAOzD,MANY,KAAK,MAAO,GAAc,IAAO,GAAK,IAAO,GAAG,CAO5D,QANc,KAAK,MAAO,EAAa,IAAO,GAAM,GAAG,CAOvD,QANc,KAAK,MAAO,EAAa,IAAQ,GAAG,CAOlD,WAAY,GACb,EAIH,EAAiB,GAAwB,CAAC,CAG1C,IAAM,EAAW,gBAAkB,CACjC,IAAM,EAAY,GAAwB,CAE1C,EAAiB,EAAU,CAGvB,EAAU,YAAc,CAAC,IAC3B,KAAU,CACV,EAAqB,GAAK,GAE3B,IAAK,CAER,UAAa,cAAc,EAAS,EACnC,CAAC,EAAK,EAAQ,EAAkB,CAAC,CAEhC,CAAC,EACH,OAAO,KAGT,IAAM,MAA2B,CAC/B,GAAI,IAAW,OAAQ,CACrB,IAAM,EAAU,IAAI,KAAK,EAAI,CAE7B,OAAO,EAAc,OAAO,EAAQ,CAGtC,GAAM,CAAE,OAAM,QAAO,UAAS,UAAS,cAAe,EAEtD,GAAI,EACF,MAAO,WAGT,GAAI,IAAW,WAAY,CACzB,IAAM,EAAU,IAAI,KAAK,EAAI,CAI7B,MAAO,GAHY,EAAc,OAAO,EAAQ,CAG3B,GAFF,GAAG,OAAO,EAAM,CAAC,SAAS,EAAG,IAAI,CAAC,GAAG,OAAO,EAAQ,CAAC,SAAS,EAAG,IAAI,CAAC,GAAG,OAAO,EAAQ,CAAC,SAAS,EAAG,IAAI,KAS9H,OAJI,EAAO,EACF,GAAG,EAAK,IAAI,OAAO,EAAM,CAAC,SAAS,EAAG,IAAI,CAAC,IAAI,OAAO,EAAQ,CAAC,SAAS,EAAG,IAAI,CAAC,GAGlF,GAAG,OAAO,EAAM,CAAC,SAAS,EAAG,IAAI,CAAC,GAAG,OAAO,EAAQ,CAAC,SAAS,EAAG,IAAI,CAAC,GAAG,OAAO,EAAQ,CAAC,SAAS,EAAG,IAAI,IAG5G,EAAiB,EAAc,WAAa,cAAgB,EAElE,OACE,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,CACT,EAAA,QAAO,eACP,EAAA,QAAO,GACP,EAAc,WAAa,EAAA,QAAO,SAAW,KAC7C,EACD,CACE,OAAO,QAAQ,CACf,KAAK,IAAI,CACZ,GAAI,YAEJ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,GAAY,CAAQ,CAAA,CAChD,CAAA"}
1
+ {"version":3,"file":"CountDownTimer.cjs","names":[],"sources":["../../../src/components/CountDownTimer/CountDownTimer.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react';\nimport { useEffect, useState } from 'react';\n\nimport { useDateTimeFormatter } from '../GnomeProvider/GnomeContext';\n\nimport styles from './CountDownTimer.module.css';\n\nexport type CountDownVariant = 'accent' | 'destructive' | 'success' | 'warning';\n\nexport interface CountDownTimerProps extends HTMLAttributes<HTMLDivElement> {\n /** Start date for the countdown */\n start: Date;\n /** End date for the countdown */\n end: Date;\n /** Format to display: \"date\", \"time\", or \"datetime\" */\n format?: 'date' | 'time' | 'datetime';\n /** Visual style variant. Defaults to `\"accent\"`. */\n variant?: CountDownVariant;\n /** Callback action to execute when countdown reaches zero */\n action?: () => void;\n}\n\ninterface TimeRemaining {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n isFinished: boolean;\n}\n\n/**\n * CountDown timer component that displays remaining time and executes an action when time runs out.\n *\n * @see https://developer.gnome.org/hig/patterns/\n */\nexport const CountDownTimer = ({\n start: _start,\n end,\n format = 'time',\n variant = 'accent',\n action,\n className,\n ...props\n}: CountDownTimerProps) => {\n const dateFormatter = useDateTimeFormatter();\n const [timeRemaining, setTimeRemaining] = useState<TimeRemaining | null>(null);\n const [hasExecutedAction, setHasExecutedAction] = useState(false);\n\n useEffect(() => {\n const calculateTimeRemaining = (): TimeRemaining => {\n const now = new Date();\n const endTime = new Date(end).getTime();\n const nowTime = now.getTime();\n const difference = endTime - nowTime;\n\n if (difference <= 0) {\n return {\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n isFinished: true,\n };\n }\n\n const days = Math.floor(difference / (1000 * 60 * 60 * 24));\n const hours = Math.floor((difference / (1000 * 60 * 60)) % 24);\n const minutes = Math.floor((difference / 1000 / 60) % 60);\n const seconds = Math.floor((difference / 1000) % 60);\n\n return {\n days,\n hours,\n minutes,\n seconds,\n isFinished: false,\n };\n };\n\n // Initial calculation\n setTimeRemaining(calculateTimeRemaining());\n\n // Update every second\n const interval = setInterval(() => {\n const remaining = calculateTimeRemaining();\n\n setTimeRemaining(remaining);\n\n // Execute action when countdown finishes\n if (remaining.isFinished && !hasExecutedAction) {\n action?.();\n setHasExecutedAction(true);\n }\n }, 1000);\n\n return () => clearInterval(interval);\n }, [end, action, hasExecutedAction]);\n\n if (!timeRemaining) {\n return null;\n }\n\n const formatTime = (): string => {\n if (format === 'date') {\n const endDate = new Date(end);\n\n return dateFormatter.format(endDate);\n }\n\n const { days, hours, minutes, seconds, isFinished } = timeRemaining;\n\n if (isFinished) {\n return '00:00:00';\n }\n\n if (format === 'datetime') {\n const endDate = new Date(end);\n const dateString = dateFormatter.format(endDate);\n const timeString = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n\n return `${dateString} ${timeString}`;\n }\n\n if (days > 0) {\n return `${days}d ${String(hours).padStart(2, '0')}h ${String(minutes).padStart(2, '0')}m`;\n }\n\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n };\n\n const displayVariant = timeRemaining.isFinished ? 'destructive' : variant;\n\n return (\n <div\n className={[\n styles.countdownTimer,\n styles[displayVariant],\n timeRemaining.isFinished ? styles.finished : null,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n <span className={styles.value}>{formatTime()}</span>\n </div>\n );\n};\n"],"mappings":"wJAmCA,IAAa,GAAkB,CAC7B,MAAO,EACP,MACA,SAAS,OACT,UAAU,SACV,SACA,YACA,GAAG,KACsB,CACzB,IAAM,EAAgB,EAAA,qBAAqB,EACrC,CAAC,EAAe,IAAA,EAAA,EAAA,UAAmD,IAAI,EACvE,CAAC,EAAmB,IAAA,EAAA,EAAA,UAAiC,EAAK,EAoDhE,IAlDA,EAAA,EAAA,eAAgB,CACd,IAAM,MAA8C,CAClD,IAAM,EAAM,IAAI,KAGV,EAFU,IAAI,KAAK,CAAG,EAAE,QAEX,EADH,EAAI,QACS,EAiB7B,OAfI,GAAc,EACT,CACL,KAAM,EACN,MAAO,EACP,QAAS,EACT,QAAS,EACT,WAAY,EACd,EAQK,CACL,KANW,KAAK,MAAM,GAAc,IAAO,GAAK,GAAK,GAMrD,EACA,MANY,KAAK,MAAO,GAAc,IAAO,GAAK,IAAO,EAMzD,EACA,QANc,KAAK,MAAO,EAAa,IAAO,GAAM,EAMpD,EACA,QANc,KAAK,MAAO,EAAa,IAAQ,EAM/C,EACA,WAAY,EACd,CACF,EAGA,EAAiB,EAAuB,CAAC,EAGzC,IAAM,EAAW,gBAAkB,CACjC,IAAM,EAAY,EAAuB,EAEzC,EAAiB,CAAS,EAGtB,EAAU,YAAc,CAAC,IAC3B,IAAS,EACT,EAAqB,EAAI,EAE7B,EAAG,GAAI,EAEP,UAAa,cAAc,CAAQ,CACrC,EAAG,CAAC,EAAK,EAAQ,CAAiB,CAAC,EAE/B,CAAC,EACH,OAAO,KAGT,IAAM,MAA2B,CAC/B,GAAI,IAAW,OAAQ,CACrB,IAAM,EAAU,IAAI,KAAK,CAAG,EAE5B,OAAO,EAAc,OAAO,CAAO,CACrC,CAEA,GAAM,CAAE,OAAM,QAAO,UAAS,UAAS,cAAe,EAEtD,GAAI,EACF,MAAO,WAGT,GAAI,IAAW,WAAY,CACzB,IAAM,EAAU,IAAI,KAAK,CAAG,EAI5B,MAAO,GAHY,EAAc,OAAO,CAG9B,EAAW,GAAG,GAFF,OAAO,CAAK,EAAE,SAAS,EAAG,GAAG,EAAE,GAAG,OAAO,CAAO,EAAE,SAAS,EAAG,GAAG,EAAE,GAAG,OAAO,CAAO,EAAE,SAAS,EAAG,GAAG,KAG7H,CAMA,OAJI,EAAO,EACF,GAAG,EAAK,IAAI,OAAO,CAAK,EAAE,SAAS,EAAG,GAAG,EAAE,IAAI,OAAO,CAAO,EAAE,SAAS,EAAG,GAAG,EAAE,GAGlF,GAAG,OAAO,CAAK,EAAE,SAAS,EAAG,GAAG,EAAE,GAAG,OAAO,CAAO,EAAE,SAAS,EAAG,GAAG,EAAE,GAAG,OAAO,CAAO,EAAE,SAAS,EAAG,GAAG,GACjH,EAEM,EAAiB,EAAc,WAAa,cAAgB,EAElE,OACE,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,CACT,EAAA,QAAO,eACP,EAAA,QAAO,GACP,EAAc,WAAa,EAAA,QAAO,SAAW,KAC7C,CACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG,EACX,GAAI,YAEJ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,EAAW,CAAQ,CAAA,CAChD,CAAA,CAET"}
@@ -17,4 +17,4 @@ export interface CountDownTimerProps extends HTMLAttributes<HTMLDivElement> {
17
17
  *
18
18
  * @see https://developer.gnome.org/hig/patterns/
19
19
  */
20
- export declare function CountDownTimer({ start: _start, end, format, variant, action, className, ...props }: CountDownTimerProps): import("react/jsx-runtime").JSX.Element | null;
20
+ export declare const CountDownTimer: ({ start: _start, end, format, variant, action, className, ...props }: CountDownTimerProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -3,7 +3,7 @@ import t from "./CountDownTimer.module.css.js";
3
3
  import { useEffect as n, useState as r } from "react";
4
4
  import { jsx as i } from "react/jsx-runtime";
5
5
  //#region src/components/CountDownTimer/CountDownTimer.tsx
6
- function a({ start: a, end: o, format: s = "time", variant: c = "accent", action: l, className: u, ...d }) {
6
+ var a = ({ start: a, end: o, format: s = "time", variant: c = "accent", action: l, className: u, ...d }) => {
7
7
  let f = e(), [p, m] = r(null), [h, g] = r(!1);
8
8
  if (n(() => {
9
9
  let e = () => {
@@ -59,7 +59,7 @@ function a({ start: a, end: o, format: s = "time", variant: c = "accent", action
59
59
  children: _()
60
60
  })
61
61
  });
62
- }
62
+ };
63
63
  //#endregion
64
64
  export { a as CountDownTimer };
65
65
 
@@ -1 +1 @@
1
- {"version":3,"file":"CountDownTimer.js","names":[],"sources":["../../../src/components/CountDownTimer/CountDownTimer.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react';\nimport { useEffect, useState } from 'react';\n\nimport { useDateTimeFormatter } from '../GnomeProvider/GnomeContext';\n\nimport styles from './CountDownTimer.module.css';\n\nexport type CountDownVariant = 'accent' | 'destructive' | 'success' | 'warning';\n\nexport interface CountDownTimerProps extends HTMLAttributes<HTMLDivElement> {\n /** Start date for the countdown */\n start: Date;\n /** End date for the countdown */\n end: Date;\n /** Format to display: \"date\", \"time\", or \"datetime\" */\n format?: 'date' | 'time' | 'datetime';\n /** Visual style variant. Defaults to `\"accent\"`. */\n variant?: CountDownVariant;\n /** Callback action to execute when countdown reaches zero */\n action?: () => void;\n}\n\ninterface TimeRemaining {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n isFinished: boolean;\n}\n\n/**\n * CountDown timer component that displays remaining time and executes an action when time runs out.\n *\n * @see https://developer.gnome.org/hig/patterns/\n */\nexport function CountDownTimer({\n start: _start,\n end,\n format = 'time',\n variant = 'accent',\n action,\n className,\n ...props\n}: CountDownTimerProps) {\n const dateFormatter = useDateTimeFormatter();\n const [timeRemaining, setTimeRemaining] = useState<TimeRemaining | null>(null);\n const [hasExecutedAction, setHasExecutedAction] = useState(false);\n\n useEffect(() => {\n const calculateTimeRemaining = (): TimeRemaining => {\n const now = new Date();\n const endTime = new Date(end).getTime();\n const nowTime = now.getTime();\n const difference = endTime - nowTime;\n\n if (difference <= 0) {\n return {\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n isFinished: true,\n };\n }\n\n const days = Math.floor(difference / (1000 * 60 * 60 * 24));\n const hours = Math.floor((difference / (1000 * 60 * 60)) % 24);\n const minutes = Math.floor((difference / 1000 / 60) % 60);\n const seconds = Math.floor((difference / 1000) % 60);\n\n return {\n days,\n hours,\n minutes,\n seconds,\n isFinished: false,\n };\n };\n\n // Initial calculation\n setTimeRemaining(calculateTimeRemaining());\n\n // Update every second\n const interval = setInterval(() => {\n const remaining = calculateTimeRemaining();\n\n setTimeRemaining(remaining);\n\n // Execute action when countdown finishes\n if (remaining.isFinished && !hasExecutedAction) {\n action?.();\n setHasExecutedAction(true);\n }\n }, 1000);\n\n return () => clearInterval(interval);\n }, [end, action, hasExecutedAction]);\n\n if (!timeRemaining) {\n return null;\n }\n\n const formatTime = (): string => {\n if (format === 'date') {\n const endDate = new Date(end);\n\n return dateFormatter.format(endDate);\n }\n\n const { days, hours, minutes, seconds, isFinished } = timeRemaining;\n\n if (isFinished) {\n return '00:00:00';\n }\n\n if (format === 'datetime') {\n const endDate = new Date(end);\n const dateString = dateFormatter.format(endDate);\n const timeString = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n\n return `${dateString} ${timeString}`;\n }\n\n if (days > 0) {\n return `${days}d ${String(hours).padStart(2, '0')}h ${String(minutes).padStart(2, '0')}m`;\n }\n\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n };\n\n const displayVariant = timeRemaining.isFinished ? 'destructive' : variant;\n\n return (\n <div\n className={[\n styles.countdownTimer,\n styles[displayVariant],\n timeRemaining.isFinished ? styles.finished : null,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n <span className={styles.value}>{formatTime()}</span>\n </div>\n );\n}\n"],"mappings":";;;;;AAmCA,SAAgB,EAAe,EAC7B,OAAO,GACP,QACA,YAAS,QACT,aAAU,UACV,WACA,cACA,GAAG,KACmB;CACtB,IAAM,IAAgB,GAAsB,EACtC,CAAC,GAAe,KAAoB,EAA+B,KAAK,EACxE,CAAC,GAAmB,KAAwB,EAAS,GAAM;AAoDjE,KAlDA,QAAgB;EACd,IAAM,UAA8C;GAClD,IAAM,oBAAM,IAAI,MAAM,EAGhB,IAFU,IAAI,KAAK,EAAI,CAAC,SAAS,GACvB,EAAI,SAAS;AAkB7B,UAfI,KAAc,IACT;IACL,MAAM;IACN,OAAO;IACP,SAAS;IACT,SAAS;IACT,YAAY;IACb,GAQI;IACL,MANW,KAAK,MAAM,KAAc,MAAO,KAAK,KAAK,IAAI;IAOzD,OANY,KAAK,MAAO,KAAc,MAAO,KAAK,MAAO,GAAG;IAO5D,SANc,KAAK,MAAO,IAAa,MAAO,KAAM,GAAG;IAOvD,SANc,KAAK,MAAO,IAAa,MAAQ,GAAG;IAOlD,YAAY;IACb;;AAIH,IAAiB,GAAwB,CAAC;EAG1C,IAAM,IAAW,kBAAkB;GACjC,IAAM,IAAY,GAAwB;AAK1C,GAHA,EAAiB,EAAU,EAGvB,EAAU,cAAc,CAAC,MAC3B,KAAU,EACV,EAAqB,GAAK;KAE3B,IAAK;AAER,eAAa,cAAc,EAAS;IACnC;EAAC;EAAK;EAAQ;EAAkB,CAAC,EAEhC,CAAC,EACH,QAAO;CAGT,IAAM,UAA2B;AAC/B,MAAI,MAAW,QAAQ;GACrB,IAAM,IAAU,IAAI,KAAK,EAAI;AAE7B,UAAO,EAAc,OAAO,EAAQ;;EAGtC,IAAM,EAAE,SAAM,UAAO,YAAS,YAAS,kBAAe;AAEtD,MAAI,EACF,QAAO;AAGT,MAAI,MAAW,YAAY;GACzB,IAAM,IAAU,IAAI,KAAK,EAAI;AAI7B,UAAO,GAHY,EAAc,OAAO,EAAQ,CAG3B,GAFF,GAAG,OAAO,EAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,EAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,EAAQ,CAAC,SAAS,GAAG,IAAI;;AAS9H,SAJI,IAAO,IACF,GAAG,EAAK,IAAI,OAAO,EAAM,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,OAAO,EAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,KAGlF,GAAG,OAAO,EAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,EAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,EAAQ,CAAC,SAAS,GAAG,IAAI;IAG5G,IAAiB,EAAc,aAAa,gBAAgB;AAElE,QACE,kBAAC,OAAD;EACE,WAAW;GACT,EAAO;GACP,EAAO;GACP,EAAc,aAAa,EAAO,WAAW;GAC7C;GACD,CACE,OAAO,QAAQ,CACf,KAAK,IAAI;EACZ,GAAI;YAEJ,kBAAC,QAAD;GAAM,WAAW,EAAO;aAAQ,GAAY;GAAQ,CAAA;EAChD,CAAA"}
1
+ {"version":3,"file":"CountDownTimer.js","names":[],"sources":["../../../src/components/CountDownTimer/CountDownTimer.tsx"],"sourcesContent":["import type { HTMLAttributes } from 'react';\nimport { useEffect, useState } from 'react';\n\nimport { useDateTimeFormatter } from '../GnomeProvider/GnomeContext';\n\nimport styles from './CountDownTimer.module.css';\n\nexport type CountDownVariant = 'accent' | 'destructive' | 'success' | 'warning';\n\nexport interface CountDownTimerProps extends HTMLAttributes<HTMLDivElement> {\n /** Start date for the countdown */\n start: Date;\n /** End date for the countdown */\n end: Date;\n /** Format to display: \"date\", \"time\", or \"datetime\" */\n format?: 'date' | 'time' | 'datetime';\n /** Visual style variant. Defaults to `\"accent\"`. */\n variant?: CountDownVariant;\n /** Callback action to execute when countdown reaches zero */\n action?: () => void;\n}\n\ninterface TimeRemaining {\n days: number;\n hours: number;\n minutes: number;\n seconds: number;\n isFinished: boolean;\n}\n\n/**\n * CountDown timer component that displays remaining time and executes an action when time runs out.\n *\n * @see https://developer.gnome.org/hig/patterns/\n */\nexport const CountDownTimer = ({\n start: _start,\n end,\n format = 'time',\n variant = 'accent',\n action,\n className,\n ...props\n}: CountDownTimerProps) => {\n const dateFormatter = useDateTimeFormatter();\n const [timeRemaining, setTimeRemaining] = useState<TimeRemaining | null>(null);\n const [hasExecutedAction, setHasExecutedAction] = useState(false);\n\n useEffect(() => {\n const calculateTimeRemaining = (): TimeRemaining => {\n const now = new Date();\n const endTime = new Date(end).getTime();\n const nowTime = now.getTime();\n const difference = endTime - nowTime;\n\n if (difference <= 0) {\n return {\n days: 0,\n hours: 0,\n minutes: 0,\n seconds: 0,\n isFinished: true,\n };\n }\n\n const days = Math.floor(difference / (1000 * 60 * 60 * 24));\n const hours = Math.floor((difference / (1000 * 60 * 60)) % 24);\n const minutes = Math.floor((difference / 1000 / 60) % 60);\n const seconds = Math.floor((difference / 1000) % 60);\n\n return {\n days,\n hours,\n minutes,\n seconds,\n isFinished: false,\n };\n };\n\n // Initial calculation\n setTimeRemaining(calculateTimeRemaining());\n\n // Update every second\n const interval = setInterval(() => {\n const remaining = calculateTimeRemaining();\n\n setTimeRemaining(remaining);\n\n // Execute action when countdown finishes\n if (remaining.isFinished && !hasExecutedAction) {\n action?.();\n setHasExecutedAction(true);\n }\n }, 1000);\n\n return () => clearInterval(interval);\n }, [end, action, hasExecutedAction]);\n\n if (!timeRemaining) {\n return null;\n }\n\n const formatTime = (): string => {\n if (format === 'date') {\n const endDate = new Date(end);\n\n return dateFormatter.format(endDate);\n }\n\n const { days, hours, minutes, seconds, isFinished } = timeRemaining;\n\n if (isFinished) {\n return '00:00:00';\n }\n\n if (format === 'datetime') {\n const endDate = new Date(end);\n const dateString = dateFormatter.format(endDate);\n const timeString = `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n\n return `${dateString} ${timeString}`;\n }\n\n if (days > 0) {\n return `${days}d ${String(hours).padStart(2, '0')}h ${String(minutes).padStart(2, '0')}m`;\n }\n\n return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n };\n\n const displayVariant = timeRemaining.isFinished ? 'destructive' : variant;\n\n return (\n <div\n className={[\n styles.countdownTimer,\n styles[displayVariant],\n timeRemaining.isFinished ? styles.finished : null,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n {...props}\n >\n <span className={styles.value}>{formatTime()}</span>\n </div>\n );\n};\n"],"mappings":";;;;;AAmCA,IAAa,KAAkB,EAC7B,OAAO,GACP,QACA,YAAS,QACT,aAAU,UACV,WACA,cACA,GAAG,QACsB;CACzB,IAAM,IAAgB,EAAqB,GACrC,CAAC,GAAe,KAAoB,EAA+B,IAAI,GACvE,CAAC,GAAmB,KAAwB,EAAS,EAAK;CAoDhE,IAlDA,QAAgB;EACd,IAAM,UAA8C;GAClD,IAAM,oBAAM,IAAI,KAAK,GAGf,IAFU,IAAI,KAAK,CAAG,EAAE,QAEX,IADH,EAAI,QACS;GAiB7B,OAfI,KAAc,IACT;IACL,MAAM;IACN,OAAO;IACP,SAAS;IACT,SAAS;IACT,YAAY;GACd,IAQK;IACL,MANW,KAAK,MAAM,KAAc,MAAO,KAAK,KAAK,GAMrD;IACA,OANY,KAAK,MAAO,KAAc,MAAO,KAAK,MAAO,EAMzD;IACA,SANc,KAAK,MAAO,IAAa,MAAO,KAAM,EAMpD;IACA,SANc,KAAK,MAAO,IAAa,MAAQ,EAM/C;IACA,YAAY;GACd;EACF;EAGA,EAAiB,EAAuB,CAAC;EAGzC,IAAM,IAAW,kBAAkB;GACjC,IAAM,IAAY,EAAuB;GAKzC,AAHA,EAAiB,CAAS,GAGtB,EAAU,cAAc,CAAC,MAC3B,IAAS,GACT,EAAqB,EAAI;EAE7B,GAAG,GAAI;EAEP,aAAa,cAAc,CAAQ;CACrC,GAAG;EAAC;EAAK;EAAQ;CAAiB,CAAC,GAE/B,CAAC,GACH,OAAO;CAGT,IAAM,UAA2B;EAC/B,IAAI,MAAW,QAAQ;GACrB,IAAM,IAAU,IAAI,KAAK,CAAG;GAE5B,OAAO,EAAc,OAAO,CAAO;EACrC;EAEA,IAAM,EAAE,SAAM,UAAO,YAAS,YAAS,kBAAe;EAEtD,IAAI,GACF,OAAO;EAGT,IAAI,MAAW,YAAY;GACzB,IAAM,IAAU,IAAI,KAAK,CAAG;GAI5B,OAAO,GAHY,EAAc,OAAO,CAG9B,EAAW,GAAG,GAFF,OAAO,CAAK,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,CAAO,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,CAAO,EAAE,SAAS,GAAG,GAAG;EAG7H;EAMA,OAJI,IAAO,IACF,GAAG,EAAK,IAAI,OAAO,CAAK,EAAE,SAAS,GAAG,GAAG,EAAE,IAAI,OAAO,CAAO,EAAE,SAAS,GAAG,GAAG,EAAE,KAGlF,GAAG,OAAO,CAAK,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,CAAO,EAAE,SAAS,GAAG,GAAG,EAAE,GAAG,OAAO,CAAO,EAAE,SAAS,GAAG,GAAG;CACjH,GAEM,IAAiB,EAAc,aAAa,gBAAgB;CAElE,OACE,kBAAC,OAAD;EACE,WAAW;GACT,EAAO;GACP,EAAO;GACP,EAAc,aAAa,EAAO,WAAW;GAC7C;EACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;EACX,GAAI;YAEJ,kBAAC,QAAD;GAAM,WAAW,EAAO;aAAQ,EAAW;EAAQ,CAAA;CAChD,CAAA;AAET"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./CountDownTimer/CountDownTimer.cjs`);exports.CountDownTimer=e.CountDownTimer;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./CountDownTimer/CountDownTimer.cjs");exports.CountDownTimer=e.CountDownTimer;
@@ -1,2 +1,2 @@
1
- const e=require(`./dialogUtils.cjs`),t=require(`./Dialog.module.css.cjs`);let n=require(`react`),r=require(`react-dom`),i=require(`react/jsx-runtime`);function a({open:a,title:o,children:s,buttons:c=[],onClose:l,closeOnBackdrop:u=!0,role:d=`dialog`,responses:f,onResponse:p,className:m,...h}){let g=(0,n.useRef)(null),_=(0,n.useId)(),v=(0,n.useRef)(null),y=!!f,b=e.useVisualViewport();(0,n.useEffect)(()=>{a?(v.current=document.activeElement,(g.current?.querySelector(e.FOCUSABLE))?.focus()):v.current?.focus()},[a]);let x=(0,n.useCallback)(()=>{let e=f?.find(e=>e.variant!==`destructive`&&!e.disabled);e&&p?.(e.id)},[f,p]),S=y?x:u?l:void 0,C=(0,n.useCallback)(t=>{if(t.key===`Escape`){t.preventDefault(),y?x():l?.();return}e.trapFocus(t,g)},[y,x,l]);if(!a)return null;let w=()=>y&&f?(0,i.jsx)(`div`,{className:t.default.footer,children:f.map(e=>(0,i.jsx)(`button`,{type:`button`,disabled:e.disabled,className:[t.default.btn,t.default[`btn-${e.variant??`default`}`]].filter(Boolean).join(` `),onClick:()=>p?.(e.id),children:e.label},e.id))}):c.length>0?(0,i.jsx)(`div`,{className:t.default.footer,children:c.map(e=>(0,i.jsx)(`button`,{type:`button`,disabled:e.disabled,className:[t.default.btn,t.default[`btn-${e.variant??`default`}`]].filter(Boolean).join(` `),onClick:e.onClick,children:e.label},e.label))}):null,T=(0,i.jsx)(`div`,{className:t.default.backdrop,style:b,onClick:S,"aria-hidden":`true`,children:(0,i.jsxs)(`div`,{ref:g,role:d,"aria-modal":`true`,"aria-labelledby":_,className:[t.default.dialog,m].filter(Boolean).join(` `),onKeyDown:C,onClick:e=>e.stopPropagation(),...h,children:[o&&(0,i.jsx)(`div`,{id:_,className:t.default.title,children:o}),s&&(0,i.jsx)(`div`,{className:t.default.body,children:s}),w()]})});return typeof document>`u`?T:(0,r.createPortal)(T,document.body)}exports.Dialog=a;
1
+ const e=require("./dialogUtils.cjs"),t=require("./Dialog.module.css.cjs");let n=require("react"),r=require("react-dom"),i=require("react/jsx-runtime");var a=({open:a,title:o,children:s,buttons:c=[],onClose:l,closeOnBackdrop:u=!0,role:d=`dialog`,responses:f,onResponse:p,className:m,...h})=>{let g=(0,n.useRef)(null),_=(0,n.useId)(),v=(0,n.useRef)(null),y=!!f,b=e.useVisualViewport();(0,n.useEffect)(()=>{a?(v.current=document.activeElement,(g.current?.querySelector(e.FOCUSABLE))?.focus()):v.current?.focus()},[a]);let x=(0,n.useCallback)(()=>{let e=f?.find(e=>e.variant!==`destructive`&&!e.disabled);e&&p?.(e.id)},[f,p]),S=y?x:u?l:void 0,C=(0,n.useCallback)(t=>{if(t.key===`Escape`){t.preventDefault(),y?x():l?.();return}e.trapFocus(t,g)},[y,x,l]);if(!a)return null;let w=()=>y&&f?(0,i.jsx)(`div`,{className:t.default.footer,children:f.map(e=>(0,i.jsx)(`button`,{type:`button`,disabled:e.disabled,className:[t.default.btn,t.default[`btn-${e.variant??`default`}`]].filter(Boolean).join(` `),onClick:()=>p?.(e.id),children:e.label},e.id))}):c.length>0?(0,i.jsx)(`div`,{className:t.default.footer,children:c.map(e=>(0,i.jsx)(`button`,{type:`button`,disabled:e.disabled,className:[t.default.btn,t.default[`btn-${e.variant??`default`}`]].filter(Boolean).join(` `),onClick:e.onClick,children:e.label},e.label))}):null,T=(0,i.jsx)(`div`,{className:t.default.backdrop,style:b,onClick:S,"aria-hidden":`true`,children:(0,i.jsxs)(`div`,{ref:g,role:d,"aria-modal":`true`,"aria-labelledby":_,className:[t.default.dialog,m].filter(Boolean).join(` `),onKeyDown:C,onClick:e=>e.stopPropagation(),...h,children:[o&&(0,i.jsx)(`div`,{id:_,className:t.default.title,children:o}),s&&(0,i.jsx)(`div`,{className:t.default.body,children:s}),w()]})});return typeof document>`u`?T:(0,r.createPortal)(T,document.body)};exports.Dialog=a;
2
2
  //# sourceMappingURL=Dialog.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.cjs","names":[],"sources":["../../../src/components/Dialog/Dialog.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport styles from './Dialog.module.css';\nimport { FOCUSABLE, trapFocus, useVisualViewport } from './dialogUtils';\n\n// ─── AlertDialog types ────────────────────────────────────────────────────────\n\nexport type AlertDialogResponseVariant = 'default' | 'suggested' | 'destructive';\n\nexport interface AlertDialogResponse {\n /**\n * Unique identifier returned via `onResponse`.\n * Use `\"cancel\"` by convention for the dismissive action.\n */\n id: string;\n /** Button label. */\n label: string;\n /** Visual emphasis. Defaults to `\"default\"`. */\n variant?: AlertDialogResponseVariant;\n /** Disables the button. */\n disabled?: boolean;\n}\n\n// ─── Dialog ───────────────────────────────────────────────────────────────────\n\nexport interface DialogButton {\n /** Button label. */\n label: string;\n /** Visual variant. Defaults to `\"default\"`. */\n variant?: 'default' | 'suggested' | 'destructive';\n /** Called when the button is clicked. */\n onClick: () => void;\n /** Whether the button is disabled. */\n disabled?: boolean;\n}\n\nexport interface DialogProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Whether the dialog is visible. */\n open: boolean;\n\n // ── Standard dialog ──────────────────────────────────────────────────────\n\n /** Dialog heading. */\n title?: ReactNode;\n /** Body content. */\n children?: ReactNode;\n /** Action buttons (standard dialog API). */\n buttons?: DialogButton[];\n /** Called on Escape or backdrop click. */\n onClose?: () => void;\n /** Whether clicking the backdrop closes the dialog. Defaults to `true`. */\n closeOnBackdrop?: boolean;\n\n // ── AlertDialog extension ─────────────────────────────────────────────────\n\n /**\n * ARIA role. Use `\"alertdialog\"` for confirmations and destructive warnings —\n * screen readers announce it immediately. Defaults to `\"dialog\"`.\n *\n * When using `role=\"alertdialog\"`, prefer the `responses`/`onResponse` API\n * over `buttons`/`onClick` for semantic clarity.\n */\n role?: 'dialog' | 'alertdialog';\n\n /**\n * Response buttons (AlertDialog API). Alternative to `buttons` — each\n * response has a semantic `id` returned via `onResponse`.\n * Escape and backdrop click fire the first non-destructive response.\n */\n responses?: AlertDialogResponse[];\n\n /**\n * Called with the `id` of the response button clicked.\n * Required when `responses` is provided.\n */\n onResponse?: (id: string) => void;\n}\n\n/**\n * Blocking modal dialog following the Adwaita pattern.\n *\n * **Standard** — `title` + `children` + `buttons[]`.\n *\n * **Alert** — add `role=\"alertdialog\"` + `responses[]` + `onResponse`.\n * Uses a semantic response id instead of per-button `onClick`.\n * Escape / backdrop fire the first non-destructive response.\n * Mirrors `AdwAlertDialog`.\n *\n * For the app-info dialog, use `<AboutDialog />` instead.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Dialog.html\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.AlertDialog.html\n */\nexport function Dialog({\n open,\n title,\n children,\n buttons = [],\n onClose,\n closeOnBackdrop = true,\n role = 'dialog',\n responses,\n onResponse,\n className,\n ...props\n}: DialogProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n\n const isAlert = !!responses;\n const viewportStyle = useVisualViewport();\n\n // ── Focus management ───────────────────────────────────────────────────────\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n const el = dialogRef.current?.querySelector<HTMLElement>(FOCUSABLE);\n\n el?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n // ── Dismiss helpers ────────────────────────────────────────────────────────\n const dismissAlert = useCallback(() => {\n const cancel = responses?.find((r) => r.variant !== 'destructive' && !r.disabled);\n\n if (cancel) {\n onResponse?.(cancel.id);\n }\n }, [responses, onResponse]);\n\n const handleBackdrop = isAlert ? dismissAlert : closeOnBackdrop ? onClose : undefined;\n\n // ── Keyboard ───────────────────────────────────────────────────────────────\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n if (isAlert) {\n dismissAlert();\n } else {\n onClose?.();\n }\n\n return;\n }\n\n trapFocus(e, dialogRef);\n },\n [isAlert, dismissAlert, onClose],\n );\n\n if (!open) {\n return null;\n }\n\n // ── Render buttons (standard or alert) ────────────────────────────────────\n const renderButtons = () => {\n if (isAlert && responses) {\n return (\n <div className={styles.footer}>\n {responses.map((r) => (\n <button\n key={r.id}\n type=\"button\"\n disabled={r.disabled}\n className={[styles.btn, styles[`btn-${r.variant ?? 'default'}`]]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onResponse?.(r.id)}\n >\n {r.label}\n </button>\n ))}\n </div>\n );\n }\n\n if (buttons.length > 0) {\n return (\n <div className={styles.footer}>\n {buttons.map((btn) => (\n <button\n key={btn.label}\n type=\"button\"\n disabled={btn.disabled}\n className={[styles.btn, styles[`btn-${btn.variant ?? 'default'}`]]\n .filter(Boolean)\n .join(' ')}\n onClick={btn.onClick}\n >\n {btn.label}\n </button>\n ))}\n </div>\n );\n }\n\n return null;\n };\n\n const node = (\n <div\n className={styles.backdrop}\n style={viewportStyle}\n onClick={handleBackdrop}\n aria-hidden=\"true\"\n >\n <div\n ref={dialogRef}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={[styles.dialog, className].filter(Boolean).join(' ')}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {title && (\n <div id={titleId} className={styles.title}>\n {title}\n </div>\n )}\n {children && <div className={styles.body}>{children}</div>}\n {renderButtons()}\n </div>\n </div>\n );\n\n if (typeof document === 'undefined') {\n return node;\n }\n\n return createPortal(node, document.body);\n}\n"],"mappings":"uJAuGA,SAAgB,EAAO,CACrB,OACA,QACA,WACA,UAAU,EAAE,CACZ,UACA,kBAAkB,GAClB,OAAO,SACP,YACA,aACA,YACA,GAAG,GACW,CACd,IAAM,GAAA,EAAA,EAAA,QAAmC,KAAK,CACxC,GAAA,EAAA,EAAA,QAAiB,CACjB,GAAA,EAAA,EAAA,QAA2C,KAAK,CAEhD,EAAU,CAAC,CAAC,EACZ,EAAgB,EAAA,mBAAmB,EAGzC,EAAA,EAAA,eAAgB,CACV,GACF,EAAkB,QAAU,SAAS,eAC1B,EAAU,SAAS,cAA2B,EAAA,UAAU,GAE/D,OAAO,EAEV,EAAkB,SAAgC,OAAO,EAE3D,CAAC,EAAK,CAAC,CAGV,IAAM,GAAA,EAAA,EAAA,iBAAiC,CACrC,IAAM,EAAS,GAAW,KAAM,GAAM,EAAE,UAAY,eAAiB,CAAC,EAAE,SAAS,CAE7E,GACF,IAAa,EAAO,GAAG,EAExB,CAAC,EAAW,EAAW,CAAC,CAErB,EAAiB,EAAU,EAAe,EAAkB,EAAU,IAAA,GAGtE,GAAA,EAAA,EAAA,aACH,GAAqC,CACpC,GAAI,EAAE,MAAQ,SAAU,CACtB,EAAE,gBAAgB,CACd,EACF,GAAc,CAEd,KAAW,CAGb,OAGF,EAAA,UAAU,EAAG,EAAU,EAEzB,CAAC,EAAS,EAAc,EAAQ,CACjC,CAED,GAAI,CAAC,EACH,OAAO,KAIT,IAAM,MACA,GAAW,GAEX,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,gBACpB,EAAU,IAAK,IACd,EAAA,EAAA,KAAC,SAAD,CAEE,KAAK,SACL,SAAU,EAAE,SACZ,UAAW,CAAC,EAAA,QAAO,IAAK,EAAA,QAAO,OAAO,EAAE,SAAW,aAAa,CAC7D,OAAO,QAAQ,CACf,KAAK,IAAI,CACZ,YAAe,IAAa,EAAE,GAAG,UAEhC,EAAE,MACI,CATF,EAAE,GASA,CACT,CACE,CAAA,CAIN,EAAQ,OAAS,GAEjB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,gBACpB,EAAQ,IAAK,IACZ,EAAA,EAAA,KAAC,SAAD,CAEE,KAAK,SACL,SAAU,EAAI,SACd,UAAW,CAAC,EAAA,QAAO,IAAK,EAAA,QAAO,OAAO,EAAI,SAAW,aAAa,CAC/D,OAAO,QAAQ,CACf,KAAK,IAAI,CACZ,QAAS,EAAI,iBAEZ,EAAI,MACE,CATF,EAAI,MASF,CACT,CACE,CAAA,CAIH,KAGH,GACJ,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,EAAA,QAAO,SAClB,MAAO,EACP,QAAS,EACT,cAAY,iBAEZ,EAAA,EAAA,MAAC,MAAD,CACE,IAAK,EACC,OACN,aAAW,OACX,kBAAiB,EACjB,UAAW,CAAC,EAAA,QAAO,OAAQ,EAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,CAC/D,UAAW,EACX,QAAU,GAAM,EAAE,iBAAiB,CACnC,GAAI,WARN,CAUG,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,GAAI,EAAS,UAAW,EAAA,QAAO,eACjC,EACG,CAAA,CAEP,IAAY,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,KAAO,WAAe,CAAA,CACzD,GAAe,CACZ,GACF,CAAA,CAOR,OAJI,OAAO,SAAa,IACf,GAGT,EAAA,EAAA,cAAoB,EAAM,SAAS,KAAK"}
1
+ {"version":3,"file":"Dialog.cjs","names":[],"sources":["../../../src/components/Dialog/Dialog.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport styles from './Dialog.module.css';\nimport { FOCUSABLE, trapFocus, useVisualViewport } from './dialogUtils';\n\n// ─── AlertDialog types ────────────────────────────────────────────────────────\n\nexport type AlertDialogResponseVariant = 'default' | 'suggested' | 'destructive';\n\nexport interface AlertDialogResponse {\n /**\n * Unique identifier returned via `onResponse`.\n * Use `\"cancel\"` by convention for the dismissive action.\n */\n id: string;\n /** Button label. */\n label: string;\n /** Visual emphasis. Defaults to `\"default\"`. */\n variant?: AlertDialogResponseVariant;\n /** Disables the button. */\n disabled?: boolean;\n}\n\n// ─── Dialog ───────────────────────────────────────────────────────────────────\n\nexport interface DialogButton {\n /** Button label. */\n label: string;\n /** Visual variant. Defaults to `\"default\"`. */\n variant?: 'default' | 'suggested' | 'destructive';\n /** Called when the button is clicked. */\n onClick: () => void;\n /** Whether the button is disabled. */\n disabled?: boolean;\n}\n\nexport interface DialogProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Whether the dialog is visible. */\n open: boolean;\n\n // ── Standard dialog ──────────────────────────────────────────────────────\n\n /** Dialog heading. */\n title?: ReactNode;\n /** Body content. */\n children?: ReactNode;\n /** Action buttons (standard dialog API). */\n buttons?: DialogButton[];\n /** Called on Escape or backdrop click. */\n onClose?: () => void;\n /** Whether clicking the backdrop closes the dialog. Defaults to `true`. */\n closeOnBackdrop?: boolean;\n\n // ── AlertDialog extension ─────────────────────────────────────────────────\n\n /**\n * ARIA role. Use `\"alertdialog\"` for confirmations and destructive warnings —\n * screen readers announce it immediately. Defaults to `\"dialog\"`.\n *\n * When using `role=\"alertdialog\"`, prefer the `responses`/`onResponse` API\n * over `buttons`/`onClick` for semantic clarity.\n */\n role?: 'dialog' | 'alertdialog';\n\n /**\n * Response buttons (AlertDialog API). Alternative to `buttons` — each\n * response has a semantic `id` returned via `onResponse`.\n * Escape and backdrop click fire the first non-destructive response.\n */\n responses?: AlertDialogResponse[];\n\n /**\n * Called with the `id` of the response button clicked.\n * Required when `responses` is provided.\n */\n onResponse?: (id: string) => void;\n}\n\n/**\n * Blocking modal dialog following the Adwaita pattern.\n *\n * **Standard** — `title` + `children` + `buttons[]`.\n *\n * **Alert** — add `role=\"alertdialog\"` + `responses[]` + `onResponse`.\n * Uses a semantic response id instead of per-button `onClick`.\n * Escape / backdrop fire the first non-destructive response.\n * Mirrors `AdwAlertDialog`.\n *\n * For the app-info dialog, use `<AboutDialog />` instead.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Dialog.html\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.AlertDialog.html\n */\nexport const Dialog = ({\n open,\n title,\n children,\n buttons = [],\n onClose,\n closeOnBackdrop = true,\n role = 'dialog',\n responses,\n onResponse,\n className,\n ...props\n}: DialogProps) => {\n const dialogRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n\n const isAlert = !!responses;\n const viewportStyle = useVisualViewport();\n\n // ── Focus management ───────────────────────────────────────────────────────\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n const el = dialogRef.current?.querySelector<HTMLElement>(FOCUSABLE);\n\n el?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n // ── Dismiss helpers ────────────────────────────────────────────────────────\n const dismissAlert = useCallback(() => {\n const cancel = responses?.find((r) => r.variant !== 'destructive' && !r.disabled);\n\n if (cancel) {\n onResponse?.(cancel.id);\n }\n }, [responses, onResponse]);\n\n const handleBackdrop = isAlert ? dismissAlert : closeOnBackdrop ? onClose : undefined;\n\n // ── Keyboard ───────────────────────────────────────────────────────────────\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n if (isAlert) {\n dismissAlert();\n } else {\n onClose?.();\n }\n\n return;\n }\n\n trapFocus(e, dialogRef);\n },\n [isAlert, dismissAlert, onClose],\n );\n\n if (!open) {\n return null;\n }\n\n // ── Render buttons (standard or alert) ────────────────────────────────────\n const renderButtons = () => {\n if (isAlert && responses) {\n return (\n <div className={styles.footer}>\n {responses.map((r) => (\n <button\n key={r.id}\n type=\"button\"\n disabled={r.disabled}\n className={[styles.btn, styles[`btn-${r.variant ?? 'default'}`]]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onResponse?.(r.id)}\n >\n {r.label}\n </button>\n ))}\n </div>\n );\n }\n\n if (buttons.length > 0) {\n return (\n <div className={styles.footer}>\n {buttons.map((btn) => (\n <button\n key={btn.label}\n type=\"button\"\n disabled={btn.disabled}\n className={[styles.btn, styles[`btn-${btn.variant ?? 'default'}`]]\n .filter(Boolean)\n .join(' ')}\n onClick={btn.onClick}\n >\n {btn.label}\n </button>\n ))}\n </div>\n );\n }\n\n return null;\n };\n\n const node = (\n <div\n className={styles.backdrop}\n style={viewportStyle}\n onClick={handleBackdrop}\n aria-hidden=\"true\"\n >\n <div\n ref={dialogRef}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={[styles.dialog, className].filter(Boolean).join(' ')}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {title && (\n <div id={titleId} className={styles.title}>\n {title}\n </div>\n )}\n {children && <div className={styles.body}>{children}</div>}\n {renderButtons()}\n </div>\n </div>\n );\n\n if (typeof document === 'undefined') {\n return node;\n }\n\n return createPortal(node, document.body);\n};\n"],"mappings":"uJAuGA,IAAa,GAAU,CACrB,OACA,QACA,WACA,UAAU,CAAC,EACX,UACA,kBAAkB,GAClB,OAAO,SACP,YACA,aACA,YACA,GAAG,KACc,CACjB,IAAM,GAAA,EAAA,EAAA,QAAmC,IAAI,EACvC,GAAA,EAAA,EAAA,OAAgB,EAChB,GAAA,EAAA,EAAA,QAA2C,IAAI,EAE/C,EAAU,CAAC,CAAC,EACZ,EAAgB,EAAA,kBAAkB,GAGxC,EAAA,EAAA,eAAgB,CACV,GACF,EAAkB,QAAU,SAAS,eAC1B,EAAU,SAAS,cAA2B,EAAA,SAAS,IAE9D,MAAM,GAEV,EAAmB,SAAgC,MAAM,CAE7D,EAAG,CAAC,CAAI,CAAC,EAGT,IAAM,GAAA,EAAA,EAAA,iBAAiC,CACrC,IAAM,EAAS,GAAW,KAAM,GAAM,EAAE,UAAY,eAAiB,CAAC,EAAE,QAAQ,EAE5E,GACF,IAAa,EAAO,EAAE,CAE1B,EAAG,CAAC,EAAW,CAAU,CAAC,EAEpB,EAAiB,EAAU,EAAe,EAAkB,EAAU,IAAA,GAGtE,GAAA,EAAA,EAAA,aACH,GAAqC,CACpC,GAAI,EAAE,MAAQ,SAAU,CACtB,EAAE,eAAe,EACb,EACF,EAAa,EAEb,IAAU,EAGZ,MACF,CAEA,EAAA,UAAU,EAAG,CAAS,CACxB,EACA,CAAC,EAAS,EAAc,CAAO,CACjC,EAEA,GAAI,CAAC,EACH,OAAO,KAIT,IAAM,MACA,GAAW,GAEX,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,gBACpB,EAAU,IAAK,IACd,EAAA,EAAA,KAAC,SAAD,CAEE,KAAK,SACL,SAAU,EAAE,SACZ,UAAW,CAAC,EAAA,QAAO,IAAK,EAAA,QAAO,OAAO,EAAE,SAAW,YAAY,EAC5D,OAAO,OAAO,EACd,KAAK,GAAG,EACX,YAAe,IAAa,EAAE,EAAE,WAE/B,EAAE,KACG,EATD,EAAE,EASD,CACT,CACE,CAAA,EAIL,EAAQ,OAAS,GAEjB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,gBACpB,EAAQ,IAAK,IACZ,EAAA,EAAA,KAAC,SAAD,CAEE,KAAK,SACL,SAAU,EAAI,SACd,UAAW,CAAC,EAAA,QAAO,IAAK,EAAA,QAAO,OAAO,EAAI,SAAW,YAAY,EAC9D,OAAO,OAAO,EACd,KAAK,GAAG,EACX,QAAS,EAAI,iBAEZ,EAAI,KACC,EATD,EAAI,KASH,CACT,CACE,CAAA,EAIF,KAGH,GACJ,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,EAAA,QAAO,SAClB,MAAO,EACP,QAAS,EACT,cAAY,iBAEZ,EAAA,EAAA,MAAC,MAAD,CACE,IAAK,EACC,OACN,aAAW,OACX,kBAAiB,EACjB,UAAW,CAAC,EAAA,QAAO,OAAQ,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAC9D,UAAW,EACX,QAAU,GAAM,EAAE,gBAAgB,EAClC,GAAI,WARN,CAUG,IACC,EAAA,EAAA,KAAC,MAAD,CAAK,GAAI,EAAS,UAAW,EAAA,QAAO,eACjC,CACE,CAAA,EAEN,IAAY,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,KAAO,UAAc,CAAA,EACxD,EAAc,CACZ,GACF,CAAA,EAOP,OAJI,OAAO,SAAa,IACf,GAGT,EAAA,EAAA,cAAoB,EAAM,SAAS,IAAI,CACzC"}
@@ -71,4 +71,4 @@ export interface DialogProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title
71
71
  * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Dialog.html
72
72
  * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.AlertDialog.html
73
73
  */
74
- export declare function Dialog({ open, title, children, buttons, onClose, closeOnBackdrop, role, responses, onResponse, className, ...props }: DialogProps): import("react/jsx-runtime").JSX.Element | null;
74
+ export declare const Dialog: ({ open, title, children, buttons, onClose, closeOnBackdrop, role, responses, onResponse, className, ...props }: DialogProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -4,7 +4,7 @@ import { useCallback as i, useEffect as a, useId as o, useRef as s } from "react
4
4
  import { createPortal as c } from "react-dom";
5
5
  import { jsx as l, jsxs as u } from "react/jsx-runtime";
6
6
  //#region src/components/Dialog/Dialog.tsx
7
- function d({ open: d, title: f, children: p, buttons: m = [], onClose: h, closeOnBackdrop: g = !0, role: _ = "dialog", responses: v, onResponse: y, className: b, ...x }) {
7
+ var d = ({ open: d, title: f, children: p, buttons: m = [], onClose: h, closeOnBackdrop: g = !0, role: _ = "dialog", responses: v, onResponse: y, className: b, ...x }) => {
8
8
  let S = s(null), C = o(), w = s(null), T = !!v, E = n();
9
9
  a(() => {
10
10
  d ? (w.current = document.activeElement, (S.current?.querySelector(e))?.focus()) : w.current?.focus();
@@ -71,7 +71,7 @@ function d({ open: d, title: f, children: p, buttons: m = [], onClose: h, closeO
71
71
  })
72
72
  });
73
73
  return typeof document > "u" ? j : c(j, document.body);
74
- }
74
+ };
75
75
  //#endregion
76
76
  export { d as Dialog };
77
77
 
@@ -1 +1 @@
1
- {"version":3,"file":"Dialog.js","names":[],"sources":["../../../src/components/Dialog/Dialog.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport styles from './Dialog.module.css';\nimport { FOCUSABLE, trapFocus, useVisualViewport } from './dialogUtils';\n\n// ─── AlertDialog types ────────────────────────────────────────────────────────\n\nexport type AlertDialogResponseVariant = 'default' | 'suggested' | 'destructive';\n\nexport interface AlertDialogResponse {\n /**\n * Unique identifier returned via `onResponse`.\n * Use `\"cancel\"` by convention for the dismissive action.\n */\n id: string;\n /** Button label. */\n label: string;\n /** Visual emphasis. Defaults to `\"default\"`. */\n variant?: AlertDialogResponseVariant;\n /** Disables the button. */\n disabled?: boolean;\n}\n\n// ─── Dialog ───────────────────────────────────────────────────────────────────\n\nexport interface DialogButton {\n /** Button label. */\n label: string;\n /** Visual variant. Defaults to `\"default\"`. */\n variant?: 'default' | 'suggested' | 'destructive';\n /** Called when the button is clicked. */\n onClick: () => void;\n /** Whether the button is disabled. */\n disabled?: boolean;\n}\n\nexport interface DialogProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Whether the dialog is visible. */\n open: boolean;\n\n // ── Standard dialog ──────────────────────────────────────────────────────\n\n /** Dialog heading. */\n title?: ReactNode;\n /** Body content. */\n children?: ReactNode;\n /** Action buttons (standard dialog API). */\n buttons?: DialogButton[];\n /** Called on Escape or backdrop click. */\n onClose?: () => void;\n /** Whether clicking the backdrop closes the dialog. Defaults to `true`. */\n closeOnBackdrop?: boolean;\n\n // ── AlertDialog extension ─────────────────────────────────────────────────\n\n /**\n * ARIA role. Use `\"alertdialog\"` for confirmations and destructive warnings —\n * screen readers announce it immediately. Defaults to `\"dialog\"`.\n *\n * When using `role=\"alertdialog\"`, prefer the `responses`/`onResponse` API\n * over `buttons`/`onClick` for semantic clarity.\n */\n role?: 'dialog' | 'alertdialog';\n\n /**\n * Response buttons (AlertDialog API). Alternative to `buttons` — each\n * response has a semantic `id` returned via `onResponse`.\n * Escape and backdrop click fire the first non-destructive response.\n */\n responses?: AlertDialogResponse[];\n\n /**\n * Called with the `id` of the response button clicked.\n * Required when `responses` is provided.\n */\n onResponse?: (id: string) => void;\n}\n\n/**\n * Blocking modal dialog following the Adwaita pattern.\n *\n * **Standard** — `title` + `children` + `buttons[]`.\n *\n * **Alert** — add `role=\"alertdialog\"` + `responses[]` + `onResponse`.\n * Uses a semantic response id instead of per-button `onClick`.\n * Escape / backdrop fire the first non-destructive response.\n * Mirrors `AdwAlertDialog`.\n *\n * For the app-info dialog, use `<AboutDialog />` instead.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Dialog.html\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.AlertDialog.html\n */\nexport function Dialog({\n open,\n title,\n children,\n buttons = [],\n onClose,\n closeOnBackdrop = true,\n role = 'dialog',\n responses,\n onResponse,\n className,\n ...props\n}: DialogProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n\n const isAlert = !!responses;\n const viewportStyle = useVisualViewport();\n\n // ── Focus management ───────────────────────────────────────────────────────\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n const el = dialogRef.current?.querySelector<HTMLElement>(FOCUSABLE);\n\n el?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n // ── Dismiss helpers ────────────────────────────────────────────────────────\n const dismissAlert = useCallback(() => {\n const cancel = responses?.find((r) => r.variant !== 'destructive' && !r.disabled);\n\n if (cancel) {\n onResponse?.(cancel.id);\n }\n }, [responses, onResponse]);\n\n const handleBackdrop = isAlert ? dismissAlert : closeOnBackdrop ? onClose : undefined;\n\n // ── Keyboard ───────────────────────────────────────────────────────────────\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n if (isAlert) {\n dismissAlert();\n } else {\n onClose?.();\n }\n\n return;\n }\n\n trapFocus(e, dialogRef);\n },\n [isAlert, dismissAlert, onClose],\n );\n\n if (!open) {\n return null;\n }\n\n // ── Render buttons (standard or alert) ────────────────────────────────────\n const renderButtons = () => {\n if (isAlert && responses) {\n return (\n <div className={styles.footer}>\n {responses.map((r) => (\n <button\n key={r.id}\n type=\"button\"\n disabled={r.disabled}\n className={[styles.btn, styles[`btn-${r.variant ?? 'default'}`]]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onResponse?.(r.id)}\n >\n {r.label}\n </button>\n ))}\n </div>\n );\n }\n\n if (buttons.length > 0) {\n return (\n <div className={styles.footer}>\n {buttons.map((btn) => (\n <button\n key={btn.label}\n type=\"button\"\n disabled={btn.disabled}\n className={[styles.btn, styles[`btn-${btn.variant ?? 'default'}`]]\n .filter(Boolean)\n .join(' ')}\n onClick={btn.onClick}\n >\n {btn.label}\n </button>\n ))}\n </div>\n );\n }\n\n return null;\n };\n\n const node = (\n <div\n className={styles.backdrop}\n style={viewportStyle}\n onClick={handleBackdrop}\n aria-hidden=\"true\"\n >\n <div\n ref={dialogRef}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={[styles.dialog, className].filter(Boolean).join(' ')}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {title && (\n <div id={titleId} className={styles.title}>\n {title}\n </div>\n )}\n {children && <div className={styles.body}>{children}</div>}\n {renderButtons()}\n </div>\n </div>\n );\n\n if (typeof document === 'undefined') {\n return node;\n }\n\n return createPortal(node, document.body);\n}\n"],"mappings":";;;;;;AAuGA,SAAgB,EAAO,EACrB,SACA,UACA,aACA,aAAU,EAAE,EACZ,YACA,qBAAkB,IAClB,UAAO,UACP,cACA,eACA,cACA,GAAG,KACW;CACd,IAAM,IAAY,EAAuB,KAAK,EACxC,IAAU,GAAO,EACjB,IAAoB,EAAuB,KAAK,EAEhD,IAAU,CAAC,CAAC,GACZ,IAAgB,GAAmB;AAGzC,SAAgB;AACd,EAAI,KACF,EAAkB,UAAU,SAAS,gBAC1B,EAAU,SAAS,cAA2B,EAAU,GAE/D,OAAO,IAEV,EAAkB,SAAgC,OAAO;IAE3D,CAAC,EAAK,CAAC;CAGV,IAAM,IAAe,QAAkB;EACrC,IAAM,IAAS,GAAW,MAAM,MAAM,EAAE,YAAY,iBAAiB,CAAC,EAAE,SAAS;AAEjF,EAAI,KACF,IAAa,EAAO,GAAG;IAExB,CAAC,GAAW,EAAW,CAAC,EAErB,IAAiB,IAAU,IAAe,IAAkB,IAAU,KAAA,GAGtE,IAAgB,GACnB,MAAqC;AACpC,MAAI,EAAE,QAAQ,UAAU;AAEtB,GADA,EAAE,gBAAgB,EACd,IACF,GAAc,GAEd,KAAW;AAGb;;AAGF,IAAU,GAAG,EAAU;IAEzB;EAAC;EAAS;EAAc;EAAQ,CACjC;AAED,KAAI,CAAC,EACH,QAAO;CAIT,IAAM,UACA,KAAW,IAEX,kBAAC,OAAD;EAAK,WAAW,EAAO;YACpB,EAAU,KAAK,MACd,kBAAC,UAAD;GAEE,MAAK;GACL,UAAU,EAAE;GACZ,WAAW,CAAC,EAAO,KAAK,EAAO,OAAO,EAAE,WAAW,aAAa,CAC7D,OAAO,QAAQ,CACf,KAAK,IAAI;GACZ,eAAe,IAAa,EAAE,GAAG;aAEhC,EAAE;GACI,EATF,EAAE,GASA,CACT;EACE,CAAA,GAIN,EAAQ,SAAS,IAEjB,kBAAC,OAAD;EAAK,WAAW,EAAO;YACpB,EAAQ,KAAK,MACZ,kBAAC,UAAD;GAEE,MAAK;GACL,UAAU,EAAI;GACd,WAAW,CAAC,EAAO,KAAK,EAAO,OAAO,EAAI,WAAW,aAAa,CAC/D,OAAO,QAAQ,CACf,KAAK,IAAI;GACZ,SAAS,EAAI;aAEZ,EAAI;GACE,EATF,EAAI,MASF,CACT;EACE,CAAA,GAIH,MAGH,IACJ,kBAAC,OAAD;EACE,WAAW,EAAO;EAClB,OAAO;EACP,SAAS;EACT,eAAY;YAEZ,kBAAC,OAAD;GACE,KAAK;GACC;GACN,cAAW;GACX,mBAAiB;GACjB,WAAW,CAAC,EAAO,QAAQ,EAAU,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;GAC/D,WAAW;GACX,UAAU,MAAM,EAAE,iBAAiB;GACnC,GAAI;aARN;IAUG,KACC,kBAAC,OAAD;KAAK,IAAI;KAAS,WAAW,EAAO;eACjC;KACG,CAAA;IAEP,KAAY,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAO;KAAe,CAAA;IACzD,GAAe;IACZ;;EACF,CAAA;AAOR,QAJI,OAAO,WAAa,MACf,IAGF,EAAa,GAAM,SAAS,KAAK"}
1
+ {"version":3,"file":"Dialog.js","names":[],"sources":["../../../src/components/Dialog/Dialog.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport styles from './Dialog.module.css';\nimport { FOCUSABLE, trapFocus, useVisualViewport } from './dialogUtils';\n\n// ─── AlertDialog types ────────────────────────────────────────────────────────\n\nexport type AlertDialogResponseVariant = 'default' | 'suggested' | 'destructive';\n\nexport interface AlertDialogResponse {\n /**\n * Unique identifier returned via `onResponse`.\n * Use `\"cancel\"` by convention for the dismissive action.\n */\n id: string;\n /** Button label. */\n label: string;\n /** Visual emphasis. Defaults to `\"default\"`. */\n variant?: AlertDialogResponseVariant;\n /** Disables the button. */\n disabled?: boolean;\n}\n\n// ─── Dialog ───────────────────────────────────────────────────────────────────\n\nexport interface DialogButton {\n /** Button label. */\n label: string;\n /** Visual variant. Defaults to `\"default\"`. */\n variant?: 'default' | 'suggested' | 'destructive';\n /** Called when the button is clicked. */\n onClick: () => void;\n /** Whether the button is disabled. */\n disabled?: boolean;\n}\n\nexport interface DialogProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Whether the dialog is visible. */\n open: boolean;\n\n // ── Standard dialog ──────────────────────────────────────────────────────\n\n /** Dialog heading. */\n title?: ReactNode;\n /** Body content. */\n children?: ReactNode;\n /** Action buttons (standard dialog API). */\n buttons?: DialogButton[];\n /** Called on Escape or backdrop click. */\n onClose?: () => void;\n /** Whether clicking the backdrop closes the dialog. Defaults to `true`. */\n closeOnBackdrop?: boolean;\n\n // ── AlertDialog extension ─────────────────────────────────────────────────\n\n /**\n * ARIA role. Use `\"alertdialog\"` for confirmations and destructive warnings —\n * screen readers announce it immediately. Defaults to `\"dialog\"`.\n *\n * When using `role=\"alertdialog\"`, prefer the `responses`/`onResponse` API\n * over `buttons`/`onClick` for semantic clarity.\n */\n role?: 'dialog' | 'alertdialog';\n\n /**\n * Response buttons (AlertDialog API). Alternative to `buttons` — each\n * response has a semantic `id` returned via `onResponse`.\n * Escape and backdrop click fire the first non-destructive response.\n */\n responses?: AlertDialogResponse[];\n\n /**\n * Called with the `id` of the response button clicked.\n * Required when `responses` is provided.\n */\n onResponse?: (id: string) => void;\n}\n\n/**\n * Blocking modal dialog following the Adwaita pattern.\n *\n * **Standard** — `title` + `children` + `buttons[]`.\n *\n * **Alert** — add `role=\"alertdialog\"` + `responses[]` + `onResponse`.\n * Uses a semantic response id instead of per-button `onClick`.\n * Escape / backdrop fire the first non-destructive response.\n * Mirrors `AdwAlertDialog`.\n *\n * For the app-info dialog, use `<AboutDialog />` instead.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.Dialog.html\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.AlertDialog.html\n */\nexport const Dialog = ({\n open,\n title,\n children,\n buttons = [],\n onClose,\n closeOnBackdrop = true,\n role = 'dialog',\n responses,\n onResponse,\n className,\n ...props\n}: DialogProps) => {\n const dialogRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n\n const isAlert = !!responses;\n const viewportStyle = useVisualViewport();\n\n // ── Focus management ───────────────────────────────────────────────────────\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n const el = dialogRef.current?.querySelector<HTMLElement>(FOCUSABLE);\n\n el?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n // ── Dismiss helpers ────────────────────────────────────────────────────────\n const dismissAlert = useCallback(() => {\n const cancel = responses?.find((r) => r.variant !== 'destructive' && !r.disabled);\n\n if (cancel) {\n onResponse?.(cancel.id);\n }\n }, [responses, onResponse]);\n\n const handleBackdrop = isAlert ? dismissAlert : closeOnBackdrop ? onClose : undefined;\n\n // ── Keyboard ───────────────────────────────────────────────────────────────\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n if (isAlert) {\n dismissAlert();\n } else {\n onClose?.();\n }\n\n return;\n }\n\n trapFocus(e, dialogRef);\n },\n [isAlert, dismissAlert, onClose],\n );\n\n if (!open) {\n return null;\n }\n\n // ── Render buttons (standard or alert) ────────────────────────────────────\n const renderButtons = () => {\n if (isAlert && responses) {\n return (\n <div className={styles.footer}>\n {responses.map((r) => (\n <button\n key={r.id}\n type=\"button\"\n disabled={r.disabled}\n className={[styles.btn, styles[`btn-${r.variant ?? 'default'}`]]\n .filter(Boolean)\n .join(' ')}\n onClick={() => onResponse?.(r.id)}\n >\n {r.label}\n </button>\n ))}\n </div>\n );\n }\n\n if (buttons.length > 0) {\n return (\n <div className={styles.footer}>\n {buttons.map((btn) => (\n <button\n key={btn.label}\n type=\"button\"\n disabled={btn.disabled}\n className={[styles.btn, styles[`btn-${btn.variant ?? 'default'}`]]\n .filter(Boolean)\n .join(' ')}\n onClick={btn.onClick}\n >\n {btn.label}\n </button>\n ))}\n </div>\n );\n }\n\n return null;\n };\n\n const node = (\n <div\n className={styles.backdrop}\n style={viewportStyle}\n onClick={handleBackdrop}\n aria-hidden=\"true\"\n >\n <div\n ref={dialogRef}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={[styles.dialog, className].filter(Boolean).join(' ')}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {title && (\n <div id={titleId} className={styles.title}>\n {title}\n </div>\n )}\n {children && <div className={styles.body}>{children}</div>}\n {renderButtons()}\n </div>\n </div>\n );\n\n if (typeof document === 'undefined') {\n return node;\n }\n\n return createPortal(node, document.body);\n};\n"],"mappings":";;;;;;AAuGA,IAAa,KAAU,EACrB,SACA,UACA,aACA,aAAU,CAAC,GACX,YACA,qBAAkB,IAClB,UAAO,UACP,cACA,eACA,cACA,GAAG,QACc;CACjB,IAAM,IAAY,EAAuB,IAAI,GACvC,IAAU,EAAM,GAChB,IAAoB,EAAuB,IAAI,GAE/C,IAAU,CAAC,CAAC,GACZ,IAAgB,EAAkB;CAGxC,QAAgB;EACd,AAAI,KACF,EAAkB,UAAU,SAAS,gBAC1B,EAAU,SAAS,cAA2B,CAAS,IAE9D,MAAM,KAEV,EAAmB,SAAgC,MAAM;CAE7D,GAAG,CAAC,CAAI,CAAC;CAGT,IAAM,IAAe,QAAkB;EACrC,IAAM,IAAS,GAAW,MAAM,MAAM,EAAE,YAAY,iBAAiB,CAAC,EAAE,QAAQ;EAEhF,AAAI,KACF,IAAa,EAAO,EAAE;CAE1B,GAAG,CAAC,GAAW,CAAU,CAAC,GAEpB,IAAiB,IAAU,IAAe,IAAkB,IAAU,KAAA,GAGtE,IAAgB,GACnB,MAAqC;EACpC,IAAI,EAAE,QAAQ,UAAU;GAEtB,AADA,EAAE,eAAe,GACb,IACF,EAAa,IAEb,IAAU;GAGZ;EACF;EAEA,EAAU,GAAG,CAAS;CACxB,GACA;EAAC;EAAS;EAAc;CAAO,CACjC;CAEA,IAAI,CAAC,GACH,OAAO;CAIT,IAAM,UACA,KAAW,IAEX,kBAAC,OAAD;EAAK,WAAW,EAAO;YACpB,EAAU,KAAK,MACd,kBAAC,UAAD;GAEE,MAAK;GACL,UAAU,EAAE;GACZ,WAAW,CAAC,EAAO,KAAK,EAAO,OAAO,EAAE,WAAW,YAAY,EAC5D,OAAO,OAAO,EACd,KAAK,GAAG;GACX,eAAe,IAAa,EAAE,EAAE;aAE/B,EAAE;EACG,GATD,EAAE,EASD,CACT;CACE,CAAA,IAIL,EAAQ,SAAS,IAEjB,kBAAC,OAAD;EAAK,WAAW,EAAO;YACpB,EAAQ,KAAK,MACZ,kBAAC,UAAD;GAEE,MAAK;GACL,UAAU,EAAI;GACd,WAAW,CAAC,EAAO,KAAK,EAAO,OAAO,EAAI,WAAW,YAAY,EAC9D,OAAO,OAAO,EACd,KAAK,GAAG;GACX,SAAS,EAAI;aAEZ,EAAI;EACC,GATD,EAAI,KASH,CACT;CACE,CAAA,IAIF,MAGH,IACJ,kBAAC,OAAD;EACE,WAAW,EAAO;EAClB,OAAO;EACP,SAAS;EACT,eAAY;YAEZ,kBAAC,OAAD;GACE,KAAK;GACC;GACN,cAAW;GACX,mBAAiB;GACjB,WAAW,CAAC,EAAO,QAAQ,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;GAC9D,WAAW;GACX,UAAU,MAAM,EAAE,gBAAgB;GAClC,GAAI;aARN;IAUG,KACC,kBAAC,OAAD;KAAK,IAAI;KAAS,WAAW,EAAO;eACjC;IACE,CAAA;IAEN,KAAY,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAO;IAAc,CAAA;IACxD,EAAc;GACZ;;CACF,CAAA;CAOP,OAJI,OAAO,WAAa,MACf,IAGF,EAAa,GAAM,SAAS,IAAI;AACzC"}
@@ -1,2 +1,2 @@
1
- var e=`_backdrop_1hnot_3`,t=`_dialog_1hnot_30`,n=`_title_1hnot_60`,r=`_body_1hnot_72`,i=`_footer_1hnot_93`,a=`_btn_1hnot_100`,o={backdrop:e,"backdrop-in":`_backdrop-in_1hnot_1`,dialog:t,"dialog-in":`_dialog-in_1hnot_1`,title:n,body:r,footer:i,btn:a,"btn-default":`_btn-default_1hnot_148`,"btn-suggested":`_btn-suggested_1hnot_152`,"btn-destructive":`_btn-destructive_1hnot_157`};exports.default=o;
1
+ var e={backdrop:`_backdrop_1hnot_3`,"backdrop-in":`_backdrop-in_1hnot_1`,dialog:`_dialog_1hnot_30`,"dialog-in":`_dialog-in_1hnot_1`,title:`_title_1hnot_60`,body:`_body_1hnot_72`,footer:`_footer_1hnot_93`,btn:`_btn_1hnot_100`,"btn-default":`_btn-default_1hnot_148`,"btn-suggested":`_btn-suggested_1hnot_152`,"btn-destructive":`_btn-destructive_1hnot_157`};exports.default=e;
2
2
  //# sourceMappingURL=Dialog.module.css.cjs.map
@@ -1,18 +1,17 @@
1
- //#region src/components/Dialog/Dialog.module.css
2
- var e = "_backdrop_1hnot_3", t = "_dialog_1hnot_30", n = "_title_1hnot_60", r = "_body_1hnot_72", i = "_footer_1hnot_93", a = "_btn_1hnot_100", o = {
3
- backdrop: e,
1
+ var e = {
2
+ backdrop: "_backdrop_1hnot_3",
4
3
  "backdrop-in": "_backdrop-in_1hnot_1",
5
- dialog: t,
4
+ dialog: "_dialog_1hnot_30",
6
5
  "dialog-in": "_dialog-in_1hnot_1",
7
- title: n,
8
- body: r,
9
- footer: i,
10
- btn: a,
6
+ title: "_title_1hnot_60",
7
+ body: "_body_1hnot_72",
8
+ footer: "_footer_1hnot_93",
9
+ btn: "_btn_1hnot_100",
11
10
  "btn-default": "_btn-default_1hnot_148",
12
11
  "btn-suggested": "_btn-suggested_1hnot_152",
13
12
  "btn-destructive": "_btn-destructive_1hnot_157"
14
13
  };
15
14
  //#endregion
16
- export { o as default };
15
+ export { e as default };
17
16
 
18
17
  //# sourceMappingURL=Dialog.module.css.js.map
@@ -1,2 +1,2 @@
1
- let e=require(`react`);var t=`button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`;function n(){let[t,n]=(0,e.useState)({});return(0,e.useEffect)(()=>{let{visualViewport:e}=window;if(!e)return;let t=()=>{let{offsetLeft:t,offsetTop:r,width:i,height:a}=e;n({top:r,left:t,width:i,height:a})};return t(),e.addEventListener(`resize`,t),e.addEventListener(`scroll`,t),()=>{e.removeEventListener(`resize`,t),e.removeEventListener(`scroll`,t)}},[]),t}function r(e,t){if(e.key!==`Tab`)return;let n=Array.from(t.current?.querySelectorAll(`button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`)??[]);if(!n.length)return;let r=n[0],i=n[n.length-1];e.shiftKey?document.activeElement===r&&(e.preventDefault(),i.focus()):document.activeElement===i&&(e.preventDefault(),r.focus())}exports.FOCUSABLE=t,exports.trapFocus=r,exports.useVisualViewport=n;
1
+ let e=require("react");var t=`button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`;function n(){let[t,n]=(0,e.useState)({});return(0,e.useEffect)(()=>{let{visualViewport:e}=window;if(!e)return;let t=()=>{let{offsetLeft:t,offsetTop:r,width:i,height:a}=e;n({top:r,left:t,width:i,height:a})};return t(),e.addEventListener(`resize`,t),e.addEventListener(`scroll`,t),()=>{e.removeEventListener(`resize`,t),e.removeEventListener(`scroll`,t)}},[]),t}function r(e,t){if(e.key!==`Tab`)return;let n=Array.from(t.current?.querySelectorAll(`button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`)??[]);if(!n.length)return;let r=n[0],i=n[n.length-1];e.shiftKey?document.activeElement===r&&(e.preventDefault(),i.focus()):document.activeElement===i&&(e.preventDefault(),r.focus())}exports.FOCUSABLE=t,exports.trapFocus=r,exports.useVisualViewport=n;
2
2
  //# sourceMappingURL=dialogUtils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"dialogUtils.cjs","names":[],"sources":["../../../src/components/Dialog/dialogUtils.ts"],"sourcesContent":["import { type CSSProperties, type KeyboardEvent, type RefObject, useEffect, useState } from 'react';\n\nexport const FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Returns inline styles that anchor a `position:fixed` backdrop to the visual\n * viewport so the dialog stays centered when the virtual keyboard is open on\n * mobile (iOS Safari / Android Chrome shrink `visualViewport` but not the\n * layout viewport that `position:fixed` is relative to).\n */\nexport function useVisualViewport(): CSSProperties {\n const [style, setStyle] = useState<CSSProperties>({});\n\n useEffect(() => {\n const { visualViewport } = window;\n\n if (!visualViewport) {\n return;\n }\n\n const update = (): void => {\n const { offsetLeft: left, offsetTop: top, width, height } = visualViewport;\n\n setStyle({\n top,\n left,\n width,\n height,\n });\n };\n\n update();\n visualViewport.addEventListener('resize', update);\n visualViewport.addEventListener('scroll', update);\n\n return () => {\n visualViewport.removeEventListener('resize', update);\n visualViewport.removeEventListener('scroll', update);\n };\n }, []);\n\n return style;\n}\n\nexport function trapFocus(e: KeyboardEvent<HTMLDivElement>, ref: RefObject<HTMLDivElement | null>) {\n if (e.key !== 'Tab') {\n return;\n }\n\n const focusable = Array.from(ref.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []);\n\n if (!focusable.length) {\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n}\n"],"mappings":"uBAEA,IAAa,EACX,2IAQF,SAAgB,GAAmC,CACjD,GAAM,CAAC,EAAO,IAAA,EAAA,EAAA,UAAoC,EAAE,CAAC,CA8BrD,OA5BA,EAAA,EAAA,eAAgB,CACd,GAAM,CAAE,kBAAmB,OAE3B,GAAI,CAAC,EACH,OAGF,IAAM,MAAqB,CACzB,GAAM,CAAE,WAAY,EAAM,UAAW,EAAK,QAAO,UAAW,EAE5D,EAAS,CACP,MACA,OACA,QACA,SACD,CAAC,EAOJ,OAJA,GAAQ,CACR,EAAe,iBAAiB,SAAU,EAAO,CACjD,EAAe,iBAAiB,SAAU,EAAO,KAEpC,CACX,EAAe,oBAAoB,SAAU,EAAO,CACpD,EAAe,oBAAoB,SAAU,EAAO,GAErD,EAAE,CAAC,CAEC,EAGT,SAAgB,EAAU,EAAkC,EAAuC,CACjG,GAAI,EAAE,MAAQ,MACZ,OAGF,IAAM,EAAY,MAAM,KAAK,EAAI,SAAS,iBAAA,2IAAwC,EAAI,EAAE,CAAC,CAEzF,GAAI,CAAC,EAAU,OACb,OAGF,IAAM,EAAQ,EAAU,GAClB,EAAO,EAAU,EAAU,OAAS,GAEtC,EAAE,SACA,SAAS,gBAAkB,IAC7B,EAAE,gBAAgB,CAClB,EAAK,OAAO,EAGV,SAAS,gBAAkB,IAC7B,EAAE,gBAAgB,CAClB,EAAM,OAAO"}
1
+ {"version":3,"file":"dialogUtils.cjs","names":[],"sources":["../../../src/components/Dialog/dialogUtils.ts"],"sourcesContent":["import { type CSSProperties, type KeyboardEvent, type RefObject, useEffect, useState } from 'react';\n\nexport const FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Returns inline styles that anchor a `position:fixed` backdrop to the visual\n * viewport so the dialog stays centered when the virtual keyboard is open on\n * mobile (iOS Safari / Android Chrome shrink `visualViewport` but not the\n * layout viewport that `position:fixed` is relative to).\n */\nexport function useVisualViewport(): CSSProperties {\n const [style, setStyle] = useState<CSSProperties>({});\n\n useEffect(() => {\n const { visualViewport } = window;\n\n if (!visualViewport) {\n return;\n }\n\n const update = (): void => {\n const { offsetLeft: left, offsetTop: top, width, height } = visualViewport;\n\n setStyle({\n top,\n left,\n width,\n height,\n });\n };\n\n update();\n visualViewport.addEventListener('resize', update);\n visualViewport.addEventListener('scroll', update);\n\n return () => {\n visualViewport.removeEventListener('resize', update);\n visualViewport.removeEventListener('scroll', update);\n };\n }, []);\n\n return style;\n}\n\nexport function trapFocus(e: KeyboardEvent<HTMLDivElement>, ref: RefObject<HTMLDivElement | null>) {\n if (e.key !== 'Tab') {\n return;\n }\n\n const focusable = Array.from(ref.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []);\n\n if (!focusable.length) {\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n}\n"],"mappings":"uBAEA,IAAa,EACX,2IAQF,SAAgB,GAAmC,CACjD,GAAM,CAAC,EAAO,IAAA,EAAA,EAAA,UAAoC,CAAC,CAAC,EA8BpD,OA5BA,EAAA,EAAA,eAAgB,CACd,GAAM,CAAE,kBAAmB,OAE3B,GAAI,CAAC,EACH,OAGF,IAAM,MAAqB,CACzB,GAAM,CAAE,WAAY,EAAM,UAAW,EAAK,QAAO,UAAW,EAE5D,EAAS,CACP,MACA,OACA,QACA,QACF,CAAC,CACH,EAMA,OAJA,EAAO,EACP,EAAe,iBAAiB,SAAU,CAAM,EAChD,EAAe,iBAAiB,SAAU,CAAM,MAEnC,CACX,EAAe,oBAAoB,SAAU,CAAM,EACnD,EAAe,oBAAoB,SAAU,CAAM,CACrD,CACF,EAAG,CAAC,CAAC,EAEE,CACT,CAEA,SAAgB,EAAU,EAAkC,EAAuC,CACjG,GAAI,EAAE,MAAQ,MACZ,OAGF,IAAM,EAAY,MAAM,KAAK,EAAI,SAAS,iBAAA,0IAAuC,GAAK,CAAC,CAAC,EAExF,GAAI,CAAC,EAAU,OACb,OAGF,IAAM,EAAQ,EAAU,GAClB,EAAO,EAAU,EAAU,OAAS,GAEtC,EAAE,SACA,SAAS,gBAAkB,IAC7B,EAAE,eAAe,EACjB,EAAK,MAAM,GAGT,SAAS,gBAAkB,IAC7B,EAAE,eAAe,EACjB,EAAM,MAAM,EAGlB"}
@@ -1 +1 @@
1
- {"version":3,"file":"dialogUtils.js","names":[],"sources":["../../../src/components/Dialog/dialogUtils.ts"],"sourcesContent":["import { type CSSProperties, type KeyboardEvent, type RefObject, useEffect, useState } from 'react';\n\nexport const FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Returns inline styles that anchor a `position:fixed` backdrop to the visual\n * viewport so the dialog stays centered when the virtual keyboard is open on\n * mobile (iOS Safari / Android Chrome shrink `visualViewport` but not the\n * layout viewport that `position:fixed` is relative to).\n */\nexport function useVisualViewport(): CSSProperties {\n const [style, setStyle] = useState<CSSProperties>({});\n\n useEffect(() => {\n const { visualViewport } = window;\n\n if (!visualViewport) {\n return;\n }\n\n const update = (): void => {\n const { offsetLeft: left, offsetTop: top, width, height } = visualViewport;\n\n setStyle({\n top,\n left,\n width,\n height,\n });\n };\n\n update();\n visualViewport.addEventListener('resize', update);\n visualViewport.addEventListener('scroll', update);\n\n return () => {\n visualViewport.removeEventListener('resize', update);\n visualViewport.removeEventListener('scroll', update);\n };\n }, []);\n\n return style;\n}\n\nexport function trapFocus(e: KeyboardEvent<HTMLDivElement>, ref: RefObject<HTMLDivElement | null>) {\n if (e.key !== 'Tab') {\n return;\n }\n\n const focusable = Array.from(ref.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []);\n\n if (!focusable.length) {\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n}\n"],"mappings":";;AAEA,IAAa,IACX;AAQF,SAAgB,IAAmC;CACjD,IAAM,CAAC,GAAO,KAAY,EAAwB,EAAE,CAAC;AA8BrD,QA5BA,QAAgB;EACd,IAAM,EAAE,sBAAmB;AAE3B,MAAI,CAAC,EACH;EAGF,IAAM,UAAqB;GACzB,IAAM,EAAE,YAAY,GAAM,WAAW,GAAK,UAAO,cAAW;AAE5D,KAAS;IACP;IACA;IACA;IACA;IACD,CAAC;;AAOJ,SAJA,GAAQ,EACR,EAAe,iBAAiB,UAAU,EAAO,EACjD,EAAe,iBAAiB,UAAU,EAAO,QAEpC;AAEX,GADA,EAAe,oBAAoB,UAAU,EAAO,EACpD,EAAe,oBAAoB,UAAU,EAAO;;IAErD,EAAE,CAAC,EAEC;;AAGT,SAAgB,EAAU,GAAkC,GAAuC;AACjG,KAAI,EAAE,QAAQ,MACZ;CAGF,IAAM,IAAY,MAAM,KAAK,EAAI,SAAS,iBAAA,6IAAwC,IAAI,EAAE,CAAC;AAEzF,KAAI,CAAC,EAAU,OACb;CAGF,IAAM,IAAQ,EAAU,IAClB,IAAO,EAAU,EAAU,SAAS;AAE1C,CAAI,EAAE,WACA,SAAS,kBAAkB,MAC7B,EAAE,gBAAgB,EAClB,EAAK,OAAO,IAGV,SAAS,kBAAkB,MAC7B,EAAE,gBAAgB,EAClB,EAAM,OAAO"}
1
+ {"version":3,"file":"dialogUtils.js","names":[],"sources":["../../../src/components/Dialog/dialogUtils.ts"],"sourcesContent":["import { type CSSProperties, type KeyboardEvent, type RefObject, useEffect, useState } from 'react';\n\nexport const FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n/**\n * Returns inline styles that anchor a `position:fixed` backdrop to the visual\n * viewport so the dialog stays centered when the virtual keyboard is open on\n * mobile (iOS Safari / Android Chrome shrink `visualViewport` but not the\n * layout viewport that `position:fixed` is relative to).\n */\nexport function useVisualViewport(): CSSProperties {\n const [style, setStyle] = useState<CSSProperties>({});\n\n useEffect(() => {\n const { visualViewport } = window;\n\n if (!visualViewport) {\n return;\n }\n\n const update = (): void => {\n const { offsetLeft: left, offsetTop: top, width, height } = visualViewport;\n\n setStyle({\n top,\n left,\n width,\n height,\n });\n };\n\n update();\n visualViewport.addEventListener('resize', update);\n visualViewport.addEventListener('scroll', update);\n\n return () => {\n visualViewport.removeEventListener('resize', update);\n visualViewport.removeEventListener('scroll', update);\n };\n }, []);\n\n return style;\n}\n\nexport function trapFocus(e: KeyboardEvent<HTMLDivElement>, ref: RefObject<HTMLDivElement | null>) {\n if (e.key !== 'Tab') {\n return;\n }\n\n const focusable = Array.from(ref.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []);\n\n if (!focusable.length) {\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n}\n"],"mappings":";;AAEA,IAAa,IACX;AAQF,SAAgB,IAAmC;CACjD,IAAM,CAAC,GAAO,KAAY,EAAwB,CAAC,CAAC;CA8BpD,OA5BA,QAAgB;EACd,IAAM,EAAE,sBAAmB;EAE3B,IAAI,CAAC,GACH;EAGF,IAAM,UAAqB;GACzB,IAAM,EAAE,YAAY,GAAM,WAAW,GAAK,UAAO,cAAW;GAE5D,EAAS;IACP;IACA;IACA;IACA;GACF,CAAC;EACH;EAMA,OAJA,EAAO,GACP,EAAe,iBAAiB,UAAU,CAAM,GAChD,EAAe,iBAAiB,UAAU,CAAM,SAEnC;GAEX,AADA,EAAe,oBAAoB,UAAU,CAAM,GACnD,EAAe,oBAAoB,UAAU,CAAM;EACrD;CACF,GAAG,CAAC,CAAC,GAEE;AACT;AAEA,SAAgB,EAAU,GAAkC,GAAuC;CACjG,IAAI,EAAE,QAAQ,OACZ;CAGF,IAAM,IAAY,MAAM,KAAK,EAAI,SAAS,iBAAA,4IAAuC,KAAK,CAAC,CAAC;CAExF,IAAI,CAAC,EAAU,QACb;CAGF,IAAM,IAAQ,EAAU,IAClB,IAAO,EAAU,EAAU,SAAS;CAE1C,AAAI,EAAE,WACA,SAAS,kBAAkB,MAC7B,EAAE,eAAe,GACjB,EAAK,MAAM,KAGT,SAAS,kBAAkB,MAC7B,EAAE,eAAe,GACjB,EAAM,MAAM;AAGlB"}
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./Dialog/Dialog.cjs`);exports.Dialog=e.Dialog;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./Dialog/Dialog.cjs");exports.Dialog=e.Dialog;
@@ -1,2 +1,2 @@
1
- const e=require(`../Dialog/dialogUtils.cjs`),t=require(`../Button/Button.cjs`),n=require(`./Drawer.module.css.cjs`);let r=require(`react`),i=require(`react-dom`),a=require(`react/jsx-runtime`);function o({open:o,side:s=`right`,size:c=`classic`,title:l,content:u,children:d,onClose:f,closeOnBackdrop:p=!0,className:m,...h}){let g=(0,r.useRef)(null),_=(0,r.useId)(),v=(0,r.useRef)(null),y=e.useVisualViewport(),b=u===void 0?d:u;(0,r.useEffect)(()=>{o?(v.current=document.activeElement,g.current?.querySelector(e.FOCUSABLE)?.focus()):v.current?.focus()},[o]);let x=(0,r.useCallback)(t=>{if(t.key===`Escape`){t.preventDefault(),f?.();return}e.trapFocus(t,g)},[f]);if(!o)return null;let S=(0,a.jsx)(`div`,{className:n.default.backdrop,style:y,onClick:p?f:void 0,children:(0,a.jsxs)(`div`,{ref:g,role:`dialog`,"aria-modal":`true`,"aria-labelledby":l?_:void 0,"data-side":s,"data-size":c,className:[n.default.drawer,s===`left`?n.default.left:n.default.right,c===`wide`?n.default.wide:n.default.classic,m].filter(Boolean).join(` `),onKeyDown:x,onClick:e=>e.stopPropagation(),...h,children:[l&&(0,a.jsxs)(`div`,{id:_,className:n.default.title,children:[(0,a.jsx)(`span`,{className:n.default.titleText,children:l}),f&&(0,a.jsx)(t.Button,{variant:`flat`,shape:`circular`,size:`sm`,"aria-label":`Close`,onClick:f,children:`✕`})]}),b!==void 0&&(0,a.jsx)(`div`,{className:n.default.content,children:b})]})});return typeof document>`u`?S:(0,i.createPortal)(S,document.body)}exports.Drawer=o;
1
+ const e=require("../Dialog/dialogUtils.cjs"),t=require("../Button/Button.cjs"),n=require("./Drawer.module.css.cjs");let r=require("react"),i=require("react-dom"),a=require("react/jsx-runtime");var o=({open:o,side:s=`right`,size:c=`classic`,title:l,content:u,children:d,onClose:f,closeOnBackdrop:p=!0,className:m,...h})=>{let g=(0,r.useRef)(null),_=(0,r.useId)(),v=(0,r.useRef)(null),y=e.useVisualViewport(),b=u===void 0?d:u;(0,r.useEffect)(()=>{o?(v.current=document.activeElement,g.current?.querySelector(e.FOCUSABLE)?.focus()):v.current?.focus()},[o]);let x=(0,r.useCallback)(t=>{if(t.key===`Escape`){t.preventDefault(),f?.();return}e.trapFocus(t,g)},[f]);if(!o)return null;let S=(0,a.jsx)(`div`,{className:n.default.backdrop,style:y,onClick:p?f:void 0,children:(0,a.jsxs)(`div`,{ref:g,role:`dialog`,"aria-modal":`true`,"aria-labelledby":l?_:void 0,"data-side":s,"data-size":c,className:[n.default.drawer,s===`left`?n.default.left:n.default.right,c===`wide`?n.default.wide:n.default.classic,m].filter(Boolean).join(` `),onKeyDown:x,onClick:e=>e.stopPropagation(),...h,children:[l&&(0,a.jsxs)(`div`,{id:_,className:n.default.title,children:[(0,a.jsx)(`span`,{className:n.default.titleText,children:l}),f&&(0,a.jsx)(t.Button,{variant:`flat`,shape:`circular`,size:`sm`,"aria-label":`Close`,onClick:f,children:`✕`})]}),b!==void 0&&(0,a.jsx)(`div`,{className:n.default.content,children:b})]})});return typeof document>`u`?S:(0,i.createPortal)(S,document.body)};exports.Drawer=o;
2
2
  //# sourceMappingURL=Drawer.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Drawer.cjs","names":[],"sources":["../../../src/components/Drawer/Drawer.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { Button } from '../Button/Button';\nimport { FOCUSABLE, trapFocus, useVisualViewport } from '../Dialog/dialogUtils';\n\nimport styles from './Drawer.module.css';\n\nexport type DrawerSide = 'left' | 'right';\nexport type DrawerSize = 'classic' | 'wide';\n\nexport interface DrawerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'content' | 'title'> {\n /** Whether the drawer is visible. */\n open: boolean;\n /** Edge that the drawer slides in from. Defaults to `\"right\"`. */\n side?: DrawerSide;\n /** Preset drawer width. Defaults to `\"classic\"`. */\n size?: DrawerSize;\n /** Optional drawer heading. */\n title?: ReactNode;\n /** Drawer content when a prop is preferred over `children`. */\n content?: ReactNode;\n /** Drawer content. Used when `content` is not provided. */\n children?: ReactNode;\n /** Called when the user dismisses the drawer with Escape or the backdrop. */\n onClose?: () => void;\n /** Whether clicking the backdrop closes the drawer. Defaults to `true`. */\n closeOnBackdrop?: boolean;\n}\n\n/**\n * Slide-over panel for supplementary content.\n *\n * The drawer is controlled through `open`, renders into `document.body`, and\n * accepts its body as either `content` or `children`.\n */\nexport function Drawer({\n open,\n side = 'right',\n size = 'classic',\n title,\n content,\n children,\n onClose,\n closeOnBackdrop = true,\n className,\n ...props\n}: DrawerProps) {\n const drawerRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n const viewportStyle = useVisualViewport();\n const body = content !== undefined ? content : children;\n\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n drawerRef.current?.querySelector<HTMLElement>(FOCUSABLE)?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n onClose?.();\n\n return;\n }\n\n trapFocus(event, drawerRef);\n },\n [onClose],\n );\n\n if (!open) {\n return null;\n }\n\n const node = (\n <div\n className={styles.backdrop}\n style={viewportStyle}\n onClick={closeOnBackdrop ? onClose : undefined}\n >\n <div\n ref={drawerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n data-side={side}\n data-size={size}\n className={[\n styles.drawer,\n side === 'left' ? styles.left : styles.right,\n size === 'wide' ? styles.wide : styles.classic,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onKeyDown={handleKeyDown}\n onClick={(event) => event.stopPropagation()}\n {...props}\n >\n {title && (\n <div id={titleId} className={styles.title}>\n <span className={styles.titleText}>{title}</span>\n {onClose && (\n <Button\n variant=\"flat\"\n shape=\"circular\"\n size=\"sm\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n ✕\n </Button>\n )}\n </div>\n )}\n {body !== undefined && <div className={styles.content}>{body}</div>}\n </div>\n </div>\n );\n\n if (typeof document === 'undefined') {\n return node;\n }\n\n return createPortal(node, document.body);\n}\n"],"mappings":"iMA6CA,SAAgB,EAAO,CACrB,OACA,OAAO,QACP,OAAO,UACP,QACA,UACA,WACA,UACA,kBAAkB,GAClB,YACA,GAAG,GACW,CACd,IAAM,GAAA,EAAA,EAAA,QAAmC,KAAK,CACxC,GAAA,EAAA,EAAA,QAAiB,CACjB,GAAA,EAAA,EAAA,QAA2C,KAAK,CAChD,EAAgB,EAAA,mBAAmB,CACnC,EAAO,IAAY,IAAA,GAAsB,EAAV,GAErC,EAAA,EAAA,eAAgB,CACV,GACF,EAAkB,QAAU,SAAS,cACrC,EAAU,SAAS,cAA2B,EAAA,UAAU,EAAE,OAAO,EAEhE,EAAkB,SAAgC,OAAO,EAE3D,CAAC,EAAK,CAAC,CAEV,IAAM,GAAA,EAAA,EAAA,aACH,GAAyC,CACxC,GAAI,EAAM,MAAQ,SAAU,CAC1B,EAAM,gBAAgB,CACtB,KAAW,CAEX,OAGF,EAAA,UAAU,EAAO,EAAU,EAE7B,CAAC,EAAQ,CACV,CAED,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,GACJ,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,EAAA,QAAO,SAClB,MAAO,EACP,QAAS,EAAkB,EAAU,IAAA,aAErC,EAAA,EAAA,MAAC,MAAD,CACE,IAAK,EACL,KAAK,SACL,aAAW,OACX,kBAAiB,EAAQ,EAAU,IAAA,GACnC,YAAW,EACX,YAAW,EACX,UAAW,CACT,EAAA,QAAO,OACP,IAAS,OAAS,EAAA,QAAO,KAAO,EAAA,QAAO,MACvC,IAAS,OAAS,EAAA,QAAO,KAAO,EAAA,QAAO,QACvC,EACD,CACE,OAAO,QAAQ,CACf,KAAK,IAAI,CACZ,UAAW,EACX,QAAU,GAAU,EAAM,iBAAiB,CAC3C,GAAI,WAjBN,CAmBG,IACC,EAAA,EAAA,MAAC,MAAD,CAAK,GAAI,EAAS,UAAW,EAAA,QAAO,eAApC,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,QAAO,mBAAY,EAAa,CAAA,CAChD,IACC,EAAA,EAAA,KAAC,EAAA,OAAD,CACE,QAAQ,OACR,MAAM,WACN,KAAK,KACL,aAAW,QACX,QAAS,WACV,IAEQ,CAAA,CAEP,GAEP,IAAS,IAAA,KAAa,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,iBAAU,EAAW,CAAA,CAC/D,GACF,CAAA,CAOR,OAJI,OAAO,SAAa,IACf,GAGT,EAAA,EAAA,cAAoB,EAAM,SAAS,KAAK"}
1
+ {"version":3,"file":"Drawer.cjs","names":[],"sources":["../../../src/components/Drawer/Drawer.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { Button } from '../Button/Button';\nimport { FOCUSABLE, trapFocus, useVisualViewport } from '../Dialog/dialogUtils';\n\nimport styles from './Drawer.module.css';\n\nexport type DrawerSide = 'left' | 'right';\nexport type DrawerSize = 'classic' | 'wide';\n\nexport interface DrawerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'content' | 'title'> {\n /** Whether the drawer is visible. */\n open: boolean;\n /** Edge that the drawer slides in from. Defaults to `\"right\"`. */\n side?: DrawerSide;\n /** Preset drawer width. Defaults to `\"classic\"`. */\n size?: DrawerSize;\n /** Optional drawer heading. */\n title?: ReactNode;\n /** Drawer content when a prop is preferred over `children`. */\n content?: ReactNode;\n /** Drawer content. Used when `content` is not provided. */\n children?: ReactNode;\n /** Called when the user dismisses the drawer with Escape or the backdrop. */\n onClose?: () => void;\n /** Whether clicking the backdrop closes the drawer. Defaults to `true`. */\n closeOnBackdrop?: boolean;\n}\n\n/**\n * Slide-over panel for supplementary content.\n *\n * The drawer is controlled through `open`, renders into `document.body`, and\n * accepts its body as either `content` or `children`.\n */\nexport const Drawer = ({\n open,\n side = 'right',\n size = 'classic',\n title,\n content,\n children,\n onClose,\n closeOnBackdrop = true,\n className,\n ...props\n}: DrawerProps) => {\n const drawerRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n const viewportStyle = useVisualViewport();\n const body = content !== undefined ? content : children;\n\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n drawerRef.current?.querySelector<HTMLElement>(FOCUSABLE)?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n onClose?.();\n\n return;\n }\n\n trapFocus(event, drawerRef);\n },\n [onClose],\n );\n\n if (!open) {\n return null;\n }\n\n const node = (\n <div\n className={styles.backdrop}\n style={viewportStyle}\n onClick={closeOnBackdrop ? onClose : undefined}\n >\n <div\n ref={drawerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n data-side={side}\n data-size={size}\n className={[\n styles.drawer,\n side === 'left' ? styles.left : styles.right,\n size === 'wide' ? styles.wide : styles.classic,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onKeyDown={handleKeyDown}\n onClick={(event) => event.stopPropagation()}\n {...props}\n >\n {title && (\n <div id={titleId} className={styles.title}>\n <span className={styles.titleText}>{title}</span>\n {onClose && (\n <Button\n variant=\"flat\"\n shape=\"circular\"\n size=\"sm\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n ✕\n </Button>\n )}\n </div>\n )}\n {body !== undefined && <div className={styles.content}>{body}</div>}\n </div>\n </div>\n );\n\n if (typeof document === 'undefined') {\n return node;\n }\n\n return createPortal(node, document.body);\n};\n"],"mappings":"iMA6CA,IAAa,GAAU,CACrB,OACA,OAAO,QACP,OAAO,UACP,QACA,UACA,WACA,UACA,kBAAkB,GAClB,YACA,GAAG,KACc,CACjB,IAAM,GAAA,EAAA,EAAA,QAAmC,IAAI,EACvC,GAAA,EAAA,EAAA,OAAgB,EAChB,GAAA,EAAA,EAAA,QAA2C,IAAI,EAC/C,EAAgB,EAAA,kBAAkB,EAClC,EAAO,IAAY,IAAA,GAAsB,EAAV,GAErC,EAAA,EAAA,eAAgB,CACV,GACF,EAAkB,QAAU,SAAS,cACrC,EAAU,SAAS,cAA2B,EAAA,SAAS,GAAG,MAAM,GAEhE,EAAmB,SAAgC,MAAM,CAE7D,EAAG,CAAC,CAAI,CAAC,EAET,IAAM,GAAA,EAAA,EAAA,aACH,GAAyC,CACxC,GAAI,EAAM,MAAQ,SAAU,CAC1B,EAAM,eAAe,EACrB,IAAU,EAEV,MACF,CAEA,EAAA,UAAU,EAAO,CAAS,CAC5B,EACA,CAAC,CAAO,CACV,EAEA,GAAI,CAAC,EACH,OAAO,KAGT,IAAM,GACJ,EAAA,EAAA,KAAC,MAAD,CACE,UAAW,EAAA,QAAO,SAClB,MAAO,EACP,QAAS,EAAkB,EAAU,IAAA,aAErC,EAAA,EAAA,MAAC,MAAD,CACE,IAAK,EACL,KAAK,SACL,aAAW,OACX,kBAAiB,EAAQ,EAAU,IAAA,GACnC,YAAW,EACX,YAAW,EACX,UAAW,CACT,EAAA,QAAO,OACP,IAAS,OAAS,EAAA,QAAO,KAAO,EAAA,QAAO,MACvC,IAAS,OAAS,EAAA,QAAO,KAAO,EAAA,QAAO,QACvC,CACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG,EACX,UAAW,EACX,QAAU,GAAU,EAAM,gBAAgB,EAC1C,GAAI,WAjBN,CAmBG,IACC,EAAA,EAAA,MAAC,MAAD,CAAK,GAAI,EAAS,UAAW,EAAA,QAAO,eAApC,EACE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAW,EAAA,QAAO,mBAAY,CAAY,CAAA,EAC/C,IACC,EAAA,EAAA,KAAC,EAAA,OAAD,CACE,QAAQ,OACR,MAAM,WACN,KAAK,KACL,aAAW,QACX,QAAS,WACV,GAEO,CAAA,CAEP,IAEN,IAAS,IAAA,KAAa,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAA,QAAO,iBAAU,CAAU,CAAA,CAC/D,GACF,CAAA,EAOP,OAJI,OAAO,SAAa,IACf,GAGT,EAAA,EAAA,cAAoB,EAAM,SAAS,IAAI,CACzC"}
@@ -25,4 +25,4 @@ export interface DrawerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'conte
25
25
  * The drawer is controlled through `open`, renders into `document.body`, and
26
26
  * accepts its body as either `content` or `children`.
27
27
  */
28
- export declare function Drawer({ open, side, size, title, content, children, onClose, closeOnBackdrop, className, ...props }: DrawerProps): import("react/jsx-runtime").JSX.Element | null;
28
+ export declare const Drawer: ({ open, side, size, title, content, children, onClose, closeOnBackdrop, className, ...props }: DrawerProps) => import("react/jsx-runtime").JSX.Element | null;
@@ -5,7 +5,7 @@ import { useCallback as a, useEffect as o, useId as s, useRef as c } from "react
5
5
  import { createPortal as l } from "react-dom";
6
6
  import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
7
  //#region src/components/Drawer/Drawer.tsx
8
- function f({ open: f, side: p = "right", size: m = "classic", title: h, content: g, children: _, onClose: v, closeOnBackdrop: y = !0, className: b, ...x }) {
8
+ var f = ({ open: f, side: p = "right", size: m = "classic", title: h, content: g, children: _, onClose: v, closeOnBackdrop: y = !0, className: b, ...x }) => {
9
9
  let S = c(null), C = s(), w = c(null), T = n(), E = g === void 0 ? _ : g;
10
10
  o(() => {
11
11
  f ? (w.current = document.activeElement, S.current?.querySelector(e)?.focus()) : w.current?.focus();
@@ -59,7 +59,7 @@ function f({ open: f, side: p = "right", size: m = "classic", title: h, content:
59
59
  })
60
60
  });
61
61
  return typeof document > "u" ? O : l(O, document.body);
62
- }
62
+ };
63
63
  //#endregion
64
64
  export { f as Drawer };
65
65
 
@@ -1 +1 @@
1
- {"version":3,"file":"Drawer.js","names":[],"sources":["../../../src/components/Drawer/Drawer.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { Button } from '../Button/Button';\nimport { FOCUSABLE, trapFocus, useVisualViewport } from '../Dialog/dialogUtils';\n\nimport styles from './Drawer.module.css';\n\nexport type DrawerSide = 'left' | 'right';\nexport type DrawerSize = 'classic' | 'wide';\n\nexport interface DrawerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'content' | 'title'> {\n /** Whether the drawer is visible. */\n open: boolean;\n /** Edge that the drawer slides in from. Defaults to `\"right\"`. */\n side?: DrawerSide;\n /** Preset drawer width. Defaults to `\"classic\"`. */\n size?: DrawerSize;\n /** Optional drawer heading. */\n title?: ReactNode;\n /** Drawer content when a prop is preferred over `children`. */\n content?: ReactNode;\n /** Drawer content. Used when `content` is not provided. */\n children?: ReactNode;\n /** Called when the user dismisses the drawer with Escape or the backdrop. */\n onClose?: () => void;\n /** Whether clicking the backdrop closes the drawer. Defaults to `true`. */\n closeOnBackdrop?: boolean;\n}\n\n/**\n * Slide-over panel for supplementary content.\n *\n * The drawer is controlled through `open`, renders into `document.body`, and\n * accepts its body as either `content` or `children`.\n */\nexport function Drawer({\n open,\n side = 'right',\n size = 'classic',\n title,\n content,\n children,\n onClose,\n closeOnBackdrop = true,\n className,\n ...props\n}: DrawerProps) {\n const drawerRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n const viewportStyle = useVisualViewport();\n const body = content !== undefined ? content : children;\n\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n drawerRef.current?.querySelector<HTMLElement>(FOCUSABLE)?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n onClose?.();\n\n return;\n }\n\n trapFocus(event, drawerRef);\n },\n [onClose],\n );\n\n if (!open) {\n return null;\n }\n\n const node = (\n <div\n className={styles.backdrop}\n style={viewportStyle}\n onClick={closeOnBackdrop ? onClose : undefined}\n >\n <div\n ref={drawerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n data-side={side}\n data-size={size}\n className={[\n styles.drawer,\n side === 'left' ? styles.left : styles.right,\n size === 'wide' ? styles.wide : styles.classic,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onKeyDown={handleKeyDown}\n onClick={(event) => event.stopPropagation()}\n {...props}\n >\n {title && (\n <div id={titleId} className={styles.title}>\n <span className={styles.titleText}>{title}</span>\n {onClose && (\n <Button\n variant=\"flat\"\n shape=\"circular\"\n size=\"sm\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n ✕\n </Button>\n )}\n </div>\n )}\n {body !== undefined && <div className={styles.content}>{body}</div>}\n </div>\n </div>\n );\n\n if (typeof document === 'undefined') {\n return node;\n }\n\n return createPortal(node, document.body);\n}\n"],"mappings":";;;;;;;AA6CA,SAAgB,EAAO,EACrB,SACA,UAAO,SACP,UAAO,WACP,UACA,YACA,aACA,YACA,qBAAkB,IAClB,cACA,GAAG,KACW;CACd,IAAM,IAAY,EAAuB,KAAK,EACxC,IAAU,GAAO,EACjB,IAAoB,EAAuB,KAAK,EAChD,IAAgB,GAAmB,EACnC,IAAO,MAAY,KAAA,IAAsB,IAAV;AAErC,SAAgB;AACd,EAAI,KACF,EAAkB,UAAU,SAAS,eACrC,EAAU,SAAS,cAA2B,EAAU,EAAE,OAAO,IAEhE,EAAkB,SAAgC,OAAO;IAE3D,CAAC,EAAK,CAAC;CAEV,IAAM,IAAgB,GACnB,MAAyC;AACxC,MAAI,EAAM,QAAQ,UAAU;AAE1B,GADA,EAAM,gBAAgB,EACtB,KAAW;AAEX;;AAGF,IAAU,GAAO,EAAU;IAE7B,CAAC,EAAQ,CACV;AAED,KAAI,CAAC,EACH,QAAO;CAGT,IAAM,IACJ,kBAAC,OAAD;EACE,WAAW,EAAO;EAClB,OAAO;EACP,SAAS,IAAkB,IAAU,KAAA;YAErC,kBAAC,OAAD;GACE,KAAK;GACL,MAAK;GACL,cAAW;GACX,mBAAiB,IAAQ,IAAU,KAAA;GACnC,aAAW;GACX,aAAW;GACX,WAAW;IACT,EAAO;IACP,MAAS,SAAS,EAAO,OAAO,EAAO;IACvC,MAAS,SAAS,EAAO,OAAO,EAAO;IACvC;IACD,CACE,OAAO,QAAQ,CACf,KAAK,IAAI;GACZ,WAAW;GACX,UAAU,MAAU,EAAM,iBAAiB;GAC3C,GAAI;aAjBN,CAmBG,KACC,kBAAC,OAAD;IAAK,IAAI;IAAS,WAAW,EAAO;cAApC,CACE,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAY;KAAa,CAAA,EAChD,KACC,kBAAC,GAAD;KACE,SAAQ;KACR,OAAM;KACN,MAAK;KACL,cAAW;KACX,SAAS;eACV;KAEQ,CAAA,CAEP;OAEP,MAAS,KAAA,KAAa,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAU;IAAW,CAAA,CAC/D;;EACF,CAAA;AAOR,QAJI,OAAO,WAAa,MACf,IAGF,EAAa,GAAM,SAAS,KAAK"}
1
+ {"version":3,"file":"Drawer.js","names":[],"sources":["../../../src/components/Drawer/Drawer.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { Button } from '../Button/Button';\nimport { FOCUSABLE, trapFocus, useVisualViewport } from '../Dialog/dialogUtils';\n\nimport styles from './Drawer.module.css';\n\nexport type DrawerSide = 'left' | 'right';\nexport type DrawerSize = 'classic' | 'wide';\n\nexport interface DrawerProps extends Omit<HTMLAttributes<HTMLDivElement>, 'content' | 'title'> {\n /** Whether the drawer is visible. */\n open: boolean;\n /** Edge that the drawer slides in from. Defaults to `\"right\"`. */\n side?: DrawerSide;\n /** Preset drawer width. Defaults to `\"classic\"`. */\n size?: DrawerSize;\n /** Optional drawer heading. */\n title?: ReactNode;\n /** Drawer content when a prop is preferred over `children`. */\n content?: ReactNode;\n /** Drawer content. Used when `content` is not provided. */\n children?: ReactNode;\n /** Called when the user dismisses the drawer with Escape or the backdrop. */\n onClose?: () => void;\n /** Whether clicking the backdrop closes the drawer. Defaults to `true`. */\n closeOnBackdrop?: boolean;\n}\n\n/**\n * Slide-over panel for supplementary content.\n *\n * The drawer is controlled through `open`, renders into `document.body`, and\n * accepts its body as either `content` or `children`.\n */\nexport const Drawer = ({\n open,\n side = 'right',\n size = 'classic',\n title,\n content,\n children,\n onClose,\n closeOnBackdrop = true,\n className,\n ...props\n}: DrawerProps) => {\n const drawerRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n const viewportStyle = useVisualViewport();\n const body = content !== undefined ? content : children;\n\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n drawerRef.current?.querySelector<HTMLElement>(FOCUSABLE)?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n onClose?.();\n\n return;\n }\n\n trapFocus(event, drawerRef);\n },\n [onClose],\n );\n\n if (!open) {\n return null;\n }\n\n const node = (\n <div\n className={styles.backdrop}\n style={viewportStyle}\n onClick={closeOnBackdrop ? onClose : undefined}\n >\n <div\n ref={drawerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n data-side={side}\n data-size={size}\n className={[\n styles.drawer,\n side === 'left' ? styles.left : styles.right,\n size === 'wide' ? styles.wide : styles.classic,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onKeyDown={handleKeyDown}\n onClick={(event) => event.stopPropagation()}\n {...props}\n >\n {title && (\n <div id={titleId} className={styles.title}>\n <span className={styles.titleText}>{title}</span>\n {onClose && (\n <Button\n variant=\"flat\"\n shape=\"circular\"\n size=\"sm\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n ✕\n </Button>\n )}\n </div>\n )}\n {body !== undefined && <div className={styles.content}>{body}</div>}\n </div>\n </div>\n );\n\n if (typeof document === 'undefined') {\n return node;\n }\n\n return createPortal(node, document.body);\n};\n"],"mappings":";;;;;;;AA6CA,IAAa,KAAU,EACrB,SACA,UAAO,SACP,UAAO,WACP,UACA,YACA,aACA,YACA,qBAAkB,IAClB,cACA,GAAG,QACc;CACjB,IAAM,IAAY,EAAuB,IAAI,GACvC,IAAU,EAAM,GAChB,IAAoB,EAAuB,IAAI,GAC/C,IAAgB,EAAkB,GAClC,IAAO,MAAY,KAAA,IAAsB,IAAV;CAErC,QAAgB;EACd,AAAI,KACF,EAAkB,UAAU,SAAS,eACrC,EAAU,SAAS,cAA2B,CAAS,GAAG,MAAM,KAEhE,EAAmB,SAAgC,MAAM;CAE7D,GAAG,CAAC,CAAI,CAAC;CAET,IAAM,IAAgB,GACnB,MAAyC;EACxC,IAAI,EAAM,QAAQ,UAAU;GAE1B,AADA,EAAM,eAAe,GACrB,IAAU;GAEV;EACF;EAEA,EAAU,GAAO,CAAS;CAC5B,GACA,CAAC,CAAO,CACV;CAEA,IAAI,CAAC,GACH,OAAO;CAGT,IAAM,IACJ,kBAAC,OAAD;EACE,WAAW,EAAO;EAClB,OAAO;EACP,SAAS,IAAkB,IAAU,KAAA;YAErC,kBAAC,OAAD;GACE,KAAK;GACL,MAAK;GACL,cAAW;GACX,mBAAiB,IAAQ,IAAU,KAAA;GACnC,aAAW;GACX,aAAW;GACX,WAAW;IACT,EAAO;IACP,MAAS,SAAS,EAAO,OAAO,EAAO;IACvC,MAAS,SAAS,EAAO,OAAO,EAAO;IACvC;GACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;GACX,WAAW;GACX,UAAU,MAAU,EAAM,gBAAgB;GAC1C,GAAI;aAjBN,CAmBG,KACC,kBAAC,OAAD;IAAK,IAAI;IAAS,WAAW,EAAO;cAApC,CACE,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAY;IAAY,CAAA,GAC/C,KACC,kBAAC,GAAD;KACE,SAAQ;KACR,OAAM;KACN,MAAK;KACL,cAAW;KACX,SAAS;eACV;IAEO,CAAA,CAEP;OAEN,MAAS,KAAA,KAAa,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAU;GAAU,CAAA,CAC/D;;CACF,CAAA;CAOP,OAJI,OAAO,WAAa,MACf,IAGF,EAAa,GAAM,SAAS,IAAI;AACzC"}
@@ -1,2 +1,2 @@
1
- var e=`_backdrop_z2wwe_3`,t=`_drawer_z2wwe_28`,n=`_classic_z2wwe_40`,r=`_wide_z2wwe_44`,i=`_left_z2wwe_48`,a=`_right_z2wwe_58`,o=`_title_z2wwe_86`,s=`_titleText_z2wwe_94`,c=`_content_z2wwe_104`,l={backdrop:e,"backdrop-in":`_backdrop-in_z2wwe_1`,drawer:t,classic:n,wide:r,left:i,"drawer-in-left":`_drawer-in-left_z2wwe_1`,right:a,"drawer-in-right":`_drawer-in-right_z2wwe_1`,title:o,titleText:s,content:c};exports.default=l;
1
+ var e={backdrop:`_backdrop_z2wwe_3`,"backdrop-in":`_backdrop-in_z2wwe_1`,drawer:`_drawer_z2wwe_28`,classic:`_classic_z2wwe_40`,wide:`_wide_z2wwe_44`,left:`_left_z2wwe_48`,"drawer-in-left":`_drawer-in-left_z2wwe_1`,right:`_right_z2wwe_58`,"drawer-in-right":`_drawer-in-right_z2wwe_1`,title:`_title_z2wwe_86`,titleText:`_titleText_z2wwe_94`,content:`_content_z2wwe_104`};exports.default=e;
2
2
  //# sourceMappingURL=Drawer.module.css.cjs.map
@@ -1,19 +1,18 @@
1
- //#region src/components/Drawer/Drawer.module.css
2
- var e = "_backdrop_z2wwe_3", t = "_drawer_z2wwe_28", n = "_classic_z2wwe_40", r = "_wide_z2wwe_44", i = "_left_z2wwe_48", a = "_right_z2wwe_58", o = "_title_z2wwe_86", s = "_titleText_z2wwe_94", c = "_content_z2wwe_104", l = {
3
- backdrop: e,
1
+ var e = {
2
+ backdrop: "_backdrop_z2wwe_3",
4
3
  "backdrop-in": "_backdrop-in_z2wwe_1",
5
- drawer: t,
6
- classic: n,
7
- wide: r,
8
- left: i,
4
+ drawer: "_drawer_z2wwe_28",
5
+ classic: "_classic_z2wwe_40",
6
+ wide: "_wide_z2wwe_44",
7
+ left: "_left_z2wwe_48",
9
8
  "drawer-in-left": "_drawer-in-left_z2wwe_1",
10
- right: a,
9
+ right: "_right_z2wwe_58",
11
10
  "drawer-in-right": "_drawer-in-right_z2wwe_1",
12
- title: o,
13
- titleText: s,
14
- content: c
11
+ title: "_title_z2wwe_86",
12
+ titleText: "_titleText_z2wwe_94",
13
+ content: "_content_z2wwe_104"
15
14
  };
16
15
  //#endregion
17
- export { l as default };
16
+ export { e as default };
18
17
 
19
18
  //# sourceMappingURL=Drawer.module.css.js.map
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./Drawer/Drawer.cjs`);exports.Drawer=e.Drawer;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./Drawer/Drawer.cjs");exports.Drawer=e.Drawer;
@@ -1,2 +1,2 @@
1
- const e=require(`../Icon/Icon.cjs`),t=require(`./Dropdown.module.css.cjs`);let n=require(`react`),r=require(`react/jsx-runtime`),i=require(`@gnome-ui/icons`);function a({options:a,value:o,onChange:s,placeholder:c=`Select an option`,disabled:l,className:u,...d}){let[f,p]=(0,n.useState)(!1),[m,h]=(0,n.useState)(-1),[g,_]=(0,n.useState)(!1),v=(0,n.useId)(),y=(0,n.useId)(),b=(0,n.useRef)(null),x=(0,n.useRef)(null),S=a.find(e=>e.value===o),C=(0,n.useCallback)(()=>{if(!b.current)return;let e=b.current.getBoundingClientRect(),t=window.innerHeight-e.bottom,n=Math.min(a.length*48+8,280);_(t<n&&e.top>n)},[a.length]),w=(0,n.useCallback)(()=>{if(l)return;C(),p(!0);let e=a.findIndex(e=>e.value===o&&!e.disabled);h(e>=0?e:a.findIndex(e=>!e.disabled))},[l,C,a,o]),T=(0,n.useCallback)(()=>{p(!1),h(-1),b.current?.focus()},[]),E=(0,n.useCallback)(e=>{e.disabled||(s?.(e.value),T())},[s,T]);(0,n.useEffect)(()=>{!f||m<0||!x.current||x.current.children[m]?.scrollIntoView({block:`nearest`})},[m,f]),(0,n.useEffect)(()=>{if(!f)return;let e=e=>{!b.current?.contains(e.target)&&!x.current?.contains(e.target)&&T()};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[f,T]);let D=(0,n.useCallback)(e=>{switch(e.key){case`Enter`:case` `:case`ArrowDown`:e.preventDefault(),w();break;case`ArrowUp`:e.preventDefault(),C(),p(!0),h(a.reduce((e,t,n)=>t.disabled?e:n,-1));break}},[w,C,a]),O=(0,n.useCallback)(e=>{let t=a.map((e,t)=>({o:e,i:t})).filter(({o:e})=>!e.disabled).map(({i:e})=>e),n=t.indexOf(m);switch(e.key){case`ArrowDown`:{e.preventDefault();let r=t[Math.min(n+1,t.length-1)];h(r??m);break}case`ArrowUp`:{e.preventDefault();let r=t[Math.max(n-1,0)];h(r??m);break}case`Home`:e.preventDefault(),h(t[0]??-1);break;case`End`:e.preventDefault(),h(t[t.length-1]??-1);break;case`Enter`:case` `:e.preventDefault(),m>=0&&E(a[m]);break;case`Escape`:case`Tab`:T();break}},[a,m,E,T]);return(0,r.jsxs)(`div`,{className:[t.default.wrapper,u].filter(Boolean).join(` `),...d,children:[(0,r.jsxs)(`button`,{ref:b,id:v,type:`button`,role:`combobox`,"aria-haspopup":`listbox`,"aria-expanded":f,"aria-controls":y,"aria-activedescendant":f&&m>=0?`${y}-opt-${m}`:void 0,disabled:l,className:[t.default.trigger,f?t.default.triggerOpen:null].filter(Boolean).join(` `),onClick:()=>f?T():w(),onKeyDown:D,children:[(0,r.jsx)(`span`,{className:[t.default.triggerLabel,S?null:t.default.placeholder].filter(Boolean).join(` `),children:S?.label??c}),(0,r.jsx)(e.Icon,{icon:i.PanDown,size:`md`,"aria-hidden":!0,className:[t.default.chevron,f?t.default.chevronOpen:null].filter(Boolean).join(` `)})]}),f&&(0,r.jsx)(`ul`,{ref:x,id:y,role:`listbox`,"aria-labelledby":v,tabIndex:-1,className:[t.default.list,g?t.default.listUp:t.default.listDown].filter(Boolean).join(` `),onKeyDown:O,children:a.map((n,a)=>(0,r.jsxs)(`li`,{id:`${y}-opt-${a}`,role:`option`,"aria-selected":n.value===o,"aria-disabled":n.disabled,className:[t.default.option,n.value===o?t.default.optionSelected:null,a===m?t.default.optionActive:null,n.disabled?t.default.optionDisabled:null].filter(Boolean).join(` `),onMouseEnter:()=>!n.disabled&&h(a),onClick:()=>E(n),children:[(0,r.jsxs)(`span`,{className:t.default.optionText,children:[(0,r.jsx)(`span`,{className:t.default.optionLabel,children:n.label}),n.description&&(0,r.jsx)(`span`,{className:t.default.optionDesc,children:n.description})]}),n.value===o&&(0,r.jsx)(e.Icon,{icon:i.Check,size:`md`,"aria-hidden":!0,className:t.default.checkIcon})]},n.value))})]})}exports.Dropdown=a;
1
+ const e=require("../Icon/Icon.cjs"),t=require("./Dropdown.module.css.cjs");let n=require("react"),r=require("react/jsx-runtime"),i=require("@gnome-ui/icons");var a=({options:a,value:o,onChange:s,placeholder:c=`Select an option`,disabled:l,className:u,...d})=>{let[f,p]=(0,n.useState)(!1),[m,h]=(0,n.useState)(-1),[g,_]=(0,n.useState)(!1),v=(0,n.useId)(),y=(0,n.useId)(),b=(0,n.useRef)(null),x=(0,n.useRef)(null),S=a.find(e=>e.value===o),C=(0,n.useCallback)(()=>{if(!b.current)return;let e=b.current.getBoundingClientRect(),t=window.innerHeight-e.bottom,n=Math.min(a.length*48+8,280);_(t<n&&e.top>n)},[a.length]),w=(0,n.useCallback)(()=>{if(l)return;C(),p(!0);let e=a.findIndex(e=>e.value===o&&!e.disabled);h(e>=0?e:a.findIndex(e=>!e.disabled))},[l,C,a,o]),T=(0,n.useCallback)(()=>{p(!1),h(-1),b.current?.focus()},[]),E=(0,n.useCallback)(e=>{e.disabled||(s?.(e.value),T())},[s,T]);(0,n.useEffect)(()=>{!f||m<0||!x.current||x.current.children[m]?.scrollIntoView({block:`nearest`})},[m,f]),(0,n.useEffect)(()=>{if(!f)return;let e=e=>{!b.current?.contains(e.target)&&!x.current?.contains(e.target)&&T()};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[f,T]);let D=(0,n.useCallback)(e=>{switch(e.key){case`Enter`:case` `:case`ArrowDown`:e.preventDefault(),w();break;case`ArrowUp`:e.preventDefault(),C(),p(!0),h(a.reduce((e,t,n)=>t.disabled?e:n,-1));break}},[w,C,a]),O=(0,n.useCallback)(e=>{let t=a.map((e,t)=>({o:e,i:t})).filter(({o:e})=>!e.disabled).map(({i:e})=>e),n=t.indexOf(m);switch(e.key){case`ArrowDown`:{e.preventDefault();let r=t[Math.min(n+1,t.length-1)];h(r??m);break}case`ArrowUp`:{e.preventDefault();let r=t[Math.max(n-1,0)];h(r??m);break}case`Home`:e.preventDefault(),h(t[0]??-1);break;case`End`:e.preventDefault(),h(t[t.length-1]??-1);break;case`Enter`:case` `:e.preventDefault(),m>=0&&E(a[m]);break;case`Escape`:case`Tab`:T();break}},[a,m,E,T]);return(0,r.jsxs)(`div`,{className:[t.default.wrapper,u].filter(Boolean).join(` `),...d,children:[(0,r.jsxs)(`button`,{ref:b,id:v,type:`button`,role:`combobox`,"aria-haspopup":`listbox`,"aria-expanded":f,"aria-controls":y,"aria-activedescendant":f&&m>=0?`${y}-opt-${m}`:void 0,disabled:l,className:[t.default.trigger,f?t.default.triggerOpen:null].filter(Boolean).join(` `),onClick:()=>f?T():w(),onKeyDown:D,children:[(0,r.jsx)(`span`,{className:[t.default.triggerLabel,S?null:t.default.placeholder].filter(Boolean).join(` `),children:S?.label??c}),(0,r.jsx)(e.Icon,{icon:i.PanDown,size:`md`,"aria-hidden":!0,className:[t.default.chevron,f?t.default.chevronOpen:null].filter(Boolean).join(` `)})]}),f&&(0,r.jsx)(`ul`,{ref:x,id:y,role:`listbox`,"aria-labelledby":v,tabIndex:-1,className:[t.default.list,g?t.default.listUp:t.default.listDown].filter(Boolean).join(` `),onKeyDown:O,children:a.map((n,a)=>(0,r.jsxs)(`li`,{id:`${y}-opt-${a}`,role:`option`,"aria-selected":n.value===o,"aria-disabled":n.disabled,className:[t.default.option,n.value===o?t.default.optionSelected:null,a===m?t.default.optionActive:null,n.disabled?t.default.optionDisabled:null].filter(Boolean).join(` `),onMouseEnter:()=>!n.disabled&&h(a),onClick:()=>E(n),children:[(0,r.jsxs)(`span`,{className:t.default.optionText,children:[(0,r.jsx)(`span`,{className:t.default.optionLabel,children:n.label}),n.description&&(0,r.jsx)(`span`,{className:t.default.optionDesc,children:n.description})]}),n.value===o&&(0,r.jsx)(e.Icon,{icon:i.Check,size:`md`,"aria-hidden":!0,className:t.default.checkIcon})]},n.value))})]})};exports.Dropdown=a;
2
2
  //# sourceMappingURL=Dropdown.cjs.map