@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
@@ -13,6 +13,7 @@
13
13
  *
14
14
  * @element oh-checkbox-group
15
15
  */
16
+ import { type PropertyValues } from "lit";
16
17
  import { OhElement } from "./base.js";
17
18
  export interface CheckboxOption {
18
19
  label: string;
@@ -29,6 +30,13 @@ export declare class OhCheckboxGroup extends OhElement {
29
30
  error: boolean;
30
31
  errorMessage: string;
31
32
  private _handleChange;
33
+ /**
34
+ * Errors that appear after first render (e.g. on submit) are announced via
35
+ * role="alert". Errors present on page load are only linked with
36
+ * aria-describedby, so they aren't read out unprompted.
37
+ */
38
+ private _announceError;
39
+ willUpdate(changed: PropertyValues): void;
32
40
  render(): import("lit").TemplateResult<1>;
33
41
  }
34
42
  declare global {
@@ -1 +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"}
1
+ {"version":3,"file":"oh-checkbox-group.d.ts","sourceRoot":"","sources":["../src/oh-checkbox-group.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAE9D,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;;;;OAIG;IAEH,OAAO,CAAC,cAAc,CAAS;IAE/B,UAAU,CAAC,OAAO,EAAE,cAAc;IAMlC,MAAM;CA8CP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,mBAAmB,EAAE,eAAe,CAAC;KACtC;CACF"}
@@ -16,7 +16,7 @@ figma.connect("https://www.figma.com/design/q9ZYrOj2w9DrTVmgQFU7bu/OHDS?node-id=
16
16
  legend="${props.legend}"
17
17
  ?required="${props.required}"
18
18
  ?error="${props.error}"
19
- error-message="${props.errorMessage}"
19
+ errormessage="${props.errorMessage}"
20
20
  .options="\${options}"
21
21
  ></oh-checkbox-group>
22
22
  `,
@@ -1 +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"}
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;wBACL,KAAK,CAAC,YAAY;;;KAGrC;CACF,CACF,CAAC"}
@@ -20,7 +20,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
20
20
  return c > 3 && r && Object.defineProperty(target, key, r), r;
21
21
  };
22
22
  import { html, css, nothing } from "lit";
23
- import { customElement, property } from "lit/decorators.js";
23
+ import { customElement, property, state } from "lit/decorators.js";
24
24
  import { OhElement, baseStyles } from "./base.js";
25
25
  let OhCheckboxGroup = class OhCheckboxGroup extends OhElement {
26
26
  constructor() {
@@ -32,6 +32,12 @@ let OhCheckboxGroup = class OhCheckboxGroup extends OhElement {
32
32
  this.required = false;
33
33
  this.error = false;
34
34
  this.errorMessage = "";
35
+ /**
36
+ * Errors that appear after first render (e.g. on submit) are announced via
37
+ * role="alert". Errors present on page load are only linked with
38
+ * aria-describedby, so they aren't read out unprompted.
39
+ */
40
+ this._announceError = false;
35
41
  }
36
42
  static { this.styles = [
37
43
  baseStyles,
@@ -58,9 +64,9 @@ let OhCheckboxGroup = class OhCheckboxGroup extends OhElement {
58
64
  }
59
65
 
60
66
  legend {
61
- font-family: var(--oh-font-family-sans);
62
- font-size: var(--oh-font-size-base);
63
- font-weight: var(--oh-font-weight-semibold);
67
+ font-family: var(--oh-typography-control-font-family);
68
+ font-size: var(--oh-typography-control-font-size-sm);
69
+ font-weight: var(--oh-typography-control-font-weight);
64
70
  color: var(--oh-color-text-primary);
65
71
  margin-bottom: var(--oh-spacing-2);
66
72
  padding: 0;
@@ -102,10 +108,10 @@ let OhCheckboxGroup = class OhCheckboxGroup extends OhElement {
102
108
  width: 24px;
103
109
  height: 24px;
104
110
  flex-shrink: 0;
105
- border: var(--oh-input-base-border-width) solid var(--oh-color-border-emphasis);
106
- border-radius: var(--oh-radius-sm);
111
+ border: var(--oh-stroke-control) solid var(--oh-color-border-emphasis);
112
+ border-radius: var(--oh-shape-compact);
107
113
  background-color: var(--oh-color-surface-base);
108
- box-shadow: 3px 3px 0 0 var(--oh-shadow-secondary);
114
+ box-shadow: var(--oh-elevation-offset-md) var(--oh-elevation-offset-md) 0 0 var(--oh-shadow-secondary);
109
115
  transition:
110
116
  transform var(--oh-motion-snappy) var(--oh-motion-ease-playful),
111
117
  box-shadow var(--oh-motion-snappy) var(--oh-motion-ease-playful),
@@ -128,9 +134,9 @@ let OhCheckboxGroup = class OhCheckboxGroup extends OhElement {
128
134
  }
129
135
 
130
136
  .option-label {
131
- font-family: var(--oh-font-family-sans);
132
- font-size: var(--oh-font-size-lg);
133
- line-height: var(--oh-font-line-height-normal);
137
+ font-family: var(--oh-typography-control-font-family);
138
+ font-size: var(--oh-typography-control-font-size-md);
139
+ line-height: var(--oh-typography-body-base-line-height);
134
140
  color: var(--oh-color-text-primary);
135
141
  user-select: none;
136
142
  }
@@ -142,21 +148,21 @@ let OhCheckboxGroup = class OhCheckboxGroup extends OhElement {
142
148
  /* Hover: lift up-left, shadow grows */
143
149
  .checkbox-option:hover .checkbox-box {
144
150
  border-color: var(--oh-color-border-hover);
145
- transform: translate(-1px, -1px);
146
- box-shadow: 4px 4px 0 0 var(--oh-shadow-secondary);
151
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
152
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-secondary);
147
153
  }
148
154
 
149
155
  /* Active: press down-right, shadow shrinks */
150
156
  .checkbox-option:active .checkbox-box {
151
- transform: translate(1px, 1px);
152
- box-shadow: 1px 1px 0 0 var(--oh-shadow-secondary);
157
+ transform: translate(var(--oh-lift-press-sm), var(--oh-lift-press-sm));
158
+ box-shadow: var(--oh-elevation-offset-xs) var(--oh-elevation-offset-xs) 0 0 var(--oh-shadow-secondary);
153
159
  }
154
160
 
155
161
  /* Checked: primary color with warm shadow */
156
162
  .native-checkbox:checked + .checkbox-box {
157
163
  background-color: var(--oh-color-brand-primary);
158
164
  border-color: var(--oh-color-brand-primary);
159
- box-shadow: 3px 3px 0 0 var(--oh-shadow-primary);
165
+ box-shadow: var(--oh-elevation-offset-md) var(--oh-elevation-offset-md) 0 0 var(--oh-shadow-primary);
160
166
  }
161
167
 
162
168
  .native-checkbox:checked + .checkbox-box::after {
@@ -167,15 +173,15 @@ let OhCheckboxGroup = class OhCheckboxGroup extends OhElement {
167
173
  .checkbox-option:hover .native-checkbox:checked + .checkbox-box {
168
174
  background-color: var(--oh-color-brand-primary-hover);
169
175
  border-color: var(--oh-color-brand-primary-hover);
170
- transform: translate(-1px, -1px);
171
- box-shadow: 4px 4px 0 0 var(--oh-shadow-primary);
176
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
177
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-primary);
172
178
  }
173
179
 
174
180
  /* Checked + Active */
175
181
  .checkbox-option:active .native-checkbox:checked + .checkbox-box {
176
182
  background-color: var(--oh-color-brand-primary-active);
177
- transform: translate(1px, 1px);
178
- box-shadow: 1px 1px 0 0 var(--oh-shadow-primary);
183
+ transform: translate(var(--oh-lift-press-sm), var(--oh-lift-press-sm));
184
+ box-shadow: var(--oh-elevation-offset-xs) var(--oh-elevation-offset-xs) 0 0 var(--oh-shadow-primary);
179
185
  }
180
186
 
181
187
  /* Focus: underline the label (accessible indicator) */
@@ -190,28 +196,28 @@ let OhCheckboxGroup = class OhCheckboxGroup extends OhElement {
190
196
 
191
197
  :host([error]) .checkbox-box {
192
198
  border-color: var(--oh-color-feedback-error);
193
- box-shadow: 3px 3px 0 0 var(--oh-shadow-error);
199
+ box-shadow: var(--oh-elevation-offset-md) var(--oh-elevation-offset-md) 0 0 var(--oh-shadow-error);
194
200
  }
195
201
 
196
202
  :host([error]) .checkbox-option:hover .checkbox-box {
197
203
  border-color: var(--oh-color-feedback-error-hover);
198
- box-shadow: 4px 4px 0 0 var(--oh-shadow-error);
204
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-error);
199
205
  }
200
206
 
201
207
  .error-message {
202
208
  display: flex;
203
209
  align-items: center;
204
210
  gap: var(--oh-spacing-2);
205
- font-family: var(--oh-font-family-sans);
206
- font-size: var(--oh-font-size-base);
211
+ font-family: var(--oh-typography-body-font-family);
212
+ font-size: var(--oh-typography-body-base-font-size);
207
213
  color: var(--oh-color-feedback-error);
208
214
  margin-bottom: var(--oh-spacing-2);
209
215
  }
210
216
 
211
217
  .error-icon {
212
218
  flex-shrink: 0;
213
- width: var(--oh-font-size-lg);
214
- height: var(--oh-font-size-lg);
219
+ width: var(--oh-typography-body-lg-font-size);
220
+ height: var(--oh-typography-body-lg-font-size);
215
221
  }
216
222
 
217
223
  /* ═══════════════════════════════════════════════════════════════
@@ -236,6 +242,11 @@ let OhCheckboxGroup = class OhCheckboxGroup extends OhElement {
236
242
  }
237
243
  this.emit("oh-change", { value: this.value });
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
  <fieldset
@@ -252,7 +263,7 @@ let OhCheckboxGroup = class OhCheckboxGroup 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>
@@ -302,6 +313,9 @@ __decorate([
302
313
  __decorate([
303
314
  property({ type: String })
304
315
  ], OhCheckboxGroup.prototype, "errorMessage", void 0);
316
+ __decorate([
317
+ state()
318
+ ], OhCheckboxGroup.prototype, "_announceError", void 0);
305
319
  OhCheckboxGroup = __decorate([
306
320
  customElement("oh-checkbox-group")
307
321
  ], OhCheckboxGroup);
@@ -1 +1 @@
1
- {"version":3,"file":"oh-checkbox-group.js","sourceRoot":"","sources":["../src/oh-checkbox-group.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oh-checkbox-group.js","sourceRoot":"","sources":["../src/oh-checkbox-group.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
  * - Inset shadow when unchecked (pressed into page)
12
- * - 6px border radius (slightly less than buttons)
12
+ * - shape.compact corners (smaller than buttons)
13
13
  *
14
14
  * 2. CHECKED STATE
15
15
  * - Filled with primary color
@@ -24,6 +24,7 @@
24
24
  *
25
25
  * @element oh-checkbox
26
26
  */
27
+ import { type PropertyValues } from "lit";
27
28
  import { OhElement } from "./base.js";
28
29
  export type CheckboxState = "default" | "hover" | "focus";
29
30
  export declare class OhCheckbox extends OhElement {
@@ -40,6 +41,14 @@ export declare class OhCheckbox extends OhElement {
40
41
  */
41
42
  forceState: CheckboxState;
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-checkbox.d.ts","sourceRoot":"","sources":["../src/oh-checkbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAElD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1D,qBACa,UAAW,SAAQ,SAAS;IACvC,OAAgB,MAAM,4BAyMpB;IAGF,OAAO,UAAS;IAGhB,KAAK,SAAM;IAGX,IAAI,SAAM;IAGV,KAAK,SAAM;IAGX,KAAK,UAAS;IAGd,YAAY,SAAM;IAElB;;;OAGG;IAEH,UAAU,EAAE,aAAa,CAAa;IAEtC,OAAO,CAAC,aAAa;IAMrB,MAAM;CAgCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,UAAU,CAAC;KAC3B;CACF"}
1
+ {"version":3,"file":"oh-checkbox.d.ts","sourceRoot":"","sources":["../src/oh-checkbox.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,aAAa,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AAE1D,qBACa,UAAW,SAAQ,SAAS;IACvC,OAAgB,MAAM,4BAyMpB;IAGF,OAAO,UAAS;IAGhB,KAAK,SAAM;IAGX,IAAI,SAAM;IAGV,KAAK,SAAM;IAGX,KAAK,UAAS;IAGd,YAAY,SAAM;IAElB;;;OAGG;IAEH,UAAU,EAAE,aAAa,CAAa;IAEtC,OAAO,CAAC,aAAa;IAMrB;;;;OAIG;IAEH,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,QAAQ,CAAkE;IAElF,UAAU,CAAC,OAAO,EAAE,cAAc;IAMlC,MAAM;CAiCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,aAAa,EAAE,UAAU,CAAC;KAC3B;CACF"}
@@ -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
  * - Inset shadow when unchecked (pressed into page)
12
- * - 6px border radius (slightly less than buttons)
12
+ * - shape.compact corners (smaller than buttons)
13
13
  *
14
14
  * 2. CHECKED STATE
15
15
  * - Filled with primary color
@@ -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 OhCheckbox = class OhCheckbox extends OhElement {
37
37
  constructor() {
@@ -47,6 +47,13 @@ let OhCheckbox = class OhCheckbox 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-checkbox-error-${Math.random().toString(36).slice(2, 11)}`;
50
57
  }
51
58
  static { this.styles = [
52
59
  baseStyles,
@@ -91,12 +98,12 @@ let OhCheckbox = class OhCheckbox extends OhElement {
91
98
  flex-shrink: 0;
92
99
 
93
100
  /* Chunky border */
94
- border: var(--oh-input-base-border-width) solid var(--oh-color-border-emphasis);
95
- border-radius: var(--oh-radius-sm);
101
+ border: var(--oh-stroke-control) solid var(--oh-color-border-emphasis);
102
+ border-radius: var(--oh-shape-compact);
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),
@@ -127,21 +134,21 @@ let OhCheckbox = class OhCheckbox extends OhElement {
127
134
  /* Hover: lift up-left, shadow grows */
128
135
  .checkbox-wrapper:hover .checkbox-box {
129
136
  border-color: var(--oh-color-border-hover);
130
- transform: translate(-1px, -1px);
131
- box-shadow: 4px 4px 0 0 var(--oh-shadow-secondary);
137
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
138
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-secondary);
132
139
  }
133
140
 
134
141
  /* Active: press down-right, shadow shrinks */
135
142
  .checkbox-wrapper:active .checkbox-box {
136
- transform: translate(1px, 1px);
137
- box-shadow: 1px 1px 0 0 var(--oh-shadow-secondary);
143
+ transform: translate(var(--oh-lift-press-sm), var(--oh-lift-press-sm));
144
+ box-shadow: var(--oh-elevation-offset-xs) var(--oh-elevation-offset-xs) 0 0 var(--oh-shadow-secondary);
138
145
  }
139
146
 
140
147
  /* Checked: primary color with warm shadow */
141
148
  .native-checkbox:checked + .checkbox-box {
142
149
  background-color: var(--oh-color-brand-primary);
143
150
  border-color: var(--oh-color-brand-primary);
144
- box-shadow: 3px 3px 0 0 var(--oh-shadow-primary);
151
+ box-shadow: var(--oh-elevation-offset-md) var(--oh-elevation-offset-md) 0 0 var(--oh-shadow-primary);
145
152
  }
146
153
 
147
154
  .native-checkbox:checked + .checkbox-box::after {
@@ -152,15 +159,15 @@ let OhCheckbox = class OhCheckbox extends OhElement {
152
159
  .checkbox-wrapper:hover .native-checkbox:checked + .checkbox-box {
153
160
  background-color: var(--oh-color-brand-primary-hover);
154
161
  border-color: var(--oh-color-brand-primary-hover);
155
- transform: translate(-1px, -1px);
156
- box-shadow: 4px 4px 0 0 var(--oh-shadow-primary);
162
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
163
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-primary);
157
164
  }
158
165
 
159
166
  /* Checked + Active */
160
167
  .checkbox-wrapper:active .native-checkbox:checked + .checkbox-box {
161
168
  background-color: var(--oh-color-brand-primary-active);
162
- transform: translate(1px, 1px);
163
- box-shadow: 1px 1px 0 0 var(--oh-shadow-primary);
169
+ transform: translate(var(--oh-lift-press-sm), var(--oh-lift-press-sm));
170
+ box-shadow: var(--oh-elevation-offset-xs) var(--oh-elevation-offset-xs) 0 0 var(--oh-shadow-primary);
164
171
  }
165
172
 
166
173
  /* Focus: underline the label (accessible indicator) */
@@ -174,9 +181,9 @@ let OhCheckbox = class OhCheckbox extends OhElement {
174
181
  ═══════════════════════════════════════════════════════════════ */
175
182
 
176
183
  .label {
177
- font-family: var(--oh-font-family-sans);
178
- font-size: var(--oh-font-size-lg);
179
- line-height: var(--oh-font-line-height-normal);
184
+ font-family: var(--oh-typography-control-font-family);
185
+ font-size: var(--oh-typography-control-font-size-md);
186
+ line-height: var(--oh-typography-body-base-line-height);
180
187
  color: var(--oh-color-text-primary);
181
188
  user-select: none;
182
189
  padding-top: 0; /* Align with checkbox */
@@ -188,20 +195,20 @@ let OhCheckbox = class OhCheckbox extends OhElement {
188
195
 
189
196
  :host([error]) .checkbox-box {
190
197
  border-color: var(--oh-color-feedback-error);
191
- 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);
192
199
  }
193
200
 
194
201
  :host([error]) .checkbox-wrapper:hover .checkbox-box {
195
202
  border-color: var(--oh-color-feedback-error-hover);
196
- 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);
197
204
  }
198
205
 
199
206
  .error-message {
200
207
  display: flex;
201
208
  align-items: center;
202
209
  gap: var(--oh-spacing-2);
203
- font-family: var(--oh-font-family-sans);
204
- 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);
205
212
  color: var(--oh-color-feedback-error);
206
213
  margin-top: var(--oh-spacing-1);
207
214
  margin-left: calc(24px + var(--oh-spacing-3)); /* Align with label */
@@ -231,8 +238,8 @@ let OhCheckbox = class OhCheckbox extends OhElement {
231
238
  /* Forced Hover - Unchecked */
232
239
  :host([force-state="hover"]) .checkbox-box {
233
240
  border-color: var(--oh-color-border-hover);
234
- transform: translate(-1px, -1px);
235
- box-shadow: 4px 4px 0 0 var(--oh-shadow-secondary);
241
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
242
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-secondary);
236
243
  }
237
244
 
238
245
  /* Forced Focus - Unchecked */
@@ -245,8 +252,8 @@ let OhCheckbox = class OhCheckbox extends OhElement {
245
252
  :host([force-state="hover"][checked]) .checkbox-box {
246
253
  background-color: var(--oh-color-brand-primary-hover);
247
254
  border-color: var(--oh-color-brand-primary-hover);
248
- transform: translate(-1px, -1px);
249
- box-shadow: 4px 4px 0 0 var(--oh-shadow-primary);
255
+ transform: translate(var(--oh-lift-hover-sm), var(--oh-lift-hover-sm));
256
+ box-shadow: var(--oh-elevation-offset-lg) var(--oh-elevation-offset-lg) 0 0 var(--oh-shadow-primary);
250
257
  }
251
258
  `,
252
259
  ]; }
@@ -255,6 +262,11 @@ let OhCheckbox = class OhCheckbox extends OhElement {
255
262
  this.checked = target.checked;
256
263
  this.emit("oh-change", { checked: this.checked, value: this.value });
257
264
  }
265
+ willUpdate(changed) {
266
+ if (this.hasUpdated && (changed.has("error") || changed.has("errorMessage"))) {
267
+ this._announceError = !!(this.error && this.errorMessage);
268
+ }
269
+ }
258
270
  render() {
259
271
  const inputId = this.name || `oh-checkbox-${Math.random().toString(36).substr(2, 9)}`;
260
272
  return html `
@@ -268,6 +280,7 @@ let OhCheckbox = class OhCheckbox extends OhElement {
268
280
  .value=${this.value}
269
281
  .checked=${this.checked}
270
282
  aria-invalid=${this.error ? "true" : "false"}
283
+ aria-describedby=${this.error && this.errorMessage ? this._errorId : nothing}
271
284
  @change=${this._handleChange}
272
285
  />
273
286
  <span class="checkbox-box" part="box"></span>
@@ -275,7 +288,7 @@ let OhCheckbox = class OhCheckbox extends OhElement {
275
288
  </label>
276
289
  ${this.error && this.errorMessage
277
290
  ? html `
278
- <div class="error-message" part="error" role="alert">
291
+ <div id=${this._errorId} class="error-message" part="error" role=${this._announceError ? "alert" : nothing}>
279
292
  <svg class="error-icon" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
280
293
  <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" />
281
294
  </svg>
@@ -308,6 +321,9 @@ __decorate([
308
321
  __decorate([
309
322
  property({ type: String, reflect: true, attribute: "force-state" })
310
323
  ], OhCheckbox.prototype, "forceState", void 0);
324
+ __decorate([
325
+ state()
326
+ ], OhCheckbox.prototype, "_announceError", void 0);
311
327
  OhCheckbox = __decorate([
312
328
  customElement("oh-checkbox")
313
329
  ], OhCheckbox);
@@ -1 +1 @@
1
- {"version":3,"file":"oh-checkbox.js","sourceRoot":"","sources":["../src/oh-checkbox.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,UAAU,GAAhB,MAAM,UAAW,SAAQ,SAAS;IAAlC;;QA6ML,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,GAAkB,SAAS,CAAC;IAwCxC,CAAC;aA1QiB,WAAM,GAAG;QACvB,UAAU;QACV,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsMF;KACF,AAzMqB,CAyMpB;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,IAAI,CAAC,IAAI,IAAI,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAEtF,OAAO,IAAI,CAAA;;8CAE+B,OAAO;;;;iBAIpC,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;2CAC3B;AAGhB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yCAChB;AAGX;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wCACjB;AAGV;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;yCAChB;AAGX;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;yCAC7B;AAGd;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDACT;AAOlB;IADC,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;8CAC9B;AAnO3B,UAAU;IADtB,aAAa,CAAC,aAAa,CAAC;GAChB,UAAU,CA2QtB"}
1
+ {"version":3,"file":"oh-checkbox.js","sourceRoot":"","sources":["../src/oh-checkbox.ts"],"names":[],"mappings":"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"}
@@ -6,11 +6,11 @@
6
6
  *
7
7
  * DESIGN DECISIONS:
8
8
  * ─────────────────
9
- * 1. RESPONSIVE MAX-WIDTHS
10
- * - sm: 640px (tight, focused content)
11
- * - md: 768px (articles, forms)
12
- * - lg: 1024px (standard pages)
13
- * - xl: 1280px (wide layouts)
9
+ * 1. RESPONSIVE MAX-WIDTHS (layout.container.*)
10
+ * - sm: tight, focused content
11
+ * - md: articles, forms
12
+ * - lg: standard pages
13
+ * - xl: wide layouts
14
14
  * - full: 100% (edge-to-edge)
15
15
  *
16
16
  * 2. CONSISTENT PADDING
@@ -6,11 +6,11 @@
6
6
  *
7
7
  * DESIGN DECISIONS:
8
8
  * ─────────────────
9
- * 1. RESPONSIVE MAX-WIDTHS
10
- * - sm: 640px (tight, focused content)
11
- * - md: 768px (articles, forms)
12
- * - lg: 1024px (standard pages)
13
- * - xl: 1280px (wide layouts)
9
+ * 1. RESPONSIVE MAX-WIDTHS (layout.container.*)
10
+ * - sm: tight, focused content
11
+ * - md: articles, forms
12
+ * - lg: standard pages
13
+ * - xl: wide layouts
14
14
  * - full: 100% (edge-to-edge)
15
15
  *
16
16
  * 2. CONSISTENT PADDING
@@ -50,26 +50,26 @@ let OhContainer = class OhContainer extends OhElement {
50
50
  width: 100%;
51
51
  margin-left: auto;
52
52
  margin-right: auto;
53
- padding-left: var(--oh-spacing-4, 16px);
54
- padding-right: var(--oh-spacing-4, 16px);
53
+ padding-left: var(--oh-spacing-4);
54
+ padding-right: var(--oh-spacing-4);
55
55
  box-sizing: border-box;
56
56
  }
57
57
 
58
58
  /* Size variants */
59
59
  :host([size="sm"]) {
60
- max-width: 640px;
60
+ max-width: var(--oh-layout-container-sm);
61
61
  }
62
62
 
63
63
  :host([size="md"]) {
64
- max-width: 768px;
64
+ max-width: var(--oh-layout-container-md);
65
65
  }
66
66
 
67
67
  :host([size="lg"]) {
68
- max-width: 1024px;
68
+ max-width: var(--oh-layout-container-lg);
69
69
  }
70
70
 
71
71
  :host([size="xl"]) {
72
- max-width: 1280px;
72
+ max-width: var(--oh-layout-container-xl);
73
73
  }
74
74
 
75
75
  :host([size="full"]) {
@@ -81,15 +81,15 @@ let OhContainer = class OhContainer extends OhElement {
81
81
  /* Responsive padding */
82
82
  @media (min-width: 640px) {
83
83
  :host {
84
- padding-left: var(--oh-spacing-6, 24px);
85
- padding-right: var(--oh-spacing-6, 24px);
84
+ padding-left: var(--oh-spacing-6);
85
+ padding-right: var(--oh-spacing-6);
86
86
  }
87
87
  }
88
88
 
89
89
  @media (min-width: 1024px) {
90
90
  :host {
91
- padding-left: var(--oh-spacing-8, 32px);
92
- padding-right: var(--oh-spacing-8, 32px);
91
+ padding-left: var(--oh-spacing-8);
92
+ padding-right: var(--oh-spacing-8);
93
93
  }
94
94
  }
95
95
 
@@ -16,7 +16,7 @@
16
16
  * - Smooth slide animation
17
17
  *
18
18
  * 3. ACCESSIBILITY
19
- * - Focus trap when open
19
+ * - Focus trap when open (focus guards at each end of the panel)
20
20
  * - Escape key closes
21
21
  * - aria-modal and role="dialog"
22
22
  * - Returns focus to trigger on close
@@ -43,7 +43,6 @@ export declare class OhDrawer extends OhElement {
43
43
  /** Element that triggered the drawer (for focus return) */
44
44
  private _triggerElement;
45
45
  private _drawer;
46
- private _cleanupFocusTrap?;
47
46
  connectedCallback(): void;
48
47
  disconnectedCallback(): void;
49
48
  updated(changedProperties: Map<string, unknown>): void;
@@ -52,6 +51,12 @@ export declare class OhDrawer extends OhElement {
52
51
  private _handleKeydown;
53
52
  private _close;
54
53
  private _handleBackdropClick;
54
+ /**
55
+ * Focus guards: Tab past the last control lands on the end guard, which
56
+ * wraps to the first; Shift+Tab before the first wraps to the last. This
57
+ * holds however the browser orders Tab (Safari skips links by default).
58
+ */
59
+ private _focusEdge;
55
60
  /** Public method to open the drawer */
56
61
  show(): void;
57
62
  /** Public method to close the drawer */
@@ -1 +1 @@
1
- {"version":3,"file":"oh-drawer.d.ts","sourceRoot":"","sources":["../src/oh-drawer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAGlD,OAAO,gBAAgB,CAAC;AACxB,OAAO,cAAc,CAAC;AAEtB,qBACa,QAAS,SAAQ,SAAS;IACrC,OAAgB,MAAM,4BA+FpB;IAEF,iCAAiC;IAEjC,IAAI,UAAS;IAEb,6BAA6B;IAE7B,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAU;IAEpC,uCAAuC;IAEvC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,2DAA2D;IAE3D,OAAO,CAAC,eAAe,CAA4B;IAGnD,OAAO,CAAC,OAAO,CAAe;IAE9B,OAAO,CAAC,iBAAiB,CAAC,CAAa;IAEvC,iBAAiB;IAKjB,oBAAoB;IAMpB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAU/C,OAAO,CAAC,OAAO;IAqBf,OAAO,CAAC,QAAQ;IAgBhB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,oBAAoB;IAI5B,uCAAuC;IACvC,IAAI;IAIJ,wCAAwC;IACxC,IAAI;IAIJ,MAAM;CA+CP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,QAAQ,CAAC;KACvB;CACF"}
1
+ {"version":3,"file":"oh-drawer.d.ts","sourceRoot":"","sources":["../src/oh-drawer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,OAAO,EAAE,SAAS,EAAc,MAAM,WAAW,CAAC;AAGlD,OAAO,gBAAgB,CAAC;AACxB,OAAO,cAAc,CAAC;AAEtB,qBACa,QAAS,SAAQ,SAAS;IACrC,OAAgB,MAAM,4BAmHpB;IAEF,iCAAiC;IAEjC,IAAI,UAAS;IAEb,6BAA6B;IAE7B,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAU;IAEpC,uCAAuC;IAEvC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,2DAA2D;IAE3D,OAAO,CAAC,eAAe,CAA4B;IAGnD,OAAO,CAAC,OAAO,CAAe;IAE9B,iBAAiB;IAKjB,oBAAoB;IAKpB,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAU/C,OAAO,CAAC,OAAO;IAoBf,OAAO,CAAC,QAAQ;IAYhB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,oBAAoB;IAI5B;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAKlB,uCAAuC;IACvC,IAAI;IAIJ,wCAAwC;IACxC,IAAI;IAIJ,MAAM;CAiDP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,WAAW,EAAE,QAAQ,CAAC;KACvB;CACF"}