@profitlich/template-toolkit 3.1.0 → 4.0.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.0.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": {
@@ -20,7 +20,8 @@
20
20
  "./utils/ImagesLoaded": "./utils/images-loaded/ImagesLoaded.js",
21
21
  "./scripts/copy-files": "./scripts/copy-files.js",
22
22
  "./scripts/deploy": "./scripts/deploy.js",
23
- "./vite/jsonToScss": "./vite/jsonToScss.js"
23
+ "./vite/jsonToScss": "./vite/jsonToScss.js",
24
+ "./vite/capsizeSassFunctions": "./vite/capsizeSassFunctions.js"
24
25
  },
25
26
  "files": [
26
27
  "components/",
@@ -40,9 +41,17 @@
40
41
  "lil-gui": "^0.21.0"
41
42
  },
42
43
  "peerDependencies": {
44
+ "@capsizecss/core": ">=4.0.0",
45
+ "@capsizecss/unpack": ">=2.0.0",
43
46
  "@mux/mux-player": ">=3.0.0"
44
47
  },
45
48
  "peerDependenciesMeta": {
49
+ "@capsizecss/core": {
50
+ "optional": true
51
+ },
52
+ "@capsizecss/unpack": {
53
+ "optional": true
54
+ },
46
55
  "@mux/mux-player": {
47
56
  "optional": true
48
57
  }
@@ -4,6 +4,9 @@
4
4
  @use "sass:meta";
5
5
  @use "sass:math";
6
6
 
7
+ // capsize-trims wird ggf. von Vite via preprocessorOptions.scss.functions bereitgestellt
8
+ // (siehe createCapsizeFunctions in vite/capsizeSassFunctions.js).
9
+
7
10
  // Liest das optionale Top-Level Feld `vwBasis` aus der Konsumenten-config.
8
11
  // Default 'viewport' = bisheriges Verhalten (raw vw).
9
12
  // 'body' = calc(var(--vw-body, 1vw) * X) — skaliert mit scrollbar-freier Body-Breite.
@@ -81,13 +84,24 @@ $mediaqueries: (
81
84
 
82
85
 
83
86
  // Font
84
- @mixin font($layout, $fontSize, $lineHeight, $bold:'false') {
87
+ @mixin font($layout, $fontSize, $lineHeight, $capsize: null) {
85
88
 
86
89
  font-size: size($layout, $fontSize);
87
90
  line-height: size($layout, $lineHeight);
88
91
 
89
- @if ($bold != 'false') {
90
- font-weight: $bold;
92
+ @if ($capsize != null) {
93
+ // capsize-pseudo-elements() ist eine Sass-Custom-Function aus dem Toolkit-Vite-Plugin.
94
+ // Ruft intern @capsizecss/core.createStyleObject auf und gibt eine Sass-Map
95
+ // mit allen Pseudo-Element-Stilen zurück. Inhalte (welche Pseudo-Elemente,
96
+ // welche Properties) kommen vollständig aus Capsize.
97
+ $pseudo: capsize-pseudo-elements($capsize, $fontSize, $lineHeight);
98
+ @each $selector-suffix, $props in $pseudo {
99
+ &#{$selector-suffix} {
100
+ @each $prop, $val in $props {
101
+ #{$prop}: $val;
102
+ }
103
+ }
104
+ }
91
105
  }
92
106
 
93
107
  }
@@ -0,0 +1,92 @@
1
+ import { fromFile } from '@capsizecss/unpack';
2
+ import { createStyleObject } 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
+ }
64
+
65
+ // camelCase → kebab-case
66
+ function _toKebab(s) {
67
+ return s.replace(/[A-Z]/g, (c) => '-' + c.toLowerCase());
68
+ }
69
+
70
+ // JS-Wert (number | string) → Sass-Wert (SassNumber | SassString)
71
+ function _jsValueToSass(value) {
72
+ if (typeof value === 'number') {
73
+ return new sass.SassNumber(value);
74
+ }
75
+ if (typeof value === 'string') {
76
+ const m = value.match(/^(-?\d*\.?\d+)([a-z%]+)$/);
77
+ if (m) {
78
+ return new sass.SassNumber(parseFloat(m[1]), m[2]);
79
+ }
80
+ return new sass.SassString(value, { quotes: false });
81
+ }
82
+ throw new Error(`capsize-pseudo-elements: unerwarteter Wert-Typ ${typeof value}`);
83
+ }
84
+
85
+ // JS-Objekt {camelCaseKey: value} → Sass-Map (kebab-case-key, SassValue)
86
+ function _objToSassMap(obj) {
87
+ const entries = Object.entries(obj).map(([key, val]) => [
88
+ new sass.SassString(_toKebab(key), { quotes: false }),
89
+ _jsValueToSass(val),
90
+ ]);
91
+ return new sass.SassMap(OrderedMap(entries));
92
+ }