@praxisjs/css 0.3.4 → 0.3.6

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 (146) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/builder/css-builder.d.ts.map +1 -1
  3. package/dist/builder/css-builder.js +68 -74
  4. package/dist/builder/css-builder.js.map +1 -1
  5. package/dist/builder/keyframes.d.ts +5 -0
  6. package/dist/builder/keyframes.d.ts.map +1 -1
  7. package/dist/builder/keyframes.js +12 -14
  8. package/dist/builder/keyframes.js.map +1 -1
  9. package/dist/cx.d.ts.map +1 -1
  10. package/dist/cx.js +23 -18
  11. package/dist/cx.js.map +1 -1
  12. package/dist/decorators/param.d.ts +1 -2
  13. package/dist/decorators/param.d.ts.map +1 -1
  14. package/dist/decorators/param.js +9 -17
  15. package/dist/decorators/param.js.map +1 -1
  16. package/dist/decorators/style.d.ts.map +1 -1
  17. package/dist/decorators/style.js +61 -33
  18. package/dist/decorators/style.js.map +1 -1
  19. package/dist/decorators/styled.d.ts.map +1 -1
  20. package/dist/decorators/styled.js +112 -95
  21. package/dist/decorators/styled.js.map +1 -1
  22. package/dist/extract.d.ts.map +1 -1
  23. package/dist/extract.js +19 -35
  24. package/dist/extract.js.map +1 -1
  25. package/dist/global.d.ts +3 -0
  26. package/dist/global.d.ts.map +1 -1
  27. package/dist/global.js +9 -4
  28. package/dist/global.js.map +1 -1
  29. package/dist/internal/kebab.d.ts +5 -0
  30. package/dist/internal/kebab.d.ts.map +1 -0
  31. package/dist/internal/kebab.js +23 -0
  32. package/dist/internal/kebab.js.map +1 -0
  33. package/dist/internal/lifecycle.d.ts +15 -0
  34. package/dist/internal/lifecycle.d.ts.map +1 -0
  35. package/dist/internal/lifecycle.js +16 -0
  36. package/dist/internal/lifecycle.js.map +1 -0
  37. package/dist/internal/registry.d.ts +5 -1
  38. package/dist/internal/registry.d.ts.map +1 -1
  39. package/dist/internal/registry.js +9 -23
  40. package/dist/internal/registry.js.map +1 -1
  41. package/dist/internal/sheet.d.ts +20 -0
  42. package/dist/internal/sheet.d.ts.map +1 -0
  43. package/dist/internal/sheet.js +56 -0
  44. package/dist/internal/sheet.js.map +1 -0
  45. package/dist/internal/static-mode.d.ts +2 -0
  46. package/dist/internal/static-mode.d.ts.map +1 -0
  47. package/dist/internal/static-mode.js +2 -0
  48. package/dist/internal/static-mode.js.map +1 -0
  49. package/dist/preflight.d.ts +3 -1
  50. package/dist/preflight.d.ts.map +1 -1
  51. package/dist/preflight.js +7 -3
  52. package/dist/preflight.js.map +1 -1
  53. package/dist/tokens/decorators.d.ts.map +1 -1
  54. package/dist/tokens/decorators.js +13 -4
  55. package/dist/tokens/decorators.js.map +1 -1
  56. package/dist/tokens/theme-instance.d.ts +5 -0
  57. package/dist/tokens/theme-instance.d.ts.map +1 -1
  58. package/dist/tokens/theme-instance.js +25 -17
  59. package/dist/tokens/theme-instance.js.map +1 -1
  60. package/dist/tokens/token-sheet.d.ts.map +1 -1
  61. package/dist/tokens/token-sheet.js +12 -9
  62. package/dist/tokens/token-sheet.js.map +1 -1
  63. package/package.json +13 -5
  64. package/src/builder/css-builder.ts +79 -83
  65. package/src/builder/keyframes.ts +12 -20
  66. package/src/cx.ts +20 -13
  67. package/src/decorators/param.ts +12 -16
  68. package/src/decorators/style.ts +79 -35
  69. package/src/decorators/styled.ts +127 -111
  70. package/src/extract.ts +18 -34
  71. package/src/global.ts +10 -9
  72. package/src/internal/kebab.ts +23 -0
  73. package/src/internal/lifecycle.ts +21 -0
  74. package/src/internal/registry.ts +9 -35
  75. package/src/internal/sheet.ts +71 -0
  76. package/src/internal/static-mode.ts +6 -0
  77. package/src/preflight.ts +8 -3
  78. package/src/tokens/decorators.ts +15 -3
  79. package/src/tokens/theme-instance.ts +26 -16
  80. package/src/tokens/token-sheet.ts +12 -12
  81. package/dist/__tests__/css-builder.test.d.ts +0 -2
  82. package/dist/__tests__/css-builder.test.d.ts.map +0 -1
  83. package/dist/__tests__/css-builder.test.js +0 -198
  84. package/dist/__tests__/css-builder.test.js.map +0 -1
  85. package/dist/__tests__/cx.test.d.ts +0 -2
  86. package/dist/__tests__/cx.test.d.ts.map +0 -1
  87. package/dist/__tests__/cx.test.js +0 -47
  88. package/dist/__tests__/cx.test.js.map +0 -1
  89. package/dist/__tests__/decorators.test.d.ts +0 -2
  90. package/dist/__tests__/decorators.test.d.ts.map +0 -1
  91. package/dist/__tests__/decorators.test.js +0 -264
  92. package/dist/__tests__/decorators.test.js.map +0 -1
  93. package/dist/__tests__/extract.test.d.ts +0 -2
  94. package/dist/__tests__/extract.test.d.ts.map +0 -1
  95. package/dist/__tests__/extract.test.js +0 -416
  96. package/dist/__tests__/extract.test.js.map +0 -1
  97. package/dist/__tests__/global.test.d.ts +0 -2
  98. package/dist/__tests__/global.test.d.ts.map +0 -1
  99. package/dist/__tests__/global.test.js +0 -136
  100. package/dist/__tests__/global.test.js.map +0 -1
  101. package/dist/__tests__/keyframes.test.d.ts +0 -2
  102. package/dist/__tests__/keyframes.test.d.ts.map +0 -1
  103. package/dist/__tests__/keyframes.test.js +0 -90
  104. package/dist/__tests__/keyframes.test.js.map +0 -1
  105. package/dist/__tests__/preflight.test.d.ts +0 -2
  106. package/dist/__tests__/preflight.test.d.ts.map +0 -1
  107. package/dist/__tests__/preflight.test.js +0 -74
  108. package/dist/__tests__/preflight.test.js.map +0 -1
  109. package/dist/__tests__/registry.test.d.ts +0 -2
  110. package/dist/__tests__/registry.test.d.ts.map +0 -1
  111. package/dist/__tests__/registry.test.js +0 -132
  112. package/dist/__tests__/registry.test.js.map +0 -1
  113. package/dist/__tests__/style.test.d.ts +0 -2
  114. package/dist/__tests__/style.test.d.ts.map +0 -1
  115. package/dist/__tests__/style.test.js +0 -281
  116. package/dist/__tests__/style.test.js.map +0 -1
  117. package/dist/__tests__/styled.test.d.ts +0 -2
  118. package/dist/__tests__/styled.test.d.ts.map +0 -1
  119. package/dist/__tests__/styled.test.js +0 -904
  120. package/dist/__tests__/styled.test.js.map +0 -1
  121. package/dist/__tests__/theme-instance.test.d.ts +0 -2
  122. package/dist/__tests__/theme-instance.test.d.ts.map +0 -1
  123. package/dist/__tests__/theme-instance.test.js +0 -309
  124. package/dist/__tests__/theme-instance.test.js.map +0 -1
  125. package/dist/__tests__/theme-uninit.test.d.ts +0 -2
  126. package/dist/__tests__/theme-uninit.test.d.ts.map +0 -1
  127. package/dist/__tests__/theme-uninit.test.js +0 -10
  128. package/dist/__tests__/theme-uninit.test.js.map +0 -1
  129. package/dist/__tests__/token-sheet.test.d.ts +0 -2
  130. package/dist/__tests__/token-sheet.test.d.ts.map +0 -1
  131. package/dist/__tests__/token-sheet.test.js +0 -74
  132. package/dist/__tests__/token-sheet.test.js.map +0 -1
  133. package/src/__tests__/css-builder.test.ts +0 -230
  134. package/src/__tests__/cx.test.ts +0 -63
  135. package/src/__tests__/decorators.test.ts +0 -127
  136. package/src/__tests__/extract.test.ts +0 -459
  137. package/src/__tests__/global.test.ts +0 -163
  138. package/src/__tests__/keyframes.test.ts +0 -103
  139. package/src/__tests__/preflight.test.ts +0 -85
  140. package/src/__tests__/registry.test.ts +0 -151
  141. package/src/__tests__/style.test.ts +0 -170
  142. package/src/__tests__/styled.test.ts +0 -443
  143. package/src/__tests__/theme-instance.test.ts +0 -374
  144. package/src/__tests__/theme-uninit.test.ts +0 -12
  145. package/src/__tests__/token-sheet.test.ts +0 -87
  146. package/tsconfig.json +0 -8
@@ -1,90 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
- import { keyframes } from "../builder/keyframes";
4
- import { createCollector, setCollector } from "../internal/collector";
5
- beforeEach(() => {
6
- document.head.querySelectorAll("style[data-praxis-keyframes]").forEach((el) => el.remove());
7
- setCollector(null);
8
- });
9
- afterEach(() => {
10
- document.head.querySelectorAll("style[data-praxis-keyframes]").forEach((el) => el.remove());
11
- setCollector(null);
12
- });
13
- describe("keyframes()", () => {
14
- it("injects a @keyframes style element into document.head", () => {
15
- keyframes("pulse", { from: { opacity: 1 }, to: { opacity: 0.4 } });
16
- const el = document.head.querySelector("style[data-praxis-keyframes]");
17
- expect(el).not.toBeNull();
18
- expect(el?.textContent).toContain("@keyframes prx-pulse-");
19
- expect(el?.textContent).toContain("from");
20
- expect(el?.textContent).toContain("opacity: 1;");
21
- expect(el?.textContent).toContain("opacity: 0.4;");
22
- });
23
- it("returns a scoped animation name prefixed with prx-<name>-", () => {
24
- const name = keyframes("spin", { from: { transform: "rotate(0deg)" }, to: { transform: "rotate(360deg)" } });
25
- expect(name).toMatch(/^prx-spin-/);
26
- });
27
- it("injects only once for identical keyframes (content-hashed)", () => {
28
- const stops = { from: { opacity: 1 }, to: { opacity: 0 } };
29
- keyframes("fade", stops);
30
- keyframes("fade", stops);
31
- expect(document.head.querySelectorAll("style[data-praxis-keyframes]").length).toBe(1);
32
- });
33
- it("returns the same scoped name for identical frames", () => {
34
- const stops = { from: { opacity: 0 }, to: { opacity: 1 } };
35
- const a = keyframes("fadeIn", stops);
36
- const b = keyframes("fadeIn", stops);
37
- expect(a).toBe(b);
38
- });
39
- it("returns different names for different frames even with same animation name", () => {
40
- const a = keyframes("anim", { from: { opacity: 0 }, to: { opacity: 1 } });
41
- const b = keyframes("anim", { from: { opacity: 1 }, to: { opacity: 0 } });
42
- expect(a).not.toBe(b);
43
- });
44
- it("converts camelCase frame properties to kebab-case in the output", () => {
45
- keyframes("slide", { from: { translateX: "0" }, to: { translateX: "100px" } });
46
- const el = document.head.querySelector("style[data-praxis-keyframes]");
47
- expect(el?.textContent).toContain("translate-x:");
48
- });
49
- it("supports percentage stops", () => {
50
- keyframes("bounce", { "0%": { transform: "scale(1)" }, "50%": { transform: "scale(1.1)" }, "100%": { transform: "scale(1)" } });
51
- const el = document.head.querySelector("style[data-praxis-keyframes]");
52
- expect(el?.textContent).toContain("0%");
53
- expect(el?.textContent).toContain("50%");
54
- expect(el?.textContent).toContain("100%");
55
- });
56
- });
57
- describe("keyframes — collector mode", () => {
58
- it("routes to collector when one is active (no DOM injection)", () => {
59
- const col = createCollector();
60
- setCollector(col);
61
- const name = keyframes("float", { from: { opacity: 0 }, to: { opacity: 1 } });
62
- expect(document.head.querySelector("style[data-praxis-keyframes]")).toBeNull();
63
- expect(col.getCSS()).toContain(`@keyframes ${name}`);
64
- expect(col.getCSS()).toContain("opacity: 0;");
65
- });
66
- it("deduplicates identical keyframes in the collector", () => {
67
- const col = createCollector();
68
- setCollector(col);
69
- const stops = { from: { opacity: 0 }, to: { opacity: 1 } };
70
- keyframes("same", stops);
71
- keyframes("same", stops);
72
- expect(col.getCSS().split("@keyframes").length - 1).toBe(1);
73
- });
74
- });
75
- // ─── STATIC_MODE ──────────────────────────────────────────────────────────────
76
- describe("keyframes() — static mode (__PRAXIS_CSS_STATIC__)", () => {
77
- afterEach(() => {
78
- vi.unstubAllGlobals();
79
- vi.resetModules();
80
- });
81
- it("returns the scoped name without DOM injection when __PRAXIS_CSS_STATIC__ is true", async () => {
82
- vi.stubGlobal("__PRAXIS_CSS_STATIC__", true);
83
- vi.resetModules();
84
- const { keyframes: staticKF } = await import("../builder/keyframes");
85
- const name = staticKF("pulse", { from: { opacity: 1 }, to: { opacity: 0 } });
86
- expect(name).toMatch(/^prx-pulse-/);
87
- expect(document.head.querySelector("style[data-praxis-keyframes]")).toBeNull();
88
- });
89
- });
90
- //# sourceMappingURL=keyframes.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keyframes.test.js","sourceRoot":"","sources":["../../src/__tests__/keyframes.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=preflight.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preflight.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/preflight.test.ts"],"names":[],"mappings":""}
@@ -1,74 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
- // The preflight CSS is a fixed string, so globalStyle's module-level injected Set
4
- // remembers it across tests. Reset modules in beforeEach to get a fresh Set each time.
5
- function cleanup() {
6
- document.head.querySelectorAll("style[data-praxis-global]").forEach((el) => el.remove());
7
- }
8
- beforeEach(() => {
9
- vi.resetModules();
10
- cleanup();
11
- });
12
- afterEach(() => {
13
- cleanup();
14
- vi.resetModules();
15
- });
16
- describe("preflight()", () => {
17
- it("injects a style element into document.head", async () => {
18
- const { preflight } = await import("../preflight.js");
19
- preflight();
20
- expect(document.head.querySelector("style[data-praxis-global]")).not.toBeNull();
21
- });
22
- it("contains core reset rules", async () => {
23
- const { preflight } = await import("../preflight.js");
24
- preflight();
25
- const css = document.head.querySelector("style[data-praxis-global]")?.textContent ?? "";
26
- expect(css).toContain("box-sizing: border-box");
27
- expect(css).toContain("margin: 0");
28
- expect(css).toContain("padding: 0");
29
- });
30
- it("uses standard font stacks without --theme() references", async () => {
31
- const { preflight } = await import("../preflight.js");
32
- preflight();
33
- const css = document.head.querySelector("style[data-praxis-global]")?.textContent ?? "";
34
- expect(css).toContain("ui-sans-serif");
35
- expect(css).toContain("ui-monospace");
36
- expect(css).not.toContain("--theme(");
37
- });
38
- it("is idempotent — calling twice injects only once", async () => {
39
- const { preflight } = await import("../preflight.js");
40
- preflight();
41
- preflight();
42
- expect(document.head.querySelectorAll("style[data-praxis-global]").length).toBe(1);
43
- });
44
- it("routes through the collector when one is active", async () => {
45
- const { setCollector, createCollector } = await import("../internal/collector.js");
46
- const { preflight } = await import("../preflight.js");
47
- const col = createCollector();
48
- setCollector(col);
49
- preflight();
50
- setCollector(null);
51
- expect(document.head.querySelector("style[data-praxis-global]")).toBeNull();
52
- expect(col.getCSS()).toContain("box-sizing: border-box");
53
- });
54
- it("wraps the reset in `@layer reset` by default", async () => {
55
- const { preflight } = await import("../preflight.js");
56
- preflight();
57
- const css = document.head.querySelector("style[data-praxis-global]")?.textContent ?? "";
58
- expect(css).toContain("@layer reset {");
59
- expect(css).toContain("box-sizing: border-box");
60
- });
61
- it("wraps the reset in a custom named layer", async () => {
62
- const { preflight } = await import("../preflight.js");
63
- preflight({ layer: "tailwind-base" });
64
- const css = document.head.querySelector("style[data-praxis-global]")?.textContent ?? "";
65
- expect(css).toContain("@layer tailwind-base {");
66
- });
67
- it("injects un-layered CSS when layer: false", async () => {
68
- const { preflight } = await import("../preflight.js");
69
- preflight({ layer: false });
70
- const css = document.head.querySelector("style[data-praxis-global]")?.textContent ?? "";
71
- expect(css).not.toContain("@layer");
72
- });
73
- });
74
- //# sourceMappingURL=preflight.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preflight.test.js","sourceRoot":"","sources":["../../src/__tests__/preflight.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=registry.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":""}
@@ -1,132 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3
- import { injectStyle, releaseStyle } from "../internal/registry";
4
- import { createCollector, setCollector } from "../internal/collector";
5
- beforeEach(() => {
6
- document
7
- .head
8
- .querySelectorAll("style[data-praxis-hash]")
9
- .forEach((el) => el.remove());
10
- setCollector(null);
11
- });
12
- afterEach(() => {
13
- document
14
- .head
15
- .querySelectorAll("style[data-praxis-hash]")
16
- .forEach((el) => el.remove());
17
- setCollector(null);
18
- });
19
- describe("injectStyle / releaseStyle", () => {
20
- it("injects a style element with the given key and css", () => {
21
- injectStyle("abc", ".a { color: red; }");
22
- const el = document.head.querySelector("style[data-praxis-hash='abc']");
23
- expect(el).not.toBeNull();
24
- expect(el?.textContent).toBe(".a { color: red; }");
25
- });
26
- it("reference-counts — increments count on duplicate key", () => {
27
- injectStyle("k1", ".x { display: flex; }");
28
- injectStyle("k1", ".x { display: flex; }");
29
- expect(document.head.querySelectorAll("style[data-praxis-hash='k1']").length).toBe(1);
30
- });
31
- it("removes the element when count reaches zero", () => {
32
- injectStyle("k2", ".y { opacity: 1; }");
33
- injectStyle("k2", ".y { opacity: 1; }");
34
- releaseStyle("k2");
35
- expect(document.head.querySelector("style[data-praxis-hash='k2']")).not.toBeNull();
36
- releaseStyle("k2");
37
- expect(document.head.querySelector("style[data-praxis-hash='k2']")).toBeNull();
38
- });
39
- it("releaseStyle on non-existent key is a no-op", () => {
40
- expect(() => releaseStyle("does-not-exist")).not.toThrow();
41
- });
42
- it("re-injects when element was removed externally (DOM divergence guard)", () => {
43
- injectStyle("k3", ".z { color: blue; }");
44
- document.head.querySelector("style[data-praxis-hash='k3']")?.remove();
45
- injectStyle("k3", ".z { color: blue; }");
46
- expect(document.head.querySelector("style[data-praxis-hash='k3']")).not.toBeNull();
47
- releaseStyle("k3");
48
- });
49
- });
50
- describe("collector mode", () => {
51
- it("routes injectStyle to the collector when one is active", () => {
52
- const col = createCollector();
53
- setCollector(col);
54
- injectStyle("hash1", ".cls { color: red; }");
55
- expect(document.head.querySelector("style[data-praxis-hash]")).toBeNull();
56
- expect(col.getCSS()).toBe(".cls { color: red; }");
57
- });
58
- it("deduplicates identical keys in the collector", () => {
59
- const col = createCollector();
60
- setCollector(col);
61
- injectStyle("dup", ".a { }");
62
- injectStyle("dup", ".a { }");
63
- expect(col.getCSS().split("\n").filter(Boolean).length).toBe(1);
64
- });
65
- it("collector accumulates multiple distinct injections", () => {
66
- const col = createCollector();
67
- setCollector(col);
68
- injectStyle("a", ".a { color: red; }");
69
- injectStyle("b", ".b { color: blue; }");
70
- const css = col.getCSS();
71
- expect(css).toContain(".a { color: red; }");
72
- expect(css).toContain(".b { color: blue; }");
73
- });
74
- it("releaseStyle is a no-op when a collector is active", () => {
75
- const col = createCollector();
76
- setCollector(col);
77
- injectStyle("x", ".x { }");
78
- expect(() => releaseStyle("x")).not.toThrow();
79
- expect(col.getCSS()).toContain(".x { }");
80
- });
81
- it("clear() resets the collector", () => {
82
- const col = createCollector();
83
- setCollector(col);
84
- injectStyle("c", ".c { }");
85
- col.clear();
86
- expect(col.getCSS()).toBe("");
87
- });
88
- it("DOM injection resumes after setCollector(null)", () => {
89
- const col = createCollector();
90
- setCollector(col);
91
- injectStyle("pre", ".pre { }");
92
- setCollector(null);
93
- injectStyle("post", ".post { }");
94
- expect(document.head.querySelector("style[data-praxis-hash='pre']")).toBeNull();
95
- expect(document.head.querySelector("style[data-praxis-hash='post']")).not.toBeNull();
96
- releaseStyle("post");
97
- });
98
- });
99
- // ─── STATIC_MODE ──────────────────────────────────────────────────────────────
100
- describe("injectStyle / releaseStyle — static mode (__PRAXIS_CSS_STATIC__)", () => {
101
- afterEach(() => {
102
- vi.unstubAllGlobals();
103
- vi.resetModules();
104
- });
105
- it("injectStyle is a no-op when __PRAXIS_CSS_STATIC__ is true", async () => {
106
- vi.stubGlobal("__PRAXIS_CSS_STATIC__", true);
107
- vi.resetModules();
108
- const { injectStyle: staticInject } = await import("../internal/registry");
109
- staticInject("sm1", ".a { color: red; }");
110
- expect(document.head.querySelector("style[data-praxis-hash='sm1']")).toBeNull();
111
- });
112
- it("releaseStyle is a no-op when __PRAXIS_CSS_STATIC__ is true", async () => {
113
- vi.stubGlobal("__PRAXIS_CSS_STATIC__", true);
114
- vi.resetModules();
115
- const { releaseStyle: staticRelease } = await import("../internal/registry");
116
- expect(() => staticRelease("sm2")).not.toThrow();
117
- });
118
- });
119
- // ─── SSR (document === undefined) ────────────────────────────────────────────
120
- describe("injectStyle — SSR (document undefined)", () => {
121
- afterEach(() => {
122
- vi.unstubAllGlobals();
123
- vi.resetModules();
124
- });
125
- it("does not throw when document is undefined", async () => {
126
- vi.stubGlobal("document", undefined);
127
- vi.resetModules();
128
- const { injectStyle: ssrInject } = await import("../internal/registry");
129
- expect(() => ssrInject("ssr1", ".a { }")).not.toThrow();
130
- });
131
- });
132
- //# sourceMappingURL=registry.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=style.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"style.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/style.test.ts"],"names":[],"mappings":""}
@@ -1,281 +0,0 @@
1
- var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
- function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
- var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
- var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
- var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
- var _, done = false;
7
- for (var i = decorators.length - 1; i >= 0; i--) {
8
- var context = {};
9
- for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
- for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
- context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
- var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
- if (kind === "accessor") {
14
- if (result === void 0) continue;
15
- if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
- if (_ = accept(result.get)) descriptor.get = _;
17
- if (_ = accept(result.set)) descriptor.set = _;
18
- if (_ = accept(result.init)) initializers.unshift(_);
19
- }
20
- else if (_ = accept(result)) {
21
- if (kind === "field") initializers.unshift(_);
22
- else descriptor[key] = _;
23
- }
24
- }
25
- if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
- done = true;
27
- };
28
- var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
- var useValue = arguments.length > 2;
30
- for (var i = 0; i < initializers.length; i++) {
31
- value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
- }
33
- return useValue ? value : void 0;
34
- };
35
- // @vitest-environment jsdom
36
- import { afterEach, beforeEach, describe, expect, it } from "vitest";
37
- import { StatefulComponent } from "@praxisjs/core";
38
- import { setComponentAnchor } from "@praxisjs/core/internal";
39
- import { Style } from "../decorators/style";
40
- let container;
41
- beforeEach(() => {
42
- container = document.createElement("div");
43
- document.body.appendChild(container);
44
- });
45
- afterEach(() => {
46
- container.remove();
47
- });
48
- /** Attaches an anchor comment to the element, simulating what the runtime does. */
49
- function makeAnchor(parent) {
50
- const anchor = document.createComment("[/Comp]");
51
- parent.appendChild(anchor);
52
- return anchor;
53
- }
54
- class AnchoredComponent extends StatefulComponent {
55
- constructor(anchor) {
56
- super();
57
- setComponentAnchor(this, anchor);
58
- }
59
- }
60
- describe("@Style field decorator", () => {
61
- it("sets a CSS custom property on the container element after onMount", () => {
62
- const anchor = makeAnchor(container);
63
- let Comp = (() => {
64
- let _classSuper = AnchoredComponent;
65
- let _accent_decorators;
66
- let _accent_initializers = [];
67
- let _accent_extraInitializers = [];
68
- return class Comp extends _classSuper {
69
- static {
70
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
71
- _accent_decorators = [Style("--accent")];
72
- __esDecorate(null, null, _accent_decorators, { kind: "field", name: "accent", static: false, private: false, access: { has: obj => "accent" in obj, get: obj => obj.accent, set: (obj, value) => { obj.accent = value; } }, metadata: _metadata }, _accent_initializers, _accent_extraInitializers);
73
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
74
- }
75
- constructor() {
76
- super(anchor);
77
- __runInitializers(this, _accent_extraInitializers);
78
- }
79
- accent = __runInitializers(this, _accent_initializers, "#3b82f6");
80
- render() { return null; }
81
- };
82
- })();
83
- const inst = new Comp();
84
- inst.onMount?.();
85
- expect(container.style.getPropertyValue("--accent")).toBe("#3b82f6");
86
- });
87
- it("updates CSS custom property reactively when field value changes", () => {
88
- const anchor = makeAnchor(container);
89
- let Comp = (() => {
90
- let _classSuper = AnchoredComponent;
91
- let _color_decorators;
92
- let _color_initializers = [];
93
- let _color_extraInitializers = [];
94
- return class Comp extends _classSuper {
95
- static {
96
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
97
- _color_decorators = [Style("--color")];
98
- __esDecorate(null, null, _color_decorators, { kind: "field", name: "color", static: false, private: false, access: { has: obj => "color" in obj, get: obj => obj.color, set: (obj, value) => { obj.color = value; } }, metadata: _metadata }, _color_initializers, _color_extraInitializers);
99
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
100
- }
101
- constructor() {
102
- super(anchor);
103
- __runInitializers(this, _color_extraInitializers);
104
- }
105
- color = __runInitializers(this, _color_initializers, "red");
106
- render() { return null; }
107
- };
108
- })();
109
- const inst = new Comp();
110
- inst.onMount?.();
111
- expect(container.style.getPropertyValue("--color")).toBe("red");
112
- inst.color = "blue";
113
- expect(container.style.getPropertyValue("--color")).toBe("blue");
114
- });
115
- it("removes the CSS custom property on unmount", () => {
116
- const anchor = makeAnchor(container);
117
- let Comp = (() => {
118
- let _classSuper = AnchoredComponent;
119
- let _accent_decorators;
120
- let _accent_initializers = [];
121
- let _accent_extraInitializers = [];
122
- return class Comp extends _classSuper {
123
- static {
124
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
125
- _accent_decorators = [Style("--accent")];
126
- __esDecorate(null, null, _accent_decorators, { kind: "field", name: "accent", static: false, private: false, access: { has: obj => "accent" in obj, get: obj => obj.accent, set: (obj, value) => { obj.accent = value; } }, metadata: _metadata }, _accent_initializers, _accent_extraInitializers);
127
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
128
- }
129
- constructor() {
130
- super(anchor);
131
- __runInitializers(this, _accent_extraInitializers);
132
- }
133
- accent = __runInitializers(this, _accent_initializers, "red");
134
- render() { return null; }
135
- };
136
- })();
137
- const inst = new Comp();
138
- inst.onMount?.();
139
- expect(container.style.getPropertyValue("--accent")).toBe("red");
140
- inst.onUnmount?.();
141
- expect(container.style.getPropertyValue("--accent")).toBe("");
142
- });
143
- it("does not throw when anchor has no parentElement", () => {
144
- const anchor = document.createComment("[/Comp]");
145
- let Comp = (() => {
146
- let _classSuper = AnchoredComponent;
147
- let _color_decorators;
148
- let _color_initializers = [];
149
- let _color_extraInitializers = [];
150
- return class Comp extends _classSuper {
151
- static {
152
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
153
- _color_decorators = [Style("--color")];
154
- __esDecorate(null, null, _color_decorators, { kind: "field", name: "color", static: false, private: false, access: { has: obj => "color" in obj, get: obj => obj.color, set: (obj, value) => { obj.color = value; } }, metadata: _metadata }, _color_initializers, _color_extraInitializers);
155
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
156
- }
157
- constructor() {
158
- super(anchor);
159
- __runInitializers(this, _color_extraInitializers);
160
- }
161
- color = __runInitializers(this, _color_initializers, "red");
162
- render() { return null; }
163
- };
164
- })();
165
- const inst = new Comp();
166
- expect(() => inst.onMount?.()).not.toThrow();
167
- expect(() => inst.onUnmount?.()).not.toThrow();
168
- });
169
- it("stops the reactive effect after onUnmount — further changes are silent", () => {
170
- const anchor = makeAnchor(container);
171
- let Comp = (() => {
172
- let _classSuper = AnchoredComponent;
173
- let _val_decorators;
174
- let _val_initializers = [];
175
- let _val_extraInitializers = [];
176
- return class Comp extends _classSuper {
177
- static {
178
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
179
- _val_decorators = [Style("--val")];
180
- __esDecorate(null, null, _val_decorators, { kind: "field", name: "val", static: false, private: false, access: { has: obj => "val" in obj, get: obj => obj.val, set: (obj, value) => { obj.val = value; } }, metadata: _metadata }, _val_initializers, _val_extraInitializers);
181
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
182
- }
183
- constructor() {
184
- super(anchor);
185
- __runInitializers(this, _val_extraInitializers);
186
- }
187
- val = __runInitializers(this, _val_initializers, "a");
188
- render() { return null; }
189
- };
190
- })();
191
- const inst = new Comp();
192
- inst.onMount?.();
193
- expect(container.style.getPropertyValue("--val")).toBe("a");
194
- inst.onUnmount?.();
195
- inst.val = "b";
196
- expect(container.style.getPropertyValue("--val")).toBe("");
197
- });
198
- it("supports numeric values (converted to string)", () => {
199
- const anchor = makeAnchor(container);
200
- let Comp = (() => {
201
- let _classSuper = AnchoredComponent;
202
- let _size_decorators;
203
- let _size_initializers = [];
204
- let _size_extraInitializers = [];
205
- return class Comp extends _classSuper {
206
- static {
207
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
208
- _size_decorators = [Style("--size")];
209
- __esDecorate(null, null, _size_decorators, { kind: "field", name: "size", static: false, private: false, access: { has: obj => "size" in obj, get: obj => obj.size, set: (obj, value) => { obj.size = value; } }, metadata: _metadata }, _size_initializers, _size_extraInitializers);
210
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
211
- }
212
- constructor() {
213
- super(anchor);
214
- __runInitializers(this, _size_extraInitializers);
215
- }
216
- size = __runInitializers(this, _size_initializers, 16);
217
- render() { return null; }
218
- };
219
- })();
220
- const inst = new Comp();
221
- inst.onMount?.();
222
- expect(container.style.getPropertyValue("--size")).toBe("16");
223
- });
224
- it("getter returns the current signal value", () => {
225
- const anchor = makeAnchor(container);
226
- let Comp = (() => {
227
- let _classSuper = AnchoredComponent;
228
- let _size_decorators;
229
- let _size_initializers = [];
230
- let _size_extraInitializers = [];
231
- return class Comp extends _classSuper {
232
- static {
233
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
234
- _size_decorators = [Style("--size")];
235
- __esDecorate(null, null, _size_decorators, { kind: "field", name: "size", static: false, private: false, access: { has: obj => "size" in obj, get: obj => obj.size, set: (obj, value) => { obj.size = value; } }, metadata: _metadata }, _size_initializers, _size_extraInitializers);
236
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
237
- }
238
- constructor() {
239
- super(anchor);
240
- __runInitializers(this, _size_extraInitializers);
241
- }
242
- size = __runInitializers(this, _size_initializers, "16px");
243
- render() { return null; }
244
- };
245
- })();
246
- const inst = new Comp();
247
- // getter before mount
248
- expect(inst.size).toBe("16px");
249
- inst.onMount?.();
250
- inst.size = "24px";
251
- // getter after reactive update
252
- expect(inst.size).toBe("24px");
253
- });
254
- it("supports multi-word custom property names", () => {
255
- const anchor = makeAnchor(container);
256
- let Comp = (() => {
257
- let _classSuper = AnchoredComponent;
258
- let _radius_decorators;
259
- let _radius_initializers = [];
260
- let _radius_extraInitializers = [];
261
- return class Comp extends _classSuper {
262
- static {
263
- const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
264
- _radius_decorators = [Style("--card-border-radius")];
265
- __esDecorate(null, null, _radius_decorators, { kind: "field", name: "radius", static: false, private: false, access: { has: obj => "radius" in obj, get: obj => obj.radius, set: (obj, value) => { obj.radius = value; } }, metadata: _metadata }, _radius_initializers, _radius_extraInitializers);
266
- if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
267
- }
268
- constructor() {
269
- super(anchor);
270
- __runInitializers(this, _radius_extraInitializers);
271
- }
272
- radius = __runInitializers(this, _radius_initializers, "12px");
273
- render() { return null; }
274
- };
275
- })();
276
- const inst = new Comp();
277
- inst.onMount?.();
278
- expect(container.style.getPropertyValue("--card-border-radius")).toBe("12px");
279
- });
280
- });
281
- //# sourceMappingURL=style.test.js.map