retold-data-service 2.1.1 → 2.1.5

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 (89) hide show
  1. package/BUILDING-AND-PUBLISHING.md +2 -2
  2. package/Dockerfile +1 -1
  3. package/README.md +12 -27
  4. package/build-all.js +66 -0
  5. package/diagrams/architecture.excalidraw +2966 -0
  6. package/diagrams/architecture.mmd +17 -0
  7. package/diagrams/architecture.svg +2 -0
  8. package/docs/README.md +12 -12
  9. package/docs/_brand.json +18 -0
  10. package/docs/_cover.md +1 -1
  11. package/docs/_topbar.md +1 -1
  12. package/docs/_version.json +3 -3
  13. package/docs/api/reference.md +8 -8
  14. package/docs/architecture.md +6 -84
  15. package/docs/diagrams/component-diagram.excalidraw +2807 -0
  16. package/docs/diagrams/component-diagram.mmd +14 -0
  17. package/docs/diagrams/component-diagram.svg +2 -0
  18. package/docs/diagrams/component-stack.excalidraw +1169 -0
  19. package/docs/diagrams/component-stack.mmd +6 -0
  20. package/docs/diagrams/component-stack.svg +2 -0
  21. package/docs/diagrams/hook-execution-order.excalidraw +3230 -0
  22. package/docs/diagrams/hook-execution-order.mmd +19 -0
  23. package/docs/diagrams/hook-execution-order.svg +2 -0
  24. package/docs/diagrams/initialization-flow.excalidraw +1800 -0
  25. package/docs/diagrams/initialization-flow.mmd +22 -0
  26. package/docs/diagrams/initialization-flow.svg +2 -0
  27. package/docs/index.html +6 -7
  28. package/docs/lifecycle-hooks.md +2 -21
  29. package/docs/retold-catalog.json +141 -141
  30. package/docs/retold-keyword-index.json +6818 -1608
  31. package/package.json +130 -96
  32. package/source/services/RetoldDataService-Brand.js +13 -0
  33. package/source/services/comprehension-loader/pict-app/Pict-Application-ComprehensionLoader.js +65 -15
  34. package/source/services/comprehension-loader/pict-app/providers/Pict-Provider-ComprehensionLoader.js +2 -2
  35. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Layout.js +68 -114
  36. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Load.js +29 -29
  37. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Schema.js +3 -3
  38. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Session.js +2 -2
  39. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-SettingsPanel.js +62 -0
  40. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Shell.js +142 -0
  41. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Source.js +7 -7
  42. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-StatusBar.js +125 -0
  43. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-StatusDetail.js +89 -0
  44. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-TopBar-Nav.js +42 -0
  45. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-TopBar-User.js +48 -0
  46. package/source/services/comprehension-loader/web/comprehension-loader.js +5475 -6243
  47. package/source/services/comprehension-loader/web/comprehension-loader.js.map +1 -1
  48. package/source/services/comprehension-loader/web/comprehension-loader.min.js +75 -1
  49. package/source/services/comprehension-loader/web/comprehension-loader.min.js.map +1 -1
  50. package/source/services/comprehension-loader/web/favicons/favicon-dark.svg +13 -0
  51. package/source/services/comprehension-loader/web/favicons/favicon-light.svg +13 -0
  52. package/source/services/comprehension-loader/web/favicons/favicon.svg +13 -0
  53. package/source/services/comprehension-loader/web/index.html +3 -0
  54. package/source/services/comprehension-loader/web/pict.min.js +12 -0
  55. package/source/services/data-cloner/DataCloner-Command-Headless.js +2 -1
  56. package/source/services/data-cloner/DataCloner-Command-Sync.js +110 -75
  57. package/source/services/data-cloner/pict-app/Pict-Application-DataCloner.js +70 -47
  58. package/source/services/data-cloner/pict-app/providers/Pict-Provider-DataCloner.js +3 -3
  59. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Connection.js +1 -1
  60. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Deploy.js +5 -5
  61. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Export.js +11 -11
  62. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Layout.js +89 -135
  63. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Schema.js +3 -3
  64. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Session.js +2 -2
  65. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-SettingsPanel.js +61 -0
  66. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Shell.js +136 -0
  67. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-StatusBar.js +117 -0
  68. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-StatusDetail.js +81 -0
  69. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Sync.js +38 -38
  70. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-TopBar-Nav.js +42 -0
  71. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-TopBar-User.js +48 -0
  72. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-ViewData.js +5 -5
  73. package/source/services/data-cloner/web/data-cloner.js +5855 -8067
  74. package/source/services/data-cloner/web/data-cloner.js.map +1 -1
  75. package/source/services/data-cloner/web/data-cloner.min.js +75 -1
  76. package/source/services/data-cloner/web/data-cloner.min.js.map +1 -1
  77. package/source/services/data-cloner/web/favicons/favicon-dark.svg +13 -0
  78. package/source/services/data-cloner/web/favicons/favicon-light.svg +13 -0
  79. package/source/services/data-cloner/web/favicons/favicon.svg +13 -0
  80. package/source/services/data-cloner/web/favicons/favicons/favicon-dark.svg +13 -0
  81. package/source/services/data-cloner/web/favicons/favicons/favicon-light.svg +13 -0
  82. package/source/services/data-cloner/web/favicons/favicons/favicon.svg +13 -0
  83. package/source/services/data-cloner/web/index.html +3 -0
  84. package/source/services/data-cloner/web/pict.min.js +12 -0
  85. package/test/Bundles_smoke_tests.js +43 -0
  86. package/test/ComprehensionLoader_smoke_tests.js +95 -0
  87. package/test/DataCloner-RuntimeOverrides_tests.js +344 -0
  88. package/test/DataCloner_smoke_tests.js +87 -0
  89. package/docs/css/docuserve.css +0 -327
@@ -42,37 +42,6 @@ class ComprehensionLoaderLayoutView extends libPictView
42
42
  tmpCards[i].classList.remove('open');
43
43
  }
44
44
  }
45
-
46
- toggleStatusDetail()
47
- {
48
- let tmpDetail = document.getElementById('liveStatusDetail');
49
- let tmpMeta = document.getElementById('liveStatusMeta');
50
- let tmpMessage = document.getElementById('liveStatusMessage');
51
- let tmpToggle = document.getElementById('liveStatusToggle');
52
- let tmpBar = document.getElementById('liveStatusBar');
53
- if (!tmpDetail) return;
54
-
55
- let tmpIsExpanded = tmpDetail.style.display !== 'none';
56
-
57
- if (tmpIsExpanded)
58
- {
59
- tmpDetail.style.display = 'none';
60
- tmpMeta.style.display = '';
61
- tmpMessage.style.display = '';
62
- tmpToggle.innerHTML = '▼';
63
- tmpBar.classList.remove('expanded');
64
- this.pict.providers.ComprehensionLoader.onStatusDetailCollapsed();
65
- }
66
- else
67
- {
68
- tmpDetail.style.display = '';
69
- tmpMeta.style.display = 'none';
70
- tmpMessage.style.display = 'none';
71
- tmpToggle.innerHTML = '▲';
72
- tmpBar.classList.add('expanded');
73
- this.pict.providers.ComprehensionLoader.onStatusDetailExpanded();
74
- }
75
- }
76
45
  }
77
46
 
78
47
  module.exports = ComprehensionLoaderLayoutView;
@@ -81,61 +50,61 @@ module.exports.default_configuration =
81
50
  {
82
51
  ViewIdentifier: 'ComprehensionLoader-Layout',
83
52
  DefaultRenderable: 'ComprehensionLoader-Layout',
84
- DefaultDestinationAddress: '#ComprehensionLoader-Application-Container',
53
+ DefaultDestinationAddress: '#ComprehensionLoader-Workspace',
85
54
  CSS: /*css*/`
86
55
  * { box-sizing: border-box; margin: 0; padding: 0; }
87
- body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f5f5f5; color: #333; padding: 20px; }
88
- h1 { margin-bottom: 20px; color: #1a1a1a; }
89
- h2 { margin-bottom: 12px; color: #444; font-size: 1.2em; border-bottom: 2px solid #ddd; padding-bottom: 6px; }
56
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--theme-color-background-secondary, #f5f5f5); color: var(--theme-color-text-primary, #333); padding: 20px; }
57
+ h1 { margin-bottom: 20px; color: var(--theme-color-text-primary, #1a1a1a); }
58
+ h2 { margin-bottom: 12px; color: var(--theme-color-text-secondary, #444); font-size: 1.2em; border-bottom: 2px solid var(--theme-color-border-default, #ddd); padding-bottom: 6px; }
90
59
 
91
- .section { background: #fff; border-radius: 8px; padding: 20px; margin-bottom: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
60
+ .section { background: var(--theme-color-background-panel, #fff); border-radius: 8px; padding: 20px; margin-bottom: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
92
61
 
93
62
  /* Accordion layout */
94
63
  .accordion-row { display: flex; gap: 0; margin-bottom: 16px; align-items: stretch; }
95
64
  .accordion-number {
96
65
  flex: 0 0 48px; display: flex; align-items: flex-start; justify-content: center;
97
- padding-top: 16px; font-size: 1.6em; font-weight: 700; color: #4a90d9;
66
+ padding-top: 16px; font-size: 1.6em; font-weight: 700; color: var(--theme-color-brand-primary, #4a90d9);
98
67
  user-select: none;
99
68
  }
100
69
  .accordion-card {
101
- flex: 1; background: #fff; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1);
70
+ flex: 1; background: var(--theme-color-background-panel, #fff); border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.1);
102
71
  overflow: hidden; min-width: 0;
103
72
  }
104
73
  .accordion-header {
105
74
  display: flex; align-items: center; padding: 14px 20px; cursor: pointer;
106
75
  user-select: none; gap: 12px; transition: background 0.15s; line-height: 1.4;
107
76
  }
108
- .accordion-header:hover { background: #fafafa; }
109
- .accordion-title { font-weight: 600; color: #333; font-size: 1.05em; white-space: nowrap; }
110
- .accordion-preview { flex: 1; font-style: italic; color: #888; font-size: 0.9em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
77
+ .accordion-header:hover { background: var(--theme-color-background-secondary, #fafafa); }
78
+ .accordion-title { font-weight: 600; color: var(--theme-color-text-primary, #333); font-size: 1.05em; white-space: nowrap; }
79
+ .accordion-preview { flex: 1; font-style: italic; color: var(--theme-color-text-muted, #888); font-size: 0.9em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
111
80
  .accordion-toggle {
112
81
  flex: 0 0 20px; display: flex; align-items: center; justify-content: center;
113
- border-radius: 4px; transition: background 0.15s, transform 0.25s; font-size: 0.7em; color: #888;
82
+ border-radius: 4px; transition: background 0.15s, transform 0.25s; font-size: 0.7em; color: var(--theme-color-text-muted, #888);
114
83
  }
115
- .accordion-header:hover .accordion-toggle { background: #eee; color: #555; }
84
+ .accordion-header:hover .accordion-toggle { background: var(--theme-color-border-light, #eee); color: var(--theme-color-text-secondary, #555); }
116
85
  .accordion-card.open .accordion-toggle { transform: rotate(180deg); }
117
86
  .accordion-body { padding: 0 20px 20px; display: none; }
118
87
  .accordion-card.open .accordion-body { display: block; }
119
- .accordion-card.open .accordion-header { border-bottom: 1px solid #eee; }
88
+ .accordion-card.open .accordion-header { border-bottom: 1px solid var(--theme-color-border-light, #eee); }
120
89
  .accordion-card.open .accordion-preview { display: none; }
121
90
 
122
91
  /* Action controls (go link + auto checkbox) */
123
92
  .accordion-actions { display: flex; align-items: baseline; gap: 8px; flex-shrink: 0; }
124
93
  .accordion-card.open .accordion-actions { display: none; }
125
94
  .accordion-go {
126
- font-size: 0.82em; color: #4a90d9; cursor: pointer; text-decoration: none;
95
+ font-size: 0.82em; color: var(--theme-color-brand-primary, #4a90d9); cursor: pointer; text-decoration: none;
127
96
  font-weight: 500; white-space: nowrap; padding: 2px 6px; border-radius: 3px;
128
97
  transition: background 0.15s;
129
98
  }
130
- .accordion-go:hover { background: #e8f0fe; text-decoration: underline; }
99
+ .accordion-go:hover { background: var(--theme-color-background-hover, #e8f0fe); text-decoration: underline; }
131
100
  .accordion-auto {
132
- font-size: 0.82em; color: #999; white-space: nowrap; cursor: pointer;
101
+ font-size: 0.82em; color: var(--theme-color-text-muted, #999); white-space: nowrap; cursor: pointer;
133
102
  }
134
103
  .accordion-auto .auto-label { display: none; }
135
104
  .accordion-auto:hover .auto-label { display: inline; }
136
105
  .accordion-auto input[type="checkbox"] { width: auto; margin: 0; cursor: pointer; vertical-align: middle; position: relative; top: 0px; opacity: 0.75; transition: opacity 0.15s; }
137
106
  .accordion-auto:hover input[type="checkbox"] { opacity: 1; }
138
- .accordion-auto:hover { color: #666; }
107
+ .accordion-auto:hover { color: var(--theme-color-text-secondary, #666); }
139
108
 
140
109
  /* Phase status indicator */
141
110
  .accordion-phase {
@@ -143,12 +112,12 @@ h2 { margin-bottom: 12px; color: #444; font-size: 1.2em; border-bottom: 2px soli
143
112
  font-size: 0.85em; line-height: 1;
144
113
  }
145
114
  .accordion-phase.visible { display: flex; }
146
- .accordion-phase-ok { color: #28a745; }
147
- .accordion-phase-error { color: #dc3545; }
148
- .accordion-phase-busy { color: #28a745; }
115
+ .accordion-phase-ok { color: var(--theme-color-status-success, #28a745); }
116
+ .accordion-phase-error { color: var(--theme-color-status-error, #dc3545); }
117
+ .accordion-phase-busy { color: var(--theme-color-status-success, #28a745); }
149
118
  .accordion-phase-busy .phase-spinner {
150
119
  display: inline-block; width: 14px; height: 14px;
151
- border: 2px solid #28a745; border-top-color: transparent; border-radius: 50%;
120
+ border: 2px solid var(--theme-color-status-success, #28a745); border-top-color: transparent; border-radius: 50%;
152
121
  animation: phase-spin 0.8s linear infinite; vertical-align: middle;
153
122
  }
154
123
  @keyframes phase-spin {
@@ -160,30 +129,30 @@ h2 { margin-bottom: 12px; color: #444; font-size: 1.2em; border-bottom: 2px soli
160
129
  }
161
130
  .accordion-controls button {
162
131
  padding: 4px 10px; font-size: 0.82em; font-weight: 500; background: none;
163
- border: 1px solid #ccc; border-radius: 4px; color: #666; cursor: pointer; margin: 0;
132
+ border: 1px solid var(--theme-color-border-default, #ccc); border-radius: 4px; color: var(--theme-color-text-secondary, #666); cursor: pointer; margin: 0;
164
133
  }
165
- .accordion-controls button:hover { background: #f0f0f0; border-color: #aaa; color: #333; }
134
+ .accordion-controls button:hover { background: var(--theme-color-background-tertiary, #f0f0f0); border-color: var(--theme-color-text-muted, #aaa); color: var(--theme-color-text-primary, #333); }
166
135
 
167
136
  label { display: block; font-weight: 600; margin-bottom: 4px; font-size: 0.9em; }
168
137
  input[type="text"], input[type="password"], input[type="number"] {
169
- width: 100%; padding: 8px 12px; border: 1px solid #ccc; border-radius: 4px;
138
+ width: 100%; padding: 8px 12px; border: 1px solid var(--theme-color-border-default, #ccc); border-radius: 4px;
170
139
  font-size: 0.95em; margin-bottom: 10px;
171
140
  }
172
141
  input[type="text"]:focus, input[type="password"]:focus, input[type="number"]:focus {
173
- outline: none; border-color: #4a90d9;
142
+ outline: none; border-color: var(--theme-color-brand-primary, #4a90d9);
174
143
  }
175
144
 
176
145
  button {
177
146
  padding: 8px 16px; border: none; border-radius: 4px; cursor: pointer;
178
147
  font-size: 0.9em; font-weight: 600; margin-right: 8px; margin-bottom: 8px;
179
148
  }
180
- button.primary { background: #4a90d9; color: #fff; }
181
- button.primary:hover { background: #357abd; }
182
- button.secondary { background: #6c757d; color: #fff; }
149
+ button.primary { background: var(--theme-color-brand-primary, #4a90d9); color: var(--theme-color-background-panel, #fff); }
150
+ button.primary:hover { background: var(--theme-color-brand-primary-hover, #357abd); }
151
+ button.secondary { background: var(--theme-color-text-secondary, #6c757d); color: var(--theme-color-background-panel, #fff); }
183
152
  button.secondary:hover { background: #5a6268; }
184
- button.danger { background: #dc3545; color: #fff; }
153
+ button.danger { background: var(--theme-color-status-error, #dc3545); color: var(--theme-color-background-panel, #fff); }
185
154
  button.danger:hover { background: #c82333; }
186
- button.success { background: #28a745; color: #fff; }
155
+ button.success { background: var(--theme-color-status-success, #28a745); color: var(--theme-color-background-panel, #fff); }
187
156
  button.success:hover { background: #218838; }
188
157
  button:disabled { opacity: 0.5; cursor: not-allowed; }
189
158
 
@@ -196,9 +165,9 @@ button:disabled { opacity: 0.5; cursor: not-allowed; }
196
165
  .inline-group { display: flex; gap: 8px; align-items: flex-end; margin-bottom: 10px; }
197
166
  .inline-group > div { flex: 1; }
198
167
 
199
- a { color: #4a90d9; }
168
+ a { color: var(--theme-color-brand-primary, #4a90d9); }
200
169
 
201
- select { background: #fff; width: 100%; padding: 8px 12px; border: 1px solid #ccc; border-radius: 4px; font-size: 0.95em; margin-bottom: 10px; }
170
+ select { background: var(--theme-color-background-panel, #fff); width: 100%; padding: 8px 12px; border: 1px solid var(--theme-color-border-default, #ccc); border-radius: 4px; font-size: 0.95em; margin-bottom: 10px; }
202
171
 
203
172
  .checkbox-row { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }
204
173
  .checkbox-row input[type="checkbox"] { width: auto; margin: 0; }
@@ -206,53 +175,53 @@ select { background: #fff; width: 100%; padding: 8px 12px; border: 1px solid #cc
206
175
 
207
176
  /* Live Status Bar */
208
177
  .live-status-bar {
209
- background: #fff; border-radius: 8px; margin-bottom: 16px;
178
+ background: var(--theme-color-background-panel, #fff); border-radius: 8px; margin-bottom: 16px;
210
179
  box-shadow: 0 1px 3px rgba(0,0,0,0.1);
211
- position: sticky; top: 0; z-index: 100; border-left: 4px solid #6c757d;
180
+ position: sticky; top: 0; z-index: 100; border-left: 4px solid var(--theme-color-text-secondary, #6c757d);
212
181
  }
213
- .live-status-bar.phase-idle { border-left-color: #6c757d; }
214
- .live-status-bar.phase-disconnected { border-left-color: #dc3545; }
215
- .live-status-bar.phase-ready { border-left-color: #4a90d9; }
216
- .live-status-bar.phase-loading { border-left-color: #28a745; }
217
- .live-status-bar.phase-stopping { border-left-color: #ffc107; }
218
- .live-status-bar.phase-complete { border-left-color: #28a745; }
182
+ .live-status-bar.phase-idle { border-left-color: var(--theme-color-text-secondary, #6c757d); }
183
+ .live-status-bar.phase-disconnected { border-left-color: var(--theme-color-status-error, #dc3545); }
184
+ .live-status-bar.phase-ready { border-left-color: var(--theme-color-brand-primary, #4a90d9); }
185
+ .live-status-bar.phase-loading { border-left-color: var(--theme-color-status-success, #28a745); }
186
+ .live-status-bar.phase-stopping { border-left-color: var(--theme-color-status-warning, #ffc107); }
187
+ .live-status-bar.phase-complete { border-left-color: var(--theme-color-status-success, #28a745); }
219
188
 
220
189
  .live-status-dot {
221
190
  width: 12px; height: 12px; border-radius: 50%; flex-shrink: 0;
222
- background: #6c757d;
191
+ background: var(--theme-color-text-secondary, #6c757d);
223
192
  }
224
- .live-status-bar.phase-idle .live-status-dot { background: #6c757d; }
225
- .live-status-bar.phase-disconnected .live-status-dot { background: #dc3545; }
226
- .live-status-bar.phase-ready .live-status-dot { background: #4a90d9; }
193
+ .live-status-bar.phase-idle .live-status-dot { background: var(--theme-color-text-secondary, #6c757d); }
194
+ .live-status-bar.phase-disconnected .live-status-dot { background: var(--theme-color-status-error, #dc3545); }
195
+ .live-status-bar.phase-ready .live-status-dot { background: var(--theme-color-brand-primary, #4a90d9); }
227
196
  .live-status-bar.phase-loading .live-status-dot {
228
- background: #28a745;
197
+ background: var(--theme-color-status-success, #28a745);
229
198
  animation: live-pulse 1.5s ease-in-out infinite;
230
199
  }
231
200
  .live-status-bar.phase-stopping .live-status-dot {
232
- background: #ffc107;
201
+ background: var(--theme-color-status-warning, #ffc107);
233
202
  animation: live-pulse 0.8s ease-in-out infinite;
234
203
  }
235
- .live-status-bar.phase-complete .live-status-dot { background: #28a745; }
204
+ .live-status-bar.phase-complete .live-status-dot { background: var(--theme-color-status-success, #28a745); }
236
205
 
237
206
  @keyframes live-pulse {
238
207
  0%, 100% { opacity: 1; transform: scale(1); }
239
208
  50% { opacity: 0.4; transform: scale(0.8); }
240
209
  }
241
210
 
242
- .live-status-message { flex: 1; font-size: 0.92em; color: #333; line-height: 1.4; }
211
+ .live-status-message { flex: 1; font-size: 0.92em; color: var(--theme-color-text-primary, #333); line-height: 1.4; }
243
212
 
244
213
  .live-status-meta {
245
- display: flex; gap: 16px; flex-shrink: 0; font-size: 0.82em; color: #666;
214
+ display: flex; gap: 16px; flex-shrink: 0; font-size: 0.82em; color: var(--theme-color-text-secondary, #666);
246
215
  }
247
216
  .live-status-meta-item { white-space: nowrap; }
248
- .live-status-meta-item strong { color: #333; }
217
+ .live-status-meta-item strong { color: var(--theme-color-text-primary, #333); }
249
218
 
250
219
  .live-status-progress-bar {
251
- height: 3px; background: #e9ecef; border-radius: 2px; overflow: hidden;
220
+ height: 3px; background: var(--theme-color-background-tertiary, #e9ecef); border-radius: 2px; overflow: hidden;
252
221
  position: absolute; bottom: 0; left: 0; right: 0;
253
222
  }
254
223
  .live-status-progress-fill {
255
- height: 100%; background: #28a745; transition: width 1s ease;
224
+ height: 100%; background: var(--theme-color-status-success, #28a745); transition: width 1s ease;
256
225
  }
257
226
  /* Expandable status bar */
258
227
  .live-status-header {
@@ -260,11 +229,11 @@ select { background: #fff; width: 100%; padding: 8px 12px; border: 1px solid #cc
260
229
  padding: 14px 20px; user-select: none;
261
230
  }
262
231
  .live-status-bar.expanded .live-status-header {
263
- border-bottom: 1px solid #e9ecef; padding-bottom: 10px;
232
+ border-bottom: 1px solid var(--theme-color-background-tertiary, #e9ecef); padding-bottom: 10px;
264
233
  }
265
234
  .live-status-expand-toggle {
266
235
  flex: 0 0 20px; display: flex; align-items: center; justify-content: center;
267
- font-size: 0.7em; color: #888; transition: transform 0.25s;
236
+ font-size: 0.7em; color: var(--theme-color-text-muted, #888); transition: transform 0.25s;
268
237
  }
269
238
  .live-status-bar.expanded .live-status-expand-toggle { transform: rotate(180deg); }
270
239
 
@@ -276,9 +245,9 @@ select { background: #fff; width: 100%; padding: 8px 12px; border: 1px solid #cc
276
245
  .status-detail-section { margin-bottom: 14px; }
277
246
  .status-detail-section:last-child { margin-bottom: 0; }
278
247
  .status-detail-section-title {
279
- font-size: 0.85em; font-weight: 600; color: #555; text-transform: uppercase;
248
+ font-size: 0.85em; font-weight: 600; color: var(--theme-color-text-secondary, #555); text-transform: uppercase;
280
249
  letter-spacing: 0.5px; margin-bottom: 8px; padding-bottom: 4px;
281
- border-bottom: 1px solid #eee;
250
+ border-bottom: 1px solid var(--theme-color-border-light, #eee);
282
251
  }
283
252
 
284
253
  /* Running Operations */
@@ -288,30 +257,30 @@ select { background: #fff; width: 100%; padding: 8px 12px; border: 1px solid #cc
288
257
  }
289
258
  .running-op-name { font-weight: 600; min-width: 180px; }
290
259
  .running-op-bar {
291
- flex: 1; height: 8px; background: #e9ecef; border-radius: 4px; overflow: hidden;
260
+ flex: 1; height: 8px; background: var(--theme-color-background-tertiary, #e9ecef); border-radius: 4px; overflow: hidden;
292
261
  min-width: 120px;
293
262
  }
294
- .running-op-bar-fill { height: 100%; background: #4a90d9; transition: width 0.5s ease; }
295
- .running-op-count { font-size: 0.85em; color: #666; white-space: nowrap; }
296
- .running-op-pending { color: #888; font-size: 0.85em; font-style: italic; padding: 4px 0; }
263
+ .running-op-bar-fill { height: 100%; background: var(--theme-color-brand-primary, #4a90d9); transition: width 0.5s ease; }
264
+ .running-op-count { font-size: 0.85em; color: var(--theme-color-text-secondary, #666); white-space: nowrap; }
265
+ .running-op-pending { color: var(--theme-color-text-muted, #888); font-size: 0.85em; font-style: italic; padding: 4px 0; }
297
266
 
298
267
  /* Completed Operations */
299
- .completed-op-row { padding: 8px 0; border-bottom: 1px solid #f0f0f0; }
268
+ .completed-op-row { padding: 8px 0; border-bottom: 1px solid var(--theme-color-background-tertiary, #f0f0f0); }
300
269
  .completed-op-row:last-child { border-bottom: none; }
301
270
  .completed-op-header {
302
271
  display: flex; align-items: center; gap: 10px; font-size: 0.9em; margin-bottom: 4px;
303
272
  }
304
273
  .completed-op-name { font-weight: 600; }
305
- .completed-op-stats { color: #666; font-size: 0.85em; }
306
- .completed-op-checkmark { color: #28a745; }
274
+ .completed-op-stats { color: var(--theme-color-text-secondary, #666); font-size: 0.85em; }
275
+ .completed-op-checkmark { color: var(--theme-color-status-success, #28a745); }
307
276
 
308
277
  /* Error Operations */
309
- .error-op-row { padding: 6px 0; border-bottom: 1px solid #f0f0f0; font-size: 0.9em; }
278
+ .error-op-row { padding: 6px 0; border-bottom: 1px solid var(--theme-color-background-tertiary, #f0f0f0); font-size: 0.9em; }
310
279
  .error-op-row:last-child { border-bottom: none; }
311
280
  .error-op-header { display: flex; align-items: center; gap: 8px; }
312
- .error-op-name { font-weight: 600; color: #dc3545; }
313
- .error-op-status { font-size: 0.82em; color: #dc3545; }
314
- .error-op-message { font-size: 0.82em; color: #888; margin-top: 2px; padding-left: 18px; }
281
+ .error-op-name { font-weight: 600; color: var(--theme-color-status-error, #dc3545); }
282
+ .error-op-status { font-size: 0.82em; color: var(--theme-color-status-error, #dc3545); }
283
+ .error-op-message { font-size: 0.82em; color: var(--theme-color-text-muted, #888); margin-top: 2px; padding-left: 18px; }
315
284
  `,
316
285
  Templates:
317
286
  [
@@ -320,21 +289,6 @@ select { background: #fff; width: 100%; padding: 8px 12px; border: 1px solid #cc
320
289
  Template: /*html*/`
321
290
  <h1>Retold Comprehension Loader</h1>
322
291
 
323
- <!-- Live Status Bar (Expandable) -->
324
- <div id="liveStatusBar" class="live-status-bar phase-idle" style="position:relative">
325
- <div class="live-status-header" onclick="pict.views['ComprehensionLoader-Layout'].toggleStatusDetail()">
326
- <div class="live-status-dot"></div>
327
- <div class="live-status-message" id="liveStatusMessage">Idle</div>
328
- <div class="live-status-meta" id="liveStatusMeta"></div>
329
- <div class="live-status-expand-toggle" id="liveStatusToggle">&#9660;</div>
330
- </div>
331
- <div class="live-status-detail" id="liveStatusDetail" style="display:none">
332
- <div id="ComprehensionLoader-Throughput-Histogram"></div>
333
- <div id="ComprehensionLoader-StatusDetail-Container"></div>
334
- </div>
335
- <div class="live-status-progress-bar"><div class="live-status-progress-fill" id="liveStatusProgressFill" style="width:0%"></div></div>
336
- </div>
337
-
338
292
  <!-- Expand / Collapse All -->
339
293
  <div class="accordion-controls">
340
294
  <button onclick="pict.views['ComprehensionLoader-Layout'].expandAllSections()">Expand All</button>
@@ -354,7 +308,7 @@ select { background: #fff; width: 100%; padding: 8px 12px; border: 1px solid #cc
354
308
  {
355
309
  RenderableHash: 'ComprehensionLoader-Layout',
356
310
  TemplateHash: 'ComprehensionLoader-Layout',
357
- DestinationAddress: '#ComprehensionLoader-Application-Container'
311
+ DestinationAddress: '#ComprehensionLoader-Workspace'
358
312
  }
359
313
  ]
360
314
  };
@@ -138,7 +138,7 @@ class ComprehensionLoaderLoadView extends libPictView
138
138
 
139
139
  let tmpCardsContainer = document.getElementById('reportSummaryCards');
140
140
  let tmpOutcomeClass = 'outcome-' + pReport.Outcome.toLowerCase();
141
- let tmpOutcomeColor = { Success: '#28a745', Partial: '#ffc107', Error: '#dc3545', Stopped: '#6c757d' }[pReport.Outcome] || '#666';
141
+ let tmpOutcomeColor = { Success: 'var(--theme-color-status-success, #28a745)', Partial: 'var(--theme-color-status-warning, #ffc107)', Error: 'var(--theme-color-status-error, #dc3545)', Stopped: 'var(--theme-color-text-secondary, #6c757d)' }[pReport.Outcome] || 'var(--theme-color-text-secondary, #666)';
142
142
 
143
143
  let tmpDurationSec = pReport.RunTimestamps.DurationSeconds || 0;
144
144
  let tmpDurationStr = tmpDurationSec < 60 ? tmpDurationSec + 's' : Math.floor(tmpDurationSec / 60) + 'm ' + (tmpDurationSec % 60) + 's';
@@ -162,24 +162,24 @@ class ComprehensionLoaderLoadView extends libPictView
162
162
  + '<div class="report-card">'
163
163
  + ' <div class="card-label">Records Pushed</div>'
164
164
  + ' <div class="card-value">' + tmpTotalPushed + '</div>'
165
- + ' <div style="font-size:0.75em; color:#888">of ' + tmpTotalRecords + '</div>'
165
+ + ' <div style="font-size:0.75em; color:var(--theme-color-text-muted, #888)">of ' + tmpTotalRecords + '</div>'
166
166
  + '</div>';
167
167
 
168
168
  // Anomalies
169
169
  let tmpAnomalyContainer = document.getElementById('reportAnomalies');
170
170
  if (pReport.Anomalies.length === 0)
171
171
  {
172
- tmpAnomalyContainer.innerHTML = '<div style="color:#28a745; font-weight:600; font-size:0.9em">No anomalies detected.</div>';
172
+ tmpAnomalyContainer.innerHTML = '<div style="color:var(--theme-color-status-success, #28a745); font-weight:600; font-size:0.9em">No anomalies detected.</div>';
173
173
  }
174
174
  else
175
175
  {
176
- let tmpHtml = '<h4 style="margin:0 0 8px; color:#dc3545; font-size:0.95em">Anomalies (' + pReport.Anomalies.length + ')</h4>';
176
+ let tmpHtml = '<h4 style="margin:0 0 8px; color:var(--theme-color-status-error, #dc3545); font-size:0.95em">Anomalies (' + pReport.Anomalies.length + ')</h4>';
177
177
  tmpHtml += '<table class="progress-table">';
178
178
  tmpHtml += '<tr><th>Entity</th><th>Type</th><th>Message</th></tr>';
179
179
  for (let i = 0; i < pReport.Anomalies.length; i++)
180
180
  {
181
181
  let tmpAnomaly = pReport.Anomalies[i];
182
- let tmpTypeColor = tmpAnomaly.Type === 'Error' ? '#dc3545' : '#6c757d';
182
+ let tmpTypeColor = tmpAnomaly.Type === 'Error' ? 'var(--theme-color-status-error, #dc3545)' : 'var(--theme-color-text-secondary, #6c757d)';
183
183
  tmpHtml += '<tr>';
184
184
  tmpHtml += '<td><strong>' + this.pict.providers.ComprehensionLoader.escapeHtml(tmpAnomaly.Entity) + '</strong></td>';
185
185
  tmpHtml += '<td style="color:' + tmpTypeColor + '">' + tmpAnomaly.Type + '</td>';
@@ -194,7 +194,7 @@ class ComprehensionLoaderLoadView extends libPictView
194
194
  let tmpEntityContainer = document.getElementById('reportEntityDetails');
195
195
  if (pReport.Entities && pReport.Entities.length > 0)
196
196
  {
197
- let tmpHtml = '<h4 style="margin:0 0 8px; font-size:0.95em; color:#444">Entity Details</h4>';
197
+ let tmpHtml = '<h4 style="margin:0 0 8px; font-size:0.95em; color:var(--theme-color-text-secondary, #444)">Entity Details</h4>';
198
198
  tmpHtml += '<table class="progress-table">';
199
199
  tmpHtml += '<tr><th>Entity</th><th>Duration</th><th>Records</th><th>Status</th></tr>';
200
200
  for (let i = 0; i < pReport.Entities.length; i++)
@@ -202,7 +202,7 @@ class ComprehensionLoaderLoadView extends libPictView
202
202
  let tmpEntity = pReport.Entities[i];
203
203
  let tmpDur = tmpEntity.DurationSeconds < 60 ? tmpEntity.DurationSeconds + 's' : Math.floor(tmpEntity.DurationSeconds / 60) + 'm ' + (tmpEntity.DurationSeconds % 60) + 's';
204
204
  let tmpRecs = this.pict.providers.ComprehensionLoader.formatNumber(tmpEntity.Pushed);
205
- let tmpStatusColor = { Complete: '#28a745', Error: '#dc3545' }[tmpEntity.Status] || '#666';
205
+ let tmpStatusColor = { Complete: 'var(--theme-color-status-success, #28a745)', Error: 'var(--theme-color-status-error, #dc3545)' }[tmpEntity.Status] || 'var(--theme-color-text-secondary, #666)';
206
206
  tmpHtml += '<tr>';
207
207
  tmpHtml += '<td><strong>' + this.pict.providers.ComprehensionLoader.escapeHtml(tmpEntity.Name) + '</strong></td>';
208
208
  tmpHtml += '<td>' + tmpDur + '</td>';
@@ -303,10 +303,10 @@ class ComprehensionLoaderLoadView extends libPictView
303
303
  tmpPct = Math.round((pEntity.Pushed / pEntity.Total) * 100);
304
304
  }
305
305
 
306
- let tmpBarColor = '#28a745';
307
- if (pEntity.Status === 'Error') tmpBarColor = '#dc3545';
308
- else if (pEntity.Status === 'Pushing') tmpBarColor = '#4a90d9';
309
- else if (pEntity.Status === 'Pending') tmpBarColor = '#adb5bd';
306
+ let tmpBarColor = 'var(--theme-color-status-success, #28a745)';
307
+ if (pEntity.Status === 'Error') tmpBarColor = 'var(--theme-color-status-error, #dc3545)';
308
+ else if (pEntity.Status === 'Pushing') tmpBarColor = 'var(--theme-color-brand-primary, #4a90d9)';
309
+ else if (pEntity.Status === 'Pending') tmpBarColor = 'var(--theme-color-text-muted, #adb5bd)';
310
310
 
311
311
  let tmpRow = '<tr>';
312
312
  tmpRow += '<td><strong>' + pName + '</strong></td>';
@@ -394,25 +394,25 @@ module.exports.default_configuration =
394
394
  DefaultDestinationAddress: '#ComprehensionLoader-Section-Load',
395
395
  CSS: /*css*/`
396
396
  .progress-table { width: 100%; border-collapse: collapse; margin-top: 4px; margin-bottom: 4px; }
397
- .progress-table th, .progress-table td { text-align: left; padding: 6px 12px; border-bottom: 1px solid #eee; font-size: 0.9em; }
398
- .progress-table th { background: #f8f9fa; font-weight: 600; }
399
- .progress-table-muted td { color: #888; padding: 3px 12px; font-size: 0.85em; border-bottom: 1px solid #f4f5f6; }
400
- .progress-bar-container { width: 120px; height: 16px; background: #e9ecef; border-radius: 8px; overflow: hidden; display: inline-block; vertical-align: middle; }
401
- .progress-bar-fill { height: 100%; background: #28a745; transition: width 0.3s; }
402
- .sync-section-header { font-size: 0.8em; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; color: #4a90d9; padding: 10px 0 2px 0; margin-top: 6px; border-top: 1px solid #e0e0e0; }
397
+ .progress-table th, .progress-table td { text-align: left; padding: 6px 12px; border-bottom: 1px solid var(--theme-color-border-light, #eee); font-size: 0.9em; }
398
+ .progress-table th { background: var(--theme-color-background-secondary, #f8f9fa); font-weight: 600; }
399
+ .progress-table-muted td { color: var(--theme-color-text-muted, #888); padding: 3px 12px; font-size: 0.85em; border-bottom: 1px solid var(--theme-color-background-secondary, #f4f5f6); }
400
+ .progress-bar-container { width: 120px; height: 16px; background: var(--theme-color-background-tertiary, #e9ecef); border-radius: 8px; overflow: hidden; display: inline-block; vertical-align: middle; }
401
+ .progress-bar-fill { height: 100%; background: var(--theme-color-status-success, #28a745); transition: width 0.3s; }
402
+ .sync-section-header { font-size: 0.8em; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; color: var(--theme-color-brand-primary, #4a90d9); padding: 10px 0 2px 0; margin-top: 6px; border-top: 1px solid var(--theme-color-border-default, #e0e0e0); }
403
403
  .sync-section-header:first-child { border-top: none; margin-top: 10px; }
404
- .sync-section-header-error { color: #dc3545; }
405
- .sync-section-header-ok { color: #28a745; }
406
- .sync-section-count { font-weight: 400; color: #999; font-size: 0.95em; }
407
- .sync-section-overflow { font-size: 0.8em; color: #aaa; padding: 2px 12px 6px; }
408
- .sync-pending-count { text-align: right; color: #aaa; font-size: 0.85em; }
409
- .report-card { background: #f8f9fa; border-radius: 8px; padding: 12px 16px; min-width: 140px; text-align: center; border: 1px solid #e9ecef; }
410
- .report-card .card-label { font-size: 0.8em; color: #666; text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px; }
404
+ .sync-section-header-error { color: var(--theme-color-status-error, #dc3545); }
405
+ .sync-section-header-ok { color: var(--theme-color-status-success, #28a745); }
406
+ .sync-section-count { font-weight: 400; color: var(--theme-color-text-muted, #999); font-size: 0.95em; }
407
+ .sync-section-overflow { font-size: 0.8em; color: var(--theme-color-text-muted, #aaa); padding: 2px 12px 6px; }
408
+ .sync-pending-count { text-align: right; color: var(--theme-color-text-muted, #aaa); font-size: 0.85em; }
409
+ .report-card { background: var(--theme-color-background-secondary, #f8f9fa); border-radius: 8px; padding: 12px 16px; min-width: 140px; text-align: center; border: 1px solid var(--theme-color-background-tertiary, #e9ecef); }
410
+ .report-card .card-label { font-size: 0.8em; color: var(--theme-color-text-secondary, #666); text-transform: uppercase; letter-spacing: 0.5px; margin-bottom: 4px; }
411
411
  .report-card .card-value { font-size: 1.4em; font-weight: 700; }
412
- .report-card.outcome-success { border-left: 4px solid #28a745; }
413
- .report-card.outcome-partial { border-left: 4px solid #ffc107; }
414
- .report-card.outcome-error { border-left: 4px solid #dc3545; }
415
- .report-card.outcome-stopped { border-left: 4px solid #6c757d; }
412
+ .report-card.outcome-success { border-left: 4px solid var(--theme-color-status-success, #28a745); }
413
+ .report-card.outcome-partial { border-left: 4px solid var(--theme-color-status-warning, #ffc107); }
414
+ .report-card.outcome-error { border-left: 4px solid var(--theme-color-status-error, #dc3545); }
415
+ .report-card.outcome-stopped { border-left: 4px solid var(--theme-color-text-secondary, #6c757d); }
416
416
  `,
417
417
  Templates:
418
418
  [
@@ -442,7 +442,7 @@ module.exports.default_configuration =
442
442
  <div id="loadProgress"></div>
443
443
 
444
444
  <!-- Load Report (appears after load completes) -->
445
- <div id="loadReportSection" style="display:none; margin-top:16px; padding-top:16px; border-top:2px solid #ddd">
445
+ <div id="loadReportSection" style="display:none; margin-top:16px; padding-top:16px; border-top:2px solid var(--theme-color-border-default, #ddd)">
446
446
  <h3 style="margin:0 0 12px; font-size:1.1em">Load Report</h3>
447
447
 
448
448
  <div id="reportSummaryCards" style="display:flex; gap:12px; flex-wrap:wrap; margin-bottom:16px"></div>
@@ -53,14 +53,14 @@ class ComprehensionLoaderSchemaView extends libPictView
53
53
 
54
54
  if (tmpEntities.length === 0)
55
55
  {
56
- tmpContainer.innerHTML = '<div style="color:#888; font-size:0.9em">No entities found.</div>';
56
+ tmpContainer.innerHTML = '<div style="color:var(--theme-color-text-muted, #888); font-size:0.9em">No entities found.</div>';
57
57
  return;
58
58
  }
59
59
 
60
- let tmpHtml = '<div style="font-size:0.9em; color:#555">';
60
+ let tmpHtml = '<div style="font-size:0.9em; color:var(--theme-color-text-secondary, #555)">';
61
61
  for (let i = 0; i < tmpEntities.length; i++)
62
62
  {
63
- tmpHtml += '<span style="display:inline-block; background:#f0f0f0; border-radius:4px; padding:2px 8px; margin:2px 4px 2px 0; font-size:0.9em">';
63
+ tmpHtml += '<span style="display:inline-block; background:var(--theme-color-background-tertiary, #f0f0f0); border-radius:4px; padding:2px 8px; margin:2px 4px 2px 0; font-size:0.9em">';
64
64
  tmpHtml += this.pict.providers.ComprehensionLoader.escapeHtml(tmpEntities[i]);
65
65
  tmpHtml += '</span>';
66
66
  }
@@ -215,7 +215,7 @@ module.exports.default_configuration =
215
215
  </div>
216
216
 
217
217
  <details style="margin-bottom:10px">
218
- <summary style="cursor:pointer; font-size:0.9em; color:#666">Advanced Session Options</summary>
218
+ <summary style="cursor:pointer; font-size:0.9em; color:var(--theme-color-text-secondary, #666)">Advanced Session Options</summary>
219
219
  <div style="padding:10px 0">
220
220
  <label for="authURI">Authentication URI Template (leave blank for default)</label>
221
221
  <input type="text" id="authURI" placeholder="Authenticate/{~D:Record.UserName~}/{~D:Record.Password~}">
@@ -235,7 +235,7 @@ module.exports.default_configuration =
235
235
  <button class="primary" onclick="pict.views['ComprehensionLoader-Session'].configureSession()">Configure Session</button>
236
236
  <div id="sessionConfigStatus"></div>
237
237
 
238
- <hr style="margin:16px 0; border:none; border-top:1px solid #eee">
238
+ <hr style="margin:16px 0; border:none; border-top:1px solid var(--theme-color-border-light, #eee)">
239
239
 
240
240
  <div class="inline-group">
241
241
  <div>
@@ -0,0 +1,62 @@
1
+ 'use strict';
2
+
3
+ const libPictView = require('pict-view');
4
+
5
+ class ComprehensionLoaderSettingsPanelView extends libPictView
6
+ {
7
+ onAfterRender(pRenderable, pAddress, pRecord, pContent)
8
+ {
9
+ if (this.pict.CSSMap) { this.pict.CSSMap.injectCSS(); }
10
+
11
+ // Re-mount theme controls on every render — the template wipes the destination div.
12
+ let tmpTheme = this.pict.providers && this.pict.providers['Theme-Section'];
13
+ if (tmpTheme && typeof tmpTheme.mount === 'function')
14
+ {
15
+ tmpTheme.mount({
16
+ Container: '#ComprehensionLoader-Settings-Theme',
17
+ Views: ['Picker', 'ModeToggle', 'ScaleSelect']
18
+ });
19
+ }
20
+ return super.onAfterRender(pRenderable, pAddress, pRecord, pContent);
21
+ }
22
+ }
23
+
24
+ module.exports = ComprehensionLoaderSettingsPanelView;
25
+
26
+ module.exports.default_configuration =
27
+ {
28
+ ViewIdentifier: 'ComprehensionLoader-SettingsPanel',
29
+ DefaultRenderable: 'ComprehensionLoader-SettingsPanel',
30
+ DefaultDestinationAddress: '#ComprehensionLoader-Settings-Panel',
31
+ AutoRender: false,
32
+ CSS: /*css*/`
33
+ .rds-settings-body {
34
+ padding: 12px;
35
+ display: flex; flex-direction: column; gap: 16px;
36
+ color: var(--theme-color-text-primary, #333333);
37
+ }
38
+ .rds-settings-section { display: flex; flex-direction: column; gap: 6px; }
39
+ .rds-settings-label {
40
+ font-size: 0.85em;
41
+ font-weight: 600;
42
+ text-transform: uppercase;
43
+ letter-spacing: 0.04em;
44
+ color: var(--theme-color-text-secondary, #555555);
45
+ }
46
+ `,
47
+ Templates: [{
48
+ Hash: 'ComprehensionLoader-SettingsPanel',
49
+ Template: /*html*/`
50
+ <div class="rds-settings-body">
51
+ <div class="rds-settings-section">
52
+ <div class="rds-settings-label">Appearance</div>
53
+ <div id="ComprehensionLoader-Settings-Theme"></div>
54
+ </div>
55
+ </div>`
56
+ }],
57
+ Renderables: [{
58
+ RenderableHash: 'ComprehensionLoader-SettingsPanel',
59
+ TemplateHash: 'ComprehensionLoader-SettingsPanel',
60
+ DestinationAddress: '#ComprehensionLoader-Settings-Panel'
61
+ }]
62
+ };