@livenetworks/ashlar 2.1.13 → 2.2.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/components/COMPONENTS.md +80 -80
- package/components/ln-api-connector/ln-api-connector.schema.json +105 -105
- package/components/ln-chart/ln-chart-dev.scss +0 -4
- package/components/ln-core/README.md +21 -21
- package/components/ln-core/ln-core.schema.json +120 -120
- package/components/ln-core/query.js +113 -113
- package/components/ln-data-coordinator/README.md +2 -0
- package/components/ln-data-coordinator/ln-data-coordinator.js +1 -1
- package/components/ln-data-coordinator/ln-data-coordinator.schema.json +196 -196
- package/components/ln-data-coordinator/src/ln-data-coordinator.js +457 -432
- package/components/ln-data-store/ln-data-store.schema.json +92 -92
- package/components/ln-date/ln-date.js +1 -1
- package/components/ln-date/src/ln-date.js +1 -1
- package/components/ln-debug/ln-debug.js +1 -1
- package/components/ln-debug/ln-debug.schema.json +28 -28
- package/components/ln-debug/src/generated-attributes.js +304 -302
- package/components/ln-dropdown/ln-dropdown.schema.json +90 -90
- package/components/ln-external-links/README.md +19 -19
- package/components/ln-external-links/ln-external-links.js +1 -1
- package/components/ln-external-links/ln-external-links.schema.json +9 -0
- package/components/ln-external-links/ln-external-links.scss +12 -0
- package/components/ln-external-links/src/ln-external-links.js +3 -2
- package/components/ln-filter/README.md +2 -1
- package/components/ln-filter/ln-filter.js +1 -1
- package/components/ln-filter/ln-filter.schema.json +157 -169
- package/components/ln-filter/src/ln-filter.js +1 -3
- package/components/ln-form/ln-form.schema.json +57 -57
- package/components/ln-key/ln-key.js +1 -1
- package/components/ln-key/ln-key.schema.json +8 -0
- package/components/ln-key/src/ln-key.js +8 -5
- package/components/ln-obfuscator/ln-obfuscator.js +1 -1
- package/components/ln-obfuscator/ln-obfuscator.schema.json +6 -0
- package/components/ln-obfuscator/src/ln-obfuscator.js +2 -2
- package/components/ln-options/ln-options.schema.json +47 -47
- package/components/ln-popover/ln-popover.schema.json +82 -82
- package/components/ln-progress/ln-progress.schema.json +0 -13
- package/components/ln-search/ln-search.schema.json +111 -111
- package/components/ln-sort/README.md +1 -0
- package/components/ln-sort/ln-sort.js +1 -1
- package/components/ln-sort/ln-sort.schema.json +100 -112
- package/components/ln-sort/src/sort-model.js +1 -6
- package/components/ln-sortable/ln-sortable.schema.json +38 -38
- package/components/ln-sortable/ln-sortable.scss +25 -25
- package/components/ln-table/README.md +8 -1
- package/components/ln-table/ln-table.js +1 -1
- package/components/ln-table/ln-table.schema.json +195 -195
- package/components/ln-table/src/ln-table.js +43 -7
- package/components/ln-table-coordinator/ln-table-coordinator.js +1 -1
- package/components/ln-table-coordinator/ln-table-coordinator.schema.json +18 -0
- package/components/ln-table-coordinator/src/ln-table-coordinator.js +104 -2
- package/components/ln-toast/README.md +1 -1
- package/components/ln-toast/ln-toast.js +1 -1
- package/components/ln-toast/ln-toast.schema.json +6 -0
- package/components/ln-toast/src/ln-toast.js +1 -1
- package/components/ln-validate/README.md +6 -6
- package/components/ln-validate/ln-validate-dev.scss +0 -5
- package/components/ln-validate/ln-validate.js +1 -1
- package/components/ln-validate/ln-validate.schema.json +0 -6
- package/components/ln-validate/src/ln-validate.js +48 -29
- package/ln-ashlar.html-data.json +1824 -1814
- package/package.json +95 -95
- package/theme/README.md +7 -6
- package/theme/base/_global.scss +2 -2
- package/theme/base/_reset.scss +11 -0
- package/theme/components/_app-shell.scss +0 -8
- package/theme/components/_form.scss +6 -6
- package/theme/components/_ln-table.scss +6 -3
- package/theme/components/_scrollbar.scss +5 -4
- package/theme/components/_sortable.scss +19 -19
- package/theme/components/_stat-card.scss +1 -0
- package/theme/components/_table.scss +10 -33
- package/theme/config/_density.scss +236 -104
- package/theme/config/_palette.scss +71 -49
- package/theme/config/_theme.scss +27 -31
- package/theme/config/_tokens.scss +28 -26
- package/theme/config/mixins/_app-shell.scss +17 -21
- package/theme/config/mixins/_btn.scss +4 -2
- package/theme/config/mixins/_card.scss +87 -67
- package/theme/config/mixins/_colors.scss +2 -1
- package/theme/config/mixins/_display.scss +12 -0
- package/theme/config/mixins/_footer.scss +3 -1
- package/theme/config/mixins/_form.scss +48 -16
- package/theme/config/mixins/_layout.scss +9 -0
- package/theme/config/mixins/_ln-table.scss +22 -15
- package/theme/config/mixins/_modal.scss +3 -0
- package/theme/config/mixins/_nav.scss +27 -4
- package/theme/config/mixins/_sidebar.scss +2 -1
- package/theme/config/mixins/_stat-card.scss +33 -2
- package/theme/config/mixins/_status-badge.scss +1 -0
- package/theme/config/mixins/_table.scss +81 -39
- package/theme/config/mixins/_tabs.scss +31 -0
- package/theme/config/mixins/_toast.scss +0 -1
- package/theme/designs/relaxed/_card.scss +12 -0
- package/theme/designs/relaxed/_layout.scss +24 -0
- package/theme/ln-ashlar-core.scss +1 -0
- package/theme/ln-ashlar-dev.scss +0 -1
- package/theme/ln-ashlar-relaxed.scss +67 -0
- package/theme/tailwind/components.css +561 -24
- package/theme/utilities/_utilities.scss +1 -11
- package/web-types.json +2351 -2337
- package/components/ln-progress/ln-progress-dev.scss +0 -8
package/package.json
CHANGED
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@livenetworks/ashlar",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "LiveNetworks unified frontend library - CSS framework and vanilla JS components",
|
|
5
|
-
"license": "GPL-3.0-or-later",
|
|
6
|
-
"author": "Live Networks",
|
|
7
|
-
"type": "module",
|
|
8
|
-
"publishConfig": {
|
|
9
|
-
"access": "public"
|
|
10
|
-
},
|
|
11
|
-
"repository": {
|
|
12
|
-
"type": "git",
|
|
13
|
-
"url": "git+https://github.com/livenetworks/ln-ashlar.git"
|
|
14
|
-
},
|
|
15
|
-
"homepage": "https://github.com/livenetworks/ln-ashlar#readme",
|
|
16
|
-
"bugs": "https://github.com/livenetworks/ln-ashlar/issues",
|
|
17
|
-
"keywords": [
|
|
18
|
-
"css",
|
|
19
|
-
"scss",
|
|
20
|
-
"design-system",
|
|
21
|
-
"frontend",
|
|
22
|
-
"components",
|
|
23
|
-
"vanilla-js"
|
|
24
|
-
],
|
|
25
|
-
"main": "./dist/ln-ashlar.js",
|
|
26
|
-
"style": "./dist/ln-ashlar.css",
|
|
27
|
-
"web-types": "./web-types.json",
|
|
28
|
-
"files": [
|
|
29
|
-
"dist/",
|
|
30
|
-
"theme/",
|
|
31
|
-
"components/",
|
|
32
|
-
"ln-ashlar.html-data.json",
|
|
33
|
-
"web-types.json"
|
|
34
|
-
],
|
|
35
|
-
"exports": {
|
|
36
|
-
".": {
|
|
37
|
-
"import": "./dist/ln-ashlar.js",
|
|
38
|
-
"default": "./dist/ln-ashlar.js"
|
|
39
|
-
},
|
|
40
|
-
"./core.css": "./dist/ln-ashlar-core.css",
|
|
41
|
-
"./theme.css": "./dist/ln-ashlar-theme.css",
|
|
42
|
-
"./full.css": "./dist/ln-ashlar.css",
|
|
43
|
-
"./landing.css": "./dist/ln-ashlar-landing.css",
|
|
44
|
-
"./presentation.css": "./dist/ln-ashlar-landing.css",
|
|
45
|
-
"./dev.css": "./dist/ln-ashlar-dev.css",
|
|
46
|
-
"./dev.js": "./dist/ln-ashlar-dev.js",
|
|
47
|
-
"./theme/*": "./theme/*",
|
|
48
|
-
"./components/*": "./components/*",
|
|
49
|
-
"./tailwind.css": "./dist/ln-ashlar-tailwind.css"
|
|
50
|
-
},
|
|
51
|
-
"scripts": {
|
|
52
|
-
"test": "npm run sync:ln-schemas:check && npm run sync:ln-events:check && npm run sync:css-tokens:check && node --test \"tests/*.test.js\"",
|
|
53
|
-
"test:p0": "node --test tests/p0-data-integrity.test.js",
|
|
54
|
-
"test:headless": "node tests/headless/run-all.mjs",
|
|
55
|
-
"dev": "node scripts/build.mjs --watch",
|
|
56
|
-
"build": "npm run sync:ln-schemas && npm run sync:ln-events && npm run sync:css-tokens && node scripts/build.mjs && npm run build:tailwind && npm run build:dev-css && npm run build:demos",
|
|
57
|
-
"build:tailwind": "node scripts/build-tailwind.mjs",
|
|
58
|
-
"build:demos": "npm run build:demo-index && npm run build:demo-admin && npm run build:demo-docuflow && npm run build:demo-spa && npm run build:demo-landing && npm run build:demo-corporate",
|
|
59
|
-
"build:dev-css": "sass theme/ln-ashlar-dev.scss demo/dist/ln-ashlar-dev.css --no-source-map --style=compressed",
|
|
60
|
-
"generate:brand-assets": "powershell -ExecutionPolicy Bypass -File scripts/generate-brand-assets.ps1 && node scripts/generate-svg-favicon.mjs",
|
|
61
|
-
"build:demo-index": "sass demo/index.scss demo/index.css --no-source-map --style=compressed",
|
|
62
|
-
"build:demo-admin": "sass demo/admin/src/admin.scss demo/admin/dist/admin.css --no-source-map --style=compressed && node -e \"const fs = require('fs'); fs.copyFileSync('demo/admin/src/demo.js', 'demo/admin/dist/demo.js')\" && node demo/admin/src/build-pages.mjs",
|
|
63
|
-
"build:demo-docuflow": "sass demo/docuflow/docuflow.scss demo/docuflow/dist/docuflow.css --no-source-map --style=compressed",
|
|
64
|
-
"build:demo-spa": "node demo/spa/build.mjs",
|
|
65
|
-
"build:demo-landing": "sass demo/landing/landing.scss demo/landing/landing.css --no-source-map --style=compressed",
|
|
66
|
-
"build:demo-corporate": "sass demo/corporate/corporate.scss demo/corporate/corporate.css --no-source-map --style=compressed",
|
|
67
|
-
"sync:ln-schemas": "node scripts/sync-ln-schemas.mjs",
|
|
68
|
-
"sync:ln-schemas:check": "node scripts/sync-ln-schemas.mjs --check",
|
|
69
|
-
"sync:ln-events": "node scripts/sync-ln-events.mjs",
|
|
70
|
-
"sync:ln-events:check": "node scripts/sync-ln-events.mjs --check",
|
|
71
|
-
"sync:ln-events:strict": "node scripts/sync-ln-events.mjs --strict",
|
|
72
|
-
"sync:css-tokens": "node scripts/sync-css-tokens.mjs",
|
|
73
|
-
"sync:css-tokens:check": "node scripts/sync-css-tokens.mjs --check",
|
|
74
|
-
"manifest": "node scripts/extract-manifest.mjs",
|
|
75
|
-
"manifest:file": "node scripts/extract-manifest.mjs --output=docs/manifest.txt",
|
|
76
|
-
"generate:llms": "node scripts/generate-llms.mjs",
|
|
77
|
-
"generate:llms:check": "node scripts/generate-llms.mjs --check",
|
|
78
|
-
"test:visual": "node tests/headless/visual-run.mjs",
|
|
79
|
-
"test:perf": "node tests/headless/perf-run.mjs",
|
|
80
|
-
"test:perf:history": "node tests/headless/perf-run.mjs --history",
|
|
81
|
-
"test:perf:compare": "node tests/headless/perf-run.mjs --compare",
|
|
82
|
-
"test:perf:density": "node tests/headless/perf-density.mjs",
|
|
83
|
-
"test:dual": "node tests/headless/dual-run.mjs"
|
|
84
|
-
},
|
|
85
|
-
"devDependencies": {
|
|
86
|
-
"@tabler/icons": "^3.41.1",
|
|
87
|
-
"@tailwindcss/cli": "^4.3.3",
|
|
88
|
-
"fake-indexeddb": "^6.2.4",
|
|
89
|
-
"flag-icons": "^7.5.0",
|
|
90
|
-
"puppeteer-core": "^25.1.0",
|
|
91
|
-
"sass-embedded": "^1.83.0",
|
|
92
|
-
"tailwindcss": "^4.3.3",
|
|
93
|
-
"vite": "^6.0.0"
|
|
94
|
-
}
|
|
95
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@livenetworks/ashlar",
|
|
3
|
+
"version": "2.2.0",
|
|
4
|
+
"description": "LiveNetworks unified frontend library - CSS framework and vanilla JS components",
|
|
5
|
+
"license": "GPL-3.0-or-later",
|
|
6
|
+
"author": "Live Networks",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"publishConfig": {
|
|
9
|
+
"access": "public"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "git+https://github.com/livenetworks/ln-ashlar.git"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/livenetworks/ln-ashlar#readme",
|
|
16
|
+
"bugs": "https://github.com/livenetworks/ln-ashlar/issues",
|
|
17
|
+
"keywords": [
|
|
18
|
+
"css",
|
|
19
|
+
"scss",
|
|
20
|
+
"design-system",
|
|
21
|
+
"frontend",
|
|
22
|
+
"components",
|
|
23
|
+
"vanilla-js"
|
|
24
|
+
],
|
|
25
|
+
"main": "./dist/ln-ashlar.js",
|
|
26
|
+
"style": "./dist/ln-ashlar.css",
|
|
27
|
+
"web-types": "./web-types.json",
|
|
28
|
+
"files": [
|
|
29
|
+
"dist/",
|
|
30
|
+
"theme/",
|
|
31
|
+
"components/",
|
|
32
|
+
"ln-ashlar.html-data.json",
|
|
33
|
+
"web-types.json"
|
|
34
|
+
],
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"import": "./dist/ln-ashlar.js",
|
|
38
|
+
"default": "./dist/ln-ashlar.js"
|
|
39
|
+
},
|
|
40
|
+
"./core.css": "./dist/ln-ashlar-core.css",
|
|
41
|
+
"./theme.css": "./dist/ln-ashlar-theme.css",
|
|
42
|
+
"./full.css": "./dist/ln-ashlar.css",
|
|
43
|
+
"./landing.css": "./dist/ln-ashlar-landing.css",
|
|
44
|
+
"./presentation.css": "./dist/ln-ashlar-landing.css",
|
|
45
|
+
"./dev.css": "./dist/ln-ashlar-dev.css",
|
|
46
|
+
"./dev.js": "./dist/ln-ashlar-dev.js",
|
|
47
|
+
"./theme/*": "./theme/*",
|
|
48
|
+
"./components/*": "./components/*",
|
|
49
|
+
"./tailwind.css": "./dist/ln-ashlar-tailwind.css"
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"test": "npm run sync:ln-schemas:check && npm run sync:ln-events:check && npm run sync:css-tokens:check && node --test \"tests/*.test.js\"",
|
|
53
|
+
"test:p0": "node --test tests/p0-data-integrity.test.js",
|
|
54
|
+
"test:headless": "node tests/headless/run-all.mjs",
|
|
55
|
+
"dev": "node scripts/build.mjs --watch",
|
|
56
|
+
"build": "npm run sync:ln-schemas && npm run sync:ln-events && npm run sync:css-tokens && node scripts/build.mjs && npm run build:tailwind && npm run build:dev-css && npm run build:demos",
|
|
57
|
+
"build:tailwind": "node scripts/build-tailwind.mjs",
|
|
58
|
+
"build:demos": "npm run build:demo-index && npm run build:demo-admin && npm run build:demo-docuflow && npm run build:demo-spa && npm run build:demo-landing && npm run build:demo-corporate",
|
|
59
|
+
"build:dev-css": "sass theme/ln-ashlar-dev.scss demo/dist/ln-ashlar-dev.css --no-source-map --style=compressed",
|
|
60
|
+
"generate:brand-assets": "powershell -ExecutionPolicy Bypass -File scripts/generate-brand-assets.ps1 && node scripts/generate-svg-favicon.mjs",
|
|
61
|
+
"build:demo-index": "sass demo/index.scss demo/index.css --no-source-map --style=compressed",
|
|
62
|
+
"build:demo-admin": "sass demo/admin/src/admin.scss demo/admin/dist/admin.css --no-source-map --style=compressed && sass demo/admin/src/admin-relaxed.scss demo/admin/dist/admin-relaxed.css --no-source-map --style=compressed && node -e \"const fs = require('fs'); fs.copyFileSync('demo/admin/src/demo.js', 'demo/admin/dist/demo.js')\" && node demo/admin/src/build-pages.mjs",
|
|
63
|
+
"build:demo-docuflow": "sass demo/docuflow/docuflow.scss demo/docuflow/dist/docuflow.css --no-source-map --style=compressed",
|
|
64
|
+
"build:demo-spa": "node demo/spa/build.mjs",
|
|
65
|
+
"build:demo-landing": "sass demo/landing/landing.scss demo/landing/landing.css --no-source-map --style=compressed",
|
|
66
|
+
"build:demo-corporate": "sass demo/corporate/corporate.scss demo/corporate/corporate.css --no-source-map --style=compressed",
|
|
67
|
+
"sync:ln-schemas": "node scripts/sync-ln-schemas.mjs",
|
|
68
|
+
"sync:ln-schemas:check": "node scripts/sync-ln-schemas.mjs --check",
|
|
69
|
+
"sync:ln-events": "node scripts/sync-ln-events.mjs",
|
|
70
|
+
"sync:ln-events:check": "node scripts/sync-ln-events.mjs --check",
|
|
71
|
+
"sync:ln-events:strict": "node scripts/sync-ln-events.mjs --strict",
|
|
72
|
+
"sync:css-tokens": "node scripts/sync-css-tokens.mjs",
|
|
73
|
+
"sync:css-tokens:check": "node scripts/sync-css-tokens.mjs --check",
|
|
74
|
+
"manifest": "node scripts/extract-manifest.mjs",
|
|
75
|
+
"manifest:file": "node scripts/extract-manifest.mjs --output=docs/manifest.txt",
|
|
76
|
+
"generate:llms": "node scripts/generate-llms.mjs",
|
|
77
|
+
"generate:llms:check": "node scripts/generate-llms.mjs --check",
|
|
78
|
+
"test:visual": "node tests/headless/visual-run.mjs",
|
|
79
|
+
"test:perf": "node tests/headless/perf-run.mjs",
|
|
80
|
+
"test:perf:history": "node tests/headless/perf-run.mjs --history",
|
|
81
|
+
"test:perf:compare": "node tests/headless/perf-run.mjs --compare",
|
|
82
|
+
"test:perf:density": "node tests/headless/perf-density.mjs",
|
|
83
|
+
"test:dual": "node tests/headless/dual-run.mjs"
|
|
84
|
+
},
|
|
85
|
+
"devDependencies": {
|
|
86
|
+
"@tabler/icons": "^3.41.1",
|
|
87
|
+
"@tailwindcss/cli": "^4.3.3",
|
|
88
|
+
"fake-indexeddb": "^6.2.4",
|
|
89
|
+
"flag-icons": "^7.5.0",
|
|
90
|
+
"puppeteer-core": "^25.1.0",
|
|
91
|
+
"sass-embedded": "^1.83.0",
|
|
92
|
+
"tailwindcss": "^4.3.3",
|
|
93
|
+
"vite": "^6.0.0"
|
|
94
|
+
}
|
|
95
|
+
}
|
package/theme/README.md
CHANGED
|
@@ -22,6 +22,7 @@ theme/
|
|
|
22
22
|
│ ├── components.css # Component utility recipes
|
|
23
23
|
│ └── entry.css # Entrypoint bundle
|
|
24
24
|
├── ln-ashlar.scss # Master bundle (Core + Theme)
|
|
25
|
+
├── ln-ashlar-relaxed.scss # Relaxed design bundle (Core + Theme + designs/relaxed/*)
|
|
25
26
|
└── ln-ashlar-theme.scss # Theme-only visual design system bundle
|
|
26
27
|
```
|
|
27
28
|
|
|
@@ -31,12 +32,11 @@ theme/
|
|
|
31
32
|
|
|
32
33
|
To prevent browser style invalidation storms during interactive DOM mutations, all SCSS mixins and components adhere to the following rules:
|
|
33
34
|
|
|
34
|
-
1. **
|
|
35
|
-
-
|
|
36
|
-
- De-duplicate and hoist container-level `:has()` rules to global component scopes using `:is(...)` (e.g. `:is(.card, .section-card, [class*="card"]) > :is(main, a > main):has(...)`).
|
|
35
|
+
1. **Consolidate Compound `:has()` Queries via `:is(...)`:**
|
|
36
|
+
- Within structural mixins (such as `panel-body` in `_card.scss`, `pills` in `_form.scss`, and numeric table cells in `_table.scss`), collapse chained `:has()` checks into a single `:has(> :is(...))` selector rather than authoring sequential `:has()` rules.
|
|
37
37
|
|
|
38
38
|
2. **Prefer Natural Cascade over `:not(:has(...))`:**
|
|
39
|
-
- Negative `:not(:has(...))` selectors force the browser layout engine
|
|
39
|
+
- Negative `:not(:has(...))` selectors force the browser layout engine into exhaustive negative ancestor traversals.
|
|
40
40
|
- Use CSS source-order cascade instead:
|
|
41
41
|
```scss
|
|
42
42
|
// ✅ RECOMMENDED: Natural cascade override
|
|
@@ -46,12 +46,13 @@ To prevent browser style invalidation storms during interactive DOM mutations, a
|
|
|
46
46
|
color: var(--color-accent);
|
|
47
47
|
}
|
|
48
48
|
```
|
|
49
|
+
- For multi-action stacking (e.g. table header sorting and filtering in `_table.scss`), declare base single-action rules with `:has(:is(...))` and override with double-action `:has(...):has(...)` rather than mutual `:not(:has(...))` exclusions.
|
|
49
50
|
|
|
50
51
|
3. **Use Logical Properties for Sizing and Spacing:**
|
|
51
52
|
- Mixins for padding and margin use modern CSS logical properties (`padding-inline`, `padding-block`, `margin-inline`, `margin-block`), reducing generated rules by 50% compared to separate physical properties (`-left`, `-right`, `-top`, `-bottom`).
|
|
52
53
|
|
|
53
|
-
4. **
|
|
54
|
-
-
|
|
54
|
+
4. **Scope Container State Checks to Direct Children:**
|
|
55
|
+
- For container-level state indicators (e.g. navigation item active/hover lines on `li::before`), scope state queries strictly to direct children using `>` (e.g. `li:has(> a:hover)::before`, `li:has(> a.active)::before`). This avoids recursive descendant tree searches while preserving full-item indicator positioning and animations.
|
|
55
56
|
|
|
56
57
|
---
|
|
57
58
|
|
package/theme/base/_global.scss
CHANGED
|
@@ -22,11 +22,11 @@ body {
|
|
|
22
22
|
|
|
23
23
|
a {
|
|
24
24
|
// Derive hover from --color-accent at this scope. Same hue/saturation,
|
|
25
|
-
// lightness
|
|
25
|
+
// lightness shifted by --accent-hover-shift (number form — see _btn.scss for the syntax
|
|
26
26
|
// rationale). Local derivation means a semantic-color parent (.error,
|
|
27
27
|
// .success, etc.) that rebinds --color-primary cascades to the hover
|
|
28
28
|
// because var(--color-accent) re-resolves on the anchor element.
|
|
29
|
-
--color-accent-hover: hsl(from var(--color-accent) h s calc(l -
|
|
29
|
+
--color-accent-hover: hsl(from var(--color-accent) h s calc(l + var(--accent-hover-shift)));
|
|
30
30
|
|
|
31
31
|
color: var(--color-accent);
|
|
32
32
|
text-decoration: none;
|
package/theme/base/_reset.scss
CHANGED
|
@@ -15,3 +15,14 @@ ul, ol {
|
|
|
15
15
|
html {
|
|
16
16
|
font-size: 16px;
|
|
17
17
|
}
|
|
18
|
+
|
|
19
|
+
// Form controls do not inherit typography by default — textarea falls back
|
|
20
|
+
// to the UA monospace face and buttons/inputs to the system UI font.
|
|
21
|
+
button,
|
|
22
|
+
input,
|
|
23
|
+
select,
|
|
24
|
+
textarea {
|
|
25
|
+
font: inherit;
|
|
26
|
+
letter-spacing: inherit;
|
|
27
|
+
color: inherit;
|
|
28
|
+
}
|
|
@@ -13,11 +13,3 @@
|
|
|
13
13
|
.header-right { @include app-header-right; }
|
|
14
14
|
.header-actions { @include app-header-actions; }
|
|
15
15
|
.header-avatar { @include header-avatar; }
|
|
16
|
-
|
|
17
|
-
// Lock root scroll exclusively for administrative shells
|
|
18
|
-
html:has(.app-wrapper),
|
|
19
|
-
body:has(.app-wrapper),
|
|
20
|
-
.app-shell {
|
|
21
|
-
height: 100%;
|
|
22
|
-
overflow: hidden;
|
|
23
|
-
}
|
|
@@ -71,6 +71,12 @@ $icon-group-test: ':has(> .ln-icon):has(> :is(input[type="text"], input[type="se
|
|
|
71
71
|
@include form-input-icon-group-parts;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
+
// ─── Field wrapper ──────────────────────────────────────────────
|
|
75
|
+
|
|
76
|
+
.form-element {
|
|
77
|
+
@include form-element;
|
|
78
|
+
}
|
|
79
|
+
|
|
74
80
|
// ─── Label & Actions ────────────────────────────────────────────
|
|
75
81
|
|
|
76
82
|
// Non-wrapping labels only — the label sits above/beside its input, not
|
|
@@ -138,9 +144,3 @@ search:has(> input[type="search"]) {
|
|
|
138
144
|
@include form-validate-errors;
|
|
139
145
|
}
|
|
140
146
|
|
|
141
|
-
// Any trailing feedback/metadata element inside .form-element automatically gets slot treatment with zero-specificity base styling
|
|
142
|
-
:where(.form-element > :is(input, select, textarea, [data-ln-date-field], search, [class*="group"]) ~ :not(input)) {
|
|
143
|
-
@include form-slot;
|
|
144
|
-
color: var(--fg-muted);
|
|
145
|
-
}
|
|
146
|
-
|
|
@@ -13,6 +13,12 @@
|
|
|
13
13
|
@include ln-table-toolbar;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
// Toolbar sibling of the table: pin the thead under the toolbar.
|
|
17
|
+
:is(main, section, article):has(> .ln-table__toolbar + :is(table, [data-ln-table])),
|
|
18
|
+
[data-ln-table]:has(> header + table) {
|
|
19
|
+
@include ln-table-toolbar-stack;
|
|
20
|
+
}
|
|
21
|
+
|
|
16
22
|
.ln-table__toolbar :is(label, search):has(> input[type="search"]) {
|
|
17
23
|
@include ln-table-toolbar-search;
|
|
18
24
|
}
|
|
@@ -21,9 +27,6 @@
|
|
|
21
27
|
@include ln-table-count;
|
|
22
28
|
}
|
|
23
29
|
|
|
24
|
-
.table-container {
|
|
25
|
-
@include ln-table-card-mode;
|
|
26
|
-
}
|
|
27
30
|
[data-ln-table] > footer,
|
|
28
31
|
.ln-table__footer {
|
|
29
32
|
@include ln-table-footer;
|
|
@@ -5,13 +5,14 @@
|
|
|
5
5
|
height: 8px;
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
+
// Overlay-style scrollbars: no gutter track; the thumb uses the strong
|
|
9
|
+
// border tone so it stays findable without competing with content.
|
|
8
10
|
::-webkit-scrollbar-track {
|
|
9
|
-
|
|
10
|
-
background: var(--color-bg);
|
|
11
|
+
background: transparent;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
::-webkit-scrollbar-thumb {
|
|
14
|
-
background-color: var(--
|
|
15
|
+
background-color: var(--border-strong);
|
|
15
16
|
border-radius: 4px;
|
|
16
17
|
border: 2px solid transparent;
|
|
17
18
|
background-clip: content-box;
|
|
@@ -28,5 +29,5 @@
|
|
|
28
29
|
|
|
29
30
|
* {
|
|
30
31
|
scrollbar-width: thin;
|
|
31
|
-
scrollbar-color: var(--
|
|
32
|
+
scrollbar-color: var(--border-strong) transparent;
|
|
32
33
|
}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
@use '../config/mixins' as *;
|
|
2
|
-
|
|
3
|
-
[data-ln-sortable] {
|
|
4
|
-
list-style: none;
|
|
5
|
-
padding: 0;
|
|
6
|
-
margin: 0;
|
|
7
|
-
|
|
8
|
-
> * {
|
|
9
|
-
transition: box-shadow var(--transition-fast) var(--easing-standard), opacity var(--transition-fast) var(--easing-standard);
|
|
10
|
-
|
|
11
|
-
&.ln-sortable--drop-before {
|
|
12
|
-
box-shadow: inset 0 2px 0 0 var(--color-accent);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
&.ln-sortable--drop-after {
|
|
16
|
-
box-shadow: inset 0 -2px 0 0 var(--color-accent);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
1
|
+
@use '../config/mixins' as *;
|
|
2
|
+
|
|
3
|
+
[data-ln-sortable] {
|
|
4
|
+
list-style: none;
|
|
5
|
+
padding: 0;
|
|
6
|
+
margin: 0;
|
|
7
|
+
|
|
8
|
+
> * {
|
|
9
|
+
transition: box-shadow var(--transition-fast) var(--easing-standard), opacity var(--transition-fast) var(--easing-standard);
|
|
10
|
+
|
|
11
|
+
&.ln-sortable--drop-before {
|
|
12
|
+
box-shadow: inset 0 2px 0 0 var(--color-accent);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
&.ln-sortable--drop-after {
|
|
16
|
+
box-shadow: inset 0 -2px 0 0 var(--color-accent);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -25,52 +25,29 @@ table {
|
|
|
25
25
|
|
|
26
26
|
.table-container {
|
|
27
27
|
@include container(table);
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
// `clip`, not `auto` — keeps the thead pinned to the page scroller;
|
|
29
|
+
// narrow containers stack records instead (below).
|
|
30
|
+
overflow-x: clip;
|
|
30
31
|
|
|
31
|
-
|
|
32
|
+
// Narrow container (e.g. a side column on desktop) — same card mode.
|
|
33
|
+
@include cq-down(md, table) {
|
|
32
34
|
table { @include table-responsive; }
|
|
33
|
-
|
|
34
|
-
.table-row-actions {
|
|
35
|
-
position: static !important;
|
|
36
|
-
opacity: 1 !important;
|
|
37
|
-
visibility: visible !important;
|
|
38
|
-
pointer-events: auto !important;
|
|
39
|
-
transform: none !important;
|
|
40
|
-
background: transparent !important;
|
|
41
|
-
padding-left: 0 !important;
|
|
42
|
-
justify-content: flex-end;
|
|
43
|
-
margin-top: var(--size-xs);
|
|
44
|
-
|
|
45
|
-
&::before {
|
|
46
|
-
display: none !important;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
35
|
}
|
|
50
36
|
}
|
|
51
37
|
|
|
52
38
|
// ─── Shared Column Filter Button ─────────────────────────────────
|
|
53
|
-
//
|
|
54
|
-
// hook. .table-filter is a thin binding that mirrors the mixin; a consumer may instead
|
|
55
|
-
// @include table-filter on their own selector (the class is a convenience, not a mandate).
|
|
39
|
+
// Binding of @mixin table-filter to the column-filter hook; the th stack keys on the same attribute.
|
|
56
40
|
// Sort lives in scss/components/_sort.scss — see [data-ln-sort].
|
|
57
41
|
|
|
58
|
-
|
|
59
|
-
th:hover .table-filter { opacity: 0.7; }
|
|
60
|
-
|
|
61
|
-
// Active filter — JS-state class set DIRECTLY on the button (self-selector), combined with
|
|
62
|
-
// the structural helper class. Fixes the latent ln-data-table bug: JS toggles
|
|
63
|
-
// .ln-filter-active on the button itself, but the old CSS used a descendant combinator
|
|
64
|
-
// (.ln-filter-active [data-ln-col-filter]) that never matched, so the dot never rendered.
|
|
65
|
-
// See D2.
|
|
66
|
-
.table-filter.ln-filter-active { @include table-filter-active; }
|
|
42
|
+
[data-ln-table-col-filter] { @include table-filter; }
|
|
67
43
|
|
|
68
44
|
|
|
69
45
|
|
|
70
46
|
// ─── Data Table JS-State Classes ───────────────────────────────
|
|
71
47
|
// JS-added state classes only. Row chrome (clickable cursor/hover, action
|
|
72
|
-
// buttons
|
|
73
|
-
//
|
|
48
|
+
// buttons) is a CONSUMER concern — applied via semantic selectors in project
|
|
49
|
+
// SCSS, never keyed off the data-ln-* JS hooks. The sticky header is library
|
|
50
|
+
// default (table-base).
|
|
74
51
|
|
|
75
52
|
.ln-row-selected {
|
|
76
53
|
@include table-row-selected;
|