quackage 1.2.3 → 1.2.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quackage",
3
- "version": "1.2.3",
3
+ "version": "1.2.5",
4
4
  "description": "Building. Testing. Quacking. Reloading.",
5
5
  "main": "source/Quackage-CLIProgram.js",
6
6
  "scripts": {
@@ -60,14 +60,14 @@
60
60
  "gulp-env": "^0.4.0",
61
61
  "gulp-sourcemaps": "^3.0.0",
62
62
  "gulp-terser": "^2.1.0",
63
- "indoctrinate": "^1.0.10",
63
+ "indoctrinate": "^1.0.12",
64
64
  "jsdoc": "^4.0.5",
65
65
  "mocha": "10.4.0",
66
66
  "npm-check-updates": "^18.0.1",
67
67
  "nyc": "^15.1.0",
68
- "pict-provider-theme": "^0.0.4",
68
+ "pict-provider-theme": "^1.0.1",
69
69
  "pict-service-commandlineutility": "^1.0.19",
70
- "retold-harness": "^1.1.10",
70
+ "retold-harness": "^1.1.12",
71
71
  "vinyl-buffer": "^1.0.1",
72
72
  "vinyl-source-stream": "^2.0.0"
73
73
  },
@@ -77,6 +77,6 @@
77
77
  }
78
78
  },
79
79
  "devDependencies": {
80
- "pict-docuserve": "^0.1.5"
80
+ "pict-docuserve": "^1.4.1"
81
81
  }
82
82
  }
@@ -18,6 +18,7 @@ class QuackageCommandPrepareDocs extends libCommandLineCommand
18
18
  this.options.CommandOptions.push({ Name: '-b, --branch [branch]', Description: 'Git branch for GitHub raw URLs (defaults to master).', Default: 'master' });
19
19
  this.options.CommandOptions.push({ Name: '-g, --github_org [github_org]', Description: 'GitHub organization for raw URLs (defaults to stevenvelozo).', Default: 'stevenvelozo' });
20
20
  this.options.CommandOptions.push({ Name: '-x, --excluded_modules [excluded_modules]', Description: 'Comma-separated list of module names to exclude from the catalog and keyword index. Merged with any ExcludedModules list in indoctrinate\'s loaded config file (e.g. .indoctrinate.config.json).', Default: '' });
21
+ this.options.CommandOptions.push({ Name: '--docs_mode [docs_mode]', Description: 'Documentation scan mode: "module" (one module\'s docs/) or "ecosystem" (a folder of <group>/<module> repos). Auto-detected when omitted — "module" when the scan root has a package.json, else "ecosystem".', Default: '' });
21
22
 
22
23
  this.options.Aliases.push('docs');
23
24
  this.options.Aliases.push('prep-docs');
@@ -77,13 +78,76 @@ class QuackageCommandPrepareDocs extends libCommandLineCommand
77
78
  tmpExtraScanArgs = ['-e', tmpDocsContentRoot];
78
79
  }
79
80
 
81
+ // Documentation mode: "module" (a single module's docs/) vs
82
+ // "ecosystem" (a folder of <group>/<module> repos). Auto-detected
83
+ // from whether the scan root is itself a package (has package.json);
84
+ // the --docs_mode option overrides.
85
+ let tmpDocsMode = (this.CommandOptions.docs_mode === 'module' || this.CommandOptions.docs_mode === 'ecosystem')
86
+ ? this.CommandOptions.docs_mode
87
+ : (libFS.existsSync(libPath.join(tmpResolvedDirectoryRoot, 'package.json')) ? 'module' : 'ecosystem');
88
+ this.log.info(`Documentation mode: [${tmpDocsMode}] (scan root [${tmpResolvedDirectoryRoot}]).`);
89
+
90
+ // In single-module mode the catalog + keyword index describe one
91
+ // module — pass --single_module to indoctrinate. The docs folder is
92
+ // already inside the scanned module root, so the -e extra scan is
93
+ // redundant there (and its content would lack the docs/ path segment).
94
+ let tmpSingleModuleArgs = [];
95
+ if (tmpDocsMode === 'module')
96
+ {
97
+ tmpSingleModuleArgs = ['-s'];
98
+ tmpExtraScanArgs = [];
99
+ }
100
+
80
101
  let tmpAnticipate = this.fable.newAnticipate();
81
102
 
82
- // Step 1: Generate the documentation catalog
103
+ // Step 1: Build and stage flagged example applications into the docs
104
+ // folder. Runs first so any generated example index / quick-links
105
+ // markdown is on disk before the keyword index scans it into search.
106
+ // This is a clean no-op for modules with no flagged example
107
+ // applications, so it is safe to run everywhere prepare-docs runs.
108
+ tmpAnticipate.anticipate(
109
+ function (fNext)
110
+ {
111
+ this.log.info(`###############################[ STEP 1: STAGE EXAMPLE APPLICATIONS ]###############################`);
112
+ this.fable.QuackageProcess.execute(
113
+ tmpDocuserveLocation,
114
+ [
115
+ 'stage-examples',
116
+ tmpDocsFolder,
117
+ '-m', tmpDirectoryRoot
118
+ ],
119
+ { cwd: this.fable.AppData.CWD },
120
+ fNext
121
+ );
122
+ }.bind(this));
123
+
124
+ // Step 1b: Stage section-playground runtime bundles into the docs
125
+ // folder. Reads docs/_playground.json and copies every Imports[]
126
+ // entry with `Source: "local"` from its resolved UMD bundle into
127
+ // the declared Path (default `playground/runtime/<Name>.min.js`).
128
+ // Clean no-op for modules without a _playground.json — safe to run
129
+ // everywhere.
130
+ tmpAnticipate.anticipate(
131
+ function (fNext)
132
+ {
133
+ this.log.info(`###############################[ STEP 1b: STAGE PLAYGROUND RUNTIME ]###############################`);
134
+ this.fable.QuackageProcess.execute(
135
+ tmpDocuserveLocation,
136
+ [
137
+ 'stage-playground',
138
+ tmpDocsFolder,
139
+ '-m', tmpDirectoryRoot
140
+ ],
141
+ { cwd: this.fable.AppData.CWD },
142
+ fNext
143
+ );
144
+ }.bind(this));
145
+
146
+ // Step 2: Generate the documentation catalog
83
147
  tmpAnticipate.anticipate(
84
148
  function (fNext)
85
149
  {
86
- this.log.info(`###############################[ STEP 1: INDOCTRINATE CATALOG ]###############################`);
150
+ this.log.info(`###############################[ STEP 2: INDOCTRINATE CATALOG ]###############################`);
87
151
  this.fable.QuackageProcess.execute(
88
152
  tmpIndoctrinateLocation,
89
153
  [
@@ -92,34 +156,34 @@ class QuackageCommandPrepareDocs extends libCommandLineCommand
92
156
  '-o', tmpCatalogFile,
93
157
  '-b', tmpBranch,
94
158
  '-g', tmpGitHubOrg
95
- ].concat(tmpExcludedModulesArgs),
159
+ ].concat(tmpSingleModuleArgs).concat(tmpExcludedModulesArgs),
96
160
  { cwd: this.fable.AppData.CWD },
97
161
  fNext
98
162
  );
99
163
  }.bind(this));
100
164
 
101
- // Step 2: Generate the keyword search index
165
+ // Step 3: Generate the keyword search index
102
166
  tmpAnticipate.anticipate(
103
167
  function (fNext)
104
168
  {
105
- this.log.info(`###############################[ STEP 2: KEYWORD INDEX ]###############################`);
169
+ this.log.info(`###############################[ STEP 3: KEYWORD INDEX ]###############################`);
106
170
  this.fable.QuackageProcess.execute(
107
171
  tmpIndoctrinateLocation,
108
172
  [
109
173
  'generate_keyword_index',
110
174
  '-d', tmpDirectoryRoot,
111
175
  '-o', tmpKeywordIndexFile
112
- ].concat(tmpExtraScanArgs).concat(tmpExcludedModulesArgs),
176
+ ].concat(tmpSingleModuleArgs).concat(tmpExtraScanArgs).concat(tmpExcludedModulesArgs),
113
177
  { cwd: this.fable.AppData.CWD },
114
178
  fNext
115
179
  );
116
180
  }.bind(this));
117
181
 
118
- // Step 3: Write _version.json version placard sidecar
182
+ // Step 4: Write _version.json version placard sidecar
119
183
  tmpAnticipate.anticipate(
120
184
  function (fNext)
121
185
  {
122
- this.log.info(`###############################[ STEP 3: VERSION PLACARD ]###############################`);
186
+ this.log.info(`###############################[ STEP 4: VERSION PLACARD ]###############################`);
123
187
  try
124
188
  {
125
189
  let tmpPackageJsonPath = libPath.join(tmpDirectoryRoot, 'package.json');
@@ -163,11 +227,11 @@ class QuackageCommandPrepareDocs extends libCommandLineCommand
163
227
  return fNext();
164
228
  }.bind(this));
165
229
 
166
- // Step 4: Inject pict-docuserve assets
230
+ // Step 5: Inject pict-docuserve assets
167
231
  tmpAnticipate.anticipate(
168
232
  function (fNext)
169
233
  {
170
- this.log.info(`###############################[ STEP 4: DOCUSERVE INJECT ]###############################`);
234
+ this.log.info(`###############################[ STEP 5: DOCUSERVE INJECT ]###############################`);
171
235
  this.fable.QuackageProcess.execute(
172
236
  tmpDocuserveLocation,
173
237
  [
@@ -179,14 +243,14 @@ class QuackageCommandPrepareDocs extends libCommandLineCommand
179
243
  );
180
244
  }.bind(this));
181
245
 
182
- // Step 5: Stamp meaningful <title> and <meta name="description">
246
+ // Step 6: Stamp meaningful <title> and <meta name="description">
183
247
  // into the freshly-injected index.html so social-card scrapers
184
248
  // (Slack, etc.) read the module name + version instead of the
185
249
  // generic "powered by pict-docuserve" boilerplate.
186
250
  tmpAnticipate.anticipate(
187
251
  function (fNext)
188
252
  {
189
- this.log.info(`###############################[ STEP 5: STAMP HTML METADATA ]###############################`);
253
+ this.log.info(`###############################[ STEP 6: STAMP HTML METADATA ]###############################`);
190
254
  try
191
255
  {
192
256
  let tmpIndexPath = libPath.join(tmpDocsFolder, 'index.html');
@@ -209,8 +209,8 @@ class QuackageExampleService extends libPict.ServiceProviderBase
209
209
 
210
210
  /* --- Header Bar --- */
211
211
  .pict-example-header { display: flex; align-items: stretch; background: #264653; border-bottom: 3px solid #E76F51; }
212
- .pict-example-badge { background: #E76F51; color: #fff; padding: 0.6rem 1rem; font-size: 0.7rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.1em; display: flex; align-items: center; gap: 0.5rem; }
213
- .pict-example-badge svg { width: 14px; height: 14px; fill: #fff; flex-shrink: 0; }
212
+ .pict-example-badge { background: #E76F51; color: var(--theme-color-background-panel, #fff); padding: 0.6rem 1rem; font-size: 0.7rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.1em; display: flex; align-items: center; gap: 0.5rem; }
213
+ .pict-example-badge svg { width: 14px; height: 14px; fill: var(--theme-color-background-panel, #fff); flex-shrink: 0; }
214
214
  .pict-example-app-name { padding: 0.6rem 1rem; color: #FAEDCD; font-size: 1.1rem; font-weight: 600; display: flex; align-items: center; }
215
215
  .pict-example-module { margin-left: auto; padding: 0.6rem 1rem; color: #D4A373; font-size: 0.75rem; display: flex; align-items: center; letter-spacing: 0.03em; }
216
216
 
@@ -221,7 +221,7 @@ class QuackageExampleService extends libPict.ServiceProviderBase
221
221
 
222
222
  /* --- Example List --- */
223
223
  .example-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 0.5rem; }
224
- .example-list li { background: #fff; border: 1px solid #D4A373; border-left: 4px solid #E76F51; border-radius: 4px; transition: border-color 0.15s, box-shadow 0.15s; }
224
+ .example-list li { background: var(--theme-color-background-panel, #fff); border: 1px solid #D4A373; border-left: 4px solid #E76F51; border-radius: 4px; transition: border-color 0.15s, box-shadow 0.15s; }
225
225
  .example-list li:hover { border-left-color: #264653; box-shadow: 0 2px 8px rgba(38,70,83,0.1); }
226
226
  .example-list a { display: block; padding: 0.75rem 1rem; text-decoration: none; color: #264653; font-weight: 500; font-size: 0.95rem; }
227
227
  .example-list a:hover { color: #E76F51; }
@@ -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
- }