@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,107 @@
1
+ /** @jsxImportSource @openelement/core */ /**
2
+ * @openelement/ui - open-card
3
+ *
4
+ * Minimal card container with optional header and footer.
5
+ * Swiss International Style: borders are whispers, not shouts.
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 container - The article wrapper
11
+ * @csspart body - The card body content area
12
+ *
13
+ * Usage:
14
+ * ```html
15
+ * <open-card>
16
+ * <h3 slot="header">Card Title</h3>
17
+ * <p>Card content goes here.</p>
18
+ * </open-card>
19
+ *
20
+ * <open-card variant="elevated">
21
+ * <p>Elevated card with shadow.</p>
22
+ * </open-card>
23
+ * ```
24
+ */ import { OpenElement } from '@openelement/element';
25
+ import { StyleSheet } from '@openelement/core/style-sheet';
26
+ export const tagName = 'open-card';
27
+ const sheet = new StyleSheet();
28
+ sheet.replaceSync(`
29
+ :host {
30
+ display: block;
31
+ background:
32
+ linear-gradient(135deg, color-mix(in srgb, var(--violet-1) 14%, transparent), transparent 48%),
33
+ var(--bg-card);
34
+ color: var(--text-primary);
35
+ border: var(--border-size-1) solid var(--border);
36
+ border-radius: var(--card-radius);
37
+ overflow: hidden;
38
+ transition: border-color var(--ease-3) var(--duration-2), background var(--ease-3) var(--duration-2), box-shadow var(--ease-3) var(--duration-2);
39
+ }
40
+
41
+ :host([variant="elevated"]) {
42
+ box-shadow: 0 var(--size-2) var(--size-8) color-mix(in srgb, var(--brand) 8%, transparent);
43
+ border-color: var(--border);
44
+ }
45
+
46
+ :host([variant="elevated"]:hover) {
47
+ border-color: var(--brand);
48
+ }
49
+
50
+ :host([variant="borderless"]) {
51
+ border-color: transparent;
52
+ }
53
+
54
+ :host([variant="muted"]) {
55
+ background: var(--bg-surface);
56
+ }
57
+
58
+ :host([variant="artifact"]) {
59
+ background: var(--bg-code, var(--gray-11));
60
+ color: var(--gray-2);
61
+ border-color: var(--code-border, var(--gray-8));
62
+ }
63
+
64
+ ::slotted([slot="header"]) {
65
+ padding: var(--size-4) var(--size-5);
66
+ border-bottom: var(--border-size-1) solid var(--border);
67
+ font-size: var(--font-size-2);
68
+ font-weight: var(--font-weight-6);
69
+ color: var(--text-primary);
70
+ margin: 0;
71
+ }
72
+
73
+ .card-body {
74
+ padding: var(--size-5);
75
+ }
76
+
77
+ ::slotted([slot="footer"]) {
78
+ padding: var(--size-3) var(--size-5);
79
+ border-top: var(--border-size-1) solid var(--border);
80
+ font-size: var(--font-size-0);
81
+ color: var(--text-muted);
82
+ margin: 0;
83
+ }
84
+ `);
85
+ export class OpenCard extends OpenElement {
86
+ static styles = [
87
+ sheet
88
+ ];
89
+ static observedAttributes = [
90
+ 'variant'
91
+ ];
92
+ render() {
93
+ return <article part='container'>
94
+ <slot name='header'></slot>
95
+ <div className='card-body' part='body'>
96
+ <slot></slot>
97
+ </div>
98
+ <slot name='footer'></slot>
99
+ </article>;
100
+ }
101
+ }
102
+ export default OpenCard;
103
+ // Guard: idempotent across SSR paths
104
+ if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {
105
+ customElements.define(tagName, OpenCard);
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy91aS9zcmMvb3Blbi1jYXJkLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGpzeEltcG9ydFNvdXJjZSBAb3BlbmVsZW1lbnQvY29yZSAqL1xuLyoqXG4gKiBAb3BlbmVsZW1lbnQvdWkgLSBvcGVuLWNhcmRcbiAqXG4gKiBNaW5pbWFsIGNhcmQgY29udGFpbmVyIHdpdGggb3B0aW9uYWwgaGVhZGVyIGFuZCBmb290ZXIuXG4gKiBTd2lzcyBJbnRlcm5hdGlvbmFsIFN0eWxlOiBib3JkZXJzIGFyZSB3aGlzcGVycywgbm90IHNob3V0cy5cbiAqXG4gKiB2MC4yMC4wOiBNaWdyYXRlZCBmcm9tIERzZExpdEVsZW1lbnQgdG8gRHNkRWxlbWVudCAoT2NlYW4gY29tcG9uZW50KS5cbiAqIHYwLjI0LjE6IE1pZ3JhdGVkIGZyb20gaHRtbGBgIHRlbXBsYXRlIHRvIEpTWCAoQURSLTAwNTcpLlxuICpcbiAqIEBjc3NwYXJ0IGNvbnRhaW5lciAtIFRoZSBhcnRpY2xlIHdyYXBwZXJcbiAqIEBjc3NwYXJ0IGJvZHkgLSBUaGUgY2FyZCBib2R5IGNvbnRlbnQgYXJlYVxuICpcbiAqIFVzYWdlOlxuICogYGBgaHRtbFxuICogPG9wZW4tY2FyZD5cbiAqICAgPGgzIHNsb3Q9XCJoZWFkZXJcIj5DYXJkIFRpdGxlPC9oMz5cbiAqICAgPHA+Q2FyZCBjb250ZW50IGdvZXMgaGVyZS48L3A+XG4gKiA8L29wZW4tY2FyZD5cbiAqXG4gKiA8b3Blbi1jYXJkIHZhcmlhbnQ9XCJlbGV2YXRlZFwiPlxuICogICA8cD5FbGV2YXRlZCBjYXJkIHdpdGggc2hhZG93LjwvcD5cbiAqIDwvb3Blbi1jYXJkPlxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgT3BlbkVsZW1lbnQgfSBmcm9tICdAb3BlbmVsZW1lbnQvZWxlbWVudCc7XG5pbXBvcnQgeyBTdHlsZVNoZWV0LCB0eXBlIFN0eWxlU2hlZXRMaWtlIH0gZnJvbSAnQG9wZW5lbGVtZW50L2NvcmUvc3R5bGUtc2hlZXQnO1xuZXhwb3J0IGNvbnN0IHRhZ05hbWUgPSAnb3Blbi1jYXJkJztcblxuY29uc3Qgc2hlZXQ6IFN0eWxlU2hlZXRMaWtlID0gbmV3IFN0eWxlU2hlZXQoKTtcbnNoZWV0LnJlcGxhY2VTeW5jKGBcbiAgOmhvc3Qge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJhY2tncm91bmQ6XG4gICAgICBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tdmlvbGV0LTEpIDE0JSwgdHJhbnNwYXJlbnQpLCB0cmFuc3BhcmVudCA0OCUpLFxuICAgICAgdmFyKC0tYmctY2FyZCk7XG4gICAgY29sb3I6IHZhcigtLXRleHQtcHJpbWFyeSk7XG4gICAgYm9yZGVyOiB2YXIoLS1ib3JkZXItc2l6ZS0xKSBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWNhcmQtcmFkaXVzKTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS1lYXNlLTMpIHZhcigtLWR1cmF0aW9uLTIpLCBiYWNrZ3JvdW5kIHZhcigtLWVhc2UtMykgdmFyKC0tZHVyYXRpb24tMiksIGJveC1zaGFkb3cgdmFyKC0tZWFzZS0zKSB2YXIoLS1kdXJhdGlvbi0yKTtcbiAgfVxuXG4gIDpob3N0KFt2YXJpYW50PVwiZWxldmF0ZWRcIl0pIHtcbiAgICBib3gtc2hhZG93OiAwIHZhcigtLXNpemUtMikgdmFyKC0tc2l6ZS04KSBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYnJhbmQpIDglLCB0cmFuc3BhcmVudCk7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ib3JkZXIpO1xuICB9XG5cbiAgOmhvc3QoW3ZhcmlhbnQ9XCJlbGV2YXRlZFwiXTpob3Zlcikge1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYnJhbmQpO1xuICB9XG5cbiAgOmhvc3QoW3ZhcmlhbnQ9XCJib3JkZXJsZXNzXCJdKSB7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuXG4gIDpob3N0KFt2YXJpYW50PVwibXV0ZWRcIl0pIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1zdXJmYWNlKTtcbiAgfVxuXG4gIDpob3N0KFt2YXJpYW50PVwiYXJ0aWZhY3RcIl0pIHtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1jb2RlLCB2YXIoLS1ncmF5LTExKSk7XG4gICAgY29sb3I6IHZhcigtLWdyYXktMik7XG4gICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2RlLWJvcmRlciwgdmFyKC0tZ3JheS04KSk7XG4gIH1cblxuICA6OnNsb3R0ZWQoW3Nsb3Q9XCJoZWFkZXJcIl0pIHtcbiAgICBwYWRkaW5nOiB2YXIoLS1zaXplLTQpIHZhcigtLXNpemUtNSk7XG4gICAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyLXNpemUtMSkgc29saWQgdmFyKC0tYm9yZGVyKTtcbiAgICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS0yKTtcbiAgICBmb250LXdlaWdodDogdmFyKC0tZm9udC13ZWlnaHQtNik7XG4gICAgY29sb3I6IHZhcigtLXRleHQtcHJpbWFyeSk7XG4gICAgbWFyZ2luOiAwO1xuICB9XG5cbiAgLmNhcmQtYm9keSB7XG4gICAgcGFkZGluZzogdmFyKC0tc2l6ZS01KTtcbiAgfVxuXG4gIDo6c2xvdHRlZChbc2xvdD1cImZvb3RlclwiXSkge1xuICAgIHBhZGRpbmc6IHZhcigtLXNpemUtMykgdmFyKC0tc2l6ZS01KTtcbiAgICBib3JkZXItdG9wOiB2YXIoLS1ib3JkZXItc2l6ZS0xKSBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICAgIGZvbnQtc2l6ZTogdmFyKC0tZm9udC1zaXplLTApO1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0LW11dGVkKTtcbiAgICBtYXJnaW46IDA7XG4gIH1cbmApO1xuXG5leHBvcnQgY2xhc3MgT3BlbkNhcmQgZXh0ZW5kcyBPcGVuRWxlbWVudCB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbc2hlZXRdO1xuICBzdGF0aWMgb3ZlcnJpZGUgb2JzZXJ2ZWRBdHRyaWJ1dGVzID0gWyd2YXJpYW50J107XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCk6IFJldHVyblR5cGU8dHlwZW9mIE9wZW5FbGVtZW50LnByb3RvdHlwZS5yZW5kZXI+IHtcbiAgICByZXR1cm4gKFxuICAgICAgPGFydGljbGUgcGFydD0nY29udGFpbmVyJz5cbiAgICAgICAgPHNsb3QgbmFtZT0naGVhZGVyJz48L3Nsb3Q+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjYXJkLWJvZHknIHBhcnQ9J2JvZHknPlxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzbG90IG5hbWU9J2Zvb3Rlcic+PC9zbG90PlxuICAgICAgPC9hcnRpY2xlPlxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgT3BlbkNhcmQ7XG5cbi8vIEd1YXJkOiBpZGVtcG90ZW50IGFjcm9zcyBTU1IgcGF0aHNcbmlmICh0eXBlb2YgY3VzdG9tRWxlbWVudHMgIT09ICd1bmRlZmluZWQnICYmICFjdXN0b21FbGVtZW50cy5nZXQodGFnTmFtZSkpIHtcbiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKHRhZ05hbWUsIE9wZW5DYXJkKTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1Q0FBdUMsR0FDdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBdUJDLEdBRUQsU0FBUyxXQUFXLFFBQVEsdUJBQXVCO0FBQ25ELFNBQVMsVUFBVSxRQUE2QixnQ0FBZ0M7QUFDaEYsT0FBTyxNQUFNLFVBQVUsWUFBWTtBQUVuQyxNQUFNLFFBQXdCLElBQUk7QUFDbEMsTUFBTSxXQUFXLENBQUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3RG5CLENBQUM7QUFFRCxPQUFPLE1BQU0saUJBQWlCO0VBQzVCLE9BQWdCLFNBQVM7SUFBQztHQUFNLENBQUM7RUFDakMsT0FBZ0IscUJBQXFCO0lBQUM7R0FBVSxDQUFDO0VBRXhDLFNBQTBEO0lBQ2pFLFFBQ0csUUFBUSxLQUFLLFlBQVk7UUFDeEIsQ0FBQyxLQUFLLEtBQUssV0FBVyxLQUFLO1FBQzNCLENBQUMsSUFBSSxVQUFVLFlBQVksS0FBSyxPQUFPO1VBQ3JDLENBQUMsT0FBTyxLQUFLO1FBQ2YsRUFBRSxJQUFJO1FBQ04sQ0FBQyxLQUFLLEtBQUssV0FBVyxLQUFLO01BQzdCLEVBQUU7RUFFTjtBQUNGO0FBRUEsZUFBZSxTQUFTO0FBRXhCLHFDQUFxQztBQUNyQyxJQUFJLE9BQU8sbUJBQW1CLGVBQWUsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxVQUFVO0VBQ3pFLGVBQWUsTUFBTSxDQUFDLFNBQVM7QUFDakMifQ==
@@ -0,0 +1,44 @@
1
+ /** @jsxImportSource @openelement/core */ /**
2
+ * @openelement/ui - open-code-block
3
+ *
4
+ * Code block with copy button AND syntax highlighting via Prism.
5
+ *
6
+ * v0.20.0: Migrated from DsdLitElement to DsdElement (Ocean component).
7
+ * - Self-contained Prism highlighting injected into shadow root
8
+ * - Copy button uses ElementInternals :state(copied) for CSS feedback
9
+ * - DSD renders <slot> for SSR (no JS content fallback)
10
+ * v0.24.1: Migrated from html`` template to JSX (ADR-0057).
11
+ *
12
+ * @csspart copy - The copy button
13
+ *
14
+ * Usage:
15
+ * ```html
16
+ * <open-code-block>
17
+ * <pre><code>const x = 1;</code></pre>
18
+ * </open-code-block>
19
+ * ```
20
+ */ import { OpenElement } from '@openelement/element';
21
+ import { type StyleSheetLike } from '@openelement/core/style-sheet';
22
+ export declare const tagName: 'open-code-block';
23
+ declare const sheet: StyleSheetLike;
24
+ export declare class OpenCodeBlock extends OpenElement {
25
+ static override styles: [];
26
+ private _copyState: any;
27
+ private _copyTimer: any;
28
+ private _highlightTimer: any;
29
+ private _highlightedInShadow: any;
30
+ private _highlightRetries: any;
31
+ private static MAX_HIGHLIGHT_RETRIES: any;
32
+ override render(): ReturnType<typeof OpenElement.prototype.render>;
33
+ override connectedCallback(): void;
34
+ override onDsdHydrated(): void;
35
+ override onCsrRendered(): void;
36
+ override disconnectedCallback(): void;
37
+ private _prismGlobal: any;
38
+ private _tryHighlight: any;
39
+ private _injectHighlighted: any;
40
+ private _getCodeText: any;
41
+ private _copy: any;
42
+ private _updateCopyButtonDOM: any;
43
+ }
44
+ export default OpenCodeBlock;
@@ -0,0 +1,267 @@
1
+ /** @jsxImportSource @openelement/core */ /**
2
+ * @openelement/ui - open-code-block
3
+ *
4
+ * Code block with copy button AND syntax highlighting via Prism.
5
+ *
6
+ * v0.20.0: Migrated from DsdLitElement to DsdElement (Ocean component).
7
+ * - Self-contained Prism highlighting injected into shadow root
8
+ * - Copy button uses ElementInternals :state(copied) for CSS feedback
9
+ * - DSD renders <slot> for SSR (no JS content fallback)
10
+ * v0.24.1: Migrated from html`` template to JSX (ADR-0057).
11
+ *
12
+ * @csspart copy - The copy button
13
+ *
14
+ * Usage:
15
+ * ```html
16
+ * <open-code-block>
17
+ * <pre><code>const x = 1;</code></pre>
18
+ * </open-code-block>
19
+ * ```
20
+ */ import { OpenElement } from '@openelement/element';
21
+ import { StyleSheet } from '@openelement/core/style-sheet';
22
+ import { createLogger } from '@openelement/core/logger';
23
+ export const tagName = 'open-code-block';
24
+ const log = createLogger('ui');
25
+ const sheet = new StyleSheet();
26
+ sheet.replaceSync(`
27
+ :host {
28
+ display: block;
29
+ position: relative;
30
+ }
31
+
32
+ pre {
33
+ margin: 0;
34
+ padding: var(--size-5);
35
+ background: var(--bg-code);
36
+ border: var(--border-size-1) solid var(--code-border);
37
+ border-radius: var(--radius-3);
38
+ overflow-x: auto;
39
+ font-family: var(--font-mono);
40
+ font-size: var(--font-size-0);
41
+ line-height: var(--font-lineheight-4);
42
+ color: var(--text-secondary);
43
+ scrollbar-width: thin;
44
+ scrollbar-color: var(--brand-subtle) transparent;
45
+ white-space: pre-wrap;
46
+ word-break: break-word;
47
+ }
48
+
49
+ ::slotted(pre) {
50
+ margin: 0;
51
+ padding: var(--size-5);
52
+ background: var(--bg-code);
53
+ border: var(--border-size-1) solid var(--code-border);
54
+ border-radius: var(--radius-3);
55
+ overflow-x: auto;
56
+ font-family: var(--font-mono);
57
+ font-size: var(--font-size-0);
58
+ line-height: var(--font-lineheight-4);
59
+ color: var(--text-secondary);
60
+ scrollbar-width: thin;
61
+ scrollbar-color: var(--brand-subtle) transparent;
62
+ }
63
+
64
+ .lang-badge {
65
+ position: absolute;
66
+ top: var(--size-2);
67
+ left: var(--size-3);
68
+ font-size: var(--font-size-00);
69
+ font-weight: var(--font-weight-7);
70
+ text-transform: uppercase;
71
+ letter-spacing: var(--font-letterspacing-5);
72
+ color: var(--text-muted);
73
+ pointer-events: none;
74
+ }
75
+
76
+ .copy-btn {
77
+ position: absolute;
78
+ top: var(--size-2);
79
+ right: var(--size-2);
80
+ background: var(--brand-subtle);
81
+ color: var(--text-muted);
82
+ padding: var(--size-1) var(--size-3);
83
+ font-size: var(--font-size-00);
84
+ font-family: var(--font-sans);
85
+ font-weight: var(--font-weight-6);
86
+ border: 0.5px solid transparent;
87
+ cursor: pointer;
88
+ border-radius: var(--radius-1);
89
+ transition: all var(--ease-2) var(--duration-2);
90
+ z-index: 1;
91
+ letter-spacing: var(--font-letterspacing-4);
92
+ }
93
+
94
+ .copy-btn:hover {
95
+ color: var(--text-primary);
96
+ background: var(--brand-glow);
97
+ border-color: var(--brand);
98
+ }
99
+
100
+ :host(:state(copied)) .copy-btn {
101
+ color: #22c55e;
102
+ border-color: rgba(34,197,94,0.3);
103
+ background: rgba(34,197,94,0.08);
104
+ }
105
+
106
+ :host(:state(failed)) .copy-btn {
107
+ color: var(--error);
108
+ border-color: var(--error);
109
+ }
110
+
111
+ /* Prism token colors (dark theme) */
112
+ .token.cdata, .token.comment, .token.doctype, .token.prolog { color: #6a737d; }
113
+ .token.punctuation { color: #8b949e; }
114
+ .token.namespace { opacity: 0.7; }
115
+ .token.boolean, .token.constant, .token.deleted, .token.number, .token.property, .token.symbol, .token.tag { color: #79c0ff; }
116
+ .token.attr-name, .token.builtin, .token.char, .token.inserted, .token.selector, .token.string { color: #a5d6ff; }
117
+ .token.entity, .token.operator, .token.url, .language-css .token.string, .style .token.string { color: #d2a8ff; }
118
+ .token.atrule, .token.attr-value, .token.keyword { color: #ff7b72; }
119
+ .token.class-name, .token.function { color: #d2a8ff; }
120
+ .token.important, .token.regex, .token.variable { color: #ffa657; }
121
+ .token.bold, .token.important { font-weight: 700; }
122
+ .token.italic { font-style: italic; }
123
+ .token.entity { cursor: help; }
124
+ `);
125
+ export class OpenCodeBlock extends OpenElement {
126
+ static styles = [
127
+ sheet
128
+ ];
129
+ _copyState = 'idle';
130
+ _copyTimer;
131
+ _highlightTimer;
132
+ _highlightedInShadow = false;
133
+ _highlightRetries = 0;
134
+ static MAX_HIGHLIGHT_RETRIES = 120;
135
+ render() {
136
+ return <>
137
+ <slot></slot>
138
+ <button type='button' className='copy-btn' part='copy' onClick={()=>this._copy()}>
139
+ Copy
140
+ </button>
141
+ </>;
142
+ }
143
+ connectedCallback() {
144
+ super.connectedCallback();
145
+ }
146
+ onDsdHydrated() {
147
+ super.onDsdHydrated();
148
+ this._tryHighlight();
149
+ }
150
+ onCsrRendered() {
151
+ super.onCsrRendered();
152
+ this._tryHighlight();
153
+ }
154
+ disconnectedCallback() {
155
+ super.disconnectedCallback();
156
+ if (this._copyTimer !== undefined) {
157
+ clearTimeout(this._copyTimer);
158
+ this._copyTimer = undefined;
159
+ }
160
+ if (this._highlightTimer !== undefined) {
161
+ clearTimeout(this._highlightTimer);
162
+ this._highlightTimer = undefined;
163
+ }
164
+ }
165
+ _prismGlobal() {
166
+ return globalThis.Prism;
167
+ }
168
+ _tryHighlight() {
169
+ const p = this._prismGlobal();
170
+ if (typeof p === 'undefined') {
171
+ if (this._highlightRetries++ < OpenCodeBlock.MAX_HIGHLIGHT_RETRIES) {
172
+ // Exponential backoff: 10, 20, 40, 80, 160, 320, 500ms cap
173
+ const delay = Math.min(10 * Math.pow(2, Math.min(this._highlightRetries, 6)), 500);
174
+ this._highlightTimer = globalThis.setTimeout(()=>this._tryHighlight(), delay);
175
+ }
176
+ return;
177
+ }
178
+ const pre = this.querySelector(':scope > pre') || Array.from(this.children).find((c)=>c.tagName === 'PRE');
179
+ if (!pre) return;
180
+ const codeEl = pre.querySelector('code');
181
+ if (!codeEl) return;
182
+ let lang = 'typescript';
183
+ const classes = codeEl.classList;
184
+ for(let i = 0; i < classes.length; i++){
185
+ if (classes[i].startsWith('language-')) {
186
+ lang = classes[i].slice(9);
187
+ break;
188
+ }
189
+ }
190
+ const raw = codeEl.textContent || '';
191
+ const grammar = p.languages?.[lang];
192
+ if (!grammar) {
193
+ if (this._highlightRetries++ < OpenCodeBlock.MAX_HIGHLIGHT_RETRIES) {
194
+ const delay = Math.min(20 * Math.pow(2, Math.min(this._highlightRetries, 6)), 1000);
195
+ this._highlightTimer = globalThis.setTimeout(()=>this._tryHighlight(), delay);
196
+ }
197
+ return;
198
+ }
199
+ this._highlightRetries = 0;
200
+ const highlightedHtml = p.highlight(raw, grammar, lang);
201
+ this._injectHighlighted(highlightedHtml);
202
+ }
203
+ _injectHighlighted(html) {
204
+ if (!this.shadowRoot || this._highlightedInShadow) return;
205
+ this._highlightedInShadow = true;
206
+ const slot1 = this.shadowRoot.querySelector('slot');
207
+ if (!slot1) return;
208
+ const highlightedPre = document.createElement('pre');
209
+ const highlightedCode = document.createElement('code');
210
+ highlightedCode.className = 'language-typescript';
211
+ highlightedCode.innerHTML = html;
212
+ highlightedPre.appendChild(highlightedCode);
213
+ slot1.replaceWith(highlightedPre);
214
+ const lightPre = this.querySelector('pre');
215
+ if (lightPre) lightPre.style.display = 'none';
216
+ }
217
+ _getCodeText() {
218
+ if (this.shadowRoot) {
219
+ const shadowCode = this.shadowRoot.querySelector('pre code');
220
+ if (shadowCode) return shadowCode.textContent || '';
221
+ }
222
+ return this.textContent || '';
223
+ }
224
+ async _copy() {
225
+ try {
226
+ const text = this._getCodeText();
227
+ await navigator.clipboard.writeText(text);
228
+ this._copyState = 'copied';
229
+ this._internals?.states.add('copied');
230
+ this._internals?.states.delete('failed');
231
+ this._updateCopyButtonDOM();
232
+ this._copyTimer = globalThis.setTimeout(()=>{
233
+ this._copyState = 'idle';
234
+ this._internals?.states.delete('copied');
235
+ this._updateCopyButtonDOM();
236
+ this._copyTimer = undefined;
237
+ }, 2000);
238
+ } catch (e) {
239
+ log.warn('Clipboard write failed:', e);
240
+ this._internals?.states.add('failed');
241
+ this._internals?.states.delete('copied');
242
+ this._updateCopyButtonDOM();
243
+ this._copyTimer = globalThis.setTimeout(()=>{
244
+ this._copyState = 'idle';
245
+ this._internals?.states.delete('failed');
246
+ this._updateCopyButtonDOM();
247
+ this._copyTimer = undefined;
248
+ }, 2000);
249
+ }
250
+ }
251
+ _updateCopyButtonDOM() {
252
+ if (!this.shadowRoot) return;
253
+ const btn = this.shadowRoot.querySelector('button.copy-btn');
254
+ if (!btn) return;
255
+ btn.classList.toggle('copied', this._copyState === 'copied');
256
+ btn.classList.toggle('failed', this._copyState === 'failed');
257
+ if (this._copyState === 'copied') btn.textContent = 'Copied!';
258
+ else if (this._copyState === 'failed') btn.textContent = 'Failed';
259
+ else btn.textContent = 'Copy';
260
+ }
261
+ }
262
+ export default OpenCodeBlock;
263
+ // Guard: idempotent across SSR paths
264
+ if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {
265
+ customElements.define(tagName, OpenCodeBlock);
266
+ }
267
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy91aS9zcmMvb3Blbi1jb2RlLWJsb2NrLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGpzeEltcG9ydFNvdXJjZSBAb3BlbmVsZW1lbnQvY29yZSAqL1xuLyoqXG4gKiBAb3BlbmVsZW1lbnQvdWkgLSBvcGVuLWNvZGUtYmxvY2tcbiAqXG4gKiBDb2RlIGJsb2NrIHdpdGggY29weSBidXR0b24gQU5EIHN5bnRheCBoaWdobGlnaHRpbmcgdmlhIFByaXNtLlxuICpcbiAqIHYwLjIwLjA6IE1pZ3JhdGVkIGZyb20gRHNkTGl0RWxlbWVudCB0byBEc2RFbGVtZW50IChPY2VhbiBjb21wb25lbnQpLlxuICogICAtIFNlbGYtY29udGFpbmVkIFByaXNtIGhpZ2hsaWdodGluZyBpbmplY3RlZCBpbnRvIHNoYWRvdyByb290XG4gKiAgIC0gQ29weSBidXR0b24gdXNlcyBFbGVtZW50SW50ZXJuYWxzIDpzdGF0ZShjb3BpZWQpIGZvciBDU1MgZmVlZGJhY2tcbiAqICAgLSBEU0QgcmVuZGVycyA8c2xvdD4gZm9yIFNTUiAobm8gSlMgY29udGVudCBmYWxsYmFjaylcbiAqIHYwLjI0LjE6IE1pZ3JhdGVkIGZyb20gaHRtbGBgIHRlbXBsYXRlIHRvIEpTWCAoQURSLTAwNTcpLlxuICpcbiAqIEBjc3NwYXJ0IGNvcHkgLSBUaGUgY29weSBidXR0b25cbiAqXG4gKiBVc2FnZTpcbiAqIGBgYGh0bWxcbiAqIDxvcGVuLWNvZGUtYmxvY2s+XG4gKiAgIDxwcmU+PGNvZGU+Y29uc3QgeCA9IDE7PC9jb2RlPjwvcHJlPlxuICogPC9vcGVuLWNvZGUtYmxvY2s+XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBPcGVuRWxlbWVudCB9IGZyb20gJ0BvcGVuZWxlbWVudC9lbGVtZW50JztcbmltcG9ydCB7IFN0eWxlU2hlZXQsIHR5cGUgU3R5bGVTaGVldExpa2UgfSBmcm9tICdAb3BlbmVsZW1lbnQvY29yZS9zdHlsZS1zaGVldCc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICdAb3BlbmVsZW1lbnQvY29yZS9sb2dnZXInO1xuZXhwb3J0IGNvbnN0IHRhZ05hbWUgPSAnb3Blbi1jb2RlLWJsb2NrJztcblxuY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKCd1aScpO1xuXG5jb25zdCBzaGVldDogU3R5bGVTaGVldExpa2UgPSBuZXcgU3R5bGVTaGVldCgpO1xuc2hlZXQucmVwbGFjZVN5bmMoYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB9XG5cbiAgcHJlIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogdmFyKC0tc2l6ZS01KTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1jb2RlKTtcbiAgICBib3JkZXI6IHZhcigtLWJvcmRlci1zaXplLTEpIHNvbGlkIHZhcigtLWNvZGUtYm9yZGVyKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtMyk7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTtcbiAgICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS0wKTtcbiAgICBsaW5lLWhlaWdodDogdmFyKC0tZm9udC1saW5laGVpZ2h0LTQpO1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7XG4gICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuICAgIHNjcm9sbGJhci1jb2xvcjogdmFyKC0tYnJhbmQtc3VidGxlKSB0cmFuc3BhcmVudDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG4gICAgd29yZC1icmVhazogYnJlYWstd29yZDtcbiAgfVxuXG4gIDo6c2xvdHRlZChwcmUpIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogdmFyKC0tc2l6ZS01KTtcbiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1iZy1jb2RlKTtcbiAgICBib3JkZXI6IHZhcigtLWJvcmRlci1zaXplLTEpIHNvbGlkIHZhcigtLWNvZGUtYm9yZGVyKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtMyk7XG4gICAgb3ZlcmZsb3cteDogYXV0bztcbiAgICBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTtcbiAgICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS0wKTtcbiAgICBsaW5lLWhlaWdodDogdmFyKC0tZm9udC1saW5laGVpZ2h0LTQpO1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7XG4gICAgc2Nyb2xsYmFyLXdpZHRoOiB0aGluO1xuICAgIHNjcm9sbGJhci1jb2xvcjogdmFyKC0tYnJhbmQtc3VidGxlKSB0cmFuc3BhcmVudDtcbiAgfVxuXG4gIC5sYW5nLWJhZGdlIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiB2YXIoLS1zaXplLTIpO1xuICAgIGxlZnQ6IHZhcigtLXNpemUtMyk7XG4gICAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtMDApO1xuICAgIGZvbnQtd2VpZ2h0OiB2YXIoLS1mb250LXdlaWdodC03KTtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIGxldHRlci1zcGFjaW5nOiB2YXIoLS1mb250LWxldHRlcnNwYWNpbmctNSk7XG4gICAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICB9XG5cbiAgLmNvcHktYnRuIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiB2YXIoLS1zaXplLTIpO1xuICAgIHJpZ2h0OiB2YXIoLS1zaXplLTIpO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWJyYW5kLXN1YnRsZSk7XG4gICAgY29sb3I6IHZhcigtLXRleHQtbXV0ZWQpO1xuICAgIHBhZGRpbmc6IHZhcigtLXNpemUtMSkgdmFyKC0tc2l6ZS0zKTtcbiAgICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS0wMCk7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtc2Fucyk7XG4gICAgZm9udC13ZWlnaHQ6IHZhcigtLWZvbnQtd2VpZ2h0LTYpO1xuICAgIGJvcmRlcjogMC41cHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy0xKTtcbiAgICB0cmFuc2l0aW9uOiBhbGwgdmFyKC0tZWFzZS0yKSB2YXIoLS1kdXJhdGlvbi0yKTtcbiAgICB6LWluZGV4OiAxO1xuICAgIGxldHRlci1zcGFjaW5nOiB2YXIoLS1mb250LWxldHRlcnNwYWNpbmctNCk7XG4gIH1cblxuICAuY29weS1idG46aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS10ZXh0LXByaW1hcnkpO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWJyYW5kLWdsb3cpO1xuICAgIGJvcmRlci1jb2xvcjogdmFyKC0tYnJhbmQpO1xuICB9XG5cbiAgOmhvc3QoOnN0YXRlKGNvcGllZCkpIC5jb3B5LWJ0biB7XG4gICAgY29sb3I6ICMyMmM1NWU7XG4gICAgYm9yZGVyLWNvbG9yOiByZ2JhKDM0LDE5Nyw5NCwwLjMpO1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMzQsMTk3LDk0LDAuMDgpO1xuICB9XG5cbiAgOmhvc3QoOnN0YXRlKGZhaWxlZCkpIC5jb3B5LWJ0biB7XG4gICAgY29sb3I6IHZhcigtLWVycm9yKTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWVycm9yKTtcbiAgfVxuXG4gIC8qIFByaXNtIHRva2VuIGNvbG9ycyAoZGFyayB0aGVtZSkgKi9cbiAgLnRva2VuLmNkYXRhLCAudG9rZW4uY29tbWVudCwgLnRva2VuLmRvY3R5cGUsIC50b2tlbi5wcm9sb2cgeyBjb2xvcjogIzZhNzM3ZDsgfVxuICAudG9rZW4ucHVuY3R1YXRpb24geyBjb2xvcjogIzhiOTQ5ZTsgfVxuICAudG9rZW4ubmFtZXNwYWNlIHsgb3BhY2l0eTogMC43OyB9XG4gIC50b2tlbi5ib29sZWFuLCAudG9rZW4uY29uc3RhbnQsIC50b2tlbi5kZWxldGVkLCAudG9rZW4ubnVtYmVyLCAudG9rZW4ucHJvcGVydHksIC50b2tlbi5zeW1ib2wsIC50b2tlbi50YWcgeyBjb2xvcjogIzc5YzBmZjsgfVxuICAudG9rZW4uYXR0ci1uYW1lLCAudG9rZW4uYnVpbHRpbiwgLnRva2VuLmNoYXIsIC50b2tlbi5pbnNlcnRlZCwgLnRva2VuLnNlbGVjdG9yLCAudG9rZW4uc3RyaW5nIHsgY29sb3I6ICNhNWQ2ZmY7IH1cbiAgLnRva2VuLmVudGl0eSwgLnRva2VuLm9wZXJhdG9yLCAudG9rZW4udXJsLCAubGFuZ3VhZ2UtY3NzIC50b2tlbi5zdHJpbmcsIC5zdHlsZSAudG9rZW4uc3RyaW5nIHsgY29sb3I6ICNkMmE4ZmY7IH1cbiAgLnRva2VuLmF0cnVsZSwgLnRva2VuLmF0dHItdmFsdWUsIC50b2tlbi5rZXl3b3JkIHsgY29sb3I6ICNmZjdiNzI7IH1cbiAgLnRva2VuLmNsYXNzLW5hbWUsIC50b2tlbi5mdW5jdGlvbiB7IGNvbG9yOiAjZDJhOGZmOyB9XG4gIC50b2tlbi5pbXBvcnRhbnQsIC50b2tlbi5yZWdleCwgLnRva2VuLnZhcmlhYmxlIHsgY29sb3I6ICNmZmE2NTc7IH1cbiAgLnRva2VuLmJvbGQsIC50b2tlbi5pbXBvcnRhbnQgeyBmb250LXdlaWdodDogNzAwOyB9XG4gIC50b2tlbi5pdGFsaWMgeyBmb250LXN0eWxlOiBpdGFsaWM7IH1cbiAgLnRva2VuLmVudGl0eSB7IGN1cnNvcjogaGVscDsgfVxuYCk7XG5cbmV4cG9ydCBjbGFzcyBPcGVuQ29kZUJsb2NrIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW3NoZWV0XTtcblxuICBwcml2YXRlIF9jb3B5U3RhdGU6ICdpZGxlJyB8ICdjb3BpZWQnIHwgJ2ZhaWxlZCcgPSAnaWRsZSc7XG4gIHByaXZhdGUgX2NvcHlUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2hpZ2hsaWdodFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfaGlnaGxpZ2h0ZWRJblNoYWRvdyA9IGZhbHNlO1xuICBwcml2YXRlIF9oaWdobGlnaHRSZXRyaWVzID0gMDtcbiAgcHJpdmF0ZSBzdGF0aWMgTUFYX0hJR0hMSUdIVF9SRVRSSUVTID0gMTIwO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpOiBSZXR1cm5UeXBlPHR5cGVvZiBPcGVuRWxlbWVudC5wcm90b3R5cGUucmVuZGVyPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzTmFtZT0nY29weS1idG4nIHBhcnQ9J2NvcHknIG9uQ2xpY2s9eygpID0+IHRoaXMuX2NvcHkoKX0+XG4gICAgICAgICAgQ29weVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvPlxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBjb25uZWN0ZWRDYWxsYmFjaygpOiB2b2lkIHtcbiAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgb3ZlcnJpZGUgb25Ec2RIeWRyYXRlZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbkRzZEh5ZHJhdGVkKCk7XG4gICAgdGhpcy5fdHJ5SGlnaGxpZ2h0KCk7XG4gIH1cblxuICBvdmVycmlkZSBvbkNzclJlbmRlcmVkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9uQ3NyUmVuZGVyZWQoKTtcbiAgICB0aGlzLl90cnlIaWdobGlnaHQoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCk6IHZvaWQge1xuICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7XG4gICAgaWYgKHRoaXMuX2NvcHlUaW1lciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fY29weVRpbWVyKTtcbiAgICAgIHRoaXMuX2NvcHlUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2hpZ2hsaWdodFRpbWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9oaWdobGlnaHRUaW1lcik7XG4gICAgICB0aGlzLl9oaWdobGlnaHRUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wcmlzbUdsb2JhbCgpOiB1bmtub3duIHtcbiAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7IFByaXNtPzogdW5rbm93biB9KS5QcmlzbTtcbiAgfVxuXG4gIHByaXZhdGUgX3RyeUhpZ2hsaWdodCgpOiB2b2lkIHtcbiAgICBjb25zdCBwID0gdGhpcy5fcHJpc21HbG9iYWwoKTtcbiAgICBpZiAodHlwZW9mIHAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5faGlnaGxpZ2h0UmV0cmllcysrIDwgT3BlbkNvZGVCbG9jay5NQVhfSElHSExJR0hUX1JFVFJJRVMpIHtcbiAgICAgICAgLy8gRXhwb25lbnRpYWwgYmFja29mZjogMTAsIDIwLCA0MCwgODAsIDE2MCwgMzIwLCA1MDBtcyBjYXBcbiAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLm1pbigxMCAqIE1hdGgucG93KDIsIE1hdGgubWluKHRoaXMuX2hpZ2hsaWdodFJldHJpZXMsIDYpKSwgNTAwKTtcbiAgICAgICAgdGhpcy5faGlnaGxpZ2h0VGltZXIgPSBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4gdGhpcy5fdHJ5SGlnaGxpZ2h0KCksIGRlbGF5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJzpzY29wZSA+IHByZScpIHx8XG4gICAgICBBcnJheS5mcm9tKHRoaXMuY2hpbGRyZW4pLmZpbmQoKGMpID0+IGMudGFnTmFtZSA9PT0gJ1BSRScpO1xuICAgIGlmICghcHJlKSByZXR1cm47XG4gICAgY29uc3QgY29kZUVsID0gcHJlLnF1ZXJ5U2VsZWN0b3IoJ2NvZGUnKTtcbiAgICBpZiAoIWNvZGVFbCkgcmV0dXJuO1xuXG4gICAgbGV0IGxhbmcgPSAndHlwZXNjcmlwdCc7XG4gICAgY29uc3QgY2xhc3NlcyA9IGNvZGVFbC5jbGFzc0xpc3Q7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoY2xhc3Nlc1tpXS5zdGFydHNXaXRoKCdsYW5ndWFnZS0nKSkge1xuICAgICAgICBsYW5nID0gY2xhc3Nlc1tpXS5zbGljZSg5KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gY29kZUVsLnRleHRDb250ZW50IHx8ICcnO1xuICAgIGNvbnN0IGdyYW1tYXIgPSAocCBhcyBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pLmxhbmd1YWdlcz8uW2xhbmddIGFzXG4gICAgICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWdyYW1tYXIpIHtcbiAgICAgIGlmICh0aGlzLl9oaWdobGlnaHRSZXRyaWVzKysgPCBPcGVuQ29kZUJsb2NrLk1BWF9ISUdITElHSFRfUkVUUklFUykge1xuICAgICAgICBjb25zdCBkZWxheSA9IE1hdGgubWluKDIwICogTWF0aC5wb3coMiwgTWF0aC5taW4odGhpcy5faGlnaGxpZ2h0UmV0cmllcywgNikpLCAxMDAwKTtcbiAgICAgICAgdGhpcy5faGlnaGxpZ2h0VGltZXIgPSBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4gdGhpcy5fdHJ5SGlnaGxpZ2h0KCksIGRlbGF5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faGlnaGxpZ2h0UmV0cmllcyA9IDA7XG4gICAgY29uc3QgaGlnaGxpZ2h0ZWRIdG1sID1cbiAgICAgIChwIGFzIHsgaGlnaGxpZ2h0OiAoY29kZTogc3RyaW5nLCBncmFtbWFyOiB1bmtub3duLCBsYW5nOiBzdHJpbmcpID0+IHN0cmluZyB9KS5oaWdobGlnaHQoXG4gICAgICAgIHJhdyxcbiAgICAgICAgZ3JhbW1hcixcbiAgICAgICAgbGFuZyxcbiAgICAgICk7XG4gICAgdGhpcy5faW5qZWN0SGlnaGxpZ2h0ZWQoaGlnaGxpZ2h0ZWRIdG1sKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luamVjdEhpZ2hsaWdodGVkKGh0bWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaGFkb3dSb290IHx8IHRoaXMuX2hpZ2hsaWdodGVkSW5TaGFkb3cpIHJldHVybjtcbiAgICB0aGlzLl9oaWdobGlnaHRlZEluU2hhZG93ID0gdHJ1ZTtcblxuICAgIGNvbnN0IHNsb3QgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3Rvcignc2xvdCcpO1xuICAgIGlmICghc2xvdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaGlnaGxpZ2h0ZWRQcmUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICBjb25zdCBoaWdobGlnaHRlZENvZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjb2RlJyk7XG4gICAgaGlnaGxpZ2h0ZWRDb2RlLmNsYXNzTmFtZSA9ICdsYW5ndWFnZS10eXBlc2NyaXB0JztcbiAgICBoaWdobGlnaHRlZENvZGUuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBoaWdobGlnaHRlZFByZS5hcHBlbmRDaGlsZChoaWdobGlnaHRlZENvZGUpO1xuICAgIHNsb3QucmVwbGFjZVdpdGgoaGlnaGxpZ2h0ZWRQcmUpO1xuXG4gICAgY29uc3QgbGlnaHRQcmUgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3ByZScpO1xuICAgIGlmIChsaWdodFByZSkgKGxpZ2h0UHJlIGFzIEhUTUxFbGVtZW50KS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0Q29kZVRleHQoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5zaGFkb3dSb290KSB7XG4gICAgICBjb25zdCBzaGFkb3dDb2RlID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ3ByZSBjb2RlJyk7XG4gICAgICBpZiAoc2hhZG93Q29kZSkgcmV0dXJuIHNoYWRvd0NvZGUudGV4dENvbnRlbnQgfHwgJyc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRleHRDb250ZW50IHx8ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfY29weSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuX2dldENvZGVUZXh0KCk7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh0ZXh0KTtcbiAgICAgIHRoaXMuX2NvcHlTdGF0ZSA9ICdjb3BpZWQnO1xuICAgICAgdGhpcy5faW50ZXJuYWxzPy5zdGF0ZXMuYWRkKCdjb3BpZWQnKTtcbiAgICAgIHRoaXMuX2ludGVybmFscz8uc3RhdGVzLmRlbGV0ZSgnZmFpbGVkJyk7XG4gICAgICB0aGlzLl91cGRhdGVDb3B5QnV0dG9uRE9NKCk7XG4gICAgICB0aGlzLl9jb3B5VGltZXIgPSBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9jb3B5U3RhdGUgPSAnaWRsZSc7XG4gICAgICAgIHRoaXMuX2ludGVybmFscz8uc3RhdGVzLmRlbGV0ZSgnY29waWVkJyk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvcHlCdXR0b25ET00oKTtcbiAgICAgICAgdGhpcy5fY29weVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgfSwgMjAwMCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oJ0NsaXBib2FyZCB3cml0ZSBmYWlsZWQ6JywgZSk7XG4gICAgICB0aGlzLl9pbnRlcm5hbHM/LnN0YXRlcy5hZGQoJ2ZhaWxlZCcpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzPy5zdGF0ZXMuZGVsZXRlKCdjb3BpZWQnKTtcbiAgICAgIHRoaXMuX3VwZGF0ZUNvcHlCdXR0b25ET00oKTtcbiAgICAgIHRoaXMuX2NvcHlUaW1lciA9IGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2NvcHlTdGF0ZSA9ICdpZGxlJztcbiAgICAgICAgdGhpcy5faW50ZXJuYWxzPy5zdGF0ZXMuZGVsZXRlKCdmYWlsZWQnKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29weUJ1dHRvbkRPTSgpO1xuICAgICAgICB0aGlzLl9jb3B5VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9LCAyMDAwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVDb3B5QnV0dG9uRE9NKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zaGFkb3dSb290KSByZXR1cm47XG4gICAgY29uc3QgYnRuID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbi5jb3B5LWJ0bicpO1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2NvcGllZCcsIHRoaXMuX2NvcHlTdGF0ZSA9PT0gJ2NvcGllZCcpO1xuICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdmYWlsZWQnLCB0aGlzLl9jb3B5U3RhdGUgPT09ICdmYWlsZWQnKTtcbiAgICBpZiAodGhpcy5fY29weVN0YXRlID09PSAnY29waWVkJykgYnRuLnRleHRDb250ZW50ID0gJ0NvcGllZCEnO1xuICAgIGVsc2UgaWYgKHRoaXMuX2NvcHlTdGF0ZSA9PT0gJ2ZhaWxlZCcpIGJ0bi50ZXh0Q29udGVudCA9ICdGYWlsZWQnO1xuICAgIGVsc2UgYnRuLnRleHRDb250ZW50ID0gJ0NvcHknO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9wZW5Db2RlQmxvY2s7XG5cbi8vIEd1YXJkOiBpZGVtcG90ZW50IGFjcm9zcyBTU1IgcGF0aHNcbmlmICh0eXBlb2YgY3VzdG9tRWxlbWVudHMgIT09ICd1bmRlZmluZWQnICYmICFjdXN0b21FbGVtZW50cy5nZXQodGFnTmFtZSkpIHtcbiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKHRhZ05hbWUsIE9wZW5Db2RlQmxvY2spO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVDQUF1QyxHQUN2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW1CQyxHQUVELFNBQVMsV0FBVyxRQUFRLHVCQUF1QjtBQUNuRCxTQUFTLFVBQVUsUUFBNkIsZ0NBQWdDO0FBQ2hGLFNBQVMsWUFBWSxRQUFRLDJCQUEyQjtBQUN4RCxPQUFPLE1BQU0sVUFBVSxrQkFBa0I7QUFFekMsTUFBTSxNQUFNLGFBQWE7QUFFekIsTUFBTSxRQUF3QixJQUFJO0FBQ2xDLE1BQU0sV0FBVyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBa0duQixDQUFDO0FBRUQsT0FBTyxNQUFNLHNCQUFzQjtFQUNqQyxPQUFnQixTQUFTO0lBQUM7R0FBTSxDQUFDO0VBRXpCLGFBQTJDLE9BQU87RUFDbEQsV0FBc0Q7RUFDdEQsZ0JBQTJEO0VBQzNELHVCQUF1QixNQUFNO0VBQzdCLG9CQUFvQixFQUFFO0VBQzlCLE9BQWUsd0JBQXdCLElBQUk7RUFFbEMsU0FBMEQ7SUFDakUsU0FDSTtRQUNBLENBQUMsT0FBTyxLQUFLO1FBQ2IsQ0FBQyxPQUFPLEtBQUssU0FBUyxVQUFVLFdBQVcsS0FBSyxPQUFPLFNBQVMsSUFBTSxJQUFJLENBQUMsS0FBSyxJQUFJOztRQUVwRixFQUFFLE9BQU87TUFDWDtFQUVKO0VBRVMsb0JBQTBCO0lBQ2pDLEtBQUssQ0FBQztFQUNSO0VBRVMsZ0JBQXNCO0lBQzdCLEtBQUssQ0FBQztJQUNOLElBQUksQ0FBQyxhQUFhO0VBQ3BCO0VBRVMsZ0JBQXNCO0lBQzdCLEtBQUssQ0FB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
@@ -0,0 +1,47 @@
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 { type StyleSheetLike } from '@openelement/core/style-sheet';
25
+ export declare const tagName: 'open-dialog';
26
+ declare const sheet: StyleSheetLike;
27
+ export declare class OpenDialog extends OpenElement {
28
+ static override styles: [];
29
+ static delegatesFocus: boolean;
30
+ static override observedAttributes: [string, string];
31
+ private static _originalInertStates: any;
32
+ override render(): ReturnType<typeof OpenElement.prototype.render>;
33
+ override attributeChangedCallback(name: string, old: string | null, val: string | null): void;
34
+ private _updateStates: any;
35
+ show(): void;
36
+ close(): void;
37
+ toggle(): void;
38
+ private _syncDialogElement: any;
39
+ private _syncInert: any;
40
+ override disconnectedCallback(): void;
41
+ private _handleClose: any;
42
+ private _handleCancel: any;
43
+ private _handleTrigger: any;
44
+ private _esc: any;
45
+ private _escAttr: any;
46
+ }
47
+ export default OpenDialog;