@eifi1/ui-kit 0.51.4 → 0.51.6

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 (759) hide show
  1. package/README.md +5 -5
  2. package/dist/account/account-settings-labels.js.map +1 -1
  3. package/dist/account/account-settings.js +11 -9
  4. package/dist/account/account-settings.js.map +1 -1
  5. package/dist/account/delete-account-setting.js +56 -65
  6. package/dist/account/delete-account-setting.js.map +1 -1
  7. package/dist/account/email-change-setting-labels.js.map +1 -1
  8. package/dist/account/email-change-setting.js.map +1 -1
  9. package/dist/account/passkeys-setting.js.map +1 -1
  10. package/dist/account/sessions-setting.js.map +1 -1
  11. package/dist/admin/admin-action-confirm.js +1 -3
  12. package/dist/admin/admin-action-confirm.js.map +1 -1
  13. package/dist/admin/admin-action-log.js.map +1 -1
  14. package/dist/admin/admin-area-labels.js +4 -1
  15. package/dist/admin/admin-area-labels.js.map +1 -1
  16. package/dist/admin/admin-overview.js +19 -11
  17. package/dist/admin/admin-overview.js.map +1 -1
  18. package/dist/admin/admin-sections.js.map +1 -1
  19. package/dist/admin/admin-tool-links.d.ts +1 -1
  20. package/dist/admin/admin-tool-links.js +7 -1
  21. package/dist/admin/admin-tool-links.js.map +1 -1
  22. package/dist/admin/invitations-panel.js +2 -13
  23. package/dist/admin/invitations-panel.js.map +1 -1
  24. package/dist/admin/mail-test-card.js.map +1 -1
  25. package/dist/admin/reviewer-scope-editor.js +4 -11
  26. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  27. package/dist/admin/role-select.js.map +1 -1
  28. package/dist/admin/user-roster.js +1 -9
  29. package/dist/admin/user-roster.js.map +1 -1
  30. package/dist/auth/accept-invitation.js.map +1 -1
  31. package/dist/auth/auth-errors.js.map +1 -1
  32. package/dist/auth/forgot-password-form.js +23 -31
  33. package/dist/auth/forgot-password-form.js.map +1 -1
  34. package/dist/auth/register-form.js.map +1 -1
  35. package/dist/auth/reset-password-form.js.map +1 -1
  36. package/dist/auth/sign-in-form.js +13 -5
  37. package/dist/auth/sign-in-form.js.map +1 -1
  38. package/dist/auth/verify-email.js +1 -8
  39. package/dist/auth/verify-email.js.map +1 -1
  40. package/dist/billing/billing-banner.js.map +1 -1
  41. package/dist/billing/billing-labels.js.map +1 -1
  42. package/dist/billing/checkout-processing.js.map +1 -1
  43. package/dist/billing/plan-card.js +91 -85
  44. package/dist/billing/plan-card.js.map +1 -1
  45. package/dist/billing/plan-limit-toast.js.map +1 -1
  46. package/dist/billing/plan-limit.js.map +1 -1
  47. package/dist/billing/plan-price.js.map +1 -1
  48. package/dist/billing/plan-switch.js.map +1 -1
  49. package/dist/billing/subscription-actions.js.map +1 -1
  50. package/dist/bin/eifi1-pay-page.mjs +6 -1
  51. package/dist/components/account-chips.js.map +1 -1
  52. package/dist/components/alert-banner.js +1 -5
  53. package/dist/components/alert-banner.js.map +1 -1
  54. package/dist/components/amount-input.js +29 -12
  55. package/dist/components/amount-input.js.map +1 -1
  56. package/dist/components/authed-image.js.map +1 -1
  57. package/dist/components/autocomplete.js.map +1 -1
  58. package/dist/components/bulk-action-bar.js +1 -4
  59. package/dist/components/bulk-action-bar.js.map +1 -1
  60. package/dist/components/button-group.js.map +1 -1
  61. package/dist/components/button-look.js.map +1 -1
  62. package/dist/components/button.js +1 -7
  63. package/dist/components/button.js.map +1 -1
  64. package/dist/components/calculator.js +5 -5
  65. package/dist/components/calculator.js.map +1 -1
  66. package/dist/components/calendar-heatmap.js +4 -10
  67. package/dist/components/calendar-heatmap.js.map +1 -1
  68. package/dist/components/card.js +1 -8
  69. package/dist/components/card.js.map +1 -1
  70. package/dist/components/chart-zoom-core.js +3 -17
  71. package/dist/components/chart-zoom-core.js.map +1 -1
  72. package/dist/components/chart.d.ts +1 -1
  73. package/dist/components/chart.js +4 -22
  74. package/dist/components/chart.js.map +1 -1
  75. package/dist/components/checkbox-group.js +1 -4
  76. package/dist/components/checkbox-group.js.map +1 -1
  77. package/dist/components/chip-input.js +4 -1
  78. package/dist/components/chip-input.js.map +1 -1
  79. package/dist/components/chip.js +10 -5
  80. package/dist/components/chip.js.map +1 -1
  81. package/dist/components/choice-card.js +58 -74
  82. package/dist/components/choice-card.js.map +1 -1
  83. package/dist/components/column-mapper-labels.js.map +1 -1
  84. package/dist/components/column-mapper.js +167 -227
  85. package/dist/components/column-mapper.js.map +1 -1
  86. package/dist/components/combobox-core.js +1 -4
  87. package/dist/components/combobox-core.js.map +1 -1
  88. package/dist/components/combobox.js +1 -4
  89. package/dist/components/combobox.js.map +1 -1
  90. package/dist/components/confirm-dialog.js.map +1 -1
  91. package/dist/components/copy-button.js.map +1 -1
  92. package/dist/components/country-select.d.ts +5 -4
  93. package/dist/components/country-select.js +3 -19
  94. package/dist/components/country-select.js.map +1 -1
  95. package/dist/components/currency-option-list.js +10 -8
  96. package/dist/components/currency-option-list.js.map +1 -1
  97. package/dist/components/currency-select.js +1 -6
  98. package/dist/components/currency-select.js.map +1 -1
  99. package/dist/components/danger-confirm.js.map +1 -1
  100. package/dist/components/data-table-cells.js.map +1 -1
  101. package/dist/components/data-table-column-settings.js.map +1 -1
  102. package/dist/components/data-table-filter-popover.js +2 -18
  103. package/dist/components/data-table-filter-popover.js.map +1 -1
  104. package/dist/components/data-table-filters.js.map +1 -1
  105. package/dist/components/data-table-fit.js.map +1 -1
  106. package/dist/components/data-table-groups.js +3 -1
  107. package/dist/components/data-table-groups.js.map +1 -1
  108. package/dist/components/data-table-head.js +44 -56
  109. package/dist/components/data-table-head.js.map +1 -1
  110. package/dist/components/data-table-mobile.js +31 -44
  111. package/dist/components/data-table-mobile.js.map +1 -1
  112. package/dist/components/data-table-pagination.js.map +1 -1
  113. package/dist/components/data-table-row-actions.js +19 -16
  114. package/dist/components/data-table-row-actions.js.map +1 -1
  115. package/dist/components/data-table-row.js.map +1 -1
  116. package/dist/components/data-table-shared.js.map +1 -1
  117. package/dist/components/data-table-sort.js.map +1 -1
  118. package/dist/components/data-table-virtual.js +4 -1
  119. package/dist/components/data-table-virtual.js.map +1 -1
  120. package/dist/components/data-table.js +30 -39
  121. package/dist/components/data-table.js.map +1 -1
  122. package/dist/components/date-picker.js +1 -6
  123. package/dist/components/date-picker.js.map +1 -1
  124. package/dist/components/date-range-picker.js.map +1 -1
  125. package/dist/components/description-list.js +10 -10
  126. package/dist/components/description-list.js.map +1 -1
  127. package/dist/components/dialog-frame.js +9 -2
  128. package/dist/components/dialog-frame.js.map +1 -1
  129. package/dist/components/disclosure.js +17 -27
  130. package/dist/components/disclosure.js.map +1 -1
  131. package/dist/components/dropdown.js +25 -35
  132. package/dist/components/dropdown.js.map +1 -1
  133. package/dist/components/empty-state.js.map +1 -1
  134. package/dist/components/entity-combobox.js.map +1 -1
  135. package/dist/components/error-boundary.js.map +1 -1
  136. package/dist/components/field-base.js +5 -5
  137. package/dist/components/field-base.js.map +1 -1
  138. package/dist/components/field-parts.d.ts +1 -1
  139. package/dist/components/field-parts.js +10 -14
  140. package/dist/components/field-parts.js.map +1 -1
  141. package/dist/components/field-sync.js +8 -10
  142. package/dist/components/field-sync.js.map +1 -1
  143. package/dist/components/file-button.js.map +1 -1
  144. package/dist/components/file-dropzone.js.map +1 -1
  145. package/dist/components/floating-panel.js +4 -1
  146. package/dist/components/floating-panel.js.map +1 -1
  147. package/dist/components/focus-ring.js.map +1 -1
  148. package/dist/components/form-actions.js.map +1 -1
  149. package/dist/components/grouped-picker.js +6 -8
  150. package/dist/components/grouped-picker.js.map +1 -1
  151. package/dist/components/hover-menu.js +1 -4
  152. package/dist/components/hover-menu.js.map +1 -1
  153. package/dist/components/iban-input-labels.js.map +1 -1
  154. package/dist/components/icon-button.js +4 -1
  155. package/dist/components/icon-button.js.map +1 -1
  156. package/dist/components/icon-picker.js +2 -7
  157. package/dist/components/icon-picker.js.map +1 -1
  158. package/dist/components/image-grid.js +41 -50
  159. package/dist/components/image-grid.js.map +1 -1
  160. package/dist/components/inline-edit-field.js.map +1 -1
  161. package/dist/components/inline-entity-combobox.js +2 -8
  162. package/dist/components/inline-entity-combobox.js.map +1 -1
  163. package/dist/components/input.js +14 -2
  164. package/dist/components/input.js.map +1 -1
  165. package/dist/components/jump-calendar.js +1 -7
  166. package/dist/components/jump-calendar.js.map +1 -1
  167. package/dist/components/legal-labels.js.map +1 -1
  168. package/dist/components/legal-page.js +14 -2
  169. package/dist/components/legal-page.js.map +1 -1
  170. package/dist/components/legal.js +12 -2
  171. package/dist/components/legal.js.map +1 -1
  172. package/dist/components/lightbox.js.map +1 -1
  173. package/dist/components/line-items.js +26 -36
  174. package/dist/components/line-items.js.map +1 -1
  175. package/dist/components/list.js +22 -10
  176. package/dist/components/list.js.map +1 -1
  177. package/dist/components/measured-grid.js +29 -53
  178. package/dist/components/measured-grid.js.map +1 -1
  179. package/dist/components/menu-item.js.map +1 -1
  180. package/dist/components/mini-calendar.js +13 -31
  181. package/dist/components/mini-calendar.js.map +1 -1
  182. package/dist/components/money-field.js.map +1 -1
  183. package/dist/components/month-picker.js +10 -21
  184. package/dist/components/month-picker.js.map +1 -1
  185. package/dist/components/multi-entity-combobox.js +3 -16
  186. package/dist/components/multi-entity-combobox.js.map +1 -1
  187. package/dist/components/multi-select.js.map +1 -1
  188. package/dist/components/nav-pills.js +10 -1
  189. package/dist/components/nav-pills.js.map +1 -1
  190. package/dist/components/number-field.js.map +1 -1
  191. package/dist/components/number-input.js +1 -7
  192. package/dist/components/number-input.js.map +1 -1
  193. package/dist/components/numpad-sheet.js +1 -4
  194. package/dist/components/numpad-sheet.js.map +1 -1
  195. package/dist/components/one-time-code-input.js +1 -7
  196. package/dist/components/one-time-code-input.js.map +1 -1
  197. package/dist/components/page-contents.js +13 -22
  198. package/dist/components/page-contents.js.map +1 -1
  199. package/dist/components/page-header.js +1 -11
  200. package/dist/components/page-header.js.map +1 -1
  201. package/dist/components/password-strength-labels.js.map +1 -1
  202. package/dist/components/password-strength.js +2 -8
  203. package/dist/components/password-strength.js.map +1 -1
  204. package/dist/components/phone-input.js +42 -57
  205. package/dist/components/phone-input.js.map +1 -1
  206. package/dist/components/picker-sheet.js.map +1 -1
  207. package/dist/components/pie-chart.js +1 -8
  208. package/dist/components/pie-chart.js.map +1 -1
  209. package/dist/components/popover.js.map +1 -1
  210. package/dist/components/progress-bar.js +16 -9
  211. package/dist/components/progress-bar.js.map +1 -1
  212. package/dist/components/qr-code.js +1 -8
  213. package/dist/components/qr-code.js.map +1 -1
  214. package/dist/components/row-actions.js +5 -1
  215. package/dist/components/row-actions.js.map +1 -1
  216. package/dist/components/search-field.js.map +1 -1
  217. package/dist/components/select.js +28 -38
  218. package/dist/components/select.js.map +1 -1
  219. package/dist/components/separator.js +1 -5
  220. package/dist/components/separator.js.map +1 -1
  221. package/dist/components/series-chart-axes.js +4 -1
  222. package/dist/components/series-chart-axes.js.map +1 -1
  223. package/dist/components/series-chart-budget.js.map +1 -1
  224. package/dist/components/series-chart-ticks.js.map +1 -1
  225. package/dist/components/series-chart.js +29 -45
  226. package/dist/components/series-chart.js.map +1 -1
  227. package/dist/components/settings-fields.js +21 -17
  228. package/dist/components/settings-fields.js.map +1 -1
  229. package/dist/components/share-card.js +4 -9
  230. package/dist/components/share-card.js.map +1 -1
  231. package/dist/components/sign-chip.js.map +1 -1
  232. package/dist/components/signature-pad.js +4 -13
  233. package/dist/components/signature-pad.js.map +1 -1
  234. package/dist/components/signed-amount.js +12 -5
  235. package/dist/components/signed-amount.js.map +1 -1
  236. package/dist/components/skeleton.js +2 -17
  237. package/dist/components/skeleton.js.map +1 -1
  238. package/dist/components/slider.js +13 -36
  239. package/dist/components/slider.js.map +1 -1
  240. package/dist/components/sparkline.js.map +1 -1
  241. package/dist/components/stat-tile.js +14 -10
  242. package/dist/components/stat-tile.js.map +1 -1
  243. package/dist/components/swatch-picker.js +14 -4
  244. package/dist/components/swatch-picker.js.map +1 -1
  245. package/dist/components/swipeable-row.d.ts +1 -1
  246. package/dist/components/swipeable-row.js +1 -8
  247. package/dist/components/swipeable-row.js.map +1 -1
  248. package/dist/components/table-skeleton.js +4 -1
  249. package/dist/components/table-skeleton.js.map +1 -1
  250. package/dist/components/table.js +12 -9
  251. package/dist/components/table.js.map +1 -1
  252. package/dist/components/tabs.js +5 -24
  253. package/dist/components/tabs.js.map +1 -1
  254. package/dist/components/text-link.js.map +1 -1
  255. package/dist/components/text.js.map +1 -1
  256. package/dist/components/tile-radio.js +1 -7
  257. package/dist/components/tile-radio.js.map +1 -1
  258. package/dist/components/time-input.js.map +1 -1
  259. package/dist/components/toast.js.map +1 -1
  260. package/dist/components/toggle-group.js +6 -1
  261. package/dist/components/toggle-group.js.map +1 -1
  262. package/dist/components/toggle-legend.js +2 -11
  263. package/dist/components/toggle-legend.js.map +1 -1
  264. package/dist/components/tooltip.js +2 -22
  265. package/dist/components/tooltip.js.map +1 -1
  266. package/dist/components/translation-review-editor.js +1 -4
  267. package/dist/components/translation-review-editor.js.map +1 -1
  268. package/dist/components/translation-review-parts.d.ts +1 -1
  269. package/dist/components/translation-review-parts.js +7 -1
  270. package/dist/components/translation-review-parts.js.map +1 -1
  271. package/dist/components/translation-review.js +18 -7
  272. package/dist/components/translation-review.js.map +1 -1
  273. package/dist/components/tree-view.js +14 -10
  274. package/dist/components/tree-view.js.map +1 -1
  275. package/dist/components/treemap.d.ts +24 -2
  276. package/dist/components/treemap.js +28 -4
  277. package/dist/components/treemap.js.map +1 -1
  278. package/dist/components/trigger-aria.js.map +1 -1
  279. package/dist/components/use-table-state.js +14 -11
  280. package/dist/components/use-table-state.js.map +1 -1
  281. package/dist/components/user-avatar.js +3 -26
  282. package/dist/components/user-avatar.js.map +1 -1
  283. package/dist/demo/demo-start.js +8 -4
  284. package/dist/demo/demo-start.js.map +1 -1
  285. package/dist/eslint/index.js +1 -1
  286. package/dist/feedback/feedback-attachment-labels.js.map +1 -1
  287. package/dist/feedback/feedback-attachment.js +1 -8
  288. package/dist/feedback/feedback-attachment.js.map +1 -1
  289. package/dist/feedback/feedback-capture.d.ts +1 -1
  290. package/dist/feedback/feedback-capture.js +3 -1
  291. package/dist/feedback/feedback-capture.js.map +1 -1
  292. package/dist/feedback/feedback-comment-thread.js +27 -13
  293. package/dist/feedback/feedback-comment-thread.js.map +1 -1
  294. package/dist/feedback/feedback-context.js +1 -4
  295. package/dist/feedback/feedback-context.js.map +1 -1
  296. package/dist/feedback/feedback-dialog.js.map +1 -1
  297. package/dist/feedback/feedback-inbox.js.map +1 -1
  298. package/dist/feedback/feedback-public-list.js +7 -1
  299. package/dist/feedback/feedback-public-list.js.map +1 -1
  300. package/dist/feedback/feedback-record.js +1 -5
  301. package/dist/feedback/feedback-record.js.map +1 -1
  302. package/dist/feedback/feedback-replies.js +25 -10
  303. package/dist/feedback/feedback-replies.js.map +1 -1
  304. package/dist/feedback/feedback-row-detail.js.map +1 -1
  305. package/dist/feedback/feedback-status-undo.js.map +1 -1
  306. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  307. package/dist/feedback/feedback-table.js +4 -1
  308. package/dist/feedback/feedback-table.js.map +1 -1
  309. package/dist/feedback/feedback-thread.js +2 -13
  310. package/dist/feedback/feedback-thread.js.map +1 -1
  311. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  312. package/dist/feedback/feedback-vote-button.js.map +1 -1
  313. package/dist/hooks/use-anchored-rect.js.map +1 -1
  314. package/dist/hooks/use-document-title.js.map +1 -1
  315. package/dist/hooks/use-file-drop.js.map +1 -1
  316. package/dist/hooks/use-file-picker-labels.js.map +1 -1
  317. package/dist/hooks/use-file-picker.js.map +1 -1
  318. package/dist/hooks/use-focus-trap.js.map +1 -1
  319. package/dist/hooks/use-overlay-history.js +10 -5
  320. package/dist/hooks/use-overlay-history.js.map +1 -1
  321. package/dist/hooks/use-row-swipe.d.ts +1 -1
  322. package/dist/hooks/use-row-swipe.js +1 -6
  323. package/dist/hooks/use-row-swipe.js.map +1 -1
  324. package/dist/i18n/defaults.js +1 -4
  325. package/dist/i18n/defaults.js.map +1 -1
  326. package/dist/i18n/german.js +4 -1
  327. package/dist/i18n/german.js.map +1 -1
  328. package/dist/i18n/kit-labels.js +2 -8
  329. package/dist/i18n/kit-labels.js.map +1 -1
  330. package/dist/i18n/languages.js.map +1 -1
  331. package/dist/i18n/locales/en.js +4 -1
  332. package/dist/i18n/locales/en.js.map +2 -2
  333. package/dist/i18n/locales/es.js +4 -1
  334. package/dist/i18n/locales/es.js.map +1 -1
  335. package/dist/i18n/locales/fr.js +4 -1
  336. package/dist/i18n/locales/fr.js.map +1 -1
  337. package/dist/i18n/locales/hu.js +4 -1
  338. package/dist/i18n/locales/hu.js.map +1 -1
  339. package/dist/i18n/locales/it.js +4 -1
  340. package/dist/i18n/locales/it.js.map +1 -1
  341. package/dist/i18n/locales/zh.js.map +1 -1
  342. package/dist/i18n/plurals.js.map +1 -1
  343. package/dist/i18n/review.js +13 -7
  344. package/dist/i18n/review.js.map +1 -1
  345. package/dist/i18n/shared-labels.js.map +1 -1
  346. package/dist/index.d.ts +16 -16
  347. package/dist/index.js +40 -23
  348. package/dist/index.js.map +1 -1
  349. package/dist/landing/access.js +1 -4
  350. package/dist/landing/access.js.map +1 -1
  351. package/dist/landing/landing-sections.js +35 -38
  352. package/dist/landing/landing-sections.js.map +1 -1
  353. package/dist/landing/page-seo.js.map +1 -1
  354. package/dist/lib/calc.js.map +1 -1
  355. package/dist/lib/clipboard-minus.js.map +1 -1
  356. package/dist/lib/dates.js.map +1 -1
  357. package/dist/lib/decimal-marks.js.map +1 -1
  358. package/dist/lib/device-settings.js +2 -1
  359. package/dist/lib/device-settings.js.map +1 -1
  360. package/dist/lib/direction.js.map +1 -1
  361. package/dist/lib/iban.js.map +1 -1
  362. package/dist/lib/logger.js +1 -5
  363. package/dist/lib/logger.js.map +1 -1
  364. package/dist/lib/person-name.js.map +1 -1
  365. package/dist/lib/phone.js.map +1 -1
  366. package/dist/lib/qr-encode.js +344 -8
  367. package/dist/lib/qr-encode.js.map +1 -1
  368. package/dist/lib/session-refresh.js.map +1 -1
  369. package/dist/lib/table-text.js +15 -3
  370. package/dist/lib/table-text.js.map +1 -1
  371. package/dist/lib/text-match.d.ts +4 -0
  372. package/dist/lib/text-match.js.map +1 -1
  373. package/dist/lib/translation-review.js.map +1 -1
  374. package/dist/notifications/notification-inbox.js +63 -44
  375. package/dist/notifications/notification-inbox.js.map +1 -1
  376. package/dist/notifications/notification-parts.js.map +1 -1
  377. package/dist/notifications/notification-types-setting.js.map +1 -1
  378. package/dist/notifications/notifications-labels.js.map +1 -1
  379. package/dist/notifications/push-device-setting.js +6 -1
  380. package/dist/notifications/push-device-setting.js.map +1 -1
  381. package/dist/notifications/push-devices-setting.js.map +1 -1
  382. package/dist/notifications/push-worker.js.map +1 -1
  383. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  384. package/dist/notifications/use-push-device.js +4 -1
  385. package/dist/notifications/use-push-device.js.map +1 -1
  386. package/dist/offline/pwa-update-prompt.d.ts +1 -1
  387. package/dist/offline/pwa-update-prompt.js +7 -1
  388. package/dist/offline/pwa-update-prompt.js.map +1 -1
  389. package/dist/offline/query-persistence.js.map +1 -1
  390. package/dist/offline.d.ts +1 -1
  391. package/dist/offline.js +6 -1
  392. package/dist/offline.js.map +1 -1
  393. package/dist/pay/pay.css +8 -1
  394. package/dist/rhf/fields.d.ts +1 -2
  395. package/dist/rhf/fields.js +1 -10
  396. package/dist/rhf/fields.js.map +1 -1
  397. package/dist/rhf/form-core.js +1 -4
  398. package/dist/rhf/form-core.js.map +1 -1
  399. package/dist/rhf/line-items.js.map +1 -1
  400. package/dist/rhf/use-rhf-wizard-step.js.map +1 -1
  401. package/dist/search/command-palette.js +71 -62
  402. package/dist/search/command-palette.js.map +1 -1
  403. package/dist/search/global-search.js +34 -5
  404. package/dist/search/global-search.js.map +1 -1
  405. package/dist/search/search-index.js.map +1 -1
  406. package/dist/settings/device-reset-setting.js +1 -6
  407. package/dist/settings/device-reset-setting.js.map +1 -1
  408. package/dist/settings/settings-heading.js.map +1 -1
  409. package/dist/settings/settings-layout.js +9 -20
  410. package/dist/settings/settings-layout.js.map +1 -1
  411. package/dist/settings/use-settings-route.js.map +1 -1
  412. package/dist/shell/app-shell.js +62 -31
  413. package/dist/shell/app-shell.js.map +1 -1
  414. package/dist/shell/auth-layout.js +1 -10
  415. package/dist/shell/auth-layout.js.map +1 -1
  416. package/dist/shell/dev-menu.js +12 -6
  417. package/dist/shell/dev-menu.js.map +1 -1
  418. package/dist/shell/option-switcher-menu.js.map +1 -1
  419. package/dist/shell/sync-status-indicator.js +7 -6
  420. package/dist/shell/sync-status-indicator.js.map +1 -1
  421. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  422. package/dist/shell/topbar-action-menu.js.map +1 -1
  423. package/dist/shell/topbar-controls.js +1 -10
  424. package/dist/shell/topbar-controls.js.map +1 -1
  425. package/dist/shell/tour-menu.js +9 -1
  426. package/dist/shell/tour-menu.js.map +1 -1
  427. package/dist/sync/db.js.map +1 -1
  428. package/dist/sync/engine.js +24 -6
  429. package/dist/sync/engine.js.map +1 -1
  430. package/dist/sync.d.ts +2 -2
  431. package/dist/sync.js +7 -1
  432. package/dist/sync.js.map +1 -1
  433. package/dist/testing/css-variables.js.map +1 -1
  434. package/dist/testing/index.d.ts +1 -1
  435. package/dist/testing/index.js +1 -3
  436. package/dist/testing/index.js.map +1 -1
  437. package/dist/testing/react.js.map +1 -1
  438. package/dist/testing/viewport.js +7 -4
  439. package/dist/testing/viewport.js.map +1 -1
  440. package/dist/theme/contrast-tokens.js +13 -2
  441. package/dist/theme/contrast-tokens.js.map +1 -1
  442. package/dist/theme/contrast.d.ts +2 -2
  443. package/dist/theme/palette-derive.d.ts +1 -1
  444. package/dist/theme/palette-derive.js +18 -29
  445. package/dist/theme/palette-derive.js.map +1 -1
  446. package/dist/theme/palette-presets.js.map +1 -1
  447. package/dist/theme/palette-store.js.map +1 -1
  448. package/dist/theme/text-size.js.map +1 -1
  449. package/dist/theme/theme-store.js +1 -3
  450. package/dist/theme/theme-store.js.map +1 -1
  451. package/dist/tour/tour-catalogue.js.map +1 -1
  452. package/dist/tour/tour-dock.js +5 -1
  453. package/dist/tour/tour-dock.js.map +1 -1
  454. package/dist/tour/tour-engine.js +1 -4
  455. package/dist/tour/tour-engine.js.map +1 -1
  456. package/dist/tour/tour.js +21 -12
  457. package/dist/tour/tour.js.map +1 -1
  458. package/dist/tour/use-tour-progress.js.map +1 -1
  459. package/dist/tour/use-tour-url-sync.js.map +1 -1
  460. package/dist/wizard/stepper-nav.js +3 -24
  461. package/dist/wizard/stepper-nav.js.map +1 -1
  462. package/dist/wizard/types.js.map +1 -1
  463. package/dist/wizard/use-wizard.js +24 -28
  464. package/dist/wizard/use-wizard.js.map +1 -1
  465. package/dist/wizard/validation.js.map +1 -1
  466. package/dist/wizard/wizard-context.js.map +1 -1
  467. package/dist/wizard/wizard-step.d.ts +1 -1
  468. package/dist/wizard/wizard-step.js +1 -8
  469. package/dist/wizard/wizard-step.js.map +1 -1
  470. package/dist/wizard/wizard-summary.js.map +1 -1
  471. package/package.json +5 -2
  472. package/src/account/account-settings-labels.ts +1 -2
  473. package/src/account/account-settings.tsx +11 -17
  474. package/src/account/delete-account-setting.tsx +1 -6
  475. package/src/account/email-change-setting-labels.ts +1 -2
  476. package/src/account/email-change-setting.tsx +3 -1
  477. package/src/account/passkeys-setting.tsx +1 -3
  478. package/src/account/sessions-setting.tsx +4 -2
  479. package/src/admin/admin-action-confirm.tsx +4 -7
  480. package/src/admin/admin-action-log.tsx +29 -29
  481. package/src/admin/admin-area-labels.ts +4 -1
  482. package/src/admin/admin-overview.tsx +8 -2
  483. package/src/admin/admin-sections.tsx +3 -1
  484. package/src/admin/admin-tool-links.tsx +7 -1
  485. package/src/admin/invitations-panel.tsx +5 -11
  486. package/src/admin/mail-test-card.tsx +1 -2
  487. package/src/admin/reviewer-scope-editor.tsx +4 -9
  488. package/src/admin/role-select.tsx +4 -2
  489. package/src/admin/user-roster.tsx +2 -11
  490. package/src/auth/accept-invitation.tsx +1 -7
  491. package/src/auth/auth-errors.ts +1 -6
  492. package/src/auth/forgot-password-form.tsx +2 -7
  493. package/src/auth/register-form.tsx +7 -8
  494. package/src/auth/reset-password-form.tsx +2 -5
  495. package/src/auth/sign-in-form.tsx +15 -14
  496. package/src/auth/verify-email.tsx +2 -7
  497. package/src/billing/billing-banner.tsx +3 -7
  498. package/src/billing/billing-labels.ts +6 -4
  499. package/src/billing/checkout-processing.ts +0 -1
  500. package/src/billing/plan-card.tsx +9 -8
  501. package/src/billing/plan-limit-toast.tsx +1 -2
  502. package/src/billing/plan-limit.ts +1 -2
  503. package/src/billing/plan-price.ts +1 -4
  504. package/src/billing/plan-switch.tsx +1 -2
  505. package/src/billing/subscription-actions.tsx +5 -2
  506. package/src/components/account-chips.tsx +1 -7
  507. package/src/components/alert-banner.tsx +2 -8
  508. package/src/components/amount-input.tsx +206 -178
  509. package/src/components/authed-image.tsx +7 -4
  510. package/src/components/autocomplete.tsx +7 -9
  511. package/src/components/bulk-action-bar.tsx +2 -7
  512. package/src/components/button-group.tsx +1 -2
  513. package/src/components/button-look.ts +6 -17
  514. package/src/components/button.tsx +1 -4
  515. package/src/components/calculator.tsx +6 -9
  516. package/src/components/calendar-heatmap.tsx +5 -10
  517. package/src/components/card.tsx +9 -13
  518. package/src/components/chart-zoom-core.tsx +6 -33
  519. package/src/components/chart.tsx +8 -31
  520. package/src/components/checkbox-group.tsx +1 -4
  521. package/src/components/chip-input.tsx +6 -6
  522. package/src/components/chip.tsx +14 -26
  523. package/src/components/choice-card.tsx +4 -18
  524. package/src/components/column-mapper-labels.ts +3 -10
  525. package/src/components/column-mapper.tsx +33 -122
  526. package/src/components/combobox-core.tsx +12 -42
  527. package/src/components/combobox.tsx +2 -6
  528. package/src/components/confirm-dialog.tsx +1 -3
  529. package/src/components/copy-button.tsx +2 -4
  530. package/src/components/country-select.tsx +9 -21
  531. package/src/components/currency-option-list.tsx +13 -14
  532. package/src/components/currency-select.tsx +2 -7
  533. package/src/components/danger-confirm.tsx +8 -9
  534. package/src/components/data-table-cells.tsx +1 -2
  535. package/src/components/data-table-column-settings.tsx +1 -3
  536. package/src/components/data-table-filter-popover.tsx +5 -19
  537. package/src/components/data-table-filters.ts +1 -6
  538. package/src/components/data-table-fit.ts +1 -3
  539. package/src/components/data-table-groups.tsx +3 -1
  540. package/src/components/data-table-head.tsx +27 -45
  541. package/src/components/data-table-mobile.tsx +99 -108
  542. package/src/components/data-table-pagination.tsx +2 -6
  543. package/src/components/data-table-row-actions.tsx +25 -24
  544. package/src/components/data-table-row.tsx +16 -17
  545. package/src/components/data-table-shared.tsx +10 -16
  546. package/src/components/data-table-sort.ts +1 -2
  547. package/src/components/data-table-virtual.ts +9 -4
  548. package/src/components/data-table.tsx +489 -501
  549. package/src/components/date-picker.tsx +1 -7
  550. package/src/components/date-range-picker.tsx +3 -13
  551. package/src/components/description-list.tsx +7 -13
  552. package/src/components/dialog-frame.tsx +12 -3
  553. package/src/components/disclosure.tsx +8 -12
  554. package/src/components/dropdown.tsx +3 -11
  555. package/src/components/empty-state.tsx +1 -3
  556. package/src/components/entity-combobox.tsx +2 -6
  557. package/src/components/error-boundary.tsx +7 -7
  558. package/src/components/field-base.tsx +8 -14
  559. package/src/components/field-parts.tsx +12 -23
  560. package/src/components/field-sync.tsx +7 -11
  561. package/src/components/file-button.tsx +7 -3
  562. package/src/components/file-dropzone.tsx +7 -12
  563. package/src/components/floating-panel.tsx +44 -51
  564. package/src/components/focus-ring.ts +1 -2
  565. package/src/components/form-actions.tsx +1 -4
  566. package/src/components/grouped-picker.tsx +6 -8
  567. package/src/components/hover-menu.tsx +1 -4
  568. package/src/components/iban-input-labels.ts +1 -2
  569. package/src/components/icon-button.tsx +46 -48
  570. package/src/components/icon-picker.tsx +4 -17
  571. package/src/components/image-grid.tsx +1 -6
  572. package/src/components/inline-edit-field.tsx +1 -5
  573. package/src/components/inline-entity-combobox.tsx +6 -21
  574. package/src/components/input.tsx +14 -2
  575. package/src/components/jump-calendar.tsx +2 -6
  576. package/src/components/legal-labels.ts +1 -2
  577. package/src/components/legal-page.tsx +18 -7
  578. package/src/components/legal.tsx +14 -5
  579. package/src/components/lightbox.tsx +1 -3
  580. package/src/components/line-items.tsx +7 -15
  581. package/src/components/list.tsx +29 -25
  582. package/src/components/measured-grid.tsx +8 -30
  583. package/src/components/menu-item.tsx +1 -3
  584. package/src/components/mini-calendar.tsx +129 -159
  585. package/src/components/money-field.tsx +4 -2
  586. package/src/components/month-picker.tsx +14 -21
  587. package/src/components/multi-entity-combobox.tsx +6 -26
  588. package/src/components/multi-select.tsx +5 -9
  589. package/src/components/nav-pills.tsx +10 -2
  590. package/src/components/number-field.tsx +18 -15
  591. package/src/components/number-input.tsx +3 -19
  592. package/src/components/numpad-sheet.tsx +9 -13
  593. package/src/components/one-time-code-input.tsx +6 -11
  594. package/src/components/page-contents.tsx +2 -9
  595. package/src/components/page-header.tsx +5 -10
  596. package/src/components/password-strength-labels.ts +1 -2
  597. package/src/components/password-strength.tsx +6 -9
  598. package/src/components/phone-input.tsx +2 -13
  599. package/src/components/picker-sheet.tsx +2 -5
  600. package/src/components/pie-chart.tsx +6 -12
  601. package/src/components/popover.tsx +2 -1
  602. package/src/components/progress-bar.tsx +16 -25
  603. package/src/components/qr-code.tsx +2 -9
  604. package/src/components/row-actions.tsx +9 -1
  605. package/src/components/search-field.tsx +4 -5
  606. package/src/components/select.tsx +2 -10
  607. package/src/components/separator.tsx +1 -5
  608. package/src/components/series-chart-axes.ts +5 -5
  609. package/src/components/series-chart-budget.ts +1 -4
  610. package/src/components/series-chart-ticks.ts +1 -4
  611. package/src/components/series-chart.tsx +43 -83
  612. package/src/components/settings-fields.tsx +20 -15
  613. package/src/components/share-card.tsx +6 -14
  614. package/src/components/sign-chip.tsx +16 -16
  615. package/src/components/signature-pad.tsx +21 -13
  616. package/src/components/signed-amount.tsx +6 -14
  617. package/src/components/skeleton.tsx +2 -13
  618. package/src/components/slider.tsx +9 -20
  619. package/src/components/sparkline.tsx +2 -13
  620. package/src/components/stat-tile.tsx +13 -24
  621. package/src/components/swatch-picker.tsx +8 -3
  622. package/src/components/swipeable-row.tsx +2 -11
  623. package/src/components/table-skeleton.tsx +4 -1
  624. package/src/components/table.tsx +12 -8
  625. package/src/components/tabs.tsx +24 -39
  626. package/src/components/text-link.tsx +6 -6
  627. package/src/components/text.tsx +1 -2
  628. package/src/components/tile-radio.tsx +6 -19
  629. package/src/components/time-input.tsx +4 -5
  630. package/src/components/toast.tsx +3 -12
  631. package/src/components/toggle-group.tsx +9 -9
  632. package/src/components/toggle-legend.tsx +4 -16
  633. package/src/components/tooltip.tsx +9 -48
  634. package/src/components/translation-review-editor.tsx +4 -4
  635. package/src/components/translation-review-parts.tsx +7 -1
  636. package/src/components/translation-review.tsx +15 -16
  637. package/src/components/tree-view.tsx +17 -20
  638. package/src/components/treemap.tsx +59 -9
  639. package/src/components/trigger-aria.ts +1 -4
  640. package/src/components/use-table-state.ts +16 -17
  641. package/src/components/user-avatar.tsx +4 -21
  642. package/src/demo/demo-start.tsx +8 -4
  643. package/src/feedback/feedback-attachment-labels.ts +2 -1
  644. package/src/feedback/feedback-attachment.tsx +16 -29
  645. package/src/feedback/feedback-capture.ts +3 -1
  646. package/src/feedback/feedback-comment-thread.tsx +9 -6
  647. package/src/feedback/feedback-context.tsx +1 -4
  648. package/src/feedback/feedback-dialog.tsx +3 -4
  649. package/src/feedback/feedback-inbox.tsx +3 -9
  650. package/src/feedback/feedback-public-list.tsx +7 -1
  651. package/src/feedback/feedback-record.ts +6 -14
  652. package/src/feedback/feedback-replies.tsx +10 -5
  653. package/src/feedback/feedback-row-detail.tsx +2 -5
  654. package/src/feedback/feedback-status-undo.ts +1 -4
  655. package/src/feedback/feedback-submit-dialog.tsx +4 -4
  656. package/src/feedback/feedback-table.tsx +12 -8
  657. package/src/feedback/feedback-thread.tsx +4 -16
  658. package/src/feedback/feedback-vocabulary.ts +72 -82
  659. package/src/feedback/feedback-vote-button.tsx +9 -8
  660. package/src/hooks/use-anchored-rect.ts +1 -4
  661. package/src/hooks/use-document-title.ts +3 -1
  662. package/src/hooks/use-file-drop.ts +1 -3
  663. package/src/hooks/use-file-picker-labels.ts +1 -2
  664. package/src/hooks/use-file-picker.tsx +1 -5
  665. package/src/hooks/use-focus-trap.ts +1 -2
  666. package/src/hooks/use-overlay-history.ts +10 -5
  667. package/src/hooks/use-row-swipe.ts +1 -6
  668. package/src/i18n/defaults.ts +1 -4
  669. package/src/i18n/german.ts +33 -49
  670. package/src/i18n/kit-labels.tsx +5 -20
  671. package/src/i18n/languages.ts +2 -8
  672. package/src/i18n/locales/en.ts +11 -31
  673. package/src/i18n/locales/es.ts +35 -49
  674. package/src/i18n/locales/fr.ts +34 -51
  675. package/src/i18n/locales/hu.ts +26 -37
  676. package/src/i18n/locales/it.ts +35 -52
  677. package/src/i18n/locales/zh.ts +14 -32
  678. package/src/i18n/plurals.ts +4 -1
  679. package/src/i18n/review.ts +18 -7
  680. package/src/i18n/shared-labels.ts +1 -2
  681. package/src/index.ts +106 -32
  682. package/src/landing/access.ts +2 -7
  683. package/src/landing/landing-sections.tsx +14 -15
  684. package/src/landing/page-seo.ts +1 -3
  685. package/src/lib/calc.ts +4 -1
  686. package/src/lib/clipboard-minus.ts +4 -1
  687. package/src/lib/dates.ts +2 -10
  688. package/src/lib/decimal-marks.ts +1 -3
  689. package/src/lib/device-settings.ts +2 -1
  690. package/src/lib/direction.ts +1 -3
  691. package/src/lib/iban.ts +89 -9
  692. package/src/lib/logger.ts +1 -5
  693. package/src/lib/person-name.ts +1 -3
  694. package/src/lib/phone.ts +5 -8
  695. package/src/lib/qr-encode.ts +32 -8
  696. package/src/lib/session-refresh.ts +5 -6
  697. package/src/lib/table-text.ts +24 -6
  698. package/src/lib/text-match.ts +15 -3
  699. package/src/lib/translation-review.ts +1 -3
  700. package/src/notifications/notification-inbox.tsx +17 -4
  701. package/src/notifications/notification-parts.tsx +1 -2
  702. package/src/notifications/notification-types-setting.tsx +19 -18
  703. package/src/notifications/notifications-labels.ts +1 -2
  704. package/src/notifications/push-device-setting.tsx +7 -1
  705. package/src/notifications/push-devices-setting.tsx +7 -3
  706. package/src/notifications/push-worker.ts +10 -2
  707. package/src/notifications/quiet-hours-setting.tsx +4 -1
  708. package/src/notifications/use-push-device.ts +4 -1
  709. package/src/offline/pwa-update-prompt.tsx +7 -1
  710. package/src/offline/query-persistence.ts +9 -6
  711. package/src/offline.ts +6 -1
  712. package/src/rhf/fields.tsx +50 -19
  713. package/src/rhf/form-core.tsx +2 -6
  714. package/src/rhf/line-items.tsx +5 -7
  715. package/src/rhf/use-rhf-wizard-step.ts +3 -12
  716. package/src/search/command-palette.tsx +15 -23
  717. package/src/search/global-search.tsx +38 -8
  718. package/src/search/search-index.ts +5 -1
  719. package/src/settings/device-reset-setting.tsx +5 -8
  720. package/src/settings/settings-heading.tsx +3 -1
  721. package/src/settings/settings-layout.tsx +6 -13
  722. package/src/settings/use-settings-route.ts +4 -3
  723. package/src/shell/app-shell.tsx +48 -24
  724. package/src/shell/auth-layout.tsx +1 -6
  725. package/src/shell/dev-menu.tsx +12 -6
  726. package/src/shell/option-switcher-menu.tsx +1 -3
  727. package/src/shell/sync-status-indicator.tsx +14 -12
  728. package/src/shell/top-bar-parts-labels.ts +1 -3
  729. package/src/shell/topbar-action-menu.tsx +9 -8
  730. package/src/shell/topbar-controls.tsx +5 -19
  731. package/src/shell/tour-menu.tsx +9 -1
  732. package/src/sync/db.ts +5 -1
  733. package/src/sync/engine.ts +44 -12
  734. package/src/sync.ts +16 -2
  735. package/src/testing/css-variables.ts +1 -2
  736. package/src/testing/index.ts +1 -6
  737. package/src/testing/react.ts +1 -2
  738. package/src/testing/viewport.ts +9 -9
  739. package/src/theme/contrast-tokens.ts +13 -2
  740. package/src/theme/palette-derive.ts +24 -50
  741. package/src/theme/palette-presets.ts +0 -1
  742. package/src/theme/palette-store.ts +1 -4
  743. package/src/theme/text-size.ts +1 -1
  744. package/src/theme/theme-store.ts +2 -6
  745. package/src/tour/tour-catalogue.tsx +4 -2
  746. package/src/tour/tour-dock.ts +5 -1
  747. package/src/tour/tour-engine.ts +2 -6
  748. package/src/tour/tour.tsx +28 -12
  749. package/src/tour/use-tour-progress.ts +8 -2
  750. package/src/tour/use-tour-url-sync.ts +3 -1
  751. package/src/vite-env.d.ts +1 -4
  752. package/src/wizard/stepper-nav.tsx +10 -35
  753. package/src/wizard/types.ts +1 -4
  754. package/src/wizard/use-wizard.ts +28 -43
  755. package/src/wizard/validation.ts +1 -5
  756. package/src/wizard/wizard-context.tsx +2 -6
  757. package/src/wizard/wizard-step.tsx +1 -8
  758. package/src/wizard/wizard-summary.tsx +2 -6
  759. package/tokens.css +393 -152
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/settings/use-settings-route.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo } from \"react\";\nimport { useLocation, useNavigate } from \"react-router\";\nimport { usePhoneLayout } from \"../hooks/use-breakpoint\";\nimport { normalizeSettingsBase, visibleSettingsGroups } from \"./settings-catalogue\";\nimport type { SettingsEntry, SettingsGroup } from \"./settings-catalogue\";\n\n/**\n * Which layout the settings page is in. `\"auto\"` follows the screen (`usePhoneLayout()`,\n * as `Tabs` does); `\"desktop\"` / `\"phone\"` pin one — for a preview of both side by side,\n * where the window is one width.\n */\nexport type SettingsLayoutMode = \"auto\" | \"desktop\" | \"phone\";\n\nexport interface UseSettingsRouteOptions<G extends string> {\n groups: readonly SettingsGroup<G>[];\n /** The catalogue's entries. Given, a group with no visible entry is hidden (§4.1), and\n * `/settings?focus=<anchor>` finds the anchor's group. */\n entries?: readonly SettingsEntry<G>[];\n /** `/settings` or `/admin`. */\n basePath: string;\n /** The group `/settings` opens on a desktop. Default: the first visible group (§4.1). */\n defaultGroup?: G;\n /** Retired group ids and their successors — `{ overview: \"metrics\" }` — applied with a\n * replace (§3.1, keksdose's admin). */\n aliases?: Readonly<Partial<Record<string, G>>>;\n /** See {@link SettingsLayoutMode}. Default `\"auto\"`. */\n layout?: SettingsLayoutMode;\n}\n\nexport interface SettingsRoute<G extends string> {\n /** The group on screen. `null` on a phone's list (and while there is no visible group). */\n group: G | null;\n /** The segment after the group, owned by a card; `null` without one. */\n sub: string | null;\n /** `?focus=<anchor>`, or `null`. */\n focus: string | null;\n /** Open a group: a PUSH on a phone, so the system back gesture returns to the list; a\n * REPLACE on a desktop, so back leaves settings instead of walking every group looked\n * at (§3.1, keksdose's rule). */\n select: (group: G) => void;\n /** See {@link SettingsLayoutContextValue.selectSub}. */\n selectSub: (sub: string | null) => void;\n /** To the list: `navigate(-1)` when the list is the previous entry, else a replace to\n * the base path — so a deep link from a mail never sends \"back\" out of the app. */\n back: () => void;\n /** The visible groups, in order. */\n groups: SettingsGroup<G>[];\n /** Whether the phone layout is in force. */\n phone: boolean;\n /** Whether this location is about to be replaced (a legacy hash, an alias, an unknown\n * group): what renders meanwhile is already the destination's, but nothing should\n * act on the URL until it is. */\n redirecting: boolean;\n /** Whether the list is the entry before this one (the marker {@link select} and the\n * list's links leave in `location.state`). */\n fromList: boolean;\n}\n\n/**\n * The `location.state` key that says \"the list is the entry before this one\". Written by\n * the phone list's links and {@link SettingsRoute.select}; carried over by every replace\n * the page makes, since a replace does not change what came before.\n */\nexport const SETTINGS_FROM_LIST_STATE = \"eifi1.settings.fromList\";\n\n/** `location.state` with the marker set — for an app's own link to a group page that is\n * opened FROM the list it renders. */\nexport function settingsFromListState(): Record<string, true> {\n return { [SETTINGS_FROM_LIST_STATE]: true };\n}\n\nfunction isFromList(state: unknown): boolean {\n return typeof state === \"object\" && state !== null && (state as Record<string, unknown>)[SETTINGS_FROM_LIST_STATE] === true;\n}\n\nexport interface SettingsLocation {\n pathname: string;\n search: string;\n hash: string;\n}\n\nexport interface SettingsLocationRules<G extends string> {\n basePath: string;\n /** The visible group ids. */\n groups: readonly G[];\n /** The resolved default group, `null` with no visible group. */\n defaultGroup: G | null;\n aliases?: Readonly<Partial<Record<string, G>>>;\n /** Anchor → group, for `/settings?focus=<anchor>` with no group named. */\n anchorGroup?: ReadonlyMap<string, G>;\n phone: boolean;\n}\n\nexport interface SettingsLocationResult<G extends string> {\n group: G | null;\n sub: string | null;\n /** The path (with query) to replace the location with, or `null` when it is already\n * canonical. */\n redirect: string | null;\n}\n\n/**\n * Where a location lands on the settings page — pure, so the rules of §3.1 are testable\n * without a router:\n *\n * - `/settings` → the default group on a desktop (a replace), the list on a phone;\n * - `/settings/<group>[/<sub>]` → that group, the rest of the path as `sub`;\n * - an alias → its successor, with a replace, `sub`, query and hash kept;\n * - an unknown or hidden group → the default group (desktop) or the list (phone), with\n * a replace and the query kept — never a 404, so an old bookmark still lands;\n * - keksdose's legacy `/settings?<query>#<group>[/<sub>]` →\n * `/settings/<group>[/<sub>]?<query>`, the WHOLE query carried (a tour's\n * `tour`/`tourStep` as well as `focus`), then resolved by the rules above;\n * - `/settings?focus=<anchor>` with no group → the anchor's group, where it can ring.\n */\nexport function resolveSettingsLocation<G extends string>(\n location: SettingsLocation,\n rules: SettingsLocationRules<G>,\n): SettingsLocationResult<G> {\n const base = normalizeSettingsBase(rules.basePath);\n const { pathname, search, hash } = location;\n const known = new Set<string>(rules.groups);\n const atBase = pathname === base || pathname === `${base}/` || (base === \"\" && pathname === \"/\");\n\n if (atBase) {\n const legacy = hash.replace(/^#/, \"\").replace(/^\\/+/, \"\");\n if (legacy) {\n // The hash becomes the path; whatever the path then says (an alias, an unknown\n // group) is resolved in the same step, so the history sees one replace.\n const converted = `${base}/${legacy}`;\n const next = resolveSettingsLocation({ pathname: converted, search, hash: \"\" }, rules);\n return { ...next, redirect: next.redirect ?? `${converted}${search}` };\n }\n const anchor = new URLSearchParams(search).get(\"focus\");\n const anchorGroup = anchor ? rules.anchorGroup?.get(anchor) : undefined;\n if (anchorGroup && known.has(anchorGroup)) {\n return { group: anchorGroup, sub: null, redirect: `${base}/${anchorGroup}${search}` };\n }\n if (rules.phone || rules.defaultGroup === null) return { group: null, sub: null, redirect: null };\n return { group: rules.defaultGroup, sub: null, redirect: `${base}/${rules.defaultGroup}${search}` };\n }\n\n if (!pathname.startsWith(`${base}/`)) {\n // Mounted somewhere `basePath` does not name: a misconfiguration, not a link to\n // correct. Show what the base path would, and leave the address alone.\n return { group: rules.phone ? null : rules.defaultGroup, sub: null, redirect: null };\n }\n const rest = pathname.slice(base.length + 1);\n const [segment = \"\", ...subParts] = rest.split(\"/\");\n const sub = subParts.filter(Boolean).join(\"/\") || null;\n if (known.has(segment)) return { group: segment as G, sub, redirect: null };\n\n const successor = rules.aliases?.[segment];\n if (successor !== undefined && known.has(successor)) {\n return {\n group: successor,\n sub,\n redirect: `${base}/${successor}${sub ? `/${sub}` : \"\"}${search}${hash}`,\n };\n }\n\n // Unknown or hidden. The hash is dropped: on the list it would read as a legacy group\n // and send the page round again.\n if (rules.phone || rules.defaultGroup === null) {\n return { group: null, sub: null, redirect: `${base || \"/\"}${search}` };\n }\n return { group: rules.defaultGroup, sub: null, redirect: `${base}/${rules.defaultGroup}${search}` };\n}\n\n/**\n * The settings page's route (docs/settings-harmonization.md §3.1): which group the URL\n * names, and the history rules for moving between groups.\n *\n * The URL IS the selection, as it was in keksdose (where it was the hash): there is no\n * state to keep in step with it, so a deep link, a reload, back and forward all land\n * where the address says. Everything that is not canonical — `/settings` on a desktop, a\n * legacy hash, an alias, an unknown or hidden group — is replaced by its canonical path.\n *\n * **The replace runs on every navigation**, keyed on `location.key`, not once on mount:\n * the router keeps the page mounted across links followed inside the app — keksdose's\n * inbox renders admin-typed URLs, and a push click routes an open window without a\n * reload — so a legacy `/settings#security` arriving while the page is open converts too\n * (§10.1).\n */\nexport function useSettingsRoute<G extends string>(options: UseSettingsRouteOptions<G>): SettingsRoute<G> {\n const { groups, entries, basePath, defaultGroup, aliases, layout = \"auto\" } = options;\n const location = useLocation();\n const navigate = useNavigate();\n const narrow = usePhoneLayout();\n const phone = layout === \"phone\" || (layout === \"auto\" && narrow);\n const base = normalizeSettingsBase(basePath);\n\n const visible = useMemo(() => visibleSettingsGroups(groups, entries), [groups, entries]);\n const anchorGroup = useMemo(() => {\n const map = new Map<string, G>();\n for (const e of entries ?? []) if (e.visible !== false && !map.has(e.anchor)) map.set(e.anchor, e.group);\n return map;\n }, [entries]);\n const ids = visible.map((g) => g.id);\n const fallback =\n defaultGroup !== undefined && ids.includes(defaultGroup) ? defaultGroup : (ids[0] ?? null);\n\n const { group, sub, redirect } = resolveSettingsLocation(location, {\n basePath: base,\n groups: ids,\n defaultGroup: fallback,\n aliases,\n anchorGroup,\n phone,\n });\n\n const { key, state, search } = location;\n useEffect(() => {\n // `state` rides along: the marker describes the entry BEFORE this one, which a\n // replace does not change.\n if (redirect) navigate(redirect, { replace: true, state });\n }, [key, redirect, state, navigate]);\n\n const select = useCallback(\n (next: G) => {\n const to = `${base}/${next}`;\n // From the list, the push marks it, so the group page's back is a real back.\n if (phone) navigate(to, group === null ? { state: settingsFromListState() } : undefined);\n // A new group is a new page: the old one's query (a focus, a roster filter) stays\n // behind, as keksdose's `selectGroup` left it.\n else navigate(to, { replace: true, state });\n },\n [base, phone, group, state, navigate],\n );\n\n const selectSub = useCallback(\n (next: string | null) => {\n if (group === null) return;\n navigate(`${base}/${group}${next ? `/${next}` : \"\"}${search}`, { replace: true, state });\n },\n [base, group, search, state, navigate],\n );\n\n const fromList = isFromList(state);\n const back = useCallback(() => {\n if (fromList) navigate(-1);\n else navigate(base || \"/\", { replace: true });\n }, [fromList, base, navigate]);\n\n return {\n group,\n sub,\n focus: new URLSearchParams(search).get(\"focus\"),\n select,\n selectSub,\n back,\n groups: visible,\n phone,\n redirecting: redirect !== null,\n fromList,\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/settings/use-settings-route.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo } from \"react\";\nimport { useLocation, useNavigate } from \"react-router\";\nimport { usePhoneLayout } from \"../hooks/use-breakpoint\";\nimport { normalizeSettingsBase, visibleSettingsGroups } from \"./settings-catalogue\";\nimport type { SettingsEntry, SettingsGroup } from \"./settings-catalogue\";\n\n/**\n * Which layout the settings page is in. `\"auto\"` follows the screen (`usePhoneLayout()`,\n * as `Tabs` does); `\"desktop\"` / `\"phone\"` pin one — for a preview of both side by side,\n * where the window is one width.\n */\nexport type SettingsLayoutMode = \"auto\" | \"desktop\" | \"phone\";\n\nexport interface UseSettingsRouteOptions<G extends string> {\n groups: readonly SettingsGroup<G>[];\n /** The catalogue's entries. Given, a group with no visible entry is hidden (§4.1), and\n * `/settings?focus=<anchor>` finds the anchor's group. */\n entries?: readonly SettingsEntry<G>[];\n /** `/settings` or `/admin`. */\n basePath: string;\n /** The group `/settings` opens on a desktop. Default: the first visible group (§4.1). */\n defaultGroup?: G;\n /** Retired group ids and their successors — `{ overview: \"metrics\" }` — applied with a\n * replace (§3.1, keksdose's admin). */\n aliases?: Readonly<Partial<Record<string, G>>>;\n /** See {@link SettingsLayoutMode}. Default `\"auto\"`. */\n layout?: SettingsLayoutMode;\n}\n\nexport interface SettingsRoute<G extends string> {\n /** The group on screen. `null` on a phone's list (and while there is no visible group). */\n group: G | null;\n /** The segment after the group, owned by a card; `null` without one. */\n sub: string | null;\n /** `?focus=<anchor>`, or `null`. */\n focus: string | null;\n /** Open a group: a PUSH on a phone, so the system back gesture returns to the list; a\n * REPLACE on a desktop, so back leaves settings instead of walking every group looked\n * at (§3.1, keksdose's rule). */\n select: (group: G) => void;\n /** See {@link SettingsLayoutContextValue.selectSub}. */\n selectSub: (sub: string | null) => void;\n /** To the list: `navigate(-1)` when the list is the previous entry, else a replace to\n * the base path — so a deep link from a mail never sends \"back\" out of the app. */\n back: () => void;\n /** The visible groups, in order. */\n groups: SettingsGroup<G>[];\n /** Whether the phone layout is in force. */\n phone: boolean;\n /** Whether this location is about to be replaced (a legacy hash, an alias, an unknown\n * group): what renders meanwhile is already the destination's, but nothing should\n * act on the URL until it is. */\n redirecting: boolean;\n /** Whether the list is the entry before this one (the marker {@link select} and the\n * list's links leave in `location.state`). */\n fromList: boolean;\n}\n\n/**\n * The `location.state` key that says \"the list is the entry before this one\". Written by\n * the phone list's links and {@link SettingsRoute.select}; carried over by every replace\n * the page makes, since a replace does not change what came before.\n */\nexport const SETTINGS_FROM_LIST_STATE = \"eifi1.settings.fromList\";\n\n/** `location.state` with the marker set — for an app's own link to a group page that is\n * opened FROM the list it renders. */\nexport function settingsFromListState(): Record<string, true> {\n return { [SETTINGS_FROM_LIST_STATE]: true };\n}\n\nfunction isFromList(state: unknown): boolean {\n return (\n typeof state === \"object\" && state !== null && (state as Record<string, unknown>)[SETTINGS_FROM_LIST_STATE] === true\n );\n}\n\nexport interface SettingsLocation {\n pathname: string;\n search: string;\n hash: string;\n}\n\nexport interface SettingsLocationRules<G extends string> {\n basePath: string;\n /** The visible group ids. */\n groups: readonly G[];\n /** The resolved default group, `null` with no visible group. */\n defaultGroup: G | null;\n aliases?: Readonly<Partial<Record<string, G>>>;\n /** Anchor → group, for `/settings?focus=<anchor>` with no group named. */\n anchorGroup?: ReadonlyMap<string, G>;\n phone: boolean;\n}\n\nexport interface SettingsLocationResult<G extends string> {\n group: G | null;\n sub: string | null;\n /** The path (with query) to replace the location with, or `null` when it is already\n * canonical. */\n redirect: string | null;\n}\n\n/**\n * Where a location lands on the settings page — pure, so the rules of §3.1 are testable\n * without a router:\n *\n * - `/settings` → the default group on a desktop (a replace), the list on a phone;\n * - `/settings/<group>[/<sub>]` → that group, the rest of the path as `sub`;\n * - an alias → its successor, with a replace, `sub`, query and hash kept;\n * - an unknown or hidden group → the default group (desktop) or the list (phone), with\n * a replace and the query kept — never a 404, so an old bookmark still lands;\n * - keksdose's legacy `/settings?<query>#<group>[/<sub>]` →\n * `/settings/<group>[/<sub>]?<query>`, the WHOLE query carried (a tour's\n * `tour`/`tourStep` as well as `focus`), then resolved by the rules above;\n * - `/settings?focus=<anchor>` with no group → the anchor's group, where it can ring.\n */\nexport function resolveSettingsLocation<G extends string>(\n location: SettingsLocation,\n rules: SettingsLocationRules<G>,\n): SettingsLocationResult<G> {\n const base = normalizeSettingsBase(rules.basePath);\n const { pathname, search, hash } = location;\n const known = new Set<string>(rules.groups);\n const atBase = pathname === base || pathname === `${base}/` || (base === \"\" && pathname === \"/\");\n\n if (atBase) {\n const legacy = hash.replace(/^#/, \"\").replace(/^\\/+/, \"\");\n if (legacy) {\n // The hash becomes the path; whatever the path then says (an alias, an unknown\n // group) is resolved in the same step, so the history sees one replace.\n const converted = `${base}/${legacy}`;\n const next = resolveSettingsLocation({ pathname: converted, search, hash: \"\" }, rules);\n return { ...next, redirect: next.redirect ?? `${converted}${search}` };\n }\n const anchor = new URLSearchParams(search).get(\"focus\");\n const anchorGroup = anchor ? rules.anchorGroup?.get(anchor) : undefined;\n if (anchorGroup && known.has(anchorGroup)) {\n return { group: anchorGroup, sub: null, redirect: `${base}/${anchorGroup}${search}` };\n }\n if (rules.phone || rules.defaultGroup === null) return { group: null, sub: null, redirect: null };\n return { group: rules.defaultGroup, sub: null, redirect: `${base}/${rules.defaultGroup}${search}` };\n }\n\n if (!pathname.startsWith(`${base}/`)) {\n // Mounted somewhere `basePath` does not name: a misconfiguration, not a link to\n // correct. Show what the base path would, and leave the address alone.\n return { group: rules.phone ? null : rules.defaultGroup, sub: null, redirect: null };\n }\n const rest = pathname.slice(base.length + 1);\n const [segment = \"\", ...subParts] = rest.split(\"/\");\n const sub = subParts.filter(Boolean).join(\"/\") || null;\n if (known.has(segment)) return { group: segment as G, sub, redirect: null };\n\n const successor = rules.aliases?.[segment];\n if (successor !== undefined && known.has(successor)) {\n return {\n group: successor,\n sub,\n redirect: `${base}/${successor}${sub ? `/${sub}` : \"\"}${search}${hash}`,\n };\n }\n\n // Unknown or hidden. The hash is dropped: on the list it would read as a legacy group\n // and send the page round again.\n if (rules.phone || rules.defaultGroup === null) {\n return { group: null, sub: null, redirect: `${base || \"/\"}${search}` };\n }\n return { group: rules.defaultGroup, sub: null, redirect: `${base}/${rules.defaultGroup}${search}` };\n}\n\n/**\n * The settings page's route (docs/settings-harmonization.md §3.1): which group the URL\n * names, and the history rules for moving between groups.\n *\n * The URL IS the selection, as it was in keksdose (where it was the hash): there is no\n * state to keep in step with it, so a deep link, a reload, back and forward all land\n * where the address says. Everything that is not canonical — `/settings` on a desktop, a\n * legacy hash, an alias, an unknown or hidden group — is replaced by its canonical path.\n *\n * **The replace runs on every navigation**, keyed on `location.key`, not once on mount:\n * the router keeps the page mounted across links followed inside the app — keksdose's\n * inbox renders admin-typed URLs, and a push click routes an open window without a\n * reload — so a legacy `/settings#security` arriving while the page is open converts too\n * (§10.1).\n */\nexport function useSettingsRoute<G extends string>(options: UseSettingsRouteOptions<G>): SettingsRoute<G> {\n const { groups, entries, basePath, defaultGroup, aliases, layout = \"auto\" } = options;\n const location = useLocation();\n const navigate = useNavigate();\n const narrow = usePhoneLayout();\n const phone = layout === \"phone\" || (layout === \"auto\" && narrow);\n const base = normalizeSettingsBase(basePath);\n\n const visible = useMemo(() => visibleSettingsGroups(groups, entries), [groups, entries]);\n const anchorGroup = useMemo(() => {\n const map = new Map<string, G>();\n for (const e of entries ?? []) if (e.visible !== false && !map.has(e.anchor)) map.set(e.anchor, e.group);\n return map;\n }, [entries]);\n const ids = visible.map((g) => g.id);\n const fallback = defaultGroup !== undefined && ids.includes(defaultGroup) ? defaultGroup : (ids[0] ?? null);\n\n const { group, sub, redirect } = resolveSettingsLocation(location, {\n basePath: base,\n groups: ids,\n defaultGroup: fallback,\n aliases,\n anchorGroup,\n phone,\n });\n\n const { key, state, search } = location;\n useEffect(() => {\n // `state` rides along: the marker describes the entry BEFORE this one, which a\n // replace does not change.\n if (redirect) navigate(redirect, { replace: true, state });\n }, [key, redirect, state, navigate]);\n\n const select = useCallback(\n (next: G) => {\n const to = `${base}/${next}`;\n // From the list, the push marks it, so the group page's back is a real back.\n if (phone) navigate(to, group === null ? { state: settingsFromListState() } : undefined);\n // A new group is a new page: the old one's query (a focus, a roster filter) stays\n // behind, as keksdose's `selectGroup` left it.\n else navigate(to, { replace: true, state });\n },\n [base, phone, group, state, navigate],\n );\n\n const selectSub = useCallback(\n (next: string | null) => {\n if (group === null) return;\n navigate(`${base}/${group}${next ? `/${next}` : \"\"}${search}`, { replace: true, state });\n },\n [base, group, search, state, navigate],\n );\n\n const fromList = isFromList(state);\n const back = useCallback(() => {\n if (fromList) navigate(-1);\n else navigate(base || \"/\", { replace: true });\n }, [fromList, base, navigate]);\n\n return {\n group,\n sub,\n focus: new URLSearchParams(search).get(\"focus\"),\n select,\n selectSub,\n back,\n groups: visible,\n phone,\n redirecting: redirect !== null,\n fromList,\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,16 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
- import { createContext, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
3
+ import {
4
+ createContext,
5
+ useCallback,
6
+ useContext,
7
+ useEffect,
8
+ useId,
9
+ useLayoutEffect,
10
+ useMemo,
11
+ useRef,
12
+ useState
13
+ } from "react";
4
14
  import { createPortal } from "react-dom";
5
15
  import { Link, NavLink, matchPath, useHref, useLocation } from "react-router";
6
16
  import { ChevronRight, MoreHorizontal, PanelLeftClose, PanelLeftOpen } from "lucide-react";
@@ -88,9 +98,7 @@ function useNavHeightVar(ref, shellRef, embedded) {
88
98
  const node = ref.current;
89
99
  const shell = shellRef.current;
90
100
  const global = !embedded && !shell?.parentElement?.closest("[data-app-shell]");
91
- const targets = [shell, global ? document.documentElement : null].filter(
92
- (el) => el !== null
93
- );
101
+ const targets = [shell, global ? document.documentElement : null].filter((el) => el !== null);
94
102
  const publish = () => {
95
103
  const value = `${node ? Math.floor(node.getBoundingClientRect().height) : 0}px`;
96
104
  for (const el of targets) el.style.setProperty("--app-nav-h", value);
@@ -263,30 +271,23 @@ function AppShell({
263
271
  footer
264
272
  ] })
265
273
  ] }),
266
- /* @__PURE__ */ jsxs(
267
- "div",
268
- {
269
- ref: navRef,
270
- className: "md:hidden fixed bottom-0 inset-x-0 z-30 border-t border-subtle bg-surface",
271
- children: [
272
- mobileSubNav && /* @__PURE__ */ jsx(MobileSubNav, { nav, layout: mobileSubNavLayout }),
273
- /* @__PURE__ */ jsxs(
274
- "nav",
275
- {
276
- "data-tour": "nav",
277
- className: "grid",
278
- style: { gridTemplateColumns: `repeat(${barNav.length + (moreNav.length ? 1 : 0)}, minmax(0, 1fr))` },
279
- children: [
280
- barNav.map(
281
- (item) => item.items?.length ? /* @__PURE__ */ jsx(MobileGroupCell, { item, labels: moreLabels }, item.to) : /* @__PURE__ */ jsx(MobileNavItem, { item }, item.to)
282
- ),
283
- moreNav.length > 0 && /* @__PURE__ */ jsx(MobileMoreCell, { hidden: moreNav, labels: moreLabels })
284
- ]
285
- }
286
- )
287
- ]
288
- }
289
- )
274
+ /* @__PURE__ */ jsxs("div", { ref: navRef, className: "md:hidden fixed bottom-0 inset-x-0 z-30 border-t border-subtle bg-surface", children: [
275
+ mobileSubNav && /* @__PURE__ */ jsx(MobileSubNav, { nav, layout: mobileSubNavLayout }),
276
+ /* @__PURE__ */ jsxs(
277
+ "nav",
278
+ {
279
+ "data-tour": "nav",
280
+ className: "grid",
281
+ style: { gridTemplateColumns: `repeat(${barNav.length + (moreNav.length ? 1 : 0)}, minmax(0, 1fr))` },
282
+ children: [
283
+ barNav.map(
284
+ (item) => item.items?.length ? /* @__PURE__ */ jsx(MobileGroupCell, { item, labels: moreLabels }, item.to) : /* @__PURE__ */ jsx(MobileNavItem, { item }, item.to)
285
+ ),
286
+ moreNav.length > 0 && /* @__PURE__ */ jsx(MobileMoreCell, { hidden: moreNav, labels: moreLabels })
287
+ ]
288
+ }
289
+ )
290
+ ] })
290
291
  ]
291
292
  }
292
293
  ) })
@@ -455,7 +456,17 @@ function MobileGroupCell({
455
456
  /* @__PURE__ */ jsx(TourAnchor, { to: item.to, dataTour: item.dataTour }),
456
457
  pages.filter((sub) => sub.to !== item.to).map((sub) => /* @__PURE__ */ jsx(TourAnchor, { to: sub.to }, sub.to)),
457
458
  /* @__PURE__ */ jsx(DialogFrame, { open, onClose: close, title: item.label, closeButton: true, bodyClassName: "space-y-1", children: /* @__PURE__ */ jsxs("ul", { className: "space-y-1", children: [
458
- !ownPageListed && /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(SheetLink, { to: item.to, end: item.end, icon: item.icon, label: labels.overview, onClick: close, level: "entry" }) }),
459
+ !ownPageListed && /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
460
+ SheetLink,
461
+ {
462
+ to: item.to,
463
+ end: item.end,
464
+ icon: item.icon,
465
+ label: labels.overview,
466
+ onClick: close,
467
+ level: "entry"
468
+ }
469
+ ) }),
459
470
  pages.map((sub) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(SheetLink, { to: sub.to, end: sub.end, icon: sub.icon, label: sub.label, onClick: close, level: "entry" }) }, sub.to))
460
471
  ] }) })
461
472
  ] });
@@ -508,8 +519,28 @@ function MobileMoreCell({
508
519
  ...(item.items ?? []).map((sub) => /* @__PURE__ */ jsx(TourAnchor, { to: sub.to }, `${item.to} ${sub.to}`))
509
520
  ]),
510
521
  /* @__PURE__ */ jsx(DialogFrame, { open, onClose: close, title: labels.moreTitle, closeButton: true, bodyClassName: "space-y-1", children: /* @__PURE__ */ jsx("ul", { className: "space-y-1", children: hidden.map((item) => /* @__PURE__ */ jsxs("li", { children: [
511
- /* @__PURE__ */ jsx(SheetLink, { to: item.to, end: item.end, icon: item.icon, label: item.label, onClick: close, level: "entry" }),
512
- !!item.items?.length && /* @__PURE__ */ jsx("ul", { "aria-label": item.label, className: "ms-[1.3rem] mt-0.5 space-y-0.5 border-s border-subtle ps-2", children: item.items.map((sub) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(SheetLink, { to: sub.to, end: sub.end, icon: sub.icon, label: sub.label, onClick: close, level: "page" }) }, sub.to)) })
522
+ /* @__PURE__ */ jsx(
523
+ SheetLink,
524
+ {
525
+ to: item.to,
526
+ end: item.end,
527
+ icon: item.icon,
528
+ label: item.label,
529
+ onClick: close,
530
+ level: "entry"
531
+ }
532
+ ),
533
+ !!item.items?.length && /* @__PURE__ */ jsx("ul", { "aria-label": item.label, className: "ms-[1.3rem] mt-0.5 space-y-0.5 border-s border-subtle ps-2", children: item.items.map((sub) => /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(
534
+ SheetLink,
535
+ {
536
+ to: sub.to,
537
+ end: sub.end,
538
+ icon: sub.icon,
539
+ label: sub.label,
540
+ onClick: close,
541
+ level: "page"
542
+ }
543
+ ) }, sub.to)) })
513
544
  ] }, item.to)) }) })
514
545
  ] });
515
546
  }