@orange-halo/components 1.0.0 → 2.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 (67) hide show
  1. package/dist/base.js +3 -3
  2. package/dist/oh-accordion.js +17 -17
  3. package/dist/oh-alert.js +15 -15
  4. package/dist/oh-badge.js +11 -11
  5. package/dist/oh-breadcrumb.js +8 -8
  6. package/dist/oh-button.d.ts +6 -0
  7. package/dist/oh-button.d.ts.map +1 -1
  8. package/dist/oh-button.js +105 -76
  9. package/dist/oh-button.js.map +1 -1
  10. package/dist/oh-card.js +28 -28
  11. package/dist/oh-checkbox-group.d.ts +8 -0
  12. package/dist/oh-checkbox-group.d.ts.map +1 -1
  13. package/dist/oh-checkbox-group.js +27 -13
  14. package/dist/oh-checkbox-group.js.map +1 -1
  15. package/dist/oh-checkbox.d.ts +9 -0
  16. package/dist/oh-checkbox.d.ts.map +1 -1
  17. package/dist/oh-checkbox.js +25 -9
  18. package/dist/oh-checkbox.js.map +1 -1
  19. package/dist/oh-container.d.ts +5 -5
  20. package/dist/oh-container.js +15 -15
  21. package/dist/oh-drawer.d.ts +7 -2
  22. package/dist/oh-drawer.d.ts.map +1 -1
  23. package/dist/oh-drawer.js +52 -25
  24. package/dist/oh-drawer.js.map +1 -1
  25. package/dist/oh-footer.js +4 -4
  26. package/dist/oh-hero.d.ts.map +1 -1
  27. package/dist/oh-hero.js +50 -51
  28. package/dist/oh-hero.js.map +1 -1
  29. package/dist/oh-icon.js +6 -6
  30. package/dist/oh-input.d.ts +9 -1
  31. package/dist/oh-input.d.ts.map +1 -1
  32. package/dist/oh-input.js +45 -33
  33. package/dist/oh-input.js.map +1 -1
  34. package/dist/oh-link.d.ts +1 -1
  35. package/dist/oh-link.js +15 -15
  36. package/dist/oh-modal.d.ts +8 -2
  37. package/dist/oh-modal.d.ts.map +1 -1
  38. package/dist/oh-modal.js +68 -65
  39. package/dist/oh-modal.js.map +1 -1
  40. package/dist/oh-navbar.d.ts.map +1 -1
  41. package/dist/oh-navbar.js +3 -4
  42. package/dist/oh-navbar.js.map +1 -1
  43. package/dist/oh-progress.d.ts.map +1 -1
  44. package/dist/oh-progress.js +20 -34
  45. package/dist/oh-progress.js.map +1 -1
  46. package/dist/oh-radio-group.d.ts +8 -0
  47. package/dist/oh-radio-group.d.ts.map +1 -1
  48. package/dist/oh-radio-group.js +27 -13
  49. package/dist/oh-radio-group.js.map +1 -1
  50. package/dist/oh-radio.d.ts +9 -0
  51. package/dist/oh-radio.d.ts.map +1 -1
  52. package/dist/oh-radio.js +26 -10
  53. package/dist/oh-radio.js.map +1 -1
  54. package/dist/oh-select.d.ts +8 -0
  55. package/dist/oh-select.d.ts.map +1 -1
  56. package/dist/oh-select.js +34 -20
  57. package/dist/oh-select.js.map +1 -1
  58. package/dist/oh-skip-link.d.ts.map +1 -1
  59. package/dist/oh-skip-link.js +13 -12
  60. package/dist/oh-skip-link.js.map +1 -1
  61. package/dist/oh-tabs.js +6 -6
  62. package/dist/oh-toggle.d.ts +5 -2
  63. package/dist/oh-toggle.d.ts.map +1 -1
  64. package/dist/oh-toggle.js +7 -9
  65. package/dist/oh-toggle.js.map +1 -1
  66. package/dist/styles/typography.js +46 -46
  67. package/package.json +7 -3
package/dist/oh-hero.js CHANGED
@@ -28,89 +28,88 @@ let OhHero = class OhHero extends LitElement {
28
28
  static { this.styles = css `
29
29
  :host {
30
30
  display: block;
31
- background-color: var(--oh-color-brand-primary, #C54300);
32
- color: var(--oh-color-text-on-brand, #FFFFFF);
33
- font-family: var(--oh-font-family-sans, system-ui, sans-serif);
31
+ background-color: var(--oh-color-brand-primary);
32
+ color: var(--oh-color-text-on-brand);
33
+ font-family: var(--oh-typography-body-font-family);
34
34
  }
35
35
 
36
36
  .hero {
37
- padding: 48px 0;
37
+ padding: var(--oh-spacing-12) 0;
38
38
  }
39
39
 
40
40
  .hero--journey {
41
- padding: 32px 0;
41
+ padding: var(--oh-spacing-8) 0;
42
42
  }
43
43
 
44
44
  /* Container styles - matches oh-container */
45
45
  .hero__container {
46
46
  width: 100%;
47
- max-width: var(--hero-max-width, 1024px);
47
+ max-width: var(--hero-max-width, var(--oh-layout-container-lg));
48
48
  margin-left: auto;
49
49
  margin-right: auto;
50
- padding-left: var(--oh-spacing-4, 16px);
51
- padding-right: var(--oh-spacing-4, 16px);
50
+ padding-left: var(--oh-spacing-4);
51
+ padding-right: var(--oh-spacing-4);
52
52
  box-sizing: border-box;
53
53
  }
54
54
 
55
55
  /* Size variants */
56
56
  :host([size="sm"]) {
57
- --hero-max-width: 640px;
57
+ --hero-max-width: var(--oh-layout-container-sm);
58
58
  }
59
59
 
60
60
  :host([size="md"]) {
61
- --hero-max-width: 768px;
61
+ --hero-max-width: var(--oh-layout-container-md);
62
62
  }
63
63
 
64
64
  :host([size="lg"]) {
65
- --hero-max-width: 1024px;
65
+ --hero-max-width: var(--oh-layout-container-lg);
66
66
  }
67
67
 
68
68
  :host([size="xl"]) {
69
- --hero-max-width: 1280px;
69
+ --hero-max-width: var(--oh-layout-container-xl);
70
70
  }
71
71
 
72
72
  .hero__heading {
73
- font-size: 42px;
74
- font-weight: 700;
75
- line-height: 1.2;
76
- margin: 0 0 16px 0;
77
- color: var(--oh-color-text-on-brand, #FFFFFF);
73
+ font-size: var(--oh-typography-heading-h1-font-size);
74
+ font-weight: var(--oh-typography-heading-h1-font-weight);
75
+ line-height: var(--oh-typography-heading-h1-line-height);
76
+ margin: 0 0 var(--oh-spacing-4) 0;
77
+ color: var(--oh-color-text-on-brand);
78
78
  }
79
79
 
80
80
  .hero__subtitle {
81
- font-size: 20px;
82
- font-weight: 400;
83
- line-height: 1.5;
84
- margin: 0 0 24px 0;
85
- color: var(--oh-color-text-on-brand, #FFFFFF);
86
- opacity: 0.85;
81
+ font-size: var(--oh-typography-body-xl-font-size);
82
+ font-weight: var(--oh-typography-body-xl-font-weight);
83
+ line-height: var(--oh-typography-body-xl-line-height);
84
+ margin: 0 0 var(--oh-spacing-6) 0;
85
+ color: var(--oh-color-text-on-brand);
87
86
  max-width: 65ch;
88
87
  }
89
88
 
90
89
  .hero__actions {
91
90
  display: flex;
92
91
  flex-wrap: wrap;
93
- gap: 16px;
94
- margin-top: 24px;
92
+ gap: var(--oh-spacing-4);
93
+ margin-top: var(--oh-spacing-6);
95
94
  }
96
95
 
97
96
  .hero__journey-heading {
98
- font-size: 32px;
99
- font-weight: 700;
100
- line-height: 1.2;
101
- margin: 0 0 24px 0;
102
- color: var(--oh-color-text-on-brand, #FFFFFF);
97
+ font-size: var(--oh-typography-heading-h2-font-size);
98
+ font-weight: var(--oh-typography-heading-h2-font-weight);
99
+ line-height: var(--oh-typography-heading-h2-line-height);
100
+ margin: 0 0 var(--oh-spacing-6) 0;
101
+ color: var(--oh-color-text-on-brand);
103
102
  }
104
103
 
105
104
  .hero__journey-name {
106
105
  display: block;
107
- font-size: 16px;
108
- font-weight: 500;
106
+ font-family: var(--oh-typography-eyebrow-font-family);
107
+ font-size: var(--oh-typography-eyebrow-font-size);
108
+ font-weight: var(--oh-typography-eyebrow-font-weight);
109
109
  text-transform: uppercase;
110
- letter-spacing: 0.05em;
111
- color: var(--oh-color-text-on-brand, #FFFFFF);
112
- opacity: 0.9;
113
- margin-bottom: 8px;
110
+ letter-spacing: var(--oh-typography-eyebrow-letter-spacing);
111
+ color: var(--oh-color-text-on-brand);
112
+ margin-bottom: var(--oh-spacing-2);
114
113
  }
115
114
 
116
115
  .hero__page-name {
@@ -118,40 +117,40 @@ let OhHero = class OhHero extends LitElement {
118
117
  }
119
118
 
120
119
  .hero__progress-wrapper {
121
- margin-top: 16px;
122
- max-width: 400px;
120
+ margin-top: var(--oh-spacing-4);
121
+ max-width: var(--oh-layout-container-sm);
123
122
  }
124
123
 
125
124
  /* Responsive container padding - matches oh-container */
126
125
  @media (min-width: 640px) {
127
126
  .hero__container {
128
- padding-left: var(--oh-spacing-6, 24px);
129
- padding-right: var(--oh-spacing-6, 24px);
127
+ padding-left: var(--oh-spacing-6);
128
+ padding-right: var(--oh-spacing-6);
130
129
  }
131
130
  }
132
131
 
133
132
  @media (min-width: 1024px) {
134
133
  .hero__container {
135
- padding-left: var(--oh-spacing-8, 32px);
136
- padding-right: var(--oh-spacing-8, 32px);
134
+ padding-left: var(--oh-spacing-8);
135
+ padding-right: var(--oh-spacing-8);
137
136
  }
138
137
  }
139
138
 
140
139
  @media (max-width: 768px) {
141
140
  .hero {
142
- padding: 32px 0;
141
+ padding: var(--oh-spacing-8) 0;
143
142
  }
144
143
  .hero__heading {
145
- font-size: 32px;
144
+ font-size: var(--oh-typography-heading-h2-font-size);
146
145
  }
147
146
  .hero__subtitle {
148
- font-size: 18px;
147
+ font-size: var(--oh-typography-body-lg-font-size);
149
148
  }
150
149
  .hero--journey {
151
- padding: 24px 0;
150
+ padding: var(--oh-spacing-6) 0;
152
151
  }
153
152
  .hero__journey-heading {
154
- font-size: 26px;
153
+ font-size: var(--oh-typography-heading-h3-font-size);
155
154
  }
156
155
  .hero__progress-wrapper {
157
156
  max-width: 100%;
@@ -160,10 +159,10 @@ let OhHero = class OhHero extends LitElement {
160
159
 
161
160
  @media (max-width: 480px) {
162
161
  .hero__heading {
163
- font-size: 26px;
162
+ font-size: var(--oh-typography-heading-h3-font-size);
164
163
  }
165
164
  .hero__journey-heading {
166
- font-size: 20px;
165
+ font-size: var(--oh-typography-heading-h4-font-size);
167
166
  }
168
167
  .hero__actions {
169
168
  flex-direction: column;
@@ -174,7 +173,7 @@ let OhHero = class OhHero extends LitElement {
174
173
  if (this.variant === "journey") {
175
174
  const progressLabel = `Step ${this.currentStep} of ${this.totalSteps}`;
176
175
  return html `
177
- <div class="hero hero--journey" role="banner">
176
+ <div class="hero hero--journey">
178
177
  <div class="hero__container">
179
178
  <h1 class="hero__journey-heading">
180
179
  ${this.journeyName
@@ -198,7 +197,7 @@ let OhHero = class OhHero extends LitElement {
198
197
  `;
199
198
  }
200
199
  return html `
201
- <div class="hero" role="banner">
200
+ <div class="hero">
202
201
  <div class="hero__container">
203
202
  ${this.heading
204
203
  ? html `<h1 class="hero__heading">${this.heading}</h1>`
@@ -1 +1 @@
1
- {"version":3,"file":"oh-hero.js","sourceRoot":"","sources":["../src/oh-hero.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;;;;;;;AAEH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,kBAAkB,CAAC;AAMnB,IAAM,MAAM,GAAZ,MAAM,MAAO,SAAQ,UAAU;IAA/B;;QAoJL,YAAO,GAAgB,SAAS,CAAC;QAGjC,SAAI,GAAa,IAAI,CAAC;QAGtB,YAAO,GAAG,EAAE,CAAC;QAGb,aAAQ,GAAG,EAAE,CAAC;QAGd,gBAAW,GAAG,EAAE,CAAC;QAGjB,gBAAW,GAAG,CAAC,CAAC;QAGhB,eAAU,GAAG,CAAC,CAAC;IA8CjB,CAAC;aAnNiB,WAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgJ3B,AAhJqB,CAgJpB;IAuBO,MAAM;QACb,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;YACvE,OAAO,IAAI,CAAA;;;;gBAID,IAAI,CAAC,WAAW;gBAChB,CAAC,CAAC,IAAI,CAAA,oCAAoC,IAAI,CAAC,WAAW,SAAS;gBACnE,CAAC,CAAC,OAAO;8CACqB,IAAI,CAAC,OAAO;;;;yBAIjC,IAAI,CAAC,WAAW;uBAClB,IAAI,CAAC,UAAU;wBACd,aAAa;;;;;;;;;OAS9B,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAA;;;YAGH,IAAI,CAAC,OAAO;YACZ,CAAC,CAAC,IAAI,CAAA,6BAA6B,IAAI,CAAC,OAAO,OAAO;YACtD,CAAC,CAAC,OAAO;YACT,IAAI,CAAC,QAAQ;YACb,CAAC,CAAC,IAAI,CAAA,6BAA6B,IAAI,CAAC,QAAQ,MAAM;YACtD,CAAC,CAAC,OAAO;;;;;;KAMhB,CAAC;IACJ,CAAC;;AA/DD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;uCACT;AAGjC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oCACpB;AAGtB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uCACd;AAGb;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCACb;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;2CACrC;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;2CACtC;AAGhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;0CACtC;AAtKJ,MAAM;IADlB,aAAa,CAAC,SAAS,CAAC;GACZ,MAAM,CAoNlB"}
1
+ {"version":3,"file":"oh-hero.js","sourceRoot":"","sources":["../src/oh-hero.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;;;;;;;AAEH,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,kBAAkB,CAAC;AAMnB,IAAM,MAAM,GAAZ,MAAM,MAAO,SAAQ,UAAU;IAA/B;;QAmJL,YAAO,GAAgB,SAAS,CAAC;QAGjC,SAAI,GAAa,IAAI,CAAC;QAGtB,YAAO,GAAG,EAAE,CAAC;QAGb,aAAQ,GAAG,EAAE,CAAC;QAGd,gBAAW,GAAG,EAAE,CAAC;QAGjB,gBAAW,GAAG,CAAC,CAAC;QAGhB,eAAU,GAAG,CAAC,CAAC;IA8CjB,CAAC;aAlNiB,WAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+I3B,AA/IqB,CA+IpB;IAuBO,MAAM;QACb,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,aAAa,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;YACvE,OAAO,IAAI,CAAA;;;;gBAID,IAAI,CAAC,WAAW;gBAChB,CAAC,CAAC,IAAI,CAAA,oCAAoC,IAAI,CAAC,WAAW,SAAS;gBACnE,CAAC,CAAC,OAAO;8CACqB,IAAI,CAAC,OAAO;;;;yBAIjC,IAAI,CAAC,WAAW;uBAClB,IAAI,CAAC,UAAU;wBACd,aAAa;;;;;;;;;OAS9B,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAA;;;YAGH,IAAI,CAAC,OAAO;YACZ,CAAC,CAAC,IAAI,CAAA,6BAA6B,IAAI,CAAC,OAAO,OAAO;YACtD,CAAC,CAAC,OAAO;YACT,IAAI,CAAC,QAAQ;YACb,CAAC,CAAC,IAAI,CAAA,6BAA6B,IAAI,CAAC,QAAQ,MAAM;YACtD,CAAC,CAAC,OAAO;;;;;;KAMhB,CAAC;IACJ,CAAC;;AA/DD;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;uCACT;AAGjC;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;oCACpB;AAGtB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uCACd;AAGb;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCACb;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;2CACrC;AAGjB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;2CACtC;AAGhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;0CACtC;AArKJ,MAAM;IADlB,aAAa,CAAC,SAAS,CAAC;GACZ,MAAM,CAmNlB"}
package/dist/oh-icon.js CHANGED
@@ -215,12 +215,12 @@ let OhIcon = class OhIcon extends OhElement {
215
215
  justify-content: center;
216
216
  color: inherit;
217
217
  text-decoration: none;
218
- border-radius: var(--oh-shape-radius-sm, 6px);
219
- padding: var(--oh-spacing-2, 8px);
220
- margin: calc(-1 * var(--oh-spacing-2, 8px));
218
+ border-radius: var(--oh-shape-compact);
219
+ padding: var(--oh-spacing-2);
220
+ margin: calc(-1 * var(--oh-spacing-2));
221
221
  transition:
222
- transform var(--oh-motion-snappy, 150ms) var(--oh-motion-ease-gentle, ease),
223
- box-shadow var(--oh-motion-snappy, 150ms) var(--oh-motion-ease-gentle, ease);
222
+ transform var(--oh-motion-snappy) var(--oh-motion-ease-gentle),
223
+ box-shadow var(--oh-motion-snappy) var(--oh-motion-ease-gentle);
224
224
  }
225
225
 
226
226
  .icon-link:hover {
@@ -238,7 +238,7 @@ let OhIcon = class OhIcon extends OhElement {
238
238
  }
239
239
 
240
240
  .icon-link:focus-visible {
241
- box-shadow: 0 0 0 2px var(--oh-color-border-focus);
241
+ box-shadow: 0 0 0 2px var(--oh-focus-ring-color);
242
242
  }
243
243
 
244
244
  /* Inverse link styles (for dark/colored backgrounds) */
@@ -19,11 +19,12 @@
19
19
  * 3. FOCUS RISES UP
20
20
  * - Inset shadow disappears
21
21
  * - Outset shadow appears (field lifts)
22
- * - Border turns marmalade
22
+ * - Border turns brand orange
23
23
  * - Clear visual hierarchy
24
24
  *
25
25
  * @element oh-input
26
26
  */
27
+ import { type PropertyValues } from "lit";
27
28
  import { OhElement } from "./base.js";
28
29
  export type InputType = "text" | "email" | "password" | "search" | "tel" | "url";
29
30
  export type InputState = "default" | "hover" | "focus";
@@ -46,6 +47,13 @@ export declare class OhInput extends OhElement {
46
47
  private _handleChange;
47
48
  focus(): void;
48
49
  blur(): void;
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
+ private _announceError;
56
+ willUpdate(changed: PropertyValues): void;
49
57
  render(): import("lit").TemplateResult<1>;
50
58
  }
51
59
  declare global {
@@ -1 +1 @@
1
- {"version":3,"file":"oh-input.d.ts","sourceRoot":"","sources":["../src/oh-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAElD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;AACjF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvD,qBACa,OAAQ,SAAQ,SAAS;IACpC,OAAgB,MAAM,4BAoKpB;IAGF,IAAI,EAAE,SAAS,CAAU;IAGzB,KAAK,SAAM;IAGX,WAAW,SAAM;IAGjB,KAAK,SAAM;IAGX,UAAU,SAAM;IAGhB,SAAS,SAAM;IAGf,QAAQ,UAAS;IAEjB;;;OAGG;IAEH,UAAU,EAAE,UAAU,CAAa;IAGnC,OAAO,CAAC,MAAM,CAAoB;IAElC,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,aAAa;IAIrB,KAAK;IAIL,IAAI;IAIJ,MAAM;CA2DP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC;KACrB;CACF"}
1
+ {"version":3,"file":"oh-input.d.ts","sourceRoot":"","sources":["../src/oh-input.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,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,CAAC;AACjF,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAEvD,qBACa,OAAQ,SAAQ,SAAS;IACpC,OAAgB,MAAM,4BAoKpB;IAGF,IAAI,EAAE,SAAS,CAAU;IAGzB,KAAK,SAAM;IAGX,WAAW,SAAM;IAGjB,KAAK,SAAM;IAGX,UAAU,SAAM;IAGhB,SAAS,SAAM;IAGf,QAAQ,UAAS;IAEjB;;;OAGG;IAEH,UAAU,EAAE,UAAU,CAAa;IAGnC,OAAO,CAAC,MAAM,CAAoB;IAElC,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,aAAa;IAIrB,KAAK;IAIL,IAAI;IAIJ;;;;OAIG;IAEH,OAAO,CAAC,cAAc,CAAS;IAE/B,UAAU,CAAC,OAAO,EAAE,cAAc;IAMlC,MAAM;CAyDP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC;KACrB;CACF"}
package/dist/oh-input.js CHANGED
@@ -19,7 +19,7 @@
19
19
  * 3. FOCUS RISES UP
20
20
  * - Inset shadow disappears
21
21
  * - Outset shadow appears (field lifts)
22
- * - Border turns marmalade
22
+ * - Border turns brand orange
23
23
  * - Clear visual hierarchy
24
24
  *
25
25
  * @element oh-input
@@ -31,7 +31,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
31
31
  return c > 3 && r && Object.defineProperty(target, key, r), r;
32
32
  };
33
33
  import { html, css, nothing } from "lit";
34
- import { customElement, property, query } from "lit/decorators.js";
34
+ import { customElement, property, query, state } from "lit/decorators.js";
35
35
  import { OhElement, baseStyles } from "./base.js";
36
36
  let OhInput = class OhInput extends OhElement {
37
37
  constructor() {
@@ -48,6 +48,12 @@ let OhInput = class OhInput extends OhElement {
48
48
  * Values: 'hover' | 'focus'
49
49
  */
50
50
  this.forceState = "default";
51
+ /**
52
+ * Errors that appear after first render (e.g. on submit) are announced via
53
+ * role="alert". Errors present on page load are only linked with
54
+ * aria-describedby, so they aren't read out unprompted.
55
+ */
56
+ this._announceError = false;
51
57
  }
52
58
  static { this.styles = [
53
59
  baseStyles,
@@ -69,11 +75,11 @@ let OhInput = class OhInput extends OhElement {
69
75
 
70
76
  /* ─── Label: friendly and readable (16px minimum) ─── */
71
77
  .label {
72
- font-family: var(--oh-font-family-sans);
73
- font-size: var(--oh-font-size-base);
74
- font-weight: var(--oh-font-weight-semibold);
78
+ font-family: var(--oh-typography-control-font-family);
79
+ font-size: var(--oh-typography-control-font-size-sm);
80
+ font-weight: var(--oh-typography-control-font-weight);
75
81
  color: var(--oh-color-text-primary);
76
- letter-spacing: var(--oh-font-letter-spacing-wide);
82
+ letter-spacing: var(--oh-typography-control-letter-spacing);
77
83
  }
78
84
 
79
85
  .label--required::after {
@@ -88,7 +94,7 @@ let OhInput = class OhInput extends OhElement {
88
94
 
89
95
  .input {
90
96
  width: 100%;
91
- font-family: var(--oh-font-family-sans);
97
+ font-family: var(--oh-typography-control-font-family);
92
98
  color: var(--oh-color-text-primary);
93
99
 
94
100
  /* Solid fill — no gradients */
@@ -96,10 +102,10 @@ let OhInput = class OhInput extends OhElement {
96
102
 
97
103
  /* Thick illustrative border (WCAG 3:1 compliant) */
98
104
  border: var(--oh-input-base-border-width) solid var(--oh-color-border-emphasis);
99
- border-radius: var(--oh-radius-md);
105
+ border-radius: var(--oh-shape-control);
100
106
 
101
107
  /* Inset offset shadow: pressed into page */
102
- box-shadow: var(--oh-shadow-chunky-inset, inset 3px 3px 0 0 rgba(61, 50, 41, 0.15));
108
+ box-shadow: inset 3px 3px 0 0 rgba(61, 50, 41, 0.15);
103
109
 
104
110
  transition:
105
111
  border-color var(--oh-motion-snappy) ease,
@@ -119,11 +125,11 @@ let OhInput = class OhInput extends OhElement {
119
125
  /* ─── Focus: even inner ring on all sides (no layout shift) ─── */
120
126
  .input:focus {
121
127
  outline: none;
122
- background-color: var(--oh-color-surface-white);
123
- border-color: var(--oh-color-border-focus);
128
+ background-color: var(--oh-color-surface-highlight);
129
+ border-color: var(--oh-focus-ring-color);
124
130
 
125
131
  /* 2px inset ring + 2.5px border = ~4.5px total, even on all sides */
126
- box-shadow: inset 0 0 0 2px var(--oh-color-border-focus);
132
+ box-shadow: inset 0 0 0 2px var(--oh-focus-ring-color);
127
133
  }
128
134
 
129
135
  /* ═══════════════════════════════════════════════════════════════
@@ -131,7 +137,7 @@ let OhInput = class OhInput extends OhElement {
131
137
  ═══════════════════════════════════════════════════════════════ */
132
138
 
133
139
  .input {
134
- font-size: var(--oh-font-size-lg);
140
+ font-size: var(--oh-typography-control-font-size-md);
135
141
  padding: var(--oh-spacing-3) var(--oh-spacing-4);
136
142
  min-height: var(--oh-input-size-md-min-height);
137
143
  }
@@ -157,10 +163,10 @@ let OhInput = class OhInput extends OhElement {
157
163
  ═══════════════════════════════════════════════════════════════ */
158
164
 
159
165
  .helper {
160
- font-family: var(--oh-font-family-sans);
161
- font-size: var(--oh-font-size-base);
166
+ font-family: var(--oh-typography-body-font-family);
167
+ font-size: var(--oh-typography-body-base-font-size);
162
168
  color: var(--oh-color-text-secondary);
163
- letter-spacing: var(--oh-font-letter-spacing-wide);
169
+ letter-spacing: var(--oh-typography-control-letter-spacing);
164
170
  }
165
171
 
166
172
  .helper--error {
@@ -197,14 +203,14 @@ let OhInput = class OhInput extends OhElement {
197
203
 
198
204
  /* Forced Focus */
199
205
  :host([force-state="focus"]) .input {
200
- background-color: var(--oh-color-surface-white);
201
- border-color: var(--oh-color-border-focus);
202
- box-shadow: inset 0 0 0 2px var(--oh-color-border-focus);
206
+ background-color: var(--oh-color-surface-highlight);
207
+ border-color: var(--oh-focus-ring-color);
208
+ box-shadow: inset 0 0 0 2px var(--oh-focus-ring-color);
203
209
  }
204
210
 
205
211
  /* Error + Forced Hover */
206
212
  :host([force-state="hover"]) .input--error {
207
- border-color: var(--oh-color-feedback-error-hover, #b83a00);
213
+ border-color: var(--oh-color-feedback-error-hover);
208
214
  }
209
215
 
210
216
  /* Error + Forced Focus */
@@ -228,6 +234,11 @@ let OhInput = class OhInput extends OhElement {
228
234
  blur() {
229
235
  this._input?.blur();
230
236
  }
237
+ willUpdate(changed) {
238
+ if (this.hasUpdated && changed.has("errorText")) {
239
+ this._announceError = !!this.errorText;
240
+ }
241
+ }
231
242
  render() {
232
243
  const hasError = !!this.errorText;
233
244
  const helperContent = hasError ? this.errorText : this.helperText;
@@ -263,25 +274,23 @@ let OhInput = class OhInput extends OhElement {
263
274
  @change=${this._handleChange}
264
275
  />
265
276
 
266
- ${helperContent
277
+ ${hasError
267
278
  ? html `
268
- <span
279
+ <span
269
280
  id="helper"
270
- class="helper ${hasError ? "helper--error" : ""}"
281
+ class="helper helper--error"
271
282
  part="helper"
272
- role=${hasError ? "alert" : nothing}
283
+ role=${this._announceError ? "alert" : nothing}
273
284
  >
274
- ${hasError
275
- ? html `
276
- <svg class="error-icon" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
277
- <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" />
278
- </svg>
279
- `
280
- : nothing}
281
- ${helperContent}
285
+ <svg class="error-icon" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
286
+ <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" />
287
+ </svg>
288
+ ${this.errorText}
282
289
  </span>
283
290
  `
284
- : nothing}
291
+ : this.helperText
292
+ ? html `<span id="helper" class="helper" part="helper">${this.helperText}</span>`
293
+ : nothing}
285
294
  </div>
286
295
  `;
287
296
  }
@@ -313,6 +322,9 @@ __decorate([
313
322
  __decorate([
314
323
  query("input")
315
324
  ], OhInput.prototype, "_input", void 0);
325
+ __decorate([
326
+ state()
327
+ ], OhInput.prototype, "_announceError", void 0);
316
328
  OhInput = __decorate([
317
329
  customElement("oh-input")
318
330
  ], OhInput);
@@ -1 +1 @@
1
- {"version":3,"file":"oh-input.js","sourceRoot":"","sources":["../src/oh-input.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oh-input.js","sourceRoot":"","sources":["../src/oh-input.ts"],"names":[],"mappings":"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"}
package/dist/oh-link.d.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  * 1. INLINE VARIANT
10
10
  * - Dotted underline (quirky, retro feel)
11
11
  * - Becomes solid on hover
12
- * - Warm marmalade color
12
+ * - Warm brand orange
13
13
  * - Subtle but distinctive
14
14
  *
15
15
  * 2. STANDALONE VARIANT
package/dist/oh-link.js CHANGED
@@ -9,7 +9,7 @@
9
9
  * 1. INLINE VARIANT
10
10
  * - Dotted underline (quirky, retro feel)
11
11
  * - Becomes solid on hover
12
- * - Warm marmalade color
12
+ * - Warm brand orange
13
13
  * - Subtle but distinctive
14
14
  *
15
15
  * 2. STANDALONE VARIANT
@@ -57,8 +57,8 @@ let OhLink = class OhLink extends OhElement {
57
57
  }
58
58
 
59
59
  .link {
60
- font-family: var(--oh-font-family-sans);
61
- color: var(--oh-color-brand-primary);
60
+ font-family: var(--oh-typography-body-font-family);
61
+ color: var(--oh-color-text-link);
62
62
  text-decoration: none;
63
63
  cursor: pointer;
64
64
  position: relative;
@@ -84,8 +84,8 @@ let OhLink = class OhLink extends OhElement {
84
84
  height: 2px;
85
85
  background: repeating-linear-gradient(
86
86
  to right,
87
- var(--oh-color-brand-primary) 0,
88
- var(--oh-color-brand-primary) 4px,
87
+ var(--oh-color-text-link) 0,
88
+ var(--oh-color-text-link) 4px,
89
89
  transparent 4px,
90
90
  transparent 8px
91
91
  );
@@ -138,8 +138,8 @@ let OhLink = class OhLink extends OhElement {
138
138
  .link--inline:focus:not(:focus-visible) .link__text::after {
139
139
  background: repeating-linear-gradient(
140
140
  to right,
141
- var(--oh-color-brand-primary) 0,
142
- var(--oh-color-brand-primary) 4px,
141
+ var(--oh-color-text-link) 0,
142
+ var(--oh-color-text-link) 4px,
143
143
  transparent 4px,
144
144
  transparent 8px
145
145
  );
@@ -155,8 +155,8 @@ let OhLink = class OhLink extends OhElement {
155
155
  display: inline-flex;
156
156
  align-items: center;
157
157
  gap: var(--oh-spacing-2);
158
- font-weight: var(--oh-font-weight-semibold);
159
- font-size: var(--oh-font-size-lg);
158
+ font-weight: var(--oh-typography-emphasis-font-weight);
159
+ font-size: var(--oh-typography-body-lg-font-size);
160
160
  text-decoration: none;
161
161
  padding: var(--oh-spacing-1) 0;
162
162
  }
@@ -174,7 +174,7 @@ let OhLink = class OhLink extends OhElement {
174
174
  outline: 2px solid transparent;
175
175
  outline-offset: 2px;
176
176
  background-color: var(--oh-focus-glow-color);
177
- border-radius: var(--oh-radius-xs);
177
+ border-radius: var(--oh-shape-tight);
178
178
  padding: var(--oh-spacing-1) var(--oh-spacing-2);
179
179
  margin: 0 calc(-1 * var(--oh-spacing-2));
180
180
  }
@@ -195,8 +195,8 @@ let OhLink = class OhLink extends OhElement {
195
195
  .link--standalone:focus:not(:focus-visible) .link__text::after {
196
196
  background: repeating-linear-gradient(
197
197
  to right,
198
- var(--oh-color-brand-primary) 0,
199
- var(--oh-color-brand-primary) 4px,
198
+ var(--oh-color-text-link) 0,
199
+ var(--oh-color-text-link) 4px,
200
200
  transparent 4px,
201
201
  transparent 8px
202
202
  );
@@ -253,7 +253,7 @@ let OhLink = class OhLink extends OhElement {
253
253
  ═══════════════════════════════════════════════════════════════ */
254
254
 
255
255
  .link:visited {
256
- color: var(--oh-color-brand-primary);
256
+ color: var(--oh-color-text-link);
257
257
  }
258
258
 
259
259
  /* ═══════════════════════════════════════════════════════════════
@@ -280,7 +280,7 @@ let OhLink = class OhLink extends OhElement {
280
280
  }
281
281
 
282
282
  :host([inverse]) .link--inline:focus {
283
- background-color: rgba(0, 0, 0, 0.1);
283
+ background-color: var(--oh-link-inverse-focus-background);
284
284
  }
285
285
 
286
286
  :host([inverse]) .link--inline:focus .link__text::after {
@@ -302,7 +302,7 @@ let OhLink = class OhLink extends OhElement {
302
302
  }
303
303
 
304
304
  :host([inverse]) .link--standalone:focus {
305
- background-color: rgba(0, 0, 0, 0.1);
305
+ background-color: var(--oh-link-inverse-focus-background);
306
306
  }
307
307
 
308
308
  :host([inverse]) .link--standalone:focus .link__text::after {
@@ -11,7 +11,7 @@
11
11
  * - Warm backdrop, not pure black
12
12
  *
13
13
  * 2. ACCESSIBLE
14
- * - Focus trap when open
14
+ * - Focus trap when open (focus guards at each end of the dialog)
15
15
  * - Escape key closes (when dismissible)
16
16
  * - Focus returns to trigger on close
17
17
  * - role="dialog" + aria-modal="true"
@@ -38,8 +38,14 @@ export declare class OhModal extends OhElement {
38
38
  private _onOpen;
39
39
  private _onClose;
40
40
  private _handleKeyDown;
41
- private _trapFocus;
41
+ /** Focusable elements in the dialog, in tab order, excluding the guards. */
42
42
  private _getFocusableElements;
43
+ /**
44
+ * Focus guards: Tab past the last control lands on the end guard, which
45
+ * wraps to the first; Shift+Tab before the first wraps to the last. This
46
+ * holds however the browser orders Tab (Safari skips links by default).
47
+ */
48
+ private _focusEdge;
43
49
  private _focusFirstElement;
44
50
  private _handleBackdropClick;
45
51
  private _requestClose;
@@ -1 +1 @@
1
- {"version":3,"file":"oh-modal.d.ts","sourceRoot":"","sources":["../src/oh-modal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAElD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,qBACa,OAAQ,SAAQ,SAAS;IACpC,OAAgB,MAAM,4BA0NpB;IAGF,IAAI,UAAS;IAGb,OAAO,SAAM;IAGb,WAAW,UAAQ;IAGnB,IAAI,EAAE,SAAS,CAAQ;IAGvB,OAAO,CAAC,sBAAsB,CAA4B;IAI1D,OAAO,CAAC,YAAY,CAAqB;IAEzC,iBAAiB;IAKjB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAU/C,OAAO,CAAC,OAAO;IAoBf,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,aAAa;IAKrB,oBAAoB;IAMpB,MAAM;CA8DP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC;KACrB;CACF"}
1
+ {"version":3,"file":"oh-modal.d.ts","sourceRoot":"","sources":["../src/oh-modal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAGlD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,qBACa,OAAQ,SAAQ,SAAS;IACpC,OAAgB,MAAM,4BA4OpB;IAGF,IAAI,UAAS;IAGb,OAAO,SAAM;IAGb,WAAW,UAAQ;IAGnB,IAAI,EAAE,SAAS,CAAQ;IAGvB,OAAO,CAAC,sBAAsB,CAA4B;IAI1D,OAAO,CAAC,YAAY,CAAqB;IAEzC,iBAAiB;IAKjB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAU/C,OAAO,CAAC,OAAO;IAwBf,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,cAAc;IAOtB,4EAA4E;IAC5E,OAAO,CAAC,qBAAqB;IAK7B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,aAAa;IAKrB,oBAAoB;IAMpB,MAAM;CAgEP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,UAAU,EAAE,OAAO,CAAC;KACrB;CACF"}