@ahrowe/ui 0.3.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/dist/esm/common/accordion/accordion.mjs +2 -0
  2. package/dist/esm/common/accordion/accordion.mjs.map +1 -0
  3. package/dist/esm/common/accordion/accordion.module.mjs +2 -0
  4. package/dist/esm/common/accordion/accordion.module.mjs.map +1 -0
  5. package/dist/esm/common/accordion/accordion.plain.module.mjs +2 -0
  6. package/dist/esm/common/accordion/accordion.plain.module.mjs.map +1 -0
  7. package/dist/esm/common/accordion/accordion.primary.module.mjs +2 -0
  8. package/dist/esm/common/accordion/accordion.primary.module.mjs.map +1 -0
  9. package/dist/esm/common/accordion/accordion.types.mjs +2 -0
  10. package/dist/esm/common/accordion/accordion.types.mjs.map +1 -0
  11. package/dist/esm/common/actionButtons/actionButtons.mjs +2 -0
  12. package/dist/esm/common/actionButtons/actionButtons.mjs.map +1 -0
  13. package/dist/esm/common/actionButtons/actionButtons.module.mjs +2 -0
  14. package/dist/esm/common/actionButtons/actionButtons.module.mjs.map +1 -0
  15. package/dist/esm/common/actionIcon/actionIcon.mjs +2 -0
  16. package/dist/esm/common/actionIcon/actionIcon.mjs.map +1 -0
  17. package/dist/esm/common/actionIcon/actionIcon.module.mjs +2 -0
  18. package/dist/esm/common/actionIcon/actionIcon.module.mjs.map +1 -0
  19. package/dist/esm/common/avatar/avatar.mjs +2 -0
  20. package/dist/esm/common/avatar/avatar.mjs.map +1 -0
  21. package/dist/esm/common/avatar/avatar.module.mjs +2 -0
  22. package/dist/esm/common/avatar/avatar.module.mjs.map +1 -0
  23. package/dist/esm/common/avatar/avatarGroup.mjs +2 -0
  24. package/dist/esm/common/avatar/avatarGroup.mjs.map +1 -0
  25. package/dist/esm/common/badge/badge.mjs +2 -0
  26. package/dist/esm/common/badge/badge.mjs.map +1 -0
  27. package/dist/esm/common/badge/badge.module.mjs +2 -0
  28. package/dist/esm/common/badge/badge.module.mjs.map +1 -0
  29. package/dist/esm/common/badge/badge.types.mjs +2 -0
  30. package/dist/esm/common/badge/badge.types.mjs.map +1 -0
  31. package/dist/esm/common/bodyEnd/bodyEnd.mjs +2 -0
  32. package/dist/esm/common/bodyEnd/bodyEnd.mjs.map +1 -0
  33. package/dist/esm/common/button/button.mjs +2 -0
  34. package/dist/esm/common/button/button.mjs.map +1 -0
  35. package/dist/esm/common/button/button.module.mjs +2 -0
  36. package/dist/esm/common/button/button.module.mjs.map +1 -0
  37. package/dist/esm/common/button/button.types.mjs +2 -0
  38. package/dist/esm/common/button/button.types.mjs.map +1 -0
  39. package/dist/esm/common/card/Card.mjs +2 -0
  40. package/dist/esm/common/card/Card.mjs.map +1 -0
  41. package/dist/esm/common/card/CardActions.mjs +2 -0
  42. package/dist/esm/common/card/CardActions.mjs.map +1 -0
  43. package/dist/esm/common/card/CardContent.mjs +2 -0
  44. package/dist/esm/common/card/CardContent.mjs.map +1 -0
  45. package/dist/esm/common/card/CardHeader.mjs +2 -0
  46. package/dist/esm/common/card/CardHeader.mjs.map +1 -0
  47. package/dist/esm/common/card/CardMedia.mjs +2 -0
  48. package/dist/esm/common/card/CardMedia.mjs.map +1 -0
  49. package/dist/esm/common/card/card.module.mjs +2 -0
  50. package/dist/esm/common/card/card.module.mjs.map +1 -0
  51. package/dist/esm/common/card/card.types.mjs +2 -0
  52. package/dist/esm/common/card/card.types.mjs.map +1 -0
  53. package/dist/esm/common/checkbox/checkbox.mjs +2 -0
  54. package/dist/esm/common/checkbox/checkbox.mjs.map +1 -0
  55. package/dist/esm/common/checkbox/checkbox.module.mjs +2 -0
  56. package/dist/esm/common/checkbox/checkbox.module.mjs.map +1 -0
  57. package/dist/esm/common/chip/chip.mjs +2 -0
  58. package/dist/esm/common/chip/chip.mjs.map +1 -0
  59. package/dist/esm/common/chip/chip.module.mjs +2 -0
  60. package/dist/esm/common/chip/chip.module.mjs.map +1 -0
  61. package/dist/esm/common/chip/chip.types.mjs +2 -0
  62. package/dist/esm/common/chip/chip.types.mjs.map +1 -0
  63. package/dist/esm/common/chip/chipContainer.mjs +2 -0
  64. package/dist/esm/common/chip/chipContainer.mjs.map +1 -0
  65. package/dist/esm/common/colorPicker/colorPicker.mjs +2 -0
  66. package/dist/esm/common/colorPicker/colorPicker.mjs.map +1 -0
  67. package/dist/esm/common/colorPicker/colorPicker.module.mjs +2 -0
  68. package/dist/esm/common/colorPicker/colorPicker.module.mjs.map +1 -0
  69. package/dist/esm/common/confirmModal/confirmModal.mjs +2 -0
  70. package/dist/esm/common/confirmModal/confirmModal.mjs.map +1 -0
  71. package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.mjs +2 -0
  72. package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.mjs.map +1 -0
  73. package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.module.mjs +2 -0
  74. package/dist/esm/common/datePicker/components/datePickerMonth/datePickerMonth.module.mjs.map +1 -0
  75. package/dist/esm/common/datePicker/dateFunctions.mjs +2 -0
  76. package/dist/esm/common/datePicker/dateFunctions.mjs.map +1 -0
  77. package/dist/esm/common/datePicker/datePicker.mjs +2 -0
  78. package/dist/esm/common/datePicker/datePicker.mjs.map +1 -0
  79. package/dist/esm/common/datePicker/datePicker.module.mjs +2 -0
  80. package/dist/esm/common/datePicker/datePicker.module.mjs.map +1 -0
  81. package/dist/esm/common/drawer/drawer.mjs +2 -0
  82. package/dist/esm/common/drawer/drawer.mjs.map +1 -0
  83. package/dist/esm/common/drawer/drawer.module.mjs +2 -0
  84. package/dist/esm/common/drawer/drawer.module.mjs.map +1 -0
  85. package/dist/esm/common/dropZone/dropZone.mjs +2 -0
  86. package/dist/esm/common/dropZone/dropZone.mjs.map +1 -0
  87. package/dist/esm/common/dropZone/dropZone.module.mjs +2 -0
  88. package/dist/esm/common/dropZone/dropZone.module.mjs.map +1 -0
  89. package/dist/esm/common/dropZone/dropZone.types.mjs +2 -0
  90. package/dist/esm/common/dropZone/dropZone.types.mjs.map +1 -0
  91. package/dist/esm/common/dropdown/dropdown.mjs +2 -0
  92. package/dist/esm/common/dropdown/dropdown.mjs.map +1 -0
  93. package/dist/esm/common/dropdown/dropdown.module.mjs +2 -0
  94. package/dist/esm/common/dropdown/dropdown.module.mjs.map +1 -0
  95. package/dist/esm/common/emptyState/emptyState.mjs +2 -0
  96. package/dist/esm/common/emptyState/emptyState.mjs.map +1 -0
  97. package/dist/esm/common/emptyState/emptyState.module.mjs +2 -0
  98. package/dist/esm/common/emptyState/emptyState.module.mjs.map +1 -0
  99. package/dist/esm/common/fab/components/fabBase/fabBase.mjs +2 -0
  100. package/dist/esm/common/fab/components/fabBase/fabBase.mjs.map +1 -0
  101. package/dist/esm/common/fab/components/fabBase/fabBase.module.mjs +2 -0
  102. package/dist/esm/common/fab/components/fabBase/fabBase.module.mjs.map +1 -0
  103. package/dist/esm/common/fab/fab.mjs +2 -0
  104. package/dist/esm/common/fab/fab.mjs.map +1 -0
  105. package/dist/esm/common/fab/fab.module.mjs +2 -0
  106. package/dist/esm/common/fab/fab.module.mjs.map +1 -0
  107. package/dist/esm/common/floatingMenu/floatingMenu.mjs +2 -0
  108. package/dist/esm/common/floatingMenu/floatingMenu.mjs.map +1 -0
  109. package/dist/esm/common/floatingMenu/floatingMenu.module.mjs +2 -0
  110. package/dist/esm/common/floatingMenu/floatingMenu.module.mjs.map +1 -0
  111. package/dist/esm/common/floatingMenu/floatingMenu.types.mjs +2 -0
  112. package/dist/esm/common/floatingMenu/floatingMenu.types.mjs.map +1 -0
  113. package/dist/esm/common/floatingMenu/useFloatingPosition.mjs +2 -0
  114. package/dist/esm/common/floatingMenu/useFloatingPosition.mjs.map +1 -0
  115. package/dist/esm/common/iconPicker/iconPicker.mjs +2 -0
  116. package/dist/esm/common/iconPicker/iconPicker.mjs.map +1 -0
  117. package/dist/esm/common/iconPicker/iconPicker.module.mjs +2 -0
  118. package/dist/esm/common/iconPicker/iconPicker.module.mjs.map +1 -0
  119. package/dist/esm/common/idleManager/idleManager.mjs +2 -0
  120. package/dist/esm/common/idleManager/idleManager.mjs.map +1 -0
  121. package/dist/esm/common/infiniteBlock/infiniteBlock.mjs +2 -0
  122. package/dist/esm/common/infiniteBlock/infiniteBlock.mjs.map +1 -0
  123. package/dist/esm/common/infiniteBlock/infiniteBlock.module.mjs +2 -0
  124. package/dist/esm/common/infiniteBlock/infiniteBlock.module.mjs.map +1 -0
  125. package/dist/esm/common/input/input.mjs +2 -0
  126. package/dist/esm/common/input/input.mjs.map +1 -0
  127. package/dist/esm/common/input/input.module.mjs +2 -0
  128. package/dist/esm/common/input/input.module.mjs.map +1 -0
  129. package/dist/esm/common/input/input.types.mjs +2 -0
  130. package/dist/esm/common/input/input.types.mjs.map +1 -0
  131. package/dist/esm/common/inputDropdown/inputDropdown.mjs +2 -0
  132. package/dist/esm/common/inputDropdown/inputDropdown.mjs.map +1 -0
  133. package/dist/esm/common/inputDropdown/inputDropdown.module.mjs +2 -0
  134. package/dist/esm/common/inputDropdown/inputDropdown.module.mjs.map +1 -0
  135. package/dist/esm/common/interactableDiv/index.mjs +2 -0
  136. package/dist/esm/common/interactableDiv/index.mjs.map +1 -0
  137. package/dist/esm/common/interactableDiv/interactableDiv.mjs +2 -0
  138. package/dist/esm/common/interactableDiv/interactableDiv.mjs.map +1 -0
  139. package/dist/esm/common/interactableDiv/interactableDiv.module.mjs +2 -0
  140. package/dist/esm/common/interactableDiv/interactableDiv.module.mjs.map +1 -0
  141. package/dist/esm/common/kanbanBoard/KanbanBoard.mjs +2 -0
  142. package/dist/esm/common/kanbanBoard/KanbanBoard.mjs.map +1 -0
  143. package/dist/esm/common/kanbanBoard/KanbanColumn.mjs +2 -0
  144. package/dist/esm/common/kanbanBoard/KanbanColumn.mjs.map +1 -0
  145. package/dist/esm/common/kanbanBoard/KanbanItem.mjs +2 -0
  146. package/dist/esm/common/kanbanBoard/KanbanItem.mjs.map +1 -0
  147. package/dist/esm/common/kanbanBoard/kanbanBoard.module.mjs +2 -0
  148. package/dist/esm/common/kanbanBoard/kanbanBoard.module.mjs.map +1 -0
  149. package/dist/esm/common/klipyPicker/components/gifPreview/gifPreview.mjs +2 -0
  150. package/dist/esm/common/klipyPicker/components/gifPreview/gifPreview.mjs.map +1 -0
  151. package/dist/esm/common/klipyPicker/components/gifPreview/gifPreview.module.mjs +2 -0
  152. package/dist/esm/common/klipyPicker/components/gifPreview/gifPreview.module.mjs.map +1 -0
  153. package/dist/esm/common/klipyPicker/components/gifView/gifView.mjs +2 -0
  154. package/dist/esm/common/klipyPicker/components/gifView/gifView.mjs.map +1 -0
  155. package/dist/esm/common/klipyPicker/components/gifView/gifView.module.mjs +2 -0
  156. package/dist/esm/common/klipyPicker/components/gifView/gifView.module.mjs.map +1 -0
  157. package/dist/esm/common/klipyPicker/klipyPicker.mjs +2 -0
  158. package/dist/esm/common/klipyPicker/klipyPicker.mjs.map +1 -0
  159. package/dist/esm/common/klipyPicker/klipyPicker.module.mjs +2 -0
  160. package/dist/esm/common/klipyPicker/klipyPicker.module.mjs.map +1 -0
  161. package/dist/esm/common/loading/iconLoading/iconLoading.mjs +2 -0
  162. package/dist/esm/common/loading/iconLoading/iconLoading.mjs.map +1 -0
  163. package/dist/esm/common/loading/iconLoading/iconLoading.module.mjs +2 -0
  164. package/dist/esm/common/loading/iconLoading/iconLoading.module.mjs.map +1 -0
  165. package/dist/esm/common/loading/iconLoading/index.mjs +2 -0
  166. package/dist/esm/common/loading/iconLoading/index.mjs.map +1 -0
  167. package/dist/esm/common/loading/spinnerLoading/index.mjs +2 -0
  168. package/dist/esm/common/loading/spinnerLoading/index.mjs.map +1 -0
  169. package/dist/esm/common/loading/spinnerLoading/spinnerLoading.mjs +2 -0
  170. package/dist/esm/common/loading/spinnerLoading/spinnerLoading.mjs.map +1 -0
  171. package/dist/esm/common/loading/spinnerLoading/spinnerLoading.module.mjs +2 -0
  172. package/dist/esm/common/loading/spinnerLoading/spinnerLoading.module.mjs.map +1 -0
  173. package/dist/esm/common/modal/modal.mjs +2 -0
  174. package/dist/esm/common/modal/modal.mjs.map +1 -0
  175. package/dist/esm/common/modal/modal.module.mjs +2 -0
  176. package/dist/esm/common/modal/modal.module.mjs.map +1 -0
  177. package/dist/esm/common/numberInput/index.mjs +2 -0
  178. package/dist/esm/common/numberInput/index.mjs.map +1 -0
  179. package/dist/esm/common/numberInput/numberInput.mjs +2 -0
  180. package/dist/esm/common/numberInput/numberInput.mjs.map +1 -0
  181. package/dist/esm/common/numberInput/numberInput.module.mjs +2 -0
  182. package/dist/esm/common/numberInput/numberInput.module.mjs.map +1 -0
  183. package/dist/esm/common/optionPicker/optionPicker.mjs +2 -0
  184. package/dist/esm/common/optionPicker/optionPicker.mjs.map +1 -0
  185. package/dist/esm/common/optionPicker/optionPicker.module.mjs +2 -0
  186. package/dist/esm/common/optionPicker/optionPicker.module.mjs.map +1 -0
  187. package/dist/esm/common/overscroll/overscroll.mjs +2 -0
  188. package/dist/esm/common/overscroll/overscroll.mjs.map +1 -0
  189. package/dist/esm/common/overscroll/overscroll.module.mjs +2 -0
  190. package/dist/esm/common/overscroll/overscroll.module.mjs.map +1 -0
  191. package/dist/esm/common/progressBar/progressBar.mjs +2 -0
  192. package/dist/esm/common/progressBar/progressBar.mjs.map +1 -0
  193. package/dist/esm/common/progressBar/progressBar.module.mjs +2 -0
  194. package/dist/esm/common/progressBar/progressBar.module.mjs.map +1 -0
  195. package/dist/esm/common/ripple/ripple.mjs +2 -0
  196. package/dist/esm/common/ripple/ripple.mjs.map +1 -0
  197. package/dist/esm/common/ripple/ripple.module.mjs +2 -0
  198. package/dist/esm/common/ripple/ripple.module.mjs.map +1 -0
  199. package/dist/esm/common/roomDrawer/roomDrawer.mjs +2 -0
  200. package/dist/esm/common/roomDrawer/roomDrawer.mjs.map +1 -0
  201. package/dist/esm/common/roomDrawer/roomDrawer.module.mjs +2 -0
  202. package/dist/esm/common/roomDrawer/roomDrawer.module.mjs.map +1 -0
  203. package/dist/esm/common/roomDrawer/roomDrawer.utils.mjs +6 -0
  204. package/dist/esm/common/roomDrawer/roomDrawer.utils.mjs.map +1 -0
  205. package/dist/esm/common/roomViewer/roomViewer.mjs +2 -0
  206. package/dist/esm/common/roomViewer/roomViewer.mjs.map +1 -0
  207. package/dist/esm/common/roomViewer/roomViewer.module.mjs +2 -0
  208. package/dist/esm/common/roomViewer/roomViewer.module.mjs.map +1 -0
  209. package/dist/esm/common/scrollbarProvider/index.mjs +2 -0
  210. package/dist/esm/common/scrollbarProvider/index.mjs.map +1 -0
  211. package/dist/esm/common/scrollbarProvider/scrollbarProvider.mjs +2 -0
  212. package/dist/esm/common/scrollbarProvider/scrollbarProvider.mjs.map +1 -0
  213. package/dist/esm/common/scrollbarProvider/scrollbarProvider.module.mjs +2 -0
  214. package/dist/esm/common/scrollbarProvider/scrollbarProvider.module.mjs.map +1 -0
  215. package/dist/esm/common/searchInput/searchInput.mjs +2 -0
  216. package/dist/esm/common/searchInput/searchInput.mjs.map +1 -0
  217. package/dist/esm/common/searchInput/searchInput.module.mjs +2 -0
  218. package/dist/esm/common/searchInput/searchInput.module.mjs.map +1 -0
  219. package/dist/esm/common/skeleton/skeleton.mjs +2 -0
  220. package/dist/esm/common/skeleton/skeleton.mjs.map +1 -0
  221. package/dist/esm/common/skeleton/skeleton.module.mjs +2 -0
  222. package/dist/esm/common/skeleton/skeleton.module.mjs.map +1 -0
  223. package/dist/esm/common/skeleton/skeleton.types.mjs +2 -0
  224. package/dist/esm/common/skeleton/skeleton.types.mjs.map +1 -0
  225. package/dist/esm/common/stepper/stepper.mjs +2 -0
  226. package/dist/esm/common/stepper/stepper.mjs.map +1 -0
  227. package/dist/esm/common/stepper/stepper.module.mjs +2 -0
  228. package/dist/esm/common/stepper/stepper.module.mjs.map +1 -0
  229. package/dist/esm/common/sticky/sticky.mjs +2 -0
  230. package/dist/esm/common/sticky/sticky.mjs.map +1 -0
  231. package/dist/esm/common/sticky/sticky.module.mjs +2 -0
  232. package/dist/esm/common/sticky/sticky.module.mjs.map +1 -0
  233. package/dist/esm/common/switch/switch.mjs +2 -0
  234. package/dist/esm/common/switch/switch.mjs.map +1 -0
  235. package/dist/esm/common/switch/switch.module.mjs +2 -0
  236. package/dist/esm/common/switch/switch.module.mjs.map +1 -0
  237. package/dist/esm/common/tabHeader/tabHeader.mjs +2 -0
  238. package/dist/esm/common/tabHeader/tabHeader.mjs.map +1 -0
  239. package/dist/esm/common/tabHeader/tabHeader.module.mjs +2 -0
  240. package/dist/esm/common/tabHeader/tabHeader.module.mjs.map +1 -0
  241. package/dist/esm/common/textarea/textarea.mjs +2 -0
  242. package/dist/esm/common/textarea/textarea.mjs.map +1 -0
  243. package/dist/esm/common/themeProvider/defaultTheme.mjs +2 -0
  244. package/dist/esm/common/themeProvider/defaultTheme.mjs.map +1 -0
  245. package/dist/esm/common/themeProvider/theme.module.mjs +2 -0
  246. package/dist/esm/common/themeProvider/theme.module.mjs.map +1 -0
  247. package/dist/esm/common/themeProvider/themeProvider.mjs +2 -0
  248. package/dist/esm/common/themeProvider/themeProvider.mjs.map +1 -0
  249. package/dist/esm/common/themeProvider/useTheme.mjs +2 -0
  250. package/dist/esm/common/themeProvider/useTheme.mjs.map +1 -0
  251. package/dist/esm/common/timeInput/components/clockDial/clockDial.mjs +2 -0
  252. package/dist/esm/common/timeInput/components/clockDial/clockDial.mjs.map +1 -0
  253. package/dist/esm/common/timeInput/components/clockDial/clockDial.module.mjs +2 -0
  254. package/dist/esm/common/timeInput/components/clockDial/clockDial.module.mjs.map +1 -0
  255. package/dist/esm/common/timeInput/timeFunctions.mjs +2 -0
  256. package/dist/esm/common/timeInput/timeFunctions.mjs.map +1 -0
  257. package/dist/esm/common/timeInput/timeInput.mjs +2 -0
  258. package/dist/esm/common/timeInput/timeInput.mjs.map +1 -0
  259. package/dist/esm/common/timeInput/timeInput.module.mjs +2 -0
  260. package/dist/esm/common/timeInput/timeInput.module.mjs.map +1 -0
  261. package/dist/esm/common/toast/toast.mjs +2 -0
  262. package/dist/esm/common/toast/toast.mjs.map +1 -0
  263. package/dist/esm/common/toast/toast.module.mjs +2 -0
  264. package/dist/esm/common/toast/toast.module.mjs.map +1 -0
  265. package/dist/esm/common/toast/toastProvider.mjs +2 -0
  266. package/dist/esm/common/toast/toastProvider.mjs.map +1 -0
  267. package/dist/esm/common/toast/toastService.mjs +2 -0
  268. package/dist/esm/common/toast/toastService.mjs.map +1 -0
  269. package/dist/esm/common/tooltip/tooltip.mjs +2 -0
  270. package/dist/esm/common/tooltip/tooltip.mjs.map +1 -0
  271. package/dist/esm/common/tooltip/tooltip.module.mjs +2 -0
  272. package/dist/esm/common/tooltip/tooltip.module.mjs.map +1 -0
  273. package/dist/esm/common/virtualList/useColumns.mjs +2 -0
  274. package/dist/esm/common/virtualList/useColumns.mjs.map +1 -0
  275. package/dist/esm/common/virtualList/useRowDrag.mjs +2 -0
  276. package/dist/esm/common/virtualList/useRowDrag.mjs.map +1 -0
  277. package/dist/esm/common/virtualList/useSelection.mjs +2 -0
  278. package/dist/esm/common/virtualList/useSelection.mjs.map +1 -0
  279. package/dist/esm/common/virtualList/useVirtualWindow.mjs +2 -0
  280. package/dist/esm/common/virtualList/useVirtualWindow.mjs.map +1 -0
  281. package/dist/esm/common/virtualList/virtualList.mjs +2 -0
  282. package/dist/esm/common/virtualList/virtualList.mjs.map +1 -0
  283. package/dist/esm/common/virtualList/virtualList.module.mjs +2 -0
  284. package/dist/esm/common/virtualList/virtualList.module.mjs.map +1 -0
  285. package/dist/esm/common/virtualList/virtualList.utils.mjs +2 -0
  286. package/dist/esm/common/virtualList/virtualList.utils.mjs.map +1 -0
  287. package/dist/esm/common/virtualList/virtualRow.mjs +2 -0
  288. package/dist/esm/common/virtualList/virtualRow.mjs.map +1 -0
  289. package/dist/esm/common/wizard/wizard.mjs +2 -0
  290. package/dist/esm/common/wizard/wizard.mjs.map +1 -0
  291. package/dist/esm/common/wizard/wizard.module.mjs +2 -0
  292. package/dist/esm/common/wizard/wizard.module.mjs.map +1 -0
  293. package/dist/esm/hooks/useWindowSize.mjs +2 -0
  294. package/dist/esm/hooks/useWindowSize.mjs.map +1 -0
  295. package/dist/esm/index.mjs +1 -0
  296. package/dist/esm/services/formValidation/FormValidatorGroupForm.mjs +2 -0
  297. package/dist/esm/services/formValidation/FormValidatorGroupForm.mjs.map +1 -0
  298. package/dist/esm/services/formValidation/FormValidatorGroupWithForm.mjs +2 -0
  299. package/dist/esm/services/formValidation/FormValidatorGroupWithForm.mjs.map +1 -0
  300. package/dist/esm/services/formValidation/formValidator.mjs +2 -0
  301. package/dist/esm/services/formValidation/formValidator.mjs.map +1 -0
  302. package/dist/esm/services/formValidation/formValidatorGroup.mjs +2 -0
  303. package/dist/esm/services/formValidation/formValidatorGroup.mjs.map +1 -0
  304. package/dist/esm/services/formValidation/useFormValidator.mjs +2 -0
  305. package/dist/esm/services/formValidation/useFormValidator.mjs.map +1 -0
  306. package/dist/esm/services/formValidation/useFormValidatorGroup.mjs +2 -0
  307. package/dist/esm/services/formValidation/useFormValidatorGroup.mjs.map +1 -0
  308. package/dist/esm/services/formValidation/validatableComponent.mjs +2 -0
  309. package/dist/esm/services/formValidation/validatableComponent.mjs.map +1 -0
  310. package/dist/esm/services/formValidation/validators.mjs +2 -0
  311. package/dist/esm/services/formValidation/validators.mjs.map +1 -0
  312. package/dist/esm/services/klipy.mjs +2 -0
  313. package/dist/esm/services/klipy.mjs.map +1 -0
  314. package/dist/esm/services/localization.mjs +2 -0
  315. package/dist/esm/services/localization.mjs.map +1 -0
  316. package/dist/esm/services/regexp.mjs +2 -0
  317. package/dist/esm/services/regexp.mjs.map +1 -0
  318. package/dist/index.cjs +4 -4
  319. package/dist/index.cjs.map +1 -1
  320. package/dist/style.css +1 -1
  321. package/dist/types/package/common/dropdown/dropdown.d.ts +1 -1
  322. package/dist/types/package/common/dropdown/dropdown.types.d.ts +0 -1
  323. package/dist/types/package/common/floatingMenu/useFloatingPosition.d.ts +25 -0
  324. package/docs/Card.md +1 -1
  325. package/docs/Dropdown.md +2 -1
  326. package/docs/InputDropdown.md +2 -0
  327. package/docs/Tooltip.md +2 -0
  328. package/docs/VirtualList.md +1 -1
  329. package/package.json +4 -3
  330. package/dist/index.mjs +0 -6791
  331. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,2 @@
1
+ var e={ripple:`ripple_TsvyF`,"ripple-container":`ripple-container_QzHdC`,rippleContainer:`ripple-container_QzHdC`};export{e as default};
2
+ //# sourceMappingURL=ripple.module.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ripple.module.mjs","names":[],"sources":["../../../../package/common/ripple/ripple.module.pcss"],"sourcesContent":[".ripple {\n background: rgba(255, 255, 255, 0.2);\n border-radius: 1000px;\n width: 100%;\n aspect-ratio: 1;\n position: absolute;\n left: 0;\n top: 0;\n transform: translate(-50%, -50%) scale(0);\n animation: ripple var(--ripple-animation-length) linear forwards;\n\n &-container {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n border-radius: inherit;\n user-select: none;\n pointer-events: none;\n }\n\n @keyframes ripple {\n to {\n transform: translate(-50%, -50%) scale(4);\n opacity: 0;\n }\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{buildWallSegments as e,centroid as t,clientToSVG as n,dist as r,doorEndpoints as i,downloadSVG as a,nearestWall as o,parseSVGRooms as s,pointInPolygon as c,pointToSegment as ee,rectToPoints as te,snapPt as l}from"./roomDrawer.utils.mjs";import u from"./roomDrawer.module.mjs";import{useEffect as ne,useLayoutEffect as re,useRef as d,useState as f}from"react";import p from"classnames";import{FontAwesomeIcon as m}from"@fortawesome/react-fontawesome";import{faCheck as ie,faDoorOpen as ae,faDownload as oe,faDrawPolygon as se,faHandPointer as ce,faMagnifyingGlassMinus as le,faMagnifyingGlassPlus as ue,faSquare as de,faTrash as fe,faUpload as pe}from"@fortawesome/free-solid-svg-icons";import{Fragment as me,jsx as h,jsxs as g}from"react/jsx-runtime";var he=6,ge=5,_=1.25,v=.25,y=12,b=0;function x(e){return b+=1,`${e}${b}`}var _e={select:`Drag inside to move · Drag corner to reshape · Click wall to add corner · Dbl-click corner to remove · Delete to erase`,rect:`Drag to draw a rectangular room`,polygon:`Click to place corners · Click first point or Enter to close · Esc to cancel`};function S({className:b}){let[S,C]=f([]),[w,T]=f([]),[E,ve]=f(`rect`),[D,O]=f(null),[k,A]=f(null),[j,M]=f(null),[N,P]=f(null),[F,I]=f([]),[ye,L]=f(null),[R,z]=f(1),[B,V]=f({x:0,y:0}),H=d(null),U=d(null),W=d(null),G=d(null),be=d(null),K=d({rooms:S,doors:w,tool:E,selectedId:D,editingDoorsForRoomId:k,polyPoints:F,zoom:R,pan:B});re(()=>{K.current={rooms:S,doors:w,tool:E,selectedId:D,editingDoorsForRoomId:k,polyPoints:F,zoom:R,pan:B}});function xe(e){e.length<3||(C(t=>[...t,{id:x(`room`),name:`Room ${t.length+1}`,points:e}]),I([]),L(null))}ne(()=>{let e=G.current;if(!e)return;function t(e){e.preventDefault();let{zoom:t,pan:r}=K.current,i=n(e.clientX,e.clientY,G.current);if(!i)return;let a=e.deltaY<0?_:1/_,o=Math.max(v,Math.min(y,t*a));V({x:i.x-(i.x-r.x)*(t/o),y:i.y-(i.y-r.y)*(t/o)}),z(o)}return e.addEventListener(`wheel`,t,{passive:!1}),()=>e.removeEventListener(`wheel`,t)},[]),ne(()=>{function e(e){let{tool:t,selectedId:n,editingDoorsForRoomId:r,polyPoints:i,zoom:a,pan:o}=K.current;if(e.key===`Escape`){if(r){A(null);return}t===`polygon`&&(I([]),L(null)),O(null);return}if(e.key===`Enter`&&t===`polygon`&&i.length>=3){xe(i);return}if((e.key===`+`||e.key===`=`)&&!(e.target instanceof HTMLInputElement)){let e=Math.max(v,Math.min(y,a*_)),t=o.x+400/a/2,n=o.y+300/a/2;z(e),V({x:t-400/e/2,y:n-300/e/2});return}if(e.key===`-`&&!(e.target instanceof HTMLInputElement)){let e=Math.max(v,Math.min(y,a/_)),t=o.x+400/a/2,n=o.y+300/a/2;z(e),V({x:t-400/e/2,y:n-300/e/2});return}if(e.key===`0`&&!(e.target instanceof HTMLInputElement)){z(1),V({x:0,y:0});return}(e.key===`Delete`||e.key===`Backspace`)&&n&&!r&&!(e.target instanceof HTMLInputElement)&&(C(e=>e.filter(e=>e.id!==n)),T(e=>e.filter(e=>e.roomId!==n)),O(null))}return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[]);function q(e,t=R,n=B){let r=Math.max(v,Math.min(y,t*e)),i=n.x+400/t/2,a=n.y+300/t/2;V({x:i-400/r/2,y:a-300/r/2}),z(r)}function J(e){return G.current?n(e.clientX,e.clientY,G.current):null}function Se(e,t){let n=null;for(let i=0;i<t.points.length;i++){let a=r(e,t.points[i]);a<=he&&(!n||a<n.d)&&(n={index:i,d:a})}return n}function Ce(e,t){let n=null;for(let r=0;r<t.points.length;r++){let i=t.points[r],a=t.points[(r+1)%t.points.length],{dist:o,t:s}=ee(e,i,a);o<=ge&&(!n||o<n.d)&&(n={index:r,t:s,d:o})}return n}function we(e,t,n,r){return C(n=>n.map(n=>{if(n.id!==e)return n;let i=[...n.points];return i.splice(t+1,0,r),{...n,points:i}})),T(r=>r.map(r=>r.roomId===e?r.wallIndex===t?r.t<=n?{...r,t:n>0?r.t/n:0}:{...r,wallIndex:t+1,t:(r.t-n)/(1-n)}:r.wallIndex>t?{...r,wallIndex:r.wallIndex+1}:r:r)),t+1}function Te(e,t){let n=S.find(t=>t.id===e);if(!n||n.points.length<=3)return;let r=n.points.length;C(n=>n.map(n=>n.id===e?{...n,points:n.points.filter((e,n)=>n!==t)}:n)),T(n=>n.map(n=>{if(n.roomId!==e)return n;let i=(t-1+r)%r;return n.wallIndex===i||n.wallIndex===t?{...n,wallIndex:-1}:n.wallIndex>t?{...n,wallIndex:n.wallIndex-1}:n}).filter(e=>e.wallIndex!==-1))}function Ee(e){if(e.button===1){e.preventDefault();let t=G.current;if(t){let n=t.getBoundingClientRect();W.current={startClient:{x:e.clientX,y:e.clientY},origPan:{...B},scaleX:400/R/n.width,scaleY:300/R/n.height}}return}if(e.button!==0)return;e.preventDefault();let t=J(e);if(t){if(k){let e=S.find(e=>e.id===k);if(e){let n=o(t,[e]);n&&T(e=>[...e,{id:x(`door`),roomId:n.roomId,wallIndex:n.wallIndex,t:n.t,width:12}])}return}if(E===`rect`){M(t),P(t);return}if(E===`polygon`){F.length>=3&&r(t,F[0])<=8?xe(F):I(e=>[...e,t]);return}if(E===`select`){let e=S.find(e=>e.id===D)??null;if(e){let n=Se(t,e);if(n){H.current={type:`vertex`,roomId:e.id,index:n.index,start:t,origPt:e.points[n.index]};return}}if(e){let n=Ce(t,e);if(n){let r=e.points[n.index],i=e.points[(n.index+1)%e.points.length],a=l({x:r.x+(i.x-r.x)*n.t,y:r.y+(i.y-r.y)*n.t}),o=we(e.id,n.index,n.t,a);H.current={type:`vertex`,roomId:e.id,index:o,start:t,origPt:a};return}}let n=S.find(e=>c(t,e.points));if(n){O(n.id),H.current={type:`room`,roomId:n.id,start:t,origPoints:[...n.points]};return}O(null)}}}function De(e){if(E!==`select`||k)return;let t=J(e);if(!t)return;let n=S.find(e=>e.id===D);if(!n)return;let r=Se(t,n);r&&(e.preventDefault(),Te(n.id,r.index))}function Oe(e){if(W.current){let{startClient:t,origPan:n,scaleX:r,scaleY:i}=W.current;V({x:n.x-(e.clientX-t.x)*r,y:n.y-(e.clientY-t.y)*i});return}let t=J(e);if(t){if(U.current&&k){let e=S.find(e=>e.id===k);if(e){let n=o(t,[e]);n&&T(e=>e.map(e=>e.id===U.current?{...e,wallIndex:n.wallIndex,t:n.t}:e))}return}if(E===`rect`&&j){P(t);return}if(E===`polygon`){L(t);return}if(E===`select`&&!k&&H.current){let e=H.current;if(e.type===`vertex`){let n=t.x-e.start.x,r=t.y-e.start.y,i=l({x:e.origPt.x+n,y:e.origPt.y+r});C(t=>t.map(t=>{if(t.id!==e.roomId)return t;let n=[...t.points];return n[e.index]=i,{...t,points:n}}))}else{let n=t.x-e.start.x,r=t.y-e.start.y;C(t=>t.map(t=>t.id===e.roomId?{...t,points:e.origPoints.map(e=>({x:e.x+n,y:e.y+r}))}:t))}}}}function ke(e){if(W.current){W.current=null;return}let t=J(e);if(t){if(E===`rect`&&j){let e=Math.min(j.x,t.x),n=Math.min(j.y,t.y),r=Math.abs(t.x-j.x),i=Math.abs(t.y-j.y);r>=10&&i>=10&&C(t=>[...t,{id:x(`room`),name:`Room ${t.length+1}`,points:te(e,n,r,i)}]),M(null),P(null)}U.current=null,H.current=null}}function Ae(e){D&&C(t=>t.map(t=>t.id===D?{...t,name:e}:t))}function je(e,t){let n=parseFloat(t);isNaN(n)||n<=0||T(t=>t.map(t=>t.id===e?{...t,width:n}:t))}function Me(){D&&(C(e=>e.filter(e=>e.id!==D)),T(e=>e.filter(e=>e.roomId!==D)),A(null),O(null))}function Ne(e){T(t=>t.filter(t=>t.id!==e))}function Pe(e){ve(e),A(null),I([]),L(null),M(null),P(null)}function Fe(e){let t=e.target.files?.[0];if(!t)return;e.target.value=``;let n=new FileReader;n.onload=e=>{let t=e.target?.result;if(typeof t!=`string`)return;let n=s(t);n.length!==0&&(C(n.map(e=>({...e,id:x(`room`)}))),T([]),O(null),A(null),z(1),V({x:0,y:0}))},n.readAsText(t)}let Y=E===`rect`&&j&&N?{x:Math.min(j.x,N.x),y:Math.min(j.y,N.y),w:Math.abs(N.x-j.x),h:Math.abs(N.y-j.y)}:null,X=D?S.find(e=>e.id===D)??null:null,Z=k?S.find(e=>e.id===k)??null:null,Q=k?w.filter(e=>e.roomId===k):[],Ie=[{t:`select`,icon:ce,label:`Select & edit`},{t:`rect`,icon:de,label:`Rectangle room`},{t:`polygon`,icon:se,label:`Polygon room`}],Le=400/R,$=300/R,Re=k?u.roomDrawerCanvasDoor:E===`select`?u.roomDrawerCanvasSelect:void 0;return g(`div`,{className:p(u.roomDrawer,b),children:[g(`div`,{className:u.roomDrawerToolbar,children:[Ie.map(({t:e,icon:t,label:n})=>h(`button`,{title:n,className:p(u.roomDrawerToolbarBtn,e===E&&!k&&u.roomDrawerToolbarBtnActive),onClick:()=>Pe(e),children:h(m,{icon:t})},e)),h(`div`,{className:u.roomDrawerToolbarSep}),h(`button`,{title:`Zoom in (+)`,className:u.roomDrawerToolbarBtn,onClick:()=>q(_),disabled:R>=y,children:h(m,{icon:ue})}),g(`button`,{title:`Reset zoom (0) — ${Math.round(R*100)}%`,className:u.roomDrawerToolbarZoomLabel,onClick:()=>{z(1),V({x:0,y:0})},children:[Math.round(R*100),`%`]}),h(`button`,{title:`Zoom out (−)`,className:u.roomDrawerToolbarBtn,onClick:()=>q(1/_),disabled:R<=v,children:h(m,{icon:le})}),h(`div`,{className:u.roomDrawerToolbarSep}),h(`button`,{title:`Upload SVG`,className:u.roomDrawerToolbarBtn,onClick:()=>be.current?.click(),children:h(m,{icon:pe})}),h(`button`,{title:`Download SVG`,className:u.roomDrawerToolbarBtn,onClick:()=>a(S,w),disabled:S.length===0,children:h(m,{icon:oe})}),h(`input`,{ref:be,type:`file`,accept:`.svg,image/svg+xml`,style:{display:`none`},onChange:Fe})]}),g(`svg`,{ref:G,className:p(u.roomDrawerCanvas,Re),viewBox:`${B.x} ${B.y} ${Le} ${$}`,onMouseDown:Ee,onMouseMove:Oe,onMouseUp:ke,onDoubleClick:De,children:[h(`defs`,{children:h(`pattern`,{id:`rd-grid`,width:5,height:5,patternUnits:`userSpaceOnUse`,children:h(`path`,{d:`M 5 0 L 0 0 0 5`,fill:`none`,className:u.gridLine})})}),h(`rect`,{x:B.x,y:B.y,width:Le,height:$,fill:`url(#rd-grid)`}),S.map(n=>{let r=n.points,i=r.map((e,t)=>`${t===0?`M`:`L`} ${e.x},${e.y}`).join(` `)+` Z`,a=e(r,w.filter(e=>e.roomId===n.id)),o=t(r),s=D===n.id,c=k===n.id;return g(`g`,{children:[h(`path`,{d:i,className:p(u.roomFill,(s||c)&&u.roomFillSelected)}),a.map((e,t)=>h(`path`,{d:e,className:p(u.roomStroke,(s||c)&&u.roomStrokeSelected)},t)),n.name&&h(`text`,{x:o.x,y:o.y,className:u.roomText,textAnchor:`middle`,dominantBaseline:`middle`,children:n.name})]},n.id)}),w.map(e=>{let t=S.find(t=>t.id===e.roomId);if(!t)return null;let n=t.points[e.wallIndex],r=t.points[(e.wallIndex+1)%t.points.length],a=i(n,r,e.t,e.width);return a?h(`line`,{x1:a.p1.x,y1:a.p1.y,x2:a.p2.x,y2:a.p2.y,className:u.doorGap},e.id):null}),k&&Q.map(e=>{let t=S.find(t=>t.id===e.roomId);if(!t)return null;let n=t.points[e.wallIndex],r=t.points[(e.wallIndex+1)%t.points.length],a=i(n,r,e.t,e.width);if(!a)return null;let o={x:(a.p1.x+a.p2.x)/2,y:(a.p1.y+a.p2.y)/2};return h(`circle`,{cx:o.x,cy:o.y,r:2.5,className:u.doorMarker,onMouseDown:t=>{t.button===0&&(t.preventDefault(),t.stopPropagation(),U.current=e.id)}},e.id)}),E===`select`&&!k&&X&&X.points.map((e,t)=>h(`circle`,{cx:e.x,cy:e.y,r:3.5,className:u.vertexHandle},t)),Y&&h(`rect`,{x:Y.x,y:Y.y,width:Y.w,height:Y.h,className:u.preview}),E===`polygon`&&F.length>0&&g(me,{children:[h(`polyline`,{points:[...F,ye??F[F.length-1]].map(e=>`${e.x},${e.y}`).join(` `),className:u.preview}),F.length>=3&&h(`circle`,{cx:F[0].x,cy:F[0].y,r:8/2,className:u.polyCloseTarget}),F.map((e,t)=>h(`circle`,{cx:e.x,cy:e.y,r:2,className:u.polyVertex},t))]})]}),X&&!k&&g(`div`,{className:u.roomDrawerInfo,children:[h(`span`,{className:u.roomDrawerInfoLabel,children:`Name`}),h(`input`,{className:u.roomDrawerInfoInput,value:X.name,onChange:e=>Ae(e.target.value),placeholder:`Room name`}),g(`button`,{className:u.roomDrawerInfoDoorsBtn,onClick:()=>A(X.id),title:`Edit doors`,children:[h(m,{icon:ae}),h(`span`,{children:w.filter(e=>e.roomId===X.id).length})]}),h(`button`,{className:u.roomDrawerInfoDelete,onClick:Me,title:`Delete room`,children:h(m,{icon:fe})})]}),k&&Z&&g(`div`,{className:u.roomDrawerDoorPanel,children:[g(`div`,{className:u.roomDrawerDoorPanelHeader,children:[h(m,{icon:ae,className:u.roomDrawerDoorPanelIcon}),h(`span`,{className:u.roomDrawerDoorPanelTitle,children:Z.name?`Doors · ${Z.name}`:`Doors`}),g(`button`,{className:u.roomDrawerDoorPanelDone,onClick:()=>A(null),title:`Done (Esc)`,children:[h(m,{icon:ie}),`Done`]})]}),g(`div`,{className:u.roomDrawerDoorPanelList,children:[Q.length===0&&h(`span`,{className:u.roomDrawerDoorPanelEmpty,children:`Click on a wall to add a door`}),Q.map((e,t)=>g(`div`,{className:u.roomDrawerDoorPanelItem,children:[g(`span`,{className:u.roomDrawerDoorPanelLabel,children:[`Door `,t+1]}),h(`span`,{className:u.roomDrawerDoorPanelWidthLabel,children:`Width`}),h(`input`,{className:u.roomDrawerInfoInput,type:`number`,min:1,value:e.width,onChange:t=>je(e.id,t.target.value)}),h(`button`,{className:u.roomDrawerInfoDelete,onClick:()=>Ne(e.id),title:`Delete door`,children:h(m,{icon:fe})})]},e.id))]})]}),h(`div`,{className:u.roomDrawerHint,children:k?`Click a wall to add a door · Adjust width or delete from the list · Done or Esc to finish`:`${_e[E]} · Scroll to zoom · Middle-drag to pan · 0 to reset`})]})}export{S as default};
2
+ //# sourceMappingURL=roomDrawer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roomDrawer.mjs","names":[],"sources":["../../../../package/common/roomDrawer/roomDrawer.tsx"],"sourcesContent":["import { useState, useRef, useEffect, useLayoutEffect } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faHandPointer,\n faSquare,\n faDrawPolygon,\n faTrash,\n faDownload,\n faUpload,\n faMagnifyingGlassPlus,\n faMagnifyingGlassMinus,\n faDoorOpen,\n faCheck,\n} from '@fortawesome/free-solid-svg-icons';\nimport type { MouseEvent, ReactElement } from 'react';\nimport type { Tool, Point, RoomData, DoorData, RoomDrawerProps } from './roomDrawer.types';\nimport {\n CANVAS_W,\n CANVAS_H,\n GRID,\n DOOR_WIDTH,\n CLOSE_THRESHOLD,\n clientToSVG,\n dist,\n pointToSegment,\n nearestWall,\n pointInPolygon,\n centroid,\n rectToPoints,\n doorEndpoints,\n buildWallSegments,\n downloadSVG,\n parseSVGRooms,\n snapPt,\n} from './roomDrawer.utils';\nimport styles from './roomDrawer.module.pcss';\n\nconst VERTEX_HIT = 6;\nconst WALL_HIT = 5;\nconst ZOOM_STEP = 1.25;\nconst ZOOM_MIN = 0.25;\nconst ZOOM_MAX = 12;\n\ntype DragState =\n | { type: 'room'; roomId: string; start: Point; origPoints: Point[] }\n | { type: 'vertex'; roomId: string; index: number; start: Point; origPt: Point };\n\nlet _seq = 0;\nfunction nextId(prefix: string): string {\n _seq += 1;\n return `${prefix}${_seq}`;\n}\n\nconst TOOL_HINTS: Record<Tool, string> = {\n select:\n 'Drag inside to move · Drag corner to reshape · Click wall to add corner · Dbl-click corner to remove · Delete to erase',\n rect: 'Drag to draw a rectangular room',\n polygon:\n 'Click to place corners · Click first point or Enter to close · Esc to cancel',\n};\n\nexport default function RoomDrawer({ className }: RoomDrawerProps): ReactElement {\n const [rooms, setRooms] = useState<RoomData[]>([]);\n const [doors, setDoors] = useState<DoorData[]>([]);\n const [tool, setTool] = useState<Tool>('rect');\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [editingDoorsForRoomId, setEditingDoorsForRoomId] = useState<string | null>(null);\n\n const [rectStart, setRectStart] = useState<Point | null>(null);\n const [rectCursor, setRectCursor] = useState<Point | null>(null);\n\n const [polyPoints, setPolyPoints] = useState<Point[]>([]);\n const [polyCursor, setPolyCursor] = useState<Point | null>(null);\n\n const [zoom, setZoom] = useState(1);\n const [pan, setPan] = useState<Point>({ x: 0, y: 0 });\n\n const dragRef = useRef<DragState | null>(null);\n const doorDragRef = useRef<string | null>(null); // door id being dragged\n const panDragRef = useRef<{ startClient: Point; origPan: Point; scaleX: number; scaleY: number } | null>(null);\n const svgRef = useRef<SVGSVGElement>(null);\n const uploadRef = useRef<HTMLInputElement>(null);\n\n const stateRef = useRef({ rooms, doors, tool, selectedId, editingDoorsForRoomId, polyPoints, zoom, pan });\n useLayoutEffect(() => {\n stateRef.current = { rooms, doors, tool, selectedId, editingDoorsForRoomId, polyPoints, zoom, pan };\n });\n\n function commitPolygon(pts: Point[]) {\n if (pts.length < 3) return;\n setRooms((prev) => [\n ...prev,\n { id: nextId('room'), name: `Room ${prev.length + 1}`, points: pts },\n ]);\n setPolyPoints([]);\n setPolyCursor(null);\n }\n\n // Wheel zoom (passive: false so we can preventDefault)\n useEffect(() => {\n const svg = svgRef.current;\n if (!svg) return;\n function onWheel(e: WheelEvent) {\n e.preventDefault();\n const { zoom: z, pan: p } = stateRef.current;\n const pt = clientToSVG(e.clientX, e.clientY, svgRef.current!);\n if (!pt) return;\n const factor = e.deltaY < 0 ? ZOOM_STEP : 1 / ZOOM_STEP;\n const newZoom = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, z * factor));\n setPan({\n x: pt.x - (pt.x - p.x) * (z / newZoom),\n y: pt.y - (pt.y - p.y) * (z / newZoom),\n });\n setZoom(newZoom);\n }\n svg.addEventListener('wheel', onWheel, { passive: false });\n return () => svg.removeEventListener('wheel', onWheel);\n }, []);\n\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n const { tool: t, selectedId: sel, editingDoorsForRoomId: editDoors, polyPoints: pp, zoom: z, pan: p } = stateRef.current;\n\n if (e.key === 'Escape') {\n if (editDoors) { setEditingDoorsForRoomId(null); return; }\n if (t === 'polygon') { setPolyPoints([]); setPolyCursor(null); }\n setSelectedId(null);\n return;\n }\n if (e.key === 'Enter' && t === 'polygon' && pp.length >= 3) {\n commitPolygon(pp);\n return;\n }\n if ((e.key === '+' || e.key === '=') && !(e.target instanceof HTMLInputElement)) {\n const nz = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, z * ZOOM_STEP));\n const cx = p.x + CANVAS_W / z / 2; const cy = p.y + CANVAS_H / z / 2;\n setZoom(nz); setPan({ x: cx - CANVAS_W / nz / 2, y: cy - CANVAS_H / nz / 2 });\n return;\n }\n if (e.key === '-' && !(e.target instanceof HTMLInputElement)) {\n const nz = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, z / ZOOM_STEP));\n const cx = p.x + CANVAS_W / z / 2; const cy = p.y + CANVAS_H / z / 2;\n setZoom(nz); setPan({ x: cx - CANVAS_W / nz / 2, y: cy - CANVAS_H / nz / 2 });\n return;\n }\n if (e.key === '0' && !(e.target instanceof HTMLInputElement)) {\n setZoom(1); setPan({ x: 0, y: 0 });\n return;\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && sel && !editDoors && !(e.target instanceof HTMLInputElement)) {\n setRooms((prev) => prev.filter((r) => r.id !== sel));\n setDoors((prev) => prev.filter((d) => d.roomId !== sel));\n setSelectedId(null);\n }\n }\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, []);\n\n // ─── Zoom helpers ─────────────────────────────────────────────────────────\n\n function zoomBy(factor: number, currentZoom = zoom, currentPan = pan) {\n const newZoom = Math.max(ZOOM_MIN, Math.min(ZOOM_MAX, currentZoom * factor));\n const cx = currentPan.x + CANVAS_W / currentZoom / 2;\n const cy = currentPan.y + CANVAS_H / currentZoom / 2;\n setPan({\n x: cx - CANVAS_W / newZoom / 2,\n y: cy - CANVAS_H / newZoom / 2,\n });\n setZoom(newZoom);\n }\n\n // ─── Drawing helpers ──────────────────────────────────────────────────────\n\n function svgPt(e: MouseEvent): Point | null {\n if (!svgRef.current) return null;\n return clientToSVG(e.clientX, e.clientY, svgRef.current);\n }\n\n // ─── Vertex / wall editing helpers ───────────────────────────────────────\n\n function nearestVertex(pt: Point, room: RoomData): { index: number; d: number } | null {\n let best: { index: number; d: number } | null = null;\n for (let i = 0; i < room.points.length; i++) {\n const d = dist(pt, room.points[i]);\n if (d <= VERTEX_HIT && (!best || d < best.d)) best = { index: i, d };\n }\n return best;\n }\n\n function nearestWallSegment(\n pt: Point,\n room: RoomData,\n ): { index: number; t: number; d: number } | null {\n let best: { index: number; t: number; d: number } | null = null;\n for (let i = 0; i < room.points.length; i++) {\n const a = room.points[i];\n const b = room.points[(i + 1) % room.points.length];\n const { dist: d, t } = pointToSegment(pt, a, b);\n if (d <= WALL_HIT && (!best || d < best.d)) best = { index: i, t, d };\n }\n return best;\n }\n\n function insertVertex(roomId: string, wallIndex: number, t: number, newPt: Point): number {\n setRooms((prev) =>\n prev.map((r) => {\n if (r.id !== roomId) return r;\n const pts = [...r.points];\n pts.splice(wallIndex + 1, 0, newPt);\n return { ...r, points: pts };\n }),\n );\n setDoors((prev) =>\n prev.map((d) => {\n if (d.roomId !== roomId) return d;\n if (d.wallIndex === wallIndex) {\n if (d.t <= t) return { ...d, t: t > 0 ? d.t / t : 0 };\n return { ...d, wallIndex: wallIndex + 1, t: (d.t - t) / (1 - t) };\n }\n if (d.wallIndex > wallIndex) return { ...d, wallIndex: d.wallIndex + 1 };\n return d;\n }),\n );\n return wallIndex + 1;\n }\n\n function removeVertex(roomId: string, index: number) {\n const room = rooms.find((r) => r.id === roomId);\n if (!room || room.points.length <= 3) return;\n const n = room.points.length;\n setRooms((prev) =>\n prev.map((r) => {\n if (r.id !== roomId) return r;\n return { ...r, points: r.points.filter((_, i) => i !== index) };\n }),\n );\n setDoors((prev) =>\n prev.map((d) => {\n if (d.roomId !== roomId) return d;\n const prevWall = (index - 1 + n) % n;\n if (d.wallIndex === prevWall || d.wallIndex === index) return { ...d, wallIndex: -1 };\n if (d.wallIndex > index) return { ...d, wallIndex: d.wallIndex - 1 };\n return d;\n }).filter((d) => d.wallIndex !== -1),\n );\n }\n\n // ─── Mouse events ─────────────────────────────────────────────────────────\n\n function handleMouseDown(e: MouseEvent<SVGSVGElement>) {\n // Middle mouse → pan\n if (e.button === 1) {\n e.preventDefault();\n const svg = svgRef.current;\n if (svg) {\n const rect = svg.getBoundingClientRect();\n panDragRef.current = {\n startClient: { x: e.clientX, y: e.clientY },\n origPan: { ...pan },\n scaleX: (CANVAS_W / zoom) / rect.width,\n scaleY: (CANVAS_H / zoom) / rect.height,\n };\n }\n return;\n }\n\n if (e.button !== 0) return;\n e.preventDefault();\n const pt = svgPt(e);\n if (!pt) return;\n\n // Door editing mode: click a wall to add a door\n if (editingDoorsForRoomId) {\n const editingRoom = rooms.find((r) => r.id === editingDoorsForRoomId);\n if (editingRoom) {\n const wall = nearestWall(pt, [editingRoom]);\n if (wall) {\n setDoors((prev) => [\n ...prev,\n { id: nextId('door'), roomId: wall.roomId, wallIndex: wall.wallIndex, t: wall.t, width: DOOR_WIDTH },\n ]);\n }\n }\n return;\n }\n\n if (tool === 'rect') {\n setRectStart(pt); setRectCursor(pt); return;\n }\n\n if (tool === 'polygon') {\n if (polyPoints.length >= 3 && dist(pt, polyPoints[0]) <= CLOSE_THRESHOLD) {\n commitPolygon(polyPoints);\n } else {\n setPolyPoints((prev) => [...prev, pt]);\n }\n return;\n }\n\n if (tool === 'select') {\n const selRoom = rooms.find((r) => r.id === selectedId) ?? null;\n\n if (selRoom) {\n const vh = nearestVertex(pt, selRoom);\n if (vh) {\n dragRef.current = { type: 'vertex', roomId: selRoom.id, index: vh.index, start: pt, origPt: selRoom.points[vh.index] };\n return;\n }\n }\n\n if (selRoom) {\n const wh = nearestWallSegment(pt, selRoom);\n if (wh) {\n const a = selRoom.points[wh.index];\n const b = selRoom.points[(wh.index + 1) % selRoom.points.length];\n const newPt = snapPt({ x: a.x + (b.x - a.x) * wh.t, y: a.y + (b.y - a.y) * wh.t });\n const insertedIndex = insertVertex(selRoom.id, wh.index, wh.t, newPt);\n dragRef.current = { type: 'vertex', roomId: selRoom.id, index: insertedIndex, start: pt, origPt: newPt };\n return;\n }\n }\n\n const clickedRoom = rooms.find((r) => pointInPolygon(pt, r.points));\n if (clickedRoom) {\n setSelectedId(clickedRoom.id);\n dragRef.current = { type: 'room', roomId: clickedRoom.id, start: pt, origPoints: [...clickedRoom.points] };\n return;\n }\n\n setSelectedId(null);\n }\n }\n\n function handleDoubleClick(e: MouseEvent<SVGSVGElement>) {\n if (tool !== 'select' || editingDoorsForRoomId) return;\n const pt = svgPt(e);\n if (!pt) return;\n const selRoom = rooms.find((r) => r.id === selectedId);\n if (!selRoom) return;\n const vh = nearestVertex(pt, selRoom);\n if (vh) { e.preventDefault(); removeVertex(selRoom.id, vh.index); }\n }\n\n function handleMouseMove(e: MouseEvent<SVGSVGElement>) {\n if (panDragRef.current) {\n const { startClient, origPan, scaleX, scaleY } = panDragRef.current;\n setPan({\n x: origPan.x - (e.clientX - startClient.x) * scaleX,\n y: origPan.y - (e.clientY - startClient.y) * scaleY,\n });\n return;\n }\n\n const pt = svgPt(e);\n if (!pt) return;\n\n if (doorDragRef.current && editingDoorsForRoomId) {\n const editRoom = rooms.find((r) => r.id === editingDoorsForRoomId);\n if (editRoom) {\n const wall = nearestWall(pt, [editRoom]);\n if (wall) {\n setDoors((prev) => prev.map((d) =>\n d.id === doorDragRef.current ? { ...d, wallIndex: wall.wallIndex, t: wall.t } : d\n ));\n }\n }\n return;\n }\n\n if (tool === 'rect' && rectStart) { setRectCursor(pt); return; }\n if (tool === 'polygon') { setPolyCursor(pt); return; }\n\n if (tool === 'select' && !editingDoorsForRoomId && dragRef.current) {\n const drag = dragRef.current;\n if (drag.type === 'vertex') {\n const dx = pt.x - drag.start.x;\n const dy = pt.y - drag.start.y;\n const moved = snapPt({ x: drag.origPt.x + dx, y: drag.origPt.y + dy });\n setRooms((prev) =>\n prev.map((r) => {\n if (r.id !== drag.roomId) return r;\n const pts = [...r.points];\n pts[drag.index] = moved;\n return { ...r, points: pts };\n }),\n );\n } else {\n const dx = pt.x - drag.start.x;\n const dy = pt.y - drag.start.y;\n setRooms((prev) =>\n prev.map((r) =>\n r.id === drag.roomId\n ? { ...r, points: drag.origPoints.map((p) => ({ x: p.x + dx, y: p.y + dy })) }\n : r,\n ),\n );\n }\n }\n }\n\n function handleMouseUp(e: MouseEvent<SVGSVGElement>) {\n if (panDragRef.current) { panDragRef.current = null; return; }\n\n const pt = svgPt(e);\n if (!pt) return;\n\n if (tool === 'rect' && rectStart) {\n const x = Math.min(rectStart.x, pt.x);\n const y = Math.min(rectStart.y, pt.y);\n const w = Math.abs(pt.x - rectStart.x);\n const h = Math.abs(pt.y - rectStart.y);\n if (w >= GRID * 2 && h >= GRID * 2) {\n setRooms((prev) => [\n ...prev,\n { id: nextId('room'), name: `Room ${prev.length + 1}`, points: rectToPoints(x, y, w, h) },\n ]);\n }\n setRectStart(null); setRectCursor(null);\n }\n\n doorDragRef.current = null;\n dragRef.current = null;\n }\n\n // ─── Info bar handlers ────────────────────────────────────────────────────\n\n function handleRenameChange(value: string) {\n if (selectedId) setRooms((prev) => prev.map((r) => (r.id === selectedId ? { ...r, name: value } : r)));\n }\n\n function handleDoorWidthChange(doorId: string, value: string) {\n const w = parseFloat(value);\n if (isNaN(w) || w <= 0) return;\n setDoors((prev) => prev.map((d) => (d.id === doorId ? { ...d, width: w } : d)));\n }\n\n function handleDeleteRoom() {\n if (!selectedId) return;\n setRooms((prev) => prev.filter((r) => r.id !== selectedId));\n setDoors((prev) => prev.filter((d) => d.roomId !== selectedId));\n setEditingDoorsForRoomId(null);\n setSelectedId(null);\n }\n\n function handleDeleteDoor(doorId: string) {\n setDoors((prev) => prev.filter((d) => d.id !== doorId));\n }\n\n function switchTool(t: Tool) {\n setTool(t);\n setEditingDoorsForRoomId(null);\n setPolyPoints([]); setPolyCursor(null);\n setRectStart(null); setRectCursor(null);\n }\n\n function handleUploadChange(e: React.ChangeEvent<HTMLInputElement>) {\n const file = e.target.files?.[0];\n if (!file) return;\n e.target.value = '';\n const reader = new FileReader();\n reader.onload = (ev) => {\n const text = ev.target?.result;\n if (typeof text !== 'string') return;\n const loaded = parseSVGRooms(text);\n if (loaded.length === 0) return;\n const remapped = loaded.map((r) => ({ ...r, id: nextId('room') }));\n setRooms(remapped);\n setDoors([]);\n setSelectedId(null);\n setEditingDoorsForRoomId(null);\n setZoom(1);\n setPan({ x: 0, y: 0 });\n };\n reader.readAsText(file);\n }\n\n // ─── Derived values ───────────────────────────────────────────────────────\n\n const previewRect =\n tool === 'rect' && rectStart && rectCursor\n ? {\n x: Math.min(rectStart.x, rectCursor.x),\n y: Math.min(rectStart.y, rectCursor.y),\n w: Math.abs(rectCursor.x - rectStart.x),\n h: Math.abs(rectCursor.y - rectStart.y),\n }\n : null;\n\n const selectedRoom = selectedId ? (rooms.find((r) => r.id === selectedId) ?? null) : null;\n const editingRoom = editingDoorsForRoomId ? (rooms.find((r) => r.id === editingDoorsForRoomId) ?? null) : null;\n const editingRoomDoors = editingDoorsForRoomId ? doors.filter((d) => d.roomId === editingDoorsForRoomId) : [];\n\n const TOOLS = [\n { t: 'select' as Tool, icon: faHandPointer, label: 'Select & edit' },\n { t: 'rect' as Tool, icon: faSquare, label: 'Rectangle room' },\n { t: 'polygon' as Tool, icon: faDrawPolygon, label: 'Polygon room' },\n ] as const;\n\n const vw = CANVAS_W / zoom;\n const vh = CANVAS_H / zoom;\n\n const canvasCursor = editingDoorsForRoomId ? styles.roomDrawerCanvasDoor : tool === 'select' ? styles.roomDrawerCanvasSelect : undefined;\n\n // ─── Render ───────────────────────────────────────────────────────────────\n\n return (\n <div className={cx(styles.roomDrawer, className)}>\n {/* ── Toolbar ── */}\n <div className={styles.roomDrawerToolbar}>\n {TOOLS.map(({ t, icon, label }) => (\n <button\n key={t}\n title={label}\n className={cx(styles.roomDrawerToolbarBtn, t === tool && !editingDoorsForRoomId && styles.roomDrawerToolbarBtnActive)}\n onClick={() => switchTool(t)}\n >\n <FontAwesomeIcon icon={icon} />\n </button>\n ))}\n <div className={styles.roomDrawerToolbarSep} />\n <button title=\"Zoom in (+)\" className={styles.roomDrawerToolbarBtn} onClick={() => zoomBy(ZOOM_STEP)} disabled={zoom >= ZOOM_MAX}>\n <FontAwesomeIcon icon={faMagnifyingGlassPlus} />\n </button>\n <button\n title={`Reset zoom (0) — ${Math.round(zoom * 100)}%`}\n className={styles.roomDrawerToolbarZoomLabel}\n onClick={() => { setZoom(1); setPan({ x: 0, y: 0 }); }}\n >\n {Math.round(zoom * 100)}%\n </button>\n <button title=\"Zoom out (−)\" className={styles.roomDrawerToolbarBtn} onClick={() => zoomBy(1 / ZOOM_STEP)} disabled={zoom <= ZOOM_MIN}>\n <FontAwesomeIcon icon={faMagnifyingGlassMinus} />\n </button>\n <div className={styles.roomDrawerToolbarSep} />\n <button\n title=\"Upload SVG\"\n className={styles.roomDrawerToolbarBtn}\n onClick={() => uploadRef.current?.click()}\n >\n <FontAwesomeIcon icon={faUpload} />\n </button>\n <button\n title=\"Download SVG\"\n className={styles.roomDrawerToolbarBtn}\n onClick={() => downloadSVG(rooms, doors)}\n disabled={rooms.length === 0}\n >\n <FontAwesomeIcon icon={faDownload} />\n </button>\n <input ref={uploadRef} type=\"file\" accept=\".svg,image/svg+xml\" style={{ display: 'none' }} onChange={handleUploadChange} />\n </div>\n\n {/* ── SVG Canvas ── */}\n <svg\n ref={svgRef}\n className={cx(styles.roomDrawerCanvas, canvasCursor)}\n viewBox={`${pan.x} ${pan.y} ${vw} ${vh}`}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onDoubleClick={handleDoubleClick}\n >\n <defs>\n <pattern id=\"rd-grid\" width={GRID} height={GRID} patternUnits=\"userSpaceOnUse\">\n <path d={`M ${GRID} 0 L 0 0 0 ${GRID}`} fill=\"none\" className={styles.gridLine} />\n </pattern>\n </defs>\n <rect x={pan.x} y={pan.y} width={vw} height={vh} fill=\"url(#rd-grid)\" />\n\n {/* ── Rooms ── */}\n {rooms.map((room) => {\n const pts = room.points;\n const fillD = pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x},${p.y}`).join(' ') + ' Z';\n const wallSegs = buildWallSegments(pts, doors.filter((d) => d.roomId === room.id));\n const c = centroid(pts);\n const isSelected = selectedId === room.id;\n const isEditing = editingDoorsForRoomId === room.id;\n return (\n <g key={room.id}>\n <path d={fillD} className={cx(styles.roomFill, (isSelected || isEditing) && styles.roomFillSelected)} />\n {wallSegs.map((seg, si) => (\n <path key={si} d={seg} className={cx(styles.roomStroke, (isSelected || isEditing) && styles.roomStrokeSelected)} />\n ))}\n {room.name && (\n <text x={c.x} y={c.y} className={styles.roomText} textAnchor=\"middle\" dominantBaseline=\"middle\">\n {room.name}\n </text>\n )}\n </g>\n );\n })}\n\n {/* ── Door gap overlays — rendered after all rooms so they cut through adjacent walls ── */}\n {doors.map((door) => {\n const room = rooms.find((r) => r.id === door.roomId);\n if (!room) return null;\n const a = room.points[door.wallIndex];\n const b = room.points[(door.wallIndex + 1) % room.points.length];\n const ep = doorEndpoints(a, b, door.t, door.width);\n if (!ep) return null;\n return (\n <line\n key={door.id}\n x1={ep.p1.x} y1={ep.p1.y}\n x2={ep.p2.x} y2={ep.p2.y}\n className={styles.doorGap}\n />\n );\n })}\n\n {/* ── Door markers (visible in door editing mode) ── */}\n {editingDoorsForRoomId && editingRoomDoors.map((door) => {\n const room = rooms.find((r) => r.id === door.roomId);\n if (!room) return null;\n const a = room.points[door.wallIndex];\n const b = room.points[(door.wallIndex + 1) % room.points.length];\n const ep = doorEndpoints(a, b, door.t, door.width);\n if (!ep) return null;\n const mid = { x: (ep.p1.x + ep.p2.x) / 2, y: (ep.p1.y + ep.p2.y) / 2 };\n return (\n <circle\n key={door.id}\n cx={mid.x} cy={mid.y} r={2.5}\n className={styles.doorMarker}\n onMouseDown={(e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n doorDragRef.current = door.id;\n }}\n />\n );\n })}\n\n {/* ── Vertex handles ── */}\n {tool === 'select' && !editingDoorsForRoomId && selectedRoom &&\n selectedRoom.points.map((p, i) => (\n <circle key={i} cx={p.x} cy={p.y} r={3.5} className={styles.vertexHandle} />\n ))}\n\n {/* ── Rect preview ── */}\n {previewRect && (\n <rect x={previewRect.x} y={previewRect.y} width={previewRect.w} height={previewRect.h} className={styles.preview} />\n )}\n\n {/* ── Polygon preview ── */}\n {tool === 'polygon' && polyPoints.length > 0 && (\n <>\n <polyline\n points={[...polyPoints, polyCursor ?? polyPoints[polyPoints.length - 1]].map((p) => `${p.x},${p.y}`).join(' ')}\n className={styles.preview}\n />\n {polyPoints.length >= 3 && (\n <circle cx={polyPoints[0].x} cy={polyPoints[0].y} r={CLOSE_THRESHOLD / 2} className={styles.polyCloseTarget} />\n )}\n {polyPoints.map((p, i) => (\n <circle key={i} cx={p.x} cy={p.y} r={2} className={styles.polyVertex} />\n ))}\n </>\n )}\n </svg>\n\n {/* ── Room info bar ── */}\n {selectedRoom && !editingDoorsForRoomId && (\n <div className={styles.roomDrawerInfo}>\n <span className={styles.roomDrawerInfoLabel}>Name</span>\n <input\n className={styles.roomDrawerInfoInput}\n value={selectedRoom.name}\n onChange={(e) => handleRenameChange(e.target.value)}\n placeholder=\"Room name\"\n />\n <button\n className={styles.roomDrawerInfoDoorsBtn}\n onClick={() => setEditingDoorsForRoomId(selectedRoom.id)}\n title=\"Edit doors\"\n >\n <FontAwesomeIcon icon={faDoorOpen} />\n <span>{doors.filter((d) => d.roomId === selectedRoom.id).length}</span>\n </button>\n <button className={styles.roomDrawerInfoDelete} onClick={handleDeleteRoom} title=\"Delete room\">\n <FontAwesomeIcon icon={faTrash} />\n </button>\n </div>\n )}\n\n {/* ── Door editing panel ── */}\n {editingDoorsForRoomId && editingRoom && (\n <div className={styles.roomDrawerDoorPanel}>\n <div className={styles.roomDrawerDoorPanelHeader}>\n <FontAwesomeIcon icon={faDoorOpen} className={styles.roomDrawerDoorPanelIcon} />\n <span className={styles.roomDrawerDoorPanelTitle}>\n {editingRoom.name ? `Doors · ${editingRoom.name}` : 'Doors'}\n </span>\n <button\n className={styles.roomDrawerDoorPanelDone}\n onClick={() => setEditingDoorsForRoomId(null)}\n title=\"Done (Esc)\"\n >\n <FontAwesomeIcon icon={faCheck} />\n Done\n </button>\n </div>\n <div className={styles.roomDrawerDoorPanelList}>\n {editingRoomDoors.length === 0 && (\n <span className={styles.roomDrawerDoorPanelEmpty}>Click on a wall to add a door</span>\n )}\n {editingRoomDoors.map((door, i) => (\n <div key={door.id} className={styles.roomDrawerDoorPanelItem}>\n <span className={styles.roomDrawerDoorPanelLabel}>Door {i + 1}</span>\n <span className={styles.roomDrawerDoorPanelWidthLabel}>Width</span>\n <input\n className={styles.roomDrawerInfoInput}\n type=\"number\"\n min={1}\n value={door.width}\n onChange={(e) => handleDoorWidthChange(door.id, e.target.value)}\n />\n <button\n className={styles.roomDrawerInfoDelete}\n onClick={() => handleDeleteDoor(door.id)}\n title=\"Delete door\"\n >\n <FontAwesomeIcon icon={faTrash} />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n <div className={styles.roomDrawerHint}>\n {editingDoorsForRoomId\n ? 'Click a wall to add a door · Adjust width or delete from the list · Done or Esc to finish'\n : `${TOOL_HINTS[tool]} · Scroll to zoom · Middle-drag to pan · 0 to reset`}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var e={roomDrawer:`roomDrawer_SJj4-`,"roomDrawer-toolbar":`roomDrawer-toolbar_55H5p`,roomDrawerToolbar:`roomDrawer-toolbar_55H5p`,"roomDrawer-toolbar-sep":`roomDrawer-toolbar-sep_nJeh8`,roomDrawerToolbarSep:`roomDrawer-toolbar-sep_nJeh8`,"roomDrawer-toolbar-btn":`roomDrawer-toolbar-btn_2qinY`,roomDrawerToolbarBtn:`roomDrawer-toolbar-btn_2qinY`,"roomDrawer-toolbar-btn-active":`roomDrawer-toolbar-btn-active_4XX25`,roomDrawerToolbarBtnActive:`roomDrawer-toolbar-btn-active_4XX25`,"roomDrawer-toolbar-zoomLabel":`roomDrawer-toolbar-zoomLabel_HMkb5`,roomDrawerToolbarZoomLabel:`roomDrawer-toolbar-zoomLabel_HMkb5`,"roomDrawer-canvas":`roomDrawer-canvas_Y18uD`,roomDrawerCanvas:`roomDrawer-canvas_Y18uD`,"roomDrawer-canvas-select":`roomDrawer-canvas-select_M43-x`,roomDrawerCanvasSelect:`roomDrawer-canvas-select_M43-x`,"roomDrawer-info":`roomDrawer-info_qwC6L`,roomDrawerInfo:`roomDrawer-info_qwC6L`,"roomDrawer-info-label":`roomDrawer-info-label_8I9hB`,roomDrawerInfoLabel:`roomDrawer-info-label_8I9hB`,"roomDrawer-info-input":`roomDrawer-info-input_YAl-K`,roomDrawerInfoInput:`roomDrawer-info-input_YAl-K`,"roomDrawer-info-spacer":`roomDrawer-info-spacer_cOj96`,roomDrawerInfoSpacer:`roomDrawer-info-spacer_cOj96`,"roomDrawer-info-delete":`roomDrawer-info-delete_TSBUN`,roomDrawerInfoDelete:`roomDrawer-info-delete_TSBUN`,"roomDrawer-hint":`roomDrawer-hint_3WTFa`,roomDrawerHint:`roomDrawer-hint_3WTFa`,"roomDrawer-info-doorsBtn":`roomDrawer-info-doorsBtn_oK5Uf`,roomDrawerInfoDoorsBtn:`roomDrawer-info-doorsBtn_oK5Uf`,"roomDrawer-doorPanel":`roomDrawer-doorPanel_e-Tl9`,roomDrawerDoorPanel:`roomDrawer-doorPanel_e-Tl9`,"roomDrawer-doorPanel-header":`roomDrawer-doorPanel-header_--iXz`,roomDrawerDoorPanelHeader:`roomDrawer-doorPanel-header_--iXz`,"roomDrawer-doorPanel-icon":`roomDrawer-doorPanel-icon_KxaVY`,roomDrawerDoorPanelIcon:`roomDrawer-doorPanel-icon_KxaVY`,"roomDrawer-doorPanel-title":`roomDrawer-doorPanel-title_8nOZS`,roomDrawerDoorPanelTitle:`roomDrawer-doorPanel-title_8nOZS`,"roomDrawer-doorPanel-done":`roomDrawer-doorPanel-done_ejQkx`,roomDrawerDoorPanelDone:`roomDrawer-doorPanel-done_ejQkx`,"roomDrawer-doorPanel-list":`roomDrawer-doorPanel-list_rDou7`,roomDrawerDoorPanelList:`roomDrawer-doorPanel-list_rDou7`,"roomDrawer-doorPanel-item":`roomDrawer-doorPanel-item_U-3-B`,roomDrawerDoorPanelItem:`roomDrawer-doorPanel-item_U-3-B`,"roomDrawer-doorPanel-label":`roomDrawer-doorPanel-label_qSYqY`,roomDrawerDoorPanelLabel:`roomDrawer-doorPanel-label_qSYqY`,"roomDrawer-doorPanel-widthLabel":`roomDrawer-doorPanel-widthLabel_jXv7D`,roomDrawerDoorPanelWidthLabel:`roomDrawer-doorPanel-widthLabel_jXv7D`,"roomDrawer-doorPanel-empty":`roomDrawer-doorPanel-empty_LcDw0`,roomDrawerDoorPanelEmpty:`roomDrawer-doorPanel-empty_LcDw0`,"roomDrawer-canvas-door":`roomDrawer-canvas-door_qzCIa`,roomDrawerCanvasDoor:`roomDrawer-canvas-door_qzCIa`,doorGap:`doorGap_KrIuB`,doorMarker:`doorMarker_-N63z`,gridLine:`gridLine_V-rxw`,roomFill:`roomFill_JnJ0J`,"roomFill-selected":`roomFill-selected_IfIRr`,roomFillSelected:`roomFill-selected_IfIRr`,roomStroke:`roomStroke_S18UH`,"roomStroke-selected":`roomStroke-selected_fm19u`,roomStrokeSelected:`roomStroke-selected_fm19u`,roomText:`roomText_6fIeU`,doorPanel:`doorPanel_raCv0`,"doorPanel-selected":`doorPanel-selected_5DG7g`,doorPanelSelected:`doorPanel-selected_5DG7g`,doorSwing:`doorSwing_Tbt9D`,"doorSwing-selected":`doorSwing-selected_fFte5`,doorSwingSelected:`doorSwing-selected_fFte5`,preview:`preview_seIZY`,polyCloseTarget:`polyCloseTarget_snjYx`,polyVertex:`polyVertex_fw0nX`,vertexHandle:`vertexHandle_-z7g5`};export{e as default};
2
+ //# sourceMappingURL=roomDrawer.module.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roomDrawer.module.mjs","names":[],"sources":["../../../../package/common/roomDrawer/roomDrawer.module.pcss"],"sourcesContent":[".roomDrawer {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n overflow: hidden;\n background: var(--background);\n user-select: none;\n\n &-toolbar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 8px;\n background: var(--background-accent);\n border-bottom: 1px solid var(--border-color);\n\n &-sep {\n flex: 1;\n }\n\n &-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid transparent;\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 13px;\n transition: background 0.12s, color 0.12s;\n\n &:hover:not(:disabled) {\n background: var(--background-accent-light);\n color: var(--text-color);\n }\n\n &:disabled {\n opacity: 0.35;\n cursor: not-allowed;\n }\n\n &-active {\n background: var(--primary-accent);\n color: var(--primary-color);\n border-color: var(--primary-lighter);\n }\n }\n\n &-zoomLabel {\n padding: 0 4px;\n min-width: 40px;\n height: 32px;\n border: 1px solid transparent;\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 11px;\n text-align: center;\n\n &:hover {\n background: var(--background-accent-light);\n color: var(--text-color);\n }\n }\n }\n\n &-canvas {\n display: block;\n width: 100%;\n cursor: crosshair;\n user-select: none;\n\n &-select {\n cursor: default;\n }\n }\n\n &-info {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n background: var(--background-accent);\n border-top: 1px solid var(--border-color);\n\n &-label {\n font-size: 12px;\n color: var(--text-dark);\n white-space: nowrap;\n }\n\n &-input {\n flex: 1;\n max-width: 220px;\n height: 28px;\n padding: 0 8px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: var(--background);\n color: var(--text-color);\n font-size: 13px;\n\n &:focus {\n outline: none;\n border-color: var(--primary-color);\n }\n }\n\n &-spacer {\n flex: 1;\n }\n\n &-delete {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 12px;\n transition: background 0.12s, color 0.12s, border-color 0.12s;\n\n &:hover {\n background: #e53935;\n color: #fff;\n border-color: #e53935;\n }\n }\n }\n\n &-hint {\n padding: 4px 8px;\n font-size: 11px;\n color: var(--text-dark);\n background: var(--background-accent);\n border-top: 1px solid var(--border-color);\n }\n\n &-info {\n &-doorsBtn {\n display: flex;\n align-items: center;\n gap: 5px;\n height: 28px;\n padding: 0 8px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 12px;\n white-space: nowrap;\n transition: background 0.12s, color 0.12s;\n\n &:hover {\n background: var(--background-accent-light);\n color: var(--text-color);\n }\n }\n }\n\n &-doorPanel {\n display: flex;\n flex-direction: column;\n background: var(--background-accent);\n border-top: 1px solid var(--border-color);\n\n &-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 6px 8px;\n border-bottom: 1px solid var(--border-color);\n }\n\n &-icon {\n color: var(--text-dark);\n font-size: 12px;\n }\n\n &-title {\n flex: 1;\n font-size: 12px;\n color: var(--text-dark);\n }\n\n &-done {\n display: flex;\n align-items: center;\n gap: 5px;\n height: 26px;\n padding: 0 10px;\n border: 1px solid var(--border-color);\n border-radius: var(--default-border-radius);\n background: transparent;\n color: var(--text-dark);\n cursor: pointer;\n font-size: 12px;\n transition: background 0.12s, color 0.12s;\n\n &:hover {\n background: var(--primary-accent);\n color: var(--primary-color);\n border-color: var(--primary-lighter);\n }\n }\n\n &-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 6px 8px;\n max-height: 130px;\n overflow-y: auto;\n }\n\n &-item {\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n &-label {\n font-size: 12px;\n color: var(--text-color);\n min-width: 48px;\n }\n\n &-widthLabel {\n font-size: 11px;\n color: var(--text-dark);\n }\n\n &-empty {\n font-size: 11px;\n color: var(--text-dark);\n font-style: italic;\n padding: 2px 0;\n }\n }\n\n &-canvas {\n &-door {\n cursor: crosshair;\n }\n }\n}\n\n/* ── SVG element classes ── */\n\n.doorGap {\n stroke: var(--background);\n stroke-width: 4;\n stroke-linecap: butt;\n pointer-events: none;\n}\n\n.doorMarker {\n fill: var(--primary-color);\n stroke: var(--background);\n stroke-width: 0.8;\n pointer-events: all;\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n}\n\n.gridLine {\n stroke: var(--text-color);\n stroke-width: 0.3;\n opacity: 0.12;\n}\n\n.roomFill {\n fill: var(--primary-accent);\n fill-opacity: 0.08;\n stroke: none;\n\n &-selected {\n fill-opacity: 0.22;\n }\n}\n\n.roomStroke {\n fill: none;\n stroke: var(--primary-color);\n stroke-width: 1.5;\n stroke-linejoin: round;\n\n &-selected {\n stroke: var(--primary-lighter);\n stroke-width: 2;\n }\n}\n\n.roomText {\n fill: var(--text-color);\n stroke: none;\n font-size: 7px;\n pointer-events: none;\n user-select: none;\n}\n\n.doorPanel {\n stroke: var(--primary-color);\n stroke-width: 1.5;\n stroke-linecap: round;\n\n &-selected {\n stroke: var(--primary-lighter);\n stroke-width: 2;\n }\n}\n\n.doorSwing {\n fill: none;\n stroke: var(--primary-color);\n stroke-width: 0.8;\n stroke-dasharray: 3 2;\n pointer-events: none;\n\n &-selected {\n stroke: var(--primary-lighter);\n }\n}\n\n.preview {\n fill: var(--primary-accent);\n stroke: var(--primary-color);\n stroke-width: 1;\n stroke-dasharray: 4 2;\n pointer-events: none;\n}\n\n.polyCloseTarget {\n fill: var(--primary-color);\n opacity: 0.5;\n pointer-events: none;\n}\n\n.polyVertex {\n fill: var(--primary-color);\n stroke: none;\n pointer-events: none;\n}\n\n.vertexHandle {\n fill: var(--background);\n stroke: var(--primary-color);\n stroke-width: 1.5;\n cursor: grab;\n pointer-events: all;\n\n &:hover {\n fill: var(--primary-accent);\n stroke: var(--primary-lighter);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,6 @@
1
+ function e(e){return Math.round(e/5)*5}function t(t){return{x:e(t.x),y:e(t.y)}}function n(e,n,r){let i=r.createSVGPoint();i.x=e,i.y=n;let a=r.getScreenCTM();if(!a)return{x:0,y:0};let o=i.matrixTransform(a.inverse());return t({x:o.x,y:o.y})}function r(e,t){return Math.sqrt((e.x-t.x)**2+(e.y-t.y)**2)}function i(e,t,n){let i=n.x-t.x,a=n.y-t.y,o=i*i+a*a;if(o===0)return{dist:r(e,t),t:0};let s=Math.max(0,Math.min(1,((e.x-t.x)*i+(e.y-t.y)*a)/o)),c=t.x+s*i,l=t.y+s*a;return{dist:Math.sqrt((e.x-c)**2+(e.y-l)**2),t:s}}function a(e,t){let n=null;for(let r of t){let t=r.points;for(let a=0;a<t.length;a++){let o=t[a],s=t[(a+1)%t.length],{dist:c,t:l}=i(e,o,s);c<=8&&(!n||c<n.dist)&&(n={roomId:r.id,wallIndex:a,t:l,dist:c})}}return n}function o(e,t){let n=!1;for(let r=0,i=t.length-1;r<t.length;i=r++){let a=t[r].x,o=t[r].y,s=t[i].x,c=t[i].y;o>e.y!=c>e.y&&e.x<(s-a)*(e.y-o)/(c-o)+a&&(n=!n)}return n}function s(e){return{x:e.reduce((e,t)=>e+t.x,0)/e.length,y:e.reduce((e,t)=>e+t.y,0)/e.length}}function c(e,t,n,r){return[{x:e,y:t},{x:e+n,y:t},{x:e+n,y:t+r},{x:e,y:t+r}]}function l(e,t,n,r){let i=t.x-e.x,a=t.y-e.y,o=Math.sqrt(i*i+a*a);if(o<.001)return null;let s=i/o,c=a/o,l=e.x+i*n,u=e.y+a*n,d=Math.min(r/2,o/2-.001);return{p1:{x:l-s*d,y:u-c*d},p2:{x:l+s*d,y:u+c*d},perp:{x:-c,y:s}}}function u(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}function d(e){return e.map((e,t)=>`${t===0?`M`:`L`} ${e.x.toFixed(2)},${e.y.toFixed(2)}`).join(` `)+` Z`}function f(e,t){if(e.length<2)return[];if(t.length===0)return[e.map((e,t)=>`${t===0?`M`:`L`} ${e.x.toFixed(2)},${e.y.toFixed(2)}`).join(` `)+` Z`];let n=e.length,r=[],i=[`M ${e[0].x.toFixed(2)},${e[0].y.toFixed(2)}`];for(let a=0;a<n;a++){let o=e[a],s=e[(a+1)%n],c=s.x-o.x,l=s.y-o.y,u=Math.sqrt(c*c+l*l),d=t.filter(e=>e.wallIndex===a).sort((e,t)=>e.t-t.t);if(d.length===0)i.push(`L ${s.x.toFixed(2)},${s.y.toFixed(2)}`);else{for(let e of d){let t=e.width/2,n=Math.max(0,e.t-t/u),a=Math.min(1,e.t+t/u),s={x:o.x+c*n,y:o.y+l*n},d={x:o.x+c*a,y:o.y+l*a};i.push(`L ${s.x.toFixed(2)},${s.y.toFixed(2)}`),r.push(i),i=[`M ${d.x.toFixed(2)},${d.y.toFixed(2)}`]}i.push(`L ${s.x.toFixed(2)},${s.y.toFixed(2)}`)}}return r[0]=[...i,...r[0].slice(1)],r.map(e=>e.join(` `))}function p(e,t,n){let r=l(e,t,n.t,n.width);if(!r)return``;let{p1:i,p2:a,perp:o}=r,s={x:i.x+o.x*n.width,y:i.y+o.y*n.width};return[`M ${i.x.toFixed(2)},${i.y.toFixed(2)} L ${a.x.toFixed(2)},${a.y.toFixed(2)}`,`M ${i.x.toFixed(2)},${i.y.toFixed(2)} A ${n.width},${n.width} 0 0,1 ${s.x.toFixed(2)},${s.y.toFixed(2)}`].join(` `)}function m(e,t){let n=1/0,r=1/0,i=-1/0,a=-1/0;for(let t of e)for(let e of t.points)e.x<n&&(n=e.x),e.y<r&&(r=e.y),e.x>i&&(i=e.x),e.y>a&&(a=e.y);isFinite(n)||(n=0,r=0,i=400,a=300);let o=[(n-5).toFixed(2),(r-5).toFixed(2),(i-n+10).toFixed(2),(a-r+10).toFixed(2)].join(` `),c=e.map(e=>{let n=t.filter(t=>t.roomId===e.id),r=f(e.points,n),i=d(e.points),a=s(e.points),o=r.map(e=>` <path d="${e}" />`).join(`
2
+ `),c=n.map(t=>{let n=e.points[t.wallIndex],r=e.points[(t.wallIndex+1)%e.points.length],i=p(n,r,t);return i?` <path d="${i}" fill="none" />`:``}).filter(Boolean).join(`
3
+ `),l=e.name?` <text fontSize="5" x="${a.x.toFixed(1)}" y="${a.y.toFixed(1)}">${u(e.name)}</text>`:``;return[` <g id="${e.id}">`,o,` <path id="background" d="${i}" />`,c,l,` </g>`].filter(Boolean).join(`
4
+ `)});return[`<svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="${o}">`,` <g id="layer1">`,...c,` </g>`,` <use id="use" href="" />`,`</svg>`].join(`
5
+ `)}function h(e){let t=[];for(let n of e.matchAll(/[ML]\s*([-\d.]+)[,\s]+([-\d.]+)/gi))t.push({x:parseFloat(n[1]),y:parseFloat(n[2])});return t}function g(e){let t=new DOMParser().parseFromString(e,`image/svg+xml`),n=[];return t.querySelectorAll(`[id^="room"]`).forEach(e=>{let t=e.querySelector(`[id="background"]`);if(!t)return;let r=t.getAttribute(`d`);if(!r)return;let i=h(r);if(i.length<3)return;let a=e.querySelector(`text`)?.textContent?.trim()??``;n.push({id:e.id,name:a,points:i})}),n}function _(e,t){let n=m(e,t),r=new Blob([n],{type:`image/svg+xml`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=`room-plan.svg`,a.click(),URL.revokeObjectURL(i)}export{f as buildWallSegments,s as centroid,n as clientToSVG,r as dist,l as doorEndpoints,_ as downloadSVG,a as nearestWall,g as parseSVGRooms,o as pointInPolygon,i as pointToSegment,c as rectToPoints,t as snapPt};
6
+ //# sourceMappingURL=roomDrawer.utils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roomDrawer.utils.mjs","names":[],"sources":["../../../../package/common/roomDrawer/roomDrawer.utils.ts"],"sourcesContent":["import type { Point, RoomData, DoorData } from './roomDrawer.types';\n\nexport const CANVAS_W = 400;\nexport const CANVAS_H = 300;\nexport const GRID = 5;\nexport const DOOR_WIDTH = 12;\nexport const CLOSE_THRESHOLD = 8; // px in SVG units to close a polygon\nexport const WALL_TOLERANCE = 8; // max distance to snap to a wall for door placement\n\n// ─── Coordinate helpers ────────────────────────────────────────────────────\n\nexport function snap(v: number): number {\n return Math.round(v / GRID) * GRID;\n}\n\nexport function snapPt(p: Point): Point {\n return { x: snap(p.x), y: snap(p.y) };\n}\n\nexport function clientToSVG(clientX: number, clientY: number, svg: SVGSVGElement): Point {\n const pt = svg.createSVGPoint();\n pt.x = clientX;\n pt.y = clientY;\n const m = svg.getScreenCTM();\n if (!m) return { x: 0, y: 0 };\n const raw = pt.matrixTransform(m.inverse());\n return snapPt({ x: raw.x, y: raw.y });\n}\n\n// ─── Geometry ──────────────────────────────────────────────────────────────\n\nexport function dist(a: Point, b: Point): number {\n return Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2);\n}\n\nexport function pointToSegment(p: Point, a: Point, b: Point): { dist: number; t: number } {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len2 = dx * dx + dy * dy;\n if (len2 === 0) return { dist: dist(p, a), t: 0 };\n const t = Math.max(0, Math.min(1, ((p.x - a.x) * dx + (p.y - a.y) * dy) / len2));\n const px = a.x + t * dx;\n const py = a.y + t * dy;\n return { dist: Math.sqrt((p.x - px) ** 2 + (p.y - py) ** 2), t };\n}\n\nexport function nearestWall(pt: Point, rooms: RoomData[]): { roomId: string; wallIndex: number; t: number } | null {\n let best: { roomId: string; wallIndex: number; t: number; dist: number } | null = null;\n for (const room of rooms) {\n const pts = room.points;\n for (let i = 0; i < pts.length; i++) {\n const a = pts[i];\n const b = pts[(i + 1) % pts.length];\n const { dist: d, t } = pointToSegment(pt, a, b);\n if (d <= WALL_TOLERANCE && (!best || d < best.dist)) {\n best = { roomId: room.id, wallIndex: i, t, dist: d };\n }\n }\n }\n return best;\n}\n\nexport function pointInPolygon(pt: Point, poly: Point[]): boolean {\n let inside = false;\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const xi = poly[i].x, yi = poly[i].y;\n const xj = poly[j].x, yj = poly[j].y;\n if ((yi > pt.y) !== (yj > pt.y) && pt.x < ((xj - xi) * (pt.y - yi)) / (yj - yi) + xi) {\n inside = !inside;\n }\n }\n return inside;\n}\n\nexport function centroid(pts: Point[]): Point {\n return {\n x: pts.reduce((s, p) => s + p.x, 0) / pts.length,\n y: pts.reduce((s, p) => s + p.y, 0) / pts.length,\n };\n}\n\nexport function rectToPoints(x: number, y: number, w: number, h: number): Point[] {\n return [\n { x, y },\n { x: x + w, y },\n { x: x + w, y: y + h },\n { x, y: y + h },\n ];\n}\n\n// Returns the two endpoints of the door opening and a perpendicular unit vector (for the swing arc).\nexport function doorEndpoints(\n a: Point,\n b: Point,\n t: number,\n width: number,\n): { p1: Point; p2: Point; perp: Point } | null {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 0.001) return null;\n const nx = dx / len;\n const ny = dy / len;\n const cx = a.x + dx * t;\n const cy = a.y + dy * t;\n const hw = Math.min(width / 2, len / 2 - 0.001);\n return {\n p1: { x: cx - nx * hw, y: cy - ny * hw },\n p2: { x: cx + nx * hw, y: cy + ny * hw },\n perp: { x: -ny, y: nx },\n };\n}\n\n// ─── SVG export ────────────────────────────────────────────────────────────\n\nfunction escapeSVG(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\nfunction ptsToClosedPath(pts: Point[]): string {\n return pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x.toFixed(2)},${p.y.toFixed(2)}`).join(' ') + ' Z';\n}\n\n// Returns one path string per wall segment between door gaps.\n// 0 doors → [closed path] | N doors → N open paths\nexport function buildWallSegments(pts: Point[], wallDoors: DoorData[]): string[] {\n if (pts.length < 2) return [];\n\n if (wallDoors.length === 0) {\n return [pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x.toFixed(2)},${p.y.toFixed(2)}`).join(' ') + ' Z'];\n }\n\n const n = pts.length;\n const segments: string[][] = [];\n let current: string[] = [`M ${pts[0].x.toFixed(2)},${pts[0].y.toFixed(2)}`];\n\n for (let i = 0; i < n; i++) {\n const a = pts[i];\n const b = pts[(i + 1) % n];\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.sqrt(dx * dx + dy * dy);\n const segs = wallDoors.filter((d) => d.wallIndex === i).sort((x, y) => x.t - y.t);\n\n if (segs.length === 0) {\n current.push(`L ${b.x.toFixed(2)},${b.y.toFixed(2)}`);\n } else {\n for (const door of segs) {\n const hw = door.width / 2;\n const t1 = Math.max(0, door.t - hw / len);\n const t2 = Math.min(1, door.t + hw / len);\n const gs = { x: a.x + dx * t1, y: a.y + dy * t1 };\n const ge = { x: a.x + dx * t2, y: a.y + dy * t2 };\n current.push(`L ${gs.x.toFixed(2)},${gs.y.toFixed(2)}`);\n segments.push(current);\n current = [`M ${ge.x.toFixed(2)},${ge.y.toFixed(2)}`];\n }\n current.push(`L ${b.x.toFixed(2)},${b.y.toFixed(2)}`);\n }\n }\n\n // Wrap-around: the last segment ends at pts[0] where segments[0] started —\n // merge them so each segment is one continuous open path.\n segments[0] = [...current, ...segments[0].slice(1)];\n\n return segments.map((s) => s.join(' '));\n}\n\nfunction buildDoorArcPath(a: Point, b: Point, door: DoorData): string {\n const ep = doorEndpoints(a, b, door.t, door.width);\n if (!ep) return '';\n const { p1, p2, perp } = ep;\n const swingEnd = { x: p1.x + perp.x * door.width, y: p1.y + perp.y * door.width };\n return [\n `M ${p1.x.toFixed(2)},${p1.y.toFixed(2)} L ${p2.x.toFixed(2)},${p2.y.toFixed(2)}`,\n `M ${p1.x.toFixed(2)},${p1.y.toFixed(2)} A ${door.width},${door.width} 0 0,1 ${swingEnd.x.toFixed(2)},${swingEnd.y.toFixed(2)}`,\n ].join(' ');\n}\n\nexport function generateSVG(rooms: RoomData[], doors: DoorData[]): string {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const r of rooms) {\n for (const p of r.points) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n }\n if (!isFinite(minX)) { minX = 0; minY = 0; maxX = CANVAS_W; maxY = CANVAS_H; }\n\n const pad = 5;\n const vb = [\n (minX - pad).toFixed(2),\n (minY - pad).toFixed(2),\n (maxX - minX + pad * 2).toFixed(2),\n (maxY - minY + pad * 2).toFixed(2),\n ].join(' ');\n\n const roomEls = rooms.map((room) => {\n const roomDoors = doors.filter((d) => d.roomId === room.id);\n const wallSegs = buildWallSegments(room.points, roomDoors);\n const bgPath = ptsToClosedPath(room.points);\n const c = centroid(room.points);\n\n const wallPaths = wallSegs.map((d) => ` <path d=\"${d}\" />`).join('\\n');\n\n const doorPaths = roomDoors\n .map((door) => {\n const a = room.points[door.wallIndex];\n const b = room.points[(door.wallIndex + 1) % room.points.length];\n const d = buildDoorArcPath(a, b, door);\n return d ? ` <path d=\"${d}\" fill=\"none\" />` : '';\n })\n .filter(Boolean)\n .join('\\n');\n\n const labelEl = room.name\n ? ` <text fontSize=\"5\" x=\"${c.x.toFixed(1)}\" y=\"${c.y.toFixed(1)}\">${escapeSVG(room.name)}</text>`\n : '';\n\n return [` <g id=\"${room.id}\">`, wallPaths, ` <path id=\"background\" d=\"${bgPath}\" />`, doorPaths, labelEl, ` </g>`]\n .filter(Boolean)\n .join('\\n');\n });\n\n return [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" viewBox=\"${vb}\">`,\n ` <g id=\"layer1\">`,\n ...roomEls,\n ` </g>`,\n ` <use id=\"use\" href=\"\" />`,\n `</svg>`,\n ].join('\\n');\n}\n\n// ─── SVG import ────────────────────────────────────────────────────────────\n\nfunction parseClosedPath(d: string): Point[] {\n const points: Point[] = [];\n for (const m of d.matchAll(/[ML]\\s*([-\\d.]+)[,\\s]+([-\\d.]+)/gi)) {\n points.push({ x: parseFloat(m[1]), y: parseFloat(m[2]) });\n }\n return points;\n}\n\nexport function parseSVGRooms(svgString: string): RoomData[] {\n const doc = new DOMParser().parseFromString(svgString, 'image/svg+xml');\n const rooms: RoomData[] = [];\n doc.querySelectorAll('[id^=\"room\"]').forEach((group) => {\n const bg = group.querySelector('[id=\"background\"]');\n if (!bg) return;\n const d = bg.getAttribute('d');\n if (!d) return;\n const points = parseClosedPath(d);\n if (points.length < 3) return;\n const name = group.querySelector('text')?.textContent?.trim() ?? '';\n rooms.push({ id: group.id, name, points });\n });\n return rooms;\n}\n\nexport function downloadSVG(rooms: RoomData[], doors: DoorData[]): void {\n const svg = generateSVG(rooms, doors);\n const blob = new Blob([svg], { type: 'image/svg+xml' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'room-plan.svg';\n a.click();\n URL.revokeObjectURL(url);\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import e from"./roomViewer.module.mjs";import{useEffect as t,useRef as n,useState as r}from"react";import i from"classnames";import{FontAwesomeIcon as a}from"@fortawesome/react-fontawesome";import{faChevronLeft as o,faChevronRight as s,faLayerGroup as c}from"@fortawesome/free-solid-svg-icons";import{jsx as l,jsxs as u}from"react/jsx-runtime";function d({data:d=[]}){let f=n(null),[,p]=r(null),[m,h]=r(0),[g,_]=r(!0);t(()=>{let e=new AbortController;p(null);let t=f.current;return m>d.length-1||!t?(_(!1),()=>e.abort()):(t.querySelectorAll(`[id^="room"]`).forEach(n=>{n.addEventListener(`click`,()=>v(n.id,t),{signal:e.signal})}),_(!1),()=>e.abort())},[d,m]);function v(t,n){let r=t.substring(4);p(i=>{if(r===i)return i;let[a]=n.querySelectorAll(`[id="use"]`);a?.setAttribute(`href`,`#${t}`);let[o]=n.querySelectorAll(`[id="${t}"]`);if(i){let[t]=n.querySelectorAll(`[id="room${i}"]`);if(t){t.classList.remove(e.roomViewerSelected,e.roomViewerTint);let[n]=t.querySelectorAll(`[id="background"]`);n&&n.classList.remove(e.roomViewerTint)}}if(o){o.classList.add(e.roomViewerSelected);let[t]=o.querySelectorAll(`[id="background"]`);(t??o).classList.add(e.roomViewerTint)}return r})}function y(e){h(t=>{let n=t+e;return n<0||n>d.length-1?t:n})}let b=d[m]?.data??null;return u(`div`,{className:e.roomViewer,ref:f,children:[l(`h3`,{className:e.roomViewerHeader,children:d[m]?.label??``}),l(`div`,{className:i(e.roomViewerContainer,g&&e.roomViewerContainerLoading),children:b},m),d.length>1&&u(`div`,{className:e.roomViewerActions,children:[l(a,{icon:o,onClick:()=>y(-1)}),l(a,{icon:c}),l(a,{icon:s,onClick:()=>y(1)})]})]})}export{d as default};
2
+ //# sourceMappingURL=roomViewer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roomViewer.mjs","names":[],"sources":["../../../../package/common/roomViewer/roomViewer.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef } from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\nimport {\n faChevronLeft as leftIcon,\n faChevronRight as rightIcon,\n faLayerGroup as layerIcon,\n} from '@fortawesome/free-solid-svg-icons';\n\nimport styles from './roomViewer.module.pcss';\nimport type { RoomViewerProps } from './roomViewer.types';\n\nfunction RoomViewer({ data = [] }: RoomViewerProps) {\n const roomViewerRef = useRef<HTMLDivElement>(null);\n\n const [, setSelectedRoomId] = useState<string | null>(null);\n const [selectedDataId, setSelectedDataId] = useState(0);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const abortController = new AbortController();\n\n setSelectedRoomId(null);\n\n const container = roomViewerRef.current;\n\n if (selectedDataId > data.length - 1 || !container) {\n setIsLoading(false);\n return () => abortController.abort();\n }\n\n // useEffect fires after the DOM has been committed, so the SVG rendered\n // from data[selectedDataId].data is already in the container here.\n const rooms = container.querySelectorAll<Element>('[id^=\"room\"]');\n rooms.forEach((element) => {\n element.addEventListener(\n 'click',\n () => onRoomClicked(element.id, container),\n { signal: abortController.signal }\n );\n });\n setIsLoading(false);\n\n return () => abortController.abort();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [data, selectedDataId]);\n\n function onRoomClicked(roomId: string, container: Element) {\n const pureRoomId = roomId.substring(4);\n\n setSelectedRoomId((prevSelectedRoomId) => {\n if (pureRoomId === prevSelectedRoomId) return prevSelectedRoomId;\n\n const [use] = container.querySelectorAll<Element>('[id=\"use\"]');\n use?.setAttribute('href', `#${roomId}`);\n\n const [room] = container.querySelectorAll<Element>(`[id=\"${roomId}\"]`);\n\n if (prevSelectedRoomId) {\n const [prevRoom] = container.querySelectorAll<Element>(`[id=\"room${prevSelectedRoomId}\"]`);\n if (prevRoom) {\n prevRoom.classList.remove(styles.roomViewerSelected, styles.roomViewerTint);\n const [prevBackground] = prevRoom.querySelectorAll<Element>('[id=\"background\"]');\n if (prevBackground) prevBackground.classList.remove(styles.roomViewerTint);\n }\n }\n\n if (room) {\n room.classList.add(styles.roomViewerSelected);\n const [background] = room.querySelectorAll<Element>('[id=\"background\"]');\n (background ?? room).classList.add(styles.roomViewerTint);\n }\n\n return pureRoomId;\n });\n }\n\n function addToCurrentFloor(change: number) {\n setSelectedDataId((prev) => {\n const next = prev + change;\n if (next < 0 || next > data.length - 1) return prev;\n return next;\n });\n }\n\n const svgData = data[selectedDataId]?.data ?? null;\n\n return (\n <div className={styles.roomViewer} ref={roomViewerRef}>\n <h3 className={styles.roomViewerHeader}>{data[selectedDataId]?.label ?? ''}</h3>\n <div\n key={selectedDataId}\n className={cx(styles.roomViewerContainer, isLoading && styles.roomViewerContainerLoading)}\n >\n {svgData}\n </div>\n {data.length > 1 && (\n <div className={styles.roomViewerActions}>\n <FontAwesomeIcon icon={leftIcon} onClick={() => addToCurrentFloor(-1)} />\n <FontAwesomeIcon icon={layerIcon} />\n <FontAwesomeIcon icon={rightIcon} onClick={() => addToCurrentFloor(1)} />\n </div>\n )}\n </div>\n );\n}\n\nexport default RoomViewer;\n"],"mappings":"wVAYA,SAAS,EAAW,CAAE,OAAO,CAAC,GAAsB,CAClD,IAAM,EAAgB,EAAuB,IAAI,EAE3C,EAAG,GAAqB,EAAwB,IAAI,EACpD,CAAC,EAAgB,GAAqB,EAAS,CAAC,EAChD,CAAC,EAAW,GAAgB,EAAS,EAAI,EAE/C,MAAgB,CACd,IAAM,EAAkB,IAAI,gBAE5B,EAAkB,IAAI,EAEtB,IAAM,EAAY,EAAc,QAmBhC,OAjBI,EAAiB,EAAK,OAAS,GAAK,CAAC,GACvC,EAAa,EAAK,MACL,EAAgB,MAAM,IAMrC,EADwB,iBAA0B,cAClD,EAAM,QAAS,GAAY,CACzB,EAAQ,iBACN,YACM,EAAc,EAAQ,GAAI,CAAS,EACzC,CAAE,OAAQ,EAAgB,MAAO,CACnC,CACF,CAAC,EACD,EAAa,EAAK,MAEL,EAAgB,MAAM,EAErC,EAAG,CAAC,EAAM,CAAc,CAAC,EAEzB,SAAS,EAAc,EAAgB,EAAoB,CACzD,IAAM,EAAa,EAAO,UAAU,CAAC,EAErC,EAAmB,GAAuB,CACxC,GAAI,IAAe,EAAoB,OAAO,EAE9C,GAAM,CAAC,GAAO,EAAU,iBAA0B,YAAY,EAC9D,GAAK,aAAa,OAAQ,IAAI,GAAQ,EAEtC,GAAM,CAAC,GAAQ,EAAU,iBAA0B,QAAQ,EAAO,GAAG,EAErE,GAAI,EAAoB,CACtB,GAAM,CAAC,GAAY,EAAU,iBAA0B,YAAY,EAAmB,GAAG,EACzF,GAAI,EAAU,CACZ,EAAS,UAAU,OAAO,EAAO,mBAAoB,EAAO,cAAc,EAC1E,GAAM,CAAC,GAAkB,EAAS,iBAA0B,mBAAmB,EAC3E,GAAgB,EAAe,UAAU,OAAO,EAAO,cAAc,CAC3E,CACF,CAEA,GAAI,EAAM,CACR,EAAK,UAAU,IAAI,EAAO,kBAAkB,EAC5C,GAAM,CAAC,GAAc,EAAK,iBAA0B,mBAAmB,GACtE,GAAc,GAAM,UAAU,IAAI,EAAO,cAAc,CAC1D,CAEA,OAAO,CACT,CAAC,CACH,CAEA,SAAS,EAAkB,EAAgB,CACzC,EAAmB,GAAS,CAC1B,IAAM,EAAO,EAAO,EAEpB,OADI,EAAO,GAAK,EAAO,EAAK,OAAS,EAAU,EACxC,CACT,CAAC,CACH,CAEA,IAAM,EAAU,EAAK,IAAiB,MAAQ,KAE9C,OACE,EAAC,MAAD,CAAK,UAAW,EAAO,WAAY,IAAK,WAAxC,CACE,EAAC,KAAD,CAAI,UAAW,EAAO,0BAAmB,EAAK,IAAiB,OAAS,EAAO,CAAA,EAC/E,EAAC,MAAD,CAEE,UAAW,EAAG,EAAO,oBAAqB,GAAa,EAAO,0BAA0B,WAEvF,CACE,EAJE,CAIF,EACJ,EAAK,OAAS,GACb,EAAC,MAAD,CAAK,UAAW,EAAO,2BAAvB,CACE,EAAC,EAAD,CAAiB,KAAM,EAAU,YAAe,EAAkB,EAAE,CAAI,CAAA,EACxE,EAAC,EAAD,CAAiB,KAAM,CAAY,CAAA,EACnC,EAAC,EAAD,CAAiB,KAAM,EAAW,YAAe,EAAkB,CAAC,CAAI,CAAA,CACrE,GAEJ,GAET"}
@@ -0,0 +1,2 @@
1
+ var e={"roomViewer-containerLoading":`roomViewer-containerLoading_BL3M-`,roomViewerContainerLoading:`roomViewer-containerLoading_BL3M-`,"roomViewer-container":`roomViewer-container_YlmB8`,roomViewerContainer:`roomViewer-container_YlmB8`,"roomViewer-active":`roomViewer-active_gG6wf`,roomViewerActive:`roomViewer-active_gG6wf`,"roomViewer-selected":`roomViewer-selected_CpdMj`,roomViewerSelected:`roomViewer-selected_CpdMj`,"roomViewer-tint":`roomViewer-tint_O9JrM`,roomViewerTint:`roomViewer-tint_O9JrM`,"roomViewer-actions":`roomViewer-actions_4cA74`,roomViewerActions:`roomViewer-actions_4cA74`,"roomViewer-header":`roomViewer-header_XEHCO`,roomViewerHeader:`roomViewer-header_XEHCO`};export{e as default};
2
+ //# sourceMappingURL=roomViewer.module.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roomViewer.module.mjs","names":[],"sources":["../../../../package/common/roomViewer/roomViewer.module.pcss"],"sourcesContent":[".roomViewer{\n &-container{\n &Loading {\n opacity: 0.4;\n pointer-events: none;\n }\n\n svg{\n stroke-width: 1px;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-opacity: 1;\n path {\n stroke: var(--primary-color);\n fill: transparent;\n }\n path[id=\"background\"] {\n stroke: none;\n fill: transparent;\n cursor: pointer;\n }\n *[id^=\"room\"] {\n cursor: pointer;\n }\n\n text{\n fill: var(--text-color);\n stroke: none;\n font-size: 5px;\n }\n }\n }\n\n &-active{\n stroke: #18f810 !important;\n fill: #20f81013 !important;\n path {\n stroke: #18f810 !important;\n fill: none !important;\n }\n path[id=\"background\"] {\n stroke: none !important;\n fill: #20f81013 !important;\n }\n }\n\n &-selected {\n stroke: #18f810 !important;\n path {\n stroke: #18f810 !important;\n fill: none !important;\n }\n path[id=\"background\"] {\n stroke: none !important;\n fill: #20f81013 !important;\n }\n\n text{\n stroke: none;\n fill: var(--text-color);\n }\n }\n\n &-tint {\n fill: #20f81013 !important;\n\n path{\n fill: #20f81013 !important;\n }\n\n text{\n stroke: none;\n fill: none;\n }\n }\n\n &-actions{\n display: flex;\n width: 100%;\n justify-content: center;\n gap: 8px;\n font-size: 16px;\n\n svg{\n cursor: pointer;\n }\n }\n\n &-header{\n margin-bottom: 4px;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import e from"./scrollbarProvider.mjs";var t=e;export{t as default};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../package/common/scrollbarProvider/index.ts"],"sourcesContent":["import ScrollbarProvider from './scrollbarProvider';\n\nexport default ScrollbarProvider;\n"],"mappings":"uCAEA,IAAA,EAAe"}
@@ -0,0 +1,2 @@
1
+ import e from"./scrollbarProvider.module.mjs";import t from"classnames";import{jsx as n}from"react/jsx-runtime";function r({className:r=void 0,children:i=void 0}){return n(`div`,{className:t(e.scrollbarProvider,r),children:i})}export{r as default};
2
+ //# sourceMappingURL=scrollbarProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrollbarProvider.mjs","names":[],"sources":["../../../../package/common/scrollbarProvider/scrollbarProvider.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport styles from './scrollbarProvider.module.pcss';\n\ninterface Properties {\n className?: string | undefined;\n children?: React.ReactNode | undefined;\n};\n\nfunction ScrollbarProvider({\n className = undefined,\n children = undefined,\n}: Properties): ReactElement {\n return (\n <div className={cx(styles.scrollbarProvider, className)}>\n {children}\n </div>\n );\n}\n\nexport default ScrollbarProvider;\n"],"mappings":"gHAUA,SAAS,EAAkB,CACzB,YAAY,IAAA,GACZ,WAAW,IAAA,IACgB,CAC3B,OACE,EAAC,MAAD,CAAK,UAAW,EAAG,EAAO,kBAAmB,CAAS,EACnD,UACE,CAAA,CAET"}
@@ -0,0 +1,2 @@
1
+ var e={scrollbarProvider:`scrollbarProvider_IMBFu`};export{e as default};
2
+ //# sourceMappingURL=scrollbarProvider.module.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrollbarProvider.module.mjs","names":[],"sources":["../../../../package/common/scrollbarProvider/scrollbarProvider.module.pcss"],"sourcesContent":[".scrollbarProvider{\n display: contents;\n /* Firefox */\n * {\n scrollbar-width: thin;\n scrollbar-color: var(--background-accent-light) var(--background);\n }\n\n /* Chrome, Edge, and Safari */\n *::-webkit-scrollbar {\n width: 12px;\n }\n\n *::-webkit-scrollbar-track {\n background: transparent;\n }\n\n *::-webkit-scrollbar-thumb {\n background-color: var(--background-accent-light);\n border-radius: 10px;\n border: 3px solid var(--background);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{InputType as e}from"../input/input.types.mjs";import t from"../input/input.mjs";import n from"./searchInput.module.mjs";import{useEffect as r,useRef as i}from"react";import{jsx as a,jsxs as o}from"react/jsx-runtime";function s({value:s,onChange:c,onDebounce:l,placeholder:u,label:d,debounceMs:f=500,totalAmount:p,showAmount:m=!0,className:h,width:g,..._}){let v=i(null);r(()=>()=>{v.current!==null&&clearTimeout(v.current)},[]);function y(e){let t=e==null?``:String(e),n=t.trim()===``?``:t;c(n),v.current!==null&&clearTimeout(v.current),v.current=setTimeout(()=>{l?.(n)},f)}let b=m&&typeof p==`number`&&!Number.isNaN(p);return o(`div`,{..._,className:h,style:g==null?void 0:{width:g},children:[a(t,{type:e.Search,label:d,placeholder:u,value:s,onChange:y}),b&&o(`p`,{className:n.resultCount,children:[p,` `,p===1?`result`:`results`]})]})}export{s as default};
2
+ //# sourceMappingURL=searchInput.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchInput.mjs","names":[],"sources":["../../../../package/common/searchInput/searchInput.tsx"],"sourcesContent":["import { useEffect, useRef, type ReactElement } from 'react';\nimport Input from 'components/common/input';\nimport { InputType } from 'components/common/input/input.types';\nimport styles from './searchInput.module.pcss';\nimport type { SearchInputProps } from './searchInput.types';\n\n\nexport default function SearchInput({\n value,\n onChange,\n onDebounce,\n placeholder,\n label,\n debounceMs = 500,\n totalAmount,\n showAmount = true,\n className,\n width,\n ...rest\n}: SearchInputProps): ReactElement {\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n }, []);\n\n function handleChange(val: unknown) {\n const str = val != null ? String(val) : '';\n const trimmed = str.trim() === '' ? '' : str;\n onChange(trimmed);\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => { onDebounce?.(trimmed); }, debounceMs);\n }\n\n const showCount = showAmount && typeof totalAmount === 'number' && !Number.isNaN(totalAmount);\n\n return (\n <div {...rest} className={className} style={width != null ? { width } : undefined}>\n <Input\n type={InputType.Search}\n label={label}\n placeholder={placeholder}\n value={value}\n onChange={handleChange}\n />\n {showCount && (\n <p className={styles.resultCount}>\n {totalAmount} {totalAmount === 1 ? 'result' : 'results'}\n </p>\n )}\n </div>\n );\n}\n"],"mappings":"+NAOA,SAAwB,EAAY,CAClC,QACA,WACA,aACA,cACA,QACA,aAAa,IACb,cACA,aAAa,GACb,YACA,QACA,GAAG,GAC8B,CACjC,IAAM,EAAW,EAA6C,IAAI,EAElE,UAAsB,CAChB,EAAS,UAAY,MAAM,aAAa,EAAS,OAAO,CAC9D,EAAG,CAAC,CAAC,EAEL,SAAS,EAAa,EAAc,CAClC,IAAM,EAAM,GAAO,KAAqB,GAAd,OAAO,CAAG,EAC9B,EAAU,EAAI,KAAK,IAAM,GAAK,GAAK,EACzC,EAAS,CAAO,EACZ,EAAS,UAAY,MAAM,aAAa,EAAS,OAAO,EAC5D,EAAS,QAAU,eAAiB,CAAE,IAAa,CAAO,CAAG,EAAG,CAAU,CAC5E,CAEA,IAAM,EAAY,GAAc,OAAO,GAAgB,UAAY,CAAC,OAAO,MAAM,CAAW,EAE5F,OACE,EAAC,MAAD,CAAK,GAAI,EAAiB,YAAW,MAAO,GAAS,KAAmB,IAAA,GAAZ,CAAE,OAAM,WAApE,CACE,EAAC,EAAD,CACE,KAAM,EAAU,OACT,QACM,cACN,QACP,SAAU,CACX,CAAA,EACA,GACC,EAAC,IAAD,CAAG,UAAW,EAAO,qBAArB,CACG,EAAY,IAAE,IAAgB,EAAI,SAAW,SAC7C,GAEF,GAET"}
@@ -0,0 +1,2 @@
1
+ var e={resultCount:`resultCount_Sn48Q`};export{e as default};
2
+ //# sourceMappingURL=searchInput.module.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"searchInput.module.mjs","names":[],"sources":["../../../../package/common/searchInput/searchInput.module.pcss"],"sourcesContent":[".resultCount {\n margin: 6px 0 0;\n font-size: 12px;\n color: var(--text-dark);\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{SkeletonAnimation as e,SkeletonVariant as t}from"./skeleton.types.mjs";import n from"./skeleton.module.mjs";import r from"classnames";import{jsx as i}from"react/jsx-runtime";var a={[t.Text]:n.skeletonText,[t.Circle]:n.skeletonCircle,[t.Rectangular]:n.skeletonRectangular},o={[e.Shimmer]:n.skeletonAnimationShimmer,[e.Pulse]:n.skeletonAnimationPulse,[e.None]:void 0};function s({variant:s=t.Text,animation:c=e.Shimmer,lines:l=1,className:u,style:d,classNames:f,styles:p,...m}){let h=a[s],g=o[c];return s!==t.Text||l<=1?i(`span`,{...m,className:r(n.skeleton,h,g,u),style:d}):i(`span`,{...m,className:r(n.skeletonLines,u),style:d,children:Array.from({length:l},(e,t)=>i(`span`,{className:r(n.skeleton,h,g,t===l-1&&n.skeletonLineLast,f?.line),style:p?.line},t))})}export{s as default};
2
+ //# sourceMappingURL=skeleton.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.mjs","names":[],"sources":["../../../../package/common/skeleton/skeleton.tsx"],"sourcesContent":["import type { ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport { SkeletonVariant, SkeletonAnimation } from './skeleton.types';\nimport type { SkeletonProps } from './skeleton.types';\nimport styles from './skeleton.module.pcss';\n\nconst CLASS_BY_VARIANT: Record<SkeletonVariant, string> = {\n [SkeletonVariant.Text]: styles.skeletonText,\n [SkeletonVariant.Circle]: styles.skeletonCircle,\n [SkeletonVariant.Rectangular]: styles.skeletonRectangular,\n};\n\nconst CLASS_BY_ANIMATION: Record<SkeletonAnimation, string | undefined> = {\n [SkeletonAnimation.Shimmer]: styles.skeletonAnimationShimmer,\n [SkeletonAnimation.Pulse]: styles.skeletonAnimationPulse,\n [SkeletonAnimation.None]: undefined,\n};\n\nfunction Skeleton({\n variant = SkeletonVariant.Text,\n animation = SkeletonAnimation.Shimmer,\n lines = 1,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: SkeletonProps): ReactElement {\n const variantClass = CLASS_BY_VARIANT[variant];\n const animationClass = CLASS_BY_ANIMATION[animation];\n\n if (variant !== SkeletonVariant.Text || lines <= 1) {\n return (\n <span\n {...rest}\n className={cx(styles.skeleton, variantClass, animationClass, className)}\n style={style}\n />\n );\n }\n\n return (\n <span {...rest} className={cx(styles.skeletonLines, className)} style={style}>\n {Array.from({ length: lines }, (_, index) => (\n <span\n key={index}\n className={cx(\n styles.skeleton,\n variantClass,\n animationClass,\n index === lines - 1 && styles.skeletonLineLast,\n classNames?.line\n )}\n style={slotStyles?.line}\n />\n ))}\n </span>\n );\n}\n\nexport default Skeleton;\n"],"mappings":"qLAOA,IAAM,EAAoD,EACvD,EAAgB,MAAO,EAAO,cAC9B,EAAgB,QAAS,EAAO,gBAChC,EAAgB,aAAc,EAAO,mBACxC,EAEM,EAAoE,EACvE,EAAkB,SAAU,EAAO,0BACnC,EAAkB,OAAQ,EAAO,wBACjC,EAAkB,MAAO,IAAA,EAC5B,EAEA,SAAS,EAAS,CAChB,UAAU,EAAgB,KAC1B,YAAY,EAAkB,QAC9B,QAAQ,EACR,YACA,QACA,aACA,OAAQ,EACR,GAAG,GAC2B,CAC9B,IAAM,EAAe,EAAiB,GAChC,EAAiB,EAAmB,GAY1C,OAVI,IAAY,EAAgB,MAAQ,GAAS,EAE7C,EAAC,OAAD,CACE,GAAI,EACJ,UAAW,EAAG,EAAO,SAAU,EAAc,EAAgB,CAAS,EAC/D,OACR,CAAA,EAKH,EAAC,OAAD,CAAM,GAAI,EAAM,UAAW,EAAG,EAAO,cAAe,CAAS,EAAU,iBACpE,MAAM,KAAK,CAAE,OAAQ,CAAM,GAAI,EAAG,IACjC,EAAC,OAAD,CAEE,UAAW,EACT,EAAO,SACP,EACA,EACA,IAAU,EAAQ,GAAK,EAAO,iBAC9B,GAAY,IACd,EACA,MAAO,GAAY,IACpB,EATM,CASN,CACF,CACG,CAAA,CAEV"}
@@ -0,0 +1,2 @@
1
+ var e={skeleton:`skeleton_TSg1y`,"skeleton-lines":`skeleton-lines_-Z-gf`,skeletonLines:`skeleton-lines_-Z-gf`,"skeleton-line-last":`skeleton-line-last_UFw21`,skeletonLineLast:`skeleton-line-last_UFw21`,"skeleton-text":`skeleton-text_Jlefj`,skeletonText:`skeleton-text_Jlefj`,"skeleton-circle":`skeleton-circle_t0bbj`,skeletonCircle:`skeleton-circle_t0bbj`,"skeleton-rectangular":`skeleton-rectangular_UtIyN`,skeletonRectangular:`skeleton-rectangular_UtIyN`,"skeleton-animation-pulse":`skeleton-animation-pulse_wGbPg`,skeletonAnimationPulse:`skeleton-animation-pulse_wGbPg`,skeletonPulse:`skeletonPulse_06yjn`,"skeleton-animation-shimmer":`skeleton-animation-shimmer_a0nwc`,skeletonAnimationShimmer:`skeleton-animation-shimmer_a0nwc`,skeletonShimmer:`skeletonShimmer_wLPXR`};export{e as default};
2
+ //# sourceMappingURL=skeleton.module.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.module.mjs","names":[],"sources":["../../../../package/common/skeleton/skeleton.module.pcss"],"sourcesContent":[".skeleton {\n display: block;\n background-color: var(--background-accent);\n border-radius: var(--default-border-radius);\n\n &-lines {\n display: flex;\n flex-direction: column;\n gap: 0.5em;\n }\n\n &-line-last {\n width: 60%;\n }\n\n &-text {\n width: 100%;\n height: 1em;\n }\n\n &-circle {\n border-radius: 50%;\n }\n\n &-rectangular {\n border-radius: var(--default-border-radius);\n }\n\n &-animation {\n &-pulse {\n animation: skeletonPulse 1.5s ease-in-out infinite;\n }\n\n &-shimmer {\n background-image: linear-gradient(\n 90deg,\n var(--background-accent) 25%,\n var(--background-accent-light) 50%,\n var(--background-accent) 75%\n );\n background-size: 200% 100%;\n animation: skeletonShimmer 1.5s ease-in-out infinite;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n &-animation-pulse,\n &-animation-shimmer {\n animation: none;\n }\n }\n}\n\n@keyframes skeletonPulse {\n 0%,\n 100% {\n opacity: 1;\n }\n\n 50% {\n opacity: 0.4;\n }\n}\n\n@keyframes skeletonShimmer {\n 0% {\n background-position: 200% 0;\n }\n\n 100% {\n background-position: -200% 0;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ var e=function(e){return e.Text=`text`,e.Circle=`circle`,e.Rectangular=`rectangular`,e}({}),t=function(e){return e.Shimmer=`shimmer`,e.Pulse=`pulse`,e.None=`none`,e}({});export{t as SkeletonAnimation,e as SkeletonVariant};
2
+ //# sourceMappingURL=skeleton.types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.types.mjs","names":[],"sources":["../../../../package/common/skeleton/skeleton.types.ts"],"sourcesContent":["import type { CSSProperties } from 'react';\nimport type { SlotClassNames, SlotStyles, HtmlProps } from '../types/slots.types';\n\nexport enum SkeletonVariant {\n Text = 'text',\n Circle = 'circle',\n Rectangular = 'rectangular',\n}\n\nexport enum SkeletonAnimation {\n Shimmer = 'shimmer',\n Pulse = 'pulse',\n None = 'none',\n}\n\nexport type SkeletonSlots = 'line';\n\nexport interface SkeletonProps extends HtmlProps {\n variant?: SkeletonVariant;\n animation?: SkeletonAnimation;\n lines?: number;\n className?: string;\n style?: CSSProperties;\n classNames?: SlotClassNames<SkeletonSlots>;\n styles?: SlotStyles<SkeletonSlots>;\n}\n"],"mappings":"AAGA,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,KAAA,OACA,EAAA,OAAA,SACA,EAAA,YAAA,eACF,EAAA,CAAA,CAAA,EAEY,EAAL,SAAA,EAAA,OACL,GAAA,QAAA,UACA,EAAA,MAAA,QACA,EAAA,KAAA,QACF,EAAA,CAAA,CAAA"}
@@ -0,0 +1,2 @@
1
+ import e from"../interactableDiv/index.mjs";import t from"./stepper.module.mjs";import n from"react";import r from"classnames";import{Fragment as i,jsx as a,jsxs as o}from"react/jsx-runtime";function s(){return a(`svg`,{strokeLinejoin:`round`,strokeLinecap:`round`,xmlns:`http://www.w3.org/2000/svg`,viewBox:`-0.2 -1.2 3.4 2`,height:`20px`,width:`20px`,children:a(`path`,{d:`M 0 0 l 1 1 l 2 -2`,stroke:`white`,strokeWidth:`0.4`,fill:`none`})})}function c({steps:c=[],currentStep:l=0,alignment:u=`horizontal`,onStepClicked:d=null,nonLinear:f=!1,hideLabels:p=!1,className:m,style:h,classNames:g,styles:_,...v}){let y=u===`vertical`;return a(`div`,{...v,className:r(t.stepper,{[t.stepperVertical]:y},g?.root,m),style:{..._?.root,...h},children:c.map((u,m)=>{let h=m<l,v=m<=l,b=!!d&&(f?m!==l:h),x=r(t.stepperEntry,{[t.stepperEntryActive]:v},{[t.stepperEntryDone]:h},{[t.stepperClickable]:b},g?.entry),S=o(i,{children:[a(`div`,{className:r(t.stepperEntryNumber,{[t.stepperEntryNumberDone]:h},g?.entryNumber),style:_?.entryNumber,children:h?a(s,{}):m+1}),!p&&a(`div`,{className:r(t.stepperEntryLabel,{[t.stepperEntryLabelVertical]:y},g?.entryLabel),style:_?.entryLabel,children:u.label})]});return o(n.Fragment,{children:[b?a(e,{className:x,style:_?.entry,onClick:()=>d(m),"aria-current":m===l?`step`:void 0,children:S}):a(`div`,{className:x,style:_?.entry,"aria-current":m===l?`step`:void 0,children:S}),m<c.length-1&&a(`div`,{className:r(t.stepperConnector,{[t.stepperConnectorFilled]:h},{[t.stepperConnectorVertical]:y},g?.connector),style:_?.connector})]},m)})})}export{c as default};
2
+ //# sourceMappingURL=stepper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper.mjs","names":[],"sources":["../../../../package/common/stepper/stepper.tsx"],"sourcesContent":["import React from 'react';\nimport cx from 'classnames';\nimport styles from './stepper.module.pcss';\nimport InteractableDiv from '../interactableDiv';\nimport type { StepperProps, StepperStep } from './stepper.types';\n\nfunction Checkmark() {\n return (\n <svg\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"-0.2 -1.2 3.4 2\"\n height=\"20px\"\n width=\"20px\"\n >\n <path d=\"M 0 0 l 1 1 l 2 -2\" stroke=\"white\" strokeWidth=\"0.4\" fill=\"none\" />\n </svg>\n );\n}\n\nexport default function Stepper({\n steps = [],\n currentStep = 0,\n alignment = 'horizontal',\n onStepClicked = null,\n nonLinear = false,\n hideLabels = false,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: StepperProps) {\n const isVertical = alignment === 'vertical';\n\n return (\n <div\n {...rest}\n className={cx(styles.stepper, { [styles.stepperVertical]: isVertical }, classNames?.root, className)}\n style={{ ...slotStyles?.root, ...style }}\n >\n {steps.map((step: StepperStep, index: number) => {\n const isDone = index < currentStep;\n const isActive = index <= currentStep;\n // nonLinear: every step except the current one is clickable\n // linear: only completed steps are clickable\n const isClickable = !!onStepClicked && (nonLinear ? index !== currentStep : isDone);\n\n const entryClassName = cx(\n styles.stepperEntry,\n { [styles.stepperEntryActive]: isActive },\n { [styles.stepperEntryDone]: isDone },\n { [styles.stepperClickable]: isClickable },\n classNames?.entry\n );\n\n const entryContent = (\n <>\n <div\n className={cx(\n styles.stepperEntryNumber,\n { [styles.stepperEntryNumberDone]: isDone },\n classNames?.entryNumber\n )}\n style={slotStyles?.entryNumber}\n >\n {isDone ? <Checkmark /> : index + 1}\n </div>\n {!hideLabels && (\n <div\n className={cx(\n styles.stepperEntryLabel,\n { [styles.stepperEntryLabelVertical]: isVertical },\n classNames?.entryLabel\n )}\n style={slotStyles?.entryLabel}\n >\n {step.label}\n </div>\n )}\n </>\n );\n\n return (\n <React.Fragment key={index}>\n {isClickable ? (\n <InteractableDiv\n className={entryClassName}\n style={slotStyles?.entry}\n onClick={() => onStepClicked(index)}\n aria-current={index === currentStep ? 'step' : undefined}\n >\n {entryContent}\n </InteractableDiv>\n ) : (\n <div\n className={entryClassName}\n style={slotStyles?.entry}\n aria-current={index === currentStep ? 'step' : undefined}\n >\n {entryContent}\n </div>\n )}\n\n {index < steps.length - 1 && (\n <div\n className={cx(\n styles.stepperConnector,\n { [styles.stepperConnectorFilled]: isDone },\n { [styles.stepperConnectorVertical]: isVertical },\n classNames?.connector\n )}\n style={slotStyles?.connector}\n />\n )}\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n"],"mappings":"+LAMA,SAAS,GAAY,CACnB,OACE,EAAC,MAAD,CACE,eAAe,QACf,cAAc,QACd,MAAM,6BACN,QAAQ,kBACR,OAAO,OACP,MAAM,gBAEN,EAAC,OAAD,CAAM,EAAE,qBAAqB,OAAO,QAAQ,YAAY,MAAM,KAAK,MAAQ,CAAA,CACxE,CAAA,CAET,CAEA,SAAwB,EAAQ,CAC9B,QAAQ,CAAC,EACT,cAAc,EACd,YAAY,aACZ,gBAAgB,KAChB,YAAY,GACZ,aAAa,GACb,YACA,QACA,aACA,OAAQ,EACR,GAAG,GACY,CACf,IAAM,EAAa,IAAc,WAEjC,OACE,EAAC,MAAD,CACE,GAAI,EACJ,UAAW,EAAG,EAAO,QAAS,EAAG,EAAO,iBAAkB,CAAW,EAAG,GAAY,KAAM,CAAS,EACnG,MAAO,CAAE,GAAG,GAAY,KAAM,GAAG,CAAM,WAEtC,EAAM,KAAK,EAAmB,IAAkB,CAC/C,IAAM,EAAS,EAAQ,EACjB,EAAW,GAAS,EAGpB,EAAc,CAAC,CAAC,IAAkB,EAAY,IAAU,EAAc,GAEtE,EAAiB,EACrB,EAAO,aACP,EAAG,EAAO,oBAAqB,CAAS,EACxC,EAAG,EAAO,kBAAmB,CAAO,EACpC,EAAG,EAAO,kBAAmB,CAAY,EACzC,GAAY,KACd,EAEM,EACJ,EAAA,EAAA,CAAA,SAAA,CACE,EAAC,MAAD,CACE,UAAW,EACT,EAAO,mBACP,EAAG,EAAO,wBAAyB,CAAO,EAC1C,GAAY,WACd,EACA,MAAO,GAAY,qBAElB,EAAS,EAAC,EAAD,CAAY,CAAA,EAAI,EAAQ,CAC/B,CAAA,EACJ,CAAC,GACA,EAAC,MAAD,CACE,UAAW,EACT,EAAO,kBACP,EAAG,EAAO,2BAA4B,CAAW,EACjD,GAAY,UACd,EACA,MAAO,GAAY,oBAElB,EAAK,KACH,CAAA,CAEP,CAAA,CAAA,EAGJ,OACE,EAAC,EAAM,SAAP,CAAA,SAAA,CACG,EACC,EAAC,EAAD,CACE,UAAW,EACX,MAAO,GAAY,MACnB,YAAe,EAAc,CAAK,EAClC,eAAc,IAAU,EAAc,OAAS,IAAA,YAE9C,CACc,CAAA,EAEjB,EAAC,MAAD,CACE,UAAW,EACX,MAAO,GAAY,MACnB,eAAc,IAAU,EAAc,OAAS,IAAA,YAE9C,CACE,CAAA,EAGN,EAAQ,EAAM,OAAS,GACtB,EAAC,MAAD,CACE,UAAW,EACT,EAAO,iBACP,EAAG,EAAO,wBAAyB,CAAO,EAC1C,EAAG,EAAO,0BAA2B,CAAW,EAChD,GAAY,SACd,EACA,MAAO,GAAY,SACpB,CAAA,CAEW,CAAA,EA/BK,CA+BL,CAEpB,CAAC,CACE,CAAA,CAET"}
@@ -0,0 +1,2 @@
1
+ var e={stepper:`stepper_kiS2A`,"stepper-clickable":`stepper-clickable_Nm6fP`,stepperClickable:`stepper-clickable_Nm6fP`,"stepper-vertical":`stepper-vertical_2y9rg`,stepperVertical:`stepper-vertical_2y9rg`,"stepper-connector":`stepper-connector_J2FwZ`,stepperConnector:`stepper-connector_J2FwZ`,"stepper-connector-vertical":`stepper-connector-vertical_vwY38`,stepperConnectorVertical:`stepper-connector-vertical_vwY38`,"stepper-connector-filled":`stepper-connector-filled_W8UZS`,stepperConnectorFilled:`stepper-connector-filled_W8UZS`,"stepper-entry":`stepper-entry_KD4JJ`,stepperEntry:`stepper-entry_KD4JJ`,"stepper-entry-active":`stepper-entry-active_V1aRt`,stepperEntryActive:`stepper-entry-active_V1aRt`,"stepper-entry-done":`stepper-entry-done_M3wb5`,stepperEntryDone:`stepper-entry-done_M3wb5`,"stepper-entry-number":`stepper-entry-number_J168Q`,stepperEntryNumber:`stepper-entry-number_J168Q`,"stepper-entry-number-done":`stepper-entry-number-done_-m7sD`,stepperEntryNumberDone:`stepper-entry-number-done_-m7sD`,showCheckmark:`showCheckmark_Rd0oW`,"stepper-entry-label":`stepper-entry-label_b94eg`,stepperEntryLabel:`stepper-entry-label_b94eg`,"stepper-entry-label-vertical":`stepper-entry-label-vertical_Zm8i4`,stepperEntryLabelVertical:`stepper-entry-label-vertical_Zm8i4`};export{e as default};
2
+ //# sourceMappingURL=stepper.module.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper.module.mjs","names":[],"sources":["../../../../package/common/stepper/stepper.module.pcss"],"sourcesContent":[".stepper {\n display: flex;\n align-items: center;\n margin-bottom: 30px;\n user-select: none;\n\n &-clickable {\n cursor: pointer;\n }\n\n &-vertical {\n flex-flow: column;\n }\n\n &-connector {\n width: 50px;\n height: 1px;\n background-position: 0% 50%;\n transition: all 0.6s;\n background-size: 200% 200%;\n background-image: repeating-linear-gradient(\n 90deg,\n var(--primary-lighter) 0%,\n var(--primary-lighter) 50%,\n var(--primary-color) 50%,\n var(--primary-color) 100%\n );\n\n &-vertical {\n width: 3px;\n height: 100px;\n background-position: 0% 100%;\n background-image: repeating-linear-gradient(\n 0deg,\n var(--primary-lighter) 0%,\n var(--primary-lighter) 50%,\n var(--primary-color) 50%,\n var(--primary-color) 100%\n );\n }\n\n &-filled {\n background-position: -100% 0%;\n height: 3px;\n }\n }\n\n &-entry {\n width: 40px;\n height: 40px;\n box-sizing: border-box;\n border: 1px solid var(--primary-lighter);\n color: var(--primary-lighter);\n position: relative;\n border-radius: var(--default-border-radius);\n display: flex;\n justify-content: center;\n align-items: center;\n box-shadow: inset 0px 0px 0px var(--primary-color);\n transform: none;\n transition: all 0.4s;\n\n &-active {\n border: 2px solid var(--primary-color);\n color: var(--primary-color);\n transform: scale3d(1.1, 1.1, 1);\n }\n\n &-done {\n box-shadow: inset 0px 0px 0px 30px var(--primary-color);\n transform: none;\n }\n\n &-number {\n stroke-dasharray: 5;\n stroke-dashoffset: 5;\n\n &-done {\n animation: 0.4s 0.2s forwards showCheckmark;\n }\n }\n\n @keyframes showCheckmark {\n from {\n stroke-dashoffset: 5;\n }\n to {\n stroke-dashoffset: 0;\n }\n }\n\n &-label {\n position: absolute;\n top: 45px;\n left: 0px;\n width: 140px;\n transform: translate(-50px);\n text-align: center;\n\n &-vertical {\n top: 0px;\n left: 100px;\n text-align: left;\n }\n }\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import e from"./sticky.module.mjs";import{useCallback as t,useEffect as n,useLayoutEffect as r,useRef as i,useState as a}from"react";import o from"classnames";import{jsx as s,jsxs as c}from"react/jsx-runtime";function l({children:l,offsetTop:u=0,zIndex:d=20,disabled:f=!1,onStuckChange:p,className:m,style:h,classNames:g,styles:_,...v}){let y=i(null),b=i(null),[x,S]=a(!1),[C,w]=a({width:0,left:0,height:0}),T=i(p);n(()=>{T.current=p},[p]);let E=t(()=>{let e=y.current,t=b.current;if(!e||!t)return;let n=e.getBoundingClientRect();w({width:e.clientWidth,left:n.left,height:t.offsetHeight}),S(!f&&n.top<=u)},[f,u]);r(()=>{E()},[E,l]),n(()=>{let e=0,t=()=>{cancelAnimationFrame(e),e=requestAnimationFrame(E)};window.addEventListener(`scroll`,t,{passive:!0,capture:!0}),window.addEventListener(`resize`,t);let n=new ResizeObserver(t);return y.current&&n.observe(y.current),b.current&&n.observe(b.current),()=>{cancelAnimationFrame(e),window.removeEventListener(`scroll`,t,{capture:!0}),window.removeEventListener(`resize`,t),n.disconnect()}},[E]);let D=i(!0);n(()=>{if(D.current){D.current=!1;return}T.current?.(x)},[x]);let O=x?{position:`fixed`,top:u,left:C.left,width:C.width,zIndex:d,..._?.content}:_?.content;return c(`div`,{ref:y,className:o(e.sticky,m,g?.root),style:{..._?.root,...h},...v,children:[x&&s(`div`,{"aria-hidden":!0,className:o(e.stickyPlaceholder,g?.placeholder),style:{height:C.height,..._?.placeholder}}),s(`div`,{ref:b,className:o(e.stickyContent,x&&e.stickyContentStuck,g?.content),style:O,children:l})]})}export{l as default};
2
+ //# sourceMappingURL=sticky.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sticky.mjs","names":[],"sources":["../../../../package/common/sticky/sticky.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport cx from 'classnames';\nimport type { StickyProps } from './sticky.types';\n\nimport styles from './sticky.module.pcss';\n\ninterface Metrics {\n width: number;\n left: number;\n height: number;\n}\n\nexport default function Sticky({\n children,\n offsetTop = 0,\n zIndex = 20,\n disabled = false,\n onStuckChange,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: StickyProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [isStuck, setIsStuck] = useState(false);\n const [metrics, setMetrics] = useState<Metrics>({ width: 0, left: 0, height: 0 });\n\n const onStuckChangeRef = useRef(onStuckChange);\n useEffect(() => {\n onStuckChangeRef.current = onStuckChange;\n }, [onStuckChange]);\n\n const update = useCallback(() => {\n const root = rootRef.current;\n const content = contentRef.current;\n if (!root || !content) return;\n const rootRect = root.getBoundingClientRect();\n setMetrics({ width: root.clientWidth, left: rootRect.left, height: content.offsetHeight });\n setIsStuck(!disabled && rootRect.top <= offsetTop);\n }, [disabled, offsetTop]);\n\n useLayoutEffect(() => {\n update();\n }, [update, children]);\n\n useEffect(() => {\n let raf = 0;\n const schedule = () => {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(update);\n };\n window.addEventListener('scroll', schedule, { passive: true, capture: true });\n window.addEventListener('resize', schedule);\n\n const ro = new ResizeObserver(schedule);\n if (rootRef.current) ro.observe(rootRef.current);\n if (contentRef.current) ro.observe(contentRef.current);\n\n return () => {\n cancelAnimationFrame(raf);\n window.removeEventListener('scroll', schedule, { capture: true } as EventListenerOptions);\n window.removeEventListener('resize', schedule);\n ro.disconnect();\n };\n }, [update]);\n\n const firstRun = useRef(true);\n useEffect(() => {\n if (firstRun.current) {\n firstRun.current = false;\n return;\n }\n onStuckChangeRef.current?.(isStuck);\n }, [isStuck]);\n\n const contentStyle: React.CSSProperties | undefined = isStuck\n ? {\n position: 'fixed',\n top: offsetTop,\n left: metrics.left,\n width: metrics.width,\n zIndex,\n ...slotStyles?.content,\n }\n : slotStyles?.content;\n\n return (\n <div ref={rootRef} className={cx(styles.sticky, className, classNames?.root)} style={{ ...slotStyles?.root, ...style }} {...rest}>\n {isStuck && (\n <div\n aria-hidden\n className={cx(styles.stickyPlaceholder, classNames?.placeholder)}\n style={{ height: metrics.height, ...slotStyles?.placeholder }}\n />\n )}\n <div\n ref={contentRef}\n className={cx(styles.stickyContent, isStuck && styles.stickyContentStuck, classNames?.content)}\n style={contentStyle}\n >\n {children}\n </div>\n </div>\n );\n}\n"],"mappings":"iNAYA,SAAwB,EAAO,CAC7B,WACA,YAAY,EACZ,SAAS,GACT,WAAW,GACX,gBACA,YACA,QACA,aACA,OAAQ,EACR,GAAG,GACW,CACd,IAAM,EAAU,EAAuB,IAAI,EACrC,EAAa,EAAuB,IAAI,EACxC,CAAC,EAAS,GAAc,EAAS,EAAK,EACtC,CAAC,EAAS,GAAc,EAAkB,CAAE,MAAO,EAAG,KAAM,EAAG,OAAQ,CAAE,CAAC,EAE1E,EAAmB,EAAO,CAAa,EAC7C,MAAgB,CACd,EAAiB,QAAU,CAC7B,EAAG,CAAC,CAAa,CAAC,EAElB,IAAM,EAAS,MAAkB,CAC/B,IAAM,EAAO,EAAQ,QACf,EAAU,EAAW,QAC3B,GAAI,CAAC,GAAQ,CAAC,EAAS,OACvB,IAAM,EAAW,EAAK,sBAAsB,EAC5C,EAAW,CAAE,MAAO,EAAK,YAAa,KAAM,EAAS,KAAM,OAAQ,EAAQ,YAAa,CAAC,EACzF,EAAW,CAAC,GAAY,EAAS,KAAO,CAAS,CACnD,EAAG,CAAC,EAAU,CAAS,CAAC,EAExB,MAAsB,CACpB,EAAO,CACT,EAAG,CAAC,EAAQ,CAAQ,CAAC,EAErB,MAAgB,CACd,IAAI,EAAM,EACJ,MAAiB,CACrB,qBAAqB,CAAG,EACxB,EAAM,sBAAsB,CAAM,CACpC,EACA,OAAO,iBAAiB,SAAU,EAAU,CAAE,QAAS,GAAM,QAAS,EAAK,CAAC,EAC5E,OAAO,iBAAiB,SAAU,CAAQ,EAE1C,IAAM,EAAK,IAAI,eAAe,CAAQ,EAItC,OAHI,EAAQ,SAAS,EAAG,QAAQ,EAAQ,OAAO,EAC3C,EAAW,SAAS,EAAG,QAAQ,EAAW,OAAO,MAExC,CACX,qBAAqB,CAAG,EACxB,OAAO,oBAAoB,SAAU,EAAU,CAAE,QAAS,EAAK,CAAyB,EACxF,OAAO,oBAAoB,SAAU,CAAQ,EAC7C,EAAG,WAAW,CAChB,CACF,EAAG,CAAC,CAAM,CAAC,EAEX,IAAM,EAAW,EAAO,EAAI,EAC5B,MAAgB,CACd,GAAI,EAAS,QAAS,CACpB,EAAS,QAAU,GACnB,MACF,CACA,EAAiB,UAAU,CAAO,CACpC,EAAG,CAAC,CAAO,CAAC,EAEZ,IAAM,EAAgD,EAClD,CACE,SAAU,QACV,IAAK,EACL,KAAM,EAAQ,KACd,MAAO,EAAQ,MACf,SACA,GAAG,GAAY,OACjB,EACA,GAAY,QAEhB,OACE,EAAC,MAAD,CAAK,IAAK,EAAS,UAAW,EAAG,EAAO,OAAQ,EAAW,GAAY,IAAI,EAAG,MAAO,CAAE,GAAG,GAAY,KAAM,GAAG,CAAM,EAAG,GAAI,WAA5H,CACG,GACC,EAAC,MAAD,CACE,cAAA,GACA,UAAW,EAAG,EAAO,kBAAmB,GAAY,WAAW,EAC/D,MAAO,CAAE,OAAQ,EAAQ,OAAQ,GAAG,GAAY,WAAY,CAC7D,CAAA,EAEH,EAAC,MAAD,CACE,IAAK,EACL,UAAW,EAAG,EAAO,cAAe,GAAW,EAAO,mBAAoB,GAAY,OAAO,EAC7F,MAAO,EAEN,UACE,CAAA,CACF,GAET"}
@@ -0,0 +1,2 @@
1
+ var e={sticky:`sticky_L6zO2`,"sticky-content":`sticky-content_ZaXTD`,stickyContent:`sticky-content_ZaXTD`,"sticky-content-stuck":`sticky-content-stuck_w-gRW`,stickyContentStuck:`sticky-content-stuck_w-gRW`,"sticky-placeholder":`sticky-placeholder_aJ3Sb`,stickyPlaceholder:`sticky-placeholder_aJ3Sb`};export{e as default};
2
+ //# sourceMappingURL=sticky.module.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sticky.module.mjs","names":[],"sources":["../../../../package/common/sticky/sticky.module.pcss"],"sourcesContent":[".sticky {\n display: block;\n\n &-content {\n /* No positioning by default — the content lives in normal flow until it sticks. */\n }\n\n &-content-stuck {\n /* Positioning (position/top/left/width/z-index) is applied inline so it can be measured;\n this class is a styling hook for consumers (e.g. a shadow once stuck). */\n }\n\n &-placeholder {\n /* Reserves the exact space the content left behind, so nothing below jumps up. */\n pointer-events: none;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import e from"./switch.module.mjs";import{useEffect as t,useState as n}from"react";import r from"classnames";import{jsx as i,jsxs as a}from"react/jsx-runtime";function o({label:o=``,selected:s=!1,onToggle:c=()=>{},className:l=``,style:u,disabled:d=!1,title:f=``,tabIndex:p=0,formValidator:m=null,children:h=null,classNames:g,styles:_,...v}){let[,y]=n(0);t(()=>{if(!m)return;let e=()=>y(e=>e+1);return m.registerOnUpdateListener(e),()=>m.removeOnUpdateListener(e)},[m]);function b(e){d||(m&&m.set(!m.value),c(!x,e))}let x=m?m.value:s;return a(`div`,{...v,title:f,className:r(e.switch,{[e.switchDisabled]:d},l),style:u,onClick:b,onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),b(e))},role:`switch`,"aria-checked":x,tabIndex:d?-1:p,children:[i(`div`,{className:r(e.switchTrack,x&&e.switchTrackChecked,g?.track),style:_?.track,children:i(`div`,{className:r(e.switchThumb,x&&e.switchThumbChecked,g?.thumb),style:_?.thumb})}),(h||o)&&i(`div`,{className:r(e.switchLabel,g?.label),style:_?.label,children:h||o})]})}export{o as default};
2
+ //# sourceMappingURL=switch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.mjs","names":[],"sources":["../../../../package/common/switch/switch.tsx"],"sourcesContent":["import { useEffect, useState, type ReactElement } from 'react';\nimport cx from 'classnames';\n\nimport type { SwitchProps } from './switch.types';\nimport styles from './switch.module.pcss';\n\nfunction Switch({\n label = '',\n selected = false,\n onToggle = () => {},\n className = '',\n style,\n disabled = false,\n title = '',\n tabIndex = 0,\n formValidator = null,\n children = null,\n classNames,\n styles: slotStyles,\n ...rest\n}: SwitchProps): ReactElement {\n const [, forceUpdate] = useState(0);\n\n useEffect(() => {\n if (!formValidator) return;\n const listener = () => forceUpdate((n) => n + 1);\n formValidator.registerOnUpdateListener(listener);\n return () => formValidator.removeOnUpdateListener(listener);\n }, [formValidator]);\n\n function handleToggle(event?: React.MouseEvent | React.KeyboardEvent) {\n if (disabled) return;\n if (formValidator) {\n formValidator.set(!formValidator.value);\n }\n onToggle(!currSelected, event);\n }\n\n const currSelected = (formValidator ? formValidator.value : selected) as boolean;\n\n return (\n <div\n {...rest}\n title={title}\n className={cx(\n styles.switch,\n {\n [styles.switchDisabled]: disabled,\n },\n className\n )}\n style={style}\n onClick={handleToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleToggle(e);\n }\n }}\n role=\"switch\"\n aria-checked={currSelected}\n tabIndex={disabled ? -1 : tabIndex}\n >\n <div\n className={cx(styles.switchTrack, currSelected && styles.switchTrackChecked, classNames?.track)}\n style={slotStyles?.track}\n >\n <div\n className={cx(styles.switchThumb, currSelected && styles.switchThumbChecked, classNames?.thumb)}\n style={slotStyles?.thumb}\n />\n </div>\n {(children || label) && (\n <div className={cx(styles.switchLabel, classNames?.label)} style={slotStyles?.label}>\n {children || label}\n </div>\n )}\n </div>\n );\n}\n\nexport default Switch;\n"],"mappings":"+JAMA,SAAS,EAAO,CACd,QAAQ,GACR,WAAW,GACX,eAAiB,CAAC,EAClB,YAAY,GACZ,QACA,WAAW,GACX,QAAQ,GACR,WAAW,EACX,gBAAgB,KAChB,WAAW,KACX,aACA,OAAQ,EACR,GAAG,GACyB,CAC5B,GAAM,EAAG,GAAe,EAAS,CAAC,EAElC,MAAgB,CACd,GAAI,CAAC,EAAe,OACpB,IAAM,MAAiB,EAAa,GAAM,EAAI,CAAC,EAE/C,OADA,EAAc,yBAAyB,CAAQ,MAClC,EAAc,uBAAuB,CAAQ,CAC5D,EAAG,CAAC,CAAa,CAAC,EAElB,SAAS,EAAa,EAAgD,CAChE,IACA,GACF,EAAc,IAAI,CAAC,EAAc,KAAK,EAExC,EAAS,CAAC,EAAc,CAAK,EAC/B,CAEA,IAAM,EAAgB,EAAgB,EAAc,MAAQ,EAE5D,OACE,EAAC,MAAD,CACE,GAAI,EACG,QACP,UAAW,EACT,EAAO,OACP,EACG,EAAO,gBAAiB,CAC3B,EACA,CACF,EACO,QACP,QAAS,EACT,UAAY,GAAM,EACZ,EAAE,MAAQ,SAAW,EAAE,MAAQ,OACjC,EAAE,eAAe,EACjB,EAAa,CAAC,EAElB,EACA,KAAK,SACL,eAAc,EACd,SAAU,EAAW,GAAK,WApB5B,CAsBE,EAAC,MAAD,CACE,UAAW,EAAG,EAAO,YAAa,GAAgB,EAAO,mBAAoB,GAAY,KAAK,EAC9F,MAAO,GAAY,eAEnB,EAAC,MAAD,CACE,UAAW,EAAG,EAAO,YAAa,GAAgB,EAAO,mBAAoB,GAAY,KAAK,EAC9F,MAAO,GAAY,KACpB,CAAA,CACE,CAAA,GACH,GAAY,IACZ,EAAC,MAAD,CAAK,UAAW,EAAG,EAAO,YAAa,GAAY,KAAK,EAAG,MAAO,GAAY,eAC3E,GAAY,CACV,CAAA,CAEJ,GAET"}
@@ -0,0 +1,2 @@
1
+ var e={switch:`switch_9TG2Y`,"switch-disabled":`switch-disabled_UL-F-`,switchDisabled:`switch-disabled_UL-F-`,"switch-track":`switch-track_awA-t`,switchTrack:`switch-track_awA-t`,"switch-track-checked":`switch-track-checked_boZKe`,switchTrackChecked:`switch-track-checked_boZKe`,"switch-thumb":`switch-thumb_4fUTo`,switchThumb:`switch-thumb_4fUTo`,"switch-thumb-checked":`switch-thumb-checked_GU--w`,switchThumbChecked:`switch-thumb-checked_GU--w`,"switch-label":`switch-label_3pLBQ`,switchLabel:`switch-label_3pLBQ`};export{e as default};
2
+ //# sourceMappingURL=switch.module.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"switch.module.mjs","names":[],"sources":["../../../../package/common/switch/switch.module.pcss"],"sourcesContent":[".switch {\n user-select: none;\n display: flex;\n align-items: center;\n column-gap: 0.625em;\n width: fit-content;\n cursor: pointer;\n border: 1px solid transparent;\n margin: -1px;\n\n &:focus-visible {\n outline: none;\n border: 1px solid var(--primary-color);\n border-radius: var(--default-border-radius);\n }\n\n &-disabled {\n filter: brightness(0.8);\n cursor: not-allowed;\n }\n\n &-track {\n width: 2.25em;\n height: 1.25em;\n flex-shrink: 0;\n border-radius: var(--default-border-radius);\n background-color: var(--border-color);\n position: relative;\n transition: background-color 0.2s;\n box-sizing: border-box;\n padding: 0.125em;\n\n &-checked {\n background-color: var(--primary-color);\n }\n }\n\n &-thumb {\n width: 1em;\n height: 1em;\n border-radius: var(--default-border-radius);\n background-color: var(--background);\n box-shadow: var(--card-shadow);\n transform: translateX(0);\n transition: transform 0.2s;\n\n &-checked {\n transform: translateX(1em);\n }\n }\n\n &-label {\n line-height: 100%;\n color: var(--text-color);\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import e from"../interactableDiv/index.mjs";import t from"./tabHeader.module.mjs";import"react";import n from"classnames";import{FontAwesomeIcon as r}from"@fortawesome/react-fontawesome";import{jsx as i,jsxs as a}from"react/jsx-runtime";function o({tabs:o=[],currentTab:s,onChange:c,className:l,style:u,classNames:d,styles:f,...p}){return i(`div`,{...p,role:`tablist`,className:n(t.tabHeader,d?.root,l),style:{...f?.root,...u},children:o.map(o=>{let l=o.id===s,u=!!o.title||!!o.subtitle;return a(e,{role:`tab`,"aria-selected":l,"aria-disabled":o.disabled||void 0,tabIndex:o.disabled?-1:0,className:n(t.tabHeaderTab,{[t.tabHeaderTabActive]:l},{[t.tabHeaderTabDisabled]:o.disabled},d?.tab),style:f?.tab,onClick:()=>{o.disabled||l||c(o.id)},children:[i(r,{icon:o.icon,className:n(t.tabHeaderIcon,d?.icon),style:f?.icon}),u&&a(`div`,{className:n(t.tabHeaderLabels,d?.labels),style:f?.labels,children:[o.title&&i(`span`,{className:n(t.tabHeaderTitle,d?.title),style:f?.title,children:o.title}),o.subtitle&&i(`span`,{className:n(t.tabHeaderSubtitle,d?.subtitle),style:f?.subtitle,children:o.subtitle})]})]},o.id)})})}export{o as default};
2
+ //# sourceMappingURL=tabHeader.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabHeader.mjs","names":[],"sources":["../../../../package/common/tabHeader/tabHeader.tsx"],"sourcesContent":["import React from 'react';\nimport cx from 'classnames';\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome';\n\nimport InteractableDiv from '../interactableDiv';\nimport type { TabHeaderProps, TabHeaderTab } from './tabHeader.types';\n\nimport styles from './tabHeader.module.pcss';\n\nfunction TabHeader({\n tabs = [],\n currentTab,\n onChange,\n className,\n style,\n classNames,\n styles: slotStyles,\n ...rest\n}: TabHeaderProps) {\n return (\n <div\n {...rest}\n role=\"tablist\"\n className={cx(styles.tabHeader, classNames?.root, className)}\n style={{ ...slotStyles?.root, ...style }}\n >\n {tabs.map((tab: TabHeaderTab) => {\n const isActive = tab.id === currentTab;\n const hasLabels = !!tab.title || !!tab.subtitle;\n\n return (\n <InteractableDiv\n key={tab.id}\n role=\"tab\"\n aria-selected={isActive}\n aria-disabled={tab.disabled || undefined}\n tabIndex={tab.disabled ? -1 : 0}\n className={cx(\n styles.tabHeaderTab,\n { [styles.tabHeaderTabActive]: isActive },\n { [styles.tabHeaderTabDisabled]: tab.disabled },\n classNames?.tab\n )}\n style={slotStyles?.tab}\n onClick={() => {\n if (tab.disabled || isActive) return;\n onChange(tab.id);\n }}\n >\n <FontAwesomeIcon\n icon={tab.icon}\n className={cx(styles.tabHeaderIcon, classNames?.icon)}\n style={slotStyles?.icon as React.CSSProperties & Record<`--fa-font-${string}`, string>}\n />\n {hasLabels && (\n <div className={cx(styles.tabHeaderLabels, classNames?.labels)} style={slotStyles?.labels}>\n {tab.title && (\n <span className={cx(styles.tabHeaderTitle, classNames?.title)} style={slotStyles?.title}>\n {tab.title}\n </span>\n )}\n {tab.subtitle && (\n <span className={cx(styles.tabHeaderSubtitle, classNames?.subtitle)} style={slotStyles?.subtitle}>\n {tab.subtitle}\n </span>\n )}\n </div>\n )}\n </InteractableDiv>\n );\n })}\n </div>\n );\n}\n\nexport default TabHeader;\n"],"mappings":"6OASA,SAAS,EAAU,CACjB,OAAO,CAAC,EACR,aACA,WACA,YACA,QACA,aACA,OAAQ,EACR,GAAG,GACc,CACjB,OACE,EAAC,MAAD,CACE,GAAI,EACJ,KAAK,UACL,UAAW,EAAG,EAAO,UAAW,GAAY,KAAM,CAAS,EAC3D,MAAO,CAAE,GAAG,GAAY,KAAM,GAAG,CAAM,WAEtC,EAAK,IAAK,GAAsB,CAC/B,IAAM,EAAW,EAAI,KAAO,EACtB,EAAY,CAAC,CAAC,EAAI,OAAS,CAAC,CAAC,EAAI,SAEvC,OACE,EAAC,EAAD,CAEE,KAAK,MACL,gBAAe,EACf,gBAAe,EAAI,UAAY,IAAA,GAC/B,SAAU,EAAI,SAAW,GAAK,EAC9B,UAAW,EACT,EAAO,aACP,EAAG,EAAO,oBAAqB,CAAS,EACxC,EAAG,EAAO,sBAAuB,EAAI,QAAS,EAC9C,GAAY,GACd,EACA,MAAO,GAAY,IACnB,YAAe,CACT,EAAI,UAAY,GACpB,EAAS,EAAI,EAAE,CACjB,WAhBF,CAkBE,EAAC,EAAD,CACE,KAAM,EAAI,KACV,UAAW,EAAG,EAAO,cAAe,GAAY,IAAI,EACpD,MAAO,GAAY,IACpB,CAAA,EACA,GACC,EAAC,MAAD,CAAK,UAAW,EAAG,EAAO,gBAAiB,GAAY,MAAM,EAAG,MAAO,GAAY,gBAAnF,CACG,EAAI,OACH,EAAC,OAAD,CAAM,UAAW,EAAG,EAAO,eAAgB,GAAY,KAAK,EAAG,MAAO,GAAY,eAC/E,EAAI,KACD,CAAA,EAEP,EAAI,UACH,EAAC,OAAD,CAAM,UAAW,EAAG,EAAO,kBAAmB,GAAY,QAAQ,EAAG,MAAO,GAAY,kBACrF,EAAI,QACD,CAAA,CAEL,GAEQ,GApCV,EAAI,EAoCM,CAErB,CAAC,CACE,CAAA,CAET"}
@@ -0,0 +1,2 @@
1
+ var e={tabHeader:`tabHeader_C-b9d`,"tabHeader-tab":`tabHeader-tab_Wbyt-`,tabHeaderTab:`tabHeader-tab_Wbyt-`,"tabHeader-tab-active":`tabHeader-tab-active_IExSo`,tabHeaderTabActive:`tabHeader-tab-active_IExSo`,"tabHeader-tab-disabled":`tabHeader-tab-disabled_yWJxS`,tabHeaderTabDisabled:`tabHeader-tab-disabled_yWJxS`,"tabHeader-icon":`tabHeader-icon_ryEHB`,tabHeaderIcon:`tabHeader-icon_ryEHB`,"tabHeader-labels":`tabHeader-labels_q5Af5`,tabHeaderLabels:`tabHeader-labels_q5Af5`,"tabHeader-title":`tabHeader-title_Jq2Vy`,tabHeaderTitle:`tabHeader-title_Jq2Vy`,"tabHeader-subtitle":`tabHeader-subtitle_4lhSa`,tabHeaderSubtitle:`tabHeader-subtitle_4lhSa`};export{e as default};
2
+ //# sourceMappingURL=tabHeader.module.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabHeader.module.mjs","names":[],"sources":["../../../../package/common/tabHeader/tabHeader.module.pcss"],"sourcesContent":[".tabHeader {\n display: flex;\n align-items: stretch;\n gap: 4px;\n border-bottom: 1px solid var(--border-color);\n user-select: none;\n overflow-x: auto;\n\n &-tab {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 12px 16px;\n cursor: pointer;\n color: var(--text-dark);\n border-bottom: 2px solid transparent;\n border-radius: var(--default-border-radius) var(--default-border-radius) 0 0;\n transition: color 0.2s, background 0.2s, border-color 0.2s;\n white-space: nowrap;\n\n &:hover {\n background: var(--background-accent-light);\n color: var(--text-color);\n }\n\n &-active {\n color: var(--primary-color);\n border-bottom-color: var(--primary-color);\n\n &:hover {\n color: var(--primary-color);\n }\n }\n\n &-disabled {\n opacity: 0.5;\n pointer-events: none;\n cursor: default;\n }\n }\n\n &-icon {\n font-size: 18px;\n flex-shrink: 0;\n }\n\n &-labels {\n display: flex;\n flex-direction: column;\n text-align: left;\n line-height: 1.25;\n }\n\n &-title {\n font-weight: var(--header-font-weight, 600);\n font-size: var(--default-font-size);\n }\n\n &-subtitle {\n font-size: var(--text-small-font-size);\n color: var(--text-dark);\n }\n}\n\n@media (max-width: 640px) {\n .tabHeader-tab:not(.tabHeader-tab-active) .tabHeader-labels {\n display: none;\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import e from"../input/input.mjs";import"react";import{jsx as t}from"react/jsx-runtime";function n(n){return t(e,{...n,multiline:!0})}export{n as default};
2
+ //# sourceMappingURL=textarea.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.mjs","names":[],"sources":["../../../../package/common/textarea/textarea.tsx"],"sourcesContent":["import React from 'react';\nimport Input from 'components/common/input';\nimport type { TextareaProps } from './textarea.types';\n\nexport default function Textarea(props: TextareaProps) {\n return <Input {...props} multiline />;\n}\n"],"mappings":"wFAIA,SAAwB,EAAS,EAAsB,CACrD,OAAO,EAAC,EAAD,CAAO,GAAI,EAAO,UAAA,EAAW,CAAA,CACtC"}
@@ -0,0 +1,2 @@
1
+ var e={id:`default`,variables:{"--grey":`#8A8A8A`,"--lightgrey":`#e0e0e0`,"--lightergrey":`#B1B1B1`,"--white":`#FFFFFF`,"--red":`#D6002A`,"--lighter-red":`#ffeae9`,"--green":`#287626`,"--lighter-green":`#C4FFC9`,"--blue":`#5873d5`,"--lighter-blue":`#C6DBFF`,"--black":`black`,"--orange":`#ff7f50`,"--lighter-orange":`#ffe5d9`,"--primary-color":`#8184d6`,"--primary-accent":`#90CAF9`,"--primary-lighter":`#9a9ce4`,"--accent-color":`var(--grey)`,"--accent-color-light":`var(--lightgrey)`,"--text-color":`var(--white)`,"--text-dark":`var(--lightergrey)`,"--text-light":`var(--lightergrey)`,"--text-on-primary":`var(--white)`,"--text-on-delete":`var(--white)`,"--border-color":`#656574`,"--background":`#393945`,"--background-accent":`#33333c`,"--background-accent-dark":`var(--grey)`,"--background-accent-light":`#484856`,"--background-modal":`#484856`,"--success-color":`var(--green)`,"--success-lighter":`var(--lighter-green)`,"--error-color":`var(--red)`,"--error-lighter":`var(--lighter-red)`,"--info-color":`var(--blue)`,"--info-lighter":`var(--lighter-blue)`,"--warn-color":`var(--orange)`,"--warn-lighter":`var(--lighter-orange)`,"--default-font-size":`14px`,"--text-small-font-size":`12px`,"--header-font-size":`24px`,"--header-medium-font-size":`18px`,"--header-small-font-size":`16px`,"--default-font-weight":`400`,"--header-font-weight":`600`,"--input-background":`transparent`,"--input-icon-color":`var(--text-color)`,"--error-border-color":`var(--red)`,"--button-default-color":`var(--primary-color)`,"--button-default-border":`1px solid var(--primary-color)`,"--default-border-radius":`8px`,"--padding-sides":`15px`,"--margin-top":`10px`,"--default-font":`'Inter', sans-serif`,"--themed-font":`'Inter', sans-serif`,"--card-shadow":`0 3px 1px -2px rgb(0 0 0 / 20%), 0 2px 2px 0 rgb(0 0 0 / 14%), 0 1px 5px 0 rgb(0 0 0 / 12%)`,"--background-card-elevated":`var(--background-accent-light)`,"--background-card-outlined":`transparent`,"--background-card-filled":`var(--background-accent)`,"--spacing-s":`4px`,"--spacing-m":`8px`,"--spacing-l":`16px`}};export{e as defaultTheme};
2
+ //# sourceMappingURL=defaultTheme.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultTheme.mjs","names":[],"sources":["../../../../package/common/themeProvider/defaultTheme.ts"],"sourcesContent":["import type { Theme } from './theme.types';\n\n/**\n * Built-in default theme used by ThemeProvider when no `themes` prop is\n * supplied. Provides a complete set of CSS variables so the component\n * library renders correctly out of the box.\n */\nexport const defaultTheme: Theme = {\n id: 'default',\n variables: {\n '--grey': '#8A8A8A',\n '--lightgrey': '#e0e0e0',\n '--lightergrey': '#B1B1B1',\n '--white': '#FFFFFF',\n '--red': '#D6002A',\n '--lighter-red': '#ffeae9',\n '--green': '#287626',\n '--lighter-green': '#C4FFC9',\n '--blue': '#5873d5',\n '--lighter-blue': '#C6DBFF',\n '--black': 'black',\n '--orange': '#ff7f50',\n '--lighter-orange': '#ffe5d9',\n\n '--primary-color': '#8184d6',\n '--primary-accent': '#90CAF9',\n '--primary-lighter': '#9a9ce4',\n '--accent-color': 'var(--grey)',\n '--accent-color-light': 'var(--lightgrey)',\n\n '--text-color': 'var(--white)',\n '--text-dark': 'var(--lightergrey)',\n '--text-light': 'var(--lightergrey)',\n '--text-on-primary': 'var(--white)',\n '--text-on-delete': 'var(--white)',\n '--border-color': '#656574',\n\n '--background': '#393945',\n '--background-accent': '#33333c',\n '--background-accent-dark': 'var(--grey)',\n '--background-accent-light': '#484856',\n '--background-modal': '#484856',\n\n '--success-color': 'var(--green)',\n '--success-lighter': 'var(--lighter-green)',\n '--error-color': 'var(--red)',\n '--error-lighter': 'var(--lighter-red)',\n '--info-color': 'var(--blue)',\n '--info-lighter': 'var(--lighter-blue)',\n '--warn-color': 'var(--orange)',\n '--warn-lighter': 'var(--lighter-orange)',\n\n '--default-font-size': '14px',\n '--text-small-font-size': '12px',\n '--header-font-size': '24px',\n '--header-medium-font-size': '18px',\n '--header-small-font-size': '16px',\n\n '--default-font-weight': '400',\n '--header-font-weight': '600',\n\n '--input-background': 'transparent',\n '--input-icon-color': 'var(--text-color)',\n '--error-border-color': 'var(--red)',\n\n '--button-default-color': 'var(--primary-color)',\n '--button-default-border': '1px solid var(--primary-color)',\n\n '--default-border-radius': '8px',\n '--padding-sides': '15px',\n '--margin-top': '10px',\n\n '--default-font': \"'Inter', sans-serif\",\n '--themed-font': \"'Inter', sans-serif\",\n\n '--card-shadow':\n '0 3px 1px -2px rgb(0 0 0 / 20%), 0 2px 2px 0 rgb(0 0 0 / 14%), 0 1px 5px 0 rgb(0 0 0 / 12%)',\n\n '--background-card-elevated': 'var(--background-accent-light)',\n '--background-card-outlined': 'transparent',\n '--background-card-filled': 'var(--background-accent)',\n\n '--spacing-s': '4px',\n '--spacing-m': '8px',\n '--spacing-l': '16px',\n },\n};\n"],"mappings":"AAOA,IAAa,EAAsB,CACjC,GAAI,UACJ,UAAW,CACT,SAAU,UACV,cAAe,UACf,gBAAiB,UACjB,UAAW,UACX,QAAS,UACT,gBAAiB,UACjB,UAAW,UACX,kBAAmB,UACnB,SAAU,UACV,iBAAkB,UAClB,UAAW,QACX,WAAY,UACZ,mBAAoB,UAEpB,kBAAmB,UACnB,mBAAoB,UACpB,oBAAqB,UACrB,iBAAkB,cAClB,uBAAwB,mBAExB,eAAgB,eAChB,cAAe,qBACf,eAAgB,qBAChB,oBAAqB,eACrB,mBAAoB,eACpB,iBAAkB,UAElB,eAAgB,UAChB,sBAAuB,UACvB,2BAA4B,cAC5B,4BAA6B,UAC7B,qBAAsB,UAEtB,kBAAmB,eACnB,oBAAqB,uBACrB,gBAAiB,aACjB,kBAAmB,qBACnB,eAAgB,cAChB,iBAAkB,sBAClB,eAAgB,gBAChB,iBAAkB,wBAElB,sBAAuB,OACvB,yBAA0B,OAC1B,qBAAsB,OACtB,4BAA6B,OAC7B,2BAA4B,OAE5B,wBAAyB,MACzB,uBAAwB,MAExB,qBAAsB,cACtB,qBAAsB,oBACtB,uBAAwB,aAExB,yBAA0B,uBAC1B,0BAA2B,iCAE3B,0BAA2B,MAC3B,kBAAmB,OACnB,eAAgB,OAEhB,iBAAkB,sBAClB,gBAAiB,sBAEjB,gBACE,8FAEF,6BAA8B,iCAC9B,6BAA8B,cAC9B,2BAA4B,2BAE5B,cAAe,MACf,cAAe,MACf,cAAe,MACjB,CACF"}
@@ -0,0 +1,2 @@
1
+ var e={colorFade:`colorFade_eLv2g`};export{e as default};
2
+ //# sourceMappingURL=theme.module.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.module.mjs","names":[],"sources":["../../../../package/common/themeProvider/theme.module.pcss"],"sourcesContent":[".colorFade * {\n transition: background 0.3s ease-in-out;\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import{defaultTheme as e}from"./defaultTheme.mjs";import t from"./theme.module.mjs";import n,{Component as r}from"react";import{jsx as i}from"react/jsx-runtime";var a=class extends r{constructor(...t){super(...t),this.state={resolvedVariables:{},colorFadeActive:!1,currentThemeColor:null},this.colorFadeTimeout=null,this.wrapperRef=n.createRef(),this.themeColorMeta=null,this.createdThemeColorMeta=!1,this.applyTheme=t=>{let n=this.props.themes??[e],r=n.find(e=>!e.baseThemeId)??n[0],i=r?r.variables:{},a=n.find(e=>e.id===t),o=a?this.resolveChain(a.id):[],s=Object.assign({},i,...o);this.setState({resolvedVariables:s,colorFadeActive:!0}),this.colorFadeTimeout&&clearTimeout(this.colorFadeTimeout),this.colorFadeTimeout=setTimeout(()=>{this.setState({colorFadeActive:!1}),this.colorFadeTimeout=null},500),setTimeout(()=>{this.wrapperRef.current&&this.setState({currentThemeColor:getComputedStyle(this.wrapperRef.current).getPropertyValue(`--primary-color`).trim()})},1)}}componentDidMount(){this.applyTheme(this.props.currentThemeId),this.syncThemeColorMeta(this.state.currentThemeColor??``)}componentDidUpdate(e,t){t.currentThemeColor!==this.state.currentThemeColor&&this.syncThemeColorMeta(this.state.currentThemeColor??``),(e.currentThemeId!==this.props.currentThemeId||e.themes!==this.props.themes)&&this.applyTheme(this.props.currentThemeId)}componentWillUnmount(){this.colorFadeTimeout&&clearTimeout(this.colorFadeTimeout),this.createdThemeColorMeta&&this.themeColorMeta?.remove()}syncThemeColorMeta(e){if(!(typeof document>`u`)){if(!this.themeColorMeta){let e=document.head.querySelector(`meta[name="theme-color"]`);if(e)this.themeColorMeta=e;else{let e=document.createElement(`meta`);e.setAttribute(`name`,`theme-color`),document.head.appendChild(e),this.themeColorMeta=e,this.createdThemeColorMeta=!0}}this.themeColorMeta.setAttribute(`content`,e)}}resolveChain(t){let n=(this.props.themes??[e]).find(e=>e.id===t);return n?[...n.baseThemeId?this.resolveChain(n.baseThemeId):[],n.variables]:[]}render(){let{children:e}=this.props,{resolvedVariables:n,colorFadeActive:r}=this.state;return i(`div`,{ref:this.wrapperRef,id:`themeProvider`,className:r?t.colorFade:void 0,style:n,children:e})}};export{a as default};
2
+ //# sourceMappingURL=themeProvider.mjs.map