@brightspot/ui 1.4.0 → 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.
- package/README.md +12 -0
- package/dist/components/avatar/Avatar.d.ts +1 -1
- package/dist/components/avatar/Avatar.d.ts.map +1 -1
- package/dist/components/avatar/Avatar.js +3 -1
- package/dist/components/avatar/Avatar.js.map +1 -1
- package/dist/components/popover/Popover.d.ts +161 -0
- package/dist/components/popover/Popover.d.ts.map +1 -0
- package/dist/components/popover/Popover.js +436 -0
- package/dist/components/popover/Popover.js.map +1 -0
- package/dist/components/widget/Widget.css +104 -0
- package/dist/components/widget/Widget.d.ts +170 -0
- package/dist/components/widget/Widget.d.ts.map +1 -0
- package/dist/components/widget/Widget.js +434 -0
- package/dist/components/widget/Widget.js.map +1 -0
- package/dist/custom-elements.json +604 -101
- package/dist/global.d.ts +5 -0
- package/dist/storybook/assets/{Avatar.stories-DrhezTR1.js → Avatar.stories-CPVNxsaA.js} +37 -32
- package/dist/storybook/assets/AvatarGroup.stories-Bl65NGHl.js +225 -0
- package/dist/storybook/assets/{Badge.stories-DtJcBfOR.js → Badge.stories-Bbnc6fRy.js} +1 -1
- package/dist/storybook/assets/{Button.stories-BKUfLgSY.js → Button.stories-CRJ5n2y4.js} +1 -1
- package/dist/storybook/assets/{CircularProgress.stories-dpmD-XJT.js → CircularProgress.stories-D9vBj3JJ.js} +1 -1
- package/dist/storybook/assets/{ClipboardMixin.stories-C0pnQ7BY.js → ClipboardMixin.stories-Dm-Jm4yb.js} +7 -7
- package/dist/storybook/assets/Color-6BZIO3FS-BcNIJY1U.js +1 -0
- package/dist/storybook/assets/{Colors.stories-bKK25qgF.js → Colors.stories-B9_090wL.js} +1 -1
- package/dist/storybook/assets/ComponentStatesMixin-ChiFBCuo.js +1 -0
- package/dist/storybook/assets/{ComponentStatesMixin.stories-9mRp2zuB.js → ComponentStatesMixin.stories-DHv9MHmE.js} +3 -3
- package/dist/storybook/assets/{CopyToClipboard.stories-BW3oaT1i.js → CopyToClipboard.stories-gtJlTP1l.js} +1 -1
- package/dist/storybook/assets/{Debounce.stories-BXx3CKvQ.js → Debounce.stories-BBNX7mJA.js} +3 -3
- package/dist/storybook/assets/DocsRenderer-LL677BLK-D-E99pXl.js +758 -0
- package/dist/storybook/assets/{Events.stories-PBeiuWQn.js → Events.stories-DDmydlh_.js} +1 -1
- package/dist/storybook/assets/{Heading.stories-Djkl0MoC.js → Heading.stories-BLGfko-i.js} +1 -1
- package/dist/storybook/assets/{Icon.stories-Cam1fyud.js → Icon.stories-BHnAGcFF.js} +1 -1
- package/dist/storybook/assets/{LinearProgress.stories-BDNoYIJu.js → LinearProgress.stories-Dx26a0P_.js} +1 -1
- package/dist/storybook/assets/Popover.stories-CbqpY6YR.js +431 -0
- package/dist/storybook/assets/ReadyMixin-BHiHoIbr.js +1 -0
- package/dist/storybook/assets/{Rtc.stories-BrTAIAi1.js → Rtc.stories-CAjDv_Ub.js} +3 -3
- package/dist/storybook/assets/{ScrollShadow.stories-DHcKhkag.js → ScrollShadow.stories-BSV4U-tq.js} +1 -1
- package/dist/storybook/assets/{Throttle.stories-cSYT_BXu.js → Throttle.stories-kaxXQ8RZ.js} +8 -8
- package/dist/storybook/assets/Tooltip.stories-CsxXkztr.js +143 -0
- package/dist/storybook/assets/Widget.stories-DqATHnSq.js +233 -0
- package/dist/storybook/assets/WithTooltip-65CFNBJE-BtbbFYSA.js +9 -0
- package/dist/storybook/assets/custom-element-UsVr97OX.js +1 -0
- package/dist/storybook/assets/formatter-EIJCOSYU-C87Csnpu.js +1 -0
- package/dist/storybook/assets/if-defined-COHr0XBn.js +1 -0
- package/dist/storybook/assets/{iframe-BMxUFmpF.css → iframe-BkDGeDre.css} +1 -1
- package/dist/storybook/assets/iframe-CcloOV09.js +1061 -0
- package/dist/storybook/assets/index-DP7vnJf7.js +1 -0
- package/dist/storybook/assets/onFind-DqriYjEB.js +1 -0
- package/dist/storybook/assets/onFind.stories-BxvoC-Z-.js +1069 -0
- package/dist/storybook/assets/{onRemove.stories-C7W9KyRr.js → onRemove.stories-Dwoixzb0.js} +3 -3
- package/dist/storybook/assets/{onVisible.stories-CIl6R0q4.js → onVisible.stories-CinmRF9w.js} +10 -10
- package/dist/storybook/assets/syntaxhighlighter-ED5Y7EFY-BHLkDkOn.js +6 -0
- package/dist/storybook/iframe.html +57 -39
- package/dist/storybook/index.html +11 -4
- package/dist/storybook/index.json +1 -1
- package/dist/storybook/project.json +1 -1
- package/dist/storybook/sb-addons/docs-1/manager-bundle.js +1 -1
- package/dist/storybook/sb-addons/storybook-core-server-presets-0/common-manager-bundle.js +112 -290
- package/dist/storybook/sb-addons/vitest-2/manager-bundle.js +3 -0
- package/dist/storybook/sb-manager/globals-runtime.js +60754 -66346
- package/dist/storybook/sb-manager/globals.js +2 -3
- package/dist/storybook/sb-manager/manager-stores.js +23 -0
- package/dist/storybook/sb-manager/runtime.js +12983 -11699
- package/dist/storybook/vite-inject-mocker-entry.js +2 -2
- package/dist/tailwind-plugin-popover.d.ts +2 -0
- package/dist/tailwind-plugin-popover.d.ts.map +1 -0
- package/dist/tailwind-plugin-popover.js +177 -0
- package/dist/tailwind-plugin-popover.js.map +1 -0
- package/dist/tailwind-plugin-popover.ts +202 -0
- package/dist/tailwind-plugin-tooltip.d.ts +2 -0
- package/dist/tailwind-plugin-tooltip.d.ts.map +1 -0
- package/dist/tailwind-plugin-tooltip.js +184 -0
- package/dist/tailwind-plugin-tooltip.js.map +1 -0
- package/dist/tailwind-plugin-tooltip.ts +209 -0
- package/dist/util/EventEmitterMixin.d.ts +11 -0
- package/dist/util/EventEmitterMixin.d.ts.map +1 -1
- package/dist/util/EventEmitterMixin.js +1 -1
- package/dist/util/EventEmitterMixin.js.map +1 -1
- package/dist/util/TooltipController.d.ts +37 -0
- package/dist/util/TooltipController.d.ts.map +1 -0
- package/dist/util/TooltipController.js +133 -0
- package/dist/util/TooltipController.js.map +1 -0
- package/dist/util/TooltipMixin.d.ts +42 -0
- package/dist/util/TooltipMixin.d.ts.map +1 -0
- package/dist/util/TooltipMixin.js +401 -0
- package/dist/util/TooltipMixin.js.map +1 -0
- package/dist/util/onFind.d.ts +1 -0
- package/dist/util/onFind.d.ts.map +1 -1
- package/dist/util/onFind.js +73 -48
- package/dist/util/onFind.js.map +1 -1
- package/dist/util/onVisible.d.ts.map +1 -1
- package/dist/util/onVisible.js +13 -2
- package/dist/util/onVisible.js.map +1 -1
- package/package.json +12 -5
- package/dist/storybook/assets/AvatarGroup.stories-DrlxT-mF.js +0 -211
- package/dist/storybook/assets/Color-64QXVMR3-Dnd9S2a1.js +0 -1
- package/dist/storybook/assets/ComponentStatesMixin-C2HZ9ZFb.js +0 -1
- package/dist/storybook/assets/WithTooltip-SK46ZJ2J-Df0E-KJO.js +0 -825
- package/dist/storybook/assets/formatter-OMEEQ6HG-DFa_WTfb.js +0 -1
- package/dist/storybook/assets/iframe-lTczLWsL.js +0 -1064
- package/dist/storybook/assets/index-yMswRDPh.js +0 -1
- package/dist/storybook/assets/onFind-C6olvKHR.js +0 -1
- package/dist/storybook/assets/onFind.stories-DfW54CDE.js +0 -284
- package/dist/storybook/assets/syntaxhighlighter-CAVLW7PM-DoI0ixeu.js +0 -6
|
@@ -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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"}
|