@brightspot/ui 6.1.0-rc.1 → 6.1.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 (104) hide show
  1. package/dist/brand-icons.d.ts +11 -0
  2. package/dist/brand-icons.d.ts.map +1 -0
  3. package/dist/brand-icons.js +44 -0
  4. package/dist/brand-icons.js.map +1 -0
  5. package/dist/brand-icons.ts +52 -0
  6. package/dist/components/icon/Icon.d.ts +13 -0
  7. package/dist/components/icon/Icon.d.ts.map +1 -1
  8. package/dist/components/icon/Icon.js +25 -4
  9. package/dist/components/icon/Icon.js.map +1 -1
  10. package/dist/custom-elements.json +20 -2
  11. package/dist/storybook/assets/{ActionBar.stories-BI_iTJEQ.js → ActionBar.stories-Q_bdek_N.js} +1 -1
  12. package/dist/storybook/assets/{ActionItem.stories-BJWzexGS.js → ActionItem.stories-Ccyot7vj.js} +1 -1
  13. package/dist/storybook/assets/{AiSparkle.stories-DaA5HO3d.js → AiSparkle.stories-Ccapqzcw.js} +1 -1
  14. package/dist/storybook/assets/{Avatar.stories-Dw8QVNJ-.js → Avatar.stories-CPcQWZtG.js} +1 -1
  15. package/dist/storybook/assets/{AvatarGroup.stories-BsNMLTiE.js → AvatarGroup.stories-Bws-izJt.js} +1 -1
  16. package/dist/storybook/assets/{Badge.stories-GY-ektak.js → Badge.stories-xck9Ke5e.js} +1 -1
  17. package/dist/storybook/assets/{Banner.stories-Bg9VB-Fy.js → Banner.stories-D3ieqG7F.js} +1 -1
  18. package/dist/storybook/assets/{Button-BOLW3-O-.js → Button-CQ2ZvHGM.js} +1 -1
  19. package/dist/storybook/assets/{Button.stories-DMRHEd8n.js → Button.stories-BkGox6QF.js} +1 -1
  20. package/dist/storybook/assets/{ButtonGroup.stories-B2gFm6tD.js → ButtonGroup.stories-BxDNL7ej.js} +1 -1
  21. package/dist/storybook/assets/{Card.stories-CLdjETEv.js → Card.stories-BrzAwQwE.js} +1 -1
  22. package/dist/storybook/assets/{Celebrate.stories-navEPsY4.js → Celebrate.stories-BFqqbYhp.js} +1 -1
  23. package/dist/storybook/assets/{Checkbox.stories-5VfpC9R_.js → Checkbox.stories-yNb9DH9g.js} +1 -1
  24. package/dist/storybook/assets/{CircularProgress.stories-BI1KFT4i.js → CircularProgress.stories--KSA2X4d.js} +1 -1
  25. package/dist/storybook/assets/{ClipboardMixin.stories-DLqRNEnd.js → ClipboardMixin.stories-DT0symyW.js} +1 -1
  26. package/dist/storybook/assets/{Color-6BZIO3FS-BYF_b3cm.js → Color-6BZIO3FS-CEpjJcuB.js} +1 -1
  27. package/dist/storybook/assets/{Colors.stories-DymlImN1.js → Colors.stories-BEtjS3CS.js} +1 -1
  28. package/dist/storybook/assets/{CombinedEffects.stories-BcAx9THm.js → CombinedEffects.stories-DZsO6E1c.js} +1 -1
  29. package/dist/storybook/assets/{ComponentStatesMixin-D77sglBs.js → ComponentStatesMixin-C-G6neuB.js} +1 -1
  30. package/dist/storybook/assets/{ComponentStatesMixin.stories-BFUmXPbv.js → ComponentStatesMixin.stories-D4B2eXzV.js} +1 -1
  31. package/dist/storybook/assets/{CopyToClipboard.stories-CLP60X8y.js → CopyToClipboard.stories-C1wxRcNr.js} +1 -1
  32. package/dist/storybook/assets/{Debounce.stories-CDlv8D8Q.js → Debounce.stories-CEXdiU_4.js} +1 -1
  33. package/dist/storybook/assets/{DocsRenderer-LL677BLK-DU2JYRwe.js → DocsRenderer-LL677BLK-iD6uwWm0.js} +3 -3
  34. package/dist/storybook/assets/{Dropdown.stories-CJ-QjUYp.js → Dropdown.stories-DzgAKuev.js} +1 -1
  35. package/dist/storybook/assets/{EmptyState.stories-HQi_rzX2.js → EmptyState.stories-8IezRmLe.js} +1 -1
  36. package/dist/storybook/assets/{EscaAvatar.stories-BLqoZyr7.js → EscaAvatar.stories-CFRMImDC.js} +1 -1
  37. package/dist/storybook/assets/{Events.stories-CvSn4RPH.js → Events.stories-wc_WlNNX.js} +1 -1
  38. package/dist/storybook/assets/{Heading.stories-MR-daawc.js → Heading.stories-CBopc-Ov.js} +1 -1
  39. package/dist/storybook/assets/{HueRipple.stories-P4LiNUpZ.js → HueRipple.stories-B1BLaONM.js} +1 -1
  40. package/dist/storybook/assets/{Icon.stories-h5P6rJQP.js → Icon.stories-Bul1n2nN.js} +36 -25
  41. package/dist/storybook/assets/{IconButton.stories-Cc0vzr28.js → IconButton.stories-DDCBKBqw.js} +1 -1
  42. package/dist/storybook/assets/{LinearProgress.stories-yTIIcK9O.js → LinearProgress.stories-DWroemrV.js} +1 -1
  43. package/dist/storybook/assets/LucideDynamicLoader-THr3lc5T.js +1 -0
  44. package/dist/storybook/assets/{Message.stories-BbFPAVCt.js → Message.stories-CfWo8uqR.js} +1 -1
  45. package/dist/storybook/assets/{OnFindMixin.stories-BAWi3mlB.js → OnFindMixin.stories-DRr67PU5.js} +1 -1
  46. package/dist/storybook/assets/{Pagination.stories-DJ-6-aNd.js → Pagination.stories-CJ0dmE6y.js} +1 -1
  47. package/dist/storybook/assets/{Popover.stories-D9CilGw-.js → Popover.stories-CFFe2utX.js} +1 -1
  48. package/dist/storybook/assets/{ReadyMixin-B6XKdlIG.js → ReadyMixin-euHV5BrF.js} +1 -1
  49. package/dist/storybook/assets/{RovingTabindexMixin.stories-CPJ_6oiA.js → RovingTabindexMixin.stories-CcKn8eYu.js} +1 -1
  50. package/dist/storybook/assets/{Rtc.stories-DcWHMr_7.js → Rtc.stories-B_26leBQ.js} +1 -1
  51. package/dist/storybook/assets/{ScrollShadow.stories-DH6wJQFV.js → ScrollShadow.stories-COcTqDYx.js} +1 -1
  52. package/dist/storybook/assets/{Switch.stories-Cl9xPGbR.js → Switch.stories-fZAYVOXQ.js} +1 -1
  53. package/dist/storybook/assets/{Tab.stories-BAhU8vUi.js → Tab.stories-ChmYj35a.js} +1 -1
  54. package/dist/storybook/assets/{Tabs.stories-CLRPMg6P.js → Tabs.stories-Bgb-44oF.js} +1 -1
  55. package/dist/storybook/assets/{Throttle.stories-BbONS-V4.js → Throttle.stories-BP21CM6q.js} +1 -1
  56. package/dist/storybook/assets/{Tooltip.stories-B6s8TQSb.js → Tooltip.stories-Ck7XsJKW.js} +1 -1
  57. package/dist/storybook/assets/{Upload.stories-D0C25uui.js → Upload.stories-DMedgAwp.js} +1 -1
  58. package/dist/storybook/assets/{UploadItem.stories-DL6N7vsq.js → UploadItem.stories-D1rV5quQ.js} +1 -1
  59. package/dist/storybook/assets/{Welcome.stories-BK4n0XMp.js → Welcome.stories-DDEhWqOY.js} +1 -1
  60. package/dist/storybook/assets/{Widget.stories-Cy9frwq3.js → Widget.stories-iTycJQkv.js} +1 -1
  61. package/dist/storybook/assets/{WithTooltip-65CFNBJE-BuwTEXTQ.js → WithTooltip-65CFNBJE-BDmGdT_q.js} +1 -1
  62. package/dist/storybook/assets/{blocks-BLujz-58.js → blocks-45GMe9mP.js} +5 -5
  63. package/dist/storybook/assets/{formatter-EIJCOSYU-B1sNuUky.js → formatter-EIJCOSYU-Dvxzfjid.js} +1 -1
  64. package/dist/storybook/assets/if-defined-C-mi5lcR.js +1 -0
  65. package/dist/storybook/assets/{iframe-D1g1spfw.js → iframe-CemlMLl9.js} +4 -4
  66. package/dist/storybook/assets/iframe-abUCrGGI.css +1 -0
  67. package/dist/storybook/assets/{index-C6O8j27b.js → index-Ei3bFG4y.js} +1 -1
  68. package/dist/storybook/assets/lucide-CIXQsFPh.woff2 +0 -0
  69. package/dist/storybook/assets/{onFind-ZJa5FYZA.js → onFind-96dPwZGj.js} +1 -1
  70. package/dist/storybook/assets/{onFind.stories-rDFDR12f.js → onFind.stories-DwMmvzD8.js} +1 -1
  71. package/dist/storybook/assets/{onRemove.stories-Cmk4GOI5.js → onRemove.stories-Bw8nC3q8.js} +1 -1
  72. package/dist/storybook/assets/{onVisible.stories-RZ3Q87MG.js → onVisible.stories-BZyJ5si2.js} +1 -1
  73. package/dist/storybook/assets/{style-map-DS-2jfV3.js → style-map-BZ1BR1yx.js} +1 -1
  74. package/dist/storybook/assets/{syntaxhighlighter-ED5Y7EFY-C5m4nzeD.js → syntaxhighlighter-ED5Y7EFY-B4dajqNJ.js} +1 -1
  75. package/dist/storybook/iframe.html +2 -2
  76. package/dist/storybook/index.json +1 -1
  77. package/dist/storybook/project.json +1 -1
  78. package/dist/tailwind-plugin-icon.js +22 -0
  79. package/dist/tailwind-plugin-icon.js.map +1 -1
  80. package/dist/tailwind-plugin-icon.ts +23 -0
  81. package/docs/components/Icon.md +3 -1
  82. package/package.json +2 -2
  83. package/src/legacy/tool-ui/src/Enhancement.css +4 -3
  84. package/src/legacy/tool-ui/src/Entry.ts +4 -3
  85. package/src/legacy/tool-ui/src/MenuView.css +6 -1
  86. package/src/legacy/tool-ui/src/SearchResult.css +2 -1
  87. package/src/legacy/tool-ui/src/main/webapp/dist/{2111.70d9e2ee26ead4bd147b.css → 2111.8f1e08a5cc223fd14542.css} +1 -1
  88. package/src/legacy/tool-ui/src/main/webapp/dist/{7718.70d9e2ee26ead4bd147b.css → 7718.8f1e08a5cc223fd14542.css} +1 -1
  89. package/src/legacy/tool-ui/src/main/webapp/dist/{9360.bb0352313d610cae11de.js → 9360.41a5ba8d859d49f86811.js} +2 -2
  90. package/src/legacy/tool-ui/src/main/webapp/dist/RTEProseMirror.55a2d6ccdce502c79815.js +500 -0
  91. package/src/legacy/tool-ui/src/main/webapp/dist/lucide.woff2 +0 -0
  92. package/src/legacy/tool-ui/src/main/webapp/dist/{v4.e20a58613126bd279066.js → v4.1074f0affb38bd0dd492.js} +4 -4
  93. package/src/legacy/tool-ui/src/main/webapp/dist/v5.3bae2b874dfd633b5aa0.css +5 -0
  94. package/src/legacy/tool-ui/src/main/webapp/dist/{v5.49453db0889b1ea5fc49.js → v5.cf2a0215f57336762120.js} +9 -9
  95. package/src/legacy/tool-ui/src/main/webapp/dist/{v5.49453db0889b1ea5fc49.js.LICENSE.txt → v5.cf2a0215f57336762120.js.LICENSE.txt} +1 -1
  96. package/dist/storybook/assets/LucideDynamicLoader-jmdq8YDM.js +0 -1
  97. package/dist/storybook/assets/if-defined-D7P78rGH.js +0 -1
  98. package/dist/storybook/assets/iframe-DIm-6NO3.css +0 -1
  99. package/dist/storybook/assets/lucide-CCppEgWm.woff2 +0 -0
  100. package/src/legacy/tool-ui/src/main/webapp/dist/RTEProseMirror.0a65e49ab3de7864f9f8.js +0 -500
  101. package/src/legacy/tool-ui/src/main/webapp/dist/v5.61449ba1ad9e4a205423.css +0 -5
  102. /package/src/legacy/tool-ui/src/main/webapp/dist/{9360.bb0352313d610cae11de.js.LICENSE.txt → 9360.41a5ba8d859d49f86811.js.LICENSE.txt} +0 -0
  103. /package/src/legacy/tool-ui/src/main/webapp/dist/{RTEProseMirror.0a65e49ab3de7864f9f8.js.LICENSE.txt → RTEProseMirror.55a2d6ccdce502c79815.js.LICENSE.txt} +0 -0
  104. /package/src/legacy/tool-ui/src/main/webapp/dist/{v4.e20a58613126bd279066.js.LICENSE.txt → v4.1074f0affb38bd0dd492.js.LICENSE.txt} +0 -0
@@ -1,4 +1,4 @@
1
- import{g as S,x as t}from"./iframe-D1g1spfw.js";import{o as f}from"./style-map-DS-2jfV3.js";import"./preload-helper-PPVm8Dsz.js";const{events:O,args:A,argTypes:n}=S("btu-dropdown"),B={title:"Components/Dropdown",component:"btu-dropdown",tags:["autodocs"],parameters:{docs:{subtitle:"btu-dropdown",description:{component:`
1
+ import{g as S,x as t}from"./iframe-CemlMLl9.js";import{o as f}from"./style-map-BZ1BR1yx.js";import"./preload-helper-PPVm8Dsz.js";const{events:O,args:A,argTypes:n}=S("btu-dropdown"),B={title:"Components/Dropdown",component:"btu-dropdown",tags:["autodocs"],parameters:{docs:{subtitle:"btu-dropdown",description:{component:`
2
2
  A dropdown menu component that renders a trigger button and manages a floating panel
3
3
  containing a \`btu-dropdown-menu\` with \`btu-dropdown-item\` children.
4
4
 
@@ -1,4 +1,4 @@
1
- import{g as u,x as e}from"./iframe-D1g1spfw.js";import{o as m}from"./if-defined-D7P78rGH.js";import{o as h}from"./style-map-DS-2jfV3.js";import"./preload-helper-PPVm8Dsz.js";const{events:b,args:g,argTypes:s}=u("btu-empty-state"),y=["sm","md","lg"],v=[1,2,3,4,5,6],k={title:"Components/Empty State",component:"btu-empty-state",tags:["autodocs"],parameters:{docs:{subtitle:"A standardized component for communicating the absence of content.",description:{component:`
1
+ import{g as u,x as e}from"./iframe-CemlMLl9.js";import{o as m}from"./if-defined-C-mi5lcR.js";import{o as h}from"./style-map-BZ1BR1yx.js";import"./preload-helper-PPVm8Dsz.js";const{events:b,args:g,argTypes:s}=u("btu-empty-state"),y=["sm","md","lg"],v=[1,2,3,4,5,6],k={title:"Components/Empty State",component:"btu-empty-state",tags:["autodocs"],parameters:{docs:{subtitle:"A standardized component for communicating the absence of content.",description:{component:`
2
2
  <h3>When to use:</h3>
3
3
  <ul>
4
4
  <li>To communicate the absence of content in tables, lists, or search results</li>
@@ -1,4 +1,4 @@
1
- import{g as f,x as a}from"./iframe-D1g1spfw.js";import{o as x}from"./style-map-DS-2jfV3.js";import"./preload-helper-PPVm8Dsz.js";const{events:w,args:z,argTypes:m}=f("btu-esca-avatar"),g=["idle","wave","search","complete","glow"],y=["xs","sm","md","lg","xl"],$={title:"Components/Esca/Avatar",component:"btu-esca-avatar",tags:["autodocs"],parameters:{docs:{subtitle:"The animated avatar for the Esca AI assistant",description:{component:`
1
+ import{g as f,x as a}from"./iframe-CemlMLl9.js";import{o as x}from"./style-map-BZ1BR1yx.js";import"./preload-helper-PPVm8Dsz.js";const{events:w,args:z,argTypes:m}=f("btu-esca-avatar"),g=["idle","wave","search","complete","glow"],y=["xs","sm","md","lg","xl"],$={title:"Components/Esca/Avatar",component:"btu-esca-avatar",tags:["autodocs"],parameters:{docs:{subtitle:"The animated avatar for the Esca AI assistant",description:{component:`
2
2
  <h3>When to use:</h3>
3
3
  <ul>
4
4
  <li>Alongside the Esca assistant's messages, in any chat surface</li>
@@ -1,4 +1,4 @@
1
- import{x as d}from"./iframe-D1g1spfw.js";import"./preload-helper-PPVm8Dsz.js";var n=Object.freeze,r=Object.defineProperty,s=(t,i)=>n(r(t,"raw",{value:n(t.slice())})),o;const l={title:"Mixins/Events",tags:["autodocs"],parameters:{docs:{subtitle:"Events inherited from EventEmitterMixin",description:{component:`
1
+ import{x as d}from"./iframe-CemlMLl9.js";import"./preload-helper-PPVm8Dsz.js";var n=Object.freeze,r=Object.defineProperty,s=(t,i)=>n(r(t,"raw",{value:n(t.slice())})),o;const l={title:"Mixins/Events",tags:["autodocs"],parameters:{docs:{subtitle:"Events inherited from EventEmitterMixin",description:{component:`
2
2
  <h3>EventEmitterMixin Events</h3>
3
3
 
4
4
  <p>All Brightspot UI components that extend EventEmitterMixin emit the following lifecycle events in addition to those inherited from LitElement. These events use CustomEvent and bubble through the DOM with <code>composed: true</code>, meaning they cross shadow DOM boundaries.</p>
@@ -1,3 +1,3 @@
1
- import{x as s}from"./iframe-D1g1spfw.js";import"./preload-helper-PPVm8Dsz.js";const r=({size:t})=>s` <div class=${[`btu-heading-${t}`].join(" ")}>Heading</div> `,o={title:"CSS Plugins/Heading",component:"btu-heading",tags:["autodocs"],parameters:{docs:{subtitle:"This Tailwind CSS plugin provides the `.btu-heading` utility class for styling headings. It supports five different sizes, from 1 (largest) to 5 (smallest). Apply the class to `<h1>` through `<h5>` elements to style them accordingly."},controls:{expanded:!0}},render:t=>r(t),argTypes:{size:{control:{type:"range",min:1,max:5,step:1},description:"Heading size from 1 to 5, where 1 is the largest and 5 is the smallest."}},args:{size:1}},e={args:{}};e.parameters={...e.parameters,docs:{...e.parameters?.docs,source:{originalSource:`{
1
+ import{x as s}from"./iframe-CemlMLl9.js";import"./preload-helper-PPVm8Dsz.js";const r=({size:t})=>s` <div class=${[`btu-heading-${t}`].join(" ")}>Heading</div> `,o={title:"CSS Plugins/Heading",component:"btu-heading",tags:["autodocs"],parameters:{docs:{subtitle:"This Tailwind CSS plugin provides the `.btu-heading` utility class for styling headings. It supports five different sizes, from 1 (largest) to 5 (smallest). Apply the class to `<h1>` through `<h5>` elements to style them accordingly."},controls:{expanded:!0}},render:t=>r(t),argTypes:{size:{control:{type:"range",min:1,max:5,step:1},description:"Heading size from 1 to 5, where 1 is the largest and 5 is the smallest."}},args:{size:1}},e={args:{}};e.parameters={...e.parameters,docs:{...e.parameters?.docs,source:{originalSource:`{
2
2
  args: {}
3
3
  }`,...e.parameters?.docs?.source}}};const n=["Default"];export{e as Default,n as __namedExportsOrder,o as default};
@@ -1,4 +1,4 @@
1
- import{x as i}from"./iframe-D1g1spfw.js";import{b as l}from"./ripple-DQbyyRUw.js";import{B as e}from"./Button-BOLW3-O-.js";import"./preload-helper-PPVm8Dsz.js";import"./position-CFNQy3J6.js";const m={title:"Effects/Hue Ripple",tags:["autodocs"],parameters:{docs:{subtitle:"Click anywhere to send a hue-shifting ripple across the viewport",description:{component:`
1
+ import{x as i}from"./iframe-CemlMLl9.js";import{b as l}from"./ripple-DQbyyRUw.js";import{B as e}from"./Button-CQ2ZvHGM.js";import"./preload-helper-PPVm8Dsz.js";import"./position-CFNQy3J6.js";const m={title:"Effects/Hue Ripple",tags:["autodocs"],parameters:{docs:{subtitle:"Click anywhere to send a hue-shifting ripple across the viewport",description:{component:`
2
2
  Uses the **View Transition API** to create an expanding ring that reveals OKLCH-shifted colors as it sweeps past each element, then they return to normal.
3
3
 
4
4
  ### Usage
@@ -1,4 +1,4 @@
1
- import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jfV3.js";import{L as u}from"./LucideDynamicLoader-jmdq8YDM.js";import"./preload-helper-PPVm8Dsz.js";const{events:x,args:v,argTypes:i}=g("btu-icon"),b=["xs","sm","md","lg","xl"],f=["ai","error","gray","primary","purple","rose","success","teal","warning"],C={title:"Components/Icon",component:"btu-icon",tags:["autodocs"],parameters:{docs:{subtitle:"An icon component using Lucide icons with built-in support for custom colors and sizes.",description:{component:`
1
+ import{g as v,x as s}from"./iframe-CemlMLl9.js";import{o as x}from"./if-defined-C-mi5lcR.js";import{o as f}from"./style-map-BZ1BR1yx.js";import{L as g}from"./LucideDynamicLoader-THr3lc5T.js";import"./preload-helper-PPVm8Dsz.js";const h={facebook:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="100 100 500 500" fill="currentColor"><path d="M600.0,350.0C600.0,211.929 488.071,100.0 350.0,100.0C211.929,100.0 100.0,211.929 100.0,350.0C100.0,467.245 180.715,565.622 289.606,592.638L289.606,426.396L238.054,426.396L238.054,350.0L289.606,350.0L289.606,317.081C289.606,231.989 328.114,192.549 411.654,192.549C427.492,192.549 454.821,195.654 466.001,198.76L466.001,268.014C460.1,267.393 449.852,267.082 437.119,267.082C396.126,267.082 380.287,282.61 380.287,322.982L380.287,350.0L461.946,350.0L447.918,426.396L380.287,426.396L380.287,598.169C504.073,583.218 600.0,477.818 600.0,350.0Z"/></svg>',instagram:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" fill="currentColor"><path d="M295.42,6c-53.2,2.51-89.53,11-121.29,23.48-32.87,12.81-60.73,30-88.45,57.82S40.89,143,28.17,175.92c-12.31,31.83-20.65,68.19-23,121.42S2.3,367.68,2.56,503.46,3.42,656.26,6,709.6c2.54,53.19,11,89.51,23.48,121.28,12.83,32.87,30,60.72,57.83,88.45S143,964.09,176,976.83c31.8,12.29,68.17,20.67,121.39,23s70.35,2.87,206.09,2.61,152.83-.86,206.16-3.39S799.1,988,830.88,975.58c32.87-12.86,60.74-30,88.45-57.84S964.1,862,976.81,829.06c12.32-31.8,20.69-68.17,23-121.35,2.33-53.37,2.88-70.41,2.62-206.17s-.87-152.78-3.4-206.1-11-89.53-23.47-121.32c-12.85-32.87-30-60.7-57.82-88.45S862,40.87,829.07,28.19c-31.82-12.31-68.17-20.7-121.39-23S637.33,2.3,501.54,2.56,348.75,3.4,295.42,6m5.84,903.88c-48.75-2.12-75.22-10.22-92.86-17-23.36-9-40-19.88-57.58-37.29s-28.38-34.11-37.5-57.42c-6.85-17.64-15.1-44.08-17.38-92.83-2.48-52.69-3-68.51-3.29-202s.22-149.29,2.53-202c2.08-48.71,10.23-75.21,17-92.84,9-23.39,19.84-40,37.29-57.57s34.1-28.39,57.43-37.51c17.62-6.88,44.06-15.06,92.79-17.38,52.73-2.5,68.53-3,202-3.29s149.31.21,202.06,2.53c48.71,2.12,75.22,10.19,92.83,17,23.37,9,40,19.81,57.57,37.29s28.4,34.07,37.52,57.45c6.89,17.57,15.07,44,17.37,92.76,2.51,52.73,3.08,68.54,3.32,202s-.23,149.31-2.54,202c-2.13,48.75-10.21,75.23-17,92.89-9,23.35-19.85,40-37.31,57.56s-34.09,28.38-57.43,37.5c-17.6,6.87-44.07,15.07-92.76,17.39-52.73,2.48-68.53,3-202.05,3.29s-149.27-.25-202-2.53m407.6-674.61a60,60,0,1,0,59.88-60.1,60,60,0,0,0-59.88,60.1M245.77,503c.28,141.8,115.44,256.49,257.21,256.22S759.52,643.8,759.25,502,643.79,245.48,502,245.76,245.5,361.22,245.77,503m90.06-.18a166.67,166.67,0,1,1,167,166.34,166.65,166.65,0,0,1-167-166.34"/></svg>',slack:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="73.6 73.6 122.8 122.8" fill="currentColor"><path d="M99.4,151.2c0,7.1-5.8,12.9-12.9,12.9s-12.9-5.8-12.9-12.9c0-7.1,5.8-12.9,12.9-12.9h12.9V151.2z"/><path d="M105.9,151.2c0-7.1,5.8-12.9,12.9-12.9s12.9,5.8,12.9,12.9v32.3c0,7.1-5.8,12.9-12.9,12.9s-12.9-5.8-12.9-12.9 C105.9,183.5,105.9,151.2,105.9,151.2z"/><path d="M118.8,99.4c-7.1,0-12.9-5.8-12.9-12.9s5.8-12.9,12.9-12.9s12.9,5.8,12.9,12.9v12.9H118.8z"/><path d="M118.8,105.9c7.1,0,12.9,5.8,12.9,12.9s-5.8,12.9-12.9,12.9H86.5c-7.1,0-12.9-5.8-12.9-12.9s5.8-12.9,12.9-12.9 C86.5,105.9,118.8,105.9,118.8,105.9z"/><path d="M170.6,118.8c0-7.1,5.8-12.9,12.9-12.9c7.1,0,12.9,5.8,12.9,12.9s-5.8,12.9-12.9,12.9h-12.9V118.8z"/><path d="M164.1,118.8c0,7.1-5.8,12.9-12.9,12.9c-7.1,0-12.9-5.8-12.9-12.9V86.5c0-7.1,5.8-12.9,12.9-12.9 c7.1,0,12.9,5.8,12.9,12.9V118.8z"/><path d="M151.2,170.6c7.1,0,12.9,5.8,12.9,12.9c0,7.1-5.8,12.9-12.9,12.9c-7.1,0-12.9-5.8-12.9-12.9v-12.9H151.2z"/><path d="M151.2,164.1c-7.1,0-12.9-5.8-12.9-12.9c0-7.1,5.8-12.9,12.9-12.9h32.3c7.1,0,12.9,5.8,12.9,12.9 c0,7.1-5.8,12.9-12.9,12.9H151.2z"/></svg>',x:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 1227" fill="currentColor"><path d="M714.163 519.284L1160.89 0H1055.03L667.137 450.887L357.328 0H0L468.492 681.821L0 1226.37H105.866L515.491 750.218L842.672 1226.37H1200L714.137 519.284H714.163ZM569.165 687.828L521.697 619.934L144.011 79.6944H306.615L611.412 515.685L658.88 583.579L1055.08 1150.3H892.476L569.165 687.854V687.828Z"/></svg>'},{events:y,args:z,argTypes:n}=v("btu-icon"),u=["xs","sm","md","lg","xl"],w=["ai","error","gray","primary","purple","rose","success","teal","warning"],T={title:"Components/Icon",component:"btu-icon",tags:["autodocs"],parameters:{docs:{subtitle:"An icon component using Lucide icons with built-in support for custom colors and sizes.",description:{component:`
2
2
  <strong>When to use:</strong>
3
3
  <ul>
4
4
  <li>To visually reinforce actions, states, or categories</li>
@@ -14,14 +14,18 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
14
14
  </ul>
15
15
 
16
16
  <h3>Icon Library:</h3>
17
- <p>All icons are from <a href="https://lucide.dev/icons/" target="_blank">Lucide</a>. Note that the Lucide library is updated regularly, but the Brightspot UI library uses <strong>Lucide v${u}</strong>. Keep this in mind when choosing icons for your project, as icon names and styles may differ between versions.</p>
18
- `}},actions:{handles:x},controls:{expanded:!0}},args:{...v,symbol:"heart",size:"md"},argTypes:{...i,"--icon-size":{table:{disable:!0}},"--icon-fill":{table:{disable:!0}},"--icon-stroke-width":{table:{disable:!0}},"--icon-svg":{table:{disable:!0}},symbol:{...i.symbol,control:{type:"text"},description:'<a href="https://lucide.dev/icons/" target="_blank">Lucide</a> icon name. Note that only icons available in Lucide v'+u+" are supported.",table:{...i.symbol?.table,type:{summary:"string"}}},size:{...i.size,control:{type:"select"},options:b,description:"Icon size preset"},gradient:{...i.gradient,control:{type:"select"},options:f,description:"Gradient theme icon fill. When not set, icon inherits parent text color. **Cannot be combined with `emphasize`** — gradient takes precedence."},emphasize:{...i.emphasize,control:{type:"select"},options:["none","static","pulse"],mapping:{none:void 0,static:!0,pulse:"pulse"},description:'Emphasize mode. "static" renders a tonal circle with ring; "pulse" adds a one-shot ring animation. Color derives from currentColor (defaults to primary). **Cannot be combined with `gradient`** gradient takes precedence and emphasize is ignored.'},customSize:{name:"--icon-size",control:{type:"text"},description:'Custom icon size - overrides the size preset (e.g., "3rem", "48px")',table:{category:"css properties"}},customFill:{name:"--icon-fill",control:{type:"text"},description:'An advanced option for creating filled-in icons via built-in CSS SVG styling. Works best with simple icons like "heart" or "star".',table:{category:"css properties"}},customStrokeWidth:{name:"--icon-stroke-width",control:{type:"range",min:.5,max:4,step:.25},description:"SVG stroke width as a unitless number in viewBox units; scales visually with icon size (default: 2).",table:{category:"css properties"}}},render:e=>{const t={};return e.customSize&&(t["--icon-size"]=e.customSize),e.customFill&&(t["--icon-fill"]=e.customFill),e.customStrokeWidth&&(t["--icon-stroke-width"]=e.customStrokeWidth),s`<btu-icon
17
+ <p>All icons are from <a href="https://lucide.dev/icons/" target="_blank">Lucide</a>. Note that the Lucide library is updated regularly, but the Brightspot UI library uses <strong>Lucide v${g}</strong>. Keep this in mind when choosing icons for your project, as icon names and styles may differ between versions.</p>
18
+ <p>Brand logos are not part of Lucide (removed in Lucide v1) — the marks Brightspot needs are
19
+ vendored and rendered via the <code>brand</code> attribute instead of <code>symbol</code>.
20
+ See the <strong>Brands</strong> story below.</p>
21
+ `}},actions:{handles:y},controls:{expanded:!0}},args:{...z,symbol:"heart",size:"md"},argTypes:{...n,"--icon-size":{table:{disable:!0}},"--icon-fill":{table:{disable:!0}},"--icon-stroke-width":{table:{disable:!0}},"--icon-svg":{table:{disable:!0}},symbol:{...n.symbol,control:{type:"text"},description:'<a href="https://lucide.dev/icons/" target="_blank">Lucide</a> icon name. Note that only icons available in Lucide v'+g+" are supported.",table:{...n.symbol?.table,type:{summary:"string"}}},brand:{...n.brand,control:{type:"select"},options:["none",...Object.keys(h)],mapping:{none:void 0},description:"Vendored brand mark to display instead of a Lucide icon (see the Brands story). Takes precedence over `symbol`.",table:{...n.brand?.table,type:{summary:"string"}}},size:{...n.size,control:{type:"select"},options:u,description:"Icon size preset"},gradient:{...n.gradient,control:{type:"select"},options:w,description:"Gradient theme icon fill. When not set, icon inherits parent text color. **Cannot be combined with `emphasize`** — gradient takes precedence."},emphasize:{...n.emphasize,control:{type:"select"},options:["none","static","pulse"],mapping:{none:void 0,static:!0,pulse:"pulse"},description:'Emphasize mode. "static" renders a tonal circle with ring; "pulse" adds a one-shot ring animation. Color derives from currentColor (defaults to primary). **Cannot be combined with `gradient`** — gradient takes precedence and emphasize is ignored.'},customSize:{name:"--icon-size",control:{type:"text"},description:'Custom icon size - overrides the size preset (e.g., "3rem", "48px")',table:{category:"css properties"}},customFill:{name:"--icon-fill",control:{type:"text"},description:'An advanced option for creating filled-in icons via built-in CSS SVG styling. Works best with simple icons like "heart" or "star".',table:{category:"css properties"}},customStrokeWidth:{name:"--icon-stroke-width",control:{type:"range",min:.5,max:4,step:.25},description:"SVG stroke width as a unitless number in viewBox units; scales visually with icon size (default: 2).",table:{category:"css properties"}}},render:e=>{const t={};return e.customSize&&(t["--icon-size"]=e.customSize),e.customFill&&(t["--icon-fill"]=e.customFill),e.customStrokeWidth&&(t["--icon-stroke-width"]=e.customStrokeWidth),s`<btu-icon
19
22
  symbol="${e.symbol}"
23
+ brand="${x(e.brand||void 0)}"
20
24
  size="${e.size}"
21
25
  gradient="${e.gradient||""}"
22
26
  .emphasize=${e.emphasize||void 0}
23
- style=${h(t)}
24
- ></btu-icon>`}},n={args:{}},o={render:()=>s`<div class="flex items-center gap-4">
27
+ style=${f(t)}
28
+ ></btu-icon>`}},o={args:{}},i={render:()=>s`<div class="flex items-center gap-4">
25
29
  <btu-icon symbol="heart" size="xs"></btu-icon>
26
30
  <btu-icon symbol="heart" size="sm"></btu-icon>
27
31
  <btu-icon symbol="heart" size="md"></btu-icon>
@@ -32,7 +36,7 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
32
36
  <btu-icon symbol="heart" size="xl" style="--icon-stroke-width: ${e}"></btu-icon>
33
37
  <span class="text-xs font-bold">${e}</span>
34
38
  </div>`)}
35
- </div>`,parameters:{docs:{description:{story:"Control stroke thickness via the `--icon-stroke-width` CSS custom property. The value is a unitless number in SVG viewBox units (the icons use a 24×24 coordinate system). Because the stroke is defined in viewBox units, it scales proportionally with the icon — a stroke-width of 2 will appear visually thicker on a larger icon. Note: this property does not affect gradient icons, which use a static mask image where stroke-width is baked in."}}}},l={render:()=>s`<div class="flex flex-wrap items-center justify-between gap-4 px-4">
39
+ </div>`,parameters:{docs:{description:{story:"Control stroke thickness via the `--icon-stroke-width` CSS custom property. The value is a unitless number in SVG viewBox units (the icons use a 24×24 coordinate system). Because the stroke is defined in viewBox units, it scales proportionally with the icon — a stroke-width of 2 will appear visually thicker on a larger icon. Note: this property does not affect gradient icons, which use a static mask image where stroke-width is baked in."}}}},r={render:()=>s`<div class="flex flex-wrap items-center justify-between gap-4 px-4">
36
40
  <div class="flex flex-col items-center gap-2">
37
41
  <btu-icon symbol="zap" size="xl" gradient="primary"></btu-icon>
38
42
  <span class="text-xs font-bold">primary</span>
@@ -65,7 +69,14 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
65
69
  <btu-icon symbol="flower" size="xl" gradient="rose"></btu-icon>
66
70
  <span class="text-xs font-bold">rose</span>
67
71
  </div>
68
- </div>`,parameters:{docs:{description:{story:"Icons support gradient fills using the following theme colors. Set the `gradient` attribute to one of the theme colors and watch the icon's color come to life! Note that gradient icons use mask-based rendering for smooth color transitions."}}}},r={render:()=>s`<div class="flex flex-col gap-6">
72
+ </div>`,parameters:{docs:{description:{story:"Icons support gradient fills using the following theme colors. Set the `gradient` attribute to one of the theme colors and watch the icon's color come to life! Note that gradient icons use mask-based rendering for smooth color transitions."}}}},l={render:()=>s`<div class="flex flex-row items-start gap-8">
73
+ ${Object.keys(h).map(e=>s`
74
+ <div class="flex flex-col items-center gap-2">
75
+ <btu-icon brand="${e}" style="--icon-size: 2rem"></btu-icon>
76
+ <span class="text-xs font-bold">${e}</span>
77
+ </div>
78
+ `)}
79
+ </div>`,parameters:{docs:{description:{story:'\nLucide v1 removed all brand logos, so brand marks are vendored in `src/brand-icons.ts` —\nofficial artwork from each brand\'s own asset page (sources and trademark caveats are recorded\nthere). Render them with the `brand` attribute rather than `symbol`; it takes precedence over\n`symbol`, inherits `currentColor`, and supports `size` and `gradient`:\n\n```html\n<btu-icon brand="slack" size="md"></btu-icon>\n```\n\nLegacy `symbol` values for brand names Lucide removed (facebook, instagram, slack, twitter)\nswap to the vendored mark at runtime for host-app compatibility — new code should use\n`brand`. The marks are not in the Lucide webfont, so CSS-only contexts use the mask utility\nrather than a font glyph:\n\n```css\n.some-label {\n @apply before:btu-icon-brand-slack;\n}\n```'}}}},c={render:()=>s`<div class="flex flex-col gap-6">
69
80
  <div class="flex items-center gap-2">
70
81
  <strong>Custom sizing:</strong>
71
82
  <btu-icon symbol="trophy" size="md" style="--icon-size: 4rem" class="text-warning-500"></btu-icon>
@@ -118,14 +129,14 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
118
129
  <span class="ml-1">Favorite</span>
119
130
  </button>
120
131
  </div>
121
- </div>`,parameters:{docs:{description:{story:'\n- **Custom sizing** is available via the `--icon-size` CSS property for precise control.\n- You can create **filled icons** by setting the `--icon-fill: currentColor` CSS property. Note that this works best with simple icons like "heart" or "star".\n\n- **RTL language support:** Directional icons can be flipped for right-to-left languages using Tailwind\'s `rtl:-scale-x-100` utility class. This ensures icons like panels, arrows, and navigation elements point in the correct direction.\n\n**Accessibility best practices:**\n- If an icon conveys information and there is no visible text to accompany it (e.g., a delete button with only a trash can icon), add an `aria-label` attribute to the component to help users using screen readers understand its purpose.\n- If an icon is purely decorative (e.g. a sparkle icon, accompanying text that already conveys meaning), add `aria-hidden="true"` to the icon to hide it from screen readers.\n- You may consider adding a tooltip (via `title` attribute) to icon buttons for better discoverability.'}}}},c={render:()=>s`<div class="flex flex-col gap-8">
132
+ </div>`,parameters:{docs:{description:{story:'\n- **Custom sizing** is available via the `--icon-size` CSS property for precise control.\n- You can create **filled icons** by setting the `--icon-fill: currentColor` CSS property. Note that this works best with simple icons like "heart" or "star".\n\n- **RTL language support:** Directional icons can be flipped for right-to-left languages using Tailwind\'s `rtl:-scale-x-100` utility class. This ensures icons like panels, arrows, and navigation elements point in the correct direction.\n\n**Accessibility best practices:**\n- If an icon conveys information and there is no visible text to accompany it (e.g., a delete button with only a trash can icon), add an `aria-label` attribute to the component to help users using screen readers understand its purpose.\n- If an icon is purely decorative (e.g. a sparkle icon, accompanying text that already conveys meaning), add `aria-hidden="true"` to the icon to hide it from screen readers.\n- You may consider adding a tooltip (via `title` attribute) to icon buttons for better discoverability.'}}}},d={render:()=>s`<div class="flex flex-col gap-8">
122
133
  <div>
123
134
  <div class="mb-2 text-sm font-semibold">Colors (via Tailwind text-* classes)</div>
124
135
  <div class="flex items-center gap-6">
125
- ${[{symbol:"search",colorClass:"text-primary-600",label:"primary"},{symbol:"alert-circle",colorClass:"text-error-600",label:"error"},{symbol:"check-circle",colorClass:"text-success-600",label:"success"},{symbol:"settings",colorClass:"text-gray-500",label:"gray"},{symbol:"globe",colorClass:"text-teal-600",label:"teal"},{symbol:"alert-triangle",colorClass:"text-warning-600",label:"warning"}].map(({symbol:t,colorClass:m,label:p})=>s`
136
+ ${[{symbol:"search",colorClass:"text-primary-600",label:"primary"},{symbol:"alert-circle",colorClass:"text-error-600",label:"error"},{symbol:"check-circle",colorClass:"text-success-600",label:"success"},{symbol:"settings",colorClass:"text-gray-500",label:"gray"},{symbol:"globe",colorClass:"text-teal-600",label:"teal"},{symbol:"alert-triangle",colorClass:"text-warning-600",label:"warning"}].map(({symbol:t,colorClass:p,label:b})=>s`
126
137
  <div class="flex flex-col items-center gap-2">
127
- <btu-icon symbol="${t}" size="lg" emphasize class="${m}"></btu-icon>
128
- <span class="text-xs font-bold">${p}</span>
138
+ <btu-icon symbol="${t}" size="lg" emphasize class="${p}"></btu-icon>
139
+ <span class="text-xs font-bold">${b}</span>
129
140
  </div>
130
141
  `)}
131
142
  </div>
@@ -133,7 +144,7 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
133
144
  <div>
134
145
  <div class="mb-2 text-sm font-semibold">Sizes (default primary)</div>
135
146
  <div class="flex items-center gap-6">
136
- ${b.map(t=>s`
147
+ ${u.map(t=>s`
137
148
  <div class="flex flex-col items-center gap-2">
138
149
  <btu-icon symbol="heart" size="${t}" emphasize></btu-icon>
139
150
  <span class="text-xs font-bold">${t}</span>
@@ -149,14 +160,14 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
149
160
  <btu-icon symbol="leaf" size="lg" emphasize style="color: oklch(0.55 0.2 145)"></btu-icon>
150
161
  </div>
151
162
  </div>
152
- </div>`,parameters:{docs:{description:{story:'The `emphasize` attribute renders a tonal circle with ring behind the icon. Colors are derived from `currentColor` via `oklch(from ...)` relative color syntax — set icon color with Tailwind `text-*` classes or inline `style="color: ..."`. Defaults to primary when no color is set. Dark mode and high-contrast mode adapt automatically via different oklch derivation parameters.\n\n**Note:** `emphasize` cannot be combined with `gradient` — they target conflicting rendering modes. When both are set, `gradient` takes precedence and `emphasize` is ignored.'}}}},d={render:()=>s`<div class="flex flex-col gap-8">
163
+ </div>`,parameters:{docs:{description:{story:'The `emphasize` attribute renders a tonal circle with ring behind the icon. Colors are derived from `currentColor` via `oklch(from ...)` relative color syntax — set icon color with Tailwind `text-*` classes or inline `style="color: ..."`. Defaults to primary when no color is set. Dark mode and high-contrast mode adapt automatically via different oklch derivation parameters.\n\n**Note:** `emphasize` cannot be combined with `gradient` — they target conflicting rendering modes. When both are set, `gradient` takes precedence and `emphasize` is ignored.'}}}},m={render:()=>s`<div class="flex flex-col gap-8">
153
164
  <div>
154
165
  <div class="mb-2 text-sm font-semibold">Pulse animation (one-shot ring spring)</div>
155
166
  <div class="flex items-center gap-6">
156
- ${[{symbol:"bell",colorClass:"text-primary-600",label:"notification"},{symbol:"alert-circle",colorClass:"text-error-600",label:"alert"},{symbol:"check-circle",colorClass:"text-success-600",label:"confirmed"}].map(({symbol:t,colorClass:m,label:p})=>s`
167
+ ${[{symbol:"bell",colorClass:"text-primary-600",label:"notification"},{symbol:"alert-circle",colorClass:"text-error-600",label:"alert"},{symbol:"check-circle",colorClass:"text-success-600",label:"confirmed"}].map(({symbol:t,colorClass:p,label:b})=>s`
157
168
  <div class="flex flex-col items-center gap-2">
158
- <btu-icon symbol="${t}" size="lg" emphasize="pulse" class="${m}"></btu-icon>
159
- <span class="text-xs font-bold">${p}</span>
169
+ <btu-icon symbol="${t}" size="lg" emphasize="pulse" class="${p}"></btu-icon>
170
+ <span class="text-xs font-bold">${b}</span>
160
171
  </div>
161
172
  `)}
162
173
  </div>
@@ -164,7 +175,7 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
164
175
  <div>
165
176
  <div class="mb-2 text-sm font-semibold">Pulse across sizes</div>
166
177
  <div class="flex items-center gap-6">
167
- ${b.map(t=>s`
178
+ ${u.map(t=>s`
168
179
  <div class="flex flex-col items-center gap-2">
169
180
  <btu-icon symbol="heart" size="${t}" emphasize="pulse"></btu-icon>
170
181
  <span class="text-xs font-bold">${t}</span>
@@ -172,9 +183,9 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
172
183
  `)}
173
184
  </div>
174
185
  </div>
175
- </div>`,parameters:{docs:{description:{story:'Setting `emphasize="pulse"` adds a one-shot ring animation via a pseudo-element that scales outward and fades. The ring starts at the circle boundary and expands with ease-out timing. Respects `prefers-reduced-motion` (degrades to 0.01ms duration). Replays whenever the attribute is set to "pulse".\n\n**Note:** `emphasize` cannot be combined with `gradient` — they target conflicting rendering modes. When both are set, `gradient` takes precedence and `emphasize` is ignored.'}}}};n.parameters={...n.parameters,docs:{...n.parameters?.docs,source:{originalSource:`{
186
+ </div>`,parameters:{docs:{description:{story:'Setting `emphasize="pulse"` adds a one-shot ring animation via a pseudo-element that scales outward and fades. The ring starts at the circle boundary and expands with ease-out timing. Respects `prefers-reduced-motion` (degrades to 0.01ms duration). Replays whenever the attribute is set to "pulse".\n\n**Note:** `emphasize` cannot be combined with `gradient` — they target conflicting rendering modes. When both are set, `gradient` takes precedence and `emphasize` is ignored.'}}}};o.parameters={...o.parameters,docs:{...o.parameters?.docs,source:{originalSource:`{
176
187
  args: {}
177
- }`,...n.parameters?.docs?.source}}};o.parameters={...o.parameters,docs:{...o.parameters?.docs,source:{originalSource:`{
188
+ }`,...o.parameters?.docs?.source}}};i.parameters={...i.parameters,docs:{...i.parameters?.docs,source:{originalSource:`{
178
189
  render: () => html\`<div class="flex items-center gap-4">
179
190
  <btu-icon symbol="heart" size="xs"></btu-icon>
180
191
  <btu-icon symbol="heart" size="sm"></btu-icon>
@@ -189,7 +200,7 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
189
200
  }
190
201
  }
191
202
  }
192
- }`,...o.parameters?.docs?.source}}};a.parameters={...a.parameters,docs:{...a.parameters?.docs,source:{originalSource:`{
203
+ }`,...i.parameters?.docs?.source}}};a.parameters={...a.parameters,docs:{...a.parameters?.docs,source:{originalSource:`{
193
204
  render: () => html\`<div class="flex items-center gap-6">
194
205
  \${[1, 1.5, 2, 2.5, 3].map(w => html\`<div class="flex flex-col items-center gap-2">
195
206
  <btu-icon symbol="heart" size="xl" style="--icon-stroke-width: \${w}"></btu-icon>
@@ -203,7 +214,7 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
203
214
  }
204
215
  }
205
216
  }
206
- }`,...a.parameters?.docs?.source}}};l.parameters={...l.parameters,docs:{...l.parameters?.docs,source:{originalSource:`{
217
+ }`,...a.parameters?.docs?.source}}};r.parameters={...r.parameters,docs:{...r.parameters?.docs,source:{originalSource:`{
207
218
  render: () => html\`<div class="flex flex-wrap items-center justify-between gap-4 px-4">
208
219
  <div class="flex flex-col items-center gap-2">
209
220
  <btu-icon symbol="zap" size="xl" gradient="primary"></btu-icon>
@@ -245,7 +256,7 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
245
256
  }
246
257
  }
247
258
  }
248
- }`,...l.parameters?.docs?.source}}};r.parameters={...r.parameters,docs:{...r.parameters?.docs,source:{originalSource:`{
259
+ }`,...r.parameters?.docs?.source}}};l.parameters={...l.parameters,docs:{...l.parameters?.docs,source:{originalSource:'{\n render: () => html`<div class="flex flex-row items-start gap-8">\n ${Object.keys(BRAND_ICONS).map(name => html`\n <div class="flex flex-col items-center gap-2">\n <btu-icon brand="${name}" style="--icon-size: 2rem"></btu-icon>\n <span class="text-xs font-bold">${name}</span>\n </div>\n `)}\n </div>`,\n parameters: {\n docs: {\n description: {\n story: `\nLucide v1 removed all brand logos, so brand marks are vendored in \\`src/brand-icons.ts\\` —\nofficial artwork from each brand\'s own asset page (sources and trademark caveats are recorded\nthere). Render them with the \\`brand\\` attribute rather than \\`symbol\\`; it takes precedence over\n\\`symbol\\`, inherits \\`currentColor\\`, and supports \\`size\\` and \\`gradient\\`:\n\n\\`\\`\\`html\n<btu-icon brand="slack" size="md"></btu-icon>\n\\`\\`\\`\n\nLegacy \\`symbol\\` values for brand names Lucide removed (facebook, instagram, slack, twitter)\nswap to the vendored mark at runtime for host-app compatibility — new code should use\n\\`brand\\`. The marks are not in the Lucide webfont, so CSS-only contexts use the mask utility\nrather than a font glyph:\n\n\\`\\`\\`css\n.some-label {\n @apply before:btu-icon-brand-slack;\n}\n\\`\\`\\``\n }\n }\n }\n}',...l.parameters?.docs?.source}}};c.parameters={...c.parameters,docs:{...c.parameters?.docs,source:{originalSource:`{
249
260
  render: () => html\`<div class="flex flex-col gap-6">
250
261
  <div class="flex items-center gap-2">
251
262
  <strong>Custom sizing:</strong>
@@ -316,7 +327,7 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
316
327
  }
317
328
  }
318
329
  }
319
- }`,...r.parameters?.docs?.source}}};c.parameters={...c.parameters,docs:{...c.parameters?.docs,source:{originalSource:`{
330
+ }`,...c.parameters?.docs?.source}}};d.parameters={...d.parameters,docs:{...d.parameters?.docs,source:{originalSource:`{
320
331
  render: () => {
321
332
  const colors = [{
322
333
  symbol: 'search',
@@ -387,7 +398,7 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
387
398
  }
388
399
  }
389
400
  }
390
- }`,...c.parameters?.docs?.source}}};d.parameters={...d.parameters,docs:{...d.parameters?.docs,source:{originalSource:`{
401
+ }`,...d.parameters?.docs?.source}}};m.parameters={...m.parameters,docs:{...m.parameters?.docs,source:{originalSource:`{
391
402
  render: () => {
392
403
  const colors = [{
393
404
  symbol: 'bell',
@@ -438,4 +449,4 @@ import{g,x as s}from"./iframe-D1g1spfw.js";import{o as h}from"./style-map-DS-2jf
438
449
  }
439
450
  }
440
451
  }
441
- }`,...d.parameters?.docs?.source}}};const S=["Default","Sizes","StrokeWidths","GradientIcons","AdvancedUsage","Emphasize","EmphasizePulse"];export{r as AdvancedUsage,n as Default,c as Emphasize,d as EmphasizePulse,l as GradientIcons,o as Sizes,a as StrokeWidths,S as __namedExportsOrder,C as default};
452
+ }`,...m.parameters?.docs?.source}}};const B=["Default","Sizes","StrokeWidths","GradientIcons","Brands","AdvancedUsage","Emphasize","EmphasizePulse"];export{c as AdvancedUsage,l as Brands,o as Default,d as Emphasize,m as EmphasizePulse,r as GradientIcons,i as Sizes,a as StrokeWidths,B as __namedExportsOrder,T as default};
@@ -1,4 +1,4 @@
1
- import{g as p,x as e}from"./iframe-D1g1spfw.js";import{o as b}from"./if-defined-D7P78rGH.js";import{L as d}from"./LucideDynamicLoader-jmdq8YDM.js";import"./preload-helper-PPVm8Dsz.js";const{events:u,args:y,argTypes:o}=p("btu-icon-button"),x={title:"Components/Icon Button",component:"btu-icon-button",tags:["autodocs"],parameters:{docs:{subtitle:"Combines button styles with the icon component along with an opinionated API",description:{component:`
1
+ import{g as p,x as e}from"./iframe-CemlMLl9.js";import{o as b}from"./if-defined-C-mi5lcR.js";import{L as d}from"./LucideDynamicLoader-THr3lc5T.js";import"./preload-helper-PPVm8Dsz.js";const{events:u,args:y,argTypes:o}=p("btu-icon-button"),x={title:"Components/Icon Button",component:"btu-icon-button",tags:["autodocs"],parameters:{docs:{subtitle:"Combines button styles with the icon component along with an opinionated API",description:{component:`
2
2
  <h3>When to use:</h3>
3
3
  <ul>
4
4
  <li>For actions in compact or space-constrained interfaces (toolbars, tables, cards)</li>
@@ -1,4 +1,4 @@
1
- import{g as D,E as h,x as T}from"./iframe-D1g1spfw.js";import{o as A}from"./style-map-DS-2jfV3.js";import"./preload-helper-PPVm8Dsz.js";const{events:V,args:k,argTypes:g}=D("btu-linear-progress"),W={title:"Components/Linear Progress",component:"btu-linear-progress",tags:["autodocs"],parameters:{docs:{subtitle:"A horizontal progress bar for showing task completion",description:{component:`
1
+ import{g as D,E as h,x as T}from"./iframe-CemlMLl9.js";import{o as A}from"./style-map-BZ1BR1yx.js";import"./preload-helper-PPVm8Dsz.js";const{events:V,args:k,argTypes:g}=D("btu-linear-progress"),W={title:"Components/Linear Progress",component:"btu-linear-progress",tags:["autodocs"],parameters:{docs:{subtitle:"A horizontal progress bar for showing task completion",description:{component:`
2
2
  <h3>When to use:</h3>
3
3
  <ul>
4
4
  <li>To show progress of a specific task with known completion percentage</li>
@@ -0,0 +1 @@
1
+ const o="1.31.0",s={version:o},c=s.version;export{c as L};
@@ -1,4 +1,4 @@
1
- import{g as S,E as v,x as s}from"./iframe-D1g1spfw.js";import{o as f}from"./if-defined-D7P78rGH.js";import{o as w}from"./style-map-DS-2jfV3.js";import{L as k}from"./LucideDynamicLoader-jmdq8YDM.js";import"./preload-helper-PPVm8Dsz.js";const{events:x,args:L,argTypes:o}=S("btu-message"),T=["primary","info","warning","error","success"],C=[{variant:"primary",label:"Scheduled maintenance on Saturday",description:"Expect up to 30 minutes of downtime starting at 02:00 UTC."},{variant:"info",label:"New feature released",description:"The redesigned editor is now available for all workspaces."},{variant:"warning",label:"API rate limits were updated",description:"Review your usage dashboard to make sure your integrations are still within limits."},{variant:"success",label:"Billing anomaly resolved",description:"All affected invoices have been corrected — no action needed."}],$=(e,t)=>{e.setAttribute("variant",t.variant),e.setAttribute("label",t.label);const n=e.querySelector(".btu-message-description");n&&(n.textContent=t.description??"")},D={title:"Components/Message",component:"btu-message",tags:["autodocs"],parameters:{docs:{subtitle:"High-visibility messages and persistent status anchored to a page or container",description:{component:`
1
+ import{g as S,E as v,x as s}from"./iframe-CemlMLl9.js";import{o as f}from"./if-defined-C-mi5lcR.js";import{o as w}from"./style-map-BZ1BR1yx.js";import{L as k}from"./LucideDynamicLoader-THr3lc5T.js";import"./preload-helper-PPVm8Dsz.js";const{events:x,args:L,argTypes:o}=S("btu-message"),T=["primary","info","warning","error","success"],C=[{variant:"primary",label:"Scheduled maintenance on Saturday",description:"Expect up to 30 minutes of downtime starting at 02:00 UTC."},{variant:"info",label:"New feature released",description:"The redesigned editor is now available for all workspaces."},{variant:"warning",label:"API rate limits were updated",description:"Review your usage dashboard to make sure your integrations are still within limits."},{variant:"success",label:"Billing anomaly resolved",description:"All affected invoices have been corrected — no action needed."}],$=(e,t)=>{e.setAttribute("variant",t.variant),e.setAttribute("label",t.label);const n=e.querySelector(".btu-message-description");n&&(n.textContent=t.description??"")},D={title:"Components/Message",component:"btu-message",tags:["autodocs"],parameters:{docs:{subtitle:"High-visibility messages and persistent status anchored to a page or container",description:{component:`
2
2
  <h3>When to use:</h3>
3
3
  <ul>
4
4
  <li>Communicate messages or provide feedback that is not tied to the user's current action or task</li>
@@ -1,4 +1,4 @@
1
- import{x as h,i as v}from"./iframe-D1g1spfw.js";import{o as k}from"./onFind-ZJa5FYZA.js";import"./preload-helper-PPVm8Dsz.js";const x=e=>{class n extends e{#t=[];onFindRegistration(){return null}#e(){if(this.#t.length)return;const i=this.onFindRegistration();if(!i)return;const d=Array.isArray(i)?i:[i];this.#t=d.map(c=>k(this,c.selectors,c.callback))}connectedCallback(){super.connectedCallback(),this.hasUpdated&&this.#e()}firstUpdated(i){super.firstUpdated(i),this.#e()}disconnectedCallback(){super.disconnectedCallback(),this.#t.forEach(i=>i()),this.#t=[]}}return n},{expect:a,userEvent:l,waitFor:r,within:w}=__STORYBOOK_MODULE_TEST__,b="ofm-demo";if(!customElements.get(b)){class e extends x(v){onFindRegistration(){return{selectors:":scope > .ofm-item",callback:t=>t.classList.add("ring-2","ring-success-500")}}render(){return h`<slot></slot>`}}customElements.define(b,e)}const p="ofm-multi";if(!customElements.get(p)){class e extends x(v){onFindRegistration(){return[{selectors:":scope > .ofm-a",callback:t=>t.classList.add("ring-2","ring-success-500")},{selectors:":scope > .ofm-b",callback:t=>t.classList.add("ring-2","ring-primary-500")}]}render(){return h`<slot></slot>`}}customElements.define(p,e)}function g(){return globalThis[Symbol.for("brightspot.onFind")]?.callbacks?.length??0}const M={title:"Mixins/OnFind Mixin",tags:["autodocs"],parameters:{docs:{description:{component:`
1
+ import{x as h,i as v}from"./iframe-CemlMLl9.js";import{o as k}from"./onFind-96dPwZGj.js";import"./preload-helper-PPVm8Dsz.js";const x=e=>{class n extends e{#t=[];onFindRegistration(){return null}#e(){if(this.#t.length)return;const i=this.onFindRegistration();if(!i)return;const d=Array.isArray(i)?i:[i];this.#t=d.map(c=>k(this,c.selectors,c.callback))}connectedCallback(){super.connectedCallback(),this.hasUpdated&&this.#e()}firstUpdated(i){super.firstUpdated(i),this.#e()}disconnectedCallback(){super.disconnectedCallback(),this.#t.forEach(i=>i()),this.#t=[]}}return n},{expect:a,userEvent:l,waitFor:r,within:w}=__STORYBOOK_MODULE_TEST__,b="ofm-demo";if(!customElements.get(b)){class e extends x(v){onFindRegistration(){return{selectors:":scope > .ofm-item",callback:t=>t.classList.add("ring-2","ring-success-500")}}render(){return h`<slot></slot>`}}customElements.define(b,e)}const p="ofm-multi";if(!customElements.get(p)){class e extends x(v){onFindRegistration(){return[{selectors:":scope > .ofm-a",callback:t=>t.classList.add("ring-2","ring-success-500")},{selectors:":scope > .ofm-b",callback:t=>t.classList.add("ring-2","ring-primary-500")}]}render(){return h`<slot></slot>`}}customElements.define(p,e)}function g(){return globalThis[Symbol.for("brightspot.onFind")]?.callbacks?.length??0}const M={title:"Mixins/OnFind Mixin",tags:["autodocs"],parameters:{docs:{description:{component:`
2
2
  \`OnFindMixin\` registers an \`onFind\` child-redistribution callback and
3
3
  **tears it down on disconnect**, so a detached component is garbage-collectable
4
4
  and stops being visited on every document mutation.
@@ -1,4 +1,4 @@
1
- import{g as m,x as u}from"./iframe-D1g1spfw.js";import{o as g}from"./style-map-DS-2jfV3.js";import"./preload-helper-PPVm8Dsz.js";const{events:b,args:h,argTypes:y}=m("btu-pagination"),c=e=>{const t={};return e.customBackgroundColor&&(t["--pagination-color-background"]=e.customBackgroundColor),e.customForegroundColor&&(t["--pagination-color-foreground"]=e.customForegroundColor),t},$={title:"Components/Pagination",component:"btu-pagination",tags:["autodocs"],parameters:{docs:{subtitle:"A component for navigating through paged content",description:{component:`
1
+ import{g as m,x as u}from"./iframe-CemlMLl9.js";import{o as g}from"./style-map-BZ1BR1yx.js";import"./preload-helper-PPVm8Dsz.js";const{events:b,args:h,argTypes:y}=m("btu-pagination"),c=e=>{const t={};return e.customBackgroundColor&&(t["--pagination-color-background"]=e.customBackgroundColor),e.customForegroundColor&&(t["--pagination-color-foreground"]=e.customForegroundColor),t},$={title:"Components/Pagination",component:"btu-pagination",tags:["autodocs"],parameters:{docs:{subtitle:"A component for navigating through paged content",description:{component:`
2
2
  <h3>When to use:</h3>
3
3
  <ul>
4
4
  <li>To navigate through large sets of data</li>
@@ -1,4 +1,4 @@
1
- import{g as p,x as n}from"./iframe-D1g1spfw.js";import{o as c}from"./if-defined-D7P78rGH.js";import{o as d}from"./style-map-DS-2jfV3.js";import"./preload-helper-PPVm8Dsz.js";const{events:u,args:g,argTypes:o}=p("btu-popover"),f={title:"Components/Popover",component:"btu-popover",tags:["autodocs"],parameters:{docs:{subtitle:"Rich interactive content anchored to a trigger element",description:{component:`
1
+ import{g as p,x as n}from"./iframe-CemlMLl9.js";import{o as c}from"./if-defined-C-mi5lcR.js";import{o as d}from"./style-map-BZ1BR1yx.js";import"./preload-helper-PPVm8Dsz.js";const{events:u,args:g,argTypes:o}=p("btu-popover"),f={title:"Components/Popover",component:"btu-popover",tags:["autodocs"],parameters:{docs:{subtitle:"Rich interactive content anchored to a trigger element",description:{component:`
2
2
  \`btu-popover\` displays rich interactive content anchored to a trigger element using CSS anchor positioning and the native Popover API.
3
3
 
4
4
  <h3>When to use:</h3>
@@ -1 +1 @@
1
- import"./iframe-D1g1spfw.js";const l=t=>{class n extends t{connectedCallback(){super.connectedCallback(),Promise.resolve().then(()=>this.emit("btu-element-connected",{}),e=>this.emit("btu-element-error",{error:e}))}disconnectedCallback(){super.disconnectedCallback(),this.emit("btu-element-disconnected")}emit(e,c){const a=new CustomEvent(e,{bubbles:!0,cancelable:!1,composed:!0,detail:c});return this.dispatchEvent(a)}}return n},d=t=>{class n extends t{connectedCallback(){const e=()=>{super.connectedCallback()};document.readyState!=="loading"?e():document.addEventListener("DOMContentLoaded",()=>e())}}return n};export{l as E,d as R};
1
+ import"./iframe-CemlMLl9.js";const l=t=>{class n extends t{connectedCallback(){super.connectedCallback(),Promise.resolve().then(()=>this.emit("btu-element-connected",{}),e=>this.emit("btu-element-error",{error:e}))}disconnectedCallback(){super.disconnectedCallback(),this.emit("btu-element-disconnected")}emit(e,c){const a=new CustomEvent(e,{bubbles:!0,cancelable:!1,composed:!0,detail:c});return this.dispatchEvent(a)}}return n},d=t=>{class n extends t{connectedCallback(){const e=()=>{super.connectedCallback()};document.readyState!=="loading"?e():document.addEventListener("DOMContentLoaded",()=>e())}}return n};export{l as E,d as R};
@@ -1,4 +1,4 @@
1
- import{x as l,i as v}from"./iframe-D1g1spfw.js";import{t as m}from"./custom-element-UsVr97OX.js";import"./preload-helper-PPVm8Dsz.js";const h=n=>{class i extends n{constructor(){super(...arguments),this._rovingIndex=0}_getRovingTargets(){return[]}_rovingFocus(t,e=!0){const o=this._getRovingTargets();if(o.length===0)return;const r=Math.max(0,Math.min(t,o.length-1));o.forEach((u,b)=>u.setAttribute("tabindex",b===r?"0":"-1")),e&&o[r]?.focus(),this._rovingIndex=r}_rovingNext(){const t=this._getRovingTargets();if(t.length===0)return;const e=this._rovingCurrentIndex(),o=e<t.length-1?e+1:0;this._rovingFocus(o)}_rovingPrev(){const t=this._getRovingTargets();if(t.length===0)return;const e=this._rovingCurrentIndex(),o=e>0?e-1:t.length-1;this._rovingFocus(o)}_rovingFirst(){this._rovingFocus(0)}_rovingLast(){const t=this._getRovingTargets();t.length>0&&this._rovingFocus(t.length-1)}_rovingCurrentIndex(){const t=document.activeElement;return this._getRovingTargets().findIndex(e=>e===t||e.contains(t))}}return i};var a=Object.freeze,x=Object.defineProperty,p=Object.getOwnPropertyDescriptor,f=(n,i,d,t)=>{for(var e=t>1?void 0:t?p(i,d):i,o=n.length-1,r;o>=0;o--)(r=n[o])&&(e=r(e)||e);return e},y=(n,i)=>a(x(n,"raw",{value:a(n.slice())})),c;const T={title:"Mixins/Roving Tabindex",tags:["autodocs"],parameters:{docs:{description:{component:`
1
+ import{x as l,i as v}from"./iframe-CemlMLl9.js";import{t as m}from"./custom-element-UsVr97OX.js";import"./preload-helper-PPVm8Dsz.js";const h=n=>{class i extends n{constructor(){super(...arguments),this._rovingIndex=0}_getRovingTargets(){return[]}_rovingFocus(t,e=!0){const o=this._getRovingTargets();if(o.length===0)return;const r=Math.max(0,Math.min(t,o.length-1));o.forEach((u,b)=>u.setAttribute("tabindex",b===r?"0":"-1")),e&&o[r]?.focus(),this._rovingIndex=r}_rovingNext(){const t=this._getRovingTargets();if(t.length===0)return;const e=this._rovingCurrentIndex(),o=e<t.length-1?e+1:0;this._rovingFocus(o)}_rovingPrev(){const t=this._getRovingTargets();if(t.length===0)return;const e=this._rovingCurrentIndex(),o=e>0?e-1:t.length-1;this._rovingFocus(o)}_rovingFirst(){this._rovingFocus(0)}_rovingLast(){const t=this._getRovingTargets();t.length>0&&this._rovingFocus(t.length-1)}_rovingCurrentIndex(){const t=document.activeElement;return this._getRovingTargets().findIndex(e=>e===t||e.contains(t))}}return i};var a=Object.freeze,x=Object.defineProperty,p=Object.getOwnPropertyDescriptor,f=(n,i,d,t)=>{for(var e=t>1?void 0:t?p(i,d):i,o=n.length-1,r;o>=0;o--)(r=n[o])&&(e=r(e)||e);return e},y=(n,i)=>a(x(n,"raw",{value:a(n.slice())})),c;const T={title:"Mixins/Roving Tabindex",tags:["autodocs"],parameters:{docs:{description:{component:`
2
2
  \`RovingTabindexMixin\` provides **roving tabindex** navigation primitives for toolbar and menu components following the <a href="https://www.w3.org/WAI/ARIA/apd/practices/keyboard-interface/#kbd_roving_tabindex" target="_blank">WAI-ARIA Keyboard Interface Pattern</a>.
3
3
 
4
4
  In a roving tabindex, only one element in the group has \`tabindex="0"\` (reachable via Tab), while all others have \`tabindex="-1"\`. Arrow keys move focus between items, wrapping at both ends.
@@ -1,4 +1,4 @@
1
- import{x as o}from"./iframe-D1g1spfw.js";import"./preload-helper-PPVm8Dsz.js";const r={title:"Utilities/RTC",tags:["autodocs"],parameters:{docs:{subtitle:"The `rtc` module provides real-time communication between browser tabs and the Brightspot CMS server. Uses BroadcastChannel for cross-tab coordination with leader election, and Server-Sent Events for server communication."},controls:{expanded:!0}}},e={render:()=>o`
1
+ import{x as o}from"./iframe-CemlMLl9.js";import"./preload-helper-PPVm8Dsz.js";const r={title:"Utilities/RTC",tags:["autodocs"],parameters:{docs:{subtitle:"The `rtc` module provides real-time communication between browser tabs and the Brightspot CMS server. Uses BroadcastChannel for cross-tab coordination with leader election, and Server-Sent Events for server communication."},controls:{expanded:!0}}},e={render:()=>o`
2
2
  <div class="space-y-6 text-sm">
3
3
  <div>
4
4
  <h3 class="mb-2 font-bold">Overview</h3>
@@ -1,4 +1,4 @@
1
- import{x as a}from"./iframe-D1g1spfw.js";import"./preload-helper-PPVm8Dsz.js";const l=({theme:e="btu-scrollshadow-25"})=>{const r=new Array(100).fill(0).map((s,t)=>`Item ${t+1}`);return a`
1
+ import{x as a}from"./iframe-CemlMLl9.js";import"./preload-helper-PPVm8Dsz.js";const l=({theme:e="btu-scrollshadow-25"})=>{const r=new Array(100).fill(0).map((s,t)=>`Item ${t+1}`);return a`
2
2
  <style>
3
3
  :root {
4
4
  --can-scroll: ;
@@ -1,4 +1,4 @@
1
- import{g as k,x as c}from"./iframe-D1g1spfw.js";import{o as s}from"./if-defined-D7P78rGH.js";import{o as f}from"./style-map-DS-2jfV3.js";import{L as w}from"./LucideDynamicLoader-jmdq8YDM.js";import"./preload-helper-PPVm8Dsz.js";const{events:v,args:y,argTypes:g}=k("btu-switch"),x={customColorOn:"--switch-color-track-on",customColorOff:"--switch-color-track-off",customKnobColor:"--switch-color-knob",customLabelSpacing:"--switch-label-spacing",customIconSize:"--switch-track-icon-size"},S=e=>Object.entries(x).reduce((o,[t,n])=>(e[t]&&(o[n]=e[t]),o),{}),L={title:"Components/Switch",component:"btu-switch",tags:["autodocs"],parameters:{docs:{subtitle:"A toggle switch for binary on/off states",description:{component:`
1
+ import{g as k,x as c}from"./iframe-CemlMLl9.js";import{o as s}from"./if-defined-C-mi5lcR.js";import{o as f}from"./style-map-BZ1BR1yx.js";import{L as w}from"./LucideDynamicLoader-THr3lc5T.js";import"./preload-helper-PPVm8Dsz.js";const{events:v,args:y,argTypes:g}=k("btu-switch"),x={customColorOn:"--switch-color-track-on",customColorOff:"--switch-color-track-off",customKnobColor:"--switch-color-knob",customLabelSpacing:"--switch-label-spacing",customIconSize:"--switch-track-icon-size"},S=e=>Object.entries(x).reduce((o,[t,n])=>(e[t]&&(o[n]=e[t]),o),{}),L={title:"Components/Switch",component:"btu-switch",tags:["autodocs"],parameters:{docs:{subtitle:"A toggle switch for binary on/off states",description:{component:`
2
2
  <h3>When to use:</h3>
3
3
  <ul>
4
4
  <li>For toggling a setting or preference on/off</li>
@@ -1,4 +1,4 @@
1
- import{g as u,x as e}from"./iframe-D1g1spfw.js";import{o as d}from"./style-map-DS-2jfV3.js";import"./preload-helper-PPVm8Dsz.js";const{events:c,args:m,argTypes:t}=u("btu-tab"),y={title:"Components/Tabs/Tab",component:"btu-tab",tags:["autodocs"],parameters:{docs:{subtitle:"btu-tab",description:{component:`
1
+ import{g as u,x as e}from"./iframe-CemlMLl9.js";import{o as d}from"./style-map-BZ1BR1yx.js";import"./preload-helper-PPVm8Dsz.js";const{events:c,args:m,argTypes:t}=u("btu-tab"),y={title:"Components/Tabs/Tab",component:"btu-tab",tags:["autodocs"],parameters:{docs:{subtitle:"btu-tab",description:{component:`
2
2
  An individual tab within a \`btu-tabs\` group.
3
3
 
4
4
  Renders a button with \`role="tab"\` that participates in keyboard navigation and selection state managed by the parent \`btu-tabs\` container.
@@ -1,4 +1,4 @@
1
- import{g as b,E as i,x as s}from"./iframe-D1g1spfw.js";import{o as c}from"./style-map-DS-2jfV3.js";import"./preload-helper-PPVm8Dsz.js";const{events:d,args:u,argTypes:a}=b("btu-tabs"),h={title:"Components/Tabs",component:"btu-tabs",tags:["autodocs"],parameters:{docs:{subtitle:"btu-tabs",description:{component:`
1
+ import{g as b,E as i,x as s}from"./iframe-CemlMLl9.js";import{o as c}from"./style-map-BZ1BR1yx.js";import"./preload-helper-PPVm8Dsz.js";const{events:d,args:u,argTypes:a}=b("btu-tabs"),h={title:"Components/Tabs",component:"btu-tabs",tags:["autodocs"],parameters:{docs:{subtitle:"btu-tabs",description:{component:`
2
2
  A tab group component that manages selection state across a set of \`btu-tab\` children.
3
3
 
4
4
  <h3>When to use:</h3>
@@ -1,4 +1,4 @@
1
- import{x as u}from"./iframe-D1g1spfw.js";import"./preload-helper-PPVm8Dsz.js";function v(e,t){if(e<=0)return t;let n,o=0;return function(){if(n)return;const r=Date.now(),s=e-r+o;s<=0?(o=r,t.apply(this,[...arguments])):n=setTimeout(()=>{o=r,n=void 0,t.apply(this,[...arguments])},s)}}const x={title:"Utilities/Throttle",tags:["autodocs"],parameters:{docs:{subtitle:"The `throttle` utility function limits how often a function can execute, ensuring it runs at most once per specified interval. Useful for high-frequency events like scroll, resize, or mousemove."},controls:{expanded:!0}},argTypes:{interval:{control:{type:"number",min:0,max:2e3,step:50},description:"Throttle interval in milliseconds"}},args:{interval:200}},d={render:e=>{const t=`throttle-${Math.random().toString(36).substring(2,9)}`;let n=0,o=0;const r=()=>{const m=document.getElementById(`${t}-normal-count`),h=document.getElementById(`${t}-throttled-count`);m&&(m.textContent=String(n)),h&&(h.textContent=String(o))},s=v(e.interval,()=>{o++,r()}),a=()=>{n++,r()},l=()=>{a(),s()};return u`
1
+ import{x as u}from"./iframe-CemlMLl9.js";import"./preload-helper-PPVm8Dsz.js";function v(e,t){if(e<=0)return t;let n,o=0;return function(){if(n)return;const r=Date.now(),s=e-r+o;s<=0?(o=r,t.apply(this,[...arguments])):n=setTimeout(()=>{o=r,n=void 0,t.apply(this,[...arguments])},s)}}const x={title:"Utilities/Throttle",tags:["autodocs"],parameters:{docs:{subtitle:"The `throttle` utility function limits how often a function can execute, ensuring it runs at most once per specified interval. Useful for high-frequency events like scroll, resize, or mousemove."},controls:{expanded:!0}},argTypes:{interval:{control:{type:"number",min:0,max:2e3,step:50},description:"Throttle interval in milliseconds"}},args:{interval:200}},d={render:e=>{const t=`throttle-${Math.random().toString(36).substring(2,9)}`;let n=0,o=0;const r=()=>{const m=document.getElementById(`${t}-normal-count`),h=document.getElementById(`${t}-throttled-count`);m&&(m.textContent=String(n)),h&&(h.textContent=String(o))},s=v(e.interval,()=>{o++,r()}),a=()=>{n++,r()},l=()=>{a(),s()};return u`
2
2
  <div class="space-y-4">
3
3
  <div class="text-base">
4
4
  <p class="mb-2">
@@ -1,4 +1,4 @@
1
- import{ah as v,ai as x,x as c,i as w}from"./iframe-D1g1spfw.js";import{t as E}from"./custom-element-UsVr97OX.js";import{o as T}from"./if-defined-D7P78rGH.js";import{o as k}from"./style-map-DS-2jfV3.js";import{E as C,R as L}from"./ReadyMixin-B6XKdlIG.js";import"./preload-helper-PPVm8Dsz.js";const D={attribute:!0,type:String,converter:x,reflect:!1,hasChanged:v},S=(o=D,i,l)=>{const{kind:t,metadata:e}=l;let s=globalThis.litPropertyMetadata.get(e);if(s===void 0&&globalThis.litPropertyMetadata.set(e,s=new Map),t==="setter"&&((o=Object.create(o)).wrapped=!0),s.set(l.name,o),t==="accessor"){const{name:r}=l;return{set(n){const g=i.get.call(this);i.set.call(this,n),this.requestUpdate(r,g,o)},init(n){return n!==void 0&&this.C(r,void 0,o,n),n}}}if(t==="setter"){const{name:r}=l;return function(n){const g=this[r];i.call(this,n),this.requestUpdate(r,g,o)}}throw Error("Unsupported decorator location: "+t)};function p(o){return(i,l)=>typeof l=="object"?S(o,i,l):((t,e,s)=>{const r=e.hasOwnProperty(s);return e.constructor.createProperty(s,t),r?Object.getOwnPropertyDescriptor(e,s):void 0})(o,i,l)}var A=Object.defineProperty,a=(o,i,l,t)=>{for(var e=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(e=r(i,l,e)||e);return e&&A(i,l,e),e};const M={top:"btu-tooltip-top",bottom:"btu-tooltip-bottom",left:"btu-tooltip-left",right:"btu-tooltip-right"},_={sm:"btu-tooltip-offset-sm",md:"btu-tooltip-offset-md",lg:"btu-tooltip-offset-lg",xl:"btu-tooltip-offset-xl"},O=o=>{class i extends o{constructor(){super(...arguments),this.tooltip="",this.tooltipPosition="top",this.tooltipDelay=300,this.tooltipOffset=null,this.tooltipNoArrow=!1,this.tooltipTrigger="hover focus",this._tooltipEl=null,this._tooltipId=`btu-tooltip-${crypto.randomUUID()}`,this._anchorName=`--btu-trigger-${crypto.randomUUID()}`,this._showTimer=null,this._isVisible=!1,this._activeTriggers=new Set,this._onMouseEnter=this._handleMouseEnter.bind(this),this._onMouseLeave=this._handleMouseLeave.bind(this),this._onFocusIn=this._handleFocusIn.bind(this),this._onFocusOut=this._handleFocusOut.bind(this),this._onClick=this._handleClick.bind(this),this._onNativeToggle=this._handleNativeToggle.bind(this),this._onKeyDown=this._handleKeyDown.bind(this),this._onDocumentClick=null}connectedCallback(){super.connectedCallback(),this._bindTriggerListeners()}disconnectedCallback(){if(this._clearShowTimer(),this._removeDocumentClickListener(),this._unbindTriggerListeners(),this._tooltipEl){try{this._tooltipEl.hidePopover()}catch(t){t instanceof DOMException&&t.name==="InvalidStateError"||console.warn("[btu-tooltip] Failed to hide tooltip during disconnect:",t)}this._tooltipEl.removeEventListener("toggle",this._onNativeToggle),this._tooltipEl.remove(),this._tooltipEl=null}this._removeAriaDescribedBy(),this.style.removeProperty("anchor-name"),this._isVisible=!1,super.disconnectedCallback()}updated(t){super.updated(t),t.has("tooltipTrigger")&&(this._unbindTriggerListeners(),this._bindTriggerListeners(),this._tooltipEl&&(this._isVisible&&this._hide(),this._tooltipEl.setAttribute("popover",this._getPopoverMode()))),(t.has("tooltip")||t.has("tooltipPosition")||t.has("tooltipDelay")||t.has("tooltipOffset")||t.has("tooltipNoArrow"))&&this._syncTooltipElement()}_getPopoverMode(){return"manual"}_syncTooltipElement(){if(!this.tooltip){this._tooltipEl&&(this._hide(),this._tooltipEl.removeEventListener("toggle",this._onNativeToggle),this._tooltipEl.remove(),this._tooltipEl=null,this._removeAriaDescribedBy(),this.style.removeProperty("anchor-name"),document.removeEventListener("keydown",this._onKeyDown));return}this.style.setProperty("anchor-name",this._anchorName),this._tooltipEl||(this._tooltipEl=this._createTooltipElement(),this.appendChild(this._tooltipEl),this._appendAriaDescribedBy(),document.addEventListener("keydown",this._onKeyDown)),this._tooltipEl.textContent=this.tooltip,this._tooltipEl.className=this._buildTooltipClasses()}_createTooltipElement(){const t=document.createElement("div");return t.id=this._tooltipId,t.className=this._buildTooltipClasses(),t.setAttribute("role","tooltip"),t.setAttribute("data-tooltip-internal",""),t.setAttribute("popover",this._getPopoverMode()),t.style.setProperty("position-anchor",this._anchorName),t.textContent=this.tooltip,t.addEventListener("toggle",this._onNativeToggle),t}_buildTooltipClasses(){const t=["btu-tooltip",M[this.tooltipPosition]];return this.tooltipOffset&&_[this.tooltipOffset]&&t.push(_[this.tooltipOffset]),this.tooltipNoArrow&&t.push("btu-tooltip-no-arrow"),t.join(" ")}_hasTrigger(t){return this._activeTriggers.has(t)}_bindTriggerListeners(){const t=new Set(["hover","focus","click"]);this._activeTriggers=new Set(this.tooltipTrigger.trim().split(/\s+/));for(const e of this._activeTriggers)t.has(e)||console.warn(`[btu-tooltip] Unrecognized tooltip-trigger value: "${e}". Valid values: hover, focus, click.`);this._hasTrigger("hover")&&(this.addEventListener("mouseenter",this._onMouseEnter),this.addEventListener("mouseleave",this._onMouseLeave)),this._hasTrigger("focus")&&(this.addEventListener("focusin",this._onFocusIn),this.addEventListener("focusout",this._onFocusOut)),this._hasTrigger("click")&&this.addEventListener("click",this._onClick)}_unbindTriggerListeners(){this.removeEventListener("mouseenter",this._onMouseEnter),this.removeEventListener("mouseleave",this._onMouseLeave),this.removeEventListener("focusin",this._onFocusIn),this.removeEventListener("focusout",this._onFocusOut),this.removeEventListener("click",this._onClick),document.removeEventListener("keydown",this._onKeyDown)}_show(){if(!(this._isVisible||!this._tooltipEl)){try{this._tooltipEl.showPopover()}catch(t){t instanceof DOMException&&t.name==="InvalidStateError"||console.warn("[btu-tooltip] Failed to show tooltip:",t)}this._hasTrigger("click")&&setTimeout(()=>{this._removeDocumentClickListener(),this._onDocumentClick=t=>{const e=t.composedPath();!e.includes(this)&&(!this._tooltipEl||!e.includes(this._tooltipEl))&&this._hide()},document.addEventListener("click",this._onDocumentClick)},0)}}_hide(){if(this._clearShowTimer(),this._removeDocumentClickListener(),!(!this._isVisible||!this._tooltipEl))try{this._tooltipEl.hidePopover()}catch(t){t instanceof DOMException&&t.name==="InvalidStateError"||console.warn("[btu-tooltip] Failed to hide tooltip:",t)}}_removeDocumentClickListener(){this._onDocumentClick&&(document.removeEventListener("click",this._onDocumentClick),this._onDocumentClick=null)}_handleNativeToggle(t){const{newState:e}=t;this._isVisible=e==="open";const s=this._isVisible?"btu-tooltip-show":"btu-tooltip-hide",r=new CustomEvent(s,{bubbles:!0,composed:!0});this.dispatchEvent(r)}_handleKeyDown(t){t.key==="Escape"&&(this._clearShowTimer(),this._hide())}_clearShowTimer(){this._showTimer!==null&&(clearTimeout(this._showTimer),this._showTimer=null)}_handleMouseEnter(){this._clearShowTimer(),this._showTimer=setTimeout(()=>{this._show()},this.tooltipDelay)}_handleMouseLeave(){this._clearShowTimer(),this._hide()}_handleFocusIn(){this._clearShowTimer(),this._show()}_handleFocusOut(){this._clearShowTimer(),this._hide()}_handleClick(){this._clearShowTimer(),this._isVisible?this._hide():this._show()}_appendAriaDescribedBy(){const t=this.getAttribute("aria-describedby");t?t.includes(this._tooltipId)||this.setAttribute("aria-describedby",`${t} ${this._tooltipId}`):this.setAttribute("aria-describedby",this._tooltipId)}_removeAriaDescribedBy(){const t=this.getAttribute("aria-describedby");if(!t)return;const e=t.split(/\s+/).filter(s=>s!==this._tooltipId).join(" ").trim();e?this.setAttribute("aria-describedby",e):this.removeAttribute("aria-describedby")}}return a([p({attribute:"tooltip"})],i.prototype,"tooltip"),a([p({attribute:"tooltip-position"})],i.prototype,"tooltipPosition"),a([p({attribute:"tooltip-delay",type:Number})],i.prototype,"tooltipDelay"),a([p({attribute:"tooltip-offset"})],i.prototype,"tooltipOffset"),a([p({attribute:"tooltip-no-arrow",type:Boolean})],i.prototype,"tooltipNoArrow"),a([p({attribute:"tooltip-trigger"})],i.prototype,"tooltipTrigger"),i};var P=Object.defineProperty,$=Object.getOwnPropertyDescriptor,y=(o,i,l,t)=>{for(var e=t>1?void 0:t?$(i,l):i,s=o.length-1,r;s>=0;s--)(r=o[s])&&(e=(t?r(i,l,e):r(e))||e);return t&&e&&P(i,l,e),e};let b=class extends O(C(L(w))){constructor(){super(...arguments),this.label="Hover me",this.initialClasses=[]}connectedCallback(){super.connectedCallback(),this.className&&(this.initialClasses=this.className.split(" ").filter(o=>o.trim()))}createRenderRoot(){return this}willUpdate(){const o=[...this.initialClasses,"tooltip-demo"];this.className=o.filter(Boolean).join(" ")}render(){return c`${this.label}`}};y([p({type:String})],b.prototype,"label",2);b=y([E("tooltip-demo")],b);const f=`
1
+ import{ah as v,ai as x,x as c,i as w}from"./iframe-CemlMLl9.js";import{t as E}from"./custom-element-UsVr97OX.js";import{o as T}from"./if-defined-C-mi5lcR.js";import{o as k}from"./style-map-BZ1BR1yx.js";import{E as C,R as L}from"./ReadyMixin-euHV5BrF.js";import"./preload-helper-PPVm8Dsz.js";const D={attribute:!0,type:String,converter:x,reflect:!1,hasChanged:v},S=(o=D,i,l)=>{const{kind:t,metadata:e}=l;let s=globalThis.litPropertyMetadata.get(e);if(s===void 0&&globalThis.litPropertyMetadata.set(e,s=new Map),t==="setter"&&((o=Object.create(o)).wrapped=!0),s.set(l.name,o),t==="accessor"){const{name:r}=l;return{set(n){const g=i.get.call(this);i.set.call(this,n),this.requestUpdate(r,g,o)},init(n){return n!==void 0&&this.C(r,void 0,o,n),n}}}if(t==="setter"){const{name:r}=l;return function(n){const g=this[r];i.call(this,n),this.requestUpdate(r,g,o)}}throw Error("Unsupported decorator location: "+t)};function p(o){return(i,l)=>typeof l=="object"?S(o,i,l):((t,e,s)=>{const r=e.hasOwnProperty(s);return e.constructor.createProperty(s,t),r?Object.getOwnPropertyDescriptor(e,s):void 0})(o,i,l)}var A=Object.defineProperty,a=(o,i,l,t)=>{for(var e=void 0,s=o.length-1,r;s>=0;s--)(r=o[s])&&(e=r(i,l,e)||e);return e&&A(i,l,e),e};const M={top:"btu-tooltip-top",bottom:"btu-tooltip-bottom",left:"btu-tooltip-left",right:"btu-tooltip-right"},_={sm:"btu-tooltip-offset-sm",md:"btu-tooltip-offset-md",lg:"btu-tooltip-offset-lg",xl:"btu-tooltip-offset-xl"},O=o=>{class i extends o{constructor(){super(...arguments),this.tooltip="",this.tooltipPosition="top",this.tooltipDelay=300,this.tooltipOffset=null,this.tooltipNoArrow=!1,this.tooltipTrigger="hover focus",this._tooltipEl=null,this._tooltipId=`btu-tooltip-${crypto.randomUUID()}`,this._anchorName=`--btu-trigger-${crypto.randomUUID()}`,this._showTimer=null,this._isVisible=!1,this._activeTriggers=new Set,this._onMouseEnter=this._handleMouseEnter.bind(this),this._onMouseLeave=this._handleMouseLeave.bind(this),this._onFocusIn=this._handleFocusIn.bind(this),this._onFocusOut=this._handleFocusOut.bind(this),this._onClick=this._handleClick.bind(this),this._onNativeToggle=this._handleNativeToggle.bind(this),this._onKeyDown=this._handleKeyDown.bind(this),this._onDocumentClick=null}connectedCallback(){super.connectedCallback(),this._bindTriggerListeners()}disconnectedCallback(){if(this._clearShowTimer(),this._removeDocumentClickListener(),this._unbindTriggerListeners(),this._tooltipEl){try{this._tooltipEl.hidePopover()}catch(t){t instanceof DOMException&&t.name==="InvalidStateError"||console.warn("[btu-tooltip] Failed to hide tooltip during disconnect:",t)}this._tooltipEl.removeEventListener("toggle",this._onNativeToggle),this._tooltipEl.remove(),this._tooltipEl=null}this._removeAriaDescribedBy(),this.style.removeProperty("anchor-name"),this._isVisible=!1,super.disconnectedCallback()}updated(t){super.updated(t),t.has("tooltipTrigger")&&(this._unbindTriggerListeners(),this._bindTriggerListeners(),this._tooltipEl&&(this._isVisible&&this._hide(),this._tooltipEl.setAttribute("popover",this._getPopoverMode()))),(t.has("tooltip")||t.has("tooltipPosition")||t.has("tooltipDelay")||t.has("tooltipOffset")||t.has("tooltipNoArrow"))&&this._syncTooltipElement()}_getPopoverMode(){return"manual"}_syncTooltipElement(){if(!this.tooltip){this._tooltipEl&&(this._hide(),this._tooltipEl.removeEventListener("toggle",this._onNativeToggle),this._tooltipEl.remove(),this._tooltipEl=null,this._removeAriaDescribedBy(),this.style.removeProperty("anchor-name"),document.removeEventListener("keydown",this._onKeyDown));return}this.style.setProperty("anchor-name",this._anchorName),this._tooltipEl||(this._tooltipEl=this._createTooltipElement(),this.appendChild(this._tooltipEl),this._appendAriaDescribedBy(),document.addEventListener("keydown",this._onKeyDown)),this._tooltipEl.textContent=this.tooltip,this._tooltipEl.className=this._buildTooltipClasses()}_createTooltipElement(){const t=document.createElement("div");return t.id=this._tooltipId,t.className=this._buildTooltipClasses(),t.setAttribute("role","tooltip"),t.setAttribute("data-tooltip-internal",""),t.setAttribute("popover",this._getPopoverMode()),t.style.setProperty("position-anchor",this._anchorName),t.textContent=this.tooltip,t.addEventListener("toggle",this._onNativeToggle),t}_buildTooltipClasses(){const t=["btu-tooltip",M[this.tooltipPosition]];return this.tooltipOffset&&_[this.tooltipOffset]&&t.push(_[this.tooltipOffset]),this.tooltipNoArrow&&t.push("btu-tooltip-no-arrow"),t.join(" ")}_hasTrigger(t){return this._activeTriggers.has(t)}_bindTriggerListeners(){const t=new Set(["hover","focus","click"]);this._activeTriggers=new Set(this.tooltipTrigger.trim().split(/\s+/));for(const e of this._activeTriggers)t.has(e)||console.warn(`[btu-tooltip] Unrecognized tooltip-trigger value: "${e}". Valid values: hover, focus, click.`);this._hasTrigger("hover")&&(this.addEventListener("mouseenter",this._onMouseEnter),this.addEventListener("mouseleave",this._onMouseLeave)),this._hasTrigger("focus")&&(this.addEventListener("focusin",this._onFocusIn),this.addEventListener("focusout",this._onFocusOut)),this._hasTrigger("click")&&this.addEventListener("click",this._onClick)}_unbindTriggerListeners(){this.removeEventListener("mouseenter",this._onMouseEnter),this.removeEventListener("mouseleave",this._onMouseLeave),this.removeEventListener("focusin",this._onFocusIn),this.removeEventListener("focusout",this._onFocusOut),this.removeEventListener("click",this._onClick),document.removeEventListener("keydown",this._onKeyDown)}_show(){if(!(this._isVisible||!this._tooltipEl)){try{this._tooltipEl.showPopover()}catch(t){t instanceof DOMException&&t.name==="InvalidStateError"||console.warn("[btu-tooltip] Failed to show tooltip:",t)}this._hasTrigger("click")&&setTimeout(()=>{this._removeDocumentClickListener(),this._onDocumentClick=t=>{const e=t.composedPath();!e.includes(this)&&(!this._tooltipEl||!e.includes(this._tooltipEl))&&this._hide()},document.addEventListener("click",this._onDocumentClick)},0)}}_hide(){if(this._clearShowTimer(),this._removeDocumentClickListener(),!(!this._isVisible||!this._tooltipEl))try{this._tooltipEl.hidePopover()}catch(t){t instanceof DOMException&&t.name==="InvalidStateError"||console.warn("[btu-tooltip] Failed to hide tooltip:",t)}}_removeDocumentClickListener(){this._onDocumentClick&&(document.removeEventListener("click",this._onDocumentClick),this._onDocumentClick=null)}_handleNativeToggle(t){const{newState:e}=t;this._isVisible=e==="open";const s=this._isVisible?"btu-tooltip-show":"btu-tooltip-hide",r=new CustomEvent(s,{bubbles:!0,composed:!0});this.dispatchEvent(r)}_handleKeyDown(t){t.key==="Escape"&&(this._clearShowTimer(),this._hide())}_clearShowTimer(){this._showTimer!==null&&(clearTimeout(this._showTimer),this._showTimer=null)}_handleMouseEnter(){this._clearShowTimer(),this._showTimer=setTimeout(()=>{this._show()},this.tooltipDelay)}_handleMouseLeave(){this._clearShowTimer(),this._hide()}_handleFocusIn(){this._clearShowTimer(),this._show()}_handleFocusOut(){this._clearShowTimer(),this._hide()}_handleClick(){this._clearShowTimer(),this._isVisible?this._hide():this._show()}_appendAriaDescribedBy(){const t=this.getAttribute("aria-describedby");t?t.includes(this._tooltipId)||this.setAttribute("aria-describedby",`${t} ${this._tooltipId}`):this.setAttribute("aria-describedby",this._tooltipId)}_removeAriaDescribedBy(){const t=this.getAttribute("aria-describedby");if(!t)return;const e=t.split(/\s+/).filter(s=>s!==this._tooltipId).join(" ").trim();e?this.setAttribute("aria-describedby",e):this.removeAttribute("aria-describedby")}}return a([p({attribute:"tooltip"})],i.prototype,"tooltip"),a([p({attribute:"tooltip-position"})],i.prototype,"tooltipPosition"),a([p({attribute:"tooltip-delay",type:Number})],i.prototype,"tooltipDelay"),a([p({attribute:"tooltip-offset"})],i.prototype,"tooltipOffset"),a([p({attribute:"tooltip-no-arrow",type:Boolean})],i.prototype,"tooltipNoArrow"),a([p({attribute:"tooltip-trigger"})],i.prototype,"tooltipTrigger"),i};var P=Object.defineProperty,$=Object.getOwnPropertyDescriptor,y=(o,i,l,t)=>{for(var e=t>1?void 0:t?$(i,l):i,s=o.length-1,r;s>=0;s--)(r=o[s])&&(e=(t?r(i,l,e):r(e))||e);return t&&e&&P(i,l,e),e};let b=class extends O(C(L(w))){constructor(){super(...arguments),this.label="Hover me",this.initialClasses=[]}connectedCallback(){super.connectedCallback(),this.className&&(this.initialClasses=this.className.split(" ").filter(o=>o.trim()))}createRenderRoot(){return this}willUpdate(){const o=[...this.initialClasses,"tooltip-demo"];this.className=o.filter(Boolean).join(" ")}render(){return c`${this.label}`}};y([p({type:String})],b.prototype,"label",2);b=y([E("tooltip-demo")],b);const f=`
2
2
  .tooltip-demo {
3
3
  display: inline-flex;
4
4
  align-items: center;
@@ -1,4 +1,4 @@
1
- import{g as C,x as S}from"./iframe-D1g1spfw.js";import{o as E}from"./if-defined-D7P78rGH.js";import{o as x}from"./style-map-DS-2jfV3.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:`
1
+ import{g as C,x as S}from"./iframe-CemlMLl9.js";import{o as E}from"./if-defined-C-mi5lcR.js";import{o as x}from"./style-map-BZ1BR1yx.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
2
  A file upload component with drop zone and file list.
3
3
 
4
4
  The component is **presentation + file-selection only**. It handles file browsing
@@ -1,4 +1,4 @@
1
- import{g as y,x as c}from"./iframe-D1g1spfw.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:`
1
+ import{g as y,x as c}from"./iframe-CemlMLl9.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
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
3
 
4
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\`.
@@ -1,4 +1,4 @@
1
- import{S as U}from"./blocks-BLujz-58.js";import{e as X,f as _,E as B,r as j,x as A}from"./iframe-D1g1spfw.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-45GMe9mP.js";import{e as X,f as _,E as B,r as j,x as A}from"./iframe-CemlMLl9.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="
@@ -1,4 +1,4 @@
1
- import{g as h,x as l}from"./iframe-D1g1spfw.js";import{o as m}from"./style-map-DS-2jfV3.js";import"./preload-helper-PPVm8Dsz.js";const{events:y,args:w,argTypes:a}=h("btu-widget"),$={title:"Components/Widget",component:"btu-widget",tags:["autodocs"],parameters:{docs:{subtitle:"btu-widget",description:{component:`
1
+ import{g as h,x as l}from"./iframe-CemlMLl9.js";import{o as m}from"./style-map-BZ1BR1yx.js";import"./preload-helper-PPVm8Dsz.js";const{events:y,args:w,argTypes:a}=h("btu-widget"),$={title:"Components/Widget",component:"btu-widget",tags:["autodocs"],parameters:{docs:{subtitle:"btu-widget",description:{component:`
2
2
  <h3>When to use:</h3>
3
3
  <ul>
4
4
  <li>To display content in a structured widget layout</li>