@openelement/ui 0.41.0-alpha.1
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/LICENSE +21 -0
- package/README.md +78 -0
- package/package.json +142 -0
- package/src/daisy-classes.d.ts +7 -0
- package/src/daisy-classes.js +770 -0
- package/src/index.d.ts +57 -0
- package/src/index.js +62 -0
- package/src/manifest.d.ts +8 -0
- package/src/manifest.js +255 -0
- package/src/open-badge.d.ts +15 -0
- package/src/open-badge.js +88 -0
- package/src/open-brand-mark.d.ts +14 -0
- package/src/open-brand-mark.js +107 -0
- package/src/open-button.d.ts +38 -0
- package/src/open-button.js +219 -0
- package/src/open-callout.d.ts +26 -0
- package/src/open-callout.js +99 -0
- package/src/open-card.d.ts +33 -0
- package/src/open-card.js +107 -0
- package/src/open-code-block.d.ts +44 -0
- package/src/open-code-block.js +267 -0
- package/src/open-dialog.d.ts +47 -0
- package/src/open-dialog.js +235 -0
- package/src/open-dropdown.d.ts +25 -0
- package/src/open-dropdown.js +45 -0
- package/src/open-hero-ping.d.ts +27 -0
- package/src/open-hero-ping.js +136 -0
- package/src/open-input.d.ts +51 -0
- package/src/open-input.js +233 -0
- package/src/open-lab-panel.d.ts +16 -0
- package/src/open-lab-panel.js +151 -0
- package/src/open-lab-stage.d.ts +15 -0
- package/src/open-lab-stage.js +622 -0
- package/src/open-layout.d.ts +111 -0
- package/src/open-layout.js +1377 -0
- package/src/open-modal.d.ts +25 -0
- package/src/open-modal.js +48 -0
- package/src/open-props-tokens.d.ts +7 -0
- package/src/open-props-tokens.js +474 -0
- package/src/open-standards-visual.d.ts +20 -0
- package/src/open-standards-visual.js +425 -0
- package/src/open-step-card.d.ts +34 -0
- package/src/open-step-card.js +117 -0
- package/src/open-tabs.d.ts +27 -0
- package/src/open-tabs.js +56 -0
- package/src/open-theme-toggle.d.ts +38 -0
- package/src/open-theme-toggle.js +223 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/** @jsxImportSource @openelement/core */ /**
|
|
2
|
+
* @openelement/ui - open-dialog
|
|
3
|
+
*
|
|
4
|
+
* Dialog component using native <dialog> element + popover API.
|
|
5
|
+
* Per WHATWG HTML Living Standard sections 4.11.4 (dialog) and 6.9.2 (popover).
|
|
6
|
+
*
|
|
7
|
+
* v0.20.0: Migrated from DsdLitElement to DsdElement (Ocean component).
|
|
8
|
+
* v0.24.1: Migrated from html`` template to JSX (ADR-0057).
|
|
9
|
+
*
|
|
10
|
+
* @csspart overlay - The dialog backdrop/element
|
|
11
|
+
* @csspart header -The header bar
|
|
12
|
+
* @csspart close -The close button
|
|
13
|
+
* @csspart body -The content area (<slot>)
|
|
14
|
+
* @csspart footer -The optional footer slot
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* ```html
|
|
18
|
+
* <open-dialog>
|
|
19
|
+
* <button slot="trigger">Open Dialog</button>
|
|
20
|
+
* <div>Dialog content here</div>
|
|
21
|
+
* </open-dialog>
|
|
22
|
+
* ```
|
|
23
|
+
*/ import { OpenElement } from '@openelement/element';
|
|
24
|
+
import { StyleSheet } from '@openelement/core/style-sheet';
|
|
25
|
+
import { escapeAttr, escapeHtml } from '@openelement/core';
|
|
26
|
+
export const tagName = 'open-dialog';
|
|
27
|
+
const sheet = new StyleSheet();
|
|
28
|
+
sheet.replaceSync(`
|
|
29
|
+
:host {
|
|
30
|
+
display: inline-block;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
::slotted([slot="trigger"]) {
|
|
34
|
+
cursor: pointer;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
dialog {
|
|
38
|
+
border: var(--border-size-1) solid var(--gray-3);
|
|
39
|
+
border-radius: var(--radius-3);
|
|
40
|
+
background: var(--gray-0);
|
|
41
|
+
color: var(--gray-9);
|
|
42
|
+
padding: var(--size-6);
|
|
43
|
+
max-width: min(90vw, 480px);
|
|
44
|
+
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
|
|
45
|
+
font-family: var(--font-sans);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
dialog::backdrop {
|
|
49
|
+
background: rgba(0, 0, 0, 0.4);
|
|
50
|
+
backdrop-filter: blur(4px);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
dialog[open] {
|
|
54
|
+
animation: dialogFadeIn 0.2s ease-out;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@keyframes dialogFadeIn {
|
|
58
|
+
from { opacity: 0; transform: translateY(-8px); }
|
|
59
|
+
to { opacity: 1; transform: translateY(0); }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.dialog-header {
|
|
63
|
+
display: flex;
|
|
64
|
+
justify-content: space-between;
|
|
65
|
+
align-items: center;
|
|
66
|
+
margin-bottom: var(--size-4);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.dialog-title {
|
|
70
|
+
font-size: var(--font-size-2);
|
|
71
|
+
font-weight: var(--font-weight-6);
|
|
72
|
+
color: var(--gray-9);
|
|
73
|
+
margin: 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.dialog-close {
|
|
77
|
+
background: none;
|
|
78
|
+
border: none;
|
|
79
|
+
cursor: pointer;
|
|
80
|
+
color: var(--gray-5);
|
|
81
|
+
font-size: var(--font-size-2);
|
|
82
|
+
line-height: var(--font-lineheight-1);
|
|
83
|
+
padding: var(--size-1);
|
|
84
|
+
border-radius: var(--radius-1);
|
|
85
|
+
transition: color 0.15s ease;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.dialog-close:hover {
|
|
89
|
+
color: var(--gray-9);
|
|
90
|
+
background: rgba(83,74,183,0.06);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.dialog-body {
|
|
94
|
+
font-size: var(--font-size-1);
|
|
95
|
+
color: var(--gray-7);
|
|
96
|
+
line-height: var(--font-lineheight-3);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.dialog-footer {
|
|
100
|
+
margin-top: var(--size-5);
|
|
101
|
+
display: flex;
|
|
102
|
+
justify-content: flex-end;
|
|
103
|
+
gap: var(--size-2);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
:host(:state(open)) dialog {
|
|
107
|
+
display: block;
|
|
108
|
+
}
|
|
109
|
+
`);
|
|
110
|
+
export class OpenDialog extends OpenElement {
|
|
111
|
+
static styles = [
|
|
112
|
+
sheet
|
|
113
|
+
];
|
|
114
|
+
static delegatesFocus = true;
|
|
115
|
+
static observedAttributes = [
|
|
116
|
+
'open',
|
|
117
|
+
'label'
|
|
118
|
+
];
|
|
119
|
+
static _originalInertStates = new WeakMap();
|
|
120
|
+
render() {
|
|
121
|
+
const label = this._esc(this.getAttribute('label') || '');
|
|
122
|
+
return <>
|
|
123
|
+
<slot name='trigger' onClick={()=>this._handleTrigger()}></slot>
|
|
124
|
+
<dialog aria-label={this.getAttribute('label') || ''} part='overlay' onCancel={(e)=>this._handleCancel(e)} onClose={()=>this._handleClose()}>
|
|
125
|
+
<div className='dialog-header' part='header'>
|
|
126
|
+
<h2 className='dialog-title'>{label}</h2>
|
|
127
|
+
<button type='button' className='dialog-close' part='close' aria-label='Close' onClick={()=>this._handleClose()}>
|
|
128
|
+
×
|
|
129
|
+
</button>
|
|
130
|
+
</div>
|
|
131
|
+
<div className='dialog-body' part='body'>
|
|
132
|
+
<slot></slot>
|
|
133
|
+
</div>
|
|
134
|
+
<div className='dialog-footer' part='footer'>
|
|
135
|
+
<slot name='footer'></slot>
|
|
136
|
+
</div>
|
|
137
|
+
</dialog>
|
|
138
|
+
</>;
|
|
139
|
+
}
|
|
140
|
+
attributeChangedCallback(name, old, val) {
|
|
141
|
+
if (old === val) return;
|
|
142
|
+
if (name === 'open') {
|
|
143
|
+
this._updateStates();
|
|
144
|
+
this._syncDialogElement();
|
|
145
|
+
this._syncInert();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
_updateStates() {
|
|
149
|
+
if (!this._internals?.states) return;
|
|
150
|
+
if (this.hasAttribute('open')) {
|
|
151
|
+
this._internals.states.add('open');
|
|
152
|
+
this._internals.states.delete('closed');
|
|
153
|
+
} else {
|
|
154
|
+
this._internals.states.delete('open');
|
|
155
|
+
this._internals.states.add('closed');
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
show() {
|
|
159
|
+
this.setAttribute('open', '');
|
|
160
|
+
}
|
|
161
|
+
close() {
|
|
162
|
+
this.removeAttribute('open');
|
|
163
|
+
}
|
|
164
|
+
toggle() {
|
|
165
|
+
if (this.hasAttribute('open')) this.removeAttribute('open');
|
|
166
|
+
else this.setAttribute('open', '');
|
|
167
|
+
}
|
|
168
|
+
_syncDialogElement() {
|
|
169
|
+
const dialog1 = this.shadowRoot?.querySelector('dialog');
|
|
170
|
+
if (!dialog1) return;
|
|
171
|
+
if (this.hasAttribute('open') && !dialog1.open) {
|
|
172
|
+
dialog1.showModal();
|
|
173
|
+
} else if (!this.hasAttribute('open') && dialog1.open) {
|
|
174
|
+
dialog1.close();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
_syncInert() {
|
|
178
|
+
const parent = this.parentNode;
|
|
179
|
+
if (!parent) return;
|
|
180
|
+
const parentEl = parent instanceof ShadowRoot ? parent.host.parentNode : parent;
|
|
181
|
+
if (!parentEl) return;
|
|
182
|
+
const children = [
|
|
183
|
+
...parentEl.children
|
|
184
|
+
];
|
|
185
|
+
const open = this.hasAttribute('open');
|
|
186
|
+
if (open) {
|
|
187
|
+
for (const child of children){
|
|
188
|
+
if (child !== this) {
|
|
189
|
+
if (!OpenDialog._originalInertStates.has(child)) {
|
|
190
|
+
OpenDialog._originalInertStates.set(child, child.hasAttribute('inert'));
|
|
191
|
+
}
|
|
192
|
+
child.setAttribute('inert', '');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
} else {
|
|
196
|
+
for (const child of children){
|
|
197
|
+
if (child !== this) {
|
|
198
|
+
const wasOriginallyInert = OpenDialog._originalInertStates.get(child);
|
|
199
|
+
if (wasOriginallyInert) child.setAttribute('inert', '');
|
|
200
|
+
else child.removeAttribute('inert');
|
|
201
|
+
OpenDialog._originalInertStates.delete(child);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
disconnectedCallback() {
|
|
207
|
+
super.disconnectedCallback();
|
|
208
|
+
if (this.hasAttribute('open')) this._syncInert();
|
|
209
|
+
}
|
|
210
|
+
_handleClose() {
|
|
211
|
+
this.removeAttribute('open');
|
|
212
|
+
this._updateStates();
|
|
213
|
+
this._syncDialogElement();
|
|
214
|
+
this._syncInert();
|
|
215
|
+
this.dispatchEvent(new CustomEvent('open-dialog-close', {
|
|
216
|
+
bubbles: true,
|
|
217
|
+
composed: true
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
_handleCancel(e) {
|
|
221
|
+
e.preventDefault();
|
|
222
|
+
this._handleClose();
|
|
223
|
+
}
|
|
224
|
+
_handleTrigger() {
|
|
225
|
+
this.toggle();
|
|
226
|
+
}
|
|
227
|
+
_esc = escapeHtml;
|
|
228
|
+
_escAttr = escapeAttr;
|
|
229
|
+
}
|
|
230
|
+
export default OpenDialog;
|
|
231
|
+
// Guard: idempotent across SSR paths
|
|
232
|
+
if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {
|
|
233
|
+
customElements.define(tagName, OpenDialog);
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy91aS9zcmMvb3Blbi1kaWFsb2cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAanN4SW1wb3J0U291cmNlIEBvcGVuZWxlbWVudC9jb3JlICovXG4vKipcbiAqIEBvcGVuZWxlbWVudC91aSAtIG9wZW4tZGlhbG9nXG4gKlxuICogRGlhbG9nIGNvbXBvbmVudCB1c2luZyBuYXRpdmUgPGRpYWxvZz4gZWxlbWVudCArIHBvcG92ZXIgQVBJLlxuICogUGVyIFdIQVRXRyBIVE1MIExpdmluZyBTdGFuZGFyZCBzZWN0aW9ucyA0LjExLjQgKGRpYWxvZykgYW5kIDYuOS4yIChwb3BvdmVyKS5cbiAqXG4gKiB2MC4yMC4wOiBNaWdyYXRlZCBmcm9tIERzZExpdEVsZW1lbnQgdG8gRHNkRWxlbWVudCAoT2NlYW4gY29tcG9uZW50KS5cbiAqIHYwLjI0LjE6IE1pZ3JhdGVkIGZyb20gaHRtbGBgIHRlbXBsYXRlIHRvIEpTWCAoQURSLTAwNTcpLlxuICpcbiAqIEBjc3NwYXJ0IG92ZXJsYXkgLSBUaGUgZGlhbG9nIGJhY2tkcm9wL2VsZW1lbnRcbiAqIEBjc3NwYXJ0IGhlYWRlciAtVGhlIGhlYWRlciBiYXJcbiAqIEBjc3NwYXJ0IGNsb3NlIC1UaGUgY2xvc2UgYnV0dG9uXG4gKiBAY3NzcGFydCBib2R5IC1UaGUgY29udGVudCBhcmVhICg8c2xvdD4pXG4gKiBAY3NzcGFydCBmb290ZXIgLVRoZSBvcHRpb25hbCBmb290ZXIgc2xvdFxuICpcbiAqIFVzYWdlOlxuICogYGBgaHRtbFxuICogPG9wZW4tZGlhbG9nPlxuICogICA8YnV0dG9uIHNsb3Q9XCJ0cmlnZ2VyXCI+T3BlbiBEaWFsb2c8L2J1dHRvbj5cbiAqICAgPGRpdj5EaWFsb2cgY29udGVudCBoZXJlPC9kaXY+XG4gKiA8L29wZW4tZGlhbG9nPlxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgT3BlbkVsZW1lbnQgfSBmcm9tICdAb3BlbmVsZW1lbnQvZWxlbWVudCc7XG5pbXBvcnQgeyBTdHlsZVNoZWV0LCB0eXBlIFN0eWxlU2hlZXRMaWtlIH0gZnJvbSAnQG9wZW5lbGVtZW50L2NvcmUvc3R5bGUtc2hlZXQnO1xuaW1wb3J0IHsgZXNjYXBlQXR0ciwgZXNjYXBlSHRtbCB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlJztcblxuZXhwb3J0IGNvbnN0IHRhZ05hbWUgPSAnb3Blbi1kaWFsb2cnO1xuXG5jb25zdCBzaGVldDogU3R5bGVTaGVldExpa2UgPSBuZXcgU3R5bGVTaGVldCgpO1xuc2hlZXQucmVwbGFjZVN5bmMoYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG5cbiAgOjpzbG90dGVkKFtzbG90PVwidHJpZ2dlclwiXSkge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuXG4gIGRpYWxvZyB7XG4gICAgYm9yZGVyOiB2YXIoLS1ib3JkZXItc2l6ZS0xKSBzb2xpZCB2YXIoLS1ncmF5LTMpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy0zKTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ncmF5LTApO1xuICAgIGNvbG9yOiB2YXIoLS1ncmF5LTkpO1xuICAgIHBhZGRpbmc6IHZhcigtLXNpemUtNik7XG4gICAgbWF4LXdpZHRoOiBtaW4oOTB2dywgNDgwcHgpO1xuICAgIGJveC1zaGFkb3c6IDAgOHB4IDMycHggcmdiYSgwLCAwLCAwLCAwLjEyKTtcbiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1zYW5zKTtcbiAgfVxuXG4gIGRpYWxvZzo6YmFja2Ryb3Age1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC40KTtcbiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoNHB4KTtcbiAgfVxuXG4gIGRpYWxvZ1tvcGVuXSB7XG4gICAgYW5pbWF0aW9uOiBkaWFsb2dGYWRlSW4gMC4ycyBlYXNlLW91dDtcbiAgfVxuXG4gIEBrZXlmcmFtZXMgZGlhbG9nRmFkZUluIHtcbiAgICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC04cHgpOyB9XG4gICAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cbiAgfVxuXG4gIC5kaWFsb2ctaGVhZGVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIG1hcmdpbi1ib3R0b206IHZhcigtLXNpemUtNCk7XG4gIH1cblxuICAuZGlhbG9nLXRpdGxlIHtcbiAgICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS0yKTtcbiAgICBmb250LXdlaWdodDogdmFyKC0tZm9udC13ZWlnaHQtNik7XG4gICAgY29sb3I6IHZhcigtLWdyYXktOSk7XG4gICAgbWFyZ2luOiAwO1xuICB9XG5cbiAgLmRpYWxvZy1jbG9zZSB7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGNvbG9yOiB2YXIoLS1ncmF5LTUpO1xuICAgIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLTIpO1xuICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1mb250LWxpbmVoZWlnaHQtMSk7XG4gICAgcGFkZGluZzogdmFyKC0tc2l6ZS0xKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtMSk7XG4gICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZTtcbiAgfVxuXG4gIC5kaWFsb2ctY2xvc2U6aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS1ncmF5LTkpO1xuICAgIGJhY2tncm91bmQ6IHJnYmEoODMsNzQsMTgzLDAuMDYpO1xuICB9XG5cbiAgLmRpYWxvZy1ib2R5IHtcbiAgICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS0xKTtcbiAgICBjb2xvcjogdmFyKC0tZ3JheS03KTtcbiAgICBsaW5lLWhlaWdodDogdmFyKC0tZm9udC1saW5laGVpZ2h0LTMpO1xuICB9XG5cbiAgLmRpYWxvZy1mb290ZXIge1xuICAgIG1hcmdpbi10b3A6IHZhcigtLXNpemUtNSk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGdhcDogdmFyKC0tc2l6ZS0yKTtcbiAgfVxuXG4gIDpob3N0KDpzdGF0ZShvcGVuKSkgZGlhbG9nIHtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgfVxuYCk7XG5cbmV4cG9ydCBjbGFzcyBPcGVuRGlhbG9nIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW3NoZWV0XTtcbiAgc3RhdGljIG92ZXJyaWRlIGRlbGVnYXRlc0ZvY3VzID0gdHJ1ZTtcbiAgc3RhdGljIG92ZXJyaWRlIG9ic2VydmVkQXR0cmlidXRlcyA9IFsnb3BlbicsICdsYWJlbCddO1xuXG4gIHByaXZhdGUgc3RhdGljIF9vcmlnaW5hbEluZXJ0U3RhdGVzID0gbmV3IFdlYWtNYXA8RWxlbWVudCwgYm9vbGVhbj4oKTtcblxuICBvdmVycmlkZSByZW5kZXIoKTogUmV0dXJuVHlwZTx0eXBlb2YgT3BlbkVsZW1lbnQucHJvdG90eXBlLnJlbmRlcj4ge1xuICAgIGNvbnN0IGxhYmVsID0gdGhpcy5fZXNjKHRoaXMuZ2V0QXR0cmlidXRlKCdsYWJlbCcpIHx8ICcnKTtcbiAgICByZXR1cm4gKFxuICAgICAgPD5cbiAgICAgICAgPHNsb3QgbmFtZT0ndHJpZ2dlcicgb25DbGljaz17KCkgPT4gdGhpcy5faGFuZGxlVHJpZ2dlcigpfT48L3Nsb3Q+XG4gICAgICAgIDxkaWFsb2dcbiAgICAgICAgICBhcmlhLWxhYmVsPXt0aGlzLmdldEF0dHJpYnV0ZSgnbGFiZWwnKSB8fCAnJ31cbiAgICAgICAgICBwYXJ0PSdvdmVybGF5J1xuICAgICAgICAgIG9uQ2FuY2VsPXsoZTogRXZlbnQpID0+IHRoaXMuX2hhbmRsZUNhbmNlbChlKX1cbiAgICAgICAgICBvbkNsb3NlPXsoKSA9PiB0aGlzLl9oYW5kbGVDbG9zZSgpfVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2RpYWxvZy1oZWFkZXInIHBhcnQ9J2hlYWRlcic+XG4gICAgICAgICAgICA8aDIgY2xhc3NOYW1lPSdkaWFsb2ctdGl0bGUnPntsYWJlbH08L2gyPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPSdidXR0b24nXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT0nZGlhbG9nLWNsb3NlJ1xuICAgICAgICAgICAgICBwYXJ0PSdjbG9zZSdcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD0nQ2xvc2UnXG4gICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHRoaXMuX2hhbmRsZUNsb3NlKCl9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICZ0aW1lcztcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdkaWFsb2ctYm9keScgcGFydD0nYm9keSc+XG4gICAgICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2RpYWxvZy1mb290ZXInIHBhcnQ9J2Zvb3Rlcic+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPSdmb290ZXInPjwvc2xvdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaWFsb2c+XG4gICAgICA8Lz5cbiAgICApO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWU6IHN0cmluZywgb2xkOiBzdHJpbmcgfCBudWxsLCB2YWw6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAob2xkID09PSB2YWwpIHJldHVybjtcbiAgICBpZiAobmFtZSA9PT0gJ29wZW4nKSB7XG4gICAgICB0aGlzLl91cGRhdGVTdGF0ZXMoKTtcbiAgICAgIHRoaXMuX3N5bmNEaWFsb2dFbGVtZW50KCk7XG4gICAgICB0aGlzLl9zeW5jSW5lcnQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVTdGF0ZXMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pbnRlcm5hbHM/LnN0YXRlcykgcmV0dXJuO1xuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnb3BlbicpKSB7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc3RhdGVzLmFkZCgnb3BlbicpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnN0YXRlcy5kZWxldGUoJ2Nsb3NlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnb3BlbicpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2Nsb3NlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7XG4gIH1cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpO1xuICB9XG5cbiAgdG9nZ2xlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnb3BlbicpKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jRGlhbG9nRWxlbWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2cgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoJ2RpYWxvZycpO1xuICAgIGlmICghZGlhbG9nKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdvcGVuJykgJiYgIWRpYWxvZy5vcGVuKSB7XG4gICAgICBkaWFsb2cuc2hvd01vZGFsKCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ29wZW4nKSAmJiBkaWFsb2cub3Blbikge1xuICAgICAgZGlhbG9nLmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3luY0luZXJ0KCk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcbiAgICBpZiAoIXBhcmVudCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhcmVudEVsID0gcGFyZW50IGluc3RhbmNlb2YgU2hhZG93Um9vdFxuICAgICAgPyAocGFyZW50Lmhvc3QucGFyZW50Tm9kZSBhcyBFbGVtZW50KVxuICAgICAgOiAocGFyZW50IGFzIEVsZW1lbnQpO1xuICAgIGlmICghcGFyZW50RWwpIHJldHVybjtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gWy4uLnBhcmVudEVsLmNoaWxkcmVuXTtcbiAgICBjb25zdCBvcGVuID0gdGhpcy5oYXNBdHRyaWJ1dGUoJ29wZW4nKTtcbiAgICBpZiAob3Blbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICBpZiAoY2hpbGQgIT09IHRoaXMpIHtcbiAgICAgICAgICBpZiAoIU9wZW5EaWFsb2cuX29yaWdpbmFsSW5lcnRTdGF0ZXMuaGFzKGNoaWxkKSkge1xuICAgICAgICAgICAgT3BlbkRpYWxvZy5fb3JpZ2luYWxJbmVydFN0YXRlcy5zZXQoY2hpbGQsIGNoaWxkLmhhc0F0dHJpYnV0ZSgnaW5lcnQnKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgnaW5lcnQnLCAnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICBpZiAoY2hpbGQgIT09IHRoaXMpIHtcbiAgICAgICAgICBjb25zdCB3YXNPcmlnaW5hbGx5SW5lcnQgPSBPcGVuRGlhbG9nLl9vcmlnaW5hbEluZXJ0U3RhdGVzLmdldChjaGlsZCk7XG4gICAgICAgICAgaWYgKHdhc09yaWdpbmFsbHlJbmVydCkgY2hpbGQuc2V0QXR0cmlidXRlKCdpbmVydCcsICcnKTtcbiAgICAgICAgICBlbHNlIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnaW5lcnQnKTtcbiAgICAgICAgICBPcGVuRGlhbG9nLl9vcmlnaW5hbEluZXJ0U3RhdGVzLmRlbGV0ZShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvdmVycmlkZSBkaXNjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnb3BlbicpKSB0aGlzLl9zeW5jSW5lcnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7XG4gICAgdGhpcy5fdXBkYXRlU3RhdGVzKCk7XG4gICAgdGhpcy5fc3luY0RpYWxvZ0VsZW1lbnQoKTtcbiAgICB0aGlzLl9zeW5jSW5lcnQoKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdvcGVuLWRpYWxvZy1jbG9zZScsIHsgYnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlQ2FuY2VsKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuX2hhbmRsZUNsb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVUcmlnZ2VyKCk6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlKCk7XG4gIH1cblxuICBwcml2YXRlIF9lc2MgPSBlc2NhcGVIdG1sO1xuICBwcml2YXRlIF9lc2NBdHRyID0gZXNjYXBlQXR0cjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgT3BlbkRpYWxvZztcblxuLy8gR3VhcmQ6IGlkZW1wb3RlbnQgYWNyb3NzIFNTUiBwYXRoc1xuaWYgKHR5cGVvZiBjdXN0b21FbGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcgJiYgIWN1c3RvbUVsZW1lbnRzLmdldCh0YWdOYW1lKSkge1xuICBjdXN0b21FbGVtZW50cy5kZWZpbmUodGFnTmFtZSwgT3BlbkRpYWxvZyk7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUNBQXVDLEdBQ3ZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBc0JDLEdBRUQsU0FBUyxXQUFXLFFBQVEsdUJBQXVCO0FBQ25ELFNBQVMsVUFBVSxRQUE2QixnQ0FBZ0M7QUFDaEYsU0FBUyxVQUFVLEVBQUUsVUFBVSxRQUFRLG9CQUFvQjtBQUUzRCxPQUFPLE1BQU0sVUFBVSxjQUFjO0FBRXJDLE1BQU0sUUFBd0IsSUFBSTtBQUNsQyxNQUFNLFdBQVcsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpRm5CLENBQUM7QUFFRCxPQUFPLE1BQU0sbUJBQW1CO0VBQzlCLE9BQWdCLFNBQVM7SUFBQztHQUFNLENBQUM7RUFDakMsT0FBZ0IsaUJBQWlCLEtBQUs7RUFDdEMsT0FBZ0IscUJBQXFCO0lBQUM7SUFBUTtHQUFRLENBQUM7RUFFdkQsT0FBZSx1QkFBdUIsSUFBSSxVQUE0QjtFQUU3RCxTQUEwRDtJQUNqRSxNQUFNLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVk7SUFDdEQsU0FDSTtRQUNBLENBQUMsS0FBSyxLQUFLLFVBQVUsU0FBUyxJQUFNLElBQUksQ0FBQyxjQUFjLE1BQU0sS0FBSztRQUNsRSxDQUFDLE9BQ0MsWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksSUFDMUMsS0FBSyxVQUNMLFVBQVUsQ0FBQyxJQUFhLElBQUksQ0FBQyxhQUFhLENBQUMsSUFDM0MsU0FBUyxJQUFNLElBQUksQ0FBQyxZQUFZLElBQ2pDO1VBQ0MsQ0FBQyxJQUFJLFVBQVUs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
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** @jsxImportSource @openelement/core */ /**
|
|
2
|
+
* @openelement/ui - open-dropdown
|
|
3
|
+
*
|
|
4
|
+
* DaisyUI-style dropdown using DsdElement + Signals.
|
|
5
|
+
* State is reflected to the host `data-open` attribute.
|
|
6
|
+
* CSS uses `:host([data-open="true"])` to control visibility.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ```html
|
|
10
|
+
* <open-dropdown>
|
|
11
|
+
* <button slot="trigger">Open</button>
|
|
12
|
+
* <div>Dropdown content</div>
|
|
13
|
+
* </open-dropdown>
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @slot trigger - Click target to toggle the dropdown
|
|
17
|
+
* @slot - Dropdown content (shown when open)
|
|
18
|
+
*/ import { OpenElement, type VNode } from '@openelement/element';
|
|
19
|
+
import { daisyClassSheet } from "./daisy-classes.js";
|
|
20
|
+
export declare const tagName: 'open-dropdown';
|
|
21
|
+
export declare class OpenDropdown extends OpenElement {
|
|
22
|
+
static override styles: [];
|
|
23
|
+
override render(): VNode;
|
|
24
|
+
}
|
|
25
|
+
export default OpenDropdown;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** @jsxImportSource @openelement/core */ /**
|
|
2
|
+
* @openelement/ui - open-dropdown
|
|
3
|
+
*
|
|
4
|
+
* DaisyUI-style dropdown using DsdElement + Signals.
|
|
5
|
+
* State is reflected to the host `data-open` attribute.
|
|
6
|
+
* CSS uses `:host([data-open="true"])` to control visibility.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* ```html
|
|
10
|
+
* <open-dropdown>
|
|
11
|
+
* <button slot="trigger">Open</button>
|
|
12
|
+
* <div>Dropdown content</div>
|
|
13
|
+
* </open-dropdown>
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* @slot trigger - Click target to toggle the dropdown
|
|
17
|
+
* @slot - Dropdown content (shown when open)
|
|
18
|
+
*/ import { OpenElement } from '@openelement/element';
|
|
19
|
+
import { signal } from '@openelement/signal';
|
|
20
|
+
import { daisyClassSheet } from './daisy-classes.js';
|
|
21
|
+
export const tagName = 'open-dropdown';
|
|
22
|
+
export class OpenDropdown extends OpenElement {
|
|
23
|
+
static styles = [
|
|
24
|
+
daisyClassSheet
|
|
25
|
+
];
|
|
26
|
+
#open = signal(false);
|
|
27
|
+
#toggle() {
|
|
28
|
+
this.#open.value = !this.#open.value;
|
|
29
|
+
this.setAttribute('data-open', String(this.#open.value));
|
|
30
|
+
}
|
|
31
|
+
render() {
|
|
32
|
+
return <div class='dropdown'>
|
|
33
|
+
<slot name='trigger' onClick={()=>this.#toggle()}/>
|
|
34
|
+
<div class='dropdown-content'>
|
|
35
|
+
<slot/>
|
|
36
|
+
</div>
|
|
37
|
+
</div>;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export default OpenDropdown;
|
|
41
|
+
// Guard: idempotent across SSR paths
|
|
42
|
+
if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {
|
|
43
|
+
customElements.define(tagName, OpenDropdown);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy91aS9zcmMvb3Blbi1kcm9wZG93bi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBqc3hJbXBvcnRTb3VyY2UgQG9wZW5lbGVtZW50L2NvcmUgKi9cbi8qKlxuICogQG9wZW5lbGVtZW50L3VpIC0gb3Blbi1kcm9wZG93blxuICpcbiAqIERhaXN5VUktc3R5bGUgZHJvcGRvd24gdXNpbmcgRHNkRWxlbWVudCArIFNpZ25hbHMuXG4gKiBTdGF0ZSBpcyByZWZsZWN0ZWQgdG8gdGhlIGhvc3QgYGRhdGEtb3BlbmAgYXR0cmlidXRlLlxuICogQ1NTIHVzZXMgYDpob3N0KFtkYXRhLW9wZW49XCJ0cnVlXCJdKWAgdG8gY29udHJvbCB2aXNpYmlsaXR5LlxuICpcbiAqIFVzYWdlOlxuICogYGBgaHRtbFxuICogPG9wZW4tZHJvcGRvd24+XG4gKiAgIDxidXR0b24gc2xvdD1cInRyaWdnZXJcIj5PcGVuPC9idXR0b24+XG4gKiAgIDxkaXY+RHJvcGRvd24gY29udGVudDwvZGl2PlxuICogPC9vcGVuLWRyb3Bkb3duPlxuICogYGBgXG4gKlxuICogQHNsb3QgdHJpZ2dlciAtIENsaWNrIHRhcmdldCB0byB0b2dnbGUgdGhlIGRyb3Bkb3duXG4gKiBAc2xvdCAtIERyb3Bkb3duIGNvbnRlbnQgKHNob3duIHdoZW4gb3BlbilcbiAqL1xuXG5pbXBvcnQgeyBPcGVuRWxlbWVudCwgdHlwZSBWTm9kZSB9IGZyb20gJ0BvcGVuZWxlbWVudC9lbGVtZW50JztcbmltcG9ydCB7IHNpZ25hbCB9IGZyb20gJ0BvcGVuZWxlbWVudC9zaWduYWwnO1xuaW1wb3J0IHsgZGFpc3lDbGFzc1NoZWV0IH0gZnJvbSAnLi9kYWlzeS1jbGFzc2VzLmpzJztcblxuZXhwb3J0IGNvbnN0IHRhZ05hbWUgPSAnb3Blbi1kcm9wZG93bic7XG5cbmV4cG9ydCBjbGFzcyBPcGVuRHJvcGRvd24gZXh0ZW5kcyBPcGVuRWxlbWVudCB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbZGFpc3lDbGFzc1NoZWV0XTtcbiAgI29wZW4gPSBzaWduYWwoZmFsc2UpO1xuXG4gICN0b2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy4jb3Blbi52YWx1ZSA9ICF0aGlzLiNvcGVuLnZhbHVlO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKCdkYXRhLW9wZW4nLCBTdHJpbmcodGhpcy4jb3Blbi52YWx1ZSkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCk6IFZOb2RlIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzcz0nZHJvcGRvd24nPlxuICAgICAgICA8c2xvdCBuYW1lPSd0cmlnZ2VyJyBvbkNsaWNrPXsoKSA9PiB0aGlzLiN0b2dnbGUoKX0gLz5cbiAgICAgICAgPGRpdiBjbGFzcz0nZHJvcGRvd24tY29udGVudCc+XG4gICAgICAgICAgPHNsb3QgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9wZW5Ecm9wZG93bjtcblxuLy8gR3VhcmQ6IGlkZW1wb3RlbnQgYWNyb3NzIFNTUiBwYXRoc1xuaWYgKHR5cGVvZiBjdXN0b21FbGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcgJiYgIWN1c3RvbUVsZW1lbnRzLmdldCh0YWdOYW1lKSkge1xuICBjdXN0b21FbGVtZW50cy5kZWZpbmUodGFnTmFtZSwgT3BlbkRyb3Bkb3duKTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1Q0FBdUMsR0FDdkM7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUJDLEdBRUQsU0FBUyxXQUFXLFFBQW9CLHVCQUF1QjtBQUMvRCxTQUFTLE1BQU0sUUFBUSxzQkFBc0I7QUFDN0MsU0FBUyxlQUFlLFFBQVEscUJBQXFCO0FBRXJELE9BQU8sTUFBTSxVQUFVLGdCQUFnQjtBQUV2QyxPQUFPLE1BQU0scUJBQXFCO0VBQ2hDLE9BQWdCLFNBQVM7SUFBQztHQUFnQixDQUFDO0VBQzNDLENBQUEsSUFBSyxHQUFHLE9BQU8sT0FBTztFQUV0QixDQUFBLE1BQU87SUFDTCxJQUFJLENBQUMsQ0FBQSxJQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUEsSUFBSyxDQUFDLEtBQUs7SUFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLE9BQU8sSUFBSSxDQUFDLENBQUEsSUFBSyxDQUFDLEtBQUs7RUFDeEQ7RUFFUyxTQUFnQjtJQUN2QixRQUNHLElBQUksTUFBTSxXQUFXO1FBQ3BCLENBQUMsS0FBSyxLQUFLLFVBQVUsU0FBUyxJQUFNLElBQUksQ0FBQyxDQUFBLE1BQU8sS0FBTTtRQUN0RCxDQUFDLElBQUksTUFBTSxtQkFBbUI7VUFDNUIsQ0FBQyxNQUFPO1FBQ1YsRUFBRSxJQUFJO01BQ1IsRUFBRTtFQUVOO0FBQ0Y7QUFFQSxlQUFlLGFBQWE7QUFFNUIscUNBQXFDO0FBQ3JDLElBQUksT0FBTyxtQkFBbUIsZUFBZSxDQUFDLGVBQWUsR0FBRyxDQUFDLFVBQVU7RUFDekUsZUFBZSxNQUFNLENBQUMsU0FBUztBQUNqQyJ9
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/** @jsxImportSource @openelement/core */ /**
|
|
2
|
+
* Hero Ping - Ocean component (v0.20.0 Ocean-Island).
|
|
3
|
+
*
|
|
4
|
+
* Calls a real API endpoint and shows a status dot with response info.
|
|
5
|
+
* Pure DsdElement - zero Lit dependency. State changes are reflected
|
|
6
|
+
* by re-rendering the shadow DOM and re-hydrating events.
|
|
7
|
+
*
|
|
8
|
+
* v0.24.1: Migrated from html`` template to JSX (ADR-0057).
|
|
9
|
+
*
|
|
10
|
+
* @csspart dot-static - The static status dot
|
|
11
|
+
* @csspart dot-animated - The animated ping button
|
|
12
|
+
*/ import { OpenElement } from '@openelement/element';
|
|
13
|
+
import { type StyleSheetLike } from '@openelement/core/style-sheet';
|
|
14
|
+
export declare const tagName: 'open-hero-ping';
|
|
15
|
+
declare const styles: StyleSheetLike;
|
|
16
|
+
export default class HeroPing extends OpenElement {
|
|
17
|
+
static override styles: [];
|
|
18
|
+
apiUrl: string;
|
|
19
|
+
_state: 'idle' | 'loading' | 'ok' | 'err';
|
|
20
|
+
_msg: string;
|
|
21
|
+
private _abortController?: any;
|
|
22
|
+
override connectedCallback(): void;
|
|
23
|
+
override disconnectedCallback(): void;
|
|
24
|
+
_fetch: () => Promise<void>;
|
|
25
|
+
override render(): ReturnType<typeof OpenElement.prototype.render>;
|
|
26
|
+
private _renderToDom: any;
|
|
27
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/** @jsxImportSource @openelement/core */ /**
|
|
2
|
+
* Hero Ping - Ocean component (v0.20.0 Ocean-Island).
|
|
3
|
+
*
|
|
4
|
+
* Calls a real API endpoint and shows a status dot with response info.
|
|
5
|
+
* Pure DsdElement - zero Lit dependency. State changes are reflected
|
|
6
|
+
* by re-rendering the shadow DOM and re-hydrating events.
|
|
7
|
+
*
|
|
8
|
+
* v0.24.1: Migrated from html`` template to JSX (ADR-0057).
|
|
9
|
+
*
|
|
10
|
+
* @csspart dot-static - The static status dot
|
|
11
|
+
* @csspart dot-animated - The animated ping button
|
|
12
|
+
*/ import { OpenElement } from '@openelement/element';
|
|
13
|
+
import { StyleSheet } from '@openelement/core/style-sheet';
|
|
14
|
+
export const tagName = 'open-hero-ping';
|
|
15
|
+
const styles = new StyleSheet();
|
|
16
|
+
styles.replaceSync(`
|
|
17
|
+
:host {
|
|
18
|
+
display: inline-flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
gap: var(--size-2);
|
|
21
|
+
}
|
|
22
|
+
.ping {
|
|
23
|
+
padding: var(--size-1) var(--size-5);
|
|
24
|
+
border-radius: var(--radius-1);
|
|
25
|
+
border: var(--border-size-1) solid var(--gray-5);
|
|
26
|
+
background: transparent;
|
|
27
|
+
color: var(--gray-5);
|
|
28
|
+
font-size: var(--font-size-00);
|
|
29
|
+
cursor: pointer;
|
|
30
|
+
letter-spacing: var(--font-letterspacing-5);
|
|
31
|
+
text-transform: uppercase;
|
|
32
|
+
transition: all var(--ease-2) var(--duration-2);
|
|
33
|
+
font-family: inherit;
|
|
34
|
+
white-space: nowrap;
|
|
35
|
+
}
|
|
36
|
+
.ping:hover {
|
|
37
|
+
background: var(--gray-2);
|
|
38
|
+
color: var(--text-primary);
|
|
39
|
+
border-color: var(--gray-6);
|
|
40
|
+
}
|
|
41
|
+
.ping:disabled {
|
|
42
|
+
opacity: 0.3;
|
|
43
|
+
cursor: not-allowed;
|
|
44
|
+
}
|
|
45
|
+
.dot {
|
|
46
|
+
width: 7px;
|
|
47
|
+
height: 7px;
|
|
48
|
+
border-radius: var(--radius-round);
|
|
49
|
+
display: inline-block;
|
|
50
|
+
flex-shrink: 0;
|
|
51
|
+
}
|
|
52
|
+
.dot.idle { background: var(--gray-6); }
|
|
53
|
+
.dot.loading {
|
|
54
|
+
background: var(--gray-5);
|
|
55
|
+
animation: pulse 0.8s ease-in-out infinite alternate;
|
|
56
|
+
}
|
|
57
|
+
.dot.ok { background: var(--success); }
|
|
58
|
+
.dot.err { background: var(--error); }
|
|
59
|
+
.info {
|
|
60
|
+
font-family: var(--font-mono);
|
|
61
|
+
font-size: var(--font-size-00);
|
|
62
|
+
color: var(--text-muted);
|
|
63
|
+
white-space: nowrap;
|
|
64
|
+
}
|
|
65
|
+
.info .ok { color: var(--success); }
|
|
66
|
+
.info .err { color: var(--error); }
|
|
67
|
+
@keyframes pulse {
|
|
68
|
+
from { opacity: 0.4; }
|
|
69
|
+
to { opacity: 1; }
|
|
70
|
+
}
|
|
71
|
+
`);
|
|
72
|
+
export default class HeroPing extends OpenElement {
|
|
73
|
+
static styles = [
|
|
74
|
+
styles
|
|
75
|
+
];
|
|
76
|
+
apiUrl = '';
|
|
77
|
+
_state = 'idle';
|
|
78
|
+
_msg = '';
|
|
79
|
+
_abortController;
|
|
80
|
+
connectedCallback() {
|
|
81
|
+
super.connectedCallback();
|
|
82
|
+
// DsdElement handles shadow root creation + initial render.
|
|
83
|
+
// Fetch after DOM is ready.
|
|
84
|
+
this._fetch();
|
|
85
|
+
}
|
|
86
|
+
disconnectedCallback() {
|
|
87
|
+
super.disconnectedCallback();
|
|
88
|
+
this._abortController?.abort();
|
|
89
|
+
}
|
|
90
|
+
_fetch = async ()=>{
|
|
91
|
+
this._abortController?.abort();
|
|
92
|
+
this._abortController = new AbortController();
|
|
93
|
+
this._state = 'loading';
|
|
94
|
+
this._msg = '';
|
|
95
|
+
this._renderToDom();
|
|
96
|
+
try {
|
|
97
|
+
const url = this.apiUrl || 'https://demo.openelement.org/api';
|
|
98
|
+
const r = await fetch(url, {
|
|
99
|
+
signal: this._abortController.signal
|
|
100
|
+
});
|
|
101
|
+
if (!r.ok) throw new Error(`HTTP ${r.status}`);
|
|
102
|
+
const d = await r.json();
|
|
103
|
+
this._state = 'ok';
|
|
104
|
+
this._msg = `${d.framework} v${d.version} ${d.timestamp.slice(11, 19)}`;
|
|
105
|
+
} catch (e) {
|
|
106
|
+
if (e instanceof DOMException && e.name === 'AbortError') return;
|
|
107
|
+
const err = e;
|
|
108
|
+
this._state = 'err';
|
|
109
|
+
this._msg = String(e).includes('HTTP') ? err.message : 'connection failed';
|
|
110
|
+
} finally{
|
|
111
|
+
this._renderToDom();
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
render() {
|
|
115
|
+
const dotClass = `dot ${this._state}`;
|
|
116
|
+
const loading = this._state === 'loading';
|
|
117
|
+
return <>
|
|
118
|
+
<span className={dotClass} part='dot-static'></span>
|
|
119
|
+
<button type='button' className='ping' part='dot-animated' disabled={loading} onClick={this._fetch}>
|
|
120
|
+
{loading ? 'pinging...' : 'ping server'}
|
|
121
|
+
</button>
|
|
122
|
+
{this._msg && <span className='info'>
|
|
123
|
+
<span className={this._state}>{this._msg}</span>
|
|
124
|
+
</span>}
|
|
125
|
+
</>;
|
|
126
|
+
}
|
|
127
|
+
/** Re-render shadow DOM and re-hydrate click events. */ _renderToDom() {
|
|
128
|
+
if (!this.shadowRoot) return;
|
|
129
|
+
this.update();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Guard: idempotent across SSR paths
|
|
133
|
+
if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {
|
|
134
|
+
customElements.define(tagName, HeroPing);
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy91aS9zcmMvb3Blbi1oZXJvLXBpbmcudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAanN4SW1wb3J0U291cmNlIEBvcGVuZWxlbWVudC9jb3JlICovXG4vKipcbiAqIEhlcm8gUGluZyAtIE9jZWFuIGNvbXBvbmVudCAodjAuMjAuMCBPY2Vhbi1Jc2xhbmQpLlxuICpcbiAqIENhbGxzIGEgcmVhbCBBUEkgZW5kcG9pbnQgYW5kIHNob3dzIGEgc3RhdHVzIGRvdCB3aXRoIHJlc3BvbnNlIGluZm8uXG4gKiBQdXJlIERzZEVsZW1lbnQgLSB6ZXJvIExpdCBkZXBlbmRlbmN5LiBTdGF0ZSBjaGFuZ2VzIGFyZSByZWZsZWN0ZWRcbiAqIGJ5IHJlLXJlbmRlcmluZyB0aGUgc2hhZG93IERPTSBhbmQgcmUtaHlkcmF0aW5nIGV2ZW50cy5cbiAqXG4gKiB2MC4yNC4xOiBNaWdyYXRlZCBmcm9tIGh0bWxgYCB0ZW1wbGF0ZSB0byBKU1ggKEFEUi0wMDU3KS5cbiAqXG4gKiBAY3NzcGFydCBkb3Qtc3RhdGljICAtIFRoZSBzdGF0aWMgc3RhdHVzIGRvdFxuICogQGNzc3BhcnQgZG90LWFuaW1hdGVkIC0gVGhlIGFuaW1hdGVkIHBpbmcgYnV0dG9uXG4gKi9cbmltcG9ydCB7IE9wZW5FbGVtZW50IH0gZnJvbSAnQG9wZW5lbGVtZW50L2VsZW1lbnQnO1xuaW1wb3J0IHsgU3R5bGVTaGVldCwgdHlwZSBTdHlsZVNoZWV0TGlrZSB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL3N0eWxlLXNoZWV0JztcbmV4cG9ydCBjb25zdCB0YWdOYW1lID0gJ29wZW4taGVyby1waW5nJztcblxuY29uc3Qgc3R5bGVzOiBTdHlsZVNoZWV0TGlrZSA9IG5ldyBTdHlsZVNoZWV0KCk7XG5zdHlsZXMucmVwbGFjZVN5bmMoYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBnYXA6IHZhcigtLXNpemUtMik7XG4gIH1cbiAgLnBpbmcge1xuICAgIHBhZGRpbmc6IHZhcigtLXNpemUtMSkgdmFyKC0tc2l6ZS01KTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtMSk7XG4gICAgYm9yZGVyOiB2YXIoLS1ib3JkZXItc2l6ZS0xKSBzb2xpZCB2YXIoLS1ncmF5LTUpO1xuICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgIGNvbG9yOiB2YXIoLS1ncmF5LTUpO1xuICAgIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLTAwKTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgbGV0dGVyLXNwYWNpbmc6IHZhcigtLWZvbnQtbGV0dGVyc3BhY2luZy01KTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIHRyYW5zaXRpb246IGFsbCB2YXIoLS1lYXNlLTIpIHZhcigtLWR1cmF0aW9uLTIpO1xuICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbiAgLnBpbmc6aG92ZXIge1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWdyYXktMik7XG4gICAgY29sb3I6IHZhcigtLXRleHQtcHJpbWFyeSk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ncmF5LTYpO1xuICB9XG4gIC5waW5nOmRpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAwLjM7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgfVxuICAuZG90IHtcbiAgICB3aWR0aDogN3B4O1xuICAgIGhlaWdodDogN3B4O1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1yb3VuZCk7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICB9XG4gIC5kb3QuaWRsZSB7IGJhY2tncm91bmQ6IHZhcigtLWdyYXktNik7IH1cbiAgLmRvdC5sb2FkaW5nIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ncmF5LTUpO1xuICAgIGFuaW1hdGlvbjogcHVsc2UgMC44cyBlYXNlLWluLW91dCBpbmZpbml0ZSBhbHRlcm5hdGU7XG4gIH1cbiAgLmRvdC5vayB7IGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MpOyB9XG4gIC5kb3QuZXJyIHsgYmFja2dyb3VuZDogdmFyKC0tZXJyb3IpOyB9XG4gIC5pbmZvIHtcbiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTtcbiAgICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS0wMCk7XG4gICAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbiAgLmluZm8gLm9rIHsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyB9XG4gIC5pbmZvIC5lcnIgeyBjb2xvcjogdmFyKC0tZXJyb3IpOyB9XG4gIEBrZXlmcmFtZXMgcHVsc2Uge1xuICAgIGZyb20geyBvcGFjaXR5OiAwLjQ7IH1cbiAgICB0byB7IG9wYWNpdHk6IDE7IH1cbiAgfVxuYCk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhlcm9QaW5nIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW3N0eWxlc107XG5cbiAgYXBpVXJsID0gJyc7XG4gIF9zdGF0ZTogJ2lkbGUnIHwgJ2xvYWRpbmcnIHwgJ29rJyB8ICdlcnInID0gJ2lkbGUnO1xuICBfbXNnID0gJyc7XG4gIHByaXZhdGUgX2Fib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICAgIC8vIERzZEVsZW1lbnQgaGFuZGxlcyBzaGFkb3cgcm9vdCBjcmVhdGlvbiArIGluaXRpYWwgcmVuZGVyLlxuICAgIC8vIEZldGNoIGFmdGVyIERPTSBpcyByZWFkeS5cbiAgICB0aGlzLl9mZXRjaCgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZGlzY29ubmVjdGVkQ2FsbGJhY2soKTogdm9pZCB7XG4gICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtcbiAgICB0aGlzLl9hYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gIH1cblxuICBfZmV0Y2ggPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdGhpcy5fYWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMuX2Fib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLl9zdGF0ZSA9ICdsb2FkaW5nJztcbiAgICB0aGlzLl9tc2cgPSAnJztcbiAgICB0aGlzLl9yZW5kZXJUb0RvbSgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSB0aGlzLmFwaVVybCB8fCAnaHR0cHM6Ly9kZW1vLm9wZW5lbGVtZW50Lm9yZy9hcGknO1xuICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IHRoaXMuX2Fib3J0Q29udHJvbGxlci5zaWduYWwgfSk7XG4gICAgICBpZiAoIXIub2spIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Iuc3RhdHVzfWApO1xuICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgdGhpcy5fc3RhdGUgPSAnb2snO1xuICAgICAgdGhpcy5fbXNnID0gYCR7ZC5mcmFtZXdvcmt9IHYke2QudmVyc2lvbn0gICR7ZC50aW1lc3RhbXAuc2xpY2UoMTEsIDE5KX1gO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICBjb25zdCBlcnIgPSBlIGFzIEVycm9yO1xuICAgICAgdGhpcy5fc3RhdGUgPSAnZXJyJztcbiAgICAgIHRoaXMuX21zZyA9IFN0cmluZyhlKS5pbmNsdWRlcygnSFRUUCcpID8gZXJyLm1lc3NhZ2UgOiAnY29ubmVjdGlvbiBmYWlsZWQnO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9yZW5kZXJUb0RvbSgpO1xuICAgIH1cbiAgfTtcblxuICBvdmVycmlkZSByZW5kZXIoKTogUmV0dXJuVHlwZTx0eXBlb2YgT3BlbkVsZW1lbnQucHJvdG90eXBlLnJlbmRlcj4ge1xuICAgIGNvbnN0IGRvdENsYXNzID0gYGRvdCAke3RoaXMuX3N0YXRlfWA7XG4gICAgY29uc3QgbG9hZGluZyA9IHRoaXMuX3N0YXRlID09PSAnbG9hZGluZyc7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT17ZG90Q2xhc3N9IHBhcnQ9J2RvdC1zdGF0aWMnPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9J2J1dHRvbidcbiAgICAgICAgICBjbGFzc05hbWU9J3BpbmcnXG4gICAgICAgICAgcGFydD0nZG90LWFuaW1hdGVkJ1xuICAgICAgICAgIGRpc2FibGVkPXtsb2FkaW5nfVxuICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuX2ZldGNofVxuICAgICAgICA+XG4gICAgICAgICAge2xvYWRpbmcgPyAncGluZ2luZy4uLicgOiAncGluZyBzZXJ2ZXInfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAge3RoaXMuX21zZyAmJiAoXG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdpbmZvJz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT17dGhpcy5fc3RhdGV9Pnt0aGlzLl9tc2d9PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgKX1cbiAgICAgIDwvPlxuICAgICk7XG4gIH1cblxuICAvKiogUmUtcmVuZGVyIHNoYWRvdyBET00gYW5kIHJlLWh5ZHJhdGUgY2xpY2sgZXZlbnRzLiAqL1xuICBwcml2YXRlIF9yZW5kZXJUb0RvbSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgcmV0dXJuO1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cbn1cblxuLy8gR3VhcmQ6IGlkZW1wb3RlbnQgYWNyb3NzIFNTUiBwYXRoc1xuaWYgKHR5cGVvZiBjdXN0b21FbGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcgJiYgIWN1c3RvbUVsZW1lbnRzLmdldCh0YWdOYW1lKSkge1xuICBjdXN0b21FbGVtZW50cy5kZWZpbmUodGFnTmFtZSwgSGVyb1BpbmcpO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVDQUF1QyxHQUN2Qzs7Ozs7Ozs7Ozs7Q0FXQyxHQUNELFNBQVMsV0FBVyxRQUFRLHVCQUF1QjtBQUNuRCxTQUFTLFVBQVUsUUFBNkIsZ0NBQWdDO0FBQ2hGLE9BQU8sTUFBTSxVQUFVLGlCQUFpQjtBQUV4QyxNQUFNLFNBQXlCLElBQUk7QUFDbkMsT0FBTyxXQUFXLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVEcEIsQ0FBQztBQUVELGVBQWUsTUFBTSxpQkFBaUI7RUFDcEMsT0FBZ0IsU0FBUztJQUFDO0dBQU8sQ0FBQztFQUVsQyxTQUFTLEdBQUc7RUFDWixTQUE0QyxPQUFPO0VBQ25ELE9BQU8sR0FBRztFQUNGLGlCQUFtQztFQUVsQyxvQkFBMEI7SUFDakMsS0FBSyxDQUFDO0lBQ04sNERBQTREO0lBQzVELDRCQUE0QjtJQUM1QixJQUFJLENBQUMsTUFBTTtFQUNiO0VBRVMsdUJBQTZCO0lBQ3BDLEtBQUssQ0FBQztJQUNOLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtFQUN6QjtFQUVBLFNBQVM7SUFDUCxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7SUFDdkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUk7SUFDNUIsSUFBSSxDQUFDLE1BQU0sR0FBRztJQUNkLElBQUksQ0FBQyxJQUFJLEdBQUc7SUFDWixJQUFJLENBQUMsWUFBWTtJQUNqQixJQUFJO01BQ0YsTUFBTSxNQUFNLElBQUksQ0FBQyxNQUFNLElBQUk7TUFDM0IsTUFBTSxJQUFJLE1BQU0sTUFBTSxLQUFLO1FBQUUsUUFBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTTtNQUFDO01BQ2xFLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRTtNQUM3QyxNQUFNLElBQUksTUFBTSxFQUFFLElBQUk7TUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRztNQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUs7SUFDMUUsRUFBRSxPQUFPLEdBQVk7TUFDbkIsSUFBSSxhQUFhLGdCQUFnQixFQUFFLElBQUksS0FBSyxjQUFjO01BQzFELE1BQU0sTUFBTTtNQUNaLElBQUksQ0FBQyxNQUFNLEdBQUc7TUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sR0FBRyxRQUFRLENBQUMsVUFBVSxJQUFJLE9BQU8sR0FBRztJQUN6RCxTQUFVO01BQ1IsSUFBSSxDQUFDLFlBQVk7SUFDbkI7RUFDRixFQUFFO0VBRU8sU0FBMEQ7SUFDakUsTUFBTSxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUU7SUFDckMsTUFBTSxVQUFVLElBQUksQ0FBQyxNQUFNLEtBQUs7SUFDaEMsU0FDSTtRQUNBLENBQUMsS0FBSyxXQUFXLFVBQVUsS0FBSyxlQUFlLEtBQUs7UUFDcEQsQ0FBQyxPQUNDLEtBQUssU0FDTCxVQUFVLE9BQ1YsS0FBSyxlQUNMLFVBQVUsU0FDVixTQUFTLElBQUksQ0FBQyxNQUFNLEVBQ3JCO1VBQ0MsQ0FBQyxVQUFVLGVBQWUsY0FBYztRQUMxQyxFQUFFLE9BQU87UUFDVCxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQ1AsS0FBSyxVQUFVLE9BQU87WUFDckIsQ0FBQyxLQUFLLFdBQVcsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUs7VUFDbEQsRUFBRSxNQUNGO01BQ0o7RUFFSjtFQUVBLHNEQUFzRCxHQUN0RCxBQUFRLGVBQXFCO0lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO0lBQ3RCLElBQUksQ0FBQyxNQUFNO0VBQ2I7QUFDRjtBQUVBLHFDQUFxQztBQUNyQyxJQUFJLE9BQU8sbUJBQW1CLGVBQWUsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxVQUFVO0VBQ3pFLGVBQWUsTUFBTSxDQUFDLFNBQVM7QUFDakMifQ==
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** @jsxImportSource @openelement/core */ /**
|
|
2
|
+
* @openelement/ui - open-input
|
|
3
|
+
*
|
|
4
|
+
* Minimal input field following Swiss International Style.
|
|
5
|
+
* Clean borders, subtle focus states.
|
|
6
|
+
*
|
|
7
|
+
* v0.20.0: Migrated from DsdLitElement to DsdElement (Ocean component).
|
|
8
|
+
* v0.24.1: Migrated from html`` template to JSX (ADR-0057).
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - Form-associated: participates in native <form> submission
|
|
12
|
+
* - Supports label, placeholder, error, disabled, required
|
|
13
|
+
* - Dispatches 'open-input' custom event on value change
|
|
14
|
+
*
|
|
15
|
+
* @csspart wrapper -The outer input-wrapper div
|
|
16
|
+
* @csspart label -The label element
|
|
17
|
+
* @csspart control -The input/textarea/select element
|
|
18
|
+
* @csspart error -The error message small element
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
* ```html
|
|
22
|
+
* <open-input placeholder="Enter text"></open-input>
|
|
23
|
+
* <open-input type="email" label="Email"></open-input>
|
|
24
|
+
* <form onsubmit="console.info(new FormData(this))">
|
|
25
|
+
* <open-input name="username" label="Username"></open-input>
|
|
26
|
+
* <button type="submit">Submit</button>
|
|
27
|
+
* </form>
|
|
28
|
+
* ```
|
|
29
|
+
*/ import { OpenElement } from '@openelement/element';
|
|
30
|
+
import { type StyleSheetLike } from '@openelement/core/style-sheet';
|
|
31
|
+
export declare const tagName: 'open-input';
|
|
32
|
+
declare const sheet: StyleSheetLike;
|
|
33
|
+
export declare class OpenInput extends OpenElement {
|
|
34
|
+
static override styles: [];
|
|
35
|
+
static formAssociated: boolean;
|
|
36
|
+
static delegatesFocus: boolean;
|
|
37
|
+
static override observedAttributes: [string, string, string, string, string, string, string, string];
|
|
38
|
+
override render(): ReturnType<typeof OpenElement.prototype.render>;
|
|
39
|
+
override attributeChangedCallback(name: string, old: string | null, val: string | null): void;
|
|
40
|
+
private _syncDOM: any;
|
|
41
|
+
private _updateStates: any;
|
|
42
|
+
private _handleInput: any;
|
|
43
|
+
private _handleChange: any;
|
|
44
|
+
private _handleFocus: any;
|
|
45
|
+
private _handleBlur: any;
|
|
46
|
+
formResetCallback(): void;
|
|
47
|
+
formDisabledCallback(disabled: boolean): void;
|
|
48
|
+
private _esc: any;
|
|
49
|
+
private _escAttr: any;
|
|
50
|
+
}
|
|
51
|
+
export default OpenInput;
|