@seed-design/figma 1.1.0 → 1.1.2
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/lib/codegen/index.cjs +366 -286
- package/lib/codegen/index.d.ts +508 -233
- package/lib/codegen/index.d.ts.map +1 -1
- package/lib/codegen/index.js +366 -286
- package/lib/codegen/targets/react/index.cjs +1012 -510
- package/lib/codegen/targets/react/index.d.ts.map +1 -1
- package/lib/codegen/targets/react/index.js +1012 -510
- package/lib/index.cjs +394 -286
- package/lib/index.js +394 -286
- package/package.json +1 -1
- package/src/codegen/component-properties.ts +362 -103
- package/src/codegen/targets/react/component/handlers/bottom-sheet.ts +2 -3
- package/src/codegen/targets/react/component/handlers/error-state.ts +18 -6
- package/src/codegen/targets/react/component/handlers/field-button.ts +197 -0
- package/src/codegen/targets/react/component/handlers/field.ts +167 -0
- package/src/codegen/targets/react/component/handlers/slider.ts +114 -0
- package/src/codegen/targets/react/component/handlers/text-field.ts +245 -92
- package/src/codegen/targets/react/component/index.ts +40 -23
- package/src/codegen/targets/react/element-factories.ts +1 -1
- package/src/codegen/targets/react/instance.ts +23 -2
- package/src/entities/data/__generated__/component-sets/index.d.ts +225 -222
- package/src/entities/data/__generated__/component-sets/index.mjs +225 -222
- package/src/entities/data/__generated__/components/index.d.ts +121 -0
- package/src/entities/data/__generated__/components/index.mjs +121 -0
- package/src/entities/data/__generated__/icons/index.mjs +28 -0
- package/src/entities/data/__generated__/styles/index.mjs +0 -56
- package/src/entities/data/__generated__/variable-collections/index.mjs +11 -8
- package/src/entities/data/__generated__/variables/index.mjs +130 -0
- package/src/codegen/targets/react/component/handlers/multiline-text-field.ts +0 -84
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { defineComponentHandler } from "@/codegen/core";
|
|
2
|
+
import * as sets from "@/entities/data/__generated__/component-sets";
|
|
3
|
+
import * as components from "@/entities/data/__generated__/components";
|
|
4
|
+
import { createLocalSnippetHelper } from "../../element-factories";
|
|
5
|
+
import type { ComponentHandlerDeps } from "../deps.interface";
|
|
6
|
+
import {
|
|
7
|
+
createFieldFooterHandler,
|
|
8
|
+
createFieldHeaderHandler,
|
|
9
|
+
FIELD_KEYS,
|
|
10
|
+
type FieldFooterProps,
|
|
11
|
+
type FieldHeaderProps,
|
|
12
|
+
} from "@/codegen/targets/react/component/handlers/field";
|
|
13
|
+
import type {
|
|
14
|
+
FieldHeaderProperties,
|
|
15
|
+
FieldFooterProperties,
|
|
16
|
+
FieldButtonProperties,
|
|
17
|
+
InputButtonProperties,
|
|
18
|
+
InputButtonPrefixProperties,
|
|
19
|
+
InputButtonSuffixProperties,
|
|
20
|
+
ActionButtonGhostProperties,
|
|
21
|
+
GenericFieldButtonProps,
|
|
22
|
+
} from "@/codegen/component-properties";
|
|
23
|
+
import { findAllInstances, findOne } from "@/utils/figma-node";
|
|
24
|
+
import type { NormalizedTextNode } from "@/normalizer";
|
|
25
|
+
|
|
26
|
+
const { createLocalSnippetElement } = createLocalSnippetHelper("field-button");
|
|
27
|
+
|
|
28
|
+
const INPUT_BUTTON_KEY = "965bdecb58755af9a08d60cc3c8d2d33b42e15f0";
|
|
29
|
+
const INPUT_BUTTON_PREFIX_KEY = "12b40c736a098298c64ba16de85702b4b460d1f1";
|
|
30
|
+
const INPUT_BUTTON_SUFFIX_KEY = "5dda27af9f4afafa471925c17acf97d81912877a";
|
|
31
|
+
|
|
32
|
+
export const createFieldButtonHandler = (ctx: ComponentHandlerDeps) => {
|
|
33
|
+
const fieldHeaderHandler = createFieldHeaderHandler(ctx);
|
|
34
|
+
const fieldFooterHandler = createFieldFooterHandler(ctx);
|
|
35
|
+
|
|
36
|
+
return defineComponentHandler<FieldButtonProperties>(
|
|
37
|
+
sets.templateCustomPickerField.key,
|
|
38
|
+
(node, traverse) => {
|
|
39
|
+
const props = node.componentProperties;
|
|
40
|
+
|
|
41
|
+
const [inputButton] = findAllInstances<InputButtonProperties>({
|
|
42
|
+
node,
|
|
43
|
+
key: INPUT_BUTTON_KEY,
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
const [clearButton] = findAllInstances<ActionButtonGhostProperties>({
|
|
47
|
+
node,
|
|
48
|
+
key: sets.actionButtonGhostButton.key,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const [fieldHeader] = findAllInstances<FieldHeaderProperties>({
|
|
52
|
+
node,
|
|
53
|
+
key: FIELD_KEYS.HEADER,
|
|
54
|
+
});
|
|
55
|
+
const [fieldFooter] = findAllInstances<FieldFooterProperties>({
|
|
56
|
+
node,
|
|
57
|
+
key: FIELD_KEYS.FOOTER,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
// maxGraphemeCount and required can't be props of FieldButton
|
|
61
|
+
const { required: __required, ...headerProps } =
|
|
62
|
+
props["Show Header#40606:8"].value && fieldHeader
|
|
63
|
+
? (fieldHeaderHandler.transform(fieldHeader, traverse).props as FieldHeaderProps)
|
|
64
|
+
: {};
|
|
65
|
+
const { maxGraphemeCount: __maxGraphemeCount, ...footerProps } =
|
|
66
|
+
props["Show Footer#40606:9"].value && fieldFooter
|
|
67
|
+
? (fieldFooterHandler.transform(fieldFooter, traverse).props as FieldFooterProps)
|
|
68
|
+
: {};
|
|
69
|
+
|
|
70
|
+
const [prefix] = findAllInstances<InputButtonPrefixProperties>({
|
|
71
|
+
node: inputButton,
|
|
72
|
+
key: INPUT_BUTTON_PREFIX_KEY,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
const [suffix] = findAllInstances<InputButtonSuffixProperties>({
|
|
76
|
+
node: inputButton,
|
|
77
|
+
key: INPUT_BUTTON_SUFFIX_KEY,
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const commonProps = {
|
|
81
|
+
...(inputButton.componentProperties.State.value === "Disabled" && {
|
|
82
|
+
disabled: true,
|
|
83
|
+
}),
|
|
84
|
+
...((inputButton.componentProperties.State.value === "Error" ||
|
|
85
|
+
inputButton.componentProperties.State.value === "Error Pressed") && {
|
|
86
|
+
invalid: true,
|
|
87
|
+
}),
|
|
88
|
+
...(clearButton && {
|
|
89
|
+
showClearButton: true,
|
|
90
|
+
}),
|
|
91
|
+
...(inputButton.componentProperties["Has Prefix#32514:10"].value === true &&
|
|
92
|
+
prefix &&
|
|
93
|
+
prefix.componentProperties.Type.value === "Icon" && {
|
|
94
|
+
prefixIcon: ctx.iconHandler.transform(prefix.componentProperties["Icon#34021:2"]),
|
|
95
|
+
}),
|
|
96
|
+
...(inputButton.componentProperties["Has Suffix#32865:68"].value === true &&
|
|
97
|
+
suffix &&
|
|
98
|
+
suffix.componentProperties["Type (Figma Only)"].value === "Icon" && {
|
|
99
|
+
suffixIcon: ctx.iconHandler.transform(suffix.componentProperties["Icon#37963:0"]),
|
|
100
|
+
}),
|
|
101
|
+
...(inputButton.componentProperties["Has Suffix#32865:68"].value === true &&
|
|
102
|
+
suffix &&
|
|
103
|
+
suffix.componentProperties["Type (Figma Only)"].value === "Text" && {
|
|
104
|
+
suffix: suffix.componentProperties["Suffix Text#34021:4"].value,
|
|
105
|
+
}),
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// these can be fragile but better than having 9 different handlers
|
|
109
|
+
const placeholder = findOne(
|
|
110
|
+
node,
|
|
111
|
+
(node) => node.type === "TEXT" && node.name.toLowerCase().includes("placeholder"),
|
|
112
|
+
) as NormalizedTextNode;
|
|
113
|
+
|
|
114
|
+
const value = findOne(
|
|
115
|
+
node,
|
|
116
|
+
(node) => node.type === "TEXT" && node.name.toLowerCase().includes("value"),
|
|
117
|
+
) as NormalizedTextNode;
|
|
118
|
+
|
|
119
|
+
return createLocalSnippetElement(
|
|
120
|
+
"FieldButton",
|
|
121
|
+
{ ...headerProps, ...footerProps, ...commonProps },
|
|
122
|
+
props["Has Value"].value === "True" && value
|
|
123
|
+
? createLocalSnippetElement("FieldButtonValue", undefined, value.characters)
|
|
124
|
+
: placeholder
|
|
125
|
+
? createLocalSnippetElement("FieldButtonPlaceholder", undefined, placeholder.characters)
|
|
126
|
+
: undefined,
|
|
127
|
+
{ comment: "buttonProps를 통해 aria-label을 제공하세요." },
|
|
128
|
+
);
|
|
129
|
+
},
|
|
130
|
+
);
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// TODO: those 4 are basically the same
|
|
134
|
+
|
|
135
|
+
export const createSelectFieldHandler = (ctx: ComponentHandlerDeps) => {
|
|
136
|
+
const fieldButtonHandler = createFieldButtonHandler(ctx);
|
|
137
|
+
|
|
138
|
+
return defineComponentHandler<GenericFieldButtonProps>(
|
|
139
|
+
components.templateSelectField.key,
|
|
140
|
+
(node, traverse) => {
|
|
141
|
+
const [fieldButton] = findAllInstances<FieldButtonProperties>({
|
|
142
|
+
node,
|
|
143
|
+
key: fieldButtonHandler.key,
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
return fieldButtonHandler.transform(fieldButton, traverse);
|
|
147
|
+
},
|
|
148
|
+
);
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
export const createDatePickerFieldHandler = (ctx: ComponentHandlerDeps) => {
|
|
152
|
+
const fieldButtonHandler = createFieldButtonHandler(ctx);
|
|
153
|
+
|
|
154
|
+
return defineComponentHandler<GenericFieldButtonProps>(
|
|
155
|
+
components.templateDatePickerField.key,
|
|
156
|
+
(node, traverse) => {
|
|
157
|
+
const [fieldButton] = findAllInstances<FieldButtonProperties>({
|
|
158
|
+
node,
|
|
159
|
+
key: fieldButtonHandler.key,
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
return fieldButtonHandler.transform(fieldButton, traverse);
|
|
163
|
+
},
|
|
164
|
+
);
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
export const createTimePickerFieldHandler = (ctx: ComponentHandlerDeps) => {
|
|
168
|
+
const fieldButtonHandler = createFieldButtonHandler(ctx);
|
|
169
|
+
|
|
170
|
+
return defineComponentHandler<GenericFieldButtonProps>(
|
|
171
|
+
components.templateTimePickerField.key,
|
|
172
|
+
(node, traverse) => {
|
|
173
|
+
const [fieldButton] = findAllInstances<FieldButtonProperties>({
|
|
174
|
+
node,
|
|
175
|
+
key: fieldButtonHandler.key,
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
return fieldButtonHandler.transform(fieldButton, traverse);
|
|
179
|
+
},
|
|
180
|
+
);
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
export const createAddressFieldHandler = (ctx: ComponentHandlerDeps) => {
|
|
184
|
+
const fieldButtonHandler = createFieldButtonHandler(ctx);
|
|
185
|
+
|
|
186
|
+
return defineComponentHandler<GenericFieldButtonProps>(
|
|
187
|
+
components.templateAddressPickerField.key,
|
|
188
|
+
(node, traverse) => {
|
|
189
|
+
const [fieldButton] = findAllInstances<FieldButtonProperties>({
|
|
190
|
+
node,
|
|
191
|
+
key: fieldButtonHandler.key,
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
return fieldButtonHandler.transform(fieldButton, traverse);
|
|
195
|
+
},
|
|
196
|
+
);
|
|
197
|
+
};
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
FieldCharacterCountProperties,
|
|
3
|
+
FieldFooterProperties,
|
|
4
|
+
FieldHeaderProperties,
|
|
5
|
+
FieldIndicatorProperties,
|
|
6
|
+
} from "@/codegen/component-properties";
|
|
7
|
+
import { defineComponentHandler } from "@/codegen/core";
|
|
8
|
+
import { createSeedReactElement } from "../../element-factories";
|
|
9
|
+
import type { ComponentHandlerDeps } from "../deps.interface";
|
|
10
|
+
import { match } from "ts-pattern";
|
|
11
|
+
import { findAllInstances } from "@/utils/figma-node";
|
|
12
|
+
import { camelCase } from "change-case";
|
|
13
|
+
|
|
14
|
+
const FIELD_HEADER_KEY = "84fe2e479c3291177662e41c71af29716e48789b";
|
|
15
|
+
const FIELD_INDICATOR_KEY = "a0a170973212ea0cd952b45a8acb11a92561f402";
|
|
16
|
+
const FIELD_FOOTER_KEY = "ab528f3b51a6dc529bb144de1495b07deef77ffa";
|
|
17
|
+
const FIELD_CHARACTER_COUNT_KEY = "25dd9a96f4bf3b866b8713f6d8deec370eebfa72";
|
|
18
|
+
|
|
19
|
+
export const FIELD_KEYS = {
|
|
20
|
+
HEADER: FIELD_HEADER_KEY,
|
|
21
|
+
FOOTER: FIELD_FOOTER_KEY,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export type FieldHeaderProps = FieldIndicatorProps & {
|
|
25
|
+
label?: string;
|
|
26
|
+
labelWeight?: string;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* NOTE: only gives useful 'props' for field-related components but doesn't give fully functional code.
|
|
31
|
+
*/
|
|
32
|
+
export const createFieldHeaderHandler = (ctx: ComponentHandlerDeps) => {
|
|
33
|
+
const indicatorHandler = createFieldIndicatorHandler(ctx);
|
|
34
|
+
|
|
35
|
+
return defineComponentHandler<FieldHeaderProperties>(FIELD_HEADER_KEY, (node, traverse) => {
|
|
36
|
+
const { componentProperties: props } = node;
|
|
37
|
+
|
|
38
|
+
const [indicator] = findAllInstances<FieldIndicatorProperties>({
|
|
39
|
+
node,
|
|
40
|
+
key: FIELD_INDICATOR_KEY,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
// only returns some nice common props for Slider, TextField and more
|
|
44
|
+
return createSeedReactElement("__FieldHeader__", {
|
|
45
|
+
label: props["Label#34796:0"].value,
|
|
46
|
+
labelWeight: camelCase(props.Weight.value),
|
|
47
|
+
...(indicator &&
|
|
48
|
+
(indicatorHandler.transform(indicator, traverse).props as FieldIndicatorProps)),
|
|
49
|
+
} satisfies FieldHeaderProps);
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
type FieldIndicatorProps = {
|
|
54
|
+
required?: boolean;
|
|
55
|
+
showRequiredIndicator?: boolean;
|
|
56
|
+
indicator?: string;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* NOTE: only gives useful 'props' for field-related components but doesn't give fully functional code.
|
|
61
|
+
*/
|
|
62
|
+
const createFieldIndicatorHandler = (_ctx: ComponentHandlerDeps) => {
|
|
63
|
+
return defineComponentHandler<FieldIndicatorProperties>(
|
|
64
|
+
FIELD_INDICATOR_KEY,
|
|
65
|
+
({ componentProperties: props }) => {
|
|
66
|
+
const { required, showRequiredIndicator, indicator } = match(props.Type.value)
|
|
67
|
+
.with("Required Mark", () => ({
|
|
68
|
+
required: true,
|
|
69
|
+
showRequiredIndicator: true,
|
|
70
|
+
indicator: undefined,
|
|
71
|
+
}))
|
|
72
|
+
.with("Text", () => ({
|
|
73
|
+
required: undefined,
|
|
74
|
+
showRequiredIndicator: undefined,
|
|
75
|
+
indicator: props["Required Label#40606:3"].value,
|
|
76
|
+
}))
|
|
77
|
+
.exhaustive();
|
|
78
|
+
|
|
79
|
+
// only returns some nice common props for Slider, TextField and more
|
|
80
|
+
return createSeedReactElement("__FieldIndicator__", {
|
|
81
|
+
required,
|
|
82
|
+
showRequiredIndicator,
|
|
83
|
+
indicator,
|
|
84
|
+
} satisfies FieldIndicatorProps);
|
|
85
|
+
},
|
|
86
|
+
);
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export type FieldFooterProps = FieldCharacterCountProps & {
|
|
90
|
+
description?: string;
|
|
91
|
+
maxGraphemeCount?: number;
|
|
92
|
+
invalid?: boolean;
|
|
93
|
+
errorMessage?: string;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* NOTE: only gives useful 'props' for field-related components but doesn't give fully functional code.
|
|
98
|
+
*/
|
|
99
|
+
export const createFieldFooterHandler = (ctx: ComponentHandlerDeps) => {
|
|
100
|
+
const characterCountHandler = createFieldCharacterCountHandler(ctx);
|
|
101
|
+
|
|
102
|
+
return defineComponentHandler<FieldFooterProperties>(FIELD_FOOTER_KEY, (node, traverse) => {
|
|
103
|
+
const { componentProperties: props } = node;
|
|
104
|
+
|
|
105
|
+
const { description, maxGraphemeCount } = match(props.Type.value)
|
|
106
|
+
.with("Description", () => ({
|
|
107
|
+
description: props["Text#2770:0"].value,
|
|
108
|
+
maxGraphemeCount: undefined,
|
|
109
|
+
}))
|
|
110
|
+
.with("Description With Character Count", () => ({
|
|
111
|
+
description: props["Text#2770:0"].value,
|
|
112
|
+
maxGraphemeCount: undefined,
|
|
113
|
+
}))
|
|
114
|
+
.with("Character Count", () => {
|
|
115
|
+
const [characterCount] = findAllInstances<FieldCharacterCountProperties>({
|
|
116
|
+
node,
|
|
117
|
+
key: FIELD_CHARACTER_COUNT_KEY,
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
description: undefined,
|
|
122
|
+
...(characterCount &&
|
|
123
|
+
(characterCountHandler.transform(characterCount, traverse)
|
|
124
|
+
.props as FieldCharacterCountProps)),
|
|
125
|
+
};
|
|
126
|
+
})
|
|
127
|
+
.exhaustive();
|
|
128
|
+
|
|
129
|
+
const { errorMessage, invalid } = match(props.Error.value === "true")
|
|
130
|
+
.with(true, () => ({
|
|
131
|
+
invalid: true,
|
|
132
|
+
errorMessage: props["Error Text#32821:0"].value,
|
|
133
|
+
}))
|
|
134
|
+
.with(false, () => ({
|
|
135
|
+
invalid: undefined,
|
|
136
|
+
errorMessage: undefined,
|
|
137
|
+
}))
|
|
138
|
+
.exhaustive();
|
|
139
|
+
|
|
140
|
+
// only returns some nice common props for Slider, TextField and more
|
|
141
|
+
return createSeedReactElement("__FieldFooter__", {
|
|
142
|
+
description,
|
|
143
|
+
maxGraphemeCount,
|
|
144
|
+
invalid,
|
|
145
|
+
errorMessage,
|
|
146
|
+
} satisfies FieldFooterProps);
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
type FieldCharacterCountProps = {
|
|
151
|
+
maxGraphemeCount?: number;
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* NOTE: only gives useful 'props' for field-related components but doesn't give fully functional code.
|
|
156
|
+
*/
|
|
157
|
+
const createFieldCharacterCountHandler = (_ctx: ComponentHandlerDeps) => {
|
|
158
|
+
return defineComponentHandler<FieldCharacterCountProperties>(
|
|
159
|
+
FIELD_CHARACTER_COUNT_KEY,
|
|
160
|
+
({ componentProperties: props }) => {
|
|
161
|
+
// only returns some nice common props for Slider, TextField and more
|
|
162
|
+
return createSeedReactElement("__FieldCharacterCount__", {
|
|
163
|
+
maxGraphemeCount: Number(props["Max Count#40960:4"].value),
|
|
164
|
+
} satisfies FieldCharacterCountProps);
|
|
165
|
+
},
|
|
166
|
+
);
|
|
167
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
FieldFooterProperties,
|
|
3
|
+
FieldHeaderProperties,
|
|
4
|
+
SliderFieldProperties,
|
|
5
|
+
SliderProperties,
|
|
6
|
+
SliderTicksProperties,
|
|
7
|
+
} from "@/codegen/component-properties";
|
|
8
|
+
import { defineComponentHandler } from "@/codegen/core";
|
|
9
|
+
import * as metadata from "@/entities/data/__generated__/component-sets";
|
|
10
|
+
import { createLocalSnippetHelper } from "../../element-factories";
|
|
11
|
+
import type { ComponentHandlerDeps } from "../deps.interface";
|
|
12
|
+
import { match } from "ts-pattern";
|
|
13
|
+
import { findAllInstances } from "@/utils/figma-node";
|
|
14
|
+
import {
|
|
15
|
+
createFieldFooterHandler,
|
|
16
|
+
createFieldHeaderHandler,
|
|
17
|
+
FIELD_KEYS,
|
|
18
|
+
type FieldFooterProps,
|
|
19
|
+
type FieldHeaderProps,
|
|
20
|
+
} from "@/codegen/targets/react/component/handlers/field";
|
|
21
|
+
|
|
22
|
+
const { createLocalSnippetElement } = createLocalSnippetHelper("slider");
|
|
23
|
+
|
|
24
|
+
const SLIDER_TICK_KEY = "ace432ffb7a2af13bce549b19c932ac5f96a9a78";
|
|
25
|
+
|
|
26
|
+
function getSliderComment(props: { markers?: unknown; ticks?: unknown } & Record<string, unknown>) {
|
|
27
|
+
return [
|
|
28
|
+
"min, max, step 값을 적절히 조정해주세요.",
|
|
29
|
+
props.markers && "markers 배열을 채워주세요.",
|
|
30
|
+
props.ticks && "ticks 배열을 채워주세요.",
|
|
31
|
+
]
|
|
32
|
+
.filter(Boolean)
|
|
33
|
+
.join(" ");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const createSliderFieldHandler = (ctx: ComponentHandlerDeps) => {
|
|
37
|
+
const sliderHandler = createSliderHandler(ctx);
|
|
38
|
+
const fieldHeaderHandler = createFieldHeaderHandler(ctx);
|
|
39
|
+
const fieldFooterHandler = createFieldFooterHandler(ctx);
|
|
40
|
+
|
|
41
|
+
return defineComponentHandler<SliderFieldProperties>(
|
|
42
|
+
metadata.templateSliderField.key,
|
|
43
|
+
(node, traverse) => {
|
|
44
|
+
const props = node.componentProperties;
|
|
45
|
+
|
|
46
|
+
const [slider] = findAllInstances<SliderProperties>({ node, key: metadata.slider.key });
|
|
47
|
+
const [fieldHeader] = findAllInstances<FieldHeaderProperties>({
|
|
48
|
+
node,
|
|
49
|
+
key: FIELD_KEYS.HEADER,
|
|
50
|
+
});
|
|
51
|
+
const [fieldFooter] = findAllInstances<FieldFooterProperties>({
|
|
52
|
+
node,
|
|
53
|
+
key: FIELD_KEYS.FOOTER,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
const sliderProps = sliderHandler.transform(slider, traverse).props;
|
|
57
|
+
|
|
58
|
+
// maxGraphemeCount and required can't be props of Slider
|
|
59
|
+
const { required: __required, ...headerProps } =
|
|
60
|
+
props["Show Header#40606:8"].value && fieldHeader
|
|
61
|
+
? (fieldHeaderHandler.transform(fieldHeader, traverse).props as FieldHeaderProps)
|
|
62
|
+
: {};
|
|
63
|
+
const { maxGraphemeCount: __maxGraphemeCount, ...footerProps } =
|
|
64
|
+
props["Show Footer#40606:9"].value && fieldFooter
|
|
65
|
+
? (fieldFooterHandler.transform(fieldFooter, traverse).props as FieldFooterProps)
|
|
66
|
+
: {};
|
|
67
|
+
|
|
68
|
+
const commonProps = {
|
|
69
|
+
...sliderProps,
|
|
70
|
+
...headerProps,
|
|
71
|
+
...footerProps,
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
return createLocalSnippetElement("Slider", commonProps, undefined, {
|
|
75
|
+
comment: getSliderComment(commonProps),
|
|
76
|
+
});
|
|
77
|
+
},
|
|
78
|
+
);
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
export const createSliderHandler = (_ctx: ComponentHandlerDeps) => {
|
|
82
|
+
return defineComponentHandler<SliderProperties>(metadata.slider.key, (node) => {
|
|
83
|
+
const { componentProperties: props } = node;
|
|
84
|
+
|
|
85
|
+
const { min, max, defaultValues } = match(props.Value.value)
|
|
86
|
+
.with("Single", () => ({ min: 0, max: 100, defaultValues: [50] }))
|
|
87
|
+
.with("Range", () => ({ min: 0, max: 100, defaultValues: [0, 50] }))
|
|
88
|
+
.exhaustive();
|
|
89
|
+
|
|
90
|
+
const [ticks] = findAllInstances<SliderTicksProperties>({ node, key: SLIDER_TICK_KEY });
|
|
91
|
+
|
|
92
|
+
const commonProps = {
|
|
93
|
+
min,
|
|
94
|
+
max,
|
|
95
|
+
defaultValues,
|
|
96
|
+
hideRange: props["Show Active Track#48156:0"].value === false,
|
|
97
|
+
...(props["Show Markers#49596:0"].value === true && {
|
|
98
|
+
markers: [],
|
|
99
|
+
}),
|
|
100
|
+
...(props["Has Tick Mark#47921:0"].value === true &&
|
|
101
|
+
ticks && {
|
|
102
|
+
ticks: [],
|
|
103
|
+
tickWeight: ticks.componentProperties.Type.value === "Discrete" ? "thick" : "thin",
|
|
104
|
+
}),
|
|
105
|
+
...(props.State.value === "Disabled" && {
|
|
106
|
+
disabled: true,
|
|
107
|
+
}),
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
return createLocalSnippetElement("Slider", commonProps, undefined, {
|
|
111
|
+
comment: getSliderComment(commonProps),
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
};
|