@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-brand-mark
3
+ *
4
+ * Flat Aperture O brand mark shared by header, docs surfaces, and assets.
5
+ */ import { OpenElement } from '@openelement/element';
6
+ import { StyleSheet } from '@openelement/core/style-sheet';
7
+ export const tagName = 'open-brand-mark';
8
+ const sheet = new StyleSheet();
9
+ sheet.replaceSync(`
10
+ :host {
11
+ --mark-size: var(--size-10);
12
+ display: inline-grid;
13
+ width: var(--mark-size);
14
+ height: var(--mark-size);
15
+ flex: 0 0 auto;
16
+ vertical-align: middle;
17
+ }
18
+
19
+ :host([size="sm"]) { --mark-size: var(--size-8); }
20
+ :host([size="lg"]) { --mark-size: var(--size-12); }
21
+ :host([size="xl"]) { --mark-size: var(--size-16); }
22
+
23
+ .mark {
24
+ position: relative;
25
+ display: grid;
26
+ place-items: center;
27
+ width: 100%;
28
+ height: 100%;
29
+ overflow: hidden;
30
+ border-radius: var(--radius-round);
31
+ background:
32
+ radial-gradient(circle at 50% 50%, var(--brand-mark-field, var(--bg-base)) 0 38%, transparent 39%),
33
+ conic-gradient(
34
+ from 218deg,
35
+ var(--brand-deep) 0 24%,
36
+ var(--brand) 24% 61%,
37
+ var(--brand-light) 61% 82%,
38
+ var(--brand-deep) 82% 100%
39
+ );
40
+ }
41
+
42
+ :host([tone="inverted"]) .mark {
43
+ --brand-mark-field: var(--gray-12);
44
+ }
45
+
46
+ .mark::before {
47
+ content: "";
48
+ position: absolute;
49
+ inset: 27%;
50
+ border: var(--border-size-1) solid color-mix(in srgb, var(--brand-light) 58%, var(--brand-mark-field, var(--bg-base)));
51
+ border-radius: var(--radius-round);
52
+ transform: rotate(-13deg);
53
+ }
54
+
55
+ .mark::after {
56
+ content: "";
57
+ position: absolute;
58
+ inset-inline-end: -2%;
59
+ inset-block-start: 7%;
60
+ width: 35%;
61
+ height: 44%;
62
+ border-radius: var(--radius-round) var(--radius-round) 0 0;
63
+ background: var(--brand-mark-field, var(--bg-base));
64
+ transform: rotate(24deg);
65
+ }
66
+
67
+ .boundary,
68
+ .route {
69
+ position: absolute;
70
+ inset-inline: 28% 22%;
71
+ height: var(--border-size-1);
72
+ border-radius: var(--radius-round);
73
+ background: var(--brand-deep);
74
+ z-index: 1;
75
+ }
76
+
77
+ .boundary { inset-block-start: 46%; }
78
+ .route {
79
+ inset-block-start: 57%;
80
+ background: var(--brand);
81
+ }
82
+
83
+ :host([size="sm"]) .boundary,
84
+ :host([size="sm"]) .route {
85
+ inset-inline: 30% 24%;
86
+ }
87
+ `);
88
+ export class OpenBrandMark extends OpenElement {
89
+ static styles = [
90
+ sheet
91
+ ];
92
+ static observedAttributes = [
93
+ 'size',
94
+ 'tone'
95
+ ];
96
+ render() {
97
+ return <span className='mark' part='mark' aria-hidden='true'>
98
+ <span className='boundary'></span>
99
+ <span className='route'></span>
100
+ </span>;
101
+ }
102
+ }
103
+ export default OpenBrandMark;
104
+ if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {
105
+ customElements.define(tagName, OpenBrandMark);
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy91aS9zcmMvb3Blbi1icmFuZC1tYXJrLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGpzeEltcG9ydFNvdXJjZSBAb3BlbmVsZW1lbnQvY29yZSAqL1xuLyoqXG4gKiBAb3BlbmVsZW1lbnQvdWkgLSBvcGVuLWJyYW5kLW1hcmtcbiAqXG4gKiBGbGF0IEFwZXJ0dXJlIE8gYnJhbmQgbWFyayBzaGFyZWQgYnkgaGVhZGVyLCBkb2NzIHN1cmZhY2VzLCBhbmQgYXNzZXRzLlxuICovXG5cbmltcG9ydCB7IE9wZW5FbGVtZW50IH0gZnJvbSAnQG9wZW5lbGVtZW50L2VsZW1lbnQnO1xuaW1wb3J0IHsgU3R5bGVTaGVldCwgdHlwZSBTdHlsZVNoZWV0TGlrZSB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlL3N0eWxlLXNoZWV0JztcblxuZXhwb3J0IGNvbnN0IHRhZ05hbWUgPSAnb3Blbi1icmFuZC1tYXJrJztcblxuY29uc3Qgc2hlZXQ6IFN0eWxlU2hlZXRMaWtlID0gbmV3IFN0eWxlU2hlZXQoKTtcbnNoZWV0LnJlcGxhY2VTeW5jKGBcbiAgOmhvc3Qge1xuICAgIC0tbWFyay1zaXplOiB2YXIoLS1zaXplLTEwKTtcbiAgICBkaXNwbGF5OiBpbmxpbmUtZ3JpZDtcbiAgICB3aWR0aDogdmFyKC0tbWFyay1zaXplKTtcbiAgICBoZWlnaHQ6IHZhcigtLW1hcmstc2l6ZSk7XG4gICAgZmxleDogMCAwIGF1dG87XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgfVxuXG4gIDpob3N0KFtzaXplPVwic21cIl0pIHsgLS1tYXJrLXNpemU6IHZhcigtLXNpemUtOCk7IH1cbiAgOmhvc3QoW3NpemU9XCJsZ1wiXSkgeyAtLW1hcmstc2l6ZTogdmFyKC0tc2l6ZS0xMik7IH1cbiAgOmhvc3QoW3NpemU9XCJ4bFwiXSkgeyAtLW1hcmstc2l6ZTogdmFyKC0tc2l6ZS0xNik7IH1cblxuICAubWFyayB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgcGxhY2UtaXRlbXM6IGNlbnRlcjtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtcm91bmQpO1xuICAgIGJhY2tncm91bmQ6XG4gICAgICByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IDUwJSA1MCUsIHZhcigtLWJyYW5kLW1hcmstZmllbGQsIHZhcigtLWJnLWJhc2UpKSAwIDM4JSwgdHJhbnNwYXJlbnQgMzklKSxcbiAgICAgIGNvbmljLWdyYWRpZW50KFxuICAgICAgICBmcm9tIDIxOGRlZyxcbiAgICAgICAgdmFyKC0tYnJhbmQtZGVlcCkgMCAyNCUsXG4gICAgICAgIHZhcigtLWJyYW5kKSAyNCUgNjElLFxuICAgICAgICB2YXIoLS1icmFuZC1saWdodCkgNjElIDgyJSxcbiAgICAgICAgdmFyKC0tYnJhbmQtZGVlcCkgODIlIDEwMCVcbiAgICAgICk7XG4gIH1cblxuICA6aG9zdChbdG9uZT1cImludmVydGVkXCJdKSAubWFyayB7XG4gICAgLS1icmFuZC1tYXJrLWZpZWxkOiB2YXIoLS1ncmF5LTEyKTtcbiAgfVxuXG4gIC5tYXJrOjpiZWZvcmUge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0OiAyNyU7XG4gICAgYm9yZGVyOiB2YXIoLS1ib3JkZXItc2l6ZS0xKSBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYnJhbmQtbGlnaHQpIDU4JSwgdmFyKC0tYnJhbmQtbWFyay1maWVsZCwgdmFyKC0tYmctYmFzZSkpKTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtcm91bmQpO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKC0xM2RlZyk7XG4gIH1cblxuICAubWFyazo6YWZ0ZXIge1xuICAgIGNvbnRlbnQ6IFwiXCI7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0LWlubGluZS1lbmQ6IC0yJTtcbiAgICBpbnNldC1ibG9jay1zdGFydDogNyU7XG4gICAgd2lkdGg6IDM1JTtcbiAgICBoZWlnaHQ6IDQ0JTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1yYWRpdXMtcm91bmQpIHZhcigtLXJhZGl1cy1yb3VuZCkgMCAwO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWJyYW5kLW1hcmstZmllbGQsIHZhcigtLWJnLWJhc2UpKTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNGRlZyk7XG4gIH1cblxuICAuYm91bmRhcnksXG4gIC5yb3V0ZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGluc2V0LWlubGluZTogMjglIDIyJTtcbiAgICBoZWlnaHQ6IHZhcigtLWJvcmRlci1zaXplLTEpO1xuICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cy1yb3VuZCk7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tYnJhbmQtZGVlcCk7XG4gICAgei1pbmRleDogMTtcbiAgfVxuXG4gIC5ib3VuZGFyeSB7IGluc2V0LWJsb2NrLXN0YXJ0OiA0NiU7IH1cbiAgLnJvdXRlIHtcbiAgICBpbnNldC1ibG9jay1zdGFydDogNTclO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWJyYW5kKTtcbiAgfVxuXG4gIDpob3N0KFtzaXplPVwic21cIl0pIC5ib3VuZGFyeSxcbiAgOmhvc3QoW3NpemU9XCJzbVwiXSkgLnJvdXRlIHtcbiAgICBpbnNldC1pbmxpbmU6IDMwJSAyNCU7XG4gIH1cbmApO1xuXG5leHBvcnQgY2xhc3MgT3BlbkJyYW5kTWFyayBleHRlbmRzIE9wZW5FbGVtZW50IHtcbiAgc3RhdGljIG92ZXJyaWRlIHN0eWxlcyA9IFtzaGVldF07XG4gIHN0YXRpYyBvdmVycmlkZSBvYnNlcnZlZEF0dHJpYnV0ZXMgPSBbJ3NpemUnLCAndG9uZSddO1xuXG4gIG92ZXJyaWRlIHJlbmRlcigpOiBSZXR1cm5UeXBlPHR5cGVvZiBPcGVuRWxlbWVudC5wcm90b3R5cGUucmVuZGVyPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuIGNsYXNzTmFtZT0nbWFyaycgcGFydD0nbWFyaycgYXJpYS1oaWRkZW49J3RydWUnPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2JvdW5kYXJ5Jz48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT0ncm91dGUnPjwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE9wZW5CcmFuZE1hcms7XG5cbmlmICh0eXBlb2YgY3VzdG9tRWxlbWVudHMgIT09ICd1bmRlZmluZWQnICYmICFjdXN0b21FbGVtZW50cy5nZXQodGFnTmFtZSkpIHtcbiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKHRhZ05hbWUsIE9wZW5CcmFuZE1hcmspO1xufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHVDQUF1QyxHQUN2Qzs7OztDQUlDLEdBRUQsU0FBUyxXQUFXLFFBQVEsdUJBQXVCO0FBQ25ELFNBQVMsVUFBVSxRQUE2QixnQ0FBZ0M7QUFFaEYsT0FBTyxNQUFNLFVBQVUsa0JBQWtCO0FBRXpDLE1BQU0sUUFBd0IsSUFBSTtBQUNsQyxNQUFNLFdBQVcsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE4RW5CLENBQUM7QUFFRCxPQUFPLE1BQU0sc0JBQXNCO0VBQ2pDLE9BQWdCLFNBQVM7SUFBQztHQUFNLENBQUM7RUFDakMsT0FBZ0IscUJBQXFCO0lBQUM7SUFBUTtHQUFPLENBQUM7RUFFN0MsU0FBMEQ7SUFDakUsUUFDRyxLQUFLLFVBQVUsT0FBTyxLQUFLLE9BQU8sWUFBWSxPQUFPO1FBQ3BELENBQUMsS0FBSyxVQUFVLGFBQWEsS0FBSztRQUNsQyxDQUFDLEtBQUssVUFBVSxVQUFVLEtBQUs7TUFDakMsRUFBRTtFQUVOO0FBQ0Y7QUFFQSxlQUFlLGNBQWM7QUFFN0IsSUFBSSxPQUFPLG1CQUFtQixlQUFlLENBQUMsZUFBZSxHQUFHLENBQUMsVUFBVTtFQUN6RSxlQUFlLE1BQU0sQ0FBQyxTQUFTO0FBQ2pDIn0=
@@ -0,0 +1,38 @@
1
+ /** @jsxImportSource @openelement/core */ /**
2
+ * @openelement/ui - open-button
3
+ *
4
+ * Minimal button component following Swiss International Style.
5
+ * Pure B&W design with subtle hover 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
+ * Variants: default (outlined), primary (filled), ghost (no border), accent (gradient)
11
+ * Sizes: sm, md (default), lg
12
+ *
13
+ * @csspart control -The button or anchor element
14
+ *
15
+ * Usage:
16
+ * ```html
17
+ * <open-button>Click me</open-button>
18
+ * <open-button variant="primary">Submit</open-button>
19
+ * <open-button size="sm" disabled>Small</open-button>
20
+ * ```
21
+ */ import { OpenElement } from '@openelement/element';
22
+ import { type StyleSheetLike } from '@openelement/core/style-sheet';
23
+ export declare const tagName: 'open-button';
24
+ declare const sheet: StyleSheetLike;
25
+ export declare class OpenButton extends OpenElement {
26
+ static override styles: [];
27
+ static delegatesFocus: boolean;
28
+ static formAssociated: boolean;
29
+ static override observedAttributes: [string, string, string, string, string, string];
30
+ override render(): ReturnType<typeof OpenElement.prototype.render>;
31
+ override attributeChangedCallback(name: string, old: string | null, val: string | null): void;
32
+ private _syncDOM: any;
33
+ private _reRender: any;
34
+ private _updateState: any;
35
+ private _handleClick: any;
36
+ private _escAttr: any;
37
+ }
38
+ export default OpenButton;
@@ -0,0 +1,219 @@
1
+ /** @jsxImportSource @openelement/core */ /**
2
+ * @openelement/ui - open-button
3
+ *
4
+ * Minimal button component following Swiss International Style.
5
+ * Pure B&W design with subtle hover 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
+ * Variants: default (outlined), primary (filled), ghost (no border), accent (gradient)
11
+ * Sizes: sm, md (default), lg
12
+ *
13
+ * @csspart control -The button or anchor element
14
+ *
15
+ * Usage:
16
+ * ```html
17
+ * <open-button>Click me</open-button>
18
+ * <open-button variant="primary">Submit</open-button>
19
+ * <open-button size="sm" disabled>Small</open-button>
20
+ * ```
21
+ */ import { OpenElement } from '@openelement/element';
22
+ import { StyleSheet } from '@openelement/core/style-sheet';
23
+ import { escapeAttr } from '@openelement/core';
24
+ export const tagName = 'open-button';
25
+ const sheet = new StyleSheet();
26
+ sheet.replaceSync(`
27
+ :host {
28
+ display: inline-block;
29
+ }
30
+
31
+ .btn {
32
+ display: inline-flex;
33
+ align-items: center;
34
+ justify-content: center;
35
+ gap: var(--size-2);
36
+ font-family: var(--font-sans);
37
+ font-weight: var(--font-weight-8);
38
+ text-decoration: none;
39
+ cursor: pointer;
40
+ border: var(--border-size-1) solid color-mix(in srgb, var(--border) 72%, var(--brand));
41
+ background: color-mix(in srgb, var(--bg-elevated) 78%, transparent);
42
+ color: var(--text-primary);
43
+ border-radius: var(--btn-radius);
44
+ box-shadow: inset 0 1px 0 color-mix(in srgb, var(--gray-0) 72%, transparent);
45
+ transition: color var(--ease-3) var(--duration-2), border-color var(--ease-3) var(--duration-2), background var(--ease-3) var(--duration-2), transform var(--ease-3) var(--duration-2), box-shadow var(--ease-3) var(--duration-2);
46
+ white-space: nowrap;
47
+ letter-spacing: 0;
48
+ }
49
+
50
+ /* Sizes */
51
+ .btn--sm {
52
+ padding: var(--size-1) var(--size-3);
53
+ font-size: var(--font-size-0);
54
+ min-height: 30px;
55
+ }
56
+
57
+ .btn--md {
58
+ padding: var(--size-2) var(--size-4);
59
+ font-size: var(--font-size-1);
60
+ min-height: 38px;
61
+ }
62
+
63
+ .btn--lg {
64
+ padding: var(--size-3) var(--size-5);
65
+ font-size: var(--font-size-2);
66
+ min-height: 48px;
67
+ }
68
+
69
+ /* Variants */
70
+ .btn--default:hover {
71
+ color: var(--brand-deep);
72
+ border-color: var(--brand-light);
73
+ background: color-mix(in srgb, var(--brand-pale) 52%, var(--bg-elevated));
74
+ }
75
+
76
+ .btn--primary {
77
+ background: linear-gradient(135deg, var(--brand), var(--brand-light));
78
+ color: var(--on-brand);
79
+ border-color: transparent;
80
+ box-shadow: 0 var(--size-2) var(--size-5) color-mix(in srgb, var(--brand) 22%, transparent);
81
+ }
82
+
83
+ .btn--primary:hover {
84
+ background: linear-gradient(135deg, var(--brand-hover), var(--brand-light));
85
+ border-color: transparent;
86
+ transform: translateY(calc(var(--border-size-1) * -1));
87
+ box-shadow: 0 var(--size-3) var(--size-6) color-mix(in srgb, var(--brand) 28%, transparent);
88
+ }
89
+
90
+ .btn--ghost {
91
+ border-color: transparent;
92
+ }
93
+
94
+ .btn--ghost:hover {
95
+ background: color-mix(in srgb, var(--brand-pale) 38%, transparent);
96
+ border-color: transparent;
97
+ }
98
+
99
+ .btn--accent {
100
+ background: var(--brand);
101
+ color: var(--on-brand);
102
+ border-color: transparent;
103
+ }
104
+ .btn--accent:hover {
105
+ transform: translateY(-1px);
106
+ filter: brightness(1.05);
107
+ }
108
+ .btn--accent:active {
109
+ transform: translateY(0);
110
+ box-shadow: var(--shadow-1);
111
+ }
112
+
113
+ /* States */
114
+ .btn:disabled,
115
+ .btn[aria-disabled="true"] {
116
+ opacity: 0.5;
117
+ cursor: not-allowed;
118
+ pointer-events: none;
119
+ }
120
+
121
+ .btn:focus-visible {
122
+ outline: 2px solid var(--brand, var(--indigo-6));
123
+ outline-offset: 2px;
124
+ }
125
+
126
+ :host(:state(disabled)) .btn {
127
+ opacity: 0.5;
128
+ cursor: not-allowed;
129
+ pointer-events: none;
130
+ }
131
+ `);
132
+ export class OpenButton extends OpenElement {
133
+ static styles = [
134
+ sheet
135
+ ];
136
+ static delegatesFocus = true;
137
+ static formAssociated = true;
138
+ static observedAttributes = [
139
+ 'variant',
140
+ 'size',
141
+ 'disabled',
142
+ 'href',
143
+ 'target',
144
+ 'type'
145
+ ];
146
+ render() {
147
+ const v = this.getAttribute('variant') || 'default';
148
+ const s = this.getAttribute('size') || 'md';
149
+ const d = this.hasAttribute('disabled');
150
+ const href = this.getAttribute('href') || '';
151
+ const target = this.getAttribute('target') || '';
152
+ const type = this.getAttribute('type') || 'button';
153
+ const classes = `btn btn--${v} btn--${s}`;
154
+ if (href) {
155
+ return <a className={classes} part='control' href={d ? '' : href} target={target || undefined} aria-disabled={d ? 'true' : undefined} rel={target === '_blank' ? 'noopener noreferrer' : undefined} onClick={this._handleClick}>
156
+ <slot></slot>
157
+ </a>;
158
+ }
159
+ return <button className={classes} part='control' disabled={d} type={type} onClick={this._handleClick}>
160
+ <slot></slot>
161
+ </button>;
162
+ }
163
+ attributeChangedCallback(name, old, val) {
164
+ if (old === val) return;
165
+ // href change may switch element type (a vs button) -full re-render
166
+ if (name === 'href') {
167
+ this._reRender();
168
+ } else if (name === 'disabled') {
169
+ this._syncDOM();
170
+ this._updateState();
171
+ } else {
172
+ this._syncDOM();
173
+ }
174
+ }
175
+ _syncDOM() {
176
+ const el = this.shadowRoot?.querySelector('.btn');
177
+ if (!el) return;
178
+ const v = this.getAttribute('variant') || 'default';
179
+ const s = this.getAttribute('size') || 'md';
180
+ el.className = `btn btn--${v} btn--${s}`;
181
+ if (el instanceof HTMLButtonElement) {
182
+ el.disabled = this.hasAttribute('disabled');
183
+ }
184
+ if (el instanceof HTMLAnchorElement && this.hasAttribute('disabled')) {
185
+ el.setAttribute('aria-disabled', 'true');
186
+ }
187
+ }
188
+ _reRender() {
189
+ // NOTE: We do NOT capture assignedNodes before innerHTML replacement.
190
+ // Light DOM children remain in the host element and automatically
191
+ // re-project to the new <slot> - no manual DOM manipulation needed.
192
+ // The previous approach (replaceChildren) incorrectly moved light DOM
193
+ // children into the shadow root, breaking slot projection.
194
+ this.update();
195
+ }
196
+ _updateState() {
197
+ if (!this._internals?.states) return;
198
+ if (this.hasAttribute('disabled')) {
199
+ this._internals.states.delete('enabled');
200
+ this._internals.states.add('disabled');
201
+ } else {
202
+ this._internals.states.delete('disabled');
203
+ this._internals.states.add('enabled');
204
+ }
205
+ }
206
+ _handleClick(_e) {
207
+ this.dispatchEvent(new CustomEvent('open-click', {
208
+ bubbles: true,
209
+ composed: true
210
+ }));
211
+ }
212
+ _escAttr = escapeAttr;
213
+ }
214
+ export default OpenButton;
215
+ // Guard: idempotent across SSR paths
216
+ if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {
217
+ customElements.define(tagName, OpenButton);
218
+ }
219
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy91aS9zcmMvb3Blbi1idXR0b24udHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAanN4SW1wb3J0U291cmNlIEBvcGVuZWxlbWVudC9jb3JlICovXG4vKipcbiAqIEBvcGVuZWxlbWVudC91aSAtIG9wZW4tYnV0dG9uXG4gKlxuICogTWluaW1hbCBidXR0b24gY29tcG9uZW50IGZvbGxvd2luZyBTd2lzcyBJbnRlcm5hdGlvbmFsIFN0eWxlLlxuICogUHVyZSBCJlcgZGVzaWduIHdpdGggc3VidGxlIGhvdmVyIHN0YXRlcy5cbiAqXG4gKiB2MC4yMC4wOiBNaWdyYXRlZCBmcm9tIERzZExpdEVsZW1lbnQgdG8gRHNkRWxlbWVudCAoT2NlYW4gY29tcG9uZW50KS5cbiAqIHYwLjI0LjE6IE1pZ3JhdGVkIGZyb20gaHRtbGBgIHRlbXBsYXRlIHRvIEpTWCAoQURSLTAwNTcpLlxuICpcbiAqIFZhcmlhbnRzOiBkZWZhdWx0IChvdXRsaW5lZCksIHByaW1hcnkgKGZpbGxlZCksIGdob3N0IChubyBib3JkZXIpLCBhY2NlbnQgKGdyYWRpZW50KVxuICogU2l6ZXM6IHNtLCBtZCAoZGVmYXVsdCksIGxnXG4gKlxuICogQGNzc3BhcnQgY29udHJvbCAtVGhlIGJ1dHRvbiBvciBhbmNob3IgZWxlbWVudFxuICpcbiAqIFVzYWdlOlxuICogYGBgaHRtbFxuICogPG9wZW4tYnV0dG9uPkNsaWNrIG1lPC9vcGVuLWJ1dHRvbj5cbiAqIDxvcGVuLWJ1dHRvbiB2YXJpYW50PVwicHJpbWFyeVwiPlN1Ym1pdDwvb3Blbi1idXR0b24+XG4gKiA8b3Blbi1idXR0b24gc2l6ZT1cInNtXCIgZGlzYWJsZWQ+U21hbGw8L29wZW4tYnV0dG9uPlxuICogYGBgXG4gKi9cblxuaW1wb3J0IHsgT3BlbkVsZW1lbnQgfSBmcm9tICdAb3BlbmVsZW1lbnQvZWxlbWVudCc7XG5pbXBvcnQgeyBTdHlsZVNoZWV0LCB0eXBlIFN0eWxlU2hlZXRMaWtlIH0gZnJvbSAnQG9wZW5lbGVtZW50L2NvcmUvc3R5bGUtc2hlZXQnO1xuaW1wb3J0IHsgZXNjYXBlQXR0ciB9IGZyb20gJ0BvcGVuZWxlbWVudC9jb3JlJztcblxuZXhwb3J0IGNvbnN0IHRhZ05hbWUgPSAnb3Blbi1idXR0b24nO1xuXG5jb25zdCBzaGVldDogU3R5bGVTaGVldExpa2UgPSBuZXcgU3R5bGVTaGVldCgpO1xuc2hlZXQucmVwbGFjZVN5bmMoYFxuICA6aG9zdCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG5cbiAgLmJ0biB7XG4gICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBnYXA6IHZhcigtLXNpemUtMik7XG4gICAgZm9udC1mYW1pbHk6IHZhcigtLWZvbnQtc2Fucyk7XG4gICAgZm9udC13ZWlnaHQ6IHZhcigtLWZvbnQtd2VpZ2h0LTgpO1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm9yZGVyOiB2YXIoLS1ib3JkZXItc2l6ZS0xKSBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYm9yZGVyKSA3MiUsIHZhcigtLWJyYW5kKSk7XG4gICAgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWJnLWVsZXZhdGVkKSA3OCUsIHRyYW5zcGFyZW50KTtcbiAgICBjb2xvcjogdmFyKC0tdGV4dC1wcmltYXJ5KTtcbiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1idG4tcmFkaXVzKTtcbiAgICBib3gtc2hhZG93OiBpbnNldCAwIDFweCAwIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1ncmF5LTApIDcyJSwgdHJhbnNwYXJlbnQpO1xuICAgIHRyYW5zaXRpb246IGNvbG9yIHZhcigtLWVhc2UtMykgdmFyKC0tZHVyYXRpb24tMiksIGJvcmRlci1jb2xvciB2YXIoLS1lYXNlLTMpIHZhcigtLWR1cmF0aW9uLTIpLCBiYWNrZ3JvdW5kIHZhcigtLWVhc2UtMykgdmFyKC0tZHVyYXRpb24tMiksIHRyYW5zZm9ybSB2YXIoLS1lYXNlLTMpIHZhcigtLWR1cmF0aW9uLTIpLCBib3gtc2hhZG93IHZhcigtLWVhc2UtMykgdmFyKC0tZHVyYXRpb24tMik7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBsZXR0ZXItc3BhY2luZzogMDtcbiAgfVxuXG4gIC8qIFNpemVzICovXG4gIC5idG4tLXNtIHtcbiAgICBwYWRkaW5nOiB2YXIoLS1zaXplLTEpIHZhcigtLXNpemUtMyk7XG4gICAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtMCk7XG4gICAgbWluLWhlaWdodDogMzBweDtcbiAgfVxuXG4gIC5idG4tLW1kIHtcbiAgICBwYWRkaW5nOiB2YXIoLS1zaXplLTIpIHZhcigtLXNpemUtNCk7XG4gICAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtMSk7XG4gICAgbWluLWhlaWdodDogMzhweDtcbiAgfVxuXG4gIC5idG4tLWxnIHtcbiAgICBwYWRkaW5nOiB2YXIoLS1zaXplLTMpIHZhcigtLXNpemUtNSk7XG4gICAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtMik7XG4gICAgbWluLWhlaWdodDogNDhweDtcbiAgfVxuXG4gIC8qIFZhcmlhbnRzICovXG4gIC5idG4tLWRlZmF1bHQ6aG92ZXIge1xuICAgIGNvbG9yOiB2YXIoLS1icmFuZC1kZWVwKTtcbiAgICBib3JkZXItY29sb3I6IHZhcigtLWJyYW5kLWxpZ2h0KTtcbiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYnJhbmQtcGFsZSkgNTIlLCB2YXIoLS1iZy1lbGV2YXRlZCkpO1xuICB9XG5cbiAgLmJ0bi0tcHJpbWFyeSB7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tYnJhbmQpLCB2YXIoLS1icmFuZC1saWdodCkpO1xuICAgIGNvbG9yOiB2YXIoLS1vbi1icmFuZCk7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBib3gtc2hhZG93OiAwIHZhcigtLXNpemUtMikgdmFyKC0tc2l6ZS01KSBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYnJhbmQpIDIyJSwgdHJhbnNwYXJlbnQpO1xuICB9XG5cbiAgLmJ0bi0tcHJpbWFyeTpob3ZlciB7XG4gICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tYnJhbmQtaG92ZXIpLCB2YXIoLS1icmFuZC1saWdodCkpO1xuICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKGNhbGModmFyKC0tYm9yZGVyLXNpemUtMSkgKiAtMSkpO1xuICAgIGJveC1zaGFkb3c6IDAgdmFyKC0tc2l6ZS0zKSB2YXIoLS1zaXplLTYpIGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1icmFuZCkgMjglLCB0cmFuc3BhcmVudCk7XG4gIH1cblxuICAuYnRuLS1naG9zdCB7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuXG4gIC5idG4tLWdob3N0OmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYnJhbmQtcGFsZSkgMzglLCB0cmFuc3BhcmVudCk7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuXG4gIC5idG4tLWFjY2VudCB7XG4gICAgYmFja2dyb3VuZDogdmFyKC0tYnJhbmQpO1xuICAgIGNvbG9yOiB2YXIoLS1vbi1icmFuZCk7XG4gICAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgfVxuICAuYnRuLS1hY2NlbnQ6aG92ZXIge1xuICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMXB4KTtcbiAgICBmaWx0ZXI6IGJyaWdodG5lc3MoMS4wNSk7XG4gIH1cbiAgLmJ0bi0tYWNjZW50OmFjdGl2ZSB7XG4gICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApO1xuICAgIGJveC1zaGFkb3c6IHZhcigtLXNoYWRvdy0xKTtcbiAgfVxuXG4gIC8qIFN0YXRlcyAqL1xuICAuYnRuOmRpc2FibGVkLFxuICAuYnRuW2FyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJdIHtcbiAgICBvcGFjaXR5OiAwLjU7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuXG4gIC5idG46Zm9jdXMtdmlzaWJsZSB7XG4gICAgb3V0bGluZTogMnB4IHNvbGlkIHZhcigtLWJyYW5kLCB2YXIoLS1pbmRpZ28tNikpO1xuICAgIG91dGxpbmUtb2Zmc2V0OiAycHg7XG4gIH1cblxuICA6aG9zdCg6c3RhdGUoZGlzYWJsZWQpKSAuYnRuIHtcbiAgICBvcGFjaXR5OiAwLjU7XG4gICAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgfVxuYCk7XG5cbmV4cG9ydCBjbGFzcyBPcGVuQnV0dG9uIGV4dGVuZHMgT3BlbkVsZW1lbnQge1xuICBzdGF0aWMgb3ZlcnJpZGUgc3R5bGVzID0gW3NoZWV0XTtcbiAgc3RhdGljIG92ZXJyaWRlIGRlbGVnYXRlc0ZvY3VzID0gdHJ1ZTtcbiAgc3RhdGljIG92ZXJyaWRlIGZvcm1Bc3NvY2lhdGVkID0gdHJ1ZTtcbiAgc3RhdGljIG92ZXJyaWRlIG9ic2VydmVkQXR0cmlidXRlcyA9IFsndmFyaWFudCcsICdzaXplJywgJ2Rpc2FibGVkJywgJ2hyZWYnLCAndGFyZ2V0JywgJ3R5cGUnXTtcblxuICBvdmVycmlkZSByZW5kZXIoKTogUmV0dXJuVHlwZTx0eXBlb2YgT3BlbkVsZW1lbnQucHJvdG90eXBlLnJlbmRlcj4ge1xuICAgIGNvbnN0IHYgPSB0aGlzLmdldEF0dHJpYnV0ZSgndmFyaWFudCcpIHx8ICdkZWZhdWx0JztcbiAgICBjb25zdCBzID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NpemUnKSB8fCAnbWQnO1xuICAgIGNvbnN0IGQgPSB0aGlzLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICBjb25zdCBocmVmID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSB8fCAnJztcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmdldEF0dHJpYnV0ZSgndGFyZ2V0JykgfHwgJyc7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCd0eXBlJykgfHwgJ2J1dHRvbic7XG4gICAgY29uc3QgY2xhc3NlcyA9IGBidG4gYnRuLS0ke3Z9IGJ0bi0tJHtzfWA7XG5cbiAgICBpZiAoaHJlZikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPGFcbiAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXN9XG4gICAgICAgICAgcGFydD0nY29udHJvbCdcbiAgICAgICAgICBocmVmPXtkID8gJycgOiBocmVmfVxuICAgICAgICAgIHRhcmdldD17dGFyZ2V0IHx8IHVuZGVmaW5lZH1cbiAgICAgICAgICBhcmlhLWRpc2FibGVkPXtkID8gJ3RydWUnIDogdW5kZWZpbmVkfVxuICAgICAgICAgIHJlbD17dGFyZ2V0ID09PSAnX2JsYW5rJyA/ICdub29wZW5lciBub3JlZmVycmVyJyA6IHVuZGVmaW5lZH1cbiAgICAgICAgICBvbkNsaWNrPXt0aGlzLl9oYW5kbGVDbGlja31cbiAgICAgICAgPlxuICAgICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICAgICAgPC9hPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXN9XG4gICAgICAgIHBhcnQ9J2NvbnRyb2wnXG4gICAgICAgIGRpc2FibGVkPXtkfVxuICAgICAgICB0eXBlPXt0eXBlfVxuICAgICAgICBvbkNsaWNrPXt0aGlzLl9oYW5kbGVDbGlja31cbiAgICAgID5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgPC9idXR0b24+XG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lOiBzdHJpbmcsIG9sZDogc3RyaW5nIHwgbnVsbCwgdmFsOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKG9sZCA9PT0gdmFsKSByZXR1cm47XG4gICAgLy8gaHJlZiBjaGFuZ2UgbWF5IHN3aXRjaCBlbGVtZW50IHR5cGUgKGEgdnMgYnV0dG9uKSAtZnVsbCByZS1yZW5kZXJcbiAgICBpZiAobmFtZSA9PT0gJ2hyZWYnKSB7XG4gICAgICB0aGlzLl9yZVJlbmRlcigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ2Rpc2FibGVkJykge1xuICAgICAgdGhpcy5fc3luY0RPTSgpO1xuICAgICAgdGhpcy5fdXBkYXRlU3RhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3luY0RPTSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3N5bmNET00oKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSB0aGlzLnNoYWRvd1Jvb3Q/LnF1ZXJ5U2VsZWN0b3IoJy5idG4nKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IHYgPSB0aGlzLmdldEF0dHJpYnV0ZSgndmFyaWFudCcpIHx8ICdkZWZhdWx0JztcbiAgICBjb25zdCBzID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3NpemUnKSB8fCAnbWQnO1xuICAgIGVsLmNsYXNzTmFtZSA9IGBidG4gYnRuLS0ke3Z9IGJ0bi0tJHtzfWA7XG4gICAgaWYgKGVsIGluc3RhbmNlb2YgSFRNTEJ1dHRvbkVsZW1lbnQpIHtcbiAgICAgIGVsLmRpc2FibGVkID0gdGhpcy5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgfVxuICAgIGlmIChlbCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCAndHJ1ZScpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlUmVuZGVyKCk6IHZvaWQge1xuICAgIC8vIE5PVEU6IFdlIGRvIE5PVCBjYXB0dXJlIGFzc2lnbmVkTm9kZXMgYmVmb3JlIGlubmVySFRNTCByZXBsYWNlbWVudC5cbiAgICAvLyBMaWdodCBET00gY2hpbGRyZW4gcmVtYWluIGluIHRoZSBob3N0IGVsZW1lbnQgYW5kIGF1dG9tYXRpY2FsbHlcbiAgICAvLyByZS1wcm9qZWN0IHRvIHRoZSBuZXcgPHNsb3Q+IC0gbm8gbWFudWFsIERPTSBtYW5pcHVsYXRpb24gbmVlZGVkLlxuICAgIC8vIFRoZSBwcmV2aW91cyBhcHByb2FjaCAocmVwbGFjZUNoaWxkcmVuKSBpbmNvcnJlY3RseSBtb3ZlZCBsaWdodCBET01cbiAgICAvLyBjaGlsZHJlbiBpbnRvIHRoZSBzaGFkb3cgcm9vdCwgYnJlYWtpbmcgc2xvdCBwcm9qZWN0aW9uLlxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVTdGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2ludGVybmFscz8uc3RhdGVzKSByZXR1cm47XG4gICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7XG4gICAgICB0aGlzLl9pbnRlcm5hbHMuc3RhdGVzLmRlbGV0ZSgnZW5hYmxlZCcpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2Rpc2FibGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ludGVybmFscy5zdGF0ZXMuZGVsZXRlKCdkaXNhYmxlZCcpO1xuICAgICAgdGhpcy5faW50ZXJuYWxzLnN0YXRlcy5hZGQoJ2VuYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVDbGljayhfZTogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdvcGVuLWNsaWNrJywgeyBidWJibGVzOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSB9KSk7XG4gIH1cblxuICBwcml2YXRlIF9lc2NBdHRyID0gZXNjYXBlQXR0cjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgT3BlbkJ1dHRvbjtcblxuLy8gR3VhcmQ6IGlkZW1wb3RlbnQgYWNyb3NzIFNTUiBwYXRoc1xuaWYgKHR5cGVvZiBjdXN0b21FbGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcgJiYgIWN1c3RvbUVsZW1lbnRzLmdldCh0YWdOYW1lKSkge1xuICBjdXN0b21FbGVtZW50cy5kZWZpbmUodGFnTmFtZSwgT3BlbkJ1dHRvbik7XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsdUNBQXVDLEdBQ3ZDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW9CQyxHQUVELFNBQVMsV0FBVyxRQUFRLHVCQUF1QjtBQUNuRCxTQUFTLFVBQVUsUUFBNkIsZ0NBQWdDO0FBQ2hGLFNBQVMsVUFBVSxRQUFRLG9CQUFvQjtBQUUvQyxPQUFPLE1BQU0sVUFBVSxjQUFjO0FBRXJDLE1BQU0sUUFBd0IsSUFBSTtBQUNsQyxNQUFNLFdBQVcsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5R25CLENBQUM7QUFFRCxPQUFPLE1BQU0sbUJBQW1CO0VBQzlCLE9BQWdCLFNBQVM7SUFBQztHQUFNLENBQUM7RUFDakMsT0FBZ0IsaUJBQWlCLEtBQUs7RUFDdEMsT0FBZ0IsaUJBQWlCLEtBQUs7RUFDdEMsT0FBZ0IscUJBQXFCO0lBQUM7SUFBVztJQUFRO0lBQVk7SUFBUTtJQUFVO0dBQU8sQ0FBQztFQUV0RixTQUEwRDtJQUNqRSxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjO0lBQzFDLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVc7SUFDdkMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENB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
@@ -0,0 +1,26 @@
1
+ /** @jsxImportSource @openelement/core */ /**
2
+ * @openelement/ui - OpenCallout Component
3
+ *
4
+ * Callout/notice box for inline documentation alerts.
5
+ * Supports 4 types: info, warning, danger, tip.
6
+ * All colors use semantic tokens and respond to theme changes.
7
+ *
8
+ * Usage:
9
+ * ```html
10
+ * <open-callout type="info" label="Note">
11
+ * This is an informational callout.
12
+ * </open-callout>
13
+ * ```
14
+ */ import { OpenElement } from '@openelement/element';
15
+ import { type StyleSheetLike } from '@openelement/core/style-sheet';
16
+ export declare const tagName: 'open-callout';
17
+ declare const sheet: StyleSheetLike;
18
+ export declare class OpenCallout extends OpenElement {
19
+ static override styles: [];
20
+ static override observedAttributes: [string, string];
21
+ override render(): ReturnType<typeof OpenElement.prototype.render>;
22
+ override attributeChangedCallback(_name: string, old: string | null, val: string | null): void;
23
+ private _syncDOM: any;
24
+ private _esc: any;
25
+ }
26
+ export default OpenCallout;
@@ -0,0 +1,99 @@
1
+ /** @jsxImportSource @openelement/core */ /**
2
+ * @openelement/ui - OpenCallout Component
3
+ *
4
+ * Callout/notice box for inline documentation alerts.
5
+ * Supports 4 types: info, warning, danger, tip.
6
+ * All colors use semantic tokens and respond to theme changes.
7
+ *
8
+ * Usage:
9
+ * ```html
10
+ * <open-callout type="info" label="Note">
11
+ * This is an informational callout.
12
+ * </open-callout>
13
+ * ```
14
+ */ import { OpenElement } from '@openelement/element';
15
+ import { StyleSheet } from '@openelement/core/style-sheet';
16
+ import { escapeHtml } from '@openelement/core';
17
+ export const tagName = 'open-callout';
18
+ const TYPE_CONFIG = {
19
+ info: {
20
+ icon: '\u2139\uFE0F',
21
+ cls: 'callout--info'
22
+ },
23
+ warning: {
24
+ icon: '\u26A0',
25
+ cls: 'callout--warn'
26
+ },
27
+ danger: {
28
+ icon: '\u2715',
29
+ cls: 'callout--danger'
30
+ },
31
+ tip: {
32
+ icon: '\u2713',
33
+ cls: 'callout--tip'
34
+ }
35
+ };
36
+ const sheet = new StyleSheet();
37
+ sheet.replaceSync(`
38
+ :host { display: block; }
39
+ .callout {
40
+ padding: var(--size-3) var(--size-4);
41
+ margin: var(--size-3) 0;
42
+ border-left: var(--border-size-2) solid var(--brand);
43
+ background: var(--brand-subtle);
44
+ border-radius: 0 var(--radius-2) var(--radius-2) 0;
45
+ }
46
+ .callout--warn { border-left-color: var(--warning); background: var(--warning-subtle); }
47
+ .callout--danger { border-left-color: var(--error); background: var(--error-subtle); }
48
+ .callout--tip { border-left-color: var(--success); background: var(--success-subtle); }
49
+ :host([data-theme="light"]) .callout--warn { background: rgba(245,158,11,0.06); }
50
+ :host([data-theme="light"]) .callout--danger { background: rgba(239,68,68,0.06); }
51
+ :host([data-theme="light"]) .callout--tip { background: rgba(34,197,94,0.06); }
52
+ .callout-header {
53
+ display: flex; align-items: center; gap: var(--size-1); margin-bottom: var(--size-1);
54
+ }
55
+ .callout-icon { font-size: var(--font-size-0); line-height: 1; flex-shrink: 0; }
56
+ .callout-title {
57
+ font-size: var(--font-size-0); font-weight: var(--font-weight-6); color: var(--text-primary);
58
+ }
59
+ .callout-body {
60
+ font-size: var(--font-size-1); line-height: var(--font-lineheight-4); color: var(--text-secondary);
61
+ }
62
+ .callout-body ::slotted(p) { margin: 0; }
63
+ `);
64
+ export class OpenCallout extends OpenElement {
65
+ static styles = [
66
+ sheet
67
+ ];
68
+ static observedAttributes = [
69
+ 'type',
70
+ 'label'
71
+ ];
72
+ render() {
73
+ const type = this.getAttribute('type') || 'info';
74
+ const label = this.getAttribute('label') || '';
75
+ const config = TYPE_CONFIG[type] || TYPE_CONFIG.info;
76
+ return <div className={`callout ${config.cls}`} part='container'>
77
+ {label && <div className='callout-header'>
78
+ <span className='callout-icon' part='icon'>{config.icon}</span>
79
+ <span className='callout-title'>{this._esc(label)}</span>
80
+ </div>}
81
+ <div className='callout-body' part='content'>
82
+ <slot></slot>
83
+ </div>
84
+ </div>;
85
+ }
86
+ attributeChangedCallback(_name, old, val) {
87
+ if (old === val) return;
88
+ this._syncDOM();
89
+ }
90
+ _syncDOM() {
91
+ this.update();
92
+ }
93
+ _esc = escapeHtml;
94
+ }
95
+ export default OpenCallout;
96
+ if (typeof customElements !== 'undefined' && !customElements.get(tagName)) {
97
+ customElements.define(tagName, OpenCallout);
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vaG9tZS9ydW5uZXIvd29yay9vcGVuZWxlbWVudC9vcGVuZWxlbWVudC9wYWNrYWdlcy91aS9zcmMvb3Blbi1jYWxsb3V0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGpzeEltcG9ydFNvdXJjZSBAb3BlbmVsZW1lbnQvY29yZSAqL1xuLyoqXG4gKiBAb3BlbmVsZW1lbnQvdWkgLSBPcGVuQ2FsbG91dCBDb21wb25lbnRcbiAqXG4gKiBDYWxsb3V0L25vdGljZSBib3ggZm9yIGlubGluZSBkb2N1bWVudGF0aW9uIGFsZXJ0cy5cbiAqIFN1cHBvcnRzIDQgdHlwZXM6IGluZm8sIHdhcm5pbmcsIGRhbmdlciwgdGlwLlxuICogQWxsIGNvbG9ycyB1c2Ugc2VtYW50aWMgdG9rZW5zIGFuZCByZXNwb25kIHRvIHRoZW1lIGNoYW5nZXMuXG4gKlxuICogVXNhZ2U6XG4gKiBgYGBodG1sXG4gKiA8b3Blbi1jYWxsb3V0IHR5cGU9XCJpbmZvXCIgbGFiZWw9XCJOb3RlXCI+XG4gKiAgIFRoaXMgaXMgYW4gaW5mb3JtYXRpb25hbCBjYWxsb3V0LlxuICogPC9vcGVuLWNhbGxvdXQ+XG4gKiBgYGBcbiAqL1xuXG5pbXBvcnQgeyBPcGVuRWxlbWVudCB9IGZyb20gJ0BvcGVuZWxlbWVudC9lbGVtZW50JztcbmltcG9ydCB7IFN0eWxlU2hlZXQsIHR5cGUgU3R5bGVTaGVldExpa2UgfSBmcm9tICdAb3BlbmVsZW1lbnQvY29yZS9zdHlsZS1zaGVldCc7XG5pbXBvcnQgeyBlc2NhcGVIdG1sIH0gZnJvbSAnQG9wZW5lbGVtZW50L2NvcmUnO1xuXG5leHBvcnQgY29uc3QgdGFnTmFtZSA9ICdvcGVuLWNhbGxvdXQnO1xuXG5jb25zdCBUWVBFX0NPTkZJRzogUmVjb3JkPHN0cmluZywgeyBpY29uOiBzdHJpbmc7IGNsczogc3RyaW5nIH0+ID0ge1xuICBpbmZvOiB7IGljb246ICdcXHUyMTM5XFx1RkUwRicsIGNsczogJ2NhbGxvdXQtLWluZm8nIH0sXG4gIHdhcm5pbmc6IHsgaWNvbjogJ1xcdTI2QTAnLCBjbHM6ICdjYWxsb3V0LS13YXJuJyB9LFxuICBkYW5nZXI6IHsgaWNvbjogJ1xcdTI3MTUnLCBjbHM6ICdjYWxsb3V0LS1kYW5nZXInIH0sXG4gIHRpcDogeyBpY29uOiAnXFx1MjcxMycsIGNsczogJ2NhbGxvdXQtLXRpcCcgfSxcbn07XG5cbmNvbnN0IHNoZWV0OiBTdHlsZVNoZWV0TGlrZSA9IG5ldyBTdHlsZVNoZWV0KCk7XG5zaGVldC5yZXBsYWNlU3luYyhgXG4gIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH1cbiAgLmNhbGxvdXQge1xuICAgIHBhZGRpbmc6IHZhcigtLXNpemUtMykgdmFyKC0tc2l6ZS00KTtcbiAgICBtYXJnaW46IHZhcigtLXNpemUtMykgMDtcbiAgICBib3JkZXItbGVmdDogdmFyKC0tYm9yZGVyLXNpemUtMikgc29saWQgdmFyKC0tYnJhbmQpO1xuICAgIGJhY2tncm91bmQ6IHZhcigtLWJyYW5kLXN1YnRsZSk7XG4gICAgYm9yZGVyLXJhZGl1czogMCB2YXIoLS1yYWRpdXMtMikgdmFyKC0tcmFkaXVzLTIpIDA7XG4gIH1cbiAgLmNhbGxvdXQtLXdhcm4geyBib3JkZXItbGVmdC1jb2xvcjogdmFyKC0td2FybmluZyk7IGJhY2tncm91bmQ6IHZhcigtLXdhcm5pbmctc3VidGxlKTsgfVxuICAuY2FsbG91dC0tZGFuZ2VyIHsgYm9yZGVyLWxlZnQtY29sb3I6IHZhcigtLWVycm9yKTsgYmFja2dyb3VuZDogdmFyKC0tZXJyb3Itc3VidGxlKTsgfVxuICAuY2FsbG91dC0tdGlwIHsgYm9yZGVyLWxlZnQtY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzLXN1YnRsZSk7IH1cbiAgOmhvc3QoW2RhdGEtdGhlbWU9XCJsaWdodFwiXSkgLmNhbGxvdXQtLXdhcm4geyBiYWNrZ3JvdW5kOiByZ2JhKDI0NSwxNTgsMTEsMC4wNik7IH1cbiAgOmhvc3QoW2RhdGEtdGhlbWU9XCJsaWdodFwiXSkgLmNhbGxvdXQtLWRhbmdlciB7IGJhY2tncm91bmQ6IHJnYmEoMjM5LDY4LDY4LDAuMDYpOyB9XG4gIDpob3N0KFtkYXRhLXRoZW1lPVwibGlnaHRcIl0pIC5jYWxsb3V0LS10aXAgeyBiYWNrZ3JvdW5kOiByZ2JhKDM0LDE5Nyw5NCwwLjA2KTsgfVxuICAuY2FsbG91dC1oZWFkZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogdmFyKC0tc2l6ZS0xKTsgbWFyZ2luLWJvdHRvbTogdmFyKC0tc2l6ZS0xKTtcbiAgfVxuICAuY2FsbG91dC1pY29uIHsgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtMCk7IGxpbmUtaGVpZ2h0OiAxOyBmbGV4LXNocmluazogMDsgfVxuICAuY2FsbG91dC10aXRsZSB7XG4gICAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtMCk7IGZvbnQtd2VpZ2h0OiB2YXIoLS1mb250LXdlaWdodC02KTsgY29sb3I6IHZhcigtLXRleHQtcHJpbWFyeSk7XG4gIH1cbiAgLmNhbGxvdXQtYm9keSB7XG4gICAgZm9udC1zaXplOiB2YXIoLS1mb250LXNpemUtMSk7IGxpbmUtaGVpZ2h0OiB2YXIoLS1mb250LWxpbmVoZWlnaHQtNCk7IGNvbG9yOiB2YXIoLS10ZXh0LXNlY29uZGFyeSk7XG4gIH1cbiAgLmNhbGxvdXQtYm9keSA6OnNsb3R0ZWQocCkgeyBtYXJnaW46IDA7IH1cbmApO1xuXG5leHBvcnQgY2xhc3MgT3BlbkNhbGxvdXQgZXh0ZW5kcyBPcGVuRWxlbWVudCB7XG4gIHN0YXRpYyBvdmVycmlkZSBzdHlsZXMgPSBbc2hlZXRdO1xuICBzdGF0aWMgb3ZlcnJpZGUgb2JzZXJ2ZWRBdHRyaWJ1dGVzID0gWyd0eXBlJywgJ2xhYmVsJ107XG5cbiAgb3ZlcnJpZGUgcmVuZGVyKCk6IFJldHVyblR5cGU8dHlwZW9mIE9wZW5FbGVtZW50LnByb3RvdHlwZS5yZW5kZXI+IHtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAnaW5mbyc7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldEF0dHJpYnV0ZSgnbGFiZWwnKSB8fCAnJztcbiAgICBjb25zdCBjb25maWcgPSBUWVBFX0NPTkZJR1t0eXBlXSB8fCBUWVBFX0NPTkZJRy5pbmZvO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtgY2FsbG91dCAke2NvbmZpZy5jbHN9YH0gcGFydD0nY29udGFpbmVyJz5cbiAgICAgICAge2xhYmVsICYmIChcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY2FsbG91dC1oZWFkZXInPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdjYWxsb3V0LWljb24nIHBhcnQ9J2ljb24nPntjb25maWcuaWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9J2NhbGxvdXQtdGl0bGUnPnt0aGlzLl9lc2MobGFiZWwpfTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NhbGxvdXQtYm9keScgcGFydD0nY29udGVudCc+XG4gICAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soX25hbWU6IHN0cmluZywgb2xkOiBzdHJpbmcgfCBudWxsLCB2YWw6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAob2xkID09PSB2YWwpIHJldHVybjtcbiAgICB0aGlzLl9zeW5jRE9NKCk7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jRE9NKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cbiAgcHJpdmF0ZSBfZXNjID0gZXNjYXBlSHRtbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgT3BlbkNhbGxvdXQ7XG5cbmlmICh0eXBlb2YgY3VzdG9tRWxlbWVudHMgIT09ICd1bmRlZmluZWQnICYmICFjdXN0b21FbGVtZW50cy5nZXQodGFnTmFtZSkpIHtcbiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKHRhZ05hbWUsIE9wZW5DYWxsb3V0KTtcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1Q0FBdUMsR0FDdkM7Ozs7Ozs7Ozs7Ozs7Q0FhQyxHQUVELFNBQVMsV0FBVyxRQUFRLHVCQUF1QjtBQUNuRCxTQUFTLFVBQVUsUUFBNkIsZ0NBQWdDO0FBQ2hGLFNBQVMsVUFBVSxRQUFRLG9CQUFvQjtBQUUvQyxPQUFPLE1BQU0sVUFBVSxlQUFlO0FBRXRDLE1BQU0sY0FBNkQ7RUFDakUsTUFBTTtJQUFFLE1BQU07SUFBZ0IsS0FBSztFQUFnQjtFQUNuRCxTQUFTO0lBQUUsTUFBTTtJQUFVLEtBQUs7RUFBZ0I7RUFDaEQsUUFBUTtJQUFFLE1BQU07SUFBVSxLQUFLO0VBQWtCO0VBQ2pELEtBQUs7SUFBRSxNQUFNO0lBQVUsS0FBSztFQUFlO0FBQzdDO0FBRUEsTUFBTSxRQUF3QixJQUFJO0FBQ2xDLE1BQU0sV0FBVyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEJuQixDQUFDO0FBRUQsT0FBTyxNQUFNLG9CQUFvQjtFQUMvQixPQUFnQixTQUFTO0lBQUM7R0FBTSxDQUFDO0VBQ2pDLE9BQWdCLHFCQUFxQjtJQUFDO0lBQVE7R0FBUSxDQUFDO0VBRTlDLFNBQTBEO0lBQ2pFLE1BQU0sT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVc7SUFDMUMsTUFBTSxRQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWTtJQUM1QyxNQUFNLFNBQVMsV0FBVyxDQUFDLEtBQUssSUFBSSxZQUFZLElBQUk7SUFFcEQsUUFDRyxJQUFJLFdBQVcsQ0FBQyxRQUFRLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBRSxLQUFLLFlBQVk7UUFDeEQsQ0FBQyxVQUNFLElBQUksVUFBVSxpQkFBaUI7WUFDOUIsQ0FBQyxLQUFLLFVBQVUsZUFBZSxLQUFLLFFBQVEsT0FBTyxJQUFJLEdBQUcsS0FBSztZQUMvRCxDQUFDLEtBQUssVUFBVSxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUs7VUFDM0QsRUFBRSxLQUNGO1FBQ0YsQ0FBQyxJQUFJLFVBQVUsZUFBZSxLQUFLLFVBQVU7VUFDM0MsQ0FBQyxPQUFPLEtBQUs7UUFDZixFQUFFLElBQUk7TUFDUixFQUFFO0VBRU47RUFFUyx5QkFBeUIsS0FBYSxFQUFFLEdBQWtCLEVBQUUsR0FBa0IsRUFBUTtJQUM3RixJQUFJLFFBQVEsS0FBSztJQUNqQixJQUFJLENBQUMsUUFBUTtFQUNmO0VBRVEsV0FBaUI7SUFDdkIsSUFBSSxDQUFDLE1BQU07RUFDYjtFQUNRLE9BQU8sV0FBVztBQUM1QjtBQUVBLGVBQWUsWUFBWTtBQUUzQixJQUFJLE9BQU8sbUJBQW1CLGVBQWUsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxVQUFVO0VBQ3pFLGVBQWUsTUFBTSxDQUFDLFNBQVM7QUFDakMifQ==
@@ -0,0 +1,33 @@
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 { type StyleSheetLike } from '@openelement/core/style-sheet';
26
+ export declare const tagName: 'open-card';
27
+ declare const sheet: StyleSheetLike;
28
+ export declare class OpenCard extends OpenElement {
29
+ static override styles: [];
30
+ static override observedAttributes: [string];
31
+ override render(): ReturnType<typeof OpenElement.prototype.render>;
32
+ }
33
+ export default OpenCard;