@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.
Files changed (67) hide show
  1. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +15 -4
  2. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  3. package/dist/DataExplorer/data-explorer-dashboard.component.js +45 -35
  4. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  5. package/dist/DataExplorer/models/explorer-state.interface.d.ts +7 -0
  6. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
  7. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
  8. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js +2 -2
  9. package/dist/KnowledgeHub/components/feature-pipelines/feature-pipelines-resource.component.js.map +1 -1
  10. package/dist/Lists/components/lists-browse-resource.component.d.ts +4 -0
  11. package/dist/Lists/components/lists-browse-resource.component.d.ts.map +1 -1
  12. package/dist/Lists/components/lists-browse-resource.component.js +39 -30
  13. package/dist/Lists/components/lists-browse-resource.component.js.map +1 -1
  14. package/dist/Lists/components/lists-my-lists-resource.component.d.ts.map +1 -1
  15. package/dist/Lists/components/lists-my-lists-resource.component.js +14 -12
  16. package/dist/Lists/components/lists-my-lists-resource.component.js.map +1 -1
  17. package/dist/Lists/components/lists-operations-resource.component.d.ts.map +1 -1
  18. package/dist/Lists/components/lists-operations-resource.component.js +6 -1
  19. package/dist/Lists/components/lists-operations-resource.component.js.map +1 -1
  20. package/dist/Lists/services/list-set-operations.service.d.ts +11 -0
  21. package/dist/Lists/services/list-set-operations.service.d.ts.map +1 -1
  22. package/dist/Lists/services/list-set-operations.service.js +56 -14
  23. package/dist/Lists/services/list-set-operations.service.js.map +1 -1
  24. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +7 -1
  25. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
  26. package/dist/PredictiveStudio/components/ps-pipelines.component.js +11 -4
  27. package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
  28. package/dist/Testing/components/testing-runs.component.d.ts.map +1 -1
  29. package/dist/Testing/components/testing-runs.component.js +35 -25
  30. package/dist/Testing/components/testing-runs.component.js.map +1 -1
  31. package/dist/Testing/services/testing-instrumentation.service.d.ts +5 -0
  32. package/dist/Testing/services/testing-instrumentation.service.d.ts.map +1 -1
  33. package/dist/Testing/services/testing-instrumentation.service.js +8 -2
  34. package/dist/Testing/services/testing-instrumentation.service.js.map +1 -1
  35. package/dist/ThemeStudio/theme-agent-context.d.ts +64 -0
  36. package/dist/ThemeStudio/theme-agent-context.d.ts.map +1 -0
  37. package/dist/ThemeStudio/theme-agent-context.js +129 -0
  38. package/dist/ThemeStudio/theme-agent-context.js.map +1 -0
  39. package/dist/ThemeStudio/theme-manager-dashboard.component.d.ts +62 -0
  40. package/dist/ThemeStudio/theme-manager-dashboard.component.d.ts.map +1 -0
  41. package/dist/ThemeStudio/theme-manager-dashboard.component.js +464 -0
  42. package/dist/ThemeStudio/theme-manager-dashboard.component.js.map +1 -0
  43. package/dist/ThemeStudio/theme-manager-resource.component.d.ts +31 -0
  44. package/dist/ThemeStudio/theme-manager-resource.component.d.ts.map +1 -0
  45. package/dist/ThemeStudio/theme-manager-resource.component.js +97 -0
  46. package/dist/ThemeStudio/theme-manager-resource.component.js.map +1 -0
  47. package/dist/ThemeStudio/theme-studio-dashboard.component.d.ts +351 -0
  48. package/dist/ThemeStudio/theme-studio-dashboard.component.d.ts.map +1 -0
  49. package/dist/ThemeStudio/theme-studio-dashboard.component.js +2931 -0
  50. package/dist/ThemeStudio/theme-studio-dashboard.component.js.map +1 -0
  51. package/dist/ThemeStudio/theme-studio-resource.component.d.ts +28 -0
  52. package/dist/ThemeStudio/theme-studio-resource.component.d.ts.map +1 -0
  53. package/dist/ThemeStudio/theme-studio-resource.component.js +96 -0
  54. package/dist/ThemeStudio/theme-studio-resource.component.js.map +1 -0
  55. package/dist/ThemeStudio/theme-studio.constants.d.ts +79 -0
  56. package/dist/ThemeStudio/theme-studio.constants.d.ts.map +1 -0
  57. package/dist/ThemeStudio/theme-studio.constants.js +217 -0
  58. package/dist/ThemeStudio/theme-studio.constants.js.map +1 -0
  59. package/dist/core-dashboards.module.d.ts +56 -52
  60. package/dist/core-dashboards.module.d.ts.map +1 -1
  61. package/dist/core-dashboards.module.js +24 -1
  62. package/dist/core-dashboards.module.js.map +1 -1
  63. package/dist/public-api.d.ts +4 -0
  64. package/dist/public-api.d.ts.map +1 -1
  65. package/dist/public-api.js +4 -0
  66. package/dist/public-api.js.map +1 -1
  67. package/package.json +63 -60
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @fileoverview Shared constants for the Theme Studio + Theme Manager.
3
+ * @module ThemeStudio
4
+ */
5
+ import { ContrastCheck, DerivedTheme, ThemeSeeds } from '@memberjunction/theme-engine';
6
+ /**
7
+ * The seeded, built-in MemberJunction theme (created by migration
8
+ * V202607202101__v5.49.x__Add_Theme_Entity.sql with this stable, hardcoded ID).
9
+ * It is protected from edit and delete so there is always a safe fallback theme,
10
+ * regardless of what the user does to their own themes. Duplicating it is allowed.
11
+ */
12
+ export declare const MJ_BUILTIN_THEME_ID = "64A6B519-CFBA-4F25-98D4-8398D397E21C";
13
+ /** Whether a theme id is the protected built-in MemberJunction theme (case-insensitive). */
14
+ export declare function isBuiltInTheme(id: string | null | undefined): boolean;
15
+ /** A chrome selector a themer can target from Custom CSS, with a one-line description. */
16
+ export interface ChromeSelectorInfo {
17
+ selector: string;
18
+ description: string;
19
+ }
20
+ /**
21
+ * Real MJ chrome selectors a themer can target from Custom CSS — component element
22
+ * tags (Angular selectors) + the shell logo class, each with a one-line description
23
+ * so the catalog can render as clickable chips instead of hiding behind typing.
24
+ * Curated to the persistent chrome worth theming (not transient dialogs/resources).
25
+ * Element tags are reliable targets; internal component classes are view-encapsulated
26
+ * and generally not selectable from an overlay.
27
+ */
28
+ export declare const MJ_CHROME_SELECTOR_INFO: ChromeSelectorInfo[];
29
+ /** Flat selector list (autocomplete + validation). */
30
+ export declare const MJ_CHROME_SELECTORS: string[];
31
+ /** One category in the visual token browser. */
32
+ export interface TokenCategory {
33
+ key: string;
34
+ label: string;
35
+ match: RegExp;
36
+ }
37
+ /**
38
+ * Categories for the visual token browser, in display order. A token lands in the
39
+ * first category whose regex matches; anything unmatched (e.g. an override of a base
40
+ * token outside the derived contract) falls into the trailing "Other" bucket the
41
+ * component appends.
42
+ */
43
+ export declare const TOKEN_CATEGORIES: TokenCategory[];
44
+ /**
45
+ * Reverse-highlight map: token name → selectors INSIDE the preview canvas whose
46
+ * rendering uses that token. The canvas markup + CSS are authored in this package,
47
+ * so this mapping is exact by construction (unlike inferring provenance from
48
+ * resolved styles, which is deliberately out of scope). Tokens without an entry
49
+ * simply don't highlight. Selectors are matched under `.ts-canvas`.
50
+ */
51
+ export declare const TOKEN_PREVIEW_TARGETS: Record<string, string[]>;
52
+ /**
53
+ * A curated intent that expands to a token-override set (Q2 recipes): taste-level
54
+ * power with zero token names on screen. Values are computed at toggle-on time from
55
+ * the CURRENT derived theme so they follow the brand; toggling off removes exactly
56
+ * the keys the recipe produced. Fully reversible, serialized through the same
57
+ * `Overrides` JSON as hand-edited tokens.
58
+ */
59
+ export interface ThemeRecipe {
60
+ id: string;
61
+ name: string;
62
+ description: string;
63
+ tokens: (derived: DerivedTheme, seeds: ThemeSeeds) => Record<string, string>;
64
+ }
65
+ export declare const THEME_RECIPES: ThemeRecipe[];
66
+ /** Parse a persisted Overrides JSON map: trims keys, drops blanks, coerces values to strings. */
67
+ export declare function parseOverridesJson(json: string | null): Record<string, string>;
68
+ /**
69
+ * Pick the WORST of the light/dark text-on-primary contrast checks (Q1#3) — a failing
70
+ * dark pair must not hide while previewing light. A failing mode always beats a passing
71
+ * one; between two of the same outcome, lower ratio wins.
72
+ */
73
+ export declare function pickWorstOnPrimary(light: ContrastCheck | undefined, dark: ContrastCheck | undefined): {
74
+ check: ContrastCheck;
75
+ mode: 'light' | 'dark';
76
+ } | undefined;
77
+ /** Inline custom-CSS validation (Q3#6): @import removal notice + unknown --mj-* names. */
78
+ export declare function buildCssWarnings(css: string, knownTokens: ReadonlySet<string>): string[];
79
+ //# sourceMappingURL=theme-studio.constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-studio.constants.d.ts","sourceRoot":"","sources":["../../src/ThemeStudio/theme-studio.constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,YAAY,EAA0B,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/G;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,yCAAyC,CAAC;AAE1E,4FAA4F;AAC5F,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAErE;AAED,0FAA0F;AAC1F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,EAAE,kBAAkB,EAoBvD,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,mBAAmB,EAAE,MAAM,EAAmD,CAAC;AAE5F,gDAAgD;AAChD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,EAU3C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAuC1D,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9E;AAQD,eAAO,MAAM,aAAa,EAAE,WAAW,EA+CtC,CAAC;AAEF,iGAAiG;AACjG,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAY9E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,aAAa,GAAG,SAAS,EAChC,IAAI,EAAE,aAAa,GAAG,SAAS,GAC9B;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,GAAG,SAAS,CAS9D;AAED,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAiBxF"}
@@ -0,0 +1,217 @@
1
+ /**
2
+ * @fileoverview Shared constants for the Theme Studio + Theme Manager.
3
+ * @module ThemeStudio
4
+ */
5
+ import { hexToOKLCH, oklchToHex } from '@memberjunction/theme-engine';
6
+ /**
7
+ * The seeded, built-in MemberJunction theme (created by migration
8
+ * V202607202101__v5.49.x__Add_Theme_Entity.sql with this stable, hardcoded ID).
9
+ * It is protected from edit and delete so there is always a safe fallback theme,
10
+ * regardless of what the user does to their own themes. Duplicating it is allowed.
11
+ */
12
+ export const MJ_BUILTIN_THEME_ID = '64A6B519-CFBA-4F25-98D4-8398D397E21C';
13
+ /** Whether a theme id is the protected built-in MemberJunction theme (case-insensitive). */
14
+ export function isBuiltInTheme(id) {
15
+ return !!id && id.toUpperCase() === MJ_BUILTIN_THEME_ID;
16
+ }
17
+ /**
18
+ * Real MJ chrome selectors a themer can target from Custom CSS — component element
19
+ * tags (Angular selectors) + the shell logo class, each with a one-line description
20
+ * so the catalog can render as clickable chips instead of hiding behind typing.
21
+ * Curated to the persistent chrome worth theming (not transient dialogs/resources).
22
+ * Element tags are reliable targets; internal component classes are view-encapsulated
23
+ * and generally not selectable from an overlay.
24
+ */
25
+ export const MJ_CHROME_SELECTOR_INFO = [
26
+ { selector: 'mj-shell', description: 'The top-level app shell (header bar + workspace)' },
27
+ { selector: 'mj-app-nav', description: 'Top app navigation strip' },
28
+ { selector: 'mj-app-switcher', description: 'App switcher menu' },
29
+ { selector: 'mj-tab-container', description: 'Workspace tab strip + tab content host' },
30
+ { selector: 'mj-single-dashboard', description: 'Dashboard resource host' },
31
+ { selector: 'mj-single-record', description: 'Record form resource host' },
32
+ { selector: 'mj-single-query', description: 'Query resource host' },
33
+ { selector: 'mj-single-search-result', description: 'Search results resource host' },
34
+ { selector: 'mj-command-palette', description: 'Cmd/Ctrl-K command palette' },
35
+ { selector: 'mj-omnibar-palette', description: 'Omnibar search palette' },
36
+ { selector: 'mj-notifications-resource', description: 'Notifications panel' },
37
+ { selector: 'mj-empty-state', description: 'Empty-state placeholder blocks' },
38
+ { selector: 'mj-loading', description: 'Loading indicator (animated logo)' },
39
+ { selector: 'mj-dialog', description: 'Modal dialogs' },
40
+ { selector: 'mj-dialog-actions', description: 'Dialog footer action row' },
41
+ { selector: 'mj-profile-dialog', description: 'User profile dialog' },
42
+ { selector: 'mj-server-connectivity-banner', description: 'Server connectivity banner' },
43
+ { selector: 'mj-system-validation-banner', description: 'System validation banner' },
44
+ { selector: '.mj-logo', description: 'The shell logo element' },
45
+ ];
46
+ /** Flat selector list (autocomplete + validation). */
47
+ export const MJ_CHROME_SELECTORS = MJ_CHROME_SELECTOR_INFO.map((i) => i.selector);
48
+ /**
49
+ * Categories for the visual token browser, in display order. A token lands in the
50
+ * first category whose regex matches; anything unmatched (e.g. an override of a base
51
+ * token outside the derived contract) falls into the trailing "Other" bucket the
52
+ * component appends.
53
+ */
54
+ export const TOKEN_CATEGORIES = [
55
+ { key: 'brand', label: 'Brand', match: /^--mj-brand-/ },
56
+ { key: 'bg', label: 'Backgrounds', match: /^--mj-bg-/ },
57
+ { key: 'text', label: 'Text', match: /^--mj-text-/ },
58
+ { key: 'border', label: 'Borders', match: /^--mj-border-/ },
59
+ { key: 'status', label: 'Status', match: /^--mj-status-/ },
60
+ { key: 'viz', label: 'Viz', match: /^--mj-viz-/ },
61
+ { key: 'shape', label: 'Shape', match: /^--mj-(radius|shadow)-/ },
62
+ { key: 'type', label: 'Type', match: /^--mj-font-/ },
63
+ { key: 'ramps', label: 'Ramps (primitives)', match: /^--mj-color-/ },
64
+ ];
65
+ /**
66
+ * Reverse-highlight map: token name → selectors INSIDE the preview canvas whose
67
+ * rendering uses that token. The canvas markup + CSS are authored in this package,
68
+ * so this mapping is exact by construction (unlike inferring provenance from
69
+ * resolved styles, which is deliberately out of scope). Tokens without an entry
70
+ * simply don't highlight. Selectors are matched under `.ts-canvas`.
71
+ */
72
+ export const TOKEN_PREVIEW_TARGETS = {
73
+ '--mj-brand-primary': ['.mx-btn.pri', '.mx-av', '.mx-appico', '.mx-tabs i.on', '.mx-prog i', '.mx-swch:not(.off)', '.rhead', 'table.grid th', '.ag-find .fdot', '.mx-btn.out'],
74
+ '--mj-brand-primary-hover': ['.states-row .is-hover'],
75
+ '--mj-brand-primary-active': ['.states-row .is-active'],
76
+ '--mj-brand-on-primary': ['.mx-btn.pri', '.mx-av', '.rhead'],
77
+ '--mj-brand-accent': ['.kpi', '.zone-lab'],
78
+ '--mj-bg-page': ['.mx', '.pv-view'],
79
+ '--mj-bg-surface': ['.mx-shell', '.mx-ph', '.mx-cell', '.mx-chip', '.report'],
80
+ '--mj-bg-surface-card': ['.kpi', '.rfoot', '.ag-find', 'table.grid tr:nth-child(even) td'],
81
+ '--mj-bg-surface-sunken': ['.mx-search', '.mx-input', '.mx-btn.sec', '.mx-dlg-t', '.mx-stat.neu'],
82
+ '--mj-bg-surface-hover': ['.mx-nav b', '.mx-lnav b', '.mx-chip'],
83
+ '--mj-text-primary': ['.mx-ph-title', '.mx-dlg-t', '.kpi .n', 'table.grid td b'],
84
+ '--mj-text-secondary': ['.mx-lbl', '.mx-tabs i', 'table.grid td', '.ag-sum', '.bar .bv'],
85
+ '--mj-text-muted': ['.mx-cap', '.mx-ph-sub', '.kpi .l', '.cats span', '.rfoot'],
86
+ '--mj-border-default': ['.mx-cell', '.mx-shell', '.mx-input', '.mx-dlg', 'table.grid td'],
87
+ '--mj-border-strong': ['.mx-swch.off'],
88
+ '--mj-border-focus': ['.mx-input.focus', '.states-row .is-focus'],
89
+ '--mj-status-success': ['.mx-stat.suc', '.kpi .d.up'],
90
+ '--mj-status-success-bg': ['.mx-stat.suc'],
91
+ '--mj-status-success-text': ['.mx-stat.suc'],
92
+ '--mj-status-warning': ['.mx-stat.wrn'],
93
+ '--mj-status-warning-bg': ['.mx-stat.wrn'],
94
+ '--mj-status-warning-text': ['.mx-stat.wrn'],
95
+ '--mj-status-error': ['.mx-btn.dgr', '.kpi .d.dn'],
96
+ '--mj-status-info': ['.mx-alert'],
97
+ '--mj-status-info-bg': ['.mx-alert'],
98
+ '--mj-status-info-text': ['.mx-alert'],
99
+ '--mj-status-info-border': ['.mx-alert'],
100
+ '--mj-viz-1': ['.bar:nth-child(1) .fill'],
101
+ '--mj-viz-2': ['.bar:nth-child(2) .fill'],
102
+ '--mj-viz-3': ['.bar:nth-child(3) .fill'],
103
+ '--mj-viz-4': ['.bar:nth-child(4) .fill'],
104
+ '--mj-viz-5': ['.bar:nth-child(5) .fill'],
105
+ '--mj-viz-6': ['.bar:nth-child(6) .fill'],
106
+ '--mj-radius-sm': ['.mx-btn', '.mx-input', '.mx-alert'],
107
+ '--mj-radius-md': ['.mx-cell', '.mx-dlg', '.kpi', '.ag-find'],
108
+ '--mj-radius-lg': ['.mx', '.report'],
109
+ '--mj-shadow-brand-md': ['.report'],
110
+ '--mj-font-family': ['.mx-ph-title', '.ag-sum', '.kpi .n'],
111
+ };
112
+ /** Reduce a hex color's OKLCH chroma by `factor` (0..1 = fully muted..unchanged). */
113
+ function muteHex(hex, factor) {
114
+ const c = hexToOKLCH(hex);
115
+ return oklchToHex({ ...c, c: c.c * factor });
116
+ }
117
+ export const THEME_RECIPES = [
118
+ {
119
+ id: 'flatter',
120
+ name: 'Flatter look',
121
+ description: 'Remove elevation shadows for a flat, print-like surface.',
122
+ tokens: () => ({
123
+ '--mj-shadow-brand-sm': 'none',
124
+ '--mj-shadow-brand-md': 'none',
125
+ '--mj-shadow-sm': 'none',
126
+ '--mj-shadow-md': 'none',
127
+ '--mj-shadow-lg': 'none',
128
+ }),
129
+ },
130
+ {
131
+ id: 'softer',
132
+ name: 'Softer corners',
133
+ description: 'Rounder radii across chrome and generated content.',
134
+ tokens: (_derived, seeds) => {
135
+ const base = Math.max(12, (seeds.radius ?? 8) * 1.5);
136
+ const px = (n) => `${Math.round(n)}px`;
137
+ return {
138
+ '--mj-radius-sm': px(base / 2),
139
+ '--mj-radius-md': px(base),
140
+ '--mj-radius-lg': px(base * 1.5),
141
+ '--mj-radius-xl': px(base * 2),
142
+ '--mj-radius-2xl': px(base * 3),
143
+ };
144
+ },
145
+ },
146
+ {
147
+ id: 'muted',
148
+ name: 'Muted professional',
149
+ description: 'Desaturate accent, tertiary, and chart colors for a quieter palette.',
150
+ // Mutes the PRIMITIVE ramps (not the semantic tokens): every semantic token and
151
+ // the dark block re-point off the primitives, so both modes stay correct.
152
+ tokens: (derived) => {
153
+ const out = {};
154
+ for (const [k, v] of Object.entries(derived.primitives)) {
155
+ if (/^--mj-color-(accent|tertiary)-/.test(k))
156
+ out[k] = muteHex(v, 0.4);
157
+ }
158
+ for (let i = 1; i <= 10; i++) {
159
+ const v = derived.overlayVars[`--mj-viz-${i}`];
160
+ if (v)
161
+ out[`--mj-viz-${i}`] = muteHex(v, 0.45);
162
+ }
163
+ return out;
164
+ },
165
+ },
166
+ ];
167
+ /** Parse a persisted Overrides JSON map: trims keys, drops blanks, coerces values to strings. */
168
+ export function parseOverridesJson(json) {
169
+ if (!json)
170
+ return {};
171
+ try {
172
+ const obj = JSON.parse(json);
173
+ const out = {};
174
+ for (const [k, v] of Object.entries(obj)) {
175
+ if (k.trim())
176
+ out[k.trim()] = String(v);
177
+ }
178
+ return out;
179
+ }
180
+ catch {
181
+ return {};
182
+ }
183
+ }
184
+ /**
185
+ * Pick the WORST of the light/dark text-on-primary contrast checks (Q1#3) — a failing
186
+ * dark pair must not hide while previewing light. A failing mode always beats a passing
187
+ * one; between two of the same outcome, lower ratio wins.
188
+ */
189
+ export function pickWorstOnPrimary(light, dark) {
190
+ if (!light || !dark) {
191
+ const only = light ?? dark;
192
+ return only ? { check: only, mode: light ? 'light' : 'dark' } : undefined;
193
+ }
194
+ if (light.passes !== dark.passes) {
195
+ return light.passes ? { check: dark, mode: 'dark' } : { check: light, mode: 'light' };
196
+ }
197
+ return light.ratio <= dark.ratio ? { check: light, mode: 'light' } : { check: dark, mode: 'dark' };
198
+ }
199
+ /** Inline custom-CSS validation (Q3#6): @import removal notice + unknown --mj-* names. */
200
+ export function buildCssWarnings(css, knownTokens) {
201
+ const warnings = [];
202
+ if (/@import\b/i.test(css)) {
203
+ warnings.push('@import is not supported and is removed on save.');
204
+ }
205
+ const unknown = new Set();
206
+ for (const match of css.matchAll(/--mj-[a-zA-Z0-9-]+/g)) {
207
+ if (!knownTokens.has(match[0]))
208
+ unknown.add(match[0]);
209
+ }
210
+ if (unknown.size > 0) {
211
+ const list = Array.from(unknown);
212
+ const shown = list.slice(0, 4).join(', ');
213
+ warnings.push(`Unknown token${list.length > 1 ? 's' : ''}: ${shown}${list.length > 4 ? ` (+${list.length - 4} more)` : ''} — check the token browser for exact names.`);
214
+ }
215
+ return warnings;
216
+ }
217
+ //# sourceMappingURL=theme-studio.constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-studio.constants.js","sourceRoot":"","sources":["../../src/ThemeStudio/theme-studio.constants.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Shared constants for the Theme Studio + Theme Manager.\n * @module ThemeStudio\n */\n\nimport { ContrastCheck, DerivedTheme, hexToOKLCH, oklchToHex, ThemeSeeds } from '@memberjunction/theme-engine';\n\n/**\n * The seeded, built-in MemberJunction theme (created by migration\n * V202607202101__v5.49.x__Add_Theme_Entity.sql with this stable, hardcoded ID).\n * It is protected from edit and delete so there is always a safe fallback theme,\n * regardless of what the user does to their own themes. Duplicating it is allowed.\n */\nexport const MJ_BUILTIN_THEME_ID = '64A6B519-CFBA-4F25-98D4-8398D397E21C';\n\n/** Whether a theme id is the protected built-in MemberJunction theme (case-insensitive). */\nexport function isBuiltInTheme(id: string | null | undefined): boolean {\n return !!id && id.toUpperCase() === MJ_BUILTIN_THEME_ID;\n}\n\n/** A chrome selector a themer can target from Custom CSS, with a one-line description. */\nexport interface ChromeSelectorInfo {\n selector: string;\n description: string;\n}\n\n/**\n * Real MJ chrome selectors a themer can target from Custom CSS — component element\n * tags (Angular selectors) + the shell logo class, each with a one-line description\n * so the catalog can render as clickable chips instead of hiding behind typing.\n * Curated to the persistent chrome worth theming (not transient dialogs/resources).\n * Element tags are reliable targets; internal component classes are view-encapsulated\n * and generally not selectable from an overlay.\n */\nexport const MJ_CHROME_SELECTOR_INFO: ChromeSelectorInfo[] = [\n { selector: 'mj-shell', description: 'The top-level app shell (header bar + workspace)' },\n { selector: 'mj-app-nav', description: 'Top app navigation strip' },\n { selector: 'mj-app-switcher', description: 'App switcher menu' },\n { selector: 'mj-tab-container', description: 'Workspace tab strip + tab content host' },\n { selector: 'mj-single-dashboard', description: 'Dashboard resource host' },\n { selector: 'mj-single-record', description: 'Record form resource host' },\n { selector: 'mj-single-query', description: 'Query resource host' },\n { selector: 'mj-single-search-result', description: 'Search results resource host' },\n { selector: 'mj-command-palette', description: 'Cmd/Ctrl-K command palette' },\n { selector: 'mj-omnibar-palette', description: 'Omnibar search palette' },\n { selector: 'mj-notifications-resource', description: 'Notifications panel' },\n { selector: 'mj-empty-state', description: 'Empty-state placeholder blocks' },\n { selector: 'mj-loading', description: 'Loading indicator (animated logo)' },\n { selector: 'mj-dialog', description: 'Modal dialogs' },\n { selector: 'mj-dialog-actions', description: 'Dialog footer action row' },\n { selector: 'mj-profile-dialog', description: 'User profile dialog' },\n { selector: 'mj-server-connectivity-banner', description: 'Server connectivity banner' },\n { selector: 'mj-system-validation-banner', description: 'System validation banner' },\n { selector: '.mj-logo', description: 'The shell logo element' },\n];\n\n/** Flat selector list (autocomplete + validation). */\nexport const MJ_CHROME_SELECTORS: string[] = MJ_CHROME_SELECTOR_INFO.map((i) => i.selector);\n\n/** One category in the visual token browser. */\nexport interface TokenCategory {\n key: string;\n label: string;\n match: RegExp;\n}\n\n/**\n * Categories for the visual token browser, in display order. A token lands in the\n * first category whose regex matches; anything unmatched (e.g. an override of a base\n * token outside the derived contract) falls into the trailing \"Other\" bucket the\n * component appends.\n */\nexport const TOKEN_CATEGORIES: TokenCategory[] = [\n { key: 'brand', label: 'Brand', match: /^--mj-brand-/ },\n { key: 'bg', label: 'Backgrounds', match: /^--mj-bg-/ },\n { key: 'text', label: 'Text', match: /^--mj-text-/ },\n { key: 'border', label: 'Borders', match: /^--mj-border-/ },\n { key: 'status', label: 'Status', match: /^--mj-status-/ },\n { key: 'viz', label: 'Viz', match: /^--mj-viz-/ },\n { key: 'shape', label: 'Shape', match: /^--mj-(radius|shadow)-/ },\n { key: 'type', label: 'Type', match: /^--mj-font-/ },\n { key: 'ramps', label: 'Ramps (primitives)', match: /^--mj-color-/ },\n];\n\n/**\n * Reverse-highlight map: token name → selectors INSIDE the preview canvas whose\n * rendering uses that token. The canvas markup + CSS are authored in this package,\n * so this mapping is exact by construction (unlike inferring provenance from\n * resolved styles, which is deliberately out of scope). Tokens without an entry\n * simply don't highlight. Selectors are matched under `.ts-canvas`.\n */\nexport const TOKEN_PREVIEW_TARGETS: Record<string, string[]> = {\n '--mj-brand-primary': ['.mx-btn.pri', '.mx-av', '.mx-appico', '.mx-tabs i.on', '.mx-prog i', '.mx-swch:not(.off)', '.rhead', 'table.grid th', '.ag-find .fdot', '.mx-btn.out'],\n '--mj-brand-primary-hover': ['.states-row .is-hover'],\n '--mj-brand-primary-active': ['.states-row .is-active'],\n '--mj-brand-on-primary': ['.mx-btn.pri', '.mx-av', '.rhead'],\n '--mj-brand-accent': ['.kpi', '.zone-lab'],\n '--mj-bg-page': ['.mx', '.pv-view'],\n '--mj-bg-surface': ['.mx-shell', '.mx-ph', '.mx-cell', '.mx-chip', '.report'],\n '--mj-bg-surface-card': ['.kpi', '.rfoot', '.ag-find', 'table.grid tr:nth-child(even) td'],\n '--mj-bg-surface-sunken': ['.mx-search', '.mx-input', '.mx-btn.sec', '.mx-dlg-t', '.mx-stat.neu'],\n '--mj-bg-surface-hover': ['.mx-nav b', '.mx-lnav b', '.mx-chip'],\n '--mj-text-primary': ['.mx-ph-title', '.mx-dlg-t', '.kpi .n', 'table.grid td b'],\n '--mj-text-secondary': ['.mx-lbl', '.mx-tabs i', 'table.grid td', '.ag-sum', '.bar .bv'],\n '--mj-text-muted': ['.mx-cap', '.mx-ph-sub', '.kpi .l', '.cats span', '.rfoot'],\n '--mj-border-default': ['.mx-cell', '.mx-shell', '.mx-input', '.mx-dlg', 'table.grid td'],\n '--mj-border-strong': ['.mx-swch.off'],\n '--mj-border-focus': ['.mx-input.focus', '.states-row .is-focus'],\n '--mj-status-success': ['.mx-stat.suc', '.kpi .d.up'],\n '--mj-status-success-bg': ['.mx-stat.suc'],\n '--mj-status-success-text': ['.mx-stat.suc'],\n '--mj-status-warning': ['.mx-stat.wrn'],\n '--mj-status-warning-bg': ['.mx-stat.wrn'],\n '--mj-status-warning-text': ['.mx-stat.wrn'],\n '--mj-status-error': ['.mx-btn.dgr', '.kpi .d.dn'],\n '--mj-status-info': ['.mx-alert'],\n '--mj-status-info-bg': ['.mx-alert'],\n '--mj-status-info-text': ['.mx-alert'],\n '--mj-status-info-border': ['.mx-alert'],\n '--mj-viz-1': ['.bar:nth-child(1) .fill'],\n '--mj-viz-2': ['.bar:nth-child(2) .fill'],\n '--mj-viz-3': ['.bar:nth-child(3) .fill'],\n '--mj-viz-4': ['.bar:nth-child(4) .fill'],\n '--mj-viz-5': ['.bar:nth-child(5) .fill'],\n '--mj-viz-6': ['.bar:nth-child(6) .fill'],\n '--mj-radius-sm': ['.mx-btn', '.mx-input', '.mx-alert'],\n '--mj-radius-md': ['.mx-cell', '.mx-dlg', '.kpi', '.ag-find'],\n '--mj-radius-lg': ['.mx', '.report'],\n '--mj-shadow-brand-md': ['.report'],\n '--mj-font-family': ['.mx-ph-title', '.ag-sum', '.kpi .n'],\n};\n\n/**\n * A curated intent that expands to a token-override set (Q2 recipes): taste-level\n * power with zero token names on screen. Values are computed at toggle-on time from\n * the CURRENT derived theme so they follow the brand; toggling off removes exactly\n * the keys the recipe produced. Fully reversible, serialized through the same\n * `Overrides` JSON as hand-edited tokens.\n */\nexport interface ThemeRecipe {\n id: string;\n name: string;\n description: string;\n tokens: (derived: DerivedTheme, seeds: ThemeSeeds) => Record<string, string>;\n}\n\n/** Reduce a hex color's OKLCH chroma by `factor` (0..1 = fully muted..unchanged). */\nfunction muteHex(hex: string, factor: number): string {\n const c = hexToOKLCH(hex);\n return oklchToHex({ ...c, c: c.c * factor });\n}\n\nexport const THEME_RECIPES: ThemeRecipe[] = [\n {\n id: 'flatter',\n name: 'Flatter look',\n description: 'Remove elevation shadows for a flat, print-like surface.',\n tokens: () => ({\n '--mj-shadow-brand-sm': 'none',\n '--mj-shadow-brand-md': 'none',\n '--mj-shadow-sm': 'none',\n '--mj-shadow-md': 'none',\n '--mj-shadow-lg': 'none',\n }),\n },\n {\n id: 'softer',\n name: 'Softer corners',\n description: 'Rounder radii across chrome and generated content.',\n tokens: (_derived, seeds) => {\n const base = Math.max(12, (seeds.radius ?? 8) * 1.5);\n const px = (n: number) => `${Math.round(n)}px`;\n return {\n '--mj-radius-sm': px(base / 2),\n '--mj-radius-md': px(base),\n '--mj-radius-lg': px(base * 1.5),\n '--mj-radius-xl': px(base * 2),\n '--mj-radius-2xl': px(base * 3),\n };\n },\n },\n {\n id: 'muted',\n name: 'Muted professional',\n description: 'Desaturate accent, tertiary, and chart colors for a quieter palette.',\n // Mutes the PRIMITIVE ramps (not the semantic tokens): every semantic token and\n // the dark block re-point off the primitives, so both modes stay correct.\n tokens: (derived) => {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(derived.primitives)) {\n if (/^--mj-color-(accent|tertiary)-/.test(k)) out[k] = muteHex(v, 0.4);\n }\n for (let i = 1; i <= 10; i++) {\n const v = derived.overlayVars[`--mj-viz-${i}`];\n if (v) out[`--mj-viz-${i}`] = muteHex(v, 0.45);\n }\n return out;\n },\n },\n];\n\n/** Parse a persisted Overrides JSON map: trims keys, drops blanks, coerces values to strings. */\nexport function parseOverridesJson(json: string | null): Record<string, string> {\n if (!json) return {};\n try {\n const obj = JSON.parse(json) as Record<string, string>;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (k.trim()) out[k.trim()] = String(v);\n }\n return out;\n } catch {\n return {};\n }\n}\n\n/**\n * Pick the WORST of the light/dark text-on-primary contrast checks (Q1#3) — a failing\n * dark pair must not hide while previewing light. A failing mode always beats a passing\n * one; between two of the same outcome, lower ratio wins.\n */\nexport function pickWorstOnPrimary(\n light: ContrastCheck | undefined,\n dark: ContrastCheck | undefined,\n): { check: ContrastCheck; mode: 'light' | 'dark' } | undefined {\n if (!light || !dark) {\n const only = light ?? dark;\n return only ? { check: only, mode: light ? 'light' : 'dark' } : undefined;\n }\n if (light.passes !== dark.passes) {\n return light.passes ? { check: dark, mode: 'dark' } : { check: light, mode: 'light' };\n }\n return light.ratio <= dark.ratio ? { check: light, mode: 'light' } : { check: dark, mode: 'dark' };\n}\n\n/** Inline custom-CSS validation (Q3#6): @import removal notice + unknown --mj-* names. */\nexport function buildCssWarnings(css: string, knownTokens: ReadonlySet<string>): string[] {\n const warnings: string[] = [];\n if (/@import\\b/i.test(css)) {\n warnings.push('@import is not supported and is removed on save.');\n }\n const unknown = new Set<string>();\n for (const match of css.matchAll(/--mj-[a-zA-Z0-9-]+/g)) {\n if (!knownTokens.has(match[0])) unknown.add(match[0]);\n }\n if (unknown.size > 0) {\n const list = Array.from(unknown);\n const shown = list.slice(0, 4).join(', ');\n warnings.push(\n `Unknown token${list.length > 1 ? 's' : ''}: ${shown}${list.length > 4 ? ` (+${list.length - 4} more)` : ''} — check the token browser for exact names.`,\n );\n }\n return warnings;\n}\n"]}
@@ -4,64 +4,68 @@ import * as i2 from "./BulkOperations/bulk-operations-operations.component";
4
4
  import * as i3 from "./BulkOperations/bulk-operations-run-history.component";
5
5
  import * as i4 from "./EntityAdmin/entity-admin-dashboard.component";
6
6
  import * as i5 from "./Home/home-dashboard.component";
7
- import * as i6 from "./Home/action-pin-config-dialog.component";
8
- import * as i7 from "./Home/action-pin-runner-dialog.component";
9
- import * as i8 from "./SystemDiagnostics/system-diagnostics.component";
10
- import * as i9 from "./DevTools/app-state-inspector.component";
11
- import * as i10 from "./DevTools/layout-inspector.component";
12
- import * as i11 from "./DevTools/class-registry.component";
13
- import * as i12 from "./DevTools/lazy-module-status.component";
14
- import * as i13 from "./DevTools/settings-explorer.component";
15
- import * as i14 from "./DevTools/event-monitor.component";
16
- import * as i15 from "./DevTools/graphql-console.component";
17
- import * as i16 from "./Admin/admin-dev-tools-resource.component";
18
- import * as i17 from "./Admin/admin-identity-access.component";
19
- import * as i18 from "./Admin/admin-data-schema.component";
20
- import * as i19 from "./Admin/admin-monitoring.component";
21
- import * as i20 from "./QueryBrowser/query-browser-resource.component";
22
- import * as i21 from "./DashboardBrowser/dashboard-browser-resource.component";
23
- import * as i22 from "./DashboardBrowser/dashboard-share-dialog.component";
24
- import * as i23 from "./APIKeys/api-keys-resource.component";
25
- import * as i24 from "./APIKeys/api-key-create-dialog.component";
26
- import * as i25 from "./APIKeys/api-key-edit-panel.component";
27
- import * as i26 from "./APIKeys/api-key-list.component";
28
- import * as i27 from "./APIKeys/api-applications-panel.component";
29
- import * as i28 from "./APIKeys/api-scopes-panel.component";
30
- import * as i29 from "./APIKeys/api-usage-panel.component";
31
- import * as i30 from "./ApplicationRoles/application-roles-resource.component";
32
- import * as i31 from "./RealtimeRecordings/realtime-recordings-dashboard.component";
33
- import * as i32 from "./Permissions/user-access-resource.component";
34
- import * as i33 from "./Permissions/resource-access-resource.component";
35
- import * as i34 from "./Permissions/audit-log-resource.component";
36
- import * as i35 from "./VersionHistory/components/labels-resource.component";
37
- import * as i36 from "./VersionHistory/components/diff-resource.component";
38
- import * as i37 from "./VersionHistory/components/restore-resource.component";
39
- import * as i38 from "./VersionHistory/components/graph-resource.component";
40
- import * as i39 from "@angular/common";
41
- import * as i40 from "@angular/forms";
42
- import * as i41 from "@memberjunction/ng-ui-components";
43
- import * as i42 from "@memberjunction/ng-container-directives";
44
- import * as i43 from "@memberjunction/ng-shared-generic";
45
- import * as i44 from "@memberjunction/ng-record-process-studio";
46
- import * as i45 from "@memberjunction/ng-code-editor";
47
- import * as i46 from "@memberjunction/ng-explorer-settings";
48
- import * as i47 from "@memberjunction/ng-entity-relationship-diagram";
49
- import * as i48 from "@memberjunction/ng-query-viewer";
50
- import * as i49 from "@memberjunction/ng-dashboard-viewer";
51
- import * as i50 from "@memberjunction/ng-versions";
52
- import * as i51 from "@memberjunction/ng-export-service";
53
- import * as i52 from "@memberjunction/ng-trees";
54
- import * as i53 from "@memberjunction/ng-resource-permissions";
55
- import * as i54 from "./shared/shared-pipes.module";
56
- import * as i55 from "angular-split";
57
- import * as i56 from "@memberjunction/ng-media-player";
7
+ import * as i6 from "./ThemeStudio/theme-studio-dashboard.component";
8
+ import * as i7 from "./ThemeStudio/theme-studio-resource.component";
9
+ import * as i8 from "./ThemeStudio/theme-manager-dashboard.component";
10
+ import * as i9 from "./ThemeStudio/theme-manager-resource.component";
11
+ import * as i10 from "./Home/action-pin-config-dialog.component";
12
+ import * as i11 from "./Home/action-pin-runner-dialog.component";
13
+ import * as i12 from "./SystemDiagnostics/system-diagnostics.component";
14
+ import * as i13 from "./DevTools/app-state-inspector.component";
15
+ import * as i14 from "./DevTools/layout-inspector.component";
16
+ import * as i15 from "./DevTools/class-registry.component";
17
+ import * as i16 from "./DevTools/lazy-module-status.component";
18
+ import * as i17 from "./DevTools/settings-explorer.component";
19
+ import * as i18 from "./DevTools/event-monitor.component";
20
+ import * as i19 from "./DevTools/graphql-console.component";
21
+ import * as i20 from "./Admin/admin-dev-tools-resource.component";
22
+ import * as i21 from "./Admin/admin-identity-access.component";
23
+ import * as i22 from "./Admin/admin-data-schema.component";
24
+ import * as i23 from "./Admin/admin-monitoring.component";
25
+ import * as i24 from "./QueryBrowser/query-browser-resource.component";
26
+ import * as i25 from "./DashboardBrowser/dashboard-browser-resource.component";
27
+ import * as i26 from "./DashboardBrowser/dashboard-share-dialog.component";
28
+ import * as i27 from "./APIKeys/api-keys-resource.component";
29
+ import * as i28 from "./APIKeys/api-key-create-dialog.component";
30
+ import * as i29 from "./APIKeys/api-key-edit-panel.component";
31
+ import * as i30 from "./APIKeys/api-key-list.component";
32
+ import * as i31 from "./APIKeys/api-applications-panel.component";
33
+ import * as i32 from "./APIKeys/api-scopes-panel.component";
34
+ import * as i33 from "./APIKeys/api-usage-panel.component";
35
+ import * as i34 from "./ApplicationRoles/application-roles-resource.component";
36
+ import * as i35 from "./RealtimeRecordings/realtime-recordings-dashboard.component";
37
+ import * as i36 from "./Permissions/user-access-resource.component";
38
+ import * as i37 from "./Permissions/resource-access-resource.component";
39
+ import * as i38 from "./Permissions/audit-log-resource.component";
40
+ import * as i39 from "./VersionHistory/components/labels-resource.component";
41
+ import * as i40 from "./VersionHistory/components/diff-resource.component";
42
+ import * as i41 from "./VersionHistory/components/restore-resource.component";
43
+ import * as i42 from "./VersionHistory/components/graph-resource.component";
44
+ import * as i43 from "@angular/common";
45
+ import * as i44 from "@angular/forms";
46
+ import * as i45 from "@memberjunction/ng-ui-components";
47
+ import * as i46 from "@memberjunction/ng-container-directives";
48
+ import * as i47 from "@memberjunction/ng-shared-generic";
49
+ import * as i48 from "@memberjunction/ng-record-process-studio";
50
+ import * as i49 from "@memberjunction/ng-code-editor";
51
+ import * as i50 from "@memberjunction/ng-explorer-settings";
52
+ import * as i51 from "@memberjunction/ng-entity-relationship-diagram";
53
+ import * as i52 from "@memberjunction/ng-query-viewer";
54
+ import * as i53 from "@memberjunction/ng-dashboard-viewer";
55
+ import * as i54 from "@memberjunction/ng-versions";
56
+ import * as i55 from "@memberjunction/ng-export-service";
57
+ import * as i56 from "@memberjunction/ng-trees";
58
+ import * as i57 from "@memberjunction/ng-resource-permissions";
59
+ import * as i58 from "./shared/shared-pipes.module";
60
+ import * as i59 from "angular-split";
61
+ import * as i60 from "@memberjunction/ng-media-player";
58
62
  /**
59
63
  * CoreDashboardsModule — eagerly loaded core features: Home, EntityAdmin,
60
64
  * SystemDiagnostics, QueryBrowser, DashboardBrowser, APIKeys, VersionHistory.
61
65
  */
62
66
  export declare class CoreDashboardsModule {
63
67
  static ɵfac: i0.ɵɵFactoryDeclaration<CoreDashboardsModule, never>;
64
- static ɵmod: i0.ɵɵNgModuleDeclaration<CoreDashboardsModule, [typeof i1.BulkOperationsContainerComponent, typeof i2.BulkOperationsOperationsComponent, typeof i3.BulkOperationsRunHistoryComponent, typeof i4.EntityAdminDashboardComponent, typeof i5.HomeDashboardComponent, typeof i6.ActionPinConfigDialogComponent, typeof i7.ActionPinRunnerDialogComponent, typeof i8.SystemDiagnosticsComponent, typeof i9.AppStateInspectorComponent, typeof i10.LayoutInspectorComponent, typeof i11.ClassRegistryInspectorComponent, typeof i12.LazyModuleStatusComponent, typeof i13.SettingsExplorerComponent, typeof i14.EventMonitorComponent, typeof i15.GraphQLConsoleComponent, typeof i16.AdminDevToolsResourceComponent, typeof i17.AdminIdentityAccessComponent, typeof i18.AdminDataSchemaComponent, typeof i19.AdminMonitoringComponent, typeof i20.QueryBrowserResourceComponent, typeof i21.DashboardBrowserResourceComponent, typeof i22.DashboardShareDialogComponent, typeof i23.APIKeysResourceComponent, typeof i24.APIKeyCreateDialogComponent, typeof i25.APIKeyEditPanelComponent, typeof i26.APIKeyListComponent, typeof i27.APIApplicationsPanelComponent, typeof i28.APIScopesPanelComponent, typeof i29.APIUsagePanelComponent, typeof i30.ApplicationRolesResourceComponent, typeof i31.RealtimeRecordingsDashboardComponent, typeof i32.PermissionsUserAccessResourceComponent, typeof i33.PermissionsResourceAccessResourceComponent, typeof i34.PermissionsAuditLogResourceComponent, typeof i35.VersionHistoryLabelsResourceComponent, typeof i36.VersionHistoryDiffResourceComponent, typeof i37.VersionHistoryRestoreResourceComponent, typeof i38.VersionHistoryGraphResourceComponent], [typeof i39.CommonModule, typeof i40.FormsModule, typeof i40.ReactiveFormsModule, typeof i41.MJButtonDirective, typeof i41.MJClickableDirective, typeof i41.MJDatepickerComponent, typeof i41.MJWindowComponent, typeof i41.MJWindowTitlebarComponent, typeof i41.MJDropdownComponent, typeof i41.MJComboboxComponent, typeof i41.MJPageHeaderComponent, typeof i41.MJPageLayoutComponent, typeof i41.MJPageBodyComponent, typeof i41.MJPageSearchComponent, typeof i41.MJFilterPopoverComponent, typeof i41.MJFilterPanelComponent, typeof i41.MJFilterChipComponent, typeof i41.MJPageHeaderInteriorComponent, typeof i41.MJPageBodyInteriorComponent, typeof i41.MJViewToggleComponent, typeof i41.MJStatBadgeComponent, typeof i41.MJRefreshButtonComponent, typeof i41.MJLeftNavComponent, typeof i41.MJLeftNavContentComponent, typeof i41.MJTabNavComponent, typeof i41.MJEmptyStateComponent, typeof i41.MJAlertComponent, typeof i41.MJAccordionModule, typeof i42.ContainerDirectivesModule, typeof i43.SharedGenericModule, typeof i44.RecordProcessStudioComponent, typeof i44.RecordProcessHistoryComponent, typeof i45.CodeEditorModule, typeof i46.ExplorerSettingsModule, typeof i47.EntityRelationshipDiagramModule, typeof i48.QueryViewerModule, typeof i49.DashboardViewerModule, typeof i50.VersionsModule, typeof i51.ExportServiceModule, typeof i52.NgTreesModule, typeof i53.ResourcePermissionsModule, typeof i54.SharedPipesModule, typeof i55.AngularSplitModule, typeof i56.MJStorageMediaPlayerComponent], [typeof i1.BulkOperationsContainerComponent, typeof i2.BulkOperationsOperationsComponent, typeof i3.BulkOperationsRunHistoryComponent, typeof i4.EntityAdminDashboardComponent, typeof i5.HomeDashboardComponent, typeof i8.SystemDiagnosticsComponent, typeof i9.AppStateInspectorComponent, typeof i10.LayoutInspectorComponent, typeof i11.ClassRegistryInspectorComponent, typeof i12.LazyModuleStatusComponent, typeof i13.SettingsExplorerComponent, typeof i14.EventMonitorComponent, typeof i15.GraphQLConsoleComponent, typeof i16.AdminDevToolsResourceComponent, typeof i17.AdminIdentityAccessComponent, typeof i18.AdminDataSchemaComponent, typeof i19.AdminMonitoringComponent, typeof i20.QueryBrowserResourceComponent, typeof i21.DashboardBrowserResourceComponent, typeof i22.DashboardShareDialogComponent, typeof i23.APIKeysResourceComponent, typeof i24.APIKeyCreateDialogComponent, typeof i25.APIKeyEditPanelComponent, typeof i26.APIKeyListComponent, typeof i27.APIApplicationsPanelComponent, typeof i28.APIScopesPanelComponent, typeof i29.APIUsagePanelComponent, typeof i30.ApplicationRolesResourceComponent, typeof i31.RealtimeRecordingsDashboardComponent, typeof i32.PermissionsUserAccessResourceComponent, typeof i33.PermissionsResourceAccessResourceComponent, typeof i34.PermissionsAuditLogResourceComponent, typeof i35.VersionHistoryLabelsResourceComponent, typeof i36.VersionHistoryDiffResourceComponent, typeof i37.VersionHistoryRestoreResourceComponent, typeof i38.VersionHistoryGraphResourceComponent, typeof i54.SharedPipesModule]>;
68
+ static ɵmod: i0.ɵɵNgModuleDeclaration<CoreDashboardsModule, [typeof i1.BulkOperationsContainerComponent, typeof i2.BulkOperationsOperationsComponent, typeof i3.BulkOperationsRunHistoryComponent, typeof i4.EntityAdminDashboardComponent, typeof i5.HomeDashboardComponent, typeof i6.ThemeStudioDashboardComponent, typeof i7.ThemeStudioResourceComponent, typeof i8.ThemeManagerDashboardComponent, typeof i9.ThemeManagerResourceComponent, typeof i10.ActionPinConfigDialogComponent, typeof i11.ActionPinRunnerDialogComponent, typeof i12.SystemDiagnosticsComponent, typeof i13.AppStateInspectorComponent, typeof i14.LayoutInspectorComponent, typeof i15.ClassRegistryInspectorComponent, typeof i16.LazyModuleStatusComponent, typeof i17.SettingsExplorerComponent, typeof i18.EventMonitorComponent, typeof i19.GraphQLConsoleComponent, typeof i20.AdminDevToolsResourceComponent, typeof i21.AdminIdentityAccessComponent, typeof i22.AdminDataSchemaComponent, typeof i23.AdminMonitoringComponent, typeof i24.QueryBrowserResourceComponent, typeof i25.DashboardBrowserResourceComponent, typeof i26.DashboardShareDialogComponent, typeof i27.APIKeysResourceComponent, typeof i28.APIKeyCreateDialogComponent, typeof i29.APIKeyEditPanelComponent, typeof i30.APIKeyListComponent, typeof i31.APIApplicationsPanelComponent, typeof i32.APIScopesPanelComponent, typeof i33.APIUsagePanelComponent, typeof i34.ApplicationRolesResourceComponent, typeof i35.RealtimeRecordingsDashboardComponent, typeof i36.PermissionsUserAccessResourceComponent, typeof i37.PermissionsResourceAccessResourceComponent, typeof i38.PermissionsAuditLogResourceComponent, typeof i39.VersionHistoryLabelsResourceComponent, typeof i40.VersionHistoryDiffResourceComponent, typeof i41.VersionHistoryRestoreResourceComponent, typeof i42.VersionHistoryGraphResourceComponent], [typeof i43.CommonModule, typeof i44.FormsModule, typeof i44.ReactiveFormsModule, typeof i45.MJButtonDirective, typeof i45.MJClickableDirective, typeof i45.MJDatepickerComponent, typeof i45.MJWindowComponent, typeof i45.MJWindowTitlebarComponent, typeof i45.MJDropdownComponent, typeof i45.MJComboboxComponent, typeof i45.MJPageHeaderComponent, typeof i45.MJPageLayoutComponent, typeof i45.MJPageBodyComponent, typeof i45.MJPageSearchComponent, typeof i45.MJFilterPopoverComponent, typeof i45.MJFilterPanelComponent, typeof i45.MJFilterChipComponent, typeof i45.MJPageHeaderInteriorComponent, typeof i45.MJPageBodyInteriorComponent, typeof i45.MJViewToggleComponent, typeof i45.MJStatBadgeComponent, typeof i45.MJRefreshButtonComponent, typeof i45.MJLeftNavComponent, typeof i45.MJLeftNavContentComponent, typeof i45.MJSwitchComponent, typeof i45.MJTabNavComponent, typeof i45.MJEmptyStateComponent, typeof i45.MJAlertComponent, typeof i45.MJAccordionModule, typeof i46.ContainerDirectivesModule, typeof i47.SharedGenericModule, typeof i48.RecordProcessStudioComponent, typeof i48.RecordProcessHistoryComponent, typeof i49.CodeEditorModule, typeof i50.ExplorerSettingsModule, typeof i51.EntityRelationshipDiagramModule, typeof i52.QueryViewerModule, typeof i53.DashboardViewerModule, typeof i54.VersionsModule, typeof i55.ExportServiceModule, typeof i56.NgTreesModule, typeof i57.ResourcePermissionsModule, typeof i58.SharedPipesModule, typeof i59.AngularSplitModule, typeof i60.MJStorageMediaPlayerComponent], [typeof i1.BulkOperationsContainerComponent, typeof i2.BulkOperationsOperationsComponent, typeof i3.BulkOperationsRunHistoryComponent, typeof i4.EntityAdminDashboardComponent, typeof i5.HomeDashboardComponent, typeof i6.ThemeStudioDashboardComponent, typeof i7.ThemeStudioResourceComponent, typeof i8.ThemeManagerDashboardComponent, typeof i9.ThemeManagerResourceComponent, typeof i12.SystemDiagnosticsComponent, typeof i13.AppStateInspectorComponent, typeof i14.LayoutInspectorComponent, typeof i15.ClassRegistryInspectorComponent, typeof i16.LazyModuleStatusComponent, typeof i17.SettingsExplorerComponent, typeof i18.EventMonitorComponent, typeof i19.GraphQLConsoleComponent, typeof i20.AdminDevToolsResourceComponent, typeof i21.AdminIdentityAccessComponent, typeof i22.AdminDataSchemaComponent, typeof i23.AdminMonitoringComponent, typeof i24.QueryBrowserResourceComponent, typeof i25.DashboardBrowserResourceComponent, typeof i26.DashboardShareDialogComponent, typeof i27.APIKeysResourceComponent, typeof i28.APIKeyCreateDialogComponent, typeof i29.APIKeyEditPanelComponent, typeof i30.APIKeyListComponent, typeof i31.APIApplicationsPanelComponent, typeof i32.APIScopesPanelComponent, typeof i33.APIUsagePanelComponent, typeof i34.ApplicationRolesResourceComponent, typeof i35.RealtimeRecordingsDashboardComponent, typeof i36.PermissionsUserAccessResourceComponent, typeof i37.PermissionsResourceAccessResourceComponent, typeof i38.PermissionsAuditLogResourceComponent, typeof i39.VersionHistoryLabelsResourceComponent, typeof i40.VersionHistoryDiffResourceComponent, typeof i41.VersionHistoryRestoreResourceComponent, typeof i42.VersionHistoryGraphResourceComponent, typeof i58.SharedPipesModule]>;
65
69
  static ɵinj: i0.ɵɵInjectorDeclaration<CoreDashboardsModule>;
66
70
  }
67
71
  export type { ShareDialogResult } from './DashboardBrowser/dashboard-share-dialog.component';
@@ -1 +1 @@
1
- {"version":3,"file":"core-dashboards.module.d.ts","sourceRoot":"","sources":["../src/core-dashboards.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiGA;;;GAGG;AACH,qBAoIa,oBAAoB;yCAApB,oBAAoB;0CAApB,oBAAoB;0CAApB,oBAAoB;CAAI;AAGrC,YAAY,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;AAC7F,OAAO,EAAE,6BAA6B,EAAE,MAAM,qDAAqD,CAAC;AAIpG,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"core-dashboards.module.d.ts","sourceRoot":"","sources":["../src/core-dashboards.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsGA;;;GAGG;AACH,qBA6Ia,oBAAoB;yCAApB,oBAAoB;0CAApB,oBAAoB;0CAApB,oBAAoB;CAAI;AAGrC,YAAY,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;AAC7F,OAAO,EAAE,6BAA6B,EAAE,MAAM,qDAAqD,CAAC;AAIpG,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { NgModule } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4
- import { MJButtonDirective, MJClickableDirective, MJDatepickerComponent, MJWindowComponent, MJWindowTitlebarComponent, MJDropdownComponent, MJComboboxComponent, MJPageHeaderComponent, MJPageLayoutComponent, MJPageBodyComponent, MJPageSearchComponent, MJFilterPopoverComponent, MJFilterPanelComponent, MJFilterChipComponent, MJPageHeaderInteriorComponent, MJPageBodyInteriorComponent, MJViewToggleComponent, MJStatBadgeComponent, MJRefreshButtonComponent, MJLeftNavComponent, MJLeftNavContentComponent, MJTabNavComponent, MJEmptyStateComponent, MJAlertComponent, MJAccordionModule } from '@memberjunction/ng-ui-components';
4
+ import { MJButtonDirective, MJClickableDirective, MJDatepickerComponent, MJWindowComponent, MJWindowTitlebarComponent, MJDropdownComponent, MJComboboxComponent, MJPageHeaderComponent, MJPageLayoutComponent, MJPageBodyComponent, MJPageSearchComponent, MJFilterPopoverComponent, MJFilterPanelComponent, MJFilterChipComponent, MJPageHeaderInteriorComponent, MJPageBodyInteriorComponent, MJViewToggleComponent, MJStatBadgeComponent, MJRefreshButtonComponent, MJLeftNavComponent, MJLeftNavContentComponent, MJSwitchComponent, MJTabNavComponent, MJEmptyStateComponent, MJAlertComponent, MJAccordionModule } from '@memberjunction/ng-ui-components';
5
5
  import { ContainerDirectivesModule } from '@memberjunction/ng-container-directives';
6
6
  import { SharedGenericModule } from '@memberjunction/ng-shared-generic';
7
7
  import { CodeEditorModule } from '@memberjunction/ng-code-editor';
@@ -20,6 +20,10 @@ import { HomeDashboardComponent } from './Home/home-dashboard.component';
20
20
  import { ActionPinConfigDialogComponent } from './Home/action-pin-config-dialog.component';
21
21
  import { ActionPinRunnerDialogComponent } from './Home/action-pin-runner-dialog.component';
22
22
  import { SystemDiagnosticsComponent } from './SystemDiagnostics/system-diagnostics.component';
23
+ import { ThemeStudioDashboardComponent } from './ThemeStudio/theme-studio-dashboard.component';
24
+ import { ThemeStudioResourceComponent } from './ThemeStudio/theme-studio-resource.component';
25
+ import { ThemeManagerDashboardComponent } from './ThemeStudio/theme-manager-dashboard.component';
26
+ import { ThemeManagerResourceComponent } from './ThemeStudio/theme-manager-resource.component';
23
27
  // Developer Tools
24
28
  import { AppStateInspectorComponent } from './DevTools/app-state-inspector.component';
25
29
  import { LayoutInspectorComponent } from './DevTools/layout-inspector.component';
@@ -93,6 +97,7 @@ export class CoreDashboardsModule {
93
97
  MJRefreshButtonComponent,
94
98
  MJLeftNavComponent,
95
99
  MJLeftNavContentComponent,
100
+ MJSwitchComponent,
96
101
  MJTabNavComponent,
97
102
  MJEmptyStateComponent,
98
103
  MJAlertComponent,
@@ -123,6 +128,10 @@ export class CoreDashboardsModule {
123
128
  BulkOperationsRunHistoryComponent,
124
129
  EntityAdminDashboardComponent,
125
130
  HomeDashboardComponent,
131
+ ThemeStudioDashboardComponent,
132
+ ThemeStudioResourceComponent,
133
+ ThemeManagerDashboardComponent,
134
+ ThemeManagerResourceComponent,
126
135
  ActionPinConfigDialogComponent,
127
136
  ActionPinRunnerDialogComponent,
128
137
  SystemDiagnosticsComponent,
@@ -187,6 +196,7 @@ export class CoreDashboardsModule {
187
196
  MJRefreshButtonComponent,
188
197
  MJLeftNavComponent,
189
198
  MJLeftNavContentComponent,
199
+ MJSwitchComponent,
190
200
  MJTabNavComponent,
191
201
  MJEmptyStateComponent,
192
202
  MJAlertComponent,
@@ -214,6 +224,10 @@ export class CoreDashboardsModule {
214
224
  BulkOperationsRunHistoryComponent,
215
225
  EntityAdminDashboardComponent,
216
226
  HomeDashboardComponent,
227
+ ThemeStudioDashboardComponent,
228
+ ThemeStudioResourceComponent,
229
+ ThemeManagerDashboardComponent,
230
+ ThemeManagerResourceComponent,
217
231
  SystemDiagnosticsComponent,
218
232
  AppStateInspectorComponent,
219
233
  LayoutInspectorComponent,
@@ -254,6 +268,10 @@ export class CoreDashboardsModule {
254
268
  BulkOperationsRunHistoryComponent,
255
269
  EntityAdminDashboardComponent,
256
270
  HomeDashboardComponent,
271
+ ThemeStudioDashboardComponent,
272
+ ThemeStudioResourceComponent,
273
+ ThemeManagerDashboardComponent,
274
+ ThemeManagerResourceComponent,
257
275
  ActionPinConfigDialogComponent,
258
276
  ActionPinRunnerDialogComponent,
259
277
  SystemDiagnosticsComponent,
@@ -315,6 +333,7 @@ export class CoreDashboardsModule {
315
333
  MJRefreshButtonComponent,
316
334
  MJLeftNavComponent,
317
335
  MJLeftNavContentComponent,
336
+ MJSwitchComponent,
318
337
  MJTabNavComponent,
319
338
  MJEmptyStateComponent,
320
339
  MJAlertComponent,
@@ -339,6 +358,10 @@ export class CoreDashboardsModule {
339
358
  BulkOperationsRunHistoryComponent,
340
359
  EntityAdminDashboardComponent,
341
360
  HomeDashboardComponent,
361
+ ThemeStudioDashboardComponent,
362
+ ThemeStudioResourceComponent,
363
+ ThemeManagerDashboardComponent,
364
+ ThemeManagerResourceComponent,
342
365
  SystemDiagnosticsComponent,
343
366
  AppStateInspectorComponent,
344
367
  LayoutInspectorComponent,