@nordcraft/runtime 1.0.31 → 1.0.33

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.
Files changed (32) hide show
  1. package/dist/components/createComponent.js +40 -0
  2. package/dist/components/createComponent.js.map +1 -1
  3. package/dist/components/createElement.js +39 -3
  4. package/dist/components/createElement.js.map +1 -1
  5. package/dist/custom-element.main.esm.js +34 -28
  6. package/dist/custom-element.main.esm.js.map +4 -4
  7. package/dist/editor-preview.main.js +19 -0
  8. package/dist/editor-preview.main.js.map +1 -1
  9. package/dist/page.main.esm.js +3 -3
  10. package/dist/page.main.esm.js.map +4 -4
  11. package/dist/styles/CustomPropertyStyleSheet.d.ts +34 -0
  12. package/dist/styles/CustomPropertyStyleSheet.js +109 -0
  13. package/dist/styles/CustomPropertyStyleSheet.js.map +1 -0
  14. package/dist/styles/CustomPropertyStyleSheet.test.d.ts +1 -0
  15. package/dist/styles/CustomPropertyStyleSheet.test.js +66 -0
  16. package/dist/styles/CustomPropertyStyleSheet.test.js.map +1 -0
  17. package/dist/styles/style.js +23 -0
  18. package/dist/styles/style.js.map +1 -1
  19. package/dist/utils/omitStyle.js +3 -1
  20. package/dist/utils/omitStyle.js.map +1 -1
  21. package/dist/utils/subscribeCustomProperty.d.ts +8 -0
  22. package/dist/utils/subscribeCustomProperty.js +9 -0
  23. package/dist/utils/subscribeCustomProperty.js.map +1 -0
  24. package/package.json +3 -3
  25. package/src/components/createComponent.ts +48 -0
  26. package/src/components/createElement.ts +52 -3
  27. package/src/editor-preview.main.ts +27 -0
  28. package/src/styles/CustomPropertyStyleSheet.test.ts +104 -0
  29. package/src/styles/CustomPropertyStyleSheet.ts +163 -0
  30. package/src/styles/style.ts +33 -0
  31. package/src/utils/omitStyle.ts +10 -2
  32. package/src/utils/subscribeCustomProperty.ts +41 -0
@@ -0,0 +1,34 @@
1
+ import type { MediaQuery } from '@nordcraft/core/dist/component/component.types';
2
+ /**
3
+ * CustomPropertyStyleSheet is a utility class that manages CSS custom properties
4
+ * (variables) in a dedicated CSSStyleSheet. It allows for efficient registration,
5
+ * updating, and removal of style properties as fast as setting style properties.
6
+ *
7
+ * It abstracts the complexity of managing CSS rules via. indexing and
8
+ * provides a simple API to register and unregister style properties for specific
9
+ * selectors.
10
+ */
11
+ export declare class CustomPropertyStyleSheet {
12
+ private styleSheet;
13
+ private ruleMap;
14
+ constructor(styleSheet?: CSSStyleSheet | null);
15
+ /**
16
+ * @returns A function to update the property value efficiently.
17
+ */
18
+ registerProperty(selector: string, name: string, options?: {
19
+ mediaQuery?: MediaQuery;
20
+ startingStyle?: boolean;
21
+ }): (newValue: string) => void;
22
+ unregisterProperty(selector: string, name: string, options?: {
23
+ mediaQuery?: MediaQuery;
24
+ startingStyle?: boolean;
25
+ }): void;
26
+ getStyleSheet(): CSSStyleSheet;
27
+ /**
28
+ * Maps all selectors to their rule index. This is used to map the initial
29
+ * SSR style variable values to their selectors.
30
+ */
31
+ private hydrateFromBase;
32
+ private static selectorFromCSSRule;
33
+ private static getFullSelector;
34
+ }
@@ -0,0 +1,109 @@
1
+ /**
2
+ * CustomPropertyStyleSheet is a utility class that manages CSS custom properties
3
+ * (variables) in a dedicated CSSStyleSheet. It allows for efficient registration,
4
+ * updating, and removal of style properties as fast as setting style properties.
5
+ *
6
+ * It abstracts the complexity of managing CSS rules via. indexing and
7
+ * provides a simple API to register and unregister style properties for specific
8
+ * selectors.
9
+ */
10
+ export class CustomPropertyStyleSheet {
11
+ styleSheet;
12
+ // Selector to rule index mapping
13
+ ruleMap;
14
+ constructor(styleSheet) {
15
+ if (styleSheet) {
16
+ this.styleSheet = styleSheet;
17
+ }
18
+ else {
19
+ this.styleSheet = new CSSStyleSheet();
20
+ document.adoptedStyleSheets.push(this.getStyleSheet());
21
+ }
22
+ }
23
+ /**
24
+ * @returns A function to update the property value efficiently.
25
+ */
26
+ registerProperty(selector, name, options) {
27
+ this.ruleMap ??= this.hydrateFromBase();
28
+ const fullSelector = CustomPropertyStyleSheet.getFullSelector(selector, options);
29
+ // Check if the selector already exists
30
+ let rule = this.ruleMap.get(fullSelector);
31
+ if (!rule) {
32
+ const ruleIndex = this.styleSheet.insertRule(fullSelector);
33
+ let newRule = this.styleSheet.cssRules[ruleIndex];
34
+ // We are only interested in the dynamic style, so get the actual style rule, not media or other nested rules. Loop until we are at the bottom most rule.
35
+ while (newRule.cssRules &&
36
+ newRule.cssRules.length > 0) {
37
+ newRule = newRule.cssRules[0];
38
+ }
39
+ rule = newRule;
40
+ this.ruleMap.set(fullSelector, rule);
41
+ }
42
+ return (value) => {
43
+ rule.style.setProperty(name, value);
44
+ };
45
+ }
46
+ unregisterProperty(selector, name, options) {
47
+ if (!this.ruleMap) {
48
+ return;
49
+ }
50
+ const fullSelector = CustomPropertyStyleSheet.getFullSelector(selector, options);
51
+ // We only clean up the property, as we assume that the rule will be reused.
52
+ this.ruleMap.get(fullSelector)?.style.removeProperty(name);
53
+ }
54
+ getStyleSheet() {
55
+ return this.styleSheet;
56
+ }
57
+ /**
58
+ * Maps all selectors to their rule index. This is used to map the initial
59
+ * SSR style variable values to their selectors.
60
+ */
61
+ hydrateFromBase() {
62
+ const ruleIndex = new Map();
63
+ for (let i = 0; i < this.styleSheet.cssRules.length; i++) {
64
+ let rule = this.styleSheet.cssRules[i];
65
+ const selector = CustomPropertyStyleSheet.selectorFromCSSRule(rule);
66
+ // Get last part of the selector, which is the actual selector we are interested in
67
+ while (rule.cssRules &&
68
+ rule.cssRules.length > 0) {
69
+ rule = rule.cssRules[0];
70
+ }
71
+ ruleIndex.set(selector, rule);
72
+ }
73
+ return ruleIndex;
74
+ }
75
+ static selectorFromCSSRule(rule) {
76
+ switch (rule.constructor.name) {
77
+ case 'CSSStyleRule':
78
+ // For these rules, we just return (potentially with subrules if any cssRules exist)
79
+ return `${rule.selectorText} { ${Array.from(rule.cssRules)
80
+ .map(CustomPropertyStyleSheet.selectorFromCSSRule)
81
+ .join(', ')}}`;
82
+ case 'CSSStartingStyleRule':
83
+ return `@starting-style { ${Array.from(rule.cssRules)
84
+ .map(CustomPropertyStyleSheet.selectorFromCSSRule)
85
+ .join(', ')}}`;
86
+ case 'CSSMediaRule':
87
+ return `@media ${rule.media.mediaText} { ${Array.from(rule.cssRules)
88
+ .map(CustomPropertyStyleSheet.selectorFromCSSRule)
89
+ .join(', ')}}`;
90
+ case 'CSSNestedDeclarations':
91
+ return '';
92
+ default:
93
+ // eslint-disable-next-line no-console
94
+ console.warn(`Unsupported CSS rule type: ${rule.constructor.name}. Returning empty selector.`);
95
+ return '';
96
+ }
97
+ }
98
+ static getFullSelector(selector, options) {
99
+ let result = selector + (options?.startingStyle ? ' { @starting-style { }}' : ' { }');
100
+ if (options?.mediaQuery) {
101
+ result = `@media (${Object.entries(options.mediaQuery)
102
+ .map(([key, value]) => `${key}: ${value}`)
103
+ .filter(Boolean)
104
+ .join(') and (')}) { ${result}}`;
105
+ }
106
+ return result;
107
+ }
108
+ }
109
+ //# sourceMappingURL=CustomPropertyStyleSheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomPropertyStyleSheet.js","sourceRoot":"","sources":["../../src/styles/CustomPropertyStyleSheet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,66 @@
1
+ import { describe, expect, test } from 'bun:test';
2
+ import { CustomPropertyStyleSheet } from './CustomPropertyStyleSheet';
3
+ describe('CustomPropertyStyleSheet', () => {
4
+ test('it creates a new stylesheet', () => {
5
+ const instance = new CustomPropertyStyleSheet();
6
+ expect(instance).toBeInstanceOf(CustomPropertyStyleSheet);
7
+ expect(instance.getStyleSheet().cssRules).toHaveLength(0);
8
+ });
9
+ test('it adds a property definition', () => {
10
+ const instance = new CustomPropertyStyleSheet();
11
+ instance.registerProperty('.my-class', '--my-property');
12
+ expect(instance.getStyleSheet().cssRules.length).toBe(1);
13
+ expect(instance.getStyleSheet().cssRules[0].cssText).toBe('.my-class { }');
14
+ });
15
+ test('it puts different selectors in different rules', () => {
16
+ const instance = new CustomPropertyStyleSheet();
17
+ instance.registerProperty('.my-class', '--my-property')('256px');
18
+ instance.registerProperty('.my-other-class', '--my-property')('256px');
19
+ expect(instance.getStyleSheet().cssRules.length).toBe(2);
20
+ expect(instance.getStyleSheet().cssRules[0].cssText).toBe('.my-class { --my-property: 256px; }');
21
+ expect(instance.getStyleSheet().cssRules[1].cssText).toBe('.my-other-class { --my-property: 256px; }');
22
+ });
23
+ test('it can update properties', () => {
24
+ const instance = new CustomPropertyStyleSheet();
25
+ const setter = instance.registerProperty('.my-class', '--my-property');
26
+ setter('256px');
27
+ expect(instance.getStyleSheet().cssRules.length).toBe(1);
28
+ expect(instance.getStyleSheet().cssRules[0].cssText).toBe('.my-class { --my-property: 256px; }');
29
+ setter('inherit');
30
+ expect(instance.getStyleSheet().cssRules[0].cssText).toBe('.my-class { --my-property: inherit; }');
31
+ });
32
+ test('it works with media queries', () => {
33
+ const instance = new CustomPropertyStyleSheet();
34
+ instance.registerProperty('.my-class', '--my-property', {
35
+ mediaQuery: { 'max-width': '600px' },
36
+ })('256px');
37
+ expect(instance.getStyleSheet().cssRules.length).toBe(1);
38
+ expect(instance.getStyleSheet().cssRules[0].cssText).toBe('@media (max-width: 600px) { .my-class { --my-property: 256px; } }');
39
+ });
40
+ test('it unregisters a property', () => {
41
+ const instance = new CustomPropertyStyleSheet();
42
+ const setter = instance.registerProperty('.my-class', '--my-property');
43
+ setter('256px');
44
+ const setter2 = instance.registerProperty('.my-class', '--my-other-property');
45
+ setter2('512px');
46
+ expect(instance.getStyleSheet().cssRules[0].cssText).toBe('.my-class { --my-property: 256px; --my-other-property: 512px; }');
47
+ instance.unregisterProperty('.my-class', '--my-property');
48
+ expect(instance.getStyleSheet().cssRules[0].cssText).toBe('.my-class { --my-other-property: 512px; }');
49
+ instance.unregisterProperty('.my-class', '--my-other-property');
50
+ expect(instance.getStyleSheet().cssRules[0].cssText).toBe('.my-class { }');
51
+ });
52
+ test('it unregisters a property with media queries', () => {
53
+ const instance = new CustomPropertyStyleSheet();
54
+ const setter = instance.registerProperty('.my-class-with-media', '--my-property-with-media', {
55
+ mediaQuery: { 'max-width': '600px' },
56
+ });
57
+ setter('256px');
58
+ expect(instance.getStyleSheet().cssRules.length).toBe(1);
59
+ expect(instance.getStyleSheet().cssRules[0].cssText).toBe('@media (max-width: 600px) { .my-class-with-media { --my-property-with-media: 256px; } }');
60
+ instance.unregisterProperty('.my-class-with-media', '--my-property-with-media', {
61
+ mediaQuery: { 'max-width': '600px' },
62
+ });
63
+ expect(instance.getStyleSheet().cssRules[0].cssText).toBe('@media (max-width: 600px) { .my-class-with-media { } }');
64
+ });
65
+ });
66
+ //# sourceMappingURL=CustomPropertyStyleSheet.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomPropertyStyleSheet.test.js","sourceRoot":"","sources":["../../src/styles/CustomPropertyStyleSheet.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { getClassName, toValidClassName, } from '@nordcraft/core/dist/styling/className';
2
+ import { syntaxNodeToPropertyAtDefinition, } from '@nordcraft/core/dist/styling/customProperty';
2
3
  import { kebabCase } from '@nordcraft/core/dist/styling/style.css';
3
4
  import { variantSelector } from '@nordcraft/core/dist/styling/variantSelector';
4
5
  import { omitKeys } from '@nordcraft/core/dist/utils/collections';
@@ -45,6 +46,7 @@ export const SIZE_PROPERTIES = new Set([
45
46
  'outline-width',
46
47
  ]);
47
48
  export const insertStyles = (parent, root, components) => {
49
+ const registeredCustomProperties = new Map();
48
50
  const getNodeStyles = (node, classHash) => {
49
51
  const style = omitKeys(node.style ?? {}, [
50
52
  'variants',
@@ -104,6 +106,27 @@ ${node.animations
104
106
  })
105
107
  .join('\n')
106
108
  : ''}
109
+ ${[
110
+ ...Object.entries(node.customProperties ?? {}),
111
+ ...(node.variants?.flatMap((variant) => Object.entries(variant.customProperties ?? {})) ?? []),
112
+ ]
113
+ .map(([customPropertyName, customProperty]) => {
114
+ const existingCustomProperty = registeredCustomProperties.get(customPropertyName);
115
+ if (existingCustomProperty) {
116
+ // Warn if the style variable is already registered with a different syntax, as registration is global.
117
+ // The editor should also report an Error-level issue.
118
+ if (existingCustomProperty.type === 'primitive' &&
119
+ customProperty.syntax.type === 'primitive' &&
120
+ existingCustomProperty.name !== customProperty.syntax.name) {
121
+ // eslint-disable-next-line no-console
122
+ console.warn(`Custom property "${customPropertyName}" is already registered with a different syntax: "${existingCustomProperty.name}".`);
123
+ }
124
+ return '';
125
+ }
126
+ registeredCustomProperties.set(customPropertyName, customProperty.syntax);
127
+ return syntaxNodeToPropertyAtDefinition(customPropertyName, customProperty);
128
+ })
129
+ .join('\n')}
107
130
  `));
108
131
  return styleElem;
109
132
  };
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/styles/style.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../../src/styles/style.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,YAAY,EACZ,gBAAgB,GACjB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EACL,gCAAgC,GAEjC,MAAM,6CAA6C,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAA;AAEjE,MAAM,kBAAkB,GAAG;IACzB,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;CACZ,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IACrC,OAAO;IACP,WAAW;IACX,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,YAAY;IACZ,QAAQ;IACR,YAAY;IACZ,aAAa;IACb,eAAe;IACf,cAAc;IACd,SAAS;IACT,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,eAAe;IACf,KAAK;IACL,OAAO;IACP,OAAO;IACP,eAAe;IACf,2BAA2B;IAC3B,4BAA4B;IAC5B,wBAAwB;IACxB,yBAAyB;IACzB,cAAc;IACd,kBAAkB;IAClB,mBAAmB;IACnB,qBAAqB;IACrB,oBAAoB;IACpB,WAAW;IACX,MAAM;IACN,OAAO;IACP,KAAK;IACL,QAAQ;IACR,eAAe;CAChB,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,MAAmB,EACnB,IAAe,EACf,UAAuB,EACvB,EAAE;IACF,MAAM,0BAA0B,GAAG,IAAI,GAAG,EAAyB,CAAA;IACnE,MAAM,aAAa,GAAG,CACpB,IAA2C,EAC3C,SAAiB,EACjB,EAAE;QACF,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE;YACvC,UAAU;YACV,aAAa;YACb,YAAY;YACZ,SAAS;SACV,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QACjD,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;QAC9C,SAAS,CAAC,WAAW,CACnB,QAAQ,CAAC,cAAc,CAAC;MACxB,aAAa,CAAC,GAAG,GAAG,SAAS,EAAE,KAAK,CAAC;;EAGzC,IAAI,CAAC,QAAQ;YACX,CAAC,CAAC,IAAI,CAAC,QAAQ;iBACV,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;gBACf,MAAM,QAAQ,GAAG,IAAI,SAAS,GAAG,eAAe,CAAC,OAAO,CAAC,EAAE,CAAA;gBAC3D,MAAM,eAAe,GAAG,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE;oBAC7D,aAAa,EAAE,OAAO,CAAC,aAAa;iBACrC,CAAC,CAAA;gBACF,OAAO,OAAO,CAAC,UAAU;oBACvB,CAAC,CAAC;0BACY,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;yBACzC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC;yBACzC,MAAM,CAAC,OAAO,CAAC;yBACf,IAAI,CAAC,SAAS,CAAC;kBAChB,eAAe;;iBAEhB;oBACL,CAAC,CAAC,OAAO,CAAC,UAAU;wBAClB,CAAC,CAAC;qCAEE,kBAAkB,CAAC,OAAO,CAAC,UAAU,CACvC;kBACE,eAAe;;iBAEhB;wBACH,CAAC,CAAC,eAAe,CAAA;YACvB,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC;YACf,CAAC,CAAC,EACN;;EAGE,IAAI,CAAC,UAAU;YACb,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;iBAC5B,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,EAAE,EAAE;gBAClC,OAAO;uBACM,aAAa;cACtB,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;qBACvB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;qBACvC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;oBAChC,OAAO;kBACL,QAAQ,GAAG,GAAG;oBACZ,GAAG,KAAK,KAAK;;iBAEhB,CAAA;gBACH,CAAC,CAAC;qBACD,IAAI,CAAC,IAAI,CAAC;;WAEd,CAAA;YACH,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC;YACf,CAAC,CAAC,EACN;EACE;YACA,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;YAC9C,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACrC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAC/C,IAAI,EAAE,CAAC;SACT;aACE,GAAG,CAAC,CAAC,CAAC,kBAAkB,EAAE,cAAc,CAAC,EAAE,EAAE;YAC5C,MAAM,sBAAsB,GAC1B,0BAA0B,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;YACpD,IAAI,sBAAsB,EAAE,CAAC;gBAC3B,uGAAuG;gBACvG,sDAAsD;gBACtD,IACE,sBAAsB,CAAC,IAAI,KAAK,WAAW;oBAC3C,cAAc,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW;oBAC1C,sBAAsB,CAAC,IAAI,KAAK,cAAc,CAAC,MAAM,CAAC,IAAI,EAC1D,CAAC;oBACD,sCAAsC;oBACtC,OAAO,CAAC,IAAI,CACV,oBAAoB,kBAAkB,qDAAqD,sBAAsB,CAAC,IAAI,IAAI,CAC3H,CAAA;gBACH,CAAC;gBACD,OAAO,EAAE,CAAA;YACX,CAAC;YACD,0BAA0B,CAAC,GAAG,CAAC,kBAAkB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAA;YACzE,OAAO,gCAAgC,CAAC,kBAAkB,EAAE,cAAc,CAAC,CAAA;QAC7E,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC;GACV,CAAC,CACC,CAAA;QACD,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IAED,wGAAwG;IACxG,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAA;IAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAA;IAC5C,SAAS,qBAAqB,CAC5B,SAAoB,EACpB,YAAgC;QAEhC,IAAI,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,OAAM;QACR,CAAC;QACD,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;QACrC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACrB,sCAAsC;YACtC,OAAO,CAAC,IAAI,CAAC,oCAAoC,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;YAClE,OAAM;QACR,CAAC;QACD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE;YACrD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC9B,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CACpC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI;oBACN,CAAC,IAAI,CAAC,OAAO,IAAI,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC;wBACvC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;yBACjB,IAAI,CAAC,GAAG,CAAC,CACf,CAAA;gBACD,IAAI,cAAc,EAAE,CAAC;oBACnB,qBAAqB,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,IAAI,YAAY,CAAC,CAAA;oBAEnE,MAAM,iBAAiB,GAAG,gBAAgB,CACxC,GAAG,SAAS,CAAC,IAAI,IAAI,EAAE,EAAE,EACzB,IAAI,CACL,CAAA;oBACD,SAAS,CAAC,GAAG,CACX,iBAAiB,EACjB,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CACvC,CAAA;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACnC,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA;gBAC3D,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAA;YAC1D,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,qBAAqB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAEtC,qBAAqB;IACrB,mFAAmF;IACnF,MAAM,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;IAEvE,iBAAiB;IACjB,MAAM,QAAQ,GAAG,QAAQ,CAAC,sBAAsB,EAAE,CAAA;IAClD,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IACF,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;AAC9B,CAAC,CAAA;AAED,MAAM,aAAa,GAAG,CACpB,QAAgB,EAChB,KAAqB,EACrB,OAEC,EACD,EAAE;IACF,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAClD,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,iBAAiB,CACrC,CAAA;IAED,IAAI,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;IAC9B,IAAI,OAAO,EAAE,aAAa,EAAE,CAAC;QAC3B,MAAM,GAAG;QACL,MAAM;MACR,CAAA;IACJ,CAAC;IAED,OAAO;IACL,QAAQ;MACN,MAAM;;EAGV,eAAe,CAAC,MAAM,GAAG,CAAC;QACxB,CAAC,CAAC;IACF,QAAQ;MACN,eAAe;aACd,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE;YAClB,QAAQ,KAAK,EAAE,CAAC;gBACd,KAAK,MAAM;oBACT,OAAO,WAAW,CAAA;gBACpB,KAAK,MAAM;oBACT,OAAO,YAAY,CAAA;gBACrB;oBACE,OAAO,EAAE,CAAA;YACb,CAAC;QACH,CAAC,CAAC;aACD,IAAI,CAAC,IAAI,CAAC;;CAEhB;QACG,CAAC,CAAC,EACN;CACC,CAAA;AACD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAqB,EAAE,EAAE;IAClD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACzB,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE;QACzB,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;QACxC,MAAM,aAAa,GACjB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC;YACvC,eAAe,CAAC,GAAG,CAAC,YAAY,CAAC;YAC/B,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI;YAC1B,CAAC,CAAC,KAAK,CAAA;QACX,OAAO,GAAG,YAAY,IAAI,aAAa,GAAG,CAAA;IAC5C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC,CAAA"}
@@ -4,8 +4,10 @@ export function omitSubnodeStyleForComponent(component) {
4
4
  if ((node.type === 'element' || node.type === 'component') &&
5
5
  nodeId !== 'root') {
6
6
  delete node.style;
7
- delete node.variants;
8
7
  delete node.animations;
8
+ node.variants = node.variants?.map(({ customProperties }) => ({
9
+ customProperties,
10
+ }));
9
11
  }
10
12
  });
11
13
  return clone;
@@ -1 +1 @@
1
- {"version":3,"file":"omitStyle.js","sourceRoot":"","sources":["../../src/utils/omitStyle.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,4BAA4B,CAC1C,SAAY;IAEZ,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;IACxC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;QAC5D,IACE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;YACtD,MAAM,KAAK,MAAM,EACjB,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAA;YACjB,OAAO,IAAI,CAAC,QAAQ,CAAA;YACpB,OAAO,IAAI,CAAC,UAAU,CAAA;QACxB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"omitStyle.js","sourceRoot":"","sources":["../../src/utils/omitStyle.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,4BAA4B,CAC1C,SAAY;IAEZ,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,CAAA;IACxC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;QAC5D,IACE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;YACtD,MAAM,KAAK,MAAM,EACjB,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAA;YACjB,OAAO,IAAI,CAAC,UAAU,CAAA;YACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAChC,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,CACvB,CAAC;gBACC,gBAAgB;aACjB,CAAiB,CACrB,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { StyleVariant } from '@nordcraft/core/dist/component/component.types';
2
+ import type { Signal } from '../signal/signal';
3
+ export declare function subscribeCustomProperty({ selector, customPropertyName, signal, variant, }: {
4
+ selector: string;
5
+ customPropertyName: string;
6
+ signal: Signal<string>;
7
+ variant?: StyleVariant;
8
+ }): void;
@@ -0,0 +1,9 @@
1
+ import { CUSTOM_PROPERTIES_STYLESHEET_ID } from '@nordcraft/core/dist/styling/theme.const';
2
+ import { CustomPropertyStyleSheet } from '../styles/CustomPropertyStyleSheet';
3
+ const CUSTOM_PROPERTIES_STYLESHEET = new CustomPropertyStyleSheet(document.getElementById(CUSTOM_PROPERTIES_STYLESHEET_ID)?.sheet);
4
+ export function subscribeCustomProperty({ selector, customPropertyName, signal, variant, }) {
5
+ signal.subscribe(CUSTOM_PROPERTIES_STYLESHEET.registerProperty(selector, customPropertyName, variant), {
6
+ destroy: () => CUSTOM_PROPERTIES_STYLESHEET.unregisterProperty(selector, customPropertyName, variant),
7
+ });
8
+ }
9
+ //# sourceMappingURL=subscribeCustomProperty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscribeCustomProperty.js","sourceRoot":"","sources":["../../src/utils/subscribeCustomProperty.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAA;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AAE7E,MAAM,4BAA4B,GAAG,IAAI,wBAAwB,CAE7D,QAAQ,CAAC,cAAc,CAAC,+BAA+B,CAGxD,EAAE,KAAK,CACT,CAAA;AAED,MAAM,UAAU,uBAAuB,CAAC,EACtC,QAAQ,EACR,kBAAkB,EAClB,MAAM,EACN,OAAO,GAMR;IACC,MAAM,CAAC,SAAS,CACd,4BAA4B,CAAC,gBAAgB,CAC3C,QAAQ,EACR,kBAAkB,EAClB,OAAO,CACR,EACD;QACE,OAAO,EAAE,GAAG,EAAE,CACZ,4BAA4B,CAAC,kBAAkB,CAC7C,QAAQ,EACR,kBAAkB,EAClB,OAAO,CACR;KACJ,CACF,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -4,8 +4,8 @@
4
4
  "type": "module",
5
5
  "homepage": "https://github.com/nordcraftengine/nordcraft",
6
6
  "dependencies": {
7
- "@nordcraft/core": "1.0.31",
8
- "@nordcraft/std-lib": "1.0.31",
7
+ "@nordcraft/core": "1.0.33",
8
+ "@nordcraft/std-lib": "1.0.33",
9
9
  "fast-deep-equal": "3.1.3",
10
10
  "path-to-regexp": "6.3.0"
11
11
  },
@@ -21,5 +21,5 @@
21
21
  "files": ["dist", "src"],
22
22
  "main": "dist/page.main.js",
23
23
  "types": "dist/page.main.d.ts",
24
- "version": "1.0.31"
24
+ "version": "1.0.33"
25
25
  }
@@ -6,6 +6,7 @@ import type {
6
6
  } from '@nordcraft/core/dist/component/component.types'
7
7
  import { applyFormula } from '@nordcraft/core/dist/formula/formula'
8
8
  import { mapObject } from '@nordcraft/core/dist/utils/collections'
9
+ import { getNodeSelector } from '@nordcraft/core/dist/utils/getNodeSelector'
9
10
  import { isDefined } from '@nordcraft/core/dist/utils/util'
10
11
  import { isContextApiV2 } from '../api/apiUtils'
11
12
  import { createLegacyAPI } from '../api/createAPI'
@@ -18,6 +19,7 @@ import type { Signal } from '../signal/signal'
18
19
  import { signal } from '../signal/signal'
19
20
  import type { ComponentChild, ComponentContext, ContextApi } from '../types'
20
21
  import { createFormulaCache } from '../utils/createFormulaCache'
22
+ import { subscribeCustomProperty } from '../utils/subscribeCustomProperty'
21
23
  import { renderComponent } from './renderComponent'
22
24
 
23
25
  export type RenderComponentNodeProps = {
@@ -68,6 +70,52 @@ export function createComponent({
68
70
  : value?.value,
69
71
  ])
70
72
  })
73
+ Object.entries(node.customProperties ?? {}).forEach(
74
+ ([customPropertyName, customProperty]) =>
75
+ subscribeCustomProperty({
76
+ selector: getNodeSelector(path, {
77
+ componentName: ctx.component.name,
78
+ nodeId: node.id,
79
+ }),
80
+ signal: dataSignal.map((data) => {
81
+ return applyFormula(customProperty.formula, {
82
+ data,
83
+ component: ctx.component,
84
+ formulaCache: ctx.formulaCache,
85
+ root: ctx.root,
86
+ package: ctx.package,
87
+ toddle: ctx.toddle,
88
+ env: ctx.env,
89
+ })
90
+ }),
91
+ customPropertyName,
92
+ }),
93
+ )
94
+ node.variants?.forEach((variant) => {
95
+ Object.entries(variant.customProperties ?? {}).forEach(
96
+ ([customPropertyName, customProperty]) =>
97
+ subscribeCustomProperty({
98
+ selector: getNodeSelector(path, {
99
+ componentName: ctx.component.name,
100
+ nodeId: node.id,
101
+ variant,
102
+ }),
103
+ signal: dataSignal.map((data) =>
104
+ applyFormula(customProperty.formula, {
105
+ data,
106
+ component: ctx.component,
107
+ formulaCache: ctx.formulaCache,
108
+ root: ctx.root,
109
+ package: ctx.package,
110
+ toddle: ctx.toddle,
111
+ env: ctx.env,
112
+ }),
113
+ ),
114
+ customPropertyName,
115
+ variant,
116
+ }),
117
+ )
118
+ })
71
119
 
72
120
  const componentDataSignal = signal<ComponentData>({
73
121
  Location: dataSignal.get().Location,
@@ -8,12 +8,14 @@ import {
8
8
  getClassName,
9
9
  toValidClassName,
10
10
  } from '@nordcraft/core/dist/styling/className'
11
+ import { getNodeSelector } from '@nordcraft/core/dist/utils/getNodeSelector'
11
12
  import { isDefined, toBoolean } from '@nordcraft/core/dist/utils/util'
12
13
  import { handleAction } from '../events/handleAction'
13
14
  import type { Signal } from '../signal/signal'
14
15
  import { getDragData } from '../utils/getDragData'
15
16
  import { getElementTagName } from '../utils/getElementTagName'
16
17
  import { setAttribute } from '../utils/setAttribute'
18
+ import { subscribeCustomProperty } from '../utils/subscribeCustomProperty'
17
19
  import type { NodeRenderer } from './createNode'
18
20
  import { createNode } from './createNode'
19
21
 
@@ -130,8 +132,9 @@ export function createElement({
130
132
  setupAttribute()
131
133
  }
132
134
  })
133
- node['style-variables']?.forEach(({ formula, name, unit }) => {
134
- const sig = dataSignal.map((data) => {
135
+ node['style-variables']?.forEach((styleVariable) => {
136
+ const { name, formula, unit } = styleVariable
137
+ const signal = dataSignal.map((data) => {
135
138
  const value = applyFormula(formula, {
136
139
  data,
137
140
  component: ctx.component,
@@ -143,8 +146,54 @@ export function createElement({
143
146
  })
144
147
  return unit ? value + unit : value
145
148
  })
146
- sig.subscribe((value) => elem.style.setProperty(`--${name}`, value))
149
+
150
+ signal.subscribe((value) => elem.style.setProperty(`--${name}`, value))
147
151
  })
152
+
153
+ Object.entries(node.customProperties ?? {}).forEach(
154
+ ([customPropertyName, { formula }]) =>
155
+ subscribeCustomProperty({
156
+ customPropertyName,
157
+ selector: getNodeSelector(path),
158
+ signal: dataSignal.map((data) =>
159
+ applyFormula(formula, {
160
+ data,
161
+ component: ctx.component,
162
+ formulaCache: ctx.formulaCache,
163
+ root: ctx.root,
164
+ package: ctx.package,
165
+ toddle: ctx.toddle,
166
+ env: ctx.env,
167
+ }),
168
+ ),
169
+ }),
170
+ )
171
+
172
+ node.variants?.forEach((variant) => {
173
+ Object.entries(variant.customProperties ?? {}).forEach(
174
+ ([customPropertyName, { formula }]) => {
175
+ subscribeCustomProperty({
176
+ customPropertyName,
177
+ selector: getNodeSelector(path, {
178
+ variant,
179
+ }),
180
+ variant,
181
+ signal: dataSignal.map((data) =>
182
+ applyFormula(formula, {
183
+ data,
184
+ component: ctx.component,
185
+ formulaCache: ctx.formulaCache,
186
+ root: ctx.root,
187
+ package: ctx.package,
188
+ toddle: ctx.toddle,
189
+ env: ctx.env,
190
+ }),
191
+ ),
192
+ })
193
+ },
194
+ )
195
+ })
196
+
148
197
  Object.values(node.events).forEach((event) => {
149
198
  const handler = (e: Event) => {
150
199
  event.actions.forEach((action) => {
@@ -8,6 +8,7 @@ import type {
8
8
  Component,
9
9
  ComponentData,
10
10
  MetaEntry,
11
+ StyleVariant,
11
12
  } from '@nordcraft/core/dist/component/component.types'
12
13
  import { isPageComponent } from '@nordcraft/core/dist/component/isPageComponent'
13
14
  import type {
@@ -1058,6 +1059,27 @@ export const createRoot = (
1058
1059
  ] ?? { style: {} }
1059
1060
  // Add a style element specific to the selected element which
1060
1061
  // is only applied when the preview is in design mode
1062
+ const styleVariantCustomProperties = Object.entries(
1063
+ (selectedStyleVariant as StyleVariant).customProperties ?? {},
1064
+ )
1065
+ .map(([customPropertyName, customProperty]) => ({
1066
+ name: customPropertyName,
1067
+ value: applyFormula(customProperty.formula, {
1068
+ data: {
1069
+ Attributes: dataSignal.get().Attributes,
1070
+ Variables: dataSignal.get().Variables,
1071
+ Contexts: ctxDataSignal?.get().Contexts ?? {},
1072
+ },
1073
+ component: getCurrentComponent(),
1074
+ root: ctx?.root,
1075
+ formulaCache: {},
1076
+ package: ctx?.package,
1077
+ toddle: window.toddle,
1078
+ env,
1079
+ } as FormulaContext),
1080
+ }))
1081
+ .filter(({ value }) => value !== undefined)
1082
+
1061
1083
  const styleElem = document.createElement('style')
1062
1084
  styleElem.setAttribute('data-hash', selectedNodeId)
1063
1085
  styleElem.appendChild(
@@ -1066,6 +1088,11 @@ export const createRoot = (
1066
1088
  ${styleToCss({
1067
1089
  ...nodeLookup.node.style,
1068
1090
  ...selectedStyleVariant.style,
1091
+ ...Object.fromEntries(
1092
+ styleVariantCustomProperties.map(
1093
+ ({ name, value }) => [name, value],
1094
+ ),
1095
+ ),
1069
1096
  })}
1070
1097
  }
1071
1098
  `),