@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,638 @@
1
+ /**
2
+ * oh-select
3
+ *
4
+ * A chunky, playful dropdown select with hand-crafted feel.
5
+ * Custom-styled dropdown (not native) for full visual control.
6
+ *
7
+ * DESIGN DECISIONS:
8
+ * ─────────────────
9
+ * 1. CHUNKY & TACTILE
10
+ * - Thick 2.5px border
11
+ * - Offset shadow (sticker effect like button)
12
+ * - 10px border radius
13
+ * - Solid warm fills
14
+ *
15
+ * 2. DROPDOWN PANEL
16
+ * - Appears below trigger with shadow
17
+ * - Options have hover/focus states
18
+ * - Selected option highlighted
19
+ * - Smooth open/close animation
20
+ *
21
+ * 3. ACCESSIBILITY
22
+ * - role="combobox" with proper ARIA
23
+ * - Keyboard navigation (arrows, enter, escape, home, end)
24
+ * - Type-ahead search
25
+ * - Focus management
26
+ * - Label always required
27
+ *
28
+ * @element oh-select
29
+ */
30
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
31
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
32
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
33
+ 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;
34
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
35
+ };
36
+ import { html, css, nothing } from "lit";
37
+ import { customElement, property, state, query } from "lit/decorators.js";
38
+ import { OhElement, baseStyles } from "./base.js";
39
+ let OhSelect = class OhSelect extends OhElement {
40
+ constructor() {
41
+ super(...arguments);
42
+ this.label = "";
43
+ this.placeholder = "Select an option";
44
+ this.name = "";
45
+ this.options = [];
46
+ this.value = "";
47
+ this.required = false;
48
+ this.helperText = "";
49
+ this.errorText = "";
50
+ this._open = false;
51
+ this._highlightedIndex = -1;
52
+ this._focused = false;
53
+ this._labelId = `oh-select-label-${Math.random().toString(36).substr(2, 9)}`;
54
+ this._listboxId = `oh-select-listbox-${Math.random().toString(36).substr(2, 9)}`;
55
+ this._errorId = `oh-select-error-${Math.random().toString(36).substr(2, 9)}`;
56
+ this._typeaheadBuffer = "";
57
+ this._typeaheadTimeout = null;
58
+ this._handleClickOutside = (event) => {
59
+ if (!this.contains(event.target)) {
60
+ this._close_dropdown();
61
+ }
62
+ };
63
+ }
64
+ static { this.styles = [
65
+ baseStyles,
66
+ css `
67
+ /* ═══════════════════════════════════════════════════════════════
68
+ ORANGE HALO SELECT
69
+ Chunky • Playful • Tactile Dropdown
70
+ ═══════════════════════════════════════════════════════════════ */
71
+
72
+ :host {
73
+ display: block;
74
+ position: relative;
75
+ }
76
+
77
+ .select-wrapper {
78
+ display: flex;
79
+ flex-direction: column;
80
+ gap: var(--oh-spacing-2);
81
+ }
82
+
83
+ /* ─── Label ─── */
84
+ .label {
85
+ font-family: var(--oh-font-family-sans);
86
+ font-size: var(--oh-font-size-base);
87
+ font-weight: var(--oh-font-weight-semibold);
88
+ color: var(--oh-color-text-primary);
89
+ letter-spacing: var(--oh-font-letter-spacing-wide);
90
+ }
91
+
92
+ .label--required::after {
93
+ content: " *";
94
+ color: var(--oh-color-feedback-error);
95
+ }
96
+
97
+ /* ═══════════════════════════════════════════════════════════════
98
+ TRIGGER BUTTON
99
+ The clickable area that opens the dropdown
100
+ ═══════════════════════════════════════════════════════════════ */
101
+
102
+ .trigger {
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: space-between;
106
+ gap: var(--oh-spacing-3);
107
+ width: 100%;
108
+ min-height: var(--oh-input-size-md-min-height);
109
+ padding: var(--oh-spacing-3) var(--oh-spacing-4);
110
+
111
+ font-family: var(--oh-font-family-sans);
112
+ font-size: var(--oh-font-size-lg);
113
+ color: var(--oh-color-text-primary);
114
+ text-align: left;
115
+
116
+ background-color: var(--oh-color-surface-base);
117
+ border: var(--oh-input-base-border-width) solid var(--oh-color-border-emphasis);
118
+ border-radius: var(--oh-radius-md);
119
+ box-shadow: 4px 4px 0 0 var(--oh-shadow-secondary);
120
+
121
+ cursor: pointer;
122
+ -webkit-appearance: none;
123
+ -moz-appearance: none;
124
+ appearance: none;
125
+
126
+ transition:
127
+ transform var(--oh-motion-snappy) var(--oh-motion-ease-playful),
128
+ box-shadow var(--oh-motion-snappy) var(--oh-motion-ease-playful),
129
+ border-color var(--oh-motion-snappy) ease,
130
+ background-color var(--oh-motion-quick) ease;
131
+ }
132
+
133
+ .trigger__text {
134
+ flex: 1;
135
+ overflow: hidden;
136
+ text-overflow: ellipsis;
137
+ white-space: nowrap;
138
+ }
139
+
140
+ .trigger__text--placeholder {
141
+ color: var(--oh-color-text-secondary);
142
+ }
143
+
144
+ .trigger__icon {
145
+ flex-shrink: 0;
146
+ width: 20px;
147
+ height: 20px;
148
+ color: var(--oh-color-text-secondary);
149
+ transition: transform var(--oh-motion-gentle) ease;
150
+ }
151
+
152
+ .trigger__icon--open {
153
+ transform: rotate(180deg);
154
+ }
155
+
156
+ /* ─── Trigger States ─── */
157
+ .trigger:hover {
158
+ border-color: var(--oh-color-border-hover);
159
+ transform: translate(-2px, -2px);
160
+ box-shadow: 6px 6px 0 0 var(--oh-shadow-secondary);
161
+ }
162
+
163
+ .trigger:active {
164
+ transform: translate(1px, 1px);
165
+ box-shadow: 2px 2px 0 0 var(--oh-shadow-secondary);
166
+ }
167
+
168
+ .trigger--open {
169
+ border-color: var(--oh-color-border-focus);
170
+ background-color: var(--oh-color-surface-white);
171
+ }
172
+
173
+ /* Focus: underline trigger text (accessible indicator, like button) */
174
+ .trigger:focus {
175
+ outline: none;
176
+ }
177
+
178
+ .trigger:focus-visible .trigger__text,
179
+ .trigger--focused .trigger__text {
180
+ text-decoration: underline;
181
+ text-underline-offset: var(--oh-spacing-1);
182
+ }
183
+
184
+ /* Reorder for CSS sibling selector - label comes after trigger visually via flex order */
185
+ .label-container {
186
+ order: -1;
187
+ }
188
+
189
+ /* ═══════════════════════════════════════════════════════════════
190
+ DROPDOWN PANEL
191
+ ═══════════════════════════════════════════════════════════════ */
192
+
193
+ .dropdown {
194
+ position: absolute;
195
+ top: 100%;
196
+ left: 0;
197
+ right: 0;
198
+ z-index: var(--oh-z-index-dropdown);
199
+ margin-top: var(--oh-spacing-1);
200
+
201
+ background-color: var(--oh-color-surface-white);
202
+ border: var(--oh-input-base-border-width) solid var(--oh-color-border-emphasis);
203
+ border-radius: var(--oh-radius-md);
204
+ box-shadow: 6px 6px 0 0 var(--oh-shadow-secondary);
205
+
206
+ max-height: 0;
207
+ overflow: hidden;
208
+ opacity: 0;
209
+ transform: translateY(-8px);
210
+
211
+ transition:
212
+ max-height var(--oh-motion-gentle) ease,
213
+ opacity var(--oh-motion-snappy) ease,
214
+ transform var(--oh-motion-snappy) var(--oh-motion-ease-playful);
215
+ }
216
+
217
+ .dropdown--open {
218
+ max-height: 280px;
219
+ overflow-y: auto;
220
+ opacity: 1;
221
+ transform: translateY(0);
222
+ }
223
+
224
+ .dropdown[role="listbox"] {
225
+ list-style: none;
226
+ margin: 0;
227
+ padding: var(--oh-spacing-2) 0;
228
+ }
229
+
230
+ /* ─── Option ─── */
231
+ .option {
232
+ display: flex;
233
+ align-items: center;
234
+ gap: var(--oh-spacing-3);
235
+ padding: var(--oh-spacing-3) var(--oh-spacing-4);
236
+
237
+ font-family: var(--oh-font-family-sans);
238
+ font-size: var(--oh-font-size-lg);
239
+ color: var(--oh-color-text-primary);
240
+
241
+ cursor: pointer;
242
+ transition: background-color var(--oh-motion-quick) ease;
243
+ }
244
+
245
+ .option:hover,
246
+ .option--highlighted {
247
+ background-color: var(--oh-color-surface-base);
248
+ }
249
+
250
+ /* Keyboard navigation: underline highlighted option */
251
+ .option--highlighted {
252
+ text-decoration: underline;
253
+ text-underline-offset: var(--oh-spacing-1);
254
+ }
255
+
256
+ .option--selected {
257
+ background-color: var(--oh-color-surface-hover);
258
+ font-weight: var(--oh-font-weight-semibold);
259
+ }
260
+
261
+ .option--selected::before {
262
+ content: '';
263
+ width: 8px;
264
+ height: 8px;
265
+ background-color: var(--oh-color-brand-primary);
266
+ border-radius: var(--oh-radius-full);
267
+ flex-shrink: 0;
268
+ }
269
+
270
+ /* ═══════════════════════════════════════════════════════════════
271
+ ERROR STATE
272
+ ═══════════════════════════════════════════════════════════════ */
273
+
274
+ .trigger--error {
275
+ border-color: var(--oh-color-feedback-error);
276
+ box-shadow: 4px 4px 0 0 var(--oh-shadow-error);
277
+ }
278
+
279
+ .trigger--error:hover {
280
+ border-color: var(--oh-color-feedback-error-hover);
281
+ box-shadow: 6px 6px 0 0 var(--oh-shadow-error);
282
+ }
283
+
284
+ .helper {
285
+ font-family: var(--oh-font-family-sans);
286
+ font-size: var(--oh-font-size-base);
287
+ color: var(--oh-color-text-secondary);
288
+ }
289
+
290
+ .error-message {
291
+ display: flex;
292
+ align-items: center;
293
+ gap: var(--oh-spacing-2);
294
+ font-family: var(--oh-font-family-sans);
295
+ font-size: var(--oh-font-size-base);
296
+ color: var(--oh-color-feedback-error);
297
+ margin-bottom: var(--oh-spacing-2);
298
+ }
299
+
300
+ .error-icon {
301
+ flex-shrink: 0;
302
+ width: var(--oh-spacing-4);
303
+ height: var(--oh-spacing-4);
304
+ }
305
+
306
+ /* ═══════════════════════════════════════════════════════════════
307
+ REDUCED MOTION
308
+ ═══════════════════════════════════════════════════════════════ */
309
+
310
+ @media (prefers-reduced-motion: reduce) {
311
+ .trigger,
312
+ .dropdown,
313
+ .trigger__icon,
314
+ .option {
315
+ transition-duration: 0.01ms !important;
316
+ }
317
+ }
318
+ `,
319
+ ]; }
320
+ get _selectedOption() {
321
+ return this.options.find(opt => opt.value === this.value);
322
+ }
323
+ _open_dropdown() {
324
+ this._open = true;
325
+ this._highlightedIndex = this.options.findIndex(opt => opt.value === this.value);
326
+ if (this._highlightedIndex === -1 && this.options.length > 0) {
327
+ this._highlightedIndex = 0;
328
+ }
329
+ }
330
+ _close_dropdown() {
331
+ this._open = false;
332
+ this._highlightedIndex = -1;
333
+ }
334
+ _toggle_dropdown() {
335
+ if (this._open) {
336
+ this._close_dropdown();
337
+ }
338
+ else {
339
+ this._open_dropdown();
340
+ }
341
+ }
342
+ _selectOption(option) {
343
+ this.value = option.value;
344
+ this._close_dropdown();
345
+ this._trigger?.focus();
346
+ this.emit("oh-change", { value: this.value });
347
+ }
348
+ _handleTriggerClick() {
349
+ this._toggle_dropdown();
350
+ }
351
+ _handleTriggerKeydown(event) {
352
+ switch (event.key) {
353
+ case "Enter":
354
+ case " ":
355
+ event.preventDefault();
356
+ if (this._open && this._highlightedIndex >= 0) {
357
+ const option = this.options[this._highlightedIndex];
358
+ if (option) {
359
+ this._selectOption(option);
360
+ }
361
+ }
362
+ else {
363
+ this._open_dropdown();
364
+ }
365
+ break;
366
+ case "ArrowDown":
367
+ event.preventDefault();
368
+ if (!this._open) {
369
+ this._open_dropdown();
370
+ }
371
+ else {
372
+ this._highlightNext();
373
+ }
374
+ break;
375
+ case "ArrowUp":
376
+ event.preventDefault();
377
+ if (!this._open) {
378
+ this._open_dropdown();
379
+ }
380
+ else {
381
+ this._highlightPrevious();
382
+ }
383
+ break;
384
+ case "Home":
385
+ event.preventDefault();
386
+ if (this._open) {
387
+ this._highlightFirst();
388
+ }
389
+ break;
390
+ case "End":
391
+ event.preventDefault();
392
+ if (this._open) {
393
+ this._highlightLast();
394
+ }
395
+ break;
396
+ case "Escape":
397
+ if (this._open) {
398
+ event.preventDefault();
399
+ this._close_dropdown();
400
+ }
401
+ break;
402
+ case "Tab":
403
+ if (this._open) {
404
+ this._close_dropdown();
405
+ }
406
+ break;
407
+ default:
408
+ // Type-ahead search
409
+ if (event.key.length === 1 && !event.ctrlKey && !event.metaKey) {
410
+ this._handleTypeahead(event.key);
411
+ }
412
+ break;
413
+ }
414
+ }
415
+ _handleTypeahead(char) {
416
+ this._typeaheadBuffer += char.toLowerCase();
417
+ if (this._typeaheadTimeout) {
418
+ clearTimeout(this._typeaheadTimeout);
419
+ }
420
+ this._typeaheadTimeout = window.setTimeout(() => {
421
+ this._typeaheadBuffer = "";
422
+ }, 500);
423
+ const matchIndex = this.options.findIndex(opt => opt.label.toLowerCase().startsWith(this._typeaheadBuffer));
424
+ if (matchIndex >= 0) {
425
+ if (this._open) {
426
+ this._highlightedIndex = matchIndex;
427
+ }
428
+ else {
429
+ this._selectOption(this.options[matchIndex]);
430
+ }
431
+ }
432
+ }
433
+ _highlightNext() {
434
+ if (this.options.length === 0)
435
+ return;
436
+ this._highlightedIndex = (this._highlightedIndex + 1) % this.options.length;
437
+ this._scrollToHighlighted();
438
+ }
439
+ _highlightPrevious() {
440
+ if (this.options.length === 0)
441
+ return;
442
+ this._highlightedIndex = this._highlightedIndex <= 0
443
+ ? this.options.length - 1
444
+ : this._highlightedIndex - 1;
445
+ this._scrollToHighlighted();
446
+ }
447
+ _highlightFirst() {
448
+ if (this.options.length === 0)
449
+ return;
450
+ this._highlightedIndex = 0;
451
+ this._scrollToHighlighted();
452
+ }
453
+ _highlightLast() {
454
+ if (this.options.length === 0)
455
+ return;
456
+ this._highlightedIndex = this.options.length - 1;
457
+ this._scrollToHighlighted();
458
+ }
459
+ _scrollToHighlighted() {
460
+ requestAnimationFrame(() => {
461
+ const highlighted = this._listbox?.querySelector('.option--highlighted');
462
+ highlighted?.scrollIntoView({ block: 'nearest' });
463
+ });
464
+ }
465
+ _handleOptionClick(option, event) {
466
+ event.preventDefault();
467
+ event.stopPropagation();
468
+ this._selectOption(option);
469
+ }
470
+ _handleOptionMouseenter(index) {
471
+ this._highlightedIndex = index;
472
+ }
473
+ _handleFocus() {
474
+ this._focused = true;
475
+ }
476
+ _handleBlur(event) {
477
+ // Check if focus is moving outside the component
478
+ const relatedTarget = event.relatedTarget;
479
+ if (!this.contains(relatedTarget)) {
480
+ this._focused = false;
481
+ this._close_dropdown();
482
+ }
483
+ }
484
+ connectedCallback() {
485
+ super.connectedCallback();
486
+ document.addEventListener('click', this._handleClickOutside);
487
+ }
488
+ disconnectedCallback() {
489
+ super.disconnectedCallback();
490
+ document.removeEventListener('click', this._handleClickOutside);
491
+ }
492
+ render() {
493
+ const hasError = !!this.errorText;
494
+ const selectedLabel = this._selectedOption?.label;
495
+ const triggerClasses = this.classMap({
496
+ trigger: true,
497
+ "trigger--open": this._open,
498
+ "trigger--error": hasError,
499
+ "trigger--focused": this._focused,
500
+ });
501
+ return html `
502
+ <div class="select-wrapper">
503
+ <div class="label-container">
504
+ ${this.label
505
+ ? html `
506
+ <label
507
+ id=${this._labelId}
508
+ class="label ${this.required ? "label--required" : ""}"
509
+ >
510
+ ${this.label}
511
+ </label>
512
+ `
513
+ : nothing}
514
+ </div>
515
+
516
+ ${hasError
517
+ ? html `
518
+ <div id=${this._errorId} class="error-message" role="alert">
519
+ <svg class="error-icon" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
520
+ <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd" />
521
+ </svg>
522
+ ${this.errorText}
523
+ </div>
524
+ `
525
+ : nothing}
526
+
527
+ <button
528
+ type="button"
529
+ class=${triggerClasses}
530
+ role="combobox"
531
+ aria-expanded=${this._open}
532
+ aria-haspopup="listbox"
533
+ aria-labelledby=${this.label ? this._labelId : nothing}
534
+ aria-controls=${this._listboxId}
535
+ aria-activedescendant=${this._open && this._highlightedIndex >= 0
536
+ ? `option-${this._highlightedIndex}`
537
+ : nothing}
538
+ aria-required=${this.required ? "true" : nothing}
539
+ aria-invalid=${hasError ? "true" : nothing}
540
+ aria-describedby=${hasError ? this._errorId : nothing}
541
+ @click=${this._handleTriggerClick}
542
+ @keydown=${this._handleTriggerKeydown}
543
+ @focus=${this._handleFocus}
544
+ @blur=${this._handleBlur}
545
+ >
546
+ <span class="trigger__text ${!selectedLabel ? 'trigger__text--placeholder' : ''}">
547
+ ${selectedLabel || this.placeholder}
548
+ </span>
549
+ <svg
550
+ class="trigger__icon ${this._open ? 'trigger__icon--open' : ''}"
551
+ viewBox="0 0 20 20"
552
+ fill="currentColor"
553
+ aria-hidden="true"
554
+ >
555
+ <path fill-rule="evenodd" d="M5.23 7.21a.75.75 0 011.06.02L10 11.168l3.71-3.938a.75.75 0 111.08 1.04l-4.25 4.5a.75.75 0 01-1.08 0l-4.25-4.5a.75.75 0 01.02-1.06z" clip-rule="evenodd" />
556
+ </svg>
557
+ </button>
558
+
559
+ <ul
560
+ class="dropdown ${this._open ? 'dropdown--open' : ''}"
561
+ role="listbox"
562
+ id=${this._listboxId}
563
+ aria-labelledby=${this.label ? this._labelId : nothing}
564
+ >
565
+ ${this.options.map((option, index) => {
566
+ const isSelected = option.value === this.value;
567
+ const isHighlighted = index === this._highlightedIndex;
568
+ const optionClasses = this.classMap({
569
+ option: true,
570
+ "option--selected": isSelected,
571
+ "option--highlighted": isHighlighted,
572
+ });
573
+ return html `
574
+ <li
575
+ id="option-${index}"
576
+ class=${optionClasses}
577
+ role="option"
578
+ aria-selected=${isSelected}
579
+ @click=${(e) => this._handleOptionClick(option, e)}
580
+ @mouseenter=${() => this._handleOptionMouseenter(index)}
581
+ >
582
+ ${option.label}
583
+ </li>
584
+ `;
585
+ })}
586
+ </ul>
587
+
588
+ ${this.helperText && !hasError
589
+ ? html `<span class="helper">${this.helperText}</span>`
590
+ : nothing}
591
+ </div>
592
+ `;
593
+ }
594
+ };
595
+ __decorate([
596
+ property({ type: String })
597
+ ], OhSelect.prototype, "label", void 0);
598
+ __decorate([
599
+ property({ type: String })
600
+ ], OhSelect.prototype, "placeholder", void 0);
601
+ __decorate([
602
+ property({ type: String })
603
+ ], OhSelect.prototype, "name", void 0);
604
+ __decorate([
605
+ property({ type: Array })
606
+ ], OhSelect.prototype, "options", void 0);
607
+ __decorate([
608
+ property({ type: String })
609
+ ], OhSelect.prototype, "value", void 0);
610
+ __decorate([
611
+ property({ type: Boolean, reflect: true })
612
+ ], OhSelect.prototype, "required", void 0);
613
+ __decorate([
614
+ property({ type: String })
615
+ ], OhSelect.prototype, "helperText", void 0);
616
+ __decorate([
617
+ property({ type: String })
618
+ ], OhSelect.prototype, "errorText", void 0);
619
+ __decorate([
620
+ state()
621
+ ], OhSelect.prototype, "_open", void 0);
622
+ __decorate([
623
+ state()
624
+ ], OhSelect.prototype, "_highlightedIndex", void 0);
625
+ __decorate([
626
+ state()
627
+ ], OhSelect.prototype, "_focused", void 0);
628
+ __decorate([
629
+ query(".trigger")
630
+ ], OhSelect.prototype, "_trigger", void 0);
631
+ __decorate([
632
+ query(".dropdown")
633
+ ], OhSelect.prototype, "_listbox", void 0);
634
+ OhSelect = __decorate([
635
+ customElement("oh-select")
636
+ ], OhSelect);
637
+ export { OhSelect };
638
+ //# sourceMappingURL=oh-select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oh-select.js","sourceRoot":"","sources":["../src/oh-select.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * oh-skip-link
3
+ *
4
+ * Accessibility skip link for keyboard navigation.
5
+ *
6
+ * DESIGN DECISIONS:
7
+ * ─────────────────
8
+ * 1. ACCESSIBILITY FIRST
9
+ * - Hidden until Tab focus
10
+ * - High contrast focus state
11
+ * - Semantic anchor link
12
+ *
13
+ * 2. POSITIONING
14
+ * - Fixed top-left position
15
+ * - Smooth transition on focus
16
+ * - Z-index above other content
17
+ *
18
+ * 3. STYLING
19
+ * - Warm orange focus state
20
+ * - Chunky padding and border
21
+ * - Clear typography
22
+ *
23
+ * @element oh-skip-link
24
+ */
25
+ import { OhElement } from "./base.js";
26
+ export declare class OhSkipLink extends OhElement {
27
+ static styles: import("lit").CSSResult[];
28
+ href: string;
29
+ text: string;
30
+ render(): import("lit").TemplateResult<1>;
31
+ }
32
+ declare global {
33
+ interface HTMLElementTagNameMap {
34
+ "oh-skip-link": OhSkipLink;
35
+ }
36
+ }
37
+ //# sourceMappingURL=oh-skip-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oh-skip-link.d.ts","sourceRoot":"","sources":["../src/oh-skip-link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAElD,qBACa,UAAW,SAAQ,SAAS;IACvC,OAAgB,MAAM,4BAkFpB;IAGF,IAAI,SAAW;IAGf,IAAI,SAA0B;IAE9B,MAAM;CAWP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,UAAU,CAAC;KAC5B;CACF"}