@brightspot/ui 1.4.1 → 1.5.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 (80) 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/popover/Popover.d.ts +161 -0
  7. package/dist/components/popover/Popover.d.ts.map +1 -0
  8. package/dist/components/popover/Popover.js +436 -0
  9. package/dist/components/popover/Popover.js.map +1 -0
  10. package/dist/components/widget/Widget.css +104 -0
  11. package/dist/components/widget/Widget.d.ts +170 -0
  12. package/dist/components/widget/Widget.d.ts.map +1 -0
  13. package/dist/components/widget/Widget.js +434 -0
  14. package/dist/components/widget/Widget.js.map +1 -0
  15. package/dist/custom-elements.json +687 -184
  16. package/dist/global.d.ts +5 -0
  17. package/dist/storybook/assets/{Avatar.stories-QxWs-YfX.js → Avatar.stories-CPVNxsaA.js} +37 -32
  18. package/dist/storybook/assets/AvatarGroup.stories-Bl65NGHl.js +225 -0
  19. package/dist/storybook/assets/{Badge.stories-BpaApWbR.js → Badge.stories-Bbnc6fRy.js} +1 -1
  20. package/dist/storybook/assets/{Button.stories-C5h2usmd.js → Button.stories-CRJ5n2y4.js} +1 -1
  21. package/dist/storybook/assets/{CircularProgress.stories-DlPOiGja.js → CircularProgress.stories-D9vBj3JJ.js} +1 -1
  22. package/dist/storybook/assets/{ClipboardMixin.stories-Bb45-UOM.js → ClipboardMixin.stories-Dm-Jm4yb.js} +7 -7
  23. package/dist/storybook/assets/Color-6BZIO3FS-BcNIJY1U.js +1 -0
  24. package/dist/storybook/assets/{Colors.stories-DP2JKWUJ.js → Colors.stories-B9_090wL.js} +1 -1
  25. package/dist/storybook/assets/ComponentStatesMixin-ChiFBCuo.js +1 -0
  26. package/dist/storybook/assets/{ComponentStatesMixin.stories-CyQ2aSTu.js → ComponentStatesMixin.stories-DHv9MHmE.js} +3 -3
  27. package/dist/storybook/assets/{CopyToClipboard.stories-DR7pckeV.js → CopyToClipboard.stories-gtJlTP1l.js} +1 -1
  28. package/dist/storybook/assets/{Debounce.stories-hkqyvqmg.js → Debounce.stories-BBNX7mJA.js} +1 -1
  29. package/dist/storybook/assets/{DocsRenderer-LL677BLK-Dtw9GMer.js → DocsRenderer-LL677BLK-D-E99pXl.js} +6 -6
  30. package/dist/storybook/assets/{Events.stories-BAgDzdyl.js → Events.stories-DDmydlh_.js} +1 -1
  31. package/dist/storybook/assets/{Heading.stories-CN_fPsRf.js → Heading.stories-BLGfko-i.js} +1 -1
  32. package/dist/storybook/assets/{Icon.stories-CSx_2K8V.js → Icon.stories-BHnAGcFF.js} +1 -1
  33. package/dist/storybook/assets/{LinearProgress.stories-In48DY2g.js → LinearProgress.stories-Dx26a0P_.js} +1 -1
  34. package/dist/storybook/assets/Popover.stories-CbqpY6YR.js +431 -0
  35. package/dist/storybook/assets/ReadyMixin-BHiHoIbr.js +1 -0
  36. package/dist/storybook/assets/{Rtc.stories-19d7WXe4.js → Rtc.stories-CAjDv_Ub.js} +1 -1
  37. package/dist/storybook/assets/{ScrollShadow.stories-BFjracVd.js → ScrollShadow.stories-BSV4U-tq.js} +1 -1
  38. package/dist/storybook/assets/{Throttle.stories-DD6ydiVq.js → Throttle.stories-kaxXQ8RZ.js} +1 -1
  39. package/dist/storybook/assets/Tooltip.stories-CsxXkztr.js +143 -0
  40. package/dist/storybook/assets/Widget.stories-DqATHnSq.js +233 -0
  41. package/dist/storybook/assets/{WithTooltip-65CFNBJE-Be1dKqOF.js → WithTooltip-65CFNBJE-BtbbFYSA.js} +2 -2
  42. package/dist/storybook/assets/custom-element-UsVr97OX.js +1 -0
  43. package/dist/storybook/assets/{formatter-EIJCOSYU-anC2P5HS.js → formatter-EIJCOSYU-C87Csnpu.js} +1 -1
  44. package/dist/storybook/assets/if-defined-COHr0XBn.js +1 -0
  45. package/dist/storybook/assets/{iframe-B4njXYq6.css → iframe-BkDGeDre.css} +1 -1
  46. package/dist/storybook/assets/{iframe-Bl9oHz5c.js → iframe-CcloOV09.js} +77 -77
  47. package/dist/storybook/assets/{index-Cn5E5A3G.js → index-DP7vnJf7.js} +1 -1
  48. package/dist/storybook/assets/{onFind.stories-BMDLUk0l.js → onFind.stories-BxvoC-Z-.js} +1 -1
  49. package/dist/storybook/assets/{onRemove.stories-C3FcxtYh.js → onRemove.stories-Dwoixzb0.js} +1 -1
  50. package/dist/storybook/assets/{onVisible.stories-B8Zyu0Th.js → onVisible.stories-CinmRF9w.js} +1 -1
  51. package/dist/storybook/assets/{syntaxhighlighter-ED5Y7EFY-BfTKsIVL.js → syntaxhighlighter-ED5Y7EFY-BHLkDkOn.js} +1 -1
  52. package/dist/storybook/iframe.html +2 -2
  53. package/dist/storybook/index.json +1 -1
  54. package/dist/storybook/project.json +1 -1
  55. package/dist/tailwind-plugin-popover.d.ts +2 -0
  56. package/dist/tailwind-plugin-popover.d.ts.map +1 -0
  57. package/dist/tailwind-plugin-popover.js +177 -0
  58. package/dist/tailwind-plugin-popover.js.map +1 -0
  59. package/dist/tailwind-plugin-popover.ts +202 -0
  60. package/dist/tailwind-plugin-tooltip.d.ts +2 -0
  61. package/dist/tailwind-plugin-tooltip.d.ts.map +1 -0
  62. package/dist/tailwind-plugin-tooltip.js +184 -0
  63. package/dist/tailwind-plugin-tooltip.js.map +1 -0
  64. package/dist/tailwind-plugin-tooltip.ts +209 -0
  65. package/dist/util/EventEmitterMixin.d.ts +11 -0
  66. package/dist/util/EventEmitterMixin.d.ts.map +1 -1
  67. package/dist/util/EventEmitterMixin.js +1 -1
  68. package/dist/util/EventEmitterMixin.js.map +1 -1
  69. package/dist/util/TooltipController.d.ts +37 -0
  70. package/dist/util/TooltipController.d.ts.map +1 -0
  71. package/dist/util/TooltipController.js +133 -0
  72. package/dist/util/TooltipController.js.map +1 -0
  73. package/dist/util/TooltipMixin.d.ts +42 -0
  74. package/dist/util/TooltipMixin.d.ts.map +1 -0
  75. package/dist/util/TooltipMixin.js +401 -0
  76. package/dist/util/TooltipMixin.js.map +1 -0
  77. package/package.json +1 -1
  78. package/dist/storybook/assets/AvatarGroup.stories-Cy_Bvn7E.js +0 -211
  79. package/dist/storybook/assets/Color-6BZIO3FS-CcgGYVAo.js +0 -1
  80. package/dist/storybook/assets/ComponentStatesMixin-B7ci0thi.js +0 -1
@@ -0,0 +1,434 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html } from 'lit';
8
+ import { property, state } from 'lit/decorators.js';
9
+ import { ifDefined } from 'lit/directives/if-defined.js';
10
+ import { EventEmitterMixin } from '../../util/EventEmitterMixin.js';
11
+ import onFind from '../../util/onFind.js';
12
+ import { ReadyMixin } from '../../util/ReadyMixin.js';
13
+ import { TooltipController } from '../../util/TooltipController.js';
14
+ import '../icon/Icon.js';
15
+ import './Widget.css';
16
+ /**
17
+ * A widget component for displaying content with header, body, and footer sections.
18
+ *
19
+ * ## Architecture: Light DOM + Manager Pattern
20
+ *
21
+ * This component uses **Light DOM** (no Shadow Root) with the **Manager Pattern**:
22
+ * - User-provided children are physically moved into internal containers
23
+ * - Movement is based on `slot` attributes (pseudo-slots)
24
+ * - The `onFind` utility automatically redistributes dynamically-added content
25
+ *
26
+ * ### Node Redistribution Rules
27
+ * - `slot="controls"` → Moved to header actions area (before system buttons)
28
+ * - `slot="footer"` → Moved to footer container
29
+ * - *(no slot)* → Moved to body container (default)
30
+ *
31
+ * ## Features
32
+ *
33
+ * - **Collapsible**: Optional chevron toggle to hide/show body and footer
34
+ * - **Fullscreen**: Optional maximize button for fullscreen mode via `:state(fullscreen)` custom state
35
+ * - **Dynamic Content**: `onFind` handles content added after initialization
36
+ * - **Accessible**: Full ARIA support and keyboard navigation
37
+ * - **Themeable**: CSS custom properties for colors and spacing
38
+ *
39
+ * ## Accessibility
40
+ *
41
+ * - **Collapse toggle**: `aria-expanded`, `aria-controls`, `aria-label`
42
+ * - **Fullscreen toggle**: `aria-pressed`, `aria-label`
43
+ * - **Body region**: `role="region"`, `aria-labelledby` linking to heading
44
+ * - **Tab order**: Natural flow via physical DOM placement
45
+ * - **Collapsed content**: Hidden via `inert` attribute and CSS grid collapse
46
+ *
47
+ * @element btu-widget
48
+ *
49
+ * @attr heading - Title text displayed in the header
50
+ * @attr collapsible - Whether the widget can be collapsed/expanded
51
+ * @attr collapsed - Whether the widget is currently collapsed (implies collapsible)
52
+ * @attr fullscreenable - Whether the widget can enter fullscreen mode
53
+ * @attr id - When set, collapsed state is automatically persisted to LocalStorage
54
+ *
55
+ * @fires {CustomEvent} btu-widget-ready - Fired after first render and redistribution
56
+ * @fires {CustomEvent<{collapsed: boolean}>} btu-widget-collapse-changed - Fired when collapsed state changes
57
+ * @fires {CustomEvent<{fullscreen: boolean}>} btu-widget-fullscreen-changed - Fired when fullscreen state changes
58
+ *
59
+ * @cssprop --widget-background - Body and footer background color (default: --btu-theme-white)
60
+ * @cssprop --widget-border - Widget border and dividers (default: 1px solid gray-200)
61
+ * @cssprop --header-background - Header background color (default: transparent)
62
+ *
63
+ * @cssstate collapsed - Applied when the widget is collapsed, targetable via :state(collapsed)
64
+ * @cssstate fullscreen - Applied when the widget is in fullscreen mode, targetable via :state(fullscreen)
65
+ *
66
+ * @slot - Default pseudo-slot: elements without slot attribute are moved to body
67
+ * @slot controls - Pseudo-slot: buttons/actions moved to header actions area
68
+ * @slot footer - Pseudo-slot: content moved to footer container
69
+ *
70
+ * @example
71
+ * ```html
72
+ * <!-- Basic usage with heading property -->
73
+ * <btu-widget heading="My Widget">
74
+ * <button slot="controls">Action</button>
75
+ * <div>Main body content</div>
76
+ * </btu-widget>
77
+ * ```
78
+ */
79
+ export default class Widget extends EventEmitterMixin(ReadyMixin(LitElement)) {
80
+ constructor() {
81
+ super(...arguments);
82
+ this._internals = this.attachInternals();
83
+ /**
84
+ * Heading text displayed in the header.
85
+ * @attr
86
+ */
87
+ this.heading = '';
88
+ /**
89
+ * Whether the widget can be collapsed/expanded.
90
+ * When true, a chevron toggle button appears in the header.
91
+ * @attr
92
+ */
93
+ this.collapsible = false;
94
+ /**
95
+ * Whether the widget is currently collapsed.
96
+ * When true, body and footer are hidden. Implies collapsible.
97
+ * @attr
98
+ */
99
+ this.collapsed = false;
100
+ /**
101
+ * Whether the widget can enter fullscreen mode.
102
+ * When true, a fullscreen toggle button appears in the header.
103
+ * @attr
104
+ */
105
+ this.fullscreenable = false;
106
+ this._isFullscreen = false;
107
+ this._collapseTooltip = new TooltipController(this, {
108
+ target: 'button[data-tooltip="collapse"]',
109
+ text: () => (this.collapsed ? 'Expand' : 'Collapse'),
110
+ position: 'bottom',
111
+ noArrow: true,
112
+ offset: 'sm',
113
+ });
114
+ this._fullscreenTooltip = new TooltipController(this, {
115
+ target: 'button[data-tooltip="fullscreen"]',
116
+ text: () => (this._isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'),
117
+ position: 'bottom',
118
+ noArrow: true,
119
+ offset: 'sm',
120
+ });
121
+ /** @internal */
122
+ this._instanceId = Widget._idCounter++;
123
+ /** @internal */
124
+ this.bodyId = `widget-body-${this._instanceId}`;
125
+ /** @internal */
126
+ this.dialogId = `widget-dialog-${this._instanceId}`;
127
+ }
128
+ static { this._idCounter = 0; }
129
+ createRenderRoot() {
130
+ return this;
131
+ }
132
+ /**
133
+ * Whether the widget is currently in fullscreen mode (read-only).
134
+ * Use `btu-widget-fullscreen-changed` event to react to changes.
135
+ */
136
+ get isFullscreen() {
137
+ return this._isFullscreen;
138
+ }
139
+ willUpdate(changed) {
140
+ super.willUpdate(changed);
141
+ if (changed.has('collapsed')) {
142
+ if (this.collapsed) {
143
+ this._internals.states.add('collapsed');
144
+ }
145
+ else {
146
+ this._internals.states.delete('collapsed');
147
+ }
148
+ }
149
+ }
150
+ connectedCallback() {
151
+ super.connectedCallback();
152
+ this.classList.add('block');
153
+ this._restoreState();
154
+ // Light-dismiss: close dialog on backdrop click
155
+ this._lightDismissHandler = (e) => {
156
+ const dialog = e.target;
157
+ if (dialog instanceof HTMLDialogElement && dialog.id === this.dialogId) {
158
+ dialog.close();
159
+ }
160
+ };
161
+ document.addEventListener('click', this._lightDismissHandler);
162
+ // Set up dialog after render (works on both first connect and reconnect)
163
+ this.updateComplete.then(() => this._setupDialog());
164
+ }
165
+ disconnectedCallback() {
166
+ super.disconnectedCallback();
167
+ // Clean up light-dismiss listener
168
+ if (this._lightDismissHandler) {
169
+ document.removeEventListener('click', this._lightDismissHandler);
170
+ this._lightDismissHandler = undefined;
171
+ }
172
+ // Clean up dialog close listener
173
+ if (this._dialog && this._dialogCloseHandler) {
174
+ this._dialog.removeEventListener('close', this._dialogCloseHandler);
175
+ this._dialogCloseHandler = undefined;
176
+ }
177
+ }
178
+ firstUpdated() {
179
+ const actionsContainer = this.querySelector('.btu-widget__actions');
180
+ const bodyContainer = this.querySelector('.btu-widget__body');
181
+ const footerContainer = this.querySelector('.btu-widget__footer');
182
+ if (actionsContainer && bodyContainer && footerContainer) {
183
+ // Anchor node: first system button in actions container (collapse/fullscreen buttons)
184
+ const systemAnchor = actionsContainer.querySelector('[data-widget-internal]');
185
+ onFind(this, ':scope > :not([data-widget-internal]):not([data-tooltip-internal])', el => {
186
+ const slot = el.getAttribute('slot');
187
+ if (slot === 'controls') {
188
+ actionsContainer.insertBefore(el, systemAnchor);
189
+ }
190
+ else if (slot === 'footer') {
191
+ footerContainer.appendChild(el);
192
+ }
193
+ else {
194
+ bodyContainer.appendChild(el);
195
+ }
196
+ });
197
+ }
198
+ this.emit('btu-widget-ready');
199
+ }
200
+ /**
201
+ * Toggles the collapsed state of the widget.
202
+ * Emits 'btu-widget-collapse-changed' event with collapsed state.
203
+ * @internal
204
+ */
205
+ handleToggle() {
206
+ this.collapsed = !this.collapsed;
207
+ if (!this.collapsible)
208
+ this.collapsible = true;
209
+ this.emit('btu-widget-collapse-changed', { collapsed: this.collapsed });
210
+ this._persistState();
211
+ }
212
+ /**
213
+ * Toggles the fullscreen state of the widget using native dialog element.
214
+ * Moves the content wrapper into the dialog on fullscreen, back out on exit.
215
+ * Uses dialog.showModal() for proper modal behavior with backdrop.
216
+ * Uses View Transition API for smooth fullscreen animation.
217
+ * Emits 'btu-widget-fullscreen-changed' event with fullscreen state.
218
+ * @internal
219
+ */
220
+ handleFullscreen() {
221
+ if (!this._dialog) {
222
+ console.warn('Widget: Dialog element not found');
223
+ return;
224
+ }
225
+ const content = this.querySelector('.btu-widget__content');
226
+ if (!content)
227
+ return;
228
+ const body = content.querySelector('.btu-widget__body');
229
+ const updateFullscreen = () => {
230
+ this._isFullscreen = !this._isFullscreen;
231
+ if (this._isFullscreen) {
232
+ this._internals.states.add('fullscreen');
233
+ if (body) {
234
+ body.classList.add('max-h-[calc(100vh-3rem-4rem)]', 'overflow-auto');
235
+ }
236
+ this._dialog.appendChild(content);
237
+ this._dialog.showModal();
238
+ }
239
+ else {
240
+ this._internals.states.delete('fullscreen');
241
+ if (body) {
242
+ body.classList.remove('max-h-[calc(100vh-3rem-4rem)]', 'overflow-auto');
243
+ }
244
+ this._dialog.close();
245
+ this.insertBefore(content, this._dialog);
246
+ }
247
+ this.emit('btu-widget-fullscreen-changed', { fullscreen: this._isFullscreen });
248
+ };
249
+ // Use View Transition API if supported
250
+ if (document.startViewTransition) {
251
+ this._dialog.style.viewTransitionName = 'widget';
252
+ document
253
+ .startViewTransition(() => {
254
+ updateFullscreen();
255
+ })
256
+ .finished.finally(() => {
257
+ if (this._dialog) {
258
+ this._dialog.style.viewTransitionName = '';
259
+ }
260
+ });
261
+ }
262
+ else {
263
+ updateFullscreen();
264
+ }
265
+ }
266
+ /**
267
+ * Sets up the dialog element and event listeners.
268
+ * @internal
269
+ */
270
+ _setupDialog() {
271
+ // Clean up existing handler (reconnection scenario)
272
+ if (this._dialog && this._dialogCloseHandler) {
273
+ this._dialog.removeEventListener('close', this._dialogCloseHandler);
274
+ }
275
+ this._dialog = this.querySelector(`#${this.dialogId}`);
276
+ if (!this._dialog) {
277
+ console.warn('Widget: Dialog element not found');
278
+ return;
279
+ }
280
+ // Handle ESC key and light dismiss — move content back out of dialog
281
+ this._dialogCloseHandler = () => {
282
+ if (this._isFullscreen) {
283
+ const content = this._dialog.querySelector('.btu-widget__content');
284
+ if (content) {
285
+ const body = content.querySelector('.btu-widget__body');
286
+ if (body) {
287
+ body.classList.remove('max-h-[calc(100vh-3rem-4rem)]', 'overflow-auto');
288
+ }
289
+ this.insertBefore(content, this._dialog);
290
+ }
291
+ this._isFullscreen = false;
292
+ this._internals.states.delete('fullscreen');
293
+ this.emit('btu-widget-fullscreen-changed', { fullscreen: false });
294
+ }
295
+ };
296
+ this._dialog.addEventListener('close', this._dialogCloseHandler);
297
+ }
298
+ /**
299
+ * Restores widget state from LocalStorage if id is set.
300
+ * Only restores if no explicit collapsed attribute is present on the element.
301
+ *
302
+ * Attribute Precedence:
303
+ * - If collapsed attribute is explicitly present in HTML: Use that value (ignore LocalStorage)
304
+ * - If collapsed attribute is absent: Restore from LocalStorage
305
+ *
306
+ * @internal
307
+ */
308
+ _restoreState() {
309
+ if (!this.id) {
310
+ return;
311
+ }
312
+ // If collapsed attribute is explicitly set in HTML, respect that over LocalStorage
313
+ if (this.hasAttribute('collapsed')) {
314
+ return;
315
+ }
316
+ const storageKey = `btu-widget-state-${this.id}`;
317
+ try {
318
+ const storedState = localStorage.getItem(storageKey);
319
+ if (storedState) {
320
+ const state = JSON.parse(storedState);
321
+ if (typeof state.collapsed === 'boolean') {
322
+ this.collapsed = state.collapsed;
323
+ }
324
+ }
325
+ }
326
+ catch (e) {
327
+ console.warn(`Widget: Failed to parse stored state for ${storageKey}`, e);
328
+ }
329
+ }
330
+ /**
331
+ * Persists widget state to LocalStorage if id is set.
332
+ *
333
+ * @internal
334
+ */
335
+ _persistState() {
336
+ if (!this.id) {
337
+ return;
338
+ }
339
+ const storageKey = `btu-widget-state-${this.id}`;
340
+ const state = { collapsed: this.collapsed };
341
+ try {
342
+ localStorage.setItem(storageKey, JSON.stringify(state));
343
+ }
344
+ catch (e) {
345
+ console.warn(`Widget: Failed to persist state for ${this.id}`, e);
346
+ }
347
+ }
348
+ render() {
349
+ const contentClasses = 'btu-widget__content overflow-hidden rounded-[inherit] [border:var(--widget-border,1px_solid_oklch(var(--btu-theme-gray-200)))]';
350
+ const headerClasses = 'btu-widget__header flex items-center justify-between gap-2 px-4 py-2 [background-color:var(--header-background,oklch(var(--btu-theme-gray-50)))] [border-bottom-width:1px] [border-bottom-style:solid] [border-bottom-color:var(--widget-border-color,oklch(var(--btu-theme-gray-200)))] transition-[border-color] duration-200';
351
+ const headingClasses = 'btu-widget__heading btu-heading-5 capitalize text-gray-900 flex-1';
352
+ const actionsClasses = 'btu-widget__actions flex items-center gap-2';
353
+ const buttonBaseClasses = 'btu-button btu-button-text-hidden btu-button-fill-none btu-button-gray btu-button-sm';
354
+ const collapseClasses = buttonBaseClasses;
355
+ const fullscreenClasses = buttonBaseClasses;
356
+ const bodyClasses = 'btu-widget__body p-4 [background:var(--widget-background,var(--btu-theme-white))]';
357
+ const footerClasses = 'btu-widget__footer p-4 [border-top:var(--widget-border,1px_solid_oklch(var(--btu-theme-gray-200)))] empty:hidden [background:var(--widget-background,var(--btu-theme-white))]';
358
+ const dialogClasses = 'btu-widget__dialog border-0 rounded-xl p-0 m-6 overflow-hidden w-[calc(100vw-3rem)] max-w-[calc(100vw-3rem)] max-h-[calc(100vh-3rem)] [background:var(--widget-background,var(--btu-theme-white))]';
359
+ return html `
360
+ <div class="${contentClasses}" data-widget-internal>
361
+ <div class="${headerClasses}" data-widget-internal>
362
+ ${this.heading
363
+ ? html `<span id="widget-heading-${this.bodyId}" class="${headingClasses}">${this.heading}</span>`
364
+ : ''}
365
+ <div class="${actionsClasses}" data-widget-internal>
366
+ ${this.collapsible || this.collapsed
367
+ ? html `
368
+ <button
369
+ class="${collapseClasses}"
370
+ data-widget-internal
371
+ data-tooltip="collapse"
372
+ @click="${this.handleToggle}"
373
+ aria-label="${this.collapsed ? 'Expand widget' : 'Collapse widget'}"
374
+ aria-expanded="${!this.collapsed}"
375
+ aria-controls="${this.bodyId}"
376
+ >
377
+ <btu-icon class="btu-widget__collapse-chevron" symbol="chevron-up" size="sm"></btu-icon>
378
+ </button>
379
+ `
380
+ : ''}
381
+ ${this.fullscreenable
382
+ ? html `
383
+ <button
384
+ class="${fullscreenClasses}"
385
+ data-widget-internal
386
+ data-tooltip="fullscreen"
387
+ @click="${this.handleFullscreen}"
388
+ aria-label="${this._isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}"
389
+ aria-pressed="${this._isFullscreen}"
390
+ >
391
+ <btu-icon symbol="${this._isFullscreen ? 'minimize-2' : 'maximize-2'}" size="sm"></btu-icon>
392
+ </button>
393
+ `
394
+ : ''}
395
+ </div>
396
+ </div>
397
+ <div class="btu-widget__collapsible" ?inert="${this.collapsed}" data-widget-internal>
398
+ <div class="btu-widget__collapsible-inner" data-widget-internal>
399
+ <div
400
+ id="${this.bodyId}"
401
+ class="${bodyClasses}"
402
+ role="region"
403
+ aria-labelledby="${ifDefined(this.heading ? `widget-heading-${this.bodyId}` : undefined)}"
404
+ data-widget-internal
405
+ ></div>
406
+ <div class="${footerClasses}" data-widget-internal></div>
407
+ </div>
408
+ </div>
409
+ </div>
410
+ <dialog id="${this.dialogId}" class="${dialogClasses}" data-widget-internal></dialog>
411
+ `;
412
+ }
413
+ }
414
+ __decorate([
415
+ property({ type: String })
416
+ ], Widget.prototype, "heading", void 0);
417
+ __decorate([
418
+ property({ type: Boolean })
419
+ ], Widget.prototype, "collapsible", void 0);
420
+ __decorate([
421
+ property({ type: Boolean })
422
+ ], Widget.prototype, "collapsed", void 0);
423
+ __decorate([
424
+ property({ type: Boolean })
425
+ ], Widget.prototype, "fullscreenable", void 0);
426
+ __decorate([
427
+ state()
428
+ ], Widget.prototype, "_isFullscreen", void 0);
429
+ // Register custom element with guard to prevent double registration
430
+ // (common with yarn link, HMR, or webpack bundle duplication)
431
+ if (!customElements.get('btu-widget')) {
432
+ customElements.define('btu-widget', Widget);
433
+ }
434
+ //# sourceMappingURL=Widget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Widget.js","sourceRoot":"","sources":["../../../src/components/widget/Widget.ts"],"names":[],"mappings":"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"}