@brightspot/ui 1.11.0 → 3.0.1-cms-ui-migration.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 (347) hide show
  1. package/dist/components/action-bar/ActionBar.d.ts +1 -1
  2. package/dist/components/action-bar/ActionBar.js +7 -7
  3. package/dist/components/action-bar/ActionBar.js.map +1 -1
  4. package/dist/components/action-bar/ActionItem.d.ts +5 -5
  5. package/dist/components/action-bar/ActionItem.d.ts.map +1 -1
  6. package/dist/components/action-bar/ActionItem.js +13 -13
  7. package/dist/components/action-bar/ActionItem.js.map +1 -1
  8. package/dist/components/avatar/AvatarGroup.d.ts +3 -0
  9. package/dist/components/avatar/AvatarGroup.d.ts.map +1 -1
  10. package/dist/components/avatar/AvatarGroup.js +3 -0
  11. package/dist/components/avatar/AvatarGroup.js.map +1 -1
  12. package/dist/components/badge/Badge.d.ts +3 -1
  13. package/dist/components/badge/Badge.d.ts.map +1 -1
  14. package/dist/components/badge/Badge.js +2 -0
  15. package/dist/components/badge/Badge.js.map +1 -1
  16. package/dist/components/button-group/ButtonGroup.d.ts +138 -0
  17. package/dist/components/button-group/ButtonGroup.d.ts.map +1 -0
  18. package/dist/components/button-group/ButtonGroup.js +436 -0
  19. package/dist/components/button-group/ButtonGroup.js.map +1 -0
  20. package/dist/components/checkbox/Checkbox.d.ts +107 -0
  21. package/dist/components/checkbox/Checkbox.d.ts.map +1 -0
  22. package/dist/components/checkbox/Checkbox.js +224 -0
  23. package/dist/components/checkbox/Checkbox.js.map +1 -0
  24. package/dist/components/circular-progress/CircularProgress.d.ts +2 -2
  25. package/dist/components/circular-progress/CircularProgress.js +2 -2
  26. package/dist/components/copy-to-clipboard/CopyToClipboard.d.ts +7 -2
  27. package/dist/components/copy-to-clipboard/CopyToClipboard.d.ts.map +1 -1
  28. package/dist/components/copy-to-clipboard/CopyToClipboard.js +10 -5
  29. package/dist/components/copy-to-clipboard/CopyToClipboard.js.map +1 -1
  30. package/dist/components/dropdown/Dropdown.d.ts +5 -5
  31. package/dist/components/dropdown/Dropdown.d.ts.map +1 -1
  32. package/dist/components/dropdown/Dropdown.js +11 -16
  33. package/dist/components/dropdown/Dropdown.js.map +1 -1
  34. package/dist/components/dropdown/DropdownItem.d.ts +14 -6
  35. package/dist/components/dropdown/DropdownItem.d.ts.map +1 -1
  36. package/dist/components/dropdown/DropdownItem.js +21 -15
  37. package/dist/components/dropdown/DropdownItem.js.map +1 -1
  38. package/dist/components/dropdown/DropdownMenu.d.ts +4 -4
  39. package/dist/components/dropdown/DropdownMenu.d.ts.map +1 -1
  40. package/dist/components/dropdown/DropdownMenu.js +6 -6
  41. package/dist/components/dropdown/DropdownMenu.js.map +1 -1
  42. package/dist/components/empty-state/EmptyState.css +4 -0
  43. package/dist/components/empty-state/EmptyState.d.ts +103 -0
  44. package/dist/components/empty-state/EmptyState.d.ts.map +1 -0
  45. package/dist/components/empty-state/EmptyState.js +209 -0
  46. package/dist/components/empty-state/EmptyState.js.map +1 -0
  47. package/dist/components/icon/Icon.d.ts +23 -10
  48. package/dist/components/icon/Icon.d.ts.map +1 -1
  49. package/dist/components/icon/Icon.js +40 -9
  50. package/dist/components/icon/Icon.js.map +1 -1
  51. package/dist/components/icon-button/IconButton.d.ts +7 -21
  52. package/dist/components/icon-button/IconButton.d.ts.map +1 -1
  53. package/dist/components/icon-button/IconButton.js +12 -18
  54. package/dist/components/icon-button/IconButton.js.map +1 -1
  55. package/dist/components/linear-progress/LinearProgress.d.ts +2 -2
  56. package/dist/components/linear-progress/LinearProgress.js +2 -2
  57. package/dist/components/pagination/Pagination.js +10 -10
  58. package/dist/components/popover/Popover.d.ts +6 -0
  59. package/dist/components/popover/Popover.d.ts.map +1 -1
  60. package/dist/components/popover/Popover.js +6 -0
  61. package/dist/components/popover/Popover.js.map +1 -1
  62. package/dist/components/switch/Switch.d.ts +5 -1
  63. package/dist/components/switch/Switch.d.ts.map +1 -1
  64. package/dist/components/switch/Switch.js +10 -6
  65. package/dist/components/switch/Switch.js.map +1 -1
  66. package/dist/components/tabs/Tab.d.ts +4 -4
  67. package/dist/components/tabs/Tab.d.ts.map +1 -1
  68. package/dist/components/tabs/Tab.js +5 -5
  69. package/dist/components/tabs/Tab.js.map +1 -1
  70. package/dist/components/tabs/Tabs.d.ts +3 -3
  71. package/dist/components/tabs/Tabs.d.ts.map +1 -1
  72. package/dist/components/tabs/Tabs.js +20 -20
  73. package/dist/components/tabs/Tabs.js.map +1 -1
  74. package/dist/components/upload/Upload.d.ts +157 -0
  75. package/dist/components/upload/Upload.d.ts.map +1 -0
  76. package/dist/components/upload/Upload.js +538 -0
  77. package/dist/components/upload/Upload.js.map +1 -0
  78. package/dist/components/upload/UploadItem.d.ts +73 -0
  79. package/dist/components/upload/UploadItem.d.ts.map +1 -0
  80. package/dist/components/upload/UploadItem.js +180 -0
  81. package/dist/components/upload/UploadItem.js.map +1 -0
  82. package/dist/components/widget/Widget.d.ts +1 -6
  83. package/dist/components/widget/Widget.d.ts.map +1 -1
  84. package/dist/components/widget/Widget.js +1 -6
  85. package/dist/components/widget/Widget.js.map +1 -1
  86. package/dist/custom-elements.json +7527 -2115
  87. package/dist/storybook/assets/{ActionBar.stories--nAeDC-G.js → ActionBar.stories-CXEvFUN5.js} +65 -65
  88. package/dist/storybook/assets/{ActionItem.stories-BHrGjk-P.js → ActionItem.stories-8-qQmVGz.js} +41 -41
  89. package/dist/storybook/assets/{Avatar.stories-Da-mRj6_.js → Avatar.stories-LOTCiTgV.js} +2 -2
  90. package/dist/storybook/assets/{AvatarGroup.stories-BQlaC_yl.js → AvatarGroup.stories-N17TVn4O.js} +5 -5
  91. package/dist/storybook/assets/{Badge.stories-DnVnOrnF.js → Badge.stories-2IRfk8Ri.js} +2 -2
  92. package/dist/storybook/assets/{Button-CFLAI1H9.js → Button-CQ2CjiFm.js} +1 -1
  93. package/dist/storybook/assets/{Button.stories-DxaBOjwv.js → Button.stories-DwyviUHj.js} +1 -1
  94. package/dist/storybook/assets/ButtonGroup.stories-D6nkkXxD.js +588 -0
  95. package/dist/storybook/assets/{Celebrate.stories-CuMm15Nr.js → Celebrate.stories-DtKNptXA.js} +7 -7
  96. package/dist/storybook/assets/Checkbox.stories--fetKLgV.js +141 -0
  97. package/dist/storybook/assets/{CircularProgress.stories-DRN8Mtvj.js → CircularProgress.stories-vK3MWdEg.js} +7 -7
  98. package/dist/storybook/assets/{ClipboardMixin.stories-DR7Ou2Av.js → ClipboardMixin.stories-BXOX2e9A.js} +31 -28
  99. package/dist/storybook/assets/{Color-6BZIO3FS-Die62Y0Z.js → Color-6BZIO3FS-DIO6ExZa.js} +1 -1
  100. package/dist/storybook/assets/{Colors.stories-bIq_ssbI.js → Colors.stories-Z-o0Dmyi.js} +1 -1
  101. package/dist/storybook/assets/{CombinedEffects.stories-CtKzOUZn.js → CombinedEffects.stories-BIvRmEL2.js} +33 -33
  102. package/dist/storybook/assets/{ComponentStatesMixin-DMLCk9fE.js → ComponentStatesMixin-BeLIKOsg.js} +1 -1
  103. package/dist/storybook/assets/{ComponentStatesMixin.stories-D8UI9o-d.js → ComponentStatesMixin.stories-u03jgLUU.js} +3 -3
  104. package/dist/storybook/assets/{CopyToClipboard.stories-ti6CpJNp.js → CopyToClipboard.stories-D23guAYu.js} +16 -16
  105. package/dist/storybook/assets/{Debounce.stories-DzZUSvbk.js → Debounce.stories-Bz3JaQJY.js} +9 -9
  106. package/dist/storybook/assets/{DocsRenderer-LL677BLK-CIRGv5IX.js → DocsRenderer-LL677BLK-CaEKjMeC.js} +3 -3
  107. package/dist/storybook/assets/{Dropdown.stories-Lt4cY0Re.js → Dropdown.stories-CNxtx8UX.js} +60 -60
  108. package/dist/storybook/assets/EmptyState.stories-Ck5T6q1T.js +318 -0
  109. package/dist/storybook/assets/{Events.stories-B1ddcgpT.js → Events.stories-Cx10pvVB.js} +1 -1
  110. package/dist/storybook/assets/{Heading.stories-DI4w61cf.js → Heading.stories-mbkSoA5r.js} +1 -1
  111. package/dist/storybook/assets/{HueRipple.stories-DjhoxxEw.js → HueRipple.stories-B-DDviMh.js} +11 -11
  112. package/dist/storybook/assets/Icon.stories-Dodo1jjZ.js +441 -0
  113. package/dist/storybook/assets/{IconButton.stories-KjN28hfc.js → IconButton.stories-eAU6vNiX.js} +126 -146
  114. package/dist/storybook/assets/{LinearProgress.stories-DcIpdz6R.js → LinearProgress.stories-BqAUCgwy.js} +7 -7
  115. package/dist/storybook/assets/{Pagination.stories-BBkLEwoP.js → Pagination.stories-CVK8mlEU.js} +6 -6
  116. package/dist/storybook/assets/{Popover.stories-DLv48c2h.js → Popover.stories-CC2R-jiv.js} +33 -62
  117. package/dist/storybook/assets/ReadyMixin-CAkCCAOH.js +1 -0
  118. package/dist/storybook/assets/{RovingTabindexMixin.stories-BWaFx9mu.js → RovingTabindexMixin.stories-Dgm5izU_.js} +6 -6
  119. package/dist/storybook/assets/{Rtc.stories-Ve7Bwo_l.js → Rtc.stories-D9uVCq71.js} +3 -3
  120. package/dist/storybook/assets/{ScrollShadow.stories-C6XmrRLm.js → ScrollShadow.stories-D5GJ6Zes.js} +2 -2
  121. package/dist/storybook/assets/{Switch.stories-Cf8WM1LG.js → Switch.stories-D7HV0v6i.js} +21 -21
  122. package/dist/storybook/assets/{Tab.stories-CEtdEtOx.js → Tab.stories-CwHBngmO.js} +33 -33
  123. package/dist/storybook/assets/{Tabs.stories-CIAO1bPO.js → Tabs.stories-D87ILflp.js} +2 -2
  124. package/dist/storybook/assets/{Throttle.stories-BqxVIb-r.js → Throttle.stories-C13Vl7yt.js} +10 -10
  125. package/dist/storybook/assets/{Tooltip.stories-B6fw6875.js → Tooltip.stories-BRmAKppC.js} +2 -2
  126. package/dist/storybook/assets/Upload.stories-CvceXasD.js +447 -0
  127. package/dist/storybook/assets/UploadItem.stories-BF6c7tVM.js +167 -0
  128. package/dist/storybook/assets/{Welcome.stories-CfJtSM19.js → Welcome.stories-Ciht_H8A.js} +1 -1
  129. package/dist/storybook/assets/{Widget.stories-CiOho7lO.js → Widget.stories-30UYw1gn.js} +13 -13
  130. package/dist/storybook/assets/{WithTooltip-65CFNBJE-PGcopp73.js → WithTooltip-65CFNBJE-Q8AG_oZS.js} +1 -1
  131. package/dist/storybook/assets/{blocks-dP2DwISI.js → blocks-DIrsUt2U.js} +5 -5
  132. package/dist/storybook/assets/{formatter-EIJCOSYU-CZSAC3tg.js → formatter-EIJCOSYU-BcNb3EA1.js} +1 -1
  133. package/dist/storybook/assets/if-defined-C1_PRAyA.js +1 -0
  134. package/dist/storybook/assets/iframe-BgFj0b5u.css +1 -0
  135. package/dist/storybook/assets/{iframe-DloIUNZz.js → iframe-D5Uwm8Zd.js} +191 -191
  136. package/dist/storybook/assets/{index-DKF0ypu5.js → index-BOlx3-q7.js} +1 -1
  137. package/dist/storybook/assets/{onFind-C0l4Gew0.js → onFind-Cp2DO8R2.js} +1 -1
  138. package/dist/storybook/assets/{onFind.stories-DOTt9puO.js → onFind.stories-BDK06xaW.js} +53 -77
  139. package/dist/storybook/assets/{onRemove.stories-CQ9ZC5dm.js → onRemove.stories-TSKvqih3.js} +6 -10
  140. package/dist/storybook/assets/{onVisible.stories-Cbj5_Vz0.js → onVisible.stories-DiOPobn8.js} +3 -3
  141. package/dist/storybook/assets/{style-map-DLXysq3r.js → style-map-Cy6U2K_U.js} +1 -1
  142. package/dist/storybook/assets/{syntaxhighlighter-ED5Y7EFY-Bjjbl9ca.js → syntaxhighlighter-ED5Y7EFY-NNCQVsSv.js} +1 -1
  143. package/dist/storybook/box-illustration.svg +51 -0
  144. package/dist/storybook/cloud-illustration.svg +49 -0
  145. package/dist/storybook/docs-illustration.svg +92 -0
  146. package/dist/storybook/iframe.html +3 -3
  147. package/dist/storybook/index.json +1 -1
  148. package/dist/storybook/project.json +1 -1
  149. package/dist/tailwind-plugin-badge.js +1 -1
  150. package/dist/tailwind-plugin-badge.ts +1 -1
  151. package/dist/tailwind-plugin-button-group.d.ts +2 -0
  152. package/dist/tailwind-plugin-button-group.d.ts.map +1 -0
  153. package/dist/tailwind-plugin-button-group.js +215 -0
  154. package/dist/tailwind-plugin-button-group.js.map +1 -0
  155. package/dist/tailwind-plugin-button-group.ts +238 -0
  156. package/dist/tailwind-plugin-button.js +1 -1
  157. package/dist/tailwind-plugin-button.ts +1 -1
  158. package/dist/tailwind-plugin-checkbox.d.ts +2 -0
  159. package/dist/tailwind-plugin-checkbox.d.ts.map +1 -0
  160. package/dist/tailwind-plugin-checkbox.js +246 -0
  161. package/dist/tailwind-plugin-checkbox.js.map +1 -0
  162. package/dist/tailwind-plugin-checkbox.ts +281 -0
  163. package/dist/tailwind-plugin-empty-state.d.ts +2 -0
  164. package/dist/tailwind-plugin-empty-state.d.ts.map +1 -0
  165. package/dist/tailwind-plugin-empty-state.js +113 -0
  166. package/dist/tailwind-plugin-empty-state.js.map +1 -0
  167. package/dist/tailwind-plugin-empty-state.ts +124 -0
  168. package/dist/tailwind-plugin-icon.js +122 -18
  169. package/dist/tailwind-plugin-icon.js.map +1 -1
  170. package/dist/tailwind-plugin-icon.ts +131 -18
  171. package/dist/tailwind-plugin-loader.js +3 -3
  172. package/dist/tailwind-plugin-loader.ts +3 -3
  173. package/dist/tailwind-plugin-tabs.js +7 -0
  174. package/dist/tailwind-plugin-tabs.js.map +1 -1
  175. package/dist/tailwind-plugin-tabs.ts +7 -0
  176. package/dist/tailwind-plugin-upload.d.ts +2 -0
  177. package/dist/tailwind-plugin-upload.d.ts.map +1 -0
  178. package/dist/tailwind-plugin-upload.js +322 -0
  179. package/dist/tailwind-plugin-upload.js.map +1 -0
  180. package/dist/tailwind-plugin-upload.ts +362 -0
  181. package/dist/tailwind.config.d.ts.map +1 -1
  182. package/dist/tailwind.config.js +1 -0
  183. package/dist/tailwind.config.js.map +1 -1
  184. package/dist/tailwind.config.ts +1 -0
  185. package/dist/util/ClipboardMixin.d.ts +7 -2
  186. package/dist/util/ClipboardMixin.d.ts.map +1 -1
  187. package/dist/util/ClipboardMixin.js +15 -13
  188. package/dist/util/ClipboardMixin.js.map +1 -1
  189. package/dist/util/ComponentStatesMixin.d.ts +2 -1
  190. package/dist/util/ComponentStatesMixin.d.ts.map +1 -1
  191. package/dist/util/ComponentStatesMixin.js +4 -0
  192. package/dist/util/ComponentStatesMixin.js.map +1 -1
  193. package/dist/util/EventEmitterMixin.d.ts +42 -4
  194. package/dist/util/EventEmitterMixin.d.ts.map +1 -1
  195. package/dist/util/EventEmitterMixin.js +5 -2
  196. package/dist/util/EventEmitterMixin.js.map +1 -1
  197. package/dist/util/ProgressMixin.d.ts +9 -2
  198. package/dist/util/ProgressMixin.d.ts.map +1 -1
  199. package/dist/util/ProgressMixin.js +22 -18
  200. package/dist/util/ProgressMixin.js.map +1 -1
  201. package/dist/util/RovingTabindexMixin.d.ts +8 -0
  202. package/dist/util/RovingTabindexMixin.d.ts.map +1 -1
  203. package/dist/util/RovingTabindexMixin.js +8 -8
  204. package/dist/util/RovingTabindexMixin.js.map +1 -1
  205. package/dist/util/TetherLayout.d.ts.map +1 -1
  206. package/dist/util/TetherLayout.js +3 -0
  207. package/dist/util/TetherLayout.js.map +1 -1
  208. package/dist/util/TooltipMixin.d.ts.map +1 -1
  209. package/dist/util/TooltipMixin.js +5 -4
  210. package/dist/util/TooltipMixin.js.map +1 -1
  211. package/dist/util/upload.d.ts +53 -0
  212. package/dist/util/upload.d.ts.map +1 -0
  213. package/dist/util/upload.js +113 -0
  214. package/dist/util/upload.js.map +1 -0
  215. package/docs/adr/0001-retire-cms-ui-package-fold-under-src-legacy.md +78 -0
  216. package/docs/adr/0002-yarn-workspaces-preserve-cms-ui-deps.md +130 -0
  217. package/docs/adr/0003-bundle-equivalence-as-fold-acceptance-criterion.md +286 -0
  218. package/docs/components/ActionBar.md +6 -0
  219. package/docs/components/ActionItem.md +52 -27
  220. package/docs/components/Avatar.md +42 -12
  221. package/docs/components/AvatarGroup.md +4 -3
  222. package/docs/components/Badge.md +13 -1
  223. package/docs/components/ButtonGroup.md +91 -0
  224. package/docs/components/Checkbox.md +91 -0
  225. package/docs/components/CircularProgress.md +41 -12
  226. package/docs/components/CopyToClipboard.md +13 -11
  227. package/docs/components/Dropdown.md +44 -19
  228. package/docs/components/DropdownItem.md +39 -26
  229. package/docs/components/DropdownMenu.md +9 -9
  230. package/docs/components/EmptyState.md +75 -0
  231. package/docs/components/Icon.md +22 -14
  232. package/docs/components/IconButton.md +46 -21
  233. package/docs/components/LinearProgress.md +43 -4
  234. package/docs/components/Pagination.md +11 -10
  235. package/docs/components/Popover.md +16 -0
  236. package/docs/components/README.md +5 -0
  237. package/docs/components/Switch.md +21 -16
  238. package/docs/components/Tab.md +8 -2
  239. package/docs/components/Tabs.md +8 -0
  240. package/docs/components/Upload.md +112 -0
  241. package/docs/components/UploadItem.md +61 -0
  242. package/docs/components/Widget.md +12 -6
  243. package/package.json +9 -5
  244. package/src/legacy/tool-ui/src/main/webapp/dist/011a678e3efe41981754.png +1 -0
  245. package/src/legacy/tool-ui/src/main/webapp/dist/1173.080a90c5923854fc48e6.js +2 -0
  246. package/src/legacy/tool-ui/src/main/webapp/dist/1173.080a90c5923854fc48e6.js.LICENSE.txt +10 -0
  247. package/src/legacy/tool-ui/src/main/webapp/dist/194137260531ee29a5f2.svg +1 -0
  248. package/src/legacy/tool-ui/src/main/webapp/dist/1946.156c6821383df2638492.js +1 -0
  249. package/src/legacy/tool-ui/src/main/webapp/dist/1950.3594aaa4f20df28f39d9.js +1 -0
  250. package/src/legacy/tool-ui/src/main/webapp/dist/1e8408af1a34bdf61457.png +1 -0
  251. package/src/legacy/tool-ui/src/main/webapp/dist/2111.3956b5196a514b2c0131.js +1 -0
  252. package/src/legacy/tool-ui/src/main/webapp/dist/2111.a937b0cafa8cf7c039d2.css +1 -0
  253. package/src/legacy/tool-ui/src/main/webapp/dist/2129.6b044e5564dd3dbb2f94.js +1 -0
  254. package/src/legacy/tool-ui/src/main/webapp/dist/2314.420883b6638f35f40e70.js +1 -0
  255. package/src/legacy/tool-ui/src/main/webapp/dist/2456.5bcfb782c2ec27de32ed.js +1 -0
  256. package/src/legacy/tool-ui/src/main/webapp/dist/2537.e8f1359bedd328bf57f4.js +1 -0
  257. package/src/legacy/tool-ui/src/main/webapp/dist/2565.4ca31a6a46de85cd3b31.js +1 -0
  258. package/src/legacy/tool-ui/src/main/webapp/dist/270.3011484ff80f3093083a.js +1 -0
  259. package/src/legacy/tool-ui/src/main/webapp/dist/2825.c1342ac2662d11fd4125.js +1 -0
  260. package/src/legacy/tool-ui/src/main/webapp/dist/2947.f96d21c44c05980974ef.js +1 -0
  261. package/src/legacy/tool-ui/src/main/webapp/dist/3532.c358dfbb2cde0f802c7f.js +1 -0
  262. package/src/legacy/tool-ui/src/main/webapp/dist/3543.2d704cf9e170322468e7.js +2 -0
  263. package/src/legacy/tool-ui/src/main/webapp/dist/3543.2d704cf9e170322468e7.js.LICENSE.txt +1 -0
  264. package/src/legacy/tool-ui/src/main/webapp/dist/3611.61837ffa933f74502094.js +1 -0
  265. package/src/legacy/tool-ui/src/main/webapp/dist/3790.74b7037d430ed0a47d0c.js +1 -0
  266. package/src/legacy/tool-ui/src/main/webapp/dist/3995.afbec58662cafb46ec2c.js +1 -0
  267. package/src/legacy/tool-ui/src/main/webapp/dist/4017.c3ed1ca3be18b5c080c8.js +1 -0
  268. package/src/legacy/tool-ui/src/main/webapp/dist/4093.152620c022c3013502b7.js +1 -0
  269. package/src/legacy/tool-ui/src/main/webapp/dist/4114.57fe159e416e716f8cbc.js +1 -0
  270. package/src/legacy/tool-ui/src/main/webapp/dist/4168.a224af7c5c5f6f2ddd7b.js +1 -0
  271. package/src/legacy/tool-ui/src/main/webapp/dist/4374.37147747a254da8f5f8a.js +1 -0
  272. package/src/legacy/tool-ui/src/main/webapp/dist/4450.16dd5684292fd0a7ea7f.js +1 -0
  273. package/src/legacy/tool-ui/src/main/webapp/dist/4478.93f64e6a6ccb35a6c6d4.js +1 -0
  274. package/src/legacy/tool-ui/src/main/webapp/dist/44b38a404dec4643c46b.png +1 -0
  275. package/src/legacy/tool-ui/src/main/webapp/dist/4582.243dbaa3d8a8648f6f40.js +1 -0
  276. package/src/legacy/tool-ui/src/main/webapp/dist/4709.4f6b707e225e481a928e.js +1 -0
  277. package/src/legacy/tool-ui/src/main/webapp/dist/4790.10d75f7c7f8e54ce83a1.js +1 -0
  278. package/src/legacy/tool-ui/src/main/webapp/dist/4795.034ebc93a67b7a3d6536.js +1 -0
  279. package/src/legacy/tool-ui/src/main/webapp/dist/4850.6b944738520f69c98070.js +1 -0
  280. package/src/legacy/tool-ui/src/main/webapp/dist/4a4ee777ddc0d4cedee4.png +1 -0
  281. package/src/legacy/tool-ui/src/main/webapp/dist/5001.a61ae5608398d5d98ab1.js +1 -0
  282. package/src/legacy/tool-ui/src/main/webapp/dist/5030.1e8b82e1444067d492b1.js +1 -0
  283. package/src/legacy/tool-ui/src/main/webapp/dist/5055.620ccb3717b4a6427f09.js +1 -0
  284. package/src/legacy/tool-ui/src/main/webapp/dist/5098.33613009827cfc80aafb.js +1 -0
  285. package/src/legacy/tool-ui/src/main/webapp/dist/5385.6656501b67424994820b.js +1 -0
  286. package/src/legacy/tool-ui/src/main/webapp/dist/5598.d84773ca53126661bdca.js +2 -0
  287. package/src/legacy/tool-ui/src/main/webapp/dist/5598.d84773ca53126661bdca.js.LICENSE.txt +11 -0
  288. package/src/legacy/tool-ui/src/main/webapp/dist/5617.c81ecb679371ca302f1f.js +1 -0
  289. package/src/legacy/tool-ui/src/main/webapp/dist/5718.449113ae2463a3bb8a83.js +2 -0
  290. package/src/legacy/tool-ui/src/main/webapp/dist/5718.449113ae2463a3bb8a83.js.LICENSE.txt +8 -0
  291. package/src/legacy/tool-ui/src/main/webapp/dist/6047.291dd2d4b3f79be2c64d.js +1 -0
  292. package/src/legacy/tool-ui/src/main/webapp/dist/6086.7ca02b827506f29db590.js +1 -0
  293. package/src/legacy/tool-ui/src/main/webapp/dist/6216.cf8adc1990ee1111f065.js +1 -0
  294. package/src/legacy/tool-ui/src/main/webapp/dist/6497.b7d8dcbf0e7c8d8d538d.js +1 -0
  295. package/src/legacy/tool-ui/src/main/webapp/dist/6565.0e5abc3bd344c53ae154.js +1 -0
  296. package/src/legacy/tool-ui/src/main/webapp/dist/7033.4cd6efbe12e7aaa35745.js +1 -0
  297. package/src/legacy/tool-ui/src/main/webapp/dist/7202.1e5b8f21215ea6eae20a.js +1 -0
  298. package/src/legacy/tool-ui/src/main/webapp/dist/7361.793163ca71dfac69d9eb.js +1 -0
  299. package/src/legacy/tool-ui/src/main/webapp/dist/75.e45c9aec6e7409bfe21d.js +1 -0
  300. package/src/legacy/tool-ui/src/main/webapp/dist/7524.2990be869cf0a2988d17.js +1 -0
  301. package/src/legacy/tool-ui/src/main/webapp/dist/7554.bb243c1fb06a125f6353.js +1 -0
  302. package/src/legacy/tool-ui/src/main/webapp/dist/7718.a937b0cafa8cf7c039d2.css +1 -0
  303. package/src/legacy/tool-ui/src/main/webapp/dist/7718.f5996ddd99f2353c7785.js +1 -0
  304. package/src/legacy/tool-ui/src/main/webapp/dist/7741.0b2789c4e783af835763.js +1 -0
  305. package/src/legacy/tool-ui/src/main/webapp/dist/7769.d47f40cc83035fc2392a.js +1 -0
  306. package/src/legacy/tool-ui/src/main/webapp/dist/7863.2a1d1fd229778a47e10b.js +1 -0
  307. package/src/legacy/tool-ui/src/main/webapp/dist/7923.8a92f55de8387f7a8a35.js +1 -0
  308. package/src/legacy/tool-ui/src/main/webapp/dist/8684.7171c731d38a9873d6df.js +1 -0
  309. package/src/legacy/tool-ui/src/main/webapp/dist/8752.3d02a0f42ec39786fdf0.js +1 -0
  310. package/src/legacy/tool-ui/src/main/webapp/dist/8897.bfeed19f2a4acbb6d67c.js +1 -0
  311. package/src/legacy/tool-ui/src/main/webapp/dist/8934.e90ceca8169fc25e4e1b.js +1 -0
  312. package/src/legacy/tool-ui/src/main/webapp/dist/9277.88b2d89b3ba1c24e7f93.js +2 -0
  313. package/src/legacy/tool-ui/src/main/webapp/dist/9277.88b2d89b3ba1c24e7f93.js.LICENSE.txt +9 -0
  314. package/src/legacy/tool-ui/src/main/webapp/dist/9360.bb0352313d610cae11de.js +2 -0
  315. package/src/legacy/tool-ui/src/main/webapp/dist/9360.bb0352313d610cae11de.js.LICENSE.txt +33 -0
  316. package/src/legacy/tool-ui/src/main/webapp/dist/9561.64eab18c8c1bbc4ad8ec.js +1 -0
  317. package/src/legacy/tool-ui/src/main/webapp/dist/9576.174d6a99544d17e7416d.js +1 -0
  318. package/src/legacy/tool-ui/src/main/webapp/dist/983.eedba1cd484aa5bee0c4.js +1 -0
  319. package/src/legacy/tool-ui/src/main/webapp/dist/Appetizeio.185641211f7c0e42a455.js +1 -0
  320. package/src/legacy/tool-ui/src/main/webapp/dist/CISpectrum.74db7dc80b3a6797a167.js +1 -0
  321. package/src/legacy/tool-ui/src/main/webapp/dist/Chart.223ea4ee9e3e32b67a26.js +1 -0
  322. package/src/legacy/tool-ui/src/main/webapp/dist/ChartCompat.4dd096dd030942227ec6.js +1 -0
  323. package/src/legacy/tool-ui/src/main/webapp/dist/CodeMirror.5ddffe054374f883d6f8.js +1 -0
  324. package/src/legacy/tool-ui/src/main/webapp/dist/ImageEditor.14e3b3035666436f53a5.js +1 -0
  325. package/src/legacy/tool-ui/src/main/webapp/dist/LocationMap.72a510c0f5ff236f596e.js +1 -0
  326. package/src/legacy/tool-ui/src/main/webapp/dist/RTEProseMirror.7561297911cca56da5dd.js +500 -0
  327. package/src/legacy/tool-ui/src/main/webapp/dist/RTEProseMirror.7561297911cca56da5dd.js.LICENSE.txt +8 -0
  328. package/src/legacy/tool-ui/src/main/webapp/dist/RegionMap.63f3b2303ab369a05073.js +1 -0
  329. package/src/legacy/tool-ui/src/main/webapp/dist/TimedContent.4bb4dc83ffbe4019dd7b.js +1 -0
  330. package/src/legacy/tool-ui/src/main/webapp/dist/VideoEditor.11c89dda5cf125738a33.js +2 -0
  331. package/src/legacy/tool-ui/src/main/webapp/dist/VideoEditor.11c89dda5cf125738a33.js.LICENSE.txt +23 -0
  332. package/src/legacy/tool-ui/src/main/webapp/dist/c6e9c007f41bd4d26c20.png +1 -0
  333. package/src/legacy/tool-ui/src/main/webapp/dist/iframeResizer.contentWindow.map +1 -0
  334. package/src/legacy/tool-ui/src/main/webapp/dist/iframeResizer.contentWindow.min.js +2 -0
  335. package/src/legacy/tool-ui/src/main/webapp/dist/iframeResizer.contentWindow.min.js.LICENSE.txt +7 -0
  336. package/src/legacy/tool-ui/src/main/webapp/dist/lucide.woff2 +0 -0
  337. package/src/legacy/tool-ui/src/main/webapp/dist/preview.d46d98e5ca9dba0a0f5a.js +1 -0
  338. package/src/legacy/tool-ui/src/main/webapp/dist/v4.63bc3566a89786faeb89.js +92 -0
  339. package/src/legacy/tool-ui/src/main/webapp/dist/v4.63bc3566a89786faeb89.js.LICENSE.txt +71 -0
  340. package/src/legacy/tool-ui/src/main/webapp/dist/v4.a6f53058dbb04a69aa5c.css +3 -0
  341. package/src/legacy/tool-ui/src/main/webapp/dist/v5.5e3fdf0f0b20b4e3c170.css +5 -0
  342. package/src/legacy/tool-ui/src/main/webapp/dist/v5.702238fcabd666eba152.js +92 -0
  343. package/src/legacy/tool-ui/src/main/webapp/dist/v5.702238fcabd666eba152.js.LICENSE.txt +78 -0
  344. package/dist/storybook/assets/Icon.stories-CpziAhae.js +0 -264
  345. package/dist/storybook/assets/ReadyMixin-Cw2Dfbu2.js +0 -1
  346. package/dist/storybook/assets/if-defined-B1RdczOE.js +0 -1
  347. package/dist/storybook/assets/iframe-bJgLXZKK.css +0 -1
@@ -0,0 +1,447 @@
1
+ import{g as C,x as S}from"./iframe-D5Uwm8Zd.js";import{o as E}from"./if-defined-C1_PRAyA.js";import{o as x}from"./style-map-Cy6U2K_U.js";import"./preload-helper-PPVm8Dsz.js";const{events:B,args:U,argTypes:c}=C("btu-upload"),F=e=>{const o={};return e.dropzoneBg&&(o["--upload-dropzone-bg"]=e.dropzoneBg),e.dropzoneBorderColor&&(o["--upload-dropzone-border-color"]=e.dropzoneBorderColor),e.dropzoneBorderRadius&&(o["--upload-dropzone-border-radius"]=e.dropzoneBorderRadius),e.dropzoneHoverBg&&(o["--upload-dropzone-hover-bg"]=e.dropzoneHoverBg),e.dropzoneHoverBorderColor&&(o["--upload-dropzone-hover-border-color"]=e.dropzoneHoverBorderColor),e.dropzoneFocusRingColor&&(o["--upload-dropzone-focus-ring-color"]=e.dropzoneFocusRingColor),e.itemBg&&(o["--upload-item-bg"]=e.itemBg),e.itemBorderColor&&(o["--upload-item-border-color"]=e.itemBorderColor),e.itemActiveBorderColor&&(o["--upload-item-active-border-color"]=e.itemActiveBorderColor),e.itemCompleteBorderColor&&(o["--upload-item-complete-border-color"]=e.itemCompleteBorderColor),e.itemErrorBg&&(o["--upload-item-error-bg"]=e.itemErrorBg),e.itemErrorBorderColor&&(o["--upload-item-error-border-color"]=e.itemErrorBorderColor),o},T={title:"Components/Upload",component:"btu-upload",tags:["autodocs"],parameters:{docs:{subtitle:"btu-upload",description:{component:`
2
+ A file upload component with drop zone and file list.
3
+
4
+ The component is **presentation + file-selection only**. It handles file browsing
5
+ (hidden \`<input type="file">\`), drag-and-drop reception, client-side validation
6
+ (type, size, count), and rendering the file list with progress bars.
7
+
8
+ It does **not** perform network requests. The consumer listens for events, performs
9
+ their own upload (XHR, fetch, etc.), and drives state back into the component
10
+ via imperative methods.
11
+
12
+ <h3>Consumer API:</h3>
13
+ <ul>
14
+ <li><code>setFileProgress(id, percent)</code> — Update progress bar (0-100)</li>
15
+ <li><code>setFileStatus(id, status, message?)</code> — Set 'uploading', 'complete', or 'error'</li>
16
+ <li><code>setFileSymbol(id, symbol)</code> — Override file icon</li>
17
+ <li><code>removeFile(id)</code> — Remove a file programmatically</li>
18
+ <li><code>getFiles()</code> — Get snapshot of all files and their states</li>
19
+ </ul>
20
+
21
+ <h3>Events:</h3>
22
+ <ul>
23
+ <li><code>btu-upload-file-added</code> — File passed validation, ready for upload</li>
24
+ <li><code>btu-upload-file-removed</code> — File removed by user or programmatically</li>
25
+ <li><code>btu-upload-file-retry</code> — User clicked "Try again" on failed upload</li>
26
+ <li><code>btu-upload-file-rejected</code> — File failed client-side validation</li>
27
+ </ul>
28
+ `}},actions:{handles:B},controls:{expanded:!0}},args:{...U,accept:"","max-file-size":void 0,"max-files":void 0,disabled:!1,"no-drag":!1},argTypes:{...c,accept:{...c.accept,control:{type:"text"},description:"Accepted file types (MIME types, extensions, or comma-separated list)"},"max-file-size":{...c["max-file-size"],control:{type:"number"},description:"Maximum file size in bytes. 0 means unlimited."},"max-files":{...c["max-files"],control:{type:"number"},description:"Maximum number of files allowed. Omit for unlimited. Set to 1 for single-file mode (new selection replaces the existing file)."},disabled:{...c.disabled,control:{type:"boolean"},description:"Disables all interaction"},"no-drag":{...c["no-drag"],control:{type:"boolean"},description:"Disables drag-and-drop. File selection via click still works."},"--upload-dropzone-bg":{table:{disable:!0}},"--upload-dropzone-border-color":{table:{disable:!0}},"--upload-dropzone-border-radius":{table:{disable:!0}},"--upload-dropzone-hover-bg":{table:{disable:!0}},"--upload-dropzone-hover-border-color":{table:{disable:!0}},"--upload-dropzone-focus-ring-color":{table:{disable:!0}},"--upload-item-bg":{table:{disable:!0}},"--upload-item-border-color":{table:{disable:!0}},"--upload-item-active-border-color":{table:{disable:!0}},"--upload-item-complete-border-color":{table:{disable:!0}},"--upload-item-error-bg":{table:{disable:!0}},"--upload-item-error-border-color":{table:{disable:!0}},dropzoneBg:{name:"--upload-dropzone-bg",control:{type:"color"},description:"Drop zone background color (default: gray-25)",table:{category:"CSS Properties"}},dropzoneBorderColor:{name:"--upload-dropzone-border-color",control:{type:"color"},description:"Drop zone border color (default: gray-200)",table:{category:"CSS Properties"}},dropzoneBorderRadius:{name:"--upload-dropzone-border-radius",control:{type:"text"},description:"Drop zone border radius (default: borderRadius.lg)",table:{category:"CSS Properties"}},dropzoneHoverBg:{name:"--upload-dropzone-hover-bg",control:{type:"color"},description:"Drop zone hover background (default: gray-50)",table:{category:"CSS Properties"}},itemBg:{name:"--upload-item-bg",control:{type:"color"},description:"Item background color (default: white)",table:{category:"CSS Properties"}},itemBorderColor:{name:"--upload-item-border-color",control:{type:"color"},description:"Item border color (default: gray-200)",table:{category:"CSS Properties"}},itemErrorBg:{name:"--upload-item-error-bg",control:{type:"color"},description:"Item error background (default: error-25)",table:{category:"CSS Properties"}},itemErrorBorderColor:{name:"--upload-item-error-border-color",control:{type:"color"},description:"Item error border color (default: error-300)",table:{category:"CSS Properties"}},dropzoneHoverBorderColor:{name:"--upload-dropzone-hover-border-color",control:{type:"color"},description:"Drop zone hover border color (default: primary-300)",table:{category:"CSS Properties"}},dropzoneFocusRingColor:{name:"--upload-dropzone-focus-ring-color",control:{type:"color"},description:"Drop zone focus ring color (default: primary-100)",table:{category:"CSS Properties"}},itemActiveBorderColor:{name:"--upload-item-active-border-color",control:{type:"color"},description:"Item active/in-progress border color (default: gray-300)",table:{category:"CSS Properties"}},itemCompleteBorderColor:{name:"--upload-item-complete-border-color",control:{type:"color"},description:"Item completed border color (default: primary-500)",table:{category:"CSS Properties"}}},render:e=>{const o=F(e);return S`
29
+ <btu-upload
30
+ style=${x(o)}
31
+ accept="${e.accept||""}"
32
+ max-file-size="${e["max-file-size"]||0}"
33
+ max-files="${E(e["max-files"])}"
34
+ ?disabled="${e.disabled}"
35
+ ?no-drag="${e["no-drag"]}"
36
+ ></btu-upload>
37
+ `}},u={},m={args:{},render:e=>{const o=`upload-sim-${crypto.randomUUID().slice(0,8)}`,p=a=>{a.addEventListener("btu-upload-file-added",(s=>{const{id:r}=s.detail;let i=0;const t=Math.random()<.3;a.setFileStatus(r,"uploading");const d=setInterval(()=>{i+=Math.random()*15+5,i>=100?(i=100,clearInterval(d),t?a.setFileStatus(r,"error","Network error: connection timed out"):(a.setFileProgress(r,100),a.setFileStatus(r,"complete"))):a.setFileProgress(r,i)},300)})),a.addEventListener("btu-upload-file-retry",(s=>{const{id:r}=s.detail;let i=0;a.setFileStatus(r,"uploading"),a.setFileProgress(r,0);const t=setInterval(()=>{i+=Math.random()*20+10,i>=100?(i=100,clearInterval(t),a.setFileProgress(r,100),a.setFileStatus(r,"complete")):a.setFileProgress(r,i)},300)}))};return setTimeout(()=>{const s=document.getElementById(o)?.querySelector("btu-upload");s&&p(s)},100),S`
38
+ <div id="${o}">
39
+ <btu-upload
40
+ style=${x(F(e))}
41
+ accept="${e.accept||""}"
42
+ max-file-size="${e["max-file-size"]||0}"
43
+ max-files="${E(e["max-files"])}"
44
+ ?disabled="${e.disabled}"
45
+ ?no-drag="${e["no-drag"]}"
46
+ ></btu-upload>
47
+ </div>
48
+ `}},f={args:{accept:"image/*,application/pdf","max-file-size":5242880},render:e=>{const o=`upload-log-${crypto.randomUUID().slice(0,8)}`,p=`log-${crypto.randomUUID().slice(0,8)}`,a={"btu-upload-file-added":"text-primary-600","btu-upload-file-removed":"text-gray-600","btu-upload-file-retry":"text-warning-600","btu-upload-file-rejected":"text-error-600","btu-upload-file-completed":"text-success-600"},s=i=>i.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),r=(i,t,d=1)=>{let l=0;const n=Math.random()<d;i.setFileStatus(t,"uploading");const $=setInterval(()=>{l+=Math.random()*15+5,l>=100?(clearInterval($),n?i.setFileStatus(t,"error","Simulated network error"):(i.setFileProgress(t,100),i.setFileStatus(t,"complete"))):i.setFileProgress(t,l)},300)};return setTimeout(()=>{const t=document.getElementById(o)?.querySelector("btu-upload"),d=document.getElementById(p);if(!t||!d)return;const l=(n,$)=>{d.querySelector(".log-placeholder")?.remove();const I=document.createElement("div");I.className="flex gap-3 py-1 border-b border-gray-200 last:border-b-0";const k=new Date().toLocaleTimeString("en-US",{hour12:!1}),w=a[n]??"";I.innerHTML=`
49
+ <span class="shrink-0 text-gray-400">${k}</span>
50
+ <code class="shrink-0 font-semibold ${w}">${n}</code>
51
+ <span class="truncate text-gray-700">${s(JSON.stringify($))}</span>
52
+ `,d.prepend(I)};t.addEventListener("btu-upload-file-added",(n=>{l("btu-upload-file-added",{id:n.detail.id,name:n.detail.file.name,size:n.detail.file.size}),r(t,n.detail.id)})),t.addEventListener("btu-upload-file-removed",(n=>{l("btu-upload-file-removed",{id:n.detail.id,name:n.detail.file.name})})),t.addEventListener("btu-upload-file-retry",(n=>{l("btu-upload-file-retry",{id:n.detail.id,name:n.detail.file.name}),r(t,n.detail.id,0)})),t.addEventListener("btu-upload-file-rejected",(n=>{l("btu-upload-file-rejected",{name:n.detail.file.name,reason:n.detail.reason,size:n.detail.file.size})})),t.addEventListener("btu-upload-file-completed",(n=>{l("btu-upload-file-completed",{id:n.detail.id,name:n.detail.file.name})}))},100),S`
53
+ <div id="${o}" class="flex flex-col gap-4">
54
+ <btu-upload
55
+ style=${x(F(e))}
56
+ accept="${e.accept||""}"
57
+ max-file-size="${e["max-file-size"]||0}"
58
+ max-files="${E(e["max-files"])}"
59
+ ?disabled="${e.disabled}"
60
+ ?no-drag="${e["no-drag"]}"
61
+ ></btu-upload>
62
+ <div class="rounded-md border border-gray-200 bg-gray-25 p-4">
63
+ <div class="mb-2 text-xs font-semibold uppercase tracking-wider text-gray-500">Event Log</div>
64
+ <div id="${p}" class="max-h-64 overflow-y-auto font-mono text-xs">
65
+ <div class="log-placeholder italic text-gray-400">No events yet. Drop files or click to upload.</div>
66
+ </div>
67
+ </div>
68
+ </div>
69
+ `},parameters:{docs:{description:{story:'Live log of all five public events: `btu-upload-file-added`, `btu-upload-file-removed`, `btu-upload-file-retry`, `btu-upload-file-rejected`, `btu-upload-file-completed`. Accepts images and PDFs up to 5 MB — drop a `.txt` file or an oversized PDF to trigger `rejected`. Added files always fail on first attempt (surfacing the "Try again" retry UX), and the retry always succeeds — so every upload exercises the full lifecycle: added → error → retry → completed.'}}}},g={render:e=>{const o=`upload-files-${crypto.randomUUID().slice(0,8)}`;return setTimeout(()=>{const a=document.getElementById(o)?.querySelector("btu-upload");a&&requestAnimationFrame(()=>{const s=[{name:"photo-vacation.jpg",type:"image/jpeg",size:42e5,status:"complete"},{name:"quarterly-report.pdf",type:"application/pdf",size:16e6,status:"uploading",progress:40},{name:"intro-video.mp4",type:"video/mp4",size:208e6,status:"error",error:"Upload failed — server returned 503"}];for(const r of s){const i=new File([""],r.name,{type:r.type});Object.defineProperty(i,"size",{value:r.size});const t=crypto.randomUUID().slice(0,8),d={id:t,file:i,status:"pending",progress:0},l=a;l._files.set(t,d),l._milestones.set(t,new Set),l._renderItem(d),l.requestUpdate(),r.status==="complete"?a.setFileStatus(t,"complete"):r.status==="error"?a.setFileStatus(t,"error",r.error):r.status==="uploading"&&a.setFileProgress(t,r.progress??0)}})},200),S`
70
+ <div id="${o}">
71
+ <btu-upload style=${x(F(e))}></btu-upload>
72
+ </div>
73
+ `}},b={args:{"max-files":1},parameters:{docs:{description:{story:'With `max-files="1"`, selecting a new file silently replaces the existing one. Only one file can be present at a time.'}}}},y={args:{accept:"image/*","max-file-size":5242880,"max-files":3},parameters:{docs:{description:{story:"Demonstrates client-side validation. Only images are accepted, with a 5 MB size limit and a maximum of 3 files. The drop zone hides when the limit is reached. Rejected files fire `btu-upload-file-rejected` events."}}}},v={args:{disabled:!0},parameters:{docs:{description:{story:"A grayed-out drop zone with muted text. File selection, drag-and-drop, and all action buttons are blocked."}}}},h={args:{"no-drag":!0},parameters:{docs:{description:{story:'With `no-drag`, drag-and-drop is disabled. Users can still select files by clicking the drop zone or the "select" link.'}}}},z={args:{},render:e=>S`
74
+ <btu-upload
75
+ style=${x({"--upload-dropzone-bg":"oklch(96% 0.02 260)","--upload-dropzone-border-color":"oklch(80% 0.08 260)","--upload-dropzone-hover-bg":"oklch(93% 0.04 260)","--upload-dropzone-border-radius":"1rem","--upload-item-border-color":"oklch(80% 0.08 260)"})}
76
+ accept="${e.accept||""}"
77
+ max-file-size="${e["max-file-size"]||0}"
78
+ max-files="${E(e["max-files"])}"
79
+ ?disabled="${e.disabled}"
80
+ ?no-drag="${e["no-drag"]}"
81
+ ></btu-upload>
82
+ `,parameters:{docs:{description:{story:"Demonstrates theming via CSS custom properties. The drop zone uses a purple-tinted background and rounded corners, and item borders match the custom palette."}}}};u.parameters={...u.parameters,docs:{...u.parameters?.docs,source:{originalSource:"{}",...u.parameters?.docs?.source},description:{story:"Empty drop zone with all controls exposed.",...u.parameters?.docs?.description}}};m.parameters={...m.parameters,docs:{...m.parameters?.docs,source:{originalSource:`{
83
+ args: {},
84
+ render: (args: Record<string, unknown>) => {
85
+ const containerId = \`upload-sim-\${crypto.randomUUID().slice(0, 8)}\`;
86
+ const startSimulation = (uploadEl: Upload) => {
87
+ uploadEl.addEventListener('btu-upload-file-added', ((e: CustomEvent<{
88
+ id: string;
89
+ file: File;
90
+ }>) => {
91
+ const {
92
+ id
93
+ } = e.detail;
94
+ let progress = 0;
95
+ const shouldFail = Math.random() < 0.3;
96
+ uploadEl.setFileStatus(id, 'uploading');
97
+ const interval = setInterval(() => {
98
+ progress += Math.random() * 15 + 5;
99
+ if (progress >= 100) {
100
+ progress = 100;
101
+ clearInterval(interval);
102
+ if (shouldFail) {
103
+ uploadEl.setFileStatus(id, 'error', 'Network error: connection timed out');
104
+ } else {
105
+ uploadEl.setFileProgress(id, 100);
106
+ uploadEl.setFileStatus(id, 'complete');
107
+ }
108
+ } else {
109
+ uploadEl.setFileProgress(id, progress);
110
+ }
111
+ }, 300);
112
+ }) as EventListener);
113
+ uploadEl.addEventListener('btu-upload-file-retry', ((e: CustomEvent<{
114
+ id: string;
115
+ file: File;
116
+ }>) => {
117
+ const {
118
+ id
119
+ } = e.detail;
120
+ let progress = 0;
121
+ uploadEl.setFileStatus(id, 'uploading');
122
+ uploadEl.setFileProgress(id, 0);
123
+ const interval = setInterval(() => {
124
+ progress += Math.random() * 20 + 10;
125
+ if (progress >= 100) {
126
+ progress = 100;
127
+ clearInterval(interval);
128
+ uploadEl.setFileProgress(id, 100);
129
+ uploadEl.setFileStatus(id, 'complete');
130
+ } else {
131
+ uploadEl.setFileProgress(id, progress);
132
+ }
133
+ }, 300);
134
+ }) as EventListener);
135
+ };
136
+ setTimeout(() => {
137
+ const container = document.getElementById(containerId);
138
+ const uploadEl = container?.querySelector('btu-upload') as Upload | null;
139
+ if (uploadEl) startSimulation(uploadEl);
140
+ }, 100);
141
+ return html\`
142
+ <div id="\${containerId}">
143
+ <btu-upload
144
+ style=\${styleMap(cssPropStyles(args))}
145
+ accept="\${args.accept || ''}"
146
+ max-file-size="\${args['max-file-size'] || 0}"
147
+ max-files="\${ifDefined(args['max-files'] as number | undefined)}"
148
+ ?disabled="\${args.disabled}"
149
+ ?no-drag="\${args['no-drag']}"
150
+ ></btu-upload>
151
+ </div>
152
+ \`;
153
+ }
154
+ }`,...m.parameters?.docs?.source},description:{story:`Interactive demo that simulates file upload progress.
155
+
156
+ Select files to see them upload with simulated progress. Some files will randomly
157
+ fail to demonstrate the error state and retry flow.`,...m.parameters?.docs?.description}}};f.parameters={...f.parameters,docs:{...f.parameters?.docs,source:{originalSource:`{
158
+ args: {
159
+ accept: 'image/*,application/pdf',
160
+ 'max-file-size': 5_242_880 // 5 MB
161
+ },
162
+ render: (args: Record<string, unknown>) => {
163
+ const containerId = \`upload-log-\${crypto.randomUUID().slice(0, 8)}\`;
164
+ const logId = \`log-\${crypto.randomUUID().slice(0, 8)}\`;
165
+ const eventColors: Record<string, string> = {
166
+ 'btu-upload-file-added': 'text-primary-600',
167
+ 'btu-upload-file-removed': 'text-gray-600',
168
+ 'btu-upload-file-retry': 'text-warning-600',
169
+ 'btu-upload-file-rejected': 'text-error-600',
170
+ 'btu-upload-file-completed': 'text-success-600'
171
+ };
172
+ const escapeHtml = (s: string) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
173
+ const simulateUpload = (uploadEl: Upload, id: string, failChance = 1) => {
174
+ let progress = 0;
175
+ const shouldFail = Math.random() < failChance;
176
+ uploadEl.setFileStatus(id, 'uploading');
177
+ const interval = setInterval(() => {
178
+ progress += Math.random() * 15 + 5;
179
+ if (progress >= 100) {
180
+ clearInterval(interval);
181
+ if (shouldFail) {
182
+ uploadEl.setFileStatus(id, 'error', 'Simulated network error');
183
+ } else {
184
+ uploadEl.setFileProgress(id, 100);
185
+ uploadEl.setFileStatus(id, 'complete');
186
+ }
187
+ } else {
188
+ uploadEl.setFileProgress(id, progress);
189
+ }
190
+ }, 300);
191
+ };
192
+ setTimeout(() => {
193
+ const container = document.getElementById(containerId);
194
+ const uploadEl = container?.querySelector('btu-upload') as Upload | null;
195
+ const logEl = document.getElementById(logId);
196
+ if (!uploadEl || !logEl) return;
197
+ const appendLog = (name: string, detail: Record<string, unknown>) => {
198
+ logEl.querySelector('.log-placeholder')?.remove();
199
+ const entry = document.createElement('div');
200
+ entry.className = 'flex gap-3 py-1 border-b border-gray-200 last:border-b-0';
201
+ const ts = new Date().toLocaleTimeString('en-US', {
202
+ hour12: false
203
+ });
204
+ const color = eventColors[name] ?? '';
205
+ entry.innerHTML = \`
206
+ <span class="shrink-0 text-gray-400">\${ts}</span>
207
+ <code class="shrink-0 font-semibold \${color}">\${name}</code>
208
+ <span class="truncate text-gray-700">\${escapeHtml(JSON.stringify(detail))}</span>
209
+ \`;
210
+ logEl.prepend(entry);
211
+ };
212
+ uploadEl.addEventListener('btu-upload-file-added', ((e: CustomEvent<{
213
+ id: string;
214
+ file: File;
215
+ }>) => {
216
+ appendLog('btu-upload-file-added', {
217
+ id: e.detail.id,
218
+ name: e.detail.file.name,
219
+ size: e.detail.file.size
220
+ });
221
+ simulateUpload(uploadEl, e.detail.id);
222
+ }) as EventListener);
223
+ uploadEl.addEventListener('btu-upload-file-removed', ((e: CustomEvent<{
224
+ id: string;
225
+ file: File;
226
+ }>) => {
227
+ appendLog('btu-upload-file-removed', {
228
+ id: e.detail.id,
229
+ name: e.detail.file.name
230
+ });
231
+ }) as EventListener);
232
+ uploadEl.addEventListener('btu-upload-file-retry', ((e: CustomEvent<{
233
+ id: string;
234
+ file: File;
235
+ }>) => {
236
+ appendLog('btu-upload-file-retry', {
237
+ id: e.detail.id,
238
+ name: e.detail.file.name
239
+ });
240
+ simulateUpload(uploadEl, e.detail.id, 0); // retry always succeeds
241
+ }) as EventListener);
242
+ uploadEl.addEventListener('btu-upload-file-rejected', ((e: CustomEvent<{
243
+ file: File;
244
+ reason: 'type' | 'size';
245
+ }>) => {
246
+ appendLog('btu-upload-file-rejected', {
247
+ name: e.detail.file.name,
248
+ reason: e.detail.reason,
249
+ size: e.detail.file.size
250
+ });
251
+ }) as EventListener);
252
+ uploadEl.addEventListener('btu-upload-file-completed', ((e: CustomEvent<{
253
+ id: string;
254
+ file: File;
255
+ }>) => {
256
+ appendLog('btu-upload-file-completed', {
257
+ id: e.detail.id,
258
+ name: e.detail.file.name
259
+ });
260
+ }) as EventListener);
261
+ }, 100);
262
+ return html\`
263
+ <div id="\${containerId}" class="flex flex-col gap-4">
264
+ <btu-upload
265
+ style=\${styleMap(cssPropStyles(args))}
266
+ accept="\${args.accept || ''}"
267
+ max-file-size="\${args['max-file-size'] || 0}"
268
+ max-files="\${ifDefined(args['max-files'] as number | undefined)}"
269
+ ?disabled="\${args.disabled}"
270
+ ?no-drag="\${args['no-drag']}"
271
+ ></btu-upload>
272
+ <div class="rounded-md border border-gray-200 bg-gray-25 p-4">
273
+ <div class="mb-2 text-xs font-semibold uppercase tracking-wider text-gray-500">Event Log</div>
274
+ <div id="\${logId}" class="max-h-64 overflow-y-auto font-mono text-xs">
275
+ <div class="log-placeholder italic text-gray-400">No events yet. Drop files or click to upload.</div>
276
+ </div>
277
+ </div>
278
+ </div>
279
+ \`;
280
+ },
281
+ parameters: {
282
+ docs: {
283
+ description: {
284
+ story: 'Live log of all five public events: \`btu-upload-file-added\`, \`btu-upload-file-removed\`, \`btu-upload-file-retry\`, \`btu-upload-file-rejected\`, \`btu-upload-file-completed\`. Accepts images and PDFs up to 5 MB — drop a \`.txt\` file or an oversized PDF to trigger \`rejected\`. Added files always fail on first attempt (surfacing the "Try again" retry UX), and the retry always succeeds — so every upload exercises the full lifecycle: added → error → retry → completed.'
285
+ }
286
+ }
287
+ }
288
+ }`,...f.parameters?.docs?.source},description:{story:`Interactive demo with a live log of every public event fired by the component.
289
+
290
+ Drop unsupported types or oversized files to see \`btu-upload-file-rejected\` entries.
291
+ Add valid files to watch the full lifecycle: added → simulated upload → complete or
292
+ error → (optional) retry → (optional) remove.`,...f.parameters?.docs?.description}}};g.parameters={...g.parameters,docs:{...g.parameters?.docs,source:{originalSource:`{
293
+ render: (args: Record<string, unknown>) => {
294
+ const containerId = \`upload-files-\${crypto.randomUUID().slice(0, 8)}\`;
295
+ setTimeout(() => {
296
+ const container = document.getElementById(containerId);
297
+ const uploadEl = container?.querySelector('btu-upload') as Upload | null;
298
+ if (!uploadEl) return;
299
+
300
+ // Wait for the component to render
301
+ requestAnimationFrame(() => {
302
+ // Simulate adding files by programmatically triggering the internal flow
303
+ const mockFiles = [{
304
+ name: 'photo-vacation.jpg',
305
+ type: 'image/jpeg',
306
+ size: 4200000,
307
+ status: 'complete' as const
308
+ }, {
309
+ name: 'quarterly-report.pdf',
310
+ type: 'application/pdf',
311
+ size: 16000000,
312
+ status: 'uploading' as const,
313
+ progress: 40
314
+ }, {
315
+ name: 'intro-video.mp4',
316
+ type: 'video/mp4',
317
+ size: 208000000,
318
+ status: 'error' as const,
319
+ error: 'Upload failed — server returned 503'
320
+ }];
321
+ for (const mock of mockFiles) {
322
+ const file = new File([''], mock.name, {
323
+ type: mock.type
324
+ });
325
+ Object.defineProperty(file, 'size', {
326
+ value: mock.size
327
+ });
328
+
329
+ // Drive the component through its public imperative API. The parent-side
330
+ // _processFiles path wants a DataTransfer-shaped payload, which can't be
331
+ // faked here, so we reach in to add the File and then drive status via
332
+ // the public setters. This is story-only plumbing for visual QA.
333
+ const id = crypto.randomUUID().slice(0, 8);
334
+ const initial: FileState = {
335
+ id,
336
+ file,
337
+ status: 'pending',
338
+ progress: 0
339
+ };
340
+ const internals = uploadEl as unknown as {
341
+ _files: Map<string, FileState>;
342
+ _milestones: Map<string, Set<number>>;
343
+ _renderItem: (s: FileState) => void;
344
+ requestUpdate: () => void;
345
+ };
346
+ internals._files.set(id, initial);
347
+ internals._milestones.set(id, new Set());
348
+ internals._renderItem(initial);
349
+ internals.requestUpdate();
350
+ if (mock.status === 'complete') {
351
+ uploadEl.setFileStatus(id, 'complete');
352
+ } else if (mock.status === 'error') {
353
+ uploadEl.setFileStatus(id, 'error', mock.error);
354
+ } else if (mock.status === 'uploading') {
355
+ uploadEl.setFileProgress(id, mock.progress ?? 0);
356
+ }
357
+ }
358
+ });
359
+ }, 200);
360
+ return html\`
361
+ <div id="\${containerId}">
362
+ <btu-upload style=\${styleMap(cssPropStyles(args))}></btu-upload>
363
+ </div>
364
+ \`;
365
+ }
366
+ }`,...g.parameters?.docs?.source},description:{story:`Pre-seeded with files in mixed states: complete, uploading, and error.
367
+ Shows all icon variants across diverse MIME types.`,...g.parameters?.docs?.description}}};b.parameters={...b.parameters,docs:{...b.parameters?.docs,source:{originalSource:`{
368
+ args: {
369
+ 'max-files': 1
370
+ },
371
+ parameters: {
372
+ docs: {
373
+ description: {
374
+ story: 'With \`max-files="1"\`, selecting a new file silently replaces the existing one. Only one file can be present at a time.'
375
+ }
376
+ }
377
+ }
378
+ }`,...b.parameters?.docs?.source},description:{story:"Single-file mode where selecting a new file replaces the existing one.",...b.parameters?.docs?.description}}};y.parameters={...y.parameters,docs:{...y.parameters?.docs,source:{originalSource:`{
379
+ args: {
380
+ accept: 'image/*',
381
+ 'max-file-size': 5242880,
382
+ 'max-files': 3
383
+ },
384
+ parameters: {
385
+ docs: {
386
+ description: {
387
+ story: 'Demonstrates client-side validation. Only images are accepted, with a 5 MB size limit and a maximum of 3 files. The drop zone hides when the limit is reached. Rejected files fire \`btu-upload-file-rejected\` events.'
388
+ }
389
+ }
390
+ }
391
+ }`,...y.parameters?.docs?.source},description:{story:`Validation demo with restricted file types, size limit, and file count limit.
392
+
393
+ - Accepts only images (\`image/*\`)
394
+ - Max file size: 5 MB
395
+ - Max files: 3
396
+
397
+ Rejected files fire \`btu-upload-file-rejected\` events (visible in the Actions panel).`,...y.parameters?.docs?.description}}};v.parameters={...v.parameters,docs:{...v.parameters?.docs,source:{originalSource:`{
398
+ args: {
399
+ disabled: true
400
+ },
401
+ parameters: {
402
+ docs: {
403
+ description: {
404
+ story: 'A grayed-out drop zone with muted text. File selection, drag-and-drop, and all action buttons are blocked.'
405
+ }
406
+ }
407
+ }
408
+ }`,...v.parameters?.docs?.source},description:{story:"Disabled state — all interaction is blocked.",...v.parameters?.docs?.description}}};h.parameters={...h.parameters,docs:{...h.parameters?.docs,source:{originalSource:`{
409
+ args: {
410
+ 'no-drag': true
411
+ },
412
+ parameters: {
413
+ docs: {
414
+ description: {
415
+ story: 'With \`no-drag\`, drag-and-drop is disabled. Users can still select files by clicking the drop zone or the "select" link.'
416
+ }
417
+ }
418
+ }
419
+ }`,...h.parameters?.docs?.source},description:{story:"Drag-and-drop disabled — file selection via click still works.",...h.parameters?.docs?.description}}};z.parameters={...z.parameters,docs:{...z.parameters?.docs,source:{originalSource:`{
420
+ args: {},
421
+ render: (args: Record<string, unknown>) => {
422
+ const styles: Record<string, string> = {
423
+ '--upload-dropzone-bg': 'oklch(96% 0.02 260)',
424
+ '--upload-dropzone-border-color': 'oklch(80% 0.08 260)',
425
+ '--upload-dropzone-hover-bg': 'oklch(93% 0.04 260)',
426
+ '--upload-dropzone-border-radius': '1rem',
427
+ '--upload-item-border-color': 'oklch(80% 0.08 260)'
428
+ };
429
+ return html\`
430
+ <btu-upload
431
+ style=\${styleMap(styles)}
432
+ accept="\${args.accept || ''}"
433
+ max-file-size="\${args['max-file-size'] || 0}"
434
+ max-files="\${ifDefined(args['max-files'] as number | undefined)}"
435
+ ?disabled="\${args.disabled}"
436
+ ?no-drag="\${args['no-drag']}"
437
+ ></btu-upload>
438
+ \`;
439
+ },
440
+ parameters: {
441
+ docs: {
442
+ description: {
443
+ story: 'Demonstrates theming via CSS custom properties. The drop zone uses a purple-tinted background and rounded corners, and item borders match the custom palette.'
444
+ }
445
+ }
446
+ }
447
+ }`,...z.parameters?.docs?.source},description:{story:"Themed upload component using CSS custom property overrides.",...z.parameters?.docs?.description}}};const j=["Default","SimulatedUpload","EventLog","WithFiles","SingleFile","Validation","Disabled","NoDrag","CSSCustomProperties"];export{z as CSSCustomProperties,u as Default,v as Disabled,f as EventLog,h as NoDrag,m as SimulatedUpload,b as SingleFile,y as Validation,g as WithFiles,j as __namedExportsOrder,T as default};
@@ -0,0 +1,167 @@
1
+ import{g as y,x as c}from"./iframe-D5Uwm8Zd.js";import"./preload-helper-PPVm8Dsz.js";const{events:b,args:f,argTypes:h}=y("btu-upload-item"),e=r=>{const l=`upload-item-${crypto.randomUUID().slice(0,8)}`;return setTimeout(()=>{const m=document.getElementById(l)?.querySelector("btu-upload-item");if(!m)return;const u=new File([""],r.name,{type:r.mimeType??""});Object.defineProperty(u,"size",{value:r.size??0});const p=r.status??"uploading",d={id:crypto.randomUUID().slice(0,8),file:u,symbol:r.symbol},g=p==="pending"?{...d,status:"pending",progress:0}:p==="complete"?{...d,status:"complete",progress:100}:p==="error"?{...d,status:"error",progress:r.progress??0,errorMessage:r.errorMessage??""}:{...d,status:"uploading",progress:r.progress??0};m._configure(g)},50),c`<div id="${l}" style="max-width: 480px;"><btu-upload-item></btu-upload-item></div>`},k={title:"Components/Upload/Upload Item",component:"btu-upload-item",tags:["autodocs"],parameters:{docs:{subtitle:"Individual file row rendered inside btu-upload",description:{component:`
2
+ \`btu-upload-item\` renders a single file's state inside a \`btu-upload\` file list. It is an **internal sub-component** — consumers should not create, query, or modify items directly. All interaction goes through \`btu-upload\` methods (\`setFileProgress\`, \`setFileStatus\`, \`setFileSymbol\`, \`removeFile\`).
3
+
4
+ These stories exist for design documentation and visual QA of each status state in isolation. In practice, items are always created, configured, and destroyed by their parent \`btu-upload\`.
5
+
6
+ <h3>Visual States:</h3>
7
+ <ul>
8
+ <li><strong>Uploading / Pending</strong> — gray-300 border, progress bar visible, trash button</li>
9
+ <li><strong>Complete</strong> — primary-500 border, progress at 100%, green checkmark badge</li>
10
+ <li><strong>Error</strong> — error-25 background, error-300 border, "Upload failed…" text, original filename, "Try again" link, trash button</li>
11
+ </ul>
12
+
13
+ <h3>Icon Resolution:</h3>
14
+ <p>Icons auto-resolve from MIME type: <code>image/*</code> → <code>image</code>, <code>video/*</code> → <code>film</code>, document types → <code>file</code>, fallback → <code>upload-cloud</code>. Overridable per-file via <code>btu-upload.setFileSymbol(id, symbol)</code>.</p>
15
+
16
+ <h3>Internal Events:</h3>
17
+ <ul>
18
+ <li><code>btu-upload-item-remove</code> — bubbles to parent \`btu-upload\`, which surfaces it as the public <code>btu-upload-file-removed</code> event</li>
19
+ <li><code>btu-upload-item-retry</code> — bubbles to parent \`btu-upload\`, which surfaces it as the public <code>btu-upload-file-retry</code> event</li>
20
+ </ul>
21
+ `}},actions:{handles:b},controls:{expanded:!0}},args:{...f},argTypes:{...h}},t={render:()=>e({name:"quarterly-report.pdf",mimeType:"application/pdf",size:16e6,status:"uploading",progress:40}),parameters:{docs:{description:{story:"The default in-progress state — gray border, linear progress bar with percentage label, and a trash button for cancelling."}}}},s={render:()=>e({name:"draft-notes.txt",mimeType:"text/plain",size:2400,status:"pending",progress:0}),parameters:{docs:{description:{story:"Rendered immediately after a file is added, before the consumer has started transferring. Visually identical to the uploading state at 0%."}}}},o={render:()=>e({name:"photo-vacation.jpg",mimeType:"image/jpeg",size:42e5,status:"complete",progress:100}),parameters:{docs:{description:{story:'Success state — primary-500 border, gray progress track, and a success-tinted emphasize icon with a one-shot pulse animation. Consumer triggers via `setFileStatus(id, "complete")`.'}}}},a={render:()=>e({name:"intro-video.mp4",mimeType:"video/mp4",size:208e6,status:"error",errorMessage:"Upload failed — server returned 503"}),parameters:{docs:{description:{story:'Error state — error-tinted background and border, error icon color, plus a "Try again" link that fires `btu-upload-item-retry` (surfaced as `btu-upload-file-retry` by the parent).'}}}},n={render:()=>c`
22
+ <div class="flex flex-col gap-4">
23
+ ${e({name:"uploading.pdf",mimeType:"application/pdf",size:24e5,status:"uploading",progress:62})}
24
+ ${e({name:"complete.jpg",mimeType:"image/jpeg",size:11e5,status:"complete",progress:100})}
25
+ ${e({name:"failed.mp4",mimeType:"video/mp4",size:64e6,status:"error",errorMessage:"Upload failed — network unreachable"})}
26
+ </div>
27
+ `,parameters:{docs:{description:{story:"Side-by-side comparison of the three terminal states: uploading, complete, error."}}}},i={render:()=>c`
28
+ <div class="flex flex-col gap-4">
29
+ ${e({name:"photo.jpg",mimeType:"image/jpeg",size:84e4,status:"uploading",progress:30})}
30
+ ${e({name:"clip.mp4",mimeType:"video/mp4",size:32e6,status:"uploading",progress:30})}
31
+ ${e({name:"contract.pdf",mimeType:"application/pdf",size:12e5,status:"uploading",progress:30})}
32
+ ${e({name:"binary.bin",mimeType:"application/octet-stream",size:5e6,status:"uploading",progress:30})}
33
+ </div>
34
+ `,parameters:{docs:{description:{story:"Icon auto-resolution by MIME type: `image/*` → `image`, `video/*` → `film`, document types → `file`, everything else → `upload-cloud`."}}}};t.parameters={...t.parameters,docs:{...t.parameters?.docs,source:{originalSource:`{
35
+ render: () => renderMockItem({
36
+ name: 'quarterly-report.pdf',
37
+ mimeType: 'application/pdf',
38
+ size: 16_000_000,
39
+ status: 'uploading',
40
+ progress: 40
41
+ }),
42
+ parameters: {
43
+ docs: {
44
+ description: {
45
+ story: 'The default in-progress state — gray border, linear progress bar with percentage label, and a trash button for cancelling.'
46
+ }
47
+ }
48
+ }
49
+ }`,...t.parameters?.docs?.source},description:{story:"An upload item mid-transfer with a visible progress bar and remove button.",...t.parameters?.docs?.description}}};s.parameters={...s.parameters,docs:{...s.parameters?.docs,source:{originalSource:`{
50
+ render: () => renderMockItem({
51
+ name: 'draft-notes.txt',
52
+ mimeType: 'text/plain',
53
+ size: 2400,
54
+ status: 'pending',
55
+ progress: 0
56
+ }),
57
+ parameters: {
58
+ docs: {
59
+ description: {
60
+ story: 'Rendered immediately after a file is added, before the consumer has started transferring. Visually identical to the uploading state at 0%.'
61
+ }
62
+ }
63
+ }
64
+ }`,...s.parameters?.docs?.source},description:{story:"A freshly-added item awaiting its first progress update.",...s.parameters?.docs?.description}}};o.parameters={...o.parameters,docs:{...o.parameters?.docs,source:{originalSource:`{
65
+ render: () => renderMockItem({
66
+ name: 'photo-vacation.jpg',
67
+ mimeType: 'image/jpeg',
68
+ size: 4_200_000,
69
+ status: 'complete',
70
+ progress: 100
71
+ }),
72
+ parameters: {
73
+ docs: {
74
+ description: {
75
+ story: 'Success state — primary-500 border, gray progress track, and a success-tinted emphasize icon with a one-shot pulse animation. Consumer triggers via \`setFileStatus(id, "complete")\`.'
76
+ }
77
+ }
78
+ }
79
+ }`,...o.parameters?.docs?.source},description:{story:"A finished upload — 100% progress with a green checkmark badge.",...o.parameters?.docs?.description}}};a.parameters={...a.parameters,docs:{...a.parameters?.docs,source:{originalSource:`{
80
+ render: () => renderMockItem({
81
+ name: 'intro-video.mp4',
82
+ mimeType: 'video/mp4',
83
+ size: 208_000_000,
84
+ status: 'error',
85
+ errorMessage: 'Upload failed — server returned 503'
86
+ }),
87
+ parameters: {
88
+ docs: {
89
+ description: {
90
+ story: 'Error state — error-tinted background and border, error icon color, plus a "Try again" link that fires \`btu-upload-item-retry\` (surfaced as \`btu-upload-file-retry\` by the parent).'
91
+ }
92
+ }
93
+ }
94
+ }`,...a.parameters?.docs?.source},description:{story:'A failed upload with error message and "Try again" link.',...a.parameters?.docs?.description}}};n.parameters={...n.parameters,docs:{...n.parameters?.docs,source:{originalSource:`{
95
+ render: () => html\`
96
+ <div class="flex flex-col gap-4">
97
+ \${renderMockItem({
98
+ name: 'uploading.pdf',
99
+ mimeType: 'application/pdf',
100
+ size: 2_400_000,
101
+ status: 'uploading',
102
+ progress: 62
103
+ })}
104
+ \${renderMockItem({
105
+ name: 'complete.jpg',
106
+ mimeType: 'image/jpeg',
107
+ size: 1_100_000,
108
+ status: 'complete',
109
+ progress: 100
110
+ })}
111
+ \${renderMockItem({
112
+ name: 'failed.mp4',
113
+ mimeType: 'video/mp4',
114
+ size: 64_000_000,
115
+ status: 'error',
116
+ errorMessage: 'Upload failed — network unreachable'
117
+ })}
118
+ </div>
119
+ \`,
120
+ parameters: {
121
+ docs: {
122
+ description: {
123
+ story: 'Side-by-side comparison of the three terminal states: uploading, complete, error.'
124
+ }
125
+ }
126
+ }
127
+ }`,...n.parameters?.docs?.source},description:{story:"Each status rendered side by side for visual comparison.",...n.parameters?.docs?.description}}};i.parameters={...i.parameters,docs:{...i.parameters?.docs,source:{originalSource:`{
128
+ render: () => html\`
129
+ <div class="flex flex-col gap-4">
130
+ \${renderMockItem({
131
+ name: 'photo.jpg',
132
+ mimeType: 'image/jpeg',
133
+ size: 840_000,
134
+ status: 'uploading',
135
+ progress: 30
136
+ })}
137
+ \${renderMockItem({
138
+ name: 'clip.mp4',
139
+ mimeType: 'video/mp4',
140
+ size: 32_000_000,
141
+ status: 'uploading',
142
+ progress: 30
143
+ })}
144
+ \${renderMockItem({
145
+ name: 'contract.pdf',
146
+ mimeType: 'application/pdf',
147
+ size: 1_200_000,
148
+ status: 'uploading',
149
+ progress: 30
150
+ })}
151
+ \${renderMockItem({
152
+ name: 'binary.bin',
153
+ mimeType: 'application/octet-stream',
154
+ size: 5_000_000,
155
+ status: 'uploading',
156
+ progress: 30
157
+ })}
158
+ </div>
159
+ \`,
160
+ parameters: {
161
+ docs: {
162
+ description: {
163
+ story: 'Icon auto-resolution by MIME type: \`image/*\` → \`image\`, \`video/*\` → \`film\`, document types → \`file\`, everything else → \`upload-cloud\`.'
164
+ }
165
+ }
166
+ }
167
+ }`,...i.parameters?.docs?.source},description:{story:"One item per MIME-to-icon mapping to verify `resolveFileSymbol()` output.",...i.parameters?.docs?.description}}};const z=["Uploading","Pending","Complete","Error","AllStates","IconVariants"];export{n as AllStates,o as Complete,a as Error,i as IconVariants,s as Pending,t as Uploading,z as __namedExportsOrder,k as default};
@@ -1,4 +1,4 @@
1
- import{S as U}from"./blocks-dP2DwISI.js";import{e as X,f as _,E as B,r as j,x as A}from"./iframe-DloIUNZz.js";import"./preload-helper-PPVm8Dsz.js";const C=()=>new J;class J{}const w=new WeakMap,k=X(class extends _{render(e){return B}update(e,[o]){const t=o!==this.G;return t&&this.G!==void 0&&this.rt(void 0),(t||this.lt!==this.ct)&&(this.G=o,this.ht=e.options?.host,this.rt(this.ct=e.element)),B}rt(e){if(this.isConnected||(e=void 0),typeof this.G=="function"){const o=this.ht??globalThis;let t=w.get(o);t===void 0&&(t=new WeakMap,w.set(o,t)),t.get(this.G)!==void 0&&this.G.call(this.ht,void 0),t.set(this.G,e),e!==void 0&&this.G.call(this.ht,e)}else this.G.value=e}get lt(){return typeof this.G=="function"?w.get(this.ht??globalThis)?.get(this.G):this.G?.value}disconnected(){this.lt===this.ct&&this.rt(void 0)}reconnected(){this.rt(this.ct)}}),ee={title:"Welcome",tags:["autodocs","!dev"],parameters:{layout:"fullscreen",controls:{disable:!0},actions:{disable:!0},options:{showPanel:!1},docs:{page:()=>j.createElement("div",{className:"welcome-docs"},j.createElement(U))}}},$=[[13,52,158],[19,183,158],[99,43,176],[95,233,208],[240,67,62],[83,36,148]],d=(e,o)=>e+Math.random()*(o-e),M=e=>e[Math.floor(Math.random()*e.length)];function I(e,o){if(matchMedia("(prefers-reduced-motion: reduce)").matches)return;const t=e.getContext("2d"),l=Array.from({length:3},()=>({x:0,y:0,rgb:M($),opacity:0,radius:d(250,350)}));let h=null;function O(){const s=5*devicePixelRatio,n=Object.assign(document.createElement("canvas"),{width:s,height:s}),r=n.getContext("2d");r.fillStyle="#000",r.arc(s/2,s/2,1.6*devicePixelRatio,0,Math.PI*2),r.fill(),h=t.createPattern(n,"repeat")}function R(){const{width:s,height:n}=e.getBoundingClientRect();e.width=s*devicePixelRatio,e.height=n*devicePixelRatio,t.setTransform(devicePixelRatio,0,0,devicePixelRatio,0,0),O()}R(),addEventListener("resize",R);const a=o?l[0]:null;a&&(a.rgb=M($),a.radius=300),(function s(){if(!e.isConnected)return;const n=e.width/devicePixelRatio,r=e.height/devicePixelRatio;t.clearRect(0,0,n,r),a&&o&&(o.active?(a.x+=(o.tx-a.x)*.06,a.y+=(o.ty-a.y)*.06,a.opacity+=(.35-a.opacity)*.08):a.opacity+=(0-a.opacity)*.04);for(const i of l){if(i.opacity<=0)continue;const[u,p,b]=i.rgb,c=t.createRadialGradient(i.x,i.y,0,i.x,i.y,i.radius);c.addColorStop(0,`rgba(${u},${p},${b},${i.opacity})`),c.addColorStop(1,`rgba(${u},${p},${b},0)`),t.fillStyle=c,t.fillRect(i.x-i.radius,i.y-i.radius,i.radius*2,i.radius*2)}h&&(t.globalCompositeOperation="destination-in",t.fillStyle=h,t.fillRect(0,0,n,r),t.globalCompositeOperation="source-over"),requestAnimationFrame(s)})();function S(s){if(!e.isConnected)return;const{width:n,height:r}=e.getBoundingClientRect(),i=300,u=m=>m<2?{x:d(.15*n,.85*n),y:m===0?-i:r+i}:{x:m===2?-i:n+i,y:d(.15*r,.85*r)},p=Math.floor(Math.random()*4),b=(p+(Math.random()<.5?2:[1,3][Math.floor(Math.random()*2)]))%4,c=u(p),z=u(b),y=z.x-c.x,x=z.y-c.y,E=Math.hypot(y,x)||1,Y=Math.min(n,r)*d(.15,.35),D=d(1.2,2.2);s.rgb=M($),s.radius=d(250,350);let P=null;const F=d(6e3,7500);(function m(G){if(!e.isConnected)return;P??=G;const f=Math.min((G-P)/F,1),L=.5-.5*Math.cos(f*Math.PI),T=Math.sin(f*D*Math.PI)*Y;s.x=c.x+y*L+-x/E*T,s.y=c.y+x*L+y/E*T,s.opacity=.35*Math.min(f/.2,1)*Math.min((1-f)/.2,1),f<1?requestAnimationFrame(m):s.opacity=0})(performance.now())}(o?l.slice(1):l).forEach((s,n)=>setTimeout(()=>{S(s),setInterval(()=>e.isConnected&&S(s),7500)},1e3+n*2500))}const q="position:absolute;inset:0;width:100%;height:100%;pointer-events:none;",N=C(),W=C(),H=C(),v={active:!1,tx:0,ty:0},g={render:()=>(queueMicrotask(()=>{const e=N.value;e&&!e.dataset.init&&(e.dataset.init="1",I(e));const o=W.value;o&&!o.dataset.init&&(o.dataset.init="1",I(o,v));const t=H.value;t&&!t.dataset.init&&(t.dataset.init="1",t.addEventListener("mousemove",l=>{const h=t.getBoundingClientRect();v.tx=l.clientX-h.left,v.ty=l.clientY-h.top,v.active=!0}),t.addEventListener("mouseleave",()=>{v.active=!1}))}),A`
1
+ import{S as U}from"./blocks-DIrsUt2U.js";import{e as X,f as _,E as B,r as j,x as A}from"./iframe-D5Uwm8Zd.js";import"./preload-helper-PPVm8Dsz.js";const C=()=>new J;class J{}const w=new WeakMap,k=X(class extends _{render(e){return B}update(e,[o]){const t=o!==this.G;return t&&this.G!==void 0&&this.rt(void 0),(t||this.lt!==this.ct)&&(this.G=o,this.ht=e.options?.host,this.rt(this.ct=e.element)),B}rt(e){if(this.isConnected||(e=void 0),typeof this.G=="function"){const o=this.ht??globalThis;let t=w.get(o);t===void 0&&(t=new WeakMap,w.set(o,t)),t.get(this.G)!==void 0&&this.G.call(this.ht,void 0),t.set(this.G,e),e!==void 0&&this.G.call(this.ht,e)}else this.G.value=e}get lt(){return typeof this.G=="function"?w.get(this.ht??globalThis)?.get(this.G):this.G?.value}disconnected(){this.lt===this.ct&&this.rt(void 0)}reconnected(){this.rt(this.ct)}}),ee={title:"Welcome",tags:["autodocs","!dev"],parameters:{layout:"fullscreen",controls:{disable:!0},actions:{disable:!0},options:{showPanel:!1},docs:{page:()=>j.createElement("div",{className:"welcome-docs"},j.createElement(U))}}},$=[[13,52,158],[19,183,158],[99,43,176],[95,233,208],[240,67,62],[83,36,148]],d=(e,o)=>e+Math.random()*(o-e),M=e=>e[Math.floor(Math.random()*e.length)];function I(e,o){if(matchMedia("(prefers-reduced-motion: reduce)").matches)return;const t=e.getContext("2d"),l=Array.from({length:3},()=>({x:0,y:0,rgb:M($),opacity:0,radius:d(250,350)}));let h=null;function O(){const s=5*devicePixelRatio,n=Object.assign(document.createElement("canvas"),{width:s,height:s}),r=n.getContext("2d");r.fillStyle="#000",r.arc(s/2,s/2,1.6*devicePixelRatio,0,Math.PI*2),r.fill(),h=t.createPattern(n,"repeat")}function R(){const{width:s,height:n}=e.getBoundingClientRect();e.width=s*devicePixelRatio,e.height=n*devicePixelRatio,t.setTransform(devicePixelRatio,0,0,devicePixelRatio,0,0),O()}R(),addEventListener("resize",R);const a=o?l[0]:null;a&&(a.rgb=M($),a.radius=300),(function s(){if(!e.isConnected)return;const n=e.width/devicePixelRatio,r=e.height/devicePixelRatio;t.clearRect(0,0,n,r),a&&o&&(o.active?(a.x+=(o.tx-a.x)*.06,a.y+=(o.ty-a.y)*.06,a.opacity+=(.35-a.opacity)*.08):a.opacity+=(0-a.opacity)*.04);for(const i of l){if(i.opacity<=0)continue;const[u,p,b]=i.rgb,c=t.createRadialGradient(i.x,i.y,0,i.x,i.y,i.radius);c.addColorStop(0,`rgba(${u},${p},${b},${i.opacity})`),c.addColorStop(1,`rgba(${u},${p},${b},0)`),t.fillStyle=c,t.fillRect(i.x-i.radius,i.y-i.radius,i.radius*2,i.radius*2)}h&&(t.globalCompositeOperation="destination-in",t.fillStyle=h,t.fillRect(0,0,n,r),t.globalCompositeOperation="source-over"),requestAnimationFrame(s)})();function S(s){if(!e.isConnected)return;const{width:n,height:r}=e.getBoundingClientRect(),i=300,u=m=>m<2?{x:d(.15*n,.85*n),y:m===0?-i:r+i}:{x:m===2?-i:n+i,y:d(.15*r,.85*r)},p=Math.floor(Math.random()*4),b=(p+(Math.random()<.5?2:[1,3][Math.floor(Math.random()*2)]))%4,c=u(p),z=u(b),y=z.x-c.x,x=z.y-c.y,E=Math.hypot(y,x)||1,Y=Math.min(n,r)*d(.15,.35),D=d(1.2,2.2);s.rgb=M($),s.radius=d(250,350);let P=null;const F=d(6e3,7500);(function m(G){if(!e.isConnected)return;P??=G;const f=Math.min((G-P)/F,1),L=.5-.5*Math.cos(f*Math.PI),T=Math.sin(f*D*Math.PI)*Y;s.x=c.x+y*L+-x/E*T,s.y=c.y+x*L+y/E*T,s.opacity=.35*Math.min(f/.2,1)*Math.min((1-f)/.2,1),f<1?requestAnimationFrame(m):s.opacity=0})(performance.now())}(o?l.slice(1):l).forEach((s,n)=>setTimeout(()=>{S(s),setInterval(()=>e.isConnected&&S(s),7500)},1e3+n*2500))}const q="position:absolute;inset:0;width:100%;height:100%;pointer-events:none;",N=C(),W=C(),H=C(),v={active:!1,tx:0,ty:0},g={render:()=>(queueMicrotask(()=>{const e=N.value;e&&!e.dataset.init&&(e.dataset.init="1",I(e));const o=W.value;o&&!o.dataset.init&&(o.dataset.init="1",I(o,v));const t=H.value;t&&!t.dataset.init&&(t.dataset.init="1",t.addEventListener("mousemove",l=>{const h=t.getBoundingClientRect();v.tx=l.clientX-h.left,v.ty=l.clientY-h.top,v.active=!0}),t.addEventListener("mouseleave",()=>{v.active=!1}))}),A`
2
2
  <div
3
3
  ${k(H)}
4
4
  style="