@digital2analogue2/parsimony-components 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/custom-elements.json +3751 -0
  2. package/dist/alert/alert.d.ts +36 -0
  3. package/dist/alert/alert.d.ts.map +1 -0
  4. package/dist/alert/alert.js +179 -0
  5. package/dist/alert/alert.js.map +1 -0
  6. package/dist/alert/alert.stories.d.ts +12 -0
  7. package/dist/alert/alert.stories.d.ts.map +1 -0
  8. package/dist/alert/alert.stories.js +59 -0
  9. package/dist/alert/alert.stories.js.map +1 -0
  10. package/dist/avatar/avatar.d.ts +37 -0
  11. package/dist/avatar/avatar.d.ts.map +1 -0
  12. package/dist/avatar/avatar.js +150 -0
  13. package/dist/avatar/avatar.js.map +1 -0
  14. package/dist/avatar/avatar.stories.d.ts +10 -0
  15. package/dist/avatar/avatar.stories.d.ts.map +1 -0
  16. package/dist/avatar/avatar.stories.js +56 -0
  17. package/dist/avatar/avatar.stories.js.map +1 -0
  18. package/dist/badge/badge.d.ts +31 -0
  19. package/dist/badge/badge.d.ts.map +1 -0
  20. package/dist/badge/badge.js +104 -0
  21. package/dist/badge/badge.js.map +1 -0
  22. package/dist/badge/badge.stories.d.ts +9 -0
  23. package/dist/badge/badge.stories.d.ts.map +1 -0
  24. package/dist/badge/badge.stories.js +35 -0
  25. package/dist/badge/badge.stories.js.map +1 -0
  26. package/dist/button/button.d.ts +50 -0
  27. package/dist/button/button.d.ts.map +1 -0
  28. package/dist/button/button.js +237 -0
  29. package/dist/button/button.js.map +1 -0
  30. package/dist/button/button.stories.d.ts +12 -0
  31. package/dist/button/button.stories.d.ts.map +1 -0
  32. package/dist/button/button.stories.js +44 -0
  33. package/dist/button/button.stories.js.map +1 -0
  34. package/dist/card/card.d.ts +32 -0
  35. package/dist/card/card.d.ts.map +1 -0
  36. package/dist/card/card.js +107 -0
  37. package/dist/card/card.js.map +1 -0
  38. package/dist/card/card.stories.d.ts +9 -0
  39. package/dist/card/card.stories.d.ts.map +1 -0
  40. package/dist/card/card.stories.js +39 -0
  41. package/dist/card/card.stories.js.map +1 -0
  42. package/dist/checkbox/checkbox.d.ts +44 -0
  43. package/dist/checkbox/checkbox.d.ts.map +1 -0
  44. package/dist/checkbox/checkbox.js +201 -0
  45. package/dist/checkbox/checkbox.js.map +1 -0
  46. package/dist/checkbox/checkbox.stories.d.ts +10 -0
  47. package/dist/checkbox/checkbox.stories.d.ts.map +1 -0
  48. package/dist/checkbox/checkbox.stories.js +38 -0
  49. package/dist/checkbox/checkbox.stories.js.map +1 -0
  50. package/dist/dialog/dialog.d.ts +51 -0
  51. package/dist/dialog/dialog.d.ts.map +1 -0
  52. package/dist/dialog/dialog.js +234 -0
  53. package/dist/dialog/dialog.js.map +1 -0
  54. package/dist/dialog/dialog.stories.d.ts +7 -0
  55. package/dist/dialog/dialog.stories.d.ts.map +1 -0
  56. package/dist/dialog/dialog.stories.js +30 -0
  57. package/dist/dialog/dialog.stories.js.map +1 -0
  58. package/dist/icon/icon.d.ts +40 -0
  59. package/dist/icon/icon.d.ts.map +1 -0
  60. package/dist/icon/icon.js +99 -0
  61. package/dist/icon/icon.js.map +1 -0
  62. package/dist/icon/icon.stories.d.ts +9 -0
  63. package/dist/icon/icon.stories.d.ts.map +1 -0
  64. package/dist/icon/icon.stories.js +41 -0
  65. package/dist/icon/icon.stories.js.map +1 -0
  66. package/dist/index.d.ts +22 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +22 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/input/input.d.ts +61 -0
  71. package/dist/input/input.d.ts.map +1 -0
  72. package/dist/input/input.js +233 -0
  73. package/dist/input/input.js.map +1 -0
  74. package/dist/input/input.stories.d.ts +10 -0
  75. package/dist/input/input.stories.d.ts.map +1 -0
  76. package/dist/input/input.stories.js +48 -0
  77. package/dist/input/input.stories.js.map +1 -0
  78. package/dist/link/link.d.ts +39 -0
  79. package/dist/link/link.d.ts.map +1 -0
  80. package/dist/link/link.js +112 -0
  81. package/dist/link/link.js.map +1 -0
  82. package/dist/link/link.stories.d.ts +9 -0
  83. package/dist/link/link.stories.d.ts.map +1 -0
  84. package/dist/link/link.stories.js +44 -0
  85. package/dist/link/link.stories.js.map +1 -0
  86. package/dist/progress/progress.d.ts +35 -0
  87. package/dist/progress/progress.d.ts.map +1 -0
  88. package/dist/progress/progress.js +116 -0
  89. package/dist/progress/progress.js.map +1 -0
  90. package/dist/progress/progress.stories.d.ts +10 -0
  91. package/dist/progress/progress.stories.d.ts.map +1 -0
  92. package/dist/progress/progress.stories.js +32 -0
  93. package/dist/progress/progress.stories.js.map +1 -0
  94. package/dist/radio/radio-group.d.ts +53 -0
  95. package/dist/radio/radio-group.d.ts.map +1 -0
  96. package/dist/radio/radio-group.js +183 -0
  97. package/dist/radio/radio-group.js.map +1 -0
  98. package/dist/radio/radio-group.stories.d.ts +9 -0
  99. package/dist/radio/radio-group.stories.d.ts.map +1 -0
  100. package/dist/radio/radio-group.stories.js +44 -0
  101. package/dist/radio/radio-group.stories.js.map +1 -0
  102. package/dist/radio/radio.d.ts +29 -0
  103. package/dist/radio/radio.d.ts.map +1 -0
  104. package/dist/radio/radio.js +166 -0
  105. package/dist/radio/radio.js.map +1 -0
  106. package/dist/radio/radio.stories.d.ts +13 -0
  107. package/dist/radio/radio.stories.d.ts.map +1 -0
  108. package/dist/radio/radio.stories.js +28 -0
  109. package/dist/radio/radio.stories.js.map +1 -0
  110. package/dist/select/select.d.ts +63 -0
  111. package/dist/select/select.d.ts.map +1 -0
  112. package/dist/select/select.js +258 -0
  113. package/dist/select/select.js.map +1 -0
  114. package/dist/select/select.stories.d.ts +9 -0
  115. package/dist/select/select.stories.d.ts.map +1 -0
  116. package/dist/select/select.stories.js +46 -0
  117. package/dist/select/select.stories.js.map +1 -0
  118. package/dist/skeleton/skeleton.d.ts +39 -0
  119. package/dist/skeleton/skeleton.d.ts.map +1 -0
  120. package/dist/skeleton/skeleton.js +111 -0
  121. package/dist/skeleton/skeleton.js.map +1 -0
  122. package/dist/skeleton/skeleton.stories.d.ts +9 -0
  123. package/dist/skeleton/skeleton.stories.d.ts.map +1 -0
  124. package/dist/skeleton/skeleton.stories.js +36 -0
  125. package/dist/skeleton/skeleton.stories.js.map +1 -0
  126. package/dist/spinner/spinner.d.ts +29 -0
  127. package/dist/spinner/spinner.d.ts.map +1 -0
  128. package/dist/spinner/spinner.js +131 -0
  129. package/dist/spinner/spinner.js.map +1 -0
  130. package/dist/spinner/spinner.stories.d.ts +8 -0
  131. package/dist/spinner/spinner.stories.d.ts.map +1 -0
  132. package/dist/spinner/spinner.stories.js +29 -0
  133. package/dist/spinner/spinner.stories.js.map +1 -0
  134. package/dist/tabs/tab-list.d.ts +45 -0
  135. package/dist/tabs/tab-list.d.ts.map +1 -0
  136. package/dist/tabs/tab-list.js +150 -0
  137. package/dist/tabs/tab-list.js.map +1 -0
  138. package/dist/tabs/tab-list.stories.d.ts +7 -0
  139. package/dist/tabs/tab-list.stories.d.ts.map +1 -0
  140. package/dist/tabs/tab-list.stories.js +27 -0
  141. package/dist/tabs/tab-list.stories.js.map +1 -0
  142. package/dist/tabs/tab.d.ts +40 -0
  143. package/dist/tabs/tab.d.ts.map +1 -0
  144. package/dist/tabs/tab.js +114 -0
  145. package/dist/tabs/tab.js.map +1 -0
  146. package/dist/tabs/tab.stories.d.ts +13 -0
  147. package/dist/tabs/tab.stories.d.ts.map +1 -0
  148. package/dist/tabs/tab.stories.js +28 -0
  149. package/dist/tabs/tab.stories.js.map +1 -0
  150. package/dist/tag/tag.d.ts +38 -0
  151. package/dist/tag/tag.d.ts.map +1 -0
  152. package/dist/tag/tag.js +71 -0
  153. package/dist/tag/tag.js.map +1 -0
  154. package/dist/tag/tag.stories.d.ts +10 -0
  155. package/dist/tag/tag.stories.d.ts.map +1 -0
  156. package/dist/tag/tag.stories.js +43 -0
  157. package/dist/tag/tag.stories.js.map +1 -0
  158. package/dist/test-setup.d.ts +2 -0
  159. package/dist/test-setup.d.ts.map +1 -0
  160. package/dist/test-setup.js +2 -0
  161. package/dist/test-setup.js.map +1 -0
  162. package/dist/textarea/textarea.d.ts +60 -0
  163. package/dist/textarea/textarea.d.ts.map +1 -0
  164. package/dist/textarea/textarea.js +232 -0
  165. package/dist/textarea/textarea.js.map +1 -0
  166. package/dist/textarea/textarea.stories.d.ts +10 -0
  167. package/dist/textarea/textarea.stories.d.ts.map +1 -0
  168. package/dist/textarea/textarea.stories.js +47 -0
  169. package/dist/textarea/textarea.stories.js.map +1 -0
  170. package/dist/toggle/toggle.d.ts +43 -0
  171. package/dist/toggle/toggle.d.ts.map +1 -0
  172. package/dist/toggle/toggle.js +189 -0
  173. package/dist/toggle/toggle.js.map +1 -0
  174. package/dist/toggle/toggle.stories.d.ts +9 -0
  175. package/dist/toggle/toggle.stories.d.ts.map +1 -0
  176. package/dist/toggle/toggle.stories.js +34 -0
  177. package/dist/toggle/toggle.stories.js.map +1 -0
  178. package/package.json +65 -0
  179. package/src/react.d.ts +199 -0
@@ -0,0 +1,104 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html, css } from 'lit';
8
+ import { customElement, property } from 'lit/decorators.js';
9
+ /**
10
+ * A status badge / chip component.
11
+ *
12
+ * Uses component-level design tokens for all visual properties.
13
+ * Brand theming cascades automatically via CSS custom properties on `:root`.
14
+ *
15
+ * @slot - Badge label text
16
+ * @cssprop --component-badge-{variant}-background
17
+ * @cssprop --component-badge-{variant}-foreground
18
+ * @cssprop --component-badge-{variant}-border
19
+ * @cssprop --component-badge-radius
20
+ * @cssprop --component-badge-padding-x
21
+ * @cssprop --component-badge-padding-y
22
+ */
23
+ let RrBadge = class RrBadge extends LitElement {
24
+ constructor() {
25
+ super(...arguments);
26
+ /**
27
+ * Visual variant. Status variants (success, warning, danger, info) convey
28
+ * semantic meaning. Accent variants are decorative emphasis tags.
29
+ */
30
+ this.variant = 'default';
31
+ }
32
+ render() {
33
+ return html `<slot></slot>`;
34
+ }
35
+ };
36
+ RrBadge.styles = css `
37
+ :host {
38
+ display: inline-flex;
39
+ align-items: center;
40
+ white-space: nowrap;
41
+ border-radius: var(--component-badge-radius);
42
+ padding: var(--component-badge-padding-y) var(--component-badge-padding-x);
43
+ font: var(--font-label-small);
44
+ border: 1px solid var(--component-badge-default-border);
45
+ background: var(--component-badge-default-background);
46
+ color: var(--component-badge-default-foreground);
47
+ }
48
+
49
+ :host([variant='success']) {
50
+ background: var(--component-badge-success-background);
51
+ color: var(--component-badge-success-foreground);
52
+ border-color: var(--component-badge-success-border);
53
+ }
54
+
55
+ :host([variant='warning']) {
56
+ background: var(--component-badge-warning-background);
57
+ color: var(--component-badge-warning-foreground);
58
+ border-color: var(--component-badge-warning-border);
59
+ }
60
+
61
+ :host([variant='danger']) {
62
+ background: var(--component-badge-danger-background);
63
+ color: var(--component-badge-danger-foreground);
64
+ border-color: var(--component-badge-danger-border);
65
+ }
66
+
67
+ :host([variant='info']) {
68
+ background: var(--component-badge-info-background);
69
+ color: var(--component-badge-info-foreground);
70
+ border-color: var(--component-badge-info-border);
71
+ }
72
+
73
+ :host([variant='accent-green']) {
74
+ background: var(--component-badge-accent-green-background);
75
+ color: var(--component-badge-accent-green-foreground);
76
+ border-color: var(--component-badge-accent-green-border);
77
+ }
78
+
79
+ :host([variant='accent-blue']) {
80
+ background: var(--component-badge-accent-blue-background);
81
+ color: var(--component-badge-accent-blue-foreground);
82
+ border-color: var(--component-badge-accent-blue-border);
83
+ }
84
+
85
+ :host([variant='accent-violet']) {
86
+ background: var(--component-badge-accent-violet-background);
87
+ color: var(--component-badge-accent-violet-foreground);
88
+ border-color: var(--component-badge-accent-violet-border);
89
+ }
90
+
91
+ :host([variant='accent-amber']) {
92
+ background: var(--component-badge-accent-amber-background);
93
+ color: var(--component-badge-accent-amber-foreground);
94
+ border-color: var(--component-badge-accent-amber-border);
95
+ }
96
+ `;
97
+ __decorate([
98
+ property({ reflect: true })
99
+ ], RrBadge.prototype, "variant", void 0);
100
+ RrBadge = __decorate([
101
+ customElement('rr-badge')
102
+ ], RrBadge);
103
+ export { RrBadge };
104
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.js","sourceRoot":"","sources":["../../src/badge/badge.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAa5D;;;;;;;;;;;;;GAaG;AAEI,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,UAAU;IAAhC;;QA+DL;;;WAGG;QAEH,YAAO,GAAiB,SAAS,CAAC;IAKpC,CAAC;IAHC,MAAM;QACJ,OAAO,IAAI,CAAA,eAAe,CAAC;IAC7B,CAAC;;AAvEM,cAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DlB,AA5DY,CA4DX;AAOF;IADC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;wCACM;AApEvB,OAAO;IADnB,aAAa,CAAC,UAAU,CAAC;GACb,OAAO,CAyEnB"}
@@ -0,0 +1,9 @@
1
+ import type { Meta, StoryObj } from '@storybook/web-components-vite';
2
+ import '@digital2analogue2/parsimony-components';
3
+ declare const meta: Meta;
4
+ export default meta;
5
+ type Story = StoryObj;
6
+ export declare const Default: Story;
7
+ export declare const Success: Story;
8
+ export declare const AllVariants: Story;
9
+ //# sourceMappingURL=badge.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.stories.d.ts","sourceRoot":"","sources":["../../src/badge/badge.stories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAGrE,OAAO,yCAAyC,CAAC;AAcjD,QAAA,MAAM,IAAI,EAAE,IASX,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC;AAEtB,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,OAAO,EAAE,KAA4D,CAAC;AAEnF,eAAO,MAAM,WAAW,EAAE,KAMzB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { html } from 'lit';
2
+ // Barrel side-effect import registers every rr-* element (see story-ui.config.js).
3
+ import '@digital2analogue2/parsimony-components';
4
+ const VARIANTS = [
5
+ 'default',
6
+ 'success',
7
+ 'warning',
8
+ 'danger',
9
+ 'info',
10
+ 'accent-green',
11
+ 'accent-blue',
12
+ 'accent-violet',
13
+ 'accent-amber',
14
+ ];
15
+ const meta = {
16
+ title: 'Components/Badge',
17
+ component: 'rr-badge',
18
+ argTypes: {
19
+ variant: { control: 'select', options: VARIANTS },
20
+ label: { control: 'text' },
21
+ },
22
+ args: { variant: 'default', label: 'Badge' },
23
+ render: ({ variant, label }) => html `<rr-badge variant=${variant}>${label}</rr-badge>`,
24
+ };
25
+ export default meta;
26
+ export const Default = {};
27
+ export const Success = { args: { variant: 'success', label: 'Connected' } };
28
+ export const AllVariants = {
29
+ render: () => html `
30
+ <div style="display: flex; flex-wrap: wrap; gap: var(--spacing-inline);">
31
+ ${VARIANTS.map((v) => html `<rr-badge variant=${v}>${v}</rr-badge>`)}
32
+ </div>
33
+ `,
34
+ };
35
+ //# sourceMappingURL=badge.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.stories.js","sourceRoot":"","sources":["../../src/badge/badge.stories.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,mFAAmF;AACnF,OAAO,yCAAyC,CAAC;AAEjD,MAAM,QAAQ,GAAG;IACf,SAAS;IACT,SAAS;IACT,SAAS;IACT,QAAQ;IACR,MAAM;IACN,cAAc;IACd,aAAa;IACb,eAAe;IACf,cAAc;CACN,CAAC;AAEX,MAAM,IAAI,GAAS;IACjB,KAAK,EAAE,kBAAkB;IACzB,SAAS,EAAE,UAAU;IACrB,QAAQ,EAAE;QACR,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;QACjD,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;KAC3B;IACD,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE;IAC5C,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,CAAA,qBAAqB,OAAO,IAAI,KAAK,aAAa;CACvF,CAAC;AACF,eAAe,IAAI,CAAC;AAIpB,MAAM,CAAC,MAAM,OAAO,GAAU,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,OAAO,GAAU,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;AAEnF,MAAM,CAAC,MAAM,WAAW,GAAU;IAChC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAA;;QAEZ,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAA,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC;;GAEtE;CACF,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { LitElement } from 'lit';
2
+ export type ButtonVariant = 'primary' | 'secondary' | 'danger' | 'ghost';
3
+ export type ButtonSize = 'sm' | 'md' | 'lg';
4
+ /**
5
+ * A button with variant, size, loading, and disabled states.
6
+ *
7
+ * Renders a native `<button>` inside its shadow root for full
8
+ * keyboard and form semantics. Uses `delegatesFocus` so the host
9
+ * forwards focus to the inner button.
10
+ *
11
+ * @slot - Button label text
12
+ * @slot prefix - Icon or element before the label
13
+ * @slot suffix - Icon or element after the label
14
+ * @fires click - Native click (suppressed when disabled or loading)
15
+ * @csspart button - The inner <button> element
16
+ */
17
+ export declare class RrButton extends LitElement {
18
+ static formAssociated: boolean;
19
+ static shadowRootOptions: {
20
+ delegatesFocus: boolean;
21
+ clonable?: boolean;
22
+ customElementRegistry?: CustomElementRegistry | null;
23
+ mode: ShadowRootMode;
24
+ serializable?: boolean;
25
+ slotAssignment?: SlotAssignmentMode;
26
+ };
27
+ static styles: import("lit").CSSResult;
28
+ /** Visual variant: primary (filled CTA), secondary (outlined), danger (destructive), ghost (text-only, quiet). */
29
+ variant: ButtonVariant;
30
+ /** Size: sm, md, lg. Controls padding and font size. */
31
+ size: ButtonSize;
32
+ /** Disables the button. Prevents click and removes from tab order. */
33
+ disabled: boolean;
34
+ /** Shows a spinner and sets aria-busy. Click suppressed while loading. */
35
+ loading: boolean;
36
+ /** Button type attribute: button, submit, or reset. */
37
+ type: 'button' | 'submit' | 'reset';
38
+ /** Accessible label. Required for icon-only buttons. */
39
+ ariaLabel: string | null;
40
+ private _internals;
41
+ constructor();
42
+ private _handleClick;
43
+ render(): import("lit-html").TemplateResult<1>;
44
+ }
45
+ declare global {
46
+ interface HTMLElementTagNameMap {
47
+ 'rr-button': RrButton;
48
+ }
49
+ }
50
+ //# sourceMappingURL=button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["../../src/button/button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAGrD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AACzE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C;;;;;;;;;;;;GAYG;AACH,qBACa,QAAS,SAAQ,UAAU;IACtC,MAAM,CAAC,cAAc,UAAQ;IAE7B,MAAM,CAAC,iBAAiB;;;;;;;MAGtB;IAEF,MAAM,CAAC,MAAM,0BA2IX;IAEF,kHAAkH;IACrF,OAAO,EAAE,aAAa,CAAa;IAEhE,wDAAwD;IAC3B,IAAI,EAAE,UAAU,CAAQ;IAErD,sEAAsE;IAC1B,QAAQ,UAAS;IAE7D,0EAA0E;IAC9B,OAAO,UAAS;IAE5D,uDAAuD;IAC3C,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAY;IAE3D,wDAAwD;IACR,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEhF,OAAO,CAAC,UAAU,CAAmB;;IAOrC,OAAO,CAAC,YAAY;IAOpB,MAAM;CAwBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,QAAQ,CAAC;KACvB;CACF"}
@@ -0,0 +1,237 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html, css, nothing } from 'lit';
8
+ import { customElement, property } from 'lit/decorators.js';
9
+ /**
10
+ * A button with variant, size, loading, and disabled states.
11
+ *
12
+ * Renders a native `<button>` inside its shadow root for full
13
+ * keyboard and form semantics. Uses `delegatesFocus` so the host
14
+ * forwards focus to the inner button.
15
+ *
16
+ * @slot - Button label text
17
+ * @slot prefix - Icon or element before the label
18
+ * @slot suffix - Icon or element after the label
19
+ * @fires click - Native click (suppressed when disabled or loading)
20
+ * @csspart button - The inner <button> element
21
+ */
22
+ let RrButton = class RrButton extends LitElement {
23
+ constructor() {
24
+ super();
25
+ /** Visual variant: primary (filled CTA), secondary (outlined), danger (destructive), ghost (text-only, quiet). */
26
+ this.variant = 'primary';
27
+ /** Size: sm, md, lg. Controls padding and font size. */
28
+ this.size = 'md';
29
+ /** Disables the button. Prevents click and removes from tab order. */
30
+ this.disabled = false;
31
+ /** Shows a spinner and sets aria-busy. Click suppressed while loading. */
32
+ this.loading = false;
33
+ /** Button type attribute: button, submit, or reset. */
34
+ this.type = 'button';
35
+ /** Accessible label. Required for icon-only buttons. */
36
+ this.ariaLabel = null;
37
+ this._internals = this.attachInternals();
38
+ }
39
+ _handleClick(e) {
40
+ if (this.disabled || this.loading) {
41
+ e.preventDefault();
42
+ e.stopImmediatePropagation();
43
+ }
44
+ }
45
+ render() {
46
+ return html `
47
+ <button
48
+ part="button"
49
+ .type=${this.type}
50
+ ?disabled=${this.disabled}
51
+ aria-disabled=${this.disabled ? 'true' : nothing}
52
+ aria-busy=${this.loading ? 'true' : nothing}
53
+ aria-label=${this.ariaLabel || nothing}
54
+ @click=${this._handleClick}
55
+ >
56
+ <span class="wrapper">
57
+ ${this.loading
58
+ ? html `<span class="loading-container"><span class="spinner" aria-hidden="true"></span></span>`
59
+ : nothing}
60
+ <span class="label">
61
+ <slot name="prefix"></slot>
62
+ <slot></slot>
63
+ <slot name="suffix"></slot>
64
+ </span>
65
+ </span>
66
+ </button>
67
+ `;
68
+ }
69
+ };
70
+ RrButton.formAssociated = true;
71
+ RrButton.shadowRootOptions = {
72
+ ...LitElement.shadowRootOptions,
73
+ delegatesFocus: true,
74
+ };
75
+ RrButton.styles = css `
76
+ :host {
77
+ display: inline-block;
78
+ }
79
+
80
+ button {
81
+ display: inline-flex;
82
+ align-items: center;
83
+ justify-content: center;
84
+ gap: var(--spacing-tight);
85
+ border: 1px solid var(--component-button-primary-border-default);
86
+ border-radius: var(--radius-default);
87
+ font: var(--font-label-strong-medium);
88
+ cursor: pointer;
89
+ padding: var(--spacing-tight) var(--spacing-element);
90
+ background: var(--component-button-primary-background-default);
91
+ color: var(--component-button-primary-foreground-default);
92
+ transition:
93
+ background-color var(--motion-duration-instant) var(--motion-easing-default),
94
+ border-color var(--motion-duration-instant) var(--motion-easing-default);
95
+ outline: none;
96
+ text-decoration: none;
97
+ white-space: nowrap;
98
+ }
99
+
100
+ button:hover {
101
+ background: var(--component-button-primary-background-hover);
102
+ border-color: var(--component-button-primary-border-hover);
103
+ }
104
+
105
+ button:active {
106
+ background: var(--component-button-primary-background-active);
107
+ border-color: var(--component-button-primary-border-active);
108
+ }
109
+
110
+ button:focus-visible {
111
+ box-shadow: 0 0 0 2px var(--color-border-focus);
112
+ }
113
+
114
+ /* --- Size: sm --- */
115
+ :host([size='sm']) button {
116
+ font: var(--font-label-strong-small);
117
+ padding: var(--spacing-micro) var(--spacing-tight);
118
+ }
119
+
120
+ /* --- Size: lg --- */
121
+ :host([size='lg']) button {
122
+ font: var(--font-label-strong-large);
123
+ padding: var(--spacing-inline) var(--spacing-element);
124
+ }
125
+
126
+ /* --- Variant: secondary --- */
127
+ :host([variant='secondary']) button {
128
+ background: var(--component-button-secondary-background-default);
129
+ color: var(--component-button-secondary-foreground-default);
130
+ border-color: var(--component-button-secondary-border-default);
131
+ }
132
+ :host([variant='secondary']) button:hover {
133
+ background: var(--component-button-secondary-background-hover);
134
+ border-color: var(--component-button-secondary-border-hover);
135
+ }
136
+
137
+ /* --- Variant: danger --- */
138
+ :host([variant='danger']) button {
139
+ background: var(--component-button-danger-background-default);
140
+ color: var(--component-button-danger-foreground-default);
141
+ border-color: var(--component-button-danger-border-default);
142
+ }
143
+ :host([variant='danger']) button:hover {
144
+ background: var(--component-button-danger-background-hover);
145
+ border-color: var(--component-button-danger-border-hover);
146
+ }
147
+
148
+ /* --- Variant: ghost --- */
149
+ :host([variant='ghost']) button {
150
+ background: var(--component-button-ghost-background-default);
151
+ color: var(--component-button-ghost-foreground-default);
152
+ border-color: var(--component-button-ghost-border-default);
153
+ }
154
+ :host([variant='ghost']) button:hover {
155
+ background: var(--component-button-ghost-background-hover);
156
+ border-color: var(--component-button-ghost-border-hover);
157
+ }
158
+
159
+ /* --- Disabled --- */
160
+ :host([disabled]) button {
161
+ background: var(--color-background-disabled);
162
+ color: var(--color-foreground-disabled);
163
+ border-color: var(--color-border-disabled);
164
+ cursor: not-allowed;
165
+ pointer-events: none;
166
+ }
167
+
168
+ /* --- Loading --- */
169
+ :host([loading]) button {
170
+ cursor: wait;
171
+ pointer-events: none;
172
+ }
173
+
174
+ .spinner {
175
+ display: inline-block;
176
+ width: 1em;
177
+ height: 1em;
178
+ border: 2px solid currentColor;
179
+ border-right-color: transparent;
180
+ border-radius: 50%;
181
+ animation: spin 600ms linear infinite;
182
+ }
183
+
184
+ @keyframes spin {
185
+ to { transform: rotate(360deg); }
186
+ }
187
+
188
+ @media (prefers-reduced-motion: reduce) {
189
+ .spinner {
190
+ animation: none;
191
+ }
192
+ }
193
+
194
+ .label {
195
+ display: inline-flex;
196
+ align-items: center;
197
+ gap: var(--spacing-tight);
198
+ }
199
+
200
+ :host([loading]) .label {
201
+ visibility: hidden;
202
+ }
203
+
204
+ .loading-container {
205
+ position: absolute;
206
+ }
207
+
208
+ .wrapper {
209
+ position: relative;
210
+ display: inline-flex;
211
+ align-items: center;
212
+ justify-content: center;
213
+ }
214
+ `;
215
+ __decorate([
216
+ property({ reflect: true })
217
+ ], RrButton.prototype, "variant", void 0);
218
+ __decorate([
219
+ property({ reflect: true })
220
+ ], RrButton.prototype, "size", void 0);
221
+ __decorate([
222
+ property({ type: Boolean, reflect: true })
223
+ ], RrButton.prototype, "disabled", void 0);
224
+ __decorate([
225
+ property({ type: Boolean, reflect: true })
226
+ ], RrButton.prototype, "loading", void 0);
227
+ __decorate([
228
+ property()
229
+ ], RrButton.prototype, "type", void 0);
230
+ __decorate([
231
+ property({ attribute: 'aria-label' })
232
+ ], RrButton.prototype, "ariaLabel", void 0);
233
+ RrButton = __decorate([
234
+ customElement('rr-button')
235
+ ], RrButton);
236
+ export { RrButton };
237
+ //# sourceMappingURL=button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.js","sourceRoot":"","sources":["../../src/button/button.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAK5D;;;;;;;;;;;;GAYG;AAEI,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,UAAU;IAyKtC;QACE,KAAK,EAAE,CAAC;QArBV,kHAAkH;QACrF,YAAO,GAAkB,SAAS,CAAC;QAEhE,wDAAwD;QAC3B,SAAI,GAAe,IAAI,CAAC;QAErD,sEAAsE;QAC1B,aAAQ,GAAG,KAAK,CAAC;QAE7D,0EAA0E;QAC9B,YAAO,GAAG,KAAK,CAAC;QAE5D,uDAAuD;QAC3C,SAAI,GAAkC,QAAQ,CAAC;QAE3D,wDAAwD;QACR,cAAS,GAAkB,IAAI,CAAC;QAM9E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3C,CAAC;IAEO,YAAY,CAAC,CAAQ;QAC3B,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,CAAC,CAAC,wBAAwB,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;gBAGC,IAAI,CAAC,IAAI;oBACL,IAAI,CAAC,QAAQ;wBACT,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;oBACpC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;qBAC9B,IAAI,CAAC,SAAS,IAAI,OAAO;iBAC7B,IAAI,CAAC,YAAY;;;YAGtB,IAAI,CAAC,OAAO;YACZ,CAAC,CAAC,IAAI,CAAA,yFAAyF;YAC/F,CAAC,CAAC,OAAO;;;;;;;;KAQhB,CAAC;IACJ,CAAC;;AA3MM,uBAAc,GAAG,IAAI,AAAP,CAAQ;AAEtB,0BAAiB,GAAG;IACzB,GAAG,UAAU,CAAC,iBAAiB;IAC/B,cAAc,EAAE,IAAI;CACrB,AAHuB,CAGtB;AAEK,eAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2IlB,AA3IY,CA2IX;AAG2B;IAA5B,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;yCAAoC;AAGnC;IAA5B,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;sCAAyB;AAGT;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;0CAAkB;AAGjB;IAA3C,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;yCAAiB;AAGhD;IAAX,QAAQ,EAAE;sCAAgD;AAGX;IAA/C,QAAQ,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;2CAA0C;AArKrE,QAAQ;IADpB,aAAa,CAAC,WAAW,CAAC;GACd,QAAQ,CA6MpB"}
@@ -0,0 +1,12 @@
1
+ import type { Meta, StoryObj } from '@storybook/web-components-vite';
2
+ import '@digital2analogue2/parsimony-components';
3
+ declare const meta: Meta;
4
+ export default meta;
5
+ type Story = StoryObj;
6
+ export declare const Primary: Story;
7
+ export declare const Secondary: Story;
8
+ export declare const Danger: Story;
9
+ export declare const Ghost: Story;
10
+ export declare const Loading: Story;
11
+ export declare const Sizes: Story;
12
+ //# sourceMappingURL=button.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.stories.d.ts","sourceRoot":"","sources":["../../src/button/button.stories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAErE,OAAO,yCAAyC,CAAC;AAEjD,QAAA,MAAM,IAAI,EAAE,IAyBX,CAAC;AACF,eAAe,IAAI,CAAC;AAEpB,KAAK,KAAK,GAAG,QAAQ,CAAC;AAEtB,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,SAAS,EAAE,KAA2D,CAAC;AAEpF,eAAO,MAAM,MAAM,EAAE,KAAwD,CAAC;AAE9E,eAAO,MAAM,KAAK,EAAE,KAAwD,CAAC;AAE7E,eAAO,MAAM,OAAO,EAAE,KAAmC,CAAC;AAE1D,eAAO,MAAM,KAAK,EAAE,KAQnB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { html } from 'lit';
2
+ import '@digital2analogue2/parsimony-components';
3
+ const meta = {
4
+ title: 'Components/Button',
5
+ component: 'rr-button',
6
+ argTypes: {
7
+ variant: { control: 'select', options: ['primary', 'secondary', 'danger', 'ghost'] },
8
+ size: { control: 'select', options: ['sm', 'md', 'lg'] },
9
+ disabled: { control: 'boolean' },
10
+ loading: { control: 'boolean' },
11
+ label: { control: 'text' },
12
+ },
13
+ args: {
14
+ variant: 'primary',
15
+ size: 'md',
16
+ disabled: false,
17
+ loading: false,
18
+ label: 'Save changes',
19
+ },
20
+ render: ({ variant, size, disabled, loading, label }) => html `
21
+ <rr-button
22
+ variant=${variant}
23
+ size=${size}
24
+ ?disabled=${disabled}
25
+ ?loading=${loading}
26
+ >${label}</rr-button>
27
+ `,
28
+ };
29
+ export default meta;
30
+ export const Primary = {};
31
+ export const Secondary = { args: { variant: 'secondary', label: 'Cancel' } };
32
+ export const Danger = { args: { variant: 'danger', label: 'Delete' } };
33
+ export const Ghost = { args: { variant: 'ghost', label: 'Dismiss' } };
34
+ export const Loading = { args: { loading: true } };
35
+ export const Sizes = {
36
+ render: () => html `
37
+ <div style="display: flex; align-items: center; gap: var(--spacing-inline);">
38
+ <rr-button size="small">Small</rr-button>
39
+ <rr-button size="medium">Medium</rr-button>
40
+ <rr-button size="large">Large</rr-button>
41
+ </div>
42
+ `,
43
+ };
44
+ //# sourceMappingURL=button.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.stories.js","sourceRoot":"","sources":["../../src/button/button.stories.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,yCAAyC,CAAC;AAEjD,MAAM,IAAI,GAAS;IACjB,KAAK,EAAE,mBAAmB;IAC1B,SAAS,EAAE,WAAW;IACtB,QAAQ,EAAE;QACR,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;QACpF,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;QACxD,QAAQ,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;QAChC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE;QAC/B,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;KAC3B;IACD,IAAI,EAAE;QACJ,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,IAAI;QACV,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,cAAc;KACtB;IACD,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,IAAI,CAAA;;gBAE/C,OAAO;aACV,IAAI;kBACC,QAAQ;iBACT,OAAO;OACjB,KAAK;GACT;CACF,CAAC;AACF,eAAe,IAAI,CAAC;AAIpB,MAAM,CAAC,MAAM,OAAO,GAAU,EAAE,CAAC;AAEjC,MAAM,CAAC,MAAM,SAAS,GAAU,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;AAEpF,MAAM,CAAC,MAAM,MAAM,GAAU,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC;AAE9E,MAAM,CAAC,MAAM,KAAK,GAAU,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC;AAE7E,MAAM,CAAC,MAAM,OAAO,GAAU,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;AAE1D,MAAM,CAAC,MAAM,KAAK,GAAU;IAC1B,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAA;;;;;;GAMjB;CACF,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { LitElement } from 'lit';
2
+ export type CardPadding = 'none' | 'sm' | 'md' | 'lg';
3
+ /**
4
+ * A surface container using the elevated background tier.
5
+ *
6
+ * Renders on `background.alt` with `border.default` and `radius.lg`.
7
+ * Composed of three optional slots — header, default body, footer —
8
+ * separated by hairline borders when adjacent content is present.
9
+ *
10
+ * @slot header - Card heading row (title, actions, avatar).
11
+ * @slot - Card body content.
12
+ * @slot footer - Card footer row (secondary actions, metadata).
13
+ *
14
+ * @cssprop --color-background-alt
15
+ * @cssprop --color-border-default
16
+ * @cssprop --radius-lg
17
+ */
18
+ export declare class RrCard extends LitElement {
19
+ static styles: import("lit").CSSResult;
20
+ /**
21
+ * Internal padding around the body slot.
22
+ * Header and footer padding is always fixed at `tight/element`.
23
+ */
24
+ padding: CardPadding;
25
+ render(): import("lit-html").TemplateResult<1>;
26
+ }
27
+ declare global {
28
+ interface HTMLElementTagNameMap {
29
+ 'rr-card': RrCard;
30
+ }
31
+ }
32
+ //# sourceMappingURL=card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"card.d.ts","sourceRoot":"","sources":["../../src/card/card.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEtD;;;;;;;;;;;;;;GAcG;AACH,qBACa,MAAO,SAAQ,UAAU;IACpC,MAAM,CAAC,MAAM,0BA0DX;IAEF;;;OAGG;IAEH,OAAO,EAAE,WAAW,CAAQ;IAE5B,MAAM;CAOP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,MAAM,CAAC;KACnB;CACF"}
@@ -0,0 +1,107 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { LitElement, html, css } from 'lit';
8
+ import { customElement, property } from 'lit/decorators.js';
9
+ /**
10
+ * A surface container using the elevated background tier.
11
+ *
12
+ * Renders on `background.alt` with `border.default` and `radius.lg`.
13
+ * Composed of three optional slots — header, default body, footer —
14
+ * separated by hairline borders when adjacent content is present.
15
+ *
16
+ * @slot header - Card heading row (title, actions, avatar).
17
+ * @slot - Card body content.
18
+ * @slot footer - Card footer row (secondary actions, metadata).
19
+ *
20
+ * @cssprop --color-background-alt
21
+ * @cssprop --color-border-default
22
+ * @cssprop --radius-lg
23
+ */
24
+ let RrCard = class RrCard extends LitElement {
25
+ constructor() {
26
+ super(...arguments);
27
+ /**
28
+ * Internal padding around the body slot.
29
+ * Header and footer padding is always fixed at `tight/element`.
30
+ */
31
+ this.padding = 'md';
32
+ }
33
+ render() {
34
+ return html `
35
+ <div class="header"><slot name="header"></slot></div>
36
+ <div class="body"><slot></slot></div>
37
+ <div class="footer"><slot name="footer"></slot></div>
38
+ `;
39
+ }
40
+ };
41
+ RrCard.styles = css `
42
+ :host {
43
+ display: block;
44
+ background: var(--color-background-alt);
45
+ border: 1px solid var(--color-border-alt);
46
+ border-radius: var(--radius-lg);
47
+ overflow: hidden;
48
+ }
49
+
50
+ /* ── Padding variants ────────────────────────────────────────── */
51
+ :host([padding='none']) .body {
52
+ padding: 0;
53
+ }
54
+
55
+ :host([padding='sm']) .body {
56
+ padding: var(--spacing-tight);
57
+ }
58
+
59
+ /* default (md) */
60
+ .body {
61
+ padding: var(--spacing-element);
62
+ }
63
+
64
+ :host([padding='lg']) .body {
65
+ padding: var(--spacing-component);
66
+ }
67
+
68
+ /* ── Header / footer ─────────────────────────────────────────── */
69
+ .header,
70
+ .footer {
71
+ display: block;
72
+ }
73
+
74
+ /* Hide header/footer wrapper when slot is empty */
75
+ .header:not(:has(*)),
76
+ .footer:not(:has(*)) {
77
+ display: none;
78
+ }
79
+
80
+ .header {
81
+ padding: var(--spacing-tight) var(--spacing-element);
82
+ border-bottom: 1px solid var(--color-border-alt);
83
+ font: var(--font-label-strong-medium);
84
+ color: var(--color-foreground-default);
85
+ }
86
+
87
+ .footer {
88
+ padding: var(--spacing-tight) var(--spacing-element);
89
+ border-top: 1px solid var(--color-border-alt);
90
+ color: var(--color-foreground-alt);
91
+ font: var(--font-label-small);
92
+ }
93
+
94
+ /* ── Body ────────────────────────────────────────────────────── */
95
+ .body {
96
+ display: block;
97
+ color: var(--color-foreground-default);
98
+ }
99
+ `;
100
+ __decorate([
101
+ property({ reflect: true })
102
+ ], RrCard.prototype, "padding", void 0);
103
+ RrCard = __decorate([
104
+ customElement('rr-card')
105
+ ], RrCard);
106
+ export { RrCard };
107
+ //# sourceMappingURL=card.js.map