@memberjunction/ng-dashboards 5.47.0 → 5.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +15 -4
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +45 -35
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.d.ts +7 -0
- package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +2 -2
- package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.d.ts +4 -0
- package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-browse-resource.component.js +39 -30
- package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-my-lists-resource.component.js +14 -12
- package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
- package/dist/Lists/components/lists-operations-resource.component.js +6 -1
- package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
- package/dist/Lists/services/list-set-operations.service.d.ts +11 -0
- package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
- package/dist/Lists/services/list-set-operations.service.js +56 -14
- package/dist/Lists/services/list-set-operations.service.js.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +7 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
- package/dist/PredictiveStudio/components/ps-pipelines.component.js +11 -4
- package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
- package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
- package/dist/Testing/components/testing-runs.component.js +35 -25
- package/dist/Testing/components/testing-runs.component.js.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.d.ts +5 -0
- package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
- package/dist/Testing/services/testing-instrumentation.service.js +8 -2
- package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
- package/dist/ThemeStudio/theme-agent-context.d.ts +64 -0
- package/dist/ThemeStudio/theme-agent-context.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-agent-context.js +129 -0
- package/dist/ThemeStudio/theme-agent-context.js.map +1 -0
- package/dist/ThemeStudio/theme-manager-dashboard.component.d.ts +62 -0
- package/dist/ThemeStudio/theme-manager-dashboard.component.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-manager-dashboard.component.js +464 -0
- package/dist/ThemeStudio/theme-manager-dashboard.component.js.map +1 -0
- package/dist/ThemeStudio/theme-manager-resource.component.d.ts +31 -0
- package/dist/ThemeStudio/theme-manager-resource.component.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-manager-resource.component.js +97 -0
- package/dist/ThemeStudio/theme-manager-resource.component.js.map +1 -0
- package/dist/ThemeStudio/theme-studio-dashboard.component.d.ts +351 -0
- package/dist/ThemeStudio/theme-studio-dashboard.component.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-studio-dashboard.component.js +2931 -0
- package/dist/ThemeStudio/theme-studio-dashboard.component.js.map +1 -0
- package/dist/ThemeStudio/theme-studio-resource.component.d.ts +28 -0
- package/dist/ThemeStudio/theme-studio-resource.component.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-studio-resource.component.js +96 -0
- package/dist/ThemeStudio/theme-studio-resource.component.js.map +1 -0
- package/dist/ThemeStudio/theme-studio.constants.d.ts +79 -0
- package/dist/ThemeStudio/theme-studio.constants.d.ts.map +1 -0
- package/dist/ThemeStudio/theme-studio.constants.js +217 -0
- package/dist/ThemeStudio/theme-studio.constants.js.map +1 -0
- package/dist/core-dashboards.module.d.ts +56 -52
- package/dist/core-dashboards.module.d.ts.map +1 -1
- package/dist/core-dashboards.module.js +24 -1
- package/dist/core-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +4 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +4 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +63 -60
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-manager-dashboard.component.js","sourceRoot":"","sources":["../../src/ThemeStudio/theme-manager-dashboard.component.ts","../../src/ThemeStudio/theme-manager-dashboard.component.html"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Theme Manager dashboard (org-theming Phase 5) — the \"Manage Themes\"\n * top-level tab of the Theme Studio application. A table of saved brand themes with\n * govern actions: set default (applied live), duplicate, delete, and open/edit. The\n * visual authoring happens in the sibling \"Theme Studio\" tab.\n *\n * 🚨 SAFETY BOUNDARY 🚨 (see theme-agent-context.ts for the shared statement)\n * Agent tools here are read / user-scoped only: refresh, apply-to-me, star/unstar.\n * Set-org-default, duplicate, delete, and edit stay human-driven in the UI —\n * delete additionally sits behind MJConfirmService.ConfirmDelete.\n * @module ThemeStudio\n */\n\nimport { ChangeDetectorRef, Component, OnDestroy } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { CompositeKey, RunView } from '@memberjunction/core';\nimport { RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { BaseDashboard, ThemeService } from '@memberjunction/ng-shared';\nimport { MJThemeEntity, ResourceData } from '@memberjunction/core-entities';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { MJConfirmService } from '@memberjunction/ng-ui-components';\nimport { MJ_DEFAULT_SEEDS, ThemeSeeds } from '@memberjunction/theme-engine';\nimport { isBuiltInTheme } from './theme-studio.constants';\nimport { buildThemeManagerAgentContext, resolveThemeByIDOrName, ThemeSummaryRow } from './theme-agent-context';\n\ninterface ThemeRow {\n id: string;\n name: string;\n isDefault: boolean;\n status: string;\n swatches: string[];\n builtIn: boolean;\n starred: boolean;\n}\n\n@RegisterClass(BaseDashboard, 'ThemeManagerDashboard')\n@Component({\n standalone: false,\n selector: 'mj-theme-manager-dashboard',\n templateUrl: './theme-manager-dashboard.component.html',\n styleUrls: ['./theme-manager-dashboard.component.css'],\n})\nexport class ThemeManagerDashboardComponent extends BaseDashboard implements OnDestroy {\n public themes: ThemeRow[] = [];\n private themesChangedSub?: Subscription;\n\n constructor(\n private cdRef: ChangeDetectorRef,\n private themeService: ThemeService,\n private confirmService: MJConfirmService\n ) {\n super();\n }\n\n override ngOnDestroy(): void {\n this.themesChangedSub?.unsubscribe();\n super.ngOnDestroy();\n }\n\n async GetResourceDisplayName(_data: ResourceData): Promise<string> {\n return 'Manage Themes';\n }\n\n /** Whether this theme is the brand currently applied to the session (case-insensitive\n * GUID compare — RunView ids and entity ids can differ in case). */\n public isApplied(id: string): boolean {\n const active = this.themeService.BrandOverlayId;\n return !!active && UUIDsEqual(id, active);\n }\n\n protected initDashboard(): void {\n // Reload when a theme is created/renamed/etc. in the Theme Studio tab (or elsewhere).\n this.themesChangedSub = this.themeService.ThemesChanged$.subscribe(() => {\n this.loadData();\n });\n this.registerAgentTools();\n }\n\n protected async loadData(): Promise<void> {\n try {\n const rv = new RunView();\n const result = await rv.RunView<MJThemeEntity>({\n EntityName: 'MJ: Themes',\n OrderBy: 'Name',\n ResultType: 'entity_object',\n });\n this.themes = (result.Success ? result.Results : []).map((t) => ({\n id: t.ID,\n name: t.Name,\n isDefault: t.IsDefault,\n status: t.Status,\n swatches: this.swatchesFor(t.Seeds),\n builtIn: isBuiltInTheme(t.ID),\n starred: this.themeService.IsStarred(t.ID),\n }));\n } catch {\n this.themes = [];\n }\n this.publishAgentContext();\n this.cdRef.detectChanges();\n }\n\n private swatchesFor(seedsJson: string): string[] {\n try {\n const s = JSON.parse(seedsJson) as ThemeSeeds;\n return [s.primary, s.accent ?? s.primary, s.tertiary ?? s.accent ?? s.primary];\n } catch {\n return ['#0076b6', '#38a9d9', '#8b5cf6'];\n }\n }\n\n /** Star / unstar a theme (adds it to the user's starred set for the user-menu modal). */\n public async toggleStar(row: ThemeRow): Promise<void> {\n row.starred = await this.themeService.ToggleStar(row.id);\n this.publishAgentContext();\n this.cdRef.detectChanges();\n }\n\n /** Open the theme record (edit) — the shell handles this via the resource wrapper. */\n public edit(row: ThemeRow): void {\n if (row.builtIn) {\n this.notify('The built-in theme is read-only — duplicate it to customize.', 'info');\n return;\n }\n this.OpenEntityRecord.emit({ EntityName: 'MJ: Themes', RecordPKey: CompositeKey.FromID(row.id) });\n }\n\n /** Apply this theme to the current user's workspace now and remember it as their choice. */\n public async applyToMe(row: ThemeRow): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJThemeEntity>('MJ: Themes');\n if (!(await entity.Load(row.id))) return;\n this.themeService.RegisterBrandTheme({ id: entity.ID, name: entity.Name, seeds: entity.Seeds, overrides: entity.Overrides, customCss: entity.CustomCSS });\n await this.themeService.ApplyBrandOverlay(entity.ID);\n await this.themeService.SetSelectedBrandTheme(entity.ID);\n this.publishAgentContext();\n this.notify(`Applied \"${entity.Name}\" to your workspace.`);\n } catch (e) {\n this.notify(`Could not apply: ${e instanceof Error ? e.message : String(e)}`, 'error');\n } finally {\n this.cdRef.detectChanges();\n }\n }\n\n /** Make this the single org-wide default and apply it to the running app immediately. */\n public async setDefault(row: ThemeRow): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const rv = new RunView();\n const others = await rv.RunView<MJThemeEntity>({\n EntityName: 'MJ: Themes',\n ExtraFilter: `IsDefault = 1 AND ID <> '${row.id}'`,\n ResultType: 'entity_object',\n });\n if (others.Success) {\n for (const other of others.Results) {\n other.IsDefault = false;\n if (!(await other.Save())) {\n this.notify(`Could not clear the previous default \"${other.Name}\": ${other.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error');\n return;\n }\n }\n }\n const entity = await md.GetEntityObject<MJThemeEntity>('MJ: Themes');\n if (!(await entity.Load(row.id))) return;\n entity.IsDefault = true;\n if (!(await entity.Save())) {\n this.notify(`Could not set default: ${entity.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error');\n return;\n }\n let seeds: ThemeSeeds;\n try {\n seeds = { ...MJ_DEFAULT_SEEDS, ...(JSON.parse(entity.Seeds) as ThemeSeeds) };\n } catch {\n seeds = { ...MJ_DEFAULT_SEEDS };\n }\n this.themeService.RegisterBrandTheme({ id: entity.ID, name: entity.Name, seeds, overrides: entity.Overrides, customCss: entity.CustomCSS });\n await this.themeService.ApplyBrandOverlay(entity.ID);\n await this.loadData();\n this.themeService.NotifyThemesChanged();\n this.notify(`\"${entity.Name}\" is now the default and is applied.`);\n } catch (e) {\n this.notify(`Could not set default: ${e instanceof Error ? e.message : String(e)}`, 'error');\n } finally {\n this.cdRef.detectChanges();\n }\n }\n\n public async duplicate(row: ThemeRow): Promise<void> {\n try {\n const md = this.ProviderToUse;\n const src = await md.GetEntityObject<MJThemeEntity>('MJ: Themes');\n if (!(await src.Load(row.id))) return;\n const copy = await md.GetEntityObject<MJThemeEntity>('MJ: Themes');\n copy.NewRecord();\n copy.Name = this.uniqueName(`${src.Name} Copy`);\n copy.Description = src.Description;\n copy.Seeds = src.Seeds;\n copy.Status = 'Active';\n if (await copy.Save()) {\n await this.loadData();\n this.themeService.NotifyThemesChanged();\n this.notify(`Duplicated as \"${copy.Name}\".`);\n } else {\n this.notify(`Duplicate failed: ${copy.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error');\n }\n } catch (e) {\n this.notify(`Duplicate failed: ${e instanceof Error ? e.message : String(e)}`, 'error');\n } finally {\n this.cdRef.detectChanges();\n }\n }\n\n /** Delete a theme after an explicit confirmation (MJConfirmService owns the dialog). */\n public async remove(row: ThemeRow): Promise<void> {\n if (row.builtIn) {\n this.notify('The built-in theme cannot be deleted.', 'info');\n return;\n }\n const confirmed = await this.confirmService.ConfirmDelete({\n title: 'Delete theme',\n message: `Delete \"${row.name}\"? This can't be undone.`,\n });\n if (!confirmed) {\n return;\n }\n try {\n const md = this.ProviderToUse;\n const entity = await md.GetEntityObject<MJThemeEntity>('MJ: Themes');\n if (!(await entity.Load(row.id))) return;\n if (await entity.Delete()) {\n await this.loadData();\n this.themeService.NotifyThemesChanged();\n this.notify(`Deleted \"${row.name}\".`);\n } else {\n this.notify(`Delete failed: ${entity.LatestResult?.CompleteMessage ?? 'unknown error'}`, 'error');\n }\n } catch (e) {\n this.notify(`Delete failed: ${e instanceof Error ? e.message : String(e)}`, 'error');\n } finally {\n this.cdRef.detectChanges();\n }\n }\n\n private uniqueName(base: string): string {\n const taken = new Set(this.themes.map((t) => t.name.trim().toLowerCase()));\n if (!taken.has(base.trim().toLowerCase())) return base;\n for (let i = 2; i < 1000; i++) {\n const candidate = `${base} ${i}`;\n if (!taken.has(candidate.toLowerCase())) return candidate;\n }\n return `${base} ${Date.now()}`;\n }\n\n private notify(message: string, style: 'success' | 'error' | 'info' = 'success'): void {\n MJNotificationService.Instance.CreateSimpleNotification(message, style, 2500);\n }\n\n // ---------------------------------------------------------------\n // Agent context + tools (read / user-scoped only — see SAFETY BOUNDARY)\n // ---------------------------------------------------------------\n\n private summaryRows(): ThemeSummaryRow[] {\n return this.themes.map((t) => ({ ID: t.id, Name: t.name, Status: t.status, IsDefault: t.isDefault, BuiltIn: t.builtIn }));\n }\n\n private publishAgentContext(): void {\n this.navigationService.SetAgentContext(\n this,\n buildThemeManagerAgentContext({\n Themes: this.summaryRows(),\n AppliedThemeID: this.themeService.BrandOverlayId,\n StarredThemeIDs: this.themeService.GetStarredThemeIds(),\n })\n );\n }\n\n private registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'RefreshThemes',\n Description: 'Reload the saved brand themes list from the server.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n await this.loadData();\n return { Success: true, Data: { TotalThemeCount: this.themes.length } };\n },\n },\n {\n Name: 'ApplyTheme',\n Description: \"Apply a saved brand theme to the CURRENT USER's workspace (a per-user preference — not the org default), referenced by ID or name (partial, case-insensitive match accepted).\",\n ParameterSchema: {\n type: 'object',\n properties: { theme: { type: 'string', description: 'The theme ID or name.' } },\n required: ['theme'],\n },\n Handler: async (params) => {\n const resolved = resolveThemeByIDOrName(this.summaryRows(), params['theme']);\n if (!resolved.ok) {\n return { Success: false, ErrorMessage: resolved.error };\n }\n const row = this.themes.find((t) => UUIDsEqual(t.id, resolved.value.ID));\n if (!row) {\n return { Success: false, ErrorMessage: 'Theme list changed — refresh and retry.' };\n }\n await this.applyToMe(row);\n return { Success: true, Data: { AppliedThemeName: resolved.value.Name } };\n },\n },\n {\n Name: 'StarTheme',\n Description: 'Star or unstar a theme for the current user (starred themes appear in the user menu), referenced by ID or name. Toggles when no explicit starred value is given.',\n ParameterSchema: {\n type: 'object',\n properties: {\n theme: { type: 'string', description: 'The theme ID or name.' },\n starred: { type: 'boolean', description: 'true to star, false to unstar; omit to toggle.' },\n },\n required: ['theme'],\n },\n Handler: async (params) => {\n const resolved = resolveThemeByIDOrName(this.summaryRows(), params['theme']);\n if (!resolved.ok) {\n return { Success: false, ErrorMessage: resolved.error };\n }\n const row = this.themes.find((t) => UUIDsEqual(t.id, resolved.value.ID));\n if (!row) {\n return { Success: false, ErrorMessage: 'Theme list changed — refresh and retry.' };\n }\n const wantStarred = typeof params['starred'] === 'boolean' ? params['starred'] : !row.starred;\n if (wantStarred !== row.starred) {\n await this.toggleStar(row);\n }\n return { Success: true, Data: { ThemeName: row.name, Starred: row.starred } };\n },\n },\n ]);\n }\n}\n","<mj-page-layout>\n <mj-page-header Title=\"Manage Themes\" Icon=\"fa-solid fa-swatchbook\"\n Subtitle=\"Your organization's saved brand themes\"></mj-page-header>\n\n <mj-page-body>\n @if (!themes.length) {\n <mj-empty-state Icon=\"fa-solid fa-swatchbook\" Title=\"No themes yet\"\n Message=\"Create one in the Theme Studio tab.\"></mj-empty-state>\n } @else {\n <table class=\"tm-table\">\n <thead>\n <tr><th>Theme</th><th>Status</th><th>Default</th><th class=\"r\">Actions</th></tr>\n </thead>\n <tbody>\n @for (t of themes; track t.id) {\n <tr>\n <td class=\"name-cell\">\n <button type=\"button\" class=\"star-btn\" [class.on]=\"t.starred\"\n [title]=\"t.starred ? 'Unstar' : 'Star (adds to your user menu)'\" (click)=\"toggleStar(t)\">\n <i [class]=\"t.starred ? 'fa-solid fa-star' : 'fa-regular fa-star'\"></i>\n </button>\n <span class=\"sw\">\n @for (c of t.swatches; track $index) { <i [style.background]=\"c\"></i> }\n </span>\n <b>{{ t.name }}</b>\n @if (t.builtIn) { <span class=\"builtin-badge\"><i class=\"fa-solid fa-lock\"></i> Built-in</span> }\n </td>\n <td><span class=\"status-pill\" [class.inactive]=\"t.status !== 'Active'\">{{ t.status }}</span></td>\n <td>\n @if (t.isDefault) {\n <span class=\"badge\">DEFAULT</span>\n } @else {\n <button type=\"button\" class=\"link-btn\" title=\"Make this the organization-wide default\" (click)=\"setDefault(t)\">Set as org default</button>\n }\n </td>\n <td class=\"r actions\">\n <button mjButton variant=\"primary\" size=\"sm\" [disabled]=\"isApplied(t.id)\"\n title=\"Apply this theme to your workspace now\" (click)=\"applyToMe(t)\">\n {{ isApplied(t.id) ? 'Applied' : 'Apply' }}\n </button>\n <button mjButton variant=\"outline\" size=\"sm\" (click)=\"duplicate(t)\">Duplicate</button>\n @if (!t.builtIn) {\n <button mjButton variant=\"outline\" size=\"sm\" (click)=\"edit(t)\">Edit</button>\n <button mjButton variant=\"danger\" size=\"sm\" (click)=\"remove(t)\">Delete</button>\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n }\n </mj-page-body>\n</mj-page-layout>\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ChangeDetectorRef, OnDestroy, OnInit } from '@angular/core';
|
|
2
|
+
import { CompositeKey } from '@memberjunction/core';
|
|
3
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
4
|
+
import { ResourceData } from '@memberjunction/core-entities';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/**
|
|
7
|
+
* Resource wrapper for the Theme Manager (org-theming Phase 5). Targeted by the
|
|
8
|
+
* "Manage Themes" application nav item (ResourceType "Custom", DriverClass
|
|
9
|
+
* "ThemeManagerResource"). Forwards the inner dashboard's OpenEntityRecord to the
|
|
10
|
+
* shell so "Edit" opens the theme record. Mirrors the Theme Studio resource wrapper.
|
|
11
|
+
*/
|
|
12
|
+
export declare class ThemeManagerResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {
|
|
13
|
+
private cdr;
|
|
14
|
+
private dashboard;
|
|
15
|
+
private _loaded;
|
|
16
|
+
constructor(cdr: ChangeDetectorRef);
|
|
17
|
+
set Data(value: ResourceData);
|
|
18
|
+
get Data(): ResourceData;
|
|
19
|
+
ngOnInit(): void;
|
|
20
|
+
ngOnDestroy(): void;
|
|
21
|
+
GetResourceDisplayName(data: ResourceData): Promise<string>;
|
|
22
|
+
GetResourceIconClass(_data: ResourceData): Promise<string>;
|
|
23
|
+
onOpenEntityRecord(event: {
|
|
24
|
+
EntityName: string;
|
|
25
|
+
RecordPKey: CompositeKey;
|
|
26
|
+
}): void;
|
|
27
|
+
private wireDashboard;
|
|
28
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ThemeManagerResourceComponent, never>;
|
|
29
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ThemeManagerResourceComponent, "mj-theme-manager-resource", never, {}, {}, never, never, false, never>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=theme-manager-resource.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-manager-resource.component.d.ts","sourceRoot":"","sources":["../../src/ThemeStudio/theme-manager-resource.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,iBAAiB,EAAa,SAAS,EAAE,MAAM,EAAa,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,qBAAqB,EAAmB,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAqB,YAAY,EAAE,MAAM,+BAA+B,CAAC;;AAGhF;;;;;GAKG;AACH,qBAea,6BAA8B,SAAQ,qBAAsB,YAAW,MAAM,EAAE,SAAS;IAIvF,OAAO,CAAC,GAAG;IAHoB,OAAO,CAAC,SAAS,CAAkC;IAC9F,OAAO,CAAC,OAAO,CAAS;gBAEJ,GAAG,EAAE,iBAAiB;IAI1C,IAAa,IAAI,CAAC,KAAK,EAAE,YAAY,EAMpC;IACD,IAAa,IAAI,IAAI,YAAY,CAEhC;IAED,QAAQ,IAAI,IAAI;IAIhB,WAAW,IAAI,IAAI;IAIb,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI3D,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIzD,kBAAkB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,YAAY,CAAA;KAAE,GAAG,IAAI;IAMxF,OAAO,CAAC,aAAa;yCAzCV,6BAA6B;2CAA7B,6BAA6B;CAwDzC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core';
|
|
8
|
+
import { RegisterClass } from '@memberjunction/global';
|
|
9
|
+
import { BaseResourceComponent } from '@memberjunction/ng-shared';
|
|
10
|
+
import { ThemeManagerDashboardComponent } from './theme-manager-dashboard.component';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "./theme-manager-dashboard.component";
|
|
13
|
+
/**
|
|
14
|
+
* Resource wrapper for the Theme Manager (org-theming Phase 5). Targeted by the
|
|
15
|
+
* "Manage Themes" application nav item (ResourceType "Custom", DriverClass
|
|
16
|
+
* "ThemeManagerResource"). Forwards the inner dashboard's OpenEntityRecord to the
|
|
17
|
+
* shell so "Edit" opens the theme record. Mirrors the Theme Studio resource wrapper.
|
|
18
|
+
*/
|
|
19
|
+
let ThemeManagerResourceComponent = class ThemeManagerResourceComponent extends BaseResourceComponent {
|
|
20
|
+
cdr;
|
|
21
|
+
dashboard;
|
|
22
|
+
_loaded = false;
|
|
23
|
+
constructor(cdr) {
|
|
24
|
+
super();
|
|
25
|
+
this.cdr = cdr;
|
|
26
|
+
}
|
|
27
|
+
set Data(value) {
|
|
28
|
+
super.Data = value;
|
|
29
|
+
if (!this._loaded) {
|
|
30
|
+
this._loaded = true;
|
|
31
|
+
this.wireDashboard();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
get Data() {
|
|
35
|
+
return super.Data;
|
|
36
|
+
}
|
|
37
|
+
ngOnInit() {
|
|
38
|
+
super.ngOnInit();
|
|
39
|
+
}
|
|
40
|
+
ngOnDestroy() {
|
|
41
|
+
super.ngOnDestroy();
|
|
42
|
+
}
|
|
43
|
+
async GetResourceDisplayName(data) {
|
|
44
|
+
return data?.Name || 'Manage Themes';
|
|
45
|
+
}
|
|
46
|
+
async GetResourceIconClass(_data) {
|
|
47
|
+
return 'fa-solid fa-swatchbook';
|
|
48
|
+
}
|
|
49
|
+
onOpenEntityRecord(event) {
|
|
50
|
+
if (event?.EntityName && event.RecordPKey) {
|
|
51
|
+
this.navigationService.OpenEntityRecord(event.EntityName, event.RecordPKey);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
wireDashboard() {
|
|
55
|
+
this.cdr.detectChanges();
|
|
56
|
+
setTimeout(() => {
|
|
57
|
+
if (!this.dashboard) {
|
|
58
|
+
this.NotifyLoadComplete();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.dashboard.LoadCompleteEvent = () => this.NotifyLoadComplete();
|
|
62
|
+
this.dashboard.Config = { dashboard: null, userState: {} };
|
|
63
|
+
this.dashboard.Refresh();
|
|
64
|
+
if (this.dashboard.LoadComplete) {
|
|
65
|
+
this.NotifyLoadComplete();
|
|
66
|
+
}
|
|
67
|
+
}, 0);
|
|
68
|
+
}
|
|
69
|
+
static ɵfac = function ThemeManagerResourceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ThemeManagerResourceComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
70
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ThemeManagerResourceComponent, selectors: [["mj-theme-manager-resource"]], viewQuery: function ThemeManagerResourceComponent_Query(rf, ctx) { if (rf & 1) {
|
|
71
|
+
i0.ɵɵviewQuery(ThemeManagerDashboardComponent, 5);
|
|
72
|
+
} if (rf & 2) {
|
|
73
|
+
let _t;
|
|
74
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.dashboard = _t.first);
|
|
75
|
+
} }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 2, vars: 0, consts: [[1, "theme-manager-resource-container"], [3, "OpenEntityRecord"]], template: function ThemeManagerResourceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
76
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "mj-theme-manager-dashboard", 1);
|
|
77
|
+
i0.ɵɵlistener("OpenEntityRecord", function ThemeManagerResourceComponent_Template_mj_theme_manager_dashboard_OpenEntityRecord_1_listener($event) { return ctx.onOpenEntityRecord($event); });
|
|
78
|
+
i0.ɵɵelementEnd()();
|
|
79
|
+
} }, dependencies: [i1.ThemeManagerDashboardComponent], styles: ["[_nghost-%COMP%] { display: block; width: 100%; height: 100%; }\n .theme-manager-resource-container[_ngcontent-%COMP%] { width: 100%; height: 100%; }"], changeDetection: 0 });
|
|
80
|
+
};
|
|
81
|
+
ThemeManagerResourceComponent = __decorate([
|
|
82
|
+
RegisterClass(BaseResourceComponent, 'ThemeManagerResource')
|
|
83
|
+
], ThemeManagerResourceComponent);
|
|
84
|
+
export { ThemeManagerResourceComponent };
|
|
85
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ThemeManagerResourceComponent, [{
|
|
86
|
+
type: Component,
|
|
87
|
+
args: [{ standalone: false, selector: 'mj-theme-manager-resource', template: `
|
|
88
|
+
<div class="theme-manager-resource-container">
|
|
89
|
+
<mj-theme-manager-dashboard (OpenEntityRecord)="onOpenEntityRecord($event)"></mj-theme-manager-dashboard>
|
|
90
|
+
</div>
|
|
91
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: ["\n :host { display: block; width: 100%; height: 100%; }\n .theme-manager-resource-container { width: 100%; height: 100%; }\n "] }]
|
|
92
|
+
}], () => [{ type: i0.ChangeDetectorRef }], { dashboard: [{
|
|
93
|
+
type: ViewChild,
|
|
94
|
+
args: [ThemeManagerDashboardComponent]
|
|
95
|
+
}] }); })();
|
|
96
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ThemeManagerResourceComponent, { className: "ThemeManagerResourceComponent", filePath: "src/ThemeStudio/theme-manager-resource.component.ts", lineNumber: 29 }); })();
|
|
97
|
+
//# sourceMappingURL=theme-manager-resource.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-manager-resource.component.js","sourceRoot":"","sources":["../../src/ThemeStudio/theme-manager-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,uBAAuB,EAAqB,SAAS,EAAqB,SAAS,EAAE,MAAM,eAAe,CAAC;AAEpH,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAmB,MAAM,2BAA2B,CAAC;AAEnF,OAAO,EAAE,8BAA8B,EAAE,MAAM,qCAAqC,CAAC;;;AAErF;;;;;GAKG;AAgBI,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,qBAAqB;IAIlD;IAH+B,SAAS,CAAkC;IACtF,OAAO,GAAG,KAAK,CAAC;IAExB,YAAoB,GAAsB;QACxC,KAAK,EAAE,CAAC;QADU,QAAG,GAAH,GAAG,CAAmB;IAE1C,CAAC;IAED,IAAa,IAAI,CAAC,KAAmB;QACnC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IACD,IAAa,IAAI;QACf,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,QAAQ;QACN,KAAK,CAAC,QAAQ,EAAE,CAAC;IACnB,CAAC;IAED,WAAW;QACT,KAAK,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,IAAkB;QAC7C,OAAO,IAAI,EAAE,IAAI,IAAI,eAAe,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,KAAmB;QAC5C,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAEM,kBAAkB,CAAC,KAAuD;QAC/E,IAAI,KAAK,EAAE,UAAU,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACzB,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,iBAAiB,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACnE,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,EAAE,SAAS,EAAE,IAAoC,EAAE,SAAS,EAAE,EAAE,EAAqB,CAAC;YAC9G,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;gBAChC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC,EAAE,CAAC,CAAC,CAAC;IACR,CAAC;uHAvDU,6BAA6B;6DAA7B,6BAA6B;2BAC7B,8BAA8B;;;;;YAVrC,AADF,8BAA8C,oCACgC;YAAhD,0JAAoB,8BAA0B,IAAC;YAC7E,AAD8E,iBAA6B,EACrG;;;AAQG,6BAA6B;IAfzC,aAAa,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;GAehD,6BAA6B,CAwDzC;;iFAxDY,6BAA6B;cAdzC,SAAS;6BACI,KAAK,YACP,2BAA2B,YAC3B;;;;GAIT,mBAKgB,uBAAuB,CAAC,MAAM;;kBAG9C,SAAS;mBAAC,8BAA8B;;kFAD9B,6BAA6B","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { CompositeKey } from '@memberjunction/core';\nimport { RegisterClass } from '@memberjunction/global';\nimport { BaseResourceComponent, DashboardConfig } from '@memberjunction/ng-shared';\nimport { MJDashboardEntity, ResourceData } from '@memberjunction/core-entities';\nimport { ThemeManagerDashboardComponent } from './theme-manager-dashboard.component';\n\n/**\n * Resource wrapper for the Theme Manager (org-theming Phase 5). Targeted by the\n * \"Manage Themes\" application nav item (ResourceType \"Custom\", DriverClass\n * \"ThemeManagerResource\"). Forwards the inner dashboard's OpenEntityRecord to the\n * shell so \"Edit\" opens the theme record. Mirrors the Theme Studio resource wrapper.\n */\n@RegisterClass(BaseResourceComponent, 'ThemeManagerResource')\n@Component({\n standalone: false,\n selector: 'mj-theme-manager-resource',\n template: `\n <div class=\"theme-manager-resource-container\">\n <mj-theme-manager-dashboard (OpenEntityRecord)=\"onOpenEntityRecord($event)\"></mj-theme-manager-dashboard>\n </div>\n `,\n styles: [`\n :host { display: block; width: 100%; height: 100%; }\n .theme-manager-resource-container { width: 100%; height: 100%; }\n `],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ThemeManagerResourceComponent extends BaseResourceComponent implements OnInit, OnDestroy {\n @ViewChild(ThemeManagerDashboardComponent) private dashboard!: ThemeManagerDashboardComponent;\n private _loaded = false;\n\n constructor(private cdr: ChangeDetectorRef) {\n super();\n }\n\n override set Data(value: ResourceData) {\n super.Data = value;\n if (!this._loaded) {\n this._loaded = true;\n this.wireDashboard();\n }\n }\n override get Data(): ResourceData {\n return super.Data;\n }\n\n ngOnInit(): void {\n super.ngOnInit();\n }\n\n ngOnDestroy(): void {\n super.ngOnDestroy();\n }\n\n async GetResourceDisplayName(data: ResourceData): Promise<string> {\n return data?.Name || 'Manage Themes';\n }\n\n async GetResourceIconClass(_data: ResourceData): Promise<string> {\n return 'fa-solid fa-swatchbook';\n }\n\n public onOpenEntityRecord(event: { EntityName: string; RecordPKey: CompositeKey }): void {\n if (event?.EntityName && event.RecordPKey) {\n this.navigationService.OpenEntityRecord(event.EntityName, event.RecordPKey);\n }\n }\n\n private wireDashboard(): void {\n this.cdr.detectChanges();\n setTimeout(() => {\n if (!this.dashboard) {\n this.NotifyLoadComplete();\n return;\n }\n this.dashboard.LoadCompleteEvent = () => this.NotifyLoadComplete();\n this.dashboard.Config = { dashboard: null as unknown as MJDashboardEntity, userState: {} } as DashboardConfig;\n this.dashboard.Refresh();\n if (this.dashboard.LoadComplete) {\n this.NotifyLoadComplete();\n }\n }, 0);\n }\n}\n"]}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Theme Studio dashboard (org-theming Phase 5) — the polished authoring
|
|
3
|
+
* surface for brand themes, matching theme-studio-mockup-v2: a preview-primary layout
|
|
4
|
+
* with a collapsible, resizable slide-panel editor, three switchable preview surfaces
|
|
5
|
+
* (Explorer UI style-guide, Skip reports, agent output), and a fullscreen mode.
|
|
6
|
+
*
|
|
7
|
+
* Preview fidelity (proposal 16.2 / decision #4): every surface is fed by the SAME
|
|
8
|
+
* derivation module as the save path (@memberjunction/theme-engine). The mockup's
|
|
9
|
+
* parallel `--p-*` + JS color math is replaced by the real derived `--mj-*` token map,
|
|
10
|
+
* pushed onto the preview canvas — so hovers, dark re-point, and status colors are the
|
|
11
|
+
* true generator output, not an approximation.
|
|
12
|
+
*
|
|
13
|
+
* Customization escalates in order (design feedback v1.1): seeds → token overrides
|
|
14
|
+
* (visual token browser + recipes) → custom CSS (escape hatch, CodeMirror-backed).
|
|
15
|
+
* @module ThemeStudio
|
|
16
|
+
*/
|
|
17
|
+
import { AfterViewInit, ChangeDetectorRef, OnDestroy } from '@angular/core';
|
|
18
|
+
import { Extension } from '@codemirror/state';
|
|
19
|
+
import { BaseDashboard, ThemeService } from '@memberjunction/ng-shared';
|
|
20
|
+
import { ResourceData } from '@memberjunction/core-entities';
|
|
21
|
+
import { ViewToggleOption } from '@memberjunction/ng-ui-components';
|
|
22
|
+
import { ContrastCheck, DerivedTheme, ThemeSeeds } from '@memberjunction/theme-engine';
|
|
23
|
+
import { ThemeRecipe } from './theme-studio.constants';
|
|
24
|
+
import * as i0 from "@angular/core";
|
|
25
|
+
/** A named starting point that leads with identity, not a blank color picker (16.5). */
|
|
26
|
+
interface ThemePreset {
|
|
27
|
+
name: string;
|
|
28
|
+
seeds: ThemeSeeds;
|
|
29
|
+
}
|
|
30
|
+
/** A row in the saved-themes picker. */
|
|
31
|
+
interface ThemeListItem {
|
|
32
|
+
id: string;
|
|
33
|
+
name: string;
|
|
34
|
+
isDefault: boolean;
|
|
35
|
+
swatches: string[];
|
|
36
|
+
}
|
|
37
|
+
/** One row in the visual token browser. */
|
|
38
|
+
interface TokenRow {
|
|
39
|
+
name: string;
|
|
40
|
+
/** Effective value shown (override if present, else derived for the preview mode). */
|
|
41
|
+
value: string;
|
|
42
|
+
overridden: boolean;
|
|
43
|
+
/** Whether `value` is a plain hex color editable with a color picker. */
|
|
44
|
+
isColor: boolean;
|
|
45
|
+
/** Normalized 6-digit hex for input[type=color] (only meaningful when isColor). */
|
|
46
|
+
colorValue: string;
|
|
47
|
+
}
|
|
48
|
+
/** One category group in the visual token browser. */
|
|
49
|
+
interface TokenGroup {
|
|
50
|
+
key: string;
|
|
51
|
+
label: string;
|
|
52
|
+
rows: TokenRow[];
|
|
53
|
+
modified: number;
|
|
54
|
+
}
|
|
55
|
+
type PreviewSurface = 'explorer' | 'artifact';
|
|
56
|
+
export declare class ThemeStudioDashboardComponent extends BaseDashboard implements AfterViewInit, OnDestroy {
|
|
57
|
+
private cdRef;
|
|
58
|
+
private themeService;
|
|
59
|
+
private previewCanvas?;
|
|
60
|
+
private nameInput?;
|
|
61
|
+
private stageEl?;
|
|
62
|
+
private cssCm?;
|
|
63
|
+
private galDialog?;
|
|
64
|
+
private themesChangedSub?;
|
|
65
|
+
readonly presets: ThemePreset[];
|
|
66
|
+
readonly fontOptions: {
|
|
67
|
+
label: string;
|
|
68
|
+
value: string;
|
|
69
|
+
}[];
|
|
70
|
+
/** Height %s + labels for the demo bar chart. */
|
|
71
|
+
readonly barHeights: number[];
|
|
72
|
+
readonly barValues: string[];
|
|
73
|
+
readonly barCats: string[];
|
|
74
|
+
seeds: ThemeSeeds;
|
|
75
|
+
derived: DerivedTheme;
|
|
76
|
+
themes: ThemeListItem[];
|
|
77
|
+
currentThemeId: string | null;
|
|
78
|
+
currentName: string;
|
|
79
|
+
previewMode: 'light' | 'dark';
|
|
80
|
+
activeView: PreviewSurface;
|
|
81
|
+
panelCollapsed: boolean;
|
|
82
|
+
fullscreen: boolean;
|
|
83
|
+
editingName: boolean;
|
|
84
|
+
private nameBackup;
|
|
85
|
+
themePickerOpen: boolean;
|
|
86
|
+
saving: boolean;
|
|
87
|
+
/** Preset gallery shown as step one of "New theme" (Q1#2). */
|
|
88
|
+
presetGalleryOpen: boolean;
|
|
89
|
+
/** Toolbar segmented controls (mj-view-toggle options). */
|
|
90
|
+
readonly surfaceOptions: ViewToggleOption[];
|
|
91
|
+
readonly modeOptions: ViewToggleOption[];
|
|
92
|
+
/** Preview-only branding/density knobs (not part of the seed contract yet). */
|
|
93
|
+
footerNotice: string;
|
|
94
|
+
baseFontSize: number;
|
|
95
|
+
density: number;
|
|
96
|
+
/** Interactive-mock state (Q1#6) — clickable tabs/nav/switches/accordion so the
|
|
97
|
+
* derived state token families (hover/active/focus) demonstrate themselves live. */
|
|
98
|
+
readonly mockNavItems: string[];
|
|
99
|
+
mockNav: number;
|
|
100
|
+
readonly mockTabs: string[];
|
|
101
|
+
mockTab: number;
|
|
102
|
+
mockSwitchA: boolean;
|
|
103
|
+
mockSwitchB: boolean;
|
|
104
|
+
mockAccordionOpen: boolean;
|
|
105
|
+
/** Advanced customization (persisted): per-token overrides + raw scoped CSS. */
|
|
106
|
+
advancedOpen: boolean;
|
|
107
|
+
tokenOverrides: Record<string, string>;
|
|
108
|
+
customCss: string;
|
|
109
|
+
showGeneratedCss: boolean;
|
|
110
|
+
/** Visual token browser state (Q2#1). */
|
|
111
|
+
tokenSearch: string;
|
|
112
|
+
tokenGroups: TokenGroup[];
|
|
113
|
+
openTokenCats: Set<string>;
|
|
114
|
+
editingToken: string | null;
|
|
115
|
+
editingTokenValue: string;
|
|
116
|
+
private editingTokenOriginal;
|
|
117
|
+
private editingTokenWasOverridden;
|
|
118
|
+
/** Recipes (Q2#3): curated intents expanded to token sets. On/off is tracked by
|
|
119
|
+
* PROVENANCE — `activeRecipeKeys` records exactly which override keys each active
|
|
120
|
+
* recipe produced, so hand-set overrides never masquerade as an active recipe and
|
|
121
|
+
* toggling off removes only keys the recipe still owns. */
|
|
122
|
+
readonly chromeSelectorInfo: import("./theme-studio.constants").ChromeSelectorInfo[];
|
|
123
|
+
recipeStates: {
|
|
124
|
+
recipe: ThemeRecipe;
|
|
125
|
+
on: boolean;
|
|
126
|
+
}[];
|
|
127
|
+
private activeRecipeKeys;
|
|
128
|
+
/** Inline custom-CSS validation results (Q3#6). */
|
|
129
|
+
cssWarnings: string[];
|
|
130
|
+
/** Panel sizing (Q3#1/#2). */
|
|
131
|
+
panelWidth: number;
|
|
132
|
+
panelResizing: boolean;
|
|
133
|
+
private manualPanelWidth;
|
|
134
|
+
/** "Preview on my workspace" (Q3#8). */
|
|
135
|
+
workspacePreviewOn: boolean;
|
|
136
|
+
private priorOverlayId;
|
|
137
|
+
private workspacePreviewTimer;
|
|
138
|
+
/** CodeMirror extensions for the custom-CSS editor: MJ selector + token completions. */
|
|
139
|
+
readonly cssEditorExtensions: Extension[];
|
|
140
|
+
private tokenHighlightEl;
|
|
141
|
+
private appliedVarKeys;
|
|
142
|
+
private liveTokenCache;
|
|
143
|
+
/** Sheet count the cache was built against — lazy-loaded chunks add stylesheets. */
|
|
144
|
+
private liveTokenCacheSheetCount;
|
|
145
|
+
constructor(cdRef: ChangeDetectorRef, themeService: ThemeService);
|
|
146
|
+
ngAfterViewInit(): void;
|
|
147
|
+
GetResourceDisplayName(_data: ResourceData): Promise<string>;
|
|
148
|
+
protected initDashboard(): void;
|
|
149
|
+
ngOnDestroy(): void;
|
|
150
|
+
/** Toggle the theme switcher; refresh the list on open so deletes/renames made in the
|
|
151
|
+
* Manage Themes tab are reflected without a hard refresh. */
|
|
152
|
+
toggleThemePicker(): Promise<void>;
|
|
153
|
+
protected loadData(): Promise<void>;
|
|
154
|
+
private swatchesFor;
|
|
155
|
+
recompute(): void;
|
|
156
|
+
/** The text-on-primary contrast headline, reporting the WORST of light and dark (Q1#3). */
|
|
157
|
+
get onPrimaryWorst(): {
|
|
158
|
+
check: ContrastCheck;
|
|
159
|
+
mode: 'light' | 'dark';
|
|
160
|
+
} | undefined;
|
|
161
|
+
/** Per-mode text-on-primary detail shown alongside the worst-of-both headline. */
|
|
162
|
+
get onPrimaryDetail(): {
|
|
163
|
+
light?: ContrastCheck;
|
|
164
|
+
dark?: ContrastCheck;
|
|
165
|
+
};
|
|
166
|
+
/** All 10 derived categorical colors (--mj-viz-1..10) — the full chart-palette contract. */
|
|
167
|
+
get vizColors(): string[];
|
|
168
|
+
get vizOverridden(): boolean;
|
|
169
|
+
/** Dark-mode primary the theme derives (ramp step), shown as a note on the Brand card. */
|
|
170
|
+
get darkPrimary(): string;
|
|
171
|
+
/** Secondary (deep brand) derived for light mode. */
|
|
172
|
+
get secondaryColor(): string;
|
|
173
|
+
editViz(index: number, event: Event): void;
|
|
174
|
+
resetViz(): void;
|
|
175
|
+
/**
|
|
176
|
+
* Push the derived token map onto the preview canvas as scoped CSS vars — the
|
|
177
|
+
* fidelity guarantee. Also sets preview-only density/size vars and the mode attr so
|
|
178
|
+
* any [data-theme="dark"] rules inside the canvas resolve. Stale keys from removed
|
|
179
|
+
* overrides (e.g. a recipe toggled off) are cleared before re-applying.
|
|
180
|
+
*/
|
|
181
|
+
private applyPreviewVars;
|
|
182
|
+
/** Inject the raw custom CSS into the preview, scoped to the canvas so it only affects
|
|
183
|
+
* the preview (approximate — the mock's markup differs from live chrome selectors). */
|
|
184
|
+
private applyPreviewCustomCss;
|
|
185
|
+
/** Token names in the derived contract (completion, insert picker, validation). */
|
|
186
|
+
get overridableTokens(): string[];
|
|
187
|
+
/** Overrides/custom CSS don't change derivation — re-apply the preview layer, refresh
|
|
188
|
+
* the browser rows + recipe states, and keep any live workspace preview in sync. */
|
|
189
|
+
onAdvancedChanged(): void;
|
|
190
|
+
/** Expand/collapse the Advanced card, auto-widening the panel while it's open (Q3#2). */
|
|
191
|
+
toggleAdvanced(): void;
|
|
192
|
+
/** Closed-state summary — "3 token overrides · 14 lines CSS" (Q3#7). */
|
|
193
|
+
get advancedSummary(): string | null;
|
|
194
|
+
/** Rebuild the grouped, searchable token rows. */
|
|
195
|
+
private rebuildTokenBrowser;
|
|
196
|
+
onTokenSearchChanged(): void;
|
|
197
|
+
toggleTokenCategory(key: string): void;
|
|
198
|
+
/** A category is open when toggled open, or always while a search narrows the rows. */
|
|
199
|
+
isTokenCategoryOpen(key: string): boolean;
|
|
200
|
+
setTokenOverride(name: string, value: string): void;
|
|
201
|
+
resetTokenOverride(name: string): void;
|
|
202
|
+
onTokenColorInput(name: string, event: Event): void;
|
|
203
|
+
/** Begin inline text editing for a non-color token value. */
|
|
204
|
+
beginTokenEdit(row: TokenRow): void;
|
|
205
|
+
commitTokenEdit(): void;
|
|
206
|
+
cancelTokenEdit(): void;
|
|
207
|
+
/** Outline the preview elements that use `token` (exact by construction — the canvas
|
|
208
|
+
* markup is ours; see TOKEN_PREVIEW_TARGETS). Unmapped tokens simply don't highlight. */
|
|
209
|
+
highlightTokenTargets(token: string): void;
|
|
210
|
+
clearTokenHighlight(): void;
|
|
211
|
+
/** Toggle a recipe: expand its token set into overrides (recording ownership), or
|
|
212
|
+
* remove exactly the keys it still owns. Keys the user hand-edited after enabling
|
|
213
|
+
* were released from ownership at edit time and are never touched here. */
|
|
214
|
+
toggleRecipe(recipe: ThemeRecipe): void;
|
|
215
|
+
/** Derive the on/off rows shown in the Recipes card from the provenance map. */
|
|
216
|
+
private refreshRecipeStates;
|
|
217
|
+
/** A hand edit (set or reset) takes ownership of `name` away from any active recipe,
|
|
218
|
+
* so recipe toggle-off / re-expansion never clobbers or deletes the user's value.
|
|
219
|
+
* A recipe left with no owned keys is effectively off. */
|
|
220
|
+
private releaseRecipeOwnership;
|
|
221
|
+
/** Re-expand active recipes from the CURRENT derived theme so their values follow the
|
|
222
|
+
* brand as seeds change. Only recipe-owned keys are rewritten; keys a recipe no
|
|
223
|
+
* longer produces are dropped from both the overrides and the ownership record. */
|
|
224
|
+
private reexpandActiveRecipes;
|
|
225
|
+
/** Rebuild provenance for a freshly loaded override set (no stored provenance):
|
|
226
|
+
* a recipe is considered active only when every key it would produce is present
|
|
227
|
+
* with EXACTLY the value it would produce — since active recipes track the seeds
|
|
228
|
+
* (see reexpandActiveRecipes), a saved active recipe always value-matches. */
|
|
229
|
+
private inferActiveRecipes;
|
|
230
|
+
onCssEditorChange(value: string): void;
|
|
231
|
+
/** All completions offered: real chrome selectors + the theme's derived token names. */
|
|
232
|
+
private get cssSuggestions();
|
|
233
|
+
/** CodeMirror completion source over the MJ chrome selectors + `--mj-*` tokens. */
|
|
234
|
+
private mjCssCompletionSource;
|
|
235
|
+
/** Insert a chrome selector at the caret; on an empty line, scaffold a full rule. */
|
|
236
|
+
insertChromeSelector(selector: string): void;
|
|
237
|
+
/** Insert-token picker (same enumeration the overrides use). */
|
|
238
|
+
onInsertTokenPick(event: Event): void;
|
|
239
|
+
/** Inline validation at edit time (Q3#6): @import removal + unknown --mj-* names. */
|
|
240
|
+
private validateCustomCss;
|
|
241
|
+
/** The full known --mj-* set: the derived contract ∪ every token the live app defines. */
|
|
242
|
+
private knownMjTokens;
|
|
243
|
+
/** Scan loaded stylesheets for every defined `--mj-*` custom property, so the
|
|
244
|
+
* unknown-name warning validates against the real base contract (no false positives
|
|
245
|
+
* on base tokens outside the derived overlay, e.g. --mj-shadow-sm). Re-scans when
|
|
246
|
+
* the stylesheet count changes (lazy-loaded chunks add sheets after first scan). */
|
|
247
|
+
private collectLiveMjTokens;
|
|
248
|
+
private collectTokensFromRule;
|
|
249
|
+
/** The actual overlay CSS this theme produces (tokens + advanced layer) — read-only view. */
|
|
250
|
+
get generatedCss(): string;
|
|
251
|
+
copyGeneratedCss(): Promise<void>;
|
|
252
|
+
setView(view: PreviewSurface): void;
|
|
253
|
+
setPreviewMode(mode: 'light' | 'dark'): void;
|
|
254
|
+
/** mj-view-toggle (KeyChange) adapter for the light/dark segment. */
|
|
255
|
+
onModeToggle(key: string): void;
|
|
256
|
+
/** mj-view-toggle (KeyChange) adapter for the preview-surface chips. */
|
|
257
|
+
onSurfaceToggle(key: string): void;
|
|
258
|
+
togglePanel(): void;
|
|
259
|
+
/** Clamp a requested panel width: >= the design minimum, <= 55% of the stage, and
|
|
260
|
+
* never eating the canvas below its ~640px floor (the resize clamps, not the preview). */
|
|
261
|
+
private clampPanelWidth;
|
|
262
|
+
/** Manually-dragged width wins; otherwise auto-widen while Advanced is open (Q3#2). */
|
|
263
|
+
private syncPanelWidth;
|
|
264
|
+
private loadPersistedPanelWidth;
|
|
265
|
+
startPanelResize(event: PointerEvent): void;
|
|
266
|
+
onWindowResize(): void;
|
|
267
|
+
/** Prefer the native Fullscreen API — it promotes the canvas to the browser's top
|
|
268
|
+
* layer, so it fills the real screen regardless of any transformed/`contain`ed
|
|
269
|
+
* ancestor, and browser Esc reliably exits. Falls back to CSS-fixed overlay if the
|
|
270
|
+
* API is unavailable or rejects. */
|
|
271
|
+
toggleFullscreen(on: boolean): Promise<void>;
|
|
272
|
+
onFullscreenChange(): void;
|
|
273
|
+
onEscape(): void;
|
|
274
|
+
onDensityChanged(): void;
|
|
275
|
+
onBaseSizeChanged(): void;
|
|
276
|
+
applyPreset(preset: ThemePreset): void;
|
|
277
|
+
private uniqueName;
|
|
278
|
+
onSeedsChanged(): void;
|
|
279
|
+
selectTheme(item: ThemeListItem): Promise<void>;
|
|
280
|
+
get currentIsDefault(): boolean;
|
|
281
|
+
/** Whether a picker row is the currently-loaded theme (case-insensitive GUID compare). */
|
|
282
|
+
isCurrentTheme(id: string): boolean;
|
|
283
|
+
/** The protected built-in theme is read-only — editing/saving over it is blocked. */
|
|
284
|
+
get isBuiltInSelected(): boolean;
|
|
285
|
+
/** Fork the current seeds into a new, editable theme (used to customize the built-in). */
|
|
286
|
+
saveAsCopy(): void;
|
|
287
|
+
/** Inline-rename the current theme in the header. For a saved theme the new name is
|
|
288
|
+
* persisted immediately on commit; for an unsaved draft it persists on Save. */
|
|
289
|
+
startRename(): void;
|
|
290
|
+
commitRename(): Promise<void>;
|
|
291
|
+
cancelRename(): void;
|
|
292
|
+
/**
|
|
293
|
+
* Start a fresh, unsaved draft. From the UI this opens on the preset gallery
|
|
294
|
+
* (choosing a personality first, Q1#2); agent-driven calls skip straight to the
|
|
295
|
+
* MJ default seeds.
|
|
296
|
+
*/
|
|
297
|
+
newTheme(showGallery?: boolean): void;
|
|
298
|
+
/** Move focus into the gallery once it renders — aria-modal without focus is a trap
|
|
299
|
+
* for keyboard/AT users (Esc + Tab must operate on the dialog, not what's behind it). */
|
|
300
|
+
private focusPresetGallery;
|
|
301
|
+
/** Preset gallery: pick a personality card as step one of a new theme. */
|
|
302
|
+
choosePreset(preset: ThemePreset): void;
|
|
303
|
+
/** Close the gallery keeping the MJ-default draft (the "start blank" path). */
|
|
304
|
+
closePresetGallery(): void;
|
|
305
|
+
discard(): void;
|
|
306
|
+
save(): Promise<void>;
|
|
307
|
+
setAsDefault(): Promise<void>;
|
|
308
|
+
/**
|
|
309
|
+
* Make theme `id` the single org default and apply it live. Clears any other
|
|
310
|
+
* default first (app-layer enforcement — there is no DB unique index), then applies
|
|
311
|
+
* the persisted seeds via ThemeService so the running app re-themes immediately.
|
|
312
|
+
*/
|
|
313
|
+
private setDefaultById;
|
|
314
|
+
/** Apply the current (edited) theme to the live app via ThemeService (used on save). */
|
|
315
|
+
private applyLive;
|
|
316
|
+
/**
|
|
317
|
+
* Apply this theme to the current user's workspace now and remember it as their
|
|
318
|
+
* choice (persists across sessions). Distinct from "Set as org default", which is
|
|
319
|
+
* the organization-wide fallback for everyone.
|
|
320
|
+
*/
|
|
321
|
+
applyToMe(): Promise<void>;
|
|
322
|
+
/**
|
|
323
|
+
* Temporarily apply the in-memory draft (seeds + overrides + custom CSS) to the real
|
|
324
|
+
* app chrome so custom-CSS selectors are authored against reality. The preview stays
|
|
325
|
+
* on while you navigate other tabs (that's the point — the Studio tab is cached, not
|
|
326
|
+
* destroyed) and reverts on toggle-off or when the Studio tab is closed. It is never
|
|
327
|
+
* persisted ({ persist: false }), so a reload always restores the user's real theme.
|
|
328
|
+
*/
|
|
329
|
+
toggleWorkspacePreview(): Promise<void>;
|
|
330
|
+
private registerDraftPreview;
|
|
331
|
+
/** While the workspace preview is on, keep it tracking the draft (debounced). */
|
|
332
|
+
private refreshWorkspacePreviewDebounced;
|
|
333
|
+
/** Drop the draft preview WITHOUT restoring the prior overlay — used when a real
|
|
334
|
+
* apply (Apply to me / save-of-live-theme / set org default) is about to take over
|
|
335
|
+
* the workspace, so a later toggle-off can't silently revert what the user applied. */
|
|
336
|
+
private abandonWorkspacePreview;
|
|
337
|
+
private endWorkspacePreview;
|
|
338
|
+
private notify;
|
|
339
|
+
private agentContextTimer;
|
|
340
|
+
private summaryRows;
|
|
341
|
+
private publishAgentContext;
|
|
342
|
+
/** Coalesce slider-drag bursts into one context publish. */
|
|
343
|
+
private publishAgentContextDebounced;
|
|
344
|
+
private registerAgentTools;
|
|
345
|
+
/** Validate + apply a partial seed update from the agent (clamped to the UI ranges). */
|
|
346
|
+
private handleSetSeeds;
|
|
347
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ThemeStudioDashboardComponent, never>;
|
|
348
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ThemeStudioDashboardComponent, "mj-theme-studio-dashboard", never, {}, {}, never, never, false, never>;
|
|
349
|
+
}
|
|
350
|
+
export {};
|
|
351
|
+
//# sourceMappingURL=theme-studio-dashboard.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme-studio-dashboard.component.d.ts","sourceRoot":"","sources":["../../src/ThemeStudio/theme-studio-dashboard.component.ts"],"names":[],"mappings":"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"}
|