@eifi1/ui-kit 0.10.0 → 0.12.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 (382) hide show
  1. package/README.md +66 -37
  2. package/dist/chart.d.ts +3 -1
  3. package/dist/chart.js +2 -0
  4. package/dist/chart.js.map +1 -1
  5. package/dist/components/account-settings-labels.d.ts +105 -0
  6. package/dist/components/account-settings-labels.js +81 -0
  7. package/dist/components/account-settings-labels.js.map +1 -0
  8. package/dist/components/account-settings.d.ts +36 -52
  9. package/dist/components/account-settings.js +44 -8
  10. package/dist/components/account-settings.js.map +1 -1
  11. package/dist/components/alert-banner.d.ts +26 -1
  12. package/dist/components/alert-banner.js +10 -7
  13. package/dist/components/alert-banner.js.map +1 -1
  14. package/dist/components/amount-input.d.ts +26 -4
  15. package/dist/components/amount-input.js +5 -2
  16. package/dist/components/amount-input.js.map +1 -1
  17. package/dist/components/authed-image.d.ts +68 -0
  18. package/dist/components/authed-image.js +117 -0
  19. package/dist/components/authed-image.js.map +1 -0
  20. package/dist/components/breadcrumbs.d.ts +2 -1
  21. package/dist/components/breadcrumbs.js +5 -2
  22. package/dist/components/breadcrumbs.js.map +1 -1
  23. package/dist/components/bulk-action-bar.d.ts +51 -5
  24. package/dist/components/bulk-action-bar.js +88 -41
  25. package/dist/components/bulk-action-bar.js.map +1 -1
  26. package/dist/components/button-group.d.ts +107 -3
  27. package/dist/components/button-group.js +60 -5
  28. package/dist/components/button-group.js.map +1 -1
  29. package/dist/components/calculator.d.ts +17 -4
  30. package/dist/components/calendar-heatmap.d.ts +162 -0
  31. package/dist/components/calendar-heatmap.js +336 -0
  32. package/dist/components/calendar-heatmap.js.map +1 -0
  33. package/dist/components/chip.d.ts +2 -1
  34. package/dist/components/chip.js +6 -3
  35. package/dist/components/chip.js.map +1 -1
  36. package/dist/components/choice-card.d.ts +66 -2
  37. package/dist/components/choice-card.js +108 -1
  38. package/dist/components/choice-card.js.map +1 -1
  39. package/dist/components/combobox-core.js +2 -0
  40. package/dist/components/combobox-core.js.map +1 -1
  41. package/dist/components/combobox.d.ts +2 -2
  42. package/dist/components/combobox.js +31 -9
  43. package/dist/components/combobox.js.map +1 -1
  44. package/dist/components/copy-button.d.ts +52 -70
  45. package/dist/components/copy-button.js +1 -1
  46. package/dist/components/copy-button.js.map +1 -1
  47. package/dist/components/data-table-cells.d.ts +63 -0
  48. package/dist/components/data-table-cells.js +64 -0
  49. package/dist/components/data-table-cells.js.map +1 -0
  50. package/dist/components/data-table-filter-popover.d.ts +1 -1
  51. package/dist/components/data-table-filters.d.ts +1 -1
  52. package/dist/components/data-table-filters.js +31 -1
  53. package/dist/components/data-table-filters.js.map +1 -1
  54. package/dist/components/data-table-labels.d.ts +13 -0
  55. package/dist/components/data-table-labels.js +8 -1
  56. package/dist/components/data-table-labels.js.map +1 -1
  57. package/dist/components/data-table.d.ts +1 -1
  58. package/dist/components/data-table.js +104 -12
  59. package/dist/components/data-table.js.map +1 -1
  60. package/dist/components/date-picker.d.ts +3 -1
  61. package/dist/components/date-picker.js +15 -2
  62. package/dist/components/date-picker.js.map +1 -1
  63. package/dist/components/description-list.d.ts +23 -3
  64. package/dist/components/description-list.js +23 -3
  65. package/dist/components/description-list.js.map +1 -1
  66. package/dist/components/dialog-frame.d.ts +1 -0
  67. package/dist/components/entity-combobox.d.ts +1 -1
  68. package/dist/components/entity-combobox.js +18 -3
  69. package/dist/components/entity-combobox.js.map +1 -1
  70. package/dist/components/error-boundary.d.ts +92 -0
  71. package/dist/components/error-boundary.js +111 -0
  72. package/dist/components/error-boundary.js.map +1 -0
  73. package/dist/components/field.d.ts +69 -0
  74. package/dist/components/field.js +75 -0
  75. package/dist/components/field.js.map +1 -0
  76. package/dist/components/file-button.d.ts +51 -208
  77. package/dist/components/file-dropzone.d.ts +50 -2
  78. package/dist/components/floating-panel.d.ts +156 -4
  79. package/dist/components/floating-panel.js +193 -29
  80. package/dist/components/floating-panel.js.map +1 -1
  81. package/dist/components/form-actions.d.ts +53 -0
  82. package/dist/components/form-actions.js +98 -0
  83. package/dist/components/form-actions.js.map +1 -0
  84. package/dist/components/image-grid.d.ts +67 -0
  85. package/dist/components/image-grid.js +112 -0
  86. package/dist/components/image-grid.js.map +1 -0
  87. package/dist/components/lightbox.d.ts +104 -0
  88. package/dist/components/lightbox.js +229 -0
  89. package/dist/components/lightbox.js.map +1 -0
  90. package/dist/components/line-items.d.ts +114 -0
  91. package/dist/components/line-items.js +238 -0
  92. package/dist/components/line-items.js.map +1 -0
  93. package/dist/components/list.d.ts +37 -3
  94. package/dist/components/list.js +39 -14
  95. package/dist/components/list.js.map +1 -1
  96. package/dist/components/loading-state.d.ts +24 -0
  97. package/dist/components/loading-state.js +32 -0
  98. package/dist/components/loading-state.js.map +1 -0
  99. package/dist/components/menu-item.d.ts +13 -2
  100. package/dist/components/menu-item.js +11 -2
  101. package/dist/components/menu-item.js.map +1 -1
  102. package/dist/components/mini-calendar.d.ts +82 -5
  103. package/dist/components/mini-calendar.js +212 -64
  104. package/dist/components/mini-calendar.js.map +1 -1
  105. package/dist/components/modal.d.ts +20 -1
  106. package/dist/components/modal.js +26 -2
  107. package/dist/components/modal.js.map +1 -1
  108. package/dist/components/month-picker.d.ts +21 -1
  109. package/dist/components/month-picker.js +139 -26
  110. package/dist/components/month-picker.js.map +1 -1
  111. package/dist/components/multi-entity-combobox.d.ts +1 -1
  112. package/dist/components/multi-entity-combobox.js +19 -3
  113. package/dist/components/multi-entity-combobox.js.map +1 -1
  114. package/dist/components/nav-pills.d.ts +67 -0
  115. package/dist/components/nav-pills.js +69 -0
  116. package/dist/components/nav-pills.js.map +1 -0
  117. package/dist/components/number-field.d.ts +26 -5
  118. package/dist/components/number-field.js +5 -7
  119. package/dist/components/number-field.js.map +1 -1
  120. package/dist/components/number-input.d.ts +27 -5
  121. package/dist/components/number-input.js +7 -1
  122. package/dist/components/number-input.js.map +1 -1
  123. package/dist/components/numpad-sheet.d.ts +17 -4
  124. package/dist/components/passkeys-setting.d.ts +67 -0
  125. package/dist/components/passkeys-setting.js +214 -0
  126. package/dist/components/passkeys-setting.js.map +1 -0
  127. package/dist/components/picker-sheet.js +2 -1
  128. package/dist/components/picker-sheet.js.map +1 -1
  129. package/dist/components/pie-chart-labels.d.ts +20 -0
  130. package/dist/components/pie-chart-labels.js +12 -0
  131. package/dist/components/pie-chart-labels.js.map +1 -0
  132. package/dist/components/pie-chart.d.ts +101 -0
  133. package/dist/components/pie-chart.js +283 -0
  134. package/dist/components/pie-chart.js.map +1 -0
  135. package/dist/components/progress-bar.d.ts +73 -3
  136. package/dist/components/progress-bar.js +110 -8
  137. package/dist/components/progress-bar.js.map +1 -1
  138. package/dist/components/qr-code.d.ts +34 -0
  139. package/dist/components/qr-code.js +57 -0
  140. package/dist/components/qr-code.js.map +1 -0
  141. package/dist/components/search-field.d.ts +15 -3
  142. package/dist/components/search-field.js +5 -1
  143. package/dist/components/search-field.js.map +1 -1
  144. package/dist/components/series-chart.d.ts +16 -0
  145. package/dist/components/series-chart.js +4 -1
  146. package/dist/components/series-chart.js.map +1 -1
  147. package/dist/components/settings-fields.d.ts +50 -1
  148. package/dist/components/signed-amount.d.ts +121 -0
  149. package/dist/components/signed-amount.js +152 -0
  150. package/dist/components/signed-amount.js.map +1 -0
  151. package/dist/components/skeleton.d.ts +10 -3
  152. package/dist/components/skeleton.js +12 -2
  153. package/dist/components/skeleton.js.map +1 -1
  154. package/dist/components/stat-tile.d.ts +2 -1
  155. package/dist/components/stat-tile.js +5 -2
  156. package/dist/components/stat-tile.js.map +1 -1
  157. package/dist/components/status-dot.d.ts +6 -2
  158. package/dist/components/status-dot.js +6 -1
  159. package/dist/components/status-dot.js.map +1 -1
  160. package/dist/components/table.d.ts +77 -11
  161. package/dist/components/table.js +85 -17
  162. package/dist/components/table.js.map +1 -1
  163. package/dist/components/text-link.d.ts +176 -0
  164. package/dist/components/text-link.js +109 -0
  165. package/dist/components/text-link.js.map +1 -0
  166. package/dist/components/text.d.ts +8 -1
  167. package/dist/components/text.js +1 -0
  168. package/dist/components/text.js.map +1 -1
  169. package/dist/components/time-input.d.ts +50 -1
  170. package/dist/components/toggle-group.d.ts +28 -0
  171. package/dist/components/toggle-group.js +58 -9
  172. package/dist/components/toggle-group.js.map +1 -1
  173. package/dist/components/toggle-legend.d.ts +36 -3
  174. package/dist/components/toggle-legend.js +49 -0
  175. package/dist/components/toggle-legend.js.map +1 -1
  176. package/dist/components/tooltip.d.ts +11 -3
  177. package/dist/components/tooltip.js +2 -0
  178. package/dist/components/tooltip.js.map +1 -1
  179. package/dist/components/ui.d.ts +52 -729
  180. package/dist/components/ui.js +296 -27
  181. package/dist/components/ui.js.map +1 -1
  182. package/dist/components/use-table-state.d.ts +3 -52
  183. package/dist/components/use-table-state.js +128 -30
  184. package/dist/components/use-table-state.js.map +1 -1
  185. package/dist/components/user-avatar.d.ts +25 -3
  186. package/dist/components/user-avatar.js +32 -3
  187. package/dist/components/user-avatar.js.map +1 -1
  188. package/dist/{data-table-filters-Dh9uF_S-.d.ts → data-table-Drun8Fk9.d.ts} +305 -61
  189. package/dist/data-table.d.ts +2 -1
  190. package/dist/data-table.js +5 -1
  191. package/dist/data-table.js.map +1 -1
  192. package/dist/feedback/feedback-dialog.d.ts +26 -3
  193. package/dist/feedback/feedback-dialog.js +16 -2
  194. package/dist/feedback/feedback-dialog.js.map +1 -1
  195. package/dist/feedback/feedback-thread.d.ts +133 -0
  196. package/dist/feedback/feedback-thread.js +237 -0
  197. package/dist/feedback/feedback-thread.js.map +1 -0
  198. package/dist/feedback.d.ts +2 -1
  199. package/dist/feedback.js +1 -0
  200. package/dist/feedback.js.map +1 -1
  201. package/dist/hooks/use-authed-src.d.ts +71 -0
  202. package/dist/hooks/use-authed-src.js +63 -0
  203. package/dist/hooks/use-authed-src.js.map +1 -0
  204. package/dist/hooks/use-file-drop.d.ts +50 -2
  205. package/dist/hooks/use-hotkey.d.ts +59 -0
  206. package/dist/hooks/use-hotkey.js +105 -0
  207. package/dist/hooks/use-hotkey.js.map +1 -0
  208. package/dist/hooks/use-search-param-state.d.ts +83 -0
  209. package/dist/hooks/use-search-param-state.js +94 -0
  210. package/dist/hooks/use-search-param-state.js.map +1 -0
  211. package/dist/i18n/defaults.d.ts +17 -4
  212. package/dist/i18n/defaults.js +33 -1
  213. package/dist/i18n/defaults.js.map +1 -1
  214. package/dist/i18n/kit-labels.d.ts +47 -310
  215. package/dist/i18n/kit-labels.js +20 -5
  216. package/dist/i18n/kit-labels.js.map +1 -1
  217. package/dist/i18n/locales/de-CH-informal.d.ts +17 -4
  218. package/dist/i18n/locales/de-CH.d.ts +17 -4
  219. package/dist/i18n/locales/de-informal.d.ts +17 -4
  220. package/dist/i18n/locales/de.d.ts +17 -4
  221. package/dist/i18n/locales/de.js +165 -4
  222. package/dist/i18n/locales/de.js.map +1 -1
  223. package/dist/i18n/locales/es.d.ts +17 -4
  224. package/dist/i18n/locales/es.js +162 -4
  225. package/dist/i18n/locales/es.js.map +1 -1
  226. package/dist/i18n/locales/fr.d.ts +17 -4
  227. package/dist/i18n/locales/fr.js +162 -4
  228. package/dist/i18n/locales/fr.js.map +1 -1
  229. package/dist/i18n/locales/hu.d.ts +17 -4
  230. package/dist/i18n/locales/hu.js +162 -4
  231. package/dist/i18n/locales/hu.js.map +1 -1
  232. package/dist/i18n/locales/it.d.ts +17 -4
  233. package/dist/i18n/locales/it.js +162 -4
  234. package/dist/i18n/locales/it.js.map +1 -1
  235. package/dist/i18n/locales/zh.d.ts +17 -4
  236. package/dist/i18n/locales/zh.js +162 -4
  237. package/dist/i18n/locales/zh.js.map +1 -1
  238. package/dist/index.d.ts +45 -21
  239. package/dist/index.js +43 -1
  240. package/dist/index.js.map +1 -1
  241. package/dist/kit-labels-v3biUF1L.d.ts +1645 -0
  242. package/dist/lib/clipping.d.ts +21 -5
  243. package/dist/lib/clipping.js +3 -0
  244. package/dist/lib/clipping.js.map +1 -1
  245. package/dist/lib/dates.d.ts +17 -1
  246. package/dist/lib/dates.js +19 -0
  247. package/dist/lib/dates.js.map +1 -1
  248. package/dist/lib/format.d.ts +144 -0
  249. package/dist/lib/format.js +149 -0
  250. package/dist/lib/format.js.map +1 -0
  251. package/dist/lib/qr-encode.d.ts +44 -0
  252. package/dist/lib/qr-encode.js +338 -0
  253. package/dist/lib/qr-encode.js.map +1 -0
  254. package/dist/rhf/fields.d.ts +241 -0
  255. package/dist/rhf/fields.js +601 -0
  256. package/dist/rhf/fields.js.map +1 -0
  257. package/dist/rhf/form.d.ts +50 -1
  258. package/dist/rhf/line-items.d.ts +31 -0
  259. package/dist/rhf/line-items.js +59 -0
  260. package/dist/rhf/line-items.js.map +1 -0
  261. package/dist/rhf/use-rhf-wizard-step.d.ts +22 -0
  262. package/dist/rhf/use-rhf-wizard-step.js +38 -0
  263. package/dist/rhf/use-rhf-wizard-step.js.map +1 -0
  264. package/dist/rhf.d.ts +63 -1
  265. package/dist/rhf.js +3 -0
  266. package/dist/rhf.js.map +1 -1
  267. package/dist/shell/app-shell.d.ts +99 -2
  268. package/dist/shell/app-shell.js +58 -3
  269. package/dist/shell/app-shell.js.map +1 -1
  270. package/dist/shell/auth-layout.d.ts +74 -0
  271. package/dist/shell/auth-layout.js +97 -0
  272. package/dist/shell/auth-layout.js.map +1 -0
  273. package/dist/shell/top-bar-brand.d.ts +81 -0
  274. package/dist/shell/top-bar-brand.js +47 -0
  275. package/dist/shell/top-bar-brand.js.map +1 -0
  276. package/dist/shell/topbar-action-menu.d.ts +84 -3
  277. package/dist/shell/topbar-action-menu.js +115 -27
  278. package/dist/shell/topbar-action-menu.js.map +1 -1
  279. package/dist/shell.d.ts +58 -2
  280. package/dist/shell.js +2 -0
  281. package/dist/shell.js.map +1 -1
  282. package/dist/wizard/stepper-nav.d.ts +49 -1
  283. package/dist/wizard/wizard-context.d.ts +30 -1
  284. package/dist/wizard/wizard-context.js +23 -2
  285. package/dist/wizard/wizard-context.js.map +1 -1
  286. package/dist/wizard/wizard-step.d.ts +20 -5
  287. package/dist/wizard/wizard-step.js +16 -3
  288. package/dist/wizard/wizard-step.js.map +1 -1
  289. package/dist/wizard.d.ts +51 -3
  290. package/package.json +1 -1
  291. package/src/chart.ts +4 -0
  292. package/src/components/account-settings-labels.ts +190 -0
  293. package/src/components/account-settings.tsx +110 -63
  294. package/src/components/alert-banner.tsx +36 -7
  295. package/src/components/amount-input.tsx +13 -1
  296. package/src/components/authed-image.tsx +190 -0
  297. package/src/components/breadcrumbs.tsx +8 -2
  298. package/src/components/bulk-action-bar.tsx +163 -57
  299. package/src/components/button-group.tsx +129 -4
  300. package/src/components/calendar-heatmap.tsx +599 -0
  301. package/src/components/chip.tsx +8 -4
  302. package/src/components/choice-card.tsx +208 -1
  303. package/src/components/combobox-core.tsx +5 -0
  304. package/src/components/combobox.tsx +31 -9
  305. package/src/components/copy-button.tsx +3 -2
  306. package/src/components/data-table-cells.tsx +119 -0
  307. package/src/components/data-table-filters.ts +77 -0
  308. package/src/components/data-table-labels.ts +23 -0
  309. package/src/components/data-table.tsx +231 -13
  310. package/src/components/date-picker.tsx +19 -3
  311. package/src/components/description-list.tsx +52 -3
  312. package/src/components/entity-combobox.tsx +18 -3
  313. package/src/components/error-boundary.tsx +216 -0
  314. package/src/components/field.tsx +188 -0
  315. package/src/components/floating-panel.tsx +380 -16
  316. package/src/components/form-actions.tsx +191 -0
  317. package/src/components/image-grid.tsx +181 -0
  318. package/src/components/lightbox.tsx +374 -0
  319. package/src/components/line-items.tsx +385 -0
  320. package/src/components/list.tsx +93 -18
  321. package/src/components/loading-state.tsx +47 -0
  322. package/src/components/menu-item.tsx +29 -3
  323. package/src/components/mini-calendar.tsx +317 -57
  324. package/src/components/modal.tsx +61 -3
  325. package/src/components/month-picker.tsx +181 -26
  326. package/src/components/multi-entity-combobox.tsx +19 -3
  327. package/src/components/nav-pills.tsx +152 -0
  328. package/src/components/number-field.tsx +15 -10
  329. package/src/components/number-input.tsx +16 -1
  330. package/src/components/passkeys-setting.tsx +331 -0
  331. package/src/components/picker-sheet.tsx +7 -1
  332. package/src/components/pie-chart-labels.ts +32 -0
  333. package/src/components/pie-chart.tsx +479 -0
  334. package/src/components/progress-bar.tsx +241 -13
  335. package/src/components/qr-code.tsx +83 -0
  336. package/src/components/search-field.tsx +20 -4
  337. package/src/components/series-chart.tsx +21 -0
  338. package/src/components/signed-amount.tsx +286 -0
  339. package/src/components/skeleton.tsx +21 -3
  340. package/src/components/stat-tile.tsx +8 -2
  341. package/src/components/status-dot.tsx +10 -2
  342. package/src/components/table.tsx +186 -23
  343. package/src/components/text-link.tsx +248 -0
  344. package/src/components/text.tsx +9 -1
  345. package/src/components/toggle-group.tsx +106 -13
  346. package/src/components/toggle-legend.tsx +87 -2
  347. package/src/components/tooltip.tsx +17 -3
  348. package/src/components/ui.tsx +572 -44
  349. package/src/components/use-table-state.ts +265 -33
  350. package/src/components/user-avatar.tsx +57 -3
  351. package/src/data-table.ts +10 -0
  352. package/src/feedback/feedback-dialog.tsx +42 -3
  353. package/src/feedback/feedback-thread.tsx +434 -0
  354. package/src/feedback.ts +1 -0
  355. package/src/hooks/use-authed-src.ts +161 -0
  356. package/src/hooks/use-hotkey.ts +172 -0
  357. package/src/hooks/use-search-param-state.ts +187 -0
  358. package/src/i18n/defaults.ts +32 -0
  359. package/src/i18n/kit-labels.tsx +104 -8
  360. package/src/i18n/locales/de.ts +162 -0
  361. package/src/i18n/locales/es.ts +159 -0
  362. package/src/i18n/locales/fr.ts +162 -0
  363. package/src/i18n/locales/hu.ts +160 -0
  364. package/src/i18n/locales/it.ts +160 -0
  365. package/src/i18n/locales/zh.ts +159 -0
  366. package/src/index.ts +64 -0
  367. package/src/lib/clipping.ts +22 -4
  368. package/src/lib/dates.ts +37 -0
  369. package/src/lib/format.ts +325 -0
  370. package/src/lib/qr-encode.ts +420 -0
  371. package/src/rhf/fields.tsx +1054 -0
  372. package/src/rhf/line-items.tsx +130 -0
  373. package/src/rhf/use-rhf-wizard-step.ts +113 -0
  374. package/src/rhf.ts +8 -0
  375. package/src/shell/app-shell.tsx +147 -2
  376. package/src/shell/auth-layout.tsx +190 -0
  377. package/src/shell/top-bar-brand.tsx +76 -0
  378. package/src/shell/topbar-action-menu.tsx +260 -49
  379. package/src/shell.ts +2 -0
  380. package/src/wizard/wizard-context.tsx +50 -1
  381. package/src/wizard/wizard-step.tsx +43 -6
  382. package/tokens.css +12 -0
@@ -1,210 +1,53 @@
1
- import * as react from 'react';
2
- import { ComponentPropsWithoutRef, ReactNode, ReactElement } from 'react';
3
- import { Button } from './ui.js';
1
+ import 'react';
2
+ export { M as DEFAULT_FILE_PICKER_LABELS, aa as FileButton, ab as FileButtonProps, b8 as FilePickHandler, ad as FilePickerLabels, ae as FileRejection, af as FileRejectionReason, ag as FileScreenOptions, aW as UseFilePickerOptions, aX as UseFilePickerReturn, b9 as formatAccept, ba as judgePick, a_ as matchesAccept, bb as screenFiles, bc as summariseRejections, b1 as useFilePicker } from '../kit-labels-v3biUF1L.js';
3
+ import './data-table-labels.js';
4
+ import './mini-calendar.js';
5
+ import './calendar-heatmap.js';
6
+ import './popover.js';
7
+ import './chip.js';
8
+ import 'lucide-react';
9
+ import './field-sync.js';
4
10
  import './tooltip.js';
5
11
  import '../hooks/use-anchored-rect.js';
6
-
7
- /**
8
- * A button that opens the file picker — the shape all three apps kept writing by hand
9
- * as a `<Button>` plus a hidden `<input type="file">` plus a ref between them (seven
10
- * copies in keksdose, two each in kastlan and lenkbank).
11
- *
12
- * Every copy had to remember the same four things, and each one forgot at least one:
13
- *
14
- * 1. **Reset the input after every pick.** A file input fires `change` only when its
15
- * value CHANGES, so picking the same file twice in a row — the retry after a failed
16
- * upload, the second photo of the same receipt — did nothing at all, which reads as
17
- * a broken button. `value = ""` after each pick; always, not per call site.
18
- * 2. **`type="button"`.** `<Button>` does not set it, and inside a form a bare button
19
- * submits the form before the picker opens.
20
- * 3. **Check the file.** `accept` filters the DIALOG, not the result: the dialog's
21
- * "All files" switch, a drop, and a mobile share sheet all hand over whatever the
22
- * user chose. So `accept` is re-checked here, along with `maxSize`, `maxFiles` and
23
- * an optional `isValid`.
24
- * 4. **Say no without a toast.** A rejection is reported through `onReject`, with a
25
- * translated message per file, and spoken through a live region — the kit does not
26
- * decide how an app surfaces errors (keksdose's proposal §1 asked for exactly that).
27
- *
28
- * The part that is not a button — the hidden input, the check, the announcement — is
29
- * {@link useFilePicker}, for the case where the thing that opens the picker is someone
30
- * else's control (a card's "Add" action, a menu item, a second button for the camera).
31
- */
32
- /** Every string the file pickers ({@link FileButton}, `FileDropzone`) render or speak.
33
- * Messages are functions of the file name so a translation can put it anywhere. */
34
- interface FilePickerLabels {
35
- /** The file's type is not in `accept`, when no `accept` is known to name (see
36
- * `rejectedTypeOnly`). */
37
- rejectedType: (name: string) => string;
38
- /** The file's type is not in `accept`, naming what IS accepted: `accept`'s tokens,
39
- * lower-cased and joined with ", " (`".csv"` => "Only .csv files"). Used whenever
40
- * `accept` is set — kastlan kept a custom `isValid` + `invalidMessage` per form only
41
- * to say this, and `accept` already knows it. */
42
- rejectedTypeOnly: (accept: string, name: string) => string;
43
- /** The file is larger than `maxSize`; `maxSize` arrives formatted ("5 MB"). */
44
- rejectedSize: (name: string, maxSize: string) => string;
45
- /** The file was one too many for `maxFiles`. */
46
- rejectedCount: (name: string, maxFiles: number) => string;
47
- /** `isValid` said no and the caller gave no `invalidMessage`. */
48
- rejectedInvalid: (name: string) => string;
49
- /** Spoken instead of the per-file message when more than one file was refused. */
50
- rejectedMany: (count: number) => string;
51
- /** Spoken (and shown, on a dropzone) when `onPick` refused the WHOLE pick.
52
- * Receives the number of files in it. */
53
- rejectedPick: (count: number) => string;
54
- /** Spoken after a pick the component itself echoes (the dropzone). */
55
- selected: (count: number, firstName: string) => string;
56
- /** The dropzone's remove button for one file. */
57
- remove: (name: string) => string;
58
- /** The dropzone's remove-everything button in `multiple` mode. */
59
- clearAll: string;
60
- /** Spoken after a remove / clear, since the button that was pressed is gone. */
61
- removed: (name: string) => string;
62
- cleared: string;
63
- /** The dropzone's accessible name, when the host passes no `dropLabel`. */
64
- dropzone: string;
65
- /** The dropzone's Browse button, when the host passes no `browseLabel`. */
66
- browse: string;
67
- /** What an empty single-file dropzone says (no `emptyLabel` given). */
68
- empty: string;
69
- /** …and an empty `multiple` one. */
70
- emptyMultiple: string;
71
- /** The dropzone's second line (no `hint` given). Receives `accept` as a person
72
- * reads it (`".pdf, image/png"`), or `""` when anything goes. */
73
- hint: (accept: string) => string;
74
- /** What a `busy` dropzone says in place of its body ("Uploading…"). */
75
- busy: string;
76
- }
77
- declare const DEFAULT_FILE_PICKER_LABELS: FilePickerLabels;
78
- type FileRejectionReason = "type" | "size" | "count" | "invalid";
79
- /** One file the picker refused, and why. `message` is already translated (see
80
- * {@link FilePickerLabels}, or the caller's `invalidMessage`), so a host that just
81
- * wants to show it can render `rejections[0].message` as is. */
82
- interface FileRejection {
83
- file: File;
84
- reason: FileRejectionReason;
85
- message: string;
86
- }
87
- /**
88
- * Does `file` satisfy an `accept` string, the way the browser's dialog reads it?
89
- * Comma-separated tokens: `.ext` (case-insensitive suffix of the name), `type/*`
90
- * (a MIME family) or an exact MIME type. An empty or absent `accept` takes anything.
91
- *
92
- * A file with no `type` — common for `.step`, `.dat`, anything the OS has no MIME
93
- * mapping for — can only match by extension, which is why lenkbank lists `.stp` AND
94
- * `model/step`: that is how `accept` has to be written for the dialog anyway.
95
- */
96
- declare function matchesAccept(file: File, accept: string | undefined): boolean;
97
- /** @internal `" .PDF, image/png ,"` => `".pdf, image/png"` — `accept` as a person reads
98
- * it. Also the dropzone's default hint. */
99
- declare function formatAccept(accept: string): string;
100
- /** What the pickers screen a pick with. All optional; nothing set accepts everything. */
101
- interface FileScreenOptions {
102
- accept?: string;
103
- /** Bytes. Larger files are refused with reason `"size"`. */
104
- maxSize?: number;
105
- /** How many files one pick may deliver. The rest are refused with reason `"count"`
106
- * — first come, first kept. For a running cap ("at most 5 attachments") pass what
107
- * is LEFT: `maxFiles={5 - attachments.length}`. */
108
- maxFiles?: number;
109
- /** The caller's own check, after `accept` and `maxSize`. */
110
- isValid?: (file: File) => boolean;
111
- /** The message for an `isValid` refusal; `labels.rejectedInvalid` otherwise. */
112
- invalidMessage?: string;
113
- }
114
- /** @internal Split a pick into the files that pass and the ones that do not. */
115
- declare function screenFiles(files: readonly File[], opts: FileScreenOptions, labels: FilePickerLabels, formatSize: (bytes: number) => string): {
116
- accepted: File[];
117
- rejected: FileRejection[];
118
- };
119
- /**
120
- * Judges a pick as a whole — keksdose's "refuse the pick if any file is bad", which
121
- * with `onFiles` + `onReject` alone had to be rebuilt from two calls in a microtask.
122
- *
123
- * Called ONCE per pick, after screening and before `onFiles` / `onReject`, with both
124
- * halves (either may be empty). Return `false` to refuse the whole pick: the accepted
125
- * files are not delivered, `onReject` still receives what screening refused, and one
126
- * sentence (`labels.rejectedPick`) is spoken for the pick instead of a per-file one.
127
- * Return nothing to let the pick through as usual.
128
- *
129
- * ```tsx
130
- * onPick={(ok, bad) => bad.length === 0 || false} // all or nothing
131
- * ```
132
- */
133
- type FilePickHandler = (accepted: File[], rejected: FileRejection[]) => boolean | void;
134
- /** @internal The shared tail of both pickers: run `onPick`, and say whether the pick
135
- * stands. A pick with nothing accepted has nothing to refuse, so `false` there is
136
- * treated as no verdict and the usual per-file messages are kept. */
137
- declare function judgePick(onPick: FilePickHandler | undefined, accepted: File[], rejected: FileRejection[]): boolean;
138
- /** One sentence for a whole batch of refusals: the file's own message for one, a
139
- * count for several — reading out five sentences in a row helps nobody. */
140
- declare function summariseRejections(rejected: readonly FileRejection[], labels: FilePickerLabels): string;
141
- interface UseFilePickerOptions extends FileScreenOptions {
142
- /** Let one pick deliver several files. Without it a drop of several keeps the first. */
143
- multiple?: boolean;
144
- /**
145
- * Ask a phone for its camera instead of the file chooser: `"environment"` is the
146
- * back camera, `"user"` the front. A HINT — desktop browsers ignore it, and Chrome
147
- * drops it when `multiple` is also set (a camera cannot deliver a list), which is why
148
- * keksdose's camera input has no `multiple`. Pass one or the other.
149
- */
150
- capture?: boolean | "user" | "environment";
151
- /** The files that passed, in pick order. Never called with an empty array.
152
- * Optional since 0.7 for a caller that takes the pick through `onPick` alone. */
153
- onFiles?: (files: File[]) => void;
154
- /** See {@link FilePickHandler}: the whole pick at once, with the power to refuse it. */
155
- onPick?: FilePickHandler;
156
- /** The files that did not, with a translated message each. The refusals are also
157
- * spoken through a live region, so this is for SHOWING them, not for a11y. */
158
- onReject?: (rejections: FileRejection[]) => void;
159
- /** `open()` and `take()` do nothing while set. */
160
- disabled?: boolean;
161
- /** Per-instance overrides of the `filePicker` label namespace. */
162
- labels?: Partial<FilePickerLabels>;
163
- }
164
- interface UseFilePickerReturn {
165
- /** Open the system picker. Call it from a click handler — browsers only open a file
166
- * dialog in response to a user gesture. */
167
- open: () => void;
168
- /** Screen and deliver files that arrived some other way — a drop, a paste. Honours
169
- * `multiple` (only the first file without it) and every check. */
170
- take: (files: ArrayLike<File> | null | undefined) => void;
171
- /** The hidden input and the live region. Render it once, anywhere — it takes no
172
- * space and needs no positioned ancestor. */
173
- element: ReactElement;
174
- }
175
- /**
176
- * The headless half of {@link FileButton}: a hidden file input you can open from any
177
- * control, with the reset, the screening and the announcement built in.
178
- *
179
- * ```tsx
180
- * const picker = useFilePicker({ accept: ".pdf", onFiles: ([f]) => upload(f) });
181
- * return <>{picker.element}<DetailTableCard onAdd={picker.open} … /></>;
182
- * ```
183
- */
184
- declare function useFilePicker({ accept, multiple, capture, maxSize, maxFiles, isValid, invalidMessage, onFiles, onPick, onReject, disabled, labels: labelsProp, }: UseFilePickerOptions): UseFilePickerReturn;
185
- type ButtonOwnProps = ComponentPropsWithoutRef<typeof Button>;
186
- interface FileButtonProps extends Omit<UseFilePickerOptions, "disabled">, Omit<ButtonOwnProps, "type" | "children" | "accept" | "capture" | "multiple"> {
187
- /** The button's content — usually an icon and a word. It is the accessible name. */
188
- children: ReactNode;
189
- /** Busy: disabled, `aria-busy`, and a spinner before the content — for "uploading". */
190
- pending?: boolean;
191
- /** Also accept files dropped ON the button (lenkbank's "drop onto the button").
192
- * Off by default: a button that silently takes drops is a surprise on a page that
193
- * has a real drop target elsewhere. */
194
- droppable?: boolean;
195
- }
196
- /**
197
- * {@link useFilePicker} behind a {@link Button}: `variant` and every other button prop
198
- * pass through, and the ref is the `<button>` (so `ref.current.click()` opens the
199
- * picker from elsewhere too).
200
- *
201
- * ```tsx
202
- * <FileButton accept="image/*,application/pdf" capture="environment" variant="secondary"
203
- * maxSize={10_000_000} onFiles={([f]) => upload(f)} onReject={([r]) => setError(r.message)}>
204
- * <Camera aria-hidden /> Photograph receipt
205
- * </FileButton>
206
- * ```
207
- */
208
- declare const FileButton: react.ForwardRefExoticComponent<FileButtonProps & react.RefAttributes<HTMLButtonElement>>;
209
-
210
- export { DEFAULT_FILE_PICKER_LABELS, FileButton, type FileButtonProps, type FilePickHandler, type FilePickerLabels, type FileRejection, type FileRejectionReason, type FileScreenOptions, type UseFilePickerOptions, type UseFilePickerReturn, formatAccept, judgePick, matchesAccept, screenFiles, summariseRejections, useFilePicker };
12
+ import '../lib/clipping.js';
13
+ import '../wizard/types.js';
14
+ import '../tour/tour.js';
15
+ import '../search/command-palette.js';
16
+ import '../search/global-search.js';
17
+ import '../search/search-index.js';
18
+ import './month-picker.js';
19
+ import './page-contents.js';
20
+ import './series-chart-labels.js';
21
+ import './pie-chart-labels.js';
22
+ import './sparkline.js';
23
+ import './stat-tile.js';
24
+ import './signature-pad.js';
25
+ import './password-strength.js';
26
+ import './danger-confirm.js';
27
+ import './swatch-picker.js';
28
+ import './tile-radio.js';
29
+ import './icon-picker.js';
30
+ import './dialog-frame.js';
31
+ import './modal.js';
32
+ import '../hooks/use-search-param-state.js';
33
+ import './measured-grid.js';
34
+ import '../feedback/feedback-attachment.js';
35
+ import '../feedback/feedback-dialog.js';
36
+ import '../feedback/feedback-thread.js';
37
+ import '../feedback/feedback-inbox.js';
38
+ import './account-settings-labels.js';
39
+ import './confirm-dialog.js';
40
+ import './floating-panel.js';
41
+ import './bulk-action-bar.js';
42
+ import './list.js';
43
+ import './breadcrumbs.js';
44
+ import './toast.js';
45
+ import './description-list.js';
46
+ import './line-items.js';
47
+ import './progress-bar.js';
48
+ import './signed-amount.js';
49
+ import './error-boundary.js';
50
+ import './authed-image.js';
51
+ import '../hooks/use-authed-src.js';
52
+ import './image-grid.js';
53
+ import './lightbox.js';
@@ -1,9 +1,57 @@
1
1
  import * as react from 'react';
2
2
  import { ComponentPropsWithoutRef, ReactNode } from 'react';
3
- import { FileRejection, FilePickHandler, FilePickerLabels } from './file-button.js';
4
- import './ui.js';
3
+ import { ae as FileRejection, b8 as FilePickHandler, ad as FilePickerLabels } from '../kit-labels-v3biUF1L.js';
4
+ import './data-table-labels.js';
5
+ import './mini-calendar.js';
6
+ import './calendar-heatmap.js';
7
+ import './popover.js';
8
+ import './chip.js';
9
+ import 'lucide-react';
10
+ import './field-sync.js';
5
11
  import './tooltip.js';
6
12
  import '../hooks/use-anchored-rect.js';
13
+ import '../lib/clipping.js';
14
+ import '../wizard/types.js';
15
+ import '../tour/tour.js';
16
+ import '../search/command-palette.js';
17
+ import '../search/global-search.js';
18
+ import '../search/search-index.js';
19
+ import './month-picker.js';
20
+ import './page-contents.js';
21
+ import './series-chart-labels.js';
22
+ import './pie-chart-labels.js';
23
+ import './sparkline.js';
24
+ import './stat-tile.js';
25
+ import './signature-pad.js';
26
+ import './password-strength.js';
27
+ import './danger-confirm.js';
28
+ import './swatch-picker.js';
29
+ import './tile-radio.js';
30
+ import './icon-picker.js';
31
+ import './dialog-frame.js';
32
+ import './modal.js';
33
+ import '../hooks/use-search-param-state.js';
34
+ import './measured-grid.js';
35
+ import '../feedback/feedback-attachment.js';
36
+ import '../feedback/feedback-dialog.js';
37
+ import '../feedback/feedback-thread.js';
38
+ import '../feedback/feedback-inbox.js';
39
+ import './account-settings-labels.js';
40
+ import './confirm-dialog.js';
41
+ import './floating-panel.js';
42
+ import './bulk-action-bar.js';
43
+ import './list.js';
44
+ import './breadcrumbs.js';
45
+ import './toast.js';
46
+ import './description-list.js';
47
+ import './line-items.js';
48
+ import './progress-bar.js';
49
+ import './signed-amount.js';
50
+ import './error-boundary.js';
51
+ import './authed-image.js';
52
+ import '../hooks/use-authed-src.js';
53
+ import './image-grid.js';
54
+ import './lightbox.js';
7
55
 
8
56
  /**
9
57
  * Where a refused file's message goes.
@@ -1,9 +1,18 @@
1
1
  import * as react from 'react';
2
- import { ButtonHTMLAttributes, ReactNode, Ref } from 'react';
2
+ import { ButtonHTMLAttributes, ReactNode, MouseEvent, ReactElement, Ref, HTMLAttributes } from 'react';
3
+ import { TooltipSide } from './tooltip.js';
4
+ import '../hooks/use-anchored-rect.js';
5
+ import '../lib/clipping.js';
3
6
 
4
7
  interface FloatingPanelLabels {
5
8
  /** Accessible name of the panel header's X. */
6
9
  close: string;
10
+ /**
11
+ * What a {@link FloatingAction}'s count badge adds to its accessible name ("3 new"),
12
+ * read after the label: "Invoices, 3 new". The dot itself is hidden from a reader —
13
+ * a bare "3" read out of context says nothing about what is counted.
14
+ */
15
+ badge: (count: number) => string;
7
16
  }
8
17
  declare const DEFAULT_FLOATING_PANEL_LABELS: FloatingPanelLabels;
9
18
  /** A LOGICAL corner: `bottom-end` is bottom-right in LTR and bottom-left in RTL. */
@@ -44,6 +53,49 @@ interface FloatingActionButtonProps extends Omit<ButtonHTMLAttributes<HTMLButton
44
53
  * in both states; `aria-pressed` already says which one it is in.
45
54
  */
46
55
  pressed?: boolean;
56
+ /**
57
+ * Show `label` beside the icon: the EXTENDED FAB, a pill rather than a disc. For a
58
+ * corner control whose words are the point — kastlan's offline indicator
59
+ * (shared/offline/offline-indicator.tsx:39) is a pill saying "Offline — 2 photo(s)
60
+ * queued" / "Syncing…", hand-placed at `fixed bottom-4 left-4`, i.e. over the
61
+ * bottom nav and on the wrong side in RTL. Same height as the disc (3rem), so a
62
+ * {@link FloatingPanel} card above it still clears it.
63
+ */
64
+ extended?: boolean;
65
+ /**
66
+ * Announce `label` whenever it changes, through a polite `role="status"` region — for
67
+ * an extended FAB that REPORTS something (kastlan's offline/sync state), where a
68
+ * sighted user sees the words change and a screen reader user otherwise hears
69
+ * nothing until they happen to land on the button.
70
+ *
71
+ * ⚠️ A live region announces changes, not its own arrival: a FAB that mounts already
72
+ * saying "Offline" says it to nobody. Keep it mounted and pass `hidden` while there
73
+ * is nothing to report (kastlan returns `null` when online and idle); the region
74
+ * stays in the page, and the first real status is heard.
75
+ */
76
+ live?: boolean;
77
+ /**
78
+ * `primary` (default): the solid brand disc of a page's main action. `surface`: the
79
+ * page's surface with a hairline border — for a FAB that is a status rather than a
80
+ * call to action, as kastlan's offline pill is (a brand pill would shout "press me"
81
+ * at a user who is merely offline). Ignored while `pressed` is set; a toggle has its
82
+ * own two looks.
83
+ */
84
+ variant?: "primary" | "surface";
85
+ /**
86
+ * Hover and focus label in the kit {@link Tooltip}, instead of the native `title` —
87
+ * keksdose has ONE tooltip (dev#523) and wrapped its assistant launcher by hand,
88
+ * which cannot work: the tooltip's anchor is a `relative inline-flex` span, and this
89
+ * button is `fixed` and portalled. With `tooltip` the FAB positions a fixed wrapper
90
+ * instead and the button sits in the tooltip inside it. `true` shows the `label`;
91
+ * any other content shows that. Implies no native `title` (whatever `nativeTitle`
92
+ * says): one hover hint, not two. `style` stays on the button; the corner and
93
+ * `offset` move to the wrapper.
94
+ */
95
+ tooltip?: ReactNode;
96
+ /** Where the {@link tooltip} opens. Default `top`; the bubble is portalled and kept on
97
+ * screen, so a corner button's label is not pushed off the edge. */
98
+ tooltipSide?: TooltipSide;
47
99
  ref?: Ref<HTMLButtonElement>;
48
100
  }
49
101
  /**
@@ -63,7 +115,7 @@ interface FloatingActionButtonProps extends Omit<ButtonHTMLAttributes<HTMLButton
63
115
  * Portalled, because `position: fixed` inside any transformed ancestor (an animated
64
116
  * page transition) is fixed to that ancestor, not to the screen.
65
117
  */
66
- declare function FloatingActionButton({ label, icon, corner, offset, nativeTitle, pressed, className, style, type, title, ...rest }: FloatingActionButtonProps): react.JSX.Element;
118
+ declare function FloatingActionButton({ label, icon, corner, offset, nativeTitle, pressed, extended, live, variant, tooltip, tooltipSide, className, style, type, title, ...rest }: FloatingActionButtonProps): react.JSX.Element;
67
119
  interface FloatingPanelProps {
68
120
  /** The panel's heading, and its accessible name. */
69
121
  title: ReactNode;
@@ -84,6 +136,10 @@ interface FloatingPanelProps {
84
136
  /** The FAB's native `title` — see {@link FloatingActionButtonProps.nativeTitle}.
85
137
  * `false` for keksdose's assistant launcher, under its one-tooltip rule (dev#523). */
86
138
  fabNativeTitle?: boolean;
139
+ /** The FAB's kit tooltip — see {@link FloatingActionButtonProps.tooltip}. `true` for
140
+ * keksdose's assistant launcher, which wanted the kit bubble and had no way to
141
+ * put one on a fixed, portalled button (dev#523). */
142
+ fabTooltip?: ReactNode;
87
143
  /** Default: `floatingPanel.close` from the {@link UiKitProvider}, else "Close". */
88
144
  closeLabel?: string;
89
145
  /**
@@ -129,6 +185,102 @@ interface FloatingPanelProps {
129
185
  * panel unmounts when closed; an app that must keep a draft across a close keeps it in
130
186
  * its own state, where it also survives a reload.
131
187
  */
132
- declare function FloatingPanel({ title, fabLabel, fabIcon, open: openProp, defaultOpen, onOpenChange, corner, offset, fabNativeTitle, closeLabel, initialFocus, className, bodyClassName, children, }: FloatingPanelProps): react.JSX.Element;
188
+ declare function FloatingPanel({ title, fabLabel, fabIcon, open: openProp, defaultOpen, onOpenChange, corner, offset, fabNativeTitle, fabTooltip, closeLabel, initialFocus, className, bodyClassName, children, }: FloatingPanelProps): react.JSX.Element;
189
+ interface FloatingActionGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, "role"> {
190
+ /** Name the group ("Register actions"); a reader then introduces the members as one
191
+ * set. A group with no name is one more unlabelled wrapper. */
192
+ "aria-label"?: string;
193
+ /** Default `bottom-end`. */
194
+ corner?: FloatingCorner;
195
+ /** Distance above the nav / home indicator — see {@link FloatingActionButtonProps.offset}. */
196
+ offset?: string;
197
+ /** {@link FloatingAction}s, in reading order. */
198
+ children: ReactNode;
199
+ ref?: Ref<HTMLDivElement>;
200
+ }
201
+ /**
202
+ * A floating pill of {@link FloatingAction}s — one to four `size-12` toggles, actions
203
+ * or links with hairline dividers — pinned to a corner exactly as the
204
+ * {@link FloatingActionButton} is: `--app-nav-h` and the home indicator cleared, a
205
+ * logical corner, portalled.
206
+ *
207
+ * keksdose built it twice by hand: the /transactions phone toolbar
208
+ * (transactions-page.tsx:644 — upcoming and pending toggles, an invoices link with a
209
+ * pending count, and the brand "+") and the feedback page's "awaiting only" toggle
210
+ * (feedback-page.tsx:854, one button in the group anyway, so the two pages look
211
+ * alike). Both at `right-4 bottom-20` — `right`, not `end`, so over the page's leading
212
+ * edge in RTL — with `divide-x`, slate hovers, and each member's `Tooltip` spelled out.
213
+ *
214
+ * `role="group"`, NOT a toolbar: every member keeps its own tab stop, as the
215
+ * hand-built ones did, and there is no arrow-key roving to learn. Hide it where it
216
+ * does not belong with a class (`md:hidden`, as both keksdose pages do).
217
+ */
218
+ declare function FloatingActionGroup({ corner, offset, className, style, children, ...rest }: FloatingActionGroupProps): react.JSX.Element;
219
+ /** What {@link FloatingActionProps.renderLink} is handed. Spread it onto your router's
220
+ * link, mapping `href` — `renderLink={({ href, ...p }) => <Link to={href} {...p} />}`. */
221
+ interface FloatingActionLinkProps {
222
+ href: string;
223
+ /** The member's whole look — keep it. */
224
+ className: string;
225
+ children: ReactNode;
226
+ "aria-label": string;
227
+ onClick?: (event: MouseEvent<HTMLAnchorElement>) => void;
228
+ [key: `aria-${string}`]: string | boolean | number | undefined;
229
+ [key: `data-${string}`]: unknown;
230
+ }
231
+ interface FloatingActionProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children" | "onClick"> {
232
+ /** The accessible name, and the tooltip's text. Keep it the same in both states of a
233
+ * toggle; `aria-pressed` says which one it is in. */
234
+ label: string;
235
+ icon: ReactNode;
236
+ /** Make it a toggle: `aria-pressed` and the brand "on" look (the brand glyph on the
237
+ * quiet brand fill), as {@link FloatingActionButtonProps.pressed}. Ignored on a link.
238
+ * For the state without the tint, see {@link pressedStyle}. */
239
+ pressed?: boolean;
240
+ /**
241
+ * How `pressed` looks. `tint` (default): the brand "on" look. `plain`: the member
242
+ * keeps its quiet look in both states and only `aria-pressed` changes — for a toggle
243
+ * whose icon already says which state it is in (keksdose's /transactions "Upcoming"
244
+ * swaps two icons; a tint on top said it twice). The same as passing `aria-pressed`
245
+ * without `pressed`, which also rides through untinted.
246
+ */
247
+ pressedStyle?: "tint" | "plain";
248
+ /**
249
+ * `primary`: the brand-filled member, for the group's main action (the /transactions
250
+ * "+"). Default: the quiet one.
251
+ */
252
+ variant?: "default" | "primary";
253
+ /**
254
+ * A count in a dot at the member's top end corner — the /transactions invoices link's
255
+ * pending count. Nothing is drawn for `0` or less; above 99 it reads `99+`. The count
256
+ * joins the accessible name through `floatingPanel.badge` ("Invoices, 3 new"), or
257
+ * `badgeLabel` when passed.
258
+ */
259
+ badge?: number;
260
+ /** The badge's words for a reader, replacing `floatingPanel.badge` — "3 to review". */
261
+ badgeLabel?: string;
262
+ /** The dot's colour. Default `warning`, the pending count's. */
263
+ badgeTone?: "warning" | "danger" | "brand";
264
+ /** Show `label` in the kit {@link Tooltip} on hover and focus. Default `true`: the
265
+ * members are icon-only and this is their only visible label. */
266
+ tooltip?: boolean;
267
+ /** Where the tooltip opens. Default `top` — the group sits at the bottom of the screen. */
268
+ tooltipSide?: TooltipSide;
269
+ /** Make it a link — the /transactions invoices member. Drawn by `renderLink`, else
270
+ * the `<UiKitProvider linkComponent>` (an in-app `href`), else a plain `<a>`. */
271
+ href?: string;
272
+ /** Render the link through your router's `Link` — see {@link FloatingActionLinkProps}. */
273
+ renderLink?: (props: FloatingActionLinkProps) => ReactElement;
274
+ onClick?: (event: MouseEvent<HTMLElement>) => void;
275
+ ref?: Ref<HTMLButtonElement>;
276
+ }
277
+ /**
278
+ * One member of a {@link FloatingActionGroup}: a `size-12` icon button, toggle or link
279
+ * with its label in a styled tooltip — what each keksdose member wrapped by hand in
280
+ * `<Tooltip portal>`. The tooltip is portalled because the group clips (`overflow-hidden`
281
+ * keeps the brand member's fill inside the pill's corners), and the focus ring is inset
282
+ * for the same reason.
283
+ */
284
+ declare function FloatingAction({ label, icon, pressed, pressedStyle, variant, badge, badgeLabel, badgeTone, tooltip, tooltipSide, href, renderLink, className, type, onClick, ref, ...rest }: FloatingActionProps): react.JSX.Element;
133
285
 
134
- export { DEFAULT_FLOATING_PANEL_LABELS, FloatingActionButton, type FloatingActionButtonProps, type FloatingCorner, FloatingPanel, type FloatingPanelLabels, type FloatingPanelProps };
286
+ export { DEFAULT_FLOATING_PANEL_LABELS, FloatingAction, FloatingActionButton, type FloatingActionButtonProps, FloatingActionGroup, type FloatingActionGroupProps, type FloatingActionLinkProps, type FloatingActionProps, type FloatingCorner, FloatingPanel, type FloatingPanelLabels, type FloatingPanelProps };