@dataimago/css 0.1.0-alpha.2 → 0.1.0-alpha.21
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/README.md +26 -2
- package/dist/bin/dataimago-sync.mjs +342 -0
- package/dist/dataimago.css +129 -37
- package/dist/dataimago.min.css +1 -1
- package/dist/dataviz/dataimago-dataviz.css +42 -0
- package/dist/dataviz/dataimago-dataviz.json +42 -0
- package/dist/dataviz/dataimago-dataviz.tex +21 -0
- package/dist/dataviz/dataimago_dataviz.R +61 -0
- package/dist/latex/dataimago-tokens.sty +122 -0
- package/dist/latex/dataimago.sty +618 -0
- package/dist/outputs.json +26 -0
- package/dist/quarto/components.scss +230 -0
- package/dist/quarto/dataimago-dark.scss +328 -0
- package/dist/quarto/dataimago-light.scss +328 -0
- package/dist/tailwind-preset.js +57 -10
- package/dist/templates/KNOWLEDGE-explorer.md +236 -0
- package/dist/templates/KNOWLEDGE-framework.md +233 -0
- package/dist/templates/KNOWLEDGE-research.md +201 -0
- package/dist/templates/quarto_website/README.md +48 -0
- package/dist/templates/quarto_website/_quarto.yml.template +141 -0
- package/dist/templates/quarto_website/about.qmd.template +36 -0
- package/dist/templates/quarto_website/assets/js/custom-anchors.js +6 -0
- package/dist/templates/quarto_website/assets/js/logo-switch.js +73 -0
- package/dist/templates/quarto_website/assets/js/scroll.js +67 -0
- package/dist/templates/quarto_website/ethics.qmd.template +49 -0
- package/dist/templates/quarto_website/index.qmd.template +71 -0
- package/dist/tokens.css +157 -36
- package/dist/tokens.scss +157 -36
- package/package.json +10 -2
package/README.md
CHANGED
|
@@ -2,13 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
Compiled CSS and Tailwind preset for the dataimago ethical AI design system.
|
|
4
4
|
|
|
5
|
-
Depends on [`@dataimago/tokens`](../tokens) for the canonical
|
|
5
|
+
Depends on [`@dataimago/tokens`](../tokens) for the canonical house identity.
|
|
6
6
|
|
|
7
7
|
## What you get
|
|
8
8
|
|
|
9
9
|
- `dist/tokens.css` — CSS custom properties (theme-aware).
|
|
10
10
|
- `dist/dataimago.css` / `dist/dataimago.min.css` — full compiled design system.
|
|
11
|
-
- `dist/tailwind-preset.js` — Tailwind preset
|
|
11
|
+
- `dist/tailwind-preset.js` — Tailwind preset generated from token JSON, including `ink`, `stone`, `forest`, `paper`, `presentation-blue`, `accent`, `copper`, functional colors, typography, spacing, radius, shadow, and transition tokens.
|
|
12
|
+
- `dist/quarto/dataimago-{light,dark}.scss` + `components.scss` — the Quarto theme pair (self-contained; dark keyed to `body.quarto-dark`) and the `.di-*` components.
|
|
13
|
+
- `dist/latex/dataimago-tokens.sty` + `dataimago.sty` — the generated `di-*` colour layer and the LaTeX macro layer.
|
|
14
|
+
- `dist/dataviz/` — the Okabe-Ito data-viz palette as CSS, TeX (PSTricks/TikZ), JSON and R.
|
|
15
|
+
- `dist/templates/` — the project templates (`KNOWLEDGE-*.md`, the Quarto website scaffold) as stamped copies, synced into a project with `dataimago-sync` like the other outputs (house only).
|
|
16
|
+
- `dist/outputs.json` and the `dataimago-sync` bin — pinned sync for non-JS consumers (below).
|
|
17
|
+
|
|
18
|
+
Use [`@dataimago/css-neutral`](../css-neutral) instead when an externally-owned Level-3 app or future third-party hub needs the neutral identity.
|
|
12
19
|
|
|
13
20
|
## Usage
|
|
14
21
|
|
|
@@ -39,6 +46,23 @@ module.exports = {
|
|
|
39
46
|
|
|
40
47
|
Serve the compiled CSS from `node_modules/@dataimago/css/dist/` through your R package's asset pipeline.
|
|
41
48
|
|
|
49
|
+
### Quarto, LaTeX, figures — `dataimago-sync`
|
|
50
|
+
|
|
51
|
+
A consumer that does not install from npm pins a version and syncs files. Commit
|
|
52
|
+
`.dataimago/design.json`:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{ "package": "@dataimago/css", "version": "<exact version>",
|
|
56
|
+
"outputs": { "quarto/dataimago-light.scss": "styles/", "quarto/dataimago-dark.scss": "styles/",
|
|
57
|
+
"latex/dataimago-tokens.sty": "latex/", "dataviz/dataimago_dataviz.R": "R/palette.R" } }
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
then run `npx -p @dataimago/css@<version> dataimago-sync` and commit the files (each carries a
|
|
61
|
+
provenance stamp; never edit them). Put `npx -p @dataimago/css@<version> dataimago-sync --check`
|
|
62
|
+
in CI: it fails on any drift. The shipped outputs are listed in `dist/outputs.json`
|
|
63
|
+
(e.g. `https://unpkg.com/@dataimago/css@<version>/dist/outputs.json`). See
|
|
64
|
+
[`wiki/patterns/new-consumer-checklist.md`](../../wiki/patterns/new-consumer-checklist.md).
|
|
65
|
+
|
|
42
66
|
## Building
|
|
43
67
|
|
|
44
68
|
```bash
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* dataimago-sync — pinned design-system sync for non-JS consumers (spec §4).
|
|
4
|
+
*
|
|
5
|
+
* npx -p @dataimago/css@<version> dataimago-sync write the files
|
|
6
|
+
* npx -p @dataimago/css@<version> dataimago-sync --check exit 1 on any drift
|
|
7
|
+
* dataimago-sync --from <dataimago-design checkout> try an unreleased build
|
|
8
|
+
* node tools/formats/dataimago-sync.mjs --self-test (repo only)
|
|
9
|
+
*
|
|
10
|
+
* Reads the consumer's .dataimago/design.json (or --config <path>):
|
|
11
|
+
* { "package": "@dataimago/css", "version": "<exact>",
|
|
12
|
+
* "outputs": { "<dist path>": "<destination dir/ or file>" } }
|
|
13
|
+
*
|
|
14
|
+
* Copies bytes from THIS package's own dist/ — no download, no transformation;
|
|
15
|
+
* every format decision lives in the dataimago-design build. Exit codes:
|
|
16
|
+
* 0 ok, 1 check failed, 2 configuration error (nothing written).
|
|
17
|
+
*
|
|
18
|
+
* Node built-ins only: this file ships in @dataimago/css and
|
|
19
|
+
* @dataimago/css-neutral dist/bin/. The stamp grammar it reads is defined in
|
|
20
|
+
* tools/formats/stamp.mjs — change both together.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { spawnSync } from 'node:child_process';
|
|
24
|
+
import fs from 'node:fs';
|
|
25
|
+
import os from 'node:os';
|
|
26
|
+
import path from 'node:path';
|
|
27
|
+
import { fileURLToPath } from 'node:url';
|
|
28
|
+
|
|
29
|
+
const LOCAL = 'local-unreleased';
|
|
30
|
+
|
|
31
|
+
class ConfigError extends Error {}
|
|
32
|
+
|
|
33
|
+
function readJson(file, what) {
|
|
34
|
+
try {
|
|
35
|
+
return JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
36
|
+
} catch (e) {
|
|
37
|
+
throw new ConfigError(`cannot read ${what} at ${file}: ${e.message}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const USAGE = `dataimago-sync — copy a pinned @dataimago release's design files into this repo
|
|
42
|
+
|
|
43
|
+
dataimago-sync write the files listed in .dataimago/design.json
|
|
44
|
+
dataimago-sync --check exit 1 if any listed file differs from the release
|
|
45
|
+
dataimago-sync --from <checkout> write a local, unreleased build (--check then fails)
|
|
46
|
+
dataimago-sync --config <file> read design.json from <file>
|
|
47
|
+
dataimago-sync --help this text
|
|
48
|
+
|
|
49
|
+
Run it from the pinned release: npx -p @dataimago/css@<version> dataimago-sync`;
|
|
50
|
+
|
|
51
|
+
const FLAGS = new Set(['--check', '--help', '--self-test']);
|
|
52
|
+
const VALUE_FLAGS = new Set(['--from', '--config']);
|
|
53
|
+
|
|
54
|
+
/** Refuse unknown flags before anything runs: a typo'd --check must not silently re-sync. */
|
|
55
|
+
function checkArgs(args) {
|
|
56
|
+
for (let i = 0; i < args.length; i++) {
|
|
57
|
+
if (VALUE_FLAGS.has(args[i])) { i += 1; continue; }
|
|
58
|
+
if (!FLAGS.has(args[i])) throw new ConfigError(`unknown argument ${args[i]} (see --help)`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function argValue(args, flag) {
|
|
63
|
+
const i = args.indexOf(flag);
|
|
64
|
+
if (i === -1) return null;
|
|
65
|
+
if (!args[i + 1] || args[i + 1].startsWith('--')) throw new ConfigError(`${flag} needs a path`);
|
|
66
|
+
return path.resolve(args[i + 1]);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** The package this bin ships in: dist/bin/dataimago-sync.mjs → ../.. (symlinks resolved). */
|
|
70
|
+
function ownPackageRoot() {
|
|
71
|
+
return path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Rewrite only the stamp's version tokens to mark a copy as local and unreleased. */
|
|
75
|
+
function localize(text, distPath, pkg, version, sha) {
|
|
76
|
+
const marker = `${LOCAL}(${sha})`;
|
|
77
|
+
if (distPath.endsWith('.json')) {
|
|
78
|
+
const parsed = JSON.parse(text);
|
|
79
|
+
parsed._meta.version = marker;
|
|
80
|
+
parsed._meta.restore = String(parsed._meta.restore).replace(`${pkg}@${version}`, `${pkg}@${marker}`);
|
|
81
|
+
return JSON.stringify(parsed, null, 2) + '\n';
|
|
82
|
+
}
|
|
83
|
+
const nl = text.indexOf('\n');
|
|
84
|
+
return text.slice(0, nl).split(`${pkg}@${version}`).join(`${pkg}@${marker}`) + text.slice(nl);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function gitShortSha(dir) {
|
|
88
|
+
const r = spawnSync('git', ['-C', dir, 'rev-parse', '--short', 'HEAD'], { encoding: 'utf8' });
|
|
89
|
+
return r.status === 0 ? r.stdout.trim() : 'unknown';
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Validate everything, return the plan of {key, src, dest}; throws ConfigError before any write. */
|
|
93
|
+
function plan(args) {
|
|
94
|
+
const configPath = argValue(args, '--config') ?? path.resolve('.dataimago', 'design.json');
|
|
95
|
+
// The consumer root holds .dataimago/; a --config file elsewhere is its own root.
|
|
96
|
+
const configDir = path.dirname(configPath);
|
|
97
|
+
const consumerRoot = path.basename(configDir) === '.dataimago' ? path.dirname(configDir) : configDir;
|
|
98
|
+
const design = readJson(configPath, 'design.json');
|
|
99
|
+
if (typeof design.package !== 'string' || typeof design.version !== 'string' || !design.outputs || typeof design.outputs !== 'object') {
|
|
100
|
+
throw new ConfigError('design.json needs "package", "version" and an "outputs" object');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const fromCheckout = argValue(args, '--from');
|
|
104
|
+
const own = readJson(path.join(ownPackageRoot(), 'package.json'), 'package.json of this bin');
|
|
105
|
+
if (design.package !== own.name) {
|
|
106
|
+
throw new ConfigError(`design.json asks for ${design.package}, but this is ${own.name}. Run: npx -p ${design.package}@${design.version} dataimago-sync`);
|
|
107
|
+
}
|
|
108
|
+
let pkgRoot = ownPackageRoot();
|
|
109
|
+
let local = null;
|
|
110
|
+
if (fromCheckout) {
|
|
111
|
+
pkgRoot = path.join(fromCheckout, 'packages', design.package.replace(/^@dataimago\//, ''));
|
|
112
|
+
const built = readJson(path.join(pkgRoot, 'package.json'), `${design.package} in the --from checkout`);
|
|
113
|
+
local = { version: built.version, sha: gitShortSha(fromCheckout) };
|
|
114
|
+
} else if (design.version !== own.version) {
|
|
115
|
+
throw new ConfigError(`design.json pins ${design.package}@${design.version}, but this is ${own.version}. Run: npx -p ${design.package}@${design.version} dataimago-sync`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const manifest = readJson(path.join(pkgRoot, 'dist', 'outputs.json'), 'outputs.json (is the package built?)');
|
|
119
|
+
const available = Object.keys(manifest.files ?? {});
|
|
120
|
+
const steps = [];
|
|
121
|
+
const problems = [];
|
|
122
|
+
for (const [key, destSpec] of Object.entries(design.outputs)) {
|
|
123
|
+
if (!available.includes(key)) {
|
|
124
|
+
problems.push(`${design.package} does not ship "${key}". Available outputs:\n ${available.join('\n ')}`);
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (typeof destSpec !== 'string' || destSpec === '' || path.isAbsolute(destSpec)) {
|
|
128
|
+
problems.push(`destination for "${key}" must be a relative path inside the consumer, got ${JSON.stringify(destSpec)}`);
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const dest = path.resolve(consumerRoot, destSpec.endsWith('/') ? path.join(destSpec, path.basename(key)) : destSpec);
|
|
132
|
+
const rel = path.relative(consumerRoot, dest);
|
|
133
|
+
if (rel.startsWith('..') || path.isAbsolute(rel)) {
|
|
134
|
+
problems.push(`destination for "${key}" escapes the consumer root: ${destSpec}`);
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (rel === '' || (fs.existsSync(dest) && fs.statSync(dest).isDirectory())) {
|
|
138
|
+
problems.push(`destination for "${key}" is a directory: write "${destSpec.replace(/\/?$/, '/')}" to put the file inside it`);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
if (steps.some((s) => s.dest === dest)) {
|
|
142
|
+
problems.push(`two outputs are mapped to the same destination: ${rel}`);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
steps.push({ key, src: path.join(pkgRoot, 'dist', key), dest, rel });
|
|
146
|
+
}
|
|
147
|
+
if (problems.length) throw new ConfigError(problems.join('\n '));
|
|
148
|
+
return { steps, design, local };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function sync(args) {
|
|
152
|
+
const { steps, design, local } = plan(args);
|
|
153
|
+
for (const { key, src, dest, rel } of steps) {
|
|
154
|
+
let bytes = fs.readFileSync(src);
|
|
155
|
+
if (local) bytes = Buffer.from(localize(bytes.toString('utf8'), key, design.package, local.version, local.sha));
|
|
156
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
157
|
+
fs.writeFileSync(dest, bytes);
|
|
158
|
+
console.log(` ✓ ${rel} ← ${design.package}@${local ? `${LOCAL}(${local.sha})` : design.version} dist/${key}`);
|
|
159
|
+
}
|
|
160
|
+
if (local) console.log(`\n⚠ local, unreleased design files: \`dataimago-sync --check\` fails until you re-sync from a release.`);
|
|
161
|
+
return 0;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function check(args) {
|
|
165
|
+
const { steps, design } = plan(args.filter((a) => a !== '--check'));
|
|
166
|
+
const failures = [];
|
|
167
|
+
for (const { src, dest, rel } of steps) {
|
|
168
|
+
if (!fs.existsSync(dest)) { failures.push(`${rel}: missing`); continue; }
|
|
169
|
+
const have = fs.readFileSync(dest);
|
|
170
|
+
// The marker lives in the stamp: line 1, or the leading _meta object of a JSON file.
|
|
171
|
+
if (have.subarray(0, 1024).includes(LOCAL)) { failures.push(`${rel}: written by --from (local, unreleased); re-sync from a release`); continue; }
|
|
172
|
+
if (!have.equals(fs.readFileSync(src))) failures.push(`${rel}: differs from ${design.package}@${design.version}`);
|
|
173
|
+
}
|
|
174
|
+
for (const f of failures) console.error(` ✗ ${f}`);
|
|
175
|
+
if (failures.length) {
|
|
176
|
+
console.error(`\n✗ dataimago-sync --check: ${failures.length} file(s) out of sync. Run: npx -p ${design.package}@${design.version} dataimago-sync`);
|
|
177
|
+
return 1;
|
|
178
|
+
}
|
|
179
|
+
console.log(`✓ dataimago-sync --check: ${steps.length} file(s) match ${design.package}@${design.version}`);
|
|
180
|
+
return 0;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function main(args) {
|
|
184
|
+
try {
|
|
185
|
+
checkArgs(args);
|
|
186
|
+
if (args.includes('--help')) {
|
|
187
|
+
console.log(USAGE);
|
|
188
|
+
return 0;
|
|
189
|
+
}
|
|
190
|
+
if (args.includes('--check')) {
|
|
191
|
+
if (args.includes('--from')) throw new ConfigError('--check verifies a release; it cannot be combined with --from');
|
|
192
|
+
return check(args);
|
|
193
|
+
}
|
|
194
|
+
return sync(args);
|
|
195
|
+
} catch (e) {
|
|
196
|
+
if (e instanceof ConfigError) {
|
|
197
|
+
console.error(`✗ dataimago-sync: ${e.message}`);
|
|
198
|
+
return 2;
|
|
199
|
+
}
|
|
200
|
+
throw e;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ─── Self-test ────────────────────────────────────────────────────────────────
|
|
205
|
+
|
|
206
|
+
async function selfTest() {
|
|
207
|
+
const stampUrl = new URL('./stamp.mjs', import.meta.url);
|
|
208
|
+
if (!fs.existsSync(fileURLToPath(stampUrl))) {
|
|
209
|
+
console.error('dataimago-sync --self-test runs from the dataimago-design repo (tools/formats/).');
|
|
210
|
+
process.exit(2);
|
|
211
|
+
}
|
|
212
|
+
const { stamp, stampJson } = await import(stampUrl);
|
|
213
|
+
const assert = (await import('node:assert/strict')).default;
|
|
214
|
+
const tmp = fs.mkdtempSync(path.join(os.tmpdir(), 'di-sync-'));
|
|
215
|
+
|
|
216
|
+
// A fake published package: <tmp>/pkg with dist/{quarto/a.scss, dataviz/p.json, outputs.json, bin/}.
|
|
217
|
+
function makePackage(root, name, version) {
|
|
218
|
+
const files = {
|
|
219
|
+
'quarto/a.scss': stamp({ kind: 'scss', pkg: name, version, distPath: 'quarto/a.scss', body: '$x: 1 !default;\n' }),
|
|
220
|
+
'dataviz/p.json': stampJson({ pkg: name, version, distPath: 'dataviz/p.json', data: { a: '#E69F00' } }),
|
|
221
|
+
};
|
|
222
|
+
fs.mkdirSync(path.join(root, 'dist', 'bin'), { recursive: true });
|
|
223
|
+
fs.writeFileSync(path.join(root, 'package.json'), JSON.stringify({ name, version }));
|
|
224
|
+
for (const [p, text] of Object.entries(files)) {
|
|
225
|
+
fs.mkdirSync(path.dirname(path.join(root, 'dist', p)), { recursive: true });
|
|
226
|
+
fs.writeFileSync(path.join(root, 'dist', p), text);
|
|
227
|
+
}
|
|
228
|
+
fs.writeFileSync(path.join(root, 'dist', 'outputs.json'), JSON.stringify({ package: name, version, files: Object.fromEntries(Object.keys(files).sort().map((k) => [k, 'x'])) }, null, 2));
|
|
229
|
+
fs.copyFileSync(fileURLToPath(import.meta.url), path.join(root, 'dist', 'bin', 'dataimago-sync.mjs'));
|
|
230
|
+
return { files, bin: path.join(root, 'dist', 'bin', 'dataimago-sync.mjs') };
|
|
231
|
+
}
|
|
232
|
+
const pkg = makePackage(path.join(tmp, 'pkg'), '@dataimago/css', '9.9.9');
|
|
233
|
+
// A fake dataimago-design checkout for --from: packages/css/{package.json,dist/}.
|
|
234
|
+
makePackage(path.join(tmp, 'checkout', 'packages', 'css'), '@dataimago/css', '9.9.10');
|
|
235
|
+
|
|
236
|
+
const consumer = path.join(tmp, 'consumer');
|
|
237
|
+
const writeDesign = (design) => {
|
|
238
|
+
fs.mkdirSync(path.join(consumer, '.dataimago'), { recursive: true });
|
|
239
|
+
fs.writeFileSync(path.join(consumer, '.dataimago', 'design.json'), JSON.stringify(design));
|
|
240
|
+
};
|
|
241
|
+
const base = { package: '@dataimago/css', version: '9.9.9', outputs: { 'quarto/a.scss': 'styles/', 'dataviz/p.json': 'figs/palette.json' } };
|
|
242
|
+
const run = (...args) => spawnSync(process.execPath, [pkg.bin, ...args], { cwd: consumer, encoding: 'utf8' });
|
|
243
|
+
const exists = (rel) => fs.existsSync(path.join(consumer, rel));
|
|
244
|
+
|
|
245
|
+
// (a) sync writes exact bytes; --check passes.
|
|
246
|
+
writeDesign(base);
|
|
247
|
+
let r = run();
|
|
248
|
+
assert.equal(r.status, 0, r.stderr);
|
|
249
|
+
assert.equal(fs.readFileSync(path.join(consumer, 'styles/a.scss'), 'utf8'), pkg.files['quarto/a.scss']);
|
|
250
|
+
assert.equal(fs.readFileSync(path.join(consumer, 'figs/palette.json'), 'utf8'), pkg.files['dataviz/p.json']);
|
|
251
|
+
assert.equal(run('--check').status, 0);
|
|
252
|
+
|
|
253
|
+
// (b) one appended byte fails --check, naming the file.
|
|
254
|
+
fs.appendFileSync(path.join(consumer, 'styles/a.scss'), ' ');
|
|
255
|
+
r = run('--check');
|
|
256
|
+
assert.equal(r.status, 1);
|
|
257
|
+
assert.match(r.stdout + r.stderr, /styles\/a\.scss/);
|
|
258
|
+
run();
|
|
259
|
+
|
|
260
|
+
// (c) version mismatch: config error with the matching command.
|
|
261
|
+
writeDesign({ ...base, version: '9.9.8' });
|
|
262
|
+
r = run();
|
|
263
|
+
assert.equal(r.status, 2);
|
|
264
|
+
assert.match(r.stderr, /npx -p @dataimago\/css@9\.9\.8 dataimago-sync/);
|
|
265
|
+
|
|
266
|
+
// (d) an output the package does not ship: config error, lists outputs, writes nothing.
|
|
267
|
+
fs.rmSync(path.join(consumer, 'styles'), { recursive: true });
|
|
268
|
+
writeDesign({ ...base, outputs: { ...base.outputs, 'quarto/components.scss': 'styles/' } });
|
|
269
|
+
r = run();
|
|
270
|
+
assert.equal(r.status, 2);
|
|
271
|
+
assert.match(r.stderr, /quarto\/components\.scss/);
|
|
272
|
+
assert.match(r.stderr, /dataviz\/p\.json/);
|
|
273
|
+
assert.ok(!exists('styles/a.scss'), 'nothing written on a config error');
|
|
274
|
+
|
|
275
|
+
// (e) destinations escaping the consumer root are refused before writing.
|
|
276
|
+
for (const dest of ['../x/', '/abs/']) {
|
|
277
|
+
writeDesign({ ...base, outputs: { 'quarto/a.scss': 'styles/', 'dataviz/p.json': dest } });
|
|
278
|
+
r = run();
|
|
279
|
+
assert.equal(r.status, 2, `destination ${dest} must be refused`);
|
|
280
|
+
assert.ok(!exists('styles/a.scss'), `nothing written when ${dest} is refused`);
|
|
281
|
+
}
|
|
282
|
+
assert.ok(!fs.existsSync(path.join(tmp, 'x')));
|
|
283
|
+
|
|
284
|
+
// (f) --from writes local-unreleased stamps that --check always rejects.
|
|
285
|
+
writeDesign(base);
|
|
286
|
+
r = run('--from', path.join(tmp, 'checkout'));
|
|
287
|
+
assert.equal(r.status, 0, r.stderr);
|
|
288
|
+
assert.match(fs.readFileSync(path.join(consumer, 'styles/a.scss'), 'utf8').split('\n')[0], new RegExp(LOCAL));
|
|
289
|
+
assert.match(fs.readFileSync(path.join(consumer, 'figs/palette.json'), 'utf8'), new RegExp(LOCAL));
|
|
290
|
+
r = run('--check');
|
|
291
|
+
assert.equal(r.status, 1);
|
|
292
|
+
assert.match(r.stdout + r.stderr, /--from/);
|
|
293
|
+
|
|
294
|
+
// (g) a design.json for another package is a config error.
|
|
295
|
+
writeDesign({ ...base, package: '@dataimago/css-neutral' });
|
|
296
|
+
assert.equal(run().status, 2);
|
|
297
|
+
|
|
298
|
+
// (h) --config outside .dataimago/: the consumer root is the config's own directory.
|
|
299
|
+
fs.rmSync(path.join(consumer, 'styles'), { recursive: true, force: true });
|
|
300
|
+
fs.writeFileSync(path.join(consumer, 'design.json'), JSON.stringify(base));
|
|
301
|
+
r = run('--config', path.join(consumer, 'design.json'));
|
|
302
|
+
assert.equal(r.status, 0, r.stderr);
|
|
303
|
+
assert.ok(exists('styles/a.scss'), '--config ./design.json writes inside the consumer');
|
|
304
|
+
assert.ok(!fs.existsSync(path.join(tmp, 'styles')), 'nothing written above the consumer');
|
|
305
|
+
fs.rmSync(path.join(consumer, 'design.json'));
|
|
306
|
+
|
|
307
|
+
// (i) an unknown flag (a typo'd --check) is a config error and writes nothing; --help writes nothing.
|
|
308
|
+
writeDesign(base);
|
|
309
|
+
const before = fs.readFileSync(path.join(consumer, 'styles/a.scss'));
|
|
310
|
+
fs.appendFileSync(path.join(consumer, 'styles/a.scss'), 'x');
|
|
311
|
+
r = run('--chek');
|
|
312
|
+
assert.equal(r.status, 2);
|
|
313
|
+
assert.match(r.stderr, /--chek/);
|
|
314
|
+
r = run('--help');
|
|
315
|
+
assert.equal(r.status, 0);
|
|
316
|
+
assert.match(r.stdout, /--check/);
|
|
317
|
+
assert.notDeepEqual(fs.readFileSync(path.join(consumer, 'styles/a.scss')), before, 'neither run re-synced');
|
|
318
|
+
run();
|
|
319
|
+
|
|
320
|
+
// (j) a destination that is the root or an existing directory (no trailing /) is refused up front.
|
|
321
|
+
fs.rmSync(path.join(consumer, 'figs'), { recursive: true, force: true });
|
|
322
|
+
fs.mkdirSync(path.join(consumer, 'figs'));
|
|
323
|
+
for (const dest of ['.', 'figs']) {
|
|
324
|
+
fs.rmSync(path.join(consumer, 'styles'), { recursive: true, force: true });
|
|
325
|
+
writeDesign({ ...base, outputs: { 'quarto/a.scss': 'styles/', 'dataviz/p.json': dest } });
|
|
326
|
+
r = run();
|
|
327
|
+
assert.equal(r.status, 2, `destination ${dest} must be refused`);
|
|
328
|
+
assert.ok(!exists('styles/a.scss'), `nothing written when ${dest} is refused`);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// (k) two outputs on one destination is a config error.
|
|
332
|
+
writeDesign({ ...base, outputs: { 'quarto/a.scss': 'same.txt', 'dataviz/p.json': 'same.txt' } });
|
|
333
|
+
r = run();
|
|
334
|
+
assert.equal(r.status, 2);
|
|
335
|
+
assert.ok(!exists('same.txt'));
|
|
336
|
+
|
|
337
|
+
fs.rmSync(tmp, { recursive: true, force: true });
|
|
338
|
+
console.log('dataimago-sync self-test: all checks passed');
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
if (process.argv.includes('--self-test')) await selfTest();
|
|
342
|
+
else process.exitCode = main(process.argv.slice(2));
|
package/dist/dataimago.css
CHANGED
|
@@ -46,10 +46,12 @@
|
|
|
46
46
|
--color-palette-copper-700: #913d15;
|
|
47
47
|
--color-palette-copper-800: #753318;
|
|
48
48
|
--color-palette-copper-900: #612b16;
|
|
49
|
-
--color-palette-accent-50: #
|
|
50
|
-
--color-palette-accent-
|
|
51
|
-
--color-palette-accent-
|
|
52
|
-
--color-palette-accent-
|
|
49
|
+
--color-palette-accent-50: #f0f8fc;
|
|
50
|
+
--color-palette-accent-300: #3498DB;
|
|
51
|
+
--color-palette-accent-400: #2980B9;
|
|
52
|
+
--color-palette-accent-500: #1f618d;
|
|
53
|
+
--color-palette-accent-600: #154d6f;
|
|
54
|
+
--color-palette-accent-700: #0f3a52;
|
|
53
55
|
--color-palette-presentation-blue-50: #f0f8fc;
|
|
54
56
|
--color-palette-presentation-blue-500: #3498DB;
|
|
55
57
|
--color-palette-presentation-blue-600: #2980B9;
|
|
@@ -119,27 +121,57 @@
|
|
|
119
121
|
|
|
120
122
|
:root, [data-bs-theme=light] {
|
|
121
123
|
--color-surface-page: #ededeb;
|
|
124
|
+
--color-surface-page: color(display-p3 0.9294 0.9294 0.9223);
|
|
122
125
|
--color-surface-page-scrolled: #ededeb;
|
|
126
|
+
--color-surface-page-scrolled: color(display-p3 0.9294 0.9294 0.9223);
|
|
123
127
|
--color-surface-elevated: #f7f7f6;
|
|
128
|
+
--color-surface-elevated: color(display-p3 0.9686 0.9686 0.9651);
|
|
124
129
|
--color-surface-sunken: #faf2e3;
|
|
130
|
+
--color-surface-sunken: color(display-p3 0.9749 0.9501 0.8963);
|
|
125
131
|
--color-surface-navbar: #ededeb;
|
|
132
|
+
--color-surface-navbar: color(display-p3 0.9294 0.9294 0.9223);
|
|
126
133
|
--color-surface-navbar-scrolled: #ededeb;
|
|
134
|
+
--color-surface-navbar-scrolled: color(display-p3 0.9294 0.9294 0.9223);
|
|
127
135
|
--color-surface-code: #faf2e3;
|
|
128
|
-
--color-
|
|
129
|
-
--color-border-
|
|
130
|
-
--color-border-
|
|
131
|
-
--color-border-
|
|
136
|
+
--color-surface-code: color(display-p3 0.9749 0.9501 0.8963);
|
|
137
|
+
--color-border-subtle: rgba(12, 10, 9, 0.45);
|
|
138
|
+
--color-border-subtle: color(display-p3 0.0457 0.0395 0.0358 / 0.45);
|
|
139
|
+
--color-border-moderate: rgba(12, 10, 9, 0.60);
|
|
140
|
+
--color-border-moderate: color(display-p3 0.0457 0.0395 0.0358 / 0.60);
|
|
141
|
+
--color-border-strong: rgba(12, 10, 9, 0.75);
|
|
142
|
+
--color-border-strong: color(display-p3 0.0457 0.0395 0.0358 / 0.75);
|
|
143
|
+
--color-border-card: rgba(12, 10, 9, 0.60);
|
|
144
|
+
--color-border-card: color(display-p3 0.0457 0.0395 0.0358 / 0.60);
|
|
132
145
|
--color-border-code: #d6d3d1;
|
|
146
|
+
--color-border-code: color(display-p3 0.8371 0.8278 0.8205);
|
|
133
147
|
--color-content-primary: #14140f;
|
|
134
|
-
--color-content-
|
|
135
|
-
--color-content-
|
|
148
|
+
--color-content-primary: color(display-p3 0.0784 0.0784 0.0608);
|
|
149
|
+
--color-content-secondary: #6a6a6a;
|
|
150
|
+
--color-content-secondary: color(display-p3 0.4157 0.4157 0.4157);
|
|
151
|
+
--color-content-muted: #706964;
|
|
152
|
+
--color-content-muted: color(display-p3 0.4345 0.4127 0.3945);
|
|
136
153
|
--color-content-inverse: #fdf9f2;
|
|
154
|
+
--color-content-inverse: color(display-p3 0.9894 0.977 0.9518);
|
|
137
155
|
--color-interactive-primary: #434739;
|
|
156
|
+
--color-interactive-primary: color(display-p3 0.2656 0.2779 0.2287);
|
|
138
157
|
--color-interactive-hover: #363a2e;
|
|
139
|
-
--color-interactive-
|
|
158
|
+
--color-interactive-hover: color(display-p3 0.2146 0.2269 0.1848);
|
|
159
|
+
--color-interactive-accent: #1f618d;
|
|
160
|
+
--color-interactive-accent: color(display-p3 0.198 0.375 0.5385);
|
|
140
161
|
--color-interactive-focus: #434739;
|
|
141
|
-
--color-
|
|
142
|
-
--color-presentation-accent
|
|
162
|
+
--color-interactive-focus: color(display-p3 0.2656 0.2779 0.2287);
|
|
163
|
+
--color-presentation-accent: #3498db;
|
|
164
|
+
--color-presentation-accent: color(display-p3 0.3208 0.588 0.8369);
|
|
165
|
+
--color-presentation-accent-hover: #2980b9;
|
|
166
|
+
--color-presentation-accent-hover: color(display-p3 0.2638 0.495 0.7068);
|
|
167
|
+
--color-vertical-accent-dissertation: #b87333;
|
|
168
|
+
--color-vertical-accent-dissertation: color(display-p3 0.7242 0.4389 0.1259);
|
|
169
|
+
--color-vertical-accent-rpkg: #3b82f6;
|
|
170
|
+
--color-vertical-accent-rpkg: color(display-p3 0.3047 0.5035 0.9338);
|
|
171
|
+
--color-vertical-accent-SGPc: #5a6310;
|
|
172
|
+
--color-vertical-accent-SGPc: color(display-p3 0.3595 0.3871 0.1309);
|
|
173
|
+
--color-brand-mark-red: #cc0000;
|
|
174
|
+
--color-brand-mark-red: color(display-p3 0.7331 0.1519 0.1019);
|
|
143
175
|
--contrast-high: rgb(20, 20, 16);
|
|
144
176
|
--contrast-readable: rgb(20, 20, 16);
|
|
145
177
|
--contrast-medium: #7c7c7c;
|
|
@@ -147,8 +179,8 @@
|
|
|
147
179
|
--shadow-subtle: 0 1px 2px 0 rgb(20 20 16 / 0.05);
|
|
148
180
|
--shadow-moderate: 0 4px 6px -1px rgb(20 20 16 / 0.1);
|
|
149
181
|
--shadow-prominent: 0 10px 15px -3px rgb(20 20 16 / 0.1);
|
|
150
|
-
--border-subtle: rgba(20, 20, 16, 0.
|
|
151
|
-
--border-moderate: rgba(20, 20, 16, 0.
|
|
182
|
+
--border-subtle: rgba(20, 20, 16, 0.47);
|
|
183
|
+
--border-moderate: rgba(20, 20, 16, 0.63);
|
|
152
184
|
--border-focus: #3498DB;
|
|
153
185
|
--navigation-hover-background: rgba(20, 20, 16, 0.05);
|
|
154
186
|
--navigation-active-background: rgba(20, 20, 16, 0.1);
|
|
@@ -156,27 +188,57 @@
|
|
|
156
188
|
|
|
157
189
|
[data-bs-theme=dark] {
|
|
158
190
|
--color-surface-page: #141410;
|
|
191
|
+
--color-surface-page: color(display-p3 0.0784 0.0784 0.0643);
|
|
159
192
|
--color-surface-page-scrolled: #141410;
|
|
193
|
+
--color-surface-page-scrolled: color(display-p3 0.0784 0.0784 0.0643);
|
|
160
194
|
--color-surface-elevated: #1c1917;
|
|
195
|
+
--color-surface-elevated: color(display-p3 0.1078 0.0985 0.0911);
|
|
161
196
|
--color-surface-sunken: #0c0a09;
|
|
197
|
+
--color-surface-sunken: color(display-p3 0.0457 0.0395 0.0358);
|
|
162
198
|
--color-surface-navbar: #141410;
|
|
199
|
+
--color-surface-navbar: color(display-p3 0.0784 0.0784 0.0643);
|
|
163
200
|
--color-surface-navbar-scrolled: #141410;
|
|
201
|
+
--color-surface-navbar-scrolled: color(display-p3 0.0784 0.0784 0.0643);
|
|
164
202
|
--color-surface-code: #1c1917;
|
|
165
|
-
--color-
|
|
166
|
-
--color-border-
|
|
167
|
-
--color-border-
|
|
168
|
-
--color-border-
|
|
203
|
+
--color-surface-code: color(display-p3 0.1078 0.0985 0.0911);
|
|
204
|
+
--color-border-subtle: rgba(253, 249, 242, 0.45);
|
|
205
|
+
--color-border-subtle: color(display-p3 0.9894 0.977 0.9518 / 0.45);
|
|
206
|
+
--color-border-moderate: rgba(253, 249, 242, 0.60);
|
|
207
|
+
--color-border-moderate: color(display-p3 0.9894 0.977 0.9518 / 0.60);
|
|
208
|
+
--color-border-strong: rgba(253, 249, 242, 0.75);
|
|
209
|
+
--color-border-strong: color(display-p3 0.9894 0.977 0.9518 / 0.75);
|
|
210
|
+
--color-border-card: rgba(253, 249, 242, 0.60);
|
|
211
|
+
--color-border-card: color(display-p3 0.9894 0.977 0.9518 / 0.60);
|
|
169
212
|
--color-border-code: #292524;
|
|
213
|
+
--color-border-code: color(display-p3 0.1581 0.1456 0.1418);
|
|
170
214
|
--color-content-primary: #fdf9f2;
|
|
215
|
+
--color-content-primary: color(display-p3 0.9894 0.977 0.9518);
|
|
171
216
|
--color-content-secondary: #a8a29e;
|
|
172
|
-
--color-content-
|
|
217
|
+
--color-content-secondary: color(display-p3 0.6547 0.6361 0.6215);
|
|
218
|
+
--color-content-muted: #89827d;
|
|
219
|
+
--color-content-muted: color(display-p3 0.5325 0.5107 0.4925);
|
|
173
220
|
--color-content-inverse: #0c0a09;
|
|
221
|
+
--color-content-inverse: color(display-p3 0.0457 0.0395 0.0358);
|
|
174
222
|
--color-interactive-primary: #98a384;
|
|
223
|
+
--color-interactive-primary: color(display-p3 0.604 0.6378 0.5291);
|
|
175
224
|
--color-interactive-hover: #7e8a6b;
|
|
176
|
-
--color-interactive-
|
|
225
|
+
--color-interactive-hover: color(display-p3 0.5029 0.5397 0.4313);
|
|
226
|
+
--color-interactive-accent: #3498db;
|
|
227
|
+
--color-interactive-accent: color(display-p3 0.3208 0.588 0.8369);
|
|
177
228
|
--color-interactive-focus: #98a384;
|
|
178
|
-
--color-
|
|
179
|
-
--color-presentation-accent
|
|
229
|
+
--color-interactive-focus: color(display-p3 0.604 0.6378 0.5291);
|
|
230
|
+
--color-presentation-accent: #3498db;
|
|
231
|
+
--color-presentation-accent: color(display-p3 0.3208 0.588 0.8369);
|
|
232
|
+
--color-presentation-accent-hover: #2980b9;
|
|
233
|
+
--color-presentation-accent-hover: color(display-p3 0.2638 0.495 0.7068);
|
|
234
|
+
--color-vertical-accent-dissertation: #ce8e5c;
|
|
235
|
+
--color-vertical-accent-dissertation: color(display-p3 0.8089 0.5486 0.3177);
|
|
236
|
+
--color-vertical-accent-rpkg: #60a5fa;
|
|
237
|
+
--color-vertical-accent-rpkg: color(display-p3 0.4405 0.6403 0.9545);
|
|
238
|
+
--color-vertical-accent-SGPc: #b2bf22;
|
|
239
|
+
--color-vertical-accent-SGPc: color(display-p3 0.7074 0.7474 0.2714);
|
|
240
|
+
--color-brand-mark-red: #ff0000;
|
|
241
|
+
--color-brand-mark-red: color(display-p3 1 0 0);
|
|
180
242
|
--contrast-high: rgb(237, 237, 235);
|
|
181
243
|
--contrast-readable: rgb(237, 237, 235);
|
|
182
244
|
--contrast-medium: #83838f;
|
|
@@ -184,37 +246,67 @@
|
|
|
184
246
|
--shadow-subtle: 0 1px 2px 0 rgb(237 237 235 / 0.03);
|
|
185
247
|
--shadow-moderate: 0 4px 6px -1px rgb(237 237 235 / 0.05);
|
|
186
248
|
--shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
|
|
187
|
-
--border-subtle: rgba(237, 237, 235, 0.
|
|
188
|
-
--border-moderate: rgba(237, 237, 235, 0.
|
|
249
|
+
--border-subtle: rgba(237, 237, 235, 0.47);
|
|
250
|
+
--border-moderate: rgba(237, 237, 235, 0.63);
|
|
189
251
|
--border-focus: #4FC3F7;
|
|
190
252
|
--navigation-hover-background: rgba(237, 237, 235, 0.05);
|
|
191
253
|
--navigation-active-background: rgba(237, 237, 235, 0.1);
|
|
192
254
|
}
|
|
193
255
|
|
|
194
256
|
@media (prefers-color-scheme: dark) {
|
|
195
|
-
:root {
|
|
257
|
+
:root:where(:not([data-bs-theme=light])) {
|
|
196
258
|
--color-surface-page: #141410;
|
|
259
|
+
--color-surface-page: color(display-p3 0.0784 0.0784 0.0643);
|
|
197
260
|
--color-surface-page-scrolled: #141410;
|
|
261
|
+
--color-surface-page-scrolled: color(display-p3 0.0784 0.0784 0.0643);
|
|
198
262
|
--color-surface-elevated: #1c1917;
|
|
263
|
+
--color-surface-elevated: color(display-p3 0.1078 0.0985 0.0911);
|
|
199
264
|
--color-surface-sunken: #0c0a09;
|
|
265
|
+
--color-surface-sunken: color(display-p3 0.0457 0.0395 0.0358);
|
|
200
266
|
--color-surface-navbar: #141410;
|
|
267
|
+
--color-surface-navbar: color(display-p3 0.0784 0.0784 0.0643);
|
|
201
268
|
--color-surface-navbar-scrolled: #141410;
|
|
269
|
+
--color-surface-navbar-scrolled: color(display-p3 0.0784 0.0784 0.0643);
|
|
202
270
|
--color-surface-code: #1c1917;
|
|
203
|
-
--color-
|
|
204
|
-
--color-border-
|
|
205
|
-
--color-border-
|
|
206
|
-
--color-border-
|
|
271
|
+
--color-surface-code: color(display-p3 0.1078 0.0985 0.0911);
|
|
272
|
+
--color-border-subtle: rgba(253, 249, 242, 0.45);
|
|
273
|
+
--color-border-subtle: color(display-p3 0.9894 0.977 0.9518 / 0.45);
|
|
274
|
+
--color-border-moderate: rgba(253, 249, 242, 0.60);
|
|
275
|
+
--color-border-moderate: color(display-p3 0.9894 0.977 0.9518 / 0.60);
|
|
276
|
+
--color-border-strong: rgba(253, 249, 242, 0.75);
|
|
277
|
+
--color-border-strong: color(display-p3 0.9894 0.977 0.9518 / 0.75);
|
|
278
|
+
--color-border-card: rgba(253, 249, 242, 0.60);
|
|
279
|
+
--color-border-card: color(display-p3 0.9894 0.977 0.9518 / 0.60);
|
|
207
280
|
--color-border-code: #292524;
|
|
281
|
+
--color-border-code: color(display-p3 0.1581 0.1456 0.1418);
|
|
208
282
|
--color-content-primary: #fdf9f2;
|
|
283
|
+
--color-content-primary: color(display-p3 0.9894 0.977 0.9518);
|
|
209
284
|
--color-content-secondary: #a8a29e;
|
|
210
|
-
--color-content-
|
|
285
|
+
--color-content-secondary: color(display-p3 0.6547 0.6361 0.6215);
|
|
286
|
+
--color-content-muted: #89827d;
|
|
287
|
+
--color-content-muted: color(display-p3 0.5325 0.5107 0.4925);
|
|
211
288
|
--color-content-inverse: #0c0a09;
|
|
289
|
+
--color-content-inverse: color(display-p3 0.0457 0.0395 0.0358);
|
|
212
290
|
--color-interactive-primary: #98a384;
|
|
291
|
+
--color-interactive-primary: color(display-p3 0.604 0.6378 0.5291);
|
|
213
292
|
--color-interactive-hover: #7e8a6b;
|
|
214
|
-
--color-interactive-
|
|
293
|
+
--color-interactive-hover: color(display-p3 0.5029 0.5397 0.4313);
|
|
294
|
+
--color-interactive-accent: #3498db;
|
|
295
|
+
--color-interactive-accent: color(display-p3 0.3208 0.588 0.8369);
|
|
215
296
|
--color-interactive-focus: #98a384;
|
|
216
|
-
--color-
|
|
217
|
-
--color-presentation-accent
|
|
297
|
+
--color-interactive-focus: color(display-p3 0.604 0.6378 0.5291);
|
|
298
|
+
--color-presentation-accent: #3498db;
|
|
299
|
+
--color-presentation-accent: color(display-p3 0.3208 0.588 0.8369);
|
|
300
|
+
--color-presentation-accent-hover: #2980b9;
|
|
301
|
+
--color-presentation-accent-hover: color(display-p3 0.2638 0.495 0.7068);
|
|
302
|
+
--color-vertical-accent-dissertation: #ce8e5c;
|
|
303
|
+
--color-vertical-accent-dissertation: color(display-p3 0.8089 0.5486 0.3177);
|
|
304
|
+
--color-vertical-accent-rpkg: #60a5fa;
|
|
305
|
+
--color-vertical-accent-rpkg: color(display-p3 0.4405 0.6403 0.9545);
|
|
306
|
+
--color-vertical-accent-SGPc: #b2bf22;
|
|
307
|
+
--color-vertical-accent-SGPc: color(display-p3 0.7074 0.7474 0.2714);
|
|
308
|
+
--color-brand-mark-red: #ff0000;
|
|
309
|
+
--color-brand-mark-red: color(display-p3 1 0 0);
|
|
218
310
|
--contrast-high: rgb(237, 237, 235);
|
|
219
311
|
--contrast-readable: rgb(237, 237, 235);
|
|
220
312
|
--contrast-medium: #83838f;
|
|
@@ -222,8 +314,8 @@
|
|
|
222
314
|
--shadow-subtle: 0 1px 2px 0 rgb(237 237 235 / 0.03);
|
|
223
315
|
--shadow-moderate: 0 4px 6px -1px rgb(237 237 235 / 0.05);
|
|
224
316
|
--shadow-prominent: 0 10px 15px -3px rgb(237 237 235 / 0.4);
|
|
225
|
-
--border-subtle: rgba(237, 237, 235, 0.
|
|
226
|
-
--border-moderate: rgba(237, 237, 235, 0.
|
|
317
|
+
--border-subtle: rgba(237, 237, 235, 0.47);
|
|
318
|
+
--border-moderate: rgba(237, 237, 235, 0.63);
|
|
227
319
|
--border-focus: #4FC3F7;
|
|
228
320
|
--navigation-hover-background: rgba(237, 237, 235, 0.05);
|
|
229
321
|
--navigation-active-background: rgba(237, 237, 235, 0.1);
|
|
@@ -1152,4 +1244,4 @@ a {
|
|
|
1152
1244
|
--color-border-default: #000000;
|
|
1153
1245
|
--color-border-focus: #FF0000;
|
|
1154
1246
|
}
|
|
1155
|
-
}
|
|
1247
|
+
}
|