@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@profitlich/template-toolkit",
3
- "version": "3.1.0",
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
+ }
@@ -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, $bold:'false') {
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 ($bold != 'false') {
90
- font-weight: $bold;
90
+ @if ($capsize != null) {
91
+ @include capsize($capsize, $fontSize, $lineHeight);
91
92
  }
92
93
 
93
94
  }
package/scss/forward.scss CHANGED
@@ -2,3 +2,4 @@
2
2
  @forward "core/mediaqueries";
3
3
  @forward "core/layout";
4
4
  @forward "core/hamburger";
5
+ @forward "core/capsize";
@@ -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
+ }