@servicetitan/hammer-token 2.5.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/README.md +332 -0
- package/build/web/core/component-variables.scss +1088 -131
- package/build/web/core/component.d.ts +558 -0
- package/build/web/core/component.js +6685 -249
- package/build/web/core/component.scss +557 -69
- package/build/web/core/css-utils/a2-border.css +47 -45
- package/build/web/core/css-utils/a2-color.css +443 -227
- package/build/web/core/css-utils/a2-font.css +0 -2
- package/build/web/core/css-utils/a2-spacing.css +476 -478
- package/build/web/core/css-utils/a2-utils.css +992 -772
- package/build/web/core/css-utils/border.css +47 -45
- package/build/web/core/css-utils/color.css +443 -227
- package/build/web/core/css-utils/font.css +0 -2
- package/build/web/core/css-utils/spacing.css +476 -478
- package/build/web/core/css-utils/utils.css +992 -772
- package/build/web/core/index.d.ts +6 -0
- package/build/web/core/index.js +1 -1
- package/build/web/core/primitive-variables.scss +148 -65
- package/build/web/core/primitive.d.ts +209 -0
- package/build/web/core/primitive.js +779 -61
- package/build/web/core/primitive.scss +207 -124
- package/build/web/core/semantic-variables.scss +363 -245
- package/build/web/core/semantic.d.ts +221 -0
- package/build/web/core/semantic.js +1592 -347
- package/build/web/core/semantic.scss +219 -140
- package/build/web/index.d.ts +3 -4
- package/build/web/index.js +0 -1
- package/build/web/types.d.ts +17 -0
- package/config.js +121 -497
- package/eslint.config.mjs +11 -1
- package/package.json +15 -5
- package/src/global/primitive/breakpoint.tokens.json +54 -0
- package/src/global/primitive/color.tokens.json +1092 -0
- package/src/global/primitive/duration.tokens.json +44 -0
- package/src/global/primitive/font.tokens.json +151 -0
- package/src/global/primitive/radius.tokens.json +94 -0
- package/src/global/primitive/size.tokens.json +174 -0
- package/src/global/primitive/transition.tokens.json +32 -0
- package/src/theme/core/background.tokens.json +1312 -0
- package/src/theme/core/border.tokens.json +192 -0
- package/src/theme/core/chart.tokens.json +982 -0
- package/src/theme/core/component/ai-mark.tokens.json +20 -0
- package/src/theme/core/component/alert.tokens.json +261 -0
- package/src/theme/core/component/announcement.tokens.json +460 -0
- package/src/theme/core/component/avatar.tokens.json +137 -0
- package/src/theme/core/component/badge.tokens.json +42 -0
- package/src/theme/core/component/breadcrumb.tokens.json +42 -0
- package/src/theme/core/component/button-toggle.tokens.json +428 -0
- package/src/theme/core/component/button.tokens.json +941 -0
- package/src/theme/core/component/calendar.tokens.json +391 -0
- package/src/theme/core/component/card.tokens.json +107 -0
- package/src/theme/core/component/checkbox.tokens.json +631 -0
- package/src/theme/core/component/chip.tokens.json +169 -0
- package/src/theme/core/component/combobox.tokens.json +269 -0
- package/src/theme/core/component/details.tokens.json +152 -0
- package/src/theme/core/component/dialog.tokens.json +87 -0
- package/src/theme/core/component/divider.tokens.json +23 -0
- package/src/theme/core/component/dnd.tokens.json +208 -0
- package/src/theme/core/component/drawer.tokens.json +61 -0
- package/src/theme/core/component/drilldown.tokens.json +61 -0
- package/src/theme/core/component/edit-card.tokens.json +381 -0
- package/src/theme/core/component/field-label.tokens.json +42 -0
- package/src/theme/core/component/field-message.tokens.json +74 -0
- package/src/theme/core/component/icon.tokens.json +42 -0
- package/src/theme/core/component/link.tokens.json +108 -0
- package/src/theme/core/component/list-view.tokens.json +82 -0
- package/src/theme/core/component/listbox.tokens.json +283 -0
- package/src/theme/core/component/menu.tokens.json +230 -0
- package/src/theme/core/component/overflow.tokens.json +84 -0
- package/src/theme/core/component/page.tokens.json +377 -0
- package/src/theme/core/component/pagination.tokens.json +63 -0
- package/src/theme/core/component/popover.tokens.json +122 -0
- package/src/theme/core/component/progress-bar.tokens.json +133 -0
- package/src/theme/core/component/radio.tokens.json +631 -0
- package/src/theme/core/component/segmented-control.tokens.json +175 -0
- package/src/theme/core/component/select-card.tokens.json +943 -0
- package/src/theme/core/component/side-nav.tokens.json +349 -0
- package/src/theme/core/component/skeleton.tokens.json +42 -0
- package/src/theme/core/component/spinner.tokens.json +96 -0
- package/src/theme/core/component/status-icon.tokens.json +164 -0
- package/src/theme/core/component/stepper.tokens.json +484 -0
- package/src/theme/core/component/switch.tokens.json +285 -0
- package/src/theme/core/component/tab.tokens.json +192 -0
- package/src/theme/core/component/text-field.tokens.json +160 -0
- package/src/theme/core/component/text.tokens.json +59 -0
- package/src/theme/core/component/toast.tokens.json +343 -0
- package/src/theme/core/component/toolbar.tokens.json +114 -0
- package/src/theme/core/component/tooltip.tokens.json +61 -0
- package/src/theme/core/focus.tokens.json +56 -0
- package/src/theme/core/foreground.tokens.json +416 -0
- package/src/theme/core/gradient.tokens.json +41 -0
- package/src/theme/core/opacity.tokens.json +25 -0
- package/src/theme/core/shadow.tokens.json +81 -0
- package/src/theme/core/status.tokens.json +74 -0
- package/src/theme/core/typography.tokens.json +163 -0
- package/src/utils/__tests__/css-utils-format-utils.test.js +312 -0
- package/src/utils/__tests__/sd-build-configs.test.js +306 -0
- package/src/utils/__tests__/sd-formats.test.js +950 -0
- package/src/utils/__tests__/sd-transforms.test.js +336 -0
- package/src/utils/__tests__/token-helpers.test.js +1160 -0
- package/src/utils/copy-css-utils-cli.js +13 -1
- package/src/utils/css-utils-format-utils.js +105 -176
- package/src/utils/figma/__tests__/sync-gradient.test.js +561 -0
- package/src/utils/figma/__tests__/token-conversion.test.js +117 -0
- package/src/utils/figma/__tests__/token-resolution.test.js +231 -0
- package/src/utils/figma/auth.js +355 -0
- package/src/utils/figma/constants.js +22 -0
- package/src/utils/figma/errors.js +80 -0
- package/src/utils/figma/figma-api.js +1069 -0
- package/src/utils/figma/get-token.js +348 -0
- package/src/utils/figma/sync-components.js +909 -0
- package/src/utils/figma/sync-main.js +692 -0
- package/src/utils/figma/sync-orchestration.js +683 -0
- package/src/utils/figma/sync-primitives.js +230 -0
- package/src/utils/figma/sync-semantic.js +1056 -0
- package/src/utils/figma/token-conversion.js +340 -0
- package/src/utils/figma/token-parsing.js +186 -0
- package/src/utils/figma/token-resolution.js +569 -0
- package/src/utils/figma/utils.js +199 -0
- package/src/utils/sd-build-configs.js +305 -0
- package/src/utils/sd-formats.js +965 -0
- package/src/utils/sd-transforms.js +165 -0
- package/src/utils/token-helpers.js +848 -0
- package/tsconfig.json +18 -0
- package/vitest.config.js +17 -0
- package/.turbo/turbo-build.log +0 -37
- package/build/web/core/raw.js +0 -234
- package/src/global/primitive/breakpoint.js +0 -19
- package/src/global/primitive/color.js +0 -231
- package/src/global/primitive/duration.js +0 -16
- package/src/global/primitive/font.js +0 -60
- package/src/global/primitive/radius.js +0 -31
- package/src/global/primitive/size.js +0 -55
- package/src/global/primitive/transition.js +0 -16
- package/src/theme/core/background.js +0 -170
- package/src/theme/core/border.js +0 -103
- package/src/theme/core/charts.js +0 -464
- package/src/theme/core/component/button.js +0 -708
- package/src/theme/core/component/checkbox.js +0 -405
- package/src/theme/core/focus.js +0 -35
- package/src/theme/core/foreground.js +0 -148
- package/src/theme/core/overlay.js +0 -137
- package/src/theme/core/shadow.js +0 -29
- package/src/theme/core/status.js +0 -49
- package/src/theme/core/typography.js +0 -82
- package/type/types.ts +0 -344
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { registerTransforms } from "../sd-transforms.js";
|
|
3
|
+
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Helpers — capture registered transforms/preprocessors from mock SD instance
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Creates a mock StyleDictionary instance that captures registered
|
|
10
|
+
* transforms, preprocessors, and transform groups.
|
|
11
|
+
*/
|
|
12
|
+
const createMockSD = () => {
|
|
13
|
+
const transforms = {};
|
|
14
|
+
const preprocessors = {};
|
|
15
|
+
const transformGroups = {};
|
|
16
|
+
|
|
17
|
+
return {
|
|
18
|
+
registerTransform: vi.fn(({ name, type, matcher, transform }) => {
|
|
19
|
+
transforms[name] = { type, matcher, transform };
|
|
20
|
+
}),
|
|
21
|
+
registerPreprocessor: vi.fn(({ name, preprocessor }) => {
|
|
22
|
+
preprocessors[name] = preprocessor;
|
|
23
|
+
}),
|
|
24
|
+
registerTransformGroup: vi.fn(({ name, transforms: group }) => {
|
|
25
|
+
transformGroups[name] = group;
|
|
26
|
+
}),
|
|
27
|
+
_transforms: transforms,
|
|
28
|
+
_preprocessors: preprocessors,
|
|
29
|
+
_transformGroups: transformGroups,
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
let sd;
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
sd = createMockSD();
|
|
36
|
+
registerTransforms(sd);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Registration sanity checks
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
describe("registerTransforms", () => {
|
|
44
|
+
it("registers dtcg/name transform", () => {
|
|
45
|
+
expect(sd._transforms["dtcg/name"]).toBeDefined();
|
|
46
|
+
expect(sd._transforms["dtcg/name"].type).toBe("name");
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("registers dtcg/value transform", () => {
|
|
50
|
+
expect(sd._transforms["dtcg/value"]).toBeDefined();
|
|
51
|
+
expect(sd._transforms["dtcg/value"].type).toBe("value");
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("registers dtcg/cubic-bezier transform", () => {
|
|
55
|
+
expect(sd._transforms["dtcg/cubic-bezier"]).toBeDefined();
|
|
56
|
+
expect(sd._transforms["dtcg/cubic-bezier"].type).toBe("value");
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it("registers dtcg/color-opacity transform", () => {
|
|
60
|
+
expect(sd._transforms["dtcg/color-opacity"]).toBeDefined();
|
|
61
|
+
expect(sd._transforms["dtcg/color-opacity"].type).toBe("value");
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("registers dtcg/set-token-names preprocessor", () => {
|
|
65
|
+
expect(sd._preprocessors["dtcg/set-token-names"]).toBeDefined();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("registers dtcg transform group", () => {
|
|
69
|
+
expect(sd._transformGroups["dtcg"]).toBeDefined();
|
|
70
|
+
expect(sd._transformGroups["dtcg"]).toContain("dtcg/name");
|
|
71
|
+
expect(sd._transformGroups["dtcg"]).toContain("dtcg/value");
|
|
72
|
+
expect(sd._transformGroups["dtcg"]).toContain("dtcg/cubic-bezier");
|
|
73
|
+
expect(sd._transformGroups["dtcg"]).toContain("dtcg/color-opacity");
|
|
74
|
+
expect(sd._transformGroups["dtcg"]).toContain("color/css");
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// dtcg/name transform
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
|
|
82
|
+
describe("dtcg/name transform", () => {
|
|
83
|
+
const nameTransform = () => sd._transforms["dtcg/name"].transform;
|
|
84
|
+
|
|
85
|
+
it("joins path segments with hyphens", () => {
|
|
86
|
+
expect(nameTransform()({ path: ["color", "primary", "500"] })).toBe(
|
|
87
|
+
"color-primary-500",
|
|
88
|
+
);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("filters out $schema path segments", () => {
|
|
92
|
+
expect(nameTransform()({ path: ["$schema", "color", "neutral"] })).toBe(
|
|
93
|
+
"color-neutral",
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("filters out any $-prefixed segments", () => {
|
|
98
|
+
expect(nameTransform()({ path: ["$meta", "size", "4"] })).toBe("size-4");
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("falls back to token.name when path is absent", () => {
|
|
102
|
+
expect(nameTransform()({ name: "color-primary" })).toBe("color-primary");
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("cleans up token.name by removing $schema and extra hyphens", () => {
|
|
106
|
+
expect(nameTransform()({ name: "$schema-color--primary" })).toBe(
|
|
107
|
+
"color-primary",
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("returns 'unknown' when path is empty and no name", () => {
|
|
112
|
+
expect(nameTransform()({ path: [] })).toBe("unknown");
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("returns 'unknown' when all path segments are filtered", () => {
|
|
116
|
+
expect(nameTransform()({ path: ["$schema", "$meta"] })).toBe("unknown");
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it("uses original.path when path is absent", () => {
|
|
120
|
+
expect(nameTransform()({ original: { path: ["size", "4"] } })).toBe(
|
|
121
|
+
"size-4",
|
|
122
|
+
);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
// dtcg/value transform
|
|
128
|
+
// ---------------------------------------------------------------------------
|
|
129
|
+
|
|
130
|
+
describe("dtcg/value transform", () => {
|
|
131
|
+
const valueTransform = () => sd._transforms["dtcg/value"].transform;
|
|
132
|
+
|
|
133
|
+
it("returns the $value property for plain values", () => {
|
|
134
|
+
expect(valueTransform()({ $value: "#ffffff" })).toBe("#ffffff");
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("converts dimension objects { value, unit } to a string", () => {
|
|
138
|
+
expect(valueTransform()({ $value: { value: 16, unit: "px" } })).toBe(
|
|
139
|
+
"16px",
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it("returns the value as-is for arrays (e.g. cubicBezier)", () => {
|
|
144
|
+
const arr = [0.4, 0, 0.2, 1];
|
|
145
|
+
expect(valueTransform()({ $value: arr })).toBe(arr);
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it("returns undefined when $value is absent", () => {
|
|
149
|
+
expect(valueTransform()({})).toBeUndefined();
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
// dtcg/cubic-bezier transform + matcher
|
|
155
|
+
// ---------------------------------------------------------------------------
|
|
156
|
+
|
|
157
|
+
describe("dtcg/cubic-bezier transform", () => {
|
|
158
|
+
const cubicTransform = () => sd._transforms["dtcg/cubic-bezier"];
|
|
159
|
+
|
|
160
|
+
it("matcher returns true for cubicBezier type tokens", () => {
|
|
161
|
+
expect(cubicTransform().matcher({ $type: "cubicBezier" })).toBe(true);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it("matcher returns false for non-cubicBezier type tokens", () => {
|
|
165
|
+
expect(cubicTransform().matcher({ $type: "color" })).toBe(false);
|
|
166
|
+
expect(cubicTransform().matcher({})).toBe(false);
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it("converts array to cubic-bezier() function string", () => {
|
|
170
|
+
expect(cubicTransform().transform({ $value: [0.4, 0, 0.2, 1] })).toBe(
|
|
171
|
+
"cubic-bezier(0.4, 0, 0.2, 1)",
|
|
172
|
+
);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it("returns non-array value as-is", () => {
|
|
176
|
+
const val = "ease-in-out";
|
|
177
|
+
expect(cubicTransform().transform({ $value: val })).toBe(val);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
// dtcg/color-opacity transform + matcher
|
|
183
|
+
// ---------------------------------------------------------------------------
|
|
184
|
+
|
|
185
|
+
describe("dtcg/color-opacity transform", () => {
|
|
186
|
+
const colorOpacityTransform = () => sd._transforms["dtcg/color-opacity"];
|
|
187
|
+
|
|
188
|
+
it("matcher returns true for color type with composite $value", () => {
|
|
189
|
+
expect(
|
|
190
|
+
colorOpacityTransform().matcher({
|
|
191
|
+
$type: "color",
|
|
192
|
+
$value: { color: "#fff", alpha: 0.5 },
|
|
193
|
+
}),
|
|
194
|
+
).toBe(true);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it("matcher returns false for color type with plain $value", () => {
|
|
198
|
+
expect(
|
|
199
|
+
colorOpacityTransform().matcher({ $type: "color", $value: "#ffffff" }),
|
|
200
|
+
).toBe(false);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("matcher returns false for non-color type", () => {
|
|
204
|
+
expect(
|
|
205
|
+
colorOpacityTransform().matcher({
|
|
206
|
+
$type: "dimension",
|
|
207
|
+
$value: { color: "#fff", alpha: 0.5 },
|
|
208
|
+
}),
|
|
209
|
+
).toBe(false);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it("returns the $value object unchanged", () => {
|
|
213
|
+
const val = { color: "#ffffff", alpha: 0.08 };
|
|
214
|
+
expect(colorOpacityTransform().transform({ $value: val })).toBe(val);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
// dtcg/set-token-names preprocessor
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
|
|
222
|
+
describe("dtcg/set-token-names preprocessor", () => {
|
|
223
|
+
const preprocessor = () => sd._preprocessors["dtcg/set-token-names"];
|
|
224
|
+
|
|
225
|
+
it("sets .name on leaf tokens (objects with $value)", () => {
|
|
226
|
+
const tokens = {
|
|
227
|
+
color: {
|
|
228
|
+
primary: {
|
|
229
|
+
500: { $value: "#ff0000", $type: "color" },
|
|
230
|
+
},
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
const result = preprocessor()(tokens);
|
|
234
|
+
expect(result.color.primary["500"].name).toBe("color-primary-500");
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it("handles multiple levels of nesting", () => {
|
|
238
|
+
const tokens = {
|
|
239
|
+
size: {
|
|
240
|
+
4: { $value: "1rem" },
|
|
241
|
+
8: { $value: "2rem" },
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
const result = preprocessor()(tokens);
|
|
245
|
+
expect(result.size["4"].name).toBe("size-4");
|
|
246
|
+
expect(result.size["8"].name).toBe("size-8");
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
it("filters out $-prefixed keys from the name", () => {
|
|
250
|
+
const tokens = {
|
|
251
|
+
$schema: "some-schema",
|
|
252
|
+
color: {
|
|
253
|
+
neutral: { $value: "#ccc" },
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
const result = preprocessor()(tokens);
|
|
257
|
+
expect(result.color.neutral.name).toBe("color-neutral");
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it("does not modify non-leaf (group) nodes", () => {
|
|
261
|
+
const tokens = {
|
|
262
|
+
color: {
|
|
263
|
+
primary: {
|
|
264
|
+
500: { $value: "#ff0000" },
|
|
265
|
+
},
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
const result = preprocessor()(tokens);
|
|
269
|
+
expect(result.color.name).toBeUndefined();
|
|
270
|
+
expect(result.color.primary.name).toBeUndefined();
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
it("returns the mutated tokens object", () => {
|
|
274
|
+
const tokens = { a: { $value: "1" } };
|
|
275
|
+
const result = preprocessor()(tokens);
|
|
276
|
+
expect(result).toBe(tokens);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
it("handles empty token tree", () => {
|
|
280
|
+
const tokens = {};
|
|
281
|
+
expect(() => preprocessor()(tokens)).not.toThrow();
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
// ---------------------------------------------------------------------------
|
|
286
|
+
// dtcg/gradient transform + matcher
|
|
287
|
+
// ---------------------------------------------------------------------------
|
|
288
|
+
|
|
289
|
+
describe("dtcg/gradient transform", () => {
|
|
290
|
+
const gradientTransform = () => sd._transforms["dtcg/gradient"];
|
|
291
|
+
|
|
292
|
+
it("is registered", () => {
|
|
293
|
+
expect(gradientTransform()).toBeDefined();
|
|
294
|
+
expect(gradientTransform().type).toBe("value");
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it("matcher returns true for gradient tokens with object $value", () => {
|
|
298
|
+
expect(
|
|
299
|
+
gradientTransform().matcher({
|
|
300
|
+
$type: "gradient",
|
|
301
|
+
$value: { type: "linear", angle: 90, stops: [] },
|
|
302
|
+
}),
|
|
303
|
+
).toBe(true);
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
it("matcher returns false for non-gradient type", () => {
|
|
307
|
+
expect(
|
|
308
|
+
gradientTransform().matcher({
|
|
309
|
+
$type: "color",
|
|
310
|
+
$value: { type: "linear", angle: 90, stops: [] },
|
|
311
|
+
}),
|
|
312
|
+
).toBe(false);
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
it("matcher returns false for gradient type with non-object $value (reference string)", () => {
|
|
316
|
+
expect(
|
|
317
|
+
gradientTransform().matcher({
|
|
318
|
+
$type: "gradient",
|
|
319
|
+
$value: "{gradient.primary}",
|
|
320
|
+
}),
|
|
321
|
+
).toBe(false);
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
it("transform passes the gradient value object through unchanged", () => {
|
|
325
|
+
const gradientValue = { type: "linear", angle: 90, stops: [] };
|
|
326
|
+
const result = gradientTransform().transform({
|
|
327
|
+
$type: "gradient",
|
|
328
|
+
$value: gradientValue,
|
|
329
|
+
});
|
|
330
|
+
expect(result).toBe(gradientValue);
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it("dtcg transform group includes dtcg/gradient", () => {
|
|
334
|
+
expect(sd._transformGroups["dtcg"]).toContain("dtcg/gradient");
|
|
335
|
+
});
|
|
336
|
+
});
|