@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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +78 -0
  3. package/package.json +142 -0
  4. package/src/daisy-classes.d.ts +7 -0
  5. package/src/daisy-classes.js +770 -0
  6. package/src/index.d.ts +57 -0
  7. package/src/index.js +62 -0
  8. package/src/manifest.d.ts +8 -0
  9. package/src/manifest.js +255 -0
  10. package/src/open-badge.d.ts +15 -0
  11. package/src/open-badge.js +88 -0
  12. package/src/open-brand-mark.d.ts +14 -0
  13. package/src/open-brand-mark.js +107 -0
  14. package/src/open-button.d.ts +38 -0
  15. package/src/open-button.js +219 -0
  16. package/src/open-callout.d.ts +26 -0
  17. package/src/open-callout.js +99 -0
  18. package/src/open-card.d.ts +33 -0
  19. package/src/open-card.js +107 -0
  20. package/src/open-code-block.d.ts +44 -0
  21. package/src/open-code-block.js +267 -0
  22. package/src/open-dialog.d.ts +47 -0
  23. package/src/open-dialog.js +235 -0
  24. package/src/open-dropdown.d.ts +25 -0
  25. package/src/open-dropdown.js +45 -0
  26. package/src/open-hero-ping.d.ts +27 -0
  27. package/src/open-hero-ping.js +136 -0
  28. package/src/open-input.d.ts +51 -0
  29. package/src/open-input.js +233 -0
  30. package/src/open-lab-panel.d.ts +16 -0
  31. package/src/open-lab-panel.js +151 -0
  32. package/src/open-lab-stage.d.ts +15 -0
  33. package/src/open-lab-stage.js +622 -0
  34. package/src/open-layout.d.ts +111 -0
  35. package/src/open-layout.js +1377 -0
  36. package/src/open-modal.d.ts +25 -0
  37. package/src/open-modal.js +48 -0
  38. package/src/open-props-tokens.d.ts +7 -0
  39. package/src/open-props-tokens.js +474 -0
  40. package/src/open-standards-visual.d.ts +20 -0
  41. package/src/open-standards-visual.js +425 -0
  42. package/src/open-step-card.d.ts +34 -0
  43. package/src/open-step-card.js +117 -0
  44. package/src/open-tabs.d.ts +27 -0
  45. package/src/open-tabs.js +56 -0
  46. package/src/open-theme-toggle.d.ts +38 -0
  47. 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
+ &times;
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;