@orange-halo/components 1.0.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 (138) hide show
  1. package/custom-elements.json +186 -0
  2. package/dist/base.d.ts +30 -0
  3. package/dist/base.d.ts.map +1 -0
  4. package/dist/base.js +78 -0
  5. package/dist/base.js.map +1 -0
  6. package/dist/index.d.ts +83 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +72 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/oh-accordion.d.ts +47 -0
  11. package/dist/oh-accordion.d.ts.map +1 -0
  12. package/dist/oh-accordion.js +387 -0
  13. package/dist/oh-accordion.js.map +1 -0
  14. package/dist/oh-alert.d.ts +48 -0
  15. package/dist/oh-alert.d.ts.map +1 -0
  16. package/dist/oh-alert.js +343 -0
  17. package/dist/oh-alert.js.map +1 -0
  18. package/dist/oh-badge.d.ts +38 -0
  19. package/dist/oh-badge.d.ts.map +1 -0
  20. package/dist/oh-badge.js +176 -0
  21. package/dist/oh-badge.js.map +1 -0
  22. package/dist/oh-breadcrumb.d.ts +39 -0
  23. package/dist/oh-breadcrumb.d.ts.map +1 -0
  24. package/dist/oh-breadcrumb.js +277 -0
  25. package/dist/oh-breadcrumb.js.map +1 -0
  26. package/dist/oh-button.d.ts +62 -0
  27. package/dist/oh-button.d.ts.map +1 -0
  28. package/dist/oh-button.figma.d.ts +2 -0
  29. package/dist/oh-button.figma.d.ts.map +1 -0
  30. package/dist/oh-button.figma.js +20 -0
  31. package/dist/oh-button.figma.js.map +1 -0
  32. package/dist/oh-button.js +490 -0
  33. package/dist/oh-button.js.map +1 -0
  34. package/dist/oh-card.d.ts +44 -0
  35. package/dist/oh-card.d.ts.map +1 -0
  36. package/dist/oh-card.js +340 -0
  37. package/dist/oh-card.js.map +1 -0
  38. package/dist/oh-checkbox-group.d.ts +39 -0
  39. package/dist/oh-checkbox-group.d.ts.map +1 -0
  40. package/dist/oh-checkbox-group.figma.d.ts +2 -0
  41. package/dist/oh-checkbox-group.figma.d.ts.map +1 -0
  42. package/dist/oh-checkbox-group.figma.js +24 -0
  43. package/dist/oh-checkbox-group.figma.js.map +1 -0
  44. package/dist/oh-checkbox-group.js +309 -0
  45. package/dist/oh-checkbox-group.js.map +1 -0
  46. package/dist/oh-checkbox.d.ts +50 -0
  47. package/dist/oh-checkbox.d.ts.map +1 -0
  48. package/dist/oh-checkbox.js +315 -0
  49. package/dist/oh-checkbox.js.map +1 -0
  50. package/dist/oh-cluster.d.ts +38 -0
  51. package/dist/oh-cluster.d.ts.map +1 -0
  52. package/dist/oh-cluster.js +141 -0
  53. package/dist/oh-cluster.js.map +1 -0
  54. package/dist/oh-container.d.ts +38 -0
  55. package/dist/oh-container.d.ts.map +1 -0
  56. package/dist/oh-container.js +116 -0
  57. package/dist/oh-container.js.map +1 -0
  58. package/dist/oh-drawer.d.ts +66 -0
  59. package/dist/oh-drawer.d.ts.map +1 -0
  60. package/dist/oh-drawer.js +284 -0
  61. package/dist/oh-drawer.js.map +1 -0
  62. package/dist/oh-footer.d.ts +40 -0
  63. package/dist/oh-footer.d.ts.map +1 -0
  64. package/dist/oh-footer.js +112 -0
  65. package/dist/oh-footer.js.map +1 -0
  66. package/dist/oh-grid.d.ts +40 -0
  67. package/dist/oh-grid.d.ts.map +1 -0
  68. package/dist/oh-grid.js +168 -0
  69. package/dist/oh-grid.js.map +1 -0
  70. package/dist/oh-hero.d.ts +28 -0
  71. package/dist/oh-hero.d.ts.map +1 -0
  72. package/dist/oh-hero.js +242 -0
  73. package/dist/oh-hero.js.map +1 -0
  74. package/dist/oh-icon.d.ts +44 -0
  75. package/dist/oh-icon.d.ts.map +1 -0
  76. package/dist/oh-icon.js +321 -0
  77. package/dist/oh-icon.js.map +1 -0
  78. package/dist/oh-input.d.ts +56 -0
  79. package/dist/oh-input.d.ts.map +1 -0
  80. package/dist/oh-input.figma.d.ts +2 -0
  81. package/dist/oh-input.figma.d.ts.map +1 -0
  82. package/dist/oh-input.figma.js +36 -0
  83. package/dist/oh-input.figma.js.map +1 -0
  84. package/dist/oh-input.js +320 -0
  85. package/dist/oh-input.js.map +1 -0
  86. package/dist/oh-link.d.ts +45 -0
  87. package/dist/oh-link.d.ts.map +1 -0
  88. package/dist/oh-link.js +392 -0
  89. package/dist/oh-link.js.map +1 -0
  90. package/dist/oh-modal.d.ts +54 -0
  91. package/dist/oh-modal.d.ts.map +1 -0
  92. package/dist/oh-modal.js +450 -0
  93. package/dist/oh-modal.js.map +1 -0
  94. package/dist/oh-navbar.d.ts +49 -0
  95. package/dist/oh-navbar.d.ts.map +1 -0
  96. package/dist/oh-navbar.js +185 -0
  97. package/dist/oh-navbar.js.map +1 -0
  98. package/dist/oh-progress.d.ts +56 -0
  99. package/dist/oh-progress.d.ts.map +1 -0
  100. package/dist/oh-progress.js +299 -0
  101. package/dist/oh-progress.js.map +1 -0
  102. package/dist/oh-radio-group.d.ts +43 -0
  103. package/dist/oh-radio-group.d.ts.map +1 -0
  104. package/dist/oh-radio-group.figma.d.ts +2 -0
  105. package/dist/oh-radio-group.figma.d.ts.map +1 -0
  106. package/dist/oh-radio-group.figma.js +22 -0
  107. package/dist/oh-radio-group.figma.js.map +1 -0
  108. package/dist/oh-radio-group.js +324 -0
  109. package/dist/oh-radio-group.js.map +1 -0
  110. package/dist/oh-radio.d.ts +50 -0
  111. package/dist/oh-radio.d.ts.map +1 -0
  112. package/dist/oh-radio.js +314 -0
  113. package/dist/oh-radio.js.map +1 -0
  114. package/dist/oh-select.d.ts +82 -0
  115. package/dist/oh-select.d.ts.map +1 -0
  116. package/dist/oh-select.js +638 -0
  117. package/dist/oh-select.js.map +1 -0
  118. package/dist/oh-skip-link.d.ts +37 -0
  119. package/dist/oh-skip-link.d.ts.map +1 -0
  120. package/dist/oh-skip-link.js +145 -0
  121. package/dist/oh-skip-link.js.map +1 -0
  122. package/dist/oh-stack.d.ts +36 -0
  123. package/dist/oh-stack.d.ts.map +1 -0
  124. package/dist/oh-stack.js +112 -0
  125. package/dist/oh-stack.js.map +1 -0
  126. package/dist/oh-tabs.d.ts +85 -0
  127. package/dist/oh-tabs.d.ts.map +1 -0
  128. package/dist/oh-tabs.js +417 -0
  129. package/dist/oh-tabs.js.map +1 -0
  130. package/dist/oh-toggle.d.ts +51 -0
  131. package/dist/oh-toggle.d.ts.map +1 -0
  132. package/dist/oh-toggle.js +219 -0
  133. package/dist/oh-toggle.js.map +1 -0
  134. package/dist/styles/typography.d.ts +15 -0
  135. package/dist/styles/typography.d.ts.map +1 -0
  136. package/dist/styles/typography.js +235 -0
  137. package/dist/styles/typography.js.map +1 -0
  138. package/package.json +140 -0
@@ -0,0 +1,340 @@
1
+ /**
2
+ * oh-card
3
+ *
4
+ * A tactile, raised surface with visible frame.
5
+ * Designed with the same layered construction as oh-button.
6
+ *
7
+ * DESIGN DECISIONS:
8
+ * ─────────────────
9
+ * 1. LAYERED CONSTRUCTION
10
+ * - Surface: subtle gradient for depth
11
+ * - Border: visible warm edge
12
+ * - Inner highlight: sunlit top edge
13
+ * - Outer shadow: soft, slightly offset
14
+ *
15
+ * 2. RETRO-MODERN DETAILS
16
+ * - Warm, tactile shadows (never harsh)
17
+ * - Visible border that warms on hover
18
+ * - Subtle gradient background
19
+ *
20
+ * 3. VARIANTS
21
+ * - Raised: default with layered depth
22
+ * - Sunlit: featured with warm gradient
23
+ * - Flat: border-only, minimal shadow
24
+ *
25
+ * @element oh-card
26
+ */
27
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
28
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
29
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
30
+ 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;
31
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
32
+ };
33
+ import { html, css, nothing } from "lit";
34
+ import { customElement, property } from "lit/decorators.js";
35
+ import { OhElement, baseStyles } from "./base.js";
36
+ let OhCard = class OhCard extends OhElement {
37
+ constructor() {
38
+ super(...arguments);
39
+ this.variant = "raised";
40
+ this.interactive = false;
41
+ this.padding = "md";
42
+ }
43
+ static { this.styles = [
44
+ baseStyles,
45
+ css `
46
+ /* ═══════════════════════════════════════════════════════════════
47
+ ORANGE HALO CARD
48
+ Tactile • Layered • Warm • Personal
49
+ ═══════════════════════════════════════════════════════════════ */
50
+
51
+ :host {
52
+ display: block;
53
+ }
54
+
55
+ /* ═══════════════════════════════════════════════════════════════
56
+ BASE CARD
57
+ Layered construction — feels like a physical object
58
+ ═══════════════════════════════════════════════════════════════ */
59
+
60
+ .card {
61
+ /* Shape: friendly rounded corners */
62
+ border-radius: var(--oh-radius-lg);
63
+ overflow: hidden;
64
+
65
+ transition:
66
+ transform var(--oh-motion-gentle) var(--oh-motion-ease-gentle),
67
+ box-shadow var(--oh-motion-gentle) var(--oh-motion-ease-gentle),
68
+ border-color var(--oh-motion-gentle) var(--oh-motion-ease-gentle);
69
+ }
70
+
71
+ /* ═══════════════════════════════════════════════════════════════
72
+ RAISED VARIANT (Default)
73
+ Subtle gradient surface with layered shadows
74
+ ═══════════════════════════════════════════════════════════════ */
75
+
76
+ .card--raised {
77
+ /* Surface: subtle gradient for depth */
78
+ background: linear-gradient(
79
+ 180deg,
80
+ #FFFFFF 0%,
81
+ #FAF7F2 40%,
82
+ #F5F0E8 100%
83
+ );
84
+
85
+ /* Border: visible warm edge */
86
+ border: 1px solid #E2D5C8;
87
+
88
+ /* Layered shadows:
89
+ 1. Outer: soft, offset shadow (tactile)
90
+ 2. Deeper: ambient depth
91
+ 3. Inner top: sunlit highlight */
92
+ box-shadow:
93
+ 0 2px 6px rgba(61, 50, 41, 0.08),
94
+ 0 6px 16px rgba(61, 50, 41, 0.05),
95
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
96
+ }
97
+
98
+ /* ═══════════════════════════════════════════════════════════════
99
+ SUNLIT VARIANT
100
+ Featured content with warm gradient and glow
101
+ ═══════════════════════════════════════════════════════════════ */
102
+
103
+ .card--sunlit {
104
+ /* Surface: warm sunlit gradient */
105
+ background: linear-gradient(
106
+ 180deg,
107
+ #FFFBF5 0%,
108
+ #FDF6EE 30%,
109
+ #F8EFE4 100%
110
+ );
111
+
112
+ /* Border: warm tinted edge */
113
+ border: 1px solid rgba(197, 67, 0, 0.2);
114
+
115
+ /* Layered shadows with warm glow */
116
+ box-shadow:
117
+ 0 2px 8px rgba(139, 69, 19, 0.08),
118
+ 0 8px 24px rgba(139, 69, 19, 0.06),
119
+ 0 0 20px rgba(197, 67, 0, 0.04),
120
+ inset 0 1px 0 rgba(255, 255, 255, 0.9);
121
+ }
122
+
123
+ /* ═══════════════════════════════════════════════════════════════
124
+ FLAT VARIANT
125
+ Border-only, minimal shadow — still layered
126
+ ═══════════════════════════════════════════════════════════════ */
127
+
128
+ .card--flat {
129
+ /* Surface: subtle gradient */
130
+ background: linear-gradient(
131
+ 180deg,
132
+ #FAFAF8 0%,
133
+ #F5F2EE 100%
134
+ );
135
+
136
+ /* Border: visible edge */
137
+ border: 1px solid #E2DCD2;
138
+
139
+ /* Minimal shadow */
140
+ box-shadow:
141
+ 0 1px 2px rgba(61, 50, 41, 0.04),
142
+ inset 0 1px 0 rgba(255, 255, 255, 0.6);
143
+ }
144
+
145
+ /* ═══════════════════════════════════════════════════════════════
146
+ INTERACTIVE STATES
147
+ Hover lifts, focus shows warm glow
148
+ ═══════════════════════════════════════════════════════════════ */
149
+
150
+ .card--interactive {
151
+ cursor: pointer;
152
+ }
153
+
154
+ /* Hover: warm light, lifted */
155
+ .card--interactive.card--raised:hover {
156
+ border-color: var(--oh-color-warm-dune);
157
+ box-shadow:
158
+ 0 4px 12px rgba(61, 50, 41, 0.1),
159
+ 0 12px 28px rgba(61, 50, 41, 0.08),
160
+ inset 0 1px 0 rgba(255, 255, 255, 0.9);
161
+ transform: translateY(-2px);
162
+ }
163
+
164
+ .card--interactive.card--sunlit:hover {
165
+ border-color: rgba(197, 67, 0, 0.35);
166
+ box-shadow:
167
+ 0 4px 12px rgba(139, 69, 19, 0.12),
168
+ 0 12px 32px rgba(139, 69, 19, 0.08),
169
+ 0 0 28px rgba(197, 67, 0, 0.06),
170
+ inset 0 1px 0 rgba(255, 255, 255, 1);
171
+ transform: translateY(-2px);
172
+ }
173
+
174
+ .card--interactive.card--flat:hover {
175
+ border-color: var(--oh-color-warm-dune);
176
+ box-shadow:
177
+ 0 2px 6px rgba(61, 50, 41, 0.08),
178
+ 0 6px 16px rgba(61, 50, 41, 0.05),
179
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
180
+ transform: translateY(-1px);
181
+ }
182
+
183
+ /* Active: pressed */
184
+ .card--interactive:active {
185
+ transform: translateY(0) !important;
186
+ }
187
+
188
+ .card--interactive.card--raised:active {
189
+ box-shadow:
190
+ 0 1px 3px rgba(61, 50, 41, 0.1),
191
+ 0 3px 8px rgba(61, 50, 41, 0.06),
192
+ inset 0 1px 2px rgba(61, 50, 41, 0.04);
193
+ }
194
+
195
+ /* Focus: warm glow ring */
196
+ .card--interactive:focus-visible {
197
+ outline: none;
198
+ }
199
+
200
+ .card--interactive.card--raised:focus-visible,
201
+ .card--interactive.card--flat:focus-visible {
202
+ border-color: var(--oh-color-brand-primary);
203
+ box-shadow:
204
+ 0 0 0 3px rgba(197, 67, 0, 0.25),
205
+ 0 0 16px rgba(197, 67, 0, 0.1),
206
+ 0 2px 6px rgba(61, 50, 41, 0.08),
207
+ inset 0 1px 0 rgba(255, 255, 255, 0.8);
208
+ }
209
+
210
+ .card--interactive.card--sunlit:focus-visible {
211
+ border-color: rgba(197, 67, 0, 0.5);
212
+ box-shadow:
213
+ 0 0 0 3px rgba(197, 67, 0, 0.3),
214
+ 0 0 20px rgba(197, 67, 0, 0.15),
215
+ 0 2px 8px rgba(139, 69, 19, 0.08),
216
+ inset 0 1px 0 rgba(255, 255, 255, 0.9);
217
+ }
218
+
219
+ /* ═══════════════════════════════════════════════════════════════
220
+ PADDING VARIANTS
221
+ ═══════════════════════════════════════════════════════════════ */
222
+
223
+ .card--padding-sm .content { padding: var(--oh-spacing-3-5); }
224
+ .card--padding-md .content { padding: var(--oh-spacing-5); }
225
+ .card--padding-lg .content { padding: var(--oh-spacing-7); }
226
+
227
+ /* ═══════════════════════════════════════════════════════════════
228
+ SLOTS: Header, Content, Footer
229
+ ═══════════════════════════════════════════════════════════════ */
230
+
231
+ .header {
232
+ padding: var(--oh-spacing-4) var(--oh-spacing-5);
233
+ border-bottom: 1px solid rgba(226, 213, 200, 0.6);
234
+ background: linear-gradient(
235
+ 180deg,
236
+ rgba(255, 255, 255, 0.5) 0%,
237
+ rgba(255, 255, 255, 0) 100%
238
+ );
239
+ }
240
+
241
+ .header:empty { display: none; }
242
+
243
+ .content {
244
+ /* Padding handled by variant */
245
+ }
246
+
247
+ .footer {
248
+ padding: var(--oh-spacing-4) var(--oh-spacing-5);
249
+ border-top: 1px solid rgba(226, 213, 200, 0.6);
250
+ background: linear-gradient(
251
+ 180deg,
252
+ var(--oh-color-surface-raised) 0%,
253
+ var(--oh-color-surface-inset) 100%
254
+ );
255
+ }
256
+
257
+ .footer:empty { display: none; }
258
+
259
+ /* Padding adjustments for slots */
260
+ .card--padding-sm .header,
261
+ .card--padding-sm .footer {
262
+ padding: var(--oh-spacing-2-5) var(--oh-spacing-3-5);
263
+ }
264
+
265
+ .card--padding-lg .header,
266
+ .card--padding-lg .footer {
267
+ padding: var(--oh-spacing-5) var(--oh-spacing-7);
268
+ }
269
+
270
+ /* ═══════════════════════════════════════════════════════════════
271
+ REDUCED MOTION
272
+ ═══════════════════════════════════════════════════════════════ */
273
+
274
+ @media (prefers-reduced-motion: reduce) {
275
+ .card {
276
+ transition-duration: 0.01ms !important;
277
+ }
278
+
279
+ .card--interactive:hover {
280
+ transform: none !important;
281
+ }
282
+ }
283
+ `,
284
+ ]; }
285
+ _handleClick(event) {
286
+ if (this.interactive) {
287
+ this.emit("oh-click", { originalEvent: event });
288
+ }
289
+ }
290
+ _handleKeyDown(event) {
291
+ if (this.interactive && (event.key === "Enter" || event.key === " ")) {
292
+ event.preventDefault();
293
+ this._handleClick(event);
294
+ }
295
+ }
296
+ render() {
297
+ const classes = this.classMap({
298
+ card: true,
299
+ [`card--${this.variant}`]: true,
300
+ [`card--padding-${this.padding}`]: true,
301
+ "card--interactive": this.interactive,
302
+ });
303
+ return html `
304
+ <div
305
+ part="card"
306
+ class=${classes}
307
+ role=${this.interactive ? "button" : nothing}
308
+ tabindex=${this.interactive ? "0" : nothing}
309
+ @click=${this._handleClick}
310
+ @keydown=${this._handleKeyDown}
311
+ >
312
+ <div class="header" part="header">
313
+ <slot name="header"></slot>
314
+ </div>
315
+
316
+ <div class="content" part="content">
317
+ <slot></slot>
318
+ </div>
319
+
320
+ <div class="footer" part="footer">
321
+ <slot name="footer"></slot>
322
+ </div>
323
+ </div>
324
+ `;
325
+ }
326
+ };
327
+ __decorate([
328
+ property({ type: String, reflect: true })
329
+ ], OhCard.prototype, "variant", void 0);
330
+ __decorate([
331
+ property({ type: Boolean, reflect: true })
332
+ ], OhCard.prototype, "interactive", void 0);
333
+ __decorate([
334
+ property({ type: String, reflect: true })
335
+ ], OhCard.prototype, "padding", void 0);
336
+ OhCard = __decorate([
337
+ customElement("oh-card")
338
+ ], OhCard);
339
+ export { OhCard };
340
+ //# sourceMappingURL=oh-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oh-card.js","sourceRoot":"","sources":["../src/oh-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;;;;;AAEH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAM3C,IAAM,MAAM,GAAZ,MAAM,MAAO,SAAQ,SAAS;IAA9B;;QAqPL,YAAO,GAAgB,QAAQ,CAAC;QAGhC,gBAAW,GAAG,KAAK,CAAC;QAGpB,YAAO,GAAgB,IAAI,CAAC;IA8C9B,CAAC;aAxSiB,WAAM,GAAG;QACvB,UAAU;QACV,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8OF;KACF,AAjPqB,CAiPpB;IAWM,YAAY,CAAC,KAAiB;QACpC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,KAAoB;QACzC,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;YACrE,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,KAA8B,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,MAAM;QACJ,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC5B,IAAI,EAAE,IAAI;YACV,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI;YAC/B,CAAC,iBAAiB,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI;YACvC,mBAAmB,EAAE,IAAI,CAAC,WAAW;SACtC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAA;;;gBAGC,OAAO;eACR,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO;mBACjC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO;iBAClC,IAAI,CAAC,YAAY;mBACf,IAAI,CAAC,cAAc;;;;;;;;;;;;;;KAcjC,CAAC;IACJ,CAAC;;AAnDD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;uCACV;AAGhC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;2CACvB;AAGpB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;uCACd;AA3PjB,MAAM;IADlB,aAAa,CAAC,SAAS,CAAC;GACZ,MAAM,CAySlB"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * oh-checkbox-group
3
+ *
4
+ * A checkbox group with proper semantics and group-level error handling.
5
+ * For single checkboxes, use oh-checkbox directly.
6
+ *
7
+ * ACCESSIBILITY:
8
+ * ─────────────
9
+ * - Uses <fieldset> and <legend> for proper semantics
10
+ * - Group-level error messaging with aria-describedby
11
+ * - Visible focus ring (outline, not inset)
12
+ * - aria-invalid for error state
13
+ *
14
+ * @element oh-checkbox-group
15
+ */
16
+ import { OhElement } from "./base.js";
17
+ export interface CheckboxOption {
18
+ label: string;
19
+ value: string;
20
+ checked?: boolean;
21
+ }
22
+ export declare class OhCheckboxGroup extends OhElement {
23
+ static styles: import("lit").CSSResult[];
24
+ legend: string;
25
+ name: string;
26
+ options: CheckboxOption[];
27
+ value: string[];
28
+ required: boolean;
29
+ error: boolean;
30
+ errorMessage: string;
31
+ private _handleChange;
32
+ render(): import("lit").TemplateResult<1>;
33
+ }
34
+ declare global {
35
+ interface HTMLElementTagNameMap {
36
+ "oh-checkbox-group": OhCheckboxGroup;
37
+ }
38
+ }
39
+ //# sourceMappingURL=oh-checkbox-group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oh-checkbox-group.d.ts","sourceRoot":"","sources":["../src/oh-checkbox-group.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBACa,eAAgB,SAAQ,SAAS;IAC5C,OAAgB,MAAM,4BAgMpB;IAGF,MAAM,SAAM;IAGZ,IAAI,SAAM;IAGV,OAAO,EAAE,cAAc,EAAE,CAAM;IAG/B,KAAK,EAAE,MAAM,EAAE,CAAM;IAGrB,QAAQ,UAAS;IAGjB,KAAK,UAAS;IAGd,YAAY,SAAM;IAElB,OAAO,CAAC,aAAa;IAYrB,MAAM;CA8CP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,mBAAmB,EAAE,eAAe,CAAC;KACtC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=oh-checkbox-group.figma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oh-checkbox-group.figma.d.ts","sourceRoot":"","sources":["../src/oh-checkbox-group.figma.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import figma, { html } from "@figma/code-connect/html";
2
+ /**
3
+ * Code Connect for oh-checkbox-group
4
+ *
5
+ * Replace the Figma URL below with your actual component URL.
6
+ */
7
+ figma.connect("https://www.figma.com/design/q9ZYrOj2w9DrTVmgQFU7bu/OHDS?node-id=1-77", {
8
+ props: {
9
+ legend: figma.string("Legend"),
10
+ required: figma.boolean("Required"),
11
+ error: figma.boolean("Error"),
12
+ errorMessage: figma.string("Error Message"),
13
+ },
14
+ example: (props) => html `
15
+ <oh-checkbox-group
16
+ legend="${props.legend}"
17
+ ?required="${props.required}"
18
+ ?error="${props.error}"
19
+ error-message="${props.errorMessage}"
20
+ .options="\${options}"
21
+ ></oh-checkbox-group>
22
+ `,
23
+ });
24
+ //# sourceMappingURL=oh-checkbox-group.figma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oh-checkbox-group.figma.js","sourceRoot":"","sources":["../src/oh-checkbox-group.figma.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;GAIG;AAEH,KAAK,CAAC,OAAO,CACX,uEAAuE,EACvE;IACE,KAAK,EAAE;QACL,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC9B,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;QACnC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAC7B,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,eAAe,CAAC;KAC5C;IACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAA;;kBAEV,KAAK,CAAC,MAAM;qBACT,KAAK,CAAC,QAAQ;kBACjB,KAAK,CAAC,KAAK;yBACJ,KAAK,CAAC,YAAY;;;KAGtC;CACF,CACF,CAAC"}