@momentumcms/admin 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.
Files changed (24) hide show
  1. package/fesm2022/{momentumcms-admin-array-field.component-Bjlcczwg.mjs → momentumcms-admin-array-field.component-CLV4Ny9t.mjs} +3 -3
  2. package/fesm2022/{momentumcms-admin-array-field.component-Bjlcczwg.mjs.map → momentumcms-admin-array-field.component-CLV4Ny9t.mjs.map} +1 -1
  3. package/fesm2022/{momentumcms-admin-blocks-field.component-4vLqDGbB.mjs → momentumcms-admin-blocks-field.component-hHiTfUf9.mjs} +3 -3
  4. package/fesm2022/{momentumcms-admin-blocks-field.component-4vLqDGbB.mjs.map → momentumcms-admin-blocks-field.component-hHiTfUf9.mjs.map} +1 -1
  5. package/fesm2022/{momentumcms-admin-collapsible-field.component-63-9kSgm.mjs → momentumcms-admin-collapsible-field.component-BeskwGvi.mjs} +2 -2
  6. package/fesm2022/{momentumcms-admin-collapsible-field.component-63-9kSgm.mjs.map → momentumcms-admin-collapsible-field.component-BeskwGvi.mjs.map} +1 -1
  7. package/fesm2022/{momentumcms-admin-global-edit.page-DSnkwdgn.mjs → momentumcms-admin-global-edit.page-D_ebIITz.mjs} +2 -2
  8. package/fesm2022/{momentumcms-admin-global-edit.page-DSnkwdgn.mjs.map → momentumcms-admin-global-edit.page-D_ebIITz.mjs.map} +1 -1
  9. package/fesm2022/{momentumcms-admin-group-field.component-B48_zbo0.mjs → momentumcms-admin-group-field.component-ffsgbC6o.mjs} +3 -3
  10. package/fesm2022/{momentumcms-admin-group-field.component-B48_zbo0.mjs.map → momentumcms-admin-group-field.component-ffsgbC6o.mjs.map} +1 -1
  11. package/fesm2022/{momentumcms-admin-momentumcms-admin-D_47TVaR.mjs → momentumcms-admin-momentumcms-admin-De5FLr2L.mjs} +633 -577
  12. package/fesm2022/momentumcms-admin-momentumcms-admin-De5FLr2L.mjs.map +1 -0
  13. package/fesm2022/{momentumcms-admin-relationship-field.component-D-UQgd7m.mjs → momentumcms-admin-relationship-field.component-DO0kyAkE.mjs} +3 -3
  14. package/fesm2022/{momentumcms-admin-relationship-field.component-D-UQgd7m.mjs.map → momentumcms-admin-relationship-field.component-DO0kyAkE.mjs.map} +1 -1
  15. package/fesm2022/{momentumcms-admin-rich-text-field.component-BC8pRU89.mjs → momentumcms-admin-rich-text-field.component-BvpufJs3.mjs} +2 -2
  16. package/fesm2022/{momentumcms-admin-rich-text-field.component-BC8pRU89.mjs.map → momentumcms-admin-rich-text-field.component-BvpufJs3.mjs.map} +1 -1
  17. package/fesm2022/{momentumcms-admin-row-field.component--EOPGDtM.mjs → momentumcms-admin-row-field.component-C8ZsdA2w.mjs} +2 -2
  18. package/fesm2022/{momentumcms-admin-row-field.component--EOPGDtM.mjs.map → momentumcms-admin-row-field.component-C8ZsdA2w.mjs.map} +1 -1
  19. package/fesm2022/{momentumcms-admin-tabs-field.component-B4X73eCM.mjs → momentumcms-admin-tabs-field.component-Uatoyjg8.mjs} +2 -2
  20. package/fesm2022/{momentumcms-admin-tabs-field.component-B4X73eCM.mjs.map → momentumcms-admin-tabs-field.component-Uatoyjg8.mjs.map} +1 -1
  21. package/fesm2022/momentumcms-admin.mjs +1 -1
  22. package/package.json +1 -2
  23. package/types/momentumcms-admin.d.ts +2 -2
  24. package/fesm2022/momentumcms-admin-momentumcms-admin-D_47TVaR.mjs.map +0 -1
@@ -11,7 +11,7 @@ import * as i1 from '@angular/cdk/a11y';
11
11
  import { LiveAnnouncer, A11yModule } from '@angular/cdk/a11y';
12
12
  import { flattenDataFields, humanizeFieldName, isUploadCollection, getSoftDeleteField } from '@momentumcms/core';
13
13
  import { NgIcon, provideIcons } from '@ng-icons/core';
14
- import { heroFilm, heroMusicalNote, heroDocumentText, heroArchiveBox, heroPhoto, heroDocument, heroCloudArrowUp, heroXMark, heroPuzzlePiece, heroCog6Tooth, heroChartBarSquare, heroChevronUpDown, heroBolt, heroFolder, heroUsers, heroNewspaper, heroSquares2x2, heroEye, heroPencilSquare, heroArrowDownTray, heroTrash, heroChevronRight, heroChevronDown, heroChevronUp, heroPlus } from '@ng-icons/heroicons/outline';
14
+ import { heroFilm, heroMusicalNote, heroDocumentText, heroArchiveBox, heroPhoto, heroDocument, heroCloudArrowUp, heroXMark, heroCursorArrowRays, heroMap, heroMagnifyingGlass, heroPuzzlePiece, heroCog6Tooth, heroChartBarSquare, heroChevronUpDown, heroBolt, heroFolder, heroUsers, heroNewspaper, heroSquares2x2, heroEye, heroPencilSquare, heroArrowDownTray, heroTrash, heroChevronRight, heroChevronDown, heroChevronUp, heroPlus } from '@ng-icons/heroicons/outline';
15
15
  import { required, validate, applyEach, apply, email, min, max, minLength, maxLength, form, submit } from '@angular/forms/signals';
16
16
  import { moveItemInArray, CdkDropList, CdkDrag, CdkDragPlaceholder } from '@angular/cdk/drag-drop';
17
17
 
@@ -1134,7 +1134,7 @@ function momentumAdminRoutes(configOrOptions) {
1134
1134
  // Global edit
1135
1135
  {
1136
1136
  path: 'globals/:slug',
1137
- loadComponent: () => import('./momentumcms-admin-global-edit.page-DSnkwdgn.mjs').then((m) => m.GlobalEditPage),
1137
+ loadComponent: () => import('./momentumcms-admin-global-edit.page-D_ebIITz.mjs').then((m) => m.GlobalEditPage),
1138
1138
  canDeactivate: [unsavedChangesGuard],
1139
1139
  },
1140
1140
  // Plugin-registered routes
@@ -3770,7 +3770,7 @@ class VersionDiffDialogComponent {
3770
3770
  <button mcms-button variant="outline" [mcmsDialogClose]>Close</button>
3771
3771
  </mcms-dialog-footer>
3772
3772
  </mcms-dialog>
3773
- `, isInline: true, dependencies: [{ kind: "component", type: Dialog, selector: "mcms-dialog", inputs: ["class"] }, { kind: "component", type: DialogHeader, selector: "mcms-dialog-header" }, { kind: "component", type: DialogTitle, selector: "mcms-dialog-title", inputs: ["id"] }, { kind: "component", type: DialogContent, selector: "mcms-dialog-content" }, { kind: "component", type: DialogFooter, selector: "mcms-dialog-footer" }, { kind: "directive", type: DialogClose, selector: "[mcmsDialogClose]", inputs: ["mcmsDialogClose"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "ariaLabel"] }, { kind: "component", type: Skeleton, selector: "mcms-skeleton", inputs: ["class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3773
+ `, isInline: true, dependencies: [{ kind: "component", type: Dialog, selector: "mcms-dialog", inputs: ["class"] }, { kind: "component", type: DialogHeader, selector: "mcms-dialog-header" }, { kind: "component", type: DialogTitle, selector: "mcms-dialog-title", inputs: ["id"] }, { kind: "component", type: DialogContent, selector: "mcms-dialog-content" }, { kind: "component", type: DialogFooter, selector: "mcms-dialog-footer" }, { kind: "directive", type: DialogClose, selector: "[mcmsDialogClose]", inputs: ["mcmsDialogClose"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "role", "ariaLabel"] }, { kind: "component", type: Skeleton, selector: "mcms-skeleton", inputs: ["class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3774
3774
  }
3775
3775
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: VersionDiffDialogComponent, decorators: [{
3776
3776
  type: Component,
@@ -4032,7 +4032,7 @@ class VersionHistoryWidget {
4032
4032
  }
4033
4033
  </div>
4034
4034
  } @else if (error()) {
4035
- <p class="text-sm text-destructive">{{ error() }}</p>
4035
+ <p class="text-sm text-destructive" role="alert">{{ error() }}</p>
4036
4036
  } @else if (versions().length === 0) {
4037
4037
  <p class="text-sm text-muted-foreground">No version history available</p>
4038
4038
  } @else {
@@ -4074,6 +4074,9 @@ class VersionHistoryWidget {
4074
4074
  variant="outline"
4075
4075
  size="sm"
4076
4076
  [disabled]="isRestoring()"
4077
+ [attr.aria-label]="
4078
+ 'Restore version from ' + (version.createdAt | date: 'medium')
4079
+ "
4077
4080
  (click)="onRestore(version)"
4078
4081
  >
4079
4082
  @if (isRestoring() && restoringVersionId() === version.id) {
@@ -4108,7 +4111,7 @@ class VersionHistoryWidget {
4108
4111
  }
4109
4112
  </mcms-card-content>
4110
4113
  </mcms-card>
4111
- `, isInline: true, dependencies: [{ kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "ariaLabel"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Skeleton, selector: "mcms-skeleton", inputs: ["class"] }, { kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: Separator, selector: "mcms-separator", inputs: ["orientation", "decorative", "class"] }, { kind: "pipe", type: DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4114
+ `, isInline: true, dependencies: [{ kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "role", "ariaLabel"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Skeleton, selector: "mcms-skeleton", inputs: ["class"] }, { kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: Separator, selector: "mcms-separator", inputs: ["orientation", "decorative", "class"] }, { kind: "pipe", type: DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4112
4115
  }
4113
4116
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: VersionHistoryWidget, decorators: [{
4114
4117
  type: Component,
@@ -4136,7 +4139,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
4136
4139
  }
4137
4140
  </div>
4138
4141
  } @else if (error()) {
4139
- <p class="text-sm text-destructive">{{ error() }}</p>
4142
+ <p class="text-sm text-destructive" role="alert">{{ error() }}</p>
4140
4143
  } @else if (versions().length === 0) {
4141
4144
  <p class="text-sm text-muted-foreground">No version history available</p>
4142
4145
  } @else {
@@ -4178,6 +4181,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
4178
4181
  variant="outline"
4179
4182
  size="sm"
4180
4183
  [disabled]="isRestoring()"
4184
+ [attr.aria-label]="
4185
+ 'Restore version from ' + (version.createdAt | date: 'medium')
4186
+ "
4181
4187
  (click)="onRestore(version)"
4182
4188
  >
4183
4189
  @if (isRestoring() && restoringVersionId() === version.id) {
@@ -4692,7 +4698,7 @@ class CollectionUploadZoneComponent {
4692
4698
  @if (error()) {
4693
4699
  <p class="mt-1 text-sm text-mcms-destructive">{{ error() }}</p>
4694
4700
  }
4695
- `, isInline: true, dependencies: [{ kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Progress, selector: "mcms-progress", inputs: ["value", "max", "class"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MediaPreviewComponent, selector: "mcms-media-preview", inputs: ["media", "size", "class", "rounded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4701
+ `, isInline: true, dependencies: [{ kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Progress, selector: "mcms-progress", inputs: ["value", "max", "ariaLabel", "class"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MediaPreviewComponent, selector: "mcms-media-preview", inputs: ["media", "size", "class", "rounded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4696
4702
  }
4697
4703
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: CollectionUploadZoneComponent, decorators: [{
4698
4704
  type: Component,
@@ -5194,13 +5200,12 @@ class EntityFormWidget {
5194
5200
  * Extract the `id` property from any upload field values that are objects.
5195
5201
  */
5196
5202
  normalizeUploadFieldValues(data) {
5197
- const fields = this.collection().fields;
5203
+ const fields = flattenDataFields(this.collection().fields);
5198
5204
  const result = { ...data };
5199
5205
  for (const field of fields) {
5200
5206
  if (field.type === 'upload' && result[field.name] != null) {
5201
5207
  const val = result[field.name];
5202
5208
  if (typeof val === 'object' && val !== null) {
5203
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
5204
5209
  const obj = val; // eslint-disable-line @typescript-eslint/consistent-type-assertions
5205
5210
  if (typeof obj['id'] === 'string') {
5206
5211
  result[field.name] = obj['id'];
@@ -5224,8 +5229,14 @@ class EntityFormWidget {
5224
5229
  // Convert form data to string fields for FormData
5225
5230
  // Exclude auto-populated file metadata fields (they come from the server)
5226
5231
  const excludeFields = new Set([
5227
- 'filename', 'mimeType', 'filesize', 'path', 'url',
5228
- 'id', 'createdAt', 'updatedAt',
5232
+ 'filename',
5233
+ 'mimeType',
5234
+ 'filesize',
5235
+ 'path',
5236
+ 'url',
5237
+ 'id',
5238
+ 'createdAt',
5239
+ 'updatedAt',
5229
5240
  ]);
5230
5241
  const fields = {};
5231
5242
  for (const [key, value] of Object.entries(data)) {
@@ -5235,7 +5246,6 @@ class EntityFormWidget {
5235
5246
  continue;
5236
5247
  if (typeof value === 'object') {
5237
5248
  // Skip empty objects/arrays; serialize non-empty ones as JSON
5238
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
5239
5249
  const isEmptyObject = !Array.isArray(value) && Object.keys(value).length === 0;
5240
5250
  if ((Array.isArray(value) && value.length === 0) || isEmptyObject)
5241
5251
  continue;
@@ -5773,7 +5783,7 @@ class PublishControlsWidget {
5773
5783
  }
5774
5784
  </button>
5775
5785
  }
5776
- `, isInline: true, dependencies: [{ kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "ariaLabel"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5786
+ `, isInline: true, dependencies: [{ kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "role", "ariaLabel"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5777
5787
  }
5778
5788
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: PublishControlsWidget, decorators: [{
5779
5789
  type: Component,
@@ -5890,11 +5900,12 @@ class EntityViewWidget {
5890
5900
  }
5891
5901
  return `${this.collectionLabelSingular()} ${e.id}`;
5892
5902
  }, ...(ngDevMode ? [{ debugName: "entityTitle" }] : []));
5893
- /** Visible fields (excluding hidden ones) */
5903
+ /** Visible fields (excluding hidden ones, flattening layout wrappers) */
5894
5904
  visibleFields = computed(() => {
5895
5905
  const col = this.collection();
5896
5906
  const configs = this.fieldConfigs();
5897
- return col.fields.filter((field) => {
5907
+ const dataFields = flattenDataFields(col.fields);
5908
+ return dataFields.filter((field) => {
5898
5909
  // Check custom config
5899
5910
  const config = configs.find((c) => c.field === field.name);
5900
5911
  if (config?.hidden)
@@ -6221,7 +6232,7 @@ class EntityViewWidget {
6221
6232
  * Resolve relationship and upload field values from IDs to display labels.
6222
6233
  */
6223
6234
  resolveRelationships(entity) {
6224
- const fields = this.collection().fields;
6235
+ const fields = flattenDataFields(this.collection().fields);
6225
6236
  const resolved = new Map();
6226
6237
  const promises = [];
6227
6238
  for (const field of fields) {
@@ -6998,6 +7009,9 @@ class AdminSidebarWidget {
6998
7009
  heroDocumentText,
6999
7010
  heroCog6Tooth,
7000
7011
  heroPuzzlePiece,
7012
+ heroMagnifyingGlass,
7013
+ heroMap,
7014
+ heroCursorArrowRays,
7001
7015
  }),
7002
7016
  ], ngImport: i0, template: `
7003
7017
  <mcms-sidebar [collapsed]="collapsed()" [width]="width()">
@@ -7165,6 +7179,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
7165
7179
  heroDocumentText,
7166
7180
  heroCog6Tooth,
7167
7181
  heroPuzzlePiece,
7182
+ heroMagnifyingGlass,
7183
+ heroMap,
7184
+ heroCursorArrowRays,
7168
7185
  }),
7169
7186
  ],
7170
7187
  host: {
@@ -7740,7 +7757,7 @@ class ForgotPasswordFormComponent {
7740
7757
  </button>
7741
7758
  </div>
7742
7759
  </form>
7743
- `, isInline: true, dependencies: [{ kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7760
+ `, isInline: true, dependencies: [{ kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "ariaLabel", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7744
7761
  }
7745
7762
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ForgotPasswordFormComponent, decorators: [{
7746
7763
  type: Component,
@@ -8051,7 +8068,7 @@ class ResetPasswordFormComponent {
8051
8068
  }
8052
8069
  }
8053
8070
  </form>
8054
- `, isInline: true, dependencies: [{ kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8071
+ `, isInline: true, dependencies: [{ kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "ariaLabel", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8055
8072
  }
8056
8073
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ResetPasswordFormComponent, decorators: [{
8057
8074
  type: Component,
@@ -8282,7 +8299,7 @@ class CollectionCardWidget {
8282
8299
  <a mcms-button variant="outline" size="sm" [routerLink]="viewPath()"> View all </a>
8283
8300
  </mcms-card-footer>
8284
8301
  </mcms-card>
8285
- `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: CardFooter, selector: "mcms-card-footer" }, { kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "ariaLabel"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Skeleton, selector: "mcms-skeleton", inputs: ["class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8302
+ `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: CardFooter, selector: "mcms-card-footer" }, { kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "role", "ariaLabel"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Skeleton, selector: "mcms-skeleton", inputs: ["class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
8286
8303
  }
8287
8304
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: CollectionCardWidget, decorators: [{
8288
8305
  type: Component,
@@ -8685,11 +8702,12 @@ class EntityListWidget {
8685
8702
  if (customColumns.length > 0) {
8686
8703
  return customColumns;
8687
8704
  }
8688
- // Auto-derive from collection fields
8705
+ // Auto-derive from collection fields (flatten layout wrappers like tabs/collapsible/row)
8689
8706
  const col = this.collection();
8690
8707
  const columns = [];
8708
+ const dataFields = flattenDataFields(col.fields);
8691
8709
  // Add first text/title-like field as primary column
8692
- for (const field of col.fields) {
8710
+ for (const field of dataFields) {
8693
8711
  if (this.shouldShowFieldInList(field)) {
8694
8712
  columns.push(this.fieldToColumn(field, complexTemplate));
8695
8713
  }
@@ -8839,7 +8857,8 @@ class EntityListWidget {
8839
8857
  getDefaultSearchFields() {
8840
8858
  const col = this.collection();
8841
8859
  const fields = [];
8842
- for (const field of col.fields) {
8860
+ const dataFields = flattenDataFields(col.fields);
8861
+ for (const field of dataFields) {
8843
8862
  if (field.type === 'text' || field.type === 'textarea' || field.type === 'email') {
8844
8863
  fields.push(field.name);
8845
8864
  if (fields.length >= 3)
@@ -8855,6 +8874,9 @@ class EntityListWidget {
8855
8874
  // Skip hidden fields
8856
8875
  if (field.admin?.hidden)
8857
8876
  return false;
8877
+ // Skip layout fields (tabs, collapsible, row) — these are handled by flattenDataFields
8878
+ if (field.type === 'tabs' || field.type === 'collapsible' || field.type === 'row')
8879
+ return false;
8858
8880
  // Skip blocks (too complex for table cells)
8859
8881
  if (field.type === 'blocks')
8860
8882
  return false;
@@ -9257,7 +9279,7 @@ class EntityListWidget {
9257
9279
  }
9258
9280
  </div>
9259
9281
  </ng-template>
9260
- `, isInline: true, dependencies: [{ kind: "component", type: DataTable, selector: "mcms-data-table", inputs: ["data", "columns", "loading", "searchable", "searchPlaceholder", "searchFields", "sortable", "sort", "selectable", "selectedItems", "paginated", "pageSize", "pageSizeOptions", "currentPage", "totalItems", "emptyTitle", "emptyDescription", "clickableRows", "rowActions", "trackByFn", "class", "searchQuery"], outputs: ["sortChange", "selectedItemsChange", "currentPageChange", "searchChange", "selectionChange", "pageChange", "pageSizeChange", "rowClick", "rowAction", "searchQueryChange"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "ariaLabel"] }, { kind: "component", type: Breadcrumbs, selector: "mcms-breadcrumbs", inputs: ["class"] }, { kind: "component", type: BreadcrumbItem, selector: "mcms-breadcrumb-item", inputs: ["href", "current", "class"] }, { kind: "component", type: BreadcrumbSeparator, selector: "mcms-breadcrumb-separator", inputs: ["class"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9282
+ `, isInline: true, dependencies: [{ kind: "component", type: DataTable, selector: "mcms-data-table", inputs: ["data", "columns", "loading", "searchable", "searchPlaceholder", "searchFields", "sortable", "sort", "selectable", "selectedItems", "paginated", "pageSize", "pageSizeOptions", "currentPage", "totalItems", "emptyTitle", "emptyDescription", "clickableRows", "rowActions", "trackByFn", "class", "searchQuery"], outputs: ["sortChange", "selectedItemsChange", "currentPageChange", "searchChange", "selectionChange", "pageChange", "pageSizeChange", "rowClick", "rowAction", "searchQueryChange"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "role", "ariaLabel"] }, { kind: "component", type: Breadcrumbs, selector: "mcms-breadcrumbs", inputs: ["class"] }, { kind: "component", type: BreadcrumbItem, selector: "mcms-breadcrumb-item", inputs: ["href", "current", "class"] }, { kind: "component", type: BreadcrumbSeparator, selector: "mcms-breadcrumb-separator", inputs: ["class"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9261
9283
  }
9262
9284
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: EntityListWidget, decorators: [{
9263
9285
  type: Component,
@@ -9564,7 +9586,7 @@ class GenerateApiKeyDialog {
9564
9586
  }
9565
9587
  </mcms-dialog-footer>
9566
9588
  </mcms-dialog>
9567
- `, isInline: true, dependencies: [{ kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Dialog, selector: "mcms-dialog", inputs: ["class"] }, { kind: "component", type: DialogHeader, selector: "mcms-dialog-header" }, { kind: "component", type: DialogTitle, selector: "mcms-dialog-title", inputs: ["id"] }, { kind: "component", type: DialogContent, selector: "mcms-dialog-content" }, { kind: "component", type: DialogFooter, selector: "mcms-dialog-footer" }, { kind: "directive", type: DialogClose, selector: "[mcmsDialogClose]", inputs: ["mcmsDialogClose"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Label, selector: "mcms-label", inputs: ["for", "required", "disabled", "class"] }, { kind: "component", type: Select, selector: "mcms-select", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "id", "name", "placeholder", "options", "describedBy", "ariaLabel"], outputs: ["valueChange", "blurred"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9589
+ `, isInline: true, dependencies: [{ kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Dialog, selector: "mcms-dialog", inputs: ["class"] }, { kind: "component", type: DialogHeader, selector: "mcms-dialog-header" }, { kind: "component", type: DialogTitle, selector: "mcms-dialog-title", inputs: ["id"] }, { kind: "component", type: DialogContent, selector: "mcms-dialog-content" }, { kind: "component", type: DialogFooter, selector: "mcms-dialog-footer" }, { kind: "directive", type: DialogClose, selector: "[mcmsDialogClose]", inputs: ["mcmsDialogClose"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "ariaLabel", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Label, selector: "mcms-label", inputs: ["for", "required", "disabled", "class"] }, { kind: "component", type: Select, selector: "mcms-select", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "id", "name", "placeholder", "options", "describedBy", "ariaLabel"], outputs: ["valueChange", "blurred"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9568
9590
  }
9569
9591
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: GenerateApiKeyDialog, decorators: [{
9570
9592
  type: Component,
@@ -10672,144 +10694,146 @@ class LoginPage {
10672
10694
  }
10673
10695
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: LoginPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
10674
10696
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: LoginPage, isStandalone: true, selector: "mcms-login-page", host: { classAttribute: "flex min-h-screen items-center justify-center bg-background p-4" }, ngImport: i0, template: `
10675
- <mcms-card class="w-full max-w-md">
10676
- <mcms-card-header class="text-center">
10677
- <mcms-card-title>Sign In</mcms-card-title>
10678
- <mcms-card-description>
10679
- Enter your credentials to access the admin dashboard
10680
- </mcms-card-description>
10681
- </mcms-card-header>
10697
+ <main>
10698
+ <mcms-card class="w-full max-w-md">
10699
+ <mcms-card-header class="text-center">
10700
+ <mcms-card-title>Sign In</mcms-card-title>
10701
+ <mcms-card-description>
10702
+ Enter your credentials to access the admin dashboard
10703
+ </mcms-card-description>
10704
+ </mcms-card-header>
10682
10705
 
10683
- <mcms-card-content>
10684
- <form (submit)="onSubmit($event)" class="space-y-4">
10685
- @if (error()) {
10686
- <div
10687
- class="rounded-md bg-destructive/15 p-3 text-sm text-destructive"
10688
- role="alert"
10689
- aria-live="polite"
10690
- >
10691
- {{ error() }}
10692
- </div>
10693
- }
10706
+ <mcms-card-content>
10707
+ <form (submit)="onSubmit($event)" class="space-y-4">
10708
+ @if (error()) {
10709
+ <div
10710
+ class="rounded-md bg-destructive/15 p-3 text-sm text-destructive"
10711
+ role="alert"
10712
+ aria-live="polite"
10713
+ >
10714
+ {{ error() }}
10715
+ </div>
10716
+ }
10694
10717
 
10695
- <mcms-form-field id="login-email" [required]="true" [errors]="emailErrors()">
10696
- <span mcmsLabel>Email</span>
10697
- <mcms-input
10698
- type="email"
10699
- id="login-email"
10700
- name="email"
10701
- [(value)]="email"
10702
- placeholder="admin@example.com"
10703
- autocomplete="email"
10704
- [disabled]="!hydrated() || isSubmitting()"
10705
- />
10706
- </mcms-form-field>
10718
+ <mcms-form-field id="login-email" [required]="true" [errors]="emailErrors()">
10719
+ <span mcmsLabel>Email</span>
10720
+ <mcms-input
10721
+ type="email"
10722
+ id="login-email"
10723
+ name="email"
10724
+ [(value)]="email"
10725
+ placeholder="admin@example.com"
10726
+ autocomplete="email"
10727
+ [disabled]="!hydrated() || isSubmitting()"
10728
+ />
10729
+ </mcms-form-field>
10707
10730
 
10708
- <mcms-form-field id="login-password" [required]="true" [errors]="passwordErrors()">
10709
- <span mcmsLabel>Password</span>
10710
- <mcms-input
10711
- type="password"
10712
- id="login-password"
10713
- name="password"
10714
- [(value)]="password"
10715
- placeholder="Enter your password"
10716
- autocomplete="current-password"
10717
- [disabled]="!hydrated() || isSubmitting()"
10718
- />
10719
- </mcms-form-field>
10731
+ <mcms-form-field id="login-password" [required]="true" [errors]="passwordErrors()">
10732
+ <span mcmsLabel>Password</span>
10733
+ <mcms-input
10734
+ type="password"
10735
+ id="login-password"
10736
+ name="password"
10737
+ [(value)]="password"
10738
+ placeholder="Enter your password"
10739
+ autocomplete="current-password"
10740
+ [disabled]="!hydrated() || isSubmitting()"
10741
+ />
10742
+ </mcms-form-field>
10720
10743
 
10721
- <div class="flex justify-end">
10722
- <a routerLink="/admin/forgot-password" class="text-sm text-primary hover:underline">
10723
- Forgot your password?
10724
- </a>
10725
- </div>
10744
+ <div class="flex justify-end">
10745
+ <a routerLink="/admin/forgot-password" class="text-sm text-primary hover:underline">
10746
+ Forgot your password?
10747
+ </a>
10748
+ </div>
10726
10749
 
10727
- <button
10728
- mcms-button
10729
- type="submit"
10730
- class="w-full"
10731
- [disabled]="!hydrated() || isSubmitting() || !isValid()"
10732
- >
10733
- @if (isSubmitting()) {
10734
- <span class="animate-spin" aria-hidden="true">⏳</span>
10735
- Signing in...
10736
- } @else {
10737
- Sign In
10738
- }
10739
- </button>
10740
- </form>
10750
+ <button
10751
+ mcms-button
10752
+ type="submit"
10753
+ class="w-full"
10754
+ [disabled]="!hydrated() || isSubmitting() || !isValid()"
10755
+ >
10756
+ @if (isSubmitting()) {
10757
+ <span class="animate-spin" aria-hidden="true">⏳</span>
10758
+ Signing in...
10759
+ } @else {
10760
+ Sign In
10761
+ }
10762
+ </button>
10763
+ </form>
10741
10764
 
10742
- @if (oauthProviders().length > 0) {
10743
- <div class="relative my-4">
10744
- <div class="absolute inset-0 flex items-center">
10745
- <span class="w-full border-t border-border"></span>
10746
- </div>
10747
- <div class="relative flex justify-center text-xs uppercase">
10748
- <span class="bg-card px-2 text-muted-foreground">Or continue with</span>
10765
+ @if (oauthProviders().length > 0) {
10766
+ <div class="relative my-4">
10767
+ <div class="absolute inset-0 flex items-center">
10768
+ <span class="w-full border-t border-border"></span>
10769
+ </div>
10770
+ <div class="relative flex justify-center text-xs uppercase">
10771
+ <span class="bg-card px-2 text-muted-foreground">Or continue with</span>
10772
+ </div>
10749
10773
  </div>
10750
- </div>
10751
10774
 
10752
- <div class="flex flex-col gap-2">
10753
- @for (provider of oauthProviders(); track provider) {
10754
- <button
10755
- mcms-button
10756
- type="button"
10757
- variant="outline"
10758
- class="w-full"
10759
- (click)="signInWithOAuth(provider)"
10760
- [disabled]="!hydrated() || isSubmitting()"
10761
- [attr.data-provider]="provider"
10762
- >
10763
- @switch (provider) {
10764
- @case ('google') {
10765
- <svg class="mr-2 h-4 w-4" viewBox="0 0 24 24" aria-hidden="true">
10766
- <path
10767
- d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z"
10768
- fill="#4285F4"
10769
- />
10770
- <path
10771
- d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
10772
- fill="#34A853"
10773
- />
10774
- <path
10775
- d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"
10776
- fill="#FBBC05"
10777
- />
10778
- <path
10779
- d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
10780
- fill="#EA4335"
10781
- />
10782
- </svg>
10783
- Continue with Google
10784
- }
10785
- @case ('github') {
10786
- <svg
10787
- class="mr-2 h-4 w-4"
10788
- viewBox="0 0 24 24"
10789
- fill="currentColor"
10790
- aria-hidden="true"
10791
- >
10792
- <path
10793
- d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"
10794
- />
10795
- </svg>
10796
- Continue with GitHub
10797
- }
10798
- @default {
10799
- Continue with {{ provider }}
10775
+ <div class="flex flex-col gap-2">
10776
+ @for (provider of oauthProviders(); track provider) {
10777
+ <button
10778
+ mcms-button
10779
+ type="button"
10780
+ variant="outline"
10781
+ class="w-full"
10782
+ (click)="signInWithOAuth(provider)"
10783
+ [disabled]="!hydrated() || isSubmitting()"
10784
+ [attr.data-provider]="provider"
10785
+ >
10786
+ @switch (provider) {
10787
+ @case ('google') {
10788
+ <svg class="mr-2 h-4 w-4" viewBox="0 0 24 24" aria-hidden="true">
10789
+ <path
10790
+ d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z"
10791
+ fill="#4285F4"
10792
+ />
10793
+ <path
10794
+ d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
10795
+ fill="#34A853"
10796
+ />
10797
+ <path
10798
+ d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"
10799
+ fill="#FBBC05"
10800
+ />
10801
+ <path
10802
+ d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
10803
+ fill="#EA4335"
10804
+ />
10805
+ </svg>
10806
+ Continue with Google
10807
+ }
10808
+ @case ('github') {
10809
+ <svg
10810
+ class="mr-2 h-4 w-4"
10811
+ viewBox="0 0 24 24"
10812
+ fill="currentColor"
10813
+ aria-hidden="true"
10814
+ >
10815
+ <path
10816
+ d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"
10817
+ />
10818
+ </svg>
10819
+ Continue with GitHub
10820
+ }
10821
+ @default {
10822
+ Continue with {{ provider }}
10823
+ }
10800
10824
  }
10801
- }
10802
- </button>
10803
- }
10804
- </div>
10805
- }
10806
- </mcms-card-content>
10825
+ </button>
10826
+ }
10827
+ </div>
10828
+ }
10829
+ </mcms-card-content>
10807
10830
 
10808
- <mcms-card-footer class="justify-center">
10809
- <p class="text-sm text-muted-foreground">Momentum CMS</p>
10810
- </mcms-card-footer>
10811
- </mcms-card>
10812
- `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardTitle, selector: "mcms-card-title" }, { kind: "component", type: CardDescription, selector: "mcms-card-description" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: CardFooter, selector: "mcms-card-footer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10831
+ <mcms-card-footer class="justify-center">
10832
+ <p class="text-sm text-muted-foreground">Momentum CMS</p>
10833
+ </mcms-card-footer>
10834
+ </mcms-card>
10835
+ </main>
10836
+ `, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "ariaLabel", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardTitle, selector: "mcms-card-title", inputs: ["level"] }, { kind: "component", type: CardDescription, selector: "mcms-card-description" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: CardFooter, selector: "mcms-card-footer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10813
10837
  }
10814
10838
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: LoginPage, decorators: [{
10815
10839
  type: Component,
@@ -10832,143 +10856,145 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
10832
10856
  class: 'flex min-h-screen items-center justify-center bg-background p-4',
10833
10857
  },
10834
10858
  template: `
10835
- <mcms-card class="w-full max-w-md">
10836
- <mcms-card-header class="text-center">
10837
- <mcms-card-title>Sign In</mcms-card-title>
10838
- <mcms-card-description>
10839
- Enter your credentials to access the admin dashboard
10840
- </mcms-card-description>
10841
- </mcms-card-header>
10859
+ <main>
10860
+ <mcms-card class="w-full max-w-md">
10861
+ <mcms-card-header class="text-center">
10862
+ <mcms-card-title>Sign In</mcms-card-title>
10863
+ <mcms-card-description>
10864
+ Enter your credentials to access the admin dashboard
10865
+ </mcms-card-description>
10866
+ </mcms-card-header>
10842
10867
 
10843
- <mcms-card-content>
10844
- <form (submit)="onSubmit($event)" class="space-y-4">
10845
- @if (error()) {
10846
- <div
10847
- class="rounded-md bg-destructive/15 p-3 text-sm text-destructive"
10848
- role="alert"
10849
- aria-live="polite"
10850
- >
10851
- {{ error() }}
10852
- </div>
10853
- }
10868
+ <mcms-card-content>
10869
+ <form (submit)="onSubmit($event)" class="space-y-4">
10870
+ @if (error()) {
10871
+ <div
10872
+ class="rounded-md bg-destructive/15 p-3 text-sm text-destructive"
10873
+ role="alert"
10874
+ aria-live="polite"
10875
+ >
10876
+ {{ error() }}
10877
+ </div>
10878
+ }
10854
10879
 
10855
- <mcms-form-field id="login-email" [required]="true" [errors]="emailErrors()">
10856
- <span mcmsLabel>Email</span>
10857
- <mcms-input
10858
- type="email"
10859
- id="login-email"
10860
- name="email"
10861
- [(value)]="email"
10862
- placeholder="admin@example.com"
10863
- autocomplete="email"
10864
- [disabled]="!hydrated() || isSubmitting()"
10865
- />
10866
- </mcms-form-field>
10880
+ <mcms-form-field id="login-email" [required]="true" [errors]="emailErrors()">
10881
+ <span mcmsLabel>Email</span>
10882
+ <mcms-input
10883
+ type="email"
10884
+ id="login-email"
10885
+ name="email"
10886
+ [(value)]="email"
10887
+ placeholder="admin@example.com"
10888
+ autocomplete="email"
10889
+ [disabled]="!hydrated() || isSubmitting()"
10890
+ />
10891
+ </mcms-form-field>
10867
10892
 
10868
- <mcms-form-field id="login-password" [required]="true" [errors]="passwordErrors()">
10869
- <span mcmsLabel>Password</span>
10870
- <mcms-input
10871
- type="password"
10872
- id="login-password"
10873
- name="password"
10874
- [(value)]="password"
10875
- placeholder="Enter your password"
10876
- autocomplete="current-password"
10877
- [disabled]="!hydrated() || isSubmitting()"
10878
- />
10879
- </mcms-form-field>
10893
+ <mcms-form-field id="login-password" [required]="true" [errors]="passwordErrors()">
10894
+ <span mcmsLabel>Password</span>
10895
+ <mcms-input
10896
+ type="password"
10897
+ id="login-password"
10898
+ name="password"
10899
+ [(value)]="password"
10900
+ placeholder="Enter your password"
10901
+ autocomplete="current-password"
10902
+ [disabled]="!hydrated() || isSubmitting()"
10903
+ />
10904
+ </mcms-form-field>
10880
10905
 
10881
- <div class="flex justify-end">
10882
- <a routerLink="/admin/forgot-password" class="text-sm text-primary hover:underline">
10883
- Forgot your password?
10884
- </a>
10885
- </div>
10906
+ <div class="flex justify-end">
10907
+ <a routerLink="/admin/forgot-password" class="text-sm text-primary hover:underline">
10908
+ Forgot your password?
10909
+ </a>
10910
+ </div>
10886
10911
 
10887
- <button
10888
- mcms-button
10889
- type="submit"
10890
- class="w-full"
10891
- [disabled]="!hydrated() || isSubmitting() || !isValid()"
10892
- >
10893
- @if (isSubmitting()) {
10894
- <span class="animate-spin" aria-hidden="true">⏳</span>
10895
- Signing in...
10896
- } @else {
10897
- Sign In
10898
- }
10899
- </button>
10900
- </form>
10912
+ <button
10913
+ mcms-button
10914
+ type="submit"
10915
+ class="w-full"
10916
+ [disabled]="!hydrated() || isSubmitting() || !isValid()"
10917
+ >
10918
+ @if (isSubmitting()) {
10919
+ <span class="animate-spin" aria-hidden="true">⏳</span>
10920
+ Signing in...
10921
+ } @else {
10922
+ Sign In
10923
+ }
10924
+ </button>
10925
+ </form>
10901
10926
 
10902
- @if (oauthProviders().length > 0) {
10903
- <div class="relative my-4">
10904
- <div class="absolute inset-0 flex items-center">
10905
- <span class="w-full border-t border-border"></span>
10906
- </div>
10907
- <div class="relative flex justify-center text-xs uppercase">
10908
- <span class="bg-card px-2 text-muted-foreground">Or continue with</span>
10927
+ @if (oauthProviders().length > 0) {
10928
+ <div class="relative my-4">
10929
+ <div class="absolute inset-0 flex items-center">
10930
+ <span class="w-full border-t border-border"></span>
10931
+ </div>
10932
+ <div class="relative flex justify-center text-xs uppercase">
10933
+ <span class="bg-card px-2 text-muted-foreground">Or continue with</span>
10934
+ </div>
10909
10935
  </div>
10910
- </div>
10911
10936
 
10912
- <div class="flex flex-col gap-2">
10913
- @for (provider of oauthProviders(); track provider) {
10914
- <button
10915
- mcms-button
10916
- type="button"
10917
- variant="outline"
10918
- class="w-full"
10919
- (click)="signInWithOAuth(provider)"
10920
- [disabled]="!hydrated() || isSubmitting()"
10921
- [attr.data-provider]="provider"
10922
- >
10923
- @switch (provider) {
10924
- @case ('google') {
10925
- <svg class="mr-2 h-4 w-4" viewBox="0 0 24 24" aria-hidden="true">
10926
- <path
10927
- d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z"
10928
- fill="#4285F4"
10929
- />
10930
- <path
10931
- d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
10932
- fill="#34A853"
10933
- />
10934
- <path
10935
- d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"
10936
- fill="#FBBC05"
10937
- />
10938
- <path
10939
- d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
10940
- fill="#EA4335"
10941
- />
10942
- </svg>
10943
- Continue with Google
10944
- }
10945
- @case ('github') {
10946
- <svg
10947
- class="mr-2 h-4 w-4"
10948
- viewBox="0 0 24 24"
10949
- fill="currentColor"
10950
- aria-hidden="true"
10951
- >
10952
- <path
10953
- d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"
10954
- />
10955
- </svg>
10956
- Continue with GitHub
10957
- }
10958
- @default {
10959
- Continue with {{ provider }}
10937
+ <div class="flex flex-col gap-2">
10938
+ @for (provider of oauthProviders(); track provider) {
10939
+ <button
10940
+ mcms-button
10941
+ type="button"
10942
+ variant="outline"
10943
+ class="w-full"
10944
+ (click)="signInWithOAuth(provider)"
10945
+ [disabled]="!hydrated() || isSubmitting()"
10946
+ [attr.data-provider]="provider"
10947
+ >
10948
+ @switch (provider) {
10949
+ @case ('google') {
10950
+ <svg class="mr-2 h-4 w-4" viewBox="0 0 24 24" aria-hidden="true">
10951
+ <path
10952
+ d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 0 1-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z"
10953
+ fill="#4285F4"
10954
+ />
10955
+ <path
10956
+ d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"
10957
+ fill="#34A853"
10958
+ />
10959
+ <path
10960
+ d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"
10961
+ fill="#FBBC05"
10962
+ />
10963
+ <path
10964
+ d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"
10965
+ fill="#EA4335"
10966
+ />
10967
+ </svg>
10968
+ Continue with Google
10969
+ }
10970
+ @case ('github') {
10971
+ <svg
10972
+ class="mr-2 h-4 w-4"
10973
+ viewBox="0 0 24 24"
10974
+ fill="currentColor"
10975
+ aria-hidden="true"
10976
+ >
10977
+ <path
10978
+ d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z"
10979
+ />
10980
+ </svg>
10981
+ Continue with GitHub
10982
+ }
10983
+ @default {
10984
+ Continue with {{ provider }}
10985
+ }
10960
10986
  }
10961
- }
10962
- </button>
10963
- }
10964
- </div>
10965
- }
10966
- </mcms-card-content>
10987
+ </button>
10988
+ }
10989
+ </div>
10990
+ }
10991
+ </mcms-card-content>
10967
10992
 
10968
- <mcms-card-footer class="justify-center">
10969
- <p class="text-sm text-muted-foreground">Momentum CMS</p>
10970
- </mcms-card-footer>
10971
- </mcms-card>
10993
+ <mcms-card-footer class="justify-center">
10994
+ <p class="text-sm text-muted-foreground">Momentum CMS</p>
10995
+ </mcms-card-footer>
10996
+ </mcms-card>
10997
+ </main>
10972
10998
  `,
10973
10999
  }]
10974
11000
  }], ctorParameters: () => [] });
@@ -11089,101 +11115,103 @@ class SetupPage {
11089
11115
  }
11090
11116
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: SetupPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
11091
11117
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.2", type: SetupPage, isStandalone: true, selector: "mcms-setup-page", host: { classAttribute: "flex min-h-screen items-center justify-center bg-background p-4" }, ngImport: i0, template: `
11092
- <mcms-card class="w-full max-w-md">
11093
- <mcms-card-header class="text-center">
11094
- <mcms-card-title>Welcome to Momentum CMS</mcms-card-title>
11095
- <mcms-card-description> Create your admin account to get started </mcms-card-description>
11096
- </mcms-card-header>
11118
+ <main>
11119
+ <mcms-card class="w-full max-w-md">
11120
+ <mcms-card-header class="text-center">
11121
+ <mcms-card-title>Welcome to Momentum CMS</mcms-card-title>
11122
+ <mcms-card-description> Create your admin account to get started </mcms-card-description>
11123
+ </mcms-card-header>
11097
11124
 
11098
- <mcms-card-content>
11099
- <form (submit)="onSubmit($event)" class="space-y-4">
11100
- @if (error()) {
11101
- <div
11102
- class="rounded-md bg-destructive/15 p-3 text-sm text-destructive"
11103
- role="alert"
11104
- aria-live="polite"
11105
- >
11106
- {{ error() }}
11107
- </div>
11108
- }
11125
+ <mcms-card-content>
11126
+ <form (submit)="onSubmit($event)" class="space-y-4">
11127
+ @if (error()) {
11128
+ <div
11129
+ class="rounded-md bg-destructive/15 p-3 text-sm text-destructive"
11130
+ role="alert"
11131
+ aria-live="polite"
11132
+ >
11133
+ {{ error() }}
11134
+ </div>
11135
+ }
11109
11136
 
11110
- <mcms-form-field id="setup-name" [required]="true" [errors]="nameErrors()">
11111
- <span mcmsLabel>Full Name</span>
11112
- <mcms-input
11113
- type="text"
11114
- id="setup-name"
11115
- name="name"
11116
- [(value)]="name"
11117
- placeholder="Your name"
11118
- autocomplete="name"
11119
- [disabled]="!hydrated() || isSubmitting()"
11120
- />
11121
- </mcms-form-field>
11137
+ <mcms-form-field id="setup-name" [required]="true" [errors]="nameErrors()">
11138
+ <span mcmsLabel>Full Name</span>
11139
+ <mcms-input
11140
+ type="text"
11141
+ id="setup-name"
11142
+ name="name"
11143
+ [(value)]="name"
11144
+ placeholder="Your name"
11145
+ autocomplete="name"
11146
+ [disabled]="!hydrated() || isSubmitting()"
11147
+ />
11148
+ </mcms-form-field>
11122
11149
 
11123
- <mcms-form-field id="setup-email" [required]="true" [errors]="emailErrors()">
11124
- <span mcmsLabel>Email Address</span>
11125
- <mcms-input
11126
- type="email"
11127
- id="setup-email"
11128
- name="email"
11129
- [(value)]="email"
11130
- placeholder="admin@example.com"
11131
- autocomplete="email"
11132
- [disabled]="!hydrated() || isSubmitting()"
11133
- />
11134
- </mcms-form-field>
11150
+ <mcms-form-field id="setup-email" [required]="true" [errors]="emailErrors()">
11151
+ <span mcmsLabel>Email Address</span>
11152
+ <mcms-input
11153
+ type="email"
11154
+ id="setup-email"
11155
+ name="email"
11156
+ [(value)]="email"
11157
+ placeholder="admin@example.com"
11158
+ autocomplete="email"
11159
+ [disabled]="!hydrated() || isSubmitting()"
11160
+ />
11161
+ </mcms-form-field>
11135
11162
 
11136
- <mcms-form-field id="setup-password" [required]="true" [errors]="passwordErrors()">
11137
- <span mcmsLabel>Password</span>
11138
- <mcms-input
11139
- type="password"
11140
- id="setup-password"
11141
- name="password"
11142
- [(value)]="password"
11143
- placeholder="At least 8 characters"
11144
- autocomplete="new-password"
11145
- [disabled]="!hydrated() || isSubmitting()"
11146
- />
11147
- </mcms-form-field>
11163
+ <mcms-form-field id="setup-password" [required]="true" [errors]="passwordErrors()">
11164
+ <span mcmsLabel>Password</span>
11165
+ <mcms-input
11166
+ type="password"
11167
+ id="setup-password"
11168
+ name="password"
11169
+ [(value)]="password"
11170
+ placeholder="At least 8 characters"
11171
+ autocomplete="new-password"
11172
+ [disabled]="!hydrated() || isSubmitting()"
11173
+ />
11174
+ </mcms-form-field>
11148
11175
 
11149
- <mcms-form-field
11150
- id="setup-confirm-password"
11151
- [required]="true"
11152
- [errors]="confirmPasswordErrors()"
11153
- >
11154
- <span mcmsLabel>Confirm Password</span>
11155
- <mcms-input
11156
- type="password"
11176
+ <mcms-form-field
11157
11177
  id="setup-confirm-password"
11158
- name="confirmPassword"
11159
- [(value)]="confirmPassword"
11160
- placeholder="Repeat your password"
11161
- autocomplete="new-password"
11162
- [disabled]="!hydrated() || isSubmitting()"
11163
- />
11164
- </mcms-form-field>
11178
+ [required]="true"
11179
+ [errors]="confirmPasswordErrors()"
11180
+ >
11181
+ <span mcmsLabel>Confirm Password</span>
11182
+ <mcms-input
11183
+ type="password"
11184
+ id="setup-confirm-password"
11185
+ name="confirmPassword"
11186
+ [(value)]="confirmPassword"
11187
+ placeholder="Repeat your password"
11188
+ autocomplete="new-password"
11189
+ [disabled]="!hydrated() || isSubmitting()"
11190
+ />
11191
+ </mcms-form-field>
11165
11192
 
11166
- <button
11167
- mcms-button
11168
- type="submit"
11169
- class="w-full"
11170
- [disabled]="!hydrated() || isSubmitting() || !isValid()"
11171
- >
11172
- @if (isSubmitting()) {
11173
- <span class="animate-spin" aria-hidden="true">⏳</span>
11174
- Creating account...
11175
- } @else {
11176
- Create Admin Account
11177
- }
11178
- </button>
11179
- </form>
11180
- </mcms-card-content>
11193
+ <button
11194
+ mcms-button
11195
+ type="submit"
11196
+ class="w-full"
11197
+ [disabled]="!hydrated() || isSubmitting() || !isValid()"
11198
+ >
11199
+ @if (isSubmitting()) {
11200
+ <span class="animate-spin" aria-hidden="true">⏳</span>
11201
+ Creating account...
11202
+ } @else {
11203
+ Create Admin Account
11204
+ }
11205
+ </button>
11206
+ </form>
11207
+ </mcms-card-content>
11181
11208
 
11182
- <mcms-card-footer class="justify-center">
11183
- <p class="text-sm text-muted-foreground">This account will have full admin privileges</p>
11184
- </mcms-card-footer>
11185
- </mcms-card>
11186
- `, isInline: true, dependencies: [{ kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardTitle, selector: "mcms-card-title" }, { kind: "component", type: CardDescription, selector: "mcms-card-description" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: CardFooter, selector: "mcms-card-footer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11209
+ <mcms-card-footer class="justify-center">
11210
+ <p class="text-sm text-muted-foreground">This account will have full admin privileges</p>
11211
+ </mcms-card-footer>
11212
+ </mcms-card>
11213
+ </main>
11214
+ `, isInline: true, dependencies: [{ kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "ariaLabel", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardTitle, selector: "mcms-card-title", inputs: ["level"] }, { kind: "component", type: CardDescription, selector: "mcms-card-description" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: CardFooter, selector: "mcms-card-footer" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11187
11215
  }
11188
11216
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: SetupPage, decorators: [{
11189
11217
  type: Component,
@@ -11205,100 +11233,102 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
11205
11233
  class: 'flex min-h-screen items-center justify-center bg-background p-4',
11206
11234
  },
11207
11235
  template: `
11208
- <mcms-card class="w-full max-w-md">
11209
- <mcms-card-header class="text-center">
11210
- <mcms-card-title>Welcome to Momentum CMS</mcms-card-title>
11211
- <mcms-card-description> Create your admin account to get started </mcms-card-description>
11212
- </mcms-card-header>
11236
+ <main>
11237
+ <mcms-card class="w-full max-w-md">
11238
+ <mcms-card-header class="text-center">
11239
+ <mcms-card-title>Welcome to Momentum CMS</mcms-card-title>
11240
+ <mcms-card-description> Create your admin account to get started </mcms-card-description>
11241
+ </mcms-card-header>
11213
11242
 
11214
- <mcms-card-content>
11215
- <form (submit)="onSubmit($event)" class="space-y-4">
11216
- @if (error()) {
11217
- <div
11218
- class="rounded-md bg-destructive/15 p-3 text-sm text-destructive"
11219
- role="alert"
11220
- aria-live="polite"
11221
- >
11222
- {{ error() }}
11223
- </div>
11224
- }
11243
+ <mcms-card-content>
11244
+ <form (submit)="onSubmit($event)" class="space-y-4">
11245
+ @if (error()) {
11246
+ <div
11247
+ class="rounded-md bg-destructive/15 p-3 text-sm text-destructive"
11248
+ role="alert"
11249
+ aria-live="polite"
11250
+ >
11251
+ {{ error() }}
11252
+ </div>
11253
+ }
11225
11254
 
11226
- <mcms-form-field id="setup-name" [required]="true" [errors]="nameErrors()">
11227
- <span mcmsLabel>Full Name</span>
11228
- <mcms-input
11229
- type="text"
11230
- id="setup-name"
11231
- name="name"
11232
- [(value)]="name"
11233
- placeholder="Your name"
11234
- autocomplete="name"
11235
- [disabled]="!hydrated() || isSubmitting()"
11236
- />
11237
- </mcms-form-field>
11255
+ <mcms-form-field id="setup-name" [required]="true" [errors]="nameErrors()">
11256
+ <span mcmsLabel>Full Name</span>
11257
+ <mcms-input
11258
+ type="text"
11259
+ id="setup-name"
11260
+ name="name"
11261
+ [(value)]="name"
11262
+ placeholder="Your name"
11263
+ autocomplete="name"
11264
+ [disabled]="!hydrated() || isSubmitting()"
11265
+ />
11266
+ </mcms-form-field>
11238
11267
 
11239
- <mcms-form-field id="setup-email" [required]="true" [errors]="emailErrors()">
11240
- <span mcmsLabel>Email Address</span>
11241
- <mcms-input
11242
- type="email"
11243
- id="setup-email"
11244
- name="email"
11245
- [(value)]="email"
11246
- placeholder="admin@example.com"
11247
- autocomplete="email"
11248
- [disabled]="!hydrated() || isSubmitting()"
11249
- />
11250
- </mcms-form-field>
11268
+ <mcms-form-field id="setup-email" [required]="true" [errors]="emailErrors()">
11269
+ <span mcmsLabel>Email Address</span>
11270
+ <mcms-input
11271
+ type="email"
11272
+ id="setup-email"
11273
+ name="email"
11274
+ [(value)]="email"
11275
+ placeholder="admin@example.com"
11276
+ autocomplete="email"
11277
+ [disabled]="!hydrated() || isSubmitting()"
11278
+ />
11279
+ </mcms-form-field>
11251
11280
 
11252
- <mcms-form-field id="setup-password" [required]="true" [errors]="passwordErrors()">
11253
- <span mcmsLabel>Password</span>
11254
- <mcms-input
11255
- type="password"
11256
- id="setup-password"
11257
- name="password"
11258
- [(value)]="password"
11259
- placeholder="At least 8 characters"
11260
- autocomplete="new-password"
11261
- [disabled]="!hydrated() || isSubmitting()"
11262
- />
11263
- </mcms-form-field>
11281
+ <mcms-form-field id="setup-password" [required]="true" [errors]="passwordErrors()">
11282
+ <span mcmsLabel>Password</span>
11283
+ <mcms-input
11284
+ type="password"
11285
+ id="setup-password"
11286
+ name="password"
11287
+ [(value)]="password"
11288
+ placeholder="At least 8 characters"
11289
+ autocomplete="new-password"
11290
+ [disabled]="!hydrated() || isSubmitting()"
11291
+ />
11292
+ </mcms-form-field>
11264
11293
 
11265
- <mcms-form-field
11266
- id="setup-confirm-password"
11267
- [required]="true"
11268
- [errors]="confirmPasswordErrors()"
11269
- >
11270
- <span mcmsLabel>Confirm Password</span>
11271
- <mcms-input
11272
- type="password"
11294
+ <mcms-form-field
11273
11295
  id="setup-confirm-password"
11274
- name="confirmPassword"
11275
- [(value)]="confirmPassword"
11276
- placeholder="Repeat your password"
11277
- autocomplete="new-password"
11278
- [disabled]="!hydrated() || isSubmitting()"
11279
- />
11280
- </mcms-form-field>
11296
+ [required]="true"
11297
+ [errors]="confirmPasswordErrors()"
11298
+ >
11299
+ <span mcmsLabel>Confirm Password</span>
11300
+ <mcms-input
11301
+ type="password"
11302
+ id="setup-confirm-password"
11303
+ name="confirmPassword"
11304
+ [(value)]="confirmPassword"
11305
+ placeholder="Repeat your password"
11306
+ autocomplete="new-password"
11307
+ [disabled]="!hydrated() || isSubmitting()"
11308
+ />
11309
+ </mcms-form-field>
11281
11310
 
11282
- <button
11283
- mcms-button
11284
- type="submit"
11285
- class="w-full"
11286
- [disabled]="!hydrated() || isSubmitting() || !isValid()"
11287
- >
11288
- @if (isSubmitting()) {
11289
- <span class="animate-spin" aria-hidden="true">⏳</span>
11290
- Creating account...
11291
- } @else {
11292
- Create Admin Account
11293
- }
11294
- </button>
11295
- </form>
11296
- </mcms-card-content>
11311
+ <button
11312
+ mcms-button
11313
+ type="submit"
11314
+ class="w-full"
11315
+ [disabled]="!hydrated() || isSubmitting() || !isValid()"
11316
+ >
11317
+ @if (isSubmitting()) {
11318
+ <span class="animate-spin" aria-hidden="true">⏳</span>
11319
+ Creating account...
11320
+ } @else {
11321
+ Create Admin Account
11322
+ }
11323
+ </button>
11324
+ </form>
11325
+ </mcms-card-content>
11297
11326
 
11298
- <mcms-card-footer class="justify-center">
11299
- <p class="text-sm text-muted-foreground">This account will have full admin privileges</p>
11300
- </mcms-card-footer>
11301
- </mcms-card>
11327
+ <mcms-card-footer class="justify-center">
11328
+ <p class="text-sm text-muted-foreground">This account will have full admin privileges</p>
11329
+ </mcms-card-footer>
11330
+ </mcms-card>
11331
+ </main>
11302
11332
  `,
11303
11333
  }]
11304
11334
  }], ctorParameters: () => [] });
@@ -11437,7 +11467,7 @@ class MediaEditDialog {
11437
11467
  </button>
11438
11468
  </mcms-dialog-footer>
11439
11469
  </mcms-dialog>
11440
- `, isInline: true, dependencies: [{ kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Dialog, selector: "mcms-dialog", inputs: ["class"] }, { kind: "component", type: DialogHeader, selector: "mcms-dialog-header" }, { kind: "component", type: DialogTitle, selector: "mcms-dialog-title", inputs: ["id"] }, { kind: "component", type: DialogContent, selector: "mcms-dialog-content" }, { kind: "component", type: DialogFooter, selector: "mcms-dialog-footer" }, { kind: "directive", type: DialogClose, selector: "[mcmsDialogClose]", inputs: ["mcmsDialogClose"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Textarea, selector: "mcms-textarea", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "id", "name", "placeholder", "rows", "describedBy"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Label, selector: "mcms-label", inputs: ["for", "required", "disabled", "class"] }, { kind: "component", type: Spinner, selector: "mcms-spinner", inputs: ["size", "label", "class"] }, { kind: "component", type: Alert, selector: "mcms-alert", inputs: ["variant", "class"] }, { kind: "component", type: MediaPreviewComponent, selector: "mcms-media-preview", inputs: ["media", "size", "class", "rounded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11470
+ `, isInline: true, dependencies: [{ kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Dialog, selector: "mcms-dialog", inputs: ["class"] }, { kind: "component", type: DialogHeader, selector: "mcms-dialog-header" }, { kind: "component", type: DialogTitle, selector: "mcms-dialog-title", inputs: ["id"] }, { kind: "component", type: DialogContent, selector: "mcms-dialog-content" }, { kind: "component", type: DialogFooter, selector: "mcms-dialog-footer" }, { kind: "directive", type: DialogClose, selector: "[mcmsDialogClose]", inputs: ["mcmsDialogClose"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "ariaLabel", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Textarea, selector: "mcms-textarea", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "id", "name", "placeholder", "rows", "ariaLabel", "describedBy"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Label, selector: "mcms-label", inputs: ["for", "required", "disabled", "class"] }, { kind: "component", type: Spinner, selector: "mcms-spinner", inputs: ["size", "label", "class"] }, { kind: "component", type: Alert, selector: "mcms-alert", inputs: ["variant", "class"] }, { kind: "component", type: MediaPreviewComponent, selector: "mcms-media-preview", inputs: ["media", "size", "class", "rounded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11441
11471
  }
11442
11472
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: MediaEditDialog, decorators: [{
11443
11473
  type: Component,
@@ -11803,21 +11833,23 @@ class MediaLibraryPage {
11803
11833
  </p>
11804
11834
  </div>
11805
11835
  <div class="flex gap-2">
11806
- <label class="cursor-pointer">
11807
- <input
11808
- type="file"
11809
- class="sr-only"
11810
- multiple
11811
- (change)="onFilesSelected($event)"
11812
- />
11813
- <span
11814
- mcms-button
11815
- class="inline-flex"
11816
- >
11817
- <ng-icon name="heroCloudArrowUp" class="h-4 w-4" />
11818
- Upload Files
11819
- </span>
11820
- </label>
11836
+ <input
11837
+ #fileInput
11838
+ type="file"
11839
+ class="sr-only"
11840
+ multiple
11841
+ aria-label="Upload media files"
11842
+ (change)="onFilesSelected($event)"
11843
+ />
11844
+ <button
11845
+ mcms-button
11846
+ type="button"
11847
+ class="inline-flex"
11848
+ (click)="fileInput.click()"
11849
+ >
11850
+ <ng-icon name="heroCloudArrowUp" class="h-4 w-4" />
11851
+ Upload Files
11852
+ </button>
11821
11853
  </div>
11822
11854
  </div>
11823
11855
 
@@ -11841,7 +11873,7 @@ class MediaLibraryPage {
11841
11873
  size="sm"
11842
11874
  (click)="deleteSelected()"
11843
11875
  >
11844
- <ng-icon name="heroTrash" class="h-4 w-4" />
11876
+ <ng-icon name="heroTrash" class="h-4 w-4" aria-hidden="true" />
11845
11877
  Delete
11846
11878
  </button>
11847
11879
  </div>
@@ -11932,7 +11964,7 @@ class MediaLibraryPage {
11932
11964
 
11933
11965
  <!-- Hover overlay -->
11934
11966
  <div
11935
- class="absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 via-black/50 to-transparent p-3 opacity-0 transition-opacity group-hover:opacity-100"
11967
+ class="absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 via-black/50 to-transparent p-3 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100"
11936
11968
  >
11937
11969
  <p class="truncate text-sm font-medium text-white">
11938
11970
  {{ media.filename }}
@@ -12001,7 +12033,7 @@ class MediaLibraryPage {
12001
12033
  }
12002
12034
  }
12003
12035
  </div>
12004
- `, isInline: true, dependencies: [{ kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Spinner, selector: "mcms-spinner", inputs: ["size", "label", "class"] }, { kind: "component", type: Pagination, selector: "mcms-pagination", inputs: ["currentPage", "totalPages", "siblingCount", "class"], outputs: ["pageChange"] }, { kind: "component", type: SearchInput, selector: "mcms-search-input", inputs: ["value", "placeholder", "debounce", "disabled", "ariaLabel", "class"], outputs: ["valueChange", "searchChange", "clear"] }, { kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "ariaLabel"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MediaPreviewComponent, selector: "mcms-media-preview", inputs: ["media", "size", "class", "rounded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12036
+ `, isInline: true, dependencies: [{ kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Spinner, selector: "mcms-spinner", inputs: ["size", "label", "class"] }, { kind: "component", type: Pagination, selector: "mcms-pagination", inputs: ["currentPage", "totalPages", "siblingCount", "class"], outputs: ["pageChange"] }, { kind: "component", type: SearchInput, selector: "mcms-search-input", inputs: ["value", "placeholder", "debounce", "disabled", "ariaLabel", "class"], outputs: ["valueChange", "searchChange", "clear"] }, { kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "role", "ariaLabel"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MediaPreviewComponent, selector: "mcms-media-preview", inputs: ["media", "size", "class", "rounded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12005
12037
  }
12006
12038
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: MediaLibraryPage, decorators: [{
12007
12039
  type: Component,
@@ -12024,21 +12056,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
12024
12056
  </p>
12025
12057
  </div>
12026
12058
  <div class="flex gap-2">
12027
- <label class="cursor-pointer">
12028
- <input
12029
- type="file"
12030
- class="sr-only"
12031
- multiple
12032
- (change)="onFilesSelected($event)"
12033
- />
12034
- <span
12035
- mcms-button
12036
- class="inline-flex"
12037
- >
12038
- <ng-icon name="heroCloudArrowUp" class="h-4 w-4" />
12039
- Upload Files
12040
- </span>
12041
- </label>
12059
+ <input
12060
+ #fileInput
12061
+ type="file"
12062
+ class="sr-only"
12063
+ multiple
12064
+ aria-label="Upload media files"
12065
+ (change)="onFilesSelected($event)"
12066
+ />
12067
+ <button
12068
+ mcms-button
12069
+ type="button"
12070
+ class="inline-flex"
12071
+ (click)="fileInput.click()"
12072
+ >
12073
+ <ng-icon name="heroCloudArrowUp" class="h-4 w-4" />
12074
+ Upload Files
12075
+ </button>
12042
12076
  </div>
12043
12077
  </div>
12044
12078
 
@@ -12062,7 +12096,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
12062
12096
  size="sm"
12063
12097
  (click)="deleteSelected()"
12064
12098
  >
12065
- <ng-icon name="heroTrash" class="h-4 w-4" />
12099
+ <ng-icon name="heroTrash" class="h-4 w-4" aria-hidden="true" />
12066
12100
  Delete
12067
12101
  </button>
12068
12102
  </div>
@@ -12153,7 +12187,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
12153
12187
 
12154
12188
  <!-- Hover overlay -->
12155
12189
  <div
12156
- class="absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 via-black/50 to-transparent p-3 opacity-0 transition-opacity group-hover:opacity-100"
12190
+ class="absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 via-black/50 to-transparent p-3 opacity-0 transition-opacity group-hover:opacity-100 group-focus-within:opacity-100"
12157
12191
  >
12158
12192
  <p class="truncate text-sm font-medium text-white">
12159
12193
  {{ media.filename }}
@@ -12244,23 +12278,25 @@ class ForgotPasswordPage {
12244
12278
  }
12245
12279
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ForgotPasswordPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
12246
12280
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.2", type: ForgotPasswordPage, isStandalone: true, selector: "mcms-forgot-password-page", host: { classAttribute: "flex min-h-screen items-center justify-center bg-background p-4" }, ngImport: i0, template: `
12247
- <mcms-card class="w-full max-w-md">
12248
- <mcms-card-header class="text-center">
12249
- <mcms-card-title>Reset Password</mcms-card-title>
12250
- <mcms-card-description>
12251
- We'll send you a link to reset your password
12252
- </mcms-card-description>
12253
- </mcms-card-header>
12281
+ <main>
12282
+ <mcms-card class="w-full max-w-md">
12283
+ <mcms-card-header class="text-center">
12284
+ <mcms-card-title>Reset Password</mcms-card-title>
12285
+ <mcms-card-description>
12286
+ We'll send you a link to reset your password
12287
+ </mcms-card-description>
12288
+ </mcms-card-header>
12254
12289
 
12255
- <mcms-card-content>
12256
- <mcms-forgot-password-form (backToLogin)="navigateToLogin()" />
12257
- </mcms-card-content>
12290
+ <mcms-card-content>
12291
+ <mcms-forgot-password-form (backToLogin)="navigateToLogin()" />
12292
+ </mcms-card-content>
12258
12293
 
12259
- <mcms-card-footer class="justify-center">
12260
- <p class="text-sm text-muted-foreground">Momentum CMS</p>
12261
- </mcms-card-footer>
12262
- </mcms-card>
12263
- `, isInline: true, dependencies: [{ kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardTitle, selector: "mcms-card-title" }, { kind: "component", type: CardDescription, selector: "mcms-card-description" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: CardFooter, selector: "mcms-card-footer" }, { kind: "component", type: ForgotPasswordFormComponent, selector: "mcms-forgot-password-form", outputs: ["resetRequested", "backToLogin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12294
+ <mcms-card-footer class="justify-center">
12295
+ <p class="text-sm text-muted-foreground">Momentum CMS</p>
12296
+ </mcms-card-footer>
12297
+ </mcms-card>
12298
+ </main>
12299
+ `, isInline: true, dependencies: [{ kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardTitle, selector: "mcms-card-title", inputs: ["level"] }, { kind: "component", type: CardDescription, selector: "mcms-card-description" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: CardFooter, selector: "mcms-card-footer" }, { kind: "component", type: ForgotPasswordFormComponent, selector: "mcms-forgot-password-form", outputs: ["resetRequested", "backToLogin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12264
12300
  }
12265
12301
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ForgotPasswordPage, decorators: [{
12266
12302
  type: Component,
@@ -12280,22 +12316,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
12280
12316
  class: 'flex min-h-screen items-center justify-center bg-background p-4',
12281
12317
  },
12282
12318
  template: `
12283
- <mcms-card class="w-full max-w-md">
12284
- <mcms-card-header class="text-center">
12285
- <mcms-card-title>Reset Password</mcms-card-title>
12286
- <mcms-card-description>
12287
- We'll send you a link to reset your password
12288
- </mcms-card-description>
12289
- </mcms-card-header>
12319
+ <main>
12320
+ <mcms-card class="w-full max-w-md">
12321
+ <mcms-card-header class="text-center">
12322
+ <mcms-card-title>Reset Password</mcms-card-title>
12323
+ <mcms-card-description>
12324
+ We'll send you a link to reset your password
12325
+ </mcms-card-description>
12326
+ </mcms-card-header>
12290
12327
 
12291
- <mcms-card-content>
12292
- <mcms-forgot-password-form (backToLogin)="navigateToLogin()" />
12293
- </mcms-card-content>
12328
+ <mcms-card-content>
12329
+ <mcms-forgot-password-form (backToLogin)="navigateToLogin()" />
12330
+ </mcms-card-content>
12294
12331
 
12295
- <mcms-card-footer class="justify-center">
12296
- <p class="text-sm text-muted-foreground">Momentum CMS</p>
12297
- </mcms-card-footer>
12298
- </mcms-card>
12332
+ <mcms-card-footer class="justify-center">
12333
+ <p class="text-sm text-muted-foreground">Momentum CMS</p>
12334
+ </mcms-card-footer>
12335
+ </mcms-card>
12336
+ </main>
12299
12337
  `,
12300
12338
  }]
12301
12339
  }] });
@@ -12330,25 +12368,27 @@ class ResetPasswordPage {
12330
12368
  }
12331
12369
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ResetPasswordPage, deps: [], target: i0.ɵɵFactoryTarget.Component });
12332
12370
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.2", type: ResetPasswordPage, isStandalone: true, selector: "mcms-reset-password-page", host: { classAttribute: "flex min-h-screen items-center justify-center bg-background p-4" }, ngImport: i0, template: `
12333
- <mcms-card class="w-full max-w-md">
12334
- <mcms-card-header class="text-center">
12335
- <mcms-card-title>Set New Password</mcms-card-title>
12336
- <mcms-card-description> Enter your new password below </mcms-card-description>
12337
- </mcms-card-header>
12371
+ <main>
12372
+ <mcms-card class="w-full max-w-md">
12373
+ <mcms-card-header class="text-center">
12374
+ <mcms-card-title>Set New Password</mcms-card-title>
12375
+ <mcms-card-description> Enter your new password below </mcms-card-description>
12376
+ </mcms-card-header>
12338
12377
 
12339
- <mcms-card-content>
12340
- <mcms-reset-password-form
12341
- [token]="token()"
12342
- (goToLogin)="navigateToLogin()"
12343
- (goToForgotPassword)="navigateToForgotPassword()"
12344
- />
12345
- </mcms-card-content>
12378
+ <mcms-card-content>
12379
+ <mcms-reset-password-form
12380
+ [token]="token()"
12381
+ (goToLogin)="navigateToLogin()"
12382
+ (goToForgotPassword)="navigateToForgotPassword()"
12383
+ />
12384
+ </mcms-card-content>
12346
12385
 
12347
- <mcms-card-footer class="justify-center">
12348
- <p class="text-sm text-muted-foreground">Momentum CMS</p>
12349
- </mcms-card-footer>
12350
- </mcms-card>
12351
- `, isInline: true, dependencies: [{ kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardTitle, selector: "mcms-card-title" }, { kind: "component", type: CardDescription, selector: "mcms-card-description" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: CardFooter, selector: "mcms-card-footer" }, { kind: "component", type: ResetPasswordFormComponent, selector: "mcms-reset-password-form", inputs: ["token"], outputs: ["resetComplete", "resetFailed", "goToLogin", "goToForgotPassword"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12386
+ <mcms-card-footer class="justify-center">
12387
+ <p class="text-sm text-muted-foreground">Momentum CMS</p>
12388
+ </mcms-card-footer>
12389
+ </mcms-card>
12390
+ </main>
12391
+ `, isInline: true, dependencies: [{ kind: "component", type: Card, selector: "mcms-card" }, { kind: "component", type: CardHeader, selector: "mcms-card-header" }, { kind: "component", type: CardTitle, selector: "mcms-card-title", inputs: ["level"] }, { kind: "component", type: CardDescription, selector: "mcms-card-description" }, { kind: "component", type: CardContent, selector: "mcms-card-content" }, { kind: "component", type: CardFooter, selector: "mcms-card-footer" }, { kind: "component", type: ResetPasswordFormComponent, selector: "mcms-reset-password-form", inputs: ["token"], outputs: ["resetComplete", "resetFailed", "goToLogin", "goToForgotPassword"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12352
12392
  }
12353
12393
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: ResetPasswordPage, decorators: [{
12354
12394
  type: Component,
@@ -12368,24 +12408,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
12368
12408
  class: 'flex min-h-screen items-center justify-center bg-background p-4',
12369
12409
  },
12370
12410
  template: `
12371
- <mcms-card class="w-full max-w-md">
12372
- <mcms-card-header class="text-center">
12373
- <mcms-card-title>Set New Password</mcms-card-title>
12374
- <mcms-card-description> Enter your new password below </mcms-card-description>
12375
- </mcms-card-header>
12411
+ <main>
12412
+ <mcms-card class="w-full max-w-md">
12413
+ <mcms-card-header class="text-center">
12414
+ <mcms-card-title>Set New Password</mcms-card-title>
12415
+ <mcms-card-description> Enter your new password below </mcms-card-description>
12416
+ </mcms-card-header>
12376
12417
 
12377
- <mcms-card-content>
12378
- <mcms-reset-password-form
12379
- [token]="token()"
12380
- (goToLogin)="navigateToLogin()"
12381
- (goToForgotPassword)="navigateToForgotPassword()"
12382
- />
12383
- </mcms-card-content>
12418
+ <mcms-card-content>
12419
+ <mcms-reset-password-form
12420
+ [token]="token()"
12421
+ (goToLogin)="navigateToLogin()"
12422
+ (goToForgotPassword)="navigateToForgotPassword()"
12423
+ />
12424
+ </mcms-card-content>
12384
12425
 
12385
- <mcms-card-footer class="justify-center">
12386
- <p class="text-sm text-muted-foreground">Momentum CMS</p>
12387
- </mcms-card-footer>
12388
- </mcms-card>
12426
+ <mcms-card-footer class="justify-center">
12427
+ <p class="text-sm text-muted-foreground">Momentum CMS</p>
12428
+ </mcms-card-footer>
12429
+ </mcms-card>
12430
+ </main>
12389
12431
  `,
12390
12432
  }]
12391
12433
  }] });
@@ -12557,7 +12599,7 @@ class BlockWrapperComponent {
12557
12599
  }
12558
12600
  </div>
12559
12601
  }
12560
- `, isInline: true, dependencies: [{ kind: "component", type: FieldRenderer, selector: "mcms-field-renderer", inputs: ["field", "formNode", "formTree", "formModel", "mode", "path"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "ariaLabel"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12602
+ `, isInline: true, dependencies: [{ kind: "component", type: FieldRenderer, selector: "mcms-field-renderer", inputs: ["field", "formNode", "formTree", "formModel", "mode", "path"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: Badge, selector: "mcms-badge", inputs: ["variant", "class", "role", "ariaLabel"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
12561
12603
  }
12562
12604
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: BlockWrapperComponent, decorators: [{
12563
12605
  type: Component,
@@ -13335,18 +13377,18 @@ function provideMomentumFieldRenderers() {
13335
13377
  registry.register('checkbox', () => Promise.resolve().then(function () { return checkboxField_component; }).then((m) => m.CheckboxFieldRenderer));
13336
13378
  registry.register('date', () => Promise.resolve().then(function () { return dateField_component; }).then((m) => m.DateFieldRenderer));
13337
13379
  registry.register('upload', () => Promise.resolve().then(function () { return uploadField_component; }).then((m) => m.UploadFieldRenderer));
13338
- registry.register('richText', () => import('./momentumcms-admin-rich-text-field.component-BC8pRU89.mjs').then((m) => m.RichTextFieldRenderer));
13380
+ registry.register('richText', () => import('./momentumcms-admin-rich-text-field.component-BvpufJs3.mjs').then((m) => m.RichTextFieldRenderer));
13339
13381
  // Layout field renderers (support nested field rendering)
13340
- registry.register('group', () => import('./momentumcms-admin-group-field.component-B48_zbo0.mjs').then((m) => m.GroupFieldRenderer));
13341
- registry.register('array', () => import('./momentumcms-admin-array-field.component-Bjlcczwg.mjs').then((m) => m.ArrayFieldRenderer));
13342
- registry.register('blocks', () => import('./momentumcms-admin-blocks-field.component-4vLqDGbB.mjs').then((m) => m.BlocksFieldRenderer));
13382
+ registry.register('group', () => import('./momentumcms-admin-group-field.component-ffsgbC6o.mjs').then((m) => m.GroupFieldRenderer));
13383
+ registry.register('array', () => import('./momentumcms-admin-array-field.component-CLV4Ny9t.mjs').then((m) => m.ArrayFieldRenderer));
13384
+ registry.register('blocks', () => import('./momentumcms-admin-blocks-field.component-hHiTfUf9.mjs').then((m) => m.BlocksFieldRenderer));
13343
13385
  // Visual block editor variant (blocks field with admin.editor === 'visual')
13344
13386
  registry.register('blocks-visual', () => Promise.resolve().then(function () { return visualBlockEditor_component; }).then((m) => m.VisualBlockEditorComponent));
13345
- registry.register('relationship', () => import('./momentumcms-admin-relationship-field.component-D-UQgd7m.mjs').then((m) => m.RelationshipFieldRenderer));
13387
+ registry.register('relationship', () => import('./momentumcms-admin-relationship-field.component-DO0kyAkE.mjs').then((m) => m.RelationshipFieldRenderer));
13346
13388
  // Layout-only renderers (tabs, collapsible, row)
13347
- registry.register('tabs', () => import('./momentumcms-admin-tabs-field.component-B4X73eCM.mjs').then((m) => m.TabsFieldRenderer));
13348
- registry.register('collapsible', () => import('./momentumcms-admin-collapsible-field.component-63-9kSgm.mjs').then((m) => m.CollapsibleFieldRenderer));
13349
- registry.register('row', () => import('./momentumcms-admin-row-field.component--EOPGDtM.mjs').then((m) => m.RowFieldRenderer));
13389
+ registry.register('tabs', () => import('./momentumcms-admin-tabs-field.component-Uatoyjg8.mjs').then((m) => m.TabsFieldRenderer));
13390
+ registry.register('collapsible', () => import('./momentumcms-admin-collapsible-field.component-BeskwGvi.mjs').then((m) => m.CollapsibleFieldRenderer));
13391
+ registry.register('row', () => import('./momentumcms-admin-row-field.component-C8ZsdA2w.mjs').then((m) => m.RowFieldRenderer));
13350
13392
  };
13351
13393
  },
13352
13394
  },
@@ -13510,9 +13552,15 @@ class TextFieldRenderer {
13510
13552
  }
13511
13553
  @if (showCharCount()) {
13512
13554
  <p
13513
- class="mt-1 text-xs text-muted-foreground text-right"
13555
+ class="mt-1 text-xs text-right"
13514
13556
  [class.text-destructive]="charCountExceeded()"
13557
+ [class.text-muted-foreground]="!charCountExceeded()"
13558
+ aria-live="polite"
13559
+ [attr.role]="charCountExceeded() ? 'alert' : null"
13515
13560
  >
13561
+ @if (charCountExceeded()) {
13562
+ Limit exceeded:
13563
+ }
13516
13564
  {{ charCount() }}
13517
13565
  @if (maxLength()) {
13518
13566
  / {{ maxLength() }}
@@ -13520,7 +13568,7 @@ class TextFieldRenderer {
13520
13568
  </p>
13521
13569
  }
13522
13570
  </mcms-form-field>
13523
- `, isInline: true, dependencies: [{ kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Textarea, selector: "mcms-textarea", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "id", "name", "placeholder", "rows", "describedBy"], outputs: ["valueChange", "blurred"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
13571
+ `, isInline: true, dependencies: [{ kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "ariaLabel", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }, { kind: "component", type: Textarea, selector: "mcms-textarea", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "id", "name", "placeholder", "rows", "ariaLabel", "describedBy"], outputs: ["valueChange", "blurred"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
13524
13572
  }
13525
13573
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: TextFieldRenderer, decorators: [{
13526
13574
  type: Component,
@@ -13564,9 +13612,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
13564
13612
  }
13565
13613
  @if (showCharCount()) {
13566
13614
  <p
13567
- class="mt-1 text-xs text-muted-foreground text-right"
13615
+ class="mt-1 text-xs text-right"
13568
13616
  [class.text-destructive]="charCountExceeded()"
13617
+ [class.text-muted-foreground]="!charCountExceeded()"
13618
+ aria-live="polite"
13619
+ [attr.role]="charCountExceeded() ? 'alert' : null"
13569
13620
  >
13621
+ @if (charCountExceeded()) {
13622
+ Limit exceeded:
13623
+ }
13570
13624
  {{ charCount() }}
13571
13625
  @if (maxLength()) {
13572
13626
  / {{ maxLength() }}
@@ -13713,7 +13767,7 @@ class NumberFieldRenderer {
13713
13767
  <p class="mt-1 text-xs text-muted-foreground">{{ rangeHint() }}</p>
13714
13768
  }
13715
13769
  </mcms-form-field>
13716
- `, isInline: true, dependencies: [{ kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
13770
+ `, isInline: true, dependencies: [{ kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "ariaLabel", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
13717
13771
  }
13718
13772
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: NumberFieldRenderer, decorators: [{
13719
13773
  type: Component,
@@ -14015,9 +14069,7 @@ class DateFieldRenderer {
14015
14069
  }, ...(ngDevMode ? [{ debugName: "isDisabled" }] : []));
14016
14070
  /** Input type (date or datetime-local) */
14017
14071
  inputType = computed(() => {
14018
- // HTML5 date input type isn't in InputType union, use text for now
14019
- // The browser will still render date picker for type="date"
14020
- return 'text';
14072
+ return 'date';
14021
14073
  }, ...(ngDevMode ? [{ debugName: "inputType" }] : []));
14022
14074
  /** Formatted date value from FieldState */
14023
14075
  dateValue = computed(() => {
@@ -14097,7 +14149,7 @@ class DateFieldRenderer {
14097
14149
  (blurred)="onBlur()"
14098
14150
  />
14099
14151
  </mcms-form-field>
14100
- `, isInline: true, dependencies: [{ kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14152
+ `, isInline: true, dependencies: [{ kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Input, selector: "mcms-input", inputs: ["value", "disabled", "errors", "touched", "invalid", "readonly", "required", "type", "id", "name", "placeholder", "autocomplete", "ariaLabel", "describedBy", "min", "max", "step"], outputs: ["valueChange", "blurred"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14101
14153
  }
14102
14154
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: DateFieldRenderer, decorators: [{
14103
14155
  type: Component,
@@ -14853,9 +14905,10 @@ class UploadFieldRenderer {
14853
14905
  variant="outline"
14854
14906
  size="sm"
14855
14907
  type="button"
14908
+ [attr.aria-label]="'Change file for ' + label()"
14856
14909
  (click)="openMediaPicker()"
14857
14910
  >
14858
- <ng-icon [name]="photoIcon" class="h-4 w-4" />
14911
+ <ng-icon [name]="photoIcon" class="h-4 w-4" aria-hidden="true" />
14859
14912
  Change
14860
14913
  </button>
14861
14914
  <button
@@ -14863,9 +14916,10 @@ class UploadFieldRenderer {
14863
14916
  variant="ghost"
14864
14917
  size="sm"
14865
14918
  type="button"
14919
+ [attr.aria-label]="'Remove file for ' + label()"
14866
14920
  (click)="removeMedia()"
14867
14921
  >
14868
- <ng-icon [name]="xMarkIcon" class="h-4 w-4" />
14922
+ <ng-icon [name]="xMarkIcon" class="h-4 w-4" aria-hidden="true" />
14869
14923
  Remove
14870
14924
  </button>
14871
14925
  </div>
@@ -14938,7 +14992,7 @@ class UploadFieldRenderer {
14938
14992
  type="button"
14939
14993
  (click)="openMediaPicker()"
14940
14994
  >
14941
- <ng-icon [name]="photoIcon" class="h-4 w-4" />
14995
+ <ng-icon [name]="photoIcon" class="h-4 w-4" aria-hidden="true" />
14942
14996
  Select from library
14943
14997
  </button>
14944
14998
  </div>
@@ -14955,10 +15009,10 @@ class UploadFieldRenderer {
14955
15009
  }
14956
15010
 
14957
15011
  @if (uploadError()) {
14958
- <p class="mt-1 text-sm text-mcms-destructive">{{ uploadError() }}</p>
15012
+ <p class="mt-1 text-sm text-mcms-destructive" role="alert" aria-live="assertive">{{ uploadError() }}</p>
14959
15013
  }
14960
15014
  </mcms-form-field>
14961
- `, isInline: true, dependencies: [{ kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Progress, selector: "mcms-progress", inputs: ["value", "max", "class"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MediaPreviewComponent, selector: "mcms-media-preview", inputs: ["media", "size", "class", "rounded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
15015
+ `, isInline: true, dependencies: [{ kind: "component", type: McmsFormField, selector: "mcms-form-field", inputs: ["id", "required", "disabled", "errors", "hint", "hasLabel"] }, { kind: "component", type: Button, selector: "button[mcms-button], a[mcms-button]", inputs: ["variant", "size", "disabled", "loading", "ariaLabel", "class"] }, { kind: "component", type: Progress, selector: "mcms-progress", inputs: ["value", "max", "ariaLabel", "class"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MediaPreviewComponent, selector: "mcms-media-preview", inputs: ["media", "size", "class", "rounded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
14962
15016
  }
14963
15017
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImport: i0, type: UploadFieldRenderer, decorators: [{
14964
15018
  type: Component,
@@ -14991,9 +15045,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
14991
15045
  variant="outline"
14992
15046
  size="sm"
14993
15047
  type="button"
15048
+ [attr.aria-label]="'Change file for ' + label()"
14994
15049
  (click)="openMediaPicker()"
14995
15050
  >
14996
- <ng-icon [name]="photoIcon" class="h-4 w-4" />
15051
+ <ng-icon [name]="photoIcon" class="h-4 w-4" aria-hidden="true" />
14997
15052
  Change
14998
15053
  </button>
14999
15054
  <button
@@ -15001,9 +15056,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
15001
15056
  variant="ghost"
15002
15057
  size="sm"
15003
15058
  type="button"
15059
+ [attr.aria-label]="'Remove file for ' + label()"
15004
15060
  (click)="removeMedia()"
15005
15061
  >
15006
- <ng-icon [name]="xMarkIcon" class="h-4 w-4" />
15062
+ <ng-icon [name]="xMarkIcon" class="h-4 w-4" aria-hidden="true" />
15007
15063
  Remove
15008
15064
  </button>
15009
15065
  </div>
@@ -15076,7 +15132,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
15076
15132
  type="button"
15077
15133
  (click)="openMediaPicker()"
15078
15134
  >
15079
- <ng-icon [name]="photoIcon" class="h-4 w-4" />
15135
+ <ng-icon [name]="photoIcon" class="h-4 w-4" aria-hidden="true" />
15080
15136
  Select from library
15081
15137
  </button>
15082
15138
  </div>
@@ -15093,7 +15149,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.2", ngImpor
15093
15149
  }
15094
15150
 
15095
15151
  @if (uploadError()) {
15096
- <p class="mt-1 text-sm text-mcms-destructive">{{ uploadError() }}</p>
15152
+ <p class="mt-1 text-sm text-mcms-destructive" role="alert" aria-live="assertive">{{ uploadError() }}</p>
15097
15153
  }
15098
15154
  </mcms-form-field>
15099
15155
  `,
@@ -15112,4 +15168,4 @@ var uploadField_component = /*#__PURE__*/Object.freeze({
15112
15168
  */
15113
15169
 
15114
15170
  export { adminGuard as $, AdminShellComponent as A, BlockEditDialog as B, CheckboxFieldRenderer as C, DashboardPage as D, EntityFormWidget as E, FieldRenderer as F, MediaLibraryPage as G, MediaPickerDialog as H, MediaPreviewComponent as I, MomentumApiService as J, MomentumAuthService as K, LivePreviewComponent as L, MOMENTUM_API as M, NumberFieldRenderer as N, ResetPasswordPage as O, PublishControlsWidget as P, SKIP_AUTO_TOAST as Q, ResetPasswordFormComponent as R, SHEET_QUERY_PARAMS as S, SelectFieldRenderer as T, SetupPage as U, TextFieldRenderer as V, UploadFieldRenderer as W, UploadService as X, VersionHistoryWidget as Y, VersionService as Z, VisualBlockEditorComponent as _, getFieldNodeState as a, authGuard as a0, collectionAccessGuard as a1, crudToastInterceptor as a2, guestGuard as a3, injectHasAnyRole as a4, injectHasRole as a5, injectIsAdmin as a6, injectIsAuthenticated as a7, injectMomentumAPI as a8, injectTypedMomentumAPI as a9, injectUser as aa, injectUserRole as ab, injectVersionService as ac, momentumAdminRoutes as ad, provideFieldRenderer as ae, provideMomentumAPI as af, provideMomentumFieldRenderers as ag, setupGuard as ah, unsavedChangesGuard as ai, getSubNode as b, getFieldDefaultValue as c, EntitySheetService as d, getTitleField as e, AdminSidebarWidget as f, getGlobalsFromRouteData as g, BlockInserterComponent as h, isRecord as i, BlockWrapperComponent as j, CollectionAccessService as k, CollectionCardWidget as l, CollectionEditPage as m, normalizeBlockDefaults as n, CollectionListPage as o, CollectionViewPage as p, DateFieldRenderer as q, EntityListWidget as r, EntityViewWidget as s, FeedbackService as t, FieldRendererRegistry as u, ForgotPasswordFormComponent as v, ForgotPasswordPage as w, LoginPage as x, MOMENTUM_API_CONTEXT as y, McmsThemeService as z };
15115
- //# sourceMappingURL=momentumcms-admin-momentumcms-admin-D_47TVaR.mjs.map
15171
+ //# sourceMappingURL=momentumcms-admin-momentumcms-admin-De5FLr2L.mjs.map