@brightspot/ui 1.4.1 → 1.6.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/README.md +12 -0
  2. package/dist/components/avatar/Avatar.d.ts +1 -1
  3. package/dist/components/avatar/Avatar.d.ts.map +1 -1
  4. package/dist/components/avatar/Avatar.js +3 -1
  5. package/dist/components/avatar/Avatar.js.map +1 -1
  6. package/dist/components/pagination/Pagination.d.ts +109 -0
  7. package/dist/components/pagination/Pagination.d.ts.map +1 -0
  8. package/dist/components/pagination/Pagination.js +351 -0
  9. package/dist/components/pagination/Pagination.js.map +1 -0
  10. package/dist/components/popover/Popover.d.ts +161 -0
  11. package/dist/components/popover/Popover.d.ts.map +1 -0
  12. package/dist/components/popover/Popover.js +436 -0
  13. package/dist/components/popover/Popover.js.map +1 -0
  14. package/dist/components/widget/Widget.css +104 -0
  15. package/dist/components/widget/Widget.d.ts +170 -0
  16. package/dist/components/widget/Widget.d.ts.map +1 -0
  17. package/dist/components/widget/Widget.js +434 -0
  18. package/dist/components/widget/Widget.js.map +1 -0
  19. package/dist/custom-elements.json +1151 -184
  20. package/dist/global.d.ts +5 -0
  21. package/dist/storybook/assets/{Avatar.stories-QxWs-YfX.js → Avatar.stories-CafEcy4T.js} +37 -32
  22. package/dist/storybook/assets/AvatarGroup.stories-BBkQuFKk.js +225 -0
  23. package/dist/storybook/assets/{Badge.stories-BpaApWbR.js → Badge.stories-mFZsls7i.js} +1 -1
  24. package/dist/storybook/assets/{Button.stories-C5h2usmd.js → Button.stories-CAWX17L1.js} +1 -1
  25. package/dist/storybook/assets/{CircularProgress.stories-DlPOiGja.js → CircularProgress.stories-DBVt4Cg2.js} +1 -1
  26. package/dist/storybook/assets/{ClipboardMixin.stories-Bb45-UOM.js → ClipboardMixin.stories-BH9E-OI6.js} +7 -7
  27. package/dist/storybook/assets/Color-6BZIO3FS-CVnTzq2p.js +1 -0
  28. package/dist/storybook/assets/{Colors.stories-DP2JKWUJ.js → Colors.stories-BFYmP0LL.js} +1 -1
  29. package/dist/storybook/assets/ComponentStatesMixin-Cu7YXkU8.js +1 -0
  30. package/dist/storybook/assets/{ComponentStatesMixin.stories-CyQ2aSTu.js → ComponentStatesMixin.stories-CAvyYt0H.js} +3 -3
  31. package/dist/storybook/assets/{CopyToClipboard.stories-DR7pckeV.js → CopyToClipboard.stories-DbJZsp_L.js} +1 -1
  32. package/dist/storybook/assets/{Debounce.stories-hkqyvqmg.js → Debounce.stories-BiFiH1K9.js} +1 -1
  33. package/dist/storybook/assets/{DocsRenderer-LL677BLK-Dtw9GMer.js → DocsRenderer-LL677BLK-Bq6G4eeC.js} +6 -6
  34. package/dist/storybook/assets/{Events.stories-BAgDzdyl.js → Events.stories-BsDBxh8_.js} +1 -1
  35. package/dist/storybook/assets/{Heading.stories-CN_fPsRf.js → Heading.stories-zGzWgHVO.js} +1 -1
  36. package/dist/storybook/assets/{Icon.stories-CSx_2K8V.js → Icon.stories-B4T6sSwf.js} +1 -1
  37. package/dist/storybook/assets/{LinearProgress.stories-In48DY2g.js → LinearProgress.stories-qzqmUUwY.js} +1 -1
  38. package/dist/storybook/assets/Pagination.stories-B6Q-7taJ.js +272 -0
  39. package/dist/storybook/assets/Popover.stories-CGkU0SGv.js +431 -0
  40. package/dist/storybook/assets/ReadyMixin-3YCzoG6W.js +1 -0
  41. package/dist/storybook/assets/{Rtc.stories-19d7WXe4.js → Rtc.stories-Y1MYTWAt.js} +1 -1
  42. package/dist/storybook/assets/{ScrollShadow.stories-BFjracVd.js → ScrollShadow.stories-B9kSpLT1.js} +1 -1
  43. package/dist/storybook/assets/{Throttle.stories-DD6ydiVq.js → Throttle.stories-BgvLDrS3.js} +1 -1
  44. package/dist/storybook/assets/Tooltip.stories-POo1M-ew.js +143 -0
  45. package/dist/storybook/assets/Widget.stories--JpqVyJe.js +233 -0
  46. package/dist/storybook/assets/{WithTooltip-65CFNBJE-Be1dKqOF.js → WithTooltip-65CFNBJE-DNbD9hAX.js} +2 -2
  47. package/dist/storybook/assets/custom-element-UsVr97OX.js +1 -0
  48. package/dist/storybook/assets/{formatter-EIJCOSYU-anC2P5HS.js → formatter-EIJCOSYU-Cy8KIxab.js} +1 -1
  49. package/dist/storybook/assets/if-defined-CngSGyRu.js +1 -0
  50. package/dist/storybook/assets/iframe-DiT9Iz2T.css +1 -0
  51. package/dist/storybook/assets/{iframe-Bl9oHz5c.js → iframe-Dz6CxatW.js} +95 -95
  52. package/dist/storybook/assets/{index-Cn5E5A3G.js → index-CebChkmF.js} +1 -1
  53. package/dist/storybook/assets/{onFind.stories-BMDLUk0l.js → onFind.stories-nHDImx0x.js} +1 -1
  54. package/dist/storybook/assets/{onRemove.stories-C3FcxtYh.js → onRemove.stories-CBxYVPwd.js} +1 -1
  55. package/dist/storybook/assets/{onVisible.stories-B8Zyu0Th.js → onVisible.stories-D4Qewc9Y.js} +1 -1
  56. package/dist/storybook/assets/style-map-BgW9piaW.js +1 -0
  57. package/dist/storybook/assets/{syntaxhighlighter-ED5Y7EFY-BfTKsIVL.js → syntaxhighlighter-ED5Y7EFY-CROW1475.js} +1 -1
  58. package/dist/storybook/iframe.html +2 -2
  59. package/dist/storybook/index.json +1 -1
  60. package/dist/storybook/project.json +1 -1
  61. package/dist/tailwind-plugin-pagination.d.ts +2 -0
  62. package/dist/tailwind-plugin-pagination.d.ts.map +1 -0
  63. package/dist/tailwind-plugin-pagination.js +164 -0
  64. package/dist/tailwind-plugin-pagination.js.map +1 -0
  65. package/dist/tailwind-plugin-pagination.ts +179 -0
  66. package/dist/tailwind-plugin-popover.d.ts +2 -0
  67. package/dist/tailwind-plugin-popover.d.ts.map +1 -0
  68. package/dist/tailwind-plugin-popover.js +177 -0
  69. package/dist/tailwind-plugin-popover.js.map +1 -0
  70. package/dist/tailwind-plugin-popover.ts +202 -0
  71. package/dist/tailwind-plugin-tooltip.d.ts +2 -0
  72. package/dist/tailwind-plugin-tooltip.d.ts.map +1 -0
  73. package/dist/tailwind-plugin-tooltip.js +184 -0
  74. package/dist/tailwind-plugin-tooltip.js.map +1 -0
  75. package/dist/tailwind-plugin-tooltip.ts +209 -0
  76. package/dist/tailwind.config.d.ts +1 -4
  77. package/dist/tailwind.config.d.ts.map +1 -1
  78. package/dist/tailwind.config.js +1 -0
  79. package/dist/tailwind.config.js.map +1 -1
  80. package/dist/tailwind.config.ts +1 -0
  81. package/dist/util/EventEmitterMixin.d.ts +20 -0
  82. package/dist/util/EventEmitterMixin.d.ts.map +1 -1
  83. package/dist/util/EventEmitterMixin.js +1 -1
  84. package/dist/util/EventEmitterMixin.js.map +1 -1
  85. package/dist/util/TooltipController.d.ts +37 -0
  86. package/dist/util/TooltipController.d.ts.map +1 -0
  87. package/dist/util/TooltipController.js +133 -0
  88. package/dist/util/TooltipController.js.map +1 -0
  89. package/dist/util/TooltipMixin.d.ts +42 -0
  90. package/dist/util/TooltipMixin.d.ts.map +1 -0
  91. package/dist/util/TooltipMixin.js +401 -0
  92. package/dist/util/TooltipMixin.js.map +1 -0
  93. package/dist/util/aria.d.ts.map +1 -1
  94. package/dist/util/aria.js +2 -1
  95. package/dist/util/aria.js.map +1 -1
  96. package/dist/util/i18n.d.ts +13 -0
  97. package/dist/util/i18n.d.ts.map +1 -0
  98. package/dist/util/i18n.js +21 -0
  99. package/dist/util/i18n.js.map +1 -0
  100. package/package.json +2 -2
  101. package/dist/storybook/assets/AvatarGroup.stories-Cy_Bvn7E.js +0 -211
  102. package/dist/storybook/assets/Color-6BZIO3FS-CcgGYVAo.js +0 -1
  103. package/dist/storybook/assets/ComponentStatesMixin-B7ci0thi.js +0 -1
  104. package/dist/storybook/assets/iframe-B4njXYq6.css +0 -1
@@ -0,0 +1,431 @@
1
+ import{g as c,x as r}from"./iframe-Dz6CxatW.js";import{o as d}from"./if-defined-CngSGyRu.js";import"./preload-helper-PPVm8Dsz.js";const{events:u,args:g,argTypes:t}=c("btu-popover"),h={title:"Components/Popover",component:"btu-popover",tags:["autodocs"],parameters:{docs:{subtitle:"Rich interactive content anchored to a trigger element",description:{component:`
2
+ \`btu-popover\` displays rich interactive content anchored to a trigger element using CSS anchor positioning and the native Popover API.
3
+
4
+ <h3>When to use:</h3>
5
+ <ul>
6
+ <li>Confirmation dialogs anchored to a button</li>
7
+ <li>Rich preview cards on hover</li>
8
+ <li>Interactive forms or menus in a floating panel</li>
9
+ </ul>
10
+
11
+ <h3>When not to use:</h3>
12
+ <ul>
13
+ <li>For simple text-only hints — use <a href="?path=/docs/components-tooltip--docs">Tooltip</a> instead</li>
14
+ <li>For status messages or inline feedback (use alerts or toasts)</li>
15
+ </ul>
16
+
17
+ <h3>Accessibility</h3>
18
+ <ul>
19
+ <li><code>role="dialog"</code> on popover panel</li>
20
+ <li><code>aria-expanded</code> on trigger element</li>
21
+ <li><code>aria-controls</code> links trigger to panel</li>
22
+ <li>Escape key dismisses the popover</li>
23
+ <li>Click outside dismisses (click trigger only)</li>
24
+ <li>Focus restored to trigger on close</li>
25
+ <li>Add <code>autofocus</code> to an element inside <code>slot="content"</code> for auto-focus on open</li>
26
+ </ul>
27
+ `}},actions:{handles:u},controls:{expanded:!0}},args:{...g,position:"bottom",trigger:"click",delay:300,open:!1},argTypes:{...t,position:{...t.position,control:{type:"select"},options:["top","bottom","left","right"]},trigger:{...t.trigger,control:{type:"select"},options:["click","hover","focus"]},delay:{...t.delay,control:{type:"number"},description:"Show delay in ms (hover trigger only)"},offset:{...t.offset,control:{type:"select"},options:["sm","md","lg","xl"],description:"Gap between trigger and popover (sm=4px, md=8px, lg=12px, xl=16px)"},open:{...t.open,control:{type:"boolean"},description:"Programmatic open/close (reflected)"},customBg:{name:"--popover-color-background",description:"Background color",control:{type:"color"},table:{category:"CSS Custom Properties",defaultValue:{summary:"white"}}},customTitleColor:{name:"--popover-color-title",description:"Title text color",control:{type:"color"},table:{category:"CSS Custom Properties",defaultValue:{summary:"oklch(var(--btu-theme-gray-900))"}}},customContentColor:{name:"--popover-color-content",description:"Content text color",control:{type:"color"},table:{category:"CSS Custom Properties",defaultValue:{summary:"oklch(var(--btu-theme-gray-900))"}}},customRadius:{name:"--popover-border-radius",description:"Border radius",control:{type:"select"},options:["0px","0.125rem","0.25rem","0.375rem","0.5rem","0.75rem","1rem","1.5rem","9999px"],labels:{"0px":"none (0px)","0.125rem":"sm (0.125rem)","0.25rem":"DEFAULT (0.25rem)","0.375rem":"md (0.375rem)","0.5rem":"lg (0.5rem)","0.75rem":"xl (0.75rem)","1rem":"2xl (1rem)","1.5rem":"3xl (1.5rem)","9999px":"full (9999px)"},table:{category:"CSS Custom Properties",defaultValue:{summary:"0.5rem (lg)"}}}},render:o=>{const e=[];o.customBg&&e.push(`--popover-color-background: ${o.customBg}`),o.customTitleColor&&e.push(`--popover-color-title: ${o.customTitleColor}`),o.customContentColor&&e.push(`--popover-color-content: ${o.customContentColor}`),o.customRadius&&e.push(`--popover-border-radius: ${o.customRadius}`);const a=e.length>0?e.join("; "):"";return r`
28
+ <div style="display: flex; justify-content: center; padding: 6rem 2rem;">
29
+ <div style="${a}">
30
+ <btu-popover
31
+ position="${o.position}"
32
+ trigger="${o.trigger}"
33
+ delay="${o.delay}"
34
+ offset="${d(o.offset)}"
35
+ ?no-arrow="${o.noArrow}"
36
+ ?open="${o.open}"
37
+ >
38
+ <button class="popover-trigger" slot="trigger">
39
+ ${o.trigger==="hover"?"Hover me":o.trigger==="focus"?"Focus me":"Click me"}
40
+ </button>
41
+ <div slot="content">
42
+ <div style="font-weight: 500; margin-bottom: 4px; color: var(--popover-color-title);">Popover Title</div>
43
+ <div style="color: var(--popover-color-content, oklch(var(--btu-theme-gray-900)));">
44
+ This is a popover with rich content.
45
+ ${o.trigger==="click"?"Click outside or press Escape to dismiss.":""}
46
+ </div>
47
+ </div>
48
+ </btu-popover>
49
+ </div>
50
+ </div>
51
+ `}},p=`
52
+ .popover-trigger {
53
+ display: inline-flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ padding: 0.5rem 1rem;
57
+ border-radius: 0.375rem;
58
+ background-color: oklch(var(--btu-theme-gray-100));
59
+ color: oklch(var(--btu-theme-gray-700));
60
+ font-weight: 500;
61
+ font-size: 0.875rem;
62
+ cursor: pointer;
63
+ user-select: none;
64
+ border: 1px solid oklch(var(--btu-theme-gray-200));
65
+ }
66
+ .popover-trigger:hover {
67
+ background-color: oklch(var(--btu-theme-gray-200));
68
+ }
69
+ `,n={args:{noArrow:!1,offset:void 0},decorators:[o=>r`<style>
70
+ ${p}</style
71
+ >${o()}`]},i={render:()=>r`
72
+ <style>
73
+ ${p}
74
+ </style>
75
+ <div style="display: flex; gap: 2rem; justify-content: center; padding: 6rem 2rem; flex-wrap: wrap;">
76
+ <btu-popover position="top">
77
+ <button class="popover-trigger" slot="trigger">Top</button>
78
+ <div slot="content">Popover positioned above the trigger</div>
79
+ </btu-popover>
80
+ <btu-popover position="bottom">
81
+ <button class="popover-trigger" slot="trigger">Bottom</button>
82
+ <div slot="content">Popover positioned below the trigger</div>
83
+ </btu-popover>
84
+ <btu-popover position="left">
85
+ <button class="popover-trigger" slot="trigger">Left</button>
86
+ <div slot="content">Popover positioned left of the trigger</div>
87
+ </btu-popover>
88
+ <btu-popover position="right">
89
+ <button class="popover-trigger" slot="trigger">Right</button>
90
+ <div slot="content">Popover positioned right of the trigger</div>
91
+ </btu-popover>
92
+ </div>
93
+ `,parameters:{docs:{description:{story:"Popovers support four positions: `top`, `bottom`, `left`, and `right`. Each auto-flips if constrained by the viewport."},story:{inline:!1,iframeHeight:300}}}},s={render:()=>r`
94
+ <style>
95
+ ${p} .popover-custom-content {
96
+ display: flex;
97
+ flex-direction: column;
98
+ gap: 12px;
99
+ min-width: 240px;
100
+ }
101
+ .popover-custom-content h3 {
102
+ margin: 0;
103
+ font-size: 0.9375rem;
104
+ font-weight: 600;
105
+ }
106
+ .popover-custom-content p {
107
+ margin: 0;
108
+ font-size: 0.8125rem;
109
+ color: oklch(var(--btu-theme-gray-500));
110
+ line-height: 1.4;
111
+ }
112
+ .popover-custom-content .actions {
113
+ display: flex;
114
+ gap: 8px;
115
+ justify-content: flex-end;
116
+ padding-top: 4px;
117
+ border-top: 1px solid oklch(var(--btu-theme-gray-100));
118
+ }
119
+ .legend-series {
120
+ display: flex;
121
+ flex-direction: column;
122
+ gap: 2px;
123
+ }
124
+ .legend-item {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: 4px;
128
+ font-size: 0.75rem;
129
+ line-height: 1.125rem;
130
+ color: oklch(var(--btu-theme-gray-500));
131
+ }
132
+ .legend-dot {
133
+ width: 8px;
134
+ height: 8px;
135
+ border-radius: 9999px;
136
+ flex-shrink: 0;
137
+ }
138
+ .legend-value {
139
+ font-weight: 600;
140
+ }
141
+ </style>
142
+ <div style="display: flex; gap: 2rem; justify-content: center; padding: 6rem 2rem; flex-wrap: wrap;">
143
+ <btu-popover position="bottom">
144
+ <button class="btu-button btu-button-error" slot="trigger">Delete item</button>
145
+ <div slot="content">
146
+ <div class="popover-custom-content">
147
+ <h3>Confirm Delete</h3>
148
+ <p>Are you sure you want to delete this item? This action cannot be undone.</p>
149
+ <div class="actions">
150
+ <button class="btu-button btu-button-warning btu-button-xs">Cancel</button>
151
+ <button class="btu-button btu-button-error btu-button-xs btu-button-fill-none">Delete</button>
152
+ </div>
153
+ </div>
154
+ </div>
155
+ </btu-popover>
156
+ <btu-popover trigger="hover" delay="200" position="bottom">
157
+ <button class="btu-button btu-button-primary" slot="trigger">Hover for chart data</button>
158
+ <div slot="content">
159
+ <div
160
+ style="font-weight: 500; font-size: 0.75rem; line-height: 1.125rem; color: oklch(var(--btu-theme-gray-900)); margin-bottom: 8px;"
161
+ >
162
+ Chart Legend
163
+ </div>
164
+ <div class="legend-series">
165
+ <div class="legend-item">
166
+ <span class="legend-dot" style="background: oklch(var(--btu-theme-primary-900));"></span>
167
+ Series 1: <span class="legend-value">786</span>
168
+ </div>
169
+ <div class="legend-item">
170
+ <span class="legend-dot" style="background: oklch(var(--btu-theme-primary-700));"></span>
171
+ Series 2: <span class="legend-value">786</span>
172
+ </div>
173
+ <div class="legend-item">
174
+ <span class="legend-dot" style="background: oklch(var(--btu-theme-primary-500));"></span>
175
+ Series 3: <span class="legend-value">786</span>
176
+ </div>
177
+ <div class="legend-item">
178
+ <span class="legend-dot" style="background: oklch(var(--btu-theme-teal-700));"></span>
179
+ Series 4: <span class="legend-value">786</span>
180
+ </div>
181
+ </div>
182
+ </div>
183
+ </btu-popover>
184
+ </div>
185
+ `,parameters:{docs:{description:{story:"Two examples of rich popover content: a confirmation dialog with action buttons (click trigger), and a chart legend with colored series data (hover trigger)."},story:{inline:!1,iframeHeight:300}}}},l={render:()=>r`
186
+ <style>
187
+ ${p} .custom-popover-trigger {
188
+ display: inline-flex;
189
+ align-items: center;
190
+ justify-content: center;
191
+ padding: 0.5rem 1rem;
192
+ border-radius: 0.375rem;
193
+ background-color: oklch(0.35 0.1 280);
194
+ color: white;
195
+ font-weight: 500;
196
+ font-size: 0.875rem;
197
+ cursor: pointer;
198
+ user-select: none;
199
+ border: 1px solid oklch(0.45 0.1 280);
200
+ }
201
+ .custom-popover-trigger:hover {
202
+ background-color: oklch(0.4 0.1 280);
203
+ }
204
+ </style>
205
+ <div style="display: flex; justify-content: center; padding: 6rem 2rem;">
206
+ <div
207
+ style="--popover-color-background: oklch(0.25 20.05 280); --popover-color-title: oklch(0.95 0 0); --popover-color-content: oklch(0.8 120 50); --popover-border-radius: 0px;"
208
+ >
209
+ <btu-popover position="bottom" offset="lg" no-arrow>
210
+ <button class="custom-popover-trigger" slot="trigger">Fully customized</button>
211
+ <div slot="content">
212
+ <div style="font-weight: 600; font-size: 1rem; margin-bottom: 8px; color: var(--popover-color-title);">
213
+ Custom Styled Popover
214
+ </div>
215
+ <div style="line-height: 1.5; color: var(--popover-color-content);">
216
+ This popover overrides all available CSS custom properties: background, title color, and border radius. It
217
+ also uses
218
+ <code style="background: oklch(0.35 0.05 280); padding: 2px 6px; border-radius: 4px;">offset="lg"</code>
219
+ for extra spacing and
220
+ <code style="background: oklch(0.35 0.05 280); padding: 2px 6px; border-radius: 4px;">no-arrow</code> for
221
+ a clean look.
222
+ </div>
223
+ </div>
224
+ </btu-popover>
225
+ </div>
226
+ </div>
227
+ `,parameters:{docs:{description:{story:"Demonstrates full customization of all CSS custom properties. Set these on a parent element or directly on the component:\n\n- `--popover-color-background` — Background color\n- `--popover-color-title` — Title text color\n- `--popover-color-content` — Content text color\n- `--popover-border-radius` — Border radius"}}}};n.parameters={...n.parameters,docs:{...n.parameters?.docs,source:{originalSource:`{
228
+ args: {
229
+ noArrow: false,
230
+ offset: undefined
231
+ },
232
+ decorators: [story => html\`<style>
233
+ \${triggerStyle}</style
234
+ >\${story()}\`]
235
+ }`,...n.parameters?.docs?.source}}};i.parameters={...i.parameters,docs:{...i.parameters?.docs,source:{originalSource:`{
236
+ render: () => html\`
237
+ <style>
238
+ \${triggerStyle}
239
+ </style>
240
+ <div style="display: flex; gap: 2rem; justify-content: center; padding: 6rem 2rem; flex-wrap: wrap;">
241
+ <btu-popover position="top">
242
+ <button class="popover-trigger" slot="trigger">Top</button>
243
+ <div slot="content">Popover positioned above the trigger</div>
244
+ </btu-popover>
245
+ <btu-popover position="bottom">
246
+ <button class="popover-trigger" slot="trigger">Bottom</button>
247
+ <div slot="content">Popover positioned below the trigger</div>
248
+ </btu-popover>
249
+ <btu-popover position="left">
250
+ <button class="popover-trigger" slot="trigger">Left</button>
251
+ <div slot="content">Popover positioned left of the trigger</div>
252
+ </btu-popover>
253
+ <btu-popover position="right">
254
+ <button class="popover-trigger" slot="trigger">Right</button>
255
+ <div slot="content">Popover positioned right of the trigger</div>
256
+ </btu-popover>
257
+ </div>
258
+ \`,
259
+ parameters: {
260
+ docs: {
261
+ description: {
262
+ story: 'Popovers support four positions: \`top\`, \`bottom\`, \`left\`, and \`right\`. Each auto-flips if constrained by the viewport.'
263
+ },
264
+ story: {
265
+ inline: false,
266
+ iframeHeight: 300
267
+ }
268
+ }
269
+ }
270
+ }`,...i.parameters?.docs?.source}}};s.parameters={...s.parameters,docs:{...s.parameters?.docs,source:{originalSource:`{
271
+ render: () => html\`
272
+ <style>
273
+ \${triggerStyle} .popover-custom-content {
274
+ display: flex;
275
+ flex-direction: column;
276
+ gap: 12px;
277
+ min-width: 240px;
278
+ }
279
+ .popover-custom-content h3 {
280
+ margin: 0;
281
+ font-size: 0.9375rem;
282
+ font-weight: 600;
283
+ }
284
+ .popover-custom-content p {
285
+ margin: 0;
286
+ font-size: 0.8125rem;
287
+ color: oklch(var(--btu-theme-gray-500));
288
+ line-height: 1.4;
289
+ }
290
+ .popover-custom-content .actions {
291
+ display: flex;
292
+ gap: 8px;
293
+ justify-content: flex-end;
294
+ padding-top: 4px;
295
+ border-top: 1px solid oklch(var(--btu-theme-gray-100));
296
+ }
297
+ .legend-series {
298
+ display: flex;
299
+ flex-direction: column;
300
+ gap: 2px;
301
+ }
302
+ .legend-item {
303
+ display: flex;
304
+ align-items: center;
305
+ gap: 4px;
306
+ font-size: 0.75rem;
307
+ line-height: 1.125rem;
308
+ color: oklch(var(--btu-theme-gray-500));
309
+ }
310
+ .legend-dot {
311
+ width: 8px;
312
+ height: 8px;
313
+ border-radius: 9999px;
314
+ flex-shrink: 0;
315
+ }
316
+ .legend-value {
317
+ font-weight: 600;
318
+ }
319
+ </style>
320
+ <div style="display: flex; gap: 2rem; justify-content: center; padding: 6rem 2rem; flex-wrap: wrap;">
321
+ <btu-popover position="bottom">
322
+ <button class="btu-button btu-button-error" slot="trigger">Delete item</button>
323
+ <div slot="content">
324
+ <div class="popover-custom-content">
325
+ <h3>Confirm Delete</h3>
326
+ <p>Are you sure you want to delete this item? This action cannot be undone.</p>
327
+ <div class="actions">
328
+ <button class="btu-button btu-button-warning btu-button-xs">Cancel</button>
329
+ <button class="btu-button btu-button-error btu-button-xs btu-button-fill-none">Delete</button>
330
+ </div>
331
+ </div>
332
+ </div>
333
+ </btu-popover>
334
+ <btu-popover trigger="hover" delay="200" position="bottom">
335
+ <button class="btu-button btu-button-primary" slot="trigger">Hover for chart data</button>
336
+ <div slot="content">
337
+ <div
338
+ style="font-weight: 500; font-size: 0.75rem; line-height: 1.125rem; color: oklch(var(--btu-theme-gray-900)); margin-bottom: 8px;"
339
+ >
340
+ Chart Legend
341
+ </div>
342
+ <div class="legend-series">
343
+ <div class="legend-item">
344
+ <span class="legend-dot" style="background: oklch(var(--btu-theme-primary-900));"></span>
345
+ Series 1: <span class="legend-value">786</span>
346
+ </div>
347
+ <div class="legend-item">
348
+ <span class="legend-dot" style="background: oklch(var(--btu-theme-primary-700));"></span>
349
+ Series 2: <span class="legend-value">786</span>
350
+ </div>
351
+ <div class="legend-item">
352
+ <span class="legend-dot" style="background: oklch(var(--btu-theme-primary-500));"></span>
353
+ Series 3: <span class="legend-value">786</span>
354
+ </div>
355
+ <div class="legend-item">
356
+ <span class="legend-dot" style="background: oklch(var(--btu-theme-teal-700));"></span>
357
+ Series 4: <span class="legend-value">786</span>
358
+ </div>
359
+ </div>
360
+ </div>
361
+ </btu-popover>
362
+ </div>
363
+ \`,
364
+ parameters: {
365
+ docs: {
366
+ description: {
367
+ story: 'Two examples of rich popover content: a confirmation dialog with action buttons (click trigger), and a chart legend with colored series data (hover trigger).'
368
+ },
369
+ story: {
370
+ inline: false,
371
+ iframeHeight: 300
372
+ }
373
+ }
374
+ }
375
+ }`,...s.parameters?.docs?.source}}};l.parameters={...l.parameters,docs:{...l.parameters?.docs,source:{originalSource:`{
376
+ render: () => html\`
377
+ <style>
378
+ \${triggerStyle} .custom-popover-trigger {
379
+ display: inline-flex;
380
+ align-items: center;
381
+ justify-content: center;
382
+ padding: 0.5rem 1rem;
383
+ border-radius: 0.375rem;
384
+ background-color: oklch(0.35 0.1 280);
385
+ color: white;
386
+ font-weight: 500;
387
+ font-size: 0.875rem;
388
+ cursor: pointer;
389
+ user-select: none;
390
+ border: 1px solid oklch(0.45 0.1 280);
391
+ }
392
+ .custom-popover-trigger:hover {
393
+ background-color: oklch(0.4 0.1 280);
394
+ }
395
+ </style>
396
+ <div style="display: flex; justify-content: center; padding: 6rem 2rem;">
397
+ <div
398
+ style="--popover-color-background: oklch(0.25 20.05 280); --popover-color-title: oklch(0.95 0 0); --popover-color-content: oklch(0.8 120 50); --popover-border-radius: 0px;"
399
+ >
400
+ <btu-popover position="bottom" offset="lg" no-arrow>
401
+ <button class="custom-popover-trigger" slot="trigger">Fully customized</button>
402
+ <div slot="content">
403
+ <div style="font-weight: 600; font-size: 1rem; margin-bottom: 8px; color: var(--popover-color-title);">
404
+ Custom Styled Popover
405
+ </div>
406
+ <div style="line-height: 1.5; color: var(--popover-color-content);">
407
+ This popover overrides all available CSS custom properties: background, title color, and border radius. It
408
+ also uses
409
+ <code style="background: oklch(0.35 0.05 280); padding: 2px 6px; border-radius: 4px;">offset="lg"</code>
410
+ for extra spacing and
411
+ <code style="background: oklch(0.35 0.05 280); padding: 2px 6px; border-radius: 4px;">no-arrow</code> for
412
+ a clean look.
413
+ </div>
414
+ </div>
415
+ </btu-popover>
416
+ </div>
417
+ </div>
418
+ \`,
419
+ parameters: {
420
+ docs: {
421
+ description: {
422
+ story: \`Demonstrates full customization of all CSS custom properties. Set these on a parent element or directly on the component:
423
+
424
+ - \\\`--popover-color-background\\\` — Background color
425
+ - \\\`--popover-color-title\\\` — Title text color
426
+ - \\\`--popover-color-content\\\` — Content text color
427
+ - \\\`--popover-border-radius\\\` — Border radius\`
428
+ }
429
+ }
430
+ }
431
+ }`,...l.parameters?.docs?.source}}};const y=["Default","Positions","RichContent","AdvancedUsage"];export{l as AdvancedUsage,n as Default,i as Positions,s as RichContent,y as __namedExportsOrder,h as default};
@@ -0,0 +1 @@
1
+ import"./iframe-Dz6CxatW.js";const i=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){return this.dispatchEvent(new CustomEvent(e,{bubbles:!0,cancelable:!1,composed:!0,detail:c}))}}return n},l=t=>{class n extends t{connectedCallback(){const e=()=>{super.connectedCallback()};document.readyState!=="loading"?e():document.addEventListener("DOMContentLoaded",()=>e())}}return n};export{i as E,l as R};
@@ -1,4 +1,4 @@
1
- import{x as o}from"./iframe-Bl9oHz5c.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-Dz6CxatW.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-Bl9oHz5c.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-Dz6CxatW.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{x as u}from"./iframe-Bl9oHz5c.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 h=document.getElementById(`${t}-normal-count`),m=document.getElementById(`${t}-throttled-count`);h&&(h.textContent=String(n)),m&&(m.textContent=String(o))},s=v(e.interval,()=>{o++,r()}),a=()=>{n++,r()},l=()=>{a(),s()};return u`
1
+ import{x as u}from"./iframe-Dz6CxatW.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 h=document.getElementById(`${t}-normal-count`),m=document.getElementById(`${t}-throttled-count`);h&&(h.textContent=String(n)),m&&(m.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">
@@ -0,0 +1,143 @@
1
+ import{f as v,u as x,x as c,i as w}from"./iframe-Dz6CxatW.js";import{t as E}from"./custom-element-UsVr97OX.js";import{o as T}from"./if-defined-CngSGyRu.js";import{E as k,R as C}from"./ReadyMixin-3YCzoG6W.js";import"./preload-helper-PPVm8Dsz.js";const S={attribute:!0,type:String,converter:x,reflect:!1,hasChanged:v},L=(o=S,i,s)=>{const{kind:t,metadata:e}=s;let l=globalThis.litPropertyMetadata.get(e);if(l===void 0&&globalThis.litPropertyMetadata.set(e,l=new Map),t==="setter"&&((o=Object.create(o)).wrapped=!0),l.set(s.name,o),t==="accessor"){const{name:r}=s;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}=s;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,s)=>typeof s=="object"?L(o,i,s):((t,e,l)=>{const r=e.hasOwnProperty(l);return e.constructor.createProperty(l,t),r?Object.getOwnPropertyDescriptor(e,l):void 0})(o,i,s)}var D=Object.defineProperty,a=(o,i,s,t)=>{for(var e=void 0,l=o.length-1,r;l>=0;l--)(r=o[l])&&(e=r(i,s,e)||e);return e&&D(i,s,e),e};const A={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"},M=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",A[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",this.dispatchEvent(new CustomEvent(this._isVisible?"btu-tooltip-show":"btu-tooltip-hide",{bubbles:!0,composed:!0}))}_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(l=>l!==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 O=Object.defineProperty,P=Object.getOwnPropertyDescriptor,y=(o,i,s,t)=>{for(var e=t>1?void 0:t?P(i,s):i,l=o.length-1,r;l>=0;l--)(r=o[l])&&(e=(t?r(i,s,e):r(e))||e);return t&&e&&O(i,s,e),e};let b=class extends M(k(C(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
+ .tooltip-demo {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ padding: 0.5rem 1rem;
7
+ border-radius: 0.375rem;
8
+ background-color: oklch(var(--btu-theme-gray-100));
9
+ color: oklch(var(--btu-theme-gray-700));
10
+ font-weight: 500;
11
+ font-size: 0.875rem;
12
+ cursor: default;
13
+ user-select: none;
14
+ }
15
+ `,F={title:"Mixins/Tooltip",tags:["autodocs"],parameters:{docs:{subtitle:"Declarative tooltip support for any LitElement component",description:{component:`
16
+ \`TooltipMixin\` adds declarative tooltip support to any LitElement component using CSS anchor positioning and the Popover API.
17
+
18
+ <h3>Opt-in Pattern</h3>
19
+
20
+ \`\`\`typescript
21
+ class MyComponent extends TooltipMixin(EventEmitterMixin(ReadyMixin(LitElement))) {
22
+ // Component now supports tooltip attributes
23
+ }
24
+ \`\`\`
25
+
26
+ \`\`\`html
27
+ <my-component tooltip="Hello!" tooltip-position="bottom"></my-component>
28
+ \`\`\`
29
+
30
+ <h3>Accessibility</h3>
31
+ <ul>
32
+ <li><code>role="tooltip"</code> on tooltip element</li>
33
+ <li><code>aria-describedby</code> on host links to tooltip (appends to existing value)</li>
34
+ <li>Shows on <code>focusin</code>, hides on <code>focusout</code> and <code>Escape</code></li>
35
+ <li><code>prefers-reduced-motion: reduce</code> disables slide animation</li>
36
+ </ul>
37
+ `}},controls:{expanded:!0}},args:{tooltip:"This is a tooltip","tooltip-position":"top","tooltip-delay":300,"tooltip-no-arrow":!1,"tooltip-trigger":"hover focus",label:"Hover me"},argTypes:{tooltip:{control:{type:"text"},description:"Tooltip text. No tooltip rendered when empty.",table:{category:"Attributes"}},"tooltip-position":{control:{type:"select"},options:["top","bottom","left","right"],description:"Preferred placement (auto-flips if viewport constrained)",table:{category:"Attributes"}},"tooltip-delay":{control:{type:"number"},description:"Delay before showing tooltip on hover (ms)",table:{category:"Attributes"}},"tooltip-offset":{control:{type:"select"},options:["sm","md","lg","xl"],description:"Gap between trigger and tooltip (sm=4px, md=8px, lg=12px, xl=16px)",table:{category:"Attributes"}},"tooltip-no-arrow":{control:{type:"boolean"},description:"Hide the arrow pseudo-element",table:{category:"Attributes"}},"tooltip-trigger":{control:{type:"select"},options:["hover focus","hover","focus","click","hover click"],description:"How the tooltip is activated (combinable triggers)",table:{category:"Attributes"}},label:{control:{type:"text"},description:"Demo button label text",table:{category:"Demo"}},customBg:{name:"--tooltip-color-background",control:{type:"color"},description:"Background color",table:{category:"CSS Custom Properties",defaultValue:{summary:"white"}}},customTextColor:{name:"--tooltip-color-text",control:{type:"color"},description:"Text color",table:{category:"CSS Custom Properties",defaultValue:{summary:"oklch(var(--btu-theme-gray-900))"}}},customRadius:{name:"--tooltip-border-radius",control:{type:"select"},options:["0px","0.125rem","0.25rem","0.375rem","0.5rem","0.75rem","1rem","1.5rem","9999px"],labels:{"0px":"none (0px)","0.125rem":"sm (0.125rem)","0.25rem":"DEFAULT (0.25rem)","0.375rem":"md (0.375rem)","0.5rem":"lg (0.5rem)","0.75rem":"xl (0.75rem)","1rem":"2xl (1rem)","1.5rem":"3xl (1.5rem)","9999px":"full (9999px)"},description:"Border radius",table:{category:"CSS Custom Properties",defaultValue:{summary:"0.5rem (lg)"}}}},render:o=>{const i=[];o.customBg&&i.push(`--tooltip-color-background: ${o.customBg}`),o.customTextColor&&i.push(`--tooltip-color-text: ${o.customTextColor}`),o.customRadius&&i.push(`--tooltip-border-radius: ${o.customRadius}`);const s=i.length>0?i.join("; "):"";return c`
38
+ <style>
39
+ ${f}
40
+ </style>
41
+ <div style="display: flex; justify-content: center; padding: 6rem 2rem;">
42
+ <div style="${s}">
43
+ <tooltip-demo
44
+ tooltip="${o.tooltip}"
45
+ tooltip-position="${o["tooltip-position"]}"
46
+ tooltip-delay="${o["tooltip-delay"]}"
47
+ tooltip-offset="${T(o["tooltip-offset"])}"
48
+ ?tooltip-no-arrow="${o["tooltip-no-arrow"]}"
49
+ tooltip-trigger="${o["tooltip-trigger"]}"
50
+ label="${o.label}"
51
+ ></tooltip-demo>
52
+ </div>
53
+ </div>
54
+ `}},d={args:{}},h={render:()=>c`
55
+ <style>
56
+ ${f}
57
+ </style>
58
+ <div style="display: flex; gap: 2rem; justify-content: center; padding: 6rem 2rem; flex-wrap: wrap;">
59
+ <tooltip-demo tooltip="Top tooltip" tooltip-position="top" label="Top"></tooltip-demo>
60
+ <tooltip-demo tooltip="Bottom tooltip" tooltip-position="bottom" label="Bottom"></tooltip-demo>
61
+ <tooltip-demo tooltip="Left tooltip" tooltip-position="left" label="Left"></tooltip-demo>
62
+ <tooltip-demo tooltip="Right tooltip" tooltip-position="right" label="Right"></tooltip-demo>
63
+ </div>
64
+ `,parameters:{docs:{description:{story:"Tooltips support four positions: `top`, `bottom`, `left`, and `right`. Each position auto-flips to the opposite side if constrained by the viewport."},story:{inline:!1,iframeHeight:300}}}},m={render:()=>c`
65
+ <style>
66
+ ${f}
67
+ </style>
68
+ <div style="display: flex; gap: 2rem; justify-content: center; padding: 4rem 2rem; flex-wrap: wrap;">
69
+ <tooltip-demo tooltip="Small offset (4px)" tooltip-offset="sm" label="sm"></tooltip-demo>
70
+ <tooltip-demo tooltip="Medium offset (8px)" tooltip-offset="md" label="md"></tooltip-demo>
71
+ <tooltip-demo tooltip="Large offset (12px)" tooltip-offset="lg" label="lg"></tooltip-demo>
72
+ <tooltip-demo tooltip="Extra large offset (16px)" tooltip-offset="xl" label="xl"></tooltip-demo>
73
+ </div>
74
+ `,parameters:{docs:{description:{story:"The `tooltip-offset` attribute controls the gap between trigger and tooltip using named sizes: `sm` (4px), `md` (8px), `lg` (12px), `xl` (16px)."}}}},u={render:()=>c`
75
+ <style>
76
+ ${f}
77
+ </style>
78
+ <div style="display: flex; gap: 2rem; justify-content: center; padding: 4rem 2rem; flex-wrap: wrap;">
79
+ <tooltip-demo tooltip="Click-triggered tooltip" tooltip-trigger="click" label="Click me"></tooltip-demo>
80
+ <tooltip-demo tooltip="Hover or click" tooltip-trigger="hover click" label="Hover or click"></tooltip-demo>
81
+ </div>
82
+ `,parameters:{docs:{description:{story:"The `tooltip-trigger` attribute controls how the tooltip is activated. `click` toggles on click and dismisses on Escape. Triggers can be combined with spaces."}}}};d.parameters={...d.parameters,docs:{...d.parameters?.docs,source:{originalSource:`{
83
+ args: {}
84
+ }`,...d.parameters?.docs?.source}}};h.parameters={...h.parameters,docs:{...h.parameters?.docs,source:{originalSource:`{
85
+ render: () => html\`
86
+ <style>
87
+ \${demoStyle}
88
+ </style>
89
+ <div style="display: flex; gap: 2rem; justify-content: center; padding: 6rem 2rem; flex-wrap: wrap;">
90
+ <tooltip-demo tooltip="Top tooltip" tooltip-position="top" label="Top"></tooltip-demo>
91
+ <tooltip-demo tooltip="Bottom tooltip" tooltip-position="bottom" label="Bottom"></tooltip-demo>
92
+ <tooltip-demo tooltip="Left tooltip" tooltip-position="left" label="Left"></tooltip-demo>
93
+ <tooltip-demo tooltip="Right tooltip" tooltip-position="right" label="Right"></tooltip-demo>
94
+ </div>
95
+ \`,
96
+ parameters: {
97
+ docs: {
98
+ description: {
99
+ story: 'Tooltips support four positions: \`top\`, \`bottom\`, \`left\`, and \`right\`. Each position auto-flips to the opposite side if constrained by the viewport.'
100
+ },
101
+ story: {
102
+ inline: false,
103
+ iframeHeight: 300
104
+ }
105
+ }
106
+ }
107
+ }`,...h.parameters?.docs?.source}}};m.parameters={...m.parameters,docs:{...m.parameters?.docs,source:{originalSource:`{
108
+ render: () => html\`
109
+ <style>
110
+ \${demoStyle}
111
+ </style>
112
+ <div style="display: flex; gap: 2rem; justify-content: center; padding: 4rem 2rem; flex-wrap: wrap;">
113
+ <tooltip-demo tooltip="Small offset (4px)" tooltip-offset="sm" label="sm"></tooltip-demo>
114
+ <tooltip-demo tooltip="Medium offset (8px)" tooltip-offset="md" label="md"></tooltip-demo>
115
+ <tooltip-demo tooltip="Large offset (12px)" tooltip-offset="lg" label="lg"></tooltip-demo>
116
+ <tooltip-demo tooltip="Extra large offset (16px)" tooltip-offset="xl" label="xl"></tooltip-demo>
117
+ </div>
118
+ \`,
119
+ parameters: {
120
+ docs: {
121
+ description: {
122
+ story: 'The \`tooltip-offset\` attribute controls the gap between trigger and tooltip using named sizes: \`sm\` (4px), \`md\` (8px), \`lg\` (12px), \`xl\` (16px).'
123
+ }
124
+ }
125
+ }
126
+ }`,...m.parameters?.docs?.source}}};u.parameters={...u.parameters,docs:{...u.parameters?.docs,source:{originalSource:`{
127
+ render: () => html\`
128
+ <style>
129
+ \${demoStyle}
130
+ </style>
131
+ <div style="display: flex; gap: 2rem; justify-content: center; padding: 4rem 2rem; flex-wrap: wrap;">
132
+ <tooltip-demo tooltip="Click-triggered tooltip" tooltip-trigger="click" label="Click me"></tooltip-demo>
133
+ <tooltip-demo tooltip="Hover or click" tooltip-trigger="hover click" label="Hover or click"></tooltip-demo>
134
+ </div>
135
+ \`,
136
+ parameters: {
137
+ docs: {
138
+ description: {
139
+ story: 'The \`tooltip-trigger\` attribute controls how the tooltip is activated. \`click\` toggles on click and dismisses on Escape. Triggers can be combined with spaces.'
140
+ }
141
+ }
142
+ }
143
+ }`,...u.parameters?.docs?.source}}};const R=["Default","Positions","Offset","ClickTrigger"];export{u as ClickTrigger,d as Default,m as Offset,h as Positions,R as __namedExportsOrder,F as default};