@eifi1/ui-kit 0.51.6 → 0.52.0

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 (805) hide show
  1. package/README.md +146 -26
  2. package/dist/account/account-parts.d.ts +10 -8
  3. package/dist/account/account-parts.js +1 -18
  4. package/dist/account/account-parts.js.map +1 -1
  5. package/dist/account/data-export-setting-labels.js +1 -1
  6. package/dist/account/data-export-setting-labels.js.map +1 -1
  7. package/dist/account/delete-account-setting-labels.js +1 -1
  8. package/dist/account/delete-account-setting-labels.js.map +1 -1
  9. package/dist/account/email-change-setting-labels.js +1 -1
  10. package/dist/account/email-change-setting-labels.js.map +1 -1
  11. package/dist/account/passkeys-setting.d.ts +9 -2
  12. package/dist/account/passkeys-setting.js +41 -29
  13. package/dist/account/passkeys-setting.js.map +1 -1
  14. package/dist/account/sessions-setting.d.ts +3 -2
  15. package/dist/account/sessions-setting.js +10 -8
  16. package/dist/account/sessions-setting.js.map +1 -1
  17. package/dist/admin/admin-action-confirm.js +3 -7
  18. package/dist/admin/admin-action-confirm.js.map +1 -1
  19. package/dist/admin/admin-parts.d.ts +6 -3
  20. package/dist/admin/admin-parts.js +6 -21
  21. package/dist/admin/admin-parts.js.map +1 -1
  22. package/dist/admin/mail-test-card-labels.js +1 -1
  23. package/dist/admin/mail-test-card-labels.js.map +1 -1
  24. package/dist/admin/plan-change-labels.d.ts +2 -2
  25. package/dist/admin/plan-change-labels.js +1 -17
  26. package/dist/admin/plan-change-labels.js.map +1 -1
  27. package/dist/admin/plan-change.d.ts +3 -42
  28. package/dist/admin/plan-change.js +1 -1
  29. package/dist/admin/plan-change.js.map +1 -1
  30. package/dist/admin/reviewer-scope-editor.js +3 -3
  31. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  32. package/dist/auth/auth-errors-labels.d.ts +11 -0
  33. package/dist/auth/auth-errors-labels.js +13 -0
  34. package/dist/auth/auth-errors-labels.js.map +1 -0
  35. package/dist/auth/auth-errors.d.ts +7 -23
  36. package/dist/auth/auth-errors.js +2 -15
  37. package/dist/auth/auth-errors.js.map +1 -1
  38. package/dist/auth/complete-name-dialog.d.ts +3 -2
  39. package/dist/auth/complete-name-dialog.js +3 -5
  40. package/dist/auth/complete-name-dialog.js.map +1 -1
  41. package/dist/auth/forgot-password-form-labels.js +1 -1
  42. package/dist/auth/forgot-password-form-labels.js.map +1 -1
  43. package/dist/auth/forgot-password-form.js +7 -2
  44. package/dist/auth/forgot-password-form.js.map +1 -1
  45. package/dist/auth/register-form-labels.js +1 -1
  46. package/dist/auth/register-form-labels.js.map +1 -1
  47. package/dist/auth/reset-password-form-labels.js +1 -1
  48. package/dist/auth/reset-password-form-labels.js.map +1 -1
  49. package/dist/auth/reset-password-form.js +5 -1
  50. package/dist/auth/reset-password-form.js.map +1 -1
  51. package/dist/auth/sign-in-form-labels.js +1 -1
  52. package/dist/auth/sign-in-form-labels.js.map +1 -1
  53. package/dist/auth/status-parts.d.ts +0 -3
  54. package/dist/auth/status-parts.js +0 -4
  55. package/dist/auth/status-parts.js.map +1 -1
  56. package/dist/auth/verify-email-labels.js +1 -1
  57. package/dist/auth/verify-email-labels.js.map +1 -1
  58. package/dist/auth/verify-email.js +7 -2
  59. package/dist/auth/verify-email.js.map +1 -1
  60. package/dist/billing/cancel-request.d.ts +11 -2
  61. package/dist/billing/cancel-request.js +15 -3
  62. package/dist/billing/cancel-request.js.map +1 -1
  63. package/dist/billing/cancel-subscription.d.ts +22 -10
  64. package/dist/billing/cancel-subscription.js +8 -11
  65. package/dist/billing/cancel-subscription.js.map +1 -1
  66. package/dist/billing/dialog-close.d.ts +29 -0
  67. package/dist/billing/dialog-close.js +8 -0
  68. package/dist/billing/dialog-close.js.map +1 -0
  69. package/dist/billing/plan-card.d.ts +14 -4
  70. package/dist/billing/plan-card.js +15 -8
  71. package/dist/billing/plan-card.js.map +1 -1
  72. package/dist/billing/plan-change-labels.d.ts +42 -0
  73. package/dist/billing/plan-change-labels.js +22 -0
  74. package/dist/billing/plan-change-labels.js.map +1 -0
  75. package/dist/billing/plan-switch.d.ts +21 -9
  76. package/dist/billing/plan-switch.js +10 -8
  77. package/dist/billing/plan-switch.js.map +1 -1
  78. package/dist/chart.d.ts +12 -0
  79. package/dist/chart.js +16 -1
  80. package/dist/chart.js.map +1 -1
  81. package/dist/components/account-chips.d.ts +5 -5
  82. package/dist/components/account-chips.js +11 -13
  83. package/dist/components/account-chips.js.map +1 -1
  84. package/dist/components/alert-banner.d.ts +16 -5
  85. package/dist/components/alert-banner.js +46 -1
  86. package/dist/components/alert-banner.js.map +1 -1
  87. package/dist/components/amount-input.d.ts +22 -4
  88. package/dist/components/amount-input.js +3 -3
  89. package/dist/components/amount-input.js.map +1 -1
  90. package/dist/components/autocomplete.js +57 -65
  91. package/dist/components/autocomplete.js.map +1 -1
  92. package/dist/components/bulk-action-bar.d.ts +12 -2
  93. package/dist/components/bulk-action-bar.js +65 -21
  94. package/dist/components/bulk-action-bar.js.map +1 -1
  95. package/dist/components/button-look.d.ts +5 -5
  96. package/dist/components/button-look.js.map +1 -1
  97. package/dist/components/button.d.ts +2 -2
  98. package/dist/components/button.js.map +1 -1
  99. package/dist/components/calculator.d.ts +21 -2
  100. package/dist/components/calculator.js +53 -14
  101. package/dist/components/calculator.js.map +1 -1
  102. package/dist/components/chart-edge.d.ts +16 -0
  103. package/dist/components/chart-edge.js +14 -1
  104. package/dist/components/chart-edge.js.map +1 -1
  105. package/dist/components/chart-figure.d.ts +13 -0
  106. package/dist/components/chart-figure.js +15 -0
  107. package/dist/components/chart-figure.js.map +1 -0
  108. package/dist/components/chart-zoom-core.js +1 -4
  109. package/dist/components/chart-zoom-core.js.map +1 -1
  110. package/dist/components/chart.d.ts +8 -1
  111. package/dist/components/chart.js +19 -10
  112. package/dist/components/chart.js.map +1 -1
  113. package/dist/components/combobox-core.d.ts +119 -7
  114. package/dist/components/combobox-core.js +151 -46
  115. package/dist/components/combobox-core.js.map +1 -1
  116. package/dist/components/combobox.d.ts +1 -1
  117. package/dist/components/combobox.js +142 -131
  118. package/dist/components/combobox.js.map +1 -1
  119. package/dist/components/copy-button.d.ts +6 -5
  120. package/dist/components/copy-button.js +5 -3
  121. package/dist/components/copy-button.js.map +1 -1
  122. package/dist/components/country-select.js +2 -2
  123. package/dist/components/country-select.js.map +1 -1
  124. package/dist/components/data-table-column-settings.d.ts +1 -1
  125. package/dist/components/data-table-column-settings.js +33 -7
  126. package/dist/components/data-table-column-settings.js.map +1 -1
  127. package/dist/components/data-table-filters.d.ts +4 -2
  128. package/dist/components/data-table-filters.js +2 -2
  129. package/dist/components/data-table-filters.js.map +1 -1
  130. package/dist/components/data-table-fit.d.ts +6 -4
  131. package/dist/components/data-table-fit.js +4 -1
  132. package/dist/components/data-table-fit.js.map +1 -1
  133. package/dist/components/data-table-groups.d.ts +1 -1
  134. package/dist/components/data-table-groups.js.map +1 -1
  135. package/dist/components/data-table-head.d.ts +1 -1
  136. package/dist/components/data-table-head.js +15 -12
  137. package/dist/components/data-table-head.js.map +1 -1
  138. package/dist/components/data-table-mobile.d.ts +36 -7
  139. package/dist/components/data-table-mobile.js +63 -31
  140. package/dist/components/data-table-mobile.js.map +1 -1
  141. package/dist/components/data-table-pagination.js +11 -6
  142. package/dist/components/data-table-pagination.js.map +1 -1
  143. package/dist/components/data-table-resize.d.ts +1 -1
  144. package/dist/components/data-table-resize.js.map +1 -1
  145. package/dist/components/data-table-row-actions.d.ts +2 -2
  146. package/dist/components/data-table-row-actions.js.map +1 -1
  147. package/dist/components/data-table-row.d.ts +6 -2
  148. package/dist/components/data-table-row.js +17 -10
  149. package/dist/components/data-table-row.js.map +1 -1
  150. package/dist/components/data-table-selection.d.ts +1 -1
  151. package/dist/components/data-table-selection.js.map +1 -1
  152. package/dist/components/data-table-shared.d.ts +10 -2
  153. package/dist/components/data-table-shared.js +18 -0
  154. package/dist/components/data-table-shared.js.map +1 -1
  155. package/dist/components/data-table-sort.d.ts +21 -2
  156. package/dist/components/data-table-sort.js +24 -0
  157. package/dist/components/data-table-sort.js.map +1 -1
  158. package/dist/components/data-table-virtual.d.ts +1 -1
  159. package/dist/components/data-table-virtual.js +18 -6
  160. package/dist/components/data-table-virtual.js.map +1 -1
  161. package/dist/components/data-table.d.ts +25 -8
  162. package/dist/components/data-table.js +154 -25
  163. package/dist/components/data-table.js.map +1 -1
  164. package/dist/components/date-field.d.ts +24 -2
  165. package/dist/components/date-field.js +33 -8
  166. package/dist/components/date-field.js.map +1 -1
  167. package/dist/components/date-picker.d.ts +15 -2
  168. package/dist/components/date-picker.js +55 -26
  169. package/dist/components/date-picker.js.map +1 -1
  170. package/dist/components/date-range-picker.d.ts +47 -20
  171. package/dist/components/date-range-picker.js +23 -7
  172. package/dist/components/date-range-picker.js.map +1 -1
  173. package/dist/components/dialog-frame.d.ts +2 -1
  174. package/dist/components/dialog-frame.js.map +1 -1
  175. package/dist/components/entity-combobox.js +4 -2
  176. package/dist/components/entity-combobox.js.map +1 -1
  177. package/dist/components/error-boundary.js +37 -30
  178. package/dist/components/error-boundary.js.map +1 -1
  179. package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
  180. package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
  181. package/dist/components/field-base-labels.js.map +1 -0
  182. package/dist/components/field-base.d.ts +4 -3
  183. package/dist/components/field-base.js +3 -3
  184. package/dist/components/field-base.js.map +1 -1
  185. package/dist/components/field-sync-labels.d.ts +1 -0
  186. package/dist/components/field-sync-labels.js.map +1 -1
  187. package/dist/components/field-sync.d.ts +23 -1
  188. package/dist/components/field-sync.js.map +1 -1
  189. package/dist/components/form-actions.js +11 -5
  190. package/dist/components/form-actions.js.map +1 -1
  191. package/dist/components/hover-menu.d.ts +3 -0
  192. package/dist/components/hover-menu.js +5 -3
  193. package/dist/components/hover-menu.js.map +1 -1
  194. package/dist/components/icon-button.js +14 -9
  195. package/dist/components/icon-button.js.map +1 -1
  196. package/dist/components/inline-confirm.d.ts +43 -0
  197. package/dist/components/inline-confirm.js +67 -0
  198. package/dist/components/inline-confirm.js.map +1 -0
  199. package/dist/components/inline-entity-combobox.d.ts +4 -3
  200. package/dist/components/inline-entity-combobox.js +150 -141
  201. package/dist/components/inline-entity-combobox.js.map +1 -1
  202. package/dist/components/input.js +1 -1
  203. package/dist/components/input.js.map +1 -1
  204. package/dist/components/jump-calendar.js +28 -112
  205. package/dist/components/jump-calendar.js.map +1 -1
  206. package/dist/components/legal-page.d.ts +3 -1
  207. package/dist/components/legal-page.js +3 -2
  208. package/dist/components/legal-page.js.map +1 -1
  209. package/dist/components/legal.d.ts +4 -2
  210. package/dist/components/legal.js.map +1 -1
  211. package/dist/components/lightbox.d.ts +2 -2
  212. package/dist/components/lightbox.js +17 -6
  213. package/dist/components/lightbox.js.map +1 -1
  214. package/dist/components/list.d.ts +6 -2
  215. package/dist/components/list.js +4 -3
  216. package/dist/components/list.js.map +1 -1
  217. package/dist/components/measured-grid.d.ts +1 -1
  218. package/dist/components/measured-grid.js +2 -1
  219. package/dist/components/measured-grid.js.map +1 -1
  220. package/dist/components/mini-calendar.js +3 -5
  221. package/dist/components/mini-calendar.js.map +1 -1
  222. package/dist/components/modal.d.ts +24 -0
  223. package/dist/components/modal.js +12 -4
  224. package/dist/components/modal.js.map +1 -1
  225. package/dist/components/money-draft.js +7 -5
  226. package/dist/components/money-draft.js.map +1 -1
  227. package/dist/components/money-field.d.ts +2 -2
  228. package/dist/components/money-field.js.map +1 -1
  229. package/dist/components/month-grid.d.ts +55 -0
  230. package/dist/components/month-grid.js +148 -0
  231. package/dist/components/month-grid.js.map +1 -0
  232. package/dist/components/month-picker.d.ts +36 -4
  233. package/dist/components/month-picker.js +123 -146
  234. package/dist/components/month-picker.js.map +1 -1
  235. package/dist/components/multi-entity-combobox.js +2 -1
  236. package/dist/components/multi-entity-combobox.js.map +1 -1
  237. package/dist/components/multi-select.d.ts +2 -2
  238. package/dist/components/multi-select.js +11 -6
  239. package/dist/components/multi-select.js.map +1 -1
  240. package/dist/components/number-field.d.ts +6 -4
  241. package/dist/components/number-field.js +3 -2
  242. package/dist/components/number-field.js.map +1 -1
  243. package/dist/components/number-input.d.ts +4 -1
  244. package/dist/components/number-input.js +3 -2
  245. package/dist/components/number-input.js.map +1 -1
  246. package/dist/components/numpad-sheet.js.map +1 -1
  247. package/dist/components/picker-sheet.js +2 -1
  248. package/dist/components/picker-sheet.js.map +1 -1
  249. package/dist/components/pie-chart-labels.d.ts +7 -0
  250. package/dist/components/pie-chart-labels.js +1 -0
  251. package/dist/components/pie-chart-labels.js.map +1 -1
  252. package/dist/components/pie-chart.d.ts +5 -3
  253. package/dist/components/pie-chart.js +7 -22
  254. package/dist/components/pie-chart.js.map +1 -1
  255. package/dist/components/popover.d.ts +3 -0
  256. package/dist/components/popover.js +7 -1
  257. package/dist/components/popover.js.map +1 -1
  258. package/dist/components/reauth-dialog.d.ts +4 -5
  259. package/dist/components/reauth-dialog.js +1 -4
  260. package/dist/components/reauth-dialog.js.map +1 -1
  261. package/dist/components/row-actions.js +2 -1
  262. package/dist/components/row-actions.js.map +1 -1
  263. package/dist/components/section-nav.d.ts +7 -0
  264. package/dist/components/section-nav.js.map +1 -1
  265. package/dist/components/series-chart-axes.d.ts +10 -3
  266. package/dist/components/series-chart-axes.js +1 -0
  267. package/dist/components/series-chart-axes.js.map +1 -1
  268. package/dist/components/series-chart-labels.d.ts +7 -4
  269. package/dist/components/series-chart-labels.js.map +1 -1
  270. package/dist/components/series-chart.d.ts +31 -7
  271. package/dist/components/series-chart.js +72 -29
  272. package/dist/components/series-chart.js.map +1 -1
  273. package/dist/components/share-card.js +3 -3
  274. package/dist/components/share-card.js.map +1 -1
  275. package/dist/components/sign-chip-labels.d.ts +1 -0
  276. package/dist/components/sign-chip-labels.js.map +1 -1
  277. package/dist/components/sign-chip.d.ts +10 -1
  278. package/dist/components/sign-chip.js.map +1 -1
  279. package/dist/components/tabs-labels.d.ts +2 -0
  280. package/dist/components/tabs-labels.js +11 -0
  281. package/dist/components/tabs-labels.js.map +1 -0
  282. package/dist/components/tabs.d.ts +1 -1
  283. package/dist/components/tabs.js +13 -11
  284. package/dist/components/tabs.js.map +1 -1
  285. package/dist/components/toggle-legend.d.ts +2 -2
  286. package/dist/components/toggle-legend.js +6 -6
  287. package/dist/components/toggle-legend.js.map +1 -1
  288. package/dist/components/translation-review-editor.d.ts +4 -2
  289. package/dist/components/translation-review-editor.js +2 -3
  290. package/dist/components/translation-review-editor.js.map +1 -1
  291. package/dist/components/translation-review.d.ts +2 -1
  292. package/dist/components/translation-review.js +2 -2
  293. package/dist/components/translation-review.js.map +1 -1
  294. package/dist/components/treemap-labels.d.ts +26 -0
  295. package/dist/components/treemap-labels.js +10 -0
  296. package/dist/components/treemap-labels.js.map +1 -0
  297. package/dist/components/treemap-layout.d.ts +62 -0
  298. package/dist/components/treemap-layout.js +126 -0
  299. package/dist/components/treemap-layout.js.map +1 -0
  300. package/dist/components/treemap.d.ts +140 -17
  301. package/dist/components/treemap.js +324 -97
  302. package/dist/components/treemap.js.map +1 -1
  303. package/dist/components/use-table-state.d.ts +5 -5
  304. package/dist/components/use-table-state.js +4 -1
  305. package/dist/components/use-table-state.js.map +1 -1
  306. package/dist/data-table.d.ts +6 -2
  307. package/dist/data-table.js +7 -2
  308. package/dist/data-table.js.map +1 -1
  309. package/dist/eslint/index.js +1 -1
  310. package/dist/eslint/role-utilities.d.ts +36 -7
  311. package/dist/eslint/role-utilities.js +42 -9
  312. package/dist/eslint/role-utilities.js.map +1 -1
  313. package/dist/feedback/feedback-dialog.d.ts +25 -16
  314. package/dist/feedback/feedback-dialog.js +6 -2
  315. package/dist/feedback/feedback-dialog.js.map +1 -1
  316. package/dist/feedback/feedback-mutation.d.ts +30 -0
  317. package/dist/feedback/feedback-mutation.js +16 -0
  318. package/dist/feedback/feedback-mutation.js.map +1 -0
  319. package/dist/feedback/feedback-page-link.d.ts +53 -0
  320. package/dist/feedback/feedback-page-link.js +37 -0
  321. package/dist/feedback/feedback-page-link.js.map +1 -0
  322. package/dist/feedback/feedback-public-list.d.ts +12 -3
  323. package/dist/feedback/feedback-public-list.js +2 -1
  324. package/dist/feedback/feedback-public-list.js.map +1 -1
  325. package/dist/feedback/feedback-replies.d.ts +3 -1
  326. package/dist/feedback/feedback-replies.js +5 -4
  327. package/dist/feedback/feedback-replies.js.map +1 -1
  328. package/dist/feedback/feedback-row-detail-labels.js +5 -0
  329. package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
  330. package/dist/feedback/feedback-row-detail.d.ts +64 -28
  331. package/dist/feedback/feedback-row-detail.js +30 -28
  332. package/dist/feedback/feedback-row-detail.js.map +1 -1
  333. package/dist/feedback/feedback-status-undo.d.ts +30 -11
  334. package/dist/feedback/feedback-status-undo.js +10 -15
  335. package/dist/feedback/feedback-status-undo.js.map +1 -1
  336. package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
  337. package/dist/feedback/feedback-submit-dialog.js +1 -1
  338. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  339. package/dist/feedback/feedback-submit.js +9 -3
  340. package/dist/feedback/feedback-submit.js.map +1 -1
  341. package/dist/feedback/feedback-swipe.d.ts +1 -1
  342. package/dist/feedback/feedback-swipe.js.map +1 -1
  343. package/dist/feedback/feedback-table.d.ts +21 -9
  344. package/dist/feedback/feedback-table.js +45 -25
  345. package/dist/feedback/feedback-table.js.map +1 -1
  346. package/dist/feedback/feedback-thread-labels.d.ts +2 -2
  347. package/dist/feedback/feedback-thread-labels.js.map +1 -1
  348. package/dist/feedback/feedback-thread.d.ts +24 -23
  349. package/dist/feedback/feedback-thread.js +2 -1
  350. package/dist/feedback/feedback-thread.js.map +1 -1
  351. package/dist/feedback.d.ts +34 -0
  352. package/dist/feedback.js +42 -0
  353. package/dist/feedback.js.map +1 -1
  354. package/dist/hooks/use-dismiss.js.map +1 -1
  355. package/dist/hooks/use-focus-trap.d.ts +35 -0
  356. package/dist/hooks/use-focus-trap.js +6 -4
  357. package/dist/hooks/use-focus-trap.js.map +1 -1
  358. package/dist/hooks/use-hotkey.d.ts +5 -2
  359. package/dist/hooks/use-hotkey.js +5 -4
  360. package/dist/hooks/use-hotkey.js.map +1 -1
  361. package/dist/hooks/use-long-press.d.ts +7 -4
  362. package/dist/hooks/use-long-press.js +3 -0
  363. package/dist/hooks/use-long-press.js.map +1 -1
  364. package/dist/hooks/use-media-query.js +12 -4
  365. package/dist/hooks/use-media-query.js.map +1 -1
  366. package/dist/hooks/use-mounted.d.ts +22 -0
  367. package/dist/hooks/use-mounted.js +24 -0
  368. package/dist/hooks/use-mounted.js.map +1 -0
  369. package/dist/hooks/use-overlay-history.d.ts +7 -1
  370. package/dist/hooks/use-overlay-history.js +35 -5
  371. package/dist/hooks/use-overlay-history.js.map +1 -1
  372. package/dist/i18n/defaults.js +4 -5
  373. package/dist/i18n/defaults.js.map +1 -1
  374. package/dist/i18n/german.js +7 -1
  375. package/dist/i18n/german.js.map +1 -1
  376. package/dist/i18n/kit-labels.d.ts +9 -2
  377. package/dist/i18n/kit-labels.js.map +1 -1
  378. package/dist/i18n/locales/en.js +20 -41
  379. package/dist/i18n/locales/en.js.map +3 -3
  380. package/dist/i18n/locales/es.js +7 -1
  381. package/dist/i18n/locales/es.js.map +1 -1
  382. package/dist/i18n/locales/fr.js +20 -10
  383. package/dist/i18n/locales/fr.js.map +1 -1
  384. package/dist/i18n/locales/hu.js +9 -1
  385. package/dist/i18n/locales/hu.js.map +1 -1
  386. package/dist/i18n/locales/it.js +7 -1
  387. package/dist/i18n/locales/it.js.map +1 -1
  388. package/dist/i18n/locales/zh.js +8 -1
  389. package/dist/i18n/locales/zh.js.map +1 -1
  390. package/dist/i18n/review.js +5 -0
  391. package/dist/i18n/review.js.map +1 -1
  392. package/dist/index.d.ts +64 -17
  393. package/dist/index.js +77 -12
  394. package/dist/index.js.map +1 -1
  395. package/dist/landing/routing.d.ts +3 -1
  396. package/dist/landing/routing.js +4 -7
  397. package/dist/landing/routing.js.map +1 -1
  398. package/dist/lib/broadcast.d.ts +17 -0
  399. package/dist/lib/broadcast.js +30 -0
  400. package/dist/lib/broadcast.js.map +1 -0
  401. package/dist/lib/calc.d.ts +7 -1
  402. package/dist/lib/calc.js +3 -1
  403. package/dist/lib/calc.js.map +1 -1
  404. package/dist/lib/clipboard-minus.d.ts +2 -2
  405. package/dist/lib/clipboard-minus.js +1 -1
  406. package/dist/lib/clipboard-minus.js.map +1 -1
  407. package/dist/lib/date-format.d.ts +37 -2
  408. package/dist/lib/date-format.js +34 -8
  409. package/dist/lib/date-format.js.map +1 -1
  410. package/dist/lib/day-format.d.ts +46 -0
  411. package/dist/lib/day-format.js +46 -0
  412. package/dist/lib/day-format.js.map +1 -0
  413. package/dist/lib/decimal-marks.d.ts +7 -1
  414. package/dist/lib/decimal-marks.js +5 -2
  415. package/dist/lib/decimal-marks.js.map +1 -1
  416. package/dist/lib/describe-failure.d.ts +14 -0
  417. package/dist/lib/describe-failure.js +9 -0
  418. package/dist/lib/describe-failure.js.map +1 -0
  419. package/dist/lib/direction.d.ts +16 -0
  420. package/dist/lib/direction.js +9 -1
  421. package/dist/lib/direction.js.map +1 -1
  422. package/dist/lib/focus-left.d.ts +63 -0
  423. package/dist/lib/focus-left.js +67 -0
  424. package/dist/lib/focus-left.js.map +1 -0
  425. package/dist/lib/format.d.ts +5 -3
  426. package/dist/lib/format.js +16 -13
  427. package/dist/lib/format.js.map +1 -1
  428. package/dist/lib/http-status.d.ts +24 -0
  429. package/dist/lib/http-status.js +14 -0
  430. package/dist/lib/http-status.js.map +1 -0
  431. package/dist/lib/intl-cache.d.ts +14 -0
  432. package/dist/lib/intl-cache.js +15 -0
  433. package/dist/lib/intl-cache.js.map +1 -0
  434. package/dist/lib/isin.d.ts +10 -0
  435. package/dist/lib/isin.js.map +1 -1
  436. package/dist/lib/iso-day.d.ts +11 -0
  437. package/dist/lib/iso-day.js +8 -0
  438. package/dist/lib/iso-day.js.map +1 -0
  439. package/dist/lib/lazy-with-fallback.d.ts +31 -0
  440. package/dist/lib/lazy-with-fallback.js +40 -0
  441. package/dist/lib/lazy-with-fallback.js.map +1 -0
  442. package/dist/lib/path-pattern.d.ts +34 -0
  443. package/dist/lib/path-pattern.js +24 -0
  444. package/dist/lib/path-pattern.js.map +1 -0
  445. package/dist/lib/reduced-motion.d.ts +2 -1
  446. package/dist/lib/reduced-motion.js.map +1 -1
  447. package/dist/lib/round.d.ts +2 -1
  448. package/dist/lib/round.js +2 -1
  449. package/dist/lib/round.js.map +1 -1
  450. package/dist/lib/safe-storage.d.ts +24 -5
  451. package/dist/lib/safe-storage.js +27 -2
  452. package/dist/lib/safe-storage.js.map +1 -1
  453. package/dist/lib/session-refresh.js +1 -1
  454. package/dist/lib/session-refresh.js.map +1 -1
  455. package/dist/lib/share-format.d.ts +13 -0
  456. package/dist/lib/share-format.js +10 -0
  457. package/dist/lib/share-format.js.map +1 -0
  458. package/dist/lib/text-case.d.ts +17 -0
  459. package/dist/lib/text-case.js +8 -0
  460. package/dist/lib/text-case.js.map +1 -0
  461. package/dist/lib/text-match.d.ts +38 -0
  462. package/dist/lib/text-match.js +24 -2
  463. package/dist/lib/text-match.js.map +1 -1
  464. package/dist/lib/thenable.d.ts +13 -0
  465. package/dist/lib/thenable.js +8 -0
  466. package/dist/lib/thenable.js.map +1 -0
  467. package/dist/lib/translation-review.d.ts +7 -2
  468. package/dist/lib/translation-review.js +4 -4
  469. package/dist/lib/translation-review.js.map +1 -1
  470. package/dist/notifications/device-zone-report.js +1 -1
  471. package/dist/notifications/device-zone-report.js.map +1 -1
  472. package/dist/notifications/notification-bell.d.ts +2 -1
  473. package/dist/notifications/notification-bell.js +3 -3
  474. package/dist/notifications/notification-bell.js.map +1 -1
  475. package/dist/notifications/notification-inbox.d.ts +10 -6
  476. package/dist/notifications/notification-inbox.js +26 -48
  477. package/dist/notifications/notification-inbox.js.map +1 -1
  478. package/dist/notifications/notification-parts.d.ts +3 -2
  479. package/dist/notifications/notification-parts.js +1 -3
  480. package/dist/notifications/notification-parts.js.map +1 -1
  481. package/dist/notifications/notification-types-setting.js +1 -1
  482. package/dist/notifications/notification-types-setting.js.map +1 -1
  483. package/dist/notifications/notifications-labels.d.ts +6 -0
  484. package/dist/notifications/notifications-labels.js +1 -0
  485. package/dist/notifications/notifications-labels.js.map +1 -1
  486. package/dist/notifications/push-device-setting.js +1 -1
  487. package/dist/notifications/push-device-setting.js.map +1 -1
  488. package/dist/notifications/push-devices-setting.d.ts +2 -1
  489. package/dist/notifications/push-devices-setting.js +27 -49
  490. package/dist/notifications/push-devices-setting.js.map +1 -1
  491. package/dist/notifications/quiet-hours-setting.d.ts +10 -3
  492. package/dist/notifications/quiet-hours-setting.js +65 -26
  493. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  494. package/dist/notifications/unsubscribe-panel.js +4 -7
  495. package/dist/notifications/unsubscribe-panel.js.map +1 -1
  496. package/dist/notifications/use-push-device.d.ts +39 -1
  497. package/dist/notifications/use-push-device.js +28 -7
  498. package/dist/notifications/use-push-device.js.map +1 -1
  499. package/dist/offline/query-persistence.d.ts +3 -1
  500. package/dist/offline/query-persistence.js +19 -2
  501. package/dist/offline/query-persistence.js.map +1 -1
  502. package/dist/rhf/fields.d.ts +11 -4
  503. package/dist/rhf/fields.js.map +1 -1
  504. package/dist/search/command-palette.js +1 -1
  505. package/dist/search/command-palette.js.map +1 -1
  506. package/dist/search/global-search.js +19 -9
  507. package/dist/search/global-search.js.map +1 -1
  508. package/dist/search/use-command-key.d.ts +12 -1
  509. package/dist/search/use-command-key.js +3 -12
  510. package/dist/search/use-command-key.js.map +1 -1
  511. package/dist/search.d.ts +7 -0
  512. package/dist/search.js +10 -0
  513. package/dist/search.js.map +1 -1
  514. package/dist/settings/use-settings-focus.js +1 -0
  515. package/dist/settings/use-settings-focus.js.map +1 -1
  516. package/dist/shell/account-menu-language.d.ts +21 -5
  517. package/dist/shell/account-menu-language.js +3 -1
  518. package/dist/shell/account-menu-language.js.map +1 -1
  519. package/dist/shell/account-menu-text-size.d.ts +26 -9
  520. package/dist/shell/account-menu-text-size.js +3 -2
  521. package/dist/shell/account-menu-text-size.js.map +1 -1
  522. package/dist/shell/dev-menu.js +5 -18
  523. package/dist/shell/dev-menu.js.map +1 -1
  524. package/dist/shell/role-switcher.d.ts +7 -0
  525. package/dist/shell/role-switcher.js.map +1 -1
  526. package/dist/shell/top-bar-actions.d.ts +1 -1
  527. package/dist/shell/top-bar-actions.js.map +1 -1
  528. package/dist/shell/top-bar-parts-labels.d.ts +0 -2
  529. package/dist/shell/top-bar-parts-labels.js +0 -1
  530. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  531. package/dist/shell.d.ts +27 -8
  532. package/dist/shell.js +28 -7
  533. package/dist/shell.js.map +1 -1
  534. package/dist/sync/engine.d.ts +30 -4
  535. package/dist/sync/engine.js +172 -52
  536. package/dist/sync/engine.js.map +1 -1
  537. package/dist/sync.d.ts +6 -2
  538. package/dist/sync.js +6 -1
  539. package/dist/sync.js.map +1 -1
  540. package/dist/testing/css-variables.js +3 -8
  541. package/dist/testing/css-variables.js.map +1 -1
  542. package/dist/theme/contrast.d.ts +2 -1
  543. package/dist/theme/contrast.js +3 -8
  544. package/dist/theme/contrast.js.map +1 -1
  545. package/dist/theme/palette-store.js +6 -6
  546. package/dist/theme/palette-store.js.map +1 -1
  547. package/dist/theme/text-size.js +3 -8
  548. package/dist/theme/text-size.js.map +1 -1
  549. package/dist/theme/theme-store.js +3 -6
  550. package/dist/theme/theme-store.js.map +1 -1
  551. package/dist/tour/tour-catalogue.d.ts +7 -4
  552. package/dist/tour/tour-catalogue.js +12 -10
  553. package/dist/tour/tour-catalogue.js.map +1 -1
  554. package/dist/tour/tour-dock.d.ts +0 -2
  555. package/dist/tour/tour-dock.js +0 -2
  556. package/dist/tour/tour-dock.js.map +1 -1
  557. package/dist/tour/tour-gates.d.ts +4 -0
  558. package/dist/tour/tour-gates.js +14 -0
  559. package/dist/tour/tour-gates.js.map +1 -1
  560. package/dist/tour/tour-overlay.d.ts +27 -0
  561. package/dist/tour/tour-overlay.js +741 -0
  562. package/dist/tour/tour-overlay.js.map +1 -0
  563. package/dist/tour/tour.d.ts +16 -4
  564. package/dist/tour/tour.js +62 -778
  565. package/dist/tour/tour.js.map +1 -1
  566. package/dist/tour/use-tour-progress.js +1 -1
  567. package/dist/tour/use-tour-progress.js.map +1 -1
  568. package/dist/tour/use-tour-url-sync.js +2 -2
  569. package/dist/tour/use-tour-url-sync.js.map +1 -1
  570. package/dist/wizard/stepper-nav.d.ts +5 -1
  571. package/dist/wizard/stepper-nav.js.map +1 -1
  572. package/dist/wizard/types.d.ts +6 -2
  573. package/dist/wizard/types.js.map +1 -1
  574. package/dist/wizard/use-wizard.d.ts +3 -1
  575. package/dist/wizard/use-wizard.js.map +1 -1
  576. package/dist/wizard/validation.d.ts +3 -1
  577. package/dist/wizard/validation.js.map +1 -1
  578. package/package.json +12 -8
  579. package/src/account/account-parts.ts +5 -25
  580. package/src/account/data-export-setting-labels.ts +1 -1
  581. package/src/account/delete-account-setting-labels.ts +1 -1
  582. package/src/account/email-change-setting-labels.ts +1 -1
  583. package/src/account/passkeys-setting.tsx +60 -38
  584. package/src/account/sessions-setting.tsx +18 -12
  585. package/src/admin/admin-action-confirm.tsx +5 -10
  586. package/src/admin/admin-parts.ts +11 -25
  587. package/src/admin/mail-test-card-labels.ts +1 -1
  588. package/src/admin/plan-change-labels.ts +5 -23
  589. package/src/admin/plan-change.tsx +7 -44
  590. package/src/admin/reviewer-scope-editor.tsx +3 -3
  591. package/src/auth/auth-errors-labels.ts +23 -0
  592. package/src/auth/auth-errors.ts +11 -38
  593. package/src/auth/complete-name-dialog.tsx +9 -8
  594. package/src/auth/forgot-password-form-labels.ts +1 -1
  595. package/src/auth/forgot-password-form.tsx +11 -6
  596. package/src/auth/register-form-labels.ts +1 -1
  597. package/src/auth/reset-password-form-labels.ts +1 -1
  598. package/src/auth/reset-password-form.tsx +8 -4
  599. package/src/auth/sign-in-form-labels.ts +1 -1
  600. package/src/auth/status-parts.tsx +0 -6
  601. package/src/auth/verify-email-labels.ts +1 -1
  602. package/src/auth/verify-email.tsx +11 -6
  603. package/src/billing/cancel-request.ts +28 -6
  604. package/src/billing/cancel-subscription.tsx +29 -22
  605. package/src/billing/dialog-close.ts +34 -0
  606. package/src/billing/plan-card.tsx +36 -11
  607. package/src/billing/plan-change-labels.ts +66 -0
  608. package/src/billing/plan-switch.tsx +31 -20
  609. package/src/chart.ts +21 -3
  610. package/src/components/account-chips.tsx +20 -23
  611. package/src/components/alert-banner.tsx +82 -5
  612. package/src/components/amount-input.tsx +32 -14
  613. package/src/components/autocomplete.tsx +64 -70
  614. package/src/components/bulk-action-bar.tsx +70 -2
  615. package/src/components/button-look.ts +5 -5
  616. package/src/components/button.tsx +2 -2
  617. package/src/components/calculator.tsx +98 -17
  618. package/src/components/chart-edge.ts +34 -1
  619. package/src/components/chart-figure.tsx +35 -0
  620. package/src/components/chart-zoom-core.tsx +6 -5
  621. package/src/components/chart.tsx +26 -5
  622. package/src/components/combobox-core.tsx +303 -69
  623. package/src/components/combobox.tsx +184 -155
  624. package/src/components/copy-button.tsx +34 -23
  625. package/src/components/country-select.tsx +16 -11
  626. package/src/components/data-table-column-settings.tsx +52 -10
  627. package/src/components/data-table-filters.ts +6 -4
  628. package/src/components/data-table-fit.ts +19 -5
  629. package/src/components/data-table-groups.tsx +1 -1
  630. package/src/components/data-table-head.tsx +32 -22
  631. package/src/components/data-table-mobile.tsx +110 -27
  632. package/src/components/data-table-pagination.tsx +21 -6
  633. package/src/components/data-table-resize.ts +1 -1
  634. package/src/components/data-table-row-actions.tsx +3 -3
  635. package/src/components/data-table-row.tsx +25 -14
  636. package/src/components/data-table-selection.ts +1 -1
  637. package/src/components/data-table-shared.tsx +33 -1
  638. package/src/components/data-table-sort.ts +57 -2
  639. package/src/components/data-table-virtual.ts +32 -8
  640. package/src/components/data-table.tsx +267 -41
  641. package/src/components/date-field.tsx +65 -8
  642. package/src/components/date-picker.tsx +125 -48
  643. package/src/components/date-range-picker.tsx +82 -31
  644. package/src/components/dialog-frame.tsx +2 -1
  645. package/src/components/entity-combobox.tsx +4 -1
  646. package/src/components/error-boundary.tsx +53 -39
  647. package/src/components/field-base-labels.ts +20 -0
  648. package/src/components/field-base.tsx +13 -7
  649. package/src/components/field-sync-labels.ts +1 -0
  650. package/src/components/field-sync.tsx +23 -1
  651. package/src/components/form-actions.tsx +20 -5
  652. package/src/components/hover-menu.tsx +18 -8
  653. package/src/components/icon-button.tsx +14 -9
  654. package/src/components/inline-confirm.tsx +116 -0
  655. package/src/components/inline-entity-combobox.tsx +198 -152
  656. package/src/components/input.tsx +1 -1
  657. package/src/components/jump-calendar.tsx +30 -146
  658. package/src/components/legal-page.tsx +10 -7
  659. package/src/components/legal.tsx +4 -2
  660. package/src/components/lightbox.tsx +21 -8
  661. package/src/components/list.tsx +14 -5
  662. package/src/components/measured-grid.tsx +8 -4
  663. package/src/components/mini-calendar.tsx +6 -5
  664. package/src/components/modal.tsx +45 -4
  665. package/src/components/money-draft.ts +16 -5
  666. package/src/components/money-field.tsx +2 -2
  667. package/src/components/month-grid.tsx +229 -0
  668. package/src/components/month-picker.tsx +192 -200
  669. package/src/components/multi-entity-combobox.tsx +1 -0
  670. package/src/components/multi-select.tsx +21 -9
  671. package/src/components/number-field.tsx +14 -7
  672. package/src/components/number-input.tsx +9 -3
  673. package/src/components/numpad-sheet.tsx +4 -3
  674. package/src/components/picker-sheet.tsx +12 -9
  675. package/src/components/pie-chart-labels.ts +8 -0
  676. package/src/components/pie-chart.tsx +22 -28
  677. package/src/components/popover.tsx +18 -1
  678. package/src/components/reauth-dialog.tsx +6 -10
  679. package/src/components/row-actions.tsx +2 -1
  680. package/src/components/section-nav.tsx +7 -0
  681. package/src/components/series-chart-axes.ts +11 -3
  682. package/src/components/series-chart-labels.ts +7 -4
  683. package/src/components/series-chart.tsx +178 -69
  684. package/src/components/share-card.tsx +6 -6
  685. package/src/components/sign-chip-labels.ts +1 -0
  686. package/src/components/sign-chip.tsx +10 -1
  687. package/src/components/tabs-labels.ts +13 -0
  688. package/src/components/tabs.tsx +35 -19
  689. package/src/components/toggle-legend.tsx +16 -11
  690. package/src/components/translation-review-editor.tsx +6 -5
  691. package/src/components/translation-review.tsx +4 -3
  692. package/src/components/treemap-labels.ts +39 -0
  693. package/src/components/treemap-layout.ts +210 -0
  694. package/src/components/treemap.tsx +722 -133
  695. package/src/components/use-table-state.ts +12 -9
  696. package/src/data-table.ts +9 -2
  697. package/src/eslint/role-utilities.ts +97 -19
  698. package/src/feedback/feedback-dialog.tsx +30 -19
  699. package/src/feedback/feedback-mutation.ts +41 -0
  700. package/src/feedback/feedback-page-link.ts +90 -0
  701. package/src/feedback/feedback-public-list.tsx +17 -5
  702. package/src/feedback/feedback-replies.tsx +13 -6
  703. package/src/feedback/feedback-row-detail-labels.ts +5 -0
  704. package/src/feedback/feedback-row-detail.tsx +103 -67
  705. package/src/feedback/feedback-status-undo.ts +41 -27
  706. package/src/feedback/feedback-submit-dialog.tsx +2 -2
  707. package/src/feedback/feedback-submit.tsx +21 -7
  708. package/src/feedback/feedback-swipe.tsx +1 -1
  709. package/src/feedback/feedback-table.tsx +86 -38
  710. package/src/feedback/feedback-thread-labels.ts +2 -2
  711. package/src/feedback/feedback-thread.tsx +27 -25
  712. package/src/feedback.ts +42 -0
  713. package/src/hooks/use-dismiss.ts +3 -2
  714. package/src/hooks/use-focus-trap.ts +8 -24
  715. package/src/hooks/use-hotkey.ts +24 -7
  716. package/src/hooks/use-long-press.ts +16 -2
  717. package/src/hooks/use-media-query.ts +20 -4
  718. package/src/hooks/use-mounted.ts +39 -0
  719. package/src/hooks/use-overlay-history.ts +70 -5
  720. package/src/i18n/defaults.ts +4 -5
  721. package/src/i18n/german.ts +8 -2
  722. package/src/i18n/kit-labels.tsx +9 -2
  723. package/src/i18n/locales/es.ts +8 -2
  724. package/src/i18n/locales/fr.ts +21 -13
  725. package/src/i18n/locales/hu.ts +10 -2
  726. package/src/i18n/locales/it.ts +8 -2
  727. package/src/i18n/locales/zh.ts +9 -2
  728. package/src/i18n/review.ts +5 -0
  729. package/src/index.ts +103 -13
  730. package/src/landing/routing.tsx +14 -10
  731. package/src/lib/broadcast.ts +52 -0
  732. package/src/lib/calc.ts +13 -2
  733. package/src/lib/clipboard-minus.ts +14 -4
  734. package/src/lib/date-format.ts +89 -13
  735. package/src/lib/day-format.ts +96 -0
  736. package/src/lib/decimal-marks.ts +12 -3
  737. package/src/lib/describe-failure.ts +18 -0
  738. package/src/lib/direction.ts +39 -0
  739. package/src/lib/focus-left.ts +156 -0
  740. package/src/lib/format.ts +34 -19
  741. package/src/lib/http-status.ts +38 -0
  742. package/src/lib/intl-cache.ts +25 -0
  743. package/src/lib/isin.ts +10 -0
  744. package/src/lib/iso-day.ts +13 -0
  745. package/src/lib/lazy-with-fallback.ts +82 -0
  746. package/src/lib/path-pattern.ts +55 -0
  747. package/src/lib/reduced-motion.ts +2 -1
  748. package/src/lib/round.ts +7 -2
  749. package/src/lib/safe-storage.ts +48 -6
  750. package/src/lib/session-refresh.ts +1 -1
  751. package/src/lib/share-format.ts +18 -0
  752. package/src/lib/text-case.ts +19 -0
  753. package/src/lib/text-match.ts +69 -2
  754. package/src/lib/thenable.ts +19 -0
  755. package/src/lib/translation-review.ts +13 -5
  756. package/src/notifications/device-zone-report.ts +1 -1
  757. package/src/notifications/notification-bell.tsx +7 -4
  758. package/src/notifications/notification-inbox.tsx +40 -58
  759. package/src/notifications/notification-parts.tsx +3 -4
  760. package/src/notifications/notification-types-setting.tsx +1 -1
  761. package/src/notifications/notifications-labels.ts +7 -0
  762. package/src/notifications/push-device-setting.tsx +1 -1
  763. package/src/notifications/push-devices-setting.tsx +30 -55
  764. package/src/notifications/quiet-hours-setting.tsx +93 -31
  765. package/src/notifications/unsubscribe-panel.tsx +4 -7
  766. package/src/notifications/use-push-device.ts +76 -10
  767. package/src/offline/query-persistence.ts +35 -3
  768. package/src/rhf/fields.tsx +11 -4
  769. package/src/search/command-palette.tsx +2 -4
  770. package/src/search/global-search.tsx +36 -15
  771. package/src/search/use-command-key.ts +13 -12
  772. package/src/search.ts +9 -0
  773. package/src/settings/use-settings-focus.ts +3 -0
  774. package/src/shell/account-menu-language.tsx +27 -5
  775. package/src/shell/account-menu-text-size.tsx +32 -10
  776. package/src/shell/dev-menu.tsx +7 -21
  777. package/src/shell/role-switcher.tsx +7 -0
  778. package/src/shell/top-bar-actions.tsx +1 -1
  779. package/src/shell/top-bar-parts-labels.ts +0 -3
  780. package/src/shell.ts +40 -9
  781. package/src/sync/engine.ts +339 -61
  782. package/src/sync.ts +8 -1
  783. package/src/testing/css-variables.ts +8 -9
  784. package/src/theme/contrast.ts +8 -9
  785. package/src/theme/palette-store.ts +9 -9
  786. package/src/theme/text-size.ts +6 -8
  787. package/src/theme/theme-store.ts +7 -9
  788. package/src/tour/tour-catalogue.tsx +26 -15
  789. package/src/tour/tour-dock.ts +0 -2
  790. package/src/tour/tour-gates.ts +23 -0
  791. package/src/tour/tour-overlay.tsx +1170 -0
  792. package/src/tour/tour.tsx +116 -1193
  793. package/src/tour/use-tour-progress.ts +1 -1
  794. package/src/tour/use-tour-url-sync.ts +7 -3
  795. package/src/wizard/stepper-nav.tsx +3 -1
  796. package/src/wizard/types.ts +11 -2
  797. package/src/wizard/use-wizard.ts +2 -1
  798. package/src/wizard/validation.ts +8 -2
  799. package/tokens.css +2 -1
  800. package/dist/components/ui-labels.js.map +0 -1
  801. package/dist/shell/dev-switchers.d.ts +0 -6
  802. package/dist/shell/dev-switchers.js +0 -12
  803. package/dist/shell/dev-switchers.js.map +0 -1
  804. package/src/components/ui-labels.ts +0 -24
  805. package/src/shell/dev-switchers.tsx +0 -18
package/dist/tour/tour.js CHANGED
@@ -1,32 +1,43 @@
1
1
  "use client";
2
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import {
4
4
  createContext,
5
+ Suspense,
5
6
  useCallback,
6
7
  useContext,
7
8
  useEffect,
8
- useId,
9
9
  useLayoutEffect,
10
10
  useMemo,
11
11
  useRef,
12
- useState,
13
- useSyncExternalStore
12
+ useState
14
13
  } from "react";
15
- import { createPortal } from "react-dom";
16
- import { cn } from "../lib/cn.js";
17
14
  import { useKitLabels } from "../i18n/kit-labels.js";
18
- import { Button } from "../components/button.js";
19
- import { useFocusTrap } from "../hooks/use-focus-trap.js";
20
- import { useDismissLayer } from "../hooks/use-dismiss.js";
21
- import { sameRect } from "../hooks/use-anchored-rect.js";
22
- import { dirOf, horizontalStep } from "../lib/direction.js";
23
- import { isComposing } from "../lib/ime.js";
24
- import { focusQuietly } from "../lib/quiet-focus.js";
25
15
  import { DEFAULT_TOUR_LABELS } from "./tour-labels.js";
26
16
  import { completeStored, rememberAccount, rememberMigrate } from "./use-tour-progress.js";
27
- import { createGateRegistry, devWarnings, TourInternalContext } from "./tour-gates.js";
17
+ import { createGateRegistry, devWarnings, isShown, stepContext, TourInternalContext } from "./tour-gates.js";
28
18
  import { liveEngine } from "./tour-engine.js";
29
- import { DOCK_MAX_WIDTH, dockEdge, dockStyle, readBand, scrollIntoFreeHalf } from "./tour-dock.js";
19
+ import { lazyWithFallback } from "../lib/lazy-with-fallback.js";
20
+ const LazyTourOverlay = lazyWithFallback(
21
+ () => import("./tour-overlay.js").then((module) => module.TourOverlay),
22
+ TourOverlayUnavailable
23
+ );
24
+ const TourUnavailableContext = createContext(() => {
25
+ });
26
+ function TourOverlayUnavailable() {
27
+ const unavailable = useContext(TourUnavailableContext);
28
+ useLayoutEffect(unavailable, [unavailable]);
29
+ return null;
30
+ }
31
+ function TourOverlayLoading({ onSkip }) {
32
+ useEffect(() => {
33
+ const onKey = (e) => {
34
+ if (e.key === "Escape") onSkip();
35
+ };
36
+ document.addEventListener("keydown", onKey);
37
+ return () => document.removeEventListener("keydown", onKey);
38
+ }, [onSkip]);
39
+ return null;
40
+ }
30
41
  import { useTourGate, useTourGateRelease } from "./tour-gates.js";
31
42
  const ENGINE_KEYS = [
32
43
  "active",
@@ -137,7 +148,8 @@ function TourProvider({
137
148
  const last = Math.max(0, s.length - 1);
138
149
  floorRef.current = opts?.at === void 0 ? 0 : resolveAt(s, opts.at);
139
150
  const via = opts?.at === void 0 ? "start" : "at";
140
- const wanted = Math.min(Math.max(floorRef.current, opts?.startIndex ?? floorRef.current), last);
151
+ const asked = opts?.startIndex === void 0 ? floorRef.current : Math.floor(opts.startIndex);
152
+ const wanted = Math.min(Math.max(floorRef.current, asked), last);
141
153
  let to = forward(s, wanted, via);
142
154
  if (to < 0) to = backward(s, wanted, via);
143
155
  if (to < 0) return;
@@ -199,7 +211,14 @@ function TourProvider({
199
211
  setActiveId(null);
200
212
  }, []);
201
213
  const skip = useCallback(() => {
202
- optsRef.current.onSkip?.();
214
+ optsRef.current.onSkip?.("skipped");
215
+ setSteps(null);
216
+ setActiveId(null);
217
+ }, []);
218
+ const unavailable = useCallback(() => {
219
+ if (!stepsRef.current) return;
220
+ stepsRef.current = null;
221
+ optsRef.current.onSkip?.("unavailable");
203
222
  setSteps(null);
204
223
  setActiveId(null);
205
224
  }, []);
@@ -207,7 +226,7 @@ function TourProvider({
207
226
  (i) => {
208
227
  const s = stepsRef.current;
209
228
  if (!s || s.length === 0) return;
210
- const wanted = Math.min(Math.max(floorRef.current, i), s.length - 1);
229
+ const wanted = Math.min(Math.max(floorRef.current, Math.floor(i)), s.length - 1);
211
230
  let to = forward(s, wanted, "goto");
212
231
  if (to < 0) to = backward(s, wanted, "goto");
213
232
  if (to >= 0) arrive(s, to, "goto");
@@ -263,33 +282,34 @@ function TourProvider({
263
282
  });
264
283
  return /* @__PURE__ */ jsx(TourInternalContext.Provider, { value: internals, children: /* @__PURE__ */ jsxs(TourContext.Provider, { value, children: [
265
284
  children,
266
- active && /* @__PURE__ */ jsx(
267
- TourOverlay,
268
- {
269
- steps,
270
- index,
271
- via: nav.via,
272
- floor: nav.floor,
273
- position: nav.position,
274
- count: nav.count,
275
- refusal: refusal?.step === steps[index] ? refusal : null,
276
- onGoTo: goToStep,
277
- labels: merged,
278
- gates,
279
- dockOnPhones,
280
- onNext: next,
281
- onPrev: prev,
282
- onSkip: skip
283
- }
284
- )
285
+ active ? (
286
+ // Its own boundary, so the first start's chunk fetch suspends nothing of the
287
+ // app's; it shows nothing meanwhile, as the overlay itself does until it has
288
+ // located the step, and hears Escape as it does. A failed fetch ends the run
289
+ // (`TourOverlayUnavailable`).
290
+ /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(TourOverlayLoading, { onSkip: skip }), children: /* @__PURE__ */ jsx(TourUnavailableContext.Provider, { value: unavailable, children: /* @__PURE__ */ jsx(
291
+ LazyTourOverlay,
292
+ {
293
+ steps,
294
+ index,
295
+ via: nav.via,
296
+ floor: nav.floor,
297
+ position: nav.position,
298
+ count: nav.count,
299
+ refusal: refusal?.step === steps[index] ? refusal : null,
300
+ onGoTo: goToStep,
301
+ labels: merged,
302
+ gates,
303
+ dockOnPhones,
304
+ onNext: next,
305
+ onPrev: prev,
306
+ onSkip: skip
307
+ }
308
+ ) }) })
309
+ ) : null
285
310
  ] }) });
286
311
  }
287
312
  const NO_NAV = { index: 0, floor: 0, via: "start", position: 0, count: 0 };
288
- const NOOP = () => {
289
- };
290
- function stepContext(gates, via) {
291
- return { gate: (key) => gates.get(key), via };
292
- }
293
313
  function resolveAt(steps, at) {
294
314
  if (typeof at === "number") return Math.min(Math.max(0, Math.floor(at)), Math.max(0, steps.length - 1));
295
315
  const anchor = `data-tour="${at}"`;
@@ -299,742 +319,6 @@ function resolveAt(steps, at) {
299
319
  console.warn(`[ui-kit] A tour was started at "${at}", but no step targets [${anchor}]: it starts at 0.`);
300
320
  return 0;
301
321
  }
302
- function firstEmptied(steps, floor, index, gates) {
303
- const ctx = stepContext(gates, "goto");
304
- for (let j = floor; j < index; j++) {
305
- const key = steps[j].gate;
306
- if (key && gates.get(key) === false && isShown(steps[j], ctx)) return j;
307
- }
308
- return -1;
309
- }
310
- function isShown(step, ctx) {
311
- if (!step.when) return true;
312
- try {
313
- return step.when(ctx) === true;
314
- } catch (error) {
315
- console.error(error);
316
- return false;
317
- }
318
- }
319
- function isVisible(el) {
320
- const r = el.getBoundingClientRect();
321
- if (r.width <= 0 || r.height <= 0) return false;
322
- const style = getComputedStyle(el);
323
- return style.visibility !== "hidden" && style.display !== "none";
324
- }
325
- function queryVisibleTarget(selector) {
326
- const els = document.querySelectorAll(selector);
327
- for (const el of els) {
328
- if (isVisible(el)) return el;
329
- }
330
- return null;
331
- }
332
- function rectOf(el) {
333
- const r = el.getBoundingClientRect();
334
- return { top: r.top, left: r.left, width: r.width, height: r.height };
335
- }
336
- const RING_BAND = 6;
337
- function spotRectOf(el, step) {
338
- const own = rectOf(el);
339
- if (!isFieldStep(step)) return own;
340
- const ids = /* @__PURE__ */ new Set();
341
- const holders = [el, ...Array.from(el.querySelectorAll("[aria-describedby]"))];
342
- for (const holder of holders) {
343
- for (const id of (holder.getAttribute("aria-describedby") ?? "").split(/\s+/)) if (id) ids.add(id);
344
- }
345
- if (ids.size === 0) return own;
346
- const lines = [];
347
- for (const id of ids) {
348
- const line = document.getElementById(id);
349
- if (!line || el.contains(line) || line.closest('[role="tooltip"]') || !isVisible(line)) continue;
350
- const r = line.getBoundingClientRect();
351
- if (r.width > 1 && r.height > 1) lines.push(r);
352
- }
353
- let top = own.top;
354
- let left = own.left;
355
- let right = own.left + own.width;
356
- let bottom = own.top + own.height;
357
- const reach = (step.padding ?? 8) + RING_BAND;
358
- for (let grew = true; grew; ) {
359
- grew = false;
360
- for (let i = lines.length - 1; i >= 0; i--) {
361
- const r = lines[i];
362
- const across = r.left < right && r.right > left;
363
- const gap = Math.max(r.top - bottom, top - r.bottom);
364
- if (!across || gap > reach) continue;
365
- top = Math.min(top, r.top);
366
- left = Math.min(left, r.left);
367
- right = Math.max(right, r.right);
368
- bottom = Math.max(bottom, r.bottom);
369
- lines.splice(i, 1);
370
- grew = true;
371
- }
372
- }
373
- return { top, left, width: right - left, height: bottom - top };
374
- }
375
- function layerHost(el) {
376
- return el.closest("[data-kit-layer]");
377
- }
378
- function coversViewport(host, el) {
379
- let surface = host;
380
- if (host.getAttribute("data-kit-layer") === "backdrop") {
381
- for (const child of Array.from(host.children)) {
382
- if (child.contains(el)) {
383
- surface = child;
384
- break;
385
- }
386
- }
387
- }
388
- const r = surface.getBoundingClientRect();
389
- const vv = window.visualViewport;
390
- const top = vv?.offsetTop ?? 0;
391
- const bottom = top + (vv?.height ?? window.innerHeight);
392
- const width = vv?.width ?? window.innerWidth;
393
- return r.width > 0 && r.left <= 1 && r.top <= top + 1 && r.right >= width - 1 && r.bottom >= bottom - 1;
394
- }
395
- function docks(step, dockOnPhones) {
396
- if (typeof window === "undefined" || window.innerWidth >= DOCK_MAX_WIDTH || !step.target) return false;
397
- return step.placement === "dock" || step.placement === void 0 && dockOnPhones && isFieldStep(step);
398
- }
399
- function isFieldStep(step) {
400
- return !!(step.interactive || step.awaitInput || step.gate || step.awaitGate);
401
- }
402
- function firstFocusable(el) {
403
- if (el instanceof HTMLElement && el.matches(FOCUSABLE_CONTROL)) return el;
404
- return el.querySelector(FOCUSABLE_CONTROL);
405
- }
406
- function tabStops(el) {
407
- const all = el.matches(FOCUSABLE_CONTROL) ? [el] : [];
408
- return all.concat(
409
- Array.from(el.querySelectorAll(FOCUSABLE_CONTROL)).filter(
410
- (x) => x.tabIndex >= 0 && !x.closest("[hidden],[inert]")
411
- )
412
- );
413
- }
414
- const FOCUSABLE_CONTROL = 'a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex="-1"])';
415
- function coarsePointer() {
416
- return typeof window !== "undefined" && typeof window.matchMedia === "function" ? window.matchMedia("(pointer: coarse)").matches : false;
417
- }
418
- function TourOverlay({
419
- steps,
420
- index,
421
- via,
422
- floor,
423
- position,
424
- count,
425
- refusal,
426
- onGoTo,
427
- labels,
428
- gates,
429
- dockOnPhones,
430
- onNext,
431
- onPrev,
432
- onSkip
433
- }) {
434
- const step = steps[index];
435
- const isFirst = position <= 1;
436
- const isLast = position >= count;
437
- const [located, setLocated] = useState(null);
438
- const current = located !== null && located.index === index && located.step === step ? located : null;
439
- const ready = current !== null;
440
- const rect = current?.rect ?? null;
441
- const dir = current?.dir ?? "ltr";
442
- const rootRef = useRef(null);
443
- const cardRef = useRef(null);
444
- const bodyId = useId();
445
- const hintId = useId();
446
- const gateVersion = useSyncExternalStore(gates.subscribe, gates.version, gates.version);
447
- const gateKey = step.gate;
448
- const enforced = !!gateKey && gates.has(gateKey);
449
- const locked = enforced && gates.get(gateKey) !== true;
450
- const [polite, setPolite] = useState("");
451
- const announce = useCallback((text) => {
452
- setPolite((prev) => prev === text ? `${text}\u200B` : text);
453
- }, []);
454
- useEffect(() => {
455
- let cancelled = false;
456
- let raf = 0;
457
- const settle = (el) => {
458
- let layer2 = null;
459
- let fullScreen = false;
460
- if (el && isFieldStep(step)) {
461
- const host = layerHost(el);
462
- layer2 = document.createElement("div");
463
- layer2.setAttribute("data-tour-layer", "");
464
- if (host) host.after(layer2);
465
- else document.body.appendChild(layer2);
466
- fullScreen = !!host && coversViewport(host, el);
467
- }
468
- setLocated({ index, step, rect: el ? spotRectOf(el, step) : null, dir: dirOf(el), layer: layer2, fullScreen });
469
- };
470
- void (async () => {
471
- await step.beforeStep?.(stepContext(gates, via));
472
- if (cancelled) return;
473
- if (!step.target) {
474
- settle(null);
475
- return;
476
- }
477
- let tries = 0;
478
- const find = () => {
479
- if (cancelled) return;
480
- const el = queryVisibleTarget(step.target);
481
- if (el) {
482
- if (docks(step, dockOnPhones)) scrollIntoFreeHalf(el, null, null);
483
- else el.scrollIntoView({ block: "center", behavior: "smooth" });
484
- settle(el);
485
- return;
486
- }
487
- if (tries++ < 45) raf = requestAnimationFrame(find);
488
- else settle(null);
489
- };
490
- find();
491
- })();
492
- return () => {
493
- cancelled = true;
494
- cancelAnimationFrame(raf);
495
- };
496
- }, [index, step]);
497
- useEffect(() => {
498
- if (!step.target) return;
499
- const update = () => {
500
- const el = queryVisibleTarget(step.target);
501
- if (el) {
502
- const next = spotRectOf(el, step);
503
- const host = layerHost(el);
504
- const full = !!host && coversViewport(host, el);
505
- setLocated((prev) => {
506
- if (!prev || prev.index !== index || prev.step !== step) return prev;
507
- const fullScreen = prev.layer ? full : prev.fullScreen;
508
- if (sameRect(prev.rect, next) && fullScreen === prev.fullScreen) return prev;
509
- return { ...prev, rect: next, fullScreen };
510
- });
511
- }
512
- };
513
- window.addEventListener("scroll", update, true);
514
- window.addEventListener("resize", update);
515
- const id = window.setInterval(update, 250);
516
- return () => {
517
- window.removeEventListener("scroll", update, true);
518
- window.removeEventListener("resize", update);
519
- clearInterval(id);
520
- };
521
- }, [index, step]);
522
- const layer = located?.layer ?? null;
523
- useEffect(() => {
524
- if (!layer) return;
525
- return () => layer.remove();
526
- }, [layer]);
527
- useDismissLayer(
528
- ready,
529
- (e) => {
530
- if (fieldStepNow && step.target && e.target instanceof Node) {
531
- const el = queryVisibleTarget(step.target);
532
- if (el?.contains(e.target)) return;
533
- }
534
- onSkip();
535
- },
536
- // Not an overlay to `useOverlayOpen`: a floating launcher a tour spotlights stays.
537
- { overlay: false }
538
- );
539
- const spotted = rect !== null;
540
- useEffect(() => {
541
- if (!ready || !spotted || !step.awaitClick || !step.target) return;
542
- const el = queryVisibleTarget(step.target);
543
- if (!el) return;
544
- const onClick = () => window.setTimeout(() => onNext(), 0);
545
- el.addEventListener("click", onClick, { once: true });
546
- return () => el.removeEventListener("click", onClick);
547
- }, [ready, spotted, index, step, onNext]);
548
- const interactive = spotted && !!step.target && !!(step.interactive || step.awaitInput || step.gate || step.awaitGate);
549
- const guided = interactive && !!(step.gate || step.awaitInput || step.awaitGate);
550
- const fieldStepNow = interactive;
551
- const awaitsRelease = spotted && !!step.target && !!step.awaitGate;
552
- const warnedGateRef = useRef(null);
553
- useEffect(() => {
554
- if (!ready || !gateKey || gates.has(gateKey) || !devWarnings() || warnedGateRef.current === step) return;
555
- warnedGateRef.current = step;
556
- console.warn(
557
- `[ui-kit] Tour step "${step.title}" waits for the gate "${gateKey}", which nothing publishes: its Next is open. Publish it with useTourGate beside the field, or the form has closed under the tour.`
558
- );
559
- }, [ready, gateKey, gates, step, gateVersion]);
560
- useEffect(() => {
561
- if (!ready || !step.optional || step.gate || !devWarnings()) return;
562
- console.warn(
563
- `[ui-kit] Tour step "${step.title}" is \`optional\` without a \`gate\`: it shows the Optional chip and a plain Next. "Leave empty" needs a gate to compare.`
564
- );
565
- }, [ready, step]);
566
- const wasLockedRef = useRef(null);
567
- useEffect(() => {
568
- if (!ready || !gateKey) return;
569
- const before = wasLockedRef.current;
570
- if (before && before.step === step && before.locked && !locked && enforced) announce(labels.gateReady);
571
- wasLockedRef.current = { step, locked };
572
- }, [ready, gateKey, step, locked, enforced, announce, labels.gateReady]);
573
- useEffect(() => {
574
- if (!ready || !guided || !step.target) return;
575
- const el = queryVisibleTarget(step.target);
576
- const control = el ? firstFocusable(el) : null;
577
- const previous = control ? control.getAttribute("aria-describedby") : null;
578
- if (control) control.setAttribute("aria-describedby", previous ? `${previous} ${bodyId}` : bodyId);
579
- if (coarsePointer() || !control) cardRef.current?.focus();
580
- else if (!el.contains(document.activeElement)) focusQuietly(control);
581
- if (!control) return;
582
- return () => {
583
- if (previous === null) control.removeAttribute("aria-describedby");
584
- else control.setAttribute("aria-describedby", previous);
585
- };
586
- }, [ready, guided, index, step, bodyId]);
587
- useEffect(() => {
588
- if (!ready || !guided || !step.target) return;
589
- const onTab = (e) => {
590
- if (e.key !== "Tab") return;
591
- const el = queryVisibleTarget(step.target);
592
- const card = cardRef.current;
593
- if (!el || !card) return;
594
- const active = document.activeElement;
595
- const fieldStops = tabStops(el);
596
- const cardStops = tabStops(card);
597
- if (fieldStops.length === 0 || cardStops.length === 0) return;
598
- let to = null;
599
- if (active instanceof Node && el.contains(active)) {
600
- if (!e.shiftKey && active === fieldStops[fieldStops.length - 1]) to = cardStops[0];
601
- else if (e.shiftKey && active === fieldStops[0]) to = cardStops[cardStops.length - 1];
602
- } else if (active instanceof Node && card.contains(active)) {
603
- if (!e.shiftKey && active === cardStops[cardStops.length - 1]) to = fieldStops[0];
604
- else if (e.shiftKey && (active === cardStops[0] || active === card)) to = fieldStops[fieldStops.length - 1];
605
- }
606
- if (!to) return;
607
- e.preventDefault();
608
- e.stopPropagation();
609
- to.focus();
610
- };
611
- document.addEventListener("keydown", onTab, true);
612
- return () => document.removeEventListener("keydown", onTab, true);
613
- }, [ready, guided, index, step]);
614
- useEffect(() => {
615
- if (!ready || !spotted || !gateKey || !step.target) return;
616
- const el = queryVisibleTarget(step.target);
617
- if (!el) return;
618
- const satisfied = () => !gates.has(gateKey) || gates.get(gateKey) === true;
619
- let timer = 0;
620
- let armed = el.contains(document.activeElement);
621
- const check = () => {
622
- window.clearTimeout(timer);
623
- timer = window.setTimeout(() => {
624
- if (satisfied()) onNext();
625
- }, 0);
626
- };
627
- const onFocusIn = () => {
628
- armed = true;
629
- };
630
- const onFocusOut = (e) => {
631
- const to = e.relatedTarget;
632
- if (to instanceof Node && el.contains(to)) return;
633
- const wasArmed = armed;
634
- armed = false;
635
- if (!wasArmed) return;
636
- if (to === null || to instanceof Node && rootRef.current?.contains(to)) check();
637
- };
638
- const onKeyDown = (e) => {
639
- if (e.key !== "Enter" || !(e.target instanceof Node) || !el.contains(e.target)) return;
640
- if (e.defaultPrevented || isComposing(e)) return;
641
- if (e.target instanceof HTMLTextAreaElement && !(e.ctrlKey || e.metaKey)) return;
642
- check();
643
- };
644
- el.addEventListener("focusin", onFocusIn);
645
- el.addEventListener("focusout", onFocusOut);
646
- document.addEventListener("keydown", onKeyDown);
647
- return () => {
648
- window.clearTimeout(timer);
649
- el.removeEventListener("focusin", onFocusIn);
650
- el.removeEventListener("focusout", onFocusOut);
651
- document.removeEventListener("keydown", onKeyDown);
652
- };
653
- }, [ready, spotted, gateKey, gates, index, step, onNext]);
654
- useEffect(() => {
655
- if (!ready || !spotted || !step.awaitInput || !step.target) return;
656
- const el = queryVisibleTarget(step.target);
657
- if (!el) return;
658
- const read = () => fieldValues(el);
659
- const before = read();
660
- let timer = 0;
661
- let done = false;
662
- const check = () => {
663
- window.clearTimeout(timer);
664
- timer = window.setTimeout(() => {
665
- if (done || read() === before) return;
666
- done = true;
667
- onNext();
668
- }, 0);
669
- };
670
- const onFocusOut = (e) => {
671
- if (e.relatedTarget instanceof Node && el.contains(e.relatedTarget)) return;
672
- check();
673
- };
674
- const onKeyDown = (e) => {
675
- if (e.key === "Enter") check();
676
- };
677
- el.addEventListener("focusout", onFocusOut);
678
- el.addEventListener("keydown", onKeyDown);
679
- el.addEventListener("change", check);
680
- return () => {
681
- window.clearTimeout(timer);
682
- el.removeEventListener("focusout", onFocusOut);
683
- el.removeEventListener("keydown", onKeyDown);
684
- el.removeEventListener("change", check);
685
- };
686
- }, [ready, spotted, index, step, onNext]);
687
- const gateHint = step.gateHint ?? labels.gateHint;
688
- const lockedNext = useCallback(() => {
689
- const el = step.target ? queryVisibleTarget(step.target) : null;
690
- const control = el ? firstFocusable(el) : null;
691
- if (control) focusQuietly(control);
692
- announce(gateHint);
693
- }, [step.target, announce, gateHint]);
694
- const tryNext = awaitsRelease ? NOOP : locked ? lockedNext : onNext;
695
- const backTo = refusal ? firstEmptied(steps, floor, index, gates) : -1;
696
- useEffect(() => {
697
- const onKey = (e) => {
698
- if (interactive && e.target instanceof Node && e.target !== document.body && !rootRef.current?.contains(e.target)) {
699
- return;
700
- }
701
- if (e.key === "Escape") {
702
- if (!ready) onSkip();
703
- return;
704
- }
705
- if (e.key === "Enter") {
706
- if (step.awaitClick || step.awaitInput || ownsKey(e.target, "Enter")) return;
707
- e.preventDefault();
708
- tryNext();
709
- return;
710
- }
711
- if (ownsKey(e.target, e.key)) return;
712
- const delta = horizontalStep(e.key, rootRef.current);
713
- if (delta === 1) {
714
- e.preventDefault();
715
- tryNext();
716
- } else if (delta === -1) {
717
- if (!isFirst) onPrev();
718
- }
719
- };
720
- document.addEventListener("keydown", onKey);
721
- return () => document.removeEventListener("keydown", onKey);
722
- }, [isFirst, step, interactive, tryNext, onPrev, onSkip, ready]);
723
- if (!ready) return null;
724
- const bare = interactive && !!current?.fullScreen;
725
- const pad = step.padding ?? 8;
726
- const spot = rect ? { top: rect.top - pad, left: rect.left - pad, width: rect.width + pad * 2, height: rect.height + pad * 2 } : null;
727
- return createPortal(
728
- /* @__PURE__ */ jsxs(
729
- "div",
730
- {
731
- ref: rootRef,
732
- className: cn("pointer-events-none fixed inset-0", interactive ? "z-50" : "z-[60]"),
733
- role: "dialog",
734
- "aria-modal": interactive ? void 0 : "true",
735
- "data-tour-overlay": "",
736
- "data-tour-interactive": interactive ? "" : void 0,
737
- "data-tour-bare": bare ? "" : void 0,
738
- "aria-label": step.title,
739
- dir,
740
- children: [
741
- spot && !bare && /* @__PURE__ */ jsx(SpotlightShields, { spot }),
742
- spot ? /* @__PURE__ */ jsx(
743
- "div",
744
- {
745
- className: "pointer-events-none fixed rounded-lg transition-all duration-200 ease-out",
746
- style: {
747
- top: spot.top,
748
- left: spot.left,
749
- width: spot.width,
750
- height: spot.height,
751
- // A two-tone frame, not a single translucent ring.
752
- //
753
- // The old treatment was `ring-2 ring-white/80` over a 55% scrim, and it
754
- // "was barely visible" on the app's blue-tinted surfaces. Two reasons,
755
- // and a single ring can't fix either: at 55% the surround stays bright
756
- // enough that the un-dimmed hole barely reads AS a hole, and a 80%-white
757
- // ring sitting on the edge of a light card is white-on-near-white.
758
- //
759
- // So: an opaque white band immediately around the target, a dark keyline
760
- // outside it, then the scrim. Whatever the target's own colour is, one of
761
- // the two bands is always in contrast with it and the other is always in
762
- // contrast with the dimmed surround — there is no background that can
763
- // swallow both. The blurred layer between them softens the step so the
764
- // frame reads as lighting rather than as a pasted-on rectangle.
765
- boxShadow: [
766
- "0 0 0 3px rgba(255,255,255,0.98)",
767
- "0 0 0 5px rgba(15,23,42,0.92)",
768
- "0 0 18px 6px rgba(15,23,42,0.45)",
769
- ...bare ? [] : ["0 0 0 9999px rgba(15,23,42,0.70)"]
770
- ].join(", ")
771
- }
772
- }
773
- ) : /* @__PURE__ */ jsx("div", { className: "pointer-events-auto fixed inset-0 bg-black/70" }),
774
- /* @__PURE__ */ jsx(
775
- TourCard,
776
- {
777
- cardRef,
778
- step,
779
- index,
780
- position,
781
- total: count,
782
- labels,
783
- isFirst,
784
- isLast,
785
- rect: spot,
786
- dir,
787
- trap: !guided,
788
- bodyId,
789
- hintId,
790
- locked,
791
- gateHint,
792
- onBack: onPrev,
793
- onNext: tryNext,
794
- onLeaveEmpty: onNext,
795
- onSkip,
796
- awaitsRelease,
797
- docked: spot !== null && docks(step, dockOnPhones),
798
- refusal,
799
- backTo: backTo >= 0 ? { title: steps[backTo].title, go: () => onGoTo(backTo) } : null
800
- }
801
- ),
802
- /* @__PURE__ */ jsx("div", { className: "sr-only", "aria-live": "polite", "aria-atomic": "true", children: polite })
803
- ]
804
- }
805
- ),
806
- interactive && current?.layer || document.body
807
- );
808
- }
809
- function fieldValues(el) {
810
- const fields = el.matches("input,textarea,select") ? [el] : Array.from(el.querySelectorAll("input,textarea,select"));
811
- return fields.map(
812
- (f) => f instanceof HTMLInputElement && (f.type === "checkbox" || f.type === "radio") ? String(f.checked) : f.value
813
- ).join("\0");
814
- }
815
- function ownsKey(target, key) {
816
- if (!(target instanceof HTMLElement)) return false;
817
- if (target.isContentEditable) return true;
818
- const tag = target.tagName;
819
- if (tag === "TEXTAREA" || tag === "SELECT") return true;
820
- if (tag === "INPUT") {
821
- const type = target.type;
822
- return key !== "Enter" || type !== "checkbox";
823
- }
824
- if (key !== "Enter") return false;
825
- return tag === "BUTTON" || tag === "A" && target.hasAttribute("href") || target.getAttribute("role") === "button" || target.getAttribute("role") === "link";
826
- }
827
- function SpotlightShields({ spot }) {
828
- const shield = "pointer-events-auto fixed";
829
- const bottom = spot.top + spot.height;
830
- return /* @__PURE__ */ jsxs(Fragment, { children: [
831
- /* @__PURE__ */ jsx(
832
- "div",
833
- {
834
- "data-tour-shield": "",
835
- className: shield,
836
- style: { top: 0, left: 0, right: 0, height: Math.max(0, spot.top) }
837
- }
838
- ),
839
- /* @__PURE__ */ jsx("div", { "data-tour-shield": "", className: shield, style: { top: bottom, left: 0, right: 0, bottom: 0 } }),
840
- /* @__PURE__ */ jsx(
841
- "div",
842
- {
843
- "data-tour-shield": "",
844
- className: shield,
845
- style: { top: spot.top, left: 0, width: Math.max(0, spot.left), height: spot.height }
846
- }
847
- ),
848
- /* @__PURE__ */ jsx(
849
- "div",
850
- {
851
- "data-tour-shield": "",
852
- className: shield,
853
- style: { top: spot.top, left: spot.left + spot.width, right: 0, height: spot.height }
854
- }
855
- )
856
- ] });
857
- }
858
- function placeCard(rect, cw, ch, vw, vh, m, placement, dir = "ltr") {
859
- if (placement === "start") placement = dir === "rtl" ? "right" : "left";
860
- else if (placement === "end") placement = dir === "rtl" ? "left" : "right";
861
- if (!rect || placement === "center") {
862
- return { top: Math.max(m, (vh - ch) / 2), left: Math.max(m, (vw - cw) / 2) };
863
- }
864
- const clampX = (x) => Math.min(Math.max(m, x), Math.max(m, vw - cw - m));
865
- const clampY = (y) => Math.min(Math.max(m, y), Math.max(m, vh - ch - m));
866
- const centerX = clampX(rect.left + rect.width / 2 - cw / 2);
867
- const centerY = clampY(rect.top + rect.height / 2 - ch / 2);
868
- const belowTop = rect.top + rect.height + m;
869
- const aboveTop = rect.top - ch - m;
870
- const rightLeft = rect.left + rect.width + m;
871
- const leftLeft = rect.left - cw - m;
872
- const fitsBelow = belowTop + ch <= vh;
873
- const fitsAbove = aboveTop >= 0;
874
- const fitsRight = rightLeft + cw <= vw;
875
- const fitsLeft = leftLeft >= 0;
876
- switch (placement) {
877
- case "top":
878
- return { top: fitsAbove ? aboveTop : fitsBelow ? belowTop : clampY(aboveTop), left: centerX };
879
- case "bottom":
880
- return { top: fitsBelow ? belowTop : fitsAbove ? aboveTop : clampY(belowTop), left: centerX };
881
- case "right":
882
- return { top: centerY, left: fitsRight ? rightLeft : fitsLeft ? leftLeft : clampX(rightLeft) };
883
- case "left":
884
- return { top: centerY, left: fitsLeft ? leftLeft : fitsRight ? rightLeft : clampX(leftLeft) };
885
- default:
886
- if (fitsBelow) return { top: belowTop, left: centerX };
887
- if (fitsAbove) return { top: aboveTop, left: centerX };
888
- return { top: Math.max(m, (vh - ch) / 2), left: centerX };
889
- }
890
- }
891
- function TourCard({
892
- cardRef: ref,
893
- step,
894
- index,
895
- position,
896
- total,
897
- labels,
898
- isFirst,
899
- isLast,
900
- rect,
901
- dir,
902
- trap,
903
- bodyId,
904
- hintId,
905
- locked,
906
- gateHint,
907
- onBack,
908
- onNext,
909
- onLeaveEmpty,
910
- onSkip,
911
- awaitsRelease,
912
- docked,
913
- refusal,
914
- backTo
915
- }) {
916
- const [style, setStyle] = useState({ opacity: 0 });
917
- useFocusTrap(ref, { active: trap });
918
- const edgeRef = useRef(null);
919
- const [bandTick, setBandTick] = useState(0);
920
- const [edge, setEdge] = useState(null);
921
- useEffect(() => {
922
- if (!docked) return;
923
- let last = "";
924
- const look = () => {
925
- const target = step.target ? queryVisibleTarget(step.target) : null;
926
- const band = readBand(target, ref.current);
927
- const key = `${band.top}:${band.bottom}`;
928
- if (key === last) return;
929
- last = key;
930
- if (target) {
931
- const r = target.getBoundingClientRect();
932
- if (r.top < band.top || r.bottom > band.bottom) {
933
- edgeRef.current = scrollIntoFreeHalf(target, ref.current, edgeRef.current);
934
- }
935
- }
936
- setBandTick((t) => t + 1);
937
- };
938
- const vv = window.visualViewport;
939
- vv?.addEventListener("resize", look);
940
- vv?.addEventListener("scroll", look);
941
- window.addEventListener("resize", look);
942
- const id = window.setInterval(look, 250);
943
- return () => {
944
- vv?.removeEventListener("resize", look);
945
- vv?.removeEventListener("scroll", look);
946
- window.removeEventListener("resize", look);
947
- clearInterval(id);
948
- };
949
- }, [docked, step.target, ref]);
950
- useLayoutEffect(() => {
951
- const card = ref.current;
952
- if (!card) return;
953
- if (docked) {
954
- const target = step.target ? queryVisibleTarget(step.target) : null;
955
- const band = readBand(target, card);
956
- const next = rect ? dockEdge(rect, band, edgeRef.current, card.offsetHeight) : "bottom";
957
- edgeRef.current = next;
958
- setEdge(next);
959
- setStyle(dockStyle(next, rect, band));
960
- return;
961
- }
962
- setEdge(null);
963
- setStyle(
964
- placeCard(
965
- rect,
966
- card.offsetWidth,
967
- card.offsetHeight,
968
- window.innerWidth,
969
- window.innerHeight,
970
- 12,
971
- step.placement,
972
- dir
973
- )
974
- );
975
- }, [ref, rect, index, step.placement, step.target, dir, docked, bandTick]);
976
- const awaitsTarget = (step.awaitClick || step.awaitInput) && step.target && rect || awaitsRelease;
977
- return /* @__PURE__ */ jsxs(
978
- "div",
979
- {
980
- ref,
981
- tabIndex: -1,
982
- style,
983
- "data-tour-card": "",
984
- "data-tour-docked": edge ?? void 0,
985
- className: cn(
986
- "pointer-events-auto fixed z-[61] w-80 max-w-[calc(100vw-1.5rem)] rounded-lg border border-subtle bg-surface p-4 shadow-xl outline-none transition-all duration-200 ease-out",
987
- // Docked, the height is capped: the body scrolls, the title and buttons stay.
988
- docked && "flex flex-col"
989
- ),
990
- children: [
991
- /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1 text-sm font-semibold text-primary", children: [
992
- /* @__PURE__ */ jsx("span", { children: step.title }),
993
- step.optional && /* @__PURE__ */ jsx("span", { className: "rounded-full border border-subtle px-1.5 py-px text-xs font-normal text-muted", children: labels.optional })
994
- ] }),
995
- /* @__PURE__ */ jsx(
996
- "div",
997
- {
998
- id: bodyId,
999
- className: cn("mt-1 text-sm leading-relaxed text-secondary", docked && "min-h-0 shrink overflow-y-auto"),
1000
- children: step.body
1001
- }
1002
- ),
1003
- step.action && /* @__PURE__ */ jsx("div", { className: "mt-3", children: step.action }),
1004
- /* @__PURE__ */ jsxs("div", { className: "mt-4 space-y-2", children: [
1005
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
1006
- /* @__PURE__ */ jsx("button", { type: "button", onClick: onSkip, className: "text-xs text-placeholder hover:text-secondary", children: labels.skip }),
1007
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
1008
- /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap text-xs tabular-nums text-placeholder", children: labels.step(position, total) }),
1009
- !isFirst && /* @__PURE__ */ jsx(Button, { variant: "secondary", onClick: onBack, className: "px-2.5 py-1 text-xs", children: labels.back }),
1010
- step.optional && locked && !awaitsTarget && /* @__PURE__ */ jsx(Button, { variant: "secondary", onClick: onLeaveEmpty, className: "px-2.5 py-1 text-xs", children: labels.leaveEmpty }),
1011
- !awaitsTarget && /* @__PURE__ */ jsx(
1012
- Button,
1013
- {
1014
- variant: "accent",
1015
- onClick: onNext,
1016
- "aria-disabled": locked || void 0,
1017
- "aria-describedby": locked ? hintId : void 0,
1018
- className: cn("px-2.5 py-1 text-xs", locked && "opacity-60"),
1019
- children: isLast ? labels.done : labels.next
1020
- }
1021
- )
1022
- ] })
1023
- ] }),
1024
- awaitsTarget && /* @__PURE__ */ jsx("div", { className: "text-center text-xs italic text-placeholder", children: awaitsRelease ? step.awaitGateHint ?? labels.awaitGateHint : step.awaitInput && !step.awaitClick ? labels.awaitInputHint : labels.awaitClickHint }),
1025
- awaitsRelease && /* @__PURE__ */ jsxs("div", { "aria-live": "assertive", "aria-atomic": "true", className: "space-y-1", children: [
1026
- refusal && /* @__PURE__ */ jsxs("p", { "data-tour-refused": "", className: "text-xs text-danger", children: [
1027
- refusal.reason ?? labels.awaitGateRefused,
1028
- refusal.seq % 2 === 0 ? "\u200B" : ""
1029
- ] }),
1030
- refusal && backTo && /* @__PURE__ */ jsx(Button, { variant: "link", onClick: backTo.go, className: "text-xs", children: labels.backToStep(backTo.title) })
1031
- ] }),
1032
- locked && !awaitsTarget && /* @__PURE__ */ jsx("div", { id: hintId, className: "text-center text-xs italic text-placeholder", children: gateHint })
1033
- ] })
1034
- ]
1035
- }
1036
- );
1037
- }
1038
322
  export {
1039
323
  DEFAULT_TOUR_LABELS,
1040
324
  TourProvider,