@momentumcms/ui 0.3.0 → 0.4.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@momentumcms/ui",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Base UI component library for Momentum CMS",
5
5
  "license": "MIT",
6
6
  "author": "Momentum CMS Contributors",
@@ -32,6 +32,8 @@ type BadgeVariant = 'default' | 'secondary' | 'destructive' | 'outline' | 'succe
32
32
  declare class Badge {
33
33
  readonly variant: _angular_core.InputSignal<BadgeVariant>;
34
34
  readonly class: _angular_core.InputSignal<string>;
35
+ /** ARIA role. Set to 'status' for live-region badges, or null for decorative. */
36
+ readonly role: _angular_core.InputSignal<string | null>;
35
37
  /** Accessible label for screen reader override. */
36
38
  readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
37
39
  readonly hostClass: _angular_core.Signal<string>;
@@ -39,7 +41,7 @@ declare class Badge {
39
41
  readonly variantColor: _angular_core.Signal<string>;
40
42
  readonly variantBorder: _angular_core.Signal<string>;
41
43
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Badge, never>;
42
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Badge, "mcms-badge", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
44
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Badge, "mcms-badge", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
43
45
  }
44
46
 
45
47
  /**
@@ -115,7 +117,7 @@ interface ValidationError {
115
117
  message?: string;
116
118
  [key: string]: unknown;
117
119
  }
118
- type InputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search';
120
+ type InputType = 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search' | 'date' | 'datetime-local';
119
121
 
120
122
  /**
121
123
  * Text input component compatible with Angular Signal Forms.
@@ -147,6 +149,7 @@ declare class Input {
147
149
  readonly name: _angular_core.InputSignal<string>;
148
150
  readonly placeholder: _angular_core.InputSignal<string>;
149
151
  readonly autocomplete: _angular_core.InputSignal<string | undefined>;
152
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
150
153
  readonly describedBy: _angular_core.InputSignal<string | undefined>;
151
154
  readonly min: _angular_core.InputSignal<number | undefined>;
152
155
  readonly max: _angular_core.InputSignal<number | undefined>;
@@ -156,7 +159,7 @@ declare class Input {
156
159
  readonly hasError: _angular_core.Signal<boolean>;
157
160
  readonly ariaDescribedBy: _angular_core.Signal<string | null>;
158
161
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Input, never>;
159
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Input, "mcms-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "describedBy": { "alias": "describedBy"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "blurred": "blurred"; }, never, never, true, never>;
162
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Input, "mcms-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "describedBy": { "alias": "describedBy"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "blurred": "blurred"; }, never, never, true, never>;
160
163
  }
161
164
 
162
165
  /**
@@ -181,13 +184,14 @@ declare class Textarea {
181
184
  readonly name: _angular_core.InputSignal<string>;
182
185
  readonly placeholder: _angular_core.InputSignal<string>;
183
186
  readonly rows: _angular_core.InputSignal<number>;
187
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
184
188
  readonly describedBy: _angular_core.InputSignal<string | undefined>;
185
189
  /** Emitted when the textarea loses focus */
186
190
  readonly blurred: _angular_core.OutputEmitterRef<void>;
187
191
  readonly hasError: _angular_core.Signal<boolean>;
188
192
  readonly ariaDescribedBy: _angular_core.Signal<string | null>;
189
193
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Textarea, never>;
190
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Textarea, "mcms-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "describedBy": { "alias": "describedBy"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "blurred": "blurred"; }, never, never, true, never>;
194
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Textarea, "mcms-textarea", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "describedBy": { "alias": "describedBy"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "blurred": "blurred"; }, never, never, true, never>;
191
195
  }
192
196
 
193
197
  /**
@@ -236,13 +240,14 @@ declare class Switch {
236
240
  readonly disabled: _angular_core.InputSignal<boolean>;
237
241
  readonly errors: _angular_core.InputSignal<readonly ValidationError[]>;
238
242
  readonly id: _angular_core.InputSignal<string>;
243
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
239
244
  readonly describedBy: _angular_core.InputSignal<string | undefined>;
240
245
  readonly hasLabel: _angular_core.InputSignal<boolean>;
241
246
  readonly hasError: _angular_core.Signal<boolean>;
242
247
  readonly ariaDescribedBy: _angular_core.Signal<string | null>;
243
248
  toggle(): void;
244
249
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Switch, never>;
245
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Switch, "mcms-switch", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "describedBy": { "alias": "describedBy"; "required": false; "isSignal": true; }; "hasLabel": { "alias": "hasLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["*"], true, never>;
250
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Switch, "mcms-switch", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "describedBy": { "alias": "describedBy"; "required": false; "isSignal": true; }; "hasLabel": { "alias": "hasLabel"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, ["*"], true, never>;
246
251
  }
247
252
 
248
253
  interface SelectOption {
@@ -308,6 +313,8 @@ declare class RadioGroup {
308
313
  readonly id: _angular_core.InputSignal<string>;
309
314
  readonly name: _angular_core.InputSignal<string>;
310
315
  readonly options: _angular_core.InputSignal<RadioOption[]>;
316
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
317
+ readonly ariaLabelledBy: _angular_core.InputSignal<string | undefined>;
311
318
  readonly describedBy: _angular_core.InputSignal<string | undefined>;
312
319
  readonly required: _angular_core.InputSignal<boolean>;
313
320
  readonly hasError: _angular_core.Signal<boolean>;
@@ -317,7 +324,7 @@ declare class RadioGroup {
317
324
  selectOption(optionValue: string): void;
318
325
  protected onKeydown(event: KeyboardEvent): void;
319
326
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<RadioGroup, never>;
320
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioGroup, "mcms-radio-group", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "describedBy": { "alias": "describedBy"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
327
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RadioGroup, "mcms-radio-group", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledBy": { "alias": "ariaLabelledBy"; "required": false; "isSignal": true; }; "describedBy": { "alias": "describedBy"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
321
328
  }
322
329
 
323
330
  /**
@@ -370,9 +377,19 @@ declare class CardHeader {
370
377
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardHeader, "mcms-card-header", never, {}, {}, never, ["*"], true, never>;
371
378
  }
372
379
 
380
+ /**
381
+ * Card title component that renders as an ARIA heading.
382
+ *
383
+ * Uses `role="heading"` with `aria-level` on the host element instead of
384
+ * native heading elements inside `@switch` blocks. This avoids Angular SSR
385
+ * hydration issues where `<ng-content />` inside control flow blocks causes
386
+ * projected content to be dropped during client-side hydration.
387
+ */
373
388
  declare class CardTitle {
389
+ /** Heading level (1-4). Defaults to 2 for proper document hierarchy. */
390
+ readonly level: _angular_core.InputSignal<1 | 3 | 2 | 4>;
374
391
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardTitle, never>;
375
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardTitle, "mcms-card-title", never, {}, {}, never, ["*"], true, never>;
392
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardTitle, "mcms-card-title", never, { "level": { "alias": "level"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
376
393
  }
377
394
 
378
395
  declare class CardDescription {
@@ -1226,13 +1243,15 @@ declare class Progress {
1226
1243
  readonly value: _angular_core.InputSignal<number | null>;
1227
1244
  /** Maximum value. */
1228
1245
  readonly max: _angular_core.InputSignal<number>;
1246
+ /** Accessible label for the progress bar. */
1247
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
1229
1248
  /** Additional CSS classes. */
1230
1249
  readonly class: _angular_core.InputSignal<string>;
1231
1250
  readonly isIndeterminate: _angular_core.Signal<boolean>;
1232
1251
  readonly progressWidth: _angular_core.Signal<string>;
1233
1252
  readonly hostClasses: _angular_core.Signal<string>;
1234
1253
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Progress, never>;
1235
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<Progress, "mcms-progress", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1254
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Progress, "mcms-progress", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1236
1255
  }
1237
1256
 
1238
1257
  /**