@orange-halo/components 1.0.0 → 2.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 (82) hide show
  1. package/custom-elements.json +3182 -73
  2. package/dist/base.js +3 -3
  3. package/dist/index.d.ts +6 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +4 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/oh-accordion.js +33 -33
  8. package/dist/oh-alert.js +26 -26
  9. package/dist/oh-badge.js +11 -11
  10. package/dist/oh-breadcrumb.js +20 -20
  11. package/dist/oh-button.d.ts +7 -1
  12. package/dist/oh-button.d.ts.map +1 -1
  13. package/dist/oh-button.js +118 -89
  14. package/dist/oh-button.js.map +1 -1
  15. package/dist/oh-card.d.ts.map +1 -1
  16. package/dist/oh-card.js +38 -66
  17. package/dist/oh-card.js.map +1 -1
  18. package/dist/oh-checkbox-group.d.ts +8 -0
  19. package/dist/oh-checkbox-group.d.ts.map +1 -1
  20. package/dist/oh-checkbox-group.figma.js +1 -1
  21. package/dist/oh-checkbox-group.figma.js.map +1 -1
  22. package/dist/oh-checkbox-group.js +40 -26
  23. package/dist/oh-checkbox-group.js.map +1 -1
  24. package/dist/oh-checkbox.d.ts +11 -2
  25. package/dist/oh-checkbox.d.ts.map +1 -1
  26. package/dist/oh-checkbox.js +44 -28
  27. package/dist/oh-checkbox.js.map +1 -1
  28. package/dist/oh-container.d.ts +5 -5
  29. package/dist/oh-container.js +15 -15
  30. package/dist/oh-drawer.d.ts +7 -2
  31. package/dist/oh-drawer.d.ts.map +1 -1
  32. package/dist/oh-drawer.js +52 -25
  33. package/dist/oh-drawer.js.map +1 -1
  34. package/dist/oh-footer.d.ts +5 -0
  35. package/dist/oh-footer.d.ts.map +1 -1
  36. package/dist/oh-footer.js +9 -4
  37. package/dist/oh-footer.js.map +1 -1
  38. package/dist/oh-hero.d.ts +5 -0
  39. package/dist/oh-hero.d.ts.map +1 -1
  40. package/dist/oh-hero.js +55 -51
  41. package/dist/oh-hero.js.map +1 -1
  42. package/dist/oh-icon.js +9 -9
  43. package/dist/oh-input.d.ts +11 -3
  44. package/dist/oh-input.d.ts.map +1 -1
  45. package/dist/oh-input.figma.js +2 -2
  46. package/dist/oh-input.figma.js.map +1 -1
  47. package/dist/oh-input.js +49 -37
  48. package/dist/oh-input.js.map +1 -1
  49. package/dist/oh-link.d.ts +1 -1
  50. package/dist/oh-link.js +35 -35
  51. package/dist/oh-modal.d.ts +10 -4
  52. package/dist/oh-modal.d.ts.map +1 -1
  53. package/dist/oh-modal.js +75 -72
  54. package/dist/oh-modal.js.map +1 -1
  55. package/dist/oh-navbar.d.ts.map +1 -1
  56. package/dist/oh-navbar.js +4 -5
  57. package/dist/oh-navbar.js.map +1 -1
  58. package/dist/oh-progress.d.ts.map +1 -1
  59. package/dist/oh-progress.js +21 -35
  60. package/dist/oh-progress.js.map +1 -1
  61. package/dist/oh-radio-group.d.ts +8 -0
  62. package/dist/oh-radio-group.d.ts.map +1 -1
  63. package/dist/oh-radio-group.js +40 -26
  64. package/dist/oh-radio-group.js.map +1 -1
  65. package/dist/oh-radio.d.ts +10 -1
  66. package/dist/oh-radio.d.ts.map +1 -1
  67. package/dist/oh-radio.js +44 -28
  68. package/dist/oh-radio.js.map +1 -1
  69. package/dist/oh-select.d.ts +10 -2
  70. package/dist/oh-select.d.ts.map +1 -1
  71. package/dist/oh-select.js +51 -32
  72. package/dist/oh-select.js.map +1 -1
  73. package/dist/oh-skip-link.d.ts.map +1 -1
  74. package/dist/oh-skip-link.js +15 -14
  75. package/dist/oh-skip-link.js.map +1 -1
  76. package/dist/oh-tabs.js +15 -15
  77. package/dist/oh-toggle.d.ts +5 -2
  78. package/dist/oh-toggle.d.ts.map +1 -1
  79. package/dist/oh-toggle.js +18 -20
  80. package/dist/oh-toggle.js.map +1 -1
  81. package/dist/styles/typography.js +50 -50
  82. package/package.json +15 -4
@@ -35,6 +35,12 @@ let OhRadioGroup = class OhRadioGroup extends OhElement {
35
35
  this.errorMessage = "";
36
36
  this._labelId = `radio-group-label-${Math.random().toString(36).substr(2, 9)}`;
37
37
  this._focusedValue = null;
38
+ /**
39
+ * Errors that appear after first render (e.g. on submit) are announced via
40
+ * role="alert". Errors present on page load are only linked with
41
+ * aria-describedby, so they aren't read out unprompted.
42
+ */
43
+ this._announceError = false;
38
44
  }
39
45
  static { this.styles = [
40
46
  baseStyles,
@@ -54,9 +60,9 @@ let OhRadioGroup = class OhRadioGroup extends OhElement {
54
60
  ═══════════════════════════════════════════════════════════════ */
55
61
 
56
62
  .group-label {
57
- font-family: var(--oh-font-family-sans);
58
- font-size: var(--oh-font-size-base);
59
- font-weight: var(--oh-font-weight-semibold);
63
+ font-family: var(--oh-typography-control-font-family);
64
+ font-size: var(--oh-typography-control-font-size-sm);
65
+ font-weight: var(--oh-typography-control-font-weight);
60
66
  color: var(--oh-color-text-primary);
61
67
  margin-bottom: var(--oh-spacing-2);
62
68
  display: block;
@@ -96,10 +102,10 @@ let OhRadioGroup = class OhRadioGroup extends OhElement {
96
102
  width: 24px;
97
103
  height: 24px;
98
104
  flex-shrink: 0;
99
- border: var(--oh-input-base-border-width) solid var(--oh-color-border-emphasis);
100
- border-radius: var(--oh-radius-full);
105
+ border: var(--oh-stroke-control) solid var(--oh-color-border-emphasis);
106
+ border-radius: var(--oh-shape-pill);
101
107
  background-color: var(--oh-color-surface-base);
102
- box-shadow: 3px 3px 0 0 var(--oh-shadow-secondary);
108
+ box-shadow: var(--oh-elevation-offset-md) var(--oh-elevation-offset-md) 0 0 var(--oh-shadow-secondary);
103
109
  transition:
104
110
  transform var(--oh-motion-snappy) var(--oh-motion-ease-playful),
105
111
  box-shadow var(--oh-motion-snappy) var(--oh-motion-ease-playful),
@@ -115,15 +121,15 @@ let OhRadioGroup = class OhRadioGroup extends OhElement {
115
121
  width: 10px;
116
122
  height: 10px;
117
123
  background-color: var(--oh-color-text-on-brand);
118
- border-radius: var(--oh-radius-full);
124
+ border-radius: var(--oh-shape-pill);
119
125
  transform: translate(-50%, -50%) scale(0);
120
126
  transition: transform var(--oh-motion-snappy) var(--oh-motion-ease-playful);
121
127
  }
122
128
 
123
129
  .option-label {
124
- font-family: var(--oh-font-family-sans);
125
- font-size: var(--oh-font-size-lg);
126
- line-height: var(--oh-font-line-height-normal);
130
+ font-family: var(--oh-typography-control-font-family);
131
+ font-size: var(--oh-typography-control-font-size-md);
132
+ line-height: var(--oh-typography-body-base-line-height);
127
133
  color: var(--oh-color-text-primary);
128
134
  user-select: none;
129
135
  }
@@ -135,21 +141,21 @@ let OhRadioGroup = class OhRadioGroup extends OhElement {
135
141
  /* Hover: lift up-left, shadow grows */
136
142
  .radio-option:hover .radio-circle {
137
143
  border-color: var(--oh-color-border-hover);
138
- transform: translate(-1px, -1px);
139
- box-shadow: 4px 4px 0 0 var(--oh-shadow-secondary);
144
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
145
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-secondary);
140
146
  }
141
147
 
142
148
  /* Active: press down-right, shadow shrinks */
143
149
  .radio-option:active .radio-circle {
144
- transform: translate(1px, 1px);
145
- box-shadow: 1px 1px 0 0 var(--oh-shadow-secondary);
150
+ transform: translate(var(--oh-lift-press-sm), var(--oh-lift-press-sm));
151
+ box-shadow: var(--oh-elevation-offset-xs) var(--oh-elevation-offset-xs) 0 0 var(--oh-shadow-secondary);
146
152
  }
147
153
 
148
154
  /* Checked: primary color with warm shadow */
149
155
  .native-radio:checked + .radio-circle {
150
156
  background-color: var(--oh-color-brand-primary);
151
157
  border-color: var(--oh-color-brand-primary);
152
- box-shadow: 3px 3px 0 0 var(--oh-shadow-primary);
158
+ box-shadow: var(--oh-elevation-offset-md) var(--oh-elevation-offset-md) 0 0 var(--oh-shadow-primary);
153
159
  }
154
160
 
155
161
  .native-radio:checked + .radio-circle::after {
@@ -160,15 +166,15 @@ let OhRadioGroup = class OhRadioGroup extends OhElement {
160
166
  .radio-option:hover .native-radio:checked + .radio-circle {
161
167
  background-color: var(--oh-color-brand-primary-hover);
162
168
  border-color: var(--oh-color-brand-primary-hover);
163
- transform: translate(-1px, -1px);
164
- box-shadow: 4px 4px 0 0 var(--oh-shadow-primary);
169
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
170
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-primary);
165
171
  }
166
172
 
167
173
  /* Checked + Active */
168
174
  .radio-option:active .native-radio:checked + .radio-circle {
169
175
  background-color: var(--oh-color-brand-primary-active);
170
- transform: translate(1px, 1px);
171
- box-shadow: 1px 1px 0 0 var(--oh-shadow-primary);
176
+ transform: translate(var(--oh-lift-press-sm), var(--oh-lift-press-sm));
177
+ box-shadow: var(--oh-elevation-offset-xs) var(--oh-elevation-offset-xs) 0 0 var(--oh-shadow-primary);
172
178
  }
173
179
 
174
180
  /* Focus: underline the label (accessible indicator) */
@@ -189,28 +195,28 @@ let OhRadioGroup = class OhRadioGroup extends OhElement {
189
195
 
190
196
  :host([error]) .radio-circle {
191
197
  border-color: var(--oh-color-feedback-error);
192
- box-shadow: 3px 3px 0 0 var(--oh-shadow-error);
198
+ box-shadow: var(--oh-elevation-offset-md) var(--oh-elevation-offset-md) 0 0 var(--oh-shadow-error);
193
199
  }
194
200
 
195
201
  :host([error]) .radio-option:hover .radio-circle {
196
202
  border-color: var(--oh-color-feedback-error-hover);
197
- box-shadow: 4px 4px 0 0 var(--oh-shadow-error);
203
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-error);
198
204
  }
199
205
 
200
206
  .error-message {
201
207
  display: flex;
202
208
  align-items: center;
203
209
  gap: var(--oh-spacing-2);
204
- font-family: var(--oh-font-family-sans);
205
- font-size: var(--oh-font-size-base);
210
+ font-family: var(--oh-typography-body-font-family);
211
+ font-size: var(--oh-typography-body-base-font-size);
206
212
  color: var(--oh-color-feedback-error);
207
213
  margin-bottom: var(--oh-spacing-2);
208
214
  }
209
215
 
210
216
  .error-icon {
211
217
  flex-shrink: 0;
212
- width: var(--oh-font-size-lg);
213
- height: var(--oh-font-size-lg);
218
+ width: var(--oh-typography-body-lg-font-size);
219
+ height: var(--oh-typography-body-lg-font-size);
214
220
  }
215
221
 
216
222
  /* ═══════════════════════════════════════════════════════════════
@@ -236,6 +242,11 @@ let OhRadioGroup = class OhRadioGroup extends OhElement {
236
242
  _handleBlur() {
237
243
  this._focusedValue = null;
238
244
  }
245
+ willUpdate(changed) {
246
+ if (this.hasUpdated && (changed.has("error") || changed.has("errorMessage"))) {
247
+ this._announceError = !!(this.error && this.errorMessage);
248
+ }
249
+ }
239
250
  render() {
240
251
  return html `
241
252
  <div>
@@ -252,7 +263,7 @@ let OhRadioGroup = class OhRadioGroup extends OhElement {
252
263
 
253
264
  ${this.error && this.errorMessage
254
265
  ? html `
255
- <div id="error-msg" class="error-message" role="alert">
266
+ <div id="error-msg" class="error-message" role=${this._announceError ? "alert" : nothing}>
256
267
  <svg class="error-icon" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
257
268
  <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" />
258
269
  </svg>
@@ -317,6 +328,9 @@ __decorate([
317
328
  __decorate([
318
329
  state()
319
330
  ], OhRadioGroup.prototype, "_focusedValue", void 0);
331
+ __decorate([
332
+ state()
333
+ ], OhRadioGroup.prototype, "_announceError", void 0);
320
334
  OhRadioGroup = __decorate([
321
335
  customElement("oh-radio-group")
322
336
  ], OhRadioGroup);
@@ -1 +1 @@
1
- {"version":3,"file":"oh-radio-group.js","sourceRoot":"","sources":["../src/oh-radio-group.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oh-radio-group.js","sourceRoot":"","sources":["../src/oh-radio-group.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  * DESIGN DECISIONS:
8
8
  * ─────────────────
9
9
  * 1. CHUNKY & TACTILE
10
- * - Thick 2.5px border
10
+ * - Thick border (stroke.control)
11
11
  * - Inset shadow when unchecked (pressed into page)
12
12
  * - Fully circular (radio = circle)
13
13
  *
@@ -24,6 +24,7 @@
24
24
  *
25
25
  * @element oh-radio
26
26
  */
27
+ import { type PropertyValues } from "lit";
27
28
  import { OhElement } from "./base.js";
28
29
  export type RadioState = "default" | "hover" | "focus";
29
30
  export declare class OhRadio extends OhElement {
@@ -40,6 +41,14 @@ export declare class OhRadio extends OhElement {
40
41
  */
41
42
  forceState: RadioState;
42
43
  private _handleChange;
44
+ /**
45
+ * Errors that appear after first render (e.g. on submit) are announced via
46
+ * role="alert". Errors present on page load are only linked with
47
+ * aria-describedby, so they aren't read out unprompted.
48
+ */
49
+ private _announceError;
50
+ private _errorId;
51
+ willUpdate(changed: PropertyValues): void;
43
52
  render(): import("lit").TemplateResult<1>;
44
53
  }
45
54
  declare global {
@@ -1 +1 @@
1
- {"version":3,"file":"oh-radio.d.ts","sourceRoot":"","sources":["../src/oh-radio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAElD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvD,qBACa,OAAQ,SAAQ,SAAS;IACpC,OAAgB,MAAM,4BAwMpB;IAGF,OAAO,UAAS;IAGhB,KAAK,SAAM;IAGX,IAAI,SAAM;IAGV,KAAK,SAAM;IAGX,KAAK,UAAS;IAGd,YAAY,SAAM;IAElB;;;OAGG;IAEH,UAAU,EAAE,UAAU,CAAa;IAEnC,OAAO,CAAC,aAAa;IAMrB,MAAM;CAgCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC;KACrB;CACF"}
1
+ {"version":3,"file":"oh-radio.d.ts","sourceRoot":"","sources":["../src/oh-radio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAElD,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvD,qBACa,OAAQ,SAAQ,SAAS;IACpC,OAAgB,MAAM,4BAwMpB;IAGF,OAAO,UAAS;IAGhB,KAAK,SAAM;IAGX,IAAI,SAAM;IAGV,KAAK,SAAM;IAGX,KAAK,UAAS;IAGd,YAAY,SAAM;IAElB;;;OAGG;IAEH,UAAU,EAAE,UAAU,CAAa;IAEnC,OAAO,CAAC,aAAa;IAMrB;;;;OAIG;IAEH,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,QAAQ,CAA+D;IAE/E,UAAU,CAAC,OAAO,EAAE,cAAc;IAMlC,MAAM;CAiCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC;KACrB;CACF"}
package/dist/oh-radio.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * DESIGN DECISIONS:
8
8
  * ─────────────────
9
9
  * 1. CHUNKY & TACTILE
10
- * - Thick 2.5px border
10
+ * - Thick border (stroke.control)
11
11
  * - Inset shadow when unchecked (pressed into page)
12
12
  * - Fully circular (radio = circle)
13
13
  *
@@ -30,8 +30,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
30
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
31
  return c > 3 && r && Object.defineProperty(target, key, r), r;
32
32
  };
33
- import { html, css } from "lit";
34
- import { customElement, property } from "lit/decorators.js";
33
+ import { html, css, nothing } from "lit";
34
+ import { customElement, property, state } from "lit/decorators.js";
35
35
  import { OhElement, baseStyles } from "./base.js";
36
36
  let OhRadio = class OhRadio extends OhElement {
37
37
  constructor() {
@@ -47,6 +47,13 @@ let OhRadio = class OhRadio extends OhElement {
47
47
  * Values: 'hover' | 'focus'
48
48
  */
49
49
  this.forceState = "default";
50
+ /**
51
+ * Errors that appear after first render (e.g. on submit) are announced via
52
+ * role="alert". Errors present on page load are only linked with
53
+ * aria-describedby, so they aren't read out unprompted.
54
+ */
55
+ this._announceError = false;
56
+ this._errorId = `oh-radio-error-${Math.random().toString(36).slice(2, 11)}`;
50
57
  }
51
58
  static { this.styles = [
52
59
  baseStyles,
@@ -91,12 +98,12 @@ let OhRadio = class OhRadio extends OhElement {
91
98
  flex-shrink: 0;
92
99
 
93
100
  /* Chunky border, fully circular */
94
- border: var(--oh-input-base-border-width) solid var(--oh-color-border-emphasis);
95
- border-radius: var(--oh-radius-full);
101
+ border: var(--oh-stroke-control) solid var(--oh-color-border-emphasis);
102
+ border-radius: var(--oh-shape-pill);
96
103
 
97
104
  /* Offset shadow like primary button */
98
105
  background-color: var(--oh-color-surface-base);
99
- box-shadow: 3px 3px 0 0 var(--oh-shadow-secondary);
106
+ box-shadow: var(--oh-elevation-offset-md) var(--oh-elevation-offset-md) 0 0 var(--oh-shadow-secondary);
100
107
 
101
108
  transition:
102
109
  transform var(--oh-motion-snappy) var(--oh-motion-ease-playful),
@@ -114,7 +121,7 @@ let OhRadio = class OhRadio extends OhElement {
114
121
  width: 10px;
115
122
  height: 10px;
116
123
  background-color: var(--oh-color-text-on-brand);
117
- border-radius: var(--oh-radius-full);
124
+ border-radius: var(--oh-shape-pill);
118
125
  transform: translate(-50%, -50%) scale(0);
119
126
  transition: transform var(--oh-motion-snappy) var(--oh-motion-ease-playful);
120
127
  }
@@ -126,21 +133,21 @@ let OhRadio = class OhRadio extends OhElement {
126
133
  /* Hover: lift up-left, shadow grows */
127
134
  .radio-wrapper:hover .radio-circle {
128
135
  border-color: var(--oh-color-border-hover);
129
- transform: translate(-1px, -1px);
130
- box-shadow: 4px 4px 0 0 var(--oh-shadow-secondary);
136
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
137
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-secondary);
131
138
  }
132
139
 
133
140
  /* Active: press down-right, shadow shrinks */
134
141
  .radio-wrapper:active .radio-circle {
135
- transform: translate(1px, 1px);
136
- box-shadow: 1px 1px 0 0 var(--oh-shadow-secondary);
142
+ transform: translate(var(--oh-lift-press-sm), var(--oh-lift-press-sm));
143
+ box-shadow: var(--oh-elevation-offset-xs) var(--oh-elevation-offset-xs) 0 0 var(--oh-shadow-secondary);
137
144
  }
138
145
 
139
146
  /* Checked: primary color with warm shadow */
140
147
  .native-radio:checked + .radio-circle {
141
148
  background-color: var(--oh-color-brand-primary);
142
149
  border-color: var(--oh-color-brand-primary);
143
- box-shadow: 3px 3px 0 0 var(--oh-shadow-primary);
150
+ box-shadow: var(--oh-elevation-offset-md) var(--oh-elevation-offset-md) 0 0 var(--oh-shadow-primary);
144
151
  }
145
152
 
146
153
  .native-radio:checked + .radio-circle::after {
@@ -151,15 +158,15 @@ let OhRadio = class OhRadio extends OhElement {
151
158
  .radio-wrapper:hover .native-radio:checked + .radio-circle {
152
159
  background-color: var(--oh-color-brand-primary-hover);
153
160
  border-color: var(--oh-color-brand-primary-hover);
154
- transform: translate(-1px, -1px);
155
- box-shadow: 4px 4px 0 0 var(--oh-shadow-primary);
161
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
162
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-primary);
156
163
  }
157
164
 
158
165
  /* Checked + Active */
159
166
  .radio-wrapper:active .native-radio:checked + .radio-circle {
160
167
  background-color: var(--oh-color-brand-primary-active);
161
- transform: translate(1px, 1px);
162
- box-shadow: 1px 1px 0 0 var(--oh-shadow-primary);
168
+ transform: translate(var(--oh-lift-press-sm), var(--oh-lift-press-sm));
169
+ box-shadow: var(--oh-elevation-offset-xs) var(--oh-elevation-offset-xs) 0 0 var(--oh-shadow-primary);
163
170
  }
164
171
 
165
172
  /* Focus: underline the label (accessible indicator) */
@@ -173,9 +180,9 @@ let OhRadio = class OhRadio extends OhElement {
173
180
  ═══════════════════════════════════════════════════════════════ */
174
181
 
175
182
  .label {
176
- font-family: var(--oh-font-family-sans);
177
- font-size: var(--oh-font-size-lg);
178
- line-height: var(--oh-font-line-height-normal);
183
+ font-family: var(--oh-typography-control-font-family);
184
+ font-size: var(--oh-typography-control-font-size-md);
185
+ line-height: var(--oh-typography-body-base-line-height);
179
186
  color: var(--oh-color-text-primary);
180
187
  user-select: none;
181
188
  padding-top: 0; /* Align with radio */
@@ -187,20 +194,20 @@ let OhRadio = class OhRadio extends OhElement {
187
194
 
188
195
  :host([error]) .radio-circle {
189
196
  border-color: var(--oh-color-feedback-error);
190
- box-shadow: 3px 3px 0 0 var(--oh-shadow-error);
197
+ box-shadow: var(--oh-elevation-offset-md) var(--oh-elevation-offset-md) 0 0 var(--oh-shadow-error);
191
198
  }
192
199
 
193
200
  :host([error]) .radio-wrapper:hover .radio-circle {
194
201
  border-color: var(--oh-color-feedback-error-hover);
195
- box-shadow: 4px 4px 0 0 var(--oh-shadow-error);
202
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-error);
196
203
  }
197
204
 
198
205
  .error-message {
199
206
  display: flex;
200
207
  align-items: center;
201
208
  gap: var(--oh-spacing-2);
202
- font-family: var(--oh-font-family-sans);
203
- font-size: var(--oh-font-size-base);
209
+ font-family: var(--oh-typography-body-font-family);
210
+ font-size: var(--oh-typography-body-base-font-size);
204
211
  color: var(--oh-color-feedback-error);
205
212
  margin-top: var(--oh-spacing-1);
206
213
  margin-left: calc(24px + var(--oh-spacing-3)); /* Align with label */
@@ -230,8 +237,8 @@ let OhRadio = class OhRadio extends OhElement {
230
237
  /* Forced Hover - Unchecked */
231
238
  :host([force-state="hover"]) .radio-circle {
232
239
  border-color: var(--oh-color-border-hover);
233
- transform: translate(-1px, -1px);
234
- box-shadow: 4px 4px 0 0 var(--oh-shadow-secondary);
240
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
241
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-secondary);
235
242
  }
236
243
 
237
244
  /* Forced Focus - Unchecked */
@@ -244,8 +251,8 @@ let OhRadio = class OhRadio extends OhElement {
244
251
  :host([force-state="hover"][checked]) .radio-circle {
245
252
  background-color: var(--oh-color-brand-primary-hover);
246
253
  border-color: var(--oh-color-brand-primary-hover);
247
- transform: translate(-1px, -1px);
248
- box-shadow: 4px 4px 0 0 var(--oh-shadow-primary);
254
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
255
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-primary);
249
256
  }
250
257
  `,
251
258
  ]; }
@@ -254,6 +261,11 @@ let OhRadio = class OhRadio extends OhElement {
254
261
  this.checked = target.checked;
255
262
  this.emit("oh-change", { checked: this.checked, value: this.value });
256
263
  }
264
+ willUpdate(changed) {
265
+ if (this.hasUpdated && (changed.has("error") || changed.has("errorMessage"))) {
266
+ this._announceError = !!(this.error && this.errorMessage);
267
+ }
268
+ }
257
269
  render() {
258
270
  const inputId = `oh-radio-${this.name}-${this.value || Math.random().toString(36).substr(2, 9)}`;
259
271
  return html `
@@ -267,6 +279,7 @@ let OhRadio = class OhRadio extends OhElement {
267
279
  .value=${this.value}
268
280
  .checked=${this.checked}
269
281
  aria-invalid=${this.error ? "true" : "false"}
282
+ aria-describedby=${this.error && this.errorMessage ? this._errorId : nothing}
270
283
  @change=${this._handleChange}
271
284
  />
272
285
  <span class="radio-circle" part="circle"></span>
@@ -274,7 +287,7 @@ let OhRadio = class OhRadio extends OhElement {
274
287
  </label>
275
288
  ${this.error && this.errorMessage
276
289
  ? html `
277
- <div class="error-message" part="error" role="alert">
290
+ <div id=${this._errorId} class="error-message" part="error" role=${this._announceError ? "alert" : nothing}>
278
291
  <svg class="error-icon" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
279
292
  <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" />
280
293
  </svg>
@@ -307,6 +320,9 @@ __decorate([
307
320
  __decorate([
308
321
  property({ type: String, reflect: true, attribute: "force-state" })
309
322
  ], OhRadio.prototype, "forceState", void 0);
323
+ __decorate([
324
+ state()
325
+ ], OhRadio.prototype, "_announceError", void 0);
310
326
  OhRadio = __decorate([
311
327
  customElement("oh-radio")
312
328
  ], OhRadio);
@@ -1 +1 @@
1
- {"version":3,"file":"oh-radio.js","sourceRoot":"","sources":["../src/oh-radio.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;;;;;AAEH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAK3C,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,SAAS;IAA/B;;QA4ML,YAAO,GAAG,KAAK,CAAC;QAGhB,UAAK,GAAG,EAAE,CAAC;QAGX,SAAI,GAAG,EAAE,CAAC;QAGV,UAAK,GAAG,EAAE,CAAC;QAGX,UAAK,GAAG,KAAK,CAAC;QAGd,iBAAY,GAAG,EAAE,CAAC;QAElB;;;WAGG;QAEH,eAAU,GAAe,SAAS,CAAC;IAwCrC,CAAC;aAzQiB,WAAM,GAAG;QACvB,UAAU;QACV,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqMF;KACF,AAxMqB,CAwMpB;IA2BM,aAAa,CAAC,KAAY;QAChC,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM;QACJ,MAAM,OAAO,GAAG,YAAY,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAEjG,OAAO,IAAI,CAAA;;2CAE4B,OAAO;;;;iBAIjC,OAAO;mBACL,IAAI,CAAC,IAAI;qBACP,IAAI,CAAC,KAAK;uBACR,IAAI,CAAC,OAAO;2BACR,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;sBAClC,IAAI,CAAC,aAAa;;;6CAGK,IAAI,CAAC,KAAK;;UAE7C,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY;YAC/B,CAAC,CAAC,IAAI,CAAA;;;;;kBAKE,IAAI,CAAC,YAAY;;aAEtB;YACH,CAAC,CAAC,EAAE;;KAET,CAAC;IACJ,CAAC;;AA7DD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;wCAC3B;AAGhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sCAChB;AAGX;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;qCACjB;AAGV;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;sCAChB;AAGX;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;sCAC7B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CACT;AAOlB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;2CACjC;AAlOxB,OAAO;IADnB,aAAa,CAAC,UAAU,CAAC;GACb,OAAO,CA0QnB"}
1
+ {"version":3,"file":"oh-radio.js","sourceRoot":"","sources":["../src/oh-radio.ts"],"names":[],"mappings":"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"}
@@ -7,9 +7,9 @@
7
7
  * DESIGN DECISIONS:
8
8
  * ─────────────────
9
9
  * 1. CHUNKY & TACTILE
10
- * - Thick 2.5px border
10
+ * - Thick border (stroke.control)
11
11
  * - Offset shadow (sticker effect like button)
12
- * - 10px border radius
12
+ * - shape.control corners
13
13
  * - Solid warm fills
14
14
  *
15
15
  * 2. DROPDOWN PANEL
@@ -27,6 +27,7 @@
27
27
  *
28
28
  * @element oh-select
29
29
  */
30
+ import { type PropertyValues } from "lit";
30
31
  import { OhElement } from "./base.js";
31
32
  export interface SelectOption {
32
33
  label: string;
@@ -72,6 +73,13 @@ export declare class OhSelect extends OhElement {
72
73
  private _handleClickOutside;
73
74
  connectedCallback(): void;
74
75
  disconnectedCallback(): void;
76
+ /**
77
+ * Errors that appear after first render (e.g. on submit) are announced via
78
+ * role="alert". Errors present on page load are only linked with
79
+ * aria-describedby, so they aren't read out unprompted.
80
+ */
81
+ private _announceError;
82
+ willUpdate(changed: PropertyValues): void;
75
83
  render(): import("lit").TemplateResult<1>;
76
84
  }
77
85
  declare global {
@@ -1 +1 @@
1
- {"version":3,"file":"oh-select.d.ts","sourceRoot":"","sources":["../src/oh-select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBACa,QAAS,SAAQ,SAAS;IACrC,OAAgB,MAAM,4BA+PpB;IAGF,KAAK,SAAM;IAGX,WAAW,SAAsB;IAGjC,IAAI,SAAM;IAGV,OAAO,EAAE,YAAY,EAAE,CAAM;IAG7B,KAAK,SAAM;IAGX,QAAQ,UAAS;IAGjB,UAAU,SAAM;IAGhB,SAAS,SAAM;IAGf,OAAO,CAAC,KAAK,CAAS;IAGtB,OAAO,CAAC,iBAAiB,CAAM;IAG/B,OAAO,CAAC,QAAQ,CAAS;IAGzB,OAAO,CAAC,QAAQ,CAAqB;IAGrC,OAAO,CAAC,QAAQ,CAAoB;IAEpC,OAAO,CAAC,QAAQ,CAAgE;IAChF,OAAO,CAAC,UAAU,CAAkE;IACpF,OAAO,CAAC,QAAQ,CAAgE;IAChF,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,iBAAiB,CAAuB;IAEhD,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,qBAAqB;IAqE7B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,mBAAmB,CAIzB;IAEO,iBAAiB;IAKjB,oBAAoB;IAK7B,MAAM;CAyGP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,QAAQ,CAAC;KACvB;CACF"}
1
+ {"version":3,"file":"oh-select.d.ts","sourceRoot":"","sources":["../src/oh-select.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBACa,QAAS,SAAQ,SAAS;IACrC,OAAgB,MAAM,4BAoQpB;IAGF,KAAK,SAAM;IAGX,WAAW,SAAsB;IAGjC,IAAI,SAAM;IAGV,OAAO,EAAE,YAAY,EAAE,CAAM;IAG7B,KAAK,SAAM;IAGX,QAAQ,UAAS;IAGjB,UAAU,SAAM;IAGhB,SAAS,SAAM;IAGf,OAAO,CAAC,KAAK,CAAS;IAGtB,OAAO,CAAC,iBAAiB,CAAM;IAG/B,OAAO,CAAC,QAAQ,CAAS;IAGzB,OAAO,CAAC,QAAQ,CAAqB;IAGrC,OAAO,CAAC,QAAQ,CAAoB;IAEpC,OAAO,CAAC,QAAQ,CAAgE;IAChF,OAAO,CAAC,UAAU,CAAkE;IACpF,OAAO,CAAC,QAAQ,CAAgE;IAChF,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,iBAAiB,CAAuB;IAEhD,OAAO,KAAK,eAAe,GAE1B;IAED,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,qBAAqB;IAqE7B,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,mBAAmB,CAIzB;IAEO,iBAAiB;IAKjB,oBAAoB;IAK7B;;;;OAIG;IAEH,OAAO,CAAC,cAAc,CAAS;IAE/B,UAAU,CAAC,OAAO,EAAE,cAAc;IAMlC,MAAM;CAyGP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,QAAQ,CAAC;KACvB;CACF"}