@memberjunction/ng-explorer-settings 3.4.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +102 -454
  2. package/dist/lib/account-info/account-info.component.d.ts.map +1 -1
  3. package/dist/lib/account-info/account-info.component.js +7 -5
  4. package/dist/lib/account-info/account-info.component.js.map +1 -1
  5. package/dist/lib/appearance-settings/appearance-settings.component.d.ts.map +1 -1
  6. package/dist/lib/appearance-settings/appearance-settings.component.js +3 -3
  7. package/dist/lib/appearance-settings/appearance-settings.component.js.map +1 -1
  8. package/dist/lib/application-management/application-dialog/application-dialog.component.d.ts.map +1 -1
  9. package/dist/lib/application-management/application-dialog/application-dialog.component.js +20 -18
  10. package/dist/lib/application-management/application-dialog/application-dialog.component.js.map +1 -1
  11. package/dist/lib/application-management/application-management.component.d.ts +3 -2
  12. package/dist/lib/application-management/application-management.component.d.ts.map +1 -1
  13. package/dist/lib/application-management/application-management.component.js +20 -15
  14. package/dist/lib/application-management/application-management.component.js.map +1 -1
  15. package/dist/lib/application-settings/application-settings.component.d.ts.map +1 -1
  16. package/dist/lib/application-settings/application-settings.component.js +12 -9
  17. package/dist/lib/application-settings/application-settings.component.js.map +1 -1
  18. package/dist/lib/entity-permissions/entity-permissions.component.d.ts.map +1 -1
  19. package/dist/lib/entity-permissions/entity-permissions.component.js +13 -10
  20. package/dist/lib/entity-permissions/entity-permissions.component.js.map +1 -1
  21. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts +1 -1
  22. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.d.ts.map +1 -1
  23. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js +44 -43
  24. package/dist/lib/entity-permissions/permission-dialog/permission-dialog.component.js.map +1 -1
  25. package/dist/lib/general-settings/general-settings.component.d.ts.map +1 -1
  26. package/dist/lib/general-settings/general-settings.component.js +3 -3
  27. package/dist/lib/general-settings/general-settings.component.js.map +1 -1
  28. package/dist/lib/module.d.ts +11 -12
  29. package/dist/lib/module.d.ts.map +1 -1
  30. package/dist/lib/module.js +0 -4
  31. package/dist/lib/module.js.map +1 -1
  32. package/dist/lib/notification-preferences/notification-preferences.component.d.ts.map +1 -1
  33. package/dist/lib/notification-preferences/notification-preferences.component.js +9 -8
  34. package/dist/lib/notification-preferences/notification-preferences.component.js.map +1 -1
  35. package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts +1 -1
  36. package/dist/lib/role-management/role-dialog/role-dialog.component.d.ts.map +1 -1
  37. package/dist/lib/role-management/role-dialog/role-dialog.component.js +32 -32
  38. package/dist/lib/role-management/role-dialog/role-dialog.component.js.map +1 -1
  39. package/dist/lib/role-management/role-management.component.d.ts.map +1 -1
  40. package/dist/lib/role-management/role-management.component.js +11 -8
  41. package/dist/lib/role-management/role-management.component.js.map +1 -1
  42. package/dist/lib/settings/settings.component.d.ts.map +1 -1
  43. package/dist/lib/settings/settings.component.js +17 -11
  44. package/dist/lib/settings/settings.component.js.map +1 -1
  45. package/dist/lib/shared/settings-card.component.d.ts.map +1 -1
  46. package/dist/lib/shared/settings-card.component.js +4 -4
  47. package/dist/lib/shared/settings-card.component.js.map +1 -1
  48. package/dist/lib/sql-logging/sql-logging.component.d.ts +2 -2
  49. package/dist/lib/sql-logging/sql-logging.component.d.ts.map +1 -1
  50. package/dist/lib/sql-logging/sql-logging.component.js +21 -16
  51. package/dist/lib/sql-logging/sql-logging.component.js.map +1 -1
  52. package/dist/lib/user-app-config/user-app-config.component.d.ts.map +1 -1
  53. package/dist/lib/user-app-config/user-app-config.component.js +14 -11
  54. package/dist/lib/user-app-config/user-app-config.component.js.map +1 -1
  55. package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts +1 -1
  56. package/dist/lib/user-management/user-dialog/user-dialog.component.d.ts.map +1 -1
  57. package/dist/lib/user-management/user-dialog/user-dialog.component.js +37 -36
  58. package/dist/lib/user-management/user-dialog/user-dialog.component.js.map +1 -1
  59. package/dist/lib/user-management/user-management.component.d.ts.map +1 -1
  60. package/dist/lib/user-management/user-management.component.js +23 -19
  61. package/dist/lib/user-management/user-management.component.js.map +1 -1
  62. package/dist/lib/user-profile-settings/user-profile-settings.component.d.ts.map +1 -1
  63. package/dist/lib/user-profile-settings/user-profile-settings.component.js +16 -12
  64. package/dist/lib/user-profile-settings/user-profile-settings.component.js.map +1 -1
  65. package/dist/public-api.d.ts +5 -12
  66. package/dist/public-api.d.ts.map +1 -1
  67. package/dist/public-api.js +6 -38
  68. package/dist/public-api.js.map +1 -1
  69. package/package.json +35 -36
@@ -44,7 +44,7 @@ export class AppearanceSettingsComponent {
44
44
  }
45
45
  ];
46
46
  static ɵfac = function AppearanceSettingsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || AppearanceSettingsComponent)(); };
47
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AppearanceSettingsComponent, selectors: [["mj-appearance-settings"]], decls: 19, vars: 0, consts: [[1, "appearance-settings"], [1, "section-title"], [1, "section-description"], [1, "coming-soon-banner"], [1, "banner-icon"], [1, "fa-solid", "fa-palette"], [1, "banner-content"], [1, "planned-features"], [1, "features-title"], [1, "features-grid"], [1, "feature-card"], [1, "feature-icon"], [1, "feature-info"], [1, "feature-title"], [1, "feature-desc"]], template: function AppearanceSettingsComponent_Template(rf, ctx) { if (rf & 1) {
47
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: AppearanceSettingsComponent, selectors: [["mj-appearance-settings"]], standalone: false, decls: 19, vars: 0, consts: [[1, "appearance-settings"], [1, "section-title"], [1, "section-description"], [1, "coming-soon-banner"], [1, "banner-icon"], [1, "fa-solid", "fa-palette"], [1, "banner-content"], [1, "planned-features"], [1, "features-title"], [1, "features-grid"], [1, "feature-card"], [1, "feature-icon"], [1, "feature-info"], [1, "feature-title"], [1, "feature-desc"]], template: function AppearanceSettingsComponent_Template(rf, ctx) { if (rf & 1) {
48
48
  i0.ɵɵelementStart(0, "div", 0)(1, "h2", 1);
49
49
  i0.ɵɵtext(2, "Appearance");
50
50
  i0.ɵɵelementEnd();
@@ -73,7 +73,7 @@ export class AppearanceSettingsComponent {
73
73
  }
74
74
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(AppearanceSettingsComponent, [{
75
75
  type: Component,
76
- args: [{ selector: 'mj-appearance-settings', template: "<div class=\"appearance-settings\">\n <h2 class=\"section-title\">Appearance</h2>\n <p class=\"section-description\">Customize how MemberJunction looks and feels</p>\n\n <div class=\"coming-soon-banner\">\n <div class=\"banner-icon\">\n <i class=\"fa-solid fa-palette\"></i>\n </div>\n <div class=\"banner-content\">\n <h3>Coming Soon</h3>\n <p>We're working on bringing you more customization options.</p>\n </div>\n </div>\n\n <div class=\"planned-features\">\n <h4 class=\"features-title\">Planned Features</h4>\n <div class=\"features-grid\">\n @for (feature of PlannedFeatures; track feature.title) {\n <div class=\"feature-card\">\n <div class=\"feature-icon\">\n <i [class]=\"feature.icon\"></i>\n </div>\n <div class=\"feature-info\">\n <span class=\"feature-title\">{{ feature.title }}</span>\n <span class=\"feature-desc\">{{ feature.description }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [".appearance-settings {\n padding: 0;\n}\n\n.section-title {\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-primary, #1a1a1a);\n}\n\n.section-description {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #666);\n margin: 0 0 1.5rem 0;\n}\n\n.coming-soon-banner {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n padding: 2rem;\n background: linear-gradient(135deg, var(--mj-primary-light, #dbeafe) 0%, var(--mj-info-bg, #e0f2fe) 100%);\n border-radius: 16px;\n margin-bottom: 2rem;\n}\n\n.banner-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 4rem;\n height: 4rem;\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n flex-shrink: 0;\n}\n\n.banner-icon i {\n font-size: 2rem;\n color: var(--mj-primary-color, #3b82f6);\n}\n\n.banner-content h3 {\n font-size: 1.25rem;\n font-weight: 600;\n color: var(--mj-text-primary, #1f2937);\n margin: 0 0 0.5rem 0;\n}\n\n.banner-content p {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #4b5563);\n margin: 0;\n}\n\n.planned-features {\n margin-top: 1rem;\n}\n\n.features-title {\n font-size: 0.875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary, #6b7280);\n margin: 0 0 1rem 0;\n}\n\n.features-grid {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.feature-card {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.25rem;\n background: var(--mj-surface-color, #fff);\n border: 1px solid var(--mj-border-color, #e5e7eb);\n border-radius: 12px;\n opacity: 0.7;\n}\n\n.feature-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n background: var(--mj-surface-secondary, #f3f4f6);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.feature-icon i {\n font-size: 1rem;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n.feature-info {\n display: flex;\n flex-direction: column;\n}\n\n.feature-title {\n font-weight: 500;\n color: var(--mj-text-primary, #1f2937);\n}\n\n.feature-desc {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n@media (max-width: 480px) {\n .coming-soon-banner {\n flex-direction: column;\n text-align: center;\n }\n}\n"] }]
76
+ args: [{ standalone: false, selector: 'mj-appearance-settings', template: "<div class=\"appearance-settings\">\n <h2 class=\"section-title\">Appearance</h2>\n <p class=\"section-description\">Customize how MemberJunction looks and feels</p>\n\n <div class=\"coming-soon-banner\">\n <div class=\"banner-icon\">\n <i class=\"fa-solid fa-palette\"></i>\n </div>\n <div class=\"banner-content\">\n <h3>Coming Soon</h3>\n <p>We're working on bringing you more customization options.</p>\n </div>\n </div>\n\n <div class=\"planned-features\">\n <h4 class=\"features-title\">Planned Features</h4>\n <div class=\"features-grid\">\n @for (feature of PlannedFeatures; track feature.title) {\n <div class=\"feature-card\">\n <div class=\"feature-icon\">\n <i [class]=\"feature.icon\"></i>\n </div>\n <div class=\"feature-info\">\n <span class=\"feature-title\">{{ feature.title }}</span>\n <span class=\"feature-desc\">{{ feature.description }}</span>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [".appearance-settings {\n padding: 0;\n}\n\n.section-title {\n font-size: 1.5rem;\n font-weight: 600;\n margin: 0 0 0.5rem 0;\n color: var(--mj-text-primary, #1a1a1a);\n}\n\n.section-description {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #666);\n margin: 0 0 1.5rem 0;\n}\n\n.coming-soon-banner {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n padding: 2rem;\n background: linear-gradient(135deg, var(--mj-primary-light, #dbeafe) 0%, var(--mj-info-bg, #e0f2fe) 100%);\n border-radius: 16px;\n margin-bottom: 2rem;\n}\n\n.banner-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 4rem;\n height: 4rem;\n background: white;\n border-radius: 12px;\n box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);\n flex-shrink: 0;\n}\n\n.banner-icon i {\n font-size: 2rem;\n color: var(--mj-primary-color, #3b82f6);\n}\n\n.banner-content h3 {\n font-size: 1.25rem;\n font-weight: 600;\n color: var(--mj-text-primary, #1f2937);\n margin: 0 0 0.5rem 0;\n}\n\n.banner-content p {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #4b5563);\n margin: 0;\n}\n\n.planned-features {\n margin-top: 1rem;\n}\n\n.features-title {\n font-size: 0.875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-secondary, #6b7280);\n margin: 0 0 1rem 0;\n}\n\n.features-grid {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n}\n\n.feature-card {\n display: flex;\n align-items: center;\n gap: 1rem;\n padding: 1rem 1.25rem;\n background: var(--mj-surface-color, #fff);\n border: 1px solid var(--mj-border-color, #e5e7eb);\n border-radius: 12px;\n opacity: 0.7;\n}\n\n.feature-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 2.5rem;\n height: 2.5rem;\n background: var(--mj-surface-secondary, #f3f4f6);\n border-radius: 8px;\n flex-shrink: 0;\n}\n\n.feature-icon i {\n font-size: 1rem;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n.feature-info {\n display: flex;\n flex-direction: column;\n}\n\n.feature-title {\n font-weight: 500;\n color: var(--mj-text-primary, #1f2937);\n}\n\n.feature-desc {\n font-size: 0.875rem;\n color: var(--mj-text-secondary, #6b7280);\n}\n\n@media (max-width: 480px) {\n .coming-soon-banner {\n flex-direction: column;\n text-align: center;\n }\n}\n"] }]
77
77
  }], null, null); })();
78
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AppearanceSettingsComponent, { className: "AppearanceSettingsComponent", filePath: "src/lib/appearance-settings/appearance-settings.component.ts", lineNumber: 12 }); })();
78
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AppearanceSettingsComponent, { className: "AppearanceSettingsComponent", filePath: "src/lib/appearance-settings/appearance-settings.component.ts", lineNumber: 13 }); })();
79
79
  //# sourceMappingURL=appearance-settings.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"appearance-settings.component.js","sourceRoot":"","sources":["../../../src/lib/appearance-settings/appearance-settings.component.ts","../../../src/lib/appearance-settings/appearance-settings.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;;;ICmBhC,AADF,+BAA0B,cACE;IACxB,oBAA8B;IAChC,iBAAM;IAEJ,AADF,+BAA0B,eACI;IAAA,YAAmB;IAAA,iBAAO;IACtD,gCAA2B;IAAA,YAAyB;IAExD,AADE,AADsD,iBAAO,EACvD,EACF;;;IANC,eAAsB;IAAtB,8BAAsB;IAGG,eAAmB;IAAnB,sCAAmB;IACpB,eAAyB;IAAzB,4CAAyB;;ADtBhE;;;GAGG;AAMH,MAAM,OAAO,2BAA2B;IACtC,0BAA0B;IAC1B,eAAe,GAAG;QAChB;YACE,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,6CAA6C;SAC3D;QACD;YACE,IAAI,EAAE,yBAAyB;YAC/B,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,yCAAyC;SACvD;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,gDAAgD;SAC9D;KACF,CAAC;qHAlBS,2BAA2B;6DAA3B,2BAA2B;YCVtC,AADF,8BAAiC,YACL;YAAA,0BAAU;YAAA,iBAAK;YACzC,4BAA+B;YAAA,4DAA4C;YAAA,iBAAI;YAG7E,AADF,8BAAgC,aACL;YACvB,uBAAmC;YACrC,iBAAM;YAEJ,AADF,8BAA4B,SACtB;YAAA,4BAAW;YAAA,iBAAK;YACpB,0BAAG;YAAA,0EAAyD;YAEhE,AADE,AAD8D,iBAAI,EAC5D,EACF;YAGJ,AADF,+BAA8B,aACD;YAAA,iCAAgB;YAAA,iBAAK;YAChD,+BAA2B;YACzB,iGAUC;YAGP,AADE,AADE,iBAAM,EACF,EACF;;YAbA,gBAUC;YAVD,kCAUC;;;iFDhBM,2BAA2B;cALvC,SAAS;2BACE,wBAAwB;;kFAIvB,2BAA2B"}
1
+ {"version":3,"file":"appearance-settings.component.js","sourceRoot":"","sources":["../../../src/lib/appearance-settings/appearance-settings.component.ts","../../../src/lib/appearance-settings/appearance-settings.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;;;ICmBhC,AADF,+BAA0B,cACE;IACxB,oBAA8B;IAChC,iBAAM;IAEJ,AADF,+BAA0B,eACI;IAAA,YAAmB;IAAA,iBAAO;IACtD,gCAA2B;IAAA,YAAyB;IAExD,AADE,AADsD,iBAAO,EACvD,EACF;;;IANC,eAAsB;IAAtB,8BAAsB;IAGG,eAAmB;IAAnB,sCAAmB;IACpB,eAAyB;IAAzB,4CAAyB;;ADtBhE;;;GAGG;AAOH,MAAM,OAAO,2BAA2B;IACtC,0BAA0B;IAC1B,eAAe,GAAG;QAChB;YACE,IAAI,EAAE,kBAAkB;YACxB,KAAK,EAAE,OAAO;YACd,WAAW,EAAE,6CAA6C;SAC3D;QACD;YACE,IAAI,EAAE,yBAAyB;YAC/B,KAAK,EAAE,WAAW;YAClB,WAAW,EAAE,yCAAyC;SACvD;QACD;YACE,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,gDAAgD;SAC9D;KACF,CAAC;qHAlBS,2BAA2B;6DAA3B,2BAA2B;YCXtC,AADF,8BAAiC,YACL;YAAA,0BAAU;YAAA,iBAAK;YACzC,4BAA+B;YAAA,4DAA4C;YAAA,iBAAI;YAG7E,AADF,8BAAgC,aACL;YACvB,uBAAmC;YACrC,iBAAM;YAEJ,AADF,8BAA4B,SACtB;YAAA,4BAAW;YAAA,iBAAK;YACpB,0BAAG;YAAA,0EAAyD;YAEhE,AADE,AAD8D,iBAAI,EAC5D,EACF;YAGJ,AADF,+BAA8B,aACD;YAAA,iCAAgB;YAAA,iBAAK;YAChD,+BAA2B;YACzB,iGAUC;YAGP,AADE,AADE,iBAAM,EACF,EACF;;YAbA,gBAUC;YAVD,kCAUC;;;iFDfM,2BAA2B;cANvC,SAAS;6BACI,KAAK,YACP,wBAAwB;;kFAIvB,2BAA2B"}
@@ -1 +1 @@
1
- {"version":3,"file":"application-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/application-management/application-dialog/application-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAwB,MAAM,eAAe,CAAC;AAE1I,OAAO,EAAiD,SAAS,EAAc,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAmB,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAEzG,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;CACzB;AAED,UAAU,uBAAuB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAED,qBAKa,0BAA2B,YAAW,MAAM,EAAE,SAAS,EAAE,SAAS;IACpE,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAQ;IAC1C,OAAO,UAAS;IACf,MAAM,wCAA+C;IAE/D,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,QAAQ,CAAkB;IAE3B,eAAe,EAAE,SAAS,CAAC;IAC3B,SAAS,UAAS;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG5B,mBAAmB,EAAE,uBAAuB,EAAE,CAAM;IACpD,iBAAiB,EAAE,YAAY,EAAE,CAAM;IACvC,WAAW,EAAE,YAAY,EAAE,CAAM;IAGjC,gBAAgB,SAAM;IAGtB,eAAe;;;;MAIpB;IAGK,YAAY,UAAS;;IAS5B,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC,WAAW,IAAI,IAAI;YAIL,gBAAgB;YAuBhB,eAAe;IAW7B,OAAO,CAAC,SAAS;IAYjB,WAAW,IAAI,IAAI;IAMnB,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,UAAU,IAAI,OAAO,CAE/B;YAEa,mBAAmB;YAanB,uBAAuB;IAsC9B,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAiBrC,YAAY,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAcnD,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASjC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS1C,OAAO,CAAC,eAAe;IAShB,yBAAyB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAMvE,IAAW,gBAAgB,IAAI,OAAO,CAErC;IAGD,IAAW,yBAAyB,IAAI,YAAY,EAAE,CASrD;IAEM,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKxC,iBAAiB,IAAI,IAAI;IAIzB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI;IAIrE,gBAAgB,IAAI,IAAI;IAIxB,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,uBAAuB,EAAE,CAAC,GAAG,IAAI;IAO3D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YA+CxB,uBAAuB;IA8B9B,QAAQ,IAAI,IAAI;IAIvB,OAAO,CAAC,oBAAoB;yCA3VjB,0BAA0B;2CAA1B,0BAA0B;CAiWtC"}
1
+ {"version":3,"file":"application-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/application-management/application-dialog/application-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAwB,MAAM,eAAe,CAAC;AAE1I,OAAO,EAAiD,SAAS,EAAc,MAAM,gBAAgB,CAAC;AACtG,OAAO,EAAE,WAAW,EAAmB,MAAM,wBAAwB,CAAC;AAEtE,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAEzG,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;CACzB;AAED,UAAU,uBAAuB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1B,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC;AAED,qBAMa,0BAA2B,YAAW,MAAM,EAAE,SAAS,EAAE,SAAS;IACpE,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAQ;IAC1C,OAAO,UAAS;IACf,MAAM,wCAA+C;IAE/D,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,QAAQ,CAAkB;IAE3B,eAAe,EAAE,SAAS,CAAC;IAC3B,SAAS,UAAS;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAG5B,mBAAmB,EAAE,uBAAuB,EAAE,CAAM;IACpD,iBAAiB,EAAE,YAAY,EAAE,CAAM;IACvC,WAAW,EAAE,YAAY,EAAE,CAAM;IAGjC,gBAAgB,SAAM;IAGtB,eAAe;;;;MAIpB;IAGK,YAAY,UAAS;;IAS5B,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMzC,WAAW,IAAI,IAAI;YAIL,gBAAgB;YAuBhB,eAAe;IAW7B,OAAO,CAAC,SAAS;IAYjB,WAAW,IAAI,IAAI;IAMnB,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,IAAW,UAAU,IAAI,OAAO,CAE/B;YAEa,mBAAmB;YAanB,uBAAuB;IAsC9B,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAiBrC,YAAY,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAcnD,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IASjC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS1C,OAAO,CAAC,eAAe;IAShB,yBAAyB,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;IAMvE,IAAW,gBAAgB,IAAI,OAAO,CAErC;IAGD,IAAW,yBAAyB,IAAI,YAAY,EAAE,CASrD;IAEM,oBAAoB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKxC,iBAAiB,IAAI,IAAI;IAIzB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI;IAIrE,gBAAgB,IAAI,IAAI;IAIxB,YAAY,CAAC,KAAK,EAAE,WAAW,CAAC,uBAAuB,EAAE,CAAC,GAAG,IAAI;IAO3D,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YA+CxB,uBAAuB;IA8B9B,QAAQ,IAAI,IAAI;IAIvB,OAAO,CAAC,oBAAoB;yCA3VjB,0BAA0B;2CAA1B,0BAA0B;CAiWtC"}
@@ -6,9 +6,9 @@ import * as i0 from "@angular/core";
6
6
  import * as i1 from "@angular/forms";
7
7
  import * as i2 from "@angular/cdk/drag-drop";
8
8
  import * as i3 from "@angular/common";
9
+ const _c0 = () => ({ standalone: true });
9
10
  const _forTrack0 = ($index, $item) => $item.entity.ID;
10
11
  const _forTrack1 = ($index, $item) => $item.ID;
11
- const _c0 = () => ({ standalone: true });
12
12
  function ApplicationDialogComponent_Conditional_0_Conditional_16_Template(rf, ctx) { if (rf & 1) {
13
13
  i0.ɵɵelementStart(0, "div", 14)(1, "div", 27);
14
14
  i0.ɵɵelement(2, "i", 28);
@@ -29,7 +29,8 @@ function ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_C
29
29
  function ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Template(rf, ctx) { if (rf & 1) {
30
30
  i0.ɵɵelementStart(0, "div", 33);
31
31
  i0.ɵɵelement(1, "i", 37);
32
- i0.ɵɵtemplate(2, ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Conditional_2_Template, 1, 0)(3, ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Conditional_3_Template, 1, 0);
32
+ i0.ɵɵconditionalCreate(2, ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Conditional_2_Template, 1, 0);
33
+ i0.ɵɵconditionalCreate(3, ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Conditional_3_Template, 1, 0);
33
34
  i0.ɵɵelementEnd();
34
35
  } if (rf & 2) {
35
36
  let tmp_3_0;
@@ -45,7 +46,7 @@ function ApplicationDialogComponent_Conditional_0_Conditional_26_Template(rf, ct
45
46
  i0.ɵɵtext(4, "Application Name");
46
47
  i0.ɵɵelementEnd();
47
48
  i0.ɵɵelement(5, "input", 32);
48
- i0.ɵɵtemplate(6, ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Template, 4, 2, "div", 33);
49
+ i0.ɵɵconditionalCreate(6, ApplicationDialogComponent_Conditional_0_Conditional_26_Conditional_6_Template, 4, 2, "div", 33);
49
50
  i0.ɵɵelementEnd();
50
51
  i0.ɵɵelementStart(7, "div", 30)(8, "label", 34);
51
52
  i0.ɵɵtext(9, "Description");
@@ -81,7 +82,7 @@ function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_F
81
82
  i0.ɵɵelementEnd();
82
83
  i0.ɵɵelementStart(5, "div", 50)(6, "div", 51);
83
84
  i0.ɵɵtext(7);
84
- i0.ɵɵtemplate(8, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_For_5_Conditional_8_Template, 1, 2, "i", 52);
85
+ i0.ɵɵconditionalCreate(8, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_For_5_Conditional_8_Template, 1, 2, "i", 52);
85
86
  i0.ɵɵelementEnd()()();
86
87
  i0.ɵɵelementStart(9, "div", 53)(10, "div", 54)(11, "label", 55)(12, "input", 56);
87
88
  i0.ɵɵtwoWayListener("ngModelChange", function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_For_5_Template_input_ngModelChange_12_listener($event) { const config_r5 = i0.ɵɵrestoreView(_r4).$implicit; i0.ɵɵtwoWayBindingSet(config_r5.defaultForNewUser, $event) || (config_r5.defaultForNewUser = $event); return i0.ɵɵresetView($event); });
@@ -192,9 +193,9 @@ function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_T
192
193
  i0.ɵɵelementStart(6, "input", 65);
193
194
  i0.ɵɵlistener("input", function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Template_input_input_6_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onEntitySearchChange($event)); });
194
195
  i0.ɵɵelementEnd();
195
- i0.ɵɵtemplate(7, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_7_Template, 2, 0, "button", 66);
196
+ i0.ɵɵconditionalCreate(7, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_7_Template, 2, 0, "button", 66);
196
197
  i0.ɵɵelementEnd()();
197
- i0.ɵɵtemplate(8, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_8_Template, 3, 0, "div", 67)(9, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_9_Template, 4, 1, "div", 68);
198
+ i0.ɵɵconditionalCreate(8, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_8_Template, 3, 0, "div", 67)(9, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Conditional_9_Template, 4, 1, "div", 68);
198
199
  i0.ɵɵelementEnd();
199
200
  } if (rf & 2) {
200
201
  const ctx_r1 = i0.ɵɵnextContext(3);
@@ -216,7 +217,8 @@ function ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_5_T
216
217
  } }
217
218
  function ApplicationDialogComponent_Conditional_0_Conditional_36_Template(rf, ctx) { if (rf & 1) {
218
219
  i0.ɵɵelementStart(0, "div", 22)(1, "div", 29);
219
- i0.ɵɵtemplate(2, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_Template, 6, 1, "div", 38)(3, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_3_Template, 6, 0, "div", 39)(4, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Template, 10, 5, "div", 40)(5, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_5_Template, 4, 0, "div", 41);
220
+ i0.ɵɵconditionalCreate(2, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_2_Template, 6, 1, "div", 38)(3, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_3_Template, 6, 0, "div", 39);
221
+ i0.ɵɵconditionalCreate(4, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_4_Template, 10, 5, "div", 40)(5, ApplicationDialogComponent_Conditional_0_Conditional_36_Conditional_5_Template, 4, 0, "div", 41);
220
222
  i0.ɵɵelementEnd()();
221
223
  } if (rf & 2) {
222
224
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -276,7 +278,7 @@ function ApplicationDialogComponent_Conditional_0_Conditional_37_Template(rf, ct
276
278
  i0.ɵɵelementStart(7, "span", 21);
277
279
  i0.ɵɵtext(8, "Application metadata and audit information");
278
280
  i0.ɵɵelementEnd()();
279
- i0.ɵɵtemplate(9, ApplicationDialogComponent_Conditional_0_Conditional_37_Conditional_9_Template, 25, 10, "div", 22);
281
+ i0.ɵɵconditionalCreate(9, ApplicationDialogComponent_Conditional_0_Conditional_37_Conditional_9_Template, 25, 10, "div", 22);
280
282
  i0.ɵɵelementEnd();
281
283
  } if (rf & 2) {
282
284
  const ctx_r1 = i0.ɵɵnextContext(2);
@@ -320,7 +322,7 @@ function ApplicationDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
320
322
  i0.ɵɵelementEnd()()();
321
323
  i0.ɵɵelementStart(14, "div", 12)(15, "form", 13);
322
324
  i0.ɵɵlistener("ngSubmit", function ApplicationDialogComponent_Conditional_0_Template_form_ngSubmit_15_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSubmit()); });
323
- i0.ɵɵtemplate(16, ApplicationDialogComponent_Conditional_0_Conditional_16_Template, 5, 1, "div", 14);
325
+ i0.ɵɵconditionalCreate(16, ApplicationDialogComponent_Conditional_0_Conditional_16_Template, 5, 1, "div", 14);
324
326
  i0.ɵɵelementStart(17, "fieldset", 15)(18, "legend", 16);
325
327
  i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Template_legend_click_18_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSection("basicInfo")); });
326
328
  i0.ɵɵelementStart(19, "div", 17)(20, "span", 18);
@@ -332,7 +334,7 @@ function ApplicationDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
332
334
  i0.ɵɵelementStart(24, "span", 21);
333
335
  i0.ɵɵtext(25, "Define the application's basic properties");
334
336
  i0.ɵɵelementEnd()();
335
- i0.ɵɵtemplate(26, ApplicationDialogComponent_Conditional_0_Conditional_26_Template, 13, 4, "div", 22);
337
+ i0.ɵɵconditionalCreate(26, ApplicationDialogComponent_Conditional_0_Conditional_26_Template, 13, 4, "div", 22);
336
338
  i0.ɵɵelementEnd();
337
339
  i0.ɵɵelementStart(27, "fieldset", 15)(28, "legend", 16);
338
340
  i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Template_legend_click_28_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleSection("entities")); });
@@ -345,13 +347,13 @@ function ApplicationDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
345
347
  i0.ɵɵelementStart(34, "span", 21);
346
348
  i0.ɵɵtext(35, "Manage which entities are included in this application");
347
349
  i0.ɵɵelementEnd()();
348
- i0.ɵɵtemplate(36, ApplicationDialogComponent_Conditional_0_Conditional_36_Template, 6, 2, "div", 22);
350
+ i0.ɵɵconditionalCreate(36, ApplicationDialogComponent_Conditional_0_Conditional_36_Template, 6, 2, "div", 22);
349
351
  i0.ɵɵelementEnd();
350
- i0.ɵɵtemplate(37, ApplicationDialogComponent_Conditional_0_Conditional_37_Template, 10, 5, "fieldset", 15);
352
+ i0.ɵɵconditionalCreate(37, ApplicationDialogComponent_Conditional_0_Conditional_37_Template, 10, 5, "fieldset", 15);
351
353
  i0.ɵɵelementEnd()();
352
354
  i0.ɵɵelementStart(38, "div", 24)(39, "button", 25);
353
355
  i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Template_button_click_39_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSubmit()); });
354
- i0.ɵɵtemplate(40, ApplicationDialogComponent_Conditional_0_Conditional_40_Template, 2, 0)(41, ApplicationDialogComponent_Conditional_0_Conditional_41_Template, 2, 1);
356
+ i0.ɵɵconditionalCreate(40, ApplicationDialogComponent_Conditional_0_Conditional_40_Template, 2, 0)(41, ApplicationDialogComponent_Conditional_0_Conditional_41_Template, 2, 1);
355
357
  i0.ɵɵelementEnd();
356
358
  i0.ɵɵelementStart(42, "button", 26);
357
359
  i0.ɵɵlistener("click", function ApplicationDialogComponent_Conditional_0_Template_button_click_42_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
@@ -697,16 +699,16 @@ export class ApplicationDialogComponent {
697
699
  }
698
700
  static ɵfac = function ApplicationDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ApplicationDialogComponent)(); };
699
701
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ApplicationDialogComponent, selectors: [["mj-application-dialog"]], hostBindings: function ApplicationDialogComponent_HostBindings(rf, ctx) { if (rf & 1) {
700
- i0.ɵɵlistener("keydown.escape", function ApplicationDialogComponent_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, false, i0.ɵɵresolveDocument);
701
- } }, inputs: { data: "data", visible: "visible" }, outputs: { result: "result" }, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["role", "presentation", 1, "modal-backdrop"], ["role", "presentation", 1, "modal-backdrop", 3, "click"], ["role", "dialog", "aria-modal", "true", "aria-labelledby", "application-dialog-title", "aria-describedby", "application-dialog-description", 1, "modal-dialog", 3, "click"], [1, "modal-header"], [1, "modal-header-content"], ["id", "application-dialog-title", 1, "modal-title"], ["aria-hidden", "true", 1, "fa-solid"], ["id", "application-dialog-description", 1, "modal-subtitle"], [1, "modal-header-actions"], ["type", "button", 1, "modal-action-btn", 3, "click"], ["aria-label", "Close dialog", "type", "button", 1, "modal-close", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-times"], [1, "modal-body"], [3, "ngSubmit", "formGroup"], [1, "form-section"], [1, "form-section", "collapsible-section"], [1, "section-header", "clickable", 3, "click"], [1, "section-title-row"], [1, "section-title"], ["aria-hidden", "true", 1, "fa-solid", "fa-info-circle"], ["aria-hidden", "true", 1, "fa-solid", "chevron-icon"], [1, "section-description"], [1, "section-content"], ["aria-hidden", "true", 1, "fa-solid", "fa-database"], [1, "modal-footer"], ["type", "submit", 1, "mj-btn", "mj-btn-primary", 3, "click", "disabled"], ["type", "button", 1, "mj-btn", "mj-btn-secondary", 3, "click"], ["role", "alert", 1, "alert", "alert-error"], ["aria-hidden", "true", 1, "fa-solid", "fa-exclamation-triangle"], [1, "form-grid"], [1, "form-field"], ["for", "app-name", 1, "field-label", "required"], ["id", "app-name", "type", "text", "formControlName", "name", "placeholder", "My Application", "aria-describedby", "app-name-error", 1, "field-input"], ["id", "app-name-error", "role", "alert", 1, "field-error"], ["for", "app-description", 1, "field-label"], ["id", "app-description", "formControlName", "description", "placeholder", "Describe the application's purpose and functionality...", "rows", "4", 1, "field-textarea"], [1, "field-hint"], ["aria-hidden", "true", 1, "fa-solid", "fa-exclamation-circle"], [1, "assigned-entities"], [1, "no-entities"], [1, "available-entities"], [1, "all-assigned"], [1, "subsection-title"], ["role", "list", "cdkDropList", "", 1, "entities-list", 3, "cdkDropListDropped"], ["role", "listitem", "cdkDrag", "", 1, "entity-item", 3, "is-new", "has-changes"], ["role", "listitem", "cdkDrag", "", 1, "entity-item"], ["aria-hidden", "true", 1, "fa-solid", "fa-grip-vertical", "drag-handle"], [1, "entity-info"], [1, "entity-icon"], ["aria-hidden", "true", 1, "fa-solid", "fa-table"], [1, "entity-details"], [1, "entity-name"], [1, "fa-solid", "fa-info-circle", "entity-info-icon", 3, "title"], [1, "entity-config"], [1, "config-item"], [1, "config-label"], ["type", "checkbox", 1, "config-checkbox", 3, "ngModelChange", "change", "ngModel", "ngModelOptions"], [1, "checkbox-text"], [1, "sequence-badge"], [1, "entity-actions"], ["type", "button", "title", "Remove entity", 1, "btn-icon", "btn-danger", 3, "click"], [1, "empty-subtext"], [1, "available-entities-header"], [1, "entity-search"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "entity-search-icon"], ["type", "text", "placeholder", "Search entities...", "aria-label", "Search available entities", 1, "entity-search-input", 3, "input", "value"], ["type", "button", "aria-label", "Clear search", 1, "entity-search-clear"], ["role", "list", 1, "entities-grid"], [1, "no-search-results"], ["type", "button", "aria-label", "Clear search", 1, "entity-search-clear", 3, "click"], ["type", "button", "role", "listitem", 1, "entity-chip"], ["type", "button", "role", "listitem", 1, "entity-chip", 3, "click"], [1, "chip-content"], ["aria-hidden", "true", 1, "fa-solid", "fa-plus"], [1, "chip-name"], ["aria-hidden", "true", 1, "fa-solid", "fa-search"], ["aria-hidden", "true", 1, "fa-solid", "fa-check-circle"], [1, "info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], ["aria-hidden", "true", 1, "fa-solid", "fa-spinner", "fa-spin"], ["aria-hidden", "true", 1, "fa-solid", "fa-save"]], template: function ApplicationDialogComponent_Template(rf, ctx) { if (rf & 1) {
702
- i0.ɵɵtemplate(0, ApplicationDialogComponent_Conditional_0_Template, 44, 33, "div", 0);
702
+ i0.ɵɵlistener("keydown.escape", function ApplicationDialogComponent_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, i0.ɵɵresolveDocument);
703
+ } }, inputs: { data: "data", visible: "visible" }, outputs: { result: "result" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [["role", "presentation", 1, "modal-backdrop"], ["role", "presentation", 1, "modal-backdrop", 3, "click"], ["role", "dialog", "aria-modal", "true", "aria-labelledby", "application-dialog-title", "aria-describedby", "application-dialog-description", 1, "modal-dialog", 3, "click"], [1, "modal-header"], [1, "modal-header-content"], ["id", "application-dialog-title", 1, "modal-title"], ["aria-hidden", "true", 1, "fa-solid"], ["id", "application-dialog-description", 1, "modal-subtitle"], [1, "modal-header-actions"], ["type", "button", 1, "modal-action-btn", 3, "click"], ["aria-label", "Close dialog", "type", "button", 1, "modal-close", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-times"], [1, "modal-body"], [3, "ngSubmit", "formGroup"], [1, "form-section"], [1, "form-section", "collapsible-section"], [1, "section-header", "clickable", 3, "click"], [1, "section-title-row"], [1, "section-title"], ["aria-hidden", "true", 1, "fa-solid", "fa-info-circle"], ["aria-hidden", "true", 1, "fa-solid", "chevron-icon"], [1, "section-description"], [1, "section-content"], ["aria-hidden", "true", 1, "fa-solid", "fa-database"], [1, "modal-footer"], ["type", "submit", 1, "mj-btn", "mj-btn-primary", 3, "click", "disabled"], ["type", "button", 1, "mj-btn", "mj-btn-secondary", 3, "click"], ["role", "alert", 1, "alert", "alert-error"], ["aria-hidden", "true", 1, "fa-solid", "fa-exclamation-triangle"], [1, "form-grid"], [1, "form-field"], ["for", "app-name", 1, "field-label", "required"], ["id", "app-name", "type", "text", "formControlName", "name", "placeholder", "My Application", "aria-describedby", "app-name-error", 1, "field-input"], ["id", "app-name-error", "role", "alert", 1, "field-error"], ["for", "app-description", 1, "field-label"], ["id", "app-description", "formControlName", "description", "placeholder", "Describe the application's purpose and functionality...", "rows", "4", 1, "field-textarea"], [1, "field-hint"], ["aria-hidden", "true", 1, "fa-solid", "fa-exclamation-circle"], [1, "assigned-entities"], [1, "no-entities"], [1, "available-entities"], [1, "all-assigned"], [1, "subsection-title"], ["role", "list", "cdkDropList", "", 1, "entities-list", 3, "cdkDropListDropped"], ["role", "listitem", "cdkDrag", "", 1, "entity-item", 3, "is-new", "has-changes"], ["role", "listitem", "cdkDrag", "", 1, "entity-item"], ["aria-hidden", "true", 1, "fa-solid", "fa-grip-vertical", "drag-handle"], [1, "entity-info"], [1, "entity-icon"], ["aria-hidden", "true", 1, "fa-solid", "fa-table"], [1, "entity-details"], [1, "entity-name"], [1, "fa-solid", "fa-info-circle", "entity-info-icon", 3, "title"], [1, "entity-config"], [1, "config-item"], [1, "config-label"], ["type", "checkbox", 1, "config-checkbox", 3, "ngModelChange", "change", "ngModel", "ngModelOptions"], [1, "checkbox-text"], [1, "sequence-badge"], [1, "entity-actions"], ["type", "button", "title", "Remove entity", 1, "btn-icon", "btn-danger", 3, "click"], [1, "empty-subtext"], [1, "available-entities-header"], [1, "entity-search"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "entity-search-icon"], ["type", "text", "placeholder", "Search entities...", "aria-label", "Search available entities", 1, "entity-search-input", 3, "input", "value"], ["type", "button", "aria-label", "Clear search", 1, "entity-search-clear"], ["role", "list", 1, "entities-grid"], [1, "no-search-results"], ["type", "button", "aria-label", "Clear search", 1, "entity-search-clear", 3, "click"], ["type", "button", "role", "listitem", 1, "entity-chip"], ["type", "button", "role", "listitem", 1, "entity-chip", 3, "click"], [1, "chip-content"], ["aria-hidden", "true", 1, "fa-solid", "fa-plus"], [1, "chip-name"], ["aria-hidden", "true", 1, "fa-solid", "fa-search"], ["aria-hidden", "true", 1, "fa-solid", "fa-check-circle"], [1, "info-grid"], [1, "info-item"], [1, "info-label"], [1, "info-value"], ["aria-hidden", "true", 1, "fa-solid", "fa-spinner", "fa-spin"], ["aria-hidden", "true", 1, "fa-solid", "fa-save"]], template: function ApplicationDialogComponent_Template(rf, ctx) { if (rf & 1) {
704
+ i0.ɵɵconditionalCreate(0, ApplicationDialogComponent_Conditional_0_Template, 44, 33, "div", 0);
703
705
  } if (rf & 2) {
704
706
  i0.ɵɵconditional(ctx.visible ? 0 : -1);
705
707
  } }, dependencies: [i1.ɵNgNoValidate, i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.NgControlStatusGroup, i1.NgModel, i1.FormGroupDirective, i1.FormControlName, i2.CdkDropList, i2.CdkDrag, i3.DatePipe], styles: ["\n\n\n\n\n\n\n\n\n\n[_nghost-%COMP%] {\n \n\n --md-primary: #0076B6;\n --md-on-primary: #FFFFFF;\n --md-primary-container: #AAE7FD;\n --md-on-primary-container: #001F2A;\n\n \n\n --md-secondary: #F5A623;\n --md-on-secondary: #FFFFFF;\n --md-secondary-container: #FFECD6;\n --md-on-secondary-container: #2D1600;\n\n \n\n --md-tertiary: #4CAF50;\n --md-on-tertiary: #FFFFFF;\n --md-tertiary-container: #C8E6C9;\n --md-on-tertiary-container: #002204;\n\n \n\n --md-error: #D32F2F;\n --md-on-error: #FFFFFF;\n --md-error-container: #FFCDD2;\n --md-on-error-container: #410002;\n\n \n\n --md-surface: #FAFCFF;\n --md-surface-container-lowest: #FFFFFF;\n --md-surface-container-low: #F3F5F9;\n --md-surface-container: #EDF0F4;\n --md-surface-container-high: #E7EAEE;\n --md-surface-container-highest: #E1E3E8;\n --md-on-surface: #191C20;\n --md-on-surface-variant: #43474E;\n --md-outline: #74777F;\n --md-outline-variant: #C4C6D0;\n\n \n\n --md-elevation-1: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.08);\n --md-elevation-2: 0 2px 4px rgba(0, 0, 0, 0.1), 0 4px 8px rgba(0, 0, 0, 0.08);\n --md-elevation-3: 0 4px 8px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.08);\n --md-elevation-4: 0 6px 12px rgba(0, 0, 0, 0.1), 0 12px 24px rgba(0, 0, 0, 0.08);\n --md-elevation-5: 0 8px 16px rgba(0, 0, 0, 0.12), 0 16px 32px rgba(0, 0, 0, 0.1);\n\n \n\n --md-corner-extra-small: 4px;\n --md-corner-small: 8px;\n --md-corner-medium: 12px;\n --md-corner-large: 16px;\n --md-corner-extra-large: 28px;\n --md-corner-full: 9999px;\n}\n\n\n\n\n\n.modal-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s cubic-bezier(0, 0, 0.2, 1);\n padding: 1rem;\n}\n\n.modal-dialog[_ngcontent-%COMP%] {\n background: var(--md-surface);\n border-radius: var(--md-corner-extra-large);\n box-shadow: var(--md-elevation-5);\n max-width: 900px;\n width: 100%;\n max-height: 90vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_slideUp 0.3s cubic-bezier(0, 0, 0.2, 1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n\n\n.modal-dialog.fullscreen[_ngcontent-%COMP%] {\n max-width: 100vw;\n width: 100vw;\n max-height: 100vh;\n height: 100vh;\n border-radius: 0;\n margin: 0;\n}\n\n\n\n\n\n.modal-header[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 1.5rem 1.5rem 1rem 1.5rem;\n background: #0076B6;\n color: var(--md-on-primary);\n flex-shrink: 0;\n}\n\n.modal-header-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 1.375rem;\n font-weight: 600;\n color: var(--md-on-primary);\n margin: 0;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.2);\n border-radius: var(--md-corner-medium);\n font-size: 1.125rem;\n flex-shrink: 0;\n}\n\n\n\n.modal-header.create-mode[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n background: var(--md-on-primary);\n color: #0076B6;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n\n\n.modal-header.edit-mode[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n background: rgba(255, 255, 255, 0.2);\n color: var(--md-on-primary);\n}\n\n\n\n.modal-header-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-action-btn[_ngcontent-%COMP%] {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--md-on-primary);\n font-size: 1.125rem;\n cursor: pointer;\n border-radius: var(--md-corner-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.modal-action-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-action-btn[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--md-on-primary);\n outline-offset: 2px;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-subtitle[_ngcontent-%COMP%] {\n margin: 0.375rem 0 0 0;\n font-size: 0.8125rem;\n color: var(--md-on-primary);\n opacity: 0.85;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%] {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--md-on-primary);\n font-size: 1.25rem;\n cursor: pointer;\n border-radius: var(--md-corner-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--md-on-primary);\n outline-offset: 2px;\n}\n\n\n\n\n\n.modal-body[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n padding: 0;\n background: var(--md-surface);\n}\n\n\n\n\n\n.modal-footer[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1.25rem 1.5rem;\n border-top: 1px solid var(--md-outline-variant);\n background: var(--md-surface-container-low);\n flex-shrink: 0;\n}\n\n\n\n\n\n.form-section[_ngcontent-%COMP%] {\n border: none;\n margin: 0;\n padding: 1.5rem;\n border-bottom: 1px solid var(--md-outline-variant);\n}\n\n.form-section[_ngcontent-%COMP%]:last-of-type {\n border-bottom: none;\n}\n\n.section-header[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n margin-bottom: 1.25rem;\n padding: 0;\n font-weight: normal;\n}\n\n.section-header[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1.0625rem;\n font-weight: 600;\n color: var(--md-on-surface);\n}\n\n.section-header[_ngcontent-%COMP%] .section-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--md-primary);\n font-size: 0.875rem;\n}\n\n.section-header[_ngcontent-%COMP%] .section-description[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n}\n\n\n\n\n\n.collapsible-section[_ngcontent-%COMP%] .section-header.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n user-select: none;\n transition: background-color 0.2s ease;\n padding: 0.75rem 0;\n margin: -0.75rem 0 0.75rem 0;\n}\n\n.collapsible-section[_ngcontent-%COMP%] .section-header.clickable[_ngcontent-%COMP%]:hover {\n opacity: 0.8;\n}\n\n.section-title-row[_ngcontent-%COMP%] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n margin-bottom: 0.25rem;\n}\n\n.chevron-icon[_ngcontent-%COMP%] {\n color: var(--md-on-surface-variant);\n font-size: 0.875rem;\n transition: transform 0.2s ease;\n flex-shrink: 0;\n}\n\n.section-content[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_expandSection 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes _ngcontent-%COMP%_expandSection {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n\n\n\n.form-grid[_ngcontent-%COMP%] {\n display: grid;\n gap: 1.25rem;\n}\n\n.form-row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.25rem;\n}\n\n\n\n\n\n.form-field[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field[_ngcontent-%COMP%] .field-label[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--md-on-surface);\n}\n\n.form-field[_ngcontent-%COMP%] .field-label.required[_ngcontent-%COMP%]::after {\n content: ' *';\n color: var(--md-error);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-select[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%] {\n width: 100%;\n min-height: 44px;\n padding: 0.75rem 1rem;\n border: 1px solid var(--md-outline);\n border-radius: var(--md-corner-small);\n font-size: 0.9375rem;\n background: var(--md-surface);\n color: var(--md-on-surface);\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n}\n\n.form-field[_ngcontent-%COMP%] .field-input[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-select[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--md-primary);\n box-shadow: 0 0 0 3px rgba(0, 118, 182, 0.12);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input.error[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-select.error[_ngcontent-%COMP%], \n.form-field[_ngcontent-%COMP%] .field-textarea.error[_ngcontent-%COMP%] {\n border-color: var(--md-error);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input.error[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-select.error[_ngcontent-%COMP%]:focus, \n.form-field[_ngcontent-%COMP%] .field-textarea.error[_ngcontent-%COMP%]:focus {\n border-color: var(--md-error);\n box-shadow: 0 0 0 3px rgba(211, 47, 47, 0.12);\n}\n\n.form-field[_ngcontent-%COMP%] .field-input[_ngcontent-%COMP%]::placeholder, \n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%]::placeholder {\n color: var(--md-on-surface-variant);\n}\n\n.form-field[_ngcontent-%COMP%] .field-textarea[_ngcontent-%COMP%] {\n min-height: 100px;\n resize: vertical;\n line-height: 1.5;\n}\n\n.form-field[_ngcontent-%COMP%] .field-error[_ngcontent-%COMP%] {\n margin-top: 0.25rem;\n font-size: 0.8125rem;\n color: var(--md-error);\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.form-field[_ngcontent-%COMP%] .field-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 0.625rem;\n}\n\n.form-field[_ngcontent-%COMP%] .field-hint[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n line-height: 1.4;\n}\n\n\n\n\n\n.alert[_ngcontent-%COMP%] {\n padding: 1rem 1.25rem;\n border-radius: var(--md-corner-small);\n margin-bottom: 1rem;\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n}\n\n.alert[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1rem;\n flex-shrink: 0;\n margin-top: 0.125rem;\n}\n\n.alert.alert-error[_ngcontent-%COMP%] {\n background: var(--md-error-container);\n border: 1px solid rgba(211, 47, 47, 0.2);\n color: var(--md-on-error-container);\n}\n\n.alert.alert-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--md-error);\n}\n\n\n\n\n\n.subsection-title[_ngcontent-%COMP%] {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--md-on-surface);\n margin: 0 0 1rem 0;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.assigned-entities[_ngcontent-%COMP%] {\n margin-bottom: 1.5rem;\n}\n\n.assigned-entities[_ngcontent-%COMP%] .entities-list[_ngcontent-%COMP%] {\n border: 1px solid var(--md-outline-variant);\n border-radius: var(--md-corner-small);\n overflow: hidden;\n background: var(--md-surface);\n}\n\n.entity-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid var(--md-surface-container);\n transition: all 0.15s ease;\n}\n\n.entity-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n}\n\n.entity-item[_ngcontent-%COMP%]:hover {\n background: var(--md-surface-container-low);\n}\n\n.entity-item.is-new[_ngcontent-%COMP%] {\n background: rgba(76, 175, 80, 0.08);\n border-left: 3px solid var(--md-tertiary);\n}\n\n.entity-item.has-changes[_ngcontent-%COMP%] {\n background: rgba(245, 166, 35, 0.08);\n border-left: 3px solid var(--md-secondary);\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex: 1;\n min-width: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-icon[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n background: var(--md-primary-container);\n border-radius: var(--md-corner-small);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--md-primary);\n flex-shrink: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--md-on-surface);\n margin-bottom: 0.125rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] .entity-info-icon[_ngcontent-%COMP%] {\n color: var(--md-secondary);\n font-size: 0.875rem;\n cursor: help;\n opacity: 0.7;\n transition: all 0.15s ease;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] .entity-info-icon[_ngcontent-%COMP%]:hover {\n opacity: 1;\n transform: scale(1.1);\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n margin: 0 1.5rem;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .config-item[_ngcontent-%COMP%] .config-label[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n margin: 0;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .config-item[_ngcontent-%COMP%] .config-label[_ngcontent-%COMP%] .config-checkbox[_ngcontent-%COMP%] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--md-primary);\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .sequence-badge[_ngcontent-%COMP%] {\n background: var(--md-primary);\n color: var(--md-on-primary);\n padding: 0.25rem 0.5rem;\n border-radius: var(--md-corner-extra-small);\n font-size: 0.75rem;\n font-weight: 600;\n min-width: 24px;\n text-align: center;\n}\n\n.entity-item[_ngcontent-%COMP%] .entity-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 0.25rem;\n}\n\n\n\n\n\n.drag-handle[_ngcontent-%COMP%] {\n color: var(--md-on-surface-variant);\n cursor: grab;\n margin-right: 0.75rem;\n font-size: 1rem;\n transition: color 0.2s ease;\n flex-shrink: 0;\n}\n\n.drag-handle[_ngcontent-%COMP%]:hover {\n color: var(--md-primary);\n}\n\n.drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n}\n\n.entity-item.cdk-drag-preview[_ngcontent-%COMP%] {\n box-shadow: var(--md-elevation-4);\n transform: rotate(1deg);\n opacity: 0.9;\n border-color: var(--md-primary);\n background: var(--md-surface);\n}\n\n.entity-item.cdk-drag-placeholder[_ngcontent-%COMP%] {\n opacity: 0.4;\n border-style: dashed;\n border-color: var(--md-primary);\n background: var(--md-surface-container-low);\n}\n\n.entity-item.cdk-drag-animating[_ngcontent-%COMP%] {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.entities-list.cdk-drop-list-dragging[_ngcontent-%COMP%] .entity-item[_ngcontent-%COMP%]:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n\n\n\n\n.no-entities[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] {\n text-align: center;\n padding: 2rem;\n color: var(--md-on-surface-variant);\n}\n\n.no-entities[_ngcontent-%COMP%] i[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 2rem;\n color: var(--md-outline-variant);\n margin-bottom: 1rem;\n display: block;\n}\n\n.no-entities[_ngcontent-%COMP%] p[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 0.25rem 0;\n font-size: 0.9375rem;\n}\n\n.no-entities[_ngcontent-%COMP%] .empty-subtext[_ngcontent-%COMP%], \n.all-assigned[_ngcontent-%COMP%] .empty-subtext[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n margin: 0;\n}\n\n\n\n\n\n.available-entities-header[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1rem;\n}\n\n@media (min-width: 640px) {\n .available-entities-header[_ngcontent-%COMP%] {\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n }\n}\n\n.available-entities-header[_ngcontent-%COMP%] .subsection-title[_ngcontent-%COMP%] {\n margin: 0;\n}\n\n\n\n.entity-search[_ngcontent-%COMP%] {\n position: relative;\n min-width: 200px;\n max-width: 100%;\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .entity-search[_ngcontent-%COMP%] {\n min-width: 280px;\n max-width: 400px;\n width: auto;\n }\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] {\n min-width: 320px;\n max-width: 450px;\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 1rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--md-on-surface-variant);\n font-size: 1rem;\n pointer-events: none;\n transition: color 0.2s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] .entity-search-icon[_ngcontent-%COMP%] {\n left: 1.125rem;\n font-size: 1.125rem;\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 0.875rem 2.75rem 0.875rem 2.75rem;\n border: 2px solid var(--md-outline);\n border-radius: var(--md-corner-full);\n font-size: 1rem;\n background: var(--md-surface);\n color: var(--md-on-surface);\n transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;\n min-height: 48px;\n box-shadow: var(--md-elevation-1);\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%] {\n padding: 1rem 3rem 1rem 3rem;\n min-height: 52px;\n font-size: 1.0625rem;\n border-radius: var(--md-corner-full);\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--md-on-surface-variant);\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%]:hover {\n border-color: var(--md-primary);\n background: var(--md-surface-container-low);\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--md-primary);\n box-shadow: var(--md-elevation-2), 0 0 0 3px rgba(0, 118, 182, 0.2);\n background: var(--md-surface);\n}\n\n.entity-search[_ngcontent-%COMP%]:focus-within .entity-search-icon[_ngcontent-%COMP%] {\n color: var(--md-primary);\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%] {\n position: absolute;\n right: 0.75rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.375rem;\n border: none;\n background: transparent;\n color: var(--md-on-surface-variant);\n cursor: pointer;\n border-radius: var(--md-corner-full);\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n min-height: 28px;\n transition: all 0.15s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%] {\n right: 0.875rem;\n min-width: 32px;\n min-height: 32px;\n }\n}\n\n.entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%]:hover {\n background: var(--md-primary);\n color: var(--md-on-primary);\n}\n\n\n\n.no-search-results[_ngcontent-%COMP%] {\n text-align: center;\n padding: 1.5rem;\n color: var(--md-on-surface-variant);\n background: var(--md-surface-container-low);\n border-radius: var(--md-corner-small);\n}\n\n.no-search-results[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 1.5rem;\n color: var(--md-outline-variant);\n margin-bottom: 0.5rem;\n display: block;\n}\n\n.no-search-results[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.8125rem;\n}\n\n\n\n\n\n.available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 0.5rem;\n}\n\n.entity-chip[_ngcontent-%COMP%] {\n padding: 0.75rem 1rem;\n border: 1px solid var(--md-outline-variant);\n border-radius: var(--md-corner-small);\n background: var(--md-surface);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--md-primary);\n font-size: 0.875rem;\n}\n\n.entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] .chip-name[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--md-on-surface);\n}\n\n.entity-chip[_ngcontent-%COMP%]:hover {\n border-color: var(--md-primary);\n background: var(--md-primary-container);\n transform: translateY(-1px);\n box-shadow: var(--md-elevation-1);\n}\n\n\n\n\n\n.info-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 1rem;\n}\n\n.info-grid[_ngcontent-%COMP%] .info-item[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.info-grid[_ngcontent-%COMP%] .info-item[_ngcontent-%COMP%] .info-label[_ngcontent-%COMP%] {\n font-size: 0.6875rem;\n font-weight: 500;\n color: var(--md-on-surface-variant);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.info-grid[_ngcontent-%COMP%] .info-item[_ngcontent-%COMP%] .info-value[_ngcontent-%COMP%] {\n font-size: 0.9375rem;\n color: var(--md-on-surface);\n}\n\n\n\n\n\n.btn-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: none;\n border-radius: var(--md-corner-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n}\n\n.btn-icon[_ngcontent-%COMP%]:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.btn-icon.btn-neutral[_ngcontent-%COMP%] {\n background: var(--md-surface-container);\n color: var(--md-on-surface-variant);\n}\n\n.btn-icon.btn-neutral[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--md-primary);\n color: var(--md-on-primary);\n}\n\n.btn-icon.btn-danger[_ngcontent-%COMP%] {\n background: var(--md-error-container);\n color: var(--md-on-error-container);\n}\n\n.btn-icon.btn-danger[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #E57373;\n color: var(--md-on-error);\n}\n\n\n\n.btn-icon.btn-add[_ngcontent-%COMP%] {\n background: var(--md-primary);\n color: var(--md-on-primary);\n box-shadow: var(--md-elevation-1);\n}\n\n.btn-icon.btn-add[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #3395C8;\n box-shadow: var(--md-elevation-2);\n}\n\n.btn-icon.btn-add[_ngcontent-%COMP%]:active:not(:disabled) {\n background: #4BA5D4;\n transform: scale(0.95);\n}\n\n\n\n\n\n.icon-wrapper[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.icon-wrapper-sm[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border-radius: var(--md-corner-small);\n font-size: 0.875rem;\n}\n\n.icon-wrapper-md[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: var(--md-corner-small);\n font-size: 1rem;\n}\n\n.icon-wrapper-lg[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n border-radius: var(--md-corner-medium);\n font-size: 1.25rem;\n}\n\n.icon-wrapper-xl[_ngcontent-%COMP%] {\n width: 56px;\n height: 56px;\n border-radius: var(--md-corner-medium);\n font-size: 1.5rem;\n}\n\n\n\n.icon-wrapper-primary[_ngcontent-%COMP%] {\n background: var(--md-primary-container);\n color: var(--md-primary);\n}\n\n.icon-wrapper-secondary[_ngcontent-%COMP%] {\n background: var(--md-secondary-container);\n color: #B5751A;\n}\n\n.icon-wrapper-tertiary[_ngcontent-%COMP%] {\n background: var(--md-tertiary-container);\n color: var(--md-tertiary);\n}\n\n.icon-wrapper-error[_ngcontent-%COMP%] {\n background: var(--md-error-container);\n color: var(--md-error);\n}\n\n\n\n.icon-wrapper-inverted[_ngcontent-%COMP%] {\n background: var(--md-on-primary);\n color: var(--md-primary);\n}\n\n\n\n\n\n.mj-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n font-size: 0.875rem;\n font-weight: 600;\n border: none;\n border-radius: var(--md-corner-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n white-space: nowrap;\n min-height: 44px;\n}\n\n.mj-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n\n\n.mj-btn-primary[_ngcontent-%COMP%] {\n background: var(--md-primary);\n color: var(--md-on-primary);\n box-shadow: var(--md-elevation-1);\n}\n\n.mj-btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #3395C8;\n box-shadow: var(--md-elevation-2);\n}\n\n.mj-btn-primary[_ngcontent-%COMP%]:active:not(:disabled) {\n background: #4BA5D4;\n transform: scale(0.98);\n}\n\n\n\n.mj-btn-secondary[_ngcontent-%COMP%] {\n background: var(--md-surface);\n color: var(--md-primary);\n border: 1px solid var(--md-outline);\n}\n\n.mj-btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--md-primary);\n color: var(--md-on-primary);\n border-color: var(--md-primary);\n}\n\n.mj-btn-secondary[_ngcontent-%COMP%]:active:not(:disabled) {\n background: #005A8C;\n border-color: #005A8C;\n}\n\n\n\n\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes _ngcontent-%COMP%_slideUp {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n\n\n\n\n.field-input[_ngcontent-%COMP%]:focus-visible, \n.field-select[_ngcontent-%COMP%]:focus-visible, \n.field-textarea[_ngcontent-%COMP%]:focus-visible, \n.mj-btn[_ngcontent-%COMP%]:focus-visible, \n.btn-icon[_ngcontent-%COMP%]:focus-visible, \n.entity-chip[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--md-primary);\n outline-offset: 2px;\n}\n\n\n\n\n\n@media (prefers-reduced-motion: reduce) {\n *[_ngcontent-%COMP%], \n *[_ngcontent-%COMP%]::before, \n *[_ngcontent-%COMP%]::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n\n\n\n\n@media (max-width: 639px) {\n .modal-backdrop[_ngcontent-%COMP%] {\n padding: 0.5rem;\n }\n\n .modal-dialog[_ngcontent-%COMP%] {\n border-radius: var(--md-corner-extra-large);\n max-height: 95vh;\n }\n\n \n\n .modal-dialog.fullscreen[_ngcontent-%COMP%] {\n border-radius: 0;\n max-height: 100vh;\n }\n\n .modal-header[_ngcontent-%COMP%] {\n padding: 1.25rem 1rem 1rem 1rem;\n }\n\n .modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] {\n font-size: 1.125rem;\n }\n\n .modal-header[_ngcontent-%COMP%] .modal-close[_ngcontent-%COMP%] {\n border-radius: var(--md-corner-full);\n }\n\n \n\n .modal-header[_ngcontent-%COMP%] .modal-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n font-size: 1rem;\n }\n\n \n\n .icon-wrapper-lg[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n font-size: 1rem;\n }\n\n .icon-wrapper-xl[_ngcontent-%COMP%] {\n width: 48px;\n height: 48px;\n font-size: 1.25rem;\n }\n\n \n\n .btn-icon.btn-add[_ngcontent-%COMP%] {\n border-radius: var(--md-corner-full);\n }\n\n .form-section[_ngcontent-%COMP%] {\n padding: 1.25rem 1rem;\n }\n\n .form-row[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n\n .modal-footer[_ngcontent-%COMP%] {\n padding: 1rem;\n flex-direction: column;\n }\n\n .modal-footer[_ngcontent-%COMP%] .mj-btn[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n border-radius: var(--md-corner-full);\n }\n\n \n\n .entity-item[_ngcontent-%COMP%] {\n flex-direction: column;\n align-items: stretch;\n gap: 0.75rem;\n padding: 0.875rem 1rem;\n position: relative;\n }\n\n \n\n .drag-handle[_ngcontent-%COMP%] {\n position: static;\n margin-right: 0.75rem;\n margin-bottom: 0.5rem;\n font-size: 1.25rem;\n color: var(--md-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: 0.5rem;\n background: var(--md-surface-container-low);\n border-radius: var(--md-corner-small);\n cursor: grab;\n }\n\n .drag-handle[_ngcontent-%COMP%]:active {\n cursor: grabbing;\n background: var(--md-primary-container);\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] {\n gap: 0.75rem;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n font-size: 0.875rem;\n border-radius: var(--md-corner-small);\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-info[_ngcontent-%COMP%] .entity-details[_ngcontent-%COMP%] .entity-name[_ngcontent-%COMP%] {\n font-size: 0.875rem;\n word-break: break-word;\n overflow-wrap: break-word;\n line-height: 1.3;\n flex-wrap: wrap;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] {\n margin: 0;\n width: 100%;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 0.75rem;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-config[_ngcontent-%COMP%] .config-item[_ngcontent-%COMP%] .config-label[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n }\n\n .entity-item[_ngcontent-%COMP%] .entity-actions[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: flex-end;\n gap: 0.5rem;\n }\n\n \n\n .available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n }\n\n .entity-chip[_ngcontent-%COMP%] {\n padding: 0.625rem 0.875rem;\n border-radius: var(--md-corner-small);\n }\n\n .entity-chip[_ngcontent-%COMP%] .chip-content[_ngcontent-%COMP%] .chip-name[_ngcontent-%COMP%] {\n font-size: 0.75rem;\n word-break: break-word;\n }\n\n \n\n .entity-search[_ngcontent-%COMP%] {\n max-width: none;\n width: 100%;\n }\n\n .entity-search[_ngcontent-%COMP%] .entity-search-input[_ngcontent-%COMP%] {\n padding: 0.75rem 2.5rem 0.75rem 2.5rem;\n min-height: 44px;\n font-size: 0.9375rem;\n border-radius: var(--md-corner-full);\n }\n\n .entity-search[_ngcontent-%COMP%] .entity-search-icon[_ngcontent-%COMP%] {\n left: 0.875rem;\n font-size: 0.875rem;\n }\n\n .entity-search[_ngcontent-%COMP%] .entity-search-clear[_ngcontent-%COMP%] {\n right: 0.625rem;\n border-radius: var(--md-corner-full);\n }\n\n .info-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr 1fr;\n }\n\n \n\n .btn-icon[_ngcontent-%COMP%] {\n border-radius: var(--md-corner-full);\n }\n}\n\n\n\n@media (min-width: 640px) {\n .modal-dialog[_ngcontent-%COMP%] {\n max-width: 650px;\n }\n\n .available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n }\n}\n\n\n\n@media (min-width: 768px) {\n .modal-dialog[_ngcontent-%COMP%] {\n max-width: 800px;\n }\n\n .modal-header[_ngcontent-%COMP%] {\n padding: 1.5rem 2rem 1.25rem 2rem;\n }\n\n .form-section[_ngcontent-%COMP%] {\n padding: 1.75rem 2rem;\n }\n\n .modal-footer[_ngcontent-%COMP%] {\n padding: 1.25rem 2rem;\n }\n}\n\n\n\n@media (min-width: 1024px) {\n .modal-dialog[_ngcontent-%COMP%] {\n max-width: 900px;\n }\n\n .available-entities[_ngcontent-%COMP%] .entities-grid[_ngcontent-%COMP%] {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n }\n}"] });
706
708
  }
707
709
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ApplicationDialogComponent, [{
708
710
  type: Component,
709
- args: [{ selector: 'mj-application-dialog', template: "@if (visible) {\n <div class=\"modal-backdrop\" (click)=\"onCancel()\" role=\"presentation\">\n <div\n class=\"modal-dialog\"\n [class.fullscreen]=\"isFullscreen\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"application-dialog-title\"\n aria-describedby=\"application-dialog-description\"\n >\n <!-- Modal Header -->\n <div class=\"modal-header\" [class.create-mode]=\"!isEditMode\" [class.edit-mode]=\"isEditMode\">\n <div class=\"modal-header-content\">\n <h2 class=\"modal-title\" id=\"application-dialog-title\">\n <i class=\"fa-solid\" [class.fa-plus]=\"!isEditMode\" [class.fa-layer-group]=\"isEditMode\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Edit Application' : 'Create New Application' }}\n </h2>\n <p class=\"modal-subtitle\" id=\"application-dialog-description\">\n {{ isEditMode ? 'Update application information and settings' : 'Add a new application to the system' }}\n </p>\n </div>\n <div class=\"modal-header-actions\">\n <button\n class=\"modal-action-btn\"\n (click)=\"toggleFullscreen()\"\n [attr.aria-label]=\"isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'\"\n type=\"button\"\n >\n <i class=\"fa-solid\" [class.fa-compress]=\"isFullscreen\" [class.fa-expand]=\"!isFullscreen\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"modal-close\"\n (click)=\"onCancel()\"\n aria-label=\"Close dialog\"\n type=\"button\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- Modal Body -->\n <div class=\"modal-body\">\n <form [formGroup]=\"applicationForm\" (ngSubmit)=\"onSubmit()\">\n <!-- Error Alert -->\n @if (error) {\n <div class=\"form-section\">\n <div class=\"alert alert-error\" role=\"alert\">\n <i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"></i>\n <div>{{ error }}</div>\n </div>\n </div>\n }\n\n <!-- Basic Information Section -->\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('basicInfo')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n Application Information\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.basicInfo\"\n [class.fa-chevron-down]=\"!sectionExpanded.basicInfo\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Define the application's basic properties</span>\n </legend>\n\n @if (sectionExpanded.basicInfo) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"form-field\">\n <label class=\"field-label required\" for=\"app-name\">Application Name</label>\n <input\n id=\"app-name\"\n type=\"text\"\n class=\"field-input\"\n formControlName=\"name\"\n placeholder=\"My Application\"\n [class.error]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n [attr.aria-invalid]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n aria-describedby=\"app-name-error\"\n />\n @if (applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched) {\n <div class=\"field-error\" id=\"app-name-error\" role=\"alert\">\n <i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"></i>\n @if (applicationForm.get('name')?.errors?.['required']) {\n Application name is required\n }\n @if (applicationForm.get('name')?.errors?.['maxlength']) {\n Application name cannot exceed 100 characters\n }\n </div>\n }\n </div>\n\n <div class=\"form-field\">\n <label class=\"field-label\" for=\"app-description\">Description</label>\n <textarea\n id=\"app-description\"\n class=\"field-textarea\"\n formControlName=\"description\"\n placeholder=\"Describe the application's purpose and functionality...\"\n rows=\"4\"\n ></textarea>\n <div class=\"field-hint\">\n Provide a clear description of what this application does and its main features.\n </div>\n </div>\n </div>\n </div>\n }\n </fieldset>\n\n <!-- Entity Management Section -->\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('entities')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n Application Entities\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.entities\"\n [class.fa-chevron-down]=\"!sectionExpanded.entities\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Manage which entities are included in this application</span>\n </legend>\n\n @if (sectionExpanded.entities) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <!-- Assigned Entities -->\n @if (applicationEntities.length > 0) {\n <div class=\"assigned-entities\">\n <h4 class=\"subsection-title\">Assigned Entities ({{ applicationEntities.length }})</h4>\n <div class=\"entities-list\"\n role=\"list\"\n cdkDropList\n (cdkDropListDropped)=\"onEntityDrop($event)\">\n @for (config of applicationEntities; track config.entity.ID; let i = $index) {\n <div\n class=\"entity-item\"\n [class.is-new]=\"config.isNew\"\n [class.has-changes]=\"config.hasChanges\"\n role=\"listitem\"\n cdkDrag\n >\n <i class=\"fa-solid fa-grip-vertical drag-handle\" aria-hidden=\"true\"></i>\n <div class=\"entity-info\">\n <div class=\"entity-icon\">\n <i class=\"fa-solid fa-table\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"entity-details\">\n <div class=\"entity-name\">\n {{ config.entity.Name }}\n @if (config.entity.Description) {\n <i\n class=\"fa-solid fa-info-circle entity-info-icon\"\n [title]=\"config.entity.Description\"\n [attr.aria-label]=\"'Entity description: ' + config.entity.Description\"\n ></i>\n }\n </div>\n </div>\n </div>\n\n <div class=\"entity-config\">\n <div class=\"config-item\">\n <label class=\"config-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"config.defaultForNewUser\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"onDefaultForNewUserChange(config)\"\n class=\"config-checkbox\"\n />\n <span class=\"checkbox-text\">Default for new users</span>\n </label>\n </div>\n <div class=\"sequence-badge\" [attr.aria-label]=\"'Sequence ' + config.sequence\">{{ config.sequence }}</div>\n </div>\n\n <div class=\"entity-actions\">\n <button\n type=\"button\"\n class=\"btn-icon btn-danger\"\n (click)=\"removeEntity(config)\"\n title=\"Remove entity\"\n [attr.aria-label]=\"'Remove ' + config.entity.Name\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"no-entities\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n <p>No entities assigned to this application</p>\n <p class=\"empty-subtext\">Add entities from the available list below</p>\n </div>\n }\n\n <!-- Available Entities -->\n @if (availableEntities.length > 0) {\n <div class=\"available-entities\">\n <div class=\"available-entities-header\">\n <h4 class=\"subsection-title\">Available Entities ({{ filteredAvailableEntities.length }} of {{ availableEntities.length }})</h4>\n <div class=\"entity-search\">\n <i class=\"fa-solid fa-search entity-search-icon\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n class=\"entity-search-input\"\n placeholder=\"Search entities...\"\n [value]=\"entitySearchTerm\"\n (input)=\"onEntitySearchChange($event)\"\n aria-label=\"Search available entities\"\n />\n @if (entitySearchTerm) {\n <button\n type=\"button\"\n class=\"entity-search-clear\"\n (click)=\"clearEntitySearch()\"\n aria-label=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n @if (filteredAvailableEntities.length > 0) {\n <div class=\"entities-grid\" role=\"list\">\n @for (entity of filteredAvailableEntities; track entity.ID) {\n <button\n type=\"button\"\n class=\"entity-chip\"\n (click)=\"addEntity(entity)\"\n role=\"listitem\"\n [attr.aria-label]=\"'Add ' + entity.Name\"\n >\n <div class=\"chip-content\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"chip-name\">{{ entity.Name }}</span>\n </div>\n </button>\n }\n </div>\n } @else {\n <div class=\"no-search-results\">\n <i class=\"fa-solid fa-search\" aria-hidden=\"true\"></i>\n <p>No entities match \"{{ entitySearchTerm }}\"</p>\n </div>\n }\n </div>\n } @else {\n <div class=\"all-assigned\">\n <i class=\"fa-solid fa-check-circle\" aria-hidden=\"true\"></i>\n <p>All entities have been assigned to this application</p>\n </div>\n }\n </div>\n </div>\n }\n </fieldset>\n\n <!-- System Information Section (Edit Mode Only) -->\n @if (isEditMode) {\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('systemInfo')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n System Information\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.systemInfo\"\n [class.fa-chevron-down]=\"!sectionExpanded.systemInfo\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Application metadata and audit information</span>\n </legend>\n\n @if (sectionExpanded.systemInfo) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Created</span>\n <span class=\"info-value\">{{ data?.application?.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Last Updated</span>\n <span class=\"info-value\">{{ data?.application?.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Application ID</span>\n <span class=\"info-value\">{{ data?.application?.ID }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Total Entities</span>\n <span class=\"info-value\">{{ applicationEntities.length }}</span>\n </div>\n </div>\n </div>\n </div>\n }\n </fieldset>\n }\n </form>\n </div>\n\n <!-- Modal Footer - Primary and Cancel buttons on RIGHT -->\n <div class=\"modal-footer\">\n <button\n type=\"submit\"\n class=\"mj-btn mj-btn-primary\"\n [disabled]=\"applicationForm.invalid || isLoading\"\n (click)=\"onSubmit()\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Update Application' : 'Create Application' }}\n }\n </button>\n <button type=\"button\" class=\"mj-btn mj-btn-secondary\" (click)=\"onCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n", styles: ["/* =============================================================================\n Application Dialog Component - MD3 Design System\n Following Material Design 3 color palette and design tokens\n ============================================================================= */\n\n/* -----------------------------------------------------------------------------\n CSS Custom Properties (Design Tokens)\n ----------------------------------------------------------------------------- */\n:host {\n /* Primary - Deep Blue */\n --md-primary: #0076B6;\n --md-on-primary: #FFFFFF;\n --md-primary-container: #AAE7FD;\n --md-on-primary-container: #001F2A;\n\n /* Secondary - Light Orange */\n --md-secondary: #F5A623;\n --md-on-secondary: #FFFFFF;\n --md-secondary-container: #FFECD6;\n --md-on-secondary-container: #2D1600;\n\n /* Tertiary - Light Green */\n --md-tertiary: #4CAF50;\n --md-on-tertiary: #FFFFFF;\n --md-tertiary-container: #C8E6C9;\n --md-on-tertiary-container: #002204;\n\n /* Error - Red */\n --md-error: #D32F2F;\n --md-on-error: #FFFFFF;\n --md-error-container: #FFCDD2;\n --md-on-error-container: #410002;\n\n /* Surface Colors */\n --md-surface: #FAFCFF;\n --md-surface-container-lowest: #FFFFFF;\n --md-surface-container-low: #F3F5F9;\n --md-surface-container: #EDF0F4;\n --md-surface-container-high: #E7EAEE;\n --md-surface-container-highest: #E1E3E8;\n --md-on-surface: #191C20;\n --md-on-surface-variant: #43474E;\n --md-outline: #74777F;\n --md-outline-variant: #C4C6D0;\n\n /* Elevation */\n --md-elevation-1: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.08);\n --md-elevation-2: 0 2px 4px rgba(0, 0, 0, 0.1), 0 4px 8px rgba(0, 0, 0, 0.08);\n --md-elevation-3: 0 4px 8px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.08);\n --md-elevation-4: 0 6px 12px rgba(0, 0, 0, 0.1), 0 12px 24px rgba(0, 0, 0, 0.08);\n --md-elevation-5: 0 8px 16px rgba(0, 0, 0, 0.12), 0 16px 32px rgba(0, 0, 0, 0.1);\n\n /* Corner Radii */\n --md-corner-extra-small: 4px;\n --md-corner-small: 8px;\n --md-corner-medium: 12px;\n --md-corner-large: 16px;\n --md-corner-extra-large: 28px;\n --md-corner-full: 9999px;\n}\n\n/* -----------------------------------------------------------------------------\n Modal Backdrop & Container\n ----------------------------------------------------------------------------- */\n.modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: fadeIn 0.2s cubic-bezier(0, 0, 0.2, 1);\n padding: 1rem;\n}\n\n.modal-dialog {\n background: var(--md-surface);\n border-radius: var(--md-corner-extra-large);\n box-shadow: var(--md-elevation-5);\n max-width: 900px;\n width: 100%;\n max-height: 90vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: slideUp 0.3s cubic-bezier(0, 0, 0.2, 1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* Fullscreen mode */\n.modal-dialog.fullscreen {\n max-width: 100vw;\n width: 100vw;\n max-height: 100vh;\n height: 100vh;\n border-radius: 0;\n margin: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Modal Header\n ----------------------------------------------------------------------------- */\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 1.5rem 1.5rem 1rem 1.5rem;\n background: #0076B6;\n color: var(--md-on-primary);\n flex-shrink: 0;\n}\n\n.modal-header-content {\n flex: 1;\n min-width: 0;\n}\n\n.modal-header .modal-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 1.375rem;\n font-weight: 600;\n color: var(--md-on-primary);\n margin: 0;\n}\n\n.modal-header .modal-title i {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.2);\n border-radius: var(--md-corner-medium);\n font-size: 1.125rem;\n flex-shrink: 0;\n}\n\n/* Create mode - Plus icon with inverted styling */\n.modal-header.create-mode .modal-title i {\n background: var(--md-on-primary);\n color: #0076B6;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n/* Edit mode - Grid icon with semi-transparent background */\n.modal-header.edit-mode .modal-title i {\n background: rgba(255, 255, 255, 0.2);\n color: var(--md-on-primary);\n}\n\n/* Modal Header Actions */\n.modal-header-actions {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-action-btn {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--md-on-primary);\n font-size: 1.125rem;\n cursor: pointer;\n border-radius: var(--md-corner-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.modal-action-btn:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-action-btn:focus-visible {\n outline: 2px solid var(--md-on-primary);\n outline-offset: 2px;\n}\n\n.modal-header .modal-subtitle {\n margin: 0.375rem 0 0 0;\n font-size: 0.8125rem;\n color: var(--md-on-primary);\n opacity: 0.85;\n}\n\n.modal-header .modal-close {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--md-on-primary);\n font-size: 1.25rem;\n cursor: pointer;\n border-radius: var(--md-corner-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-header .modal-close:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-header .modal-close:focus-visible {\n outline: 2px solid var(--md-on-primary);\n outline-offset: 2px;\n}\n\n/* -----------------------------------------------------------------------------\n Modal Body\n ----------------------------------------------------------------------------- */\n.modal-body {\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n padding: 0;\n background: var(--md-surface);\n}\n\n/* -----------------------------------------------------------------------------\n Modal Footer - Primary and Cancel buttons on RIGHT\n ----------------------------------------------------------------------------- */\n.modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1.25rem 1.5rem;\n border-top: 1px solid var(--md-outline-variant);\n background: var(--md-surface-container-low);\n flex-shrink: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Form Sections (Fieldset)\n ----------------------------------------------------------------------------- */\n.form-section {\n border: none;\n margin: 0;\n padding: 1.5rem;\n border-bottom: 1px solid var(--md-outline-variant);\n}\n\n.form-section:last-of-type {\n border-bottom: none;\n}\n\n.section-header {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n margin-bottom: 1.25rem;\n padding: 0;\n font-weight: normal;\n}\n\n.section-header .section-title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1.0625rem;\n font-weight: 600;\n color: var(--md-on-surface);\n}\n\n.section-header .section-title i {\n color: var(--md-primary);\n font-size: 0.875rem;\n}\n\n.section-header .section-description {\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n}\n\n/* -----------------------------------------------------------------------------\n Collapsible Sections\n ----------------------------------------------------------------------------- */\n.collapsible-section .section-header.clickable {\n cursor: pointer;\n user-select: none;\n transition: background-color 0.2s ease;\n padding: 0.75rem 0;\n margin: -0.75rem 0 0.75rem 0;\n}\n\n.collapsible-section .section-header.clickable:hover {\n opacity: 0.8;\n}\n\n.section-title-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n margin-bottom: 0.25rem;\n}\n\n.chevron-icon {\n color: var(--md-on-surface-variant);\n font-size: 0.875rem;\n transition: transform 0.2s ease;\n flex-shrink: 0;\n}\n\n.section-content {\n animation: expandSection 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes expandSection {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* -----------------------------------------------------------------------------\n Form Grid Layout\n ----------------------------------------------------------------------------- */\n.form-grid {\n display: grid;\n gap: 1.25rem;\n}\n\n.form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.25rem;\n}\n\n/* -----------------------------------------------------------------------------\n Form Fields\n ----------------------------------------------------------------------------- */\n.form-field {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field .field-label {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--md-on-surface);\n}\n\n.form-field .field-label.required::after {\n content: ' *';\n color: var(--md-error);\n}\n\n.form-field .field-input,\n.form-field .field-select,\n.form-field .field-textarea {\n width: 100%;\n min-height: 44px;\n padding: 0.75rem 1rem;\n border: 1px solid var(--md-outline);\n border-radius: var(--md-corner-small);\n font-size: 0.9375rem;\n background: var(--md-surface);\n color: var(--md-on-surface);\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n}\n\n.form-field .field-input:focus,\n.form-field .field-select:focus,\n.form-field .field-textarea:focus {\n outline: none;\n border-color: var(--md-primary);\n box-shadow: 0 0 0 3px rgba(0, 118, 182, 0.12);\n}\n\n.form-field .field-input.error,\n.form-field .field-select.error,\n.form-field .field-textarea.error {\n border-color: var(--md-error);\n}\n\n.form-field .field-input.error:focus,\n.form-field .field-select.error:focus,\n.form-field .field-textarea.error:focus {\n border-color: var(--md-error);\n box-shadow: 0 0 0 3px rgba(211, 47, 47, 0.12);\n}\n\n.form-field .field-input::placeholder,\n.form-field .field-textarea::placeholder {\n color: var(--md-on-surface-variant);\n}\n\n.form-field .field-textarea {\n min-height: 100px;\n resize: vertical;\n line-height: 1.5;\n}\n\n.form-field .field-error {\n margin-top: 0.25rem;\n font-size: 0.8125rem;\n color: var(--md-error);\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.form-field .field-error i {\n font-size: 0.625rem;\n}\n\n.form-field .field-hint {\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n line-height: 1.4;\n}\n\n/* -----------------------------------------------------------------------------\n Alert Messages\n ----------------------------------------------------------------------------- */\n.alert {\n padding: 1rem 1.25rem;\n border-radius: var(--md-corner-small);\n margin-bottom: 1rem;\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n}\n\n.alert i {\n font-size: 1rem;\n flex-shrink: 0;\n margin-top: 0.125rem;\n}\n\n.alert.alert-error {\n background: var(--md-error-container);\n border: 1px solid rgba(211, 47, 47, 0.2);\n color: var(--md-on-error-container);\n}\n\n.alert.alert-error i {\n color: var(--md-error);\n}\n\n/* -----------------------------------------------------------------------------\n Entity Management Styles\n ----------------------------------------------------------------------------- */\n.subsection-title {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--md-on-surface);\n margin: 0 0 1rem 0;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.assigned-entities {\n margin-bottom: 1.5rem;\n}\n\n.assigned-entities .entities-list {\n border: 1px solid var(--md-outline-variant);\n border-radius: var(--md-corner-small);\n overflow: hidden;\n background: var(--md-surface);\n}\n\n.entity-item {\n display: flex;\n align-items: center;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid var(--md-surface-container);\n transition: all 0.15s ease;\n}\n\n.entity-item:last-child {\n border-bottom: none;\n}\n\n.entity-item:hover {\n background: var(--md-surface-container-low);\n}\n\n.entity-item.is-new {\n background: rgba(76, 175, 80, 0.08);\n border-left: 3px solid var(--md-tertiary);\n}\n\n.entity-item.has-changes {\n background: rgba(245, 166, 35, 0.08);\n border-left: 3px solid var(--md-secondary);\n}\n\n.entity-item .entity-info {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex: 1;\n min-width: 0;\n}\n\n.entity-item .entity-info .entity-icon {\n width: 40px;\n height: 40px;\n background: var(--md-primary-container);\n border-radius: var(--md-corner-small);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--md-primary);\n flex-shrink: 0;\n}\n\n.entity-item .entity-info .entity-details {\n flex: 1;\n min-width: 0;\n}\n\n.entity-item .entity-info .entity-details .entity-name {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--md-on-surface);\n margin-bottom: 0.125rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-item .entity-info .entity-details .entity-name .entity-info-icon {\n color: var(--md-secondary);\n font-size: 0.875rem;\n cursor: help;\n opacity: 0.7;\n transition: all 0.15s ease;\n}\n\n.entity-item .entity-info .entity-details .entity-name .entity-info-icon:hover {\n opacity: 1;\n transform: scale(1.1);\n}\n\n.entity-item .entity-config {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n margin: 0 1.5rem;\n}\n\n.entity-item .entity-config .config-item .config-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n margin: 0;\n}\n\n.entity-item .entity-config .config-item .config-label .config-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--md-primary);\n}\n\n.entity-item .entity-config .sequence-badge {\n background: var(--md-primary);\n color: var(--md-on-primary);\n padding: 0.25rem 0.5rem;\n border-radius: var(--md-corner-extra-small);\n font-size: 0.75rem;\n font-weight: 600;\n min-width: 24px;\n text-align: center;\n}\n\n.entity-item .entity-actions {\n display: flex;\n gap: 0.25rem;\n}\n\n/* -----------------------------------------------------------------------------\n Drag and Drop Styles\n ----------------------------------------------------------------------------- */\n.drag-handle {\n color: var(--md-on-surface-variant);\n cursor: grab;\n margin-right: 0.75rem;\n font-size: 1rem;\n transition: color 0.2s ease;\n flex-shrink: 0;\n}\n\n.drag-handle:hover {\n color: var(--md-primary);\n}\n\n.drag-handle:active {\n cursor: grabbing;\n}\n\n.entity-item.cdk-drag-preview {\n box-shadow: var(--md-elevation-4);\n transform: rotate(1deg);\n opacity: 0.9;\n border-color: var(--md-primary);\n background: var(--md-surface);\n}\n\n.entity-item.cdk-drag-placeholder {\n opacity: 0.4;\n border-style: dashed;\n border-color: var(--md-primary);\n background: var(--md-surface-container-low);\n}\n\n.entity-item.cdk-drag-animating {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.entities-list.cdk-drop-list-dragging .entity-item:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n/* -----------------------------------------------------------------------------\n Empty States\n ----------------------------------------------------------------------------- */\n.no-entities,\n.all-assigned {\n text-align: center;\n padding: 2rem;\n color: var(--md-on-surface-variant);\n}\n\n.no-entities i,\n.all-assigned i {\n font-size: 2rem;\n color: var(--md-outline-variant);\n margin-bottom: 1rem;\n display: block;\n}\n\n.no-entities p,\n.all-assigned p {\n margin: 0 0 0.25rem 0;\n font-size: 0.9375rem;\n}\n\n.no-entities .empty-subtext,\n.all-assigned .empty-subtext {\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n margin: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Available Entities Section\n ----------------------------------------------------------------------------- */\n.available-entities-header {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1rem;\n}\n\n@media (min-width: 640px) {\n .available-entities-header {\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n }\n}\n\n.available-entities-header .subsection-title {\n margin: 0;\n}\n\n/* Entity Search Bar - Enhanced prominent search */\n.entity-search {\n position: relative;\n min-width: 200px;\n max-width: 100%;\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .entity-search {\n min-width: 280px;\n max-width: 400px;\n width: auto;\n }\n}\n\n@media (min-width: 768px) {\n .entity-search {\n min-width: 320px;\n max-width: 450px;\n }\n}\n\n.entity-search .entity-search-icon {\n position: absolute;\n left: 1rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--md-on-surface-variant);\n font-size: 1rem;\n pointer-events: none;\n transition: color 0.2s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-icon {\n left: 1.125rem;\n font-size: 1.125rem;\n }\n}\n\n.entity-search .entity-search-input {\n width: 100%;\n padding: 0.875rem 2.75rem 0.875rem 2.75rem;\n border: 2px solid var(--md-outline);\n border-radius: var(--md-corner-full);\n font-size: 1rem;\n background: var(--md-surface);\n color: var(--md-on-surface);\n transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;\n min-height: 48px;\n box-shadow: var(--md-elevation-1);\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-input {\n padding: 1rem 3rem 1rem 3rem;\n min-height: 52px;\n font-size: 1.0625rem;\n border-radius: var(--md-corner-full);\n }\n}\n\n.entity-search .entity-search-input::placeholder {\n color: var(--md-on-surface-variant);\n}\n\n.entity-search .entity-search-input:hover {\n border-color: var(--md-primary);\n background: var(--md-surface-container-low);\n}\n\n.entity-search .entity-search-input:focus {\n outline: none;\n border-color: var(--md-primary);\n box-shadow: var(--md-elevation-2), 0 0 0 3px rgba(0, 118, 182, 0.2);\n background: var(--md-surface);\n}\n\n.entity-search:focus-within .entity-search-icon {\n color: var(--md-primary);\n}\n\n.entity-search .entity-search-clear {\n position: absolute;\n right: 0.75rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.375rem;\n border: none;\n background: transparent;\n color: var(--md-on-surface-variant);\n cursor: pointer;\n border-radius: var(--md-corner-full);\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n min-height: 28px;\n transition: all 0.15s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-clear {\n right: 0.875rem;\n min-width: 32px;\n min-height: 32px;\n }\n}\n\n.entity-search .entity-search-clear:hover {\n background: var(--md-primary);\n color: var(--md-on-primary);\n}\n\n/* No Search Results State */\n.no-search-results {\n text-align: center;\n padding: 1.5rem;\n color: var(--md-on-surface-variant);\n background: var(--md-surface-container-low);\n border-radius: var(--md-corner-small);\n}\n\n.no-search-results i {\n font-size: 1.5rem;\n color: var(--md-outline-variant);\n margin-bottom: 0.5rem;\n display: block;\n}\n\n.no-search-results p {\n margin: 0;\n font-size: 0.8125rem;\n}\n\n/* -----------------------------------------------------------------------------\n Available Entities Grid\n ----------------------------------------------------------------------------- */\n.available-entities .entities-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 0.5rem;\n}\n\n.entity-chip {\n padding: 0.75rem 1rem;\n border: 1px solid var(--md-outline-variant);\n border-radius: var(--md-corner-small);\n background: var(--md-surface);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.entity-chip .chip-content {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-chip .chip-content i {\n color: var(--md-primary);\n font-size: 0.875rem;\n}\n\n.entity-chip .chip-content .chip-name {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--md-on-surface);\n}\n\n.entity-chip:hover {\n border-color: var(--md-primary);\n background: var(--md-primary-container);\n transform: translateY(-1px);\n box-shadow: var(--md-elevation-1);\n}\n\n/* -----------------------------------------------------------------------------\n Info Grid for System Information\n ----------------------------------------------------------------------------- */\n.info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 1rem;\n}\n\n.info-grid .info-item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.info-grid .info-item .info-label {\n font-size: 0.6875rem;\n font-weight: 500;\n color: var(--md-on-surface-variant);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.info-grid .info-item .info-value {\n font-size: 0.9375rem;\n color: var(--md-on-surface);\n}\n\n/* -----------------------------------------------------------------------------\n Button Icon Styles\n ----------------------------------------------------------------------------- */\n.btn-icon {\n width: 36px;\n height: 36px;\n border: none;\n border-radius: var(--md-corner-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n}\n\n.btn-icon:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.btn-icon.btn-neutral {\n background: var(--md-surface-container);\n color: var(--md-on-surface-variant);\n}\n\n.btn-icon.btn-neutral:hover:not(:disabled) {\n background: var(--md-primary);\n color: var(--md-on-primary);\n}\n\n.btn-icon.btn-danger {\n background: var(--md-error-container);\n color: var(--md-on-error-container);\n}\n\n.btn-icon.btn-danger:hover:not(:disabled) {\n background: #E57373;\n color: var(--md-on-error);\n}\n\n/* Add/Create Icon Button */\n.btn-icon.btn-add {\n background: var(--md-primary);\n color: var(--md-on-primary);\n box-shadow: var(--md-elevation-1);\n}\n\n.btn-icon.btn-add:hover:not(:disabled) {\n background: #3395C8;\n box-shadow: var(--md-elevation-2);\n}\n\n.btn-icon.btn-add:active:not(:disabled) {\n background: #4BA5D4;\n transform: scale(0.95);\n}\n\n/* -----------------------------------------------------------------------------\n Icon Wrapper - Prominent display icons\n ----------------------------------------------------------------------------- */\n.icon-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.icon-wrapper-sm {\n width: 32px;\n height: 32px;\n border-radius: var(--md-corner-small);\n font-size: 0.875rem;\n}\n\n.icon-wrapper-md {\n width: 40px;\n height: 40px;\n border-radius: var(--md-corner-small);\n font-size: 1rem;\n}\n\n.icon-wrapper-lg {\n width: 48px;\n height: 48px;\n border-radius: var(--md-corner-medium);\n font-size: 1.25rem;\n}\n\n.icon-wrapper-xl {\n width: 56px;\n height: 56px;\n border-radius: var(--md-corner-medium);\n font-size: 1.5rem;\n}\n\n/* Icon wrapper color variants */\n.icon-wrapper-primary {\n background: var(--md-primary-container);\n color: var(--md-primary);\n}\n\n.icon-wrapper-secondary {\n background: var(--md-secondary-container);\n color: #B5751A;\n}\n\n.icon-wrapper-tertiary {\n background: var(--md-tertiary-container);\n color: var(--md-tertiary);\n}\n\n.icon-wrapper-error {\n background: var(--md-error-container);\n color: var(--md-error);\n}\n\n/* Inverted icon wrapper (for dark backgrounds) */\n.icon-wrapper-inverted {\n background: var(--md-on-primary);\n color: var(--md-primary);\n}\n\n/* -----------------------------------------------------------------------------\n MJ Button System\n ----------------------------------------------------------------------------- */\n.mj-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n font-size: 0.875rem;\n font-weight: 600;\n border: none;\n border-radius: var(--md-corner-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n white-space: nowrap;\n min-height: 44px;\n}\n\n.mj-btn:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n/* Primary Button - Dark, lightens on hover */\n.mj-btn-primary {\n background: var(--md-primary);\n color: var(--md-on-primary);\n box-shadow: var(--md-elevation-1);\n}\n\n.mj-btn-primary:hover:not(:disabled) {\n background: #3395C8;\n box-shadow: var(--md-elevation-2);\n}\n\n.mj-btn-primary:active:not(:disabled) {\n background: #4BA5D4;\n transform: scale(0.98);\n}\n\n/* Secondary Button - Light, darkens on hover */\n.mj-btn-secondary {\n background: var(--md-surface);\n color: var(--md-primary);\n border: 1px solid var(--md-outline);\n}\n\n.mj-btn-secondary:hover:not(:disabled) {\n background: var(--md-primary);\n color: var(--md-on-primary);\n border-color: var(--md-primary);\n}\n\n.mj-btn-secondary:active:not(:disabled) {\n background: #005A8C;\n border-color: #005A8C;\n}\n\n/* -----------------------------------------------------------------------------\n Animations\n ----------------------------------------------------------------------------- */\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes slideUp {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n/* -----------------------------------------------------------------------------\n Focus Indicators - Accessibility\n ----------------------------------------------------------------------------- */\n.field-input:focus-visible,\n.field-select:focus-visible,\n.field-textarea:focus-visible,\n.mj-btn:focus-visible,\n.btn-icon:focus-visible,\n.entity-chip:focus-visible {\n outline: 2px solid var(--md-primary);\n outline-offset: 2px;\n}\n\n/* -----------------------------------------------------------------------------\n Reduced Motion Support\n ----------------------------------------------------------------------------- */\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n/* -----------------------------------------------------------------------------\n Responsive Design - Mobile (< 640px)\n ----------------------------------------------------------------------------- */\n@media (max-width: 639px) {\n .modal-backdrop {\n padding: 0.5rem;\n }\n\n .modal-dialog {\n border-radius: var(--md-corner-extra-large);\n max-height: 95vh;\n }\n\n /* Fullscreen mode on mobile */\n .modal-dialog.fullscreen {\n border-radius: 0;\n max-height: 100vh;\n }\n\n .modal-header {\n padding: 1.25rem 1rem 1rem 1rem;\n }\n\n .modal-header .modal-title {\n font-size: 1.125rem;\n }\n\n .modal-header .modal-close {\n border-radius: var(--md-corner-full);\n }\n\n /* Modal title icon on mobile */\n .modal-header .modal-title i {\n width: 36px;\n height: 36px;\n font-size: 1rem;\n }\n\n /* Icon wrappers on mobile - slightly smaller */\n .icon-wrapper-lg {\n width: 40px;\n height: 40px;\n font-size: 1rem;\n }\n\n .icon-wrapper-xl {\n width: 48px;\n height: 48px;\n font-size: 1.25rem;\n }\n\n /* Add button on mobile */\n .btn-icon.btn-add {\n border-radius: var(--md-corner-full);\n }\n\n .form-section {\n padding: 1.25rem 1rem;\n }\n\n .form-row {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n\n .modal-footer {\n padding: 1rem;\n flex-direction: column;\n }\n\n .modal-footer .mj-btn {\n width: 100%;\n justify-content: center;\n border-radius: var(--md-corner-full);\n }\n\n /* Entity item mobile layout */\n .entity-item {\n flex-direction: column;\n align-items: stretch;\n gap: 0.75rem;\n padding: 0.875rem 1rem;\n position: relative;\n }\n\n /* Drag handle on mobile - Keep visible and touch-friendly */\n .drag-handle {\n position: static;\n margin-right: 0.75rem;\n margin-bottom: 0.5rem;\n font-size: 1.25rem;\n color: var(--md-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: 0.5rem;\n background: var(--md-surface-container-low);\n border-radius: var(--md-corner-small);\n cursor: grab;\n }\n\n .drag-handle:active {\n cursor: grabbing;\n background: var(--md-primary-container);\n }\n\n .entity-item .entity-info {\n gap: 0.75rem;\n }\n\n .entity-item .entity-info .entity-icon {\n width: 36px;\n height: 36px;\n font-size: 0.875rem;\n border-radius: var(--md-corner-small);\n }\n\n .entity-item .entity-info .entity-details .entity-name {\n font-size: 0.875rem;\n word-break: break-word;\n overflow-wrap: break-word;\n line-height: 1.3;\n flex-wrap: wrap;\n }\n\n .entity-item .entity-config {\n margin: 0;\n width: 100%;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 0.75rem;\n }\n\n .entity-item .entity-config .config-item .config-label {\n font-size: 0.8125rem;\n }\n\n .entity-item .entity-actions {\n width: 100%;\n justify-content: flex-end;\n gap: 0.5rem;\n }\n\n /* Entity chips in mobile */\n .available-entities .entities-grid {\n grid-template-columns: 1fr;\n }\n\n .entity-chip {\n padding: 0.625rem 0.875rem;\n border-radius: var(--md-corner-small);\n }\n\n .entity-chip .chip-content .chip-name {\n font-size: 0.75rem;\n word-break: break-word;\n }\n\n /* Entity search on mobile - still prominent */\n .entity-search {\n max-width: none;\n width: 100%;\n }\n\n .entity-search .entity-search-input {\n padding: 0.75rem 2.5rem 0.75rem 2.5rem;\n min-height: 44px;\n font-size: 0.9375rem;\n border-radius: var(--md-corner-full);\n }\n\n .entity-search .entity-search-icon {\n left: 0.875rem;\n font-size: 0.875rem;\n }\n\n .entity-search .entity-search-clear {\n right: 0.625rem;\n border-radius: var(--md-corner-full);\n }\n\n .info-grid {\n grid-template-columns: 1fr 1fr;\n }\n\n /* Icon buttons on mobile - keep rounded */\n .btn-icon {\n border-radius: var(--md-corner-full);\n }\n}\n\n/* Tablet Portrait (640px - 767px) */\n@media (min-width: 640px) {\n .modal-dialog {\n max-width: 650px;\n }\n\n .available-entities .entities-grid {\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n }\n}\n\n/* Tablet Landscape (768px - 1023px) */\n@media (min-width: 768px) {\n .modal-dialog {\n max-width: 800px;\n }\n\n .modal-header {\n padding: 1.5rem 2rem 1.25rem 2rem;\n }\n\n .form-section {\n padding: 1.75rem 2rem;\n }\n\n .modal-footer {\n padding: 1.25rem 2rem;\n }\n}\n\n/* Laptop (1024px+) */\n@media (min-width: 1024px) {\n .modal-dialog {\n max-width: 900px;\n }\n\n .available-entities .entities-grid {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n }\n}\n"] }]
711
+ args: [{ standalone: false, selector: 'mj-application-dialog', template: "@if (visible) {\n <div class=\"modal-backdrop\" (click)=\"onCancel()\" role=\"presentation\">\n <div\n class=\"modal-dialog\"\n [class.fullscreen]=\"isFullscreen\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"application-dialog-title\"\n aria-describedby=\"application-dialog-description\"\n >\n <!-- Modal Header -->\n <div class=\"modal-header\" [class.create-mode]=\"!isEditMode\" [class.edit-mode]=\"isEditMode\">\n <div class=\"modal-header-content\">\n <h2 class=\"modal-title\" id=\"application-dialog-title\">\n <i class=\"fa-solid\" [class.fa-plus]=\"!isEditMode\" [class.fa-layer-group]=\"isEditMode\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Edit Application' : 'Create New Application' }}\n </h2>\n <p class=\"modal-subtitle\" id=\"application-dialog-description\">\n {{ isEditMode ? 'Update application information and settings' : 'Add a new application to the system' }}\n </p>\n </div>\n <div class=\"modal-header-actions\">\n <button\n class=\"modal-action-btn\"\n (click)=\"toggleFullscreen()\"\n [attr.aria-label]=\"isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'\"\n type=\"button\"\n >\n <i class=\"fa-solid\" [class.fa-compress]=\"isFullscreen\" [class.fa-expand]=\"!isFullscreen\" aria-hidden=\"true\"></i>\n </button>\n <button\n class=\"modal-close\"\n (click)=\"onCancel()\"\n aria-label=\"Close dialog\"\n type=\"button\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- Modal Body -->\n <div class=\"modal-body\">\n <form [formGroup]=\"applicationForm\" (ngSubmit)=\"onSubmit()\">\n <!-- Error Alert -->\n @if (error) {\n <div class=\"form-section\">\n <div class=\"alert alert-error\" role=\"alert\">\n <i class=\"fa-solid fa-exclamation-triangle\" aria-hidden=\"true\"></i>\n <div>{{ error }}</div>\n </div>\n </div>\n }\n\n <!-- Basic Information Section -->\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('basicInfo')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n Application Information\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.basicInfo\"\n [class.fa-chevron-down]=\"!sectionExpanded.basicInfo\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Define the application's basic properties</span>\n </legend>\n\n @if (sectionExpanded.basicInfo) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"form-field\">\n <label class=\"field-label required\" for=\"app-name\">Application Name</label>\n <input\n id=\"app-name\"\n type=\"text\"\n class=\"field-input\"\n formControlName=\"name\"\n placeholder=\"My Application\"\n [class.error]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n [attr.aria-invalid]=\"applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched\"\n aria-describedby=\"app-name-error\"\n />\n @if (applicationForm.get('name')?.invalid && applicationForm.get('name')?.touched) {\n <div class=\"field-error\" id=\"app-name-error\" role=\"alert\">\n <i class=\"fa-solid fa-exclamation-circle\" aria-hidden=\"true\"></i>\n @if (applicationForm.get('name')?.errors?.['required']) {\n Application name is required\n }\n @if (applicationForm.get('name')?.errors?.['maxlength']) {\n Application name cannot exceed 100 characters\n }\n </div>\n }\n </div>\n\n <div class=\"form-field\">\n <label class=\"field-label\" for=\"app-description\">Description</label>\n <textarea\n id=\"app-description\"\n class=\"field-textarea\"\n formControlName=\"description\"\n placeholder=\"Describe the application's purpose and functionality...\"\n rows=\"4\"\n ></textarea>\n <div class=\"field-hint\">\n Provide a clear description of what this application does and its main features.\n </div>\n </div>\n </div>\n </div>\n }\n </fieldset>\n\n <!-- Entity Management Section -->\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('entities')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n Application Entities\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.entities\"\n [class.fa-chevron-down]=\"!sectionExpanded.entities\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Manage which entities are included in this application</span>\n </legend>\n\n @if (sectionExpanded.entities) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <!-- Assigned Entities -->\n @if (applicationEntities.length > 0) {\n <div class=\"assigned-entities\">\n <h4 class=\"subsection-title\">Assigned Entities ({{ applicationEntities.length }})</h4>\n <div class=\"entities-list\"\n role=\"list\"\n cdkDropList\n (cdkDropListDropped)=\"onEntityDrop($event)\">\n @for (config of applicationEntities; track config.entity.ID; let i = $index) {\n <div\n class=\"entity-item\"\n [class.is-new]=\"config.isNew\"\n [class.has-changes]=\"config.hasChanges\"\n role=\"listitem\"\n cdkDrag\n >\n <i class=\"fa-solid fa-grip-vertical drag-handle\" aria-hidden=\"true\"></i>\n <div class=\"entity-info\">\n <div class=\"entity-icon\">\n <i class=\"fa-solid fa-table\" aria-hidden=\"true\"></i>\n </div>\n <div class=\"entity-details\">\n <div class=\"entity-name\">\n {{ config.entity.Name }}\n @if (config.entity.Description) {\n <i\n class=\"fa-solid fa-info-circle entity-info-icon\"\n [title]=\"config.entity.Description\"\n [attr.aria-label]=\"'Entity description: ' + config.entity.Description\"\n ></i>\n }\n </div>\n </div>\n </div>\n\n <div class=\"entity-config\">\n <div class=\"config-item\">\n <label class=\"config-label\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"config.defaultForNewUser\"\n [ngModelOptions]=\"{standalone: true}\"\n (change)=\"onDefaultForNewUserChange(config)\"\n class=\"config-checkbox\"\n />\n <span class=\"checkbox-text\">Default for new users</span>\n </label>\n </div>\n <div class=\"sequence-badge\" [attr.aria-label]=\"'Sequence ' + config.sequence\">{{ config.sequence }}</div>\n </div>\n\n <div class=\"entity-actions\">\n <button\n type=\"button\"\n class=\"btn-icon btn-danger\"\n (click)=\"removeEntity(config)\"\n title=\"Remove entity\"\n [attr.aria-label]=\"'Remove ' + config.entity.Name\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"no-entities\">\n <i class=\"fa-solid fa-database\" aria-hidden=\"true\"></i>\n <p>No entities assigned to this application</p>\n <p class=\"empty-subtext\">Add entities from the available list below</p>\n </div>\n }\n\n <!-- Available Entities -->\n @if (availableEntities.length > 0) {\n <div class=\"available-entities\">\n <div class=\"available-entities-header\">\n <h4 class=\"subsection-title\">Available Entities ({{ filteredAvailableEntities.length }} of {{ availableEntities.length }})</h4>\n <div class=\"entity-search\">\n <i class=\"fa-solid fa-search entity-search-icon\" aria-hidden=\"true\"></i>\n <input\n type=\"text\"\n class=\"entity-search-input\"\n placeholder=\"Search entities...\"\n [value]=\"entitySearchTerm\"\n (input)=\"onEntitySearchChange($event)\"\n aria-label=\"Search available entities\"\n />\n @if (entitySearchTerm) {\n <button\n type=\"button\"\n class=\"entity-search-clear\"\n (click)=\"clearEntitySearch()\"\n aria-label=\"Clear search\"\n >\n <i class=\"fa-solid fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </div>\n @if (filteredAvailableEntities.length > 0) {\n <div class=\"entities-grid\" role=\"list\">\n @for (entity of filteredAvailableEntities; track entity.ID) {\n <button\n type=\"button\"\n class=\"entity-chip\"\n (click)=\"addEntity(entity)\"\n role=\"listitem\"\n [attr.aria-label]=\"'Add ' + entity.Name\"\n >\n <div class=\"chip-content\">\n <i class=\"fa-solid fa-plus\" aria-hidden=\"true\"></i>\n <span class=\"chip-name\">{{ entity.Name }}</span>\n </div>\n </button>\n }\n </div>\n } @else {\n <div class=\"no-search-results\">\n <i class=\"fa-solid fa-search\" aria-hidden=\"true\"></i>\n <p>No entities match \"{{ entitySearchTerm }}\"</p>\n </div>\n }\n </div>\n } @else {\n <div class=\"all-assigned\">\n <i class=\"fa-solid fa-check-circle\" aria-hidden=\"true\"></i>\n <p>All entities have been assigned to this application</p>\n </div>\n }\n </div>\n </div>\n }\n </fieldset>\n\n <!-- System Information Section (Edit Mode Only) -->\n @if (isEditMode) {\n <fieldset class=\"form-section collapsible-section\">\n <legend class=\"section-header clickable\" (click)=\"toggleSection('systemInfo')\">\n <div class=\"section-title-row\">\n <span class=\"section-title\">\n <i class=\"fa-solid fa-info-circle\" aria-hidden=\"true\"></i>\n System Information\n </span>\n <i class=\"fa-solid chevron-icon\"\n [class.fa-chevron-up]=\"sectionExpanded.systemInfo\"\n [class.fa-chevron-down]=\"!sectionExpanded.systemInfo\"\n aria-hidden=\"true\"></i>\n </div>\n <span class=\"section-description\">Application metadata and audit information</span>\n </legend>\n\n @if (sectionExpanded.systemInfo) {\n <div class=\"section-content\">\n <div class=\"form-grid\">\n <div class=\"info-grid\">\n <div class=\"info-item\">\n <span class=\"info-label\">Created</span>\n <span class=\"info-value\">{{ data?.application?.__mj_CreatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Last Updated</span>\n <span class=\"info-value\">{{ data?.application?.__mj_UpdatedAt | date:'medium' }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Application ID</span>\n <span class=\"info-value\">{{ data?.application?.ID }}</span>\n </div>\n <div class=\"info-item\">\n <span class=\"info-label\">Total Entities</span>\n <span class=\"info-value\">{{ applicationEntities.length }}</span>\n </div>\n </div>\n </div>\n </div>\n }\n </fieldset>\n }\n </form>\n </div>\n\n <!-- Modal Footer - Primary and Cancel buttons on RIGHT -->\n <div class=\"modal-footer\">\n <button\n type=\"submit\"\n class=\"mj-btn mj-btn-primary\"\n [disabled]=\"applicationForm.invalid || isLoading\"\n (click)=\"onSubmit()\"\n [attr.aria-busy]=\"isLoading\"\n >\n @if (isLoading) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n Saving...\n } @else {\n <i class=\"fa-solid fa-save\" aria-hidden=\"true\"></i>\n {{ isEditMode ? 'Update Application' : 'Create Application' }}\n }\n </button>\n <button type=\"button\" class=\"mj-btn mj-btn-secondary\" (click)=\"onCancel()\">\n Cancel\n </button>\n </div>\n </div>\n </div>\n}\n", styles: ["/* =============================================================================\n Application Dialog Component - MD3 Design System\n Following Material Design 3 color palette and design tokens\n ============================================================================= */\n\n/* -----------------------------------------------------------------------------\n CSS Custom Properties (Design Tokens)\n ----------------------------------------------------------------------------- */\n:host {\n /* Primary - Deep Blue */\n --md-primary: #0076B6;\n --md-on-primary: #FFFFFF;\n --md-primary-container: #AAE7FD;\n --md-on-primary-container: #001F2A;\n\n /* Secondary - Light Orange */\n --md-secondary: #F5A623;\n --md-on-secondary: #FFFFFF;\n --md-secondary-container: #FFECD6;\n --md-on-secondary-container: #2D1600;\n\n /* Tertiary - Light Green */\n --md-tertiary: #4CAF50;\n --md-on-tertiary: #FFFFFF;\n --md-tertiary-container: #C8E6C9;\n --md-on-tertiary-container: #002204;\n\n /* Error - Red */\n --md-error: #D32F2F;\n --md-on-error: #FFFFFF;\n --md-error-container: #FFCDD2;\n --md-on-error-container: #410002;\n\n /* Surface Colors */\n --md-surface: #FAFCFF;\n --md-surface-container-lowest: #FFFFFF;\n --md-surface-container-low: #F3F5F9;\n --md-surface-container: #EDF0F4;\n --md-surface-container-high: #E7EAEE;\n --md-surface-container-highest: #E1E3E8;\n --md-on-surface: #191C20;\n --md-on-surface-variant: #43474E;\n --md-outline: #74777F;\n --md-outline-variant: #C4C6D0;\n\n /* Elevation */\n --md-elevation-1: 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.08);\n --md-elevation-2: 0 2px 4px rgba(0, 0, 0, 0.1), 0 4px 8px rgba(0, 0, 0, 0.08);\n --md-elevation-3: 0 4px 8px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.08);\n --md-elevation-4: 0 6px 12px rgba(0, 0, 0, 0.1), 0 12px 24px rgba(0, 0, 0, 0.08);\n --md-elevation-5: 0 8px 16px rgba(0, 0, 0, 0.12), 0 16px 32px rgba(0, 0, 0, 0.1);\n\n /* Corner Radii */\n --md-corner-extra-small: 4px;\n --md-corner-small: 8px;\n --md-corner-medium: 12px;\n --md-corner-large: 16px;\n --md-corner-extra-large: 28px;\n --md-corner-full: 9999px;\n}\n\n/* -----------------------------------------------------------------------------\n Modal Backdrop & Container\n ----------------------------------------------------------------------------- */\n.modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(4px);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n animation: fadeIn 0.2s cubic-bezier(0, 0, 0.2, 1);\n padding: 1rem;\n}\n\n.modal-dialog {\n background: var(--md-surface);\n border-radius: var(--md-corner-extra-large);\n box-shadow: var(--md-elevation-5);\n max-width: 900px;\n width: 100%;\n max-height: 90vh;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n animation: slideUp 0.3s cubic-bezier(0, 0, 0.2, 1);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n/* Fullscreen mode */\n.modal-dialog.fullscreen {\n max-width: 100vw;\n width: 100vw;\n max-height: 100vh;\n height: 100vh;\n border-radius: 0;\n margin: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Modal Header\n ----------------------------------------------------------------------------- */\n.modal-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n padding: 1.5rem 1.5rem 1rem 1.5rem;\n background: #0076B6;\n color: var(--md-on-primary);\n flex-shrink: 0;\n}\n\n.modal-header-content {\n flex: 1;\n min-width: 0;\n}\n\n.modal-header .modal-title {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n font-size: 1.375rem;\n font-weight: 600;\n color: var(--md-on-primary);\n margin: 0;\n}\n\n.modal-header .modal-title i {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.2);\n border-radius: var(--md-corner-medium);\n font-size: 1.125rem;\n flex-shrink: 0;\n}\n\n/* Create mode - Plus icon with inverted styling */\n.modal-header.create-mode .modal-title i {\n background: var(--md-on-primary);\n color: #0076B6;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\n/* Edit mode - Grid icon with semi-transparent background */\n.modal-header.edit-mode .modal-title i {\n background: rgba(255, 255, 255, 0.2);\n color: var(--md-on-primary);\n}\n\n/* Modal Header Actions */\n.modal-header-actions {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-action-btn {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--md-on-primary);\n font-size: 1.125rem;\n cursor: pointer;\n border-radius: var(--md-corner-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.modal-action-btn:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-action-btn:focus-visible {\n outline: 2px solid var(--md-on-primary);\n outline-offset: 2px;\n}\n\n.modal-header .modal-subtitle {\n margin: 0.375rem 0 0 0;\n font-size: 0.8125rem;\n color: var(--md-on-primary);\n opacity: 0.85;\n}\n\n.modal-header .modal-close {\n padding: 0.625rem;\n border: none;\n background: transparent;\n color: var(--md-on-primary);\n font-size: 1.25rem;\n cursor: pointer;\n border-radius: var(--md-corner-full);\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-left: 0.5rem;\n}\n\n.modal-header .modal-close:hover {\n background: rgba(255, 255, 255, 0.15);\n}\n\n.modal-header .modal-close:focus-visible {\n outline: 2px solid var(--md-on-primary);\n outline-offset: 2px;\n}\n\n/* -----------------------------------------------------------------------------\n Modal Body\n ----------------------------------------------------------------------------- */\n.modal-body {\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n padding: 0;\n background: var(--md-surface);\n}\n\n/* -----------------------------------------------------------------------------\n Modal Footer - Primary and Cancel buttons on RIGHT\n ----------------------------------------------------------------------------- */\n.modal-footer {\n display: flex;\n justify-content: flex-end;\n gap: 0.75rem;\n padding: 1.25rem 1.5rem;\n border-top: 1px solid var(--md-outline-variant);\n background: var(--md-surface-container-low);\n flex-shrink: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Form Sections (Fieldset)\n ----------------------------------------------------------------------------- */\n.form-section {\n border: none;\n margin: 0;\n padding: 1.5rem;\n border-bottom: 1px solid var(--md-outline-variant);\n}\n\n.form-section:last-of-type {\n border-bottom: none;\n}\n\n.section-header {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n margin-bottom: 1.25rem;\n padding: 0;\n font-weight: normal;\n}\n\n.section-header .section-title {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 1.0625rem;\n font-weight: 600;\n color: var(--md-on-surface);\n}\n\n.section-header .section-title i {\n color: var(--md-primary);\n font-size: 0.875rem;\n}\n\n.section-header .section-description {\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n}\n\n/* -----------------------------------------------------------------------------\n Collapsible Sections\n ----------------------------------------------------------------------------- */\n.collapsible-section .section-header.clickable {\n cursor: pointer;\n user-select: none;\n transition: background-color 0.2s ease;\n padding: 0.75rem 0;\n margin: -0.75rem 0 0.75rem 0;\n}\n\n.collapsible-section .section-header.clickable:hover {\n opacity: 0.8;\n}\n\n.section-title-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n margin-bottom: 0.25rem;\n}\n\n.chevron-icon {\n color: var(--md-on-surface-variant);\n font-size: 0.875rem;\n transition: transform 0.2s ease;\n flex-shrink: 0;\n}\n\n.section-content {\n animation: expandSection 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n@keyframes expandSection {\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* -----------------------------------------------------------------------------\n Form Grid Layout\n ----------------------------------------------------------------------------- */\n.form-grid {\n display: grid;\n gap: 1.25rem;\n}\n\n.form-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1.25rem;\n}\n\n/* -----------------------------------------------------------------------------\n Form Fields\n ----------------------------------------------------------------------------- */\n.form-field {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n\n.form-field .field-label {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--md-on-surface);\n}\n\n.form-field .field-label.required::after {\n content: ' *';\n color: var(--md-error);\n}\n\n.form-field .field-input,\n.form-field .field-select,\n.form-field .field-textarea {\n width: 100%;\n min-height: 44px;\n padding: 0.75rem 1rem;\n border: 1px solid var(--md-outline);\n border-radius: var(--md-corner-small);\n font-size: 0.9375rem;\n background: var(--md-surface);\n color: var(--md-on-surface);\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n}\n\n.form-field .field-input:focus,\n.form-field .field-select:focus,\n.form-field .field-textarea:focus {\n outline: none;\n border-color: var(--md-primary);\n box-shadow: 0 0 0 3px rgba(0, 118, 182, 0.12);\n}\n\n.form-field .field-input.error,\n.form-field .field-select.error,\n.form-field .field-textarea.error {\n border-color: var(--md-error);\n}\n\n.form-field .field-input.error:focus,\n.form-field .field-select.error:focus,\n.form-field .field-textarea.error:focus {\n border-color: var(--md-error);\n box-shadow: 0 0 0 3px rgba(211, 47, 47, 0.12);\n}\n\n.form-field .field-input::placeholder,\n.form-field .field-textarea::placeholder {\n color: var(--md-on-surface-variant);\n}\n\n.form-field .field-textarea {\n min-height: 100px;\n resize: vertical;\n line-height: 1.5;\n}\n\n.form-field .field-error {\n margin-top: 0.25rem;\n font-size: 0.8125rem;\n color: var(--md-error);\n display: flex;\n align-items: center;\n gap: 0.25rem;\n}\n\n.form-field .field-error i {\n font-size: 0.625rem;\n}\n\n.form-field .field-hint {\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n line-height: 1.4;\n}\n\n/* -----------------------------------------------------------------------------\n Alert Messages\n ----------------------------------------------------------------------------- */\n.alert {\n padding: 1rem 1.25rem;\n border-radius: var(--md-corner-small);\n margin-bottom: 1rem;\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n}\n\n.alert i {\n font-size: 1rem;\n flex-shrink: 0;\n margin-top: 0.125rem;\n}\n\n.alert.alert-error {\n background: var(--md-error-container);\n border: 1px solid rgba(211, 47, 47, 0.2);\n color: var(--md-on-error-container);\n}\n\n.alert.alert-error i {\n color: var(--md-error);\n}\n\n/* -----------------------------------------------------------------------------\n Entity Management Styles\n ----------------------------------------------------------------------------- */\n.subsection-title {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--md-on-surface);\n margin: 0 0 1rem 0;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.assigned-entities {\n margin-bottom: 1.5rem;\n}\n\n.assigned-entities .entities-list {\n border: 1px solid var(--md-outline-variant);\n border-radius: var(--md-corner-small);\n overflow: hidden;\n background: var(--md-surface);\n}\n\n.entity-item {\n display: flex;\n align-items: center;\n padding: 1rem 1.25rem;\n border-bottom: 1px solid var(--md-surface-container);\n transition: all 0.15s ease;\n}\n\n.entity-item:last-child {\n border-bottom: none;\n}\n\n.entity-item:hover {\n background: var(--md-surface-container-low);\n}\n\n.entity-item.is-new {\n background: rgba(76, 175, 80, 0.08);\n border-left: 3px solid var(--md-tertiary);\n}\n\n.entity-item.has-changes {\n background: rgba(245, 166, 35, 0.08);\n border-left: 3px solid var(--md-secondary);\n}\n\n.entity-item .entity-info {\n display: flex;\n align-items: center;\n gap: 1rem;\n flex: 1;\n min-width: 0;\n}\n\n.entity-item .entity-info .entity-icon {\n width: 40px;\n height: 40px;\n background: var(--md-primary-container);\n border-radius: var(--md-corner-small);\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--md-primary);\n flex-shrink: 0;\n}\n\n.entity-item .entity-info .entity-details {\n flex: 1;\n min-width: 0;\n}\n\n.entity-item .entity-info .entity-details .entity-name {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--md-on-surface);\n margin-bottom: 0.125rem;\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-item .entity-info .entity-details .entity-name .entity-info-icon {\n color: var(--md-secondary);\n font-size: 0.875rem;\n cursor: help;\n opacity: 0.7;\n transition: all 0.15s ease;\n}\n\n.entity-item .entity-info .entity-details .entity-name .entity-info-icon:hover {\n opacity: 1;\n transform: scale(1.1);\n}\n\n.entity-item .entity-config {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n margin: 0 1.5rem;\n}\n\n.entity-item .entity-config .config-item .config-label {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n margin: 0;\n}\n\n.entity-item .entity-config .config-item .config-label .config-checkbox {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: var(--md-primary);\n}\n\n.entity-item .entity-config .sequence-badge {\n background: var(--md-primary);\n color: var(--md-on-primary);\n padding: 0.25rem 0.5rem;\n border-radius: var(--md-corner-extra-small);\n font-size: 0.75rem;\n font-weight: 600;\n min-width: 24px;\n text-align: center;\n}\n\n.entity-item .entity-actions {\n display: flex;\n gap: 0.25rem;\n}\n\n/* -----------------------------------------------------------------------------\n Drag and Drop Styles\n ----------------------------------------------------------------------------- */\n.drag-handle {\n color: var(--md-on-surface-variant);\n cursor: grab;\n margin-right: 0.75rem;\n font-size: 1rem;\n transition: color 0.2s ease;\n flex-shrink: 0;\n}\n\n.drag-handle:hover {\n color: var(--md-primary);\n}\n\n.drag-handle:active {\n cursor: grabbing;\n}\n\n.entity-item.cdk-drag-preview {\n box-shadow: var(--md-elevation-4);\n transform: rotate(1deg);\n opacity: 0.9;\n border-color: var(--md-primary);\n background: var(--md-surface);\n}\n\n.entity-item.cdk-drag-placeholder {\n opacity: 0.4;\n border-style: dashed;\n border-color: var(--md-primary);\n background: var(--md-surface-container-low);\n}\n\n.entity-item.cdk-drag-animating {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n.entities-list.cdk-drop-list-dragging .entity-item:not(.cdk-drag-placeholder) {\n transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);\n}\n\n/* -----------------------------------------------------------------------------\n Empty States\n ----------------------------------------------------------------------------- */\n.no-entities,\n.all-assigned {\n text-align: center;\n padding: 2rem;\n color: var(--md-on-surface-variant);\n}\n\n.no-entities i,\n.all-assigned i {\n font-size: 2rem;\n color: var(--md-outline-variant);\n margin-bottom: 1rem;\n display: block;\n}\n\n.no-entities p,\n.all-assigned p {\n margin: 0 0 0.25rem 0;\n font-size: 0.9375rem;\n}\n\n.no-entities .empty-subtext,\n.all-assigned .empty-subtext {\n font-size: 0.8125rem;\n color: var(--md-on-surface-variant);\n margin: 0;\n}\n\n/* -----------------------------------------------------------------------------\n Available Entities Section\n ----------------------------------------------------------------------------- */\n.available-entities-header {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n margin-bottom: 1rem;\n}\n\n@media (min-width: 640px) {\n .available-entities-header {\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n }\n}\n\n.available-entities-header .subsection-title {\n margin: 0;\n}\n\n/* Entity Search Bar - Enhanced prominent search */\n.entity-search {\n position: relative;\n min-width: 200px;\n max-width: 100%;\n width: 100%;\n}\n\n@media (min-width: 640px) {\n .entity-search {\n min-width: 280px;\n max-width: 400px;\n width: auto;\n }\n}\n\n@media (min-width: 768px) {\n .entity-search {\n min-width: 320px;\n max-width: 450px;\n }\n}\n\n.entity-search .entity-search-icon {\n position: absolute;\n left: 1rem;\n top: 50%;\n transform: translateY(-50%);\n color: var(--md-on-surface-variant);\n font-size: 1rem;\n pointer-events: none;\n transition: color 0.2s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-icon {\n left: 1.125rem;\n font-size: 1.125rem;\n }\n}\n\n.entity-search .entity-search-input {\n width: 100%;\n padding: 0.875rem 2.75rem 0.875rem 2.75rem;\n border: 2px solid var(--md-outline);\n border-radius: var(--md-corner-full);\n font-size: 1rem;\n background: var(--md-surface);\n color: var(--md-on-surface);\n transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease;\n min-height: 48px;\n box-shadow: var(--md-elevation-1);\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-input {\n padding: 1rem 3rem 1rem 3rem;\n min-height: 52px;\n font-size: 1.0625rem;\n border-radius: var(--md-corner-full);\n }\n}\n\n.entity-search .entity-search-input::placeholder {\n color: var(--md-on-surface-variant);\n}\n\n.entity-search .entity-search-input:hover {\n border-color: var(--md-primary);\n background: var(--md-surface-container-low);\n}\n\n.entity-search .entity-search-input:focus {\n outline: none;\n border-color: var(--md-primary);\n box-shadow: var(--md-elevation-2), 0 0 0 3px rgba(0, 118, 182, 0.2);\n background: var(--md-surface);\n}\n\n.entity-search:focus-within .entity-search-icon {\n color: var(--md-primary);\n}\n\n.entity-search .entity-search-clear {\n position: absolute;\n right: 0.75rem;\n top: 50%;\n transform: translateY(-50%);\n padding: 0.375rem;\n border: none;\n background: transparent;\n color: var(--md-on-surface-variant);\n cursor: pointer;\n border-radius: var(--md-corner-full);\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n min-height: 28px;\n transition: all 0.15s ease;\n}\n\n@media (min-width: 768px) {\n .entity-search .entity-search-clear {\n right: 0.875rem;\n min-width: 32px;\n min-height: 32px;\n }\n}\n\n.entity-search .entity-search-clear:hover {\n background: var(--md-primary);\n color: var(--md-on-primary);\n}\n\n/* No Search Results State */\n.no-search-results {\n text-align: center;\n padding: 1.5rem;\n color: var(--md-on-surface-variant);\n background: var(--md-surface-container-low);\n border-radius: var(--md-corner-small);\n}\n\n.no-search-results i {\n font-size: 1.5rem;\n color: var(--md-outline-variant);\n margin-bottom: 0.5rem;\n display: block;\n}\n\n.no-search-results p {\n margin: 0;\n font-size: 0.8125rem;\n}\n\n/* -----------------------------------------------------------------------------\n Available Entities Grid\n ----------------------------------------------------------------------------- */\n.available-entities .entities-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 0.5rem;\n}\n\n.entity-chip {\n padding: 0.75rem 1rem;\n border: 1px solid var(--md-outline-variant);\n border-radius: var(--md-corner-small);\n background: var(--md-surface);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.entity-chip .chip-content {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n\n.entity-chip .chip-content i {\n color: var(--md-primary);\n font-size: 0.875rem;\n}\n\n.entity-chip .chip-content .chip-name {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--md-on-surface);\n}\n\n.entity-chip:hover {\n border-color: var(--md-primary);\n background: var(--md-primary-container);\n transform: translateY(-1px);\n box-shadow: var(--md-elevation-1);\n}\n\n/* -----------------------------------------------------------------------------\n Info Grid for System Information\n ----------------------------------------------------------------------------- */\n.info-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 1rem;\n}\n\n.info-grid .info-item {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n}\n\n.info-grid .info-item .info-label {\n font-size: 0.6875rem;\n font-weight: 500;\n color: var(--md-on-surface-variant);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.info-grid .info-item .info-value {\n font-size: 0.9375rem;\n color: var(--md-on-surface);\n}\n\n/* -----------------------------------------------------------------------------\n Button Icon Styles\n ----------------------------------------------------------------------------- */\n.btn-icon {\n width: 36px;\n height: 36px;\n border: none;\n border-radius: var(--md-corner-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.875rem;\n}\n\n.btn-icon:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n.btn-icon.btn-neutral {\n background: var(--md-surface-container);\n color: var(--md-on-surface-variant);\n}\n\n.btn-icon.btn-neutral:hover:not(:disabled) {\n background: var(--md-primary);\n color: var(--md-on-primary);\n}\n\n.btn-icon.btn-danger {\n background: var(--md-error-container);\n color: var(--md-on-error-container);\n}\n\n.btn-icon.btn-danger:hover:not(:disabled) {\n background: #E57373;\n color: var(--md-on-error);\n}\n\n/* Add/Create Icon Button */\n.btn-icon.btn-add {\n background: var(--md-primary);\n color: var(--md-on-primary);\n box-shadow: var(--md-elevation-1);\n}\n\n.btn-icon.btn-add:hover:not(:disabled) {\n background: #3395C8;\n box-shadow: var(--md-elevation-2);\n}\n\n.btn-icon.btn-add:active:not(:disabled) {\n background: #4BA5D4;\n transform: scale(0.95);\n}\n\n/* -----------------------------------------------------------------------------\n Icon Wrapper - Prominent display icons\n ----------------------------------------------------------------------------- */\n.icon-wrapper {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n}\n\n.icon-wrapper-sm {\n width: 32px;\n height: 32px;\n border-radius: var(--md-corner-small);\n font-size: 0.875rem;\n}\n\n.icon-wrapper-md {\n width: 40px;\n height: 40px;\n border-radius: var(--md-corner-small);\n font-size: 1rem;\n}\n\n.icon-wrapper-lg {\n width: 48px;\n height: 48px;\n border-radius: var(--md-corner-medium);\n font-size: 1.25rem;\n}\n\n.icon-wrapper-xl {\n width: 56px;\n height: 56px;\n border-radius: var(--md-corner-medium);\n font-size: 1.5rem;\n}\n\n/* Icon wrapper color variants */\n.icon-wrapper-primary {\n background: var(--md-primary-container);\n color: var(--md-primary);\n}\n\n.icon-wrapper-secondary {\n background: var(--md-secondary-container);\n color: #B5751A;\n}\n\n.icon-wrapper-tertiary {\n background: var(--md-tertiary-container);\n color: var(--md-tertiary);\n}\n\n.icon-wrapper-error {\n background: var(--md-error-container);\n color: var(--md-error);\n}\n\n/* Inverted icon wrapper (for dark backgrounds) */\n.icon-wrapper-inverted {\n background: var(--md-on-primary);\n color: var(--md-primary);\n}\n\n/* -----------------------------------------------------------------------------\n MJ Button System\n ----------------------------------------------------------------------------- */\n.mj-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.75rem 1.5rem;\n font-size: 0.875rem;\n font-weight: 600;\n border: none;\n border-radius: var(--md-corner-full);\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n white-space: nowrap;\n min-height: 44px;\n}\n\n.mj-btn:disabled {\n opacity: 0.38;\n cursor: not-allowed;\n}\n\n/* Primary Button - Dark, lightens on hover */\n.mj-btn-primary {\n background: var(--md-primary);\n color: var(--md-on-primary);\n box-shadow: var(--md-elevation-1);\n}\n\n.mj-btn-primary:hover:not(:disabled) {\n background: #3395C8;\n box-shadow: var(--md-elevation-2);\n}\n\n.mj-btn-primary:active:not(:disabled) {\n background: #4BA5D4;\n transform: scale(0.98);\n}\n\n/* Secondary Button - Light, darkens on hover */\n.mj-btn-secondary {\n background: var(--md-surface);\n color: var(--md-primary);\n border: 1px solid var(--md-outline);\n}\n\n.mj-btn-secondary:hover:not(:disabled) {\n background: var(--md-primary);\n color: var(--md-on-primary);\n border-color: var(--md-primary);\n}\n\n.mj-btn-secondary:active:not(:disabled) {\n background: #005A8C;\n border-color: #005A8C;\n}\n\n/* -----------------------------------------------------------------------------\n Animations\n ----------------------------------------------------------------------------- */\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes slideUp {\n from {\n transform: translateY(20px);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n/* -----------------------------------------------------------------------------\n Focus Indicators - Accessibility\n ----------------------------------------------------------------------------- */\n.field-input:focus-visible,\n.field-select:focus-visible,\n.field-textarea:focus-visible,\n.mj-btn:focus-visible,\n.btn-icon:focus-visible,\n.entity-chip:focus-visible {\n outline: 2px solid var(--md-primary);\n outline-offset: 2px;\n}\n\n/* -----------------------------------------------------------------------------\n Reduced Motion Support\n ----------------------------------------------------------------------------- */\n@media (prefers-reduced-motion: reduce) {\n *,\n *::before,\n *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n }\n}\n\n/* -----------------------------------------------------------------------------\n Responsive Design - Mobile (< 640px)\n ----------------------------------------------------------------------------- */\n@media (max-width: 639px) {\n .modal-backdrop {\n padding: 0.5rem;\n }\n\n .modal-dialog {\n border-radius: var(--md-corner-extra-large);\n max-height: 95vh;\n }\n\n /* Fullscreen mode on mobile */\n .modal-dialog.fullscreen {\n border-radius: 0;\n max-height: 100vh;\n }\n\n .modal-header {\n padding: 1.25rem 1rem 1rem 1rem;\n }\n\n .modal-header .modal-title {\n font-size: 1.125rem;\n }\n\n .modal-header .modal-close {\n border-radius: var(--md-corner-full);\n }\n\n /* Modal title icon on mobile */\n .modal-header .modal-title i {\n width: 36px;\n height: 36px;\n font-size: 1rem;\n }\n\n /* Icon wrappers on mobile - slightly smaller */\n .icon-wrapper-lg {\n width: 40px;\n height: 40px;\n font-size: 1rem;\n }\n\n .icon-wrapper-xl {\n width: 48px;\n height: 48px;\n font-size: 1.25rem;\n }\n\n /* Add button on mobile */\n .btn-icon.btn-add {\n border-radius: var(--md-corner-full);\n }\n\n .form-section {\n padding: 1.25rem 1rem;\n }\n\n .form-row {\n grid-template-columns: 1fr;\n gap: 1rem;\n }\n\n .modal-footer {\n padding: 1rem;\n flex-direction: column;\n }\n\n .modal-footer .mj-btn {\n width: 100%;\n justify-content: center;\n border-radius: var(--md-corner-full);\n }\n\n /* Entity item mobile layout */\n .entity-item {\n flex-direction: column;\n align-items: stretch;\n gap: 0.75rem;\n padding: 0.875rem 1rem;\n position: relative;\n }\n\n /* Drag handle on mobile - Keep visible and touch-friendly */\n .drag-handle {\n position: static;\n margin-right: 0.75rem;\n margin-bottom: 0.5rem;\n font-size: 1.25rem;\n color: var(--md-primary);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: 0.5rem;\n background: var(--md-surface-container-low);\n border-radius: var(--md-corner-small);\n cursor: grab;\n }\n\n .drag-handle:active {\n cursor: grabbing;\n background: var(--md-primary-container);\n }\n\n .entity-item .entity-info {\n gap: 0.75rem;\n }\n\n .entity-item .entity-info .entity-icon {\n width: 36px;\n height: 36px;\n font-size: 0.875rem;\n border-radius: var(--md-corner-small);\n }\n\n .entity-item .entity-info .entity-details .entity-name {\n font-size: 0.875rem;\n word-break: break-word;\n overflow-wrap: break-word;\n line-height: 1.3;\n flex-wrap: wrap;\n }\n\n .entity-item .entity-config {\n margin: 0;\n width: 100%;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 0.75rem;\n }\n\n .entity-item .entity-config .config-item .config-label {\n font-size: 0.8125rem;\n }\n\n .entity-item .entity-actions {\n width: 100%;\n justify-content: flex-end;\n gap: 0.5rem;\n }\n\n /* Entity chips in mobile */\n .available-entities .entities-grid {\n grid-template-columns: 1fr;\n }\n\n .entity-chip {\n padding: 0.625rem 0.875rem;\n border-radius: var(--md-corner-small);\n }\n\n .entity-chip .chip-content .chip-name {\n font-size: 0.75rem;\n word-break: break-word;\n }\n\n /* Entity search on mobile - still prominent */\n .entity-search {\n max-width: none;\n width: 100%;\n }\n\n .entity-search .entity-search-input {\n padding: 0.75rem 2.5rem 0.75rem 2.5rem;\n min-height: 44px;\n font-size: 0.9375rem;\n border-radius: var(--md-corner-full);\n }\n\n .entity-search .entity-search-icon {\n left: 0.875rem;\n font-size: 0.875rem;\n }\n\n .entity-search .entity-search-clear {\n right: 0.625rem;\n border-radius: var(--md-corner-full);\n }\n\n .info-grid {\n grid-template-columns: 1fr 1fr;\n }\n\n /* Icon buttons on mobile - keep rounded */\n .btn-icon {\n border-radius: var(--md-corner-full);\n }\n}\n\n/* Tablet Portrait (640px - 767px) */\n@media (min-width: 640px) {\n .modal-dialog {\n max-width: 650px;\n }\n\n .available-entities .entities-grid {\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n }\n}\n\n/* Tablet Landscape (768px - 1023px) */\n@media (min-width: 768px) {\n .modal-dialog {\n max-width: 800px;\n }\n\n .modal-header {\n padding: 1.5rem 2rem 1.25rem 2rem;\n }\n\n .form-section {\n padding: 1.75rem 2rem;\n }\n\n .modal-footer {\n padding: 1.25rem 2rem;\n }\n}\n\n/* Laptop (1024px+) */\n@media (min-width: 1024px) {\n .modal-dialog {\n max-width: 900px;\n }\n\n .available-entities .entities-grid {\n grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n }\n}\n"] }]
710
712
  }], () => [], { data: [{
711
713
  type: Input
712
714
  }], visible: [{
@@ -717,5 +719,5 @@ export class ApplicationDialogComponent {
717
719
  type: HostListener,
718
720
  args: ['document:keydown.escape']
719
721
  }] }); })();
720
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ApplicationDialogComponent, { className: "ApplicationDialogComponent", filePath: "src/lib/application-management/application-dialog/application-dialog.component.ts", lineNumber: 32 }); })();
722
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ApplicationDialogComponent, { className: "ApplicationDialogComponent", filePath: "src/lib/application-management/application-dialog/application-dialog.component.ts", lineNumber: 33 }); })();
721
723
  //# sourceMappingURL=application-dialog.component.js.map