pict-section-flow 1.0.0 → 1.1.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 (71) hide show
  1. package/README.md +44 -13
  2. package/docs/Architecture.md +8 -148
  3. package/docs/Data_Model.md +2 -11
  4. package/docs/README.md +8 -38
  5. package/docs/Theme_Integration.md +13 -13
  6. package/docs/_cover.md +7 -1
  7. package/docs/_playground.json +24 -0
  8. package/docs/_sidebar.md +4 -0
  9. package/docs/_topbar.md +1 -1
  10. package/docs/_version.json +3 -3
  11. package/docs/card-help/FREAD.md +1 -1
  12. package/docs/diagrams/architecture-at-a-glance.excalidraw +4270 -0
  13. package/docs/diagrams/architecture-at-a-glance.mmd +30 -0
  14. package/docs/diagrams/architecture-at-a-glance.svg +2 -0
  15. package/docs/diagrams/data-flow.excalidraw +1451 -0
  16. package/docs/diagrams/data-flow.mmd +17 -0
  17. package/docs/diagrams/data-flow.svg +2 -0
  18. package/docs/diagrams/high-level-design.excalidraw +5767 -0
  19. package/docs/diagrams/high-level-design.mmd +86 -0
  20. package/docs/diagrams/high-level-design.svg +2 -0
  21. package/docs/diagrams/relationships.excalidraw +3852 -0
  22. package/docs/diagrams/relationships.mmd +9 -0
  23. package/docs/diagrams/relationships.svg +2 -0
  24. package/docs/diagrams/service-initialization-sequence.excalidraw +1466 -0
  25. package/docs/diagrams/service-initialization-sequence.mmd +19 -0
  26. package/docs/diagrams/service-initialization-sequence.svg +2 -0
  27. package/docs/diagrams/svg-layer-structure.excalidraw +1060 -0
  28. package/docs/diagrams/svg-layer-structure.mmd +18 -0
  29. package/docs/diagrams/svg-layer-structure.svg +2 -0
  30. package/docs/examples/README.md +9 -0
  31. package/docs/examples/simple_cards/README.md +677 -0
  32. package/docs/examples/simple_cards/css/flowexample.css +65 -0
  33. package/docs/examples/simple_cards/index.html +32 -0
  34. package/docs/examples/simple_cards/js/pict.min.js +12 -0
  35. package/docs/examples/simple_cards/pict-section-flow-example-simple-cards.compatible.min.js +1 -0
  36. package/docs/index.html +6 -7
  37. package/docs/playground/app.json +6 -0
  38. package/docs/playground/appdata.json +85 -0
  39. package/docs/playground/application.js +23 -0
  40. package/docs/playground/pict.json +17 -0
  41. package/docs/playground/runtime/pict-application.min.js +2 -0
  42. package/docs/playground/runtime/pict-section-flow.min.js +2 -0
  43. package/docs/playground/runtime/pict-section-modal.min.js +2 -0
  44. package/docs/playground/runtime/pict.min.js +12 -0
  45. package/docs/retold-catalog.json +241 -166
  46. package/docs/retold-keyword-index.json +19312 -7226
  47. package/example_applications/simple_cards/package.json +9 -1
  48. package/example_applications/simple_cards/source/views/PictView-FlowExample-BottomBar.js +2 -2
  49. package/package.json +5 -5
  50. package/source/PictFlowCard.js +2 -2
  51. package/source/providers/PictProvider-Flow-CSS.js +38 -12
  52. package/source/providers/PictProvider-Flow-ConnectorShapes.js +8 -8
  53. package/source/providers/PictProvider-Flow-Icons.js +33 -33
  54. package/source/providers/PictProvider-Flow-NodeTypes.js +9 -9
  55. package/source/providers/PictProvider-Flow-PanelChrome.js +2 -1
  56. package/source/providers/PictProvider-Flow-Renderer.js +516 -0
  57. package/source/providers/PictProvider-Flow-StylePresets.js +259 -0
  58. package/source/providers/PictProvider-Flow-Theme.js +97 -669
  59. package/source/services/PictService-Flow-ConnectionRenderer.js +6 -6
  60. package/source/services/PictService-Flow-DataManager.js +6 -0
  61. package/source/services/PictService-Flow-InteractionManager.js +10 -1
  62. package/source/services/PictService-Flow-PanelManager.js +106 -2
  63. package/source/services/PictService-Flow-PortRenderer.js +6 -6
  64. package/source/views/PictView-Flow-Node.js +1 -1
  65. package/source/views/PictView-Flow-PropertiesPanel.js +71 -4
  66. package/source/views/PictView-Flow-Toolbar.js +24 -16
  67. package/source/views/PictView-Flow.js +225 -47
  68. package/test/PanelManager_tests.js +172 -0
  69. package/test/Renderer_tests.js +133 -0
  70. package/test/StylePresets_tests.js +153 -0
  71. package/docs/css/docuserve.css +0 -327
@@ -0,0 +1,153 @@
1
+ const libFable = require('fable');
2
+ const libChai = require('chai');
3
+ const libExpect = libChai.expect;
4
+
5
+ const libRenderer = require('../source/providers/PictProvider-Flow-Renderer.js');
6
+ const libStylePresets = require('../source/providers/PictProvider-Flow-StylePresets.js');
7
+
8
+ // Minimal FlowView shim — captures the apply calls so we can verify each
9
+ // preset axis fires. The real FlowView wires Renderer + setEdgeTheme; here
10
+ // we substitute a fake whose setEdgeTheme just records its argument.
11
+ function makeFakeFlowView(pFable)
12
+ {
13
+ let tmpRenderer = new libRenderer(pFable, {}, 'Renderer-Test');
14
+ let tmpView =
15
+ {
16
+ _RendererProvider: tmpRenderer,
17
+ setEdgeThemeCalls: [],
18
+ setEdgeTheme: function (pName)
19
+ {
20
+ tmpView.setEdgeThemeCalls.push(pName);
21
+ }
22
+ };
23
+ tmpRenderer._FlowView = tmpView;
24
+ return tmpView;
25
+ }
26
+
27
+ // pict-provider-theme mock that records applyTheme calls.
28
+ function attachFakeThemeProvider(pFable)
29
+ {
30
+ pFable.providers = pFable.providers || {};
31
+ let tmpCalls = [];
32
+ pFable.providers.Theme =
33
+ {
34
+ applyTheme: function (pHash) { tmpCalls.push(pHash); }
35
+ };
36
+ return tmpCalls;
37
+ }
38
+
39
+ suite('PictProvider-Flow-StylePresets',
40
+ function ()
41
+ {
42
+ let _Fable;
43
+ let _FlowView;
44
+ let _ThemeCalls;
45
+ let _Presets;
46
+
47
+ setup(function ()
48
+ {
49
+ _Fable = new libFable({});
50
+ _FlowView = makeFakeFlowView(_Fable);
51
+ _ThemeCalls = attachFakeThemeProvider(_Fable);
52
+ _Presets = new libStylePresets(_Fable, { FlowView: _FlowView }, 'Presets-Test');
53
+ });
54
+
55
+ suite('Built-in preset registry', function ()
56
+ {
57
+ test('registers all 7 bundled presets', function ()
58
+ {
59
+ let tmpHashes = _Presets.getPresetHashes();
60
+ libExpect(tmpHashes).to.include('modern');
61
+ libExpect(tmpHashes).to.include('sketch');
62
+ libExpect(tmpHashes).to.include('blueprint');
63
+ libExpect(tmpHashes).to.include('mono');
64
+ libExpect(tmpHashes).to.include('retro-80s');
65
+ libExpect(tmpHashes).to.include('retro-90s');
66
+ libExpect(tmpHashes).to.include('whiteboard');
67
+ });
68
+
69
+ test('each bundled preset has ColorTheme + Renderer + EdgeTheme', function ()
70
+ {
71
+ let tmpHashes = _Presets.getPresetHashes();
72
+ for (let i = 0; i < tmpHashes.length; i++)
73
+ {
74
+ let tmpPreset = _Presets.getPreset(tmpHashes[i]);
75
+ libExpect(tmpPreset, `preset ${tmpHashes[i]}`).to.have.property('Hash', tmpHashes[i]);
76
+ libExpect(tmpPreset).to.have.property('ColorTheme');
77
+ libExpect(tmpPreset).to.have.property('Renderer');
78
+ libExpect(tmpPreset).to.have.property('EdgeTheme');
79
+ }
80
+ });
81
+ });
82
+
83
+ suite('applyPreset()', function ()
84
+ {
85
+ test('applies ColorTheme + Renderer + EdgeTheme + optional NoiseLevel', function ()
86
+ {
87
+ let tmpOk = _Presets.applyPreset('sketch');
88
+ libExpect(tmpOk).to.equal(true);
89
+ libExpect(_ThemeCalls).to.deep.equal(['flow-sketch']);
90
+ libExpect(_FlowView._RendererProvider.getActiveRendererKey()).to.equal('sketch');
91
+ libExpect(_FlowView.setEdgeThemeCalls).to.deep.equal(['bezier']);
92
+ libExpect(_FlowView._RendererProvider.getNoiseLevel()).to.equal(0.4);
93
+ });
94
+
95
+ test('blueprint applies bracket renderer + orthogonal edges', function ()
96
+ {
97
+ _Presets.applyPreset('blueprint');
98
+ libExpect(_ThemeCalls).to.deep.equal(['flow-blueprint']);
99
+ libExpect(_FlowView._RendererProvider.getActiveRendererKey()).to.equal('bracket');
100
+ libExpect(_FlowView.setEdgeThemeCalls).to.deep.equal(['orthogonal']);
101
+ });
102
+
103
+ test('returns false + leaves state unchanged for unknown preset hash', function ()
104
+ {
105
+ _Presets.applyPreset('sketch');
106
+ let tmpResult = _Presets.applyPreset('nonexistent');
107
+ libExpect(tmpResult).to.equal(false);
108
+ libExpect(_Presets.getActivePresetHash()).to.equal('sketch');
109
+ });
110
+
111
+ test('records active preset hash on success', function ()
112
+ {
113
+ libExpect(_Presets.getActivePresetHash()).to.equal(null);
114
+ _Presets.applyPreset('mono');
115
+ libExpect(_Presets.getActivePresetHash()).to.equal('mono');
116
+ });
117
+ });
118
+
119
+ suite('register() + custom presets', function ()
120
+ {
121
+ test('apps can register their own preset and apply it', function ()
122
+ {
123
+ _Presets.register({
124
+ Hash: 'corporate',
125
+ Label: 'Corporate',
126
+ ColorTheme: 'pict-default',
127
+ Renderer: 'clean',
128
+ EdgeTheme: 'orthogonal'
129
+ });
130
+ let tmpOk = _Presets.applyPreset('corporate');
131
+ libExpect(tmpOk).to.equal(true);
132
+ libExpect(_ThemeCalls).to.deep.equal(['pict-default']);
133
+ libExpect(_FlowView._RendererProvider.getActiveRendererKey()).to.equal('clean');
134
+ });
135
+
136
+ test('register() rejects payloads missing a Hash', function ()
137
+ {
138
+ let tmpOk = _Presets.register({ Label: 'Bad' });
139
+ libExpect(tmpOk).to.equal(false);
140
+ });
141
+ });
142
+
143
+ suite('markCustomized()', function ()
144
+ {
145
+ test('clears the active preset hash so consumers know we deviated', function ()
146
+ {
147
+ _Presets.applyPreset('sketch');
148
+ libExpect(_Presets.getActivePresetHash()).to.equal('sketch');
149
+ _Presets.markCustomized();
150
+ libExpect(_Presets.getActivePresetHash()).to.equal(null);
151
+ });
152
+ });
153
+ });
@@ -1,327 +0,0 @@
1
- /* ============================================================================
2
- Pict Docuserve - Base Styles & Theme Variables
3
- ============================================================================ */
4
-
5
- /* ----------------------------------------------------------------------------
6
- Theme variables — light defaults on :root.
7
- Dark mode applies when either:
8
- (a) the user explicitly selected dark via <html data-theme="dark">
9
- (b) the user hasn't chosen anything AND the system prefers dark
10
- An explicit <html data-theme="light"> pins the light palette regardless.
11
- ---------------------------------------------------------------------------- */
12
-
13
- :root
14
- {
15
- /* Surfaces */
16
- --docuserve-bg: #FDFBF7;
17
- --docuserve-bg-elevated: #FFFFFF;
18
- --docuserve-border: #DDD6CA;
19
- --docuserve-border-soft: #EAE3D8;
20
-
21
- /* Text */
22
- --docuserve-text: #2A241E;
23
- --docuserve-text-strong: #3D3229;
24
- --docuserve-text-muted: #5E5549;
25
- --docuserve-text-dim: #8A7F72;
26
-
27
- /* Accent / links */
28
- --docuserve-accent: #2E7D74;
29
- --docuserve-accent-hover: #236660;
30
-
31
- /* Top bar */
32
- --docuserve-topbar-bg: #3D3229;
33
- --docuserve-topbar-text: #E8E0D4;
34
- --docuserve-topbar-text-muted: #B5AA9A;
35
- --docuserve-topbar-text-dim: #8A7F72;
36
- --docuserve-topbar-hover-bg: #524438;
37
- --docuserve-topbar-version-bg: rgba(255, 255, 255, 0.06);
38
- --docuserve-topbar-version-border: rgba(255, 255, 255, 0.08);
39
- --docuserve-topbar-version-text: #B5AA9A;
40
-
41
- /* Sidebar */
42
- --docuserve-sidebar-bg: #FAF7F1;
43
- --docuserve-sidebar-border: #DDD6CA;
44
- --docuserve-sidebar-border-soft: #E5DED1;
45
- --docuserve-sidebar-text: #423D37;
46
- --docuserve-sidebar-group-title: #3D3229;
47
- --docuserve-sidebar-module-text: #5E5549;
48
- --docuserve-sidebar-hover-bg: #EAE3D8;
49
- --docuserve-sidebar-hover-text: #2E7D74;
50
- --docuserve-sidebar-active-bg: #E5DED1;
51
- --docuserve-sidebar-active-text: #2E7D74;
52
- --docuserve-sidebar-search-bg: #FFFFFF;
53
- --docuserve-sidebar-search-border: #DDD6CA;
54
-
55
- /* Inline code */
56
- --docuserve-inline-code-bg: #F0ECE4;
57
- --docuserve-inline-code-text: #9E3A50;
58
-
59
- /* Code block panel */
60
- --docuserve-code-bg: #F6F3EE;
61
- --docuserve-code-border: #E5DED1;
62
- --docuserve-code-gutter-bg: #EFEAE0;
63
- --docuserve-code-gutter-border: #DDD6CA;
64
- --docuserve-code-gutter-text: #A59986;
65
- --docuserve-code-text: #2A241E;
66
-
67
- /* Syntax tokens — low-chroma dark-on-light palette */
68
- --docuserve-tok-keyword: #A03472;
69
- --docuserve-tok-string: #1A6640;
70
- --docuserve-tok-number: #B25A00;
71
- --docuserve-tok-comment: #8A7F72;
72
- --docuserve-tok-operator: #2E7D74;
73
- --docuserve-tok-punctuation: #2A241E;
74
- --docuserve-tok-function: #2A5DB0;
75
- --docuserve-tok-property: #9E3A50;
76
- --docuserve-tok-tag: #9E3A50;
77
- --docuserve-tok-attr-name: #B25A00;
78
- --docuserve-tok-attr-value: #1A6640;
79
-
80
- /* Tables, blockquotes, mermaid */
81
- --docuserve-table-header-bg: #F5F0E8;
82
- --docuserve-table-row-alt-bg: #F9F6F0;
83
- --docuserve-blockquote-bg: #F7F5F0;
84
- --docuserve-blockquote-border: #2E7D74;
85
- --docuserve-blockquote-text: #5E5549;
86
- --docuserve-mermaid-bg: #FFFFFF;
87
-
88
- /* Scrollbars */
89
- --docuserve-scrollbar-track: #F5F0E8;
90
- --docuserve-scrollbar-thumb: #D4CCBE;
91
- --docuserve-scrollbar-thumb-hover: #B5AA9A;
92
- }
93
-
94
- @media (prefers-color-scheme: dark)
95
- {
96
- :root:not([data-theme="light"])
97
- {
98
- --docuserve-bg: #15120F;
99
- --docuserve-bg-elevated: #1B1814;
100
- --docuserve-border: #2F2823;
101
- --docuserve-border-soft: #26211C;
102
-
103
- --docuserve-text: #E8E0D4;
104
- --docuserve-text-strong: #F2ECE0;
105
- --docuserve-text-muted: #B5AA9A;
106
- --docuserve-text-dim: #7A6F62;
107
-
108
- --docuserve-accent: #5DB8A8;
109
- --docuserve-accent-hover: #7FCCB8;
110
-
111
- --docuserve-topbar-bg: #1A1612;
112
- --docuserve-topbar-text: #E8E0D4;
113
- --docuserve-topbar-text-muted: #B5AA9A;
114
- --docuserve-topbar-text-dim: #7A6F62;
115
- --docuserve-topbar-hover-bg: #2A241E;
116
- --docuserve-topbar-version-bg: rgba(255, 255, 255, 0.05);
117
- --docuserve-topbar-version-border: rgba(255, 255, 255, 0.09);
118
- --docuserve-topbar-version-text: #B5AA9A;
119
-
120
- --docuserve-sidebar-bg: #1B1814;
121
- --docuserve-sidebar-border: #2F2823;
122
- --docuserve-sidebar-border-soft: #26211C;
123
- --docuserve-sidebar-text: #C9C0B3;
124
- --docuserve-sidebar-group-title: #F2ECE0;
125
- --docuserve-sidebar-module-text: #B5AA9A;
126
- --docuserve-sidebar-hover-bg: #2A241E;
127
- --docuserve-sidebar-hover-text: #7FCCB8;
128
- --docuserve-sidebar-active-bg: #2F2823;
129
- --docuserve-sidebar-active-text: #7FCCB8;
130
- --docuserve-sidebar-search-bg: #26211C;
131
- --docuserve-sidebar-search-border: #2F2823;
132
-
133
- --docuserve-inline-code-bg: #2A241E;
134
- --docuserve-inline-code-text: #E8B07A;
135
-
136
- --docuserve-code-bg: #1E1A17;
137
- --docuserve-code-border: #2F2823;
138
- --docuserve-code-gutter-bg: #17130F;
139
- --docuserve-code-gutter-border: #2F2823;
140
- --docuserve-code-gutter-text: #6A6052;
141
- --docuserve-code-text: #E8E0D4;
142
-
143
- --docuserve-tok-keyword: #C678DD;
144
- --docuserve-tok-string: #98C379;
145
- --docuserve-tok-number: #D19A66;
146
- --docuserve-tok-comment: #7F848E;
147
- --docuserve-tok-operator: #56B6C2;
148
- --docuserve-tok-punctuation: #E8E0D4;
149
- --docuserve-tok-function: #61AFEF;
150
- --docuserve-tok-property: #E06C75;
151
- --docuserve-tok-tag: #E06C75;
152
- --docuserve-tok-attr-name: #D19A66;
153
- --docuserve-tok-attr-value: #98C379;
154
-
155
- --docuserve-table-header-bg: #26211C;
156
- --docuserve-table-row-alt-bg: #1F1B17;
157
- --docuserve-blockquote-bg: #1F1B17;
158
- --docuserve-blockquote-border: #5DB8A8;
159
- --docuserve-blockquote-text: #C9C0B3;
160
- --docuserve-mermaid-bg: #E8E0D4;
161
-
162
- --docuserve-scrollbar-track: #1B1814;
163
- --docuserve-scrollbar-thumb: #3A322B;
164
- --docuserve-scrollbar-thumb-hover: #524438;
165
- }
166
- }
167
-
168
- :root[data-theme="dark"]
169
- {
170
- --docuserve-bg: #15120F;
171
- --docuserve-bg-elevated: #1B1814;
172
- --docuserve-border: #2F2823;
173
- --docuserve-border-soft: #26211C;
174
-
175
- --docuserve-text: #E8E0D4;
176
- --docuserve-text-strong: #F2ECE0;
177
- --docuserve-text-muted: #B5AA9A;
178
- --docuserve-text-dim: #7A6F62;
179
-
180
- --docuserve-accent: #5DB8A8;
181
- --docuserve-accent-hover: #7FCCB8;
182
-
183
- --docuserve-topbar-bg: #1A1612;
184
- --docuserve-topbar-text: #E8E0D4;
185
- --docuserve-topbar-text-muted: #B5AA9A;
186
- --docuserve-topbar-text-dim: #7A6F62;
187
- --docuserve-topbar-hover-bg: #2A241E;
188
- --docuserve-topbar-version-bg: rgba(255, 255, 255, 0.05);
189
- --docuserve-topbar-version-border: rgba(255, 255, 255, 0.09);
190
- --docuserve-topbar-version-text: #B5AA9A;
191
-
192
- --docuserve-sidebar-bg: #1B1814;
193
- --docuserve-sidebar-border: #2F2823;
194
- --docuserve-sidebar-border-soft: #26211C;
195
- --docuserve-sidebar-text: #C9C0B3;
196
- --docuserve-sidebar-group-title: #F2ECE0;
197
- --docuserve-sidebar-module-text: #B5AA9A;
198
- --docuserve-sidebar-hover-bg: #2A241E;
199
- --docuserve-sidebar-hover-text: #7FCCB8;
200
- --docuserve-sidebar-active-bg: #2F2823;
201
- --docuserve-sidebar-active-text: #7FCCB8;
202
- --docuserve-sidebar-search-bg: #26211C;
203
- --docuserve-sidebar-search-border: #2F2823;
204
-
205
- --docuserve-inline-code-bg: #2A241E;
206
- --docuserve-inline-code-text: #E8B07A;
207
-
208
- --docuserve-code-bg: #1E1A17;
209
- --docuserve-code-border: #2F2823;
210
- --docuserve-code-gutter-bg: #17130F;
211
- --docuserve-code-gutter-border: #2F2823;
212
- --docuserve-code-gutter-text: #6A6052;
213
- --docuserve-code-text: #E8E0D4;
214
-
215
- --docuserve-tok-keyword: #C678DD;
216
- --docuserve-tok-string: #98C379;
217
- --docuserve-tok-number: #D19A66;
218
- --docuserve-tok-comment: #7F848E;
219
- --docuserve-tok-operator: #56B6C2;
220
- --docuserve-tok-punctuation: #E8E0D4;
221
- --docuserve-tok-function: #61AFEF;
222
- --docuserve-tok-property: #E06C75;
223
- --docuserve-tok-tag: #E06C75;
224
- --docuserve-tok-attr-name: #D19A66;
225
- --docuserve-tok-attr-value: #98C379;
226
-
227
- --docuserve-table-header-bg: #26211C;
228
- --docuserve-table-row-alt-bg: #1F1B17;
229
- --docuserve-blockquote-bg: #1F1B17;
230
- --docuserve-blockquote-border: #5DB8A8;
231
- --docuserve-blockquote-text: #C9C0B3;
232
- --docuserve-mermaid-bg: #E8E0D4;
233
-
234
- --docuserve-scrollbar-track: #1B1814;
235
- --docuserve-scrollbar-thumb: #3A322B;
236
- --docuserve-scrollbar-thumb-hover: #524438;
237
- }
238
-
239
- /* ----------------------------------------------------------------------------
240
- Reset and base
241
- ---------------------------------------------------------------------------- */
242
-
243
- *, *::before, *::after
244
- {
245
- box-sizing: border-box;
246
- }
247
-
248
- html, body
249
- {
250
- margin: 0;
251
- padding: 0;
252
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
253
- font-size: 16px;
254
- line-height: 1.5;
255
- color: var(--docuserve-text);
256
- background-color: var(--docuserve-bg);
257
- -webkit-font-smoothing: antialiased;
258
- -moz-osx-font-smoothing: grayscale;
259
- transition: background-color 0.15s ease, color 0.15s ease;
260
- }
261
-
262
- /* Typography */
263
- h1, h2, h3, h4, h5, h6
264
- {
265
- margin-top: 0;
266
- line-height: 1.3;
267
- color: var(--docuserve-text-strong);
268
- }
269
-
270
- a
271
- {
272
- color: var(--docuserve-accent);
273
- text-decoration: none;
274
- }
275
-
276
- a:hover
277
- {
278
- color: var(--docuserve-accent-hover);
279
- }
280
-
281
- /* Application container */
282
- #Docuserve-Application-Container
283
- {
284
- min-height: 100vh;
285
- }
286
-
287
- /* Utility: scrollbar styling */
288
- ::-webkit-scrollbar
289
- {
290
- width: 8px;
291
- height: 8px;
292
- }
293
-
294
- ::-webkit-scrollbar-track
295
- {
296
- background: var(--docuserve-scrollbar-track);
297
- }
298
-
299
- ::-webkit-scrollbar-thumb
300
- {
301
- background: var(--docuserve-scrollbar-thumb);
302
- border-radius: 4px;
303
- }
304
-
305
- ::-webkit-scrollbar-thumb:hover
306
- {
307
- background: var(--docuserve-scrollbar-thumb-hover);
308
- }
309
-
310
- /* Responsive adjustments */
311
- @media (max-width: 768px)
312
- {
313
- html
314
- {
315
- font-size: 14px;
316
- }
317
-
318
- #Docuserve-Sidebar-Container
319
- {
320
- display: none;
321
- }
322
-
323
- .docuserve-body
324
- {
325
- flex-direction: column;
326
- }
327
- }