@klodd/ds 3.4.5 → 3.5.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.
- package/bin/sync.js +31 -5
- package/bin/verify.js +14 -7
- package/css/10-semantic.css +4 -88
- package/css/apps/ekonom.css +1 -3
- package/package.json +2 -2
package/bin/sync.js
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
/* @klodd/ds sync - kopierar paketets CSS och JS till app-repot.
|
|
3
3
|
* Kör: npx @klodd/ds sync
|
|
4
4
|
* Förutsätter att CWD är app-repots rot.
|
|
5
|
-
* Läser cssTarget/jsTarget från klodd-ds.json i CWD, eller använder default.
|
|
5
|
+
* Läser cssTarget/jsTarget/exclude från klodd-ds.json i CWD, eller använder default.
|
|
6
|
+
*
|
|
7
|
+
* exclude-fältet (v3.5.0+) är en lista av relativa fil-paths under css/ eller
|
|
8
|
+
* js/ som hoppas över vid kopiering. Användbart när en app inte konsumerar en
|
|
9
|
+
* komponent som finns i paketet (t.ex. apps/ekonom.css i Jubbs repo).
|
|
6
10
|
*
|
|
7
11
|
* Cross-platform via fs.cpSync (Node 16.7+) - inte POSIX cp -r. */
|
|
8
12
|
'use strict';
|
|
@@ -17,17 +21,39 @@ const jsSource = path.join(pkgDir, 'js');
|
|
|
17
21
|
const configPath = path.join(process.cwd(), 'klodd-ds.json');
|
|
18
22
|
const config = fs.existsSync(configPath)
|
|
19
23
|
? JSON.parse(fs.readFileSync(configPath, 'utf8'))
|
|
20
|
-
: { cssTarget: 'app/static/css/ds', jsTarget: 'app/static/js/ds' };
|
|
24
|
+
: { cssTarget: 'app/static/css/ds', jsTarget: 'app/static/js/ds', exclude: [] };
|
|
21
25
|
|
|
22
26
|
const cssTarget = path.join(process.cwd(), config.cssTarget);
|
|
23
27
|
const jsTarget = path.join(process.cwd(), config.jsTarget);
|
|
28
|
+
const exclude = new Set(config.exclude || []);
|
|
24
29
|
|
|
25
30
|
fs.mkdirSync(cssTarget, { recursive: true });
|
|
26
31
|
fs.mkdirSync(jsTarget, { recursive: true });
|
|
27
32
|
|
|
28
|
-
|
|
33
|
+
function copyDirFiltered(srcRoot, dstRoot, kind) {
|
|
34
|
+
const stack = [{ abs: srcRoot, rel: '' }];
|
|
35
|
+
while (stack.length) {
|
|
36
|
+
const { abs, rel } = stack.pop();
|
|
37
|
+
for (const entry of fs.readdirSync(abs, { withFileTypes: true })) {
|
|
38
|
+
const childAbs = path.join(abs, entry.name);
|
|
39
|
+
const childRel = rel ? path.posix.join(rel, entry.name) : entry.name;
|
|
40
|
+
const excludeKey = `${kind}/${childRel}`;
|
|
41
|
+
if (exclude.has(excludeKey) || exclude.has(childRel)) continue;
|
|
42
|
+
const childDst = path.join(dstRoot, childRel);
|
|
43
|
+
if (entry.isDirectory()) {
|
|
44
|
+
fs.mkdirSync(childDst, { recursive: true });
|
|
45
|
+
stack.push({ abs: childAbs, rel: childRel });
|
|
46
|
+
} else if (entry.isFile()) {
|
|
47
|
+
fs.copyFileSync(childAbs, childDst);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
copyDirFiltered(cssSource, cssTarget, 'css');
|
|
29
54
|
if (fs.existsSync(jsSource)) {
|
|
30
|
-
|
|
55
|
+
copyDirFiltered(jsSource, jsTarget, 'js');
|
|
31
56
|
}
|
|
32
57
|
|
|
33
|
-
|
|
58
|
+
const excludedCount = exclude.size > 0 ? ` (${exclude.size} excluderade)` : '';
|
|
59
|
+
console.log(`OK @klodd/ds synkad till ${config.cssTarget} och ${config.jsTarget}${excludedCount}`);
|
package/bin/verify.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/* @klodd/ds verify - diff:ar committade DS-filer mot paket-källan.
|
|
3
3
|
* Kör i CI: npx @klodd/ds verify
|
|
4
|
-
* Fail:ar med exit code 1 om drift detekteras.
|
|
4
|
+
* Fail:ar med exit code 1 om drift detekteras.
|
|
5
|
+
*
|
|
6
|
+
* exclude-fältet (v3.5.0+) i klodd-ds.json hoppas över vid diff. */
|
|
5
7
|
'use strict';
|
|
6
8
|
|
|
7
9
|
const fs = require('fs');
|
|
@@ -12,7 +14,9 @@ const pkgDir = path.dirname(require.resolve('@klodd/ds/package.json'));
|
|
|
12
14
|
const configPath = path.join(process.cwd(), 'klodd-ds.json');
|
|
13
15
|
const config = fs.existsSync(configPath)
|
|
14
16
|
? JSON.parse(fs.readFileSync(configPath, 'utf8'))
|
|
15
|
-
: { cssTarget: 'app/static/css/ds', jsTarget: 'app/static/js/ds' };
|
|
17
|
+
: { cssTarget: 'app/static/css/ds', jsTarget: 'app/static/js/ds', exclude: [] };
|
|
18
|
+
|
|
19
|
+
const exclude = new Set(config.exclude || []);
|
|
16
20
|
|
|
17
21
|
function hashFile(filePath) {
|
|
18
22
|
return crypto.createHash('sha256')
|
|
@@ -27,7 +31,7 @@ function listFilesRec(dir) {
|
|
|
27
31
|
const { abs, rel } = stack.pop();
|
|
28
32
|
for (const entry of fs.readdirSync(abs, { withFileTypes: true })) {
|
|
29
33
|
const childAbs = path.join(abs, entry.name);
|
|
30
|
-
const childRel = rel ? path.join(rel, entry.name) : entry.name;
|
|
34
|
+
const childRel = rel ? path.posix.join(rel, entry.name) : entry.name;
|
|
31
35
|
if (entry.isDirectory()) stack.push({ abs: childAbs, rel: childRel });
|
|
32
36
|
else if (entry.isFile()) out.push(childRel);
|
|
33
37
|
}
|
|
@@ -35,11 +39,13 @@ function listFilesRec(dir) {
|
|
|
35
39
|
return out;
|
|
36
40
|
}
|
|
37
41
|
|
|
38
|
-
function diffDirs(sourceDir, targetRel) {
|
|
42
|
+
function diffDirs(sourceDir, targetRel, kind) {
|
|
39
43
|
const drifted = [];
|
|
40
44
|
if (!fs.existsSync(sourceDir)) return drifted;
|
|
41
45
|
const targetAbs = path.join(process.cwd(), targetRel);
|
|
42
46
|
for (const file of listFilesRec(sourceDir)) {
|
|
47
|
+
const excludeKey = `${kind}/${file}`;
|
|
48
|
+
if (exclude.has(excludeKey) || exclude.has(file)) continue;
|
|
43
49
|
const src = path.join(sourceDir, file);
|
|
44
50
|
const tgt = path.join(targetAbs, file);
|
|
45
51
|
if (!fs.existsSync(tgt)) {
|
|
@@ -51,8 +57,8 @@ function diffDirs(sourceDir, targetRel) {
|
|
|
51
57
|
return drifted;
|
|
52
58
|
}
|
|
53
59
|
|
|
54
|
-
const cssDrift = diffDirs(path.join(pkgDir, 'css'), config.cssTarget);
|
|
55
|
-
const jsDrift = diffDirs(path.join(pkgDir, 'js'), config.jsTarget);
|
|
60
|
+
const cssDrift = diffDirs(path.join(pkgDir, 'css'), config.cssTarget, 'css');
|
|
61
|
+
const jsDrift = diffDirs(path.join(pkgDir, 'js'), config.jsTarget, 'js');
|
|
56
62
|
const allDrift = [...cssDrift, ...jsDrift];
|
|
57
63
|
|
|
58
64
|
if (allDrift.length > 0) {
|
|
@@ -62,5 +68,6 @@ if (allDrift.length > 0) {
|
|
|
62
68
|
process.exit(1);
|
|
63
69
|
}
|
|
64
70
|
|
|
65
|
-
|
|
71
|
+
const excludedCount = exclude.size > 0 ? ` (${exclude.size} excluderade fran kontroll)` : '';
|
|
72
|
+
console.log(`OK: alla DS-filer matchar @klodd/ds-paketet${excludedCount}.`);
|
|
66
73
|
process.exit(0);
|
package/css/10-semantic.css
CHANGED
|
@@ -409,98 +409,14 @@
|
|
|
409
409
|
|
|
410
410
|
|
|
411
411
|
/* ================================================================
|
|
412
|
-
====
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
Migration sker gradvis: nar en komponent rors, byt fran legacy-namn
|
|
417
|
-
till nytt semantic-namn. Behall denna sektion tills alla call-sites
|
|
418
|
-
ar migrerade. Da kan den raderas och DECISIONS.md uppdateras.
|
|
412
|
+
==== OVERLAY TINTS
|
|
413
|
+
Transparenta tints för drag-overlays, hover-states på dark surfaces
|
|
414
|
+
och liknande där en alpha-pixel-shift räcker. Inte permanenta
|
|
415
|
+
surface-nivåer (de ligger i SURFACES-sektionen ovan).
|
|
419
416
|
================================================================ */
|
|
420
417
|
:root {
|
|
421
|
-
/* Surfaces (gamla overlay-skala) -> mappa mot nya neutral-stegen. */
|
|
422
418
|
--surface-faint: color-mix(in oklch, white 2%, transparent);
|
|
423
419
|
--surface-subtle: color-mix(in oklch, white 4%, transparent);
|
|
424
420
|
--surface-medium: color-mix(in oklch, white 8%, transparent);
|
|
425
421
|
--surface-strong: color-mix(in oklch, white 12%, transparent);
|
|
426
|
-
|
|
427
|
-
/* Bakgrunder - gamla bg-* mappas till nya surface-*. */
|
|
428
|
-
--bg-sunken: var(--surface-sunken);
|
|
429
|
-
--bg-base: var(--surface-page);
|
|
430
|
-
--bg-surface: var(--surface-raised);
|
|
431
|
-
--bg-raised: var(--surface-raised);
|
|
432
|
-
--bg-hover: var(--surface-hover);
|
|
433
|
-
|
|
434
|
-
/* Text - gamla text-primary/secondary/tertiary/faint. */
|
|
435
|
-
--text-primary: var(--text-default);
|
|
436
|
-
--text-secondary: var(--text-subtle);
|
|
437
|
-
--text-tertiary: var(--text-muted);
|
|
438
|
-
--text-faint: var(--text-disabled);
|
|
439
|
-
|
|
440
|
-
/* Accent - gamla --accent (singular) mappas mot nya --accent-9.
|
|
441
|
-
--accent-dim/-border foljde gamla 20%/40%-konventionen, mappas
|
|
442
|
-
nu mot Radix-skalans steg 3 (subtil) och 6 (border-emphasis). */
|
|
443
|
-
--accent: var(--accent-9);
|
|
444
|
-
--accent-hover: var(--accent-10);
|
|
445
|
-
--accent-strong: var(--accent-9);
|
|
446
|
-
--accent-secondary: var(--accent-9);
|
|
447
|
-
--accent-dim: var(--accent-a3);
|
|
448
|
-
--accent-border: var(--accent-a6);
|
|
449
|
-
|
|
450
|
-
/* Accent-link - gamla cirkelknapps-tokens. Mappas mot accent-systemet.
|
|
451
|
-
Gamla 10/20/40%-stegen mappas mot nya Radix-stegen 2/3/6. */
|
|
452
|
-
--accent-link: var(--accent-text);
|
|
453
|
-
--accent-link-bg: var(--accent-a2);
|
|
454
|
-
--accent-link-bg-hover: var(--accent-a3);
|
|
455
|
-
--accent-link-border: var(--accent-a3);
|
|
456
|
-
--accent-link-border-hover: var(--accent-a6);
|
|
457
|
-
|
|
458
|
-
/* Audit-aliaser fran 2026-05-07 - ofta refererade utan att vara definierade. */
|
|
459
|
-
--text: var(--text-default);
|
|
460
|
-
--border: var(--border-default);
|
|
461
|
-
--surface-2: var(--surface-default);
|
|
462
|
-
--surface-3: var(--surface-raised);
|
|
463
|
-
--accent-rgba: var(--accent-a3);
|
|
464
|
-
|
|
465
|
-
/* Radius - gamla t-shirt-namn mappas mot nya pixel-numeriska. */
|
|
466
|
-
--radius-xs: var(--radius-2);
|
|
467
|
-
--radius-sm: var(--radius-4);
|
|
468
|
-
--radius-md: var(--radius-6);
|
|
469
|
-
--radius-lg: var(--radius-12);
|
|
470
|
-
--radius-xl: var(--radius-14);
|
|
471
|
-
--radius-2xl: var(--radius-16);
|
|
472
|
-
--radius-3xl: var(--radius-20);
|
|
473
|
-
--radius-4xl: var(--radius-24);
|
|
474
|
-
--radius-pill: var(--radius-full);
|
|
475
|
-
|
|
476
|
-
/* Font-weight: --fw-semibold borttagen 2026-05-07 per 400/500-policy.
|
|
477
|
-
Aktiva call-sites bytte till var(--fw-medium) explicit. Se DECISIONS.md. */
|
|
478
|
-
|
|
479
|
-
/* Kategori-paletter (Ekonom-only). Behalls for shared-tokens-paritet
|
|
480
|
-
med Ekonom-repot, oanvanda i Jubb. */
|
|
481
|
-
--primitive-cat-mat: color-mix(in oklch, var(--purple-9) 60%, transparent);
|
|
482
|
-
--primitive-cat-el: oklch(0.72 0.135 245);
|
|
483
|
-
--primitive-cat-vatten: oklch(0.78 0.110 200);
|
|
484
|
-
--primitive-cat-avgift: var(--green-9);
|
|
485
|
-
--primitive-cat-noje: oklch(0.72 0.150 350);
|
|
486
|
-
--primitive-cat-amort: oklch(0.72 0.135 160);
|
|
487
|
-
--primitive-cat-ranta: oklch(0.72 0.150 50);
|
|
488
|
-
--primitive-cat-privat: var(--gray-9);
|
|
489
|
-
|
|
490
|
-
--cat-mat: color-mix(in oklch, var(--purple-9) 15%, transparent);
|
|
491
|
-
--cat-mat-icon: var(--primitive-cat-mat);
|
|
492
|
-
--cat-el: color-mix(in oklch, var(--blue-9) 15%, transparent);
|
|
493
|
-
--cat-el-icon: var(--primitive-cat-el);
|
|
494
|
-
--cat-vatten: color-mix(in oklch, oklch(0.78 0.110 200) 15%, transparent);
|
|
495
|
-
--cat-vatten-icon: var(--primitive-cat-vatten);
|
|
496
|
-
--cat-avgift: color-mix(in oklch, var(--green-9) 15%, transparent);
|
|
497
|
-
--cat-avgift-icon: var(--primitive-cat-avgift);
|
|
498
|
-
--cat-noje: color-mix(in oklch, oklch(0.72 0.150 350) 15%, transparent);
|
|
499
|
-
--cat-noje-icon: var(--primitive-cat-noje);
|
|
500
|
-
--cat-amortering: color-mix(in oklch, oklch(0.72 0.135 160) 15%, transparent);
|
|
501
|
-
--cat-amort-icon: var(--primitive-cat-amort);
|
|
502
|
-
--cat-ranta: color-mix(in oklch, oklch(0.72 0.150 50) 15%, transparent);
|
|
503
|
-
--cat-ranta-icon: var(--primitive-cat-ranta);
|
|
504
|
-
--cat-privat: color-mix(in oklch, var(--gray-9) 12%, transparent);
|
|
505
|
-
--cat-privat-icon: var(--primitive-cat-privat);
|
|
506
422
|
}
|
package/css/apps/ekonom.css
CHANGED
|
@@ -26,9 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
Konvention: --surface-raised = appens <color>-2. Gäller alla
|
|
28
28
|
Klodd-appar (Jubb -> blue-2, Ekonom -> plum-2). Korten ligger
|
|
29
|
-
subtilt
|
|
30
|
-
använde Ekonom --plum-2-5 (mellanvarde) - nu linjerat med
|
|
31
|
-
samma regel som Jubb. */
|
|
29
|
+
subtilt över page-bakgrunden utan att bli för ljusa. */
|
|
32
30
|
--surface-page: var(--plum-1); /* #181118 */
|
|
33
31
|
--surface-default: var(--plum-2); /* #201320 */
|
|
34
32
|
--surface-raised: var(--plum-2); /* #201320 - kort, paneler */
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@klodd/ds",
|
|
3
|
-
"version": "3.
|
|
4
|
-
"description": "Klodd Design System - shared tokens, typography, components and JS for Jubb, Ekonom, and future apps. v3.
|
|
3
|
+
"version": "3.5.0",
|
|
4
|
+
"description": "Klodd Design System - shared tokens, typography, components and JS for Jubb, Ekonom, and future apps. v3.5.0 tar bort LEGACY ALIASES (alla token-call-sites migrerade) och flyttar overlay-tints till egen sektion. Breaking: --accent/--bg-base/--text-primary/--accent-dim/--accent-hover/--accent-link*/--card-bg-elevated/--shadow-float/--bg-sunken/--radius-xs..4xl/--radius-pill borttagna - använd new tokens. Plus exclude-fält i CLI (klodd-ds.json) för app-specifika exkluderingar.",
|
|
5
5
|
"main": "css/index.css",
|
|
6
6
|
"bin": {
|
|
7
7
|
"klodd-ds": "./bin/klodd-ds.js"
|