@helpwave/hightide 0.1.24 → 0.1.26

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 (602) hide show
  1. package/README.md +1 -1
  2. package/dist/components/branding/HelpwaveBadge.d.mts +4 -5
  3. package/dist/components/branding/HelpwaveBadge.d.ts +4 -5
  4. package/dist/components/branding/HelpwaveBadge.js +46 -87
  5. package/dist/components/branding/HelpwaveBadge.js.map +1 -1
  6. package/dist/components/branding/HelpwaveBadge.mjs +46 -89
  7. package/dist/components/branding/HelpwaveBadge.mjs.map +1 -1
  8. package/dist/components/date/DatePicker.d.mts +1 -1
  9. package/dist/components/date/DatePicker.d.ts +1 -1
  10. package/dist/components/date/DatePicker.js +106 -60
  11. package/dist/components/date/DatePicker.js.map +1 -1
  12. package/dist/components/date/DatePicker.mjs +107 -61
  13. package/dist/components/date/DatePicker.mjs.map +1 -1
  14. package/dist/components/date/DayPicker.d.mts +1 -1
  15. package/dist/components/date/DayPicker.d.ts +1 -1
  16. package/dist/components/date/DayPicker.js +3 -3
  17. package/dist/components/date/DayPicker.js.map +1 -1
  18. package/dist/components/date/DayPicker.mjs +3 -3
  19. package/dist/components/date/DayPicker.mjs.map +1 -1
  20. package/dist/components/date/TimeDisplay.js.map +1 -1
  21. package/dist/components/date/TimeDisplay.mjs.map +1 -1
  22. package/dist/components/date/TimePicker.js +2 -2
  23. package/dist/components/date/TimePicker.js.map +1 -1
  24. package/dist/components/date/TimePicker.mjs +2 -2
  25. package/dist/components/date/TimePicker.mjs.map +1 -1
  26. package/dist/components/date/YearMonthPicker.js +84 -36
  27. package/dist/components/date/YearMonthPicker.js.map +1 -1
  28. package/dist/components/date/YearMonthPicker.mjs +85 -37
  29. package/dist/components/date/YearMonthPicker.mjs.map +1 -1
  30. package/dist/components/{dialogs → dialog}/ConfirmDialog.d.mts +9 -8
  31. package/dist/components/{dialogs → dialog}/ConfirmDialog.d.ts +9 -8
  32. package/dist/components/dialog/ConfirmDialog.js +938 -0
  33. package/dist/components/dialog/ConfirmDialog.js.map +1 -0
  34. package/dist/components/dialog/ConfirmDialog.mjs +902 -0
  35. package/dist/components/dialog/ConfirmDialog.mjs.map +1 -0
  36. package/dist/components/dialog/Dialog.d.mts +27 -0
  37. package/dist/components/dialog/Dialog.d.ts +27 -0
  38. package/dist/components/dialog/Dialog.js +879 -0
  39. package/dist/components/dialog/Dialog.js.map +1 -0
  40. package/dist/components/dialog/Dialog.mjs +845 -0
  41. package/dist/components/dialog/Dialog.mjs.map +1 -0
  42. package/dist/components/dialog/DiscardChangesDialog.d.mts +24 -0
  43. package/dist/components/dialog/DiscardChangesDialog.d.ts +24 -0
  44. package/dist/components/dialog/DiscardChangesDialog.js +966 -0
  45. package/dist/components/dialog/DiscardChangesDialog.js.map +1 -0
  46. package/dist/components/dialog/DiscardChangesDialog.mjs +930 -0
  47. package/dist/components/dialog/DiscardChangesDialog.mjs.map +1 -0
  48. package/dist/components/dialog/InputDialog.d.mts +22 -0
  49. package/dist/components/dialog/InputDialog.d.ts +22 -0
  50. package/dist/components/dialog/InputDialog.js +1139 -0
  51. package/dist/components/dialog/InputDialog.js.map +1 -0
  52. package/dist/components/dialog/InputDialog.mjs +1103 -0
  53. package/dist/components/dialog/InputDialog.mjs.map +1 -0
  54. package/dist/components/dialog/LanguageDialog.d.mts +25 -0
  55. package/dist/components/dialog/LanguageDialog.d.ts +25 -0
  56. package/dist/components/dialog/LanguageDialog.js +1684 -0
  57. package/dist/components/dialog/LanguageDialog.js.map +1 -0
  58. package/dist/components/dialog/LanguageDialog.mjs +1658 -0
  59. package/dist/components/dialog/LanguageDialog.mjs.map +1 -0
  60. package/dist/components/dialog/ThemeDialog.d.mts +26 -0
  61. package/dist/components/dialog/ThemeDialog.d.ts +26 -0
  62. package/dist/components/dialog/ThemeDialog.js +1715 -0
  63. package/dist/components/dialog/ThemeDialog.js.map +1 -0
  64. package/dist/components/dialog/ThemeDialog.mjs +1689 -0
  65. package/dist/components/dialog/ThemeDialog.mjs.map +1 -0
  66. package/dist/components/dialog/index.d.mts +17 -0
  67. package/dist/components/dialog/index.d.ts +17 -0
  68. package/dist/components/dialog/index.js +2062 -0
  69. package/dist/components/dialog/index.js.map +1 -0
  70. package/dist/components/dialog/index.mjs +2031 -0
  71. package/dist/components/dialog/index.mjs.map +1 -0
  72. package/dist/components/form/FormElementWrapper.d.mts +29 -0
  73. package/dist/components/form/FormElementWrapper.d.ts +29 -0
  74. package/dist/components/form/FormElementWrapper.js +98 -0
  75. package/dist/components/form/FormElementWrapper.js.map +1 -0
  76. package/dist/components/form/FormElementWrapper.mjs +64 -0
  77. package/dist/components/form/FormElementWrapper.mjs.map +1 -0
  78. package/dist/components/icons-and-geometry/Avatar.js +498 -2886
  79. package/dist/components/icons-and-geometry/Avatar.js.map +1 -1
  80. package/dist/components/icons-and-geometry/Avatar.mjs +490 -2878
  81. package/dist/components/icons-and-geometry/Avatar.mjs.map +1 -1
  82. package/dist/components/icons-and-geometry/{Helpwave.d.mts → HelpwaveLogo.d.mts} +3 -3
  83. package/dist/components/icons-and-geometry/{Helpwave.d.ts → HelpwaveLogo.d.ts} +3 -3
  84. package/dist/components/icons-and-geometry/{Helpwave.js → HelpwaveLogo.js} +21 -22
  85. package/dist/components/icons-and-geometry/HelpwaveLogo.js.map +1 -0
  86. package/dist/components/icons-and-geometry/{Helpwave.mjs → HelpwaveLogo.mjs} +17 -18
  87. package/dist/components/icons-and-geometry/HelpwaveLogo.mjs.map +1 -0
  88. package/dist/components/icons-and-geometry/Ring.js +1 -1
  89. package/dist/components/icons-and-geometry/Ring.js.map +1 -1
  90. package/dist/components/icons-and-geometry/Ring.mjs +1 -1
  91. package/dist/components/icons-and-geometry/Ring.mjs.map +1 -1
  92. package/dist/components/icons-and-geometry/Tag.js +8 -20
  93. package/dist/components/icons-and-geometry/Tag.js.map +1 -1
  94. package/dist/components/icons-and-geometry/Tag.mjs +8 -20
  95. package/dist/components/icons-and-geometry/Tag.mjs.map +1 -1
  96. package/dist/components/layout-and-navigation/BreadCrumb.js +667 -22
  97. package/dist/components/layout-and-navigation/BreadCrumb.js.map +1 -1
  98. package/dist/components/layout-and-navigation/BreadCrumb.mjs +667 -22
  99. package/dist/components/layout-and-navigation/BreadCrumb.mjs.map +1 -1
  100. package/dist/components/layout-and-navigation/Carousel.js +52 -53
  101. package/dist/components/layout-and-navigation/Carousel.js.map +1 -1
  102. package/dist/components/layout-and-navigation/Carousel.mjs +52 -53
  103. package/dist/components/layout-and-navigation/Carousel.mjs.map +1 -1
  104. package/dist/components/layout-and-navigation/Chip.d.mts +8 -5
  105. package/dist/components/layout-and-navigation/Chip.d.ts +8 -5
  106. package/dist/components/layout-and-navigation/Chip.js +17 -4
  107. package/dist/components/layout-and-navigation/Chip.js.map +1 -1
  108. package/dist/components/layout-and-navigation/Chip.mjs +17 -4
  109. package/dist/components/layout-and-navigation/Chip.mjs.map +1 -1
  110. package/dist/components/layout-and-navigation/Expandable.d.mts +13 -10
  111. package/dist/components/layout-and-navigation/Expandable.d.ts +13 -10
  112. package/dist/components/layout-and-navigation/Expandable.js +18 -5
  113. package/dist/components/layout-and-navigation/Expandable.js.map +1 -1
  114. package/dist/components/layout-and-navigation/Expandable.mjs +19 -6
  115. package/dist/components/layout-and-navigation/Expandable.mjs.map +1 -1
  116. package/dist/components/layout-and-navigation/FAQSection.js +21 -8
  117. package/dist/components/layout-and-navigation/FAQSection.js.map +1 -1
  118. package/dist/components/layout-and-navigation/FAQSection.mjs +22 -9
  119. package/dist/components/layout-and-navigation/FAQSection.mjs.map +1 -1
  120. package/dist/components/layout-and-navigation/FloatingContainer.d.mts +38 -0
  121. package/dist/components/layout-and-navigation/FloatingContainer.d.ts +38 -0
  122. package/dist/components/layout-and-navigation/FloatingContainer.js +219 -0
  123. package/dist/components/layout-and-navigation/FloatingContainer.js.map +1 -0
  124. package/dist/components/layout-and-navigation/FloatingContainer.mjs +195 -0
  125. package/dist/components/layout-and-navigation/FloatingContainer.mjs.map +1 -0
  126. package/dist/components/layout-and-navigation/ListBox.d.mts +44 -0
  127. package/dist/components/layout-and-navigation/ListBox.d.ts +44 -0
  128. package/dist/components/layout-and-navigation/ListBox.js +329 -0
  129. package/dist/components/layout-and-navigation/ListBox.js.map +1 -0
  130. package/dist/components/layout-and-navigation/ListBox.mjs +290 -0
  131. package/dist/components/layout-and-navigation/ListBox.mjs.map +1 -0
  132. package/dist/components/layout-and-navigation/Pagination.js +142 -230
  133. package/dist/components/layout-and-navigation/Pagination.js.map +1 -1
  134. package/dist/components/layout-and-navigation/Pagination.mjs +137 -225
  135. package/dist/components/layout-and-navigation/Pagination.mjs.map +1 -1
  136. package/dist/components/layout-and-navigation/ScrollArea.d.mts +15 -0
  137. package/dist/components/layout-and-navigation/ScrollArea.d.ts +15 -0
  138. package/dist/components/layout-and-navigation/ScrollArea.js +1252 -0
  139. package/dist/components/layout-and-navigation/ScrollArea.js.map +1 -0
  140. package/dist/components/layout-and-navigation/ScrollArea.mjs +1216 -0
  141. package/dist/components/layout-and-navigation/ScrollArea.mjs.map +1 -0
  142. package/dist/components/layout-and-navigation/StepperBar.js +67 -30
  143. package/dist/components/layout-and-navigation/StepperBar.js.map +1 -1
  144. package/dist/components/layout-and-navigation/StepperBar.mjs +67 -30
  145. package/dist/components/layout-and-navigation/StepperBar.mjs.map +1 -1
  146. package/dist/components/layout-and-navigation/TextImage.js +3 -1
  147. package/dist/components/layout-and-navigation/TextImage.js.map +1 -1
  148. package/dist/components/layout-and-navigation/TextImage.mjs +3 -1
  149. package/dist/components/layout-and-navigation/TextImage.mjs.map +1 -1
  150. package/dist/components/loading-states/ErrorComponent.js.map +1 -1
  151. package/dist/components/loading-states/ErrorComponent.mjs.map +1 -1
  152. package/dist/components/loading-states/LoadingAndErrorComponent.d.mts +1 -1
  153. package/dist/components/loading-states/LoadingAndErrorComponent.d.ts +1 -1
  154. package/dist/components/loading-states/LoadingAnimation.js +18 -17
  155. package/dist/components/loading-states/LoadingAnimation.js.map +1 -1
  156. package/dist/components/loading-states/LoadingAnimation.mjs +18 -17
  157. package/dist/components/loading-states/LoadingAnimation.mjs.map +1 -1
  158. package/dist/components/loading-states/LoadingButton.js +81 -47
  159. package/dist/components/loading-states/LoadingButton.js.map +1 -1
  160. package/dist/components/loading-states/LoadingButton.mjs +81 -47
  161. package/dist/components/loading-states/LoadingButton.mjs.map +1 -1
  162. package/dist/components/properties/CheckboxProperty.js +929 -153
  163. package/dist/components/properties/CheckboxProperty.js.map +1 -1
  164. package/dist/components/properties/CheckboxProperty.mjs +936 -160
  165. package/dist/components/properties/CheckboxProperty.mjs.map +1 -1
  166. package/dist/components/properties/DateProperty.js +191 -241
  167. package/dist/components/properties/DateProperty.js.map +1 -1
  168. package/dist/components/properties/DateProperty.mjs +184 -234
  169. package/dist/components/properties/DateProperty.mjs.map +1 -1
  170. package/dist/components/properties/MultiSelectProperty.d.mts +5 -10
  171. package/dist/components/properties/MultiSelectProperty.d.ts +5 -10
  172. package/dist/components/properties/MultiSelectProperty.js +1193 -1189
  173. package/dist/components/properties/MultiSelectProperty.js.map +1 -1
  174. package/dist/components/properties/MultiSelectProperty.mjs +1207 -1193
  175. package/dist/components/properties/MultiSelectProperty.mjs.map +1 -1
  176. package/dist/components/properties/NumberProperty.js +193 -244
  177. package/dist/components/properties/NumberProperty.js.map +1 -1
  178. package/dist/components/properties/NumberProperty.mjs +186 -237
  179. package/dist/components/properties/NumberProperty.mjs.map +1 -1
  180. package/dist/components/properties/PropertyBase.js +91 -56
  181. package/dist/components/properties/PropertyBase.js.map +1 -1
  182. package/dist/components/properties/PropertyBase.mjs +91 -56
  183. package/dist/components/properties/PropertyBase.mjs.map +1 -1
  184. package/dist/components/properties/SelectProperty.d.mts +5 -8
  185. package/dist/components/properties/SelectProperty.d.ts +5 -8
  186. package/dist/components/properties/SelectProperty.js +1102 -897
  187. package/dist/components/properties/SelectProperty.js.map +1 -1
  188. package/dist/components/properties/SelectProperty.mjs +1107 -892
  189. package/dist/components/properties/SelectProperty.mjs.map +1 -1
  190. package/dist/components/properties/TextProperty.js +139 -147
  191. package/dist/components/properties/TextProperty.js.map +1 -1
  192. package/dist/components/properties/TextProperty.mjs +142 -150
  193. package/dist/components/properties/TextProperty.mjs.map +1 -1
  194. package/dist/components/table/Table.js +1639 -991
  195. package/dist/components/table/Table.js.map +1 -1
  196. package/dist/components/table/Table.mjs +1645 -997
  197. package/dist/components/table/Table.mjs.map +1 -1
  198. package/dist/components/table/TableFilterButton.js +156 -244
  199. package/dist/components/table/TableFilterButton.js.map +1 -1
  200. package/dist/components/table/TableFilterButton.mjs +145 -233
  201. package/dist/components/table/TableFilterButton.mjs.map +1 -1
  202. package/dist/components/table/TableSortButton.js +44 -46
  203. package/dist/components/table/TableSortButton.js.map +1 -1
  204. package/dist/components/table/TableSortButton.mjs +44 -46
  205. package/dist/components/table/TableSortButton.mjs.map +1 -1
  206. package/dist/components/user-action/Button.d.mts +17 -13
  207. package/dist/components/user-action/Button.d.ts +17 -13
  208. package/dist/components/user-action/Button.js +80 -87
  209. package/dist/components/user-action/Button.js.map +1 -1
  210. package/dist/components/user-action/Button.mjs +80 -87
  211. package/dist/components/user-action/Button.mjs.map +1 -1
  212. package/dist/components/user-action/Checkbox.d.mts +9 -25
  213. package/dist/components/user-action/Checkbox.d.ts +9 -25
  214. package/dist/components/user-action/Checkbox.js +794 -78
  215. package/dist/components/user-action/Checkbox.js.map +1 -1
  216. package/dist/components/user-action/Checkbox.mjs +795 -79
  217. package/dist/components/user-action/Checkbox.mjs.map +1 -1
  218. package/dist/components/user-action/CopyToClipboardWrapper.js +3 -1
  219. package/dist/components/user-action/CopyToClipboardWrapper.js.map +1 -1
  220. package/dist/components/user-action/CopyToClipboardWrapper.mjs +3 -1
  221. package/dist/components/user-action/CopyToClipboardWrapper.mjs.map +1 -1
  222. package/dist/components/user-action/DateAndTimePicker.d.mts +1 -1
  223. package/dist/components/user-action/DateAndTimePicker.d.ts +1 -1
  224. package/dist/components/user-action/DateAndTimePicker.js +108 -60
  225. package/dist/components/user-action/DateAndTimePicker.js.map +1 -1
  226. package/dist/components/user-action/DateAndTimePicker.mjs +109 -61
  227. package/dist/components/user-action/DateAndTimePicker.mjs.map +1 -1
  228. package/dist/components/user-action/Label.d.mts +6 -8
  229. package/dist/components/user-action/Label.d.ts +6 -8
  230. package/dist/components/user-action/Label.js +4 -6
  231. package/dist/components/user-action/Label.js.map +1 -1
  232. package/dist/components/user-action/Label.mjs +4 -6
  233. package/dist/components/user-action/Label.mjs.map +1 -1
  234. package/dist/components/user-action/Menu.d.mts +2 -2
  235. package/dist/components/user-action/Menu.d.ts +2 -2
  236. package/dist/components/user-action/Menu.js +1 -1
  237. package/dist/components/user-action/Menu.js.map +1 -1
  238. package/dist/components/user-action/Menu.mjs +1 -1
  239. package/dist/components/user-action/Menu.mjs.map +1 -1
  240. package/dist/components/user-action/ScrollPicker.js +8 -6
  241. package/dist/components/user-action/ScrollPicker.js.map +1 -1
  242. package/dist/components/user-action/ScrollPicker.mjs +8 -6
  243. package/dist/components/user-action/ScrollPicker.mjs.map +1 -1
  244. package/dist/components/user-action/SearchBar.d.mts +1 -2
  245. package/dist/components/user-action/SearchBar.d.ts +1 -2
  246. package/dist/components/user-action/SearchBar.js +131 -219
  247. package/dist/components/user-action/SearchBar.js.map +1 -1
  248. package/dist/components/user-action/SearchBar.mjs +124 -212
  249. package/dist/components/user-action/SearchBar.mjs.map +1 -1
  250. package/dist/components/user-action/Textarea.d.mts +22 -11
  251. package/dist/components/user-action/Textarea.d.ts +22 -11
  252. package/dist/components/user-action/Textarea.js +101 -92
  253. package/dist/components/user-action/Textarea.js.map +1 -1
  254. package/dist/components/user-action/Textarea.mjs +100 -92
  255. package/dist/components/user-action/Textarea.mjs.map +1 -1
  256. package/dist/components/user-action/input/Input.d.mts +37 -0
  257. package/dist/components/user-action/input/Input.d.ts +37 -0
  258. package/dist/components/user-action/input/Input.js +244 -0
  259. package/dist/components/user-action/input/Input.js.map +1 -0
  260. package/dist/components/user-action/input/Input.mjs +209 -0
  261. package/dist/components/user-action/input/Input.mjs.map +1 -0
  262. package/dist/components/user-action/input/InsideLabelInput.d.mts +20 -0
  263. package/dist/components/user-action/input/InsideLabelInput.d.ts +20 -0
  264. package/dist/components/user-action/input/InsideLabelInput.js +295 -0
  265. package/dist/components/user-action/input/InsideLabelInput.js.map +1 -0
  266. package/dist/components/user-action/input/InsideLabelInput.mjs +260 -0
  267. package/dist/components/user-action/input/InsideLabelInput.mjs.map +1 -0
  268. package/dist/components/user-action/input/ToggleableInput.d.mts +22 -0
  269. package/dist/components/user-action/input/ToggleableInput.d.ts +22 -0
  270. package/dist/components/user-action/{Input.js → input/ToggleableInput.js} +136 -171
  271. package/dist/components/user-action/input/ToggleableInput.js.map +1 -0
  272. package/dist/components/user-action/input/ToggleableInput.mjs +264 -0
  273. package/dist/components/user-action/input/ToggleableInput.mjs.map +1 -0
  274. package/dist/components/user-action/select/Select.d.mts +98 -0
  275. package/dist/components/user-action/select/Select.d.ts +98 -0
  276. package/dist/components/user-action/select/Select.js +1354 -0
  277. package/dist/components/user-action/select/Select.js.map +1 -0
  278. package/dist/components/user-action/select/Select.mjs +1320 -0
  279. package/dist/components/user-action/select/Select.mjs.map +1 -0
  280. package/dist/components/utils/FocusTrap.d.mts +28 -0
  281. package/dist/components/utils/FocusTrap.d.ts +28 -0
  282. package/dist/components/utils/FocusTrap.js +252 -0
  283. package/dist/components/utils/FocusTrap.js.map +1 -0
  284. package/dist/components/utils/FocusTrap.mjs +229 -0
  285. package/dist/components/utils/FocusTrap.mjs.map +1 -0
  286. package/dist/components/utils/Transition.d.mts +26 -0
  287. package/dist/components/utils/Transition.d.ts +26 -0
  288. package/dist/components/utils/Transition.js +74 -0
  289. package/dist/components/utils/Transition.js.map +1 -0
  290. package/dist/components/utils/Transition.mjs +50 -0
  291. package/dist/components/utils/Transition.mjs.map +1 -0
  292. package/dist/hooks/focus/useFocusGuards.d.mts +3 -0
  293. package/dist/hooks/focus/useFocusGuards.d.ts +3 -0
  294. package/dist/hooks/focus/useFocusGuards.js +74 -0
  295. package/dist/hooks/focus/useFocusGuards.js.map +1 -0
  296. package/dist/hooks/focus/useFocusGuards.mjs +50 -0
  297. package/dist/hooks/focus/useFocusGuards.mjs.map +1 -0
  298. package/dist/hooks/{useFocusManagement.js → focus/useFocusManagement.js} +1 -1
  299. package/dist/hooks/focus/useFocusManagement.js.map +1 -0
  300. package/dist/hooks/{useFocusManagement.mjs → focus/useFocusManagement.mjs} +1 -1
  301. package/dist/hooks/focus/useFocusManagement.mjs.map +1 -0
  302. package/dist/hooks/{useFocusOnceVisible.js → focus/useFocusOnceVisible.js} +1 -1
  303. package/dist/hooks/focus/useFocusOnceVisible.js.map +1 -0
  304. package/dist/hooks/{useFocusOnceVisible.mjs → focus/useFocusOnceVisible.mjs} +1 -1
  305. package/dist/hooks/focus/useFocusOnceVisible.mjs.map +1 -0
  306. package/dist/hooks/focus/useFocusTrap.d.mts +16 -0
  307. package/dist/hooks/focus/useFocusTrap.d.ts +16 -0
  308. package/dist/hooks/focus/useFocusTrap.js +233 -0
  309. package/dist/hooks/focus/useFocusTrap.js.map +1 -0
  310. package/dist/hooks/focus/useFocusTrap.mjs +210 -0
  311. package/dist/hooks/focus/useFocusTrap.mjs.map +1 -0
  312. package/dist/hooks/focus/useIsMounted.d.mts +3 -0
  313. package/dist/hooks/focus/useIsMounted.d.ts +3 -0
  314. package/dist/hooks/focus/useIsMounted.js +43 -0
  315. package/dist/hooks/focus/useIsMounted.js.map +1 -0
  316. package/dist/hooks/focus/useIsMounted.mjs +20 -0
  317. package/dist/hooks/focus/useIsMounted.mjs.map +1 -0
  318. package/dist/hooks/useFloatingElement.d.mts +22 -0
  319. package/dist/hooks/useFloatingElement.d.ts +22 -0
  320. package/dist/hooks/useFloatingElement.js +162 -0
  321. package/dist/hooks/useFloatingElement.js.map +1 -0
  322. package/dist/hooks/useFloatingElement.mjs +139 -0
  323. package/dist/hooks/useFloatingElement.mjs.map +1 -0
  324. package/dist/hooks/useLocalStorage.js +2 -2
  325. package/dist/hooks/useLocalStorage.js.map +1 -1
  326. package/dist/hooks/useLocalStorage.mjs +2 -2
  327. package/dist/hooks/useLocalStorage.mjs.map +1 -1
  328. package/dist/hooks/useLogOnce.d.mts +3 -4
  329. package/dist/hooks/useLogOnce.d.ts +3 -4
  330. package/dist/hooks/useLogOnce.js +5 -5
  331. package/dist/hooks/useLogOnce.js.map +1 -1
  332. package/dist/hooks/useLogOnce.mjs +5 -5
  333. package/dist/hooks/useLogOnce.mjs.map +1 -1
  334. package/dist/hooks/useRerender.d.mts +2 -2
  335. package/dist/hooks/useRerender.d.ts +2 -2
  336. package/dist/hooks/useSearch.d.mts +2 -2
  337. package/dist/hooks/useSearch.d.ts +2 -2
  338. package/dist/hooks/useSearch.js +1 -1
  339. package/dist/hooks/useSearch.js.map +1 -1
  340. package/dist/hooks/useSearch.mjs +1 -1
  341. package/dist/hooks/useSearch.mjs.map +1 -1
  342. package/dist/localization/LanguageProvider.d.mts +2 -2
  343. package/dist/localization/LanguageProvider.d.ts +2 -2
  344. package/dist/localization/LanguageProvider.js +2 -2
  345. package/dist/localization/LanguageProvider.js.map +1 -1
  346. package/dist/localization/LanguageProvider.mjs +2 -2
  347. package/dist/localization/LanguageProvider.mjs.map +1 -1
  348. package/dist/localization/defaults/form.d.mts +1 -0
  349. package/dist/localization/defaults/form.d.ts +1 -0
  350. package/dist/localization/defaults/form.js +2 -0
  351. package/dist/localization/defaults/form.js.map +1 -1
  352. package/dist/localization/defaults/form.mjs +2 -0
  353. package/dist/localization/defaults/form.mjs.map +1 -1
  354. package/dist/localization/useTranslation.js.map +1 -1
  355. package/dist/localization/useTranslation.mjs.map +1 -1
  356. package/dist/storybook/helper.d.mts +17 -0
  357. package/dist/storybook/helper.d.ts +17 -0
  358. package/dist/storybook/helper.js +61 -0
  359. package/dist/storybook/helper.js.map +1 -0
  360. package/dist/storybook/helper.mjs +37 -0
  361. package/dist/storybook/helper.mjs.map +1 -0
  362. package/dist/{css → style}/globals.css +994 -456
  363. package/dist/{css → style}/uncompiled/globals.css +75 -13
  364. package/dist/{css → style}/uncompiled/theme/colors-component.css +18 -4
  365. package/dist/{css → style}/uncompiled/theme/colors-semantic.css +2 -9
  366. package/dist/style/uncompiled/typography.css +171 -0
  367. package/dist/{css → style}/uncompiled/utitlity/animation.css +54 -42
  368. package/dist/{css → style}/uncompiled/utitlity/index.css +2 -1
  369. package/dist/{css → style}/uncompiled/utitlity/shadow.css +5 -1
  370. package/dist/style/uncompiled/utitlity/sizing.css +29 -0
  371. package/dist/theming/useTheme.d.mts +2 -2
  372. package/dist/theming/useTheme.d.ts +2 -2
  373. package/dist/theming/useTheme.js +4 -4
  374. package/dist/theming/useTheme.js.map +1 -1
  375. package/dist/theming/useTheme.mjs +4 -4
  376. package/dist/theming/useTheme.mjs.map +1 -1
  377. package/dist/{util → utils}/array.d.mts +1 -0
  378. package/dist/{util → utils}/array.d.ts +1 -0
  379. package/dist/{util → utils}/array.js +15 -2
  380. package/dist/utils/array.js.map +1 -0
  381. package/dist/{util → utils}/array.mjs +15 -2
  382. package/dist/utils/array.mjs.map +1 -0
  383. package/dist/utils/bagFunctions.d.mts +15 -0
  384. package/dist/utils/bagFunctions.d.ts +15 -0
  385. package/dist/{util/PropsWithFunctionChildren.js → utils/bagFunctions.js} +5 -5
  386. package/dist/utils/bagFunctions.js.map +1 -0
  387. package/dist/{util/PropsWithFunctionChildren.mjs → utils/bagFunctions.mjs} +2 -2
  388. package/dist/utils/bagFunctions.mjs.map +1 -0
  389. package/dist/{util → utils}/builder.js +1 -1
  390. package/dist/utils/builder.js.map +1 -0
  391. package/dist/{util → utils}/builder.mjs +1 -1
  392. package/dist/utils/builder.mjs.map +1 -0
  393. package/dist/{util → utils}/date.js +3 -3
  394. package/dist/utils/date.js.map +1 -0
  395. package/dist/{util → utils}/date.mjs +2 -2
  396. package/dist/utils/date.mjs.map +1 -0
  397. package/dist/{util → utils}/easeFunctions.js +5 -4
  398. package/dist/utils/easeFunctions.js.map +1 -0
  399. package/dist/{util → utils}/easeFunctions.mjs +4 -3
  400. package/dist/utils/easeFunctions.mjs.map +1 -0
  401. package/dist/{util → utils}/emailValidation.js +1 -1
  402. package/dist/utils/emailValidation.js.map +1 -0
  403. package/dist/{util → utils}/emailValidation.mjs +1 -1
  404. package/dist/utils/emailValidation.mjs.map +1 -0
  405. package/dist/{util → utils}/loopingArray.js +1 -1
  406. package/dist/utils/loopingArray.js.map +1 -0
  407. package/dist/{util → utils}/loopingArray.mjs +1 -1
  408. package/dist/utils/loopingArray.mjs.map +1 -0
  409. package/dist/utils/match.d.mts +3 -0
  410. package/dist/utils/match.d.ts +3 -0
  411. package/dist/utils/match.js +32 -0
  412. package/dist/utils/match.js.map +1 -0
  413. package/dist/utils/match.mjs +8 -0
  414. package/dist/utils/match.mjs.map +1 -0
  415. package/dist/utils/math.d.mts +3 -0
  416. package/dist/utils/math.d.ts +3 -0
  417. package/dist/{util → utils}/math.js +3 -2
  418. package/dist/utils/math.js.map +1 -0
  419. package/dist/utils/math.mjs +9 -0
  420. package/dist/utils/math.mjs.map +1 -0
  421. package/dist/{util → utils}/noop.js +1 -1
  422. package/dist/utils/noop.js.map +1 -0
  423. package/dist/utils/noop.mjs +6 -0
  424. package/dist/utils/noop.mjs.map +1 -0
  425. package/dist/{util → utils}/resolveSetState.js +1 -1
  426. package/dist/utils/resolveSetState.js.map +1 -0
  427. package/dist/{util → utils}/resolveSetState.mjs +1 -1
  428. package/dist/utils/resolveSetState.mjs.map +1 -0
  429. package/dist/{util → utils}/simpleSearch.js +1 -1
  430. package/dist/utils/simpleSearch.js.map +1 -0
  431. package/dist/{util → utils}/simpleSearch.mjs +1 -1
  432. package/dist/utils/simpleSearch.mjs.map +1 -0
  433. package/dist/{util → utils}/storage.js +1 -1
  434. package/dist/utils/storage.js.map +1 -0
  435. package/dist/{util → utils}/storage.mjs +1 -1
  436. package/dist/utils/storage.mjs.map +1 -0
  437. package/dist/{util → utils}/writeToClipboard.js +2 -1
  438. package/dist/utils/writeToClipboard.js.map +1 -0
  439. package/dist/{util → utils}/writeToClipboard.mjs +3 -1
  440. package/dist/utils/writeToClipboard.mjs.map +1 -0
  441. package/package.json +8 -8
  442. package/dist/components/dialogs/ConfirmDialog.js +0 -677
  443. package/dist/components/dialogs/ConfirmDialog.js.map +0 -1
  444. package/dist/components/dialogs/ConfirmDialog.mjs +0 -641
  445. package/dist/components/dialogs/ConfirmDialog.mjs.map +0 -1
  446. package/dist/components/icons-and-geometry/Helpwave.js.map +0 -1
  447. package/dist/components/icons-and-geometry/Helpwave.mjs.map +0 -1
  448. package/dist/components/layout-and-navigation/Overlay.d.mts +0 -67
  449. package/dist/components/layout-and-navigation/Overlay.d.ts +0 -67
  450. package/dist/components/layout-and-navigation/Overlay.js +0 -705
  451. package/dist/components/layout-and-navigation/Overlay.js.map +0 -1
  452. package/dist/components/layout-and-navigation/Overlay.mjs +0 -668
  453. package/dist/components/layout-and-navigation/Overlay.mjs.map +0 -1
  454. package/dist/components/layout-and-navigation/SearchableList.d.mts +0 -24
  455. package/dist/components/layout-and-navigation/SearchableList.d.ts +0 -24
  456. package/dist/components/layout-and-navigation/SearchableList.js +0 -761
  457. package/dist/components/layout-and-navigation/SearchableList.js.map +0 -1
  458. package/dist/components/layout-and-navigation/SearchableList.mjs +0 -727
  459. package/dist/components/layout-and-navigation/SearchableList.mjs.map +0 -1
  460. package/dist/components/layout-and-navigation/Tile.d.mts +0 -27
  461. package/dist/components/layout-and-navigation/Tile.d.ts +0 -27
  462. package/dist/components/layout-and-navigation/Tile.js +0 -96
  463. package/dist/components/layout-and-navigation/Tile.js.map +0 -1
  464. package/dist/components/layout-and-navigation/Tile.mjs +0 -61
  465. package/dist/components/layout-and-navigation/Tile.mjs.map +0 -1
  466. package/dist/components/modals/ConfirmModal.d.mts +0 -33
  467. package/dist/components/modals/ConfirmModal.d.ts +0 -33
  468. package/dist/components/modals/ConfirmModal.js +0 -690
  469. package/dist/components/modals/ConfirmModal.js.map +0 -1
  470. package/dist/components/modals/ConfirmModal.mjs +0 -654
  471. package/dist/components/modals/ConfirmModal.mjs.map +0 -1
  472. package/dist/components/modals/DiscardChangesModal.d.mts +0 -20
  473. package/dist/components/modals/DiscardChangesModal.d.ts +0 -20
  474. package/dist/components/modals/DiscardChangesModal.js +0 -720
  475. package/dist/components/modals/DiscardChangesModal.js.map +0 -1
  476. package/dist/components/modals/DiscardChangesModal.mjs +0 -684
  477. package/dist/components/modals/DiscardChangesModal.mjs.map +0 -1
  478. package/dist/components/modals/InputModal.d.mts +0 -21
  479. package/dist/components/modals/InputModal.d.ts +0 -21
  480. package/dist/components/modals/InputModal.js +0 -979
  481. package/dist/components/modals/InputModal.js.map +0 -1
  482. package/dist/components/modals/InputModal.mjs +0 -943
  483. package/dist/components/modals/InputModal.mjs.map +0 -1
  484. package/dist/components/modals/LanguageModal.d.mts +0 -21
  485. package/dist/components/modals/LanguageModal.d.ts +0 -21
  486. package/dist/components/modals/LanguageModal.js +0 -1474
  487. package/dist/components/modals/LanguageModal.js.map +0 -1
  488. package/dist/components/modals/LanguageModal.mjs +0 -1438
  489. package/dist/components/modals/LanguageModal.mjs.map +0 -1
  490. package/dist/components/modals/ThemeModal.d.mts +0 -21
  491. package/dist/components/modals/ThemeModal.d.ts +0 -21
  492. package/dist/components/modals/ThemeModal.js +0 -1503
  493. package/dist/components/modals/ThemeModal.js.map +0 -1
  494. package/dist/components/modals/ThemeModal.mjs +0 -1467
  495. package/dist/components/modals/ThemeModal.mjs.map +0 -1
  496. package/dist/components/user-action/Input.d.mts +0 -77
  497. package/dist/components/user-action/Input.d.ts +0 -77
  498. package/dist/components/user-action/Input.js.map +0 -1
  499. package/dist/components/user-action/Input.mjs +0 -298
  500. package/dist/components/user-action/Input.mjs.map +0 -1
  501. package/dist/components/user-action/MultiSelect.d.mts +0 -42
  502. package/dist/components/user-action/MultiSelect.d.ts +0 -42
  503. package/dist/components/user-action/MultiSelect.js +0 -1445
  504. package/dist/components/user-action/MultiSelect.js.map +0 -1
  505. package/dist/components/user-action/MultiSelect.mjs +0 -1410
  506. package/dist/components/user-action/MultiSelect.mjs.map +0 -1
  507. package/dist/components/user-action/Select.d.mts +0 -41
  508. package/dist/components/user-action/Select.d.ts +0 -41
  509. package/dist/components/user-action/Select.js +0 -1242
  510. package/dist/components/user-action/Select.js.map +0 -1
  511. package/dist/components/user-action/Select.mjs +0 -1207
  512. package/dist/components/user-action/Select.mjs.map +0 -1
  513. package/dist/components/user-action/ToggleableInput.d.mts +0 -37
  514. package/dist/components/user-action/ToggleableInput.d.ts +0 -37
  515. package/dist/components/user-action/ToggleableInput.js +0 -192
  516. package/dist/components/user-action/ToggleableInput.js.map +0 -1
  517. package/dist/components/user-action/ToggleableInput.mjs +0 -157
  518. package/dist/components/user-action/ToggleableInput.mjs.map +0 -1
  519. package/dist/css/uncompiled/textstyles.css +0 -69
  520. package/dist/hooks/useFocusManagement.js.map +0 -1
  521. package/dist/hooks/useFocusManagement.mjs.map +0 -1
  522. package/dist/hooks/useFocusOnceVisible.js.map +0 -1
  523. package/dist/hooks/useFocusOnceVisible.mjs.map +0 -1
  524. package/dist/index.d.mts +0 -103
  525. package/dist/index.d.ts +0 -103
  526. package/dist/index.js +0 -12595
  527. package/dist/index.js.map +0 -1
  528. package/dist/index.mjs +0 -12432
  529. package/dist/index.mjs.map +0 -1
  530. package/dist/util/PropsWithFunctionChildren.d.mts +0 -14
  531. package/dist/util/PropsWithFunctionChildren.d.ts +0 -14
  532. package/dist/util/PropsWithFunctionChildren.js.map +0 -1
  533. package/dist/util/PropsWithFunctionChildren.mjs.map +0 -1
  534. package/dist/util/array.js.map +0 -1
  535. package/dist/util/array.mjs.map +0 -1
  536. package/dist/util/builder.js.map +0 -1
  537. package/dist/util/builder.mjs.map +0 -1
  538. package/dist/util/date.js.map +0 -1
  539. package/dist/util/date.mjs.map +0 -1
  540. package/dist/util/easeFunctions.js.map +0 -1
  541. package/dist/util/easeFunctions.mjs.map +0 -1
  542. package/dist/util/emailValidation.js.map +0 -1
  543. package/dist/util/emailValidation.mjs.map +0 -1
  544. package/dist/util/loopingArray.js.map +0 -1
  545. package/dist/util/loopingArray.mjs.map +0 -1
  546. package/dist/util/math.d.mts +0 -3
  547. package/dist/util/math.d.ts +0 -3
  548. package/dist/util/math.js.map +0 -1
  549. package/dist/util/math.mjs +0 -8
  550. package/dist/util/math.mjs.map +0 -1
  551. package/dist/util/news.d.mts +0 -101
  552. package/dist/util/news.d.ts +0 -101
  553. package/dist/util/news.js +0 -76
  554. package/dist/util/news.js.map +0 -1
  555. package/dist/util/news.mjs +0 -49
  556. package/dist/util/news.mjs.map +0 -1
  557. package/dist/util/noop.js.map +0 -1
  558. package/dist/util/noop.mjs +0 -6
  559. package/dist/util/noop.mjs.map +0 -1
  560. package/dist/util/resolveSetState.js.map +0 -1
  561. package/dist/util/resolveSetState.mjs.map +0 -1
  562. package/dist/util/simpleSearch.js.map +0 -1
  563. package/dist/util/simpleSearch.mjs.map +0 -1
  564. package/dist/util/storage.js.map +0 -1
  565. package/dist/util/storage.mjs.map +0 -1
  566. package/dist/util/types.d.mts +0 -3
  567. package/dist/util/types.d.ts +0 -3
  568. package/dist/util/types.js +0 -18
  569. package/dist/util/types.js.map +0 -1
  570. package/dist/util/types.mjs +0 -1
  571. package/dist/util/types.mjs.map +0 -1
  572. package/dist/util/writeToClipboard.js.map +0 -1
  573. package/dist/util/writeToClipboard.mjs.map +0 -1
  574. /package/dist/hooks/{useFocusManagement.d.mts → focus/useFocusManagement.d.mts} +0 -0
  575. /package/dist/hooks/{useFocusManagement.d.ts → focus/useFocusManagement.d.ts} +0 -0
  576. /package/dist/hooks/{useFocusOnceVisible.d.mts → focus/useFocusOnceVisible.d.mts} +0 -0
  577. /package/dist/hooks/{useFocusOnceVisible.d.ts → focus/useFocusOnceVisible.d.ts} +0 -0
  578. /package/dist/{css → style}/uncompiled/theme/colors-basic.css +0 -0
  579. /package/dist/{css → style}/uncompiled/theme/index.css +0 -0
  580. /package/dist/{css → style}/uncompiled/theme/variants.css +0 -0
  581. /package/dist/{css → style}/uncompiled/utitlity/borderradius.css +0 -0
  582. /package/dist/{css → style}/uncompiled/utitlity/general.css +0 -0
  583. /package/dist/{util → utils}/builder.d.mts +0 -0
  584. /package/dist/{util → utils}/builder.d.ts +0 -0
  585. /package/dist/{util → utils}/date.d.mts +0 -0
  586. /package/dist/{util → utils}/date.d.ts +0 -0
  587. /package/dist/{util → utils}/easeFunctions.d.mts +0 -0
  588. /package/dist/{util → utils}/easeFunctions.d.ts +0 -0
  589. /package/dist/{util → utils}/emailValidation.d.mts +0 -0
  590. /package/dist/{util → utils}/emailValidation.d.ts +0 -0
  591. /package/dist/{util → utils}/loopingArray.d.mts +0 -0
  592. /package/dist/{util → utils}/loopingArray.d.ts +0 -0
  593. /package/dist/{util → utils}/noop.d.mts +0 -0
  594. /package/dist/{util → utils}/noop.d.ts +0 -0
  595. /package/dist/{util → utils}/resolveSetState.d.mts +0 -0
  596. /package/dist/{util → utils}/resolveSetState.d.ts +0 -0
  597. /package/dist/{util → utils}/simpleSearch.d.mts +0 -0
  598. /package/dist/{util → utils}/simpleSearch.d.ts +0 -0
  599. /package/dist/{util → utils}/storage.d.mts +0 -0
  600. /package/dist/{util → utils}/storage.d.ts +0 -0
  601. /package/dist/{util → utils}/writeToClipboard.d.mts +0 -0
  602. /package/dist/{util → utils}/writeToClipboard.d.ts +0 -0
@@ -1,93 +1,6 @@
1
1
  // src/components/properties/SelectProperty.tsx
2
- import { List, Plus } from "lucide-react";
3
- import clsx10 from "clsx";
4
-
5
- // src/localization/LanguageProvider.tsx
6
- import { createContext, useContext, useEffect, useState as useState2 } from "react";
7
-
8
- // src/hooks/useLocalStorage.ts
9
- import { useCallback, useState } from "react";
10
-
11
- // src/localization/util.ts
12
- var languages = ["en", "de"];
13
- var languagesLocalNames = {
14
- en: "English",
15
- de: "Deutsch"
16
- };
17
- var DEFAULT_LANGUAGE = "en";
18
- var LanguageUtil = {
19
- languages,
20
- DEFAULT_LANGUAGE,
21
- languagesLocalNames
22
- };
23
-
24
- // src/localization/LanguageProvider.tsx
25
- import { jsx } from "react/jsx-runtime";
26
- var LanguageContext = createContext({
27
- language: LanguageUtil.DEFAULT_LANGUAGE,
28
- setLanguage: (v) => v
29
- });
30
- var useLanguage = () => useContext(LanguageContext);
31
-
32
- // src/localization/useTranslation.ts
33
- var TranslationPluralCount = {
34
- zero: 0,
35
- one: 1,
36
- two: 2,
37
- few: 3,
38
- many: 11,
39
- other: -1
40
- };
41
- var useTranslation = (translations, overwriteTranslation = {}) => {
42
- const { language: languageProp, translation: overwrite } = overwriteTranslation;
43
- const { language: inferredLanguage } = useLanguage();
44
- const usedLanguage = languageProp ?? inferredLanguage;
45
- const usedTranslations = [...translations];
46
- if (overwrite) {
47
- usedTranslations.push(overwrite);
48
- }
49
- return (key, options) => {
50
- const { count, replacements } = { ...{ count: 0, replacements: {} }, ...options };
51
- try {
52
- for (let i = translations.length - 1; i >= 0; i--) {
53
- const translation = translations[i];
54
- const localizedTranslation = translation[usedLanguage];
55
- if (!localizedTranslation) {
56
- continue;
57
- }
58
- const value = localizedTranslation[key];
59
- if (!value) {
60
- continue;
61
- }
62
- let forProcessing;
63
- if (typeof value !== "string") {
64
- if (count === TranslationPluralCount.zero && value?.zero) {
65
- forProcessing = value.zero;
66
- } else if (count === TranslationPluralCount.one && value?.one) {
67
- forProcessing = value.one;
68
- } else if (count === TranslationPluralCount.two && value?.two) {
69
- forProcessing = value.two;
70
- } else if (TranslationPluralCount.few <= count && count < TranslationPluralCount.many && value?.few) {
71
- forProcessing = value.few;
72
- } else if (count > TranslationPluralCount.many && value?.many) {
73
- forProcessing = value.many;
74
- } else {
75
- forProcessing = value.other;
76
- }
77
- } else {
78
- forProcessing = value;
79
- }
80
- forProcessing = forProcessing.replace(/\{\{(\w+)}}/g, (_, placeholder) => {
81
- return replacements[placeholder] ?? `{{key:${placeholder}}}`;
82
- });
83
- return forProcessing;
84
- }
85
- } catch (e) {
86
- console.error(e);
87
- }
88
- return `{{${usedLanguage}:${key}}}`;
89
- };
90
- };
2
+ import { List } from "lucide-react";
3
+ import clsx6 from "clsx";
91
4
 
92
5
  // src/components/properties/PropertyBase.tsx
93
6
  import { AlertTriangle } from "lucide-react";
@@ -96,7 +9,7 @@ import clsx2 from "clsx";
96
9
  // src/components/user-action/Button.tsx
97
10
  import { forwardRef } from "react";
98
11
  import clsx from "clsx";
99
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
12
+ import { jsx, jsxs } from "react/jsx-runtime";
100
13
  var ButtonColorUtil = {
101
14
  solid: ["primary", "secondary", "tertiary", "positive", "warning", "negative", "neutral"],
102
15
  text: ["primary", "negative", "neutral"],
@@ -122,7 +35,6 @@ var ButtonUtil = {
122
35
  };
123
36
  var SolidButton = forwardRef(function SolidButton2({
124
37
  children,
125
- disabled = false,
126
38
  color = "primary",
127
39
  size = "medium",
128
40
  startIcon,
@@ -132,58 +44,56 @@ var SolidButton = forwardRef(function SolidButton2({
132
44
  ...restProps
133
45
  }, ref) {
134
46
  const colorClasses = {
135
- primary: "bg-button-solid-primary-background text-button-solid-primary-text",
136
- secondary: "bg-button-solid-secondary-background text-button-solid-secondary-text",
137
- tertiary: "bg-button-solid-tertiary-background text-button-solid-tertiary-text",
138
- positive: "bg-button-solid-positive-background text-button-solid-positive-text",
139
- warning: "bg-button-solid-warning-background text-button-solid-warning-text",
140
- negative: "bg-button-solid-negative-background text-button-solid-negative-text",
141
- neutral: "bg-button-solid-neutral-background text-button-solid-neutral-text"
47
+ primary: "not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text",
48
+ secondary: "not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text",
49
+ tertiary: "not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text",
50
+ positive: "not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text",
51
+ warning: "not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text",
52
+ negative: "not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text",
53
+ neutral: "not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text"
142
54
  }[color];
143
55
  const iconColorClasses = {
144
- primary: "text-button-solid-primary-icon",
145
- secondary: "text-button-solid-secondary-icon",
146
- tertiary: "text-button-solid-tertiary-icon",
147
- positive: "text-button-solid-positive-icon",
148
- warning: "text-button-solid-warning-icon",
149
- negative: "text-button-solid-negative-icon",
150
- neutral: "text-button-solid-neutral-icon"
56
+ primary: "not-group-disabled:text-button-solid-primary-icon",
57
+ secondary: "not-group-disabled:text-button-solid-secondary-icon",
58
+ tertiary: "not-group-disabled:text-button-solid-tertiary-icon",
59
+ positive: "not-group-disabled:text-button-solid-positive-icon",
60
+ warning: "not-group-disabled:text-button-solid-warning-icon",
61
+ negative: "not-group-disabled:text-button-solid-negative-icon",
62
+ neutral: "not-group-disabled:text-button-solid-neutral-icon"
151
63
  }[color];
152
64
  return /* @__PURE__ */ jsxs(
153
65
  "button",
154
66
  {
155
67
  ref,
156
68
  onClick,
157
- disabled,
158
69
  className: clsx(
159
- "font-semibold",
160
- {
161
- "text-disabled-text bg-disabled-background cursor-not-allowed": disabled,
162
- [clsx(colorClasses, "hover:brightness-90")]: !disabled
163
- },
70
+ "group font-semibold",
71
+ colorClasses,
72
+ "not-disabled:hover:brightness-90",
73
+ "disabled:text-disabled-text disabled:bg-disabled-background",
164
74
  ButtonUtil.paddingMapping[size],
165
75
  className
166
76
  ),
167
77
  ...restProps,
168
78
  children: [
169
- startIcon && /* @__PURE__ */ jsx2(
79
+ startIcon && /* @__PURE__ */ jsx(
170
80
  "span",
171
81
  {
172
- className: clsx({
173
- [iconColorClasses]: !disabled,
174
- [`text-disabled-icon`]: disabled
175
- }),
82
+ className: clsx(
83
+ iconColorClasses,
84
+ "group-disabled:text-disabled-icon"
85
+ ),
176
86
  children: startIcon
177
87
  }
178
88
  ),
179
89
  children,
180
- endIcon && /* @__PURE__ */ jsx2(
90
+ endIcon && /* @__PURE__ */ jsx(
181
91
  "span",
182
92
  {
183
- className: clsx({
184
- [iconColorClasses]: !disabled,
185
- [`text-disabled-icon`]: disabled
186
- }),
93
+ className: clsx(
94
+ iconColorClasses,
95
+ "group-disabled:text-disabled-icon"
96
+ ),
187
97
  children: endIcon
188
98
  }
189
99
  )
@@ -193,7 +103,6 @@ var SolidButton = forwardRef(function SolidButton2({
193
103
  });
194
104
  var TextButton = ({
195
105
  children,
196
- disabled = false,
197
106
  color = "neutral",
198
107
  size = "medium",
199
108
  startIcon,
@@ -204,56 +113,55 @@ var TextButton = ({
204
113
  ...restProps
205
114
  }) => {
206
115
  const colorClasses = {
207
- primary: "bg-transparent text-button-text-primary-text",
208
- negative: "bg-transparent text-button-text-negative-text",
209
- neutral: "bg-transparent text-button-text-neutral-text"
116
+ 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",
117
+ 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",
118
+ 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"
210
119
  }[color];
211
120
  const backgroundColor = {
212
- primary: "hover:bg-button-text-primary-text/20",
213
- negative: "hover:bg-button-text-negative-text/20",
214
- neutral: "hover:bg-button-text-neutral-text/20"
121
+ primary: "not-disabled:hover:bg-button-text-primary-text/20 not-disabled:focus-visible:bg-button-text-primary-text/20",
122
+ negative: "not-disabled:hover:bg-button-text-negative-text/20 not-disabled:focus-visible:bg-button-text-negative-text/20",
123
+ neutral: "not-disabled:hover:bg-button-text-neutral-text/20 not-disabled:focus-visible:bg-button-text-neutral-text/20"
215
124
  }[color];
216
125
  const iconColorClasses = {
217
- primary: "text-button-text-primary-icon",
218
- negative: "text-button-text-negative-icon",
219
- neutral: "text-button-text-neutral-icon"
126
+ primary: "not-group-disabled:text-button-text-primary-icon",
127
+ negative: "not-group-disabled:text-button-text-negative-icon",
128
+ neutral: "not-group-disabled:text-button-text-neutral-icon"
220
129
  }[color];
221
130
  return /* @__PURE__ */ jsxs(
222
131
  "button",
223
132
  {
224
133
  onClick,
225
- disabled,
226
134
  className: clsx(
227
- "font-semibold",
135
+ "group font-semibold",
136
+ "disabled:text-disabled-text",
137
+ colorClasses,
228
138
  {
229
- "text-disabled-text cursor-not-allowed": disabled,
230
- [colorClasses]: !disabled,
231
- [backgroundColor]: !disabled && coloredHoverBackground,
232
- "hover:bg-button-text-hover-background": !disabled && !coloredHoverBackground
139
+ [backgroundColor]: coloredHoverBackground,
140
+ "not-disabled:hover:bg-button-text-hover-background": !coloredHoverBackground
233
141
  },
234
142
  ButtonUtil.paddingMapping[size],
235
143
  className
236
144
  ),
237
145
  ...restProps,
238
146
  children: [
239
- startIcon && /* @__PURE__ */ jsx2(
147
+ startIcon && /* @__PURE__ */ jsx(
240
148
  "span",
241
149
  {
242
- className: clsx({
243
- [iconColorClasses]: !disabled,
244
- [`text-disabled-icon`]: disabled
245
- }),
150
+ className: clsx(
151
+ iconColorClasses,
152
+ "group-disabled:text-disabled-icon"
153
+ ),
246
154
  children: startIcon
247
155
  }
248
156
  ),
249
157
  children,
250
- endIcon && /* @__PURE__ */ jsx2(
158
+ endIcon && /* @__PURE__ */ jsx(
251
159
  "span",
252
160
  {
253
- className: clsx({
254
- [iconColorClasses]: !disabled,
255
- [`text-disabled-icon`]: disabled
256
- }),
161
+ className: clsx(
162
+ iconColorClasses,
163
+ "group-disabled:text-disabled-icon"
164
+ ),
257
165
  children: endIcon
258
166
  }
259
167
  )
@@ -261,34 +169,35 @@ var TextButton = ({
261
169
  }
262
170
  );
263
171
  };
264
- var IconButton = ({
172
+ var IconButton = forwardRef(function IconButton2({
265
173
  children,
266
- disabled = false,
267
174
  color = "primary",
268
175
  size = "medium",
269
176
  className,
270
177
  ...restProps
271
- }) => {
178
+ }, ref) {
272
179
  const colorClasses = {
273
- primary: "bg-button-solid-primary-background text-button-solid-primary-text",
274
- secondary: "bg-button-solid-secondary-background text-button-solid-secondary-text",
275
- tertiary: "bg-button-solid-tertiary-background text-button-solid-tertiary-text",
276
- positive: "bg-button-solid-positive-background text-button-solid-positive-text",
277
- warning: "bg-button-solid-warning-background text-button-solid-warning-text",
278
- negative: "bg-button-solid-negative-background text-button-solid-negative-text",
279
- neutral: "bg-button-solid-neutral-background text-button-solid-neutral-text",
280
- transparent: "bg-transparent"
180
+ primary: "not-disabled:bg-button-solid-primary-background not-disabled:text-button-solid-primary-text",
181
+ secondary: "not-disabled:bg-button-solid-secondary-background not-disabled:text-button-solid-secondary-text",
182
+ tertiary: "not-disabled:bg-button-solid-tertiary-background not-disabled:text-button-solid-tertiary-text",
183
+ positive: "not-disabled:bg-button-solid-positive-background not-disabled:text-button-solid-positive-text",
184
+ warning: "not-disabled:bg-button-solid-warning-background not-disabled:text-button-solid-warning-text",
185
+ negative: "not-disabled:bg-button-solid-negative-background not-disabled:text-button-solid-negative-text",
186
+ neutral: "not-disabled:bg-button-solid-neutral-background not-disabled:text-button-solid-neutral-text",
187
+ transparent: "not-disabled:bg-transparent"
281
188
  }[color];
282
- return /* @__PURE__ */ jsx2(
189
+ return /* @__PURE__ */ jsx(
283
190
  "button",
284
191
  {
285
- disabled,
192
+ ref,
286
193
  className: clsx(
194
+ colorClasses,
195
+ "not-disabled:hover:brightness-90",
196
+ "disabled:text-disabled-text",
287
197
  {
288
- "text-disabled-text bg-disabled-background cursor-not-allowed": disabled && color !== "transparent",
289
- "text-disabled-text cursor-not-allowed opacity-70": disabled && color === "transparent",
290
- "hover:bg-button-text-hover-background": !disabled && color === "transparent",
291
- [clsx(colorClasses, "hover:brightness-90")]: !disabled
198
+ "disabled:bg-disabled-background": color !== "transparent",
199
+ "disabled:opacity-70": color === "transparent",
200
+ "not-disabled:hover:bg-button-text-hover-background": color === "transparent"
292
201
  },
293
202
  ButtonUtil.iconPaddingMapping[size],
294
203
  className
@@ -297,6 +206,93 @@ var IconButton = ({
297
206
  children
298
207
  }
299
208
  );
209
+ });
210
+
211
+ // src/localization/LanguageProvider.tsx
212
+ import { createContext, useContext, useEffect, useState as useState2 } from "react";
213
+
214
+ // src/hooks/useLocalStorage.ts
215
+ import { useCallback, useState } from "react";
216
+
217
+ // src/localization/util.ts
218
+ var languages = ["en", "de"];
219
+ var languagesLocalNames = {
220
+ en: "English",
221
+ de: "Deutsch"
222
+ };
223
+ var DEFAULT_LANGUAGE = "en";
224
+ var LanguageUtil = {
225
+ languages,
226
+ DEFAULT_LANGUAGE,
227
+ languagesLocalNames
228
+ };
229
+
230
+ // src/localization/LanguageProvider.tsx
231
+ import { jsx as jsx2 } from "react/jsx-runtime";
232
+ var LanguageContext = createContext({
233
+ language: LanguageUtil.DEFAULT_LANGUAGE,
234
+ setLanguage: (v) => v
235
+ });
236
+ var useLanguage = () => useContext(LanguageContext);
237
+
238
+ // src/localization/useTranslation.ts
239
+ var TranslationPluralCount = {
240
+ zero: 0,
241
+ one: 1,
242
+ two: 2,
243
+ few: 3,
244
+ many: 11,
245
+ other: -1
246
+ };
247
+ var useTranslation = (translations, overwriteTranslation = {}) => {
248
+ const { language: languageProp, translation: overwrite } = overwriteTranslation;
249
+ const { language: inferredLanguage } = useLanguage();
250
+ const usedLanguage = languageProp ?? inferredLanguage;
251
+ const usedTranslations = [...translations];
252
+ if (overwrite) {
253
+ usedTranslations.push(overwrite);
254
+ }
255
+ return (key, options) => {
256
+ const { count, replacements } = { ...{ count: 0, replacements: {} }, ...options };
257
+ try {
258
+ for (let i = translations.length - 1; i >= 0; i--) {
259
+ const translation = translations[i];
260
+ const localizedTranslation = translation[usedLanguage];
261
+ if (!localizedTranslation) {
262
+ continue;
263
+ }
264
+ const value = localizedTranslation[key];
265
+ if (!value) {
266
+ continue;
267
+ }
268
+ let forProcessing;
269
+ if (typeof value !== "string") {
270
+ if (count === TranslationPluralCount.zero && value?.zero) {
271
+ forProcessing = value.zero;
272
+ } else if (count === TranslationPluralCount.one && value?.one) {
273
+ forProcessing = value.one;
274
+ } else if (count === TranslationPluralCount.two && value?.two) {
275
+ forProcessing = value.two;
276
+ } else if (TranslationPluralCount.few <= count && count < TranslationPluralCount.many && value?.few) {
277
+ forProcessing = value.few;
278
+ } else if (count > TranslationPluralCount.many && value?.many) {
279
+ forProcessing = value.many;
280
+ } else {
281
+ forProcessing = value.other;
282
+ }
283
+ } else {
284
+ forProcessing = value;
285
+ }
286
+ forProcessing = forProcessing.replace(/\{\{(\w+)}}/g, (_, placeholder) => {
287
+ return replacements[placeholder] ?? `{{key:${placeholder}}}`;
288
+ });
289
+ return forProcessing;
290
+ }
291
+ } catch (e) {
292
+ console.error(e);
293
+ }
294
+ return `{{${usedLanguage}:${key}}}`;
295
+ };
300
296
  };
301
297
 
302
298
  // src/localization/defaults/form.ts
@@ -335,6 +331,7 @@ var formTranslation = {
335
331
  next: "Next",
336
332
  no: "No",
337
333
  none: "None",
334
+ nothingFound: "Nothing found",
338
335
  of: "of",
339
336
  optional: "Optional",
340
337
  pleaseWait: "Please wait...",
@@ -391,6 +388,7 @@ var formTranslation = {
391
388
  next: "Weiter",
392
389
  no: "Nein",
393
390
  none: "Nichts",
391
+ nothingFound: "Nichts gefunden",
394
392
  of: "von",
395
393
  optional: "Optional",
396
394
  pleaseWait: "Bitte warten...",
@@ -462,13 +460,13 @@ var PropertyBase = ({
462
460
  children: [
463
461
  input({ softRequired, hasValue }),
464
462
  requiredAndNoValue && /* @__PURE__ */ jsx3("div", { className: "text-warning", children: /* @__PURE__ */ jsx3(AlertTriangle, { size: 24 }) }),
465
- onRemove && hasValue && /* @__PURE__ */ jsx3(
463
+ onRemove && !readOnly && /* @__PURE__ */ jsx3(
466
464
  TextButton,
467
465
  {
468
466
  onClick: onRemove,
469
467
  color: "negative",
470
- className: clsx2("items-center", { "!text-transparent": !hasValue || readOnly }),
471
- disabled: !hasValue || readOnly,
468
+ className: clsx2("items-center"),
469
+ disabled: !hasValue,
472
470
  children: translation("remove")
473
471
  }
474
472
  )
@@ -478,102 +476,37 @@ var PropertyBase = ({
478
476
  ] });
479
477
  };
480
478
 
481
- // src/components/user-action/Select.tsx
482
- import { useCallback as useCallback5 } from "react";
483
- import { useEffect as useEffect10, useState as useState9 } from "react";
484
- import clsx9 from "clsx";
485
-
486
- // src/components/user-action/Label.tsx
487
- import clsx3 from "clsx";
488
- import { jsx as jsx4 } from "react/jsx-runtime";
489
- var styleMapping = {
490
- labelSmall: "textstyle-label-sm",
491
- labelMedium: "textstyle-label-md",
492
- labelBig: "textstyle-label-lg"
493
- };
494
- var Label = ({
495
- children,
496
- name,
497
- labelType = "labelSmall",
498
- className,
499
- ...props
500
- }) => {
501
- return /* @__PURE__ */ jsx4("label", { ...props, className: clsx3(styleMapping[labelType], className), children: children ? children : name });
502
- };
503
-
504
- // src/components/layout-and-navigation/Tile.tsx
505
- import clsx4 from "clsx";
506
- import { Check } from "lucide-react";
507
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
508
- var Tile = ({
509
- title,
510
- titleClassName,
511
- description,
512
- descriptionClassName,
513
- onClick,
514
- isSelected = false,
515
- disabled = false,
516
- prefix,
517
- suffix,
518
- normalClassName = "hover:bg-primary/40 cursor-pointer",
519
- selectedClassName = "bg-primary/20",
520
- disabledClassName = "text-disabled-text bg-disabled-background cursor-not-allowed",
521
- className
522
- }) => {
523
- return /* @__PURE__ */ jsxs3(
524
- "div",
525
- {
526
- className: clsx4(
527
- "flex-row-2 w-full items-center",
528
- {
529
- [normalClassName]: onClick && !disabled,
530
- [selectedClassName]: isSelected && !disabled,
531
- [disabledClassName]: disabled
532
- },
533
- className
534
- ),
535
- onClick: disabled ? void 0 : onClick,
536
- children: [
537
- prefix,
538
- /* @__PURE__ */ jsxs3("div", { className: "flex-col-0 w-full", children: [
539
- /* @__PURE__ */ jsx5("span", { className: clsx4(titleClassName ?? "textstyle-title-normal"), children: title }),
540
- !!description && /* @__PURE__ */ jsx5("span", { className: clsx4(descriptionClassName ?? "textstyle-description"), children: description })
541
- ] }),
542
- suffix ?? (isSelected ? /* @__PURE__ */ jsx5(Check, { size: 24 }) : void 0)
543
- ]
544
- }
545
- );
546
- };
547
- var ListTile = ({
548
- ...props
549
- }) => {
550
- return /* @__PURE__ */ jsx5(
551
- Tile,
552
- {
553
- ...props,
554
- titleClassName: props.titleClassName ?? "font-semibold",
555
- className: clsx4("px-2 py-1 rounded-md", props.className),
556
- disabledClassName: props.disabledClassName ?? "text-disabled-text cursor-not-allowed"
557
- }
558
- );
559
- };
479
+ // src/components/user-action/select/Select.tsx
480
+ import {
481
+ createContext as createContext2,
482
+ forwardRef as forwardRef3,
483
+ useCallback as useCallback5,
484
+ useContext as useContext2,
485
+ useEffect as useEffect6,
486
+ useId as useId3,
487
+ useImperativeHandle,
488
+ useRef as useRef2,
489
+ useState as useState7
490
+ } from "react";
491
+ import clsx5 from "clsx";
560
492
 
561
493
  // src/components/layout-and-navigation/Expandable.tsx
562
- import { forwardRef as forwardRef2, useCallback as useCallback2, useEffect as useEffect2, useState as useState3 } from "react";
494
+ import { forwardRef as forwardRef2, useCallback as useCallback2, useEffect as useEffect2, useId, useState as useState3 } from "react";
563
495
  import { ChevronDown } from "lucide-react";
564
- import clsx5 from "clsx";
496
+ import clsx3 from "clsx";
565
497
 
566
- // src/util/noop.ts
498
+ // src/utils/noop.ts
567
499
  var noop = () => void 0;
568
500
 
569
501
  // src/components/layout-and-navigation/Expandable.tsx
570
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
502
+ import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
571
503
  var ExpansionIcon = ({ isExpanded, className }) => {
572
- return /* @__PURE__ */ jsx6(
504
+ return /* @__PURE__ */ jsx4(
573
505
  ChevronDown,
574
506
  {
575
- className: clsx5(
576
- "min-w-6 w-6 min-h-6 h-6 transition-transform duration-200 ease-in-out",
507
+ "aria-hidden": true,
508
+ className: clsx3(
509
+ "min-w-6 w-6 min-h-6 h-6 transition-transform motion-safe:duration-200 motion-reduce:duration-0 ease-in-out",
577
510
  { "rotate-180": isExpanded },
578
511
  className
579
512
  )
@@ -582,6 +515,7 @@ var ExpansionIcon = ({ isExpanded, className }) => {
582
515
  };
583
516
  var Expandable = forwardRef2(function Expandable2({
584
517
  children,
518
+ id: providedId,
585
519
  label,
586
520
  icon,
587
521
  isExpanded = false,
@@ -593,19 +527,26 @@ var Expandable = forwardRef2(function Expandable2({
593
527
  contentClassName,
594
528
  contentExpandedClassName
595
529
  }, ref) {
596
- const defaultIcon = useCallback2((expanded) => /* @__PURE__ */ jsx6(ExpansionIcon, { isExpanded: expanded }), []);
530
+ const defaultIcon = useCallback2((expanded) => /* @__PURE__ */ jsx4(ExpansionIcon, { isExpanded: expanded }), []);
597
531
  icon ??= defaultIcon;
598
- return /* @__PURE__ */ jsxs4(
532
+ const generatedId = useId();
533
+ const id = providedId ?? generatedId;
534
+ return /* @__PURE__ */ jsxs3(
599
535
  "div",
600
536
  {
601
537
  ref,
602
- className: clsx5("flex-col-0 bg-surface text-on-surface group rounded-lg shadow-sm", { "cursor-pointer": !clickOnlyOnHeader && !disabled }, className),
603
538
  onClick: () => !clickOnlyOnHeader && !disabled && onChange(!isExpanded),
539
+ className: clsx3(
540
+ "flex-col-0 bg-surface text-on-surface group rounded-lg shadow-sm",
541
+ { "cursor-pointer": !clickOnlyOnHeader && !disabled },
542
+ className
543
+ ),
604
544
  children: [
605
- /* @__PURE__ */ jsxs4(
606
- "div",
545
+ /* @__PURE__ */ jsxs3(
546
+ "button",
607
547
  {
608
- className: clsx5(
548
+ onClick: () => clickOnlyOnHeader && !disabled && onChange(!isExpanded),
549
+ className: clsx3(
609
550
  "flex-row-2 py-2 px-4 rounded-lg justify-between items-center bg-surface text-on-surface select-none",
610
551
  {
611
552
  "group-hover:brightness-97": !isExpanded,
@@ -614,24 +555,28 @@ var Expandable = forwardRef2(function Expandable2({
614
555
  },
615
556
  headerClassName
616
557
  ),
617
- onClick: () => clickOnlyOnHeader && !disabled && onChange(!isExpanded),
558
+ "aria-expanded": isExpanded,
559
+ "aria-controls": `${id}-content`,
560
+ "aria-disabled": disabled ?? void 0,
618
561
  children: [
619
562
  label,
620
563
  icon(isExpanded)
621
564
  ]
622
565
  }
623
566
  ),
624
- /* @__PURE__ */ jsx6(
567
+ /* @__PURE__ */ jsx4(
625
568
  "div",
626
569
  {
627
- className: clsx5(
570
+ id: `${id}-content`,
571
+ className: clsx3(
628
572
  "flex-col-2 px-4 transition-all duration-300 ease-in-out",
629
573
  {
630
- [clsx5("max-h-96 opacity-100 pb-2 overflow-y-auto", contentExpandedClassName)]: isExpanded,
574
+ [clsx3("max-h-96 opacity-100 pb-2 overflow-y-auto", contentExpandedClassName)]: isExpanded,
631
575
  "max-h-0 opacity-0 overflow-hidden": !isExpanded
632
576
  },
633
577
  contentClassName
634
578
  ),
579
+ role: "region",
635
580
  children
636
581
  }
637
582
  )
@@ -648,7 +593,7 @@ var ExpandableUncontrolled = forwardRef2(function ExpandableUncontrolled2({
648
593
  useEffect2(() => {
649
594
  setUsedIsExpanded(isExpanded);
650
595
  }, [isExpanded]);
651
- return /* @__PURE__ */ jsx6(
596
+ return /* @__PURE__ */ jsx4(
652
597
  Expandable,
653
598
  {
654
599
  ...props,
@@ -662,721 +607,991 @@ var ExpandableUncontrolled = forwardRef2(function ExpandableUncontrolled2({
662
607
  );
663
608
  });
664
609
 
665
- // src/components/user-action/Menu.tsx
666
- import { useEffect as useEffect5, useRef, useState as useState5 } from "react";
667
- import clsx6 from "clsx";
610
+ // src/hooks/focus/useFocusTrap.ts
611
+ import { useCallback as useCallback3, useEffect as useEffect4, useId as useId2, useRef, useState as useState5 } from "react";
668
612
 
669
- // src/hooks/useOutsideClick.ts
670
- import { useEffect as useEffect3 } from "react";
671
- var useOutsideClick = (refs, handler) => {
672
- useEffect3(() => {
673
- const listener = (event) => {
674
- if (event.target === null) return;
675
- if (refs.some((ref) => !ref.current || ref.current.contains(event.target))) {
676
- return;
677
- }
678
- handler();
679
- };
680
- document.addEventListener("mousedown", listener);
681
- document.addEventListener("touchstart", listener);
613
+ // src/hooks/focus/useIsMounted.ts
614
+ import { useEffect as useEffect3, useLayoutEffect, useState as useState4 } from "react";
615
+ var isClient = typeof window !== "undefined" && typeof document !== "undefined";
616
+ var useIsomorphicEffect = isClient ? useLayoutEffect : useEffect3;
617
+ var useIsMounted = () => {
618
+ const [isMounted, setIsMounted] = useState4(false);
619
+ useIsomorphicEffect(() => {
620
+ setIsMounted(true);
682
621
  return () => {
683
- document.removeEventListener("mousedown", listener);
684
- document.removeEventListener("touchstart", listener);
622
+ setIsMounted(false);
685
623
  };
686
- }, [refs, handler]);
624
+ }, []);
625
+ return isMounted;
687
626
  };
688
627
 
689
- // src/hooks/useHoverState.ts
690
- import { useEffect as useEffect4, useState as useState4 } from "react";
691
- var defaultUseHoverStateProps = {
692
- closingDelay: 200,
693
- isDisabled: false
628
+ // src/hooks/focus/useFocusTrap.ts
629
+ var createFocusGuard = () => {
630
+ const div = document.createElement("div");
631
+ Object.assign(div.style, {
632
+ opacity: "0",
633
+ outline: "none",
634
+ boxShadow: "none",
635
+ position: "fixed",
636
+ pointerEvents: "none",
637
+ touchAction: "none"
638
+ });
639
+ div.tabIndex = 0;
640
+ div.setAttribute("data-hw-focus-guard", "");
641
+ document.body.appendChild(div);
642
+ return div;
694
643
  };
695
- var useHoverState = (props = void 0) => {
696
- const { closingDelay, isDisabled } = { ...defaultUseHoverStateProps, ...props };
697
- const [isHovered, setIsHovered] = useState4(false);
698
- const [timer, setTimer] = useState4();
699
- const onMouseEnter = () => {
700
- if (isDisabled) {
701
- return;
644
+ function getContainedFocusableElements(element) {
645
+ return element?.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
646
+ }
647
+ var FocusTrapService = class {
648
+ constructor() {
649
+ // The last entry is always the active one
650
+ this.listeners = [];
651
+ this.onFocusIn = (event) => {
652
+ const active = this.getActive();
653
+ if (!active || !active.container.current) return;
654
+ const { container } = active;
655
+ if (!container.current.contains(event.target)) {
656
+ this.focusElement();
657
+ }
658
+ };
659
+ }
660
+ getActive() {
661
+ if (this.listeners.length === 0) return void 0;
662
+ return this.listeners[this.listeners.length - 1];
663
+ }
664
+ focusElement() {
665
+ const active = this.getActive();
666
+ if (!active) return;
667
+ const { container, initialFocusElement } = active;
668
+ const containerElement = container.current;
669
+ if (initialFocusElement?.current) {
670
+ initialFocusElement.current.focus();
671
+ } else {
672
+ const elements = getContainedFocusableElements(containerElement);
673
+ if (elements && elements.length > 0) {
674
+ const first = elements.item(0);
675
+ first.focus();
676
+ } else {
677
+ containerElement.focus();
678
+ }
702
679
  }
703
- clearTimeout(timer);
704
- setIsHovered(true);
705
- };
706
- const onMouseLeave = () => {
707
- if (isDisabled) {
708
- return;
680
+ }
681
+ removeGuards() {
682
+ document.querySelectorAll("[data-hw-focus-guard]").forEach((node) => node.remove());
683
+ }
684
+ addGuards() {
685
+ document.body.insertAdjacentElement("afterbegin", createFocusGuard());
686
+ document.body.insertAdjacentElement("beforeend", createFocusGuard());
687
+ }
688
+ activate() {
689
+ document.addEventListener("focusin", this.onFocusIn);
690
+ this.addGuards();
691
+ }
692
+ deactivate() {
693
+ document.removeEventListener("focusin", this.onFocusIn);
694
+ this.removeGuards();
695
+ }
696
+ register(listener) {
697
+ this.listeners.push(listener);
698
+ if (this.listeners.length === 1) {
699
+ this.activate();
709
700
  }
710
- setTimer(setTimeout(() => {
711
- setIsHovered(false);
712
- }, closingDelay));
713
- };
714
- useEffect4(() => {
715
- if (timer) {
701
+ const active = listener;
702
+ this.listeners.forEach((listener2) => {
703
+ const { focus, pause } = listener2;
704
+ if (listener2 === active) {
705
+ focus();
706
+ } else {
707
+ pause();
708
+ }
709
+ });
710
+ }
711
+ unregister(id) {
712
+ const index = this.listeners.findIndex((trap) => trap.id === id);
713
+ if (index !== -1) {
714
+ const isActive = index === this.listeners.length - 1;
715
+ const listener = this.listeners[index];
716
+ this.listeners = this.listeners.filter((listener2) => listener2.id !== id);
717
+ if (isActive) {
718
+ this.deactivate();
719
+ listener.focusLast();
720
+ const active = this.getActive();
721
+ this.listeners.forEach((listener2) => {
722
+ const { pause, unpause } = listener2;
723
+ if (listener2 === active) {
724
+ unpause();
725
+ } else {
726
+ pause();
727
+ }
728
+ });
729
+ if (this.listeners.length > 0) {
730
+ this.activate();
731
+ }
732
+ }
733
+ } else {
734
+ console.warn(`Unable to unregister id ${id}: not found`);
735
+ }
736
+ }
737
+ };
738
+ var service = new FocusTrapService();
739
+ var useFocusTrap = ({
740
+ container,
741
+ active = true,
742
+ initialFocus,
743
+ focusFirst = true
744
+ }) => {
745
+ const lastFocusRef = useRef(null);
746
+ const [paused, setPaused] = useState5(false);
747
+ const isMounted = useIsMounted();
748
+ const id = useId2();
749
+ const focusElement = useCallback3(() => {
750
+ const containerElement = container.current;
751
+ if (initialFocus?.current) {
752
+ initialFocus.current.focus();
753
+ } else {
754
+ const elements = getContainedFocusableElements(containerElement);
755
+ if (elements && elements.length > 0) {
756
+ const first = elements.item(0);
757
+ first.focus();
758
+ } else {
759
+ containerElement.focus();
760
+ }
761
+ }
762
+ }, [container, initialFocus]);
763
+ useEffect4(() => {
764
+ if (active && isMounted) {
765
+ let pause = function() {
766
+ setPaused(true);
767
+ }, unpause = function() {
768
+ setPaused(false);
769
+ if (!container.current.contains(document.activeElement)) {
770
+ focusElement();
771
+ }
772
+ }, focus = function() {
773
+ focusElement();
774
+ setPaused(false);
775
+ }, focusLast = function() {
776
+ lastFocusRef.current?.focus();
777
+ };
778
+ if (!lastFocusRef.current) {
779
+ lastFocusRef.current = document.activeElement;
780
+ }
781
+ service.register({ id, pause, focus, focusLast, unpause, container, initialFocusElement: initialFocus });
716
782
  return () => {
717
- clearTimeout(timer);
783
+ service.unregister(id);
784
+ lastFocusRef.current = void 0;
718
785
  };
719
786
  }
720
- });
787
+ }, [active, container, focusElement, id, initialFocus, isMounted]);
721
788
  useEffect4(() => {
722
- if (timer) {
723
- clearTimeout(timer);
789
+ if (active && !paused && isMounted) {
790
+ let onKeyDown = function(event) {
791
+ const key = event.key;
792
+ const elements = getContainedFocusableElements(containerElement);
793
+ const active2 = document.activeElement;
794
+ const index = [...elements].findIndex((value) => value === active2);
795
+ if (index === -1 || event.altKey || event.ctrlKey || event.metaKey) {
796
+ return;
797
+ }
798
+ if (key === "Tab") {
799
+ const next = event.shiftKey ? -1 : 1;
800
+ const nextIndex = (index + next + elements.length) % elements.length;
801
+ const nextElement = elements[nextIndex];
802
+ nextElement.focus();
803
+ event.preventDefault();
804
+ }
805
+ };
806
+ const containerElement = container.current;
807
+ containerElement.addEventListener("keydown", onKeyDown);
808
+ return () => {
809
+ containerElement.removeEventListener("keydown", onKeyDown);
810
+ };
724
811
  }
725
- }, [isDisabled]);
726
- return {
727
- isHovered,
728
- setIsHovered,
729
- handlers: { onMouseEnter, onMouseLeave }
730
- };
812
+ }, [active, paused, isMounted, container, initialFocus, focusFirst, focusElement]);
731
813
  };
732
814
 
733
- // src/util/PropsWithFunctionChildren.ts
734
- var resolve = (children, bag) => {
735
- if (typeof children === "function") {
736
- return children(bag);
737
- }
738
- return children ?? void 0;
815
+ // src/utils/match.ts
816
+ var match = (key, values) => {
817
+ return values[key];
739
818
  };
740
- var BagFunctionUtil = {
741
- resolve
819
+
820
+ // src/components/user-action/select/Select.tsx
821
+ import { CheckIcon, Plus, XIcon } from "lucide-react";
822
+
823
+ // src/components/layout-and-navigation/Chip.tsx
824
+ import clsx4 from "clsx";
825
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
826
+ var Chip = ({
827
+ children,
828
+ trailingIcon,
829
+ color = "default",
830
+ size = "md",
831
+ icon = false,
832
+ variant = "normal",
833
+ className = "",
834
+ ...restProps
835
+ }) => {
836
+ const colorMapping = {
837
+ default: "text-tag-default-text bg-tag-default-background",
838
+ dark: "text-tag-dark-text bg-tag-dark-background",
839
+ red: "text-tag-red-text bg-tag-red-background",
840
+ yellow: "text-tag-yellow-text bg-tag-yellow-background",
841
+ green: "text-tag-green-text bg-tag-green-background",
842
+ blue: "text-tag-blue-text bg-tag-blue-background",
843
+ pink: "text-tag-pink-text bg-tag-pink-background",
844
+ orange: "text-tag-orange-text bg-tag-orange-background"
845
+ }[color];
846
+ const colorMappingIcon = {
847
+ default: "text-tag-default-icon",
848
+ dark: "text-tag-dark-icon",
849
+ red: "text-tag-red-icon",
850
+ yellow: "text-tag-yellow-icon",
851
+ green: "text-tag-green-icon",
852
+ blue: "text-tag-blue-icon",
853
+ pink: "text-tag-pink-icon",
854
+ orange: "text-tag-orange-icon"
855
+ }[color];
856
+ return /* @__PURE__ */ jsxs4(
857
+ "div",
858
+ {
859
+ ...restProps,
860
+ className: clsx4(
861
+ `flex-row-0 w-fit font-semibold`,
862
+ colorMapping,
863
+ !icon ? {
864
+ "px-1 py-0.5": size === "sm",
865
+ "px-2 py-1": size === "md",
866
+ "px-4 py-2": size === "lg"
867
+ } : {
868
+ "p-0.5": size === "sm",
869
+ "p-1": size === "md",
870
+ "p-2": size === "lg"
871
+ },
872
+ {
873
+ "rounded-md": variant === "normal",
874
+ "rounded-full": variant === "fullyRounded"
875
+ },
876
+ className
877
+ ),
878
+ children: [
879
+ children,
880
+ trailingIcon && /* @__PURE__ */ jsx5("span", { className: colorMappingIcon, children: trailingIcon })
881
+ ]
882
+ }
883
+ );
742
884
  };
743
885
 
744
- // src/hooks/usePopoverPosition.ts
745
- var defaultPopoverPositionOptions = {
746
- edgePadding: 16,
747
- outerGap: 4,
748
- horizontalAlignment: "leftInside",
749
- verticalAlignment: "bottomOutside",
750
- disabled: false
886
+ // src/hooks/useFloatingElement.ts
887
+ import { useCallback as useCallback4, useEffect as useEffect5, useState as useState6 } from "react";
888
+
889
+ // src/utils/math.ts
890
+ var clamp = (value, range = [0, 1]) => {
891
+ const [min, max] = range;
892
+ return Math.min(Math.max(value, min), max);
751
893
  };
752
- var usePopoverPosition = (trigger, options) => {
753
- const {
754
- edgePadding,
755
- outerGap,
756
- verticalAlignment,
757
- horizontalAlignment,
758
- disabled
759
- } = { ...defaultPopoverPositionOptions, ...options };
760
- if (disabled || !trigger) {
761
- return {};
762
- }
763
- const left = {
764
- leftOutside: trigger.left - outerGap,
765
- leftInside: trigger.left,
766
- rightOutside: trigger.right + outerGap,
767
- rightInside: trigger.right,
768
- center: trigger.left + trigger.width / 2
769
- }[horizontalAlignment];
770
- const top = {
771
- topOutside: trigger.top - outerGap,
772
- topInside: trigger.top,
773
- bottomOutside: trigger.bottom + outerGap,
774
- bottomInside: trigger.bottom,
775
- center: trigger.top + trigger.height / 2
776
- }[verticalAlignment];
777
- const translateX = {
778
- leftOutside: "-100%",
779
- leftInside: void 0,
780
- rightOutside: void 0,
781
- rightInside: "-100%",
782
- center: "-50%"
894
+
895
+ // src/hooks/useFloatingElement.ts
896
+ function calculatePosition({
897
+ windowRect,
898
+ containerRect,
899
+ anchorRect,
900
+ options
901
+ }) {
902
+ const { verticalAlignment, horizontalAlignment, gap, screenPadding } = options;
903
+ const windowWidth = windowRect.width;
904
+ const windowHeight = windowRect.height;
905
+ const maxWidth = windowWidth - 2 * screenPadding;
906
+ const maxHeight = windowHeight - 2 * screenPadding;
907
+ const width = Math.min(containerRect.width, maxWidth);
908
+ const height = Math.min(containerRect.height, maxHeight);
909
+ const leftSuggestion = {
910
+ beforeStart: anchorRect.left - width - gap,
911
+ afterStart: anchorRect.left,
912
+ center: anchorRect.left + anchorRect.width / 2 - width / 2,
913
+ beforeEnd: anchorRect.right - width,
914
+ afterEnd: anchorRect.right + gap
783
915
  }[horizontalAlignment];
784
- const translateY = {
785
- topOutside: "-100%",
786
- topInside: void 0,
787
- bottomOutside: void 0,
788
- bottomInside: "-100%",
789
- center: "-50%"
916
+ const topSuggestion = {
917
+ beforeStart: anchorRect.top - height - gap,
918
+ afterStart: anchorRect.top,
919
+ center: anchorRect.top + anchorRect.height / 2 - height / 2,
920
+ beforeEnd: anchorRect.bottom - height,
921
+ afterEnd: anchorRect.bottom + gap
790
922
  }[verticalAlignment];
923
+ const left = clamp(leftSuggestion, [
924
+ screenPadding,
925
+ windowWidth - screenPadding - width
926
+ ]);
927
+ const top = clamp(topSuggestion, [
928
+ screenPadding,
929
+ windowHeight - screenPadding - height
930
+ ]);
791
931
  return {
792
- left: Math.max(left, edgePadding),
793
- top: Math.max(top, edgePadding),
794
- translate: [translateX ?? "0", translateY ?? "0"].join(" ")
932
+ left,
933
+ top,
934
+ maxWidth,
935
+ maxHeight
795
936
  };
796
- };
937
+ }
938
+ function useFloatingElement({
939
+ active = true,
940
+ windowRef,
941
+ anchorRef,
942
+ containerRef,
943
+ isPolling = false,
944
+ pollingInterval = 100,
945
+ verticalAlignment = "afterEnd",
946
+ horizontalAlignment = "afterStart",
947
+ screenPadding = 16,
948
+ gap = 4
949
+ }) {
950
+ const [style, setStyle] = useState6();
951
+ const isMounted = useIsMounted();
952
+ const calculate = useCallback4(() => {
953
+ const containerRect = containerRef.current.getBoundingClientRect();
954
+ const windowRect = windowRef?.current.getBoundingClientRect() ?? {
955
+ top: 0,
956
+ bottom: window.innerHeight,
957
+ left: 0,
958
+ right: window.innerWidth,
959
+ width: window.innerWidth,
960
+ height: window.innerHeight
961
+ };
962
+ const anchorElement = anchorRef?.current;
963
+ if (anchorRef && !anchorElement) {
964
+ console.warn("FloatingContainer anchor provided, but its value is undefined");
965
+ }
966
+ const anchorRect = anchorElement?.getBoundingClientRect() ?? windowRect;
967
+ const calculateProps = {
968
+ windowRect,
969
+ anchorRect,
970
+ containerRect,
971
+ options: {
972
+ horizontalAlignment,
973
+ verticalAlignment,
974
+ screenPadding,
975
+ gap
976
+ }
977
+ };
978
+ setStyle(calculatePosition(calculateProps));
979
+ }, [anchorRef, containerRef, gap, horizontalAlignment, screenPadding, verticalAlignment, windowRef]);
980
+ const height = containerRef.current?.getBoundingClientRect().height;
981
+ const width = containerRef.current?.getBoundingClientRect().width;
982
+ useEffect5(() => {
983
+ if (active && isMounted) {
984
+ calculate();
985
+ } else {
986
+ setStyle(void 0);
987
+ }
988
+ }, [calculate, active, isMounted, height, width]);
989
+ useEffect5(() => {
990
+ window.addEventListener("resize", calculate);
991
+ let timeout;
992
+ if (isPolling) {
993
+ timeout = setInterval(calculate, pollingInterval);
994
+ }
995
+ return () => {
996
+ window.removeEventListener("resize", calculate);
997
+ if (timeout) {
998
+ clearInterval(timeout);
999
+ }
1000
+ };
1001
+ }, [calculate, isPolling, pollingInterval]);
1002
+ return style;
1003
+ }
797
1004
 
798
- // src/components/user-action/Menu.tsx
1005
+ // src/components/user-action/select/Select.tsx
799
1006
  import { createPortal } from "react-dom";
800
- import { Fragment, jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
801
- function getScrollableParents(element) {
802
- const scrollables = [];
803
- let parent = element.parentElement;
804
- while (parent) {
805
- scrollables.push(parent);
806
- parent = parent.parentElement;
1007
+ import { Fragment, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
1008
+ var defaultToggleOpenOptions = {
1009
+ highlightStartPosition: "first"
1010
+ };
1011
+ var SelectContext = createContext2(null);
1012
+ function useSelectContext() {
1013
+ const ctx = useContext2(SelectContext);
1014
+ if (!ctx) {
1015
+ throw new Error("SelectContext must be used within a ListBoxPrimitive");
807
1016
  }
808
- return scrollables;
1017
+ return ctx;
809
1018
  }
810
- var Menu = ({
811
- trigger,
1019
+ var SelectRoot = ({
812
1020
  children,
813
- alignmentHorizontal = "leftInside",
814
- alignmentVertical = "bottomOutside",
815
- showOnHover = false,
1021
+ id,
1022
+ value,
1023
+ onValueChanged,
1024
+ values,
1025
+ onValuesChanged,
1026
+ isOpen = false,
816
1027
  disabled = false,
817
- menuClassName = ""
1028
+ invalid = false,
1029
+ isMultiSelect = false
818
1030
  }) => {
819
- const { isHovered: isOpen, setIsHovered: setIsOpen } = useHoverState({ isDisabled: !showOnHover || disabled });
820
- const triggerRef = useRef(null);
821
- const menuRef = useRef(null);
822
- useOutsideClick([triggerRef, menuRef], () => setIsOpen(false));
823
- const [isHidden, setIsHidden] = useState5(true);
824
- const bag = {
825
- isOpen,
826
- close: () => setIsOpen(false),
827
- toggleOpen: () => setIsOpen((prevState) => !prevState),
828
- disabled
1031
+ const optionsRef = useRef2([]);
1032
+ const triggerRef = useRef2(null);
1033
+ const generatedId = useId3();
1034
+ const usedId = id ?? generatedId;
1035
+ const [internalState, setInternalState] = useState7({
1036
+ isOpen
1037
+ });
1038
+ const state = {
1039
+ ...internalState,
1040
+ id: usedId,
1041
+ disabled,
1042
+ invalid,
1043
+ value: isMultiSelect ? values ?? [] : [value].filter(Boolean),
1044
+ isMultiSelect
829
1045
  };
830
- const menuPosition = usePopoverPosition(
831
- triggerRef.current?.getBoundingClientRect(),
832
- { verticalAlignment: alignmentVertical, horizontalAlignment: alignmentHorizontal, disabled }
833
- );
834
- useEffect5(() => {
835
- if (!isOpen) return;
836
- const triggerEl = triggerRef.current;
837
- if (!triggerEl) return;
838
- const scrollableParents = getScrollableParents(triggerEl);
839
- const close = () => setIsOpen(false);
840
- scrollableParents.forEach((parent) => {
841
- parent.addEventListener("scroll", close);
1046
+ const registerItem = useCallback5((item) => {
1047
+ optionsRef.current.push(item);
1048
+ optionsRef.current.sort((a, b) => {
1049
+ const aEl = a.ref.current;
1050
+ const bEl = b.ref.current;
1051
+ if (!aEl || !bEl) return 0;
1052
+ return aEl.compareDocumentPosition(bEl) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1;
842
1053
  });
843
- window.addEventListener("resize", close);
844
- return () => {
845
- scrollableParents.forEach((parent) => {
846
- parent.removeEventListener("scroll", close);
847
- });
848
- window.removeEventListener("resize", close);
849
- };
850
- }, [isOpen, setIsOpen]);
851
- useEffect5(() => {
852
- if (isOpen) {
853
- setIsHidden(false);
1054
+ }, []);
1055
+ const unregisterItem = useCallback5((value2) => {
1056
+ optionsRef.current = optionsRef.current.filter((i) => i.value !== value2);
1057
+ }, []);
1058
+ const toggleSelection = (value2, isSelected) => {
1059
+ if (disabled) {
1060
+ return;
854
1061
  }
855
- }, [isOpen]);
856
- return /* @__PURE__ */ jsxs5(Fragment, { children: [
857
- trigger(bag, triggerRef),
858
- createPortal(/* @__PURE__ */ jsx7(
859
- "div",
860
- {
861
- ref: menuRef,
862
- onClick: (e) => e.stopPropagation(),
863
- className: clsx6(
864
- "absolute rounded-md bg-menu-background text-menu-text shadow-around-lg shadow-strong z-[300]",
865
- {
866
- "animate-pop-in": isOpen,
867
- "animate-pop-out": !isOpen,
868
- "hidden": isHidden
869
- },
870
- menuClassName
871
- ),
872
- onAnimationEnd: () => {
873
- if (!isOpen) {
874
- setIsHidden(true);
875
- }
876
- },
877
- style: {
878
- ...menuPosition
879
- },
880
- children: BagFunctionUtil.resolve(children, bag)
1062
+ const option = optionsRef.current.find((i) => i.value === value2);
1063
+ if (!option) {
1064
+ console.error(`SelectOption with value: ${value2} not found`);
1065
+ return;
1066
+ }
1067
+ let newValue;
1068
+ if (isMultiSelect) {
1069
+ const isSelectedBefore = state.value.includes(value2);
1070
+ const isSelectedAfter = isSelected ?? !isSelectedBefore;
1071
+ if (!isSelectedAfter) {
1072
+ newValue = state.value.filter((v) => v !== value2);
1073
+ } else {
1074
+ newValue = [...state.value, value2];
881
1075
  }
882
- ), document.body)
883
- ] });
884
- };
885
-
886
- // src/components/user-action/Input.tsx
887
- import { forwardRef as forwardRef3, useEffect as useEffect8, useImperativeHandle, useRef as useRef2, useState as useState7 } from "react";
888
- import clsx7 from "clsx";
889
-
890
- // src/hooks/useDelay.ts
891
- import { useEffect as useEffect6, useState as useState6 } from "react";
892
- var defaultOptions = {
893
- delay: 3e3,
894
- disabled: false
895
- };
896
- function useDelay(options) {
897
- const [timer, setTimer] = useState6(void 0);
898
- const { delay, disabled } = {
899
- ...defaultOptions,
900
- ...options
901
- };
902
- const clearTimer = () => {
903
- clearTimeout(timer);
904
- setTimer(void 0);
1076
+ } else {
1077
+ newValue = [value2];
1078
+ }
1079
+ if (!isMultiSelect) {
1080
+ onValueChanged?.(newValue[0]);
1081
+ } else {
1082
+ onValuesChanged?.(newValue);
1083
+ }
1084
+ setInternalState((prevState) => ({
1085
+ ...prevState,
1086
+ highlightedValue: value2
1087
+ }));
905
1088
  };
906
- const restartTimer = (onDelayFinish) => {
1089
+ const highlightItem = (value2) => {
907
1090
  if (disabled) {
908
1091
  return;
909
1092
  }
910
- clearTimeout(timer);
911
- setTimer(setTimeout(() => {
912
- onDelayFinish();
913
- setTimer(void 0);
914
- }, delay));
1093
+ setInternalState((prevState) => ({
1094
+ ...prevState,
1095
+ highlightedValue: value2
1096
+ }));
915
1097
  };
916
- useEffect6(() => {
917
- return () => {
918
- clearTimeout(timer);
919
- };
920
- }, [timer]);
921
- useEffect6(() => {
922
- if (disabled) {
923
- clearTimeout(timer);
924
- setTimer(void 0);
925
- }
926
- }, [disabled, timer]);
927
- return { restartTimer, clearTimer, hasActiveTimer: !!timer };
928
- }
929
-
930
- // src/hooks/useFocusManagement.ts
931
- import { useCallback as useCallback3 } from "react";
932
- function useFocusManagement() {
933
- const getFocusableElements = useCallback3(() => {
934
- return Array.from(
935
- document.querySelectorAll(
936
- 'input, button, select, textarea, a[href], [tabindex]:not([tabindex="-1"])'
937
- )
938
- ).filter(
939
- (el) => el instanceof HTMLElement && !el.hasAttribute("disabled") && !el.hasAttribute("hidden") && el.tabIndex !== -1
940
- );
1098
+ const registerTrigger = useCallback5((ref) => {
1099
+ triggerRef.current = ref.current;
941
1100
  }, []);
942
- const getNextFocusElement = useCallback3(() => {
943
- const elements = getFocusableElements();
944
- if (elements.length === 0) {
945
- return void 0;
1101
+ const unregisterTrigger = useCallback5(() => {
1102
+ triggerRef.current = null;
1103
+ }, []);
1104
+ const toggleOpen = (isOpen2, options) => {
1105
+ const { highlightStartPosition } = { ...defaultToggleOpenOptions, ...options };
1106
+ let highlightedIndex;
1107
+ if (highlightStartPosition === "first") {
1108
+ highlightedIndex = optionsRef.current.findIndex((option) => !option.disabled);
1109
+ } else {
1110
+ highlightedIndex = optionsRef.current.length - 1 - [...optionsRef.current].reverse().findIndex((option) => !option.disabled);
946
1111
  }
947
- let nextElement = elements[0];
948
- if (document.activeElement instanceof HTMLElement) {
949
- const currentIndex = elements.indexOf(document.activeElement);
950
- nextElement = elements[(currentIndex + 1) % elements.length];
1112
+ if (highlightedIndex === -1 || highlightedIndex === optionsRef.current.length) {
1113
+ highlightedIndex = 0;
951
1114
  }
952
- return nextElement;
953
- }, [getFocusableElements]);
954
- const focusNext = useCallback3(() => {
955
- const nextElement = getNextFocusElement();
956
- nextElement?.focus();
957
- }, [getNextFocusElement]);
958
- const getPreviousFocusElement = useCallback3(() => {
959
- const elements = getFocusableElements();
960
- if (elements.length === 0) {
961
- return void 0;
1115
+ setInternalState((prevState) => ({
1116
+ ...prevState,
1117
+ isOpen: isOpen2 ?? !prevState.isOpen,
1118
+ highlightedValue: optionsRef.current[highlightedIndex].value
1119
+ }));
1120
+ };
1121
+ const moveHighlightedIndex = (delta) => {
1122
+ let highlightedIndex = optionsRef.current.findIndex((value2) => value2.value === internalState.highlightedValue);
1123
+ if (highlightedIndex === -1) {
1124
+ highlightedIndex = 0;
962
1125
  }
963
- let previousElement = elements[0];
964
- if (document.activeElement instanceof HTMLElement) {
965
- const currentIndex = elements.indexOf(document.activeElement);
966
- if (currentIndex === 0) {
967
- previousElement = elements[elements.length - 1];
968
- } else {
969
- previousElement = elements[currentIndex - 1];
1126
+ const optionLength = optionsRef.current.length;
1127
+ const startIndex = (highlightedIndex + delta % optionLength + optionLength) % optionLength;
1128
+ const isForward = delta >= 0;
1129
+ let highlightedValue = optionsRef.current[startIndex].value;
1130
+ for (let i = 0; i < optionsRef.current.length; i++) {
1131
+ const index = (startIndex + (isForward ? i : -i) + optionLength) % optionLength;
1132
+ if (!optionsRef.current[index].disabled) {
1133
+ highlightedValue = optionsRef.current[index].value;
1134
+ break;
970
1135
  }
971
1136
  }
972
- return previousElement;
973
- }, [getFocusableElements]);
974
- const focusPrevious = useCallback3(() => {
975
- const previousElement = getPreviousFocusElement();
976
- if (previousElement) previousElement.focus();
977
- }, [getPreviousFocusElement]);
978
- return {
979
- getFocusableElements,
980
- getNextFocusElement,
981
- getPreviousFocusElement,
982
- focusNext,
983
- focusPrevious
1137
+ setInternalState((prevState) => ({
1138
+ ...prevState,
1139
+ highlightedValue
1140
+ }));
984
1141
  };
985
- }
986
-
987
- // src/hooks/useFocusOnceVisible.ts
988
- import React, { useEffect as useEffect7 } from "react";
989
- var useFocusOnceVisible = (ref, disable = false) => {
990
- const [hasUsedFocus, setHasUsedFocus] = React.useState(false);
991
- useEffect7(() => {
992
- if (disable || hasUsedFocus) {
993
- return;
1142
+ useEffect6(() => {
1143
+ if (!internalState.highlightedValue) return;
1144
+ const highlighted = optionsRef.current.find((value2) => value2.value === internalState.highlightedValue);
1145
+ if (highlighted) {
1146
+ highlighted.ref.current.scrollIntoView({ behavior: "instant", block: "nearest" });
1147
+ } else {
1148
+ console.error(`SelectRoot: Could not find highlighted value (${internalState.highlightedValue})`);
994
1149
  }
995
- const observer = new IntersectionObserver(([entry]) => {
996
- if (entry.isIntersecting && !hasUsedFocus) {
997
- ref.current?.focus();
998
- setHasUsedFocus(hasUsedFocus);
999
- }
1000
- }, {
1001
- threshold: 0.1
1002
- });
1003
- if (ref.current) {
1004
- observer.observe(ref.current);
1150
+ }, [internalState.highlightedValue]);
1151
+ const contextValue = {
1152
+ state,
1153
+ item: {
1154
+ register: registerItem,
1155
+ unregister: unregisterItem,
1156
+ toggleSelection,
1157
+ highlightItem,
1158
+ moveHighlightedIndex
1159
+ },
1160
+ trigger: {
1161
+ ref: triggerRef,
1162
+ register: registerTrigger,
1163
+ unregister: unregisterTrigger,
1164
+ toggleOpen
1005
1165
  }
1006
- return () => observer.disconnect();
1007
- }, [disable, hasUsedFocus, ref]);
1166
+ };
1167
+ return /* @__PURE__ */ jsx6(SelectContext.Provider, { value: contextValue, children });
1008
1168
  };
1009
-
1010
- // src/components/user-action/Input.tsx
1011
- import { jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
1012
- var getInputClassName = ({ disabled = false, hasError = false }) => {
1013
- return clsx7(
1014
- "px-2 py-1.5 rounded-md border-2",
1169
+ var SelectOption = forwardRef3(
1170
+ function SelectOption2({ value, disabled = false, children, className, ...restProps }, ref) {
1171
+ const { state, item, trigger } = useSelectContext();
1172
+ const { register, unregister, toggleSelection, highlightItem } = item;
1173
+ const itemRef = useRef2(null);
1174
+ useEffect6(() => {
1175
+ register({
1176
+ value,
1177
+ disabled,
1178
+ ref: itemRef
1179
+ });
1180
+ return () => unregister(value);
1181
+ }, [value, disabled, register, unregister, children]);
1182
+ const isHighlighted = state.highlightedValue === value;
1183
+ const isSelected = state.value.includes(value);
1184
+ return /* @__PURE__ */ jsxs5(
1185
+ "li",
1186
+ {
1187
+ ...restProps,
1188
+ ref: (node) => {
1189
+ itemRef.current = node;
1190
+ if (typeof ref === "function") ref(node);
1191
+ else if (ref) ref.current = node;
1192
+ },
1193
+ id: value,
1194
+ role: "option",
1195
+ "aria-disabled": disabled,
1196
+ "aria-selected": isSelected,
1197
+ "data-highlighted": isHighlighted ? "" : void 0,
1198
+ "data-selected": isSelected ? "" : void 0,
1199
+ "data-disabled": disabled ? "" : void 0,
1200
+ className: clsx5(
1201
+ "flex-row-1 items-center px-2 py-1 rounded-md",
1202
+ "data-highlighted:bg-primary/20",
1203
+ "data-disabled:text-disabled data-disabled:cursor-not-allowed",
1204
+ "not-data-disabled:cursor-pointer",
1205
+ className
1206
+ ),
1207
+ onClick: (event) => {
1208
+ if (!disabled) {
1209
+ toggleSelection(value);
1210
+ if (!state.isMultiSelect) {
1211
+ trigger.toggleOpen(false);
1212
+ }
1213
+ restProps.onClick?.(event);
1214
+ }
1215
+ },
1216
+ onMouseEnter: (event) => {
1217
+ if (!disabled) {
1218
+ highlightItem(value);
1219
+ restProps.onMouseEnter?.(event);
1220
+ }
1221
+ },
1222
+ children: [
1223
+ /* @__PURE__ */ jsx6(
1224
+ CheckIcon,
1225
+ {
1226
+ className: clsx5("w-4 h-4", { "opacity-0": !isSelected || disabled }),
1227
+ "aria-hidden": true
1228
+ }
1229
+ ),
1230
+ children ?? value
1231
+ ]
1232
+ }
1233
+ );
1234
+ }
1235
+ );
1236
+ var defaultSelectButtonTranslation = {
1237
+ en: {
1238
+ clickToSelect: "Click to select"
1239
+ },
1240
+ de: {
1241
+ clickToSelect: "Zum ausw\xE4hlen dr\xFCcken"
1242
+ }
1243
+ };
1244
+ var SelectButton = forwardRef3(function SelectButton2({ placeholder, selectedDisplay, ...props }, ref) {
1245
+ const translation = useTranslation([defaultSelectButtonTranslation]);
1246
+ const { state, trigger } = useSelectContext();
1247
+ const { register, unregister, toggleOpen } = trigger;
1248
+ const innerRef = useRef2(null);
1249
+ useImperativeHandle(ref, () => innerRef.current);
1250
+ useEffect6(() => {
1251
+ register(innerRef);
1252
+ return () => unregister();
1253
+ }, [register, unregister]);
1254
+ const disabled = !!props?.disabled || !!state.disabled;
1255
+ const invalid = state.invalid;
1256
+ const hasValue = state.value.length > 0;
1257
+ return /* @__PURE__ */ jsxs5(
1258
+ "button",
1015
1259
  {
1016
- "bg-input-background text-input-text hover:border-primary focus:border-primary": !disabled && !hasError,
1017
- "bg-on-negative text-negative border-negative-border hover:border-negative-border-hover": !disabled && hasError,
1018
- "bg-disabled-background text-disabled-text border-disabled-border": disabled
1260
+ ...props,
1261
+ ref: innerRef,
1262
+ id: state.id,
1263
+ className: clsx5(
1264
+ "flex-row-2 items-center justify-between bg-input-background text-input-text rounded-md px-2.5 py-2.5",
1265
+ "data-placeholder:text-description",
1266
+ props.className
1267
+ ),
1268
+ onClick: () => toggleOpen(!state.isOpen),
1269
+ onKeyDown: (event) => {
1270
+ switch (event.key) {
1271
+ case "ArrowDown":
1272
+ toggleOpen(true, { highlightStartPosition: "first" });
1273
+ break;
1274
+ case "ArrowUp":
1275
+ toggleOpen(true, { highlightStartPosition: "last" });
1276
+ break;
1277
+ }
1278
+ },
1279
+ "data-placeholder": !hasValue ? "" : void 0,
1280
+ "data-disabled": disabled ? "" : void 0,
1281
+ "data-invalid": invalid ? "" : void 0,
1282
+ "aria-invalid": invalid,
1283
+ "aria-disabled": disabled,
1284
+ "aria-haspopup": "listbox",
1285
+ "aria-expanded": state.isOpen,
1286
+ "aria-controls": state.isOpen ? `${state.id}-listbox` : void 0,
1287
+ children: [
1288
+ hasValue ? selectedDisplay?.(state.value) ?? state.value.join(", ") : placeholder ?? translation("clickToSelect"),
1289
+ /* @__PURE__ */ jsx6(ExpansionIcon, { isExpanded: state.isOpen })
1290
+ ]
1019
1291
  }
1020
1292
  );
1021
- };
1022
- var defaultEditCompleteOptions = {
1023
- onBlur: true,
1024
- afterDelay: true,
1025
- delay: 2500
1026
- };
1027
- var Input = forwardRef3(function Input2({
1028
- id,
1029
- type = "text",
1030
- value,
1031
- label,
1032
- onChange = noop,
1033
- onChangeText = noop,
1034
- onEditCompleted,
1035
- className = "",
1036
- allowEnterComplete = true,
1037
- expanded = true,
1038
- autoFocus = false,
1039
- onBlur,
1040
- editCompleteOptions,
1041
- containerClassName,
1042
- disabled,
1043
- ...restProps
1044
- }, forwardedRef) {
1045
- const { onBlur: allowEditCompleteOnBlur, afterDelay, delay } = { ...defaultEditCompleteOptions, ...editCompleteOptions };
1046
- const {
1047
- restartTimer,
1048
- clearTimer
1049
- } = useDelay({ delay, disabled: !afterDelay });
1293
+ });
1294
+ var SelectChipDisplay = forwardRef3(function SelectChipDisplay2({ ...props }, ref) {
1295
+ const { state, trigger, item } = useSelectContext();
1296
+ const { register, unregister, toggleOpen } = trigger;
1050
1297
  const innerRef = useRef2(null);
1051
- const { focusNext } = useFocusManagement();
1052
- useFocusOnceVisible(innerRef, !autoFocus);
1053
- useImperativeHandle(forwardedRef, () => innerRef.current);
1054
- const handleKeyDown = (e) => {
1055
- if (e.key === "Enter" && !e.shiftKey) {
1056
- e.preventDefault();
1057
- innerRef.current?.blur();
1058
- focusNext();
1298
+ useImperativeHandle(ref, () => innerRef.current);
1299
+ useEffect6(() => {
1300
+ register(innerRef);
1301
+ return () => unregister();
1302
+ }, [register, unregister]);
1303
+ const disabled = !!props?.disabled || !!state.disabled;
1304
+ const invalid = state.invalid;
1305
+ return /* @__PURE__ */ jsxs5(
1306
+ "div",
1307
+ {
1308
+ ...props,
1309
+ ref: innerRef,
1310
+ className: clsx5(
1311
+ "flex flex-wrap flex-row gap-2 items-center bg-input-background text-input-text rounded-md px-2.5 py-2.5",
1312
+ props.className
1313
+ ),
1314
+ "data-disabled": disabled ? "" : void 0,
1315
+ "data-invalid": invalid ? "" : void 0,
1316
+ "aria-invalid": invalid,
1317
+ "aria-disabled": disabled,
1318
+ children: [
1319
+ state.value.map((value) => /* @__PURE__ */ jsxs5(Chip, { className: "gap-x-2", children: [
1320
+ value,
1321
+ /* @__PURE__ */ jsx6(
1322
+ "button",
1323
+ {
1324
+ onClick: () => {
1325
+ item.toggleSelection(value, false);
1326
+ },
1327
+ 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",
1328
+ children: /* @__PURE__ */ jsx6(XIcon, {})
1329
+ }
1330
+ )
1331
+ ] }, value)),
1332
+ /* @__PURE__ */ jsx6(
1333
+ IconButton,
1334
+ {
1335
+ id: state.id,
1336
+ onClick: () => toggleOpen(),
1337
+ onKeyDown: (event) => {
1338
+ switch (event.key) {
1339
+ case "ArrowDown":
1340
+ toggleOpen(true, { highlightStartPosition: "first" });
1341
+ break;
1342
+ case "ArrowUp":
1343
+ toggleOpen(true, { highlightStartPosition: "last" });
1344
+ }
1345
+ },
1346
+ size: "small",
1347
+ color: "neutral",
1348
+ "aria-invalid": invalid,
1349
+ "aria-disabled": disabled,
1350
+ "aria-haspopup": "listbox",
1351
+ "aria-expanded": state.isOpen,
1352
+ "aria-controls": state.isOpen ? `${state.id}-listbox` : void 0,
1353
+ children: /* @__PURE__ */ jsx6(Plus, {})
1354
+ }
1355
+ )
1356
+ ]
1059
1357
  }
1060
- };
1061
- return /* @__PURE__ */ jsxs6("div", { className: clsx7({ "w-full": expanded }, containerClassName), children: [
1062
- label && /* @__PURE__ */ jsx8(Label, { ...label, htmlFor: id, className: clsx7("mb-1", label.className) }),
1063
- /* @__PURE__ */ jsx8(
1064
- "input",
1065
- {
1066
- ...restProps,
1067
- ref: innerRef,
1068
- value,
1069
- id,
1070
- type,
1071
- disabled,
1072
- className: clsx7(getInputClassName({ disabled }), className),
1073
- onKeyDown: allowEnterComplete ? handleKeyDown : void 0,
1074
- onBlur: (event) => {
1075
- onBlur?.(event);
1076
- if (onEditCompleted && allowEditCompleteOnBlur) {
1077
- onEditCompleted(event.target.value);
1078
- clearTimer();
1358
+ );
1359
+ });
1360
+ var SelectContent = forwardRef3(
1361
+ function SelectContent2({
1362
+ alignment,
1363
+ orientation = "vertical",
1364
+ ...props
1365
+ }, ref) {
1366
+ const innerRef = useRef2(null);
1367
+ useImperativeHandle(ref, () => innerRef.current);
1368
+ const { trigger, state, item } = useSelectContext();
1369
+ const position = useFloatingElement({
1370
+ active: state.isOpen,
1371
+ anchorRef: trigger.ref,
1372
+ containerRef: innerRef,
1373
+ ...alignment
1374
+ });
1375
+ useFocusTrap({
1376
+ container: innerRef,
1377
+ active: state.isOpen && !!position
1378
+ });
1379
+ return createPortal(
1380
+ /* @__PURE__ */ jsxs5(Fragment, { children: [
1381
+ /* @__PURE__ */ jsx6(
1382
+ "div",
1383
+ {
1384
+ hidden: !state.isOpen,
1385
+ onClick: () => trigger.toggleOpen(false),
1386
+ className: clsx5("fixed w-screen h-screen inset-0")
1079
1387
  }
1080
- },
1081
- onChange: (e) => {
1082
- const value2 = e.target.value;
1083
- if (onEditCompleted) {
1084
- restartTimer(() => {
1085
- if (innerRef.current) {
1086
- innerRef.current.blur();
1087
- if (!allowEditCompleteOnBlur) {
1088
- onEditCompleted(value2);
1089
- }
1090
- } else {
1091
- onEditCompleted(value2);
1388
+ ),
1389
+ /* @__PURE__ */ jsx6(
1390
+ "ul",
1391
+ {
1392
+ ...props,
1393
+ id: `${state.id}-listbox`,
1394
+ ref: innerRef,
1395
+ hidden: !state.isOpen,
1396
+ onKeyDown: (event) => {
1397
+ switch (event.key) {
1398
+ case "Escape":
1399
+ trigger.toggleOpen(false);
1400
+ event.preventDefault();
1401
+ event.stopPropagation();
1402
+ break;
1403
+ case match(orientation, {
1404
+ vertical: "ArrowDown",
1405
+ horizontal: "ArrowUp"
1406
+ }):
1407
+ item.moveHighlightedIndex(1);
1408
+ event.preventDefault();
1409
+ break;
1410
+ case match(orientation, {
1411
+ vertical: "ArrowUp",
1412
+ horizontal: "ArrowDown"
1413
+ }):
1414
+ item.moveHighlightedIndex(-1);
1415
+ event.preventDefault();
1416
+ break;
1417
+ case "Home":
1418
+ event.preventDefault();
1419
+ break;
1420
+ case "End":
1421
+ event.preventDefault();
1422
+ break;
1423
+ case "Enter":
1424
+ // Fall through
1425
+ case " ":
1426
+ if (state.highlightedValue) {
1427
+ item.toggleSelection(state.highlightedValue);
1428
+ if (!state.isMultiSelect) {
1429
+ trigger.toggleOpen(false);
1430
+ }
1431
+ event.preventDefault();
1432
+ }
1433
+ break;
1092
1434
  }
1093
- });
1435
+ },
1436
+ className: clsx5("flex-col-0 p-2 bg-menu-background text-menu-text rounded-md shadow-hw-bottom focus-style-within overflow-auto", props.className),
1437
+ style: {
1438
+ opacity: position ? void 0 : 0,
1439
+ position: "fixed",
1440
+ ...position
1441
+ },
1442
+ role: "listbox",
1443
+ "aria-multiselectable": state.isMultiSelect,
1444
+ "aria-orientation": orientation,
1445
+ tabIndex: position ? 0 : void 0,
1446
+ children: props.children
1094
1447
  }
1095
- onChange(e);
1096
- onChangeText(value2);
1448
+ )
1449
+ ] }),
1450
+ document.body
1451
+ );
1452
+ }
1453
+ );
1454
+ var Select = forwardRef3(function Select2({
1455
+ children,
1456
+ contentPanelProps,
1457
+ buttonProps,
1458
+ ...props
1459
+ }, ref) {
1460
+ return /* @__PURE__ */ jsxs5(SelectRoot, { ...props, isMultiSelect: false, children: [
1461
+ /* @__PURE__ */ jsx6(
1462
+ SelectButton,
1463
+ {
1464
+ ref,
1465
+ ...buttonProps,
1466
+ selectedDisplay: (values) => {
1467
+ const value = values[0];
1468
+ if (!buttonProps?.selectedDisplay) return void 0;
1469
+ return buttonProps.selectedDisplay(value);
1097
1470
  }
1098
1471
  }
1099
- )
1472
+ ),
1473
+ /* @__PURE__ */ jsx6(SelectContent, { ...contentPanelProps, children })
1100
1474
  ] });
1101
1475
  });
1102
- var FormInput = forwardRef3(function FormInput2({
1103
- id,
1104
- labelText,
1105
- errorText,
1106
- className,
1107
- labelClassName,
1108
- errorClassName,
1109
- containerClassName,
1110
- required,
1111
- disabled,
1112
- ...restProps
1476
+ var SelectUncontrolled = forwardRef3(function SelectUncontrolled2({
1477
+ value: initialValue,
1478
+ onValueChanged,
1479
+ ...props
1113
1480
  }, ref) {
1114
- const input = /* @__PURE__ */ jsx8(
1115
- "input",
1481
+ const [value, setValue] = useState7(initialValue);
1482
+ useEffect6(() => {
1483
+ setValue(initialValue);
1484
+ }, [initialValue]);
1485
+ return /* @__PURE__ */ jsx6(
1486
+ Select,
1116
1487
  {
1117
- ...restProps,
1488
+ ...props,
1118
1489
  ref,
1119
- id,
1120
- disabled,
1121
- className: clsx7(
1122
- getInputClassName({ disabled, hasError: !!errorText }),
1123
- className
1124
- )
1490
+ value,
1491
+ onValueChanged: (value2) => {
1492
+ setValue(value2);
1493
+ onValueChanged?.(value2);
1494
+ }
1125
1495
  }
1126
1496
  );
1127
- return /* @__PURE__ */ jsxs6("div", { className: clsx7("flex flex-col gap-y-1", containerClassName), children: [
1128
- labelText && /* @__PURE__ */ jsxs6("label", { htmlFor: id, className: clsx7("textstyle-label-md", labelClassName), children: [
1129
- labelText,
1130
- required && /* @__PURE__ */ jsx8("span", { className: "text-primary font-bold", children: "*" })
1131
- ] }),
1132
- input,
1133
- errorText && /* @__PURE__ */ jsx8("label", { htmlFor: id, className: clsx7("text-negative", errorClassName), children: errorText })
1497
+ });
1498
+ var MultiSelect = forwardRef3(function MultiSelect2({
1499
+ children,
1500
+ contentPanelProps,
1501
+ buttonProps,
1502
+ ...props
1503
+ }, ref) {
1504
+ return /* @__PURE__ */ jsxs5(SelectRoot, { ...props, isMultiSelect: true, children: [
1505
+ /* @__PURE__ */ jsx6(SelectButton, { ref, ...buttonProps }),
1506
+ /* @__PURE__ */ jsx6(SelectContent, { ...contentPanelProps, children })
1134
1507
  ] });
1135
1508
  });
1136
-
1137
- // src/components/user-action/SearchBar.tsx
1138
- import { Search } from "lucide-react";
1139
- import { clsx as clsx8 } from "clsx";
1140
- import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
1141
- var SearchBar = ({
1142
- placeholder,
1143
- onSearch,
1144
- disableOnSearch,
1145
- containerClassName,
1146
- ...inputProps
1147
- }) => {
1148
- const translation = useTranslation([formTranslation]);
1149
- return /* @__PURE__ */ jsxs7("div", { className: clsx8("flex-row-2 justify-between items-center", containerClassName), children: [
1150
- /* @__PURE__ */ jsx9(
1151
- Input,
1152
- {
1153
- ...inputProps,
1154
- placeholder: placeholder ?? translation("search")
1509
+ var MultiSelectUncontrolled = forwardRef3(function MultiSelectUncontrolled2({
1510
+ values: initialValues,
1511
+ onValuesChanged,
1512
+ ...props
1513
+ }, ref) {
1514
+ const [values, setValues] = useState7(initialValues);
1515
+ useEffect6(() => {
1516
+ setValues(initialValues);
1517
+ }, [initialValues]);
1518
+ return /* @__PURE__ */ jsx6(
1519
+ MultiSelect,
1520
+ {
1521
+ ...props,
1522
+ ref,
1523
+ values,
1524
+ onValuesChanged: (value) => {
1525
+ setValues(value);
1526
+ onValuesChanged?.(value);
1155
1527
  }
1156
- ),
1157
- onSearch && /* @__PURE__ */ jsx9(IconButton, { color: "neutral", disabled: disableOnSearch, onClick: onSearch, children: /* @__PURE__ */ jsx9(Search, { className: "w-full h-full" }) })
1158
- ] });
1159
- };
1160
-
1161
- // src/hooks/useSearch.ts
1162
- import { useCallback as useCallback4, useEffect as useEffect9, useMemo, useState as useState8 } from "react";
1163
-
1164
- // src/util/simpleSearch.ts
1165
- var MultiSubjectSearchWithMapping = (search, objects, mapping) => {
1166
- return objects.filter((object) => {
1167
- const mappedSearchKeywords = mapping(object)?.map((value) => value.toLowerCase().trim());
1168
- if (!mappedSearchKeywords) {
1169
- return true;
1170
- }
1171
- return search.every((searchValue) => !!mappedSearchKeywords.find((value) => !!value && value.includes(searchValue.toLowerCase().trim())));
1172
- });
1173
- };
1174
-
1175
- // src/hooks/useSearch.ts
1176
- var useSearch = ({
1177
- list,
1178
- initialSearch,
1179
- searchMapping,
1180
- additionalSearchTags,
1181
- isSearchInstant = true,
1182
- sortingFunction,
1183
- filter,
1184
- disabled = false
1185
- }) => {
1186
- const [search, setSearch] = useState8(initialSearch ?? "");
1187
- const [result, setResult] = useState8(list);
1188
- const searchTags = useMemo(() => additionalSearchTags ?? [], [additionalSearchTags]);
1189
- const updateSearch = useCallback4((newSearch) => {
1190
- const usedSearch = newSearch ?? search;
1191
- if (newSearch) {
1192
- setSearch(search);
1193
- }
1194
- setResult(MultiSubjectSearchWithMapping([usedSearch, ...searchTags], list, searchMapping));
1195
- }, [searchTags, list, search, searchMapping]);
1196
- useEffect9(() => {
1197
- if (isSearchInstant) {
1198
- setResult(MultiSubjectSearchWithMapping([search, ...searchTags], list, searchMapping));
1199
- }
1200
- }, [searchTags, isSearchInstant, list, search, searchMapping, additionalSearchTags]);
1201
- const filteredResult = useMemo(() => {
1202
- if (!filter) {
1203
- return result;
1204
- }
1205
- return result.filter(filter);
1206
- }, [result, filter]);
1207
- const sortedAndFilteredResult = useMemo(() => {
1208
- if (!sortingFunction) {
1209
- return filteredResult;
1210
1528
  }
1211
- return filteredResult.sort(sortingFunction);
1212
- }, [filteredResult, sortingFunction]);
1213
- const usedResult = useMemo(() => {
1214
- if (!disabled) {
1215
- return sortedAndFilteredResult;
1216
- }
1217
- return list;
1218
- }, [disabled, list, sortedAndFilteredResult]);
1219
- return {
1220
- result: usedResult,
1221
- hasResult: usedResult.length > 0,
1222
- allItems: list,
1223
- updateSearch,
1224
- search,
1225
- setSearch
1226
- };
1227
- };
1228
-
1229
- // src/components/user-action/Select.tsx
1230
- import { Fragment as Fragment2, jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
1231
- var Select = ({
1232
- value,
1233
- label,
1234
- options,
1235
- onChange,
1236
- hintText = "",
1237
- selectedDisplayOverwrite,
1238
- searchOptions,
1239
- additionalItems,
1240
- className,
1241
- triggerClassName,
1242
- hintTextClassName,
1243
- ...menuProps
1244
- }) => {
1245
- const selectedOption = options.find((option) => option.value === value);
1246
- if (value !== void 0 && selectedOption === void 0 && selectedDisplayOverwrite === void 0) {
1247
- console.warn("The selected value is not found in the options list. This might be an error on your part or default behavior if it is complex data type on which === does not work. In case of the latter use selectedDisplayOverwrite to set your selected text or component");
1248
- }
1249
- const isShowingHint = !selectedDisplayOverwrite && !selectedOption?.label;
1250
- const { result, search, setSearch } = useSearch({
1251
- list: options,
1252
- searchMapping: useCallback5((item) => item.searchTags, []),
1253
- ...searchOptions
1254
- });
1255
- return /* @__PURE__ */ jsxs8("div", { className: clsx9(className), children: [
1256
- label && /* @__PURE__ */ jsx10(Label, { ...label, labelType: label.labelType ?? "labelBig", className: clsx9("mb-1", label.className) }),
1257
- /* @__PURE__ */ jsx10(
1258
- Menu,
1259
- {
1260
- ...menuProps,
1261
- trigger: ({ toggleOpen, isOpen, disabled }, ref) => /* @__PURE__ */ jsxs8(
1262
- "button",
1263
- {
1264
- ref,
1265
- className: clsx9(
1266
- "btn-md justify-between w-full border-2",
1267
- {
1268
- "rounded-b-lg": !open,
1269
- "bg-input-background text-input-text hover:border-primary": !disabled,
1270
- "bg-disabled-background text-disabled-text border-disabled-background cursor-not-allowed": disabled
1271
- },
1272
- triggerClassName
1273
- ),
1274
- onClick: toggleOpen,
1275
- disabled,
1276
- children: [
1277
- !isShowingHint && /* @__PURE__ */ jsx10("span", { className: "font-semibold", children: selectedDisplayOverwrite ?? selectedOption?.label }),
1278
- isShowingHint && /* @__PURE__ */ jsx10("span", { className: clsx9("textstyle-description", hintTextClassName), children: hintText }),
1279
- /* @__PURE__ */ jsx10(ExpansionIcon, { isExpanded: isOpen })
1280
- ]
1281
- }
1282
- ),
1283
- menuClassName: clsx9("flex-col-2 p-2 max-h-96 overflow-hidden", menuProps.menuClassName),
1284
- children: (bag) => {
1285
- const { close } = bag;
1286
- return /* @__PURE__ */ jsxs8(Fragment2, { children: [
1287
- !searchOptions?.disabled && /* @__PURE__ */ jsx10(
1288
- SearchBar,
1289
- {
1290
- value: search,
1291
- onChangeText: setSearch,
1292
- autoFocus: true
1293
- }
1294
- ),
1295
- /* @__PURE__ */ jsxs8("div", { className: "flex-col-2 overflow-y-auto", children: [
1296
- result.map((option, index) => /* @__PURE__ */ jsx10(
1297
- ListTile,
1298
- {
1299
- isSelected: option === selectedOption,
1300
- title: option.label,
1301
- onClick: () => {
1302
- onChange(option.value);
1303
- close();
1304
- },
1305
- disabled: option.disabled
1306
- },
1307
- index
1308
- )),
1309
- additionalItems && additionalItems({ ...bag, search, selected: value })
1310
- ] })
1311
- ] });
1312
- }
1313
- }
1314
- )
1529
+ );
1530
+ });
1531
+ var MultiSelectChipDisplay = forwardRef3(function MultiSelectChipDisplay2({
1532
+ children,
1533
+ contentPanelProps,
1534
+ chipDisplayProps,
1535
+ ...props
1536
+ }, ref) {
1537
+ return /* @__PURE__ */ jsxs5(SelectRoot, { ...props, isMultiSelect: true, children: [
1538
+ /* @__PURE__ */ jsx6(SelectChipDisplay, { ref, ...chipDisplayProps }),
1539
+ /* @__PURE__ */ jsx6(SelectContent, { ...contentPanelProps, children })
1315
1540
  ] });
1316
- };
1541
+ });
1542
+ var MultiSelectChipDisplayUncontrolled = forwardRef3(function MultiSelectChipDisplayUncontrolled2({
1543
+ values: initialValues,
1544
+ onValuesChanged,
1545
+ ...props
1546
+ }, ref) {
1547
+ const [values, setValues] = useState7(initialValues);
1548
+ useEffect6(() => {
1549
+ setValues(initialValues);
1550
+ }, [initialValues]);
1551
+ return /* @__PURE__ */ jsx6(
1552
+ MultiSelectChipDisplay,
1553
+ {
1554
+ ...props,
1555
+ ref,
1556
+ values,
1557
+ onValuesChanged: (value) => {
1558
+ setValues(value);
1559
+ onValuesChanged?.(value);
1560
+ }
1561
+ }
1562
+ );
1563
+ });
1317
1564
 
1318
1565
  // src/components/properties/SelectProperty.tsx
1319
- import { jsx as jsx11 } from "react/jsx-runtime";
1566
+ import { jsx as jsx7 } from "react/jsx-runtime";
1320
1567
  var SingleSelectProperty = ({
1321
- overwriteTranslation,
1322
1568
  value,
1323
1569
  options,
1324
- name,
1325
- readOnly = false,
1326
- softRequired,
1327
- onRemove,
1328
- onAddNew,
1329
- ...selectProps
1570
+ onValueChanged,
1571
+ ...props
1330
1572
  }) => {
1331
- const translation = useTranslation([formTranslation], overwriteTranslation);
1332
1573
  const hasValue = value !== void 0;
1333
- return /* @__PURE__ */ jsx11(
1574
+ return /* @__PURE__ */ jsx7(
1334
1575
  PropertyBase,
1335
1576
  {
1336
- name,
1337
- onRemove,
1338
- readOnly,
1339
- softRequired,
1577
+ ...props,
1340
1578
  hasValue,
1341
- icon: /* @__PURE__ */ jsx11(List, { size: 24 }),
1342
- input: ({ softRequired: softRequired2 }) => /* @__PURE__ */ jsx11(
1579
+ icon: /* @__PURE__ */ jsx7(List, { size: 24 }),
1580
+ input: ({ softRequired }) => /* @__PURE__ */ jsx7(
1343
1581
  Select,
1344
1582
  {
1345
- ...selectProps,
1346
1583
  value,
1347
- options,
1348
- disabled: readOnly,
1349
- className: clsx10("w-full"),
1350
- hintText: `${translation("select")}...`,
1351
- searchOptions: {
1352
- sortingFunction: (a, b) => a.value.localeCompare(b.value),
1353
- ...selectProps?.searchOptions
1354
- },
1355
- additionalItems: ({ close, search }) => {
1356
- if (!onAddNew && !search.trim()) {
1357
- return void 0;
1358
- }
1359
- return /* @__PURE__ */ jsx11(
1360
- ListTile,
1584
+ onValueChanged,
1585
+ disabled: props.readOnly,
1586
+ buttonProps: {
1587
+ className: clsx6(
1588
+ "border-none w-full",
1361
1589
  {
1362
- prefix: /* @__PURE__ */ jsx11(Plus, {}),
1363
- title: `${translation("add")} ${search.trim()}`,
1364
- onClick: () => {
1365
- onAddNew(search);
1366
- close();
1367
- },
1368
- disabled: options.some((value2) => value2.value === search.trim())
1590
+ "!bg-warning !text-surface-warning": softRequired && !hasValue
1369
1591
  }
1370
- );
1592
+ )
1371
1593
  },
1372
- triggerClassName: clsx10(
1373
- "!border-none",
1374
- {
1375
- "!bg-warning !text-surface-warning": softRequired2 && !hasValue,
1376
- "!bg-property-title-background": !softRequired2 || hasValue
1377
- }
1378
- ),
1379
- hintTextClassName: softRequired2 && !hasValue ? "text-surface-warning" : void 0
1594
+ children: options.map((value2) => /* @__PURE__ */ jsx7(SelectOption, { value: value2 }, value2))
1380
1595
  }
1381
1596
  )
1382
1597
  }