@profitlich/template-toolkit 3.1.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +12 -2
- package/scss/core/capsize.scss +15 -0
- package/scss/core/layout.scss +4 -3
- package/scss/forward.scss +1 -0
- package/vite/capsizeSassFunctions.js +108 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@profitlich/template-toolkit",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"description": "Shared SCSS layout system, JS utilities, components and build scripts for profitlich template repos",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"./dev": "./dev/Dev.js",
|
|
10
10
|
"./dev/toolbar": "./dev/toolbar/Toolbar.js",
|
|
11
11
|
"./scss/forward": "./scss/forward.scss",
|
|
12
|
+
"./scss/core/capsize": "./scss/core/capsize.scss",
|
|
12
13
|
"./scss/core/hamburger": "./scss/core/hamburger.scss",
|
|
13
14
|
"./scss/core/layout": "./scss/core/layout.scss",
|
|
14
15
|
"./scss/core/mediaqueries": "./scss/core/mediaqueries.scss",
|
|
@@ -20,7 +21,8 @@
|
|
|
20
21
|
"./utils/ImagesLoaded": "./utils/images-loaded/ImagesLoaded.js",
|
|
21
22
|
"./scripts/copy-files": "./scripts/copy-files.js",
|
|
22
23
|
"./scripts/deploy": "./scripts/deploy.js",
|
|
23
|
-
"./vite/jsonToScss": "./vite/jsonToScss.js"
|
|
24
|
+
"./vite/jsonToScss": "./vite/jsonToScss.js",
|
|
25
|
+
"./vite/capsizeSassFunctions": "./vite/capsizeSassFunctions.js"
|
|
24
26
|
},
|
|
25
27
|
"files": [
|
|
26
28
|
"components/",
|
|
@@ -40,9 +42,17 @@
|
|
|
40
42
|
"lil-gui": "^0.21.0"
|
|
41
43
|
},
|
|
42
44
|
"peerDependencies": {
|
|
45
|
+
"@capsizecss/core": ">=4.0.0",
|
|
46
|
+
"@capsizecss/unpack": ">=2.0.0",
|
|
43
47
|
"@mux/mux-player": ">=3.0.0"
|
|
44
48
|
},
|
|
45
49
|
"peerDependenciesMeta": {
|
|
50
|
+
"@capsizecss/core": {
|
|
51
|
+
"optional": true
|
|
52
|
+
},
|
|
53
|
+
"@capsizecss/unpack": {
|
|
54
|
+
"optional": true
|
|
55
|
+
},
|
|
46
56
|
"@mux/mux-player": {
|
|
47
57
|
"optional": true
|
|
48
58
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// Emittiert die Capsize-Pseudo-Elemente (::before/::after mit Em-Trims)
|
|
2
|
+
// für den aktuellen Selektor. Die Inhalte (welche Pseudo-Elemente, welche
|
|
3
|
+
// Properties) kommen vollständig aus @capsizecss/core via der
|
|
4
|
+
// Sass-Custom-Function capsize-pseudo-elements (registriert im
|
|
5
|
+
// vite/capsizeSassFunctions.js des Toolkits).
|
|
6
|
+
@mixin capsize($name, $fontSize, $lineHeight) {
|
|
7
|
+
$pseudo: capsize-pseudo-elements($name, $fontSize, $lineHeight);
|
|
8
|
+
@each $selector-suffix, $props in $pseudo {
|
|
9
|
+
&#{$selector-suffix} {
|
|
10
|
+
@each $prop, $val in $props {
|
|
11
|
+
#{$prop}: $val;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
package/scss/core/layout.scss
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
@use "config";
|
|
2
|
+
@use "capsize" as *;
|
|
2
3
|
@use "sass:list";
|
|
3
4
|
@use "sass:map";
|
|
4
5
|
@use "sass:meta";
|
|
@@ -81,13 +82,13 @@ $mediaqueries: (
|
|
|
81
82
|
|
|
82
83
|
|
|
83
84
|
// Font
|
|
84
|
-
@mixin font($layout, $fontSize, $lineHeight, $
|
|
85
|
+
@mixin font($layout, $fontSize, $lineHeight, $capsize: null) {
|
|
85
86
|
|
|
86
87
|
font-size: size($layout, $fontSize);
|
|
87
88
|
line-height: size($layout, $lineHeight);
|
|
88
89
|
|
|
89
|
-
@if ($
|
|
90
|
-
|
|
90
|
+
@if ($capsize != null) {
|
|
91
|
+
@include capsize($capsize, $fontSize, $lineHeight);
|
|
91
92
|
}
|
|
92
93
|
|
|
93
94
|
}
|
package/scss/forward.scss
CHANGED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { fromFile } from '@capsizecss/unpack';
|
|
2
|
+
import { createStyleObject, getCapHeight } from '@capsizecss/core';
|
|
3
|
+
import * as sass from 'sass';
|
|
4
|
+
import { OrderedMap } from 'immutable';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Erzeugt ein Sass-functions-Objekt, das die Custom-Function
|
|
9
|
+
* `capsize-pseudo-elements($name, $fontSize, $lineHeight)` bereitstellt.
|
|
10
|
+
*
|
|
11
|
+
* Die Funktion ruft intern @capsizecss/core.createStyleObject auf und gibt
|
|
12
|
+
* eine Sass-Map mit allen Pseudo-Element-Stilen zurück. Beispiel-Struktur:
|
|
13
|
+
*
|
|
14
|
+
* (
|
|
15
|
+
* '::before': (content: '', margin-bottom: -0.123em, display: table),
|
|
16
|
+
* '::after': (content: '', margin-top: -0.456em, display: table),
|
|
17
|
+
* )
|
|
18
|
+
*
|
|
19
|
+
* SCSS iteriert die Map und emittiert die Pseudo-Element-Regeln. Damit
|
|
20
|
+
* kommt das CSS-Schema (welche Properties, welche Pseudo-Elemente) komplett
|
|
21
|
+
* aus Capsize — Updates fliessen direkt durch.
|
|
22
|
+
*
|
|
23
|
+
* @param {Object<string,string>} fontFiles - Map: Font-Name → Pfad zur Font-Datei
|
|
24
|
+
* @returns {Promise<Object>} - functions-Objekt für preprocessorOptions.scss.functions
|
|
25
|
+
*/
|
|
26
|
+
export async function createCapsizeFunctions(fontFiles) {
|
|
27
|
+
const metrics = {};
|
|
28
|
+
for (const [name, file] of Object.entries(fontFiles)) {
|
|
29
|
+
metrics[name] = await fromFile(path.resolve(file));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
'capsize-pseudo-elements($name, $fontSize, $lineHeight)': (args) => {
|
|
34
|
+
const name = args[0].assertString('name').text;
|
|
35
|
+
const fontSize = args[1].assertNumber('fontSize').value;
|
|
36
|
+
const lineHeight = args[2].assertNumber('lineHeight').value;
|
|
37
|
+
|
|
38
|
+
const fontMetrics = metrics[name];
|
|
39
|
+
if (!fontMetrics) {
|
|
40
|
+
throw new Error(
|
|
41
|
+
`capsize-pseudo-elements: Keine Metriken für Font "${name}" geladen. ` +
|
|
42
|
+
`Verfügbar: ${Object.keys(metrics).join(', ') || '(keine)'}.`
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// createStyleObject liefert font-size, line-height, ::before, ::after.
|
|
47
|
+
// Wir nehmen nur die Pseudo-Elemente — font-size/line-height
|
|
48
|
+
// werden im SCSS via size() aus vwBody erzeugt.
|
|
49
|
+
const styles = createStyleObject({ fontSize, leading: lineHeight, fontMetrics });
|
|
50
|
+
|
|
51
|
+
const entries = [];
|
|
52
|
+
for (const [key, val] of Object.entries(styles)) {
|
|
53
|
+
if (key.startsWith('::')) {
|
|
54
|
+
entries.push([
|
|
55
|
+
new sass.SassString(key, { quotes: false }),
|
|
56
|
+
_objToSassMap(val),
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return new sass.SassMap(OrderedMap(entries));
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
'capsize-cap-height($name, $fontSize)': (args) => {
|
|
64
|
+
const name = args[0].assertString('name').text;
|
|
65
|
+
const fontSize = args[1].assertNumber('fontSize').value;
|
|
66
|
+
|
|
67
|
+
const fontMetrics = metrics[name];
|
|
68
|
+
if (!fontMetrics) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`capsize-cap-height: Keine Metriken für Font "${name}" geladen. ` +
|
|
71
|
+
`Verfügbar: ${Object.keys(metrics).join(', ') || '(keine)'}.`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const capHeight = getCapHeight({ fontSize, fontMetrics });
|
|
76
|
+
return new sass.SassNumber(capHeight);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// camelCase → kebab-case
|
|
82
|
+
function _toKebab(s) {
|
|
83
|
+
return s.replace(/[A-Z]/g, (c) => '-' + c.toLowerCase());
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// JS-Wert (number | string) → Sass-Wert (SassNumber | SassString)
|
|
87
|
+
function _jsValueToSass(value) {
|
|
88
|
+
if (typeof value === 'number') {
|
|
89
|
+
return new sass.SassNumber(value);
|
|
90
|
+
}
|
|
91
|
+
if (typeof value === 'string') {
|
|
92
|
+
const m = value.match(/^(-?\d*\.?\d+)([a-z%]+)$/);
|
|
93
|
+
if (m) {
|
|
94
|
+
return new sass.SassNumber(parseFloat(m[1]), m[2]);
|
|
95
|
+
}
|
|
96
|
+
return new sass.SassString(value, { quotes: false });
|
|
97
|
+
}
|
|
98
|
+
throw new Error(`capsize-pseudo-elements: unerwarteter Wert-Typ ${typeof value}`);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// JS-Objekt {camelCaseKey: value} → Sass-Map (kebab-case-key, SassValue)
|
|
102
|
+
function _objToSassMap(obj) {
|
|
103
|
+
const entries = Object.entries(obj).map(([key, val]) => [
|
|
104
|
+
new sass.SassString(_toKebab(key), { quotes: false }),
|
|
105
|
+
_jsValueToSass(val),
|
|
106
|
+
]);
|
|
107
|
+
return new sass.SassMap(OrderedMap(entries));
|
|
108
|
+
}
|