@helpwave/hightide 0.1.26 → 0.1.28

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 (336) hide show
  1. package/dist/coloring/index.d.mts +2 -0
  2. package/dist/coloring/index.d.ts +2 -0
  3. package/dist/coloring/index.js +85 -0
  4. package/dist/coloring/index.js.map +1 -0
  5. package/dist/coloring/index.mjs +48 -0
  6. package/dist/coloring/index.mjs.map +1 -0
  7. package/dist/components/branding/index.d.mts +3 -0
  8. package/dist/components/branding/index.d.ts +3 -0
  9. package/dist/components/branding/index.js +140 -0
  10. package/dist/components/branding/index.js.map +1 -0
  11. package/dist/components/branding/index.mjs +104 -0
  12. package/dist/components/branding/index.mjs.map +1 -0
  13. package/dist/components/date/DatePicker.js +1 -1
  14. package/dist/components/date/DatePicker.js.map +1 -1
  15. package/dist/components/date/DatePicker.mjs +1 -1
  16. package/dist/components/date/DatePicker.mjs.map +1 -1
  17. package/dist/components/date/YearMonthPicker.js +1 -1
  18. package/dist/components/date/YearMonthPicker.js.map +1 -1
  19. package/dist/components/date/YearMonthPicker.mjs +1 -1
  20. package/dist/components/date/YearMonthPicker.mjs.map +1 -1
  21. package/dist/components/date/index.d.mts +10 -0
  22. package/dist/components/date/index.d.ts +10 -0
  23. package/dist/components/date/index.js +1168 -0
  24. package/dist/components/date/index.js.map +1 -0
  25. package/dist/components/date/index.mjs +1124 -0
  26. package/dist/components/date/index.mjs.map +1 -0
  27. package/dist/components/dialog/ConfirmDialog.d.mts +1 -1
  28. package/dist/components/dialog/ConfirmDialog.d.ts +1 -1
  29. package/dist/components/dialog/ConfirmDialog.js +2 -2
  30. package/dist/components/dialog/ConfirmDialog.js.map +1 -1
  31. package/dist/components/dialog/ConfirmDialog.mjs +2 -2
  32. package/dist/components/dialog/ConfirmDialog.mjs.map +1 -1
  33. package/dist/components/dialog/Dialog.d.mts +1 -1
  34. package/dist/components/dialog/Dialog.d.ts +1 -1
  35. package/dist/components/dialog/Dialog.js +2 -2
  36. package/dist/components/dialog/Dialog.js.map +1 -1
  37. package/dist/components/dialog/Dialog.mjs +2 -2
  38. package/dist/components/dialog/Dialog.mjs.map +1 -1
  39. package/dist/components/dialog/DiscardChangesDialog.d.mts +1 -1
  40. package/dist/components/dialog/DiscardChangesDialog.d.ts +1 -1
  41. package/dist/components/dialog/DiscardChangesDialog.js +2 -2
  42. package/dist/components/dialog/DiscardChangesDialog.js.map +1 -1
  43. package/dist/components/dialog/DiscardChangesDialog.mjs +2 -2
  44. package/dist/components/dialog/DiscardChangesDialog.mjs.map +1 -1
  45. package/dist/components/dialog/InputDialog.d.mts +1 -1
  46. package/dist/components/dialog/InputDialog.d.ts +1 -1
  47. package/dist/components/dialog/InputDialog.js +2 -2
  48. package/dist/components/dialog/InputDialog.js.map +1 -1
  49. package/dist/components/dialog/InputDialog.mjs +2 -2
  50. package/dist/components/dialog/InputDialog.mjs.map +1 -1
  51. package/dist/components/dialog/LanguageDialog.d.mts +1 -1
  52. package/dist/components/dialog/LanguageDialog.d.ts +1 -1
  53. package/dist/components/dialog/LanguageDialog.js +28 -15
  54. package/dist/components/dialog/LanguageDialog.js.map +1 -1
  55. package/dist/components/dialog/LanguageDialog.mjs +28 -15
  56. package/dist/components/dialog/LanguageDialog.mjs.map +1 -1
  57. package/dist/components/dialog/ThemeDialog.d.mts +1 -1
  58. package/dist/components/dialog/ThemeDialog.d.ts +1 -1
  59. package/dist/components/dialog/ThemeDialog.js +69 -33
  60. package/dist/components/dialog/ThemeDialog.js.map +1 -1
  61. package/dist/components/dialog/ThemeDialog.mjs +60 -24
  62. package/dist/components/dialog/ThemeDialog.mjs.map +1 -1
  63. package/dist/components/dialog/index.d.mts +1 -1
  64. package/dist/components/dialog/index.d.ts +1 -1
  65. package/dist/components/dialog/index.js +61 -25
  66. package/dist/components/dialog/index.js.map +1 -1
  67. package/dist/components/dialog/index.mjs +61 -25
  68. package/dist/components/dialog/index.mjs.map +1 -1
  69. package/dist/components/form/index.d.mts +5 -0
  70. package/dist/components/form/index.d.ts +5 -0
  71. package/dist/components/form/index.js +100 -0
  72. package/dist/components/form/index.js.map +1 -0
  73. package/dist/components/form/index.mjs +64 -0
  74. package/dist/components/form/index.mjs.map +1 -0
  75. package/dist/components/icons-and-geometry/index.d.mts +7 -0
  76. package/dist/components/icons-and-geometry/index.d.ts +7 -0
  77. package/dist/components/icons-and-geometry/index.js +3955 -0
  78. package/dist/components/icons-and-geometry/index.js.map +1 -0
  79. package/dist/components/icons-and-geometry/index.mjs +3939 -0
  80. package/dist/components/icons-and-geometry/index.mjs.map +1 -0
  81. package/dist/components/index.d.mts +83 -0
  82. package/dist/components/index.d.ts +83 -0
  83. package/dist/components/index.js +15471 -0
  84. package/dist/components/index.js.map +1 -0
  85. package/dist/components/index.mjs +15377 -0
  86. package/dist/components/index.mjs.map +1 -0
  87. package/dist/components/layout/Carousel.d.mts +33 -0
  88. package/dist/components/layout/Carousel.d.ts +33 -0
  89. package/dist/components/layout/Carousel.js +684 -0
  90. package/dist/components/layout/Carousel.js.map +1 -0
  91. package/dist/components/layout/Carousel.mjs +659 -0
  92. package/dist/components/layout/Carousel.mjs.map +1 -0
  93. package/dist/components/{layout-and-navigation → layout}/Chip.js +1 -1
  94. package/dist/components/layout/Chip.js.map +1 -0
  95. package/dist/components/{layout-and-navigation → layout}/Chip.mjs +1 -1
  96. package/dist/components/layout/Chip.mjs.map +1 -0
  97. package/dist/components/{layout-and-navigation → layout}/DividerInserter.js +1 -1
  98. package/dist/components/layout/DividerInserter.js.map +1 -0
  99. package/dist/components/{layout-and-navigation → layout}/DividerInserter.mjs +1 -1
  100. package/dist/components/layout/DividerInserter.mjs.map +1 -0
  101. package/dist/components/{layout-and-navigation → layout}/Expandable.js +2 -2
  102. package/dist/components/layout/Expandable.js.map +1 -0
  103. package/dist/components/{layout-and-navigation → layout}/Expandable.mjs +2 -2
  104. package/dist/components/layout/Expandable.mjs.map +1 -0
  105. package/dist/components/{layout-and-navigation → layout}/FAQSection.js +5 -5
  106. package/dist/components/layout/FAQSection.js.map +1 -0
  107. package/dist/components/{layout-and-navigation → layout}/FAQSection.mjs +5 -5
  108. package/dist/components/layout/FAQSection.mjs.map +1 -0
  109. package/dist/components/{layout-and-navigation → layout}/FloatingContainer.js +2 -2
  110. package/dist/components/layout/FloatingContainer.js.map +1 -0
  111. package/dist/components/{layout-and-navigation → layout}/FloatingContainer.mjs +2 -2
  112. package/dist/components/layout/FloatingContainer.mjs.map +1 -0
  113. package/dist/components/{layout-and-navigation → layout}/ListBox.js +2 -2
  114. package/dist/components/layout/ListBox.js.map +1 -0
  115. package/dist/components/{layout-and-navigation → layout}/ListBox.mjs +2 -2
  116. package/dist/components/layout/ListBox.mjs.map +1 -0
  117. package/dist/components/{layout-and-navigation → layout}/MarkdownInterpreter.js +1 -1
  118. package/dist/components/layout/MarkdownInterpreter.js.map +1 -0
  119. package/dist/components/{layout-and-navigation → layout}/MarkdownInterpreter.mjs +1 -1
  120. package/dist/components/layout/MarkdownInterpreter.mjs.map +1 -0
  121. package/dist/components/{layout-and-navigation → layout}/ScrollArea.js +2 -2
  122. package/dist/components/layout/ScrollArea.js.map +1 -0
  123. package/dist/components/{layout-and-navigation → layout}/ScrollArea.mjs +1 -1
  124. package/dist/components/layout/ScrollArea.mjs.map +1 -0
  125. package/dist/components/{layout-and-navigation → layout}/TextImage.js +3 -3
  126. package/dist/components/layout/TextImage.js.map +1 -0
  127. package/dist/components/{layout-and-navigation → layout}/TextImage.mjs +2 -2
  128. package/dist/components/layout/TextImage.mjs.map +1 -0
  129. package/dist/components/{layout-and-navigation → layout}/VerticalDivider.js +1 -1
  130. package/dist/components/layout/VerticalDivider.js.map +1 -0
  131. package/dist/components/{layout-and-navigation → layout}/VerticalDivider.mjs +1 -1
  132. package/dist/components/layout/VerticalDivider.mjs.map +1 -0
  133. package/dist/components/layout/index.d.mts +18 -0
  134. package/dist/components/layout/index.d.ts +18 -0
  135. package/dist/components/layout/index.js +3111 -0
  136. package/dist/components/layout/index.js.map +1 -0
  137. package/dist/components/layout/index.mjs +3064 -0
  138. package/dist/components/layout/index.mjs.map +1 -0
  139. package/dist/components/loading-states/index.d.mts +12 -0
  140. package/dist/components/loading-states/index.d.ts +12 -0
  141. package/dist/components/loading-states/index.js +614 -0
  142. package/dist/components/loading-states/index.js.map +1 -0
  143. package/dist/components/loading-states/index.mjs +573 -0
  144. package/dist/components/loading-states/index.mjs.map +1 -0
  145. package/dist/components/{layout-and-navigation → navigation}/BreadCrumb.js +1 -1
  146. package/dist/components/navigation/BreadCrumb.js.map +1 -0
  147. package/dist/components/{layout-and-navigation → navigation}/BreadCrumb.mjs +1 -1
  148. package/dist/components/navigation/BreadCrumb.mjs.map +1 -0
  149. package/dist/components/navigation/Navigation.d.mts +21 -0
  150. package/dist/components/navigation/Navigation.d.ts +21 -0
  151. package/dist/components/navigation/Navigation.js +4018 -0
  152. package/dist/components/navigation/Navigation.js.map +1 -0
  153. package/dist/components/navigation/Navigation.mjs +4012 -0
  154. package/dist/components/navigation/Navigation.mjs.map +1 -0
  155. package/dist/components/{layout-and-navigation → navigation}/Pagination.js +3 -3
  156. package/dist/components/navigation/Pagination.js.map +1 -0
  157. package/dist/components/{layout-and-navigation → navigation}/Pagination.mjs +3 -3
  158. package/dist/components/navigation/Pagination.mjs.map +1 -0
  159. package/dist/components/{layout-and-navigation → navigation}/StepperBar.js +3 -3
  160. package/dist/components/navigation/StepperBar.js.map +1 -0
  161. package/dist/components/{layout-and-navigation → navigation}/StepperBar.mjs +3 -3
  162. package/dist/components/navigation/StepperBar.mjs.map +1 -0
  163. package/dist/components/navigation/index.d.mts +9 -0
  164. package/dist/components/navigation/index.d.ts +9 -0
  165. package/dist/components/navigation/index.js +4660 -0
  166. package/dist/components/navigation/index.js.map +1 -0
  167. package/dist/components/navigation/index.mjs +4648 -0
  168. package/dist/components/navigation/index.mjs.map +1 -0
  169. package/dist/components/properties/MultiSelectProperty.js +27 -14
  170. package/dist/components/properties/MultiSelectProperty.js.map +1 -1
  171. package/dist/components/properties/MultiSelectProperty.mjs +27 -14
  172. package/dist/components/properties/MultiSelectProperty.mjs.map +1 -1
  173. package/dist/components/properties/SelectProperty.js +27 -14
  174. package/dist/components/properties/SelectProperty.js.map +1 -1
  175. package/dist/components/properties/SelectProperty.mjs +27 -14
  176. package/dist/components/properties/SelectProperty.mjs.map +1 -1
  177. package/dist/components/properties/index.d.mts +12 -0
  178. package/dist/components/properties/index.d.ts +12 -0
  179. package/dist/components/properties/index.js +2983 -0
  180. package/dist/components/properties/index.js.map +1 -0
  181. package/dist/components/properties/index.mjs +2951 -0
  182. package/dist/components/properties/index.mjs.map +1 -0
  183. package/dist/components/table/Table.js +1 -1
  184. package/dist/components/table/Table.js.map +1 -1
  185. package/dist/components/table/Table.mjs +1 -1
  186. package/dist/components/table/Table.mjs.map +1 -1
  187. package/dist/components/table/index.d.mts +10 -0
  188. package/dist/components/table/index.d.ts +10 -0
  189. package/dist/components/table/index.js +2329 -0
  190. package/dist/components/table/index.js.map +1 -0
  191. package/dist/components/table/index.mjs +2293 -0
  192. package/dist/components/table/index.mjs.map +1 -0
  193. package/dist/components/user-action/DateAndTimePicker.js +1 -1
  194. package/dist/components/user-action/DateAndTimePicker.js.map +1 -1
  195. package/dist/components/user-action/DateAndTimePicker.mjs +1 -1
  196. package/dist/components/user-action/DateAndTimePicker.mjs.map +1 -1
  197. package/dist/components/user-action/index.d.mts +30 -0
  198. package/dist/components/user-action/index.d.ts +30 -0
  199. package/dist/components/user-action/index.js +4257 -0
  200. package/dist/components/user-action/index.js.map +1 -0
  201. package/dist/components/user-action/index.mjs +4195 -0
  202. package/dist/components/user-action/index.mjs.map +1 -0
  203. package/dist/components/user-action/input/index.d.mts +6 -0
  204. package/dist/components/user-action/input/index.d.ts +6 -0
  205. package/dist/components/user-action/input/index.js +398 -0
  206. package/dist/components/user-action/input/index.js.map +1 -0
  207. package/dist/components/user-action/input/index.mjs +357 -0
  208. package/dist/components/user-action/input/index.mjs.map +1 -0
  209. package/dist/components/user-action/select/Select.d.mts +5 -1
  210. package/dist/components/user-action/select/Select.d.ts +5 -1
  211. package/dist/components/user-action/select/Select.js +27 -14
  212. package/dist/components/user-action/select/Select.js.map +1 -1
  213. package/dist/components/user-action/select/Select.mjs +27 -14
  214. package/dist/components/user-action/select/Select.mjs.map +1 -1
  215. package/dist/components/user-action/select/index.d.mts +4 -0
  216. package/dist/components/user-action/select/index.d.ts +4 -0
  217. package/dist/components/user-action/select/index.js +1369 -0
  218. package/dist/components/user-action/select/index.js.map +1 -0
  219. package/dist/components/user-action/select/index.mjs +1333 -0
  220. package/dist/components/user-action/select/index.mjs.map +1 -0
  221. package/dist/components/utils/index.d.mts +4 -0
  222. package/dist/components/utils/index.d.ts +4 -0
  223. package/dist/components/utils/index.js +302 -0
  224. package/dist/components/utils/index.js.map +1 -0
  225. package/dist/components/utils/index.mjs +275 -0
  226. package/dist/components/utils/index.mjs.map +1 -0
  227. package/dist/hooks/focus/index.d.mts +6 -0
  228. package/dist/hooks/focus/index.d.ts +6 -0
  229. package/dist/hooks/focus/index.js +379 -0
  230. package/dist/hooks/focus/index.js.map +1 -0
  231. package/dist/hooks/focus/index.mjs +339 -0
  232. package/dist/hooks/focus/index.mjs.map +1 -0
  233. package/dist/hooks/index.d.mts +16 -0
  234. package/dist/hooks/index.d.ts +16 -0
  235. package/dist/hooks/index.js +844 -0
  236. package/dist/hooks/index.js.map +1 -0
  237. package/dist/hooks/index.mjs +794 -0
  238. package/dist/hooks/index.mjs.map +1 -0
  239. package/dist/index.d.mts +110 -0
  240. package/dist/index.d.ts +110 -0
  241. package/dist/index.js +16101 -0
  242. package/dist/index.js.map +1 -0
  243. package/dist/index.mjs +15941 -0
  244. package/dist/index.mjs.map +1 -0
  245. package/dist/localization/defaults/index.d.mts +4 -0
  246. package/dist/localization/defaults/index.d.ts +4 -0
  247. package/dist/localization/defaults/index.js +223 -0
  248. package/dist/localization/defaults/index.js.map +1 -0
  249. package/dist/localization/defaults/index.mjs +195 -0
  250. package/dist/localization/defaults/index.mjs.map +1 -0
  251. package/dist/localization/index.d.mts +7 -0
  252. package/dist/localization/index.d.ts +7 -0
  253. package/dist/localization/index.js +415 -0
  254. package/dist/localization/index.js.map +1 -0
  255. package/dist/localization/index.mjs +380 -0
  256. package/dist/localization/index.mjs.map +1 -0
  257. package/dist/style/globals.css +63 -10
  258. package/dist/style/uncompiled/globals.css +5 -4
  259. package/dist/style/uncompiled/utitlity/shadow.css +4 -0
  260. package/dist/theming/index.d.mts +5 -0
  261. package/dist/theming/index.d.ts +5 -0
  262. package/dist/theming/index.js +174 -0
  263. package/dist/theming/index.js.map +1 -0
  264. package/dist/theming/index.mjs +145 -0
  265. package/dist/theming/index.mjs.map +1 -0
  266. package/dist/theming/useTheme.d.mts +3 -1
  267. package/dist/theming/useTheme.d.ts +3 -1
  268. package/dist/theming/useTheme.js +40 -17
  269. package/dist/theming/useTheme.js.map +1 -1
  270. package/dist/theming/useTheme.mjs +38 -15
  271. package/dist/theming/useTheme.mjs.map +1 -1
  272. package/dist/utils/index.d.mts +15 -0
  273. package/dist/utils/index.d.ts +15 -0
  274. package/dist/utils/index.js +553 -0
  275. package/dist/utils/index.js.map +1 -0
  276. package/dist/utils/index.mjs +493 -0
  277. package/dist/utils/index.mjs.map +1 -0
  278. package/package.json +25 -24
  279. package/dist/components/layout-and-navigation/BreadCrumb.js.map +0 -1
  280. package/dist/components/layout-and-navigation/BreadCrumb.mjs.map +0 -1
  281. package/dist/components/layout-and-navigation/Carousel.d.mts +0 -25
  282. package/dist/components/layout-and-navigation/Carousel.d.ts +0 -25
  283. package/dist/components/layout-and-navigation/Carousel.js +0 -643
  284. package/dist/components/layout-and-navigation/Carousel.js.map +0 -1
  285. package/dist/components/layout-and-navigation/Carousel.mjs +0 -609
  286. package/dist/components/layout-and-navigation/Carousel.mjs.map +0 -1
  287. package/dist/components/layout-and-navigation/Chip.js.map +0 -1
  288. package/dist/components/layout-and-navigation/Chip.mjs.map +0 -1
  289. package/dist/components/layout-and-navigation/DividerInserter.js.map +0 -1
  290. package/dist/components/layout-and-navigation/DividerInserter.mjs.map +0 -1
  291. package/dist/components/layout-and-navigation/Expandable.js.map +0 -1
  292. package/dist/components/layout-and-navigation/Expandable.mjs.map +0 -1
  293. package/dist/components/layout-and-navigation/FAQSection.js.map +0 -1
  294. package/dist/components/layout-and-navigation/FAQSection.mjs.map +0 -1
  295. package/dist/components/layout-and-navigation/FloatingContainer.js.map +0 -1
  296. package/dist/components/layout-and-navigation/FloatingContainer.mjs.map +0 -1
  297. package/dist/components/layout-and-navigation/ListBox.js.map +0 -1
  298. package/dist/components/layout-and-navigation/ListBox.mjs.map +0 -1
  299. package/dist/components/layout-and-navigation/MarkdownInterpreter.js.map +0 -1
  300. package/dist/components/layout-and-navigation/MarkdownInterpreter.mjs.map +0 -1
  301. package/dist/components/layout-and-navigation/Pagination.js.map +0 -1
  302. package/dist/components/layout-and-navigation/Pagination.mjs.map +0 -1
  303. package/dist/components/layout-and-navigation/ScrollArea.js.map +0 -1
  304. package/dist/components/layout-and-navigation/ScrollArea.mjs.map +0 -1
  305. package/dist/components/layout-and-navigation/StepperBar.js.map +0 -1
  306. package/dist/components/layout-and-navigation/StepperBar.mjs.map +0 -1
  307. package/dist/components/layout-and-navigation/TextImage.js.map +0 -1
  308. package/dist/components/layout-and-navigation/TextImage.mjs.map +0 -1
  309. package/dist/components/layout-and-navigation/VerticalDivider.js.map +0 -1
  310. package/dist/components/layout-and-navigation/VerticalDivider.mjs.map +0 -1
  311. /package/dist/components/{layout-and-navigation → layout}/Chip.d.mts +0 -0
  312. /package/dist/components/{layout-and-navigation → layout}/Chip.d.ts +0 -0
  313. /package/dist/components/{layout-and-navigation → layout}/DividerInserter.d.mts +0 -0
  314. /package/dist/components/{layout-and-navigation → layout}/DividerInserter.d.ts +0 -0
  315. /package/dist/components/{layout-and-navigation → layout}/Expandable.d.mts +0 -0
  316. /package/dist/components/{layout-and-navigation → layout}/Expandable.d.ts +0 -0
  317. /package/dist/components/{layout-and-navigation → layout}/FAQSection.d.mts +0 -0
  318. /package/dist/components/{layout-and-navigation → layout}/FAQSection.d.ts +0 -0
  319. /package/dist/components/{layout-and-navigation → layout}/FloatingContainer.d.mts +0 -0
  320. /package/dist/components/{layout-and-navigation → layout}/FloatingContainer.d.ts +0 -0
  321. /package/dist/components/{layout-and-navigation → layout}/ListBox.d.mts +0 -0
  322. /package/dist/components/{layout-and-navigation → layout}/ListBox.d.ts +0 -0
  323. /package/dist/components/{layout-and-navigation → layout}/MarkdownInterpreter.d.mts +0 -0
  324. /package/dist/components/{layout-and-navigation → layout}/MarkdownInterpreter.d.ts +0 -0
  325. /package/dist/components/{layout-and-navigation → layout}/ScrollArea.d.mts +0 -0
  326. /package/dist/components/{layout-and-navigation → layout}/ScrollArea.d.ts +0 -0
  327. /package/dist/components/{layout-and-navigation → layout}/TextImage.d.mts +0 -0
  328. /package/dist/components/{layout-and-navigation → layout}/TextImage.d.ts +0 -0
  329. /package/dist/components/{layout-and-navigation → layout}/VerticalDivider.d.mts +0 -0
  330. /package/dist/components/{layout-and-navigation → layout}/VerticalDivider.d.ts +0 -0
  331. /package/dist/components/{layout-and-navigation → navigation}/BreadCrumb.d.mts +0 -0
  332. /package/dist/components/{layout-and-navigation → navigation}/BreadCrumb.d.ts +0 -0
  333. /package/dist/components/{layout-and-navigation → navigation}/Pagination.d.mts +0 -0
  334. /package/dist/components/{layout-and-navigation → navigation}/Pagination.d.ts +0 -0
  335. /package/dist/components/{layout-and-navigation → navigation}/StepperBar.d.mts +0 -0
  336. /package/dist/components/{layout-and-navigation → navigation}/StepperBar.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/user-action/select/Select.tsx","../../../../src/localization/LanguageProvider.tsx","../../../../src/hooks/useLocalStorage.ts","../../../../src/localization/util.ts","../../../../src/localization/useTranslation.ts","../../../../src/components/layout-and-navigation/Expandable.tsx","../../../../src/utils/noop.ts","../../../../src/hooks/focus/useFocusTrap.ts","../../../../src/hooks/focus/useIsMounted.ts","../../../../src/utils/match.ts","../../../../src/components/layout-and-navigation/Chip.tsx","../../../../src/components/user-action/Button.tsx","../../../../src/hooks/useFloatingElement.ts","../../../../src/utils/math.ts"],"sourcesContent":["import type { ButtonHTMLAttributes, HTMLAttributes, PropsWithChildren, ReactNode } from 'react'\nimport React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState\n} from 'react'\nimport clsx from 'clsx'\nimport type { Translation } from '@/src/localization/useTranslation'\nimport { useTranslation } from '@/src/localization/useTranslation'\nimport { ExpansionIcon } from '@/src/components/layout-and-navigation/Expandable'\nimport { useFocusTrap } from '@/src/hooks/focus/useFocusTrap'\nimport { match } from '@/src/utils/match'\nimport { CheckIcon, Plus, XIcon } from 'lucide-react'\nimport { Chip } from '@/src/components/layout-and-navigation/Chip'\nimport { IconButton } from '@/src/components/user-action/Button'\nimport type { UseFloatingElementOptions } from '@/src/hooks/useFloatingElement'\nimport { useFloatingElement } from '@/src/hooks/useFloatingElement'\nimport { createPortal } from 'react-dom'\n\n//\n// Context\n//\ntype RegisteredOption = {\n value: string,\n disabled: boolean,\n ref: React.RefObject<HTMLLIElement>,\n}\n\ntype HighlightPosition = 'first' | 'last'\n\ntype InternalSelectContextState = {\n isOpen: boolean,\n highlightedValue?: string,\n}\n\ntype SelectContextState = InternalSelectContextState & {\n id: string,\n value: string[],\n disabled: boolean,\n invalid: boolean,\n isMultiSelect: boolean,\n}\n\ntype ToggleOpenOptions = {\n highlightStartPosition?: HighlightPosition,\n}\n\nconst defaultToggleOpenOptions: ToggleOpenOptions = {\n highlightStartPosition: 'first',\n}\n\ntype SelectContextType = {\n state: SelectContextState,\n item: {\n register: (item: RegisteredOption) => void,\n unregister: (value: string) => void,\n toggleSelection: (value: string, isSelected?: boolean) => void,\n highlightItem: (value: string) => void,\n moveHighlightedIndex: (delta: number) => void,\n },\n trigger: {\n ref: React.RefObject<HTMLElement>,\n register: (element: React.RefObject<HTMLElement>) => void,\n unregister: () => void,\n toggleOpen: (isOpen?: boolean, options?: ToggleOpenOptions) => void,\n },\n}\n\nconst SelectContext = createContext<SelectContextType | null>(null)\n\nfunction useSelectContext() {\n const ctx = useContext(SelectContext)\n if (!ctx) {\n throw new Error('SelectContext must be used within a ListBoxPrimitive')\n }\n return ctx\n}\n\n\n//\n// SelectRoot\n//\nexport type SelectRootProps = PropsWithChildren<{\n id?: string,\n value?: string,\n onValueChanged?: (value: string) => void,\n values?: string[],\n onValuesChanged?: (value: string[]) => void,\n isOpen?: boolean,\n disabled?: boolean,\n invalid?: boolean,\n isMultiSelect?: boolean,\n}>\n\nexport const SelectRoot = ({\n children,\n id,\n value,\n onValueChanged,\n values,\n onValuesChanged,\n isOpen = false,\n disabled = false,\n invalid = false,\n isMultiSelect = false,\n }: SelectRootProps) => {\n const optionsRef = useRef<RegisteredOption[]>([])\n const triggerRef = useRef<HTMLElement>(null)\n const generatedId = useId()\n const usedId = id ?? generatedId\n\n const [internalState, setInternalState] = useState<InternalSelectContextState>({\n isOpen,\n })\n\n const state: SelectContextState = {\n ...internalState,\n id: usedId,\n disabled,\n invalid,\n value: isMultiSelect ? (values ?? []) : [value].filter(Boolean),\n isMultiSelect,\n }\n\n const registerItem = useCallback((item: RegisteredOption) => {\n optionsRef.current.push(item)\n optionsRef.current.sort((a, b) => {\n const aEl = a.ref.current\n const bEl = b.ref.current\n if (!aEl || !bEl) return 0\n return aEl.compareDocumentPosition(bEl) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1\n })\n }, [])\n\n const unregisterItem = useCallback((value: string) => {\n optionsRef.current = optionsRef.current.filter(i => i.value !== value)\n }, [])\n\n // Setting isSelected to false only works for multiselects\n const toggleSelection = (value: string, isSelected?: boolean) => {\n if (disabled) {\n return\n }\n const option = optionsRef.current.find(i => i.value === value)\n if (!option) {\n console.error(`SelectOption with value: ${value} not found`)\n return\n }\n\n let newValue: string[]\n if (isMultiSelect) {\n const isSelectedBefore = state.value.includes(value)\n const isSelectedAfter = isSelected ?? !isSelectedBefore\n if (!isSelectedAfter) {\n newValue = state.value.filter(v => v !== value)\n } else {\n newValue = [...state.value, value]\n }\n } else {\n newValue = [value]\n }\n\n if (!isMultiSelect) {\n onValueChanged?.(newValue[0])\n } else {\n onValuesChanged?.(newValue)\n }\n\n setInternalState(prevState => ({\n ...prevState,\n highlightedValue: value,\n }))\n }\n\n const highlightItem = (value: string) => {\n if (disabled) {\n return\n }\n setInternalState(prevState => ({\n ...prevState,\n highlightedValue: value,\n }))\n }\n\n const registerTrigger = useCallback((ref: React.RefObject<HTMLElement>) => {\n triggerRef.current = ref.current\n }, [])\n\n const unregisterTrigger = useCallback(() => {\n triggerRef.current = null\n }, [])\n\n const toggleOpen = (isOpen?: boolean, options?: ToggleOpenOptions) => {\n const { highlightStartPosition } = { ...defaultToggleOpenOptions, ...options }\n let highlightedIndex: number\n if (highlightStartPosition === 'first') {\n highlightedIndex = optionsRef.current.findIndex(option => !option.disabled)\n } else {\n highlightedIndex = optionsRef.current.length - 1 - [...optionsRef.current].reverse().findIndex(option => !option.disabled)\n }\n if (highlightedIndex === -1 || highlightedIndex === optionsRef.current.length) {\n highlightedIndex = 0\n }\n setInternalState(prevState => ({\n ...prevState,\n isOpen: isOpen ?? !prevState.isOpen,\n highlightedValue: optionsRef.current[highlightedIndex].value,\n }))\n }\n\n const moveHighlightedIndex = (delta: number) => {\n let highlightedIndex = optionsRef.current.findIndex(value => value.value === internalState.highlightedValue)\n if (highlightedIndex === -1) {\n highlightedIndex = 0\n }\n const optionLength = optionsRef.current.length\n const startIndex = (highlightedIndex + (delta % optionLength) + optionLength) % optionLength\n const isForward = delta >= 0\n let highlightedValue = optionsRef.current[startIndex].value\n for (let i = 0; i < optionsRef.current.length; i++) {\n const index = (startIndex + (isForward ? i : -i) + optionLength) % optionLength\n if (!optionsRef.current[index].disabled) {\n highlightedValue = optionsRef.current[index].value\n break\n }\n }\n\n setInternalState(prevState => ({\n ...prevState,\n highlightedValue,\n }))\n }\n\n useEffect(() => {\n if (!internalState.highlightedValue) return\n const highlighted = optionsRef.current.find(value => value.value === internalState.highlightedValue)\n if (highlighted) {\n highlighted.ref.current.scrollIntoView({ behavior: 'instant', block: 'nearest' })\n } else {\n console.error(`SelectRoot: Could not find highlighted value (${internalState.highlightedValue})`)\n }\n }, [internalState.highlightedValue])\n\n const contextValue: SelectContextType = {\n state,\n item: {\n register: registerItem,\n unregister: unregisterItem,\n toggleSelection,\n highlightItem,\n moveHighlightedIndex,\n },\n trigger: {\n ref: triggerRef,\n register: registerTrigger,\n unregister: unregisterTrigger,\n toggleOpen,\n },\n }\n\n return (\n <SelectContext.Provider value={contextValue}>\n {children}\n </SelectContext.Provider>\n )\n}\n\n//\n// SelectOption\n//\nexport type SelectOptionProps = Omit<HTMLAttributes<HTMLLIElement>, 'children'> & {\n value: string,\n disabled?: boolean,\n children?: ReactNode,\n}\n\nexport const SelectOption = forwardRef<HTMLLIElement, SelectOptionProps>(\n function SelectOption({ value, disabled = false, children, className, ...restProps }, ref) {\n const { state, item, trigger } = useSelectContext()\n const { register, unregister, toggleSelection, highlightItem } = item\n const itemRef = useRef<HTMLLIElement>(null)\n\n // Register with parent\n useEffect(() => {\n register({\n value,\n disabled,\n ref: itemRef,\n })\n return () => unregister(value)\n }, [value, disabled, register, unregister, children])\n\n const isHighlighted = state.highlightedValue === value\n const isSelected = state.value.includes(value)\n\n return (\n <li\n {...restProps}\n ref={(node) => {\n itemRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLLIElement | null>).current = node\n }}\n id={value}\n role=\"option\"\n aria-disabled={disabled}\n aria-selected={isSelected}\n data-highlighted={isHighlighted ? '' : undefined}\n data-selected={isSelected ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n className={clsx(\n 'flex-row-1 items-center px-2 py-1 rounded-md',\n 'data-highlighted:bg-primary/20',\n 'data-disabled:text-disabled data-disabled:cursor-not-allowed',\n 'not-data-disabled:cursor-pointer',\n className\n )}\n onClick={(event) => {\n if (!disabled) {\n toggleSelection(value)\n if (!state.isMultiSelect) {\n trigger.toggleOpen(false)\n }\n restProps.onClick?.(event)\n }\n }}\n onMouseEnter={(event) => {\n if (!disabled) {\n highlightItem(value)\n restProps.onMouseEnter?.(event)\n }\n }}\n >\n <CheckIcon\n className={clsx('w-4 h-4', { 'opacity-0': !isSelected || disabled })}\n aria-hidden={true}\n />\n {children ?? value}\n </li>\n )\n }\n)\n\n///\n/// SelectButton\n///\ntype SelectButtonTranslationType = {\n clickToSelect: string,\n}\n\nconst defaultSelectButtonTranslation: Translation<SelectButtonTranslationType> = {\n en: {\n clickToSelect: 'Click to select',\n\n },\n de: {\n clickToSelect: 'Zum auswählen drücken'\n }\n}\n\ntype SelectButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n placeholder?: ReactNode,\n selectedDisplay?: (value: string[]) => ReactNode,\n}\n\nexport const SelectButton = forwardRef<HTMLButtonElement, SelectButtonProps>(function SelectButton(\n { placeholder, selectedDisplay, ...props }, ref\n) {\n const translation = useTranslation([defaultSelectButtonTranslation])\n const { state, trigger } = useSelectContext()\n const { register, unregister, toggleOpen } = trigger\n\n const innerRef = useRef<HTMLButtonElement>(null)\n useImperativeHandle(ref, () => innerRef.current)\n\n useEffect(() => {\n register(innerRef)\n return () => unregister()\n }, [register, unregister])\n\n const disabled = !!props?.disabled || !!state.disabled\n const invalid = state.invalid\n const hasValue = state.value.length > 0\n\n return (\n <button\n {...props}\n ref={innerRef}\n id={state.id} // TODO allow for a custom id here\n className={clsx(\n 'flex-row-2 items-center justify-between bg-input-background text-input-text rounded-md px-2.5 py-2.5',\n 'data-placeholder:text-description',\n props.className\n )}\n onClick={() => toggleOpen(!state.isOpen)}\n onKeyDown={event => {\n switch (event.key) {\n case 'ArrowDown':\n toggleOpen(true, { highlightStartPosition: 'first' })\n break\n case 'ArrowUp':\n toggleOpen(true, { highlightStartPosition: 'last' })\n break\n }\n }}\n\n data-placeholder={!hasValue ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n data-invalid={invalid ? '' : undefined}\n\n aria-invalid={invalid}\n aria-disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={state.isOpen}\n aria-controls={state.isOpen ? `${state.id}-listbox` : undefined}\n >\n {hasValue ?\n selectedDisplay?.(state.value) ?? state.value.join(', ')\n : placeholder ?? translation('clickToSelect')\n }\n <ExpansionIcon isExpanded={state.isOpen}/>\n </button>\n )\n})\n\n///\n/// SelectChipDisplay\n///\ntype SelectChipDisplayProps = HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean,\n placeholder?: ReactNode,\n}\n\nexport const SelectChipDisplay = forwardRef<HTMLDivElement, SelectChipDisplayProps>(function SelectChipDisplay(\n { ...props }, ref\n) {\n const { state, trigger, item } = useSelectContext()\n const { register, unregister, toggleOpen } = trigger\n\n const innerRef = useRef<HTMLDivElement>(null)\n useImperativeHandle(ref, () => innerRef.current)\n\n useEffect(() => {\n register(innerRef)\n return () => unregister()\n }, [register, unregister])\n\n const disabled = !!props?.disabled || !!state.disabled\n const invalid = state.invalid\n\n return (\n <div\n {...props}\n ref={innerRef}\n className={clsx(\n 'flex flex-wrap flex-row gap-2 items-center bg-input-background text-input-text rounded-md px-2.5 py-2.5',\n props.className\n )}\n data-disabled={disabled ? '' : undefined}\n data-invalid={invalid ? '' : undefined}\n\n aria-invalid={invalid}\n aria-disabled={disabled}\n >\n {state.value.map((value) => (\n <Chip key={value} className=\"gap-x-2\">\n {value}\n <button\n // TODO add label to indicate purpose to screen reader\n onClick={() => {\n item.toggleSelection(value, false)\n }}\n className=\"focus-within:text-negative hover:bg-negative/20 hover:text-negative rounded-md focus-style-none focus-visible:ring-2 focus-visible:ring-negative focus-visible:bg-negative/20\"\n >\n <XIcon/>\n </button>\n </Chip>\n ))}\n <IconButton\n id={state.id} // TODO allow for a custom id here\n onClick={() => toggleOpen()}\n onKeyDown={event => {\n switch (event.key) {\n case 'ArrowDown':\n toggleOpen(true, { highlightStartPosition: 'first' })\n break\n case 'ArrowUp':\n toggleOpen(true, { highlightStartPosition: 'last' })\n }\n }}\n size=\"small\"\n color=\"neutral\"\n\n aria-invalid={invalid}\n aria-disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={state.isOpen}\n aria-controls={state.isOpen ? `${state.id}-listbox` : undefined}\n >\n <Plus/>\n </IconButton>\n </div>\n )\n})\n\n\n///\n/// SelectContent\n///\ntype Orientation = 'vertical' | 'horizontal'\n\nexport type SelectContentProps = HTMLAttributes<HTMLUListElement> & {\n alignment?: Pick<UseFloatingElementOptions, 'gap' | 'horizontalAlignment' | 'verticalAlignment'>,\n orientation?: Orientation,\n}\n\nexport const SelectContent = forwardRef<HTMLUListElement, SelectContentProps>(\n function SelectContent({\n alignment,\n orientation = 'vertical',\n ...props\n }, ref) {\n const innerRef = useRef<HTMLUListElement | null>(null)\n useImperativeHandle(ref, () => innerRef.current)\n\n const { trigger, state, item } = useSelectContext()\n\n const position = useFloatingElement({\n active: state.isOpen,\n anchorRef: trigger.ref,\n containerRef: innerRef,\n ...alignment,\n })\n\n useFocusTrap({\n container: innerRef,\n active: state.isOpen && !!position,\n })\n\n return createPortal(\n <>\n <div\n hidden={!state.isOpen}\n onClick={() => trigger.toggleOpen(false)}\n className={clsx('fixed w-screen h-screen inset-0')}\n />\n <ul\n {...props}\n id={`${state.id}-listbox`}\n ref={innerRef}\n hidden={!state.isOpen}\n onKeyDown={(event) => {\n switch (event.key) {\n case 'Escape':\n trigger.toggleOpen(false)\n event.preventDefault()\n event.stopPropagation()\n break\n case match(orientation, {\n vertical: 'ArrowDown',\n horizontal: 'ArrowUp'\n }):\n item.moveHighlightedIndex(1)\n event.preventDefault()\n break\n case match(orientation, {\n vertical: 'ArrowUp',\n horizontal: 'ArrowDown'\n }):\n item.moveHighlightedIndex(-1)\n event.preventDefault()\n break\n case 'Home':\n // TODO support later by selecting the first not disabled entry\n event.preventDefault()\n break\n case 'End':\n // TODO support later by selecting the last not disabled entry\n event.preventDefault()\n break\n case 'Enter': // Fall through\n case ' ':\n if (state.highlightedValue) {\n item.toggleSelection(state.highlightedValue)\n if (!state.isMultiSelect) {\n trigger.toggleOpen(false)\n }\n event.preventDefault()\n }\n break\n }\n }}\n\n className={clsx('flex-col-0 p-2 bg-menu-background text-menu-text rounded-md shadow-hw-bottom focus-style-within overflow-auto', props.className)}\n style={{\n opacity: position ? undefined : 0,\n position: 'fixed',\n ...position\n }}\n\n role=\"listbox\"\n aria-multiselectable={state.isMultiSelect}\n aria-orientation={orientation}\n tabIndex={position ? 0 : undefined}\n >\n {props.children}\n </ul>\n </>, document.body\n )\n }\n)\n\n//\n// Select\n//\nexport type SelectProps = Omit<SelectRootProps, 'isMultiSelect' | 'values' | 'onValuesChanged'> & {\n contentPanelProps?: SelectContentProps,\n buttonProps?: Omit<SelectButtonProps, 'selectedDisplay'> & { selectedDisplay?: (value: string) => ReactNode },\n}\n\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(function Select({\n children,\n contentPanelProps,\n buttonProps,\n ...props\n }, ref) {\n return (\n <SelectRoot {...props} isMultiSelect={false}>\n <SelectButton\n ref={ref}\n {...buttonProps}\n selectedDisplay={values => {\n const value = values[0]\n if(!buttonProps?.selectedDisplay) return undefined\n return buttonProps.selectedDisplay(value)\n }}\n />\n <SelectContent {...contentPanelProps}>{children}</SelectContent>\n </SelectRoot>\n )\n})\n\n\nexport type SelectUncontrolledProps = SelectProps\nexport const SelectUncontrolled = forwardRef<HTMLButtonElement, SelectUncontrolledProps>(function SelectUncontrolled({\n value: initialValue,\n onValueChanged,\n ...props\n }, ref) {\n const [value, setValue] = useState(initialValue)\n\n useEffect(() => {\n setValue(initialValue)\n }, [initialValue])\n\n return (\n <Select\n {...props}\n ref={ref}\n value={value}\n onValueChanged={value => {\n setValue(value)\n onValueChanged?.(value)\n }}\n />\n )\n})\n\n\n//\n// MultiSelect\n//\nexport type MultiSelectProps = Omit<SelectRootProps, 'isMultiSelect' | 'value' | 'onValueChanged'> & {\n contentPanelProps?: SelectContentProps,\n buttonProps?: SelectButtonProps,\n}\n\nexport const MultiSelect = forwardRef<HTMLButtonElement, MultiSelectProps>(function MultiSelect({\n children,\n contentPanelProps,\n buttonProps,\n ...props\n }, ref) {\n return (\n <SelectRoot {...props} isMultiSelect={true}>\n <SelectButton ref={ref} {...buttonProps} />\n <SelectContent {...contentPanelProps}>{children}</SelectContent>\n </SelectRoot>\n )\n})\n\n\nexport type MultiSelectUncontrolledProps = MultiSelectProps\nexport const MultiSelectUncontrolled = forwardRef<HTMLButtonElement, MultiSelectUncontrolledProps>(function MultiSelectUncontrolled({\n values: initialValues,\n onValuesChanged,\n ...props\n }, ref) {\n const [values, setValues] = useState(initialValues)\n\n useEffect(() => {\n setValues(initialValues)\n }, [initialValues])\n\n return (\n <MultiSelect\n {...props}\n ref={ref}\n values={values}\n onValuesChanged={value => {\n setValues(value)\n onValuesChanged?.(value)\n }}\n />\n )\n})\n\n\n//\n// MultiSelectChipDisplay\n//\nexport type MultiSelectChipDisplayProps = Omit<SelectRootProps, 'isMultiSelect' | 'value' | 'onValueChanged'> & {\n contentPanelProps?: SelectContentProps,\n chipDisplayProps?: SelectChipDisplayProps,\n}\n\nexport const MultiSelectChipDisplay = forwardRef<HTMLDivElement, MultiSelectChipDisplayProps>(function MultiSelectChipDisplay({\n children,\n contentPanelProps,\n chipDisplayProps,\n ...props\n }, ref) {\n return (\n <SelectRoot {...props} isMultiSelect={true}>\n <SelectChipDisplay ref={ref} {...chipDisplayProps} />\n <SelectContent {...contentPanelProps}>{children}</SelectContent>\n </SelectRoot>\n )\n})\n\n\nexport type MultiSelectChipDisplayUncontrolledProps = MultiSelectChipDisplayProps\nexport const MultiSelectChipDisplayUncontrolled = forwardRef<HTMLDivElement, MultiSelectChipDisplayUncontrolledProps>(function MultiSelectChipDisplayUncontrolled({\n values: initialValues,\n onValuesChanged,\n ...props\n }, ref) {\n const [values, setValues] = useState(initialValues)\n\n useEffect(() => {\n setValues(initialValues)\n }, [initialValues])\n\n return (\n <MultiSelectChipDisplay\n {...props}\n ref={ref}\n values={values}\n onValuesChanged={value => {\n setValues(value)\n onValuesChanged?.(value)\n }}\n />\n )\n})","import type { Dispatch, PropsWithChildren, SetStateAction } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { useLocalStorage } from '../hooks/useLocalStorage'\nimport type { Language } from './util'\nimport { LanguageUtil } from './util'\n\nexport type LanguageContextValue = {\n language: Language,\n setLanguage: Dispatch<SetStateAction<Language>>,\n}\n\nexport const LanguageContext = createContext<LanguageContextValue>({\n language: LanguageUtil.DEFAULT_LANGUAGE,\n setLanguage: (v) => v\n})\n\nexport const useLanguage = () => useContext(LanguageContext)\n\nexport const useLocale = (overWriteLanguage?: Language) => {\n const { language } = useLanguage()\n const mapping: Record<Language, string> = {\n en: 'en-US',\n de: 'de-DE'\n }\n return mapping[overWriteLanguage ?? language]\n}\n\ntype LanguageProviderProps = {\n initialLanguage?: Language,\n}\n\nexport const LanguageProvider = ({ initialLanguage, children }: PropsWithChildren<LanguageProviderProps>) => {\n const [language, setLanguage] = useState<Language>(initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n const [storedLanguage, setStoredLanguage] = useLocalStorage<Language>('language', initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n\n useEffect(() => {\n if (language !== initialLanguage && initialLanguage) {\n console.warn('LanguageProvider initial state changed: Prefer using languageProvider\\'s setLanguage instead')\n setLanguage(initialLanguage)\n }\n }, [initialLanguage]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n document.documentElement.setAttribute('lang', language)\n setStoredLanguage(language)\n }, [language]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (storedLanguage !== null) {\n setLanguage(storedLanguage)\n return\n }\n\n const LanguageToTestAgainst = Object.values(LanguageUtil.languages)\n\n const matchingBrowserLanguage = window.navigator.languages\n .map(language => LanguageToTestAgainst.find((test) => language === test || language.split('-')[0] === test))\n .filter(entry => entry !== undefined)\n\n if (matchingBrowserLanguage.length === 0) return\n\n const firstMatch = matchingBrowserLanguage[0] as Language\n setLanguage(firstMatch)\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <LanguageContext.Provider value={{\n language,\n setLanguage\n }}>\n {children}\n </LanguageContext.Provider>\n )\n}","'use client'\n\nimport type { Dispatch, SetStateAction } from 'react'\nimport { useCallback, useState } from 'react'\nimport { LocalStorageService } from '@/src/utils/storage'\nimport { resolveSetState } from '@/src/utils/resolveSetState'\n\ntype SetValue<T> = Dispatch<SetStateAction<T>>\nexport const useLocalStorage = <T>(key: string, initValue: T): [T, SetValue<T>] => {\n const get = useCallback((): T => {\n if (typeof window === 'undefined') {\n return initValue\n }\n const storageService = new LocalStorageService()\n const value = storageService.get<T>(key)\n return value || initValue\n }, [initValue, key])\n\n const [storedValue, setStoredValue] = useState<T>(get)\n\n const setValue: SetValue<T> = useCallback(action => {\n const newValue = resolveSetState(action, storedValue)\n const storageService = new LocalStorageService()\n storageService.set(key, newValue)\n\n setStoredValue(newValue)\n }, [storedValue, setStoredValue, key])\n\n return [storedValue, setValue]\n}","/**\n * The supported languages\n */\nconst languages = ['en', 'de'] as const\n\n/**\n * The supported languages\n */\nexport type Language = typeof languages[number]\n\n/**\n * The supported languages' names in their respective language\n */\nconst languagesLocalNames: Record<Language, string> = {\n en: 'English',\n de: 'Deutsch',\n}\n\n/**\n * The default language\n */\nconst DEFAULT_LANGUAGE: Language = 'en'\n\n/**\n * A constant definition for holding data regarding languages\n */\nexport const LanguageUtil = {\n languages,\n DEFAULT_LANGUAGE,\n languagesLocalNames,\n}","import { useLanguage } from './LanguageProvider'\nimport type { Language } from './util'\n\n/**\n * A type describing the pluralization of a word\n */\nexport type TranslationPlural = {\n zero?: string,\n one?: string,\n two?: string,\n few?: string,\n many?: string,\n other: string,\n}\n\n/**\n * The type describing all values of a translation\n */\nexport type TranslationType = Record<string, string | TranslationPlural>\n\n/**\n * The type of translations\n */\nexport type Translation<T extends TranslationType> = Record<Language, T>\n\ntype OverwriteTranslationType<T extends TranslationType> = {\n language?: Language,\n translation?: Translation<Partial<T>>,\n}\n\n/**\n * Adds the `language` prop to the component props.\n *\n * @param Translation the type of the translation object\n *\n * @param Props the type of the component props, defaults to `Record<string, never>`,\n * if you don't expect any other props other than `language` and get an\n * error when using your component (because it uses `forwardRef` etc.)\n * you can try out `Record<string, unknown>`, this might resolve your\n * problem as `SomeType & never` is still `never` but `SomeType & unknown`\n * is `SomeType` which means that adding back props (like `ref` etc.)\n * works properly\n */\nexport type PropsForTranslation<\n Translation extends TranslationType,\n Props = unknown\n> = Props & {\n overwriteTranslation?: OverwriteTranslationType<Translation>,\n}\n\ntype StringKeys<T> = Extract<keyof T, string>;\n\ntype TranslationFunctionOptions = {\n replacements?: Record<string, string>,\n count?: number,\n}\ntype TranslationFunction<T extends TranslationType> = (key: StringKeys<T>, options?: TranslationFunctionOptions) => string\n\nexport const TranslationPluralCount = {\n zero: 0,\n one: 1,\n two: 2,\n few: 3,\n many: 11,\n other: -1,\n}\n\n\nexport const useTranslation = <T extends TranslationType>(\n translations: Translation<Partial<TranslationType>>[],\n overwriteTranslation: OverwriteTranslationType<T> = {}\n): TranslationFunction<T> => {\n const { language: languageProp, translation: overwrite } = overwriteTranslation\n const { language: inferredLanguage } = useLanguage()\n const usedLanguage = languageProp ?? inferredLanguage\n const usedTranslations = [...translations]\n if (overwrite) {\n usedTranslations.push(overwrite)\n }\n\n return (key: StringKeys<T>, options?: TranslationFunctionOptions): string => {\n const { count, replacements } = { ...{ count: 0, replacements: {} }, ...options }\n\n try {\n for (let i = translations.length - 1; i >= 0; i--) {\n const translation = translations[i]\n const localizedTranslation = translation[usedLanguage]\n if (!localizedTranslation) {\n continue\n }\n const value = localizedTranslation[key]\n if(!value) {\n continue\n }\n\n let forProcessing: string\n if (typeof value !== 'string') {\n if (count === TranslationPluralCount.zero && value?.zero) {\n forProcessing = value.zero\n } else if (count === TranslationPluralCount.one && value?.one) {\n forProcessing = value.one\n } else if (count === TranslationPluralCount.two && value?.two) {\n forProcessing = value.two\n } else if (TranslationPluralCount.few <= count && count < TranslationPluralCount.many && value?.few) {\n forProcessing = value.few\n } else if (count > TranslationPluralCount.many && value?.many) {\n forProcessing = value.many\n } else {\n forProcessing = value.other\n }\n } else {\n forProcessing = value\n }\n forProcessing = forProcessing.replace(/\\{\\{(\\w+)}}/g, (_, placeholder) => {\n return replacements[placeholder] ?? `{{key:${placeholder}}}` // fallback if key is missing\n })\n return forProcessing\n }\n } catch (e) {\n console.error(e)\n }\n return `{{${usedLanguage}:${key}}}`\n }\n}","import type { PropsWithChildren, ReactNode } from 'react'\nimport { forwardRef, useCallback, useEffect, useId, useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport clsx from 'clsx'\nimport { noop } from '@/src/utils/noop'\n\nexport type ExpansionIconProps = {\n isExpanded?: boolean,\n className?: string,\n}\n\nexport const ExpansionIcon = ({ isExpanded, className }: ExpansionIconProps) => {\n return (\n <ChevronDown\n aria-hidden={true}\n className={clsx(\n 'min-w-6 w-6 min-h-6 h-6 transition-transform motion-safe:duration-200 motion-reduce:duration-0 ease-in-out',\n { 'rotate-180': isExpanded },\n className\n )}\n />\n )\n}\n\ntype IconBuilder = (expanded: boolean) => ReactNode\n\nexport type ExpandableProps = PropsWithChildren<{\n id?: string,\n label: ReactNode,\n icon?: IconBuilder,\n isExpanded?: boolean,\n onChange?: (isExpanded: boolean) => void,\n /**\n * Whether the expansion should only happen when the header is clicked or on the entire component\n */\n clickOnlyOnHeader?: boolean,\n disabled?: boolean,\n className?: string,\n headerClassName?: string,\n contentClassName?: string,\n contentExpandedClassName?: string,\n}>\n\n/**\n * A Component for showing and hiding content\n */\nexport const Expandable = forwardRef<HTMLDivElement, ExpandableProps>(function Expandable({\n children,\n id: providedId,\n label,\n icon,\n isExpanded = false,\n onChange = noop,\n clickOnlyOnHeader = true,\n disabled = false,\n className,\n headerClassName,\n contentClassName,\n contentExpandedClassName,\n }, ref) {\n\n const defaultIcon = useCallback((expanded: boolean) => <ExpansionIcon isExpanded={expanded}/>, [])\n icon ??= defaultIcon\n\n const generatedId = useId()\n const id = providedId ?? generatedId\n\n return (\n <div\n ref={ref}\n onClick={() => !clickOnlyOnHeader && !disabled && onChange(!isExpanded)}\n\n className={clsx(\n 'flex-col-0 bg-surface text-on-surface group rounded-lg shadow-sm',\n { 'cursor-pointer': !clickOnlyOnHeader && !disabled }, className\n )}\n >\n <button\n onClick={() => clickOnlyOnHeader && !disabled && onChange(!isExpanded)}\n\n className={clsx(\n 'flex-row-2 py-2 px-4 rounded-lg justify-between items-center bg-surface text-on-surface select-none',\n {\n 'group-hover:brightness-97': !isExpanded,\n 'hover:brightness-97': isExpanded && !disabled,\n 'cursor-pointer': clickOnlyOnHeader && !disabled,\n },\n headerClassName\n )}\n\n aria-expanded={isExpanded}\n aria-controls={`${id}-content`}\n aria-disabled={disabled ?? undefined}\n >\n {label}\n {icon(isExpanded)}\n </button>\n <div\n id={`${id}-content`}\n className={clsx(\n 'flex-col-2 px-4 transition-all duration-300 ease-in-out',\n {\n [clsx('max-h-96 opacity-100 pb-2 overflow-y-auto', contentExpandedClassName)]: isExpanded,\n 'max-h-0 opacity-0 overflow-hidden': !isExpanded,\n },\n contentClassName\n )}\n\n role=\"region\"\n >\n {children}\n </div>\n </div>\n )\n})\n\nexport const ExpandableUncontrolled = forwardRef<HTMLDivElement, ExpandableProps>(function ExpandableUncontrolled({\n isExpanded,\n onChange = noop,\n ...props\n },\n ref) {\n const [usedIsExpanded, setUsedIsExpanded] = useState(isExpanded)\n\n useEffect(() => {\n setUsedIsExpanded(isExpanded)\n }, [isExpanded])\n\n return (\n <Expandable\n {...props}\n ref={ref}\n isExpanded={usedIsExpanded}\n onChange={value => {\n onChange(value)\n setUsedIsExpanded(value)\n }}\n />\n )\n})\n","export const noop = () => undefined\n","'use client'\n\nimport type { MutableRefObject } from 'react'\nimport { useCallback, useEffect, useId, useRef, useState } from 'react'\nimport { useIsMounted } from '@/src/hooks/focus/useIsMounted'\n\nconst createFocusGuard = () => {\n const div = document.createElement('div')\n Object.assign(div.style, {\n opacity: '0',\n outline: 'none',\n boxShadow: 'none',\n position: 'fixed',\n pointerEvents: 'none',\n touchAction: 'none',\n })\n div.tabIndex = 0\n div.setAttribute('data-hw-focus-guard', '')\n document.body.appendChild(div)\n return div\n}\n\nfunction getContainedFocusableElements(element: HTMLElement) {\n return element?.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])')\n}\n\ntype ListenerType = {\n id: string,\n pause: () => void,\n unpause: () => void,\n focus: () => void,\n focusLast: () => void,\n container: MutableRefObject<HTMLElement>,\n initialFocusElement: MutableRefObject<HTMLElement>,\n}\n\nclass FocusTrapService {\n // The last entry is always the active one\n private listeners: ListenerType[] = []\n\n public getActive(): ListenerType | undefined {\n if (this.listeners.length === 0) return undefined\n return this.listeners[this.listeners.length - 1]\n }\n\n private focusElement() {\n const active = this.getActive()\n if(!active) return\n const { container, initialFocusElement } = active\n const containerElement = container.current\n // Try in the following order\n // 1. Focus the initial element\n // 2. Focus the first focusable element in the container\n // 3. Focus the container\n if (initialFocusElement?.current) {\n initialFocusElement.current.focus()\n } else {\n const elements = getContainedFocusableElements(containerElement)\n if (elements && elements.length > 0) {\n const first = elements.item(0) as HTMLElement\n first.focus()\n } else {\n containerElement.focus()\n }\n }\n }\n\n private onFocusIn = (event: FocusEvent) => {\n const active = this.getActive()\n if(!active || !active.container.current) return\n const { container } = active\n if (!container.current.contains(event.target as HTMLElement)) {\n this.focusElement()\n }\n }\n\n private removeGuards() {\n document.querySelectorAll('[data-hw-focus-guard]').forEach((node) => node.remove())\n }\n\n private addGuards() {\n document.body.insertAdjacentElement('afterbegin', createFocusGuard())\n document.body.insertAdjacentElement('beforeend', createFocusGuard())\n }\n\n private activate() {\n document.addEventListener('focusin', this.onFocusIn)\n this.addGuards()\n }\n\n private deactivate() {\n document.removeEventListener('focusin', this.onFocusIn)\n this.removeGuards()\n }\n\n register(listener: ListenerType) {\n this.listeners.push(listener)\n if (this.listeners.length === 1) {\n this.activate()\n }\n const active = listener\n this.listeners.forEach((listener) => {\n const { focus, pause } = listener\n if (listener === active) {\n focus()\n } else {\n pause()\n }\n })\n }\n\n unregister(id: string) {\n const index = this.listeners.findIndex(trap => trap.id === id)\n if (index !== -1) {\n const isActive = index === this.listeners.length - 1\n const listener = this.listeners[index]\n this.listeners = this.listeners.filter(listener => listener.id !== id)\n if (isActive) {\n // Deactivate all focus traps\n this.deactivate()\n // Focus last element in previous focus context\n listener.focusLast()\n // Activate and pause remaining focus traps\n const active = this.getActive()\n this.listeners.forEach((listener) => {\n const { pause, unpause } = listener\n if (listener === active) {\n unpause()\n } else {\n pause()\n }\n })\n // Reactivate\n if (this.listeners.length > 0) {\n this.activate()\n }\n }\n } else {\n console.warn(`Unable to unregister id ${id}: not found`)\n }\n }\n}\n\nconst service = new FocusTrapService()\n\nexport type UseFocusTrapProps = {\n container: MutableRefObject<HTMLElement>,\n active?: boolean,\n initialFocus?: MutableRefObject<HTMLElement>,\n /**\n * Whether to focus the first element when the initialFocus isn't provided\n *\n * Focuses the container instead\n */\n focusFirst?: boolean,\n}\n\nexport const useFocusTrap = ({\n container,\n active = true,\n initialFocus,\n focusFirst = true,\n }: UseFocusTrapProps) => {\n const lastFocusRef = useRef<HTMLElement | null>(null)\n const [paused, setPaused] = useState(false)\n const isMounted = useIsMounted()\n const id = useId()\n\n const focusElement = useCallback(() => {\n const containerElement = container.current\n // Try in the following order\n // 1. Focus the initial element\n // 2. Focus the first focusable element in the container\n // 3. Focus the container\n if (initialFocus?.current) {\n initialFocus.current.focus()\n } else {\n const elements = getContainedFocusableElements(containerElement)\n if (elements && elements.length > 0) {\n const first = elements.item(0) as HTMLElement\n first.focus()\n } else {\n containerElement.focus()\n }\n }\n }, [container, initialFocus])\n\n useEffect(() => {\n if (active && isMounted) {\n if (!lastFocusRef.current) {\n lastFocusRef.current = document.activeElement as HTMLElement\n }\n\n function pause() {\n setPaused(true)\n }\n\n function unpause() {\n setPaused(false)\n if (!container.current.contains(document.activeElement as HTMLElement)) {\n focusElement()\n }\n }\n\n function focus() {\n focusElement()\n setPaused(false)\n }\n\n function focusLast() {\n lastFocusRef.current?.focus()\n }\n\n service.register({ id, pause, focus, focusLast, unpause, container, initialFocusElement: initialFocus })\n return () => {\n service.unregister(id)\n lastFocusRef.current = undefined\n }\n }\n }, [active, container, focusElement, id, initialFocus, isMounted])\n\n useEffect(() => {\n if (active && !paused && isMounted) {\n const containerElement = container.current\n\n function onKeyDown(event: KeyboardEvent) {\n const key = event.key\n const elements = getContainedFocusableElements(containerElement)\n const active = document.activeElement as HTMLElement\n const index = [...elements].findIndex(value => value === active)\n if (index === -1 || event.altKey || event.ctrlKey || event.metaKey) {\n return\n }\n if (key === 'Tab') {\n const next = event.shiftKey ? -1 : 1\n const nextIndex = (index + next + elements.length) % elements.length\n const nextElement = elements[nextIndex] as HTMLElement\n nextElement.focus()\n event.preventDefault()\n }\n }\n\n // Register and unregister the listeners\n containerElement.addEventListener('keydown', onKeyDown)\n return () => {\n containerElement.removeEventListener('keydown', onKeyDown)\n }\n }\n }, [active, paused, isMounted, container, initialFocus, focusFirst, focusElement])\n}","'use client'\n\nimport { useEffect, useLayoutEffect, useState } from 'react'\n\nconst isClient = typeof window !== 'undefined' && typeof document !== 'undefined'\nconst useIsomorphicEffect = isClient ? useLayoutEffect : useEffect\n\nexport const useIsMounted = () => {\n const [isMounted, setIsMounted] = useState(false)\n\n useIsomorphicEffect(() => {\n setIsMounted(true)\n return () => {\n setIsMounted(false)\n }\n }, [])\n return isMounted\n}","export const match = <K extends string | number | symbol, V>(key: K, values: Record<K, V>) => {\n return values[key]\n}","import type { HTMLAttributes, PropsWithChildren, ReactNode } from 'react'\nimport clsx from 'clsx'\n\nconst chipColors = ['default', 'dark', 'red', 'yellow', 'green', 'blue', 'pink', 'orange'] as const\nexport type ChipColor = typeof chipColors[number]\n\ntype ChipVariant = 'normal' | 'fullyRounded'\ntype ChipSize = 'sm' | 'md' | 'lg'\n\nexport const ChipUtil = {\n colors: chipColors,\n}\n\nexport type ChipProps = HTMLAttributes<HTMLDivElement> & PropsWithChildren<{\n color?: ChipColor,\n size?: ChipSize,\n icon?: boolean,\n variant?: ChipVariant,\n trailingIcon?: ReactNode,\n}>\n\n/**\n * A component for displaying a single chip\n */\nexport const Chip = ({\n children,\n trailingIcon,\n color = 'default',\n size = 'md',\n icon = false,\n variant = 'normal',\n className = '',\n ...restProps\n }: ChipProps) => {\n const colorMapping: string = {\n default: 'text-tag-default-text bg-tag-default-background',\n dark: 'text-tag-dark-text bg-tag-dark-background',\n red: 'text-tag-red-text bg-tag-red-background',\n yellow: 'text-tag-yellow-text bg-tag-yellow-background',\n green: 'text-tag-green-text bg-tag-green-background',\n blue: 'text-tag-blue-text bg-tag-blue-background',\n pink: 'text-tag-pink-text bg-tag-pink-background',\n orange: 'text-tag-orange-text bg-tag-orange-background',\n }[color]\n\n const colorMappingIcon: string = {\n default: 'text-tag-default-icon',\n dark: 'text-tag-dark-icon',\n red: 'text-tag-red-icon',\n yellow: 'text-tag-yellow-icon',\n green: 'text-tag-green-icon',\n blue: 'text-tag-blue-icon',\n pink: 'text-tag-pink-icon',\n orange: 'text-tag-orange-icon',\n }[color]\n\n return (\n <div\n {...restProps}\n className={clsx(\n `flex-row-0 w-fit font-semibold`,\n colorMapping,\n !icon ? {\n 'px-1 py-0.5': size === 'sm',\n 'px-2 py-1': size === 'md',\n 'px-4 py-2': size === 'lg',\n } : {\n 'p-0.5': size === 'sm',\n 'p-1': size === 'md',\n 'p-2': size === 'lg',\n },\n {\n 'rounded-md': variant === 'normal',\n 'rounded-full': variant === 'fullyRounded',\n },\n className\n )}\n >\n {children}\n {trailingIcon && (<span className={colorMappingIcon}>{trailingIcon}</span>)}\n </div>\n )\n}\n\nexport type ChipListProps = {\n list: ChipProps[],\n className?: string,\n}\n\n/**\n * A component for displaying a list of chips\n */\nexport const ChipList = ({\n list,\n className = ''\n }: ChipListProps) => {\n return (\n <div className={clsx('flex flex-wrap gap-x-2 gap-y-2', className)}>\n {list.map((value, index) => (\n <Chip\n key={index}\n {...value}\n color={value.color ?? 'default'}\n variant={value.variant ?? 'normal'}\n >\n {value.children}\n </Chip>\n ))}\n </div>\n )\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react'\nimport { forwardRef } from 'react'\nimport clsx from 'clsx'\n\n\nexport const ButtonColorUtil = {\n solid: ['primary', 'secondary', 'tertiary', 'positive', 'warning', 'negative', 'neutral'] as const,\n text: ['primary', 'negative', 'neutral'] as const,\n outline: ['primary'] as const,\n}\n\nexport const IconButtonUtil = {\n icon: [...ButtonColorUtil.solid, 'transparent'] as const,\n}\n\n\n/**\n * The allowed colors for the SolidButton and IconButton\n */\nexport type SolidButtonColor = typeof ButtonColorUtil.solid[number]\n/**\n * The allowed colors for the OutlineButton\n */\nexport type OutlineButtonColor = typeof ButtonColorUtil.outline[number]\n/**\n * The allowed colors for the TextButton\n */\nexport type TextButtonColor = typeof ButtonColorUtil.text[number]\n/**\n * The allowed colors for the IconButton\n */\nexport type IconButtonColor = typeof IconButtonUtil.icon[number]\n\n\n/**\n * The different sizes for a button\n */\ntype ButtonSizes = 'small' | 'medium' | 'large'\n\ntype IconButtonSize = 'tiny' | 'small' | 'medium' | 'large'\n\n/**\n * The shard properties between all button types\n */\nexport type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /**\n * @default 'medium'\n */\n size?: ButtonSizes,\n}\n\nconst paddingMapping: Record<ButtonSizes, string> = {\n small: 'btn-sm',\n medium: 'btn-md',\n large: 'btn-lg'\n}\n\nconst iconPaddingMapping: Record<IconButtonSize, string> = {\n tiny: 'icon-btn-xs',\n small: 'icon-btn-sm',\n medium: 'icon-btn-md',\n large: 'icon-btn-lg'\n}\n\nexport const ButtonUtil = {\n paddingMapping,\n iconPaddingMapping\n}\n\ntype ButtonWithIconsProps = ButtonProps & {\n startIcon?: ReactNode,\n endIcon?: ReactNode,\n}\n\nexport type SolidButtonProps = ButtonWithIconsProps & {\n color?: SolidButtonColor,\n}\n\nexport type OutlineButtonProps = ButtonWithIconsProps & {\n color?: OutlineButtonColor,\n}\n\nexport type TextButtonProps = ButtonWithIconsProps & {\n color?: TextButtonColor,\n coloredHoverBackground?: boolean,\n}\n\n/**\n * The shard properties between all button types\n */\nexport type IconButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /**\n * @default 'medium'\n */\n size?: IconButtonSize,\n color?: IconButtonColor,\n}\n\n/**\n * A button with a solid background and different sizes\n */\nexport const SolidButton = forwardRef<HTMLButtonElement, SolidButtonProps>(function SolidButton({\n children,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }, ref) {\n const colorClasses = {\n primary: 'not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text',\n secondary: 'not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text',\n tertiary: 'not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text',\n positive: 'not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text',\n warning: 'not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text',\n negative: 'not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text',\n neutral: 'not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-solid-primary-icon',\n secondary: 'not-group-disabled:text-button-solid-secondary-icon',\n tertiary: 'not-group-disabled:text-button-solid-tertiary-icon',\n positive: 'not-group-disabled:text-button-solid-positive-icon',\n warning: 'not-group-disabled:text-button-solid-warning-icon',\n negative: 'not-group-disabled:text-button-solid-negative-icon',\n neutral: 'not-group-disabled:text-button-solid-neutral-icon',\n }[color]\n\n return (\n <button\n ref={ref}\n onClick={onClick}\n className={clsx(\n 'group font-semibold',\n colorClasses,\n 'not-disabled:hover:brightness-90',\n 'disabled:text-disabled-text disabled:bg-disabled-background',\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n})\n\n/**\n * A button with an outline border and different sizes\n */\nexport const OutlineButton = ({\n children,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: OutlineButtonProps) => {\n const colorClasses = {\n primary: 'not-disabled:border-button-outline-primary-text not-disabled:text-button-outline-primary-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-outline-primary-icon',\n }[color]\n return (\n <button\n onClick={onClick}\n className={clsx(\n 'group font-semibold bg-transparent border-2 ',\n 'not-disabled:hover:brightness-80',\n colorClasses,\n 'disabled:text-disabled-text disabled:border-disabled-outline',\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n/**\n * A text that is a button that can have different sizes\n */\nexport const TextButton = ({\n children,\n color = 'neutral',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n coloredHoverBackground = true,\n className,\n ...restProps\n }: TextButtonProps) => {\n const colorClasses = {\n primary: 'not-disabled:bg-transparent not-disabled:text-button-text-primary-text focus-style-none focus-visible:ring-2 not-disabled:focus-visible:ring-button-text-primary-text',\n negative: 'not-disabled:bg-transparent not-disabled:text-button-text-negative-text focus-style-none focus-visible:ring-2 not-disabled:focus-visible:ring-button-text-negative-text',\n neutral: 'not-disabled:bg-transparent not-disabled:text-button-text-neutral-text focus-style-none focus-visible:ring-2 not-disabled:focus-visible:ring-button-text-neutral-text',\n }[color]\n\n const backgroundColor = {\n primary: 'not-disabled:hover:bg-button-text-primary-text/20 not-disabled:focus-visible:bg-button-text-primary-text/20',\n negative: 'not-disabled:hover:bg-button-text-negative-text/20 not-disabled:focus-visible:bg-button-text-negative-text/20',\n neutral: 'not-disabled:hover:bg-button-text-neutral-text/20 not-disabled:focus-visible:bg-button-text-neutral-text/20',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-text-primary-icon',\n negative: 'not-group-disabled:text-button-text-negative-icon',\n neutral: 'not-group-disabled:text-button-text-neutral-icon',\n }[color]\n\n return (\n <button\n onClick={onClick}\n className={clsx(\n 'group font-semibold',\n 'disabled:text-disabled-text',\n colorClasses,\n {\n [backgroundColor]: coloredHoverBackground,\n 'not-disabled:hover:bg-button-text-hover-background': !coloredHoverBackground,\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n\n/**\n * A button for icons with a solid background and different sizes\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton({\n children,\n color = 'primary',\n size = 'medium',\n className,\n ...restProps\n }, ref)\n{\n const colorClasses = {\n primary: 'not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text',\n secondary: 'not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text',\n tertiary: 'not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text',\n positive: 'not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text',\n warning: 'not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text',\n negative: 'not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text',\n neutral: 'not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text',\n transparent: 'not-disabled:bg-transparent',\n }[color]\n\n return (\n <button\n ref={ref}\n className={clsx(\n colorClasses,\n 'not-disabled:hover:brightness-90',\n 'disabled:text-disabled-text',\n {\n 'disabled:bg-disabled-background': color !== 'transparent',\n 'disabled:opacity-70': color === 'transparent',\n 'not-disabled:hover:bg-button-text-hover-background': color === 'transparent',\n },\n ButtonUtil.iconPaddingMapping[size],\n className\n )}\n {...restProps}\n >\n {children}\n </button>\n )\n})","'use client'\n\nimport type { CSSProperties, MutableRefObject } from 'react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { clamp } from '@/src/utils/math'\nimport { useIsMounted } from '@/src/hooks/focus/useIsMounted'\n\nexport type FloatingElementAlignment = 'beforeStart' | 'afterStart' | 'center' | 'beforeEnd' | 'afterEnd'\n\ntype RectangleBounds = {\n top: number,\n right: number,\n bottom: number,\n left: number,\n width: number,\n height: number,\n}\n\ntype CalculatePositionOptions = {\n verticalAlignment?: FloatingElementAlignment,\n horizontalAlignment?: FloatingElementAlignment,\n screenPadding?: number,\n gap?: number,\n}\n\ntype CalculatePositionProps = {\n windowRect: RectangleBounds,\n containerRect: RectangleBounds,\n anchorRect: RectangleBounds,\n options: CalculatePositionOptions,\n}\n\ntype UseFloatingElementStyle = {\n left: number,\n top: number,\n maxWidth: number,\n maxHeight: number,\n}\n\nfunction calculatePosition({\n windowRect,\n containerRect,\n anchorRect,\n options,\n }: CalculatePositionProps): UseFloatingElementStyle {\n const { verticalAlignment, horizontalAlignment, gap, screenPadding } = options\n const windowWidth = windowRect.width\n const windowHeight = windowRect.height\n\n const maxWidth = windowWidth - 2 * screenPadding\n const maxHeight = windowHeight - 2 * screenPadding\n\n const width = Math.min(containerRect.width, maxWidth)\n const height = Math.min(containerRect.height, maxHeight)\n\n const leftSuggestion = {\n beforeStart: anchorRect.left - width - gap,\n afterStart: anchorRect.left,\n center: anchorRect.left + anchorRect.width / 2 - width / 2,\n beforeEnd: anchorRect.right - width,\n afterEnd: anchorRect.right + gap,\n }[horizontalAlignment]\n\n const topSuggestion = {\n beforeStart: anchorRect.top - height - gap,\n afterStart: anchorRect.top,\n center: anchorRect.top + anchorRect.height / 2 - height / 2,\n beforeEnd: anchorRect.bottom - height,\n afterEnd: anchorRect.bottom + gap,\n }[verticalAlignment]\n\n const left = clamp(leftSuggestion, [\n screenPadding,\n windowWidth - screenPadding - width,\n ])\n\n const top = clamp(topSuggestion, [\n screenPadding,\n windowHeight - screenPadding - height,\n ])\n\n return {\n left,\n top,\n maxWidth,\n maxHeight,\n }\n}\n\nexport type UseFloatingElementOptions = CalculatePositionOptions & {\n isPolling?: boolean,\n pollingInterval?: number,\n}\n\nexport type UseFloatingElementProps = UseFloatingElementOptions & {\n containerRef: MutableRefObject<HTMLElement>,\n anchorRef: MutableRefObject<HTMLElement>,\n windowRef?: MutableRefObject<HTMLElement>,\n active?: boolean,\n}\n\nexport function useFloatingElement({\n active = true,\n windowRef,\n anchorRef,\n containerRef,\n isPolling = false,\n pollingInterval = 100,\n verticalAlignment = 'afterEnd',\n horizontalAlignment = 'afterStart',\n screenPadding = 16,\n gap = 4,\n }: UseFloatingElementProps) {\n const [style, setStyle] = useState<CSSProperties>()\n const isMounted = useIsMounted()\n\n const calculate = useCallback(() => {\n const containerRect = containerRef.current.getBoundingClientRect()\n const windowRect: RectangleBounds = windowRef?.current.getBoundingClientRect() ?? {\n top: 0,\n bottom: window.innerHeight,\n left: 0,\n right: window.innerWidth,\n width: window.innerWidth,\n height: window.innerHeight,\n }\n const anchorElement = anchorRef?.current\n if (anchorRef && !anchorElement) {\n console.warn('FloatingContainer anchor provided, but its value is undefined')\n }\n const anchorRect: RectangleBounds = anchorElement?.getBoundingClientRect() ?? windowRect\n\n const calculateProps: CalculatePositionProps = {\n windowRect,\n anchorRect,\n containerRect,\n options: {\n horizontalAlignment,\n verticalAlignment,\n screenPadding,\n gap,\n }\n }\n setStyle(calculatePosition(calculateProps))\n }, [anchorRef, containerRef, gap, horizontalAlignment, screenPadding, verticalAlignment, windowRef])\n\n\n const height = containerRef.current?.getBoundingClientRect().height\n const width = containerRef.current?.getBoundingClientRect().width\n useEffect(() => {\n if (active && isMounted) {\n calculate()\n } else {\n setStyle(undefined)\n }\n }, [calculate, active, isMounted, height, width])\n\n useEffect(() => {\n window.addEventListener('resize', calculate)\n let timeout: NodeJS.Timeout\n if (isPolling) {\n timeout = setInterval(calculate, pollingInterval)\n }\n return () => {\n window.removeEventListener('resize', calculate)\n if (timeout) {\n clearInterval(timeout)\n }\n }\n }, [calculate, isPolling, pollingInterval])\n\n return style\n}","export const clamp = (value: number, range: [number, number] = [0, 1]): number => {\n const [min, max] = range\n return Math.min(Math.max(value, min), max)\n}\n"],"mappings":"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","names":["import_react","import_clsx","import_react","import_react","import_jsx_runtime","clsx","Expandable","ExpandableUncontrolled","import_react","import_react","listener","active","import_lucide_react","import_clsx","import_jsx_runtime","clsx","import_react","import_clsx","import_jsx_runtime","SolidButton","clsx","IconButton","clsx","import_react","import_jsx_runtime","value","isOpen","SelectOption","clsx","SelectButton","SelectChipDisplay","SelectContent","Select","SelectUncontrolled","MultiSelect","MultiSelectUncontrolled","MultiSelectChipDisplay","MultiSelectChipDisplayUncontrolled"]}
1
+ {"version":3,"sources":["../../../../src/components/user-action/select/Select.tsx","../../../../src/localization/LanguageProvider.tsx","../../../../src/hooks/useLocalStorage.ts","../../../../src/localization/util.ts","../../../../src/localization/useTranslation.ts","../../../../src/components/layout/Expandable.tsx","../../../../src/utils/noop.ts","../../../../src/hooks/focus/useFocusTrap.ts","../../../../src/hooks/focus/useIsMounted.ts","../../../../src/utils/match.ts","../../../../src/components/layout/Chip.tsx","../../../../src/components/user-action/Button.tsx","../../../../src/hooks/useFloatingElement.ts","../../../../src/utils/math.ts"],"sourcesContent":["import type { ButtonHTMLAttributes, HTMLAttributes, PropsWithChildren, ReactNode } from 'react'\nimport React, {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState\n} from 'react'\nimport clsx from 'clsx'\nimport type { Translation } from '@/src/localization/useTranslation'\nimport { useTranslation } from '@/src/localization/useTranslation'\nimport { ExpansionIcon } from '@/src/components/layout/Expandable'\nimport { useFocusTrap } from '@/src/hooks/focus/useFocusTrap'\nimport { match } from '@/src/utils/match'\nimport { CheckIcon, Plus, XIcon } from 'lucide-react'\nimport { Chip } from '@/src/components/layout/Chip'\nimport { IconButton } from '@/src/components/user-action/Button'\nimport type { UseFloatingElementOptions } from '@/src/hooks/useFloatingElement'\nimport { useFloatingElement } from '@/src/hooks/useFloatingElement'\nimport { createPortal } from 'react-dom'\n\n//\n// Context\n//\ntype RegisteredOption = {\n value: string,\n disabled: boolean,\n ref: React.RefObject<HTMLLIElement>,\n}\n\ntype HighlightPosition = 'first' | 'last'\ntype SelectIconAppearance = 'left' | 'right' | 'none'\n\ntype InternalSelectContextState = {\n isOpen: boolean,\n highlightedValue?: string,\n}\n\ntype SelectContextState = InternalSelectContextState & {\n id: string,\n value: string[],\n disabled: boolean,\n invalid: boolean,\n}\n\ntype SelectConfiguration = {\n isMultiSelect: boolean,\n iconAppearance: SelectIconAppearance,\n}\n\ntype ToggleOpenOptions = {\n highlightStartPosition?: HighlightPosition,\n}\n\nconst defaultToggleOpenOptions: ToggleOpenOptions = {\n highlightStartPosition: 'first',\n}\n\ntype SelectContextType = {\n state: SelectContextState,\n config: SelectConfiguration,\n item: {\n register: (item: RegisteredOption) => void,\n unregister: (value: string) => void,\n toggleSelection: (value: string, isSelected?: boolean) => void,\n highlightItem: (value: string) => void,\n moveHighlightedIndex: (delta: number) => void,\n },\n trigger: {\n ref: React.RefObject<HTMLElement>,\n register: (element: React.RefObject<HTMLElement>) => void,\n unregister: () => void,\n toggleOpen: (isOpen?: boolean, options?: ToggleOpenOptions) => void,\n },\n}\n\nconst SelectContext = createContext<SelectContextType | null>(null)\n\nfunction useSelectContext() {\n const ctx = useContext(SelectContext)\n if (!ctx) {\n throw new Error('SelectContext must be used within a ListBoxPrimitive')\n }\n return ctx\n}\n\n\n//\n// SelectRoot\n//\nexport type SelectRootProps = PropsWithChildren<{\n id?: string,\n value?: string,\n onValueChanged?: (value: string) => void,\n values?: string[],\n onValuesChanged?: (value: string[]) => void,\n isOpen?: boolean,\n disabled?: boolean,\n invalid?: boolean,\n isMultiSelect?: boolean,\n iconAppearance?: SelectIconAppearance,\n}>\n\nexport const SelectRoot = ({\n children,\n id,\n value,\n onValueChanged,\n values,\n onValuesChanged,\n isOpen = false,\n disabled = false,\n invalid = false,\n isMultiSelect = false,\n iconAppearance = 'left',\n }: SelectRootProps) => {\n const optionsRef = useRef<RegisteredOption[]>([])\n const triggerRef = useRef<HTMLElement>(null)\n const generatedId = useId()\n const usedId = id ?? generatedId\n\n const [internalState, setInternalState] = useState<InternalSelectContextState>({\n isOpen,\n })\n\n const state: SelectContextState = {\n ...internalState,\n id: usedId,\n disabled,\n invalid,\n value: isMultiSelect ? (values ?? []) : [value].filter(Boolean),\n }\n const config: SelectConfiguration = {\n isMultiSelect,\n iconAppearance,\n }\n\n const registerItem = useCallback((item: RegisteredOption) => {\n optionsRef.current.push(item)\n optionsRef.current.sort((a, b) => {\n const aEl = a.ref.current\n const bEl = b.ref.current\n if (!aEl || !bEl) return 0\n return aEl.compareDocumentPosition(bEl) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1\n })\n }, [])\n\n const unregisterItem = useCallback((value: string) => {\n optionsRef.current = optionsRef.current.filter(i => i.value !== value)\n }, [])\n\n // Setting isSelected to false only works for multiselects\n const toggleSelection = (value: string, isSelected?: boolean) => {\n if (disabled) {\n return\n }\n const option = optionsRef.current.find(i => i.value === value)\n if (!option) {\n console.error(`SelectOption with value: ${value} not found`)\n return\n }\n\n let newValue: string[]\n if (isMultiSelect) {\n const isSelectedBefore = state.value.includes(value)\n const isSelectedAfter = isSelected ?? !isSelectedBefore\n if (!isSelectedAfter) {\n newValue = state.value.filter(v => v !== value)\n } else {\n newValue = [...state.value, value]\n }\n } else {\n newValue = [value]\n }\n\n if (!isMultiSelect) {\n onValueChanged?.(newValue[0])\n } else {\n onValuesChanged?.(newValue)\n }\n\n setInternalState(prevState => ({\n ...prevState,\n highlightedValue: value,\n }))\n }\n\n const highlightItem = (value: string) => {\n if (disabled) {\n return\n }\n setInternalState(prevState => ({\n ...prevState,\n highlightedValue: value,\n }))\n }\n\n const registerTrigger = useCallback((ref: React.RefObject<HTMLElement>) => {\n triggerRef.current = ref.current\n }, [])\n\n const unregisterTrigger = useCallback(() => {\n triggerRef.current = null\n }, [])\n\n const toggleOpen = (isOpen?: boolean, options?: ToggleOpenOptions) => {\n const { highlightStartPosition } = { ...defaultToggleOpenOptions, ...options }\n let highlightedIndex: number\n if (highlightStartPosition === 'first') {\n highlightedIndex = optionsRef.current.findIndex(option => !option.disabled)\n } else {\n highlightedIndex = optionsRef.current.length - 1 - [...optionsRef.current].reverse().findIndex(option => !option.disabled)\n }\n if (highlightedIndex === -1 || highlightedIndex === optionsRef.current.length) {\n highlightedIndex = 0\n }\n setInternalState(prevState => ({\n ...prevState,\n isOpen: isOpen ?? !prevState.isOpen,\n highlightedValue: optionsRef.current[highlightedIndex].value,\n }))\n }\n\n const moveHighlightedIndex = (delta: number) => {\n let highlightedIndex = optionsRef.current.findIndex(value => value.value === internalState.highlightedValue)\n if (highlightedIndex === -1) {\n highlightedIndex = 0\n }\n const optionLength = optionsRef.current.length\n const startIndex = (highlightedIndex + (delta % optionLength) + optionLength) % optionLength\n const isForward = delta >= 0\n let highlightedValue = optionsRef.current[startIndex].value\n for (let i = 0; i < optionsRef.current.length; i++) {\n const index = (startIndex + (isForward ? i : -i) + optionLength) % optionLength\n if (!optionsRef.current[index].disabled) {\n highlightedValue = optionsRef.current[index].value\n break\n }\n }\n\n setInternalState(prevState => ({\n ...prevState,\n highlightedValue,\n }))\n }\n\n useEffect(() => {\n if (!internalState.highlightedValue) return\n const highlighted = optionsRef.current.find(value => value.value === internalState.highlightedValue)\n if (highlighted) {\n highlighted.ref.current.scrollIntoView({ behavior: 'instant', block: 'nearest' })\n } else {\n console.error(`SelectRoot: Could not find highlighted value (${internalState.highlightedValue})`)\n }\n }, [internalState.highlightedValue])\n\n const contextValue: SelectContextType = {\n state,\n config,\n item: {\n register: registerItem,\n unregister: unregisterItem,\n toggleSelection,\n highlightItem,\n moveHighlightedIndex,\n },\n trigger: {\n ref: triggerRef,\n register: registerTrigger,\n unregister: unregisterTrigger,\n toggleOpen,\n },\n }\n\n return (\n <SelectContext.Provider value={contextValue}>\n {children}\n </SelectContext.Provider>\n )\n}\n\n//\n// SelectOption\n//\nexport type SelectOptionProps = Omit<HTMLAttributes<HTMLLIElement>, 'children'> & {\n value: string,\n disabled?: boolean,\n iconAppearance?: SelectIconAppearance,\n children?: ReactNode,\n}\n\nexport const SelectOption = forwardRef<HTMLLIElement, SelectOptionProps>(\n function SelectOption({ children, value, disabled = false, iconAppearance, className, ...restProps }, ref) {\n const { state, config, item, trigger } = useSelectContext()\n const { register, unregister, toggleSelection, highlightItem } = item\n const itemRef = useRef<HTMLLIElement>(null)\n\n iconAppearance ??= config.iconAppearance\n\n // Register with parent\n useEffect(() => {\n register({\n value,\n disabled,\n ref: itemRef,\n })\n return () => unregister(value)\n }, [value, disabled, register, unregister, children])\n\n const isHighlighted = state.highlightedValue === value\n const isSelected = state.value.includes(value)\n\n return (\n <li\n {...restProps}\n ref={(node) => {\n itemRef.current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLLIElement | null>).current = node\n }}\n id={value}\n role=\"option\"\n aria-disabled={disabled}\n aria-selected={isSelected}\n data-highlighted={isHighlighted ? '' : undefined}\n data-selected={isSelected ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n className={clsx(\n 'flex-row-1 items-center px-2 py-1 rounded-md',\n 'data-highlighted:bg-primary/20',\n 'data-disabled:text-disabled data-disabled:cursor-not-allowed',\n 'not-data-disabled:cursor-pointer',\n className\n )}\n onClick={(event) => {\n if (!disabled) {\n toggleSelection(value)\n if (!config.isMultiSelect) {\n trigger.toggleOpen(false)\n }\n restProps.onClick?.(event)\n }\n }}\n onMouseEnter={(event) => {\n if (!disabled) {\n highlightItem(value)\n restProps.onMouseEnter?.(event)\n }\n }}\n >\n {iconAppearance === 'left' && (\n <CheckIcon\n className={clsx('w-4 h-4', { 'opacity-0': !isSelected || disabled })}\n aria-hidden={true}\n />\n )}\n {children ?? value}\n {iconAppearance === 'right' && (\n <CheckIcon\n className={clsx('w-4 h-4', { 'opacity-0': !isSelected || disabled })}\n aria-hidden={true}\n />\n )}\n </li>\n )\n }\n)\n\n///\n/// SelectButton\n///\ntype SelectButtonTranslationType = {\n clickToSelect: string,\n}\n\nconst defaultSelectButtonTranslation: Translation<SelectButtonTranslationType> = {\n en: {\n clickToSelect: 'Click to select',\n\n },\n de: {\n clickToSelect: 'Zum auswählen drücken'\n }\n}\n\ntype SelectButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n placeholder?: ReactNode,\n selectedDisplay?: (value: string[]) => ReactNode,\n}\n\nexport const SelectButton = forwardRef<HTMLButtonElement, SelectButtonProps>(function SelectButton(\n { placeholder, selectedDisplay, ...props }, ref\n) {\n const translation = useTranslation([defaultSelectButtonTranslation])\n const { state, trigger } = useSelectContext()\n const { register, unregister, toggleOpen } = trigger\n\n const innerRef = useRef<HTMLButtonElement>(null)\n useImperativeHandle(ref, () => innerRef.current)\n\n useEffect(() => {\n register(innerRef)\n return () => unregister()\n }, [register, unregister])\n\n const disabled = !!props?.disabled || !!state.disabled\n const invalid = state.invalid\n const hasValue = state.value.length > 0\n\n return (\n <button\n {...props}\n ref={innerRef}\n id={state.id} // TODO allow for a custom id here\n className={clsx(\n 'flex-row-2 items-center justify-between bg-input-background text-input-text rounded-md px-2.5 py-2.5',\n 'data-placeholder:text-description',\n props.className\n )}\n onClick={() => toggleOpen(!state.isOpen)}\n onKeyDown={event => {\n switch (event.key) {\n case 'ArrowDown':\n toggleOpen(true, { highlightStartPosition: 'first' })\n break\n case 'ArrowUp':\n toggleOpen(true, { highlightStartPosition: 'last' })\n break\n }\n }}\n\n data-placeholder={!hasValue ? '' : undefined}\n data-disabled={disabled ? '' : undefined}\n data-invalid={invalid ? '' : undefined}\n\n aria-invalid={invalid}\n aria-disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={state.isOpen}\n aria-controls={state.isOpen ? `${state.id}-listbox` : undefined}\n >\n {hasValue ?\n selectedDisplay?.(state.value) ?? state.value.join(', ')\n : placeholder ?? translation('clickToSelect')\n }\n <ExpansionIcon isExpanded={state.isOpen}/>\n </button>\n )\n})\n\n///\n/// SelectChipDisplay\n///\ntype SelectChipDisplayProps = HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean,\n placeholder?: ReactNode,\n}\n\nexport const SelectChipDisplay = forwardRef<HTMLDivElement, SelectChipDisplayProps>(function SelectChipDisplay(\n { ...props }, ref\n) {\n const { state, trigger, item } = useSelectContext()\n const { register, unregister, toggleOpen } = trigger\n\n const innerRef = useRef<HTMLDivElement>(null)\n useImperativeHandle(ref, () => innerRef.current)\n\n useEffect(() => {\n register(innerRef)\n return () => unregister()\n }, [register, unregister])\n\n const disabled = !!props?.disabled || !!state.disabled\n const invalid = state.invalid\n\n return (\n <div\n {...props}\n ref={innerRef}\n className={clsx(\n 'flex flex-wrap flex-row gap-2 items-center bg-input-background text-input-text rounded-md px-2.5 py-2.5',\n props.className\n )}\n data-disabled={disabled ? '' : undefined}\n data-invalid={invalid ? '' : undefined}\n\n aria-invalid={invalid}\n aria-disabled={disabled}\n >\n {state.value.map((value) => (\n <Chip key={value} className=\"gap-x-2\">\n {value}\n <button\n // TODO add label to indicate purpose to screen reader\n onClick={() => {\n item.toggleSelection(value, false)\n }}\n className=\"focus-within:text-negative hover:bg-negative/20 hover:text-negative rounded-md focus-style-none focus-visible:ring-2 focus-visible:ring-negative focus-visible:bg-negative/20\"\n >\n <XIcon/>\n </button>\n </Chip>\n ))}\n <IconButton\n id={state.id} // TODO allow for a custom id here\n onClick={() => toggleOpen()}\n onKeyDown={event => {\n switch (event.key) {\n case 'ArrowDown':\n toggleOpen(true, { highlightStartPosition: 'first' })\n break\n case 'ArrowUp':\n toggleOpen(true, { highlightStartPosition: 'last' })\n }\n }}\n size=\"small\"\n color=\"neutral\"\n\n aria-invalid={invalid}\n aria-disabled={disabled}\n aria-haspopup=\"listbox\"\n aria-expanded={state.isOpen}\n aria-controls={state.isOpen ? `${state.id}-listbox` : undefined}\n >\n <Plus/>\n </IconButton>\n </div>\n )\n})\n\n\n///\n/// SelectContent\n///\ntype Orientation = 'vertical' | 'horizontal'\n\nexport type SelectContentProps = HTMLAttributes<HTMLUListElement> & {\n alignment?: Pick<UseFloatingElementOptions, 'gap' | 'horizontalAlignment' | 'verticalAlignment'>,\n orientation?: Orientation,\n}\n\nexport const SelectContent = forwardRef<HTMLUListElement, SelectContentProps>(\n function SelectContent({\n alignment,\n orientation = 'vertical',\n ...props\n }, ref) {\n const innerRef = useRef<HTMLUListElement | null>(null)\n useImperativeHandle(ref, () => innerRef.current)\n\n const { trigger, state, config, item } = useSelectContext()\n\n const position = useFloatingElement({\n active: state.isOpen,\n anchorRef: trigger.ref,\n containerRef: innerRef,\n ...alignment,\n })\n\n useFocusTrap({\n container: innerRef,\n active: state.isOpen && !!position,\n })\n\n return createPortal(\n <>\n <div\n hidden={!state.isOpen}\n onClick={() => trigger.toggleOpen(false)}\n className={clsx('fixed w-screen h-screen inset-0')}\n />\n <ul\n {...props}\n id={`${state.id}-listbox`}\n ref={innerRef}\n hidden={!state.isOpen}\n onKeyDown={(event) => {\n switch (event.key) {\n case 'Escape':\n trigger.toggleOpen(false)\n event.preventDefault()\n event.stopPropagation()\n break\n case match(orientation, {\n vertical: 'ArrowDown',\n horizontal: 'ArrowUp'\n }):\n item.moveHighlightedIndex(1)\n event.preventDefault()\n break\n case match(orientation, {\n vertical: 'ArrowUp',\n horizontal: 'ArrowDown'\n }):\n item.moveHighlightedIndex(-1)\n event.preventDefault()\n break\n case 'Home':\n // TODO support later by selecting the first not disabled entry\n event.preventDefault()\n break\n case 'End':\n // TODO support later by selecting the last not disabled entry\n event.preventDefault()\n break\n case 'Enter': // Fall through\n case ' ':\n if (state.highlightedValue) {\n item.toggleSelection(state.highlightedValue)\n if (!config.isMultiSelect) {\n trigger.toggleOpen(false)\n }\n event.preventDefault()\n }\n break\n }\n }}\n\n className={clsx('flex-col-0 p-2 bg-menu-background text-menu-text rounded-md shadow-hw-bottom focus-style-within overflow-auto', props.className)}\n style={{\n opacity: position ? undefined : 0,\n position: 'fixed',\n ...position\n }}\n\n role=\"listbox\"\n aria-multiselectable={config.isMultiSelect}\n aria-orientation={orientation}\n tabIndex={position ? 0 : undefined}\n >\n {props.children}\n </ul>\n </>, document.body\n )\n }\n)\n\n//\n// Select\n//\nexport type SelectProps = Omit<SelectRootProps, 'isMultiSelect' | 'values' | 'onValuesChanged'> & {\n contentPanelProps?: SelectContentProps,\n buttonProps?: Omit<SelectButtonProps, 'selectedDisplay'> & { selectedDisplay?: (value: string) => ReactNode },\n}\n\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(function Select({\n children,\n contentPanelProps,\n buttonProps,\n ...props\n }, ref) {\n return (\n <SelectRoot {...props} isMultiSelect={false}>\n <SelectButton\n ref={ref}\n {...buttonProps}\n selectedDisplay={values => {\n const value = values[0]\n if (!buttonProps?.selectedDisplay) return undefined\n return buttonProps.selectedDisplay(value)\n }}\n />\n <SelectContent {...contentPanelProps}>{children}</SelectContent>\n </SelectRoot>\n )\n})\n\n\nexport type SelectUncontrolledProps = SelectProps\nexport const SelectUncontrolled = forwardRef<HTMLButtonElement, SelectUncontrolledProps>(function SelectUncontrolled({\n value: initialValue,\n onValueChanged,\n ...props\n }, ref) {\n const [value, setValue] = useState(initialValue)\n\n useEffect(() => {\n setValue(initialValue)\n }, [initialValue])\n\n return (\n <Select\n {...props}\n ref={ref}\n value={value}\n onValueChanged={value => {\n setValue(value)\n onValueChanged?.(value)\n }}\n />\n )\n})\n\n\n//\n// MultiSelect\n//\nexport type MultiSelectProps = Omit<SelectRootProps, 'isMultiSelect' | 'value' | 'onValueChanged'> & {\n contentPanelProps?: SelectContentProps,\n buttonProps?: SelectButtonProps,\n}\n\nexport const MultiSelect = forwardRef<HTMLButtonElement, MultiSelectProps>(function MultiSelect({\n children,\n contentPanelProps,\n buttonProps,\n ...props\n }, ref) {\n return (\n <SelectRoot {...props} isMultiSelect={true}>\n <SelectButton ref={ref} {...buttonProps} />\n <SelectContent {...contentPanelProps}>{children}</SelectContent>\n </SelectRoot>\n )\n})\n\n\nexport type MultiSelectUncontrolledProps = MultiSelectProps\nexport const MultiSelectUncontrolled = forwardRef<HTMLButtonElement, MultiSelectUncontrolledProps>(function MultiSelectUncontrolled({\n values: initialValues,\n onValuesChanged,\n ...props\n }, ref) {\n const [values, setValues] = useState(initialValues)\n\n useEffect(() => {\n setValues(initialValues)\n }, [initialValues])\n\n return (\n <MultiSelect\n {...props}\n ref={ref}\n values={values}\n onValuesChanged={value => {\n setValues(value)\n onValuesChanged?.(value)\n }}\n />\n )\n})\n\n\n//\n// MultiSelectChipDisplay\n//\nexport type MultiSelectChipDisplayProps = Omit<SelectRootProps, 'isMultiSelect' | 'value' | 'onValueChanged'> & {\n contentPanelProps?: SelectContentProps,\n chipDisplayProps?: SelectChipDisplayProps,\n}\n\nexport const MultiSelectChipDisplay = forwardRef<HTMLDivElement, MultiSelectChipDisplayProps>(function MultiSelectChipDisplay({\n children,\n contentPanelProps,\n chipDisplayProps,\n ...props\n }, ref) {\n return (\n <SelectRoot {...props} isMultiSelect={true}>\n <SelectChipDisplay ref={ref} {...chipDisplayProps} />\n <SelectContent {...contentPanelProps}>{children}</SelectContent>\n </SelectRoot>\n )\n})\n\n\nexport type MultiSelectChipDisplayUncontrolledProps = MultiSelectChipDisplayProps\nexport const MultiSelectChipDisplayUncontrolled = forwardRef<HTMLDivElement, MultiSelectChipDisplayUncontrolledProps>(function MultiSelectChipDisplayUncontrolled({\n values: initialValues,\n onValuesChanged,\n ...props\n }, ref) {\n const [values, setValues] = useState(initialValues)\n\n useEffect(() => {\n setValues(initialValues)\n }, [initialValues])\n\n return (\n <MultiSelectChipDisplay\n {...props}\n ref={ref}\n values={values}\n onValuesChanged={value => {\n setValues(value)\n onValuesChanged?.(value)\n }}\n />\n )\n})","import type { Dispatch, PropsWithChildren, SetStateAction } from 'react'\nimport { createContext, useContext, useEffect, useState } from 'react'\nimport { useLocalStorage } from '../hooks/useLocalStorage'\nimport type { Language } from './util'\nimport { LanguageUtil } from './util'\n\nexport type LanguageContextValue = {\n language: Language,\n setLanguage: Dispatch<SetStateAction<Language>>,\n}\n\nexport const LanguageContext = createContext<LanguageContextValue>({\n language: LanguageUtil.DEFAULT_LANGUAGE,\n setLanguage: (v) => v\n})\n\nexport const useLanguage = () => useContext(LanguageContext)\n\nexport const useLocale = (overWriteLanguage?: Language) => {\n const { language } = useLanguage()\n const mapping: Record<Language, string> = {\n en: 'en-US',\n de: 'de-DE'\n }\n return mapping[overWriteLanguage ?? language]\n}\n\ntype LanguageProviderProps = {\n initialLanguage?: Language,\n}\n\nexport const LanguageProvider = ({ initialLanguage, children }: PropsWithChildren<LanguageProviderProps>) => {\n const [language, setLanguage] = useState<Language>(initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n const [storedLanguage, setStoredLanguage] = useLocalStorage<Language>('language', initialLanguage ?? LanguageUtil.DEFAULT_LANGUAGE)\n\n useEffect(() => {\n if (language !== initialLanguage && initialLanguage) {\n console.warn('LanguageProvider initial state changed: Prefer using languageProvider\\'s setLanguage instead')\n setLanguage(initialLanguage)\n }\n }, [initialLanguage]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n document.documentElement.setAttribute('lang', language)\n setStoredLanguage(language)\n }, [language]) // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (storedLanguage !== null) {\n setLanguage(storedLanguage)\n return\n }\n\n const LanguageToTestAgainst = Object.values(LanguageUtil.languages)\n\n const matchingBrowserLanguage = window.navigator.languages\n .map(language => LanguageToTestAgainst.find((test) => language === test || language.split('-')[0] === test))\n .filter(entry => entry !== undefined)\n\n if (matchingBrowserLanguage.length === 0) return\n\n const firstMatch = matchingBrowserLanguage[0] as Language\n setLanguage(firstMatch)\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return (\n <LanguageContext.Provider value={{\n language,\n setLanguage\n }}>\n {children}\n </LanguageContext.Provider>\n )\n}","'use client'\n\nimport type { Dispatch, SetStateAction } from 'react'\nimport { useCallback, useState } from 'react'\nimport { LocalStorageService } from '@/src/utils/storage'\nimport { resolveSetState } from '@/src/utils/resolveSetState'\n\ntype SetValue<T> = Dispatch<SetStateAction<T>>\nexport const useLocalStorage = <T>(key: string, initValue: T): [T, SetValue<T>] => {\n const get = useCallback((): T => {\n if (typeof window === 'undefined') {\n return initValue\n }\n const storageService = new LocalStorageService()\n const value = storageService.get<T>(key)\n return value || initValue\n }, [initValue, key])\n\n const [storedValue, setStoredValue] = useState<T>(get)\n\n const setValue: SetValue<T> = useCallback(action => {\n const newValue = resolveSetState(action, storedValue)\n const storageService = new LocalStorageService()\n storageService.set(key, newValue)\n\n setStoredValue(newValue)\n }, [storedValue, setStoredValue, key])\n\n return [storedValue, setValue]\n}","/**\n * The supported languages\n */\nconst languages = ['en', 'de'] as const\n\n/**\n * The supported languages\n */\nexport type Language = typeof languages[number]\n\n/**\n * The supported languages' names in their respective language\n */\nconst languagesLocalNames: Record<Language, string> = {\n en: 'English',\n de: 'Deutsch',\n}\n\n/**\n * The default language\n */\nconst DEFAULT_LANGUAGE: Language = 'en'\n\n/**\n * A constant definition for holding data regarding languages\n */\nexport const LanguageUtil = {\n languages,\n DEFAULT_LANGUAGE,\n languagesLocalNames,\n}","import { useLanguage } from './LanguageProvider'\nimport type { Language } from './util'\n\n/**\n * A type describing the pluralization of a word\n */\nexport type TranslationPlural = {\n zero?: string,\n one?: string,\n two?: string,\n few?: string,\n many?: string,\n other: string,\n}\n\n/**\n * The type describing all values of a translation\n */\nexport type TranslationType = Record<string, string | TranslationPlural>\n\n/**\n * The type of translations\n */\nexport type Translation<T extends TranslationType> = Record<Language, T>\n\ntype OverwriteTranslationType<T extends TranslationType> = {\n language?: Language,\n translation?: Translation<Partial<T>>,\n}\n\n/**\n * Adds the `language` prop to the component props.\n *\n * @param Translation the type of the translation object\n *\n * @param Props the type of the component props, defaults to `Record<string, never>`,\n * if you don't expect any other props other than `language` and get an\n * error when using your component (because it uses `forwardRef` etc.)\n * you can try out `Record<string, unknown>`, this might resolve your\n * problem as `SomeType & never` is still `never` but `SomeType & unknown`\n * is `SomeType` which means that adding back props (like `ref` etc.)\n * works properly\n */\nexport type PropsForTranslation<\n Translation extends TranslationType,\n Props = unknown\n> = Props & {\n overwriteTranslation?: OverwriteTranslationType<Translation>,\n}\n\ntype StringKeys<T> = Extract<keyof T, string>;\n\ntype TranslationFunctionOptions = {\n replacements?: Record<string, string>,\n count?: number,\n}\ntype TranslationFunction<T extends TranslationType> = (key: StringKeys<T>, options?: TranslationFunctionOptions) => string\n\nexport const TranslationPluralCount = {\n zero: 0,\n one: 1,\n two: 2,\n few: 3,\n many: 11,\n other: -1,\n}\n\n\nexport const useTranslation = <T extends TranslationType>(\n translations: Translation<Partial<TranslationType>>[],\n overwriteTranslation: OverwriteTranslationType<T> = {}\n): TranslationFunction<T> => {\n const { language: languageProp, translation: overwrite } = overwriteTranslation\n const { language: inferredLanguage } = useLanguage()\n const usedLanguage = languageProp ?? inferredLanguage\n const usedTranslations = [...translations]\n if (overwrite) {\n usedTranslations.push(overwrite)\n }\n\n return (key: StringKeys<T>, options?: TranslationFunctionOptions): string => {\n const { count, replacements } = { ...{ count: 0, replacements: {} }, ...options }\n\n try {\n for (let i = translations.length - 1; i >= 0; i--) {\n const translation = translations[i]\n const localizedTranslation = translation[usedLanguage]\n if (!localizedTranslation) {\n continue\n }\n const value = localizedTranslation[key]\n if(!value) {\n continue\n }\n\n let forProcessing: string\n if (typeof value !== 'string') {\n if (count === TranslationPluralCount.zero && value?.zero) {\n forProcessing = value.zero\n } else if (count === TranslationPluralCount.one && value?.one) {\n forProcessing = value.one\n } else if (count === TranslationPluralCount.two && value?.two) {\n forProcessing = value.two\n } else if (TranslationPluralCount.few <= count && count < TranslationPluralCount.many && value?.few) {\n forProcessing = value.few\n } else if (count > TranslationPluralCount.many && value?.many) {\n forProcessing = value.many\n } else {\n forProcessing = value.other\n }\n } else {\n forProcessing = value\n }\n forProcessing = forProcessing.replace(/\\{\\{(\\w+)}}/g, (_, placeholder) => {\n return replacements[placeholder] ?? `{{key:${placeholder}}}` // fallback if key is missing\n })\n return forProcessing\n }\n } catch (e) {\n console.error(e)\n }\n return `{{${usedLanguage}:${key}}}`\n }\n}","import type { PropsWithChildren, ReactNode } from 'react'\nimport { forwardRef, useCallback, useEffect, useId, useState } from 'react'\nimport { ChevronDown } from 'lucide-react'\nimport clsx from 'clsx'\nimport { noop } from '@/src/utils/noop'\n\nexport type ExpansionIconProps = {\n isExpanded?: boolean,\n className?: string,\n}\n\nexport const ExpansionIcon = ({ isExpanded, className }: ExpansionIconProps) => {\n return (\n <ChevronDown\n aria-hidden={true}\n className={clsx(\n 'min-w-6 w-6 min-h-6 h-6 transition-transform motion-safe:duration-200 motion-reduce:duration-0 ease-in-out',\n { 'rotate-180': isExpanded },\n className\n )}\n />\n )\n}\n\ntype IconBuilder = (expanded: boolean) => ReactNode\n\nexport type ExpandableProps = PropsWithChildren<{\n id?: string,\n label: ReactNode,\n icon?: IconBuilder,\n isExpanded?: boolean,\n onChange?: (isExpanded: boolean) => void,\n /**\n * Whether the expansion should only happen when the header is clicked or on the entire component\n */\n clickOnlyOnHeader?: boolean,\n disabled?: boolean,\n className?: string,\n headerClassName?: string,\n contentClassName?: string,\n contentExpandedClassName?: string,\n}>\n\n/**\n * A Component for showing and hiding content\n */\nexport const Expandable = forwardRef<HTMLDivElement, ExpandableProps>(function Expandable({\n children,\n id: providedId,\n label,\n icon,\n isExpanded = false,\n onChange = noop,\n clickOnlyOnHeader = true,\n disabled = false,\n className,\n headerClassName,\n contentClassName,\n contentExpandedClassName,\n }, ref) {\n\n const defaultIcon = useCallback((expanded: boolean) => <ExpansionIcon isExpanded={expanded}/>, [])\n icon ??= defaultIcon\n\n const generatedId = useId()\n const id = providedId ?? generatedId\n\n return (\n <div\n ref={ref}\n onClick={() => !clickOnlyOnHeader && !disabled && onChange(!isExpanded)}\n\n className={clsx(\n 'flex-col-0 bg-surface text-on-surface group rounded-lg shadow-sm',\n { 'cursor-pointer': !clickOnlyOnHeader && !disabled }, className\n )}\n >\n <button\n onClick={() => clickOnlyOnHeader && !disabled && onChange(!isExpanded)}\n\n className={clsx(\n 'flex-row-2 py-2 px-4 rounded-lg justify-between items-center bg-surface text-on-surface select-none',\n {\n 'group-hover:brightness-97': !isExpanded,\n 'hover:brightness-97': isExpanded && !disabled,\n 'cursor-pointer': clickOnlyOnHeader && !disabled,\n },\n headerClassName\n )}\n\n aria-expanded={isExpanded}\n aria-controls={`${id}-content`}\n aria-disabled={disabled ?? undefined}\n >\n {label}\n {icon(isExpanded)}\n </button>\n <div\n id={`${id}-content`}\n className={clsx(\n 'flex-col-2 px-4 transition-all duration-300 ease-in-out',\n {\n [clsx('max-h-96 opacity-100 pb-2 overflow-y-auto', contentExpandedClassName)]: isExpanded,\n 'max-h-0 opacity-0 overflow-hidden': !isExpanded,\n },\n contentClassName\n )}\n\n role=\"region\"\n >\n {children}\n </div>\n </div>\n )\n})\n\nexport const ExpandableUncontrolled = forwardRef<HTMLDivElement, ExpandableProps>(function ExpandableUncontrolled({\n isExpanded,\n onChange = noop,\n ...props\n },\n ref) {\n const [usedIsExpanded, setUsedIsExpanded] = useState(isExpanded)\n\n useEffect(() => {\n setUsedIsExpanded(isExpanded)\n }, [isExpanded])\n\n return (\n <Expandable\n {...props}\n ref={ref}\n isExpanded={usedIsExpanded}\n onChange={value => {\n onChange(value)\n setUsedIsExpanded(value)\n }}\n />\n )\n})\n","export const noop = () => undefined\n","'use client'\n\nimport type { MutableRefObject } from 'react'\nimport { useCallback, useEffect, useId, useRef, useState } from 'react'\nimport { useIsMounted } from '@/src/hooks/focus/useIsMounted'\n\nconst createFocusGuard = () => {\n const div = document.createElement('div')\n Object.assign(div.style, {\n opacity: '0',\n outline: 'none',\n boxShadow: 'none',\n position: 'fixed',\n pointerEvents: 'none',\n touchAction: 'none',\n })\n div.tabIndex = 0\n div.setAttribute('data-hw-focus-guard', '')\n document.body.appendChild(div)\n return div\n}\n\nfunction getContainedFocusableElements(element: HTMLElement) {\n return element?.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])')\n}\n\ntype ListenerType = {\n id: string,\n pause: () => void,\n unpause: () => void,\n focus: () => void,\n focusLast: () => void,\n container: MutableRefObject<HTMLElement>,\n initialFocusElement: MutableRefObject<HTMLElement>,\n}\n\nclass FocusTrapService {\n // The last entry is always the active one\n private listeners: ListenerType[] = []\n\n public getActive(): ListenerType | undefined {\n if (this.listeners.length === 0) return undefined\n return this.listeners[this.listeners.length - 1]\n }\n\n private focusElement() {\n const active = this.getActive()\n if(!active) return\n const { container, initialFocusElement } = active\n const containerElement = container.current\n // Try in the following order\n // 1. Focus the initial element\n // 2. Focus the first focusable element in the container\n // 3. Focus the container\n if (initialFocusElement?.current) {\n initialFocusElement.current.focus()\n } else {\n const elements = getContainedFocusableElements(containerElement)\n if (elements && elements.length > 0) {\n const first = elements.item(0) as HTMLElement\n first.focus()\n } else {\n containerElement.focus()\n }\n }\n }\n\n private onFocusIn = (event: FocusEvent) => {\n const active = this.getActive()\n if(!active || !active.container.current) return\n const { container } = active\n if (!container.current.contains(event.target as HTMLElement)) {\n this.focusElement()\n }\n }\n\n private removeGuards() {\n document.querySelectorAll('[data-hw-focus-guard]').forEach((node) => node.remove())\n }\n\n private addGuards() {\n document.body.insertAdjacentElement('afterbegin', createFocusGuard())\n document.body.insertAdjacentElement('beforeend', createFocusGuard())\n }\n\n private activate() {\n document.addEventListener('focusin', this.onFocusIn)\n this.addGuards()\n }\n\n private deactivate() {\n document.removeEventListener('focusin', this.onFocusIn)\n this.removeGuards()\n }\n\n register(listener: ListenerType) {\n this.listeners.push(listener)\n if (this.listeners.length === 1) {\n this.activate()\n }\n const active = listener\n this.listeners.forEach((listener) => {\n const { focus, pause } = listener\n if (listener === active) {\n focus()\n } else {\n pause()\n }\n })\n }\n\n unregister(id: string) {\n const index = this.listeners.findIndex(trap => trap.id === id)\n if (index !== -1) {\n const isActive = index === this.listeners.length - 1\n const listener = this.listeners[index]\n this.listeners = this.listeners.filter(listener => listener.id !== id)\n if (isActive) {\n // Deactivate all focus traps\n this.deactivate()\n // Focus last element in previous focus context\n listener.focusLast()\n // Activate and pause remaining focus traps\n const active = this.getActive()\n this.listeners.forEach((listener) => {\n const { pause, unpause } = listener\n if (listener === active) {\n unpause()\n } else {\n pause()\n }\n })\n // Reactivate\n if (this.listeners.length > 0) {\n this.activate()\n }\n }\n } else {\n console.warn(`Unable to unregister id ${id}: not found`)\n }\n }\n}\n\nconst service = new FocusTrapService()\n\nexport type UseFocusTrapProps = {\n container: MutableRefObject<HTMLElement>,\n active?: boolean,\n initialFocus?: MutableRefObject<HTMLElement>,\n /**\n * Whether to focus the first element when the initialFocus isn't provided\n *\n * Focuses the container instead\n */\n focusFirst?: boolean,\n}\n\nexport const useFocusTrap = ({\n container,\n active = true,\n initialFocus,\n focusFirst = true,\n }: UseFocusTrapProps) => {\n const lastFocusRef = useRef<HTMLElement | null>(null)\n const [paused, setPaused] = useState(false)\n const isMounted = useIsMounted()\n const id = useId()\n\n const focusElement = useCallback(() => {\n const containerElement = container.current\n // Try in the following order\n // 1. Focus the initial element\n // 2. Focus the first focusable element in the container\n // 3. Focus the container\n if (initialFocus?.current) {\n initialFocus.current.focus()\n } else {\n const elements = getContainedFocusableElements(containerElement)\n if (elements && elements.length > 0) {\n const first = elements.item(0) as HTMLElement\n first.focus()\n } else {\n containerElement.focus()\n }\n }\n }, [container, initialFocus])\n\n useEffect(() => {\n if (active && isMounted) {\n if (!lastFocusRef.current) {\n lastFocusRef.current = document.activeElement as HTMLElement\n }\n\n function pause() {\n setPaused(true)\n }\n\n function unpause() {\n setPaused(false)\n if (!container.current.contains(document.activeElement as HTMLElement)) {\n focusElement()\n }\n }\n\n function focus() {\n focusElement()\n setPaused(false)\n }\n\n function focusLast() {\n lastFocusRef.current?.focus()\n }\n\n service.register({ id, pause, focus, focusLast, unpause, container, initialFocusElement: initialFocus })\n return () => {\n service.unregister(id)\n lastFocusRef.current = undefined\n }\n }\n }, [active, container, focusElement, id, initialFocus, isMounted])\n\n useEffect(() => {\n if (active && !paused && isMounted) {\n const containerElement = container.current\n\n function onKeyDown(event: KeyboardEvent) {\n const key = event.key\n const elements = getContainedFocusableElements(containerElement)\n const active = document.activeElement as HTMLElement\n const index = [...elements].findIndex(value => value === active)\n if (index === -1 || event.altKey || event.ctrlKey || event.metaKey) {\n return\n }\n if (key === 'Tab') {\n const next = event.shiftKey ? -1 : 1\n const nextIndex = (index + next + elements.length) % elements.length\n const nextElement = elements[nextIndex] as HTMLElement\n nextElement.focus()\n event.preventDefault()\n }\n }\n\n // Register and unregister the listeners\n containerElement.addEventListener('keydown', onKeyDown)\n return () => {\n containerElement.removeEventListener('keydown', onKeyDown)\n }\n }\n }, [active, paused, isMounted, container, initialFocus, focusFirst, focusElement])\n}","'use client'\n\nimport { useEffect, useLayoutEffect, useState } from 'react'\n\nconst isClient = typeof window !== 'undefined' && typeof document !== 'undefined'\nconst useIsomorphicEffect = isClient ? useLayoutEffect : useEffect\n\nexport const useIsMounted = () => {\n const [isMounted, setIsMounted] = useState(false)\n\n useIsomorphicEffect(() => {\n setIsMounted(true)\n return () => {\n setIsMounted(false)\n }\n }, [])\n return isMounted\n}","export const match = <K extends string | number | symbol, V>(key: K, values: Record<K, V>) => {\n return values[key]\n}","import type { HTMLAttributes, PropsWithChildren, ReactNode } from 'react'\nimport clsx from 'clsx'\n\nconst chipColors = ['default', 'dark', 'red', 'yellow', 'green', 'blue', 'pink', 'orange'] as const\nexport type ChipColor = typeof chipColors[number]\n\ntype ChipVariant = 'normal' | 'fullyRounded'\ntype ChipSize = 'sm' | 'md' | 'lg'\n\nexport const ChipUtil = {\n colors: chipColors,\n}\n\nexport type ChipProps = HTMLAttributes<HTMLDivElement> & PropsWithChildren<{\n color?: ChipColor,\n size?: ChipSize,\n icon?: boolean,\n variant?: ChipVariant,\n trailingIcon?: ReactNode,\n}>\n\n/**\n * A component for displaying a single chip\n */\nexport const Chip = ({\n children,\n trailingIcon,\n color = 'default',\n size = 'md',\n icon = false,\n variant = 'normal',\n className = '',\n ...restProps\n }: ChipProps) => {\n const colorMapping: string = {\n default: 'text-tag-default-text bg-tag-default-background',\n dark: 'text-tag-dark-text bg-tag-dark-background',\n red: 'text-tag-red-text bg-tag-red-background',\n yellow: 'text-tag-yellow-text bg-tag-yellow-background',\n green: 'text-tag-green-text bg-tag-green-background',\n blue: 'text-tag-blue-text bg-tag-blue-background',\n pink: 'text-tag-pink-text bg-tag-pink-background',\n orange: 'text-tag-orange-text bg-tag-orange-background',\n }[color]\n\n const colorMappingIcon: string = {\n default: 'text-tag-default-icon',\n dark: 'text-tag-dark-icon',\n red: 'text-tag-red-icon',\n yellow: 'text-tag-yellow-icon',\n green: 'text-tag-green-icon',\n blue: 'text-tag-blue-icon',\n pink: 'text-tag-pink-icon',\n orange: 'text-tag-orange-icon',\n }[color]\n\n return (\n <div\n {...restProps}\n className={clsx(\n `flex-row-0 w-fit font-semibold`,\n colorMapping,\n !icon ? {\n 'px-1 py-0.5': size === 'sm',\n 'px-2 py-1': size === 'md',\n 'px-4 py-2': size === 'lg',\n } : {\n 'p-0.5': size === 'sm',\n 'p-1': size === 'md',\n 'p-2': size === 'lg',\n },\n {\n 'rounded-md': variant === 'normal',\n 'rounded-full': variant === 'fullyRounded',\n },\n className\n )}\n >\n {children}\n {trailingIcon && (<span className={colorMappingIcon}>{trailingIcon}</span>)}\n </div>\n )\n}\n\nexport type ChipListProps = {\n list: ChipProps[],\n className?: string,\n}\n\n/**\n * A component for displaying a list of chips\n */\nexport const ChipList = ({\n list,\n className = ''\n }: ChipListProps) => {\n return (\n <div className={clsx('flex flex-wrap gap-x-2 gap-y-2', className)}>\n {list.map((value, index) => (\n <Chip\n key={index}\n {...value}\n color={value.color ?? 'default'}\n variant={value.variant ?? 'normal'}\n >\n {value.children}\n </Chip>\n ))}\n </div>\n )\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react'\nimport { forwardRef } from 'react'\nimport clsx from 'clsx'\n\n\nexport const ButtonColorUtil = {\n solid: ['primary', 'secondary', 'tertiary', 'positive', 'warning', 'negative', 'neutral'] as const,\n text: ['primary', 'negative', 'neutral'] as const,\n outline: ['primary'] as const,\n}\n\nexport const IconButtonUtil = {\n icon: [...ButtonColorUtil.solid, 'transparent'] as const,\n}\n\n\n/**\n * The allowed colors for the SolidButton and IconButton\n */\nexport type SolidButtonColor = typeof ButtonColorUtil.solid[number]\n/**\n * The allowed colors for the OutlineButton\n */\nexport type OutlineButtonColor = typeof ButtonColorUtil.outline[number]\n/**\n * The allowed colors for the TextButton\n */\nexport type TextButtonColor = typeof ButtonColorUtil.text[number]\n/**\n * The allowed colors for the IconButton\n */\nexport type IconButtonColor = typeof IconButtonUtil.icon[number]\n\n\n/**\n * The different sizes for a button\n */\ntype ButtonSizes = 'small' | 'medium' | 'large'\n\ntype IconButtonSize = 'tiny' | 'small' | 'medium' | 'large'\n\n/**\n * The shard properties between all button types\n */\nexport type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /**\n * @default 'medium'\n */\n size?: ButtonSizes,\n}\n\nconst paddingMapping: Record<ButtonSizes, string> = {\n small: 'btn-sm',\n medium: 'btn-md',\n large: 'btn-lg'\n}\n\nconst iconPaddingMapping: Record<IconButtonSize, string> = {\n tiny: 'icon-btn-xs',\n small: 'icon-btn-sm',\n medium: 'icon-btn-md',\n large: 'icon-btn-lg'\n}\n\nexport const ButtonUtil = {\n paddingMapping,\n iconPaddingMapping\n}\n\ntype ButtonWithIconsProps = ButtonProps & {\n startIcon?: ReactNode,\n endIcon?: ReactNode,\n}\n\nexport type SolidButtonProps = ButtonWithIconsProps & {\n color?: SolidButtonColor,\n}\n\nexport type OutlineButtonProps = ButtonWithIconsProps & {\n color?: OutlineButtonColor,\n}\n\nexport type TextButtonProps = ButtonWithIconsProps & {\n color?: TextButtonColor,\n coloredHoverBackground?: boolean,\n}\n\n/**\n * The shard properties between all button types\n */\nexport type IconButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /**\n * @default 'medium'\n */\n size?: IconButtonSize,\n color?: IconButtonColor,\n}\n\n/**\n * A button with a solid background and different sizes\n */\nexport const SolidButton = forwardRef<HTMLButtonElement, SolidButtonProps>(function SolidButton({\n children,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }, ref) {\n const colorClasses = {\n primary: 'not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text',\n secondary: 'not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text',\n tertiary: 'not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text',\n positive: 'not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text',\n warning: 'not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text',\n negative: 'not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text',\n neutral: 'not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-solid-primary-icon',\n secondary: 'not-group-disabled:text-button-solid-secondary-icon',\n tertiary: 'not-group-disabled:text-button-solid-tertiary-icon',\n positive: 'not-group-disabled:text-button-solid-positive-icon',\n warning: 'not-group-disabled:text-button-solid-warning-icon',\n negative: 'not-group-disabled:text-button-solid-negative-icon',\n neutral: 'not-group-disabled:text-button-solid-neutral-icon',\n }[color]\n\n return (\n <button\n ref={ref}\n onClick={onClick}\n className={clsx(\n 'group font-semibold',\n colorClasses,\n 'not-disabled:hover:brightness-90',\n 'disabled:text-disabled-text disabled:bg-disabled-background',\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n})\n\n/**\n * A button with an outline border and different sizes\n */\nexport const OutlineButton = ({\n children,\n color = 'primary',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n className,\n ...restProps\n }: OutlineButtonProps) => {\n const colorClasses = {\n primary: 'not-disabled:border-button-outline-primary-text not-disabled:text-button-outline-primary-text',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-outline-primary-icon',\n }[color]\n return (\n <button\n onClick={onClick}\n className={clsx(\n 'group font-semibold bg-transparent border-2 ',\n 'not-disabled:hover:brightness-80',\n colorClasses,\n 'disabled:text-disabled-text disabled:border-disabled-outline',\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n/**\n * A text that is a button that can have different sizes\n */\nexport const TextButton = ({\n children,\n color = 'neutral',\n size = 'medium',\n startIcon,\n endIcon,\n onClick,\n coloredHoverBackground = true,\n className,\n ...restProps\n }: TextButtonProps) => {\n const colorClasses = {\n primary: 'not-disabled:bg-transparent not-disabled:text-button-text-primary-text focus-style-none focus-visible:ring-2 not-disabled:focus-visible:ring-button-text-primary-text',\n negative: 'not-disabled:bg-transparent not-disabled:text-button-text-negative-text focus-style-none focus-visible:ring-2 not-disabled:focus-visible:ring-button-text-negative-text',\n neutral: 'not-disabled:bg-transparent not-disabled:text-button-text-neutral-text focus-style-none focus-visible:ring-2 not-disabled:focus-visible:ring-button-text-neutral-text',\n }[color]\n\n const backgroundColor = {\n primary: 'not-disabled:hover:bg-button-text-primary-text/20 not-disabled:focus-visible:bg-button-text-primary-text/20',\n negative: 'not-disabled:hover:bg-button-text-negative-text/20 not-disabled:focus-visible:bg-button-text-negative-text/20',\n neutral: 'not-disabled:hover:bg-button-text-neutral-text/20 not-disabled:focus-visible:bg-button-text-neutral-text/20',\n }[color]\n\n const iconColorClasses = {\n primary: 'not-group-disabled:text-button-text-primary-icon',\n negative: 'not-group-disabled:text-button-text-negative-icon',\n neutral: 'not-group-disabled:text-button-text-neutral-icon',\n }[color]\n\n return (\n <button\n onClick={onClick}\n className={clsx(\n 'group font-semibold',\n 'disabled:text-disabled-text',\n colorClasses,\n {\n [backgroundColor]: coloredHoverBackground,\n 'not-disabled:hover:bg-button-text-hover-background': !coloredHoverBackground,\n },\n ButtonUtil.paddingMapping[size],\n className\n )}\n {...restProps}\n >\n {startIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {startIcon}\n </span>\n )}\n {children}\n {endIcon && (\n <span\n className={clsx(\n iconColorClasses,\n 'group-disabled:text-disabled-icon'\n )}\n >\n {endIcon}\n </span>\n )}\n </button>\n )\n}\n\n\n/**\n * A button for icons with a solid background and different sizes\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton({\n children,\n color = 'primary',\n size = 'medium',\n className,\n ...restProps\n }, ref)\n{\n const colorClasses = {\n primary: 'not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text',\n secondary: 'not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text',\n tertiary: 'not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text',\n positive: 'not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text',\n warning: 'not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text',\n negative: 'not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text',\n neutral: 'not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text',\n transparent: 'not-disabled:bg-transparent',\n }[color]\n\n return (\n <button\n ref={ref}\n className={clsx(\n colorClasses,\n 'not-disabled:hover:brightness-90',\n 'disabled:text-disabled-text',\n {\n 'disabled:bg-disabled-background': color !== 'transparent',\n 'disabled:opacity-70': color === 'transparent',\n 'not-disabled:hover:bg-button-text-hover-background': color === 'transparent',\n },\n ButtonUtil.iconPaddingMapping[size],\n className\n )}\n {...restProps}\n >\n {children}\n </button>\n )\n})","'use client'\n\nimport type { CSSProperties, MutableRefObject } from 'react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { clamp } from '@/src/utils/math'\nimport { useIsMounted } from '@/src/hooks/focus/useIsMounted'\n\nexport type FloatingElementAlignment = 'beforeStart' | 'afterStart' | 'center' | 'beforeEnd' | 'afterEnd'\n\ntype RectangleBounds = {\n top: number,\n right: number,\n bottom: number,\n left: number,\n width: number,\n height: number,\n}\n\ntype CalculatePositionOptions = {\n verticalAlignment?: FloatingElementAlignment,\n horizontalAlignment?: FloatingElementAlignment,\n screenPadding?: number,\n gap?: number,\n}\n\ntype CalculatePositionProps = {\n windowRect: RectangleBounds,\n containerRect: RectangleBounds,\n anchorRect: RectangleBounds,\n options: CalculatePositionOptions,\n}\n\ntype UseFloatingElementStyle = {\n left: number,\n top: number,\n maxWidth: number,\n maxHeight: number,\n}\n\nfunction calculatePosition({\n windowRect,\n containerRect,\n anchorRect,\n options,\n }: CalculatePositionProps): UseFloatingElementStyle {\n const { verticalAlignment, horizontalAlignment, gap, screenPadding } = options\n const windowWidth = windowRect.width\n const windowHeight = windowRect.height\n\n const maxWidth = windowWidth - 2 * screenPadding\n const maxHeight = windowHeight - 2 * screenPadding\n\n const width = Math.min(containerRect.width, maxWidth)\n const height = Math.min(containerRect.height, maxHeight)\n\n const leftSuggestion = {\n beforeStart: anchorRect.left - width - gap,\n afterStart: anchorRect.left,\n center: anchorRect.left + anchorRect.width / 2 - width / 2,\n beforeEnd: anchorRect.right - width,\n afterEnd: anchorRect.right + gap,\n }[horizontalAlignment]\n\n const topSuggestion = {\n beforeStart: anchorRect.top - height - gap,\n afterStart: anchorRect.top,\n center: anchorRect.top + anchorRect.height / 2 - height / 2,\n beforeEnd: anchorRect.bottom - height,\n afterEnd: anchorRect.bottom + gap,\n }[verticalAlignment]\n\n const left = clamp(leftSuggestion, [\n screenPadding,\n windowWidth - screenPadding - width,\n ])\n\n const top = clamp(topSuggestion, [\n screenPadding,\n windowHeight - screenPadding - height,\n ])\n\n return {\n left,\n top,\n maxWidth,\n maxHeight,\n }\n}\n\nexport type UseFloatingElementOptions = CalculatePositionOptions & {\n isPolling?: boolean,\n pollingInterval?: number,\n}\n\nexport type UseFloatingElementProps = UseFloatingElementOptions & {\n containerRef: MutableRefObject<HTMLElement>,\n anchorRef: MutableRefObject<HTMLElement>,\n windowRef?: MutableRefObject<HTMLElement>,\n active?: boolean,\n}\n\nexport function useFloatingElement({\n active = true,\n windowRef,\n anchorRef,\n containerRef,\n isPolling = false,\n pollingInterval = 100,\n verticalAlignment = 'afterEnd',\n horizontalAlignment = 'afterStart',\n screenPadding = 16,\n gap = 4,\n }: UseFloatingElementProps) {\n const [style, setStyle] = useState<CSSProperties>()\n const isMounted = useIsMounted()\n\n const calculate = useCallback(() => {\n const containerRect = containerRef.current.getBoundingClientRect()\n const windowRect: RectangleBounds = windowRef?.current.getBoundingClientRect() ?? {\n top: 0,\n bottom: window.innerHeight,\n left: 0,\n right: window.innerWidth,\n width: window.innerWidth,\n height: window.innerHeight,\n }\n const anchorElement = anchorRef?.current\n if (anchorRef && !anchorElement) {\n console.warn('FloatingContainer anchor provided, but its value is undefined')\n }\n const anchorRect: RectangleBounds = anchorElement?.getBoundingClientRect() ?? windowRect\n\n const calculateProps: CalculatePositionProps = {\n windowRect,\n anchorRect,\n containerRect,\n options: {\n horizontalAlignment,\n verticalAlignment,\n screenPadding,\n gap,\n }\n }\n setStyle(calculatePosition(calculateProps))\n }, [anchorRef, containerRef, gap, horizontalAlignment, screenPadding, verticalAlignment, windowRef])\n\n\n const height = containerRef.current?.getBoundingClientRect().height\n const width = containerRef.current?.getBoundingClientRect().width\n useEffect(() => {\n if (active && isMounted) {\n calculate()\n } else {\n setStyle(undefined)\n }\n }, [calculate, active, isMounted, height, width])\n\n useEffect(() => {\n window.addEventListener('resize', calculate)\n let timeout: NodeJS.Timeout\n if (isPolling) {\n timeout = setInterval(calculate, pollingInterval)\n }\n return () => {\n window.removeEventListener('resize', calculate)\n if (timeout) {\n clearInterval(timeout)\n }\n }\n }, [calculate, isPolling, pollingInterval])\n\n return style\n}","export const clamp = (value: number, range: [number, number] = [0, 1]): number => {\n const [min, max] = range\n return Math.min(Math.max(value, min), max)\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,IAAAA,gBAUO;AACP,IAAAC,eAAiB;;;ACXjB,IAAAC,gBAA+D;;;ACE/D,mBAAsC;;;ACAtC,IAAM,YAAY,CAAC,MAAM,IAAI;AAU7B,IAAM,sBAAgD;AAAA,EACpD,IAAI;AAAA,EACJ,IAAI;AACN;AAKA,IAAM,mBAA6B;AAK5B,IAAM,eAAe;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AACF;;;AFoCI;AAvDG,IAAM,sBAAkB,6BAAoC;AAAA,EACjE,UAAU,aAAa;AAAA,EACvB,aAAa,CAAC,MAAM;AACtB,CAAC;AAEM,IAAM,cAAc,UAAM,0BAAW,eAAe;;;AG0CpD,IAAM,yBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AACT;AAGO,IAAM,iBAAiB,CAC5B,cACA,uBAAoD,CAAC,MAC1B;AAC3B,QAAM,EAAE,UAAU,cAAc,aAAa,UAAU,IAAI;AAC3D,QAAM,EAAE,UAAU,iBAAiB,IAAI,YAAY;AACnD,QAAM,eAAe,gBAAgB;AACrC,QAAM,mBAAmB,CAAC,GAAG,YAAY;AACzC,MAAI,WAAW;AACb,qBAAiB,KAAK,SAAS;AAAA,EACjC;AAEA,SAAO,CAAC,KAAoB,YAAiD;AAC3E,UAAM,EAAE,OAAO,aAAa,IAAI,EAAE,GAAG,EAAE,OAAO,GAAG,cAAc,CAAC,EAAE,GAAG,GAAG,QAAQ;AAEhF,QAAI;AACF,eAAS,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK;AACjD,cAAM,cAAc,aAAa,CAAC;AAClC,cAAM,uBAAuB,YAAY,YAAY;AACrD,YAAI,CAAC,sBAAsB;AACzB;AAAA,QACF;AACA,cAAM,QAAQ,qBAAqB,GAAG;AACtC,YAAG,CAAC,OAAO;AACT;AAAA,QACF;AAEA,YAAI;AACJ,YAAI,OAAO,UAAU,UAAU;AAC7B,cAAI,UAAU,uBAAuB,QAAQ,OAAO,MAAM;AACxD,4BAAgB,MAAM;AAAA,UACxB,WAAW,UAAU,uBAAuB,OAAO,OAAO,KAAK;AAC7D,4BAAgB,MAAM;AAAA,UACxB,WAAW,UAAU,uBAAuB,OAAO,OAAO,KAAK;AAC7D,4BAAgB,MAAM;AAAA,UACxB,WAAW,uBAAuB,OAAO,SAAS,QAAQ,uBAAuB,QAAQ,OAAO,KAAK;AACnG,4BAAgB,MAAM;AAAA,UACxB,WAAW,QAAQ,uBAAuB,QAAQ,OAAO,MAAM;AAC7D,4BAAgB,MAAM;AAAA,UACxB,OAAO;AACL,4BAAgB,MAAM;AAAA,UACxB;AAAA,QACF,OAAO;AACL,0BAAgB;AAAA,QAClB;AACA,wBAAgB,cAAc,QAAQ,gBAAgB,CAAC,GAAG,gBAAgB;AACxE,iBAAO,aAAa,WAAW,KAAK,SAAS,WAAW;AAAA,QAC1D,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF,SAAS,GAAG;AACV,cAAQ,MAAM,CAAC;AAAA,IACjB;AACA,WAAO,KAAK,YAAY,IAAI,GAAG;AAAA,EACjC;AACF;;;AC1HA,IAAAC,gBAAoE;AACpE,0BAA4B;AAC5B,kBAAiB;;;ACHV,IAAM,OAAO,MAAM;;;ADatB,IAAAC,sBAAA;AAFG,IAAM,gBAAgB,CAAC,EAAE,YAAY,UAAU,MAA0B;AAC9E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAa;AAAA,MACb,eAAW,YAAAC;AAAA,QACT;AAAA,QACA,EAAE,cAAc,WAAW;AAAA,QAC3B;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAwBO,IAAM,iBAAa,0BAA4C,SAASC,YAAW;AAAA,EACE;AAAA,EACA,IAAI;AAAA,EACJ;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,WAAW;AAAA,EACX,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAG,KAAK;AAEhG,QAAM,kBAAc,2BAAY,CAAC,aAAsB,6CAAC,iBAAc,YAAY,UAAS,GAAI,CAAC,CAAC;AACjG,WAAS;AAET,QAAM,kBAAc,qBAAM;AAC1B,QAAM,KAAK,cAAc;AAEzB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,SAAS,MAAM,CAAC,qBAAqB,CAAC,YAAY,SAAS,CAAC,UAAU;AAAA,MAEtE,eAAW,YAAAD;AAAA,QACT;AAAA,QACA,EAAE,kBAAkB,CAAC,qBAAqB,CAAC,SAAS;AAAA,QAAG;AAAA,MACzD;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,MAAM,qBAAqB,CAAC,YAAY,SAAS,CAAC,UAAU;AAAA,YAErE,eAAW,YAAAA;AAAA,cACT;AAAA,cACA;AAAA,gBACE,6BAA6B,CAAC;AAAA,gBAC9B,uBAAuB,cAAc,CAAC;AAAA,gBACtC,kBAAkB,qBAAqB,CAAC;AAAA,cAC1C;AAAA,cACA;AAAA,YACF;AAAA,YAEA,iBAAe;AAAA,YACf,iBAAe,GAAG,EAAE;AAAA,YACpB,iBAAe,YAAY;AAAA,YAE1B;AAAA;AAAA,cACA,KAAK,UAAU;AAAA;AAAA;AAAA,QAClB;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,GAAG,EAAE;AAAA,YACT,eAAW,YAAAA;AAAA,cACT;AAAA,cACA;AAAA,gBACE,KAAC,YAAAA,SAAK,6CAA6C,wBAAwB,CAAC,GAAG;AAAA,gBAC/E,qCAAqC,CAAC;AAAA,cACxC;AAAA,cACA;AAAA,YACF;AAAA,YAEA,MAAK;AAAA,YAEJ;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAEM,IAAM,6BAAyB,0BAA4C,SAASE,wBAAuB;AAAA,EACE;AAAA,EACA,WAAW;AAAA,EACX,GAAG;AACL,GACA,KAAK;AACrH,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,wBAAS,UAAU;AAE/D,+BAAU,MAAM;AACd,sBAAkB,UAAU;AAAA,EAC9B,GAAG,CAAC,UAAU,CAAC;AAEf,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA,YAAY;AAAA,MACZ,UAAU,WAAS;AACjB,iBAAS,KAAK;AACd,0BAAkB,KAAK;AAAA,MACzB;AAAA;AAAA,EACF;AAEJ,CAAC;;;AExID,IAAAC,gBAAgE;;;ACDhE,IAAAC,gBAAqD;AAErD,IAAM,WAAW,OAAO,WAAW,eAAe,OAAO,aAAa;AACtE,IAAM,sBAAsB,WAAW,gCAAkB;AAElD,IAAM,eAAe,MAAM;AAChC,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAEhD,sBAAoB,MAAM;AACxB,iBAAa,IAAI;AACjB,WAAO,MAAM;AACX,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AACL,SAAO;AACT;;;ADXA,IAAM,mBAAmB,MAAM;AAC7B,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,SAAO,OAAO,IAAI,OAAO;AAAA,IACvB,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,eAAe;AAAA,IACf,aAAa;AAAA,EACf,CAAC;AACD,MAAI,WAAW;AACf,MAAI,aAAa,uBAAuB,EAAE;AAC1C,WAAS,KAAK,YAAY,GAAG;AAC7B,SAAO;AACT;AAEA,SAAS,8BAA8B,SAAsB;AAC3D,SAAO,SAAS,iBAAiB,0EAA0E;AAC7G;AAYA,IAAM,mBAAN,MAAuB;AAAA,EAAvB;AAEE;AAAA,SAAQ,YAA4B,CAAC;AA6BrC,SAAQ,YAAY,CAAC,UAAsB;AACzC,YAAM,SAAS,KAAK,UAAU;AAC9B,UAAG,CAAC,UAAU,CAAC,OAAO,UAAU,QAAS;AACzC,YAAM,EAAE,UAAU,IAAI;AACtB,UAAI,CAAC,UAAU,QAAQ,SAAS,MAAM,MAAqB,GAAG;AAC5D,aAAK,aAAa;AAAA,MACpB;AAAA,IACF;AAAA;AAAA,EAlCO,YAAsC;AAC3C,QAAI,KAAK,UAAU,WAAW,EAAG,QAAO;AACxC,WAAO,KAAK,UAAU,KAAK,UAAU,SAAS,CAAC;AAAA,EACjD;AAAA,EAEQ,eAAe;AACrB,UAAM,SAAS,KAAK,UAAU;AAC9B,QAAG,CAAC,OAAQ;AACZ,UAAM,EAAE,WAAW,oBAAoB,IAAI;AAC3C,UAAM,mBAAmB,UAAU;AAKnC,QAAI,qBAAqB,SAAS;AAChC,0BAAoB,QAAQ,MAAM;AAAA,IACpC,OAAO;AACL,YAAM,WAAW,8BAA8B,gBAAgB;AAC/D,UAAI,YAAY,SAAS,SAAS,GAAG;AACnC,cAAM,QAAQ,SAAS,KAAK,CAAC;AAC7B,cAAM,MAAM;AAAA,MACd,OAAO;AACL,yBAAiB,MAAM;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EAWQ,eAAe;AACrB,aAAS,iBAAiB,uBAAuB,EAAE,QAAQ,CAAC,SAAS,KAAK,OAAO,CAAC;AAAA,EACpF;AAAA,EAEQ,YAAY;AAClB,aAAS,KAAK,sBAAsB,cAAc,iBAAiB,CAAC;AACpE,aAAS,KAAK,sBAAsB,aAAa,iBAAiB,CAAC;AAAA,EACrE;AAAA,EAEQ,WAAW;AACjB,aAAS,iBAAiB,WAAW,KAAK,SAAS;AACnD,SAAK,UAAU;AAAA,EACjB;AAAA,EAEQ,aAAa;AACnB,aAAS,oBAAoB,WAAW,KAAK,SAAS;AACtD,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,SAAS,UAAwB;AAC/B,SAAK,UAAU,KAAK,QAAQ;AAC5B,QAAI,KAAK,UAAU,WAAW,GAAG;AAC/B,WAAK,SAAS;AAAA,IAChB;AACA,UAAM,SAAS;AACf,SAAK,UAAU,QAAQ,CAACC,cAAa;AACnC,YAAM,EAAE,OAAO,MAAM,IAAIA;AACzB,UAAIA,cAAa,QAAQ;AACvB,cAAM;AAAA,MACR,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,WAAW,IAAY;AACrB,UAAM,QAAQ,KAAK,UAAU,UAAU,UAAQ,KAAK,OAAO,EAAE;AAC7D,QAAI,UAAU,IAAI;AAChB,YAAM,WAAW,UAAU,KAAK,UAAU,SAAS;AACnD,YAAM,WAAW,KAAK,UAAU,KAAK;AACrC,WAAK,YAAY,KAAK,UAAU,OAAO,CAAAA,cAAYA,UAAS,OAAO,EAAE;AACrE,UAAI,UAAU;AAEZ,aAAK,WAAW;AAEhB,iBAAS,UAAU;AAEnB,cAAM,SAAS,KAAK,UAAU;AAC9B,aAAK,UAAU,QAAQ,CAACA,cAAa;AACnC,gBAAM,EAAE,OAAO,QAAQ,IAAIA;AAC3B,cAAIA,cAAa,QAAQ;AACvB,oBAAQ;AAAA,UACV,OAAO;AACL,kBAAM;AAAA,UACR;AAAA,QACF,CAAC;AAED,YAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,eAAK,SAAS;AAAA,QAChB;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ,KAAK,2BAA2B,EAAE,aAAa;AAAA,IACzD;AAAA,EACF;AACF;AAEA,IAAM,UAAU,IAAI,iBAAiB;AAc9B,IAAM,eAAe,CAAC;AAAA,EACE;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,aAAa;AACf,MAAyB;AACpD,QAAM,mBAAe,sBAA2B,IAAI;AACpD,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAC1C,QAAM,YAAY,aAAa;AAC/B,QAAM,SAAK,qBAAM;AAEjB,QAAM,mBAAe,2BAAY,MAAM;AACrC,UAAM,mBAAmB,UAAU;AAKnC,QAAI,cAAc,SAAS;AACzB,mBAAa,QAAQ,MAAM;AAAA,IAC7B,OAAO;AACL,YAAM,WAAW,8BAA8B,gBAAgB;AAC/D,UAAI,YAAY,SAAS,SAAS,GAAG;AACnC,cAAM,QAAQ,SAAS,KAAK,CAAC;AAC7B,cAAM,MAAM;AAAA,MACd,OAAO;AACL,yBAAiB,MAAM;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,YAAY,CAAC;AAE5B,+BAAU,MAAM;AACd,QAAI,UAAU,WAAW;AAKvB,UAAS,QAAT,WAAiB;AACf,kBAAU,IAAI;AAAA,MAChB,GAES,UAAT,WAAmB;AACjB,kBAAU,KAAK;AACf,YAAI,CAAC,UAAU,QAAQ,SAAS,SAAS,aAA4B,GAAG;AACtE,uBAAa;AAAA,QACf;AAAA,MACF,GAES,QAAT,WAAiB;AACf,qBAAa;AACb,kBAAU,KAAK;AAAA,MACjB,GAES,YAAT,WAAqB;AACnB,qBAAa,SAAS,MAAM;AAAA,MAC9B;AAtBA,UAAI,CAAC,aAAa,SAAS;AACzB,qBAAa,UAAU,SAAS;AAAA,MAClC;AAsBA,cAAQ,SAAS,EAAE,IAAI,OAAO,OAAO,WAAW,SAAS,WAAW,qBAAqB,aAAa,CAAC;AACvG,aAAO,MAAM;AACX,gBAAQ,WAAW,EAAE;AACrB,qBAAa,UAAU;AAAA,MACzB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,WAAW,cAAc,IAAI,cAAc,SAAS,CAAC;AAEjE,+BAAU,MAAM;AACd,QAAI,UAAU,CAAC,UAAU,WAAW;AAGlC,UAAS,YAAT,SAAmB,OAAsB;AACvC,cAAM,MAAM,MAAM;AAClB,cAAM,WAAW,8BAA8B,gBAAgB;AAC/D,cAAMC,UAAS,SAAS;AACxB,cAAM,QAAQ,CAAC,GAAG,QAAQ,EAAE,UAAU,WAAS,UAAUA,OAAM;AAC/D,YAAI,UAAU,MAAM,MAAM,UAAU,MAAM,WAAW,MAAM,SAAS;AAClE;AAAA,QACF;AACA,YAAI,QAAQ,OAAO;AACjB,gBAAM,OAAO,MAAM,WAAW,KAAK;AACnC,gBAAM,aAAa,QAAQ,OAAO,SAAS,UAAU,SAAS;AAC9D,gBAAM,cAAc,SAAS,SAAS;AACtC,sBAAY,MAAM;AAClB,gBAAM,eAAe;AAAA,QACvB;AAAA,MACF;AAjBA,YAAM,mBAAmB,UAAU;AAoBnC,uBAAiB,iBAAiB,WAAW,SAAS;AACtD,aAAO,MAAM;AACX,yBAAiB,oBAAoB,WAAW,SAAS;AAAA,MAC3D;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,QAAQ,WAAW,WAAW,cAAc,YAAY,YAAY,CAAC;AACnF;;;AEzPO,IAAM,QAAQ,CAAwC,KAAQ,WAAyB;AAC5F,SAAO,OAAO,GAAG;AACnB;;;ATgBA,IAAAC,uBAAuC;;;AUjBvC,IAAAC,eAAiB;AAwDb,IAAAC,sBAAA;AAjCG,IAAM,OAAO,CAAC;AAAA,EACE;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,GAAG;AACL,MAAiB;AACpC,QAAM,eAAuB;AAAA,IAC3B,SAAS;AAAA,IACT,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,EAAE,KAAK;AAEP,QAAM,mBAA2B;AAAA,IAC/B,SAAS;AAAA,IACT,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,EAAE,KAAK;AAEP,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,eAAW,aAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA,CAAC,OAAO;AAAA,UACN,eAAe,SAAS;AAAA,UACxB,aAAa,SAAS;AAAA,UACtB,aAAa,SAAS;AAAA,QACxB,IAAI;AAAA,UACF,SAAS,SAAS;AAAA,UAClB,OAAO,SAAS;AAAA,UAChB,OAAO,SAAS;AAAA,QAClB;AAAA,QACA;AAAA,UACE,cAAc,YAAY;AAAA,UAC1B,gBAAgB,YAAY;AAAA,QAC9B;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,QACA,gBAAiB,6CAAC,UAAK,WAAW,kBAAmB,wBAAa;AAAA;AAAA;AAAA,EACrE;AAEJ;;;ACjFA,IAAAC,gBAA2B;AAC3B,IAAAC,eAAiB;AAkIb,IAAAC,sBAAA;AA/HG,IAAM,kBAAkB;AAAA,EAC7B,OAAO,CAAC,WAAW,aAAa,YAAY,YAAY,WAAW,YAAY,SAAS;AAAA,EACxF,MAAM,CAAC,WAAW,YAAY,SAAS;AAAA,EACvC,SAAS,CAAC,SAAS;AACrB;AAEO,IAAM,iBAAiB;AAAA,EAC5B,MAAM,CAAC,GAAG,gBAAgB,OAAO,aAAa;AAChD;AAsCA,IAAM,iBAA8C;AAAA,EAClD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,qBAAqD;AAAA,EACzD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEO,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AACF;AAkCO,IAAM,kBAAc,0BAAgD,SAASC,aAAY;AAAA,EACL;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAG,KAAK;AAC/F,QAAM,eAAe;AAAA,IACnB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,EACX,EAAE,KAAK;AAEP,QAAM,mBAAmB;AAAA,IACvB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,EACX,EAAE,KAAK;AAEP,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,eAAW,aAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,eAAe,IAAI;AAAA,QAC9B;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,qBACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,aAAAA;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QAED;AAAA,QACA,WACC;AAAA,UAAC;AAAA;AAAA,YACC,eAAW,aAAAA;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA;AAAA,QACH;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAyIM,IAAM,iBAAa,0BAA+C,SAASC,YAAW;AAAA,EACL;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA,GAAG;AACL,GAAG,KACzF;AACE,QAAM,eAAe;AAAA,IACnB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,UAAU;AAAA,IACV,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,SAAS;AAAA,IACT,aAAa;AAAA,EACf,EAAE,KAAK;AAEP,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAW,aAAAC;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE,mCAAmC,UAAU;AAAA,UAC7C,uBAAuB,UAAU;AAAA,UACjC,sDAAsD,UAAU;AAAA,QAClE;AAAA,QACA,WAAW,mBAAmB,IAAI;AAAA,QAClC;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ,CAAC;;;ACrVD,IAAAC,gBAAiD;;;ACH1C,IAAM,QAAQ,CAAC,OAAe,QAA0B,CAAC,GAAG,CAAC,MAAc;AAChF,QAAM,CAAC,KAAK,GAAG,IAAI;AACnB,SAAO,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;AAC3C;;;ADoCA,SAAS,kBAAkB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoD;AAC7E,QAAM,EAAE,mBAAmB,qBAAqB,KAAK,cAAc,IAAI;AACvE,QAAM,cAAc,WAAW;AAC/B,QAAM,eAAe,WAAW;AAEhC,QAAM,WAAW,cAAc,IAAI;AACnC,QAAM,YAAY,eAAe,IAAI;AAErC,QAAM,QAAQ,KAAK,IAAI,cAAc,OAAO,QAAQ;AACpD,QAAM,SAAS,KAAK,IAAI,cAAc,QAAQ,SAAS;AAEvD,QAAM,iBAAiB;AAAA,IACrB,aAAa,WAAW,OAAO,QAAQ;AAAA,IACvC,YAAY,WAAW;AAAA,IACvB,QAAQ,WAAW,OAAO,WAAW,QAAQ,IAAI,QAAQ;AAAA,IACzD,WAAW,WAAW,QAAQ;AAAA,IAC9B,UAAU,WAAW,QAAQ;AAAA,EAC/B,EAAE,mBAAmB;AAErB,QAAM,gBAAgB;AAAA,IACpB,aAAa,WAAW,MAAM,SAAS;AAAA,IACvC,YAAY,WAAW;AAAA,IACvB,QAAQ,WAAW,MAAM,WAAW,SAAS,IAAI,SAAS;AAAA,IAC1D,WAAW,WAAW,SAAS;AAAA,IAC/B,UAAU,WAAW,SAAS;AAAA,EAChC,EAAE,iBAAiB;AAEnB,QAAM,OAAO,MAAM,gBAAgB;AAAA,IACjC;AAAA,IACA,cAAc,gBAAgB;AAAA,EAChC,CAAC;AAED,QAAM,MAAM,MAAM,eAAe;AAAA,IAC/B;AAAA,IACA,eAAe,gBAAgB;AAAA,EACjC,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAcO,SAAS,mBAAmB;AAAA,EACE,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,MAAM;AACR,GAA4B;AAC7D,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAwB;AAClD,QAAM,YAAY,aAAa;AAE/B,QAAM,gBAAY,2BAAY,MAAM;AAClC,UAAM,gBAAgB,aAAa,QAAQ,sBAAsB;AACjE,UAAM,aAA8B,WAAW,QAAQ,sBAAsB,KAAK;AAAA,MAChF,KAAK;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,MAAM;AAAA,MACN,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,IACjB;AACA,UAAM,gBAAgB,WAAW;AACjC,QAAI,aAAa,CAAC,eAAe;AAC/B,cAAQ,KAAK,+DAA+D;AAAA,IAC9E;AACA,UAAM,aAA8B,eAAe,sBAAsB,KAAK;AAE9E,UAAM,iBAAyC;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,aAAS,kBAAkB,cAAc,CAAC;AAAA,EAC5C,GAAG,CAAC,WAAW,cAAc,KAAK,qBAAqB,eAAe,mBAAmB,SAAS,CAAC;AAGnG,QAAM,SAAS,aAAa,SAAS,sBAAsB,EAAE;AAC7D,QAAM,QAAQ,aAAa,SAAS,sBAAsB,EAAE;AAC5D,+BAAU,MAAM;AACd,QAAI,UAAU,WAAW;AACvB,gBAAU;AAAA,IACZ,OAAO;AACL,eAAS,MAAS;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,WAAW,QAAQ,WAAW,QAAQ,KAAK,CAAC;AAEhD,+BAAU,MAAM;AACd,WAAO,iBAAiB,UAAU,SAAS;AAC3C,QAAI;AACJ,QAAI,WAAW;AACb,gBAAU,YAAY,WAAW,eAAe;AAAA,IAClD;AACA,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,SAAS;AAC9C,UAAI,SAAS;AACX,sBAAc,OAAO;AAAA,MACvB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,WAAW,eAAe,CAAC;AAE1C,SAAO;AACT;;;AZrJA,uBAA6B;AAgQzB,IAAAC,sBAAA;AA7NJ,IAAM,2BAA8C;AAAA,EAClD,wBAAwB;AAC1B;AAoBA,IAAM,oBAAgB,6BAAwC,IAAI;AAElE,SAAS,mBAAmB;AAC1B,QAAM,UAAM,0BAAW,aAAa;AACpC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AACA,SAAO;AACT;AAmBO,IAAM,aAAa,CAAC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,iBAAiB;AACnB,MAAuB;AAChD,QAAM,iBAAa,sBAA2B,CAAC,CAAC;AAChD,QAAM,iBAAa,sBAAoB,IAAI;AAC3C,QAAM,kBAAc,qBAAM;AAC1B,QAAM,SAAS,MAAM;AAErB,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAqC;AAAA,IAC7E;AAAA,EACF,CAAC;AAED,QAAM,QAA4B;AAAA,IAChC,GAAG;AAAA,IACH,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,IACA,OAAO,gBAAiB,UAAU,CAAC,IAAK,CAAC,KAAK,EAAE,OAAO,OAAO;AAAA,EAChE;AACA,QAAM,SAA8B;AAAA,IAClC;AAAA,IACA;AAAA,EACF;AAEA,QAAM,mBAAe,2BAAY,CAAC,SAA2B;AAC3D,eAAW,QAAQ,KAAK,IAAI;AAC5B,eAAW,QAAQ,KAAK,CAAC,GAAG,MAAM;AAChC,YAAM,MAAM,EAAE,IAAI;AAClB,YAAM,MAAM,EAAE,IAAI;AAClB,UAAI,CAAC,OAAO,CAAC,IAAK,QAAO;AACzB,aAAO,IAAI,wBAAwB,GAAG,IAAI,KAAK,8BAA8B,KAAK;AAAA,IACpF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,QAAM,qBAAiB,2BAAY,CAACC,WAAkB;AACpD,eAAW,UAAU,WAAW,QAAQ,OAAO,OAAK,EAAE,UAAUA,MAAK;AAAA,EACvE,GAAG,CAAC,CAAC;AAGL,QAAM,kBAAkB,CAACA,QAAe,eAAyB;AAC/D,QAAI,UAAU;AACZ;AAAA,IACF;AACA,UAAM,SAAS,WAAW,QAAQ,KAAK,OAAK,EAAE,UAAUA,MAAK;AAC7D,QAAI,CAAC,QAAQ;AACX,cAAQ,MAAM,4BAA4BA,MAAK,YAAY;AAC3D;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,eAAe;AACjB,YAAM,mBAAmB,MAAM,MAAM,SAASA,MAAK;AACnD,YAAM,kBAAkB,cAAc,CAAC;AACvC,UAAI,CAAC,iBAAiB;AACpB,mBAAW,MAAM,MAAM,OAAO,OAAK,MAAMA,MAAK;AAAA,MAChD,OAAO;AACL,mBAAW,CAAC,GAAG,MAAM,OAAOA,MAAK;AAAA,MACnC;AAAA,IACF,OAAO;AACL,iBAAW,CAACA,MAAK;AAAA,IACnB;AAEA,QAAI,CAAC,eAAe;AAClB,uBAAiB,SAAS,CAAC,CAAC;AAAA,IAC9B,OAAO;AACL,wBAAkB,QAAQ;AAAA,IAC5B;AAEA,qBAAiB,gBAAc;AAAA,MAC7B,GAAG;AAAA,MACH,kBAAkBA;AAAA,IACpB,EAAE;AAAA,EACJ;AAEA,QAAM,gBAAgB,CAACA,WAAkB;AACvC,QAAI,UAAU;AACZ;AAAA,IACF;AACA,qBAAiB,gBAAc;AAAA,MAC7B,GAAG;AAAA,MACH,kBAAkBA;AAAA,IACpB,EAAE;AAAA,EACJ;AAEA,QAAM,sBAAkB,2BAAY,CAAC,QAAsC;AACzE,eAAW,UAAU,IAAI;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,QAAM,wBAAoB,2BAAY,MAAM;AAC1C,eAAW,UAAU;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,aAAa,CAACC,SAAkB,YAAgC;AACpE,UAAM,EAAE,uBAAuB,IAAI,EAAE,GAAG,0BAA0B,GAAG,QAAQ;AAC7E,QAAI;AACJ,QAAI,2BAA2B,SAAS;AACtC,yBAAmB,WAAW,QAAQ,UAAU,YAAU,CAAC,OAAO,QAAQ;AAAA,IAC5E,OAAO;AACL,yBAAmB,WAAW,QAAQ,SAAS,IAAI,CAAC,GAAG,WAAW,OAAO,EAAE,QAAQ,EAAE,UAAU,YAAU,CAAC,OAAO,QAAQ;AAAA,IAC3H;AACA,QAAI,qBAAqB,MAAM,qBAAqB,WAAW,QAAQ,QAAQ;AAC7E,yBAAmB;AAAA,IACrB;AACA,qBAAiB,gBAAc;AAAA,MAC7B,GAAG;AAAA,MACH,QAAQA,WAAU,CAAC,UAAU;AAAA,MAC7B,kBAAkB,WAAW,QAAQ,gBAAgB,EAAE;AAAA,IACzD,EAAE;AAAA,EACJ;AAEA,QAAM,uBAAuB,CAAC,UAAkB;AAC9C,QAAI,mBAAmB,WAAW,QAAQ,UAAU,CAAAD,WAASA,OAAM,UAAU,cAAc,gBAAgB;AAC3G,QAAI,qBAAqB,IAAI;AAC3B,yBAAmB;AAAA,IACrB;AACA,UAAM,eAAe,WAAW,QAAQ;AACxC,UAAM,cAAc,mBAAoB,QAAQ,eAAgB,gBAAgB;AAChF,UAAM,YAAY,SAAS;AAC3B,QAAI,mBAAmB,WAAW,QAAQ,UAAU,EAAE;AACtD,aAAS,IAAI,GAAG,IAAI,WAAW,QAAQ,QAAQ,KAAK;AAClD,YAAM,SAAS,cAAc,YAAY,IAAI,CAAC,KAAK,gBAAgB;AACnE,UAAI,CAAC,WAAW,QAAQ,KAAK,EAAE,UAAU;AACvC,2BAAmB,WAAW,QAAQ,KAAK,EAAE;AAC7C;AAAA,MACF;AAAA,IACF;AAEA,qBAAiB,gBAAc;AAAA,MAC7B,GAAG;AAAA,MACH;AAAA,IACF,EAAE;AAAA,EACJ;AAEA,+BAAU,MAAM;AACd,QAAI,CAAC,cAAc,iBAAkB;AACrC,UAAM,cAAc,WAAW,QAAQ,KAAK,CAAAA,WAASA,OAAM,UAAU,cAAc,gBAAgB;AACnG,QAAI,aAAa;AACf,kBAAY,IAAI,QAAQ,eAAe,EAAE,UAAU,WAAW,OAAO,UAAU,CAAC;AAAA,IAClF,OAAO;AACL,cAAQ,MAAM,iDAAiD,cAAc,gBAAgB,GAAG;AAAA,IAClG;AAAA,EACF,GAAG,CAAC,cAAc,gBAAgB,CAAC;AAEnC,QAAM,eAAkC;AAAA,IACtC;AAAA,IACA;AAAA,IACA,MAAM;AAAA,MACJ,UAAU;AAAA,MACV,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,SAAS;AAAA,MACP,KAAK;AAAA,MACL,UAAU;AAAA,MACV,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,SACE,6CAAC,cAAc,UAAd,EAAuB,OAAO,cAC5B,UACH;AAEJ;AAYO,IAAM,mBAAe;AAAA,EAC1B,SAASE,cAAa,EAAE,UAAU,OAAO,WAAW,OAAO,gBAAgB,WAAW,GAAG,UAAU,GAAG,KAAK;AACzG,UAAM,EAAE,OAAO,QAAQ,MAAM,QAAQ,IAAI,iBAAiB;AAC1D,UAAM,EAAE,UAAU,YAAY,iBAAiB,cAAc,IAAI;AACjE,UAAM,cAAU,sBAAsB,IAAI;AAE1C,uBAAmB,OAAO;AAG1B,iCAAU,MAAM;AACd,eAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MACP,CAAC;AACD,aAAO,MAAM,WAAW,KAAK;AAAA,IAC/B,GAAG,CAAC,OAAO,UAAU,UAAU,YAAY,QAAQ,CAAC;AAEpD,UAAM,gBAAgB,MAAM,qBAAqB;AACjD,UAAM,aAAa,MAAM,MAAM,SAAS,KAAK;AAE7C,WACE;AAAA,MAAC;AAAA;AAAA,QACE,GAAG;AAAA,QACJ,KAAK,CAAC,SAAS;AACb,kBAAQ,UAAU;AAClB,cAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,mBAC9B,IAAK,CAAC,IAAqD,UAAU;AAAA,QAChF;AAAA,QACA,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,oBAAkB,gBAAgB,KAAK;AAAA,QACvC,iBAAe,aAAa,KAAK;AAAA,QACjC,iBAAe,WAAW,KAAK;AAAA,QAC/B,eAAW,aAAAC;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,SAAS,CAAC,UAAU;AAClB,cAAI,CAAC,UAAU;AACb,4BAAgB,KAAK;AACrB,gBAAI,CAAC,OAAO,eAAe;AACzB,sBAAQ,WAAW,KAAK;AAAA,YAC1B;AACA,sBAAU,UAAU,KAAK;AAAA,UAC3B;AAAA,QACF;AAAA,QACA,cAAc,CAAC,UAAU;AACvB,cAAI,CAAC,UAAU;AACb,0BAAc,KAAK;AACnB,sBAAU,eAAe,KAAK;AAAA,UAChC;AAAA,QACF;AAAA,QAEC;AAAA,6BAAmB,UAClB;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,aAAAA,SAAK,WAAW,EAAE,aAAa,CAAC,cAAc,SAAS,CAAC;AAAA,cACnE,eAAa;AAAA;AAAA,UACf;AAAA,UAED,YAAY;AAAA,UACZ,mBAAmB,WAClB;AAAA,YAAC;AAAA;AAAA,cACC,eAAW,aAAAA,SAAK,WAAW,EAAE,aAAa,CAAC,cAAc,SAAS,CAAC;AAAA,cACnE,eAAa;AAAA;AAAA,UACf;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AASA,IAAM,iCAA2E;AAAA,EAC/E,IAAI;AAAA,IACF,eAAe;AAAA,EAEjB;AAAA,EACA,IAAI;AAAA,IACF,eAAe;AAAA,EACjB;AACF;AAOO,IAAM,mBAAe,0BAAiD,SAASC,cACpF,EAAE,aAAa,iBAAiB,GAAG,MAAM,GAAG,KAC5C;AACA,QAAM,cAAc,eAAe,CAAC,8BAA8B,CAAC;AACnE,QAAM,EAAE,OAAO,QAAQ,IAAI,iBAAiB;AAC5C,QAAM,EAAE,UAAU,YAAY,WAAW,IAAI;AAE7C,QAAM,eAAW,sBAA0B,IAAI;AAC/C,yCAAoB,KAAK,MAAM,SAAS,OAAO;AAE/C,+BAAU,MAAM;AACd,aAAS,QAAQ;AACjB,WAAO,MAAM,WAAW;AAAA,EAC1B,GAAG,CAAC,UAAU,UAAU,CAAC;AAEzB,QAAM,WAAW,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM;AAC9C,QAAM,UAAU,MAAM;AACtB,QAAM,WAAW,MAAM,MAAM,SAAS;AAEtC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,IAAI,MAAM;AAAA,MACV,eAAW,aAAAD;AAAA,QACT;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,SAAS,MAAM,WAAW,CAAC,MAAM,MAAM;AAAA,MACvC,WAAW,WAAS;AAClB,gBAAQ,MAAM,KAAK;AAAA,UACjB,KAAK;AACH,uBAAW,MAAM,EAAE,wBAAwB,QAAQ,CAAC;AACpD;AAAA,UACF,KAAK;AACH,uBAAW,MAAM,EAAE,wBAAwB,OAAO,CAAC;AACnD;AAAA,QACJ;AAAA,MACF;AAAA,MAEA,oBAAkB,CAAC,WAAW,KAAK;AAAA,MACnC,iBAAe,WAAW,KAAK;AAAA,MAC/B,gBAAc,UAAU,KAAK;AAAA,MAE7B,gBAAc;AAAA,MACd,iBAAe;AAAA,MACf,iBAAc;AAAA,MACd,iBAAe,MAAM;AAAA,MACrB,iBAAe,MAAM,SAAS,GAAG,MAAM,EAAE,aAAa;AAAA,MAErD;AAAA,mBACC,kBAAkB,MAAM,KAAK,KAAK,MAAM,MAAM,KAAK,IAAI,IACrD,eAAe,YAAY,eAAe;AAAA,QAE9C,6CAAC,iBAAc,YAAY,MAAM,QAAO;AAAA;AAAA;AAAA,EAC1C;AAEJ,CAAC;AAUM,IAAM,wBAAoB,0BAAmD,SAASE,mBAC3F,EAAE,GAAG,MAAM,GAAG,KACd;AACA,QAAM,EAAE,OAAO,SAAS,KAAK,IAAI,iBAAiB;AAClD,QAAM,EAAE,UAAU,YAAY,WAAW,IAAI;AAE7C,QAAM,eAAW,sBAAuB,IAAI;AAC5C,yCAAoB,KAAK,MAAM,SAAS,OAAO;AAE/C,+BAAU,MAAM;AACd,aAAS,QAAQ;AACjB,WAAO,MAAM,WAAW;AAAA,EAC1B,GAAG,CAAC,UAAU,UAAU,CAAC;AAEzB,QAAM,WAAW,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM;AAC9C,QAAM,UAAU,MAAM;AAEtB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,eAAW,aAAAF;AAAA,QACT;AAAA,QACA,MAAM;AAAA,MACR;AAAA,MACA,iBAAe,WAAW,KAAK;AAAA,MAC/B,gBAAc,UAAU,KAAK;AAAA,MAE7B,gBAAc;AAAA,MACd,iBAAe;AAAA,MAEd;AAAA,cAAM,MAAM,IAAI,CAAC,UAChB,8CAAC,QAAiB,WAAU,WACzB;AAAA;AAAA,UACD;AAAA,YAAC;AAAA;AAAA,cAEC,SAAS,MAAM;AACb,qBAAK,gBAAgB,OAAO,KAAK;AAAA,cACnC;AAAA,cACA,WAAU;AAAA,cAEV,uDAAC,8BAAK;AAAA;AAAA,UACR;AAAA,aAVS,KAWX,CACD;AAAA,QACD;AAAA,UAAC;AAAA;AAAA,YACC,IAAI,MAAM;AAAA,YACV,SAAS,MAAM,WAAW;AAAA,YAC1B,WAAW,WAAS;AAClB,sBAAQ,MAAM,KAAK;AAAA,gBACjB,KAAK;AACH,6BAAW,MAAM,EAAE,wBAAwB,QAAQ,CAAC;AACpD;AAAA,gBACF,KAAK;AACH,6BAAW,MAAM,EAAE,wBAAwB,OAAO,CAAC;AAAA,cACvD;AAAA,YACF;AAAA,YACA,MAAK;AAAA,YACL,OAAM;AAAA,YAEN,gBAAc;AAAA,YACd,iBAAe;AAAA,YACf,iBAAc;AAAA,YACd,iBAAe,MAAM;AAAA,YACrB,iBAAe,MAAM,SAAS,GAAG,MAAM,EAAE,aAAa;AAAA,YAEtD,uDAAC,6BAAI;AAAA;AAAA,QACP;AAAA;AAAA;AAAA,EACF;AAEJ,CAAC;AAaM,IAAM,oBAAgB;AAAA,EAC3B,SAASG,eAAc;AAAA,IACE;AAAA,IACA,cAAc;AAAA,IACd,GAAG;AAAA,EACL,GAAG,KAAK;AAC7B,UAAM,eAAW,sBAAgC,IAAI;AACrD,2CAAoB,KAAK,MAAM,SAAS,OAAO;AAE/C,UAAM,EAAE,SAAS,OAAO,QAAQ,KAAK,IAAI,iBAAiB;AAE1D,UAAM,WAAW,mBAAmB;AAAA,MAClC,QAAQ,MAAM;AAAA,MACd,WAAW,QAAQ;AAAA,MACnB,cAAc;AAAA,MACd,GAAG;AAAA,IACL,CAAC;AAED,iBAAa;AAAA,MACX,WAAW;AAAA,MACX,QAAQ,MAAM,UAAU,CAAC,CAAC;AAAA,IAC5B,CAAC;AAED,eAAO;AAAA,MACL,8EACE;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,QAAQ,CAAC,MAAM;AAAA,YACf,SAAS,MAAM,QAAQ,WAAW,KAAK;AAAA,YACvC,eAAW,aAAAH,SAAK,iCAAiC;AAAA;AAAA,QACnD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACE,GAAG;AAAA,YACJ,IAAI,GAAG,MAAM,EAAE;AAAA,YACf,KAAK;AAAA,YACL,QAAQ,CAAC,MAAM;AAAA,YACf,WAAW,CAAC,UAAU;AACpB,sBAAQ,MAAM,KAAK;AAAA,gBACjB,KAAK;AACH,0BAAQ,WAAW,KAAK;AACxB,wBAAM,eAAe;AACrB,wBAAM,gBAAgB;AACtB;AAAA,gBACF,KAAK,MAAM,aAAa;AAAA,kBACtB,UAAU;AAAA,kBACV,YAAY;AAAA,gBACd,CAAC;AACC,uBAAK,qBAAqB,CAAC;AAC3B,wBAAM,eAAe;AACrB;AAAA,gBACF,KAAK,MAAM,aAAa;AAAA,kBACtB,UAAU;AAAA,kBACV,YAAY;AAAA,gBACd,CAAC;AACC,uBAAK,qBAAqB,EAAE;AAC5B,wBAAM,eAAe;AACrB;AAAA,gBACF,KAAK;AAEH,wBAAM,eAAe;AACrB;AAAA,gBACF,KAAK;AAEH,wBAAM,eAAe;AACrB;AAAA,gBACF,KAAK;AAAA;AAAA,gBACL,KAAK;AACH,sBAAI,MAAM,kBAAkB;AAC1B,yBAAK,gBAAgB,MAAM,gBAAgB;AAC3C,wBAAI,CAAC,OAAO,eAAe;AACzB,8BAAQ,WAAW,KAAK;AAAA,oBAC1B;AACA,0BAAM,eAAe;AAAA,kBACvB;AACA;AAAA,cACJ;AAAA,YACF;AAAA,YAEA,eAAW,aAAAA,SAAK,iHAAiH,MAAM,SAAS;AAAA,YAChJ,OAAO;AAAA,cACL,SAAS,WAAW,SAAY;AAAA,cAChC,UAAU;AAAA,cACV,GAAG;AAAA,YACL;AAAA,YAEA,MAAK;AAAA,YACL,wBAAsB,OAAO;AAAA,YAC7B,oBAAkB;AAAA,YAClB,UAAU,WAAW,IAAI;AAAA,YAExB,gBAAM;AAAA;AAAA,QACT;AAAA,SACF;AAAA,MAAK,SAAS;AAAA,IAChB;AAAA,EACF;AACF;AAUO,IAAM,aAAS,0BAA2C,SAASI,QAAO;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAG,KAAK;AACvF,SACE,8CAAC,cAAY,GAAG,OAAO,eAAe,OACpC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACC,GAAG;AAAA,QACJ,iBAAiB,YAAU;AACzB,gBAAM,QAAQ,OAAO,CAAC;AACtB,cAAI,CAAC,aAAa,gBAAiB,QAAO;AAC1C,iBAAO,YAAY,gBAAgB,KAAK;AAAA,QAC1C;AAAA;AAAA,IACF;AAAA,IACA,6CAAC,iBAAe,GAAG,mBAAoB,UAAS;AAAA,KAClD;AAEJ,CAAC;AAIM,IAAM,yBAAqB,0BAAuD,SAASC,oBAAmB;AAAA,EACE,OAAO;AAAA,EACP;AAAA,EACA,GAAG;AACL,GAAG,KAAK;AAC3H,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,YAAY;AAE/C,+BAAU,MAAM;AACd,aAAS,YAAY;AAAA,EACvB,GAAG,CAAC,YAAY,CAAC;AAEjB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA,gBAAgB,CAAAR,WAAS;AACvB,iBAASA,MAAK;AACd,yBAAiBA,MAAK;AAAA,MACxB;AAAA;AAAA,EACF;AAEJ,CAAC;AAWM,IAAM,kBAAc,0BAAgD,SAASS,aAAY;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAG,KAAK;AACtG,SACE,8CAAC,cAAY,GAAG,OAAO,eAAe,MACpC;AAAA,iDAAC,gBAAa,KAAW,GAAG,aAAa;AAAA,IACzC,6CAAC,iBAAe,GAAG,mBAAoB,UAAS;AAAA,KAClD;AAEJ,CAAC;AAIM,IAAM,8BAA0B,0BAA4D,SAASC,yBAAwB;AAAA,EACE,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACL,GAAG,KAAK;AAC1I,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,aAAa;AAElD,+BAAU,MAAM;AACd,cAAU,aAAa;AAAA,EACzB,GAAG,CAAC,aAAa,CAAC;AAElB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA,iBAAiB,WAAS;AACxB,kBAAU,KAAK;AACf,0BAAkB,KAAK;AAAA,MACzB;AAAA;AAAA,EACF;AAEJ,CAAC;AAWM,IAAM,6BAAyB,0BAAwD,SAASC,wBAAuB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAG,KAAK;AACpI,SACE,8CAAC,cAAY,GAAG,OAAO,eAAe,MACpC;AAAA,iDAAC,qBAAkB,KAAW,GAAG,kBAAkB;AAAA,IACnD,6CAAC,iBAAe,GAAG,mBAAoB,UAAS;AAAA,KAClD;AAEJ,CAAC;AAIM,IAAM,yCAAqC,0BAAoE,SAASC,oCAAmC;AAAA,EACE,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACL,GAAG,KAAK;AACxK,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,aAAa;AAElD,+BAAU,MAAM;AACd,cAAU,aAAa;AAAA,EACzB,GAAG,CAAC,aAAa,CAAC;AAElB,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,MACA,iBAAiB,WAAS;AACxB,kBAAU,KAAK;AACf,0BAAkB,KAAK;AAAA,MACzB;AAAA;AAAA,EACF;AAEJ,CAAC;","names":["import_react","import_clsx","import_react","import_react","import_jsx_runtime","clsx","Expandable","ExpandableUncontrolled","import_react","import_react","listener","active","import_lucide_react","import_clsx","import_jsx_runtime","clsx","import_react","import_clsx","import_jsx_runtime","SolidButton","clsx","IconButton","clsx","import_react","import_jsx_runtime","value","isOpen","SelectOption","clsx","SelectButton","SelectChipDisplay","SelectContent","Select","SelectUncontrolled","MultiSelect","MultiSelectUncontrolled","MultiSelectChipDisplay","MultiSelectChipDisplayUncontrolled"]}
@@ -99,7 +99,7 @@ var useTranslation = (translations, overwriteTranslation = {}) => {
99
99
  };
100
100
  };
101
101
 
102
- // src/components/layout-and-navigation/Expandable.tsx
102
+ // src/components/layout/Expandable.tsx
103
103
  import { forwardRef, useCallback as useCallback2, useEffect as useEffect2, useId, useState as useState3 } from "react";
104
104
  import { ChevronDown } from "lucide-react";
105
105
  import clsx from "clsx";
@@ -107,7 +107,7 @@ import clsx from "clsx";
107
107
  // src/utils/noop.ts
108
108
  var noop = () => void 0;
109
109
 
110
- // src/components/layout-and-navigation/Expandable.tsx
110
+ // src/components/layout/Expandable.tsx
111
111
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
112
112
  var ExpansionIcon = ({ isExpanded, className }) => {
113
113
  return /* @__PURE__ */ jsx2(
@@ -429,7 +429,7 @@ var match = (key, values) => {
429
429
  // src/components/user-action/select/Select.tsx
430
430
  import { CheckIcon, Plus, XIcon } from "lucide-react";
431
431
 
432
- // src/components/layout-and-navigation/Chip.tsx
432
+ // src/components/layout/Chip.tsx
433
433
  import clsx2 from "clsx";
434
434
  import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
435
435
  var Chip = ({
@@ -769,7 +769,8 @@ var SelectRoot = ({
769
769
  isOpen = false,
770
770
  disabled = false,
771
771
  invalid = false,
772
- isMultiSelect = false
772
+ isMultiSelect = false,
773
+ iconAppearance = "left"
773
774
  }) => {
774
775
  const optionsRef = useRef2([]);
775
776
  const triggerRef = useRef2(null);
@@ -783,8 +784,11 @@ var SelectRoot = ({
783
784
  id: usedId,
784
785
  disabled,
785
786
  invalid,
786
- value: isMultiSelect ? values ?? [] : [value].filter(Boolean),
787
- isMultiSelect
787
+ value: isMultiSelect ? values ?? [] : [value].filter(Boolean)
788
+ };
789
+ const config = {
790
+ isMultiSelect,
791
+ iconAppearance
788
792
  };
789
793
  const registerItem = useCallback5((item) => {
790
794
  optionsRef.current.push(item);
@@ -893,6 +897,7 @@ var SelectRoot = ({
893
897
  }, [internalState.highlightedValue]);
894
898
  const contextValue = {
895
899
  state,
900
+ config,
896
901
  item: {
897
902
  register: registerItem,
898
903
  unregister: unregisterItem,
@@ -910,10 +915,11 @@ var SelectRoot = ({
910
915
  return /* @__PURE__ */ jsx5(SelectContext.Provider, { value: contextValue, children });
911
916
  };
912
917
  var SelectOption = forwardRef3(
913
- function SelectOption2({ value, disabled = false, children, className, ...restProps }, ref) {
914
- const { state, item, trigger } = useSelectContext();
918
+ function SelectOption2({ children, value, disabled = false, iconAppearance, className, ...restProps }, ref) {
919
+ const { state, config, item, trigger } = useSelectContext();
915
920
  const { register, unregister, toggleSelection, highlightItem } = item;
916
921
  const itemRef = useRef2(null);
922
+ iconAppearance ??= config.iconAppearance;
917
923
  useEffect6(() => {
918
924
  register({
919
925
  value,
@@ -950,7 +956,7 @@ var SelectOption = forwardRef3(
950
956
  onClick: (event) => {
951
957
  if (!disabled) {
952
958
  toggleSelection(value);
953
- if (!state.isMultiSelect) {
959
+ if (!config.isMultiSelect) {
954
960
  trigger.toggleOpen(false);
955
961
  }
956
962
  restProps.onClick?.(event);
@@ -963,14 +969,21 @@ var SelectOption = forwardRef3(
963
969
  }
964
970
  },
965
971
  children: [
966
- /* @__PURE__ */ jsx5(
972
+ iconAppearance === "left" && /* @__PURE__ */ jsx5(
967
973
  CheckIcon,
968
974
  {
969
975
  className: clsx4("w-4 h-4", { "opacity-0": !isSelected || disabled }),
970
976
  "aria-hidden": true
971
977
  }
972
978
  ),
973
- children ?? value
979
+ children ?? value,
980
+ iconAppearance === "right" && /* @__PURE__ */ jsx5(
981
+ CheckIcon,
982
+ {
983
+ className: clsx4("w-4 h-4", { "opacity-0": !isSelected || disabled }),
984
+ "aria-hidden": true
985
+ }
986
+ )
974
987
  ]
975
988
  }
976
989
  );
@@ -1108,7 +1121,7 @@ var SelectContent = forwardRef3(
1108
1121
  }, ref) {
1109
1122
  const innerRef = useRef2(null);
1110
1123
  useImperativeHandle(ref, () => innerRef.current);
1111
- const { trigger, state, item } = useSelectContext();
1124
+ const { trigger, state, config, item } = useSelectContext();
1112
1125
  const position = useFloatingElement({
1113
1126
  active: state.isOpen,
1114
1127
  anchorRef: trigger.ref,
@@ -1168,7 +1181,7 @@ var SelectContent = forwardRef3(
1168
1181
  case " ":
1169
1182
  if (state.highlightedValue) {
1170
1183
  item.toggleSelection(state.highlightedValue);
1171
- if (!state.isMultiSelect) {
1184
+ if (!config.isMultiSelect) {
1172
1185
  trigger.toggleOpen(false);
1173
1186
  }
1174
1187
  event.preventDefault();
@@ -1183,7 +1196,7 @@ var SelectContent = forwardRef3(
1183
1196
  ...position
1184
1197
  },
1185
1198
  role: "listbox",
1186
- "aria-multiselectable": state.isMultiSelect,
1199
+ "aria-multiselectable": config.isMultiSelect,
1187
1200
  "aria-orientation": orientation,
1188
1201
  tabIndex: position ? 0 : void 0,
1189
1202
  children: props.children