@brightspot/ui 1.10.0 → 3.0.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 (264) hide show
  1. package/dist/components/action-bar/ActionBar.d.ts +163 -0
  2. package/dist/components/action-bar/ActionBar.d.ts.map +1 -0
  3. package/dist/components/action-bar/ActionBar.js +479 -0
  4. package/dist/components/action-bar/ActionBar.js.map +1 -0
  5. package/dist/components/action-bar/ActionItem.d.ts +103 -0
  6. package/dist/components/action-bar/ActionItem.d.ts.map +1 -0
  7. package/dist/components/action-bar/ActionItem.js +237 -0
  8. package/dist/components/action-bar/ActionItem.js.map +1 -0
  9. package/dist/components/avatar/AvatarGroup.d.ts +3 -0
  10. package/dist/components/avatar/AvatarGroup.d.ts.map +1 -1
  11. package/dist/components/avatar/AvatarGroup.js +3 -0
  12. package/dist/components/avatar/AvatarGroup.js.map +1 -1
  13. package/dist/components/badge/Badge.d.ts +3 -1
  14. package/dist/components/badge/Badge.d.ts.map +1 -1
  15. package/dist/components/badge/Badge.js +2 -0
  16. package/dist/components/badge/Badge.js.map +1 -1
  17. package/dist/components/button-group/ButtonGroup.d.ts +138 -0
  18. package/dist/components/button-group/ButtonGroup.d.ts.map +1 -0
  19. package/dist/components/button-group/ButtonGroup.js +436 -0
  20. package/dist/components/button-group/ButtonGroup.js.map +1 -0
  21. package/dist/components/checkbox/Checkbox.d.ts +107 -0
  22. package/dist/components/checkbox/Checkbox.d.ts.map +1 -0
  23. package/dist/components/checkbox/Checkbox.js +224 -0
  24. package/dist/components/checkbox/Checkbox.js.map +1 -0
  25. package/dist/components/circular-progress/CircularProgress.d.ts +2 -2
  26. package/dist/components/circular-progress/CircularProgress.js +2 -2
  27. package/dist/components/copy-to-clipboard/CopyToClipboard.d.ts +7 -2
  28. package/dist/components/copy-to-clipboard/CopyToClipboard.d.ts.map +1 -1
  29. package/dist/components/copy-to-clipboard/CopyToClipboard.js +10 -5
  30. package/dist/components/copy-to-clipboard/CopyToClipboard.js.map +1 -1
  31. package/dist/components/dropdown/Dropdown.d.ts +8 -6
  32. package/dist/components/dropdown/Dropdown.d.ts.map +1 -1
  33. package/dist/components/dropdown/Dropdown.js +33 -22
  34. package/dist/components/dropdown/Dropdown.js.map +1 -1
  35. package/dist/components/dropdown/DropdownItem.d.ts +28 -7
  36. package/dist/components/dropdown/DropdownItem.d.ts.map +1 -1
  37. package/dist/components/dropdown/DropdownItem.js +41 -16
  38. package/dist/components/dropdown/DropdownItem.js.map +1 -1
  39. package/dist/components/dropdown/DropdownMenu.d.ts +6 -8
  40. package/dist/components/dropdown/DropdownMenu.d.ts.map +1 -1
  41. package/dist/components/dropdown/DropdownMenu.js +22 -37
  42. package/dist/components/dropdown/DropdownMenu.js.map +1 -1
  43. package/dist/components/empty-state/EmptyState.css +4 -0
  44. package/dist/components/empty-state/EmptyState.d.ts +103 -0
  45. package/dist/components/empty-state/EmptyState.d.ts.map +1 -0
  46. package/dist/components/empty-state/EmptyState.js +209 -0
  47. package/dist/components/empty-state/EmptyState.js.map +1 -0
  48. package/dist/components/icon/Icon.d.ts +23 -10
  49. package/dist/components/icon/Icon.d.ts.map +1 -1
  50. package/dist/components/icon/Icon.js +40 -9
  51. package/dist/components/icon/Icon.js.map +1 -1
  52. package/dist/components/icon-button/IconButton.d.ts +7 -21
  53. package/dist/components/icon-button/IconButton.d.ts.map +1 -1
  54. package/dist/components/icon-button/IconButton.js +12 -18
  55. package/dist/components/icon-button/IconButton.js.map +1 -1
  56. package/dist/components/linear-progress/LinearProgress.d.ts +2 -2
  57. package/dist/components/linear-progress/LinearProgress.js +2 -2
  58. package/dist/components/pagination/Pagination.d.ts +33 -4
  59. package/dist/components/pagination/Pagination.d.ts.map +1 -1
  60. package/dist/components/pagination/Pagination.js +88 -24
  61. package/dist/components/pagination/Pagination.js.map +1 -1
  62. package/dist/components/popover/Popover.d.ts +6 -0
  63. package/dist/components/popover/Popover.d.ts.map +1 -1
  64. package/dist/components/popover/Popover.js +6 -0
  65. package/dist/components/popover/Popover.js.map +1 -1
  66. package/dist/components/switch/Switch.d.ts +5 -1
  67. package/dist/components/switch/Switch.d.ts.map +1 -1
  68. package/dist/components/switch/Switch.js +10 -6
  69. package/dist/components/switch/Switch.js.map +1 -1
  70. package/dist/components/tabs/Tab.d.ts +108 -0
  71. package/dist/components/tabs/Tab.d.ts.map +1 -0
  72. package/dist/components/tabs/Tab.js +152 -0
  73. package/dist/components/tabs/Tab.js.map +1 -0
  74. package/dist/components/tabs/Tabs.d.ts +126 -0
  75. package/dist/components/tabs/Tabs.d.ts.map +1 -0
  76. package/dist/components/tabs/Tabs.js +390 -0
  77. package/dist/components/tabs/Tabs.js.map +1 -0
  78. package/dist/components/upload/Upload.d.ts +157 -0
  79. package/dist/components/upload/Upload.d.ts.map +1 -0
  80. package/dist/components/upload/Upload.js +538 -0
  81. package/dist/components/upload/Upload.js.map +1 -0
  82. package/dist/components/upload/UploadItem.d.ts +73 -0
  83. package/dist/components/upload/UploadItem.d.ts.map +1 -0
  84. package/dist/components/upload/UploadItem.js +180 -0
  85. package/dist/components/upload/UploadItem.js.map +1 -0
  86. package/dist/components/widget/Widget.d.ts +1 -6
  87. package/dist/components/widget/Widget.d.ts.map +1 -1
  88. package/dist/components/widget/Widget.js +1 -6
  89. package/dist/components/widget/Widget.js.map +1 -1
  90. package/dist/custom-elements.json +8445 -1989
  91. package/dist/storybook/assets/ActionBar.stories-DRIVI-W2.js +408 -0
  92. package/dist/storybook/assets/ActionItem.stories-5qlgxYNB.js +203 -0
  93. package/dist/storybook/assets/{Avatar.stories-B26mRkkZ.js → Avatar.stories-B3VkhRhP.js} +2 -2
  94. package/dist/storybook/assets/{AvatarGroup.stories-J7lVGsMY.js → AvatarGroup.stories-DOfim2NY.js} +5 -5
  95. package/dist/storybook/assets/{Badge.stories-BpTIV61M.js → Badge.stories-B04VNAcc.js} +2 -2
  96. package/dist/storybook/assets/{Button-Dg-fIrzT.js → Button-CILTcGRT.js} +1 -1
  97. package/dist/storybook/assets/{Button.stories-gPKRVbxk.js → Button.stories-CzWAltrX.js} +1 -1
  98. package/dist/storybook/assets/ButtonGroup.stories-1uAJf79o.js +588 -0
  99. package/dist/storybook/assets/{Celebrate.stories-DbY-sKEe.js → Celebrate.stories-BEqj0VnW.js} +7 -7
  100. package/dist/storybook/assets/Checkbox.stories-DXAGFS0M.js +141 -0
  101. package/dist/storybook/assets/{CircularProgress.stories-DeH5JYX_.js → CircularProgress.stories-D4rftw22.js} +7 -7
  102. package/dist/storybook/assets/{ClipboardMixin.stories-C-lZ4uuw.js → ClipboardMixin.stories-z2n2HWt1.js} +31 -28
  103. package/dist/storybook/assets/{Color-6BZIO3FS-Cu6zVIuG.js → Color-6BZIO3FS-C6KyMgZz.js} +1 -1
  104. package/dist/storybook/assets/{Colors.stories-D6XYMrTD.js → Colors.stories-CX-Ny3B_.js} +1 -1
  105. package/dist/storybook/assets/{CombinedEffects.stories-jFekKTYg.js → CombinedEffects.stories-BkqtiVHp.js} +33 -33
  106. package/dist/storybook/assets/{ComponentStatesMixin-g50hRCPT.js → ComponentStatesMixin-DLd0feFg.js} +1 -1
  107. package/dist/storybook/assets/{ComponentStatesMixin.stories-D3Q5pR38.js → ComponentStatesMixin.stories-D6Yc5Jgl.js} +3 -3
  108. package/dist/storybook/assets/{CopyToClipboard.stories-COZZ1VC2.js → CopyToClipboard.stories-B-omwDDJ.js} +16 -16
  109. package/dist/storybook/assets/{Debounce.stories-Dl10LAnx.js → Debounce.stories-B2vE5QIx.js} +9 -9
  110. package/dist/storybook/assets/{DocsRenderer-LL677BLK-CFLtMbUx.js → DocsRenderer-LL677BLK-DNUlRvMg.js} +3 -3
  111. package/dist/storybook/assets/{Dropdown.stories-Drwq-0Z2.js → Dropdown.stories-_bx4WDLr.js} +95 -68
  112. package/dist/storybook/assets/EmptyState.stories-CGMbmo77.js +318 -0
  113. package/dist/storybook/assets/{Events.stories-dODeR-g-.js → Events.stories-CkQYKcoZ.js} +1 -1
  114. package/dist/storybook/assets/{Heading.stories-CH7_-_q3.js → Heading.stories-BU5Do_od.js} +1 -1
  115. package/dist/storybook/assets/{HueRipple.stories-CH1Y739k.js → HueRipple.stories-Di2zmxo3.js} +11 -11
  116. package/dist/storybook/assets/Icon.stories-Dk4ZXhhJ.js +441 -0
  117. package/dist/storybook/assets/{IconButton.stories-DuzqvcnN.js → IconButton.stories-BSCiXPXa.js} +126 -146
  118. package/dist/storybook/assets/{LinearProgress.stories-C7IdnJd3.js → LinearProgress.stories-BGxPZuni.js} +7 -7
  119. package/dist/storybook/assets/Pagination.stories-z3Zq8b4f.js +252 -0
  120. package/dist/storybook/assets/{Popover.stories-Ca1F-wrI.js → Popover.stories-C9GxWcax.js} +33 -62
  121. package/dist/storybook/assets/ReadyMixin-CQw8N6P9.js +1 -0
  122. package/dist/storybook/assets/RovingTabindexMixin.stories-ByxLBi6m.js +192 -0
  123. package/dist/storybook/assets/{Rtc.stories-BVJc1vCA.js → Rtc.stories-DQJlCXWR.js} +3 -3
  124. package/dist/storybook/assets/ScrollShadow.stories-gjTIAbUA.js +17 -0
  125. package/dist/storybook/assets/{Switch.stories-BEEHP8mD.js → Switch.stories-BEeqPZiP.js} +21 -21
  126. package/dist/storybook/assets/Tab.stories-DpB3I-WZ.js +218 -0
  127. package/dist/storybook/assets/Tabs.stories-C6mG6Xi7.js +211 -0
  128. package/dist/storybook/assets/{Throttle.stories-C4xsYeAb.js → Throttle.stories-x9tpGeQh.js} +10 -10
  129. package/dist/storybook/assets/{Tooltip.stories-Ccm4AnSv.js → Tooltip.stories-CqcLqdmc.js} +2 -2
  130. package/dist/storybook/assets/Upload.stories-CMaAbCSH.js +447 -0
  131. package/dist/storybook/assets/UploadItem.stories-GB98L3JQ.js +167 -0
  132. package/dist/storybook/assets/{Welcome.stories-Degjk-M0.js → Welcome.stories-6h9cUZ7v.js} +1 -1
  133. package/dist/storybook/assets/{Widget.stories-OKnZ9sDs.js → Widget.stories-DiA1PR6Y.js} +13 -13
  134. package/dist/storybook/assets/{WithTooltip-65CFNBJE-CXL3TyJ2.js → WithTooltip-65CFNBJE-DTsHhBb_.js} +2 -2
  135. package/dist/storybook/assets/{blocks-DLdUKG_W.js → blocks-IXdn9TGW.js} +5 -5
  136. package/dist/storybook/assets/{formatter-EIJCOSYU-29NCxjfM.js → formatter-EIJCOSYU-Cum4J6N4.js} +1 -1
  137. package/dist/storybook/assets/if-defined-CgfCxQoV.js +1 -0
  138. package/dist/storybook/assets/iframe-BgFj0b5u.css +1 -0
  139. package/dist/storybook/assets/{iframe-BqvwP3or.js → iframe-Sf9RHZFu.js} +200 -200
  140. package/dist/storybook/assets/{index-BIyTv1BF.js → index-D605PvQH.js} +1 -1
  141. package/dist/storybook/assets/onFind-C41m8c_a.js +1 -0
  142. package/dist/storybook/assets/{onFind.stories-D64-QZqf.js → onFind.stories-MOTfGlJd.js} +53 -77
  143. package/dist/storybook/assets/{onRemove.stories-BICsnIJL.js → onRemove.stories-DX58Bf6f.js} +6 -10
  144. package/dist/storybook/assets/{onVisible.stories-DpDZP9_5.js → onVisible.stories-NNFeFeD8.js} +3 -3
  145. package/dist/storybook/assets/style-map-B99QiqCo.js +1 -0
  146. package/dist/storybook/assets/{syntaxhighlighter-ED5Y7EFY-Bz_DuQj8.js → syntaxhighlighter-ED5Y7EFY-BqQ-o9mS.js} +1 -1
  147. package/dist/storybook/box-illustration.svg +51 -0
  148. package/dist/storybook/cloud-illustration.svg +49 -0
  149. package/dist/storybook/docs-illustration.svg +92 -0
  150. package/dist/storybook/iframe.html +2 -2
  151. package/dist/storybook/index.json +1 -1
  152. package/dist/storybook/project.json +1 -1
  153. package/dist/tailwind-plugin-action-bar.d.ts +2 -0
  154. package/dist/tailwind-plugin-action-bar.d.ts.map +1 -0
  155. package/dist/tailwind-plugin-action-bar.js +120 -0
  156. package/dist/tailwind-plugin-action-bar.js.map +1 -0
  157. package/dist/tailwind-plugin-action-bar.ts +134 -0
  158. package/dist/tailwind-plugin-badge.js +5 -6
  159. package/dist/tailwind-plugin-badge.js.map +1 -1
  160. package/dist/tailwind-plugin-badge.ts +5 -6
  161. package/dist/tailwind-plugin-button-group.d.ts +2 -0
  162. package/dist/tailwind-plugin-button-group.d.ts.map +1 -0
  163. package/dist/tailwind-plugin-button-group.js +215 -0
  164. package/dist/tailwind-plugin-button-group.js.map +1 -0
  165. package/dist/tailwind-plugin-button-group.ts +238 -0
  166. package/dist/tailwind-plugin-button.js +2 -1
  167. package/dist/tailwind-plugin-button.js.map +1 -1
  168. package/dist/tailwind-plugin-button.ts +2 -1
  169. package/dist/tailwind-plugin-checkbox.d.ts +2 -0
  170. package/dist/tailwind-plugin-checkbox.d.ts.map +1 -0
  171. package/dist/tailwind-plugin-checkbox.js +246 -0
  172. package/dist/tailwind-plugin-checkbox.js.map +1 -0
  173. package/dist/tailwind-plugin-checkbox.ts +281 -0
  174. package/dist/tailwind-plugin-empty-state.d.ts +2 -0
  175. package/dist/tailwind-plugin-empty-state.d.ts.map +1 -0
  176. package/dist/tailwind-plugin-empty-state.js +113 -0
  177. package/dist/tailwind-plugin-empty-state.js.map +1 -0
  178. package/dist/tailwind-plugin-empty-state.ts +124 -0
  179. package/dist/tailwind-plugin-icon.js +122 -18
  180. package/dist/tailwind-plugin-icon.js.map +1 -1
  181. package/dist/tailwind-plugin-icon.ts +131 -18
  182. package/dist/tailwind-plugin-loader.js +3 -3
  183. package/dist/tailwind-plugin-loader.ts +3 -3
  184. package/dist/tailwind-plugin-pagination.js +13 -23
  185. package/dist/tailwind-plugin-pagination.js.map +1 -1
  186. package/dist/tailwind-plugin-pagination.ts +15 -25
  187. package/dist/tailwind-plugin-tabs.d.ts +2 -0
  188. package/dist/tailwind-plugin-tabs.d.ts.map +1 -0
  189. package/dist/tailwind-plugin-tabs.js +158 -0
  190. package/dist/tailwind-plugin-tabs.js.map +1 -0
  191. package/dist/tailwind-plugin-tabs.ts +169 -0
  192. package/dist/tailwind-plugin-upload.d.ts +2 -0
  193. package/dist/tailwind-plugin-upload.d.ts.map +1 -0
  194. package/dist/tailwind-plugin-upload.js +322 -0
  195. package/dist/tailwind-plugin-upload.js.map +1 -0
  196. package/dist/tailwind-plugin-upload.ts +362 -0
  197. package/dist/tailwind.config.d.ts.map +1 -1
  198. package/dist/tailwind.config.js +1 -0
  199. package/dist/tailwind.config.js.map +1 -1
  200. package/dist/tailwind.config.ts +1 -0
  201. package/dist/util/ClipboardMixin.d.ts +7 -2
  202. package/dist/util/ClipboardMixin.d.ts.map +1 -1
  203. package/dist/util/ClipboardMixin.js +15 -13
  204. package/dist/util/ClipboardMixin.js.map +1 -1
  205. package/dist/util/ComponentStatesMixin.d.ts +2 -1
  206. package/dist/util/ComponentStatesMixin.d.ts.map +1 -1
  207. package/dist/util/ComponentStatesMixin.js +4 -0
  208. package/dist/util/ComponentStatesMixin.js.map +1 -1
  209. package/dist/util/EventEmitterMixin.d.ts +58 -4
  210. package/dist/util/EventEmitterMixin.d.ts.map +1 -1
  211. package/dist/util/EventEmitterMixin.js +5 -2
  212. package/dist/util/EventEmitterMixin.js.map +1 -1
  213. package/dist/util/ProgressMixin.d.ts +9 -2
  214. package/dist/util/ProgressMixin.d.ts.map +1 -1
  215. package/dist/util/ProgressMixin.js +22 -18
  216. package/dist/util/ProgressMixin.js.map +1 -1
  217. package/dist/util/RovingTabindexMixin.d.ts +46 -0
  218. package/dist/util/RovingTabindexMixin.d.ts.map +1 -0
  219. package/dist/util/RovingTabindexMixin.js +83 -0
  220. package/dist/util/RovingTabindexMixin.js.map +1 -0
  221. package/dist/util/TetherLayout.d.ts.map +1 -1
  222. package/dist/util/TetherLayout.js +3 -0
  223. package/dist/util/TetherLayout.js.map +1 -1
  224. package/dist/util/TooltipMixin.d.ts.map +1 -1
  225. package/dist/util/TooltipMixin.js +5 -4
  226. package/dist/util/TooltipMixin.js.map +1 -1
  227. package/dist/util/upload.d.ts +53 -0
  228. package/dist/util/upload.d.ts.map +1 -0
  229. package/dist/util/upload.js +113 -0
  230. package/dist/util/upload.js.map +1 -0
  231. package/docs/components/ActionBar.md +77 -0
  232. package/docs/components/ActionItem.md +101 -0
  233. package/docs/components/Avatar.md +42 -12
  234. package/docs/components/AvatarGroup.md +4 -3
  235. package/docs/components/Badge.md +13 -1
  236. package/docs/components/ButtonGroup.md +91 -0
  237. package/docs/components/Checkbox.md +91 -0
  238. package/docs/components/CircularProgress.md +41 -12
  239. package/docs/components/CopyToClipboard.md +13 -11
  240. package/docs/components/Dropdown.md +51 -26
  241. package/docs/components/DropdownItem.md +44 -27
  242. package/docs/components/DropdownMenu.md +14 -14
  243. package/docs/components/EmptyState.md +75 -0
  244. package/docs/components/Icon.md +22 -14
  245. package/docs/components/IconButton.md +46 -21
  246. package/docs/components/LinearProgress.md +43 -4
  247. package/docs/components/Pagination.md +38 -34
  248. package/docs/components/Popover.md +16 -0
  249. package/docs/components/README.md +9 -0
  250. package/docs/components/Switch.md +21 -16
  251. package/docs/components/Tab.md +79 -0
  252. package/docs/components/Tabs.md +85 -0
  253. package/docs/components/Upload.md +112 -0
  254. package/docs/components/UploadItem.md +61 -0
  255. package/docs/components/Widget.md +12 -6
  256. package/package.json +4 -2
  257. package/dist/storybook/assets/Icon.stories-CPjM-jTU.js +0 -264
  258. package/dist/storybook/assets/Pagination.stories-C4cLjS_9.js +0 -272
  259. package/dist/storybook/assets/ReadyMixin-DNZ5dCsZ.js +0 -1
  260. package/dist/storybook/assets/ScrollShadow.stories-C3W5o9ZW.js +0 -17
  261. package/dist/storybook/assets/if-defined-BZFPaJjl.js +0 -1
  262. package/dist/storybook/assets/iframe-C5bIZMJ5.css +0 -1
  263. package/dist/storybook/assets/onFind-1l3EPW-I.js +0 -1
  264. package/dist/storybook/assets/style-map-CBrSnxRe.js +0 -1
@@ -0,0 +1,390 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html } from 'lit';
8
+ import { property } from 'lit/decorators.js';
9
+ import { EventEmitterMixin } from '../../util/EventEmitterMixin.js';
10
+ import { ReadyMixin } from '../../util/ReadyMixin.js';
11
+ import { RovingTabindexMixin } from '../../util/RovingTabindexMixin.js';
12
+ import '../badge/Badge.js';
13
+ import '../dropdown/Dropdown.js';
14
+ import '../dropdown/DropdownItem.js';
15
+ import '../dropdown/DropdownMenu.js';
16
+ import '../icon/Icon.js';
17
+ /**
18
+ * A container component for managing a group of tabs.
19
+ *
20
+ * Provides selection state management, size propagation to child tabs,
21
+ * and keyboard navigation following the WAI-ARIA Tabs pattern.
22
+ *
23
+ * When a tab becomes active, direct sibling elements that share the same
24
+ * `name` value are shown; other siblings with a `name` attribute are
25
+ * hidden. Only direct siblings are managed — nested tab groups control their
26
+ * own panels independently.
27
+ *
28
+ * @element btu-tabs
29
+ *
30
+ * @fires {CustomEvent} btu-tabs-ready - Fired after first render and initialization
31
+ * @fires {CustomEvent<{name: string}>} btu-tabs-show - Fired when a tab becomes active
32
+ * @fires {CustomEvent<{name: string}>} btu-tabs-hide - Fired when a tab is deactivated
33
+ * @fires {CustomEvent<{name: string}>} btu-tab-change - Fired when a tab is selected (bubbles from btu-tab)
34
+ * @fires {CustomEvent} btu-tab-ready - Fired when a child tab finishes initialization (bubbles from btu-tab)
35
+ *
36
+ * @cssprop --tabs-active-color - Text and icon color of the active tab (default: gray-700)
37
+ * @cssprop --tabs-active-indicator-color - Color of the active tab underline indicator (default: primary-500 → primary-700 → primary-900 gradient)
38
+ * @cssprop --tabs-border-color - Color of the bottom border divider (default: gray-200)
39
+ * @cssprop --tabs-color - Text and icon color for all tabs (default: gray-500; active/hover tabs use gray-700)
40
+ * @cssprop --tabs-background - Background color for all tab buttons (default: transparent)
41
+ * @cssprop --tabs-container-background - Background color of the tabs container (default: theme white)
42
+ * @cssprop --tabs-hover-background - Background color of a tab on hover (default: gray-100)
43
+ * @cssprop --tabs-hover-color - Text and icon color of a tab on hover (default: gray-700)
44
+ * @cssprop --tabs-gap - Spacing between tabs (default: 1rem)
45
+ *
46
+ * @example
47
+ * ```html
48
+ * <div>
49
+ * <btu-tabs size="md" active-tab="main">
50
+ * <btu-tab name="main" label="Main"></btu-tab>
51
+ * <btu-tab name="seo" label="SEO"></btu-tab>
52
+ * <btu-tab name="overrides" label="Overrides"></btu-tab>
53
+ * </btu-tabs>
54
+ * <div name="main" role="tabpanel">Main content</div>
55
+ * <div name="seo" role="tabpanel">SEO content</div>
56
+ * <div name="overrides" role="tabpanel">Overrides content</div>
57
+ * </div>
58
+ * ```
59
+ */
60
+ export default class Tabs extends RovingTabindexMixin(EventEmitterMixin(ReadyMixin(LitElement))) {
61
+ constructor() {
62
+ super(...arguments);
63
+ /**
64
+ * Size variant applied to all child tabs.
65
+ * @attr
66
+ */
67
+ this.size = 'md';
68
+ /**
69
+ * Layout variant.
70
+ * - 'full': tabs scroll horizontally when they overflow (default)
71
+ * - 'menu': all tabs are hidden; the active tab label and a chevron dropdown are shown instead
72
+ * @attr
73
+ */
74
+ this.variant = 'full';
75
+ /** @internal */
76
+ this.initialClasses = [];
77
+ /** @internal Bound event handler for cleanup */
78
+ this.boundHandleTabChange = this.handleTabChange.bind(this);
79
+ /** @internal Bound event handler for cleanup */
80
+ this.boundHandleKeyDown = this.handleKeyDown.bind(this);
81
+ /** @internal Menu variant state */
82
+ this.rafId = null;
83
+ this.menuWrapper = null;
84
+ this.menuDropdown = null;
85
+ this.menuLabel = null;
86
+ this.menuIcon = null;
87
+ this.menuErrorBadge = null;
88
+ }
89
+ static get tagName() {
90
+ return 'BTU-TABS';
91
+ }
92
+ /** @internal */
93
+ _getRovingTargets() {
94
+ const buttons = [];
95
+ for (const tab of this.getTabs()) {
96
+ if (tab.style.display === 'none')
97
+ continue;
98
+ const btn = tab.querySelector('button');
99
+ if (btn)
100
+ buttons.push(btn);
101
+ }
102
+ return buttons;
103
+ }
104
+ // Dropdown doesn't accept 'xs'; floor the tabs 'xs' size to 'sm' when forwarding.
105
+ get _dropdownSize() {
106
+ return this.size === 'xs' ? 'sm' : this.size;
107
+ }
108
+ // Menu-variant icon is always small relative to the tab label, regardless of tabs size.
109
+ get _menuIconSize() {
110
+ return this.size === 'lg' ? 'md' : 'sm';
111
+ }
112
+ connectedCallback() {
113
+ super.connectedCallback();
114
+ if (this.className) {
115
+ this.initialClasses = this.className.split(' ').filter(c => c.trim());
116
+ }
117
+ this.setAttribute('role', 'tablist');
118
+ this.addEventListener('btu-tab-change', this.boundHandleTabChange);
119
+ this.addEventListener('keydown', this.boundHandleKeyDown);
120
+ }
121
+ disconnectedCallback() {
122
+ super.disconnectedCallback();
123
+ if (this.rafId) {
124
+ cancelAnimationFrame(this.rafId);
125
+ this.rafId = null;
126
+ }
127
+ this.removeEventListener('btu-tab-change', this.boundHandleTabChange);
128
+ this.removeEventListener('keydown', this.boundHandleKeyDown);
129
+ }
130
+ createRenderRoot() {
131
+ return this;
132
+ }
133
+ willUpdate() {
134
+ this.className = [
135
+ ...this.initialClasses,
136
+ 'btu-tabs',
137
+ `btu-tabs-${this.size}`,
138
+ this.variant === 'menu' ? 'btu-tabs-menu-mode' : '',
139
+ ]
140
+ .filter(Boolean)
141
+ .join(' ');
142
+ }
143
+ firstUpdated() {
144
+ if (!this.activeTab) {
145
+ const firstEnabled = this.getTabs().find(t => !t.disabled);
146
+ if (firstEnabled)
147
+ this.activeTab = firstEnabled.name;
148
+ }
149
+ this.syncTabs();
150
+ this.syncPanels();
151
+ if (this.variant === 'menu') {
152
+ this.initMenu();
153
+ }
154
+ else {
155
+ this.emit('btu-tabs-ready');
156
+ }
157
+ }
158
+ updated(changedProperties) {
159
+ if (changedProperties.has('activeTab') && !this.activeTab) {
160
+ const firstEnabled = this.getTabs().find(t => !t.disabled);
161
+ if (firstEnabled)
162
+ this.activeTab = firstEnabled.name;
163
+ }
164
+ if (changedProperties.has('activeTab') || changedProperties.has('size')) {
165
+ this.syncTabs();
166
+ }
167
+ if (changedProperties.has('activeTab')) {
168
+ this.syncPanels();
169
+ }
170
+ if (changedProperties.has('size') && this.menuDropdown) {
171
+ this.menuDropdown.size = this._dropdownSize;
172
+ }
173
+ if (changedProperties.has('variant') && changedProperties.get('variant') !== undefined) {
174
+ this.teardownVariant(changedProperties.get('variant'));
175
+ if (this.variant === 'menu')
176
+ this.initMenu();
177
+ }
178
+ }
179
+ /** @internal Tear down a variant's DOM and state before switching to another */
180
+ teardownVariant(previous) {
181
+ if (previous === 'menu') {
182
+ this.menuWrapper?.remove();
183
+ this.menuWrapper = null;
184
+ this.menuDropdown = null;
185
+ this.menuLabel = null;
186
+ this.menuIcon = null;
187
+ this.menuErrorBadge = null;
188
+ this.getTabs().forEach(tab => tab.style.removeProperty('display'));
189
+ }
190
+ }
191
+ /** @internal */
192
+ syncTabs() {
193
+ this.getTabs().forEach(tab => {
194
+ tab.size = this.size;
195
+ tab._active = tab.name === this.activeTab;
196
+ tab._tabindex = tab.name === this.activeTab ? 0 : -1;
197
+ tab.requestUpdate();
198
+ });
199
+ if (this.variant === 'menu') {
200
+ this.syncMenuState();
201
+ }
202
+ }
203
+ /** @internal Show/hide panel elements that are direct siblings with a matching name value */
204
+ syncPanels() {
205
+ if (!this.activeTab || !this.parentElement)
206
+ return;
207
+ Array.from(this.parentElement.children).forEach(child => {
208
+ if (child === this || !(child instanceof HTMLElement))
209
+ return;
210
+ // data-tab is a deprecated fallback for compat — use name instead
211
+ const panelName = child.getAttribute('name') ?? child.dataset.tab;
212
+ if (!panelName)
213
+ return;
214
+ child.hidden = panelName !== this.activeTab;
215
+ });
216
+ }
217
+ /** @internal */
218
+ getTabs() {
219
+ return Array.from(this.querySelectorAll('btu-tab'));
220
+ }
221
+ /** @internal */
222
+ activateTab(name) {
223
+ const newTab = this.getTabs().find(t => t.name === name);
224
+ if (!newTab || newTab.disabled) {
225
+ const available = this.getTabs()
226
+ .map(t => t.name)
227
+ .filter(Boolean);
228
+ console.warn(`[btu-tabs] Tab "${name}" not found or is disabled. Available tabs: ${available.join(', ')}`);
229
+ return;
230
+ }
231
+ if (name === this.activeTab)
232
+ return;
233
+ const oldName = this.activeTab;
234
+ if (oldName) {
235
+ this.emit('btu-tabs-hide', { name: oldName });
236
+ }
237
+ this.activeTab = name;
238
+ this.emit('btu-tabs-show', { name });
239
+ this.syncTabs();
240
+ this.syncPanels();
241
+ }
242
+ /** @internal */
243
+ handleTabChange(event) {
244
+ this.activateTab(event.detail.name);
245
+ }
246
+ /** @internal Keyboard navigation following WAI-ARIA Tabs pattern */
247
+ handleKeyDown(event) {
248
+ switch (event.key) {
249
+ case 'ArrowRight':
250
+ event.preventDefault();
251
+ this._rovingNext();
252
+ break;
253
+ case 'ArrowLeft':
254
+ event.preventDefault();
255
+ this._rovingPrev();
256
+ break;
257
+ case 'Home':
258
+ event.preventDefault();
259
+ this._rovingFirst();
260
+ break;
261
+ case 'End':
262
+ event.preventDefault();
263
+ this._rovingLast();
264
+ break;
265
+ }
266
+ }
267
+ // ─── Menu variant ────────────────────────────────────────────────────────────
268
+ /** @internal */
269
+ initMenu() {
270
+ // Hide all tab buttons — they're only accessible via the dropdown
271
+ this.getTabs().forEach(tab => (tab.style.display = 'none'));
272
+ const activeTab = this.getTabs().find(t => t.name === this.activeTab);
273
+ this.menuWrapper = document.createElement('div');
274
+ const wrapper = this.menuWrapper;
275
+ wrapper.className = 'btu-tab-menu-wrapper';
276
+ this.menuIcon = document.createElement('btu-icon');
277
+ this.menuIcon.setAttribute('size', this._menuIconSize);
278
+ this.menuIcon.setAttribute('symbol', activeTab?.symbol ?? '');
279
+ this.menuIcon.hidden = !activeTab?.symbol;
280
+ this.menuLabel = document.createElement('span');
281
+ this.menuLabel.className = 'btu-tab-menu-label';
282
+ this.menuLabel.textContent = activeTab?.label ?? '';
283
+ if (activeTab?.iconPosition === 'trailing') {
284
+ wrapper.appendChild(this.menuLabel);
285
+ wrapper.appendChild(this.menuIcon);
286
+ }
287
+ else {
288
+ wrapper.appendChild(this.menuIcon);
289
+ wrapper.appendChild(this.menuLabel);
290
+ }
291
+ this.menuErrorBadge = document.createElement('btu-badge');
292
+ this.menuErrorBadge.setAttribute('size', 'sm');
293
+ this.menuErrorBadge.setAttribute('variant', 'error');
294
+ this.menuErrorBadge.textContent = '!';
295
+ this.menuErrorBadge.hidden = !activeTab?.error;
296
+ wrapper.appendChild(this.menuErrorBadge);
297
+ const dropdownMenu = document.createElement('btu-dropdown-menu');
298
+ this.menuDropdown = document.createElement('btu-dropdown');
299
+ this.menuDropdown.label = 'Tabs';
300
+ this.menuDropdown.iconOnly = true;
301
+ this.menuDropdown.noChevron = false;
302
+ this.menuDropdown.variant = 'tertiary';
303
+ this.menuDropdown.placement = 'bottom-start';
304
+ this.menuDropdown.size = this._dropdownSize;
305
+ this.menuDropdown.appendChild(dropdownMenu);
306
+ this.menuDropdown.addEventListener('btu-dropdown-item-select', (e) => {
307
+ e.stopPropagation();
308
+ const item = e.target.closest('btu-dropdown-item');
309
+ const name = item?.dataset.name;
310
+ if (name)
311
+ this.activateTab(name);
312
+ });
313
+ wrapper.appendChild(this.menuDropdown);
314
+ this.appendChild(wrapper);
315
+ // Defer population to allow btu-dropdown to finish its firstUpdated lifecycle
316
+ this.rafId = requestAnimationFrame(() => {
317
+ this.rafId = null;
318
+ this.updateMenuItems();
319
+ this.emit('btu-tabs-ready');
320
+ });
321
+ }
322
+ /** @internal */
323
+ updateMenuItems() {
324
+ if (!this.isConnected)
325
+ return;
326
+ const menu = this.menuDropdown?.querySelector('btu-dropdown-menu');
327
+ if (!menu)
328
+ return;
329
+ menu.innerHTML = '';
330
+ const tabs = this.getTabs();
331
+ const hasIcons = tabs.some(t => !!t.symbol);
332
+ tabs.forEach(tab => {
333
+ const item = document.createElement('btu-dropdown-item');
334
+ item.dataset.name = tab.name ?? '';
335
+ item.label = tab.label ?? tab.name ?? '';
336
+ item.selected = tab.name === this.activeTab;
337
+ item.disabled = tab.disabled;
338
+ item.error = tab.error;
339
+ if (tab.symbol)
340
+ item.symbol = tab.symbol;
341
+ menu.appendChild(item);
342
+ item._configure({ checkbox: false, icon: hasIcons, symbol: '', favorites: false, shortcuts: false });
343
+ });
344
+ }
345
+ /** @internal */
346
+ syncMenuState() {
347
+ const activeTab = this.getTabs().find(t => t.name === this.activeTab);
348
+ if (this.menuLabel) {
349
+ this.menuLabel.textContent = activeTab?.label ?? '';
350
+ }
351
+ if (this.menuIcon) {
352
+ const symbol = activeTab?.symbol ?? '';
353
+ this.menuIcon.setAttribute('symbol', symbol);
354
+ this.menuIcon.setAttribute('size', this._menuIconSize);
355
+ this.menuIcon.hidden = !symbol;
356
+ // Reposition if icon-position changed
357
+ const wrapper = this.menuIcon.parentElement;
358
+ if (wrapper && this.menuLabel) {
359
+ if (activeTab?.iconPosition === 'trailing') {
360
+ wrapper.insertBefore(this.menuIcon, this.menuErrorBadge);
361
+ }
362
+ else {
363
+ wrapper.insertBefore(this.menuIcon, this.menuLabel);
364
+ }
365
+ }
366
+ }
367
+ if (this.menuErrorBadge) {
368
+ this.menuErrorBadge.hidden = !activeTab?.error;
369
+ }
370
+ this.menuDropdown?.querySelectorAll('btu-dropdown-item').forEach(item => {
371
+ item.selected = item.dataset.name === this.activeTab;
372
+ });
373
+ }
374
+ render() {
375
+ return html ``;
376
+ }
377
+ }
378
+ __decorate([
379
+ property({ type: String })
380
+ ], Tabs.prototype, "size", void 0);
381
+ __decorate([
382
+ property({ type: String, attribute: 'active-tab' })
383
+ ], Tabs.prototype, "activeTab", void 0);
384
+ __decorate([
385
+ property({ type: String })
386
+ ], Tabs.prototype, "variant", void 0);
387
+ if (!customElements.get('btu-tabs')) {
388
+ customElements.define('btu-tabs', Tabs);
389
+ }
390
+ //# sourceMappingURL=Tabs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../../../src/components/tabs/Tabs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ import { LitElement } from 'lit';
2
+ import '../icon/Icon.js';
3
+ import './UploadItem.js';
4
+ import type { FileState, FileStatus, FileStatusSettable } from './UploadItem.js';
5
+ export type { FileState, FileStatus, FileStatusSettable };
6
+ declare const Upload_base: (new (...args: any[]) => import("../../util/EventEmitterMixin.js").EventEmitterMixinInterface) & (new (...args: any[]) => import("../../util/ReadyMixin.js").ReadyMixinInterface) & typeof LitElement;
7
+ /**
8
+ * A file upload component with drop zone and file list.
9
+ *
10
+ * The component is presentation + file-selection only. It handles file browsing,
11
+ * drag-and-drop reception, client-side validation, and rendering the file list
12
+ * with progress bars. It does not perform network requests — the consumer listens
13
+ * for events, performs their own upload, and drives state back via imperative methods.
14
+ *
15
+ * @element btu-upload
16
+ *
17
+ * @fires {CustomEvent<unknown>} btu-upload-ready - Fired when the component has completed first render
18
+ * @fires {CustomEvent<{id: string, file: File}>} btu-upload-file-added - Fired when a file passes validation and is added
19
+ * @fires {CustomEvent<{id: string, file: File}>} btu-upload-file-removed - Fired when a file is removed (user action, programmatic, or on disconnect for in-flight uploads)
20
+ * @fires {CustomEvent<{id: string, file: File}>} btu-upload-file-retry - Fired when user clicks "Try again" on a failed upload
21
+ * @fires {CustomEvent<{file: File, reason: 'type' | 'size' | 'count'}>} btu-upload-file-rejected - Fired when a file fails client-side validation or the queue is full
22
+ * @fires {CustomEvent<{id: string, file: File}>} btu-upload-file-completed - Fired when a file's status transitions into 'complete'
23
+ * @fires {CustomEvent<{method: string, id: string, reason: 'unknown-id' | 'invalid-transition', message: string}>} btu-upload-api-error - Fired when an imperative API call references an unknown id or an illegal status transition
24
+ *
25
+ * @cssprop --upload-dropzone-bg - Drop zone background color (default: gray-25)
26
+ * @cssprop --upload-dropzone-border-color - Drop zone border color (default: gray-300; gray-200 when disabled, gray-400 in high-contrast)
27
+ * @cssprop --upload-dropzone-border-radius - Drop zone border radius (default: borderRadius.lg)
28
+ * @cssprop --upload-dropzone-hover-bg - Drop zone hover background (hover default: gray-50; drag-over default: primary-25)
29
+ * @cssprop --upload-dropzone-hover-border-color - Drop zone hover/focus border color (default: primary-300; drag-over uses primary-400)
30
+ * @cssprop --upload-dropzone-focus-ring-color - Drop zone focus ring color (default: primary-100)
31
+ * @cssprop --upload-item-bg - Item background color (default: white)
32
+ * @cssprop --upload-item-border-color - Item border color (default: gray-200)
33
+ * @cssprop --upload-item-active-border-color - Item active/in-progress border (default: gray-300)
34
+ * @cssprop --upload-item-complete-border-color - Item completed border color (default: primary-500)
35
+ * @cssprop --upload-item-error-bg - Item error background (default: error-25)
36
+ * @cssprop --upload-item-error-border-color - Item error border color (default: error-300)
37
+ */
38
+ export default class Upload extends Upload_base {
39
+ /**
40
+ * Accepted file types, matching the HTML `<input accept>` attribute format.
41
+ * Client-side filter only — the browser's file picker uses this as a hint,
42
+ * and drag-drop is enforced by this component. Server-side validation is
43
+ * still required.
44
+ *
45
+ * Supported forms (comma-separated, any combination):
46
+ * - `image/*` — MIME wildcard (any image)
47
+ * - `application/pdf` — exact MIME type
48
+ * - `.pdf`, `.docx` — file extension (case-insensitive)
49
+ *
50
+ * Examples:
51
+ * - `accept="image/*"` — any image
52
+ * - `accept="image/*,application/pdf"` — images and PDFs
53
+ * - `accept=".jpg,.jpeg,.png,.heic"` — specific extensions
54
+ * - `accept=""` (or omitted) — allow all
55
+ *
56
+ * Note: users can bypass the file picker's filter (most browsers offer an
57
+ * "All Files" option), so this attribute is a UX filter, not a security
58
+ * boundary.
59
+ *
60
+ * @attr
61
+ */
62
+ accept: string;
63
+ /**
64
+ * Maximum file size in bytes. Files exceeding this are rejected. 0 means unlimited.
65
+ * @attr max-file-size
66
+ */
67
+ maxFileSize: number;
68
+ /**
69
+ * Maximum number of files allowed. When omitted, uploads are unlimited.
70
+ * `max-files="1"` enters single-file mode (selecting a new file replaces the existing one).
71
+ * `max-files="0"` allows zero files. Values above 1 cap the queue at that many files.
72
+ * @attr max-files
73
+ */
74
+ maxFiles: number;
75
+ /**
76
+ * Disables all interaction — file selection, drag-and-drop, and action buttons.
77
+ * @attr
78
+ */
79
+ disabled: boolean;
80
+ /**
81
+ * Disables drag-and-drop. File selection via click still works.
82
+ * @attr no-drag
83
+ */
84
+ noDrag: boolean;
85
+ private _files;
86
+ private _items;
87
+ private _milestones;
88
+ private _dragOver;
89
+ private _dragCounter;
90
+ private get _inputEl();
91
+ createRenderRoot(): this;
92
+ connectedCallback(): void;
93
+ disconnectedCallback(): void;
94
+ firstUpdated(): void;
95
+ private _handleInputChange;
96
+ private _handleSelectClick;
97
+ private _handleDropzoneClick;
98
+ private _handleDragEnter;
99
+ private _handleDragOver;
100
+ private _handleDragLeave;
101
+ private _handleDrop;
102
+ private _processFiles;
103
+ private _rejectCount;
104
+ private _validateFile;
105
+ private _addFile;
106
+ private _reportUnknownId;
107
+ private _getOrReport;
108
+ private _renderItem;
109
+ /**
110
+ * Update the progress of a file upload.
111
+ * Clamps value to 0-100 and coerces non-finite inputs to 0. Announces milestones
112
+ * (25%, 50%, 75%) to screen readers; 100% completion is announced by setFileStatus('complete').
113
+ *
114
+ * Status transitions:
115
+ * - `pending` → `uploading` (auto — first progress report starts the upload)
116
+ * - `uploading` → `uploading` (progress updates)
117
+ * - `error` → `error` (progress updates only; status is preserved so a stale late
118
+ * callback can't wipe the error UI. To recover from error, call
119
+ * `setFileStatus(id, 'uploading')` first, then report progress.)
120
+ * - `complete` → ignored (terminal state)
121
+ */
122
+ setFileProgress(id: string, percent: number): void;
123
+ /**
124
+ * Set the status of a file.
125
+ * Valid statuses: 'uploading', 'complete', 'error'. For 'error' status, an
126
+ * optional message can be provided.
127
+ *
128
+ * Transitions from 'complete' are rejected (terminal state) — a late-resolving
129
+ * XHR cannot overwrite a prior success. Rejected calls emit `btu-upload-api-error`
130
+ * with reason: 'invalid-transition'.
131
+ */
132
+ setFileStatus(id: string, status: FileStatusSettable, message?: string): void;
133
+ /**
134
+ * Override the icon symbol for a file.
135
+ */
136
+ setFileSymbol(id: string, symbol: string): void;
137
+ /**
138
+ * Remove a file programmatically. Fires `btu-upload-file-removed`.
139
+ */
140
+ removeFile(id: string): void;
141
+ /**
142
+ * Get a snapshot of all current files and their states.
143
+ * States are readonly; mutations on the returned array's elements are ineffective.
144
+ */
145
+ getFiles(): readonly FileState[];
146
+ private get _dropzoneFull();
147
+ private get _interactionBlocked();
148
+ private get _showCountPill();
149
+ private _renderSelectButton;
150
+ render(): import("lit-html").TemplateResult<1>;
151
+ }
152
+ declare global {
153
+ interface HTMLElementTagNameMap {
154
+ 'btu-upload': Upload;
155
+ }
156
+ }
157
+ //# sourceMappingURL=Upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Upload.d.ts","sourceRoot":"","sources":["../../../src/components/upload/Upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,KAAK,CAAA;AAO/C,OAAO,iBAAiB,CAAA;AACxB,OAAO,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEhF,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,CAAA;;AAIzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAyC;IAC3E;;;;;;;;;;;;;;;;;;;;;;OAsBG;IAEH,MAAM,EAAE,MAAM,CAAK;IAEnB;;;OAGG;IAEH,WAAW,EAAE,MAAM,CAAI;IAEvB;;;;;OAKG;IAgBH,QAAQ,EAAE,MAAM,CAAW;IAE3B;;;OAGG;IAEH,QAAQ,EAAE,OAAO,CAAQ;IAEzB;;;OAGG;IAEH,MAAM,EAAE,OAAO,CAAQ;IAEvB,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,WAAW,CAAsC;IAGzD,OAAO,CAAC,SAAS,CAAiB;IAElC,OAAO,CAAC,YAAY,CAAY;IAEhC,OAAO,KAAK,QAAQ,GAEnB;IAED,gBAAgB;IAIhB,iBAAiB,IAAI,IAAI;IAKzB,oBAAoB,IAAI,IAAI;IAgB5B,YAAY,IAAI,IAAI;IAqBpB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,QAAQ;IAsBhB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,WAAW;IAanB;;;;;;;;;;;;OAYG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAiClD;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAgD7E;;OAEG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAU/C;;OAEG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAe5B;;;OAGG;IACH,QAAQ,IAAI,SAAS,SAAS,EAAE;IAIhC,OAAO,KAAK,aAAa,GAKxB;IAED,OAAO,KAAK,mBAAmB,GAE9B;IAED,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,CAAC,mBAAmB;IAW3B,MAAM;CAoEP;AAMD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,YAAY,EAAE,MAAM,CAAA;KACrB;CACF"}