@memberjunction/ng-explorer-core 5.43.0 → 5.44.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 (57) hide show
  1. package/dist/generated/lazy-feature-config.d.ts +1 -1
  2. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  3. package/dist/generated/lazy-feature-config.js +11 -3
  4. package/dist/generated/lazy-feature-config.js.map +1 -1
  5. package/dist/lib/about/about-dialog.component.d.ts +0 -1
  6. package/dist/lib/about/about-dialog.component.d.ts.map +1 -1
  7. package/dist/lib/about/about-dialog.component.js +217 -218
  8. package/dist/lib/about/about-dialog.component.js.map +1 -1
  9. package/dist/lib/command-palette/command-palette.component.js +8 -14
  10. package/dist/lib/command-palette/command-palette.component.js.map +1 -1
  11. package/dist/lib/conversation-feedback/conversation-feedback.js +66 -73
  12. package/dist/lib/conversation-feedback/conversation-feedback.js.map +1 -1
  13. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +35 -45
  14. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
  15. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +2 -1
  16. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  17. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +14 -8
  18. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  19. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
  20. package/dist/lib/resource-wrappers/dashboard-resource.component.js +9 -8
  21. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  22. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
  23. package/dist/lib/resource-wrappers/search-results-resource.component.js +35 -43
  24. package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
  25. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +10 -2
  26. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  27. package/dist/lib/shell/components/tabs/component-cache-manager.js +19 -1
  28. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  29. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +1 -0
  30. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  31. package/dist/lib/shell/components/tabs/tab-container.component.js +3 -2
  32. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  33. package/dist/lib/shell/shell.module.d.ts +1 -1
  34. package/dist/lib/shell/shell.module.d.ts.map +1 -1
  35. package/dist/lib/shell/shell.module.js +4 -1
  36. package/dist/lib/shell/shell.module.js.map +1 -1
  37. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +5 -7
  38. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
  39. package/dist/lib/single-dashboard/single-dashboard.component.js +17 -27
  40. package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
  41. package/dist/lib/single-list-detail/single-list-detail.component.d.ts +6 -2
  42. package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
  43. package/dist/lib/single-list-detail/single-list-detail.component.js +48 -57
  44. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  45. package/dist/lib/single-search-result/single-search-result.component.js +17 -22
  46. package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
  47. package/dist/lib/user-notifications/user-notifications.component.js +60 -75
  48. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  49. package/dist/module.d.ts +1 -1
  50. package/dist/module.d.ts.map +1 -1
  51. package/dist/module.js +12 -5
  52. package/dist/module.js.map +1 -1
  53. package/package.json +47 -47
  54. package/dist/lib/__tests__/explorer-core.test.d.ts +0 -2
  55. package/dist/lib/__tests__/explorer-core.test.d.ts.map +0 -1
  56. package/dist/lib/__tests__/explorer-core.test.js +0 -229
  57. package/dist/lib/__tests__/explorer-core.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"about-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/about/about-dialog.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ChangeDetectorRef,\n inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UserRoleInfo } from '@memberjunction/core';\nimport { InstanceConfigEngine } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, PACKAGE_VERSION } from '@memberjunction/graphql-dataprovider';\nimport { MJAuthBase } from '@memberjunction/ng-auth-services';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { ThemeService } from '@memberjunction/ng-shared';\nimport { Subscription } from 'rxjs';\nimport { ServerConnectivityService } from '../services/server-connectivity.service';\n\n/**\n * About dialog for MemberJunction. Shows brand identity, version, lightweight\n * usage stats, the current user, and a collapsible diagnostics panel.\n *\n * Self-contained standalone component. Opened via {@link AboutDialogService}.\n *\n * Easter eggs:\n * - Click the version pill 7× → toast + logo spin\n * - Click the logo → quick wiggle\n * - Konami code (↑↑↓↓←→←→ B A) → barrel roll\n */\n@Component({\n selector: 'mj-about-dialog',\n standalone: true,\n imports: [CommonModule],\n template: `\n<div class=\"mj-about\" role=\"document\">\n <button class=\"mj-about__close\" type=\"button\" aria-label=\"Close\" (click)=\"OnCloseClick()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n\n <div class=\"mj-about__hero\">\n <div class=\"mj-about__logo-wrap\" (click)=\"OnLogoClick()\">\n <svg class=\"mj-about__logo\" #aboutLogo\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448.28 57.11\"\n aria-label=\"MemberJunction\">\n <path fill=\"#fff\"\n d=\"M428.73,44.89v-16.92c.7-1.34,1.66-2.37,2.88-3.09,1.22-.72,2.59-1.08,4.12-1.08,2.2,0,3.92.65,5.17,1.94,1.25,1.3,1.87,3.07,1.87,5.33v13.81h2.01v-14.36c0-1.71-.36-3.21-1.08-4.51-.72-1.3-1.72-2.3-3.02-3.02-1.3-.72-2.8-1.08-4.51-1.08-3.14,0-5.63,1.21-7.46,3.61v-3.16h-2.01v22.51h2.01ZM407.08,42.12c-1.39-.87-2.49-2.04-3.29-3.52-.81-1.48-1.21-3.13-1.21-4.96s.4-3.48,1.21-4.96c.81-1.48,1.91-2.65,3.29-3.52,1.39-.87,2.94-1.31,4.64-1.31s3.25.44,4.64,1.31c1.39.87,2.49,2.04,3.29,3.52.81,1.48,1.21,3.13,1.21,4.96s-.41,3.48-1.21,4.96c-.81,1.48-1.91,2.65-3.29,3.52-1.39.87-2.94,1.3-4.64,1.3s-3.26-.43-4.64-1.3M417.42,43.79c1.69-1.04,3.04-2.45,4.03-4.23.99-1.78,1.49-3.76,1.49-5.92s-.5-4.18-1.49-5.95c-.99-1.77-2.33-3.17-4.03-4.21-1.69-1.04-3.59-1.56-5.69-1.56s-3.97.52-5.67,1.56c-1.71,1.04-3.06,2.44-4.05,4.21-.99,1.77-1.49,3.75-1.49,5.95s.5,4.14,1.49,5.92c.99,1.79,2.34,3.19,4.05,4.23,1.71,1.04,3.6,1.56,5.67,1.56s4-.52,5.69-1.56M397.14,16.8c.32-.34.48-.75.48-1.24s-.16-.9-.48-1.24c-.32-.34-.74-.5-1.26-.5-.49,0-.9.17-1.24.5-.34.34-.5.75-.5,1.24s.17.9.5,1.24c.34.34.75.5,1.24.5.52,0,.94-.17,1.26-.5M396.89,22.38h-2.01v22.51h2.01v-22.51ZM390.57,45.21c.61-.09,1.2-.25,1.78-.46v-1.97c-.52.21-1.02.37-1.51.48-.49.11-1.08.16-1.79.16-1.31,0-2.25-.28-2.81-.84s-.85-1.49-.85-2.77v-15.6h6.95v-1.83h-6.95v-6.31l-2.01.64v5.67h-4.94v1.83h4.94v16.29c0,1.52.46,2.71,1.37,3.57.91.85,2.23,1.28,3.94,1.28.64,0,1.26-.05,1.87-.14M373.12,44.43c1.54-.61,2.89-1.45,4.05-2.51l-1.37-1.65c-.98.95-2.1,1.71-3.36,2.29s-2.57.87-3.91.87c-1.71,0-3.25-.43-4.64-1.3-1.39-.87-2.49-2.04-3.29-3.52-.81-1.48-1.21-3.13-1.21-4.96s.4-3.48,1.21-4.96c.81-1.48,1.9-2.65,3.29-3.52,1.39-.87,2.93-1.31,4.64-1.31,1.34,0,2.64.28,3.91.85,1.27.56,2.39,1.33,3.36,2.31l1.37-1.65c-1.16-1.07-2.51-1.91-4.05-2.52-1.54-.61-3.07-.91-4.6-.91-2.07,0-3.96.52-5.67,1.56s-3.06,2.44-4.05,4.21c-.99,1.77-1.49,3.75-1.49,5.95s.49,4.18,1.49,5.95c.99,1.77,2.34,3.17,4.05,4.21s3.6,1.56,5.67,1.56c1.52,0,3.06-.31,4.6-.92M337.65,44.89v-16.92c.7-1.34,1.66-2.37,2.88-3.09,1.22-.72,2.59-1.08,4.12-1.08,2.2,0,3.92.65,5.17,1.94,1.25,1.3,1.88,3.07,1.88,5.33v13.81h2.01v-14.36c0-1.71-.36-3.21-1.07-4.51-.72-1.3-1.73-2.3-3.02-3.02s-2.8-1.08-4.5-1.08c-3.14,0-5.63,1.21-7.46,3.61v-3.16h-2.01v22.51h2.01ZM328.7,41.78v3.11h2.01v-22.51h-2.01v16.92c-.7,1.31-1.66,2.33-2.88,3.06-1.22.73-2.59,1.1-4.12,1.1-2.2,0-3.92-.65-5.17-1.97-1.25-1.31-1.87-3.08-1.87-5.31v-13.81h-2.01v14.36c0,1.71.37,3.21,1.1,4.51.73,1.3,1.74,2.3,3.04,3.02,1.3.72,2.78,1.08,4.46,1.08,3.2,0,5.69-1.19,7.46-3.57M303.64,43.88c1.74-1.01,3.08-2.43,4.02-4.28.95-1.84,1.42-4.05,1.42-6.61V12.87h-2.1v20.13c0,3.2-.85,5.74-2.56,7.62-1.71,1.88-4.01,2.81-6.91,2.81-2.17,0-4.02-.56-5.58-1.69-1.56-1.13-2.77-2.75-3.66-4.85l-1.92.87c1.01,2.5,2.46,4.4,4.37,5.7,1.9,1.3,4.15,1.94,6.75,1.94,2.38,0,4.44-.5,6.18-1.51M279.77,44.89v-15.37c.61-.97,1.41-1.73,2.4-2.26.99-.53,2.07-.8,3.22-.8.64,0,1.27.06,1.88.18.61.12,1.16.3,1.65.55v-6.45c-.55-.37-1.48-.56-2.79-.59-1.31,0-2.5.25-3.57.75-1.07.5-2,1.24-2.79,2.22v-2.42h-7.41v24.2h7.41ZM253.44,28.07c.47-.56,1.04-1,1.72-1.3.67-.3,1.42-.46,2.24-.46s1.52.16,2.2.48c.67.32,1.26.76,1.76,1.33.5.56.88,1.24,1.12,2.04h-10.11c.24-.82.6-1.52,1.07-2.08M263.5,44.47c1.6-.58,3.17-1.51,4.69-2.79l-4.9-4.35c-.58.58-1.28,1.03-2.1,1.35-.82.32-1.74.48-2.75.48-.91,0-1.77-.16-2.56-.48-.79-.32-1.47-.77-2.03-1.35-.56-.58-1.02-1.25-1.35-2.01h17.25v-1.83c0-2.56-.53-4.83-1.58-6.82-1.05-1.98-2.49-3.54-4.32-4.69-1.83-1.14-3.94-1.72-6.31-1.72s-4.48.55-6.4,1.67c-1.92,1.11-3.44,2.62-4.55,4.5-1.11,1.89-1.67,4.01-1.67,6.36s.58,4.47,1.74,6.36c1.16,1.89,2.74,3.39,4.73,4.51,2,1.11,4.23,1.67,6.7,1.67,2.01,0,3.82-.29,5.42-.87M227.12,38.44c-.88-.34-1.65-.79-2.29-1.37v-8.46c.67-.64,1.43-1.12,2.29-1.44s1.8-.48,2.84-.48c1.19,0,2.26.27,3.23.8.96.53,1.72,1.26,2.29,2.2.56.93.84,1.97.84,3.13s-.28,2.2-.84,3.13c-.56.93-1.32,1.66-2.27,2.2-.95.54-2.03.8-3.25.8-1.01,0-1.95-.17-2.84-.5M224.74,44.89v-1.37c.92.55,1.91.97,2.97,1.26,1.07.29,2.16.43,3.29.43,2.35,0,4.48-.55,6.38-1.65,1.91-1.1,3.41-2.58,4.53-4.46,1.11-1.88,1.67-3.97,1.67-6.29s-.55-4.42-1.65-6.29c-1.1-1.88-2.58-3.37-4.44-4.49-1.86-1.11-3.95-1.67-6.27-1.67s-4.51.67-6.41,2.01v-10.66l-7.41,1.14v32.02h7.32ZM183.69,44.89v-16.56c.46-.58,1.01-1.01,1.67-1.3.66-.29,1.4-.43,2.22-.43,1.19,0,2.14.4,2.86,1.19.72.79,1.07,1.86,1.07,3.2v13.91h7.41v-14.91c0-.28,0-.54-.02-.8-.01-.26-.04-.51-.07-.76.49-.61,1.07-1.07,1.74-1.37.67-.31,1.42-.46,2.24-.46,1.19,0,2.14.4,2.86,1.19s1.08,1.86,1.08,3.2v13.91h7.41v-14.91c0-1.92-.41-3.61-1.21-5.08-.81-1.46-1.91-2.61-3.31-3.43-1.4-.82-3.02-1.23-4.85-1.23-1.59,0-3.05.29-4.39.87-1.34.58-2.5,1.4-3.48,2.47-.83-1.07-1.85-1.89-3.07-2.47-1.22-.58-2.59-.87-4.12-.87-2.32,0-4.33.67-6.04,2.01v-1.56h-7.41v24.2h7.41ZM157.36,28.07c.47-.56,1.04-1,1.72-1.3.67-.3,1.42-.46,2.24-.46s1.52.16,2.2.48c.67.32,1.26.76,1.76,1.33.5.56.88,1.24,1.12,2.04h-10.11c.24-.82.6-1.52,1.08-2.08M167.42,44.47c1.6-.58,3.16-1.51,4.69-2.79l-4.9-4.35c-.58.58-1.28,1.03-2.1,1.35-.83.32-1.74.48-2.75.48-.91,0-1.77-.16-2.56-.48-.79-.32-1.47-.77-2.03-1.35-.56-.58-1.02-1.25-1.35-2.01h17.25v-1.83c0-2.56-.53-4.83-1.58-6.82-1.05-1.98-2.49-3.54-4.32-4.69-1.83-1.14-3.93-1.72-6.31-1.72s-4.48.55-6.41,1.67c-1.92,1.11-3.44,2.62-4.55,4.5-1.11,1.89-1.67,4.01-1.67,6.36s.58,4.47,1.74,6.36c1.16,1.89,2.74,3.39,4.74,4.51,2,1.11,4.23,1.67,6.7,1.67,2.01,0,3.82-.29,5.42-.87M118.71,44.89v-21.91l10.52,19.62,10.52-19.53v21.82h7.41V12.87h-9.93l-7.91,15.1-7.91-15.1h-9.93v32.02h7.23Z\" />\n <path fill=\"#fff\"\n d=\"M88.82,12.69v27.95s9.76,5.58,9.76,5.58c.01-.24.02-34.61.02-34.61,0-3.72-1.57-6.76-4.3-8.35-2.73-1.59-6.15-1.44-9.38.39l-33.88,19.27L17.17,3.66c-3.23-1.84-6.65-1.98-9.38-.39-2.73,1.59-4.3,4.63-4.3,8.35,0,0,0,34.39.02,34.64l9.75-5.58V12.69l27.89,15.87L4.21,49.57c.71,1.84,1.93,3.32,3.57,4.28,1.26.73,2.67,1.1,4.13,1.1,1.71,0,3.51-.5,5.25-1.49L88.82,12.69Z\" />\n <path fill=\"#fff\"\n d=\"M64.22,30.43l-9.86,5.64,30.56,17.39c1.74.99,3.54,1.49,5.26,1.49,1.46,0,2.87-.37,4.13-1.1,1.65-.96,2.87-2.46,3.59-4.31l-33.67-19.11Z\" />\n </svg>\n </div>\n\n <div class=\"mj-about__version-row\">\n <span class=\"mj-about__version-pill\" (click)=\"OnVersionClick()\" role=\"button\" tabindex=\"0\">\n <span class=\"mj-about__version-dot\"></span>\n <span>Version {{ Version }}</span>\n </span>\n </div>\n </div>\n\n <div class=\"mj-about__body\">\n @if (ConnectionLabel) {\n <div class=\"mj-about__connection-line\">\n Connected to <span class=\"mj-about__connection-name\">{{ ConnectionLabel }}</span>\n </div>\n }\n\n <div class=\"mj-about__user-card\">\n @if (AvatarUrl) {\n <img class=\"mj-about__user-avatar mj-about__user-avatar--img\"\n [src]=\"AvatarUrl\" alt=\"\" (error)=\"OnAvatarLoadError()\" />\n } @else if (AvatarIconClass) {\n <div class=\"mj-about__user-avatar mj-about__user-avatar--icon\">\n <i [class]=\"AvatarIconClass\"></i>\n </div>\n } @else {\n <div class=\"mj-about__user-avatar\">{{ UserInitials }}</div>\n }\n <div class=\"mj-about__user-info\">\n <div class=\"mj-about__user-name\">{{ UserName }}</div>\n <div class=\"mj-about__user-meta\">{{ UserMeta }}</div>\n </div>\n <div class=\"mj-about__conn-pill\" [class.mj-about__conn-pill--offline]=\"!IsConnected\">\n <i class=\"fa-solid fa-circle\"></i>\n {{ IsConnected ? 'Connected' : 'Offline' }}\n </div>\n </div>\n\n <button class=\"mj-about__diag-toggle\" type=\"button\" [class.mj-about__diag-toggle--open]=\"DiagnosticsOpen\"\n (click)=\"ToggleDiagnostics()\">\n <span class=\"mj-about__diag-toggle-left\">\n <i class=\"fa-solid fa-stethoscope\"></i>\n {{ DiagnosticsOpen ? 'Hide diagnostics' : 'Show diagnostics' }}\n </span>\n <i class=\"fa-solid fa-chevron-down mj-about__diag-chev\"></i>\n </button>\n\n <div class=\"mj-about__diag-panel\" [class.mj-about__diag-panel--open]=\"DiagnosticsOpen\">\n <div class=\"mj-about__diag-section\">\n <h5><i class=\"fa-solid fa-cube\"></i> Build</h5>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Version</span><span class=\"v\">{{ Version }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Environment</span><span class=\"v\">{{ Environment }}</span></div>\n </div>\n <div class=\"mj-about__diag-section\">\n <h5><i class=\"fa-solid fa-plug\"></i> Connection</h5>\n <div class=\"mj-about__diag-row\"><span class=\"k\">API endpoint</span><span class=\"v\" [title]=\"ApiUrl\">{{ ApiUrlShort }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Auth provider</span><span class=\"v\">{{ AuthProvider }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Status</span><span class=\"v\" [class.mj-about__success]=\"IsConnected\" [class.mj-about__error]=\"!IsConnected\">{{ IsConnected ? 'Connected' : 'Offline' }}</span></div>\n </div>\n <div class=\"mj-about__diag-section\">\n <h5><i class=\"fa-solid fa-database\"></i> Loaded</h5>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Entities</span><span class=\"v\">{{ EntityCount }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Applications</span><span class=\"v\">{{ ApplicationCount }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Queries</span><span class=\"v\">{{ QueryCount }}</span></div>\n </div>\n <div class=\"mj-about__diag-section\">\n <h5><i class=\"fa-solid fa-user\"></i> Session</h5>\n <div class=\"mj-about__diag-row\"><span class=\"k\">User</span><span class=\"v\">{{ UserEmail }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Roles</span><span class=\"v\">{{ UserRolesText }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Theme</span><span class=\"v\">{{ ThemeLabel }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Browser</span><span class=\"v\">{{ BrowserLabel }}</span></div>\n </div>\n <button class=\"mj-about__copy-btn\" type=\"button\" (click)=\"CopyDiagnostics()\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\"></i>\n {{ CopyConfirmed ? 'Copied!' : 'Copy diagnostics' }}\n </button>\n </div>\n </div>\n\n <div class=\"mj-about__footer\">\n <a class=\"mj-about__footer-link\" href=\"https://docs.memberjunction.org\" target=\"_blank\" rel=\"noopener\">\n <i class=\"fa-solid fa-book\"></i> Documentation\n </a>\n <a class=\"mj-about__footer-link\" href=\"https://github.com/MemberJunction/MJ\" target=\"_blank\" rel=\"noopener\">\n <i class=\"fa-brands fa-github\"></i> GitHub\n </a>\n <a class=\"mj-about__footer-link\" href=\"https://memberjunction.com\" target=\"_blank\" rel=\"noopener\">\n <i class=\"fa-solid fa-globe\"></i> Website\n </a>\n </div>\n\n <div class=\"mj-about__credit\">\n Built with <span class=\"mj-about__heart\">&hearts;</span> by the MemberJunction community\n </div>\n\n @if (ToastMessage) {\n <div class=\"mj-about__toast\">{{ ToastMessage }}</div>\n }\n</div>\n `,\n styles: [`\n:host {\n display: block;\n width: 100%;\n height: 100%;\n}\n.mj-about {\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n height: 100%;\n min-height: 0;\n position: relative;\n font-family: inherit;\n}\n.mj-about__close {\n position: absolute;\n top: 12px;\n right: 12px;\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.18);\n backdrop-filter: blur(8px);\n color: #fff;\n cursor: pointer;\n font-size: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s;\n z-index: 2;\n}\n.mj-about__close:hover { background: rgba(255, 255, 255, 0.3); }\n\n.mj-about__hero {\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: #fff;\n padding: 36px 24px 28px;\n position: relative;\n overflow: hidden;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n}\n.mj-about__hero::before {\n content: '';\n position: absolute;\n inset: -50%;\n background: radial-gradient(circle, rgba(255, 255, 255, 0.10) 0%, transparent 60%);\n animation: mj-about-rotate 24s linear infinite;\n pointer-events: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .mj-about__hero::before { animation: none; }\n}\n@keyframes mj-about-rotate { to { transform: rotate(360deg); } }\n\n.mj-about__logo-wrap {\n position: relative;\n z-index: 1;\n cursor: pointer;\n display: block;\n text-align: center;\n}\n.mj-about__logo {\n width: 280px;\n max-width: 80%;\n height: auto;\n display: inline-block;\n filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.15));\n transition: transform 0.3s ease-out;\n}\n.mj-about__logo-wrap:hover .mj-about__logo { transform: scale(1.03); }\n\n.mj-about__version-row {\n position: relative;\n z-index: 1;\n text-align: center;\n}\n.mj-about__version-pill {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n background: rgba(255, 255, 255, 0.18);\n backdrop-filter: blur(8px);\n border: 1px solid rgba(255, 255, 255, 0.28);\n border-radius: 100px;\n padding: 5px 14px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n user-select: none;\n color: #fff;\n transition: background 0.15s;\n letter-spacing: 0.2px;\n}\n.mj-about__version-pill:hover { background: rgba(255, 255, 255, 0.28); }\n.mj-about__version-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: #4ade80;\n box-shadow: 0 0 6px #4ade80;\n}\n\n.mj-about__body {\n padding: 22px 24px 16px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n.mj-about__connection-line {\n text-align: center;\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-bottom: 14px;\n letter-spacing: 0.2px;\n}\n.mj-about__connection-name {\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n\n.mj-about__user-card {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n margin-bottom: 16px;\n}\n.mj-about__user-avatar {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 700;\n font-size: 15px;\n flex-shrink: 0;\n object-fit: cover;\n overflow: hidden;\n}\nimg.mj-about__user-avatar { background: var(--mj-bg-surface-card); }\n.mj-about__user-avatar--icon i { font-size: 18px; }\n.mj-about__user-info { flex: 1; min-width: 0; }\n.mj-about__user-name {\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-about__user-meta {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-about__conn-pill {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 11px;\n color: var(--mj-status-success);\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-status-success) 12%, transparent);\n padding: 3px 8px;\n border-radius: 100px;\n flex-shrink: 0;\n}\n.mj-about__conn-pill i { font-size: 6px; }\n.mj-about__conn-pill--offline {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n.mj-about__diag-toggle {\n width: 100%;\n background: transparent;\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 12px 14px;\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n transition: background 0.15s, border-color 0.15s, color 0.15s;\n font-family: inherit;\n}\n.mj-about__diag-toggle:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n color: var(--mj-text-primary);\n}\n.mj-about__diag-toggle-left {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n.mj-about__diag-chev {\n transition: transform 0.25s;\n color: var(--mj-text-muted);\n}\n.mj-about__diag-toggle--open .mj-about__diag-chev { transform: rotate(180deg); }\n\n.mj-about__diag-panel {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.35s ease-out, margin-top 0.25s;\n}\n.mj-about__diag-panel--open {\n max-height: 800px;\n margin-top: 12px;\n}\n.mj-about__diag-section + .mj-about__diag-section { margin-top: 12px; }\n.mj-about__diag-section {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 12px 14px;\n}\n.mj-about__diag-section h5 {\n margin: 0 0 8px;\n font-size: 10.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.6px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.mj-about__diag-section h5 i { color: var(--mj-brand-primary); }\n.mj-about__diag-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n font-size: 12.5px;\n padding: 4px 0;\n min-width: 0;\n}\n.mj-about__diag-row .k { color: var(--mj-text-secondary); flex-shrink: 0; }\n.mj-about__diag-row .v {\n color: var(--mj-text-primary);\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n font-weight: 500;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n.mj-about__success { color: var(--mj-status-success) !important; }\n.mj-about__error { color: var(--mj-status-error) !important; }\n\n.mj-about__copy-btn {\n width: 100%;\n margin-top: 12px;\n padding: 10px;\n border: 1px dashed var(--mj-border-strong);\n background: transparent;\n border-radius: 8px;\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: border-color 0.15s, color 0.15s, background 0.15s;\n font-family: inherit;\n}\n.mj-about__copy-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.mj-about__footer {\n border-top: 1px solid var(--mj-border-subtle);\n padding: 14px 20px;\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n justify-content: center;\n flex-shrink: 0;\n}\n.mj-about__footer-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border-radius: 7px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-decoration: none;\n transition: background 0.15s, color 0.15s;\n cursor: pointer;\n}\n.mj-about__footer-link:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.mj-about__credit {\n text-align: center;\n font-size: 10.5px;\n color: var(--mj-text-muted);\n padding: 0 20px 14px;\n flex-shrink: 0;\n}\n.mj-about__heart {\n color: var(--mj-status-error);\n display: inline-block;\n animation: mj-about-heart 2s ease-in-out infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n .mj-about__heart { animation: none; }\n}\n@keyframes mj-about-heart {\n 50% { transform: scale(1.18); }\n}\n\n.mj-about__toast {\n position: absolute;\n top: 16px;\n left: 50%;\n transform: translateX(-50%);\n background: var(--mj-text-primary);\n color: var(--mj-bg-surface);\n padding: 10px 18px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 500;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n z-index: 5;\n pointer-events: none;\n animation: mj-about-toast-in 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);\n max-width: calc(100% - 32px);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n@keyframes mj-about-toast-in {\n from { transform: translateX(-50%) translateY(-30px); opacity: 0; }\n to { transform: translateX(-50%) translateY(0); opacity: 1; }\n}\n\n@media (max-width: 480px) {\n .mj-about__hero { padding: 30px 18px 22px; gap: 12px; }\n .mj-about__logo { width: 220px; }\n .mj-about__body { padding: 18px 16px 14px; }\n .mj-about__footer { padding: 12px 14px; }\n}\n `]\n})\nexport class AboutDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Output() CloseRequested = new EventEmitter<void>();\n\n /** Optional avatar image URL — passed in from the shell where it's already resolved. */\n @Input() AvatarUrl: string | null = null;\n\n /** Optional Font Awesome icon class fallback when no image is available. */\n @Input() AvatarIconClass: string | null = null;\n\n /** Static framework version, generated at build time. */\n public readonly Version: string = PACKAGE_VERSION;\n\n public EntityCount = 0;\n public ApplicationCount = 0;\n public QueryCount = 0;\n\n public UserName = 'Unknown User';\n public UserEmail = '';\n public UserInitials = '?';\n public UserRolesText = 'None';\n public ApiUrl = '';\n public ApiUrlShort = '';\n public AuthProvider = 'Unknown';\n public Environment: string = 'production';\n public ThemeLabel = '';\n public BrowserLabel = '';\n public IsConnected = true;\n public DiagnosticsOpen = false;\n\n /** Friendly \"Connected to X\" label — display name from InstanceConfig or just the API hostname. */\n public ConnectionLabel = '';\n\n public ToastMessage = '';\n public CopyConfirmed = false;\n\n private authBase = inject(MJAuthBase);\n private themeService = inject(ThemeService);\n private connectivity = inject(ServerConnectivityService);\n private cdr = inject(ChangeDetectorRef);\n\n private connSub?: Subscription;\n private themeSub?: Subscription;\n private versionClickCount = 0;\n private versionClickResetTimer: ReturnType<typeof setTimeout> | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n private konamiIndex = 0;\n private readonly konamiSequence = ['ArrowUp','ArrowUp','ArrowDown','ArrowDown','ArrowLeft','ArrowRight','ArrowLeft','ArrowRight','b','a'];\n private readonly konamiHandler = (event: KeyboardEvent): void => {\n const key = event.key.length === 1 ? event.key.toLowerCase() : event.key;\n if (key === this.konamiSequence[this.konamiIndex]) {\n this.konamiIndex++;\n if (this.konamiIndex === this.konamiSequence.length) {\n this.konamiIndex = 0;\n this.showToast('🚀 You found it. Now you must tell no one.', 3500);\n this.barrelRoll();\n }\n } else {\n this.konamiIndex = 0;\n }\n };\n\n public get UserMeta(): string {\n if (this.UserEmail && this.UserRolesText && this.UserRolesText !== 'None') {\n return `${this.UserEmail} · ${this.UserRolesText}`;\n }\n return this.UserEmail || this.UserRolesText;\n }\n\n public ngOnInit(): void {\n this.populate();\n this.connSub = this.connectivity.IsConnected$.subscribe(connected => {\n this.IsConnected = connected;\n this.cdr.markForCheck();\n });\n this.themeSub = this.themeService.AppliedTheme$.subscribe(() => {\n this.ThemeLabel = this.computeThemeLabel();\n this.cdr.markForCheck();\n });\n document.addEventListener('keydown', this.konamiHandler);\n }\n\n public ngOnDestroy(): void {\n this.connSub?.unsubscribe();\n this.themeSub?.unsubscribe();\n document.removeEventListener('keydown', this.konamiHandler);\n if (this.versionClickResetTimer) clearTimeout(this.versionClickResetTimer);\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n private populate(): void {\n const provider = this.ProviderToUse;\n\n this.EntityCount = provider?.Entities?.length ?? 0;\n this.ApplicationCount = provider?.Applications?.length ?? 0;\n this.QueryCount = provider?.Queries?.length ?? 0;\n\n const user = provider?.CurrentUser;\n if (user) {\n this.UserName = user.Name || `${user.FirstName ?? ''} ${user.LastName ?? ''}`.trim() || 'User';\n this.UserEmail = user.Email || '';\n this.UserInitials = this.computeInitials(this.UserName);\n const roles = (user.UserRoles ?? [])\n .map((r: UserRoleInfo) => r.Role)\n .filter((n: string | null) => !!n) as string[];\n this.UserRolesText = roles.length > 0 ? roles.join(', ') : 'None';\n }\n\n if (provider instanceof GraphQLDataProvider) {\n this.ApiUrl = provider.ConfigData?.URL ?? '';\n this.ApiUrlShort = this.shortenUrl(this.ApiUrl);\n }\n\n this.AuthProvider = this.computeAuthLabel(this.authBase?.type);\n this.Environment = this.detectEnvironment();\n this.ThemeLabel = this.computeThemeLabel();\n this.BrowserLabel = this.computeBrowserLabel();\n this.IsConnected = this.connectivity.IsConnected;\n this.ConnectionLabel = this.computeConnectionLabel();\n }\n\n /**\n * Build the \"Connected to X\" label. Prefers `Instance.DisplayName` from\n * InstanceConfigEngine if set, otherwise falls back to the API hostname.\n */\n private computeConnectionLabel(): string {\n let displayName: string | undefined;\n try {\n displayName = InstanceConfigEngine.Instance.Get('Instance.DisplayName');\n } catch {\n displayName = undefined;\n }\n const host = this.ApiUrlShort?.split('/')[0] ?? '';\n if (displayName && host) return `${displayName} · ${host}`;\n return displayName || host;\n }\n\n public ToggleDiagnostics(): void {\n this.DiagnosticsOpen = !this.DiagnosticsOpen;\n }\n\n public OnCloseClick(): void {\n this.CloseRequested.emit();\n }\n\n public OnLogoClick(): void {\n this.wiggleLogo();\n }\n\n public OnAvatarLoadError(): void {\n // Image failed to load — fall back to initials\n this.AvatarUrl = null;\n this.cdr.markForCheck();\n }\n\n public OnVersionClick(): void {\n this.versionClickCount++;\n if (this.versionClickResetTimer) clearTimeout(this.versionClickResetTimer);\n this.versionClickResetTimer = setTimeout(() => (this.versionClickCount = 0), 2000);\n\n if (this.versionClickCount === 3) this.showToast('Keep going...');\n else if (this.versionClickCount === 5) this.showToast(\"You're committed now.\");\n else if (this.versionClickCount === 7) {\n this.versionClickCount = 0;\n this.showToast('🎉 Developer mode? In THIS economy?');\n this.spinLogo();\n }\n }\n\n public async CopyDiagnostics(): Promise<void> {\n const block = [\n `MemberJunction v${this.Version}`,\n `Environment: ${this.Environment}`,\n `API: ${this.ApiUrl || '(unknown)'}`,\n `Auth: ${this.AuthProvider}`,\n `User: ${this.UserEmail || this.UserName} (${this.UserRolesText})`,\n `Theme: ${this.ThemeLabel}`,\n `Browser: ${this.BrowserLabel}`,\n `Entities loaded: ${this.EntityCount}`,\n `Applications: ${this.ApplicationCount}`,\n `Queries: ${this.QueryCount}`\n ].join('\\n');\n\n try {\n await navigator.clipboard.writeText(block);\n this.CopyConfirmed = true;\n this.showToast('Diagnostics copied to clipboard');\n setTimeout(() => {\n this.CopyConfirmed = false;\n this.cdr.markForCheck();\n }, 1800);\n } catch {\n this.showToast('Copy failed — clipboard unavailable');\n }\n }\n\n // ---------- helpers ----------\n\n private computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n\n private shortenUrl(url: string): string {\n if (!url) return '(not configured)';\n try {\n const u = new URL(url);\n return u.host + (u.pathname && u.pathname !== '/' ? u.pathname : '');\n } catch {\n return url;\n }\n }\n\n private computeAuthLabel(type: string | undefined): string {\n switch ((type ?? '').toLowerCase()) {\n case 'msal': return 'Microsoft Entra (MSAL)';\n case 'auth0': return 'Auth0';\n case 'okta': return 'Okta';\n case 'cognito': return 'Amazon Cognito';\n case '': return 'Unknown';\n default: return type ?? 'Unknown';\n }\n }\n\n private detectEnvironment(): string {\n const host = typeof window !== 'undefined' ? window.location.hostname : '';\n if (host === 'localhost' || host === '127.0.0.1' || host.endsWith('.local')) return 'development';\n if (host.startsWith('dev.') || host.includes('-dev.') || host.includes('.dev.')) return 'development';\n if (host.startsWith('staging.') || host.includes('-staging.') || host.includes('.staging.')) return 'staging';\n return 'production';\n }\n\n private computeThemeLabel(): string {\n const applied = this.themeService.AppliedTheme;\n const preference = this.themeService.Preference;\n const def = this.themeService.GetThemeDefinition(applied);\n const themeName = def?.Name ?? applied;\n return preference === 'system' ? `${themeName} · System` : themeName;\n }\n\n private computeBrowserLabel(): string {\n const ua = typeof navigator !== 'undefined' ? navigator.userAgent : '';\n let browser = 'Unknown';\n if (/Edg\\//.test(ua)) browser = 'Edge';\n else if (/OPR\\//.test(ua)) browser = 'Opera';\n else if (/Chrome\\//.test(ua) && !/Chromium/.test(ua)) browser = 'Chrome';\n else if (/Firefox\\//.test(ua)) browser = 'Firefox';\n else if (/Safari\\//.test(ua)) browser = 'Safari';\n\n let os = 'Unknown';\n if (/iPhone|iPad|iPod/.test(ua)) os = 'iOS';\n else if (/Android/.test(ua)) os = 'Android';\n else if (/Mac OS X|Macintosh/.test(ua)) os = 'macOS';\n else if (/Windows/.test(ua)) os = 'Windows';\n else if (/Linux/.test(ua)) os = 'Linux';\n\n return `${browser} / ${os}`;\n }\n\n private showToast(message: string, durationMs = 2400): void {\n this.ToastMessage = message;\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toastTimer = setTimeout(() => {\n this.ToastMessage = '';\n this.cdr.markForCheck();\n }, durationMs);\n }\n\n private wiggleLogo(): void {\n const svg = document.querySelector('.mj-about__logo') as SVGElement | null;\n svg?.animate(\n [\n { transform: 'rotate(0)' },\n { transform: 'rotate(-6deg)' },\n { transform: 'rotate(6deg)' },\n { transform: 'rotate(0)' }\n ],\n { duration: 400, easing: 'ease-in-out' }\n );\n }\n\n private spinLogo(): void {\n const svg = document.querySelector('.mj-about__logo') as SVGElement | null;\n svg?.animate(\n [\n { transform: 'rotate(0) scale(1)', offset: 0 },\n { transform: 'rotate(720deg) scale(1.1)', offset: 0.85 },\n { transform: 'rotate(720deg) scale(1)', offset: 1 }\n ],\n { duration: 2800, easing: 'cubic-bezier(0.22, 1, 0.36, 1)' }\n );\n }\n\n private barrelRoll(): void {\n const dialog = document.querySelector('.mj-about') as HTMLElement | null;\n dialog?.animate(\n [{ transform: 'rotate(0)' }, { transform: 'rotate(360deg)' }],\n { duration: 900, easing: 'cubic-bezier(0.65, 0, 0.35, 1)' }\n );\n }\n}\n"]}
1
+ {"version":3,"file":"about-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/about/about-dialog.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n OnInit,\n Output,\n ChangeDetectorRef,\n inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UserRoleInfo } from '@memberjunction/core';\nimport { InstanceConfigEngine } from '@memberjunction/core-entities';\nimport { GraphQLDataProvider, PACKAGE_VERSION } from '@memberjunction/graphql-dataprovider';\nimport { MJAuthBase } from '@memberjunction/ng-auth-services';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { ThemeService } from '@memberjunction/ng-shared';\nimport { MJAccordionModule } from '@memberjunction/ng-ui-components';\nimport { Subscription } from 'rxjs';\nimport { ServerConnectivityService } from '../services/server-connectivity.service';\n\n/**\n * About dialog for MemberJunction. Shows brand identity, version, lightweight\n * usage stats, the current user, and a collapsible diagnostics panel.\n *\n * Self-contained standalone component. Opened via {@link AboutDialogService}.\n *\n * Easter eggs:\n * - Click the version pill 7× → toast + logo spin\n * - Click the logo → quick wiggle\n * - Konami code (↑↑↓↓←→←→ B A) → barrel roll\n */\n@Component({\n selector: 'mj-about-dialog',\n standalone: true,\n imports: [CommonModule, MJAccordionModule],\n template: `\n<div class=\"mj-about\" role=\"document\">\n <button class=\"mj-about__close\" type=\"button\" aria-label=\"Close\" (click)=\"OnCloseClick()\">\n <i class=\"fa-solid fa-xmark\"></i>\n </button>\n\n <div class=\"mj-about__hero\">\n <div class=\"mj-about__logo-wrap\" (click)=\"OnLogoClick()\">\n <svg class=\"mj-about__logo\" #aboutLogo\n xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448.28 57.11\"\n aria-label=\"MemberJunction\">\n <path fill=\"#fff\"\n d=\"M428.73,44.89v-16.92c.7-1.34,1.66-2.37,2.88-3.09,1.22-.72,2.59-1.08,4.12-1.08,2.2,0,3.92.65,5.17,1.94,1.25,1.3,1.87,3.07,1.87,5.33v13.81h2.01v-14.36c0-1.71-.36-3.21-1.08-4.51-.72-1.3-1.72-2.3-3.02-3.02-1.3-.72-2.8-1.08-4.51-1.08-3.14,0-5.63,1.21-7.46,3.61v-3.16h-2.01v22.51h2.01ZM407.08,42.12c-1.39-.87-2.49-2.04-3.29-3.52-.81-1.48-1.21-3.13-1.21-4.96s.4-3.48,1.21-4.96c.81-1.48,1.91-2.65,3.29-3.52,1.39-.87,2.94-1.31,4.64-1.31s3.25.44,4.64,1.31c1.39.87,2.49,2.04,3.29,3.52.81,1.48,1.21,3.13,1.21,4.96s-.41,3.48-1.21,4.96c-.81,1.48-1.91,2.65-3.29,3.52-1.39.87-2.94,1.3-4.64,1.3s-3.26-.43-4.64-1.3M417.42,43.79c1.69-1.04,3.04-2.45,4.03-4.23.99-1.78,1.49-3.76,1.49-5.92s-.5-4.18-1.49-5.95c-.99-1.77-2.33-3.17-4.03-4.21-1.69-1.04-3.59-1.56-5.69-1.56s-3.97.52-5.67,1.56c-1.71,1.04-3.06,2.44-4.05,4.21-.99,1.77-1.49,3.75-1.49,5.95s.5,4.14,1.49,5.92c.99,1.79,2.34,3.19,4.05,4.23,1.71,1.04,3.6,1.56,5.67,1.56s4-.52,5.69-1.56M397.14,16.8c.32-.34.48-.75.48-1.24s-.16-.9-.48-1.24c-.32-.34-.74-.5-1.26-.5-.49,0-.9.17-1.24.5-.34.34-.5.75-.5,1.24s.17.9.5,1.24c.34.34.75.5,1.24.5.52,0,.94-.17,1.26-.5M396.89,22.38h-2.01v22.51h2.01v-22.51ZM390.57,45.21c.61-.09,1.2-.25,1.78-.46v-1.97c-.52.21-1.02.37-1.51.48-.49.11-1.08.16-1.79.16-1.31,0-2.25-.28-2.81-.84s-.85-1.49-.85-2.77v-15.6h6.95v-1.83h-6.95v-6.31l-2.01.64v5.67h-4.94v1.83h4.94v16.29c0,1.52.46,2.71,1.37,3.57.91.85,2.23,1.28,3.94,1.28.64,0,1.26-.05,1.87-.14M373.12,44.43c1.54-.61,2.89-1.45,4.05-2.51l-1.37-1.65c-.98.95-2.1,1.71-3.36,2.29s-2.57.87-3.91.87c-1.71,0-3.25-.43-4.64-1.3-1.39-.87-2.49-2.04-3.29-3.52-.81-1.48-1.21-3.13-1.21-4.96s.4-3.48,1.21-4.96c.81-1.48,1.9-2.65,3.29-3.52,1.39-.87,2.93-1.31,4.64-1.31,1.34,0,2.64.28,3.91.85,1.27.56,2.39,1.33,3.36,2.31l1.37-1.65c-1.16-1.07-2.51-1.91-4.05-2.52-1.54-.61-3.07-.91-4.6-.91-2.07,0-3.96.52-5.67,1.56s-3.06,2.44-4.05,4.21c-.99,1.77-1.49,3.75-1.49,5.95s.49,4.18,1.49,5.95c.99,1.77,2.34,3.17,4.05,4.21s3.6,1.56,5.67,1.56c1.52,0,3.06-.31,4.6-.92M337.65,44.89v-16.92c.7-1.34,1.66-2.37,2.88-3.09,1.22-.72,2.59-1.08,4.12-1.08,2.2,0,3.92.65,5.17,1.94,1.25,1.3,1.88,3.07,1.88,5.33v13.81h2.01v-14.36c0-1.71-.36-3.21-1.07-4.51-.72-1.3-1.73-2.3-3.02-3.02s-2.8-1.08-4.5-1.08c-3.14,0-5.63,1.21-7.46,3.61v-3.16h-2.01v22.51h2.01ZM328.7,41.78v3.11h2.01v-22.51h-2.01v16.92c-.7,1.31-1.66,2.33-2.88,3.06-1.22.73-2.59,1.1-4.12,1.1-2.2,0-3.92-.65-5.17-1.97-1.25-1.31-1.87-3.08-1.87-5.31v-13.81h-2.01v14.36c0,1.71.37,3.21,1.1,4.51.73,1.3,1.74,2.3,3.04,3.02,1.3.72,2.78,1.08,4.46,1.08,3.2,0,5.69-1.19,7.46-3.57M303.64,43.88c1.74-1.01,3.08-2.43,4.02-4.28.95-1.84,1.42-4.05,1.42-6.61V12.87h-2.1v20.13c0,3.2-.85,5.74-2.56,7.62-1.71,1.88-4.01,2.81-6.91,2.81-2.17,0-4.02-.56-5.58-1.69-1.56-1.13-2.77-2.75-3.66-4.85l-1.92.87c1.01,2.5,2.46,4.4,4.37,5.7,1.9,1.3,4.15,1.94,6.75,1.94,2.38,0,4.44-.5,6.18-1.51M279.77,44.89v-15.37c.61-.97,1.41-1.73,2.4-2.26.99-.53,2.07-.8,3.22-.8.64,0,1.27.06,1.88.18.61.12,1.16.3,1.65.55v-6.45c-.55-.37-1.48-.56-2.79-.59-1.31,0-2.5.25-3.57.75-1.07.5-2,1.24-2.79,2.22v-2.42h-7.41v24.2h7.41ZM253.44,28.07c.47-.56,1.04-1,1.72-1.3.67-.3,1.42-.46,2.24-.46s1.52.16,2.2.48c.67.32,1.26.76,1.76,1.33.5.56.88,1.24,1.12,2.04h-10.11c.24-.82.6-1.52,1.07-2.08M263.5,44.47c1.6-.58,3.17-1.51,4.69-2.79l-4.9-4.35c-.58.58-1.28,1.03-2.1,1.35-.82.32-1.74.48-2.75.48-.91,0-1.77-.16-2.56-.48-.79-.32-1.47-.77-2.03-1.35-.56-.58-1.02-1.25-1.35-2.01h17.25v-1.83c0-2.56-.53-4.83-1.58-6.82-1.05-1.98-2.49-3.54-4.32-4.69-1.83-1.14-3.94-1.72-6.31-1.72s-4.48.55-6.4,1.67c-1.92,1.11-3.44,2.62-4.55,4.5-1.11,1.89-1.67,4.01-1.67,6.36s.58,4.47,1.74,6.36c1.16,1.89,2.74,3.39,4.73,4.51,2,1.11,4.23,1.67,6.7,1.67,2.01,0,3.82-.29,5.42-.87M227.12,38.44c-.88-.34-1.65-.79-2.29-1.37v-8.46c.67-.64,1.43-1.12,2.29-1.44s1.8-.48,2.84-.48c1.19,0,2.26.27,3.23.8.96.53,1.72,1.26,2.29,2.2.56.93.84,1.97.84,3.13s-.28,2.2-.84,3.13c-.56.93-1.32,1.66-2.27,2.2-.95.54-2.03.8-3.25.8-1.01,0-1.95-.17-2.84-.5M224.74,44.89v-1.37c.92.55,1.91.97,2.97,1.26,1.07.29,2.16.43,3.29.43,2.35,0,4.48-.55,6.38-1.65,1.91-1.1,3.41-2.58,4.53-4.46,1.11-1.88,1.67-3.97,1.67-6.29s-.55-4.42-1.65-6.29c-1.1-1.88-2.58-3.37-4.44-4.49-1.86-1.11-3.95-1.67-6.27-1.67s-4.51.67-6.41,2.01v-10.66l-7.41,1.14v32.02h7.32ZM183.69,44.89v-16.56c.46-.58,1.01-1.01,1.67-1.3.66-.29,1.4-.43,2.22-.43,1.19,0,2.14.4,2.86,1.19.72.79,1.07,1.86,1.07,3.2v13.91h7.41v-14.91c0-.28,0-.54-.02-.8-.01-.26-.04-.51-.07-.76.49-.61,1.07-1.07,1.74-1.37.67-.31,1.42-.46,2.24-.46,1.19,0,2.14.4,2.86,1.19s1.08,1.86,1.08,3.2v13.91h7.41v-14.91c0-1.92-.41-3.61-1.21-5.08-.81-1.46-1.91-2.61-3.31-3.43-1.4-.82-3.02-1.23-4.85-1.23-1.59,0-3.05.29-4.39.87-1.34.58-2.5,1.4-3.48,2.47-.83-1.07-1.85-1.89-3.07-2.47-1.22-.58-2.59-.87-4.12-.87-2.32,0-4.33.67-6.04,2.01v-1.56h-7.41v24.2h7.41ZM157.36,28.07c.47-.56,1.04-1,1.72-1.3.67-.3,1.42-.46,2.24-.46s1.52.16,2.2.48c.67.32,1.26.76,1.76,1.33.5.56.88,1.24,1.12,2.04h-10.11c.24-.82.6-1.52,1.08-2.08M167.42,44.47c1.6-.58,3.16-1.51,4.69-2.79l-4.9-4.35c-.58.58-1.28,1.03-2.1,1.35-.83.32-1.74.48-2.75.48-.91,0-1.77-.16-2.56-.48-.79-.32-1.47-.77-2.03-1.35-.56-.58-1.02-1.25-1.35-2.01h17.25v-1.83c0-2.56-.53-4.83-1.58-6.82-1.05-1.98-2.49-3.54-4.32-4.69-1.83-1.14-3.93-1.72-6.31-1.72s-4.48.55-6.41,1.67c-1.92,1.11-3.44,2.62-4.55,4.5-1.11,1.89-1.67,4.01-1.67,6.36s.58,4.47,1.74,6.36c1.16,1.89,2.74,3.39,4.74,4.51,2,1.11,4.23,1.67,6.7,1.67,2.01,0,3.82-.29,5.42-.87M118.71,44.89v-21.91l10.52,19.62,10.52-19.53v21.82h7.41V12.87h-9.93l-7.91,15.1-7.91-15.1h-9.93v32.02h7.23Z\" />\n <path fill=\"#fff\"\n d=\"M88.82,12.69v27.95s9.76,5.58,9.76,5.58c.01-.24.02-34.61.02-34.61,0-3.72-1.57-6.76-4.3-8.35-2.73-1.59-6.15-1.44-9.38.39l-33.88,19.27L17.17,3.66c-3.23-1.84-6.65-1.98-9.38-.39-2.73,1.59-4.3,4.63-4.3,8.35,0,0,0,34.39.02,34.64l9.75-5.58V12.69l27.89,15.87L4.21,49.57c.71,1.84,1.93,3.32,3.57,4.28,1.26.73,2.67,1.1,4.13,1.1,1.71,0,3.51-.5,5.25-1.49L88.82,12.69Z\" />\n <path fill=\"#fff\"\n d=\"M64.22,30.43l-9.86,5.64,30.56,17.39c1.74.99,3.54,1.49,5.26,1.49,1.46,0,2.87-.37,4.13-1.1,1.65-.96,2.87-2.46,3.59-4.31l-33.67-19.11Z\" />\n </svg>\n </div>\n\n <div class=\"mj-about__version-row\">\n <span class=\"mj-about__version-pill\" (click)=\"OnVersionClick()\" role=\"button\" tabindex=\"0\">\n <span class=\"mj-about__version-dot\"></span>\n <span>Version {{ Version }}</span>\n </span>\n </div>\n </div>\n\n <div class=\"mj-about__body\">\n @if (ConnectionLabel) {\n <div class=\"mj-about__connection-line\">\n Connected to <span class=\"mj-about__connection-name\">{{ ConnectionLabel }}</span>\n </div>\n }\n\n <div class=\"mj-about__user-card\">\n @if (AvatarUrl) {\n <img class=\"mj-about__user-avatar mj-about__user-avatar--img\"\n [src]=\"AvatarUrl\" alt=\"\" (error)=\"OnAvatarLoadError()\" />\n } @else if (AvatarIconClass) {\n <div class=\"mj-about__user-avatar mj-about__user-avatar--icon\">\n <i [class]=\"AvatarIconClass\"></i>\n </div>\n } @else {\n <div class=\"mj-about__user-avatar\">{{ UserInitials }}</div>\n }\n <div class=\"mj-about__user-info\">\n <div class=\"mj-about__user-name\">{{ UserName }}</div>\n <div class=\"mj-about__user-meta\">{{ UserMeta }}</div>\n </div>\n <div class=\"mj-about__conn-pill\" [class.mj-about__conn-pill--offline]=\"!IsConnected\">\n <i class=\"fa-solid fa-circle\"></i>\n {{ IsConnected ? 'Connected' : 'Offline' }}\n </div>\n </div>\n\n <mj-accordion-panel class=\"mj-about__diag\" Size=\"sm\" [(Expanded)]=\"DiagnosticsOpen\">\n <ng-template mjAccordionTitle>\n <i class=\"fa-solid fa-stethoscope\"></i>\n Diagnostics\n </ng-template>\n <ng-template mjAccordionBody>\n <div class=\"mj-about__diag-panel\">\n <div class=\"mj-about__diag-section\">\n <h5><i class=\"fa-solid fa-cube\"></i> Build</h5>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Version</span><span class=\"v\">{{ Version }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Environment</span><span class=\"v\">{{ Environment }}</span></div>\n </div>\n <div class=\"mj-about__diag-section\">\n <h5><i class=\"fa-solid fa-plug\"></i> Connection</h5>\n <div class=\"mj-about__diag-row\"><span class=\"k\">API endpoint</span><span class=\"v\" [title]=\"ApiUrl\">{{ ApiUrlShort }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Auth provider</span><span class=\"v\">{{ AuthProvider }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Status</span><span class=\"v\" [class.mj-about__success]=\"IsConnected\" [class.mj-about__error]=\"!IsConnected\">{{ IsConnected ? 'Connected' : 'Offline' }}</span></div>\n </div>\n <div class=\"mj-about__diag-section\">\n <h5><i class=\"fa-solid fa-database\"></i> Loaded</h5>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Entities</span><span class=\"v\">{{ EntityCount }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Applications</span><span class=\"v\">{{ ApplicationCount }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Queries</span><span class=\"v\">{{ QueryCount }}</span></div>\n </div>\n <div class=\"mj-about__diag-section\">\n <h5><i class=\"fa-solid fa-user\"></i> Session</h5>\n <div class=\"mj-about__diag-row\"><span class=\"k\">User</span><span class=\"v\">{{ UserEmail }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Roles</span><span class=\"v\">{{ UserRolesText }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Theme</span><span class=\"v\">{{ ThemeLabel }}</span></div>\n <div class=\"mj-about__diag-row\"><span class=\"k\">Browser</span><span class=\"v\">{{ BrowserLabel }}</span></div>\n </div>\n <button class=\"mj-about__copy-btn\" type=\"button\" (click)=\"CopyDiagnostics()\">\n <i class=\"fa-solid\" [class.fa-clipboard]=\"!CopyConfirmed\" [class.fa-check]=\"CopyConfirmed\"></i>\n {{ CopyConfirmed ? 'Copied!' : 'Copy diagnostics' }}\n </button>\n </div>\n </ng-template>\n </mj-accordion-panel>\n </div>\n\n <div class=\"mj-about__footer\">\n <a class=\"mj-about__footer-link\" href=\"https://docs.memberjunction.org\" target=\"_blank\" rel=\"noopener\">\n <i class=\"fa-solid fa-book\"></i> Documentation\n </a>\n <a class=\"mj-about__footer-link\" href=\"https://github.com/MemberJunction/MJ\" target=\"_blank\" rel=\"noopener\">\n <i class=\"fa-brands fa-github\"></i> GitHub\n </a>\n <a class=\"mj-about__footer-link\" href=\"https://memberjunction.com\" target=\"_blank\" rel=\"noopener\">\n <i class=\"fa-solid fa-globe\"></i> Website\n </a>\n </div>\n\n <div class=\"mj-about__credit\">\n Built with <span class=\"mj-about__heart\">&hearts;</span> by the MemberJunction community\n </div>\n\n @if (ToastMessage) {\n <div class=\"mj-about__toast\">{{ ToastMessage }}</div>\n }\n</div>\n `,\n styles: [`\n:host {\n display: block;\n width: 100%;\n height: 100%;\n}\n.mj-about {\n display: flex;\n flex-direction: column;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n height: 100%;\n min-height: 0;\n position: relative;\n font-family: inherit;\n}\n.mj-about__close {\n position: absolute;\n top: 12px;\n right: 12px;\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.18);\n backdrop-filter: blur(8px);\n color: #fff;\n cursor: pointer;\n font-size: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.15s;\n z-index: 2;\n}\n.mj-about__close:hover { background: rgba(255, 255, 255, 0.3); }\n\n.mj-about__hero {\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: #fff;\n padding: 36px 24px 28px;\n position: relative;\n overflow: hidden;\n flex-shrink: 0;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n}\n.mj-about__hero::before {\n content: '';\n position: absolute;\n inset: -50%;\n background: radial-gradient(circle, rgba(255, 255, 255, 0.10) 0%, transparent 60%);\n animation: mj-about-rotate 24s linear infinite;\n pointer-events: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .mj-about__hero::before { animation: none; }\n}\n@keyframes mj-about-rotate { to { transform: rotate(360deg); } }\n\n.mj-about__logo-wrap {\n position: relative;\n z-index: 1;\n cursor: pointer;\n display: block;\n text-align: center;\n}\n.mj-about__logo {\n width: 280px;\n max-width: 80%;\n height: auto;\n display: inline-block;\n filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.15));\n transition: transform 0.3s ease-out;\n}\n.mj-about__logo-wrap:hover .mj-about__logo { transform: scale(1.03); }\n\n.mj-about__version-row {\n position: relative;\n z-index: 1;\n text-align: center;\n}\n.mj-about__version-pill {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n background: rgba(255, 255, 255, 0.18);\n backdrop-filter: blur(8px);\n border: 1px solid rgba(255, 255, 255, 0.28);\n border-radius: 100px;\n padding: 5px 14px;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n user-select: none;\n color: #fff;\n transition: background 0.15s;\n letter-spacing: 0.2px;\n}\n.mj-about__version-pill:hover { background: rgba(255, 255, 255, 0.28); }\n.mj-about__version-dot {\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background: #4ade80;\n box-shadow: 0 0 6px #4ade80;\n}\n\n.mj-about__body {\n padding: 22px 24px 16px;\n overflow-y: auto;\n flex: 1;\n min-height: 0;\n}\n\n.mj-about__connection-line {\n text-align: center;\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-bottom: 14px;\n letter-spacing: 0.2px;\n}\n.mj-about__connection-name {\n color: var(--mj-text-secondary);\n font-weight: 600;\n}\n\n.mj-about__user-card {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 14px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n margin-bottom: 16px;\n}\n.mj-about__user-avatar {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n background: linear-gradient(135deg, #264FAF 0%, #0076b6 100%);\n color: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 700;\n font-size: 15px;\n flex-shrink: 0;\n object-fit: cover;\n overflow: hidden;\n}\nimg.mj-about__user-avatar { background: var(--mj-bg-surface-card); }\n.mj-about__user-avatar--icon i { font-size: 18px; }\n.mj-about__user-info { flex: 1; min-width: 0; }\n.mj-about__user-name {\n font-size: 13.5px;\n font-weight: 600;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-about__user-meta {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n margin-top: 2px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.mj-about__conn-pill {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n font-size: 11px;\n color: var(--mj-status-success);\n font-weight: 600;\n background: color-mix(in srgb, var(--mj-status-success) 12%, transparent);\n padding: 3px 8px;\n border-radius: 100px;\n flex-shrink: 0;\n}\n.mj-about__conn-pill i { font-size: 6px; }\n.mj-about__conn-pill--offline {\n color: var(--mj-status-error);\n background: color-mix(in srgb, var(--mj-status-error) 12%, transparent);\n}\n\n/* .mj-about__diag-toggle / -panel collapse chrome is now owned by <mj-accordion-panel>. */\n.mj-about__diag-section + .mj-about__diag-section { margin-top: 12px; }\n.mj-about__diag-section {\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 10px;\n padding: 12px 14px;\n}\n.mj-about__diag-section h5 {\n margin: 0 0 8px;\n font-size: 10.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.6px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.mj-about__diag-section h5 i { color: var(--mj-brand-primary); }\n.mj-about__diag-row {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n font-size: 12.5px;\n padding: 4px 0;\n min-width: 0;\n}\n.mj-about__diag-row .k { color: var(--mj-text-secondary); flex-shrink: 0; }\n.mj-about__diag-row .v {\n color: var(--mj-text-primary);\n font-family: 'SF Mono', Menlo, Consolas, monospace;\n font-size: 11.5px;\n font-weight: 500;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n}\n.mj-about__success { color: var(--mj-status-success) !important; }\n.mj-about__error { color: var(--mj-status-error) !important; }\n\n.mj-about__copy-btn {\n width: 100%;\n margin-top: 12px;\n padding: 10px;\n border: 1px dashed var(--mj-border-strong);\n background: transparent;\n border-radius: 8px;\n font-size: 12.5px;\n color: var(--mj-text-secondary);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n transition: border-color 0.15s, color 0.15s, background 0.15s;\n font-family: inherit;\n}\n.mj-about__copy-btn:hover {\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 4%, transparent);\n}\n\n.mj-about__footer {\n border-top: 1px solid var(--mj-border-subtle);\n padding: 14px 20px;\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n justify-content: center;\n flex-shrink: 0;\n}\n.mj-about__footer-link {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 7px 12px;\n border-radius: 7px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n text-decoration: none;\n transition: background 0.15s, color 0.15s;\n cursor: pointer;\n}\n.mj-about__footer-link:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-brand-primary);\n}\n\n.mj-about__credit {\n text-align: center;\n font-size: 10.5px;\n color: var(--mj-text-muted);\n padding: 0 20px 14px;\n flex-shrink: 0;\n}\n.mj-about__heart {\n color: var(--mj-status-error);\n display: inline-block;\n animation: mj-about-heart 2s ease-in-out infinite;\n}\n@media (prefers-reduced-motion: reduce) {\n .mj-about__heart { animation: none; }\n}\n@keyframes mj-about-heart {\n 50% { transform: scale(1.18); }\n}\n\n.mj-about__toast {\n position: absolute;\n top: 16px;\n left: 50%;\n transform: translateX(-50%);\n background: var(--mj-text-primary);\n color: var(--mj-bg-surface);\n padding: 10px 18px;\n border-radius: 10px;\n font-size: 13px;\n font-weight: 500;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);\n z-index: 5;\n pointer-events: none;\n animation: mj-about-toast-in 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);\n max-width: calc(100% - 32px);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n@keyframes mj-about-toast-in {\n from { transform: translateX(-50%) translateY(-30px); opacity: 0; }\n to { transform: translateX(-50%) translateY(0); opacity: 1; }\n}\n\n@media (max-width: 480px) {\n .mj-about__hero { padding: 30px 18px 22px; gap: 12px; }\n .mj-about__logo { width: 220px; }\n .mj-about__body { padding: 18px 16px 14px; }\n .mj-about__footer { padding: 12px 14px; }\n}\n `]\n})\nexport class AboutDialogComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n @Output() CloseRequested = new EventEmitter<void>();\n\n /** Optional avatar image URL — passed in from the shell where it's already resolved. */\n @Input() AvatarUrl: string | null = null;\n\n /** Optional Font Awesome icon class fallback when no image is available. */\n @Input() AvatarIconClass: string | null = null;\n\n /** Static framework version, generated at build time. */\n public readonly Version: string = PACKAGE_VERSION;\n\n public EntityCount = 0;\n public ApplicationCount = 0;\n public QueryCount = 0;\n\n public UserName = 'Unknown User';\n public UserEmail = '';\n public UserInitials = '?';\n public UserRolesText = 'None';\n public ApiUrl = '';\n public ApiUrlShort = '';\n public AuthProvider = 'Unknown';\n public Environment: string = 'production';\n public ThemeLabel = '';\n public BrowserLabel = '';\n public IsConnected = true;\n public DiagnosticsOpen = false;\n\n /** Friendly \"Connected to X\" label — display name from InstanceConfig or just the API hostname. */\n public ConnectionLabel = '';\n\n public ToastMessage = '';\n public CopyConfirmed = false;\n\n private authBase = inject(MJAuthBase);\n private themeService = inject(ThemeService);\n private connectivity = inject(ServerConnectivityService);\n private cdr = inject(ChangeDetectorRef);\n\n private connSub?: Subscription;\n private themeSub?: Subscription;\n private versionClickCount = 0;\n private versionClickResetTimer: ReturnType<typeof setTimeout> | null = null;\n private toastTimer: ReturnType<typeof setTimeout> | null = null;\n private konamiIndex = 0;\n private readonly konamiSequence = ['ArrowUp','ArrowUp','ArrowDown','ArrowDown','ArrowLeft','ArrowRight','ArrowLeft','ArrowRight','b','a'];\n private readonly konamiHandler = (event: KeyboardEvent): void => {\n const key = event.key.length === 1 ? event.key.toLowerCase() : event.key;\n if (key === this.konamiSequence[this.konamiIndex]) {\n this.konamiIndex++;\n if (this.konamiIndex === this.konamiSequence.length) {\n this.konamiIndex = 0;\n this.showToast('🚀 You found it. Now you must tell no one.', 3500);\n this.barrelRoll();\n }\n } else {\n this.konamiIndex = 0;\n }\n };\n\n public get UserMeta(): string {\n if (this.UserEmail && this.UserRolesText && this.UserRolesText !== 'None') {\n return `${this.UserEmail} · ${this.UserRolesText}`;\n }\n return this.UserEmail || this.UserRolesText;\n }\n\n public ngOnInit(): void {\n this.populate();\n this.connSub = this.connectivity.IsConnected$.subscribe(connected => {\n this.IsConnected = connected;\n this.cdr.markForCheck();\n });\n this.themeSub = this.themeService.AppliedTheme$.subscribe(() => {\n this.ThemeLabel = this.computeThemeLabel();\n this.cdr.markForCheck();\n });\n document.addEventListener('keydown', this.konamiHandler);\n }\n\n public ngOnDestroy(): void {\n this.connSub?.unsubscribe();\n this.themeSub?.unsubscribe();\n document.removeEventListener('keydown', this.konamiHandler);\n if (this.versionClickResetTimer) clearTimeout(this.versionClickResetTimer);\n if (this.toastTimer) clearTimeout(this.toastTimer);\n }\n\n private populate(): void {\n const provider = this.ProviderToUse;\n\n this.EntityCount = provider?.Entities?.length ?? 0;\n this.ApplicationCount = provider?.Applications?.length ?? 0;\n this.QueryCount = provider?.Queries?.length ?? 0;\n\n const user = provider?.CurrentUser;\n if (user) {\n this.UserName = user.Name || `${user.FirstName ?? ''} ${user.LastName ?? ''}`.trim() || 'User';\n this.UserEmail = user.Email || '';\n this.UserInitials = this.computeInitials(this.UserName);\n const roles = (user.UserRoles ?? [])\n .map((r: UserRoleInfo) => r.Role)\n .filter((n: string | null) => !!n) as string[];\n this.UserRolesText = roles.length > 0 ? roles.join(', ') : 'None';\n }\n\n if (provider instanceof GraphQLDataProvider) {\n this.ApiUrl = provider.ConfigData?.URL ?? '';\n this.ApiUrlShort = this.shortenUrl(this.ApiUrl);\n }\n\n this.AuthProvider = this.computeAuthLabel(this.authBase?.type);\n this.Environment = this.detectEnvironment();\n this.ThemeLabel = this.computeThemeLabel();\n this.BrowserLabel = this.computeBrowserLabel();\n this.IsConnected = this.connectivity.IsConnected;\n this.ConnectionLabel = this.computeConnectionLabel();\n }\n\n /**\n * Build the \"Connected to X\" label. Prefers `Instance.DisplayName` from\n * InstanceConfigEngine if set, otherwise falls back to the API hostname.\n */\n private computeConnectionLabel(): string {\n let displayName: string | undefined;\n try {\n displayName = InstanceConfigEngine.Instance.Get('Instance.DisplayName');\n } catch {\n displayName = undefined;\n }\n const host = this.ApiUrlShort?.split('/')[0] ?? '';\n if (displayName && host) return `${displayName} · ${host}`;\n return displayName || host;\n }\n\n public OnCloseClick(): void {\n this.CloseRequested.emit();\n }\n\n public OnLogoClick(): void {\n this.wiggleLogo();\n }\n\n public OnAvatarLoadError(): void {\n // Image failed to load — fall back to initials\n this.AvatarUrl = null;\n this.cdr.markForCheck();\n }\n\n public OnVersionClick(): void {\n this.versionClickCount++;\n if (this.versionClickResetTimer) clearTimeout(this.versionClickResetTimer);\n this.versionClickResetTimer = setTimeout(() => (this.versionClickCount = 0), 2000);\n\n if (this.versionClickCount === 3) this.showToast('Keep going...');\n else if (this.versionClickCount === 5) this.showToast(\"You're committed now.\");\n else if (this.versionClickCount === 7) {\n this.versionClickCount = 0;\n this.showToast('🎉 Developer mode? In THIS economy?');\n this.spinLogo();\n }\n }\n\n public async CopyDiagnostics(): Promise<void> {\n const block = [\n `MemberJunction v${this.Version}`,\n `Environment: ${this.Environment}`,\n `API: ${this.ApiUrl || '(unknown)'}`,\n `Auth: ${this.AuthProvider}`,\n `User: ${this.UserEmail || this.UserName} (${this.UserRolesText})`,\n `Theme: ${this.ThemeLabel}`,\n `Browser: ${this.BrowserLabel}`,\n `Entities loaded: ${this.EntityCount}`,\n `Applications: ${this.ApplicationCount}`,\n `Queries: ${this.QueryCount}`\n ].join('\\n');\n\n try {\n await navigator.clipboard.writeText(block);\n this.CopyConfirmed = true;\n this.showToast('Diagnostics copied to clipboard');\n setTimeout(() => {\n this.CopyConfirmed = false;\n this.cdr.markForCheck();\n }, 1800);\n } catch {\n this.showToast('Copy failed — clipboard unavailable');\n }\n }\n\n // ---------- helpers ----------\n\n private computeInitials(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return '?';\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n }\n\n private shortenUrl(url: string): string {\n if (!url) return '(not configured)';\n try {\n const u = new URL(url);\n return u.host + (u.pathname && u.pathname !== '/' ? u.pathname : '');\n } catch {\n return url;\n }\n }\n\n private computeAuthLabel(type: string | undefined): string {\n switch ((type ?? '').toLowerCase()) {\n case 'msal': return 'Microsoft Entra (MSAL)';\n case 'auth0': return 'Auth0';\n case 'okta': return 'Okta';\n case 'cognito': return 'Amazon Cognito';\n case '': return 'Unknown';\n default: return type ?? 'Unknown';\n }\n }\n\n private detectEnvironment(): string {\n const host = typeof window !== 'undefined' ? window.location.hostname : '';\n if (host === 'localhost' || host === '127.0.0.1' || host.endsWith('.local')) return 'development';\n if (host.startsWith('dev.') || host.includes('-dev.') || host.includes('.dev.')) return 'development';\n if (host.startsWith('staging.') || host.includes('-staging.') || host.includes('.staging.')) return 'staging';\n return 'production';\n }\n\n private computeThemeLabel(): string {\n const applied = this.themeService.AppliedTheme;\n const preference = this.themeService.Preference;\n const def = this.themeService.GetThemeDefinition(applied);\n const themeName = def?.Name ?? applied;\n return preference === 'system' ? `${themeName} · System` : themeName;\n }\n\n private computeBrowserLabel(): string {\n const ua = typeof navigator !== 'undefined' ? navigator.userAgent : '';\n let browser = 'Unknown';\n if (/Edg\\//.test(ua)) browser = 'Edge';\n else if (/OPR\\//.test(ua)) browser = 'Opera';\n else if (/Chrome\\//.test(ua) && !/Chromium/.test(ua)) browser = 'Chrome';\n else if (/Firefox\\//.test(ua)) browser = 'Firefox';\n else if (/Safari\\//.test(ua)) browser = 'Safari';\n\n let os = 'Unknown';\n if (/iPhone|iPad|iPod/.test(ua)) os = 'iOS';\n else if (/Android/.test(ua)) os = 'Android';\n else if (/Mac OS X|Macintosh/.test(ua)) os = 'macOS';\n else if (/Windows/.test(ua)) os = 'Windows';\n else if (/Linux/.test(ua)) os = 'Linux';\n\n return `${browser} / ${os}`;\n }\n\n private showToast(message: string, durationMs = 2400): void {\n this.ToastMessage = message;\n if (this.toastTimer) clearTimeout(this.toastTimer);\n this.toastTimer = setTimeout(() => {\n this.ToastMessage = '';\n this.cdr.markForCheck();\n }, durationMs);\n }\n\n private wiggleLogo(): void {\n const svg = document.querySelector('.mj-about__logo') as SVGElement | null;\n svg?.animate(\n [\n { transform: 'rotate(0)' },\n { transform: 'rotate(-6deg)' },\n { transform: 'rotate(6deg)' },\n { transform: 'rotate(0)' }\n ],\n { duration: 400, easing: 'ease-in-out' }\n );\n }\n\n private spinLogo(): void {\n const svg = document.querySelector('.mj-about__logo') as SVGElement | null;\n svg?.animate(\n [\n { transform: 'rotate(0) scale(1)', offset: 0 },\n { transform: 'rotate(720deg) scale(1.1)', offset: 0.85 },\n { transform: 'rotate(720deg) scale(1)', offset: 1 }\n ],\n { duration: 2800, easing: 'cubic-bezier(0.22, 1, 0.36, 1)' }\n );\n }\n\n private barrelRoll(): void {\n const dialog = document.querySelector('.mj-about') as HTMLElement | null;\n dialog?.animate(\n [{ transform: 'rotate(0)' }, { transform: 'rotate(360deg)' }],\n { duration: 900, easing: 'cubic-bezier(0.65, 0, 0.35, 1)' }\n );\n }\n}\n"]}
@@ -5,7 +5,8 @@ import * as i0 from "@angular/core";
5
5
  import * as i1 from "./command-palette.service";
6
6
  import * as i2 from "@memberjunction/ng-base-application";
7
7
  import * as i3 from "@angular/forms";
8
- import * as i4 from "@memberjunction/ng-shared-generic";
8
+ import * as i4 from "@memberjunction/ng-ui-components";
9
+ import * as i5 from "@memberjunction/ng-shared-generic";
9
10
  const _c0 = ["searchInput"];
10
11
  function CommandPaletteComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
11
12
  const _r1 = i0.ɵɵgetCurrentView();
@@ -71,18 +72,11 @@ function CommandPaletteComponent_Conditional_1_Conditional_8_Template(rf, ctx) {
71
72
  i0.ɵɵtextInterpolate1("Search \"", ctx_r1.SearchQuery, "\" across entities, documents, and content");
72
73
  } }
73
74
  function CommandPaletteComponent_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
74
- i0.ɵɵelementStart(0, "div", 9);
75
- i0.ɵɵelement(1, "i", 21);
76
- i0.ɵɵelementStart(2, "div", 22);
77
- i0.ɵɵtext(3, "No applications found");
78
- i0.ɵɵelementEnd();
79
- i0.ɵɵelementStart(4, "div", 23);
80
- i0.ɵɵtext(5, "Try a different search term or search the Knowledge Hub");
81
- i0.ɵɵelementEnd()();
75
+ i0.ɵɵelement(0, "mj-empty-state", 9);
82
76
  } }
83
77
  function CommandPaletteComponent_Conditional_1_Conditional_10_Template(rf, ctx) { if (rf & 1) {
84
78
  i0.ɵɵelementStart(0, "div", 10);
85
- i0.ɵɵelement(1, "mj-loading", 24);
79
+ i0.ɵɵelement(1, "mj-loading", 21);
86
80
  i0.ɵɵelementEnd();
87
81
  } if (rf & 2) {
88
82
  i0.ɵɵadvance();
@@ -99,7 +93,7 @@ function CommandPaletteComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
99
93
  i0.ɵɵelementStart(5, "div", 7);
100
94
  i0.ɵɵrepeaterCreate(6, CommandPaletteComponent_Conditional_1_For_7_Template, 6, 9, "div", 8, i0.ɵɵrepeaterTrackByIdentity);
101
95
  i0.ɵɵconditionalCreate(8, CommandPaletteComponent_Conditional_1_Conditional_8_Template, 12, 3);
102
- i0.ɵɵconditionalCreate(9, CommandPaletteComponent_Conditional_1_Conditional_9_Template, 6, 0, "div", 9);
96
+ i0.ɵɵconditionalCreate(9, CommandPaletteComponent_Conditional_1_Conditional_9_Template, 1, 0, "mj-empty-state", 9);
103
97
  i0.ɵɵelementEnd();
104
98
  i0.ɵɵconditionalCreate(10, CommandPaletteComponent_Conditional_1_Conditional_10_Template, 2, 1, "div", 10);
105
99
  i0.ɵɵelementEnd();
@@ -351,18 +345,18 @@ export class CommandPaletteComponent {
351
345
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.SearchInput = _t.first);
352
346
  } }, hostBindings: function CommandPaletteComponent_HostBindings(rf, ctx) { if (rf & 1) {
353
347
  i0.ɵɵlistener("keydown", function CommandPaletteComponent_keydown_HostBindingHandler($event) { return ctx.HandleKeyDown($event); }, i0.ɵɵresolveDocument);
354
- } }, outputs: { AppSelected: "AppSelected", KnowledgeSearchRequested: "KnowledgeSearchRequested" }, standalone: false, decls: 2, vars: 2, consts: [["searchInput", ""], ["role", "presentation", "aria-hidden", "true", 1, "command-palette-backdrop"], ["role", "dialog", "aria-label", "Search applications", "aria-modal", "true", 1, "command-palette-modal"], ["role", "presentation", "aria-hidden", "true", 1, "command-palette-backdrop", 3, "click"], [1, "search-container"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search applications...", "autocomplete", "off", "spellcheck", "false", "aria-label", "Search applications", 1, "search-input", 3, "ngModelChange", "input", "ngModel"], ["role", "listbox", "aria-label", "Application results", 1, "results-list"], ["role", "option", 1, "result-item", 3, "selected"], ["role", "status", "aria-live", "polite", 1, "empty-state"], ["role", "status", "aria-live", "assertive", "aria-label", "Navigating to application", 1, "loading-overlay"], ["role", "option", 1, "result-item", 3, "click"], ["aria-hidden", "true", 1, "result-icon"], [1, "result-info"], [1, "result-name"], [1, "result-description"], [1, "results-section-divider"], [1, "section-label"], ["role", "option", 1, "result-item", "result-item-action", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-brain", "result-icon", "result-icon-knowledge"], [1, "result-kbd"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "empty-icon"], [1, "empty-text"], [1, "empty-subtext"], ["size", "small", 3, "showText"]], template: function CommandPaletteComponent_Template(rf, ctx) { if (rf & 1) {
348
+ } }, outputs: { AppSelected: "AppSelected", KnowledgeSearchRequested: "KnowledgeSearchRequested" }, standalone: false, decls: 2, vars: 2, consts: [["searchInput", ""], ["role", "presentation", "aria-hidden", "true", 1, "command-palette-backdrop"], ["role", "dialog", "aria-label", "Search applications", "aria-modal", "true", 1, "command-palette-modal"], ["role", "presentation", "aria-hidden", "true", 1, "command-palette-backdrop", 3, "click"], [1, "search-container"], ["aria-hidden", "true", 1, "fa-solid", "fa-search", "search-icon"], ["type", "text", "placeholder", "Search applications...", "autocomplete", "off", "spellcheck", "false", "aria-label", "Search applications", 1, "search-input", 3, "ngModelChange", "input", "ngModel"], ["role", "listbox", "aria-label", "Application results", 1, "results-list"], ["role", "option", 1, "result-item", 3, "selected"], ["Variant", "no-results", "Size", "compact", "Icon", "fa-solid fa-magnifying-glass", "Title", "No applications found", "Message", "Try a different search term or search the Knowledge Hub", "role", "status", "aria-live", "polite"], ["role", "status", "aria-live", "assertive", "aria-label", "Navigating to application", 1, "loading-overlay"], ["role", "option", 1, "result-item", 3, "click"], ["aria-hidden", "true", 1, "result-icon"], [1, "result-info"], [1, "result-name"], [1, "result-description"], [1, "results-section-divider"], [1, "section-label"], ["role", "option", 1, "result-item", "result-item-action", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-brain", "result-icon", "result-icon-knowledge"], [1, "result-kbd"], ["size", "small", 3, "showText"]], template: function CommandPaletteComponent_Template(rf, ctx) { if (rf & 1) {
355
349
  i0.ɵɵconditionalCreate(0, CommandPaletteComponent_Conditional_0_Template, 1, 0, "div", 1);
356
350
  i0.ɵɵconditionalCreate(1, CommandPaletteComponent_Conditional_1_Template, 11, 4, "div", 2);
357
351
  } if (rf & 2) {
358
352
  i0.ɵɵconditional(ctx.IsOpen ? 0 : -1);
359
353
  i0.ɵɵadvance();
360
354
  i0.ɵɵconditional(ctx.IsOpen ? 1 : -1);
361
- } }, dependencies: [i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgModel, i4.LoadingComponent], styles: ["\n\n.command-palette-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(3px);\n z-index: 10000;\n animation: _ngcontent-%COMP%_fadeIn 0.15s ease-out;\n}\n\n\n\n.command-palette-modal[_ngcontent-%COMP%] {\n position: fixed;\n top: 20%;\n left: 50%;\n transform: translateX(-50%);\n width: 90%;\n max-width: 640px;\n max-height: 500px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n z-index: 10001;\n animation: _ngcontent-%COMP%_slideIn 0.2s ease-out;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n font-size: 18px;\n color: var(--mj-text-disabled);\n margin-right: 12px;\n}\n\n.search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n outline: none;\n font-size: 16px;\n padding: 8px 0;\n color: var(--mj-text-primary);\n background: transparent;\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n\n\n.results-list[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 400px;\n flex: 1;\n}\n\n\n\n.section-header[_ngcontent-%COMP%] {\n padding: 12px 16px 8px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n\n\n.result-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.1s ease-out;\n border-radius: 0;\n}\n\n.result-item[_ngcontent-%COMP%]:hover, \n.result-item.selected[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n.result-item.selected[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.result-item.selected[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: var(--mj-brand-primary);\n}\n\n.result-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.result-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.result-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-description[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n\n\n.results-section-divider[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 4px;\n}\n\n.section-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.result-item-action[_ngcontent-%COMP%] {\n border-top: none;\n}\n\n.result-icon-knowledge[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.result-kbd[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: inherit;\n flex-shrink: 0;\n}\n\n\n\n.empty-state[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.empty-icon[_ngcontent-%COMP%] {\n font-size: 48px;\n color: var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.empty-text[_ngcontent-%COMP%] {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin-bottom: 8px;\n}\n\n.empty-subtext[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n\n\n.loading-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 95%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n animation: _ngcontent-%COMP%_fadeIn 0.15s ease-out;\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%_slideIn {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n\n\n.results-list[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px;\n}\n\n.results-list[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.results-list[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-default);\n border-radius: 4px;\n}\n\n.results-list[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-border-strong);\n}\n\n\n\n@media (max-width: 768px) {\n .command-palette-modal[_ngcontent-%COMP%] {\n width: 95%;\n max-width: none;\n top: 10%;\n }\n\n .search-input[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .result-name[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n\n .result-description[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n}"] });
355
+ } }, dependencies: [i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgModel, i4.MJEmptyStateComponent, i5.LoadingComponent], styles: ["\n\n.command-palette-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(3px);\n z-index: 10000;\n animation: _ngcontent-%COMP%_fadeIn 0.15s ease-out;\n}\n\n\n\n.command-palette-modal[_ngcontent-%COMP%] {\n position: fixed;\n top: 20%;\n left: 50%;\n transform: translateX(-50%);\n width: 90%;\n max-width: 640px;\n max-height: 500px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n z-index: 10001;\n animation: _ngcontent-%COMP%_slideIn 0.2s ease-out;\n display: flex;\n flex-direction: column;\n}\n\n\n\n.search-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.search-icon[_ngcontent-%COMP%] {\n font-size: 18px;\n color: var(--mj-text-disabled);\n margin-right: 12px;\n}\n\n.search-input[_ngcontent-%COMP%] {\n flex: 1;\n border: none;\n outline: none;\n font-size: 16px;\n padding: 8px 0;\n color: var(--mj-text-primary);\n background: transparent;\n}\n\n.search-input[_ngcontent-%COMP%]::placeholder {\n color: var(--mj-text-disabled);\n}\n\n\n\n.results-list[_ngcontent-%COMP%] {\n overflow-y: auto;\n max-height: 400px;\n flex: 1;\n}\n\n\n\n.section-header[_ngcontent-%COMP%] {\n padding: 12px 16px 8px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n\n\n.result-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.1s ease-out;\n border-radius: 0;\n}\n\n.result-item[_ngcontent-%COMP%]:hover, \n.result-item.selected[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n\n.result-item.selected[_ngcontent-%COMP%] {\n position: relative;\n}\n\n.result-item.selected[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: var(--mj-brand-primary);\n}\n\n.result-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.result-info[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.result-name[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-description[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n\n\n.results-section-divider[_ngcontent-%COMP%] {\n padding: 6px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 4px;\n}\n\n.section-label[_ngcontent-%COMP%] {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.result-item-action[_ngcontent-%COMP%] {\n border-top: none;\n}\n\n.result-icon-knowledge[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.result-kbd[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: inherit;\n flex-shrink: 0;\n}\n\n\n\n.loading-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 95%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n animation: _ngcontent-%COMP%_fadeIn 0.15s ease-out;\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%_slideIn {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n\n\n.results-list[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 8px;\n}\n\n.results-list[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.results-list[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-default);\n border-radius: 4px;\n}\n\n.results-list[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: var(--mj-border-strong);\n}\n\n\n\n@media (max-width: 768px) {\n .command-palette-modal[_ngcontent-%COMP%] {\n width: 95%;\n max-width: none;\n top: 10%;\n }\n\n .search-input[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .result-name[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n\n .result-description[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n}"] });
362
356
  }
363
357
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(CommandPaletteComponent, [{
364
358
  type: Component,
365
- args: [{ standalone: false, selector: 'mj-command-palette', template: "<!-- Backdrop -->\n@if (IsOpen) {\n <div class=\"command-palette-backdrop\"\n (click)=\"Close()\"\n role=\"presentation\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Modal -->\n@if (IsOpen) {\n <div class=\"command-palette-modal\"\n role=\"dialog\"\n aria-label=\"Search applications\"\n aria-modal=\"true\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search search-icon\" aria-hidden=\"true\"></i>\n <input\n #searchInput\n type=\"text\"\n [(ngModel)]=\"SearchQuery\"\n (input)=\"OnSearchChange()\"\n placeholder=\"Search applications...\"\n class=\"search-input\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-label=\"Search applications\">\n </div>\n <!-- Results List -->\n <div class=\"results-list\" role=\"listbox\" aria-label=\"Application results\">\n <!-- All Apps -->\n @for (app of FilteredApps; track app; let i = $index) {\n <div\n class=\"result-item\"\n [class.selected]=\"i === SelectedIndex\"\n (click)=\"SelectApp(app)\"\n role=\"option\"\n [attr.aria-selected]=\"i === SelectedIndex\">\n <i [class]=\"app.Icon\"\n [style.color]=\"app.GetColor()\"\n class=\"result-icon\"\n aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">{{ app.Name }}</div>\n @if (app.Description) {\n <div class=\"result-description\">{{ app.Description }}</div>\n }\n </div>\n </div>\n }\n <!-- Search Knowledge Hub Action -->\n @if (SearchQuery.trim().length > 0) {\n <div class=\"results-section-divider\">\n <span class=\"section-label\">Knowledge Search</span>\n </div>\n <div\n class=\"result-item result-item-action\"\n [class.selected]=\"FilteredApps.length === SelectedIndex\"\n (click)=\"SearchKnowledgeHub()\"\n role=\"option\">\n <i class=\"fa-solid fa-brain result-icon result-icon-knowledge\" aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">Search Knowledge Hub</div>\n <div class=\"result-description\">Search \"{{ SearchQuery }}\" across entities, documents, and content</div>\n </div>\n <kbd class=\"result-kbd\">Enter</kbd>\n </div>\n }\n <!-- Empty State -->\n @if (FilteredApps.length === 0 && SearchQuery) {\n <div class=\"empty-state\"\n role=\"status\"\n aria-live=\"polite\">\n <i class=\"fa-solid fa-search empty-icon\" aria-hidden=\"true\"></i>\n <div class=\"empty-text\">No applications found</div>\n <div class=\"empty-subtext\">Try a different search term or search the Knowledge Hub</div>\n </div>\n }\n </div>\n <!-- Loading State Overlay -->\n @if (IsNavigating) {\n <div class=\"loading-overlay\" role=\"status\" aria-live=\"assertive\" aria-label=\"Navigating to application\">\n <mj-loading size=\"small\" [showText]=\"false\"></mj-loading>\n </div>\n }\n </div>\n}\n", styles: ["/* Backdrop with blur effect */\n.command-palette-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(3px);\n z-index: 10000;\n animation: fadeIn 0.15s ease-out;\n}\n\n/* Modal - centered, Notion-style */\n.command-palette-modal {\n position: fixed;\n top: 20%;\n left: 50%;\n transform: translateX(-50%);\n width: 90%;\n max-width: 640px;\n max-height: 500px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n z-index: 10001;\n animation: slideIn 0.2s ease-out;\n display: flex;\n flex-direction: column;\n}\n\n/* Search Container */\n.search-container {\n display: flex;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.search-icon {\n font-size: 18px;\n color: var(--mj-text-disabled);\n margin-right: 12px;\n}\n\n.search-input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 16px;\n padding: 8px 0;\n color: var(--mj-text-primary);\n background: transparent;\n}\n\n.search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* Results List */\n.results-list {\n overflow-y: auto;\n max-height: 400px;\n flex: 1;\n}\n\n/* Section Header (for \"Recent\") */\n.section-header {\n padding: 12px 16px 8px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n/* Result Item */\n.result-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.1s ease-out;\n border-radius: 0;\n}\n\n.result-item:hover,\n.result-item.selected {\n background: var(--mj-bg-surface-card);\n}\n\n.result-item.selected {\n position: relative;\n}\n\n.result-item.selected::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: var(--mj-brand-primary);\n}\n\n.result-icon {\n font-size: 20px;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.result-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.result-name {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-description {\n font-size: 12px;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Knowledge Search Section */\n.results-section-divider {\n padding: 6px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 4px;\n}\n\n.section-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.result-item-action {\n border-top: none;\n}\n\n.result-icon-knowledge {\n color: var(--mj-brand-primary);\n}\n\n.result-kbd {\n display: inline-block;\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: inherit;\n flex-shrink: 0;\n}\n\n/* Empty State */\n.empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 64px 24px;\n text-align: center;\n color: var(--mj-text-disabled);\n}\n\n.empty-icon {\n font-size: 48px;\n color: var(--mj-border-default);\n margin-bottom: 16px;\n}\n\n.empty-text {\n font-size: 16px;\n font-weight: 500;\n color: var(--mj-text-secondary);\n margin-bottom: 8px;\n}\n\n.empty-subtext {\n font-size: 14px;\n color: var(--mj-text-disabled);\n}\n\n/* Loading Overlay */\n.loading-overlay {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 95%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n animation: fadeIn 0.15s ease-out;\n}\n\n/* Animations */\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes slideIn {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n/* Scrollbar Styling (Webkit browsers) */\n.results-list::-webkit-scrollbar {\n width: 8px;\n}\n\n.results-list::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.results-list::-webkit-scrollbar-thumb {\n background: var(--mj-border-default);\n border-radius: 4px;\n}\n\n.results-list::-webkit-scrollbar-thumb:hover {\n background: var(--mj-border-strong);\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .command-palette-modal {\n width: 95%;\n max-width: none;\n top: 10%;\n }\n\n .search-input {\n font-size: 14px;\n }\n\n .result-name {\n font-size: 13px;\n }\n\n .result-description {\n font-size: 11px;\n }\n}\n"] }]
359
+ args: [{ standalone: false, selector: 'mj-command-palette', template: "<!-- Backdrop -->\n@if (IsOpen) {\n <div class=\"command-palette-backdrop\"\n (click)=\"Close()\"\n role=\"presentation\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Modal -->\n@if (IsOpen) {\n <div class=\"command-palette-modal\"\n role=\"dialog\"\n aria-label=\"Search applications\"\n aria-modal=\"true\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search search-icon\" aria-hidden=\"true\"></i>\n <input\n #searchInput\n type=\"text\"\n [(ngModel)]=\"SearchQuery\"\n (input)=\"OnSearchChange()\"\n placeholder=\"Search applications...\"\n class=\"search-input\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-label=\"Search applications\">\n </div>\n <!-- Results List -->\n <div class=\"results-list\" role=\"listbox\" aria-label=\"Application results\">\n <!-- All Apps -->\n @for (app of FilteredApps; track app; let i = $index) {\n <div\n class=\"result-item\"\n [class.selected]=\"i === SelectedIndex\"\n (click)=\"SelectApp(app)\"\n role=\"option\"\n [attr.aria-selected]=\"i === SelectedIndex\">\n <i [class]=\"app.Icon\"\n [style.color]=\"app.GetColor()\"\n class=\"result-icon\"\n aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">{{ app.Name }}</div>\n @if (app.Description) {\n <div class=\"result-description\">{{ app.Description }}</div>\n }\n </div>\n </div>\n }\n <!-- Search Knowledge Hub Action -->\n @if (SearchQuery.trim().length > 0) {\n <div class=\"results-section-divider\">\n <span class=\"section-label\">Knowledge Search</span>\n </div>\n <div\n class=\"result-item result-item-action\"\n [class.selected]=\"FilteredApps.length === SelectedIndex\"\n (click)=\"SearchKnowledgeHub()\"\n role=\"option\">\n <i class=\"fa-solid fa-brain result-icon result-icon-knowledge\" aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">Search Knowledge Hub</div>\n <div class=\"result-description\">Search \"{{ SearchQuery }}\" across entities, documents, and content</div>\n </div>\n <kbd class=\"result-kbd\">Enter</kbd>\n </div>\n }\n <!-- Empty State -->\n @if (FilteredApps.length === 0 && SearchQuery) {\n <mj-empty-state\n Variant=\"no-results\"\n Size=\"compact\"\n Icon=\"fa-solid fa-magnifying-glass\"\n Title=\"No applications found\"\n Message=\"Try a different search term or search the Knowledge Hub\"\n role=\"status\"\n aria-live=\"polite\" />\n }\n </div>\n <!-- Loading State Overlay -->\n @if (IsNavigating) {\n <div class=\"loading-overlay\" role=\"status\" aria-live=\"assertive\" aria-label=\"Navigating to application\">\n <mj-loading size=\"small\" [showText]=\"false\"></mj-loading>\n </div>\n }\n </div>\n}\n", styles: ["/* Backdrop with blur effect */\n.command-palette-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n backdrop-filter: blur(3px);\n z-index: 10000;\n animation: fadeIn 0.15s ease-out;\n}\n\n/* Modal - centered, Notion-style */\n.command-palette-modal {\n position: fixed;\n top: 20%;\n left: 50%;\n transform: translateX(-50%);\n width: 90%;\n max-width: 640px;\n max-height: 500px;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 16px 48px rgba(0, 0, 0, 0.2);\n overflow: hidden;\n z-index: 10001;\n animation: slideIn 0.2s ease-out;\n display: flex;\n flex-direction: column;\n}\n\n/* Search Container */\n.search-container {\n display: flex;\n align-items: center;\n padding: 16px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.search-icon {\n font-size: 18px;\n color: var(--mj-text-disabled);\n margin-right: 12px;\n}\n\n.search-input {\n flex: 1;\n border: none;\n outline: none;\n font-size: 16px;\n padding: 8px 0;\n color: var(--mj-text-primary);\n background: transparent;\n}\n\n.search-input::placeholder {\n color: var(--mj-text-disabled);\n}\n\n/* Results List */\n.results-list {\n overflow-y: auto;\n max-height: 400px;\n flex: 1;\n}\n\n/* Section Header (for \"Recent\") */\n.section-header {\n padding: 12px 16px 8px 16px;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-disabled);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n/* Result Item */\n.result-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n cursor: pointer;\n transition: background 0.1s ease-out;\n border-radius: 0;\n}\n\n.result-item:hover,\n.result-item.selected {\n background: var(--mj-bg-surface-card);\n}\n\n.result-item.selected {\n position: relative;\n}\n\n.result-item.selected::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: var(--mj-brand-primary);\n}\n\n.result-icon {\n font-size: 20px;\n width: 24px;\n text-align: center;\n flex-shrink: 0;\n}\n\n.result-info {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.result-name {\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.result-description {\n font-size: 12px;\n color: var(--mj-text-disabled);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Knowledge Search Section */\n.results-section-divider {\n padding: 6px 16px;\n border-top: 1px solid var(--mj-border-subtle);\n margin-top: 4px;\n}\n\n.section-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n}\n\n.result-item-action {\n border-top: none;\n}\n\n.result-icon-knowledge {\n color: var(--mj-brand-primary);\n}\n\n.result-kbd {\n display: inline-block;\n padding: 2px 6px;\n border-radius: 4px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: inherit;\n flex-shrink: 0;\n}\n\n/* Loading Overlay */\n.loading-overlay {\n position: absolute;\n inset: 0;\n background: color-mix(in srgb, var(--mj-bg-surface) 95%, transparent);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1;\n animation: fadeIn 0.15s ease-out;\n}\n\n/* Animations */\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes slideIn {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n/* Scrollbar Styling (Webkit browsers) */\n.results-list::-webkit-scrollbar {\n width: 8px;\n}\n\n.results-list::-webkit-scrollbar-track {\n background: transparent;\n}\n\n.results-list::-webkit-scrollbar-thumb {\n background: var(--mj-border-default);\n border-radius: 4px;\n}\n\n.results-list::-webkit-scrollbar-thumb:hover {\n background: var(--mj-border-strong);\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .command-palette-modal {\n width: 95%;\n max-width: none;\n top: 10%;\n }\n\n .search-input {\n font-size: 14px;\n }\n\n .result-name {\n font-size: 13px;\n }\n\n .result-description {\n font-size: 11px;\n }\n}\n"] }]
366
360
  }], () => [{ type: i1.CommandPaletteService }, { type: i2.ApplicationManager }, { type: i0.ChangeDetectorRef }], { SearchInput: [{
367
361
  type: ViewChild,
368
362
  args: ['searchInput']
@@ -1 +1 @@
1
- {"version":3,"file":"command-palette.component.js","sourceRoot":"","sources":["../../../src/lib/command-palette/command-palette.component.ts","../../../src/lib/command-palette/command-palette.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { CommandPaletteService } from './command-palette.service';\n\n/**\n * Command Palette Component\n *\n * Provides a Notion-style command palette for quickly searching and navigating to applications.\n * Triggered by Cmd+K (Mac) or Ctrl+/ (Windows/Linux).\n *\n * Features:\n * - Fuzzy search with relevance scoring\n * - Keyboard navigation (arrow keys, enter, escape)\n * - Loading state during navigation\n * - Empty state with helpful message\n */\n@Component({\n standalone: false,\n selector: 'mj-command-palette',\n templateUrl: './command-palette.component.html',\n styleUrls: ['./command-palette.component.css']\n})\nexport class CommandPaletteComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject<void>();\n\n @ViewChild('searchInput') SearchInput!: ElementRef<HTMLInputElement>;\n @Output() AppSelected = new EventEmitter<string>();\n @Output() KnowledgeSearchRequested = new EventEmitter<string>();\n\n IsOpen = false;\n SearchQuery = '';\n AllApps: BaseApplication[] = [];\n FilteredApps: BaseApplication[] = [];\n SelectedIndex = 0;\n IsNavigating = false;\n\n constructor(\n private service: CommandPaletteService,\n private appManager: ApplicationManager,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n // Subscribe to service's open/close state\n this.service.IsOpen.pipe(takeUntil(this.destroy$)).subscribe((isOpen) => {\n this.IsOpen = isOpen;\n\n if (isOpen) {\n this.onOpen();\n } else {\n this.onClose();\n }\n\n this.cdr.detectChanges();\n });\n\n // Subscribe to application changes\n this.appManager.AllApplications.pipe(takeUntil(this.destroy$)).subscribe((apps) => {\n this.AllApps = apps;\n this.filterAndSortApps();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Called when command palette opens\n */\n private onOpen(): void {\n // Reset state\n this.SearchQuery = '';\n this.SelectedIndex = 0;\n this.IsNavigating = false;\n\n // Filter apps (will show all initially)\n this.filterAndSortApps();\n\n // Focus search input after view updates\n setTimeout(() => {\n if (this.SearchInput) {\n this.SearchInput.nativeElement.focus();\n }\n }, 100);\n }\n\n /**\n * Called when command palette closes\n */\n private onClose(): void {\n this.SearchQuery = '';\n this.SelectedIndex = 0;\n this.IsNavigating = false;\n }\n\n /**\n * Handle search query change\n */\n OnSearchChange(): void {\n this.filterAndSortApps();\n this.SelectedIndex = 0; // Reset selection\n }\n\n /**\n * Filter and sort applications based on search query\n */\n private filterAndSortApps(): void {\n const query = this.SearchQuery.toLowerCase().trim();\n\n // If no query, show all apps\n if (!query) {\n this.FilteredApps = [...this.AllApps];\n return;\n }\n\n // Score all apps\n const scored = this.AllApps.map(app => ({\n app,\n score: this.calculateMatchScore(app, query)\n }));\n\n // Filter to only matches (score > 0)\n const matches = scored.filter(item => item.score > 0);\n\n // Sort by score (descending)\n matches.sort((a, b) => b.score - a.score);\n\n // Extract apps\n this.FilteredApps = matches.map(item => item.app);\n }\n\n /**\n * Calculate match score for fuzzy search\n *\n * Scoring:\n * - Exact match: 1000 points\n * - Starts with: 500 points\n * - Contains: 100 points\n * - Description match: 50 points\n * - Initials match: 25 points (e.g., \"de\" matches \"Data Explorer\")\n */\n private calculateMatchScore(app: BaseApplication, query: string): number {\n const name = app.Name.toLowerCase();\n const desc = (app.Description || '').toLowerCase();\n\n // Exact match (highest priority)\n if (name === query) return 1000;\n\n // Starts with query (very high priority)\n if (name.startsWith(query)) return 500;\n\n // Contains query in name (high priority)\n if (name.includes(query)) return 100;\n\n // Description match (medium priority)\n if (desc.includes(query)) return 50;\n\n // Fuzzy match - initials (e.g., \"de\" matches \"Data Explorer\")\n const initials = name\n .split(' ')\n .map(word => word[0] || '')\n .join('')\n .toLowerCase();\n if (initials.includes(query)) return 25;\n\n return 0; // No match\n }\n\n /**\n * Select an application and emit event for shell to handle navigation\n */\n SelectApp(app: BaseApplication): void {\n if (this.IsNavigating) return;\n // Close the palette first\n this.service.Close();\n // Emit event for shell to handle navigation (same pattern as app-switcher)\n this.AppSelected.emit(app.ID);\n }\n\n /**\n * Navigate to Knowledge Hub search with the current query.\n */\n SearchKnowledgeHub(): void {\n if (this.IsNavigating) return;\n const query = this.SearchQuery.trim();\n this.service.Close();\n this.KnowledgeSearchRequested.emit(query);\n }\n\n /**\n * Close the command palette\n */\n Close(): void {\n this.service.Close();\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('document:keydown', ['$event'])\n HandleKeyDown(event: KeyboardEvent): void {\n if (!this.IsOpen) return;\n\n // Skip if user is typing in input (except for navigation keys)\n const target = event.target as HTMLElement;\n const navigationKeys = ['Escape', 'Enter', 'ArrowUp', 'ArrowDown'];\n if (target.tagName === 'INPUT' && !navigationKeys.includes(event.key)) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n // Allow selecting up to FilteredApps.length (the Knowledge Hub action is at that index)\n this.SelectedIndex = Math.min(this.SelectedIndex + 1, this.maxSelectableIndex());\n this.scrollToSelected();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.SelectedIndex = Math.max(this.SelectedIndex - 1, 0);\n this.scrollToSelected();\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.SelectedIndex < this.FilteredApps.length && this.FilteredApps[this.SelectedIndex]) {\n this.SelectApp(this.FilteredApps[this.SelectedIndex]);\n } else if (this.SearchQuery.trim().length > 0 && this.SelectedIndex === this.FilteredApps.length) {\n // Knowledge Hub search action is selected\n this.SearchKnowledgeHub();\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.service.Close();\n break;\n }\n }\n\n /**\n * Get the maximum selectable index (apps + knowledge search action if query present)\n */\n private maxSelectableIndex(): number {\n const hasKnowledgeAction = this.SearchQuery.trim().length > 0;\n return hasKnowledgeAction ? this.FilteredApps.length : this.FilteredApps.length - 1;\n }\n\n /**\n * Ensure selected item is visible in results list\n */\n private scrollToSelected(): void {\n setTimeout(() => {\n const selected = document.querySelector('.result-item.selected');\n if (selected) {\n selected.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, 0);\n }\n}\n","<!-- Backdrop -->\n@if (IsOpen) {\n <div class=\"command-palette-backdrop\"\n (click)=\"Close()\"\n role=\"presentation\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Modal -->\n@if (IsOpen) {\n <div class=\"command-palette-modal\"\n role=\"dialog\"\n aria-label=\"Search applications\"\n aria-modal=\"true\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search search-icon\" aria-hidden=\"true\"></i>\n <input\n #searchInput\n type=\"text\"\n [(ngModel)]=\"SearchQuery\"\n (input)=\"OnSearchChange()\"\n placeholder=\"Search applications...\"\n class=\"search-input\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-label=\"Search applications\">\n </div>\n <!-- Results List -->\n <div class=\"results-list\" role=\"listbox\" aria-label=\"Application results\">\n <!-- All Apps -->\n @for (app of FilteredApps; track app; let i = $index) {\n <div\n class=\"result-item\"\n [class.selected]=\"i === SelectedIndex\"\n (click)=\"SelectApp(app)\"\n role=\"option\"\n [attr.aria-selected]=\"i === SelectedIndex\">\n <i [class]=\"app.Icon\"\n [style.color]=\"app.GetColor()\"\n class=\"result-icon\"\n aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">{{ app.Name }}</div>\n @if (app.Description) {\n <div class=\"result-description\">{{ app.Description }}</div>\n }\n </div>\n </div>\n }\n <!-- Search Knowledge Hub Action -->\n @if (SearchQuery.trim().length > 0) {\n <div class=\"results-section-divider\">\n <span class=\"section-label\">Knowledge Search</span>\n </div>\n <div\n class=\"result-item result-item-action\"\n [class.selected]=\"FilteredApps.length === SelectedIndex\"\n (click)=\"SearchKnowledgeHub()\"\n role=\"option\">\n <i class=\"fa-solid fa-brain result-icon result-icon-knowledge\" aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">Search Knowledge Hub</div>\n <div class=\"result-description\">Search \"{{ SearchQuery }}\" across entities, documents, and content</div>\n </div>\n <kbd class=\"result-kbd\">Enter</kbd>\n </div>\n }\n <!-- Empty State -->\n @if (FilteredApps.length === 0 && SearchQuery) {\n <div class=\"empty-state\"\n role=\"status\"\n aria-live=\"polite\">\n <i class=\"fa-solid fa-search empty-icon\" aria-hidden=\"true\"></i>\n <div class=\"empty-text\">No applications found</div>\n <div class=\"empty-subtext\">Try a different search term or search the Knowledge Hub</div>\n </div>\n }\n </div>\n <!-- Loading State Overlay -->\n @if (IsNavigating) {\n <div class=\"loading-overlay\" role=\"status\" aria-live=\"assertive\" aria-label=\"Navigating to application\">\n <mj-loading size=\"small\" [showText]=\"false\"></mj-loading>\n </div>\n }\n </div>\n}\n"]}
1
+ {"version":3,"file":"command-palette.component.js","sourceRoot":"","sources":["../../../src/lib/command-palette/command-palette.component.ts","../../../src/lib/command-palette/command-palette.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, OnInit, OnDestroy, ViewChild, ElementRef, HostListener, ChangeDetectorRef, Output, EventEmitter } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\nimport { ApplicationManager, BaseApplication } from '@memberjunction/ng-base-application';\nimport { CommandPaletteService } from './command-palette.service';\n\n/**\n * Command Palette Component\n *\n * Provides a Notion-style command palette for quickly searching and navigating to applications.\n * Triggered by Cmd+K (Mac) or Ctrl+/ (Windows/Linux).\n *\n * Features:\n * - Fuzzy search with relevance scoring\n * - Keyboard navigation (arrow keys, enter, escape)\n * - Loading state during navigation\n * - Empty state with helpful message\n */\n@Component({\n standalone: false,\n selector: 'mj-command-palette',\n templateUrl: './command-palette.component.html',\n styleUrls: ['./command-palette.component.css']\n})\nexport class CommandPaletteComponent implements OnInit, OnDestroy {\n private destroy$ = new Subject<void>();\n\n @ViewChild('searchInput') SearchInput!: ElementRef<HTMLInputElement>;\n @Output() AppSelected = new EventEmitter<string>();\n @Output() KnowledgeSearchRequested = new EventEmitter<string>();\n\n IsOpen = false;\n SearchQuery = '';\n AllApps: BaseApplication[] = [];\n FilteredApps: BaseApplication[] = [];\n SelectedIndex = 0;\n IsNavigating = false;\n\n constructor(\n private service: CommandPaletteService,\n private appManager: ApplicationManager,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n // Subscribe to service's open/close state\n this.service.IsOpen.pipe(takeUntil(this.destroy$)).subscribe((isOpen) => {\n this.IsOpen = isOpen;\n\n if (isOpen) {\n this.onOpen();\n } else {\n this.onClose();\n }\n\n this.cdr.detectChanges();\n });\n\n // Subscribe to application changes\n this.appManager.AllApplications.pipe(takeUntil(this.destroy$)).subscribe((apps) => {\n this.AllApps = apps;\n this.filterAndSortApps();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Called when command palette opens\n */\n private onOpen(): void {\n // Reset state\n this.SearchQuery = '';\n this.SelectedIndex = 0;\n this.IsNavigating = false;\n\n // Filter apps (will show all initially)\n this.filterAndSortApps();\n\n // Focus search input after view updates\n setTimeout(() => {\n if (this.SearchInput) {\n this.SearchInput.nativeElement.focus();\n }\n }, 100);\n }\n\n /**\n * Called when command palette closes\n */\n private onClose(): void {\n this.SearchQuery = '';\n this.SelectedIndex = 0;\n this.IsNavigating = false;\n }\n\n /**\n * Handle search query change\n */\n OnSearchChange(): void {\n this.filterAndSortApps();\n this.SelectedIndex = 0; // Reset selection\n }\n\n /**\n * Filter and sort applications based on search query\n */\n private filterAndSortApps(): void {\n const query = this.SearchQuery.toLowerCase().trim();\n\n // If no query, show all apps\n if (!query) {\n this.FilteredApps = [...this.AllApps];\n return;\n }\n\n // Score all apps\n const scored = this.AllApps.map(app => ({\n app,\n score: this.calculateMatchScore(app, query)\n }));\n\n // Filter to only matches (score > 0)\n const matches = scored.filter(item => item.score > 0);\n\n // Sort by score (descending)\n matches.sort((a, b) => b.score - a.score);\n\n // Extract apps\n this.FilteredApps = matches.map(item => item.app);\n }\n\n /**\n * Calculate match score for fuzzy search\n *\n * Scoring:\n * - Exact match: 1000 points\n * - Starts with: 500 points\n * - Contains: 100 points\n * - Description match: 50 points\n * - Initials match: 25 points (e.g., \"de\" matches \"Data Explorer\")\n */\n private calculateMatchScore(app: BaseApplication, query: string): number {\n const name = app.Name.toLowerCase();\n const desc = (app.Description || '').toLowerCase();\n\n // Exact match (highest priority)\n if (name === query) return 1000;\n\n // Starts with query (very high priority)\n if (name.startsWith(query)) return 500;\n\n // Contains query in name (high priority)\n if (name.includes(query)) return 100;\n\n // Description match (medium priority)\n if (desc.includes(query)) return 50;\n\n // Fuzzy match - initials (e.g., \"de\" matches \"Data Explorer\")\n const initials = name\n .split(' ')\n .map(word => word[0] || '')\n .join('')\n .toLowerCase();\n if (initials.includes(query)) return 25;\n\n return 0; // No match\n }\n\n /**\n * Select an application and emit event for shell to handle navigation\n */\n SelectApp(app: BaseApplication): void {\n if (this.IsNavigating) return;\n // Close the palette first\n this.service.Close();\n // Emit event for shell to handle navigation (same pattern as app-switcher)\n this.AppSelected.emit(app.ID);\n }\n\n /**\n * Navigate to Knowledge Hub search with the current query.\n */\n SearchKnowledgeHub(): void {\n if (this.IsNavigating) return;\n const query = this.SearchQuery.trim();\n this.service.Close();\n this.KnowledgeSearchRequested.emit(query);\n }\n\n /**\n * Close the command palette\n */\n Close(): void {\n this.service.Close();\n }\n\n /**\n * Handle keyboard navigation\n */\n @HostListener('document:keydown', ['$event'])\n HandleKeyDown(event: KeyboardEvent): void {\n if (!this.IsOpen) return;\n\n // Skip if user is typing in input (except for navigation keys)\n const target = event.target as HTMLElement;\n const navigationKeys = ['Escape', 'Enter', 'ArrowUp', 'ArrowDown'];\n if (target.tagName === 'INPUT' && !navigationKeys.includes(event.key)) {\n return;\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n // Allow selecting up to FilteredApps.length (the Knowledge Hub action is at that index)\n this.SelectedIndex = Math.min(this.SelectedIndex + 1, this.maxSelectableIndex());\n this.scrollToSelected();\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n this.SelectedIndex = Math.max(this.SelectedIndex - 1, 0);\n this.scrollToSelected();\n break;\n\n case 'Enter':\n event.preventDefault();\n if (this.SelectedIndex < this.FilteredApps.length && this.FilteredApps[this.SelectedIndex]) {\n this.SelectApp(this.FilteredApps[this.SelectedIndex]);\n } else if (this.SearchQuery.trim().length > 0 && this.SelectedIndex === this.FilteredApps.length) {\n // Knowledge Hub search action is selected\n this.SearchKnowledgeHub();\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n this.service.Close();\n break;\n }\n }\n\n /**\n * Get the maximum selectable index (apps + knowledge search action if query present)\n */\n private maxSelectableIndex(): number {\n const hasKnowledgeAction = this.SearchQuery.trim().length > 0;\n return hasKnowledgeAction ? this.FilteredApps.length : this.FilteredApps.length - 1;\n }\n\n /**\n * Ensure selected item is visible in results list\n */\n private scrollToSelected(): void {\n setTimeout(() => {\n const selected = document.querySelector('.result-item.selected');\n if (selected) {\n selected.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n }\n }, 0);\n }\n}\n","<!-- Backdrop -->\n@if (IsOpen) {\n <div class=\"command-palette-backdrop\"\n (click)=\"Close()\"\n role=\"presentation\"\n aria-hidden=\"true\">\n </div>\n}\n\n<!-- Modal -->\n@if (IsOpen) {\n <div class=\"command-palette-modal\"\n role=\"dialog\"\n aria-label=\"Search applications\"\n aria-modal=\"true\">\n <!-- Search Input -->\n <div class=\"search-container\">\n <i class=\"fa-solid fa-search search-icon\" aria-hidden=\"true\"></i>\n <input\n #searchInput\n type=\"text\"\n [(ngModel)]=\"SearchQuery\"\n (input)=\"OnSearchChange()\"\n placeholder=\"Search applications...\"\n class=\"search-input\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n aria-label=\"Search applications\">\n </div>\n <!-- Results List -->\n <div class=\"results-list\" role=\"listbox\" aria-label=\"Application results\">\n <!-- All Apps -->\n @for (app of FilteredApps; track app; let i = $index) {\n <div\n class=\"result-item\"\n [class.selected]=\"i === SelectedIndex\"\n (click)=\"SelectApp(app)\"\n role=\"option\"\n [attr.aria-selected]=\"i === SelectedIndex\">\n <i [class]=\"app.Icon\"\n [style.color]=\"app.GetColor()\"\n class=\"result-icon\"\n aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">{{ app.Name }}</div>\n @if (app.Description) {\n <div class=\"result-description\">{{ app.Description }}</div>\n }\n </div>\n </div>\n }\n <!-- Search Knowledge Hub Action -->\n @if (SearchQuery.trim().length > 0) {\n <div class=\"results-section-divider\">\n <span class=\"section-label\">Knowledge Search</span>\n </div>\n <div\n class=\"result-item result-item-action\"\n [class.selected]=\"FilteredApps.length === SelectedIndex\"\n (click)=\"SearchKnowledgeHub()\"\n role=\"option\">\n <i class=\"fa-solid fa-brain result-icon result-icon-knowledge\" aria-hidden=\"true\"></i>\n <div class=\"result-info\">\n <div class=\"result-name\">Search Knowledge Hub</div>\n <div class=\"result-description\">Search \"{{ SearchQuery }}\" across entities, documents, and content</div>\n </div>\n <kbd class=\"result-kbd\">Enter</kbd>\n </div>\n }\n <!-- Empty State -->\n @if (FilteredApps.length === 0 && SearchQuery) {\n <mj-empty-state\n Variant=\"no-results\"\n Size=\"compact\"\n Icon=\"fa-solid fa-magnifying-glass\"\n Title=\"No applications found\"\n Message=\"Try a different search term or search the Knowledge Hub\"\n role=\"status\"\n aria-live=\"polite\" />\n }\n </div>\n <!-- Loading State Overlay -->\n @if (IsNavigating) {\n <div class=\"loading-overlay\" role=\"status\" aria-live=\"assertive\" aria-label=\"Navigating to application\">\n <mj-loading size=\"small\" [showText]=\"false\"></mj-loading>\n </div>\n }\n </div>\n}\n"]}