@gnome-ui/react 1.49.0 → 1.49.1

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 (343) hide show
  1. package/dist/components/AboutDialog/AboutDialog.module.css.cjs +1 -1
  2. package/dist/components/AboutDialog/AboutDialog.module.css.cjs.map +1 -1
  3. package/dist/components/AboutDialog/AboutDialog.module.css.js +28 -28
  4. package/dist/components/AboutDialog/AboutDialog.module.css.js.map +1 -1
  5. package/dist/components/ActionRow/ActionRow.module.css.cjs +1 -1
  6. package/dist/components/ActionRow/ActionRow.module.css.cjs.map +1 -1
  7. package/dist/components/ActionRow/ActionRow.module.css.js +9 -9
  8. package/dist/components/ActionRow/ActionRow.module.css.js.map +1 -1
  9. package/dist/components/Avatar/Avatar.module.css.cjs +1 -1
  10. package/dist/components/Avatar/Avatar.module.css.cjs.map +1 -1
  11. package/dist/components/Avatar/Avatar.module.css.js +16 -16
  12. package/dist/components/Avatar/Avatar.module.css.js.map +1 -1
  13. package/dist/components/AvatarGroup/AvatarGroup.module.css.cjs +1 -1
  14. package/dist/components/AvatarGroup/AvatarGroup.module.css.cjs.map +1 -1
  15. package/dist/components/AvatarGroup/AvatarGroup.module.css.js +7 -7
  16. package/dist/components/AvatarGroup/AvatarGroup.module.css.js.map +1 -1
  17. package/dist/components/Badge/Badge.module.css.cjs +1 -1
  18. package/dist/components/Badge/Badge.module.css.cjs.map +1 -1
  19. package/dist/components/Badge/Badge.module.css.js +9 -9
  20. package/dist/components/Badge/Badge.module.css.js.map +1 -1
  21. package/dist/components/Banner/Banner.module.css.cjs +1 -1
  22. package/dist/components/Banner/Banner.module.css.cjs.map +1 -1
  23. package/dist/components/Banner/Banner.module.css.js +13 -13
  24. package/dist/components/Banner/Banner.module.css.js.map +1 -1
  25. package/dist/components/Blockquote/Blockquote.module.css.cjs +1 -1
  26. package/dist/components/Blockquote/Blockquote.module.css.cjs.map +1 -1
  27. package/dist/components/Blockquote/Blockquote.module.css.js +11 -11
  28. package/dist/components/Blockquote/Blockquote.module.css.js.map +1 -1
  29. package/dist/components/BottomSheet/BottomSheet.cjs +1 -1
  30. package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
  31. package/dist/components/BottomSheet/BottomSheet.js +1 -1
  32. package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
  33. package/dist/components/BottomSheet/BottomSheet.module.css.cjs +1 -1
  34. package/dist/components/BottomSheet/BottomSheet.module.css.cjs.map +1 -1
  35. package/dist/components/BottomSheet/BottomSheet.module.css.js +13 -13
  36. package/dist/components/BottomSheet/BottomSheet.module.css.js.map +1 -1
  37. package/dist/components/BoxedList/BoxedList.module.css.cjs +1 -1
  38. package/dist/components/BoxedList/BoxedList.module.css.cjs.map +1 -1
  39. package/dist/components/BoxedList/BoxedList.module.css.js +5 -5
  40. package/dist/components/BoxedList/BoxedList.module.css.js.map +1 -1
  41. package/dist/components/BreakpointBin/BreakpointBin.cjs +1 -1
  42. package/dist/components/BreakpointBin/BreakpointBin.cjs.map +1 -1
  43. package/dist/components/BreakpointBin/BreakpointBin.js +1 -1
  44. package/dist/components/BreakpointBin/BreakpointBin.js.map +1 -1
  45. package/dist/components/Button/Button.module.css.cjs +1 -1
  46. package/dist/components/Button/Button.module.css.cjs.map +1 -1
  47. package/dist/components/Button/Button.module.css.js +11 -11
  48. package/dist/components/Button/Button.module.css.js.map +1 -1
  49. package/dist/components/ButtonRow/ButtonRow.module.css.cjs +1 -1
  50. package/dist/components/ButtonRow/ButtonRow.module.css.cjs.map +1 -1
  51. package/dist/components/ButtonRow/ButtonRow.module.css.js +7 -7
  52. package/dist/components/ButtonRow/ButtonRow.module.css.js.map +1 -1
  53. package/dist/components/Card/Card.module.css.cjs +1 -1
  54. package/dist/components/Card/Card.module.css.cjs.map +1 -1
  55. package/dist/components/Card/Card.module.css.js +6 -6
  56. package/dist/components/Card/Card.module.css.js.map +1 -1
  57. package/dist/components/Carousel/Carousel.cjs +1 -1
  58. package/dist/components/Carousel/Carousel.cjs.map +1 -1
  59. package/dist/components/Carousel/Carousel.d.ts +9 -3
  60. package/dist/components/Carousel/Carousel.js +99 -42
  61. package/dist/components/Carousel/Carousel.js.map +1 -1
  62. package/dist/components/Carousel/Carousel.module.css.cjs +1 -1
  63. package/dist/components/Carousel/Carousel.module.css.cjs.map +1 -1
  64. package/dist/components/Carousel/Carousel.module.css.js +11 -10
  65. package/dist/components/Carousel/Carousel.module.css.js.map +1 -1
  66. package/dist/components/CheckRow/CheckRow.module.css.cjs +1 -1
  67. package/dist/components/CheckRow/CheckRow.module.css.cjs.map +1 -1
  68. package/dist/components/CheckRow/CheckRow.module.css.js +10 -10
  69. package/dist/components/CheckRow/CheckRow.module.css.js.map +1 -1
  70. package/dist/components/Checkbox/Checkbox.module.css.cjs +1 -1
  71. package/dist/components/Checkbox/Checkbox.module.css.cjs.map +1 -1
  72. package/dist/components/Checkbox/Checkbox.module.css.js +1 -1
  73. package/dist/components/Checkbox/Checkbox.module.css.js.map +1 -1
  74. package/dist/components/Chip/Chip.module.css.cjs +1 -1
  75. package/dist/components/Chip/Chip.module.css.cjs.map +1 -1
  76. package/dist/components/Chip/Chip.module.css.js +7 -7
  77. package/dist/components/Chip/Chip.module.css.js.map +1 -1
  78. package/dist/components/ColorPicker/ColorPicker.cjs +1 -1
  79. package/dist/components/ColorPicker/ColorPicker.cjs.map +1 -1
  80. package/dist/components/ColorPicker/ColorPicker.js +1 -1
  81. package/dist/components/ColorPicker/ColorPicker.js.map +1 -1
  82. package/dist/components/ColorPicker/ColorPicker.module.css.cjs +1 -1
  83. package/dist/components/ColorPicker/ColorPicker.module.css.cjs.map +1 -1
  84. package/dist/components/ColorPicker/ColorPicker.module.css.js +10 -10
  85. package/dist/components/ColorPicker/ColorPicker.module.css.js.map +1 -1
  86. package/dist/components/ColumnView/ColumnView.module.css.cjs +1 -1
  87. package/dist/components/ColumnView/ColumnView.module.css.cjs.map +1 -1
  88. package/dist/components/ColumnView/ColumnView.module.css.js +22 -22
  89. package/dist/components/ColumnView/ColumnView.module.css.js.map +1 -1
  90. package/dist/components/ComboRow/ComboRow.module.css.cjs +1 -1
  91. package/dist/components/ComboRow/ComboRow.module.css.cjs.map +1 -1
  92. package/dist/components/ComboRow/ComboRow.module.css.js +24 -24
  93. package/dist/components/ComboRow/ComboRow.module.css.js.map +1 -1
  94. package/dist/components/ContributionGraph/ContributionGraph.module.css.cjs +1 -1
  95. package/dist/components/ContributionGraph/ContributionGraph.module.css.cjs.map +1 -1
  96. package/dist/components/ContributionGraph/ContributionGraph.module.css.js +9 -9
  97. package/dist/components/ContributionGraph/ContributionGraph.module.css.js.map +1 -1
  98. package/dist/components/CountDownTimer/CountDownTimer.module.css.cjs +1 -1
  99. package/dist/components/CountDownTimer/CountDownTimer.module.css.cjs.map +1 -1
  100. package/dist/components/CountDownTimer/CountDownTimer.module.css.js +7 -7
  101. package/dist/components/CountDownTimer/CountDownTimer.module.css.js.map +1 -1
  102. package/dist/components/Dialog/Dialog.module.css.cjs +1 -1
  103. package/dist/components/Dialog/Dialog.module.css.cjs.map +1 -1
  104. package/dist/components/Dialog/Dialog.module.css.js +11 -11
  105. package/dist/components/Dialog/Dialog.module.css.js.map +1 -1
  106. package/dist/components/Dialog/dialogUtils.cjs +1 -1
  107. package/dist/components/Dialog/dialogUtils.cjs.map +1 -1
  108. package/dist/components/Dialog/dialogUtils.js +1 -1
  109. package/dist/components/Dialog/dialogUtils.js.map +1 -1
  110. package/dist/components/Drawer/Drawer.module.css.cjs +1 -1
  111. package/dist/components/Drawer/Drawer.module.css.cjs.map +1 -1
  112. package/dist/components/Drawer/Drawer.module.css.js +12 -12
  113. package/dist/components/Drawer/Drawer.module.css.js.map +1 -1
  114. package/dist/components/Dropdown/Dropdown.module.css.cjs +1 -1
  115. package/dist/components/Dropdown/Dropdown.module.css.cjs.map +1 -1
  116. package/dist/components/Dropdown/Dropdown.module.css.js +20 -20
  117. package/dist/components/Dropdown/Dropdown.module.css.js.map +1 -1
  118. package/dist/components/EntryRow/EntryRow.module.css.cjs +1 -1
  119. package/dist/components/EntryRow/EntryRow.module.css.cjs.map +1 -1
  120. package/dist/components/EntryRow/EntryRow.module.css.js +10 -10
  121. package/dist/components/EntryRow/EntryRow.module.css.js.map +1 -1
  122. package/dist/components/ExpanderRow/ExpanderRow.module.css.cjs +1 -1
  123. package/dist/components/ExpanderRow/ExpanderRow.module.css.cjs.map +1 -1
  124. package/dist/components/ExpanderRow/ExpanderRow.module.css.js +14 -14
  125. package/dist/components/ExpanderRow/ExpanderRow.module.css.js.map +1 -1
  126. package/dist/components/Footer/Footer.module.css.cjs +1 -1
  127. package/dist/components/Footer/Footer.module.css.cjs.map +1 -1
  128. package/dist/components/Footer/Footer.module.css.js +5 -5
  129. package/dist/components/Footer/Footer.module.css.js.map +1 -1
  130. package/dist/components/Frame/Frame.module.css.cjs +1 -1
  131. package/dist/components/Frame/Frame.module.css.cjs.map +1 -1
  132. package/dist/components/Frame/Frame.module.css.js +1 -1
  133. package/dist/components/Frame/Frame.module.css.js.map +1 -1
  134. package/dist/components/HeaderBar/HeaderBar.module.css.cjs +1 -1
  135. package/dist/components/HeaderBar/HeaderBar.module.css.cjs.map +1 -1
  136. package/dist/components/HeaderBar/HeaderBar.module.css.js +6 -6
  137. package/dist/components/HeaderBar/HeaderBar.module.css.js.map +1 -1
  138. package/dist/components/Icon/Icon.module.css.cjs +1 -1
  139. package/dist/components/Icon/Icon.module.css.cjs.map +1 -1
  140. package/dist/components/Icon/Icon.module.css.js +7 -7
  141. package/dist/components/Icon/Icon.module.css.js.map +1 -1
  142. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.cjs +1 -1
  143. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.cjs.map +1 -1
  144. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.js +1 -1
  145. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.js.map +1 -1
  146. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.module.css.cjs +1 -1
  147. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.module.css.cjs.map +1 -1
  148. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.module.css.js +22 -22
  149. package/dist/components/InlineViewSwitcher/InlineViewSwitcher.module.css.js.map +1 -1
  150. package/dist/components/Link/Link.module.css.cjs +1 -1
  151. package/dist/components/Link/Link.module.css.cjs.map +1 -1
  152. package/dist/components/Link/Link.module.css.js +2 -2
  153. package/dist/components/Link/Link.module.css.js.map +1 -1
  154. package/dist/components/Modal/Modal.module.css.cjs +1 -1
  155. package/dist/components/Modal/Modal.module.css.cjs.map +1 -1
  156. package/dist/components/Modal/Modal.module.css.js +17 -17
  157. package/dist/components/Modal/Modal.module.css.js.map +1 -1
  158. package/dist/components/NavigationSplitView/NavigationSplitView.module.css.cjs +1 -1
  159. package/dist/components/NavigationSplitView/NavigationSplitView.module.css.cjs.map +1 -1
  160. package/dist/components/NavigationSplitView/NavigationSplitView.module.css.js +8 -8
  161. package/dist/components/NavigationSplitView/NavigationSplitView.module.css.js.map +1 -1
  162. package/dist/components/NavigationView/NavigationView.module.css.cjs +1 -1
  163. package/dist/components/NavigationView/NavigationView.module.css.cjs.map +1 -1
  164. package/dist/components/NavigationView/NavigationView.module.css.js +9 -9
  165. package/dist/components/NavigationView/NavigationView.module.css.js.map +1 -1
  166. package/dist/components/OverlaySplitView/OverlaySplitView.module.css.cjs +1 -1
  167. package/dist/components/OverlaySplitView/OverlaySplitView.module.css.cjs.map +1 -1
  168. package/dist/components/OverlaySplitView/OverlaySplitView.module.css.js +12 -12
  169. package/dist/components/OverlaySplitView/OverlaySplitView.module.css.js.map +1 -1
  170. package/dist/components/PasswordEntryRow/PasswordEntryRow.module.css.cjs +1 -1
  171. package/dist/components/PasswordEntryRow/PasswordEntryRow.module.css.cjs.map +1 -1
  172. package/dist/components/PasswordEntryRow/PasswordEntryRow.module.css.js +1 -1
  173. package/dist/components/PasswordEntryRow/PasswordEntryRow.module.css.js.map +1 -1
  174. package/dist/components/PathBar/PathBar.module.css.cjs +1 -1
  175. package/dist/components/PathBar/PathBar.module.css.cjs.map +1 -1
  176. package/dist/components/PathBar/PathBar.module.css.js +7 -7
  177. package/dist/components/PathBar/PathBar.module.css.js.map +1 -1
  178. package/dist/components/Popover/Popover.module.css.cjs +1 -1
  179. package/dist/components/Popover/Popover.module.css.cjs.map +1 -1
  180. package/dist/components/Popover/Popover.module.css.js +7 -7
  181. package/dist/components/Popover/Popover.module.css.js.map +1 -1
  182. package/dist/components/PreferencesDialog/PreferencesDialog.cjs +1 -1
  183. package/dist/components/PreferencesDialog/PreferencesDialog.cjs.map +1 -1
  184. package/dist/components/PreferencesDialog/PreferencesDialog.js +1 -1
  185. package/dist/components/PreferencesDialog/PreferencesDialog.js.map +1 -1
  186. package/dist/components/PreferencesDialog/PreferencesDialog.module.css.cjs +1 -1
  187. package/dist/components/PreferencesDialog/PreferencesDialog.module.css.cjs.map +1 -1
  188. package/dist/components/PreferencesDialog/PreferencesDialog.module.css.js +18 -18
  189. package/dist/components/PreferencesDialog/PreferencesDialog.module.css.js.map +1 -1
  190. package/dist/components/PreferencesGroup/PreferencesGroup.module.css.cjs +1 -1
  191. package/dist/components/PreferencesGroup/PreferencesGroup.module.css.cjs.map +1 -1
  192. package/dist/components/PreferencesGroup/PreferencesGroup.module.css.js +7 -7
  193. package/dist/components/PreferencesGroup/PreferencesGroup.module.css.js.map +1 -1
  194. package/dist/components/ProgressBar/ProgressBar.module.css.cjs +1 -1
  195. package/dist/components/ProgressBar/ProgressBar.module.css.cjs.map +1 -1
  196. package/dist/components/ProgressBar/ProgressBar.module.css.js +8 -8
  197. package/dist/components/ProgressBar/ProgressBar.module.css.js.map +1 -1
  198. package/dist/components/RadioButton/RadioButton.module.css.cjs +1 -1
  199. package/dist/components/RadioButton/RadioButton.module.css.cjs.map +1 -1
  200. package/dist/components/RadioButton/RadioButton.module.css.js +1 -1
  201. package/dist/components/RadioButton/RadioButton.module.css.js.map +1 -1
  202. package/dist/components/SearchBar/SearchBar.module.css.cjs +1 -1
  203. package/dist/components/SearchBar/SearchBar.module.css.cjs.map +1 -1
  204. package/dist/components/SearchBar/SearchBar.module.css.js +13 -13
  205. package/dist/components/SearchBar/SearchBar.module.css.js.map +1 -1
  206. package/dist/components/SegmentedBar/SegmentedBar.module.css.cjs +1 -1
  207. package/dist/components/SegmentedBar/SegmentedBar.module.css.cjs.map +1 -1
  208. package/dist/components/SegmentedBar/SegmentedBar.module.css.js +12 -12
  209. package/dist/components/SegmentedBar/SegmentedBar.module.css.js.map +1 -1
  210. package/dist/components/Separator/Separator.module.css.cjs +1 -1
  211. package/dist/components/Separator/Separator.module.css.cjs.map +1 -1
  212. package/dist/components/Separator/Separator.module.css.js +3 -3
  213. package/dist/components/Separator/Separator.module.css.js.map +1 -1
  214. package/dist/components/ShortcutLabel/ShortcutLabel.module.css.cjs +1 -1
  215. package/dist/components/ShortcutLabel/ShortcutLabel.module.css.cjs.map +1 -1
  216. package/dist/components/ShortcutLabel/ShortcutLabel.module.css.js +2 -2
  217. package/dist/components/ShortcutLabel/ShortcutLabel.module.css.js.map +1 -1
  218. package/dist/components/ShortcutsDialog/ShortcutsDialog.cjs +1 -1
  219. package/dist/components/ShortcutsDialog/ShortcutsDialog.cjs.map +1 -1
  220. package/dist/components/ShortcutsDialog/ShortcutsDialog.js +1 -1
  221. package/dist/components/ShortcutsDialog/ShortcutsDialog.js.map +1 -1
  222. package/dist/components/ShortcutsDialog/ShortcutsDialog.module.css.cjs +1 -1
  223. package/dist/components/ShortcutsDialog/ShortcutsDialog.module.css.cjs.map +1 -1
  224. package/dist/components/ShortcutsDialog/ShortcutsDialog.module.css.js +21 -21
  225. package/dist/components/ShortcutsDialog/ShortcutsDialog.module.css.js.map +1 -1
  226. package/dist/components/Sidebar/Sidebar.module.css.cjs +1 -1
  227. package/dist/components/Sidebar/Sidebar.module.css.cjs.map +1 -1
  228. package/dist/components/Sidebar/Sidebar.module.css.js +32 -32
  229. package/dist/components/Sidebar/Sidebar.module.css.js.map +1 -1
  230. package/dist/components/Skeleton/Skeleton.module.css.cjs +1 -1
  231. package/dist/components/Skeleton/Skeleton.module.css.cjs.map +1 -1
  232. package/dist/components/Skeleton/Skeleton.module.css.js +7 -7
  233. package/dist/components/Skeleton/Skeleton.module.css.js.map +1 -1
  234. package/dist/components/Slider/Slider.module.css.cjs +1 -1
  235. package/dist/components/Slider/Slider.module.css.cjs.map +1 -1
  236. package/dist/components/Slider/Slider.module.css.js +9 -9
  237. package/dist/components/Slider/Slider.module.css.js.map +1 -1
  238. package/dist/components/SpinButton/SpinButton.module.css.cjs +1 -1
  239. package/dist/components/SpinButton/SpinButton.module.css.cjs.map +1 -1
  240. package/dist/components/SpinButton/SpinButton.module.css.js +4 -4
  241. package/dist/components/SpinButton/SpinButton.module.css.js.map +1 -1
  242. package/dist/components/SpinRow/SpinRow.module.css.cjs +1 -1
  243. package/dist/components/SpinRow/SpinRow.module.css.cjs.map +1 -1
  244. package/dist/components/SpinRow/SpinRow.module.css.js +9 -9
  245. package/dist/components/SpinRow/SpinRow.module.css.js.map +1 -1
  246. package/dist/components/Spinner/Spinner.module.css.cjs +1 -1
  247. package/dist/components/Spinner/Spinner.module.css.cjs.map +1 -1
  248. package/dist/components/Spinner/Spinner.module.css.js +5 -5
  249. package/dist/components/Spinner/Spinner.module.css.js.map +1 -1
  250. package/dist/components/SplitButton/SplitButton.module.css.cjs +1 -1
  251. package/dist/components/SplitButton/SplitButton.module.css.cjs.map +1 -1
  252. package/dist/components/SplitButton/SplitButton.module.css.js +10 -10
  253. package/dist/components/SplitButton/SplitButton.module.css.js.map +1 -1
  254. package/dist/components/StatusBadge/StatusBadge.module.css.cjs +1 -1
  255. package/dist/components/StatusBadge/StatusBadge.module.css.cjs.map +1 -1
  256. package/dist/components/StatusBadge/StatusBadge.module.css.js +7 -7
  257. package/dist/components/StatusBadge/StatusBadge.module.css.js.map +1 -1
  258. package/dist/components/StatusPage/StatusPage.module.css.cjs +1 -1
  259. package/dist/components/StatusPage/StatusPage.module.css.cjs.map +1 -1
  260. package/dist/components/StatusPage/StatusPage.module.css.js +6 -6
  261. package/dist/components/StatusPage/StatusPage.module.css.js.map +1 -1
  262. package/dist/components/Switch/Switch.module.css.cjs +1 -1
  263. package/dist/components/Switch/Switch.module.css.cjs.map +1 -1
  264. package/dist/components/Switch/Switch.module.css.js +1 -1
  265. package/dist/components/Switch/Switch.module.css.js.map +1 -1
  266. package/dist/components/SwitchRow/SwitchRow.module.css.cjs +1 -1
  267. package/dist/components/SwitchRow/SwitchRow.module.css.cjs.map +1 -1
  268. package/dist/components/SwitchRow/SwitchRow.module.css.js +9 -9
  269. package/dist/components/SwitchRow/SwitchRow.module.css.js.map +1 -1
  270. package/dist/components/Tabs/TabBar.cjs +1 -1
  271. package/dist/components/Tabs/TabBar.cjs.map +1 -1
  272. package/dist/components/Tabs/TabBar.js +1 -1
  273. package/dist/components/Tabs/TabBar.js.map +1 -1
  274. package/dist/components/Tabs/Tabs.module.css.cjs +1 -1
  275. package/dist/components/Tabs/Tabs.module.css.cjs.map +1 -1
  276. package/dist/components/Tabs/Tabs.module.css.js +10 -10
  277. package/dist/components/Tabs/Tabs.module.css.js.map +1 -1
  278. package/dist/components/TerminalView/TerminalView.module.css.cjs +1 -1
  279. package/dist/components/TerminalView/TerminalView.module.css.cjs.map +1 -1
  280. package/dist/components/TerminalView/TerminalView.module.css.js +6 -6
  281. package/dist/components/TerminalView/TerminalView.module.css.js.map +1 -1
  282. package/dist/components/Text/Text.module.css.cjs +1 -1
  283. package/dist/components/Text/Text.module.css.cjs.map +1 -1
  284. package/dist/components/Text/Text.module.css.js +20 -20
  285. package/dist/components/Text/Text.module.css.js.map +1 -1
  286. package/dist/components/TextField/TextField.module.css.cjs +1 -1
  287. package/dist/components/TextField/TextField.module.css.cjs.map +1 -1
  288. package/dist/components/TextField/TextField.module.css.js +7 -7
  289. package/dist/components/TextField/TextField.module.css.js.map +1 -1
  290. package/dist/components/Timeline/Timeline.module.css.cjs +1 -1
  291. package/dist/components/Timeline/Timeline.module.css.cjs.map +1 -1
  292. package/dist/components/Timeline/Timeline.module.css.js +13 -13
  293. package/dist/components/Timeline/Timeline.module.css.js.map +1 -1
  294. package/dist/components/Toast/Toast.module.css.cjs +1 -1
  295. package/dist/components/Toast/Toast.module.css.cjs.map +1 -1
  296. package/dist/components/Toast/Toast.module.css.js +9 -9
  297. package/dist/components/Toast/Toast.module.css.js.map +1 -1
  298. package/dist/components/ToggleGroup/ToggleGroup.cjs +1 -1
  299. package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -1
  300. package/dist/components/ToggleGroup/ToggleGroup.js +1 -1
  301. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  302. package/dist/components/ToggleGroup/ToggleGroup.module.css.cjs +1 -1
  303. package/dist/components/ToggleGroup/ToggleGroup.module.css.cjs.map +1 -1
  304. package/dist/components/ToggleGroup/ToggleGroup.module.css.js +6 -6
  305. package/dist/components/ToggleGroup/ToggleGroup.module.css.js.map +1 -1
  306. package/dist/components/Toolbar/Toolbar.module.css.cjs +1 -1
  307. package/dist/components/Toolbar/Toolbar.module.css.cjs.map +1 -1
  308. package/dist/components/Toolbar/Toolbar.module.css.js +2 -2
  309. package/dist/components/Toolbar/Toolbar.module.css.js.map +1 -1
  310. package/dist/components/Tooltip/Tooltip.module.css.cjs +1 -1
  311. package/dist/components/Tooltip/Tooltip.module.css.cjs.map +1 -1
  312. package/dist/components/Tooltip/Tooltip.module.css.js +6 -6
  313. package/dist/components/Tooltip/Tooltip.module.css.js.map +1 -1
  314. package/dist/components/ViewSwitcher/ViewSwitcher.cjs +1 -1
  315. package/dist/components/ViewSwitcher/ViewSwitcher.cjs.map +1 -1
  316. package/dist/components/ViewSwitcher/ViewSwitcher.js +1 -1
  317. package/dist/components/ViewSwitcher/ViewSwitcher.js.map +1 -1
  318. package/dist/components/ViewSwitcher/ViewSwitcher.module.css.cjs +1 -1
  319. package/dist/components/ViewSwitcher/ViewSwitcher.module.css.cjs.map +1 -1
  320. package/dist/components/ViewSwitcher/ViewSwitcher.module.css.js +5 -5
  321. package/dist/components/ViewSwitcher/ViewSwitcher.module.css.js.map +1 -1
  322. package/dist/components/ViewSwitcherBar/ViewSwitcherBar.module.css.cjs +1 -1
  323. package/dist/components/ViewSwitcherBar/ViewSwitcherBar.module.css.cjs.map +1 -1
  324. package/dist/components/ViewSwitcherBar/ViewSwitcherBar.module.css.js +1 -1
  325. package/dist/components/ViewSwitcherBar/ViewSwitcherBar.module.css.js.map +1 -1
  326. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.cjs +1 -1
  327. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.cjs.map +1 -1
  328. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.js +1 -1
  329. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.js.map +1 -1
  330. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.module.css.cjs +1 -1
  331. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.module.css.cjs.map +1 -1
  332. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.module.css.js +14 -14
  333. package/dist/components/ViewSwitcherSidebar/ViewSwitcherSidebar.module.css.js.map +1 -1
  334. package/dist/components/WindowTitle/WindowTitle.module.css.cjs +1 -1
  335. package/dist/components/WindowTitle/WindowTitle.module.css.cjs.map +1 -1
  336. package/dist/components/WindowTitle/WindowTitle.module.css.js +3 -3
  337. package/dist/components/WindowTitle/WindowTitle.module.css.js.map +1 -1
  338. package/dist/components/WrapBox/WrapBox.module.css.cjs +1 -1
  339. package/dist/components/WrapBox/WrapBox.module.css.cjs.map +1 -1
  340. package/dist/components/WrapBox/WrapBox.module.css.js +2 -2
  341. package/dist/components/WrapBox/WrapBox.module.css.js.map +1 -1
  342. package/dist/style.css +1 -1
  343. package/package.json +1 -1
@@ -1,15 +1,15 @@
1
1
  var e = {
2
- blockquote: "_blockquote_mmiw1_3",
3
- body: "_body_mmiw1_15",
4
- icon: "_icon_mmiw1_21",
5
- content: "_content_mmiw1_28",
6
- footer: "_footer_mmiw1_36",
7
- cite: "_cite_mmiw1_42",
8
- default: "_default_mmiw1_48",
9
- info: "_info_mmiw1_52",
10
- warning: "_warning_mmiw1_57",
11
- error: "_error_mmiw1_62",
12
- success: "_success_mmiw1_67"
2
+ blockquote: "_blockquote_1lpyh_3",
3
+ body: "_body_1lpyh_15",
4
+ icon: "_icon_1lpyh_21",
5
+ content: "_content_1lpyh_28",
6
+ footer: "_footer_1lpyh_36",
7
+ cite: "_cite_1lpyh_42",
8
+ default: "_default_1lpyh_48",
9
+ info: "_info_1lpyh_52",
10
+ warning: "_warning_1lpyh_57",
11
+ error: "_error_1lpyh_62",
12
+ success: "_success_1lpyh_67"
13
13
  };
14
14
  //#endregion
15
15
  export { e as default };
@@ -1 +1 @@
1
- {"version":3,"file":"Blockquote.module.css.js","names":[],"sources":["../../../src/components/Blockquote/Blockquote.module.css"],"sourcesContent":["/* ─── Base ────────────────────────────────────────────────────────────────── */\n\n.blockquote {\n margin: 0;\n padding: var(--gnome-space-2, 12px) var(--gnome-space-3, 18px);\n border-left: var(--gnome-blockquote-border-width, 3px) solid;\n border-radius: 0 var(--gnome-radius-sm, 4px) var(--gnome-radius-sm, 4px) 0;\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body, 1rem);\n line-height: var(--gnome-line-height-body, 1.5);\n}\n\n/* ─── Body (icon + text) ──────────────────────────────────────────────────── */\n\n.body {\n display: flex;\n align-items: flex-start;\n gap: var(--gnome-space-2, 12px);\n}\n\n.icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n margin-top: 2px; /* optical alignment with first text baseline */\n}\n\n.content {\n margin: 0;\n flex: 1;\n min-width: 0;\n}\n\n/* ─── Attribution ─────────────────────────────────────────────────────────── */\n\n.footer {\n margin-top: var(--gnome-space-1, 6px);\n font-size: var(--gnome-font-size-caption, 0.75rem);\n opacity: var(--gnome-opacity-dim, 0.55);\n}\n\n.cite {\n font-style: normal;\n}\n\n/* ─── Variants ────────────────────────────────────────────────────────────── */\n\n.default {\n border-color: var(--gnome-border-subtle, rgba(0, 0, 0, 0.15));\n}\n\n.info {\n border-color: var(--gnome-accent-bg-color, #3584e4);\n background-color: color-mix(in srgb, var(--gnome-accent-bg-color, #3584e4) 8%, transparent);\n}\n\n.warning {\n border-color: var(--gnome-warning-bg-color, #f6d32d);\n background-color: color-mix(in srgb, var(--gnome-warning-bg-color, #f6d32d) 14%, transparent);\n}\n\n.error {\n border-color: var(--gnome-error-bg-color, #e01b24);\n background-color: color-mix(in srgb, var(--gnome-error-bg-color, #e01b24) 8%, transparent);\n}\n\n.success {\n border-color: var(--gnome-success-bg-color, #2ec27e);\n background-color: color-mix(in srgb, var(--gnome-success-bg-color, #2ec27e) 8%, transparent);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"Blockquote.module.css.js","names":[],"sources":["../../../src/components/Blockquote/Blockquote.module.css"],"sourcesContent":["/* ─── Base ────────────────────────────────────────────────────────────────── */\n\n.blockquote {\n margin: 0;\n padding: var(--gnome-space-2, 12px) var(--gnome-space-3, 18px);\n border-left: var(--gnome-blockquote-border-width, 3px) solid;\n border-radius: 0 var(--gnome-radius-sm, 4px) var(--gnome-radius-sm, 4px) 0;\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body, 1rem);\n line-height: var(--gnome-line-height-body, 1.5);\n}\n\n/* ─── Body (icon + text) ──────────────────────────────────────────────────── */\n\n.body {\n display: flex;\n align-items: flex-start;\n gap: var(--gnome-space-2, 12px);\n}\n\n.icon {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n margin-top: 2px; /* optical alignment with first text baseline */\n}\n\n.content {\n margin: 0;\n flex: 1;\n min-width: 0;\n}\n\n/* ─── Attribution ─────────────────────────────────────────────────────────── */\n\n.footer {\n margin-top: var(--gnome-space-1, 6px);\n font-size: var(--gnome-font-size-caption, 0.75rem);\n opacity: var(--gnome-opacity-dim, 0.55);\n}\n\n.cite {\n font-style: normal;\n}\n\n/* ─── Variants ────────────────────────────────────────────────────────────── */\n\n.default {\n border-color: var(--gnome-border-subtle, rgb(0 0 0 / 0.15));\n}\n\n.info {\n border-color: var(--gnome-accent-bg-color, #3584e4);\n background-color: color-mix(in srgb, var(--gnome-accent-bg-color, #3584e4) 8%, transparent);\n}\n\n.warning {\n border-color: var(--gnome-warning-bg-color, #f6d32d);\n background-color: color-mix(in srgb, var(--gnome-warning-bg-color, #f6d32d) 14%, transparent);\n}\n\n.error {\n border-color: var(--gnome-error-bg-color, #e01b24);\n background-color: color-mix(in srgb, var(--gnome-error-bg-color, #e01b24) 8%, transparent);\n}\n\n.success {\n border-color: var(--gnome-success-bg-color, #2ec27e);\n background-color: color-mix(in srgb, var(--gnome-success-bg-color, #2ec27e) 8%, transparent);\n}\n"],"mappings":""}
@@ -1,2 +1,2 @@
1
- const e=require("../Dialog/dialogUtils.cjs"),t=require("./BottomSheet.module.css.cjs");let n=require("react"),r=require("react-dom"),i=require("react/jsx-runtime");var a=`button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`,o=150,s=200,c=({open:c,title:l,children:u,onClose:d,closeOnBackdrop:f=!0,className:p,...m})=>{let h=(0,n.useRef)(null),g=(0,n.useRef)(null),_=(0,n.useId)(),v=(0,n.useRef)(null),[y,b]=(0,n.useState)(c),[x,S]=(0,n.useState)(c),[C,w]=(0,n.useState)(!1),T=(0,n.useRef)(c),E=(0,n.useRef)(!1),D=(0,n.useRef)(!1),O=(0,n.useRef)(0),k=(0,n.useRef)(0);e.useBodyScrollLock(c),(0,n.useEffect)(()=>{let e=T.current;T.current=c,c?(b(!0),S(!0),w(!1)):e&&!E.current?(S(!1),typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches?b(!1):w(!0)):e&&E.current&&(E.current=!1,S(!1),b(!1))},[c]),(0,n.useEffect)(()=>{c?(v.current=document.activeElement,(h.current?.querySelector(a))?.focus()):v.current?.focus()},[c]);let A=(0,n.useCallback)(e=>{if(e.key===`Escape`){e.preventDefault(),d?.();return}if(e.key!==`Tab`)return;let t=Array.from(h.current?.querySelectorAll(a)??[]);if(t.length===0)return;let n=t[0],r=t[t.length-1];e.shiftKey?document.activeElement===n&&(e.preventDefault(),r.focus()):document.activeElement===r&&(e.preventDefault(),n.focus())},[d]);(0,n.useEffect)(()=>{if(!C)return;let e=window.setTimeout(()=>{b(!1),w(!1)},s);return()=>window.clearTimeout(e)},[C]);let j=(0,n.useCallback)(e=>{D.current=!0,O.current=e.clientY,k.current=0,e.currentTarget.setPointerCapture(e.pointerId),h.current&&(h.current.style.animation=`none`,h.current.classList.add(t.default.dragging)),S(!1)},[]),M=(0,n.useCallback)(e=>{if(!D.current)return;let t=Math.max(0,e.clientY-O.current);k.current=t,h.current&&(h.current.style.transform=`translateY(${t}px)`)},[]),N=(0,n.useCallback)(()=>{if(!D.current)return;D.current=!1;let e=k.current;if(k.current=0,h.current?.classList.remove(t.default.dragging),e>=o){E.current=!0;let e=typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,t=h.current,n=g.current;!e&&t&&n?(t.style.transition=`transform ${s}ms ease`,t.style.transform=`translateY(100%)`,n.style.transition=`opacity ${s}ms ease`,n.style.opacity=`0`,setTimeout(()=>{t.style.transition=``,t.style.transform=``,n.style.transition=``,n.style.opacity=``,d?.()},s)):d?.()}else h.current&&(h.current.style.animation=``,h.current.style.transform=``)},[d]);if(!y)return null;let P=(0,i.jsx)(`div`,{ref:g,className:[t.default.backdrop,C?t.default.closing:null].filter(Boolean).join(` `),onClick:f?d:void 0,children:(0,i.jsxs)(`div`,{ref:h,role:`dialog`,"aria-modal":`true`,"aria-labelledby":l?_:void 0,className:[t.default.sheet,x?t.default.entering:null,C?t.default.closing:null,p].filter(Boolean).join(` `),onAnimationEnd:e=>{e.target===e.currentTarget&&x&&S(!1)},onKeyDown:A,onClick:e=>e.stopPropagation(),...m,children:[(0,i.jsx)(`div`,{className:t.default.handle,"aria-hidden":`true`,onPointerDown:j,onPointerMove:M,onPointerUp:N,onPointerCancel:N,children:(0,i.jsx)(`div`,{className:t.default.handleBar})}),l&&(0,i.jsx)(`div`,{id:_,className:t.default.title,children:l}),u&&(0,i.jsx)(`div`,{className:t.default.content,children:u})]})});return typeof document>`u`?P:(0,r.createPortal)(P,document.body)};exports.BottomSheet=c;
1
+ const e=require("../Dialog/dialogUtils.cjs"),t=require("./BottomSheet.module.css.cjs");let n=require("react"),r=require("react-dom"),i=require("react/jsx-runtime");var a=`button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])`,o=150,s=200,c=({open:c,title:l,children:u,onClose:d,closeOnBackdrop:f=!0,className:p,...m})=>{let h=(0,n.useRef)(null),g=(0,n.useRef)(null),_=(0,n.useId)(),v=(0,n.useRef)(null),[y,b]=(0,n.useState)(c),[x,S]=(0,n.useState)(c),[C,w]=(0,n.useState)(!1),T=(0,n.useRef)(c),E=(0,n.useRef)(!1),D=(0,n.useRef)(!1),O=(0,n.useRef)(0),k=(0,n.useRef)(0);e.useBodyScrollLock(c),(0,n.useEffect)(()=>{let e=T.current;T.current=c,c?(b(!0),S(!0),w(!1)):e&&!E.current?(S(!1),typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches?b(!1):w(!0)):e&&E.current&&(E.current=!1,S(!1),b(!1))},[c]),(0,n.useEffect)(()=>{c?(v.current=document.activeElement,(h.current?.querySelector(a))?.focus()):v.current?.focus()},[c]);let A=(0,n.useCallback)(e=>{if(e.key===`Escape`){e.preventDefault(),d?.();return}if(e.key!==`Tab`)return;let t=Array.from(h.current?.querySelectorAll(a)??[]);if(t.length===0)return;let[n]=t,r=t[t.length-1];e.shiftKey?document.activeElement===n&&(e.preventDefault(),r.focus()):document.activeElement===r&&(e.preventDefault(),n.focus())},[d]);(0,n.useEffect)(()=>{if(!C)return;let e=window.setTimeout(()=>{b(!1),w(!1)},s);return()=>window.clearTimeout(e)},[C]);let j=(0,n.useCallback)(e=>{D.current=!0,O.current=e.clientY,k.current=0,e.currentTarget.setPointerCapture(e.pointerId),h.current&&(h.current.style.animation=`none`,h.current.classList.add(t.default.dragging)),S(!1)},[]),M=(0,n.useCallback)(e=>{if(!D.current)return;let t=Math.max(0,e.clientY-O.current);k.current=t,h.current&&(h.current.style.transform=`translateY(${t}px)`)},[]),N=(0,n.useCallback)(()=>{if(!D.current)return;D.current=!1;let e=k.current;if(k.current=0,h.current?.classList.remove(t.default.dragging),e>=o){E.current=!0;let e=typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(prefers-reduced-motion: reduce)`).matches,t=h.current,n=g.current;!e&&t&&n?(t.style.transition=`transform ${s}ms ease`,t.style.transform=`translateY(100%)`,n.style.transition=`opacity ${s}ms ease`,n.style.opacity=`0`,setTimeout(()=>{t.style.transition=``,t.style.transform=``,n.style.transition=``,n.style.opacity=``,d?.()},s)):d?.()}else h.current&&(h.current.style.animation=``,h.current.style.transform=``)},[d]);if(!y)return null;let P=(0,i.jsx)(`div`,{ref:g,className:[t.default.backdrop,C?t.default.closing:null].filter(Boolean).join(` `),onClick:f?d:void 0,children:(0,i.jsxs)(`div`,{ref:h,role:`dialog`,"aria-modal":`true`,"aria-labelledby":l?_:void 0,className:[t.default.sheet,x?t.default.entering:null,C?t.default.closing:null,p].filter(Boolean).join(` `),onAnimationEnd:e=>{e.target===e.currentTarget&&x&&S(!1)},onKeyDown:A,onClick:e=>e.stopPropagation(),...m,children:[(0,i.jsx)(`div`,{className:t.default.handle,"aria-hidden":`true`,onPointerDown:j,onPointerMove:M,onPointerUp:N,onPointerCancel:N,children:(0,i.jsx)(`div`,{className:t.default.handleBar})}),l&&(0,i.jsx)(`div`,{id:_,className:t.default.title,children:l}),u&&(0,i.jsx)(`div`,{className:t.default.content,children:u})]})});return typeof document>`u`?P:(0,r.createPortal)(P,document.body)};exports.BottomSheet=c;
2
2
  //# sourceMappingURL=BottomSheet.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheet.cjs","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type PointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { useBodyScrollLock } from '../Dialog/dialogUtils';\n\nimport styles from './BottomSheet.module.css';\n\nconst FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nconst DRAG_CLOSE_THRESHOLD = 150;\nconst CLOSE_ANIM_DURATION = 200;\n\nexport interface BottomSheetProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Whether the sheet is visible. */\n open: boolean;\n /**\n * Optional heading shown in the drag handle area.\n */\n title?: ReactNode;\n children?: ReactNode;\n /** Called when the user dismisses the sheet (Escape, backdrop click, or drag down). */\n onClose?: () => void;\n /**\n * Whether clicking the backdrop closes the sheet.\n * Defaults to `true`.\n */\n closeOnBackdrop?: boolean;\n}\n\n/**\n * Slide-up panel that overlays content from the bottom edge.\n *\n * Mirrors `AdwBottomSheet` (libadwaita 1.6+). Renders into a portal on\n * `document.body`. Traps focus, closes on Escape, backdrop click, or by\n * dragging the handle bar downward past 150 px. Plays slide-out animation on close.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.BottomSheet.html\n */\nexport const BottomSheet = ({\n open,\n title,\n children,\n onClose,\n closeOnBackdrop = true,\n className,\n ...props\n}: BottomSheetProps) => {\n const sheetRef = useRef<HTMLDivElement>(null);\n const backdropRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n\n // Animation state\n const [isVisible, setIsVisible] = useState(open);\n const [isEntering, setIsEntering] = useState(open);\n const [isClosing, setIsClosing] = useState(false);\n const prevOpen = useRef(open);\n const dragClosing = useRef(false);\n\n // Drag state (refs avoid re-renders during drag)\n const isDragging = useRef(false);\n const dragStartY = useRef(0);\n const sheetDragY = useRef(0);\n\n useBodyScrollLock(open);\n\n // Track open → closed transitions\n useEffect(() => {\n const wasOpen = prevOpen.current;\n prevOpen.current = open;\n\n if (open) {\n setIsVisible(true);\n setIsEntering(true);\n setIsClosing(false);\n } else if (wasOpen && !dragClosing.current) {\n setIsEntering(false);\n\n const reducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n if (reducedMotion) {\n setIsVisible(false);\n } else {\n setIsClosing(true);\n }\n } else if (wasOpen && dragClosing.current) {\n dragClosing.current = false;\n setIsEntering(false);\n setIsVisible(false);\n }\n }, [open]);\n\n // Save / restore focus\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n const el = sheetRef.current?.querySelector<HTMLElement>(FOCUSABLE);\n\n el?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n // Focus trap + Escape\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose?.();\n\n return;\n }\n\n if (e.key !== 'Tab') {\n return;\n }\n\n const focusable = Array.from(\n sheetRef.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? [],\n );\n\n if (focusable.length === 0) {\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 [onClose],\n );\n\n // Unmount after exit animation duration elapses\n useEffect(() => {\n if (!isClosing) {\n return;\n }\n\n const id = window.setTimeout(() => {\n setIsVisible(false);\n setIsClosing(false);\n }, CLOSE_ANIM_DURATION);\n\n return () => window.clearTimeout(id);\n }, [isClosing]);\n\n // ─── Drag-to-dismiss ─────────────────────────────────────────────────────────\n\n const handlePointerDown = useCallback((e: PointerEvent<HTMLDivElement>) => {\n isDragging.current = true;\n dragStartY.current = e.clientY;\n sheetDragY.current = 0;\n e.currentTarget.setPointerCapture(e.pointerId);\n\n if (sheetRef.current) {\n // Cancel any active entry animation immediately so inline style.transform\n // takes effect. CSS animations sit above the author cascade layer and would\n // otherwise override the inline transform set during drag.\n sheetRef.current.style.animation = 'none';\n sheetRef.current.classList.add(styles.dragging);\n }\n\n setIsEntering(false);\n }, []);\n\n const handlePointerMove = useCallback((e: PointerEvent<HTMLDivElement>) => {\n if (!isDragging.current) {\n return;\n }\n\n const delta = Math.max(0, e.clientY - dragStartY.current);\n\n sheetDragY.current = delta;\n\n if (sheetRef.current) {\n sheetRef.current.style.transform = `translateY(${delta}px)`;\n }\n }, []);\n\n const handlePointerUp = useCallback(() => {\n if (!isDragging.current) {\n return;\n }\n isDragging.current = false;\n\n const delta = sheetDragY.current;\n\n sheetDragY.current = 0;\n sheetRef.current?.classList.remove(styles.dragging);\n\n if (delta >= DRAG_CLOSE_THRESHOLD) {\n dragClosing.current = true;\n\n const reducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n const sheet = sheetRef.current;\n const backdrop = backdropRef.current;\n\n if (!reducedMotion && sheet && backdrop) {\n sheet.style.transition = `transform ${CLOSE_ANIM_DURATION}ms ease`;\n sheet.style.transform = 'translateY(100%)';\n backdrop.style.transition = `opacity ${CLOSE_ANIM_DURATION}ms ease`;\n backdrop.style.opacity = '0';\n\n setTimeout(() => {\n sheet.style.transition = '';\n sheet.style.transform = '';\n backdrop.style.transition = '';\n backdrop.style.opacity = '';\n onClose?.();\n }, CLOSE_ANIM_DURATION);\n } else {\n onClose?.();\n }\n } else if (sheetRef.current) {\n // Snap back — restore animation override and clear transform so CSS transition animates to 0\n sheetRef.current.style.animation = '';\n sheetRef.current.style.transform = '';\n }\n }, [onClose]);\n\n if (!isVisible) {\n return null;\n }\n\n const node = (\n <div\n ref={backdropRef}\n className={[styles.backdrop, isClosing ? styles.closing : null].filter(Boolean).join(' ')}\n onClick={closeOnBackdrop ? onClose : undefined}\n >\n <div\n ref={sheetRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={[\n styles.sheet,\n isEntering ? styles.entering : null,\n isClosing ? styles.closing : null,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onAnimationEnd={(e) => {\n if (e.target === e.currentTarget && isEntering) {\n setIsEntering(false);\n }\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {/* Handle bar — drag downward to dismiss */}\n <div\n className={styles.handle}\n aria-hidden=\"true\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <div className={styles.handleBar} />\n </div>\n\n {/* Optional title */}\n {title && (\n <div id={titleId} className={styles.title}>\n {title}\n </div>\n )}\n\n {/* Content */}\n {children && <div className={styles.content}>{children}</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":"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"}
1
+ {"version":3,"file":"BottomSheet.cjs","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type PointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { useBodyScrollLock } from '../Dialog/dialogUtils';\n\nimport styles from './BottomSheet.module.css';\n\nconst FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nconst DRAG_CLOSE_THRESHOLD = 150;\nconst CLOSE_ANIM_DURATION = 200;\n\nexport interface BottomSheetProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Whether the sheet is visible. */\n open: boolean;\n /**\n * Optional heading shown in the drag handle area.\n */\n title?: ReactNode;\n children?: ReactNode;\n /** Called when the user dismisses the sheet (Escape, backdrop click, or drag down). */\n onClose?: () => void;\n /**\n * Whether clicking the backdrop closes the sheet.\n * Defaults to `true`.\n */\n closeOnBackdrop?: boolean;\n}\n\n/**\n * Slide-up panel that overlays content from the bottom edge.\n *\n * Mirrors `AdwBottomSheet` (libadwaita 1.6+). Renders into a portal on\n * `document.body`. Traps focus, closes on Escape, backdrop click, or by\n * dragging the handle bar downward past 150 px. Plays slide-out animation on close.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.BottomSheet.html\n */\nexport const BottomSheet = ({\n open,\n title,\n children,\n onClose,\n closeOnBackdrop = true,\n className,\n ...props\n}: BottomSheetProps) => {\n const sheetRef = useRef<HTMLDivElement>(null);\n const backdropRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n\n // Animation state\n const [isVisible, setIsVisible] = useState(open);\n const [isEntering, setIsEntering] = useState(open);\n const [isClosing, setIsClosing] = useState(false);\n const prevOpen = useRef(open);\n const dragClosing = useRef(false);\n\n // Drag state (refs avoid re-renders during drag)\n const isDragging = useRef(false);\n const dragStartY = useRef(0);\n const sheetDragY = useRef(0);\n\n useBodyScrollLock(open);\n\n // Track open → closed transitions\n useEffect(() => {\n const wasOpen = prevOpen.current;\n prevOpen.current = open;\n\n if (open) {\n setIsVisible(true);\n setIsEntering(true);\n setIsClosing(false);\n } else if (wasOpen && !dragClosing.current) {\n setIsEntering(false);\n\n const reducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n if (reducedMotion) {\n setIsVisible(false);\n } else {\n setIsClosing(true);\n }\n } else if (wasOpen && dragClosing.current) {\n dragClosing.current = false;\n setIsEntering(false);\n setIsVisible(false);\n }\n }, [open]);\n\n // Save / restore focus\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n const el = sheetRef.current?.querySelector<HTMLElement>(FOCUSABLE);\n\n el?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n // Focus trap + Escape\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose?.();\n\n return;\n }\n\n if (e.key !== 'Tab') {\n return;\n }\n\n const focusable = Array.from(\n sheetRef.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? [],\n );\n\n if (focusable.length === 0) {\n return;\n }\n\n const [first] = focusable;\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 [onClose],\n );\n\n // Unmount after exit animation duration elapses\n useEffect(() => {\n if (!isClosing) {\n return;\n }\n\n const id = window.setTimeout(() => {\n setIsVisible(false);\n setIsClosing(false);\n }, CLOSE_ANIM_DURATION);\n\n return () => window.clearTimeout(id);\n }, [isClosing]);\n\n // ─── Drag-to-dismiss ─────────────────────────────────────────────────────────\n\n const handlePointerDown = useCallback((e: PointerEvent<HTMLDivElement>) => {\n isDragging.current = true;\n dragStartY.current = e.clientY;\n sheetDragY.current = 0;\n e.currentTarget.setPointerCapture(e.pointerId);\n\n if (sheetRef.current) {\n // Cancel any active entry animation immediately so inline style.transform\n // takes effect. CSS animations sit above the author cascade layer and would\n // otherwise override the inline transform set during drag.\n sheetRef.current.style.animation = 'none';\n sheetRef.current.classList.add(styles.dragging);\n }\n\n setIsEntering(false);\n }, []);\n\n const handlePointerMove = useCallback((e: PointerEvent<HTMLDivElement>) => {\n if (!isDragging.current) {\n return;\n }\n\n const delta = Math.max(0, e.clientY - dragStartY.current);\n\n sheetDragY.current = delta;\n\n if (sheetRef.current) {\n sheetRef.current.style.transform = `translateY(${delta}px)`;\n }\n }, []);\n\n const handlePointerUp = useCallback(() => {\n if (!isDragging.current) {\n return;\n }\n isDragging.current = false;\n\n const delta = sheetDragY.current;\n\n sheetDragY.current = 0;\n sheetRef.current?.classList.remove(styles.dragging);\n\n if (delta >= DRAG_CLOSE_THRESHOLD) {\n dragClosing.current = true;\n\n const reducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n const sheet = sheetRef.current;\n const backdrop = backdropRef.current;\n\n if (!reducedMotion && sheet && backdrop) {\n sheet.style.transition = `transform ${CLOSE_ANIM_DURATION}ms ease`;\n sheet.style.transform = 'translateY(100%)';\n backdrop.style.transition = `opacity ${CLOSE_ANIM_DURATION}ms ease`;\n backdrop.style.opacity = '0';\n\n setTimeout(() => {\n sheet.style.transition = '';\n sheet.style.transform = '';\n backdrop.style.transition = '';\n backdrop.style.opacity = '';\n onClose?.();\n }, CLOSE_ANIM_DURATION);\n } else {\n onClose?.();\n }\n } else if (sheetRef.current) {\n // Snap back — restore animation override and clear transform so CSS transition animates to 0\n sheetRef.current.style.animation = '';\n sheetRef.current.style.transform = '';\n }\n }, [onClose]);\n\n if (!isVisible) {\n return null;\n }\n\n const node = (\n <div\n ref={backdropRef}\n className={[styles.backdrop, isClosing ? styles.closing : null].filter(Boolean).join(' ')}\n onClick={closeOnBackdrop ? onClose : undefined}\n >\n <div\n ref={sheetRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={[\n styles.sheet,\n isEntering ? styles.entering : null,\n isClosing ? styles.closing : null,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onAnimationEnd={(e) => {\n if (e.target === e.currentTarget && isEntering) {\n setIsEntering(false);\n }\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {/* Handle bar — drag downward to dismiss */}\n <div\n className={styles.handle}\n aria-hidden=\"true\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <div className={styles.handleBar} />\n </div>\n\n {/* Optional title */}\n {title && (\n <div id={titleId} className={styles.title}>\n {title}\n </div>\n )}\n\n {/* Content */}\n {children && <div className={styles.content}>{children}</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":"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"}
@@ -20,7 +20,7 @@ var u = "button:not([disabled]), [href], input:not([disabled]), select:not([disa
20
20
  if (e.key !== "Tab") return;
21
21
  let t = Array.from(b.current?.querySelectorAll(u) ?? []);
22
22
  if (t.length === 0) return;
23
- let n = t[0], r = t[t.length - 1];
23
+ let [n] = t, r = t[t.length - 1];
24
24
  e.shiftKey ? document.activeElement === n && (e.preventDefault(), r.focus()) : document.activeElement === r && (e.preventDefault(), n.focus());
25
25
  }, [g]);
26
26
  r(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheet.js","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type PointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { useBodyScrollLock } from '../Dialog/dialogUtils';\n\nimport styles from './BottomSheet.module.css';\n\nconst FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nconst DRAG_CLOSE_THRESHOLD = 150;\nconst CLOSE_ANIM_DURATION = 200;\n\nexport interface BottomSheetProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Whether the sheet is visible. */\n open: boolean;\n /**\n * Optional heading shown in the drag handle area.\n */\n title?: ReactNode;\n children?: ReactNode;\n /** Called when the user dismisses the sheet (Escape, backdrop click, or drag down). */\n onClose?: () => void;\n /**\n * Whether clicking the backdrop closes the sheet.\n * Defaults to `true`.\n */\n closeOnBackdrop?: boolean;\n}\n\n/**\n * Slide-up panel that overlays content from the bottom edge.\n *\n * Mirrors `AdwBottomSheet` (libadwaita 1.6+). Renders into a portal on\n * `document.body`. Traps focus, closes on Escape, backdrop click, or by\n * dragging the handle bar downward past 150 px. Plays slide-out animation on close.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.BottomSheet.html\n */\nexport const BottomSheet = ({\n open,\n title,\n children,\n onClose,\n closeOnBackdrop = true,\n className,\n ...props\n}: BottomSheetProps) => {\n const sheetRef = useRef<HTMLDivElement>(null);\n const backdropRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n\n // Animation state\n const [isVisible, setIsVisible] = useState(open);\n const [isEntering, setIsEntering] = useState(open);\n const [isClosing, setIsClosing] = useState(false);\n const prevOpen = useRef(open);\n const dragClosing = useRef(false);\n\n // Drag state (refs avoid re-renders during drag)\n const isDragging = useRef(false);\n const dragStartY = useRef(0);\n const sheetDragY = useRef(0);\n\n useBodyScrollLock(open);\n\n // Track open → closed transitions\n useEffect(() => {\n const wasOpen = prevOpen.current;\n prevOpen.current = open;\n\n if (open) {\n setIsVisible(true);\n setIsEntering(true);\n setIsClosing(false);\n } else if (wasOpen && !dragClosing.current) {\n setIsEntering(false);\n\n const reducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n if (reducedMotion) {\n setIsVisible(false);\n } else {\n setIsClosing(true);\n }\n } else if (wasOpen && dragClosing.current) {\n dragClosing.current = false;\n setIsEntering(false);\n setIsVisible(false);\n }\n }, [open]);\n\n // Save / restore focus\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n const el = sheetRef.current?.querySelector<HTMLElement>(FOCUSABLE);\n\n el?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n // Focus trap + Escape\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose?.();\n\n return;\n }\n\n if (e.key !== 'Tab') {\n return;\n }\n\n const focusable = Array.from(\n sheetRef.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? [],\n );\n\n if (focusable.length === 0) {\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 [onClose],\n );\n\n // Unmount after exit animation duration elapses\n useEffect(() => {\n if (!isClosing) {\n return;\n }\n\n const id = window.setTimeout(() => {\n setIsVisible(false);\n setIsClosing(false);\n }, CLOSE_ANIM_DURATION);\n\n return () => window.clearTimeout(id);\n }, [isClosing]);\n\n // ─── Drag-to-dismiss ─────────────────────────────────────────────────────────\n\n const handlePointerDown = useCallback((e: PointerEvent<HTMLDivElement>) => {\n isDragging.current = true;\n dragStartY.current = e.clientY;\n sheetDragY.current = 0;\n e.currentTarget.setPointerCapture(e.pointerId);\n\n if (sheetRef.current) {\n // Cancel any active entry animation immediately so inline style.transform\n // takes effect. CSS animations sit above the author cascade layer and would\n // otherwise override the inline transform set during drag.\n sheetRef.current.style.animation = 'none';\n sheetRef.current.classList.add(styles.dragging);\n }\n\n setIsEntering(false);\n }, []);\n\n const handlePointerMove = useCallback((e: PointerEvent<HTMLDivElement>) => {\n if (!isDragging.current) {\n return;\n }\n\n const delta = Math.max(0, e.clientY - dragStartY.current);\n\n sheetDragY.current = delta;\n\n if (sheetRef.current) {\n sheetRef.current.style.transform = `translateY(${delta}px)`;\n }\n }, []);\n\n const handlePointerUp = useCallback(() => {\n if (!isDragging.current) {\n return;\n }\n isDragging.current = false;\n\n const delta = sheetDragY.current;\n\n sheetDragY.current = 0;\n sheetRef.current?.classList.remove(styles.dragging);\n\n if (delta >= DRAG_CLOSE_THRESHOLD) {\n dragClosing.current = true;\n\n const reducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n const sheet = sheetRef.current;\n const backdrop = backdropRef.current;\n\n if (!reducedMotion && sheet && backdrop) {\n sheet.style.transition = `transform ${CLOSE_ANIM_DURATION}ms ease`;\n sheet.style.transform = 'translateY(100%)';\n backdrop.style.transition = `opacity ${CLOSE_ANIM_DURATION}ms ease`;\n backdrop.style.opacity = '0';\n\n setTimeout(() => {\n sheet.style.transition = '';\n sheet.style.transform = '';\n backdrop.style.transition = '';\n backdrop.style.opacity = '';\n onClose?.();\n }, CLOSE_ANIM_DURATION);\n } else {\n onClose?.();\n }\n } else if (sheetRef.current) {\n // Snap back — restore animation override and clear transform so CSS transition animates to 0\n sheetRef.current.style.animation = '';\n sheetRef.current.style.transform = '';\n }\n }, [onClose]);\n\n if (!isVisible) {\n return null;\n }\n\n const node = (\n <div\n ref={backdropRef}\n className={[styles.backdrop, isClosing ? styles.closing : null].filter(Boolean).join(' ')}\n onClick={closeOnBackdrop ? onClose : undefined}\n >\n <div\n ref={sheetRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={[\n styles.sheet,\n isEntering ? styles.entering : null,\n isClosing ? styles.closing : null,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onAnimationEnd={(e) => {\n if (e.target === e.currentTarget && isEntering) {\n setIsEntering(false);\n }\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {/* Handle bar — drag downward to dismiss */}\n <div\n className={styles.handle}\n aria-hidden=\"true\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <div className={styles.handleBar} />\n </div>\n\n {/* Optional title */}\n {title && (\n <div id={titleId} className={styles.title}>\n {title}\n </div>\n )}\n\n {/* Content */}\n {children && <div className={styles.content}>{children}</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":"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"}
1
+ {"version":3,"file":"BottomSheet.js","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.tsx"],"sourcesContent":["import {\n type HTMLAttributes,\n type KeyboardEvent,\n type PointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\n\nimport { createPortal } from 'react-dom';\n\nimport { useBodyScrollLock } from '../Dialog/dialogUtils';\n\nimport styles from './BottomSheet.module.css';\n\nconst FOCUSABLE =\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nconst DRAG_CLOSE_THRESHOLD = 150;\nconst CLOSE_ANIM_DURATION = 200;\n\nexport interface BottomSheetProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n /** Whether the sheet is visible. */\n open: boolean;\n /**\n * Optional heading shown in the drag handle area.\n */\n title?: ReactNode;\n children?: ReactNode;\n /** Called when the user dismisses the sheet (Escape, backdrop click, or drag down). */\n onClose?: () => void;\n /**\n * Whether clicking the backdrop closes the sheet.\n * Defaults to `true`.\n */\n closeOnBackdrop?: boolean;\n}\n\n/**\n * Slide-up panel that overlays content from the bottom edge.\n *\n * Mirrors `AdwBottomSheet` (libadwaita 1.6+). Renders into a portal on\n * `document.body`. Traps focus, closes on Escape, backdrop click, or by\n * dragging the handle bar downward past 150 px. Plays slide-out animation on close.\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.BottomSheet.html\n */\nexport const BottomSheet = ({\n open,\n title,\n children,\n onClose,\n closeOnBackdrop = true,\n className,\n ...props\n}: BottomSheetProps) => {\n const sheetRef = useRef<HTMLDivElement>(null);\n const backdropRef = useRef<HTMLDivElement>(null);\n const titleId = useId();\n const previouslyFocused = useRef<Element | null>(null);\n\n // Animation state\n const [isVisible, setIsVisible] = useState(open);\n const [isEntering, setIsEntering] = useState(open);\n const [isClosing, setIsClosing] = useState(false);\n const prevOpen = useRef(open);\n const dragClosing = useRef(false);\n\n // Drag state (refs avoid re-renders during drag)\n const isDragging = useRef(false);\n const dragStartY = useRef(0);\n const sheetDragY = useRef(0);\n\n useBodyScrollLock(open);\n\n // Track open → closed transitions\n useEffect(() => {\n const wasOpen = prevOpen.current;\n prevOpen.current = open;\n\n if (open) {\n setIsVisible(true);\n setIsEntering(true);\n setIsClosing(false);\n } else if (wasOpen && !dragClosing.current) {\n setIsEntering(false);\n\n const reducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n if (reducedMotion) {\n setIsVisible(false);\n } else {\n setIsClosing(true);\n }\n } else if (wasOpen && dragClosing.current) {\n dragClosing.current = false;\n setIsEntering(false);\n setIsVisible(false);\n }\n }, [open]);\n\n // Save / restore focus\n useEffect(() => {\n if (open) {\n previouslyFocused.current = document.activeElement;\n const el = sheetRef.current?.querySelector<HTMLElement>(FOCUSABLE);\n\n el?.focus();\n } else {\n (previouslyFocused.current as HTMLElement | null)?.focus();\n }\n }, [open]);\n\n // Focus trap + Escape\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n onClose?.();\n\n return;\n }\n\n if (e.key !== 'Tab') {\n return;\n }\n\n const focusable = Array.from(\n sheetRef.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? [],\n );\n\n if (focusable.length === 0) {\n return;\n }\n\n const [first] = focusable;\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 [onClose],\n );\n\n // Unmount after exit animation duration elapses\n useEffect(() => {\n if (!isClosing) {\n return;\n }\n\n const id = window.setTimeout(() => {\n setIsVisible(false);\n setIsClosing(false);\n }, CLOSE_ANIM_DURATION);\n\n return () => window.clearTimeout(id);\n }, [isClosing]);\n\n // ─── Drag-to-dismiss ─────────────────────────────────────────────────────────\n\n const handlePointerDown = useCallback((e: PointerEvent<HTMLDivElement>) => {\n isDragging.current = true;\n dragStartY.current = e.clientY;\n sheetDragY.current = 0;\n e.currentTarget.setPointerCapture(e.pointerId);\n\n if (sheetRef.current) {\n // Cancel any active entry animation immediately so inline style.transform\n // takes effect. CSS animations sit above the author cascade layer and would\n // otherwise override the inline transform set during drag.\n sheetRef.current.style.animation = 'none';\n sheetRef.current.classList.add(styles.dragging);\n }\n\n setIsEntering(false);\n }, []);\n\n const handlePointerMove = useCallback((e: PointerEvent<HTMLDivElement>) => {\n if (!isDragging.current) {\n return;\n }\n\n const delta = Math.max(0, e.clientY - dragStartY.current);\n\n sheetDragY.current = delta;\n\n if (sheetRef.current) {\n sheetRef.current.style.transform = `translateY(${delta}px)`;\n }\n }, []);\n\n const handlePointerUp = useCallback(() => {\n if (!isDragging.current) {\n return;\n }\n isDragging.current = false;\n\n const delta = sheetDragY.current;\n\n sheetDragY.current = 0;\n sheetRef.current?.classList.remove(styles.dragging);\n\n if (delta >= DRAG_CLOSE_THRESHOLD) {\n dragClosing.current = true;\n\n const reducedMotion =\n typeof window !== 'undefined' &&\n typeof window.matchMedia === 'function' &&\n window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n\n const sheet = sheetRef.current;\n const backdrop = backdropRef.current;\n\n if (!reducedMotion && sheet && backdrop) {\n sheet.style.transition = `transform ${CLOSE_ANIM_DURATION}ms ease`;\n sheet.style.transform = 'translateY(100%)';\n backdrop.style.transition = `opacity ${CLOSE_ANIM_DURATION}ms ease`;\n backdrop.style.opacity = '0';\n\n setTimeout(() => {\n sheet.style.transition = '';\n sheet.style.transform = '';\n backdrop.style.transition = '';\n backdrop.style.opacity = '';\n onClose?.();\n }, CLOSE_ANIM_DURATION);\n } else {\n onClose?.();\n }\n } else if (sheetRef.current) {\n // Snap back — restore animation override and clear transform so CSS transition animates to 0\n sheetRef.current.style.animation = '';\n sheetRef.current.style.transform = '';\n }\n }, [onClose]);\n\n if (!isVisible) {\n return null;\n }\n\n const node = (\n <div\n ref={backdropRef}\n className={[styles.backdrop, isClosing ? styles.closing : null].filter(Boolean).join(' ')}\n onClick={closeOnBackdrop ? onClose : undefined}\n >\n <div\n ref={sheetRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n className={[\n styles.sheet,\n isEntering ? styles.entering : null,\n isClosing ? styles.closing : null,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onAnimationEnd={(e) => {\n if (e.target === e.currentTarget && isEntering) {\n setIsEntering(false);\n }\n }}\n onKeyDown={handleKeyDown}\n onClick={(e) => e.stopPropagation()}\n {...props}\n >\n {/* Handle bar — drag downward to dismiss */}\n <div\n className={styles.handle}\n aria-hidden=\"true\"\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <div className={styles.handleBar} />\n </div>\n\n {/* Optional title */}\n {title && (\n <div id={titleId} className={styles.title}>\n {title}\n </div>\n )}\n\n {/* Content */}\n {children && <div className={styles.content}>{children}</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":"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"}
@@ -1,2 +1,2 @@
1
- var e={backdrop:`_backdrop_mrs02_3`,"backdrop-in":`_backdrop-in_mrs02_1`,closing:`_closing_mrs02_19`,"backdrop-out":`_backdrop-out_mrs02_1`,sheet:`_sheet_mrs02_43`,entering:`_entering_mrs02_61`,"sheet-in":`_sheet-in_mrs02_1`,"sheet-out":`_sheet-out_mrs02_1`,dragging:`_dragging_mrs02_70`,handle:`_handle_mrs02_94`,handleBar:`_handleBar_mrs02_108`,title:`_title_mrs02_119`,content:`_content_mrs02_132`};exports.default=e;
1
+ var e={backdrop:`_backdrop_1v9gq_3`,"backdrop-in":`_backdrop-in_1v9gq_1`,closing:`_closing_1v9gq_15`,"backdrop-out":`_backdrop-out_1v9gq_1`,sheet:`_sheet_1v9gq_41`,entering:`_entering_1v9gq_57`,"sheet-in":`_sheet-in_1v9gq_1`,"sheet-out":`_sheet-out_1v9gq_1`,dragging:`_dragging_1v9gq_66`,handle:`_handle_1v9gq_92`,handleBar:`_handleBar_1v9gq_107`,title:`_title_1v9gq_118`,content:`_content_1v9gq_130`};exports.default=e;
2
2
  //# sourceMappingURL=BottomSheet.module.css.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheet.module.css.cjs","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.module.css"],"sourcesContent":["/* ─── Backdrop ──────────────────────────────────────────────────────────────── */\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: 10000;\n\n display: flex;\n align-items: flex-end;\n justify-content: center;\n\n background-color: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n\n animation: backdrop-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n.backdrop.closing {\n animation: backdrop-out var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n@keyframes backdrop-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes backdrop-out {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n\n/* ─── Sheet ─────────────────────────────────────────────────────────────────── */\n\n.sheet {\n width: min(560px, 100vw);\n max-height: 90dvh;\n overflow-y: auto;\n\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #fafafa));\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n\n border-radius: var(--gnome-radius-xl, 16px) var(--gnome-radius-xl, 16px) 0 0;\n box-shadow:\n 0 -4px 24px rgba(0, 0, 0, 0.18),\n 0 0 0 1px rgba(0, 0, 0, 0.06);\n\n /* Snap-back transition after releasing a partial drag */\n transition: transform 200ms var(--gnome-easing-default, ease);\n will-change: transform;\n}\n\n.sheet.entering {\n animation: sheet-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n.sheet.closing {\n animation: sheet-out var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n/* Disable transition while actively dragging so the sheet follows the pointer instantly */\n.sheet.dragging {\n transition: none;\n}\n\n@keyframes sheet-in {\n from {\n transform: translateY(100%);\n }\n to {\n transform: translateY(0);\n }\n}\n\n@keyframes sheet-out {\n from {\n transform: translateY(0);\n }\n to {\n transform: translateY(100%);\n }\n}\n\n/* ─── Handle bar ────────────────────────────────────────────────────────────── */\n\n.handle {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--gnome-space-2, 12px) 0 var(--gnome-space-1, 6px);\n cursor: grab;\n /* Prevents the browser from hijacking the pointer for scroll while dragging */\n touch-action: none;\n}\n\n.handle:active {\n cursor: grabbing;\n}\n\n.handleBar {\n width: 36px;\n height: 4px;\n border-radius: 2px;\n background-color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n opacity: 0.2;\n pointer-events: none;\n}\n\n/* ─── Title ─────────────────────────────────────────────────────────────────── */\n\n.title {\n padding: 0 var(--gnome-space-4, 24px) var(--gnome-space-2, 12px);\n\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-title-4, 1.125rem);\n font-weight: var(--gnome-font-weight-bold, 700);\n line-height: var(--gnome-line-height-title, 1.3);\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n text-align: center;\n}\n\n/* ─── Content ───────────────────────────────────────────────────────────────── */\n\n.content {\n padding: 0 var(--gnome-space-4, 24px) var(--gnome-space-4, 24px);\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n\n@media (prefers-color-scheme: dark) {\n .backdrop {\n background-color: rgba(0, 0, 0, 0.65);\n }\n\n .sheet {\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #242424));\n box-shadow:\n 0 -4px 24px rgba(0, 0, 0, 0.45),\n 0 0 0 1px rgba(255, 255, 255, 0.06);\n }\n}\n\n/* ─── Reduced motion ────────────────────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .backdrop,\n .sheet,\n .backdrop.closing,\n .sheet.entering,\n .sheet.closing,\n .sheet.dragging {\n animation: none;\n transition: none;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"BottomSheet.module.css.cjs","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.module.css"],"sourcesContent":["/* ─── Backdrop ──────────────────────────────────────────────────────────────── */\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: 10000;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n background-color: rgb(0 0 0 / 0.5);\n backdrop-filter: blur(4px);\n animation: backdrop-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n.backdrop.closing {\n animation: backdrop-out var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n@keyframes backdrop-in {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@keyframes backdrop-out {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n }\n}\n\n/* ─── Sheet ─────────────────────────────────────────────────────────────────── */\n\n.sheet {\n width: min(560px, 100vw);\n max-height: 90dvh;\n overflow-y: auto;\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #fafafa));\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n border-radius: var(--gnome-radius-xl, 16px) var(--gnome-radius-xl, 16px) 0 0;\n box-shadow:\n 0 -4px 24px rgb(0 0 0 / 0.18),\n 0 0 0 1px rgb(0 0 0 / 0.06);\n\n /* Snap-back transition after releasing a partial drag */\n transition: transform 200ms var(--gnome-easing-default, ease);\n will-change: transform;\n}\n\n.sheet.entering {\n animation: sheet-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n.sheet.closing {\n animation: sheet-out var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n/* Disable transition while actively dragging so the sheet follows the pointer instantly */\n.sheet.dragging {\n transition: none;\n}\n\n@keyframes sheet-in {\n from {\n transform: translateY(100%);\n }\n\n to {\n transform: translateY(0);\n }\n}\n\n@keyframes sheet-out {\n from {\n transform: translateY(0);\n }\n\n to {\n transform: translateY(100%);\n }\n}\n\n/* ─── Handle bar ────────────────────────────────────────────────────────────── */\n\n.handle {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--gnome-space-2, 12px) 0 var(--gnome-space-1, 6px);\n cursor: grab;\n\n /* Prevents the browser from hijacking the pointer for scroll while dragging */\n touch-action: none;\n}\n\n.handle:active {\n cursor: grabbing;\n}\n\n.handleBar {\n width: 36px;\n height: 4px;\n border-radius: 2px;\n background-color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n opacity: 0.2;\n pointer-events: none;\n}\n\n/* ─── Title ─────────────────────────────────────────────────────────────────── */\n\n.title {\n padding: 0 var(--gnome-space-4, 24px) var(--gnome-space-2, 12px);\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-title-4, 1.125rem);\n font-weight: var(--gnome-font-weight-bold, 700);\n line-height: var(--gnome-line-height-title, 1.3);\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n text-align: center;\n}\n\n/* ─── Content ───────────────────────────────────────────────────────────────── */\n\n.content {\n padding: 0 var(--gnome-space-4, 24px) var(--gnome-space-4, 24px);\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n\n@media (prefers-color-scheme: dark) {\n .backdrop {\n background-color: rgb(0 0 0 / 0.65);\n }\n\n .sheet {\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #242424));\n box-shadow:\n 0 -4px 24px rgb(0 0 0 / 0.45),\n 0 0 0 1px rgb(255 255 255 / 0.06);\n }\n}\n\n/* ─── Reduced motion ────────────────────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .backdrop,\n .sheet,\n .backdrop.closing,\n .sheet.entering,\n .sheet.closing,\n .sheet.dragging {\n animation: none;\n transition: none;\n }\n}\n"],"mappings":""}
@@ -1,17 +1,17 @@
1
1
  var e = {
2
- backdrop: "_backdrop_mrs02_3",
3
- "backdrop-in": "_backdrop-in_mrs02_1",
4
- closing: "_closing_mrs02_19",
5
- "backdrop-out": "_backdrop-out_mrs02_1",
6
- sheet: "_sheet_mrs02_43",
7
- entering: "_entering_mrs02_61",
8
- "sheet-in": "_sheet-in_mrs02_1",
9
- "sheet-out": "_sheet-out_mrs02_1",
10
- dragging: "_dragging_mrs02_70",
11
- handle: "_handle_mrs02_94",
12
- handleBar: "_handleBar_mrs02_108",
13
- title: "_title_mrs02_119",
14
- content: "_content_mrs02_132"
2
+ backdrop: "_backdrop_1v9gq_3",
3
+ "backdrop-in": "_backdrop-in_1v9gq_1",
4
+ closing: "_closing_1v9gq_15",
5
+ "backdrop-out": "_backdrop-out_1v9gq_1",
6
+ sheet: "_sheet_1v9gq_41",
7
+ entering: "_entering_1v9gq_57",
8
+ "sheet-in": "_sheet-in_1v9gq_1",
9
+ "sheet-out": "_sheet-out_1v9gq_1",
10
+ dragging: "_dragging_1v9gq_66",
11
+ handle: "_handle_1v9gq_92",
12
+ handleBar: "_handleBar_1v9gq_107",
13
+ title: "_title_1v9gq_118",
14
+ content: "_content_1v9gq_130"
15
15
  };
16
16
  //#endregion
17
17
  export { e as default };
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheet.module.css.js","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.module.css"],"sourcesContent":["/* ─── Backdrop ──────────────────────────────────────────────────────────────── */\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: 10000;\n\n display: flex;\n align-items: flex-end;\n justify-content: center;\n\n background-color: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n\n animation: backdrop-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n.backdrop.closing {\n animation: backdrop-out var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n@keyframes backdrop-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes backdrop-out {\n from {\n opacity: 1;\n }\n to {\n opacity: 0;\n }\n}\n\n/* ─── Sheet ─────────────────────────────────────────────────────────────────── */\n\n.sheet {\n width: min(560px, 100vw);\n max-height: 90dvh;\n overflow-y: auto;\n\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #fafafa));\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n\n border-radius: var(--gnome-radius-xl, 16px) var(--gnome-radius-xl, 16px) 0 0;\n box-shadow:\n 0 -4px 24px rgba(0, 0, 0, 0.18),\n 0 0 0 1px rgba(0, 0, 0, 0.06);\n\n /* Snap-back transition after releasing a partial drag */\n transition: transform 200ms var(--gnome-easing-default, ease);\n will-change: transform;\n}\n\n.sheet.entering {\n animation: sheet-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n.sheet.closing {\n animation: sheet-out var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n/* Disable transition while actively dragging so the sheet follows the pointer instantly */\n.sheet.dragging {\n transition: none;\n}\n\n@keyframes sheet-in {\n from {\n transform: translateY(100%);\n }\n to {\n transform: translateY(0);\n }\n}\n\n@keyframes sheet-out {\n from {\n transform: translateY(0);\n }\n to {\n transform: translateY(100%);\n }\n}\n\n/* ─── Handle bar ────────────────────────────────────────────────────────────── */\n\n.handle {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--gnome-space-2, 12px) 0 var(--gnome-space-1, 6px);\n cursor: grab;\n /* Prevents the browser from hijacking the pointer for scroll while dragging */\n touch-action: none;\n}\n\n.handle:active {\n cursor: grabbing;\n}\n\n.handleBar {\n width: 36px;\n height: 4px;\n border-radius: 2px;\n background-color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n opacity: 0.2;\n pointer-events: none;\n}\n\n/* ─── Title ─────────────────────────────────────────────────────────────────── */\n\n.title {\n padding: 0 var(--gnome-space-4, 24px) var(--gnome-space-2, 12px);\n\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-title-4, 1.125rem);\n font-weight: var(--gnome-font-weight-bold, 700);\n line-height: var(--gnome-line-height-title, 1.3);\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n text-align: center;\n}\n\n/* ─── Content ───────────────────────────────────────────────────────────────── */\n\n.content {\n padding: 0 var(--gnome-space-4, 24px) var(--gnome-space-4, 24px);\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n\n@media (prefers-color-scheme: dark) {\n .backdrop {\n background-color: rgba(0, 0, 0, 0.65);\n }\n\n .sheet {\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #242424));\n box-shadow:\n 0 -4px 24px rgba(0, 0, 0, 0.45),\n 0 0 0 1px rgba(255, 255, 255, 0.06);\n }\n}\n\n/* ─── Reduced motion ────────────────────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .backdrop,\n .sheet,\n .backdrop.closing,\n .sheet.entering,\n .sheet.closing,\n .sheet.dragging {\n animation: none;\n transition: none;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"BottomSheet.module.css.js","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.module.css"],"sourcesContent":["/* ─── Backdrop ──────────────────────────────────────────────────────────────── */\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: 10000;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n background-color: rgb(0 0 0 / 0.5);\n backdrop-filter: blur(4px);\n animation: backdrop-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n.backdrop.closing {\n animation: backdrop-out var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n@keyframes backdrop-in {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@keyframes backdrop-out {\n from {\n opacity: 1;\n }\n\n to {\n opacity: 0;\n }\n}\n\n/* ─── Sheet ─────────────────────────────────────────────────────────────────── */\n\n.sheet {\n width: min(560px, 100vw);\n max-height: 90dvh;\n overflow-y: auto;\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #fafafa));\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n border-radius: var(--gnome-radius-xl, 16px) var(--gnome-radius-xl, 16px) 0 0;\n box-shadow:\n 0 -4px 24px rgb(0 0 0 / 0.18),\n 0 0 0 1px rgb(0 0 0 / 0.06);\n\n /* Snap-back transition after releasing a partial drag */\n transition: transform 200ms var(--gnome-easing-default, ease);\n will-change: transform;\n}\n\n.sheet.entering {\n animation: sheet-in var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n.sheet.closing {\n animation: sheet-out var(--gnome-duration-normal, 200ms) var(--gnome-easing-default, ease) both;\n}\n\n/* Disable transition while actively dragging so the sheet follows the pointer instantly */\n.sheet.dragging {\n transition: none;\n}\n\n@keyframes sheet-in {\n from {\n transform: translateY(100%);\n }\n\n to {\n transform: translateY(0);\n }\n}\n\n@keyframes sheet-out {\n from {\n transform: translateY(0);\n }\n\n to {\n transform: translateY(100%);\n }\n}\n\n/* ─── Handle bar ────────────────────────────────────────────────────────────── */\n\n.handle {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--gnome-space-2, 12px) 0 var(--gnome-space-1, 6px);\n cursor: grab;\n\n /* Prevents the browser from hijacking the pointer for scroll while dragging */\n touch-action: none;\n}\n\n.handle:active {\n cursor: grabbing;\n}\n\n.handleBar {\n width: 36px;\n height: 4px;\n border-radius: 2px;\n background-color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n opacity: 0.2;\n pointer-events: none;\n}\n\n/* ─── Title ─────────────────────────────────────────────────────────────────── */\n\n.title {\n padding: 0 var(--gnome-space-4, 24px) var(--gnome-space-2, 12px);\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-title-4, 1.125rem);\n font-weight: var(--gnome-font-weight-bold, 700);\n line-height: var(--gnome-line-height-title, 1.3);\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n text-align: center;\n}\n\n/* ─── Content ───────────────────────────────────────────────────────────────── */\n\n.content {\n padding: 0 var(--gnome-space-4, 24px) var(--gnome-space-4, 24px);\n}\n\n/* ─── Dark mode ─────────────────────────────────────────────────────────────── */\n\n@media (prefers-color-scheme: dark) {\n .backdrop {\n background-color: rgb(0 0 0 / 0.65);\n }\n\n .sheet {\n background-color: var(--gnome-dialog-bg-color, var(--gnome-window-bg-color, #242424));\n box-shadow:\n 0 -4px 24px rgb(0 0 0 / 0.45),\n 0 0 0 1px rgb(255 255 255 / 0.06);\n }\n}\n\n/* ─── Reduced motion ────────────────────────────────────────────────────────── */\n\n@media (prefers-reduced-motion: reduce) {\n .backdrop,\n .sheet,\n .backdrop.closing,\n .sheet.entering,\n .sheet.closing,\n .sheet.dragging {\n animation: none;\n transition: none;\n }\n}\n"],"mappings":""}
@@ -1,2 +1,2 @@
1
- var e={list:`_list_ltjeu_3`,item:`_item_ltjeu_16`,separate:`_separate_ltjeu_36`,separateItem:`_separateItem_ltjeu_46`,divider:`_divider_ltjeu_68`};exports.default=e;
1
+ var e={list:`_list_fbr65_3`,item:`_item_fbr65_15`,separate:`_separate_fbr65_35`,separateItem:`_separateItem_fbr65_45`,divider:`_divider_fbr65_67`};exports.default=e;
2
2
  //# sourceMappingURL=BoxedList.module.css.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BoxedList.module.css.cjs","names":[],"sources":["../../../src/components/BoxedList/BoxedList.module.css"],"sourcesContent":["/* ─── Container ────────────────────────────────────────────────────────────── */\n\n.list {\n list-style: none;\n margin: 0;\n padding: 0;\n\n background-color: var(--gnome-card-bg-color, #ffffff);\n color: var(--gnome-card-fg-color, rgba(0, 0, 0, 0.8));\n border: 1px solid var(--gnome-divider-color);\n border-radius: var(--gnome-radius-lg);\n}\n\n/* ─── Row wrapper ──────────────────────────────────────────────────────────── */\n\n.item {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n.item:first-child > * {\n border-radius: var(--gnome-radius-lg) var(--gnome-radius-lg) 0 0;\n}\n\n.item:last-child > * {\n border-radius: 0 0 var(--gnome-radius-lg) var(--gnome-radius-lg);\n}\n\n.item:only-child > * {\n border-radius: var(--gnome-radius-lg);\n}\n\n/* ─── Separate variant ─────────────────────────────────────────────────────── */\n\n.separate {\n background: none;\n border: none;\n border-radius: 0;\n display: flex;\n flex-direction: column;\n gap: var(--gnome-space-2, 12px);\n overflow: visible;\n}\n\n.separateItem {\n background-color: var(--gnome-card-bg-color, #ffffff);\n border: 1px solid var(--gnome-divider-color);\n border-radius: var(--gnome-radius-lg);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n@media (prefers-color-scheme: dark) {\n .separateItem {\n background-color: var(--gnome-card-bg-color, #2d2d2d);\n }\n}\n\n/* ─── High contrast ────────────────────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .list {\n border-width: 2px;\n }\n\n .divider {\n height: 2px;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"BoxedList.module.css.cjs","names":[],"sources":["../../../src/components/BoxedList/BoxedList.module.css"],"sourcesContent":["/* ─── Container ────────────────────────────────────────────────────────────── */\n\n.list {\n list-style: none;\n margin: 0;\n padding: 0;\n background-color: var(--gnome-card-bg-color, #fff);\n color: var(--gnome-card-fg-color, rgb(0 0 0 / 0.8));\n border: 1px solid var(--gnome-divider-color);\n border-radius: var(--gnome-radius-lg);\n}\n\n/* ─── Row wrapper ──────────────────────────────────────────────────────────── */\n\n.item {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n.item:first-child > * {\n border-radius: var(--gnome-radius-lg) var(--gnome-radius-lg) 0 0;\n}\n\n.item:last-child > * {\n border-radius: 0 0 var(--gnome-radius-lg) var(--gnome-radius-lg);\n}\n\n.item:only-child > * {\n border-radius: var(--gnome-radius-lg);\n}\n\n/* ─── Separate variant ─────────────────────────────────────────────────────── */\n\n.separate {\n background: none;\n border: none;\n border-radius: 0;\n display: flex;\n flex-direction: column;\n gap: var(--gnome-space-2, 12px);\n overflow: visible;\n}\n\n.separateItem {\n background-color: var(--gnome-card-bg-color, #fff);\n border: 1px solid var(--gnome-divider-color);\n border-radius: var(--gnome-radius-lg);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n@media (prefers-color-scheme: dark) {\n .separateItem {\n background-color: var(--gnome-card-bg-color, #2d2d2d);\n }\n}\n\n/* ─── High contrast ────────────────────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .list {\n border-width: 2px;\n }\n\n .divider {\n height: 2px;\n }\n}\n"],"mappings":""}
@@ -1,9 +1,9 @@
1
1
  var e = {
2
- list: "_list_ltjeu_3",
3
- item: "_item_ltjeu_16",
4
- separate: "_separate_ltjeu_36",
5
- separateItem: "_separateItem_ltjeu_46",
6
- divider: "_divider_ltjeu_68"
2
+ list: "_list_fbr65_3",
3
+ item: "_item_fbr65_15",
4
+ separate: "_separate_fbr65_35",
5
+ separateItem: "_separateItem_fbr65_45",
6
+ divider: "_divider_fbr65_67"
7
7
  };
8
8
  //#endregion
9
9
  export { e as default };
@@ -1 +1 @@
1
- {"version":3,"file":"BoxedList.module.css.js","names":[],"sources":["../../../src/components/BoxedList/BoxedList.module.css"],"sourcesContent":["/* ─── Container ────────────────────────────────────────────────────────────── */\n\n.list {\n list-style: none;\n margin: 0;\n padding: 0;\n\n background-color: var(--gnome-card-bg-color, #ffffff);\n color: var(--gnome-card-fg-color, rgba(0, 0, 0, 0.8));\n border: 1px solid var(--gnome-divider-color);\n border-radius: var(--gnome-radius-lg);\n}\n\n/* ─── Row wrapper ──────────────────────────────────────────────────────────── */\n\n.item {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n.item:first-child > * {\n border-radius: var(--gnome-radius-lg) var(--gnome-radius-lg) 0 0;\n}\n\n.item:last-child > * {\n border-radius: 0 0 var(--gnome-radius-lg) var(--gnome-radius-lg);\n}\n\n.item:only-child > * {\n border-radius: var(--gnome-radius-lg);\n}\n\n/* ─── Separate variant ─────────────────────────────────────────────────────── */\n\n.separate {\n background: none;\n border: none;\n border-radius: 0;\n display: flex;\n flex-direction: column;\n gap: var(--gnome-space-2, 12px);\n overflow: visible;\n}\n\n.separateItem {\n background-color: var(--gnome-card-bg-color, #ffffff);\n border: 1px solid var(--gnome-divider-color);\n border-radius: var(--gnome-radius-lg);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n@media (prefers-color-scheme: dark) {\n .separateItem {\n background-color: var(--gnome-card-bg-color, #2d2d2d);\n }\n}\n\n/* ─── High contrast ────────────────────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .list {\n border-width: 2px;\n }\n\n .divider {\n height: 2px;\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"BoxedList.module.css.js","names":[],"sources":["../../../src/components/BoxedList/BoxedList.module.css"],"sourcesContent":["/* ─── Container ────────────────────────────────────────────────────────────── */\n\n.list {\n list-style: none;\n margin: 0;\n padding: 0;\n background-color: var(--gnome-card-bg-color, #fff);\n color: var(--gnome-card-fg-color, rgb(0 0 0 / 0.8));\n border: 1px solid var(--gnome-divider-color);\n border-radius: var(--gnome-radius-lg);\n}\n\n/* ─── Row wrapper ──────────────────────────────────────────────────────────── */\n\n.item {\n position: relative;\n display: flex;\n flex-direction: column;\n}\n\n.item:first-child > * {\n border-radius: var(--gnome-radius-lg) var(--gnome-radius-lg) 0 0;\n}\n\n.item:last-child > * {\n border-radius: 0 0 var(--gnome-radius-lg) var(--gnome-radius-lg);\n}\n\n.item:only-child > * {\n border-radius: var(--gnome-radius-lg);\n}\n\n/* ─── Separate variant ─────────────────────────────────────────────────────── */\n\n.separate {\n background: none;\n border: none;\n border-radius: 0;\n display: flex;\n flex-direction: column;\n gap: var(--gnome-space-2, 12px);\n overflow: visible;\n}\n\n.separateItem {\n background-color: var(--gnome-card-bg-color, #fff);\n border: 1px solid var(--gnome-divider-color);\n border-radius: var(--gnome-radius-lg);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n@media (prefers-color-scheme: dark) {\n .separateItem {\n background-color: var(--gnome-card-bg-color, #2d2d2d);\n }\n}\n\n/* ─── High contrast ────────────────────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .list {\n border-width: 2px;\n }\n\n .divider {\n height: 2px;\n }\n}\n"],"mappings":""}
@@ -1,2 +1,2 @@
1
- let e=require("react"),t=require("react/jsx-runtime");var n=({breakpoints:n,children:r,className:i,style:a,...o})=>{let s=(0,e.useRef)(null),[c,l]=(0,e.useState)({activeBreakpoint:null,width:0});return(0,e.useEffect)(()=>{let e=s.current;if(!e)return;let t=[...n].sort((e,t)=>e.maxWidth-t.maxWidth),r=e=>({activeBreakpoint:(t.find(t=>e<=t.maxWidth)??null)?.name??null,width:e});l(r(e.offsetWidth));let i=new ResizeObserver(e=>{let t=e[0];t&&l(r(t.contentBoxSize?.[0]?.inlineSize??t.contentRect.width))});return i.observe(e),()=>i.disconnect()},[n]),(0,t.jsx)(`div`,{ref:s,className:i,style:{minWidth:0,...a},"data-breakpoint":c.activeBreakpoint??void 0,...o,children:r(c)})};exports.BreakpointBin=n;
1
+ let e=require("react"),t=require("react/jsx-runtime");var n=({breakpoints:n,children:r,className:i,style:a,...o})=>{let s=(0,e.useRef)(null),[c,l]=(0,e.useState)({activeBreakpoint:null,width:0});return(0,e.useEffect)(()=>{let e=s.current;if(!e)return;let t=[...n].sort((e,t)=>e.maxWidth-t.maxWidth),r=e=>({activeBreakpoint:(t.find(t=>e<=t.maxWidth)??null)?.name??null,width:e});l(r(e.offsetWidth));let i=new ResizeObserver(e=>{let[t]=e;t&&l(r(t.contentBoxSize?.[0]?.inlineSize??t.contentRect.width))});return i.observe(e),()=>i.disconnect()},[n]),(0,t.jsx)(`div`,{ref:s,className:i,style:{minWidth:0,...a},"data-breakpoint":c.activeBreakpoint??void 0,...o,children:r(c)})};exports.BreakpointBin=n;
2
2
  //# sourceMappingURL=BreakpointBin.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"BreakpointBin.cjs","names":[],"sources":["../../../src/components/BreakpointBin/BreakpointBin.tsx"],"sourcesContent":["import {\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\n// ─── Public types ─────────────────────────────────────────────────────────────\n\nexport interface BreakpointDefinition {\n /**\n * Identifier for this breakpoint, e.g. `\"compact\"` or `\"narrow\"`.\n * Exposed as `data-breakpoint` on the container element for CSS targeting.\n */\n name: string;\n /**\n * Container width threshold in pixels.\n * This breakpoint becomes active when the container width is ≤ this value.\n */\n maxWidth: number;\n}\n\nexport interface BreakpointBinState {\n /**\n * Name of the currently active breakpoint, or `null` when the container\n * is wider than all defined breakpoints.\n */\n activeBreakpoint: string | null;\n /** Current container width in px (from `ResizeObserver`). */\n width: number;\n}\n\nexport interface BreakpointBinProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * Breakpoint definitions sorted by `maxWidth` ascending.\n * The active breakpoint is the smallest `maxWidth` ≥ the container's current width.\n */\n breakpoints: BreakpointDefinition[];\n /**\n * Render prop that receives the current breakpoint state.\n *\n * @example\n * ```tsx\n * <BreakpointBin breakpoints={[{ name: \"compact\", maxWidth: 400 }]}>\n * {({ activeBreakpoint }) =>\n * activeBreakpoint === \"compact\" ? <CompactLayout /> : <WideLayout />\n * }\n * </BreakpointBin>\n * ```\n */\n children: (state: BreakpointBinState) => ReactNode;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Container that fires layout changes when **its own width** crosses defined\n * thresholds — the CSS container-query equivalent of `AdwBreakpointBin`\n * (libadwaita 1.9 / GNOME 50).\n *\n * Unlike `useBreakpoint` (which watches the viewport), `BreakpointBin` uses\n * `ResizeObserver` to watch the element itself. This makes it composable:\n * the same component can behave differently depending on how much space it\n * is given by its parent, regardless of the viewport size.\n *\n * ### How it works\n * - Breakpoints are evaluated in ascending `maxWidth` order.\n * - The active breakpoint is the first one whose `maxWidth` ≥ the container width.\n * - When no breakpoint matches (container is wider than all), `activeBreakpoint` is `null`.\n * - The active name is set as `data-breakpoint` on the wrapper `<div>` for CSS targeting.\n *\n * ### CSS targeting\n * ```css\n * .myWidget[data-breakpoint=\"compact\"] .layout { flex-direction: column; }\n * ```\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.BreakpointBin.html\n */\nexport const BreakpointBin = ({\n breakpoints,\n children,\n className,\n style,\n ...props\n}: BreakpointBinProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [state, setState] = useState<BreakpointBinState>({\n activeBreakpoint: null,\n width: 0,\n });\n\n useEffect(() => {\n const el = containerRef.current;\n\n if (!el) {\n return;\n }\n\n // Sort breakpoints ascending so we find the smallest matching threshold\n const sorted = [...breakpoints].sort((a, b) => a.maxWidth - b.maxWidth);\n\n const evaluate = (width: number): BreakpointBinState => {\n const match = sorted.find((bp) => width <= bp.maxWidth) ?? null;\n\n return { activeBreakpoint: match?.name ?? null, width };\n };\n\n // Initial measurement\n setState(evaluate(el.offsetWidth));\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n\n if (!entry) {\n return;\n }\n\n // contentBoxSize is more reliable than contentRect for inline-size\n const width = entry.contentBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n\n setState(evaluate(width));\n });\n\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [breakpoints]);\n\n const containerStyle: CSSProperties = {\n // Ensure the container establishes a containing block\n // so ResizeObserver reflects actual layout width\n minWidth: 0,\n ...style,\n };\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={containerStyle}\n data-breakpoint={state.activeBreakpoint ?? undefined}\n {...props}\n >\n {children(state)}\n </div>\n );\n};\n"],"mappings":"sDAgFA,IAAa,GAAiB,CAC5B,cACA,WACA,YACA,QACA,GAAG,KACqB,CACxB,IAAM,GAAA,EAAA,EAAA,QAAsC,IAAI,EAC1C,CAAC,EAAO,IAAA,EAAA,EAAA,UAAyC,CACrD,iBAAkB,KAClB,MAAO,CACT,CAAC,EA8CD,OA5CA,EAAA,EAAA,eAAgB,CACd,IAAM,EAAK,EAAa,QAExB,GAAI,CAAC,EACH,OAIF,IAAM,EAAS,CAAC,GAAG,CAAW,EAAE,MAAM,EAAG,IAAM,EAAE,SAAW,EAAE,QAAQ,EAEhE,EAAY,IAGT,CAAE,kBAFK,EAAO,KAAM,GAAO,GAAS,EAAG,QAAQ,GAAK,OAEzB,MAAQ,KAAM,OAAM,GAIxD,EAAS,EAAS,EAAG,WAAW,CAAC,EAEjC,IAAM,EAAW,IAAI,eAAgB,GAAY,CAC/C,IAAM,EAAQ,EAAQ,GAEjB,GAOL,EAAS,EAFK,EAAM,iBAAiB,IAAI,YAAc,EAAM,YAAY,KAElD,CAAC,CAC1B,CAAC,EAID,OAFA,EAAS,QAAQ,CAAE,MAEN,EAAS,WAAW,CACnC,EAAG,CAAC,CAAW,CAAC,GAUd,EAAA,EAAA,KAAC,MAAD,CACE,IAAK,EACM,YACX,MAAO,CART,SAAU,EACV,GAAG,CAOM,EACP,kBAAiB,EAAM,kBAAoB,IAAA,GAC3C,GAAI,WAEH,EAAS,CAAK,CACZ,CAAA,CAET"}
1
+ {"version":3,"file":"BreakpointBin.cjs","names":[],"sources":["../../../src/components/BreakpointBin/BreakpointBin.tsx"],"sourcesContent":["import {\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\n// ─── Public types ─────────────────────────────────────────────────────────────\n\nexport interface BreakpointDefinition {\n /**\n * Identifier for this breakpoint, e.g. `\"compact\"` or `\"narrow\"`.\n * Exposed as `data-breakpoint` on the container element for CSS targeting.\n */\n name: string;\n /**\n * Container width threshold in pixels.\n * This breakpoint becomes active when the container width is ≤ this value.\n */\n maxWidth: number;\n}\n\nexport interface BreakpointBinState {\n /**\n * Name of the currently active breakpoint, or `null` when the container\n * is wider than all defined breakpoints.\n */\n activeBreakpoint: string | null;\n /** Current container width in px (from `ResizeObserver`). */\n width: number;\n}\n\nexport interface BreakpointBinProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * Breakpoint definitions sorted by `maxWidth` ascending.\n * The active breakpoint is the smallest `maxWidth` ≥ the container's current width.\n */\n breakpoints: BreakpointDefinition[];\n /**\n * Render prop that receives the current breakpoint state.\n *\n * @example\n * ```tsx\n * <BreakpointBin breakpoints={[{ name: \"compact\", maxWidth: 400 }]}>\n * {({ activeBreakpoint }) =>\n * activeBreakpoint === \"compact\" ? <CompactLayout /> : <WideLayout />\n * }\n * </BreakpointBin>\n * ```\n */\n children: (state: BreakpointBinState) => ReactNode;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Container that fires layout changes when **its own width** crosses defined\n * thresholds — the CSS container-query equivalent of `AdwBreakpointBin`\n * (libadwaita 1.9 / GNOME 50).\n *\n * Unlike `useBreakpoint` (which watches the viewport), `BreakpointBin` uses\n * `ResizeObserver` to watch the element itself. This makes it composable:\n * the same component can behave differently depending on how much space it\n * is given by its parent, regardless of the viewport size.\n *\n * ### How it works\n * - Breakpoints are evaluated in ascending `maxWidth` order.\n * - The active breakpoint is the first one whose `maxWidth` ≥ the container width.\n * - When no breakpoint matches (container is wider than all), `activeBreakpoint` is `null`.\n * - The active name is set as `data-breakpoint` on the wrapper `<div>` for CSS targeting.\n *\n * ### CSS targeting\n * ```css\n * .myWidget[data-breakpoint=\"compact\"] .layout { flex-direction: column; }\n * ```\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.BreakpointBin.html\n */\nexport const BreakpointBin = ({\n breakpoints,\n children,\n className,\n style,\n ...props\n}: BreakpointBinProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [state, setState] = useState<BreakpointBinState>({\n activeBreakpoint: null,\n width: 0,\n });\n\n useEffect(() => {\n const el = containerRef.current;\n\n if (!el) {\n return;\n }\n\n // Sort breakpoints ascending so we find the smallest matching threshold\n const sorted = [...breakpoints].sort((a, b) => a.maxWidth - b.maxWidth);\n\n const evaluate = (width: number): BreakpointBinState => {\n const match = sorted.find((bp) => width <= bp.maxWidth) ?? null;\n\n return { activeBreakpoint: match?.name ?? null, width };\n };\n\n // Initial measurement\n setState(evaluate(el.offsetWidth));\n\n const observer = new ResizeObserver((entries) => {\n const [entry] = entries;\n\n if (!entry) {\n return;\n }\n\n // contentBoxSize is more reliable than contentRect for inline-size\n const width = entry.contentBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n\n setState(evaluate(width));\n });\n\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [breakpoints]);\n\n const containerStyle: CSSProperties = {\n // Ensure the container establishes a containing block\n // so ResizeObserver reflects actual layout width\n minWidth: 0,\n ...style,\n };\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={containerStyle}\n data-breakpoint={state.activeBreakpoint ?? undefined}\n {...props}\n >\n {children(state)}\n </div>\n );\n};\n"],"mappings":"sDAgFA,IAAa,GAAiB,CAC5B,cACA,WACA,YACA,QACA,GAAG,KACqB,CACxB,IAAM,GAAA,EAAA,EAAA,QAAsC,IAAI,EAC1C,CAAC,EAAO,IAAA,EAAA,EAAA,UAAyC,CACrD,iBAAkB,KAClB,MAAO,CACT,CAAC,EA8CD,OA5CA,EAAA,EAAA,eAAgB,CACd,IAAM,EAAK,EAAa,QAExB,GAAI,CAAC,EACH,OAIF,IAAM,EAAS,CAAC,GAAG,CAAW,EAAE,MAAM,EAAG,IAAM,EAAE,SAAW,EAAE,QAAQ,EAEhE,EAAY,IAGT,CAAE,kBAFK,EAAO,KAAM,GAAO,GAAS,EAAG,QAAQ,GAAK,OAEzB,MAAQ,KAAM,OAAM,GAIxD,EAAS,EAAS,EAAG,WAAW,CAAC,EAEjC,IAAM,EAAW,IAAI,eAAgB,GAAY,CAC/C,GAAM,CAAC,GAAS,EAEX,GAOL,EAAS,EAFK,EAAM,iBAAiB,IAAI,YAAc,EAAM,YAAY,KAElD,CAAC,CAC1B,CAAC,EAID,OAFA,EAAS,QAAQ,CAAE,MAEN,EAAS,WAAW,CACnC,EAAG,CAAC,CAAW,CAAC,GAUd,EAAA,EAAA,KAAC,MAAD,CACE,IAAK,EACM,YACX,MAAO,CART,SAAU,EACV,GAAG,CAOM,EACP,kBAAiB,EAAM,kBAAoB,IAAA,GAC3C,GAAI,WAEH,EAAS,CAAK,CACZ,CAAA,CAET"}
@@ -15,7 +15,7 @@ var i = ({ breakpoints: i, children: a, className: o, style: s, ...c }) => {
15
15
  });
16
16
  d(n(e.offsetWidth));
17
17
  let r = new ResizeObserver((e) => {
18
- let t = e[0];
18
+ let [t] = e;
19
19
  t && d(n(t.contentBoxSize?.[0]?.inlineSize ?? t.contentRect.width));
20
20
  });
21
21
  return r.observe(e), () => r.disconnect();
@@ -1 +1 @@
1
- {"version":3,"file":"BreakpointBin.js","names":[],"sources":["../../../src/components/BreakpointBin/BreakpointBin.tsx"],"sourcesContent":["import {\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\n// ─── Public types ─────────────────────────────────────────────────────────────\n\nexport interface BreakpointDefinition {\n /**\n * Identifier for this breakpoint, e.g. `\"compact\"` or `\"narrow\"`.\n * Exposed as `data-breakpoint` on the container element for CSS targeting.\n */\n name: string;\n /**\n * Container width threshold in pixels.\n * This breakpoint becomes active when the container width is ≤ this value.\n */\n maxWidth: number;\n}\n\nexport interface BreakpointBinState {\n /**\n * Name of the currently active breakpoint, or `null` when the container\n * is wider than all defined breakpoints.\n */\n activeBreakpoint: string | null;\n /** Current container width in px (from `ResizeObserver`). */\n width: number;\n}\n\nexport interface BreakpointBinProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * Breakpoint definitions sorted by `maxWidth` ascending.\n * The active breakpoint is the smallest `maxWidth` ≥ the container's current width.\n */\n breakpoints: BreakpointDefinition[];\n /**\n * Render prop that receives the current breakpoint state.\n *\n * @example\n * ```tsx\n * <BreakpointBin breakpoints={[{ name: \"compact\", maxWidth: 400 }]}>\n * {({ activeBreakpoint }) =>\n * activeBreakpoint === \"compact\" ? <CompactLayout /> : <WideLayout />\n * }\n * </BreakpointBin>\n * ```\n */\n children: (state: BreakpointBinState) => ReactNode;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Container that fires layout changes when **its own width** crosses defined\n * thresholds — the CSS container-query equivalent of `AdwBreakpointBin`\n * (libadwaita 1.9 / GNOME 50).\n *\n * Unlike `useBreakpoint` (which watches the viewport), `BreakpointBin` uses\n * `ResizeObserver` to watch the element itself. This makes it composable:\n * the same component can behave differently depending on how much space it\n * is given by its parent, regardless of the viewport size.\n *\n * ### How it works\n * - Breakpoints are evaluated in ascending `maxWidth` order.\n * - The active breakpoint is the first one whose `maxWidth` ≥ the container width.\n * - When no breakpoint matches (container is wider than all), `activeBreakpoint` is `null`.\n * - The active name is set as `data-breakpoint` on the wrapper `<div>` for CSS targeting.\n *\n * ### CSS targeting\n * ```css\n * .myWidget[data-breakpoint=\"compact\"] .layout { flex-direction: column; }\n * ```\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.BreakpointBin.html\n */\nexport const BreakpointBin = ({\n breakpoints,\n children,\n className,\n style,\n ...props\n}: BreakpointBinProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [state, setState] = useState<BreakpointBinState>({\n activeBreakpoint: null,\n width: 0,\n });\n\n useEffect(() => {\n const el = containerRef.current;\n\n if (!el) {\n return;\n }\n\n // Sort breakpoints ascending so we find the smallest matching threshold\n const sorted = [...breakpoints].sort((a, b) => a.maxWidth - b.maxWidth);\n\n const evaluate = (width: number): BreakpointBinState => {\n const match = sorted.find((bp) => width <= bp.maxWidth) ?? null;\n\n return { activeBreakpoint: match?.name ?? null, width };\n };\n\n // Initial measurement\n setState(evaluate(el.offsetWidth));\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n\n if (!entry) {\n return;\n }\n\n // contentBoxSize is more reliable than contentRect for inline-size\n const width = entry.contentBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n\n setState(evaluate(width));\n });\n\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [breakpoints]);\n\n const containerStyle: CSSProperties = {\n // Ensure the container establishes a containing block\n // so ResizeObserver reflects actual layout width\n minWidth: 0,\n ...style,\n };\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={containerStyle}\n data-breakpoint={state.activeBreakpoint ?? undefined}\n {...props}\n >\n {children(state)}\n </div>\n );\n};\n"],"mappings":";;;AAgFA,IAAa,KAAiB,EAC5B,gBACA,aACA,cACA,UACA,GAAG,QACqB;CACxB,IAAM,IAAe,EAAuB,IAAI,GAC1C,CAAC,GAAO,KAAY,EAA6B;EACrD,kBAAkB;EAClB,OAAO;CACT,CAAC;CA8CD,OA5CA,QAAgB;EACd,IAAM,IAAK,EAAa;EAExB,IAAI,CAAC,GACH;EAIF,IAAM,IAAS,CAAC,GAAG,CAAW,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,GAEhE,KAAY,OAGT;GAAE,mBAFK,EAAO,MAAM,MAAO,KAAS,EAAG,QAAQ,KAAK,OAEzB,QAAQ;GAAM;EAAM;EAIxD,EAAS,EAAS,EAAG,WAAW,CAAC;EAEjC,IAAM,IAAW,IAAI,gBAAgB,MAAY;GAC/C,IAAM,IAAQ,EAAQ;GAEjB,KAOL,EAAS,EAFK,EAAM,iBAAiB,IAAI,cAAc,EAAM,YAAY,KAElD,CAAC;EAC1B,CAAC;EAID,OAFA,EAAS,QAAQ,CAAE,SAEN,EAAS,WAAW;CACnC,GAAG,CAAC,CAAW,CAAC,GAUd,kBAAC,OAAD;EACE,KAAK;EACM;EACX,OAAO;GART,UAAU;GACV,GAAG;EAOM;EACP,mBAAiB,EAAM,oBAAoB,KAAA;EAC3C,GAAI;YAEH,EAAS,CAAK;CACZ,CAAA;AAET"}
1
+ {"version":3,"file":"BreakpointBin.js","names":[],"sources":["../../../src/components/BreakpointBin/BreakpointBin.tsx"],"sourcesContent":["import {\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\n// ─── Public types ─────────────────────────────────────────────────────────────\n\nexport interface BreakpointDefinition {\n /**\n * Identifier for this breakpoint, e.g. `\"compact\"` or `\"narrow\"`.\n * Exposed as `data-breakpoint` on the container element for CSS targeting.\n */\n name: string;\n /**\n * Container width threshold in pixels.\n * This breakpoint becomes active when the container width is ≤ this value.\n */\n maxWidth: number;\n}\n\nexport interface BreakpointBinState {\n /**\n * Name of the currently active breakpoint, or `null` when the container\n * is wider than all defined breakpoints.\n */\n activeBreakpoint: string | null;\n /** Current container width in px (from `ResizeObserver`). */\n width: number;\n}\n\nexport interface BreakpointBinProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * Breakpoint definitions sorted by `maxWidth` ascending.\n * The active breakpoint is the smallest `maxWidth` ≥ the container's current width.\n */\n breakpoints: BreakpointDefinition[];\n /**\n * Render prop that receives the current breakpoint state.\n *\n * @example\n * ```tsx\n * <BreakpointBin breakpoints={[{ name: \"compact\", maxWidth: 400 }]}>\n * {({ activeBreakpoint }) =>\n * activeBreakpoint === \"compact\" ? <CompactLayout /> : <WideLayout />\n * }\n * </BreakpointBin>\n * ```\n */\n children: (state: BreakpointBinState) => ReactNode;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Container that fires layout changes when **its own width** crosses defined\n * thresholds — the CSS container-query equivalent of `AdwBreakpointBin`\n * (libadwaita 1.9 / GNOME 50).\n *\n * Unlike `useBreakpoint` (which watches the viewport), `BreakpointBin` uses\n * `ResizeObserver` to watch the element itself. This makes it composable:\n * the same component can behave differently depending on how much space it\n * is given by its parent, regardless of the viewport size.\n *\n * ### How it works\n * - Breakpoints are evaluated in ascending `maxWidth` order.\n * - The active breakpoint is the first one whose `maxWidth` ≥ the container width.\n * - When no breakpoint matches (container is wider than all), `activeBreakpoint` is `null`.\n * - The active name is set as `data-breakpoint` on the wrapper `<div>` for CSS targeting.\n *\n * ### CSS targeting\n * ```css\n * .myWidget[data-breakpoint=\"compact\"] .layout { flex-direction: column; }\n * ```\n *\n * @see https://gnome.pages.gitlab.gnome.org/libadwaita/doc/main/class.BreakpointBin.html\n */\nexport const BreakpointBin = ({\n breakpoints,\n children,\n className,\n style,\n ...props\n}: BreakpointBinProps) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [state, setState] = useState<BreakpointBinState>({\n activeBreakpoint: null,\n width: 0,\n });\n\n useEffect(() => {\n const el = containerRef.current;\n\n if (!el) {\n return;\n }\n\n // Sort breakpoints ascending so we find the smallest matching threshold\n const sorted = [...breakpoints].sort((a, b) => a.maxWidth - b.maxWidth);\n\n const evaluate = (width: number): BreakpointBinState => {\n const match = sorted.find((bp) => width <= bp.maxWidth) ?? null;\n\n return { activeBreakpoint: match?.name ?? null, width };\n };\n\n // Initial measurement\n setState(evaluate(el.offsetWidth));\n\n const observer = new ResizeObserver((entries) => {\n const [entry] = entries;\n\n if (!entry) {\n return;\n }\n\n // contentBoxSize is more reliable than contentRect for inline-size\n const width = entry.contentBoxSize?.[0]?.inlineSize ?? entry.contentRect.width;\n\n setState(evaluate(width));\n });\n\n observer.observe(el);\n\n return () => observer.disconnect();\n }, [breakpoints]);\n\n const containerStyle: CSSProperties = {\n // Ensure the container establishes a containing block\n // so ResizeObserver reflects actual layout width\n minWidth: 0,\n ...style,\n };\n\n return (\n <div\n ref={containerRef}\n className={className}\n style={containerStyle}\n data-breakpoint={state.activeBreakpoint ?? undefined}\n {...props}\n >\n {children(state)}\n </div>\n );\n};\n"],"mappings":";;;AAgFA,IAAa,KAAiB,EAC5B,gBACA,aACA,cACA,UACA,GAAG,QACqB;CACxB,IAAM,IAAe,EAAuB,IAAI,GAC1C,CAAC,GAAO,KAAY,EAA6B;EACrD,kBAAkB;EAClB,OAAO;CACT,CAAC;CA8CD,OA5CA,QAAgB;EACd,IAAM,IAAK,EAAa;EAExB,IAAI,CAAC,GACH;EAIF,IAAM,IAAS,CAAC,GAAG,CAAW,EAAE,MAAM,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ,GAEhE,KAAY,OAGT;GAAE,mBAFK,EAAO,MAAM,MAAO,KAAS,EAAG,QAAQ,KAAK,OAEzB,QAAQ;GAAM;EAAM;EAIxD,EAAS,EAAS,EAAG,WAAW,CAAC;EAEjC,IAAM,IAAW,IAAI,gBAAgB,MAAY;GAC/C,IAAM,CAAC,KAAS;GAEX,KAOL,EAAS,EAFK,EAAM,iBAAiB,IAAI,cAAc,EAAM,YAAY,KAElD,CAAC;EAC1B,CAAC;EAID,OAFA,EAAS,QAAQ,CAAE,SAEN,EAAS,WAAW;CACnC,GAAG,CAAC,CAAW,CAAC,GAUd,kBAAC,OAAD;EACE,KAAK;EACM;EACX,OAAO;GART,UAAU;GACV,GAAG;EAOM;EACP,mBAAiB,EAAM,oBAAoB,KAAA;EAC3C,GAAI;YAEH,EAAS,CAAK;CACZ,CAAA;AAET"}
@@ -1,2 +1,2 @@
1
- var e={button:`_button_plhd2_1`,pill:`_pill_plhd2_53`,circular:`_circular_plhd2_60`,default:`_default_plhd2_72`,suggested:`_suggested_plhd2_106`,destructive:`_destructive_plhd2_121`,flat:`_flat_plhd2_136`,raised:`_raised_plhd2_151`,osd:`_osd_plhd2_185`,sm:`_sm_plhd2_231`,lg:`_lg_plhd2_246`};exports.default=e;
1
+ var e={button:`_button_ienn0_1`,pill:`_pill_ienn0_53`,circular:`_circular_ienn0_60`,default:`_default_ienn0_72`,suggested:`_suggested_ienn0_106`,destructive:`_destructive_ienn0_121`,flat:`_flat_ienn0_136`,raised:`_raised_ienn0_151`,osd:`_osd_ienn0_185`,sm:`_sm_ienn0_230`,lg:`_lg_ienn0_245`};exports.default=e;
2
2
  //# sourceMappingURL=Button.module.css.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.module.css.cjs","names":[],"sources":["../../../src/components/Button/Button.module.css"],"sourcesContent":[".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--gnome-space-1);\n\n /* Typography */\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body);\n font-weight: var(--gnome-font-weight-semibold);\n line-height: 1;\n white-space: nowrap;\n\n /* Shape */\n border-radius: var(--gnome-radius-md);\n border: 1px solid transparent;\n padding: var(--gnome-space-1) var(--gnome-space-2);\n min-height: 34px;\n min-width: 5.5rem;\n\n /* Behavior */\n cursor: pointer;\n user-select: none;\n text-decoration: none;\n vertical-align: middle;\n outline: none;\n transition:\n background-color var(--gnome-duration-fast) var(--gnome-easing-default),\n box-shadow var(--gnome-duration-fast) var(--gnome-easing-default),\n opacity var(--gnome-duration-fast) var(--gnome-easing-default);\n}\n\n/* ─── Focus ───────────────────────────────────────────────────── */\n\n.button:focus-visible {\n box-shadow:\n 0 0 0 var(--gnome-focus-ring-offset) var(--gnome-window-bg-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width))\n var(--gnome-focus-ring-color);\n}\n\n/* ─── Disabled ────────────────────────────────────────────────── */\n\n.button:disabled,\n.button[aria-disabled=\"true\"] {\n opacity: var(--gnome-opacity-disabled);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ─── Pill shape ──────────────────────────────────────────────── */\n\n.pill {\n border-radius: var(--gnome-radius-pill);\n padding-inline: var(--gnome-space-3);\n}\n\n/* ─── Circular shape ──────────────────────────────────────────── */\n\n.circular {\n border-radius: var(--gnome-radius-pill);\n padding: var(--gnome-space-1);\n min-width: 34px;\n min-height: 34px;\n width: 34px;\n height: 34px;\n}\n\n/* ─── Variants ────────────────────────────────────────────────── */\n\n/* Default — slight raised appearance with visible border */\n.default {\n background-color: var(--gnome-card-bg-color, #ffffff);\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n border-color: var(--gnome-light-3, #deddda);\n box-shadow: var(--gnome-shadow-sm);\n}\n\n.default:hover:not(:disabled) {\n background-color: var(--gnome-light-2, #f6f5f4);\n}\n\n.default:active:not(:disabled) {\n background-color: var(--gnome-light-3, #deddda);\n box-shadow: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .default {\n background-color: var(--gnome-card-bg-color, #383838);\n border-color: rgba(255, 255, 255, 0.12);\n box-shadow: none;\n }\n\n .default:hover:not(:disabled) {\n background-color: rgba(255, 255, 255, 0.08);\n }\n\n .default:active:not(:disabled) {\n background-color: rgba(255, 255, 255, 0.14);\n box-shadow: none;\n }\n}\n\n/* Suggested — accent color for primary / affirmative actions */\n.suggested {\n background-color: var(--gnome-accent-bg-color);\n color: var(--gnome-accent-fg-color);\n border-color: transparent;\n}\n\n.suggested:hover:not(:disabled) {\n filter: brightness(1.08);\n}\n\n.suggested:active:not(:disabled) {\n filter: brightness(0.92);\n}\n\n/* Destructive — red for dangerous / irreversible actions */\n.destructive {\n background-color: var(--gnome-destructive-bg-color);\n color: var(--gnome-destructive-fg-color);\n border-color: transparent;\n}\n\n.destructive:hover:not(:disabled) {\n filter: brightness(1.08);\n}\n\n.destructive:active:not(:disabled) {\n filter: brightness(0.92);\n}\n\n/* Flat — no border, no background. Used inside header bars */\n.flat {\n background-color: transparent;\n border-color: transparent;\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n}\n\n.flat:hover:not(:disabled) {\n background-color: var(--gnome-hover-overlay);\n}\n\n.flat:active:not(:disabled) {\n background-color: var(--gnome-active-overlay);\n}\n\n/* Raised — explicit raised look inside flat/toolbar contexts */\n.raised {\n background-color: var(--gnome-card-bg-color, #ffffff);\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n border-color: var(--gnome-light-3, #deddda);\n box-shadow: var(--gnome-shadow-sm);\n}\n\n.raised:hover:not(:disabled) {\n background-color: var(--gnome-light-2, #f6f5f4);\n}\n\n.raised:active:not(:disabled) {\n background-color: var(--gnome-light-3, #deddda);\n box-shadow: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .raised {\n background-color: var(--gnome-card-bg-color, #383838);\n border-color: rgba(255, 255, 255, 0.12);\n box-shadow: var(--gnome-shadow-sm);\n }\n\n .raised:hover:not(:disabled) {\n background-color: rgba(255, 255, 255, 0.08);\n }\n\n .raised:active:not(:disabled) {\n background-color: rgba(255, 255, 255, 0.14);\n box-shadow: none;\n }\n}\n\n/* OSD — dark semi-transparent overlay style for media/image contexts */\n.osd {\n background-color: rgba(0, 0, 0, 0.65);\n color: rgba(255, 255, 255, 0.95);\n border-color: rgba(255, 255, 255, 0.12);\n box-shadow: none;\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n}\n\n.osd:hover:not(:disabled) {\n background-color: rgba(0, 0, 0, 0.75);\n filter: none;\n}\n\n.osd:active:not(:disabled) {\n background-color: rgba(0, 0, 0, 0.85);\n filter: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .osd {\n background-color: rgba(0, 0, 0, 0.65);\n border-color: rgba(255, 255, 255, 0.1);\n }\n}\n\n/* ─── High contrast ───────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .default {\n border-width: 2px;\n box-shadow: none;\n }\n\n .button:focus-visible {\n box-shadow:\n 0 0 0 var(--gnome-focus-ring-offset) var(--gnome-window-bg-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width))\n var(--gnome-focus-ring-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width) + 1px)\n var(--gnome-window-bg-color);\n }\n}\n\n/* ─── Sizes ───────────────────────────────────────────────────── */\n\n.sm {\n font-size: var(--gnome-font-size-caption);\n min-height: 28px;\n padding: 4px var(--gnome-space-1);\n min-width: 4rem;\n}\n\n.sm.circular {\n min-width: 28px;\n min-height: 28px;\n width: 28px;\n height: 28px;\n padding: 4px;\n}\n\n.lg {\n font-size: var(--gnome-font-size-title-4);\n min-height: 42px;\n padding: var(--gnome-space-1) var(--gnome-space-3);\n}\n\n.lg.circular {\n min-width: 42px;\n min-height: 42px;\n width: 42px;\n height: 42px;\n padding: var(--gnome-space-1);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"Button.module.css.cjs","names":[],"sources":["../../../src/components/Button/Button.module.css"],"sourcesContent":[".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--gnome-space-1);\n\n /* Typography */\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body);\n font-weight: var(--gnome-font-weight-semibold);\n line-height: 1;\n white-space: nowrap;\n\n /* Shape */\n border-radius: var(--gnome-radius-md);\n border: 1px solid transparent;\n padding: var(--gnome-space-1) var(--gnome-space-2);\n min-height: 34px;\n min-width: 5.5rem;\n\n /* Behavior */\n cursor: pointer;\n user-select: none;\n text-decoration: none;\n vertical-align: middle;\n outline: none;\n transition:\n background-color var(--gnome-duration-fast) var(--gnome-easing-default),\n box-shadow var(--gnome-duration-fast) var(--gnome-easing-default),\n opacity var(--gnome-duration-fast) var(--gnome-easing-default);\n}\n\n/* ─── Focus ───────────────────────────────────────────────────── */\n\n.button:focus-visible {\n box-shadow:\n 0 0 0 var(--gnome-focus-ring-offset) var(--gnome-window-bg-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width))\n var(--gnome-focus-ring-color);\n}\n\n/* ─── Disabled ────────────────────────────────────────────────── */\n\n.button:disabled,\n.button[aria-disabled=\"true\"] {\n opacity: var(--gnome-opacity-disabled);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ─── Pill shape ──────────────────────────────────────────────── */\n\n.pill {\n border-radius: var(--gnome-radius-pill);\n padding-inline: var(--gnome-space-3);\n}\n\n/* ─── Circular shape ──────────────────────────────────────────── */\n\n.circular {\n border-radius: var(--gnome-radius-pill);\n padding: var(--gnome-space-1);\n min-width: 34px;\n min-height: 34px;\n width: 34px;\n height: 34px;\n}\n\n/* ─── Variants ────────────────────────────────────────────────── */\n\n/* Default — slight raised appearance with visible border */\n.default {\n background-color: var(--gnome-card-bg-color, #fff);\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n border-color: var(--gnome-light-3, #deddda);\n box-shadow: var(--gnome-shadow-sm);\n}\n\n.default:hover:not(:disabled) {\n background-color: var(--gnome-light-2, #f6f5f4);\n}\n\n.default:active:not(:disabled) {\n background-color: var(--gnome-light-3, #deddda);\n box-shadow: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .default {\n background-color: var(--gnome-card-bg-color, #383838);\n border-color: rgb(255 255 255 / 0.12);\n box-shadow: none;\n }\n\n .default:hover:not(:disabled) {\n background-color: rgb(255 255 255 / 0.08);\n }\n\n .default:active:not(:disabled) {\n background-color: rgb(255 255 255 / 0.14);\n box-shadow: none;\n }\n}\n\n/* Suggested — accent color for primary / affirmative actions */\n.suggested {\n background-color: var(--gnome-accent-bg-color);\n color: var(--gnome-accent-fg-color);\n border-color: transparent;\n}\n\n.suggested:hover:not(:disabled) {\n filter: brightness(1.08);\n}\n\n.suggested:active:not(:disabled) {\n filter: brightness(0.92);\n}\n\n/* Destructive — red for dangerous / irreversible actions */\n.destructive {\n background-color: var(--gnome-destructive-bg-color);\n color: var(--gnome-destructive-fg-color);\n border-color: transparent;\n}\n\n.destructive:hover:not(:disabled) {\n filter: brightness(1.08);\n}\n\n.destructive:active:not(:disabled) {\n filter: brightness(0.92);\n}\n\n/* Flat — no border, no background. Used inside header bars */\n.flat {\n background-color: transparent;\n border-color: transparent;\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n}\n\n.flat:hover:not(:disabled) {\n background-color: var(--gnome-hover-overlay);\n}\n\n.flat:active:not(:disabled) {\n background-color: var(--gnome-active-overlay);\n}\n\n/* Raised — explicit raised look inside flat/toolbar contexts */\n.raised {\n background-color: var(--gnome-card-bg-color, #fff);\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n border-color: var(--gnome-light-3, #deddda);\n box-shadow: var(--gnome-shadow-sm);\n}\n\n.raised:hover:not(:disabled) {\n background-color: var(--gnome-light-2, #f6f5f4);\n}\n\n.raised:active:not(:disabled) {\n background-color: var(--gnome-light-3, #deddda);\n box-shadow: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .raised {\n background-color: var(--gnome-card-bg-color, #383838);\n border-color: rgb(255 255 255 / 0.12);\n box-shadow: var(--gnome-shadow-sm);\n }\n\n .raised:hover:not(:disabled) {\n background-color: rgb(255 255 255 / 0.08);\n }\n\n .raised:active:not(:disabled) {\n background-color: rgb(255 255 255 / 0.14);\n box-shadow: none;\n }\n}\n\n/* OSD — dark semi-transparent overlay style for media/image contexts */\n.osd {\n background-color: rgb(0 0 0 / 0.65);\n color: rgb(255 255 255 / 0.95);\n border-color: rgb(255 255 255 / 0.12);\n box-shadow: none;\n backdrop-filter: blur(4px);\n}\n\n.osd:hover:not(:disabled) {\n background-color: rgb(0 0 0 / 0.75);\n filter: none;\n}\n\n.osd:active:not(:disabled) {\n background-color: rgb(0 0 0 / 0.85);\n filter: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .osd {\n background-color: rgb(0 0 0 / 0.65);\n border-color: rgb(255 255 255 / 0.1);\n }\n}\n\n/* ─── High contrast ───────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .default {\n border-width: 2px;\n box-shadow: none;\n }\n\n .button:focus-visible {\n box-shadow:\n 0 0 0 var(--gnome-focus-ring-offset) var(--gnome-window-bg-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width))\n var(--gnome-focus-ring-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width) + 1px)\n var(--gnome-window-bg-color);\n }\n}\n\n/* ─── Sizes ───────────────────────────────────────────────────── */\n\n.sm {\n font-size: var(--gnome-font-size-caption);\n min-height: 28px;\n padding: 4px var(--gnome-space-1);\n min-width: 4rem;\n}\n\n.sm.circular {\n min-width: 28px;\n min-height: 28px;\n width: 28px;\n height: 28px;\n padding: 4px;\n}\n\n.lg {\n font-size: var(--gnome-font-size-title-4);\n min-height: 42px;\n padding: var(--gnome-space-1) var(--gnome-space-3);\n}\n\n.lg.circular {\n min-width: 42px;\n min-height: 42px;\n width: 42px;\n height: 42px;\n padding: var(--gnome-space-1);\n}\n"],"mappings":""}
@@ -1,15 +1,15 @@
1
1
  var e = {
2
- button: "_button_plhd2_1",
3
- pill: "_pill_plhd2_53",
4
- circular: "_circular_plhd2_60",
5
- default: "_default_plhd2_72",
6
- suggested: "_suggested_plhd2_106",
7
- destructive: "_destructive_plhd2_121",
8
- flat: "_flat_plhd2_136",
9
- raised: "_raised_plhd2_151",
10
- osd: "_osd_plhd2_185",
11
- sm: "_sm_plhd2_231",
12
- lg: "_lg_plhd2_246"
2
+ button: "_button_ienn0_1",
3
+ pill: "_pill_ienn0_53",
4
+ circular: "_circular_ienn0_60",
5
+ default: "_default_ienn0_72",
6
+ suggested: "_suggested_ienn0_106",
7
+ destructive: "_destructive_ienn0_121",
8
+ flat: "_flat_ienn0_136",
9
+ raised: "_raised_ienn0_151",
10
+ osd: "_osd_ienn0_185",
11
+ sm: "_sm_ienn0_230",
12
+ lg: "_lg_ienn0_245"
13
13
  };
14
14
  //#endregion
15
15
  export { e as default };
@@ -1 +1 @@
1
- {"version":3,"file":"Button.module.css.js","names":[],"sources":["../../../src/components/Button/Button.module.css"],"sourcesContent":[".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--gnome-space-1);\n\n /* Typography */\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body);\n font-weight: var(--gnome-font-weight-semibold);\n line-height: 1;\n white-space: nowrap;\n\n /* Shape */\n border-radius: var(--gnome-radius-md);\n border: 1px solid transparent;\n padding: var(--gnome-space-1) var(--gnome-space-2);\n min-height: 34px;\n min-width: 5.5rem;\n\n /* Behavior */\n cursor: pointer;\n user-select: none;\n text-decoration: none;\n vertical-align: middle;\n outline: none;\n transition:\n background-color var(--gnome-duration-fast) var(--gnome-easing-default),\n box-shadow var(--gnome-duration-fast) var(--gnome-easing-default),\n opacity var(--gnome-duration-fast) var(--gnome-easing-default);\n}\n\n/* ─── Focus ───────────────────────────────────────────────────── */\n\n.button:focus-visible {\n box-shadow:\n 0 0 0 var(--gnome-focus-ring-offset) var(--gnome-window-bg-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width))\n var(--gnome-focus-ring-color);\n}\n\n/* ─── Disabled ────────────────────────────────────────────────── */\n\n.button:disabled,\n.button[aria-disabled=\"true\"] {\n opacity: var(--gnome-opacity-disabled);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ─── Pill shape ──────────────────────────────────────────────── */\n\n.pill {\n border-radius: var(--gnome-radius-pill);\n padding-inline: var(--gnome-space-3);\n}\n\n/* ─── Circular shape ──────────────────────────────────────────── */\n\n.circular {\n border-radius: var(--gnome-radius-pill);\n padding: var(--gnome-space-1);\n min-width: 34px;\n min-height: 34px;\n width: 34px;\n height: 34px;\n}\n\n/* ─── Variants ────────────────────────────────────────────────── */\n\n/* Default — slight raised appearance with visible border */\n.default {\n background-color: var(--gnome-card-bg-color, #ffffff);\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n border-color: var(--gnome-light-3, #deddda);\n box-shadow: var(--gnome-shadow-sm);\n}\n\n.default:hover:not(:disabled) {\n background-color: var(--gnome-light-2, #f6f5f4);\n}\n\n.default:active:not(:disabled) {\n background-color: var(--gnome-light-3, #deddda);\n box-shadow: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .default {\n background-color: var(--gnome-card-bg-color, #383838);\n border-color: rgba(255, 255, 255, 0.12);\n box-shadow: none;\n }\n\n .default:hover:not(:disabled) {\n background-color: rgba(255, 255, 255, 0.08);\n }\n\n .default:active:not(:disabled) {\n background-color: rgba(255, 255, 255, 0.14);\n box-shadow: none;\n }\n}\n\n/* Suggested — accent color for primary / affirmative actions */\n.suggested {\n background-color: var(--gnome-accent-bg-color);\n color: var(--gnome-accent-fg-color);\n border-color: transparent;\n}\n\n.suggested:hover:not(:disabled) {\n filter: brightness(1.08);\n}\n\n.suggested:active:not(:disabled) {\n filter: brightness(0.92);\n}\n\n/* Destructive — red for dangerous / irreversible actions */\n.destructive {\n background-color: var(--gnome-destructive-bg-color);\n color: var(--gnome-destructive-fg-color);\n border-color: transparent;\n}\n\n.destructive:hover:not(:disabled) {\n filter: brightness(1.08);\n}\n\n.destructive:active:not(:disabled) {\n filter: brightness(0.92);\n}\n\n/* Flat — no border, no background. Used inside header bars */\n.flat {\n background-color: transparent;\n border-color: transparent;\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n}\n\n.flat:hover:not(:disabled) {\n background-color: var(--gnome-hover-overlay);\n}\n\n.flat:active:not(:disabled) {\n background-color: var(--gnome-active-overlay);\n}\n\n/* Raised — explicit raised look inside flat/toolbar contexts */\n.raised {\n background-color: var(--gnome-card-bg-color, #ffffff);\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n border-color: var(--gnome-light-3, #deddda);\n box-shadow: var(--gnome-shadow-sm);\n}\n\n.raised:hover:not(:disabled) {\n background-color: var(--gnome-light-2, #f6f5f4);\n}\n\n.raised:active:not(:disabled) {\n background-color: var(--gnome-light-3, #deddda);\n box-shadow: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .raised {\n background-color: var(--gnome-card-bg-color, #383838);\n border-color: rgba(255, 255, 255, 0.12);\n box-shadow: var(--gnome-shadow-sm);\n }\n\n .raised:hover:not(:disabled) {\n background-color: rgba(255, 255, 255, 0.08);\n }\n\n .raised:active:not(:disabled) {\n background-color: rgba(255, 255, 255, 0.14);\n box-shadow: none;\n }\n}\n\n/* OSD — dark semi-transparent overlay style for media/image contexts */\n.osd {\n background-color: rgba(0, 0, 0, 0.65);\n color: rgba(255, 255, 255, 0.95);\n border-color: rgba(255, 255, 255, 0.12);\n box-shadow: none;\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n}\n\n.osd:hover:not(:disabled) {\n background-color: rgba(0, 0, 0, 0.75);\n filter: none;\n}\n\n.osd:active:not(:disabled) {\n background-color: rgba(0, 0, 0, 0.85);\n filter: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .osd {\n background-color: rgba(0, 0, 0, 0.65);\n border-color: rgba(255, 255, 255, 0.1);\n }\n}\n\n/* ─── High contrast ───────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .default {\n border-width: 2px;\n box-shadow: none;\n }\n\n .button:focus-visible {\n box-shadow:\n 0 0 0 var(--gnome-focus-ring-offset) var(--gnome-window-bg-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width))\n var(--gnome-focus-ring-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width) + 1px)\n var(--gnome-window-bg-color);\n }\n}\n\n/* ─── Sizes ───────────────────────────────────────────────────── */\n\n.sm {\n font-size: var(--gnome-font-size-caption);\n min-height: 28px;\n padding: 4px var(--gnome-space-1);\n min-width: 4rem;\n}\n\n.sm.circular {\n min-width: 28px;\n min-height: 28px;\n width: 28px;\n height: 28px;\n padding: 4px;\n}\n\n.lg {\n font-size: var(--gnome-font-size-title-4);\n min-height: 42px;\n padding: var(--gnome-space-1) var(--gnome-space-3);\n}\n\n.lg.circular {\n min-width: 42px;\n min-height: 42px;\n width: 42px;\n height: 42px;\n padding: var(--gnome-space-1);\n}\n"],"mappings":""}
1
+ {"version":3,"file":"Button.module.css.js","names":[],"sources":["../../../src/components/Button/Button.module.css"],"sourcesContent":[".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--gnome-space-1);\n\n /* Typography */\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body);\n font-weight: var(--gnome-font-weight-semibold);\n line-height: 1;\n white-space: nowrap;\n\n /* Shape */\n border-radius: var(--gnome-radius-md);\n border: 1px solid transparent;\n padding: var(--gnome-space-1) var(--gnome-space-2);\n min-height: 34px;\n min-width: 5.5rem;\n\n /* Behavior */\n cursor: pointer;\n user-select: none;\n text-decoration: none;\n vertical-align: middle;\n outline: none;\n transition:\n background-color var(--gnome-duration-fast) var(--gnome-easing-default),\n box-shadow var(--gnome-duration-fast) var(--gnome-easing-default),\n opacity var(--gnome-duration-fast) var(--gnome-easing-default);\n}\n\n/* ─── Focus ───────────────────────────────────────────────────── */\n\n.button:focus-visible {\n box-shadow:\n 0 0 0 var(--gnome-focus-ring-offset) var(--gnome-window-bg-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width))\n var(--gnome-focus-ring-color);\n}\n\n/* ─── Disabled ────────────────────────────────────────────────── */\n\n.button:disabled,\n.button[aria-disabled=\"true\"] {\n opacity: var(--gnome-opacity-disabled);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ─── Pill shape ──────────────────────────────────────────────── */\n\n.pill {\n border-radius: var(--gnome-radius-pill);\n padding-inline: var(--gnome-space-3);\n}\n\n/* ─── Circular shape ──────────────────────────────────────────── */\n\n.circular {\n border-radius: var(--gnome-radius-pill);\n padding: var(--gnome-space-1);\n min-width: 34px;\n min-height: 34px;\n width: 34px;\n height: 34px;\n}\n\n/* ─── Variants ────────────────────────────────────────────────── */\n\n/* Default — slight raised appearance with visible border */\n.default {\n background-color: var(--gnome-card-bg-color, #fff);\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n border-color: var(--gnome-light-3, #deddda);\n box-shadow: var(--gnome-shadow-sm);\n}\n\n.default:hover:not(:disabled) {\n background-color: var(--gnome-light-2, #f6f5f4);\n}\n\n.default:active:not(:disabled) {\n background-color: var(--gnome-light-3, #deddda);\n box-shadow: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .default {\n background-color: var(--gnome-card-bg-color, #383838);\n border-color: rgb(255 255 255 / 0.12);\n box-shadow: none;\n }\n\n .default:hover:not(:disabled) {\n background-color: rgb(255 255 255 / 0.08);\n }\n\n .default:active:not(:disabled) {\n background-color: rgb(255 255 255 / 0.14);\n box-shadow: none;\n }\n}\n\n/* Suggested — accent color for primary / affirmative actions */\n.suggested {\n background-color: var(--gnome-accent-bg-color);\n color: var(--gnome-accent-fg-color);\n border-color: transparent;\n}\n\n.suggested:hover:not(:disabled) {\n filter: brightness(1.08);\n}\n\n.suggested:active:not(:disabled) {\n filter: brightness(0.92);\n}\n\n/* Destructive — red for dangerous / irreversible actions */\n.destructive {\n background-color: var(--gnome-destructive-bg-color);\n color: var(--gnome-destructive-fg-color);\n border-color: transparent;\n}\n\n.destructive:hover:not(:disabled) {\n filter: brightness(1.08);\n}\n\n.destructive:active:not(:disabled) {\n filter: brightness(0.92);\n}\n\n/* Flat — no border, no background. Used inside header bars */\n.flat {\n background-color: transparent;\n border-color: transparent;\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n}\n\n.flat:hover:not(:disabled) {\n background-color: var(--gnome-hover-overlay);\n}\n\n.flat:active:not(:disabled) {\n background-color: var(--gnome-active-overlay);\n}\n\n/* Raised — explicit raised look inside flat/toolbar contexts */\n.raised {\n background-color: var(--gnome-card-bg-color, #fff);\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n border-color: var(--gnome-light-3, #deddda);\n box-shadow: var(--gnome-shadow-sm);\n}\n\n.raised:hover:not(:disabled) {\n background-color: var(--gnome-light-2, #f6f5f4);\n}\n\n.raised:active:not(:disabled) {\n background-color: var(--gnome-light-3, #deddda);\n box-shadow: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .raised {\n background-color: var(--gnome-card-bg-color, #383838);\n border-color: rgb(255 255 255 / 0.12);\n box-shadow: var(--gnome-shadow-sm);\n }\n\n .raised:hover:not(:disabled) {\n background-color: rgb(255 255 255 / 0.08);\n }\n\n .raised:active:not(:disabled) {\n background-color: rgb(255 255 255 / 0.14);\n box-shadow: none;\n }\n}\n\n/* OSD — dark semi-transparent overlay style for media/image contexts */\n.osd {\n background-color: rgb(0 0 0 / 0.65);\n color: rgb(255 255 255 / 0.95);\n border-color: rgb(255 255 255 / 0.12);\n box-shadow: none;\n backdrop-filter: blur(4px);\n}\n\n.osd:hover:not(:disabled) {\n background-color: rgb(0 0 0 / 0.75);\n filter: none;\n}\n\n.osd:active:not(:disabled) {\n background-color: rgb(0 0 0 / 0.85);\n filter: none;\n}\n\n@media (prefers-color-scheme: dark) {\n .osd {\n background-color: rgb(0 0 0 / 0.65);\n border-color: rgb(255 255 255 / 0.1);\n }\n}\n\n/* ─── High contrast ───────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .default {\n border-width: 2px;\n box-shadow: none;\n }\n\n .button:focus-visible {\n box-shadow:\n 0 0 0 var(--gnome-focus-ring-offset) var(--gnome-window-bg-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width))\n var(--gnome-focus-ring-color),\n 0 0 0 calc(var(--gnome-focus-ring-offset) + var(--gnome-focus-ring-width) + 1px)\n var(--gnome-window-bg-color);\n }\n}\n\n/* ─── Sizes ───────────────────────────────────────────────────── */\n\n.sm {\n font-size: var(--gnome-font-size-caption);\n min-height: 28px;\n padding: 4px var(--gnome-space-1);\n min-width: 4rem;\n}\n\n.sm.circular {\n min-width: 28px;\n min-height: 28px;\n width: 28px;\n height: 28px;\n padding: 4px;\n}\n\n.lg {\n font-size: var(--gnome-font-size-title-4);\n min-height: 42px;\n padding: var(--gnome-space-1) var(--gnome-space-3);\n}\n\n.lg.circular {\n min-width: 42px;\n min-height: 42px;\n width: 42px;\n height: 42px;\n padding: var(--gnome-space-1);\n}\n"],"mappings":""}
@@ -1,2 +1,2 @@
1
- var e={row:`_row_1877a_3`,title:`_title_1877a_48`,leading:`_leading_1877a_59`,trailing:`_trailing_1877a_60`,default:`_default_1877a_68`,suggested:`_suggested_1877a_77`,destructive:`_destructive_1877a_86`};exports.default=e;
1
+ var e={row:`_row_i8gww_3`,title:`_title_i8gww_46`,leading:`_leading_i8gww_57`,trailing:`_trailing_i8gww_58`,default:`_default_i8gww_66`,suggested:`_suggested_i8gww_75`,destructive:`_destructive_i8gww_84`};exports.default=e;
2
2
  //# sourceMappingURL=ButtonRow.module.css.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ButtonRow.module.css.cjs","names":[],"sources":["../../../src/components/ButtonRow/ButtonRow.module.css"],"sourcesContent":["/* ─── Base row ─────────────────────────────────────────────────────────────── */\n\n.row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--gnome-space-2, 12px);\n padding: var(--gnome-space-2, 12px) var(--gnome-space-4, 24px);\n min-height: 52px;\n width: 100%;\n\n /* Reset button */\n appearance: none;\n -webkit-appearance: none;\n background: transparent;\n border: none;\n font: inherit;\n outline: none;\n cursor: pointer;\n text-align: center;\n\n transition: background-color var(--gnome-duration-fast) var(--gnome-easing-default);\n}\n\n.row:hover {\n background-color: var(--gnome-hover-overlay);\n}\n\n.row:active {\n background-color: var(--gnome-active-overlay);\n}\n\n.row:focus-visible {\n box-shadow:\n inset 0 0 0 var(--gnome-focus-ring-offset, 2px) var(--gnome-window-bg-color, #fafafa),\n inset 0 0 0 calc(var(--gnome-focus-ring-offset, 2px) + var(--gnome-focus-ring-width, 3px))\n var(--gnome-focus-ring-color, #3584e4);\n}\n\n.row:disabled {\n opacity: var(--gnome-opacity-disabled, 0.5);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ─── Title ─────────────────────────────────────────────────────────────────── */\n\n.title {\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body, 1rem);\n font-weight: var(--gnome-font-weight-semibold, 600);\n line-height: var(--gnome-line-height-body, 1.5);\n flex: 1;\n text-align: center;\n}\n\n/* ─── Leading / trailing icons ─────────────────────────────────────────────── */\n\n.leading,\n.trailing {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n/* ─── Variants ─────────────────────────────────────────────────────────────── */\n\n.default .title {\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n}\n\n.default .leading,\n.default .trailing {\n color: var(--gnome-window-fg-color, rgba(0, 0, 0, 0.8));\n}\n\n.suggested .title {\n color: var(--gnome-accent-color, #3584e4);\n}\n\n.suggested .leading,\n.suggested .trailing {\n color: var(--gnome-accent-color, #3584e4);\n}\n\n.destructive .title {\n color: var(--gnome-destructive-color, #e01b24);\n}\n\n.destructive .leading,\n.destructive .trailing {\n color: var(--gnome-destructive-color, #e01b24);\n}\n\n/* ─── High contrast ─────────────────────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .row:focus-visible {\n box-shadow:\n inset 0 0 0 var(--gnome-focus-ring-offset, 2px) var(--gnome-window-bg-color, #fafafa),\n inset 0 0 0 calc(var(--gnome-focus-ring-offset, 2px) + var(--gnome-focus-ring-width, 3px))\n var(--gnome-focus-ring-color, #3584e4),\n inset 0 0 0\n calc(var(--gnome-focus-ring-offset, 2px) + var(--gnome-focus-ring-width, 3px) + 1px)\n var(--gnome-window-bg-color, #fafafa);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"ButtonRow.module.css.cjs","names":[],"sources":["../../../src/components/ButtonRow/ButtonRow.module.css"],"sourcesContent":["/* ─── Base row ─────────────────────────────────────────────────────────────── */\n\n.row {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--gnome-space-2, 12px);\n padding: var(--gnome-space-2, 12px) var(--gnome-space-4, 24px);\n min-height: 52px;\n width: 100%;\n\n /* Reset button */\n appearance: none;\n background: transparent;\n border: none;\n font: inherit;\n outline: none;\n cursor: pointer;\n text-align: center;\n transition: background-color var(--gnome-duration-fast) var(--gnome-easing-default);\n}\n\n.row:hover {\n background-color: var(--gnome-hover-overlay);\n}\n\n.row:active {\n background-color: var(--gnome-active-overlay);\n}\n\n.row:focus-visible {\n box-shadow:\n inset 0 0 0 var(--gnome-focus-ring-offset, 2px) var(--gnome-window-bg-color, #fafafa),\n inset 0 0 0 calc(var(--gnome-focus-ring-offset, 2px) + var(--gnome-focus-ring-width, 3px))\n var(--gnome-focus-ring-color, #3584e4);\n}\n\n.row:disabled {\n opacity: var(--gnome-opacity-disabled, 0.5);\n cursor: not-allowed;\n pointer-events: none;\n}\n\n/* ─── Title ─────────────────────────────────────────────────────────────────── */\n\n.title {\n font-family: var(--gnome-font-family);\n font-size: var(--gnome-font-size-body, 1rem);\n font-weight: var(--gnome-font-weight-semibold, 600);\n line-height: var(--gnome-line-height-body, 1.5);\n flex: 1;\n text-align: center;\n}\n\n/* ─── Leading / trailing icons ─────────────────────────────────────────────── */\n\n.leading,\n.trailing {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n\n/* ─── Variants ─────────────────────────────────────────────────────────────── */\n\n.default .title {\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n}\n\n.default .leading,\n.default .trailing {\n color: var(--gnome-window-fg-color, rgb(0 0 0 / 0.8));\n}\n\n.suggested .title {\n color: var(--gnome-accent-color, #3584e4);\n}\n\n.suggested .leading,\n.suggested .trailing {\n color: var(--gnome-accent-color, #3584e4);\n}\n\n.destructive .title {\n color: var(--gnome-destructive-color, #e01b24);\n}\n\n.destructive .leading,\n.destructive .trailing {\n color: var(--gnome-destructive-color, #e01b24);\n}\n\n/* ─── High contrast ─────────────────────────────────────────────────────────── */\n\n@media (prefers-contrast: more) {\n .row:focus-visible {\n box-shadow:\n inset 0 0 0 var(--gnome-focus-ring-offset, 2px) var(--gnome-window-bg-color, #fafafa),\n inset 0 0 0 calc(var(--gnome-focus-ring-offset, 2px) + var(--gnome-focus-ring-width, 3px))\n var(--gnome-focus-ring-color, #3584e4),\n inset 0 0 0\n calc(var(--gnome-focus-ring-offset, 2px) + var(--gnome-focus-ring-width, 3px) + 1px)\n var(--gnome-window-bg-color, #fafafa);\n }\n}\n"],"mappings":""}