retold-data-service 2.1.2 → 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 (80) 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/views/PictView-ComprehensionLoader-Layout.js +28 -74
  35. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Load.js +17 -17
  36. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-SettingsPanel.js +62 -0
  37. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-Shell.js +142 -0
  38. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-StatusBar.js +125 -0
  39. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-StatusDetail.js +89 -0
  40. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-TopBar-Nav.js +42 -0
  41. package/source/services/comprehension-loader/pict-app/views/PictView-ComprehensionLoader-TopBar-User.js +48 -0
  42. package/source/services/comprehension-loader/web/comprehension-loader.js +5415 -6183
  43. package/source/services/comprehension-loader/web/comprehension-loader.js.map +1 -1
  44. package/source/services/comprehension-loader/web/comprehension-loader.min.js +75 -1
  45. package/source/services/comprehension-loader/web/comprehension-loader.min.js.map +1 -1
  46. package/source/services/comprehension-loader/web/favicons/favicon-dark.svg +13 -0
  47. package/source/services/comprehension-loader/web/favicons/favicon-light.svg +13 -0
  48. package/source/services/comprehension-loader/web/favicons/favicon.svg +13 -0
  49. package/source/services/comprehension-loader/web/index.html +3 -0
  50. package/source/services/comprehension-loader/web/pict.min.js +12 -0
  51. package/source/services/data-cloner/DataCloner-Command-Headless.js +2 -1
  52. package/source/services/data-cloner/DataCloner-Command-Sync.js +110 -75
  53. package/source/services/data-cloner/pict-app/Pict-Application-DataCloner.js +70 -47
  54. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Export.js +3 -3
  55. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Layout.js +40 -86
  56. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-SettingsPanel.js +61 -0
  57. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Shell.js +136 -0
  58. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-StatusBar.js +117 -0
  59. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-StatusDetail.js +81 -0
  60. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-Sync.js +18 -18
  61. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-TopBar-Nav.js +42 -0
  62. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-TopBar-User.js +48 -0
  63. package/source/services/data-cloner/pict-app/views/PictView-DataCloner-ViewData.js +2 -2
  64. package/source/services/data-cloner/web/data-cloner.js +5772 -7986
  65. package/source/services/data-cloner/web/data-cloner.js.map +1 -1
  66. package/source/services/data-cloner/web/data-cloner.min.js +75 -1
  67. package/source/services/data-cloner/web/data-cloner.min.js.map +1 -1
  68. package/source/services/data-cloner/web/favicons/favicon-dark.svg +13 -0
  69. package/source/services/data-cloner/web/favicons/favicon-light.svg +13 -0
  70. package/source/services/data-cloner/web/favicons/favicon.svg +13 -0
  71. package/source/services/data-cloner/web/favicons/favicons/favicon-dark.svg +13 -0
  72. package/source/services/data-cloner/web/favicons/favicons/favicon-light.svg +13 -0
  73. package/source/services/data-cloner/web/favicons/favicons/favicon.svg +13 -0
  74. package/source/services/data-cloner/web/index.html +3 -0
  75. package/source/services/data-cloner/web/pict.min.js +12 -0
  76. package/test/Bundles_smoke_tests.js +43 -0
  77. package/test/ComprehensionLoader_smoke_tests.js +95 -0
  78. package/test/DataCloner-RuntimeOverrides_tests.js +344 -0
  79. package/test/DataCloner_smoke_tests.js +87 -0
  80. package/docs/css/docuserve.css +0 -327
@@ -0,0 +1,81 @@
1
+ 'use strict';
2
+
3
+ const libPictView = require('pict-view');
4
+
5
+ class DataClonerStatusDetailView extends libPictView
6
+ {
7
+ onAfterRender(pRenderable, pAddress, pRecord, pContent)
8
+ {
9
+ if (this.pict.CSSMap) { this.pict.CSSMap.injectCSS(); }
10
+ return super.onAfterRender(pRenderable, pAddress, pRecord, pContent);
11
+ }
12
+ }
13
+
14
+ module.exports = DataClonerStatusDetailView;
15
+
16
+ module.exports.default_configuration =
17
+ {
18
+ ViewIdentifier: 'DataCloner-StatusDetail',
19
+ DefaultRenderable: 'DataCloner-StatusDetail',
20
+ DefaultDestinationAddress: '#DataCloner-StatusDetail-Panel',
21
+ AutoRender: false,
22
+ CSS: /*css*/`
23
+ .rds-status-detail-body {
24
+ padding: 12px 20px 16px;
25
+ max-height: 100%;
26
+ overflow-y: auto;
27
+ color: var(--theme-color-text-primary, #333);
28
+ }
29
+ .rds-status-detail-section { margin-bottom: 14px; }
30
+ .rds-status-detail-section:last-child { margin-bottom: 0; }
31
+ .rds-status-detail-section-title {
32
+ font-size: 0.85em; font-weight: 600;
33
+ color: var(--theme-color-text-secondary, #555);
34
+ text-transform: uppercase; letter-spacing: 0.5px;
35
+ margin-bottom: 8px; padding-bottom: 4px;
36
+ border-bottom: 1px solid var(--theme-color-border-light, #eee);
37
+ }
38
+ .running-op-row { display: flex; align-items: center; gap: 12px; padding: 6px 0; font-size: 0.9em; }
39
+ .running-op-name { font-weight: 600; min-width: 180px; }
40
+ .running-op-bar {
41
+ flex: 1; height: 8px;
42
+ background: var(--theme-color-background-tertiary, #e9ecef);
43
+ border-radius: 4px; overflow: hidden; min-width: 120px;
44
+ }
45
+ .running-op-bar-fill {
46
+ height: 100%;
47
+ background: var(--theme-color-brand-primary, #4a90d9);
48
+ transition: width 0.5s ease;
49
+ }
50
+ .running-op-count { font-size: 0.85em; color: var(--theme-color-text-secondary, #666); white-space: nowrap; }
51
+ .running-op-pending { color: var(--theme-color-text-muted, #888); font-size: 0.85em; font-style: italic; padding: 4px 0; }
52
+ .completed-op-row { padding: 8px 0; border-bottom: 1px solid var(--theme-color-background-tertiary, #f0f0f0); }
53
+ .completed-op-row:last-child { border-bottom: none; }
54
+ .completed-op-header { display: flex; align-items: center; gap: 10px; font-size: 0.9em; margin-bottom: 4px; }
55
+ .completed-op-name { font-weight: 600; }
56
+ .completed-op-stats { color: var(--theme-color-text-secondary, #666); font-size: 0.85em; }
57
+ .completed-op-checkmark { color: var(--theme-color-status-success, #28a745); }
58
+ .error-op-row { padding: 6px 0; border-bottom: 1px solid var(--theme-color-background-tertiary, #f0f0f0); font-size: 0.9em; }
59
+ .error-op-row:last-child { border-bottom: none; }
60
+ .error-op-header { display: flex; align-items: center; gap: 8px; }
61
+ .error-op-name { font-weight: 600; color: var(--theme-color-status-error, #dc3545); }
62
+ .error-op-status { font-size: 0.82em; color: var(--theme-color-status-error, #dc3545); }
63
+ .error-op-message { font-size: 0.82em; color: var(--theme-color-text-muted, #888); margin-top: 2px; padding-left: 18px; }
64
+ `,
65
+ Templates: [{
66
+ Hash: 'DataCloner-StatusDetail',
67
+ Template: /*html*/`
68
+ <div class="rds-status-detail-body">
69
+ <div class="rds-status-detail-section">
70
+ <div class="rds-status-detail-section-title">Throughput</div>
71
+ <div id="DataCloner-Throughput-Histogram" style="height:120px"></div>
72
+ </div>
73
+ <div id="DataCloner-StatusDetail-Container"></div>
74
+ </div>`
75
+ }],
76
+ Renderables: [{
77
+ RenderableHash: 'DataCloner-StatusDetail',
78
+ TemplateHash: 'DataCloner-StatusDetail',
79
+ DestinationAddress: '#DataCloner-StatusDetail-Panel'
80
+ }]
81
+ };
@@ -196,7 +196,7 @@ class DataClonerSyncView extends libPictView
196
196
  // --- Summary Cards ---
197
197
  let tmpCardsContainer = document.getElementById('reportSummaryCards');
198
198
  let tmpOutcomeClass = 'outcome-' + pReport.Outcome.toLowerCase();
199
- let tmpOutcomeColor = { Success: '#28a745', Partial: '#ffc107', Error: '#dc3545', Stopped: '#6c757d' }[pReport.Outcome] || '#666';
199
+ 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)';
200
200
 
201
201
  let tmpDurationSec = pReport.RunTimestamps.DurationSeconds || 0;
202
202
  let tmpDurationStr = tmpDurationSec < 60 ? tmpDurationSec + 's' : Math.floor(tmpDurationSec / 60) + 'm ' + (tmpDurationSec % 60) + 's';
@@ -235,13 +235,13 @@ class DataClonerSyncView extends libPictView
235
235
  }
236
236
  else
237
237
  {
238
- let tmpHtml = '<h4 style="margin:0 0 8px; color:#dc3545; font-size:0.95em">Anomalies (' + pReport.Anomalies.length + ')</h4>';
238
+ let tmpHtml = '<h4 style="margin:0 0 8px; color:var(--theme-color-status-error, #dc3545); font-size:0.95em">Anomalies (' + pReport.Anomalies.length + ')</h4>';
239
239
  tmpHtml += '<table class="progress-table">';
240
240
  tmpHtml += '<tr><th>Table</th><th>Type</th><th>Message</th></tr>';
241
241
  for (let i = 0; i < pReport.Anomalies.length; i++)
242
242
  {
243
243
  let tmpAnomaly = pReport.Anomalies[i];
244
- let tmpTypeColor = tmpAnomaly.Type === 'Error' ? '#dc3545' : (tmpAnomaly.Type === 'Partial' ? '#ffc107' : '#6c757d');
244
+ let tmpTypeColor = tmpAnomaly.Type === 'Error' ? 'var(--theme-color-status-error, #dc3545)' : (tmpAnomaly.Type === 'Partial' ? 'var(--theme-color-status-warning, #ffc107)' : 'var(--theme-color-text-secondary, #6c757d)');
245
245
  tmpHtml += '<tr>';
246
246
  tmpHtml += '<td><strong>' + this.pict.providers.DataCloner.escapeHtml(tmpAnomaly.Table) + '</strong></td>';
247
247
  tmpHtml += '<td style="color:' + tmpTypeColor + '">' + tmpAnomaly.Type + '</td>';
@@ -265,7 +265,7 @@ class DataClonerSyncView extends libPictView
265
265
  let tmpTable = pReport.Tables[i];
266
266
  let tmpDur = tmpTable.DurationSeconds < 60 ? tmpTable.DurationSeconds + 's' : Math.floor(tmpTable.DurationSeconds / 60) + 'm ' + (tmpTable.DurationSeconds % 60) + 's';
267
267
  let tmpRecs = tmpTable.Total.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
268
- let tmpStatusColor = { Complete: '#28a745', Error: '#dc3545', Partial: '#ffc107' }[tmpTable.Status] || '#666';
268
+ let tmpStatusColor = { Complete: 'var(--theme-color-status-success, #28a745)', Error: 'var(--theme-color-status-error, #dc3545)', Partial: 'var(--theme-color-status-warning, #ffc107)' }[tmpTable.Status] || 'var(--theme-color-text-secondary, #666)';
269
269
  tmpHtml += '<tr>';
270
270
  tmpHtml += '<td><strong>' + this.pict.providers.DataCloner.escapeHtml(tmpTable.Name) + '</strong></td>';
271
271
  tmpHtml += '<td>' + tmpDur + '</td>';
@@ -369,11 +369,11 @@ class DataClonerSyncView extends libPictView
369
369
  }
370
370
 
371
371
  // Color the progress bar based on status
372
- let tmpBarColor = '#28a745'; // green
373
- if (pTable.Status === 'Error') tmpBarColor = '#dc3545';
374
- else if (pTable.Status === 'Partial') tmpBarColor = '#ffc107';
375
- else if (pTable.Status === 'Syncing') tmpBarColor = '#4a90d9';
376
- else if (pTable.Status === 'Pending') tmpBarColor = '#adb5bd';
372
+ let tmpBarColor = 'var(--theme-color-status-success, #28a745)'; // green
373
+ if (pTable.Status === 'Error') tmpBarColor = 'var(--theme-color-status-error, #dc3545)';
374
+ else if (pTable.Status === 'Partial') tmpBarColor = 'var(--theme-color-status-warning, #ffc107)';
375
+ else if (pTable.Status === 'Syncing') tmpBarColor = 'var(--theme-color-brand-primary, #4a90d9)';
376
+ else if (pTable.Status === 'Pending') tmpBarColor = 'var(--theme-color-text-muted, #adb5bd)';
377
377
 
378
378
  // Status badge
379
379
  let tmpStatusBadge = pTable.Status;
@@ -482,24 +482,24 @@ module.exports.default_configuration =
482
482
  CSS: /*css*/`
483
483
  .progress-table { width: 100%; border-collapse: collapse; margin-top: 4px; margin-bottom: 4px; }
484
484
  .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; }
485
- .progress-table th { background: #f8f9fa; font-weight: 600; }
486
- .progress-table-muted td { color: var(--theme-color-text-muted, #888); padding: 3px 12px; font-size: 0.85em; border-bottom: 1px solid #f4f5f6; }
487
- .progress-bar-container { width: 120px; height: 16px; background: #e9ecef; border-radius: 8px; overflow: hidden; display: inline-block; vertical-align: middle; }
485
+ .progress-table th { background: var(--theme-color-background-secondary, #f8f9fa); font-weight: 600; }
486
+ .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); }
487
+ .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; }
488
488
  .progress-bar-fill { height: 100%; background: var(--theme-color-status-success, #28a745); transition: width 0.3s; }
489
- .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 var(--theme-color-border-default, #e0e0e0); }
489
+ .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); }
490
490
  .sync-section-header:first-child { border-top: none; margin-top: 10px; }
491
- .sync-section-header-error { color: #dc3545; }
491
+ .sync-section-header-error { color: var(--theme-color-status-error, #dc3545); }
492
492
  .sync-section-header-ok { color: var(--theme-color-status-success, #28a745); }
493
493
  .sync-section-count { font-weight: 400; color: var(--theme-color-text-muted, #999); font-size: 0.95em; }
494
494
  .sync-section-overflow { font-size: 0.8em; color: var(--theme-color-text-muted, #aaa); padding: 2px 12px 6px; }
495
495
  .sync-pending-count { text-align: right; color: var(--theme-color-text-muted, #aaa); font-size: 0.85em; }
496
- .report-card { background: #f8f9fa; border-radius: 8px; padding: 12px 16px; min-width: 140px; text-align: center; border: 1px solid #e9ecef; }
496
+ .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); }
497
497
  .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; }
498
498
  .report-card .card-value { font-size: 1.4em; font-weight: 700; }
499
499
  .report-card.outcome-success { border-left: 4px solid var(--theme-color-status-success, #28a745); }
500
- .report-card.outcome-partial { border-left: 4px solid #ffc107; }
501
- .report-card.outcome-error { border-left: 4px solid #dc3545; }
502
- .report-card.outcome-stopped { border-left: 4px solid #6c757d; }
500
+ .report-card.outcome-partial { border-left: 4px solid var(--theme-color-status-warning, #ffc107); }
501
+ .report-card.outcome-error { border-left: 4px solid var(--theme-color-status-error, #dc3545); }
502
+ .report-card.outcome-stopped { border-left: 4px solid var(--theme-color-text-secondary, #6c757d); }
503
503
  `,
504
504
  Templates:
505
505
  [
@@ -0,0 +1,42 @@
1
+ 'use strict';
2
+
3
+ const libPictView = require('pict-view');
4
+
5
+ class DataClonerTopBarNavView extends libPictView
6
+ {
7
+ onAfterRender(pRenderable, pAddress, pRecord, pContent)
8
+ {
9
+ if (this.pict.CSSMap) { this.pict.CSSMap.injectCSS(); }
10
+ return super.onAfterRender(pRenderable, pAddress, pRecord, pContent);
11
+ }
12
+ }
13
+
14
+ module.exports = DataClonerTopBarNavView;
15
+
16
+ module.exports.default_configuration =
17
+ {
18
+ ViewIdentifier: 'DataCloner-TopBar-Nav',
19
+ DefaultRenderable: 'DataCloner-TopBar-Nav',
20
+ DefaultDestinationAddress: '#Theme-TopBar-Nav',
21
+ AutoRender: false,
22
+ CSS: /*css*/`
23
+ .rds-nav {
24
+ display: flex; align-items: center; height: 100%;
25
+ padding: 0 12px; gap: 8px;
26
+ color: var(--theme-color-text-on-brand,
27
+ var(--theme-color-text-primary, #1a1a1a));
28
+ font-weight: 500;
29
+ }
30
+ .rds-nav-sep { opacity: 0.5; font-weight: 400; margin: 0 2px; }
31
+ .rds-nav-app { font-weight: 600; opacity: 0.95; }
32
+ `,
33
+ Templates: [{
34
+ Hash: 'DataCloner-TopBar-Nav',
35
+ Template: /*html*/`<div class="rds-nav"><span class="rds-nav-sep">·</span><span class="rds-nav-app">Data Cloner</span></div>`
36
+ }],
37
+ Renderables: [{
38
+ RenderableHash: 'DataCloner-TopBar-Nav',
39
+ TemplateHash: 'DataCloner-TopBar-Nav',
40
+ DestinationAddress: '#Theme-TopBar-Nav'
41
+ }]
42
+ };
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ const libPictView = require('pict-view');
4
+
5
+ class DataClonerTopBarUserView extends libPictView
6
+ {
7
+ onAfterRender(pRenderable, pAddress, pRecord, pContent)
8
+ {
9
+ if (this.pict.CSSMap) { this.pict.CSSMap.injectCSS(); }
10
+ return super.onAfterRender(pRenderable, pAddress, pRecord, pContent);
11
+ }
12
+ }
13
+
14
+ module.exports = DataClonerTopBarUserView;
15
+
16
+ module.exports.default_configuration =
17
+ {
18
+ ViewIdentifier: 'DataCloner-TopBar-User',
19
+ DefaultRenderable: 'DataCloner-TopBar-User',
20
+ DefaultDestinationAddress: '#Theme-TopBar-User',
21
+ AutoRender: false,
22
+ CSS: /*css*/`
23
+ .rds-user { display: flex; align-items: center; height: 100%; gap: 8px; padding: 0 12px; }
24
+ .rds-user-btn {
25
+ padding: 4px 8px;
26
+ border: 1px solid var(--theme-color-border-default, #5E5549);
27
+ background: transparent;
28
+ color: var(--theme-color-text-on-brand,
29
+ var(--theme-color-text-secondary, #1a1a1a));
30
+ border-radius: 4px;
31
+ cursor: pointer;
32
+ display: inline-flex; align-items: center; justify-content: center;
33
+ font-size: 1em; line-height: 1;
34
+ }
35
+ .rds-user-btn:hover {
36
+ background: var(--theme-color-background-hover, rgba(255,255,255,0.08));
37
+ }
38
+ `,
39
+ Templates: [{
40
+ Hash: 'DataCloner-TopBar-User',
41
+ Template: /*html*/`<div class="rds-user"><button class="rds-user-btn" onclick="_Pict.views['DataCloner-Shell'].toggleSettingsPanel()" title="Settings" aria-label="Settings">{~I:Settings~}</button></div>`
42
+ }],
43
+ Renderables: [{
44
+ RenderableHash: 'DataCloner-TopBar-User',
45
+ TemplateHash: 'DataCloner-TopBar-User',
46
+ DestinationAddress: '#Theme-TopBar-User'
47
+ }]
48
+ };
@@ -123,10 +123,10 @@ module.exports.default_configuration =
123
123
  DefaultDestinationAddress: '#DataCloner-Section-ViewData',
124
124
  CSS: /*css*/`
125
125
  .data-table { width: 100%; border-collapse: collapse; font-size: 0.8em; font-family: monospace; }
126
- .data-table th { background: #f8f9fa; font-weight: 600; text-align: left; padding: 4px 8px; border: 1px solid var(--theme-color-border-default, #ddd); white-space: nowrap; position: sticky; top: 0; }
126
+ .data-table th { background: var(--theme-color-background-secondary, #f8f9fa); font-weight: 600; text-align: left; padding: 4px 8px; border: 1px solid var(--theme-color-border-default, #ddd); white-space: nowrap; position: sticky; top: 0; }
127
127
  .data-table td { padding: 4px 8px; border: 1px solid var(--theme-color-border-light, #eee); white-space: nowrap; max-width: 300px; overflow: hidden; text-overflow: ellipsis; }
128
128
  .data-table tr:nth-child(even) { background: var(--theme-color-background-secondary, #fafafa); }
129
- .data-table tr:hover { background: #f0f7ff; }
129
+ .data-table tr:hover { background: var(--theme-color-background-hover, #f0f7ff); }
130
130
  `,
131
131
  Templates:
132
132
  [