@schukai/monster 4.148.9 → 4.149.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.
Files changed (205) hide show
  1. package/package.json +1 -1
  2. package/source/components/accessibility/stylesheet/locale-picker.mjs +61 -1
  3. package/source/components/content/image-editor.mjs +79 -11
  4. package/source/components/content/style/copy.pcss +1 -1
  5. package/source/components/content/stylesheet/camera-capture.mjs +1 -1
  6. package/source/components/content/stylesheet/copy.mjs +1 -1
  7. package/source/components/content/stylesheet/fetch-box.mjs +1 -1
  8. package/source/components/content/stylesheet/viewer.mjs +61 -1
  9. package/source/components/data/kpi-tile.mjs +5 -3
  10. package/source/components/data/metric-graph.mjs +22 -20
  11. package/source/components/data/metric.mjs +20 -18
  12. package/source/components/data/style/kpi-tile.pcss +65 -43
  13. package/source/components/data/style/metric-graph.pcss +35 -18
  14. package/source/components/data/style/metric.pcss +35 -28
  15. package/source/components/data/stylesheet/kpi-tile.mjs +61 -1
  16. package/source/components/data/stylesheet/metric-graph.mjs +61 -1
  17. package/source/components/data/stylesheet/metric.mjs +61 -1
  18. package/source/components/datatable/columnbar.mjs +4 -2
  19. package/source/components/datatable/datatable.mjs +73 -15
  20. package/source/components/datatable/filter/date-range.mjs +61 -61
  21. package/source/components/datatable/filter/date-time.mjs +5 -1
  22. package/source/components/datatable/filter/range.mjs +3 -3
  23. package/source/components/datatable/filter/select-operator.mjs +7 -1
  24. package/source/components/datatable/filter/text-operator.mjs +11 -3
  25. package/source/components/datatable/filter.mjs +16 -0
  26. package/source/components/datatable/pagination.mjs +2 -2
  27. package/source/components/datatable/style/column-bar.pcss +115 -23
  28. package/source/components/datatable/style/datatable.pcss +257 -29
  29. package/source/components/datatable/style/embedded-pagination.pcss +63 -34
  30. package/source/components/datatable/style/filter-button.pcss +1 -1
  31. package/source/components/datatable/style/filter-controls-defaults.pcss +49 -3
  32. package/source/components/datatable/style/filter-select.pcss +4 -1
  33. package/source/components/datatable/style/filter.pcss +18 -1
  34. package/source/components/datatable/stylesheet/change-button.mjs +61 -1
  35. package/source/components/datatable/stylesheet/column-bar.mjs +69 -1
  36. package/source/components/datatable/stylesheet/dataset.mjs +61 -1
  37. package/source/components/datatable/stylesheet/datatable.mjs +71 -1
  38. package/source/components/datatable/stylesheet/embedded-pagination.mjs +1 -1
  39. package/source/components/datatable/stylesheet/filter-button.mjs +1 -1
  40. package/source/components/datatable/stylesheet/filter-controls-defaults.mjs +1 -1
  41. package/source/components/datatable/stylesheet/filter-select.mjs +61 -1
  42. package/source/components/datatable/stylesheet/filter.mjs +61 -1
  43. package/source/components/datatable/stylesheet/pagination.mjs +67 -1
  44. package/source/components/datatable/stylesheet/save-button.mjs +61 -1
  45. package/source/components/datatable/stylesheet/status.mjs +61 -1
  46. package/source/components/form/action-button.mjs +2 -1
  47. package/source/components/form/button-bar.mjs +7 -2
  48. package/source/components/form/context-error.mjs +4 -3
  49. package/source/components/form/context-help.mjs +10 -4
  50. package/source/components/form/context-hint.mjs +1 -1
  51. package/source/components/form/context-info.mjs +1 -1
  52. package/source/components/form/context-note.mjs +1 -1
  53. package/source/components/form/context-success.mjs +1 -1
  54. package/source/components/form/context-warning.mjs +1 -1
  55. package/source/components/form/control-bar.mjs +300 -14
  56. package/source/components/form/credential-button.mjs +4 -2
  57. package/source/components/form/digits.mjs +28 -1
  58. package/source/components/form/field-set.mjs +30 -0
  59. package/source/components/form/login.mjs +13 -10
  60. package/source/components/form/password.mjs +6 -0
  61. package/source/components/form/popper-button.mjs +1 -1
  62. package/source/components/form/quantity.mjs +14 -6
  63. package/source/components/form/register-wizard.mjs +46 -26
  64. package/source/components/form/select.mjs +17 -10
  65. package/source/components/form/sheet.mjs +13 -2
  66. package/source/components/form/style/action-button.pcss +131 -5
  67. package/source/components/form/style/button-bar.pcss +204 -3
  68. package/source/components/form/style/control-bar.pcss +254 -26
  69. package/source/components/form/style/digits.pcss +7 -6
  70. package/source/components/form/style/input-group.pcss +65 -1
  71. package/source/components/form/style/login.pcss +1 -1
  72. package/source/components/form/style/mixin/field-set-layout.pcss +8 -0
  73. package/source/components/form/style/password.pcss +25 -1
  74. package/source/components/form/style/popper-button.pcss +1 -0
  75. package/source/components/form/style/quantity.pcss +11 -20
  76. package/source/components/form/style/select.pcss +52 -7
  77. package/source/components/form/style/sheet.pcss +70 -1
  78. package/source/components/form/style/state-button.pcss +5 -2
  79. package/source/components/form/style/toggle-switch.pcss +7 -4
  80. package/source/components/form/stylesheet/action-button.mjs +63 -1
  81. package/source/components/form/stylesheet/button-bar.mjs +153 -1
  82. package/source/components/form/stylesheet/button.mjs +61 -1
  83. package/source/components/form/stylesheet/control-bar.mjs +163 -1
  84. package/source/components/form/stylesheet/digits.mjs +1 -1
  85. package/source/components/form/stylesheet/field-layout.mjs +1 -1
  86. package/source/components/form/stylesheet/field-set.mjs +1 -1
  87. package/source/components/form/stylesheet/form.mjs +1 -1
  88. package/source/components/form/stylesheet/input-group.mjs +15 -1
  89. package/source/components/form/stylesheet/login.mjs +1 -1
  90. package/source/components/form/stylesheet/password.mjs +7 -1
  91. package/source/components/form/stylesheet/popper-button.mjs +61 -1
  92. package/source/components/form/stylesheet/quantity.mjs +1 -1
  93. package/source/components/form/stylesheet/register-wizard.mjs +1 -1
  94. package/source/components/form/stylesheet/select.mjs +3 -1
  95. package/source/components/form/stylesheet/sheet.mjs +1 -1
  96. package/source/components/form/stylesheet/state-button.mjs +3 -1
  97. package/source/components/form/stylesheet/toggle-switch.mjs +1 -1
  98. package/source/components/form/stylesheet/wizard.mjs +1 -1
  99. package/source/components/form/util/floating-ui.mjs +35 -7
  100. package/source/components/host/call-button.mjs +3 -1
  101. package/source/components/host/stylesheet/call-button.mjs +61 -1
  102. package/source/components/host/stylesheet/host.mjs +1 -1
  103. package/source/components/host/stylesheet/toggle-button.mjs +61 -1
  104. package/source/components/layout/full-screen.mjs +31 -23
  105. package/source/components/layout/iframe.mjs +5 -1
  106. package/source/components/layout/popper.mjs +34 -4
  107. package/source/components/layout/style/full-screen.pcss +94 -23
  108. package/source/components/layout/style/split-panel.pcss +57 -5
  109. package/source/components/layout/style/tabs.pcss +277 -47
  110. package/source/components/layout/style/vertical-tabs.pcss +147 -0
  111. package/source/components/layout/stylesheet/collapse.mjs +61 -1
  112. package/source/components/layout/stylesheet/details.mjs +61 -1
  113. package/source/components/layout/stylesheet/full-screen.mjs +23 -1
  114. package/source/components/layout/stylesheet/overlay.mjs +1 -1
  115. package/source/components/layout/stylesheet/panel.mjs +1 -1
  116. package/source/components/layout/stylesheet/slider.mjs +1 -1
  117. package/source/components/layout/stylesheet/split-panel.mjs +17 -1
  118. package/source/components/layout/stylesheet/tabs.mjs +97 -1
  119. package/source/components/layout/stylesheet/vertical-tabs.mjs +33 -95
  120. package/source/components/layout/tabs.mjs +63 -0
  121. package/source/components/layout/vertical-tabs.mjs +63 -0
  122. package/source/components/navigation/stylesheet/site-navigation.mjs +1 -1
  123. package/source/components/navigation/stylesheet/table-of-content.mjs +1 -1
  124. package/source/components/navigation/stylesheet/wizard-navigation.mjs +1 -1
  125. package/source/components/navigation/table-of-content.mjs +13 -0
  126. package/source/components/notify/style/notify.pcss +1 -2
  127. package/source/components/notify/stylesheet/message.mjs +1 -1
  128. package/source/components/notify/stylesheet/notify.mjs +1 -1
  129. package/source/components/state/style/log.pcss +1 -0
  130. package/source/components/state/style/state.pcss +5 -1
  131. package/source/components/state/stylesheet/log.mjs +1 -1
  132. package/source/components/state/stylesheet/state.mjs +7 -1
  133. package/source/components/style/button.css +61 -205
  134. package/source/components/style/button.pcss +78 -34
  135. package/source/components/style/common.css +1 -170
  136. package/source/components/style/common.pcss +5 -9
  137. package/source/components/style/form.css +1 -49
  138. package/source/components/style/form.pcss +24 -6
  139. package/source/components/style/link.css +1 -39
  140. package/source/components/style/link.pcss +8 -16
  141. package/source/components/style/mixin/button.pcss +19 -10
  142. package/source/components/style/mixin/property.pcss +8 -0
  143. package/source/components/style/mixin/skeleton.pcss +11 -5
  144. package/source/components/style/normalize.css +1 -144
  145. package/source/components/style/normalize.pcss +5 -5
  146. package/source/components/style/property.css +1 -387
  147. package/source/components/style/skeleton.css +1 -198
  148. package/source/components/style/skeleton.pcss +8 -2
  149. package/source/components/style/theme-modern.css +74 -0
  150. package/source/components/style/theme-modern.pcss +498 -0
  151. package/source/components/stylesheet/button.mjs +61 -1
  152. package/source/components/stylesheet/common.mjs +1 -1
  153. package/source/components/stylesheet/form.mjs +1 -1
  154. package/source/components/stylesheet/link.mjs +1 -1
  155. package/source/components/stylesheet/normalize.mjs +1 -1
  156. package/source/components/stylesheet/property.mjs +1 -1
  157. package/source/components/stylesheet/skeleton.mjs +1 -1
  158. package/source/components/stylesheet/theme-modern.mjs +110 -0
  159. package/source/components/time/stylesheet/day.mjs +61 -1
  160. package/source/components/time/stylesheet/month-calendar.mjs +61 -1
  161. package/source/components/time/timeline/stylesheet/appointment.mjs +61 -1
  162. package/source/components/time/timeline/stylesheet/segment.mjs +61 -1
  163. package/source/components/tree-menu/style/tree-menu.pcss +26 -37
  164. package/source/components/tree-menu/stylesheet/tree-menu.mjs +1 -1
  165. package/test/cases/components/content/image-editor.mjs +19 -0
  166. package/test/cases/components/datatable/accessibility-defaults.mjs +112 -0
  167. package/test/cases/components/datatable/filter-availability.mjs +37 -0
  168. package/test/cases/components/datatable/filter-date-range-layout.mjs +40 -0
  169. package/test/cases/components/datatable/filter-select-operator.mjs +118 -0
  170. package/test/cases/components/datatable/mobile-layout.mjs +203 -0
  171. package/test/cases/components/datatable/responsive-breakpoint.mjs +41 -0
  172. package/test/cases/components/datatable/selection.mjs +149 -0
  173. package/test/cases/components/form/action-button-style.mjs +85 -0
  174. package/test/cases/components/form/button-bar.mjs +222 -3
  175. package/test/cases/components/form/context-theme-colors.mjs +59 -0
  176. package/test/cases/components/form/control-bar.mjs +228 -3
  177. package/test/cases/components/form/control-heights.mjs +103 -0
  178. package/test/cases/components/form/digits-accessibility.mjs +65 -0
  179. package/test/cases/components/form/field-set.mjs +54 -0
  180. package/test/cases/components/form/floating-ui.mjs +74 -0
  181. package/test/cases/components/form/input-group.mjs +61 -28
  182. package/test/cases/components/form/login.mjs +47 -0
  183. package/test/cases/components/form/password.mjs +63 -0
  184. package/test/cases/components/form/popper-button.mjs +30 -15
  185. package/test/cases/components/form/quantity-accessibility.mjs +46 -0
  186. package/test/cases/components/form/register-wizard.mjs +79 -0
  187. package/test/cases/components/form/select.mjs +94 -2
  188. package/test/cases/components/form/sheet.mjs +56 -2
  189. package/test/cases/components/host/toggle-button.mjs +50 -0
  190. package/test/cases/components/layout/full-screen.mjs +60 -0
  191. package/test/cases/components/layout/iframe-accessibility.mjs +44 -0
  192. package/test/cases/components/layout/popper.mjs +128 -0
  193. package/test/cases/components/layout/slit-panel.mjs +30 -1
  194. package/test/cases/components/layout/tabs.mjs +93 -0
  195. package/test/cases/components/navigation/table-of-content.mjs +18 -0
  196. package/test/cases/components/state/state-style.mjs +31 -0
  197. package/test/cases/components/style/action-menu.mjs +74 -0
  198. package/test/cases/components/style/form-controls.mjs +37 -0
  199. package/test/cases/components/style/kpi-tile.mjs +60 -0
  200. package/test/cases/components/style/legacy-theme-compatibility.mjs +137 -0
  201. package/test/cases/components/style/metric-layout.mjs +94 -0
  202. package/test/cases/components/style/skeleton.mjs +69 -0
  203. package/test/cases/components/style/theme-component-catalog.mjs +853 -0
  204. package/test/cases/components/style/theme-modern.mjs +439 -0
  205. package/test/cases/components/style/theme-review-regressions.mjs +41 -0
@@ -0,0 +1,137 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { expect } from "chai";
3
+
4
+ const tabsSource = readFileSync(
5
+ new URL(
6
+ "../../../../source/components/layout/style/tabs.pcss",
7
+ import.meta.url,
8
+ ),
9
+ "utf8",
10
+ );
11
+
12
+ const columnBarSource = readFileSync(
13
+ new URL(
14
+ "../../../../source/components/datatable/style/column-bar.pcss",
15
+ import.meta.url,
16
+ ),
17
+ "utf8",
18
+ );
19
+
20
+ const datatableSource = readFileSync(
21
+ new URL(
22
+ "../../../../source/components/datatable/style/datatable.pcss",
23
+ import.meta.url,
24
+ ),
25
+ "utf8",
26
+ );
27
+
28
+ const treeMenuSource = readFileSync(
29
+ new URL(
30
+ "../../../../source/components/tree-menu/style/tree-menu.pcss",
31
+ import.meta.url,
32
+ ),
33
+ "utf8",
34
+ );
35
+
36
+ const modernThemeSource = readFileSync(
37
+ new URL(
38
+ "../../../../source/components/style/theme-modern.pcss",
39
+ import.meta.url,
40
+ ),
41
+ "utf8",
42
+ );
43
+
44
+ describe("Legacy theme compatibility", () => {
45
+ it("keeps the established tab layout as the fallback", () => {
46
+ for (const declaration of [
47
+ "var(--monster-tabs-nav-align-items, flex-end)",
48
+ "var(--monster-tabs-nav-gap, 0)",
49
+ "var(--monster-tabs-nav-margin-block-end, .75rem)",
50
+ "var(--monster-tabs-nav-padding, 0)",
51
+ "var(--monster-tabs-button-padding, .375rem 0)",
52
+ "var(--monster-tabs-button-margin-inline-end, .75rem)",
53
+ "var(--monster-tabs-button-min-block-size, auto)",
54
+ "var(--monster-tabs-button-transition, color 0.8s)",
55
+ ]) {
56
+ expect(tabsSource, declaration).to.include(declaration);
57
+ }
58
+ });
59
+
60
+ it("activates the new tab geometry only through modern theme tokens", () => {
61
+ for (const token of [
62
+ "--monster-tabs-nav-align-items: flex-end",
63
+ "--monster-tabs-nav-border-width: 0 0 1px",
64
+ "--monster-tabs-nav-gap: 0.25rem",
65
+ "--monster-tabs-button-border-width: 0 0 3px",
66
+ "--monster-tabs-button-margin-inline-end: 0.75rem",
67
+ "--monster-tabs-button-min-block-size: var(--monster-control-min-block-size)",
68
+ "--monster-tabs-slot-padding: 0.5rem 0.75rem",
69
+ ]) {
70
+ expect(modernThemeSource, token).to.include(token);
71
+ }
72
+ });
73
+
74
+ it("keeps column toggles compact with touch-sized coarse pointer targets", () => {
75
+ expect(columnBarSource).to.include(
76
+ "--monster-column-toggle-target-block-size",
77
+ );
78
+ expect(columnBarSource).to.include(
79
+ "var(--monster-column-toggle-target-size, 24px)",
80
+ );
81
+ expect(columnBarSource).to.include(
82
+ "--monster-column-toggle-target-inline-size",
83
+ );
84
+ expect(columnBarSource).to.include(
85
+ "var(--monster-column-toggle-target-size, 16px)",
86
+ );
87
+ expect(columnBarSource).to.include("@media (pointer: coarse)");
88
+ expect(columnBarSource).to.include("min-height: 24px");
89
+ expect(columnBarSource).to.include("min-width: 24px");
90
+ expect(columnBarSource).to.not.include("height: 44px");
91
+ expect(columnBarSource).to.not.include("width: 44px");
92
+ });
93
+
94
+ it("keeps legacy datatable spacing while modern uses solid subtle rows", () => {
95
+ for (const fallback of [
96
+ "var(--monster-datatable-cell-padding, 0.4rem 0.2rem)",
97
+ "var(--monster-datatable-header-cell-padding, 0.3rem 0.2rem)",
98
+ "var(--monster-datatable-row-border-style, dashed)",
99
+ ]) {
100
+ expect(datatableSource, fallback).to.include(fallback);
101
+ }
102
+ for (const modernToken of [
103
+ "--monster-datatable-cell-padding: 0.45rem 0.5rem",
104
+ "--monster-datatable-row-border-style: solid",
105
+ "--monster-datatable-row-border-color: var(--monster-theme-surface-strong)",
106
+ ]) {
107
+ expect(modernThemeSource, modernToken).to.include(modernToken);
108
+ }
109
+ });
110
+
111
+ it("uses the selected third typography proposal only in the modern theme", () => {
112
+ expect(modernThemeSource).to.include('"IBM Plex Sans"');
113
+ });
114
+
115
+ it("keeps legacy tree-menu sizing while modern raises nested navigation text", () => {
116
+ for (const fallback of [
117
+ "var(--monster-tree-menu-font-size-level-1, 1rem)",
118
+ "var(--monster-tree-menu-font-size-level-2, 1rem)",
119
+ "var(--monster-tree-menu-font-size-level-3, 0.75rem)",
120
+ "var(--monster-tree-menu-font-size-deep, 0.70rem)",
121
+ "var(--monster-tree-menu-font-size-deep, 0.65rem)",
122
+ "var(--monster-tree-menu-button-min-block-size, auto)",
123
+ ]) {
124
+ expect(treeMenuSource, fallback).to.include(fallback);
125
+ }
126
+
127
+ for (const modernToken of [
128
+ "--monster-tree-menu-font-size-level-1: 1rem",
129
+ "--monster-tree-menu-font-size-level-2: 0.9375rem",
130
+ "--monster-tree-menu-font-size-level-3: 0.875rem",
131
+ "--monster-tree-menu-font-size-deep: 0.875rem",
132
+ "--monster-tree-menu-button-min-block-size: 2rem",
133
+ ]) {
134
+ expect(modernThemeSource, modernToken).to.include(modernToken);
135
+ }
136
+ });
137
+ });
@@ -0,0 +1,94 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { expect } from "chai";
3
+
4
+ const componentSources = new Map(
5
+ ["kpi-tile", "metric", "metric-graph"].map((name) => [
6
+ name,
7
+ readFileSync(
8
+ new URL(
9
+ `../../../../source/components/data/${name}.mjs`,
10
+ import.meta.url,
11
+ ),
12
+ "utf8",
13
+ ),
14
+ ]),
15
+ );
16
+
17
+ const styleSources = new Map(
18
+ ["kpi-tile", "metric", "metric-graph"].map((name) => [
19
+ name,
20
+ readFileSync(
21
+ new URL(
22
+ `../../../../source/components/data/style/${name}.pcss`,
23
+ import.meta.url,
24
+ ),
25
+ "utf8",
26
+ ),
27
+ ]),
28
+ );
29
+
30
+ const generatedStyleSheets = new Map(
31
+ ["kpi-tile", "metric", "metric-graph"].map((name) => [
32
+ name,
33
+ readFileSync(
34
+ new URL(
35
+ `../../../../source/components/data/stylesheet/${name}.mjs`,
36
+ import.meta.url,
37
+ ),
38
+ "utf8",
39
+ ),
40
+ ]),
41
+ );
42
+
43
+ describe("Metric card layout", () => {
44
+ it("uses the same three rows for every default KPI card", () => {
45
+ for (const [name, source] of styleSources) {
46
+ expect(source, name).to.include("display: grid");
47
+ expect(source, name).to.include("height: 12rem");
48
+ expect(source, name).to.include("box-sizing: border-box");
49
+ expect(source, name).to.include(
50
+ "grid-template-rows: 2.75rem 2.5rem minmax(0, 1fr)",
51
+ );
52
+
53
+ const generated = generatedStyleSheets.get(name);
54
+ expect(generated, name).to.include("display:grid");
55
+ expect(generated, name).to.include("height:12rem");
56
+ expect(generated, name).to.include("box-sizing:border-box");
57
+ expect(generated, name).to.include(
58
+ "grid-template-rows:2.75rem 2.5rem minmax(0,1fr)",
59
+ );
60
+ }
61
+ });
62
+
63
+ it("keeps supporting metric content together in the footer row", () => {
64
+ expect(componentSources.get("kpi-tile")).to.match(
65
+ /class="kpi-value" part="value"[\s\S]*data-monster-role="main"[\s\S]*data-monster-role="small"/u,
66
+ );
67
+
68
+ for (const name of ["metric", "metric-graph"]) {
69
+ expect(componentSources.get(name), name).to.match(
70
+ /class="metric-footer" part="footer"[\s\S]*class="metric-subtext"/u,
71
+ );
72
+ }
73
+
74
+ expect(componentSources.get("metric")).to.match(
75
+ /class="metric-footer" part="footer"[\s\S]*part="metric-change"[\s\S]*prefix:metric-change/u,
76
+ );
77
+ expect(componentSources.get("metric-graph")).to.match(
78
+ /class="metric-footer" part="footer"[\s\S]*class="metric-graph/u,
79
+ );
80
+ });
81
+
82
+ it("reserves bottom spacing for every footer", () => {
83
+ expect(styleSources.get("kpi-tile")).to.include(
84
+ "padding: 0.5rem 0 0.25rem",
85
+ );
86
+
87
+ for (const name of ["metric", "metric-graph"]) {
88
+ const source = styleSources.get(name);
89
+ const generated = generatedStyleSheets.get(name);
90
+ expect(source, name).to.include("padding-block-end: 0.25rem");
91
+ expect(generated, name).to.include("padding-block-end:.25rem");
92
+ }
93
+ });
94
+ });
@@ -0,0 +1,69 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { expect } from "chai";
3
+
4
+ const skeletonSource = readFileSync(
5
+ new URL("../../../../source/components/style/skeleton.pcss", import.meta.url),
6
+ "utf8",
7
+ );
8
+ const skeletonMixinSource = readFileSync(
9
+ new URL(
10
+ "../../../../source/components/style/mixin/skeleton.pcss",
11
+ import.meta.url,
12
+ ),
13
+ "utf8",
14
+ );
15
+ const skeletonStyleSheet = readFileSync(
16
+ new URL(
17
+ "../../../../source/components/stylesheet/skeleton.mjs",
18
+ import.meta.url,
19
+ ),
20
+ "utf8",
21
+ );
22
+ const fetchBoxStyleSheet = readFileSync(
23
+ new URL(
24
+ "../../../../source/components/content/stylesheet/fetch-box.mjs",
25
+ import.meta.url,
26
+ ),
27
+ "utf8",
28
+ );
29
+ const themeLabStyle = readFileSync(
30
+ new URL(
31
+ "../../../../development/playground/theme/style/main.pcss",
32
+ import.meta.url,
33
+ ),
34
+ "utf8",
35
+ );
36
+
37
+ describe("Skeleton styles", () => {
38
+ it("fades semantic skeleton fills into the surrounding background", () => {
39
+ expect(skeletonSource).to.include("var(--monster-bg-color-primary-3)");
40
+ expect(skeletonMixinSource).to.include(
41
+ "--monster-skeleton-color: var(--monster-skeleton-fill, $color)",
42
+ );
43
+ expect(skeletonMixinSource).to.include("transparent 0%");
44
+ expect(skeletonMixinSource).to.include("transparent 100%");
45
+ expect(themeLabStyle).to.match(
46
+ /\.catalog-skeleton > span\s*\{[\s\S]*?background-color:\s*transparent;/u,
47
+ );
48
+
49
+ for (const generatedStyle of [skeletonStyleSheet, fetchBoxStyleSheet]) {
50
+ expect(generatedStyle).to.include(
51
+ "--monster-skeleton-color:var(--monster-skeleton-fill,var(--monster-bg-color-primary-3))",
52
+ );
53
+ expect(generatedStyle).to.include("transparent 0%");
54
+ expect(generatedStyle).to.include("transparent 100%");
55
+ }
56
+ });
57
+
58
+ it("disables skeleton animation when reduced motion is requested", () => {
59
+ expect(skeletonSource).to.match(
60
+ /@media \(prefers-reduced-motion:\s*reduce\)[\s\S]*?animation:\s*none;/u,
61
+ );
62
+ for (const generatedStyle of [skeletonStyleSheet, fetchBoxStyleSheet]) {
63
+ expect(generatedStyle).to.include(
64
+ "@media (prefers-reduced-motion:reduce)",
65
+ );
66
+ expect(generatedStyle).to.include("animation:none");
67
+ }
68
+ });
69
+ });