Skip to content

Commit bb96e05

Browse files
fix(core): corrected color schema generation logic
1 parent 8e0bb42 commit bb96e05

File tree

6 files changed

+106
-73
lines changed

6 files changed

+106
-73
lines changed

.changeset/giant-taxis-sing.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@yamada-ui/core": patch
3+
---
4+
5+
Fixed a bug where the semantic color schema was not generated correctly.

.changeset/gorgeous-fireants-grin.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@yamada-ui/cli": patch
3+
---
4+
5+
Fixed a bug where the semantic color schema type definition could not be generated correctly.

packages/cli/src/command/tokens/create-theme-typings.ts

+18-14
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { isArray, isObject, omitObject, prettier } from "../../utils"
1+
import { isArray, isObject, isString, omitObject, prettier } from "../../utils"
22
import { config } from "./config"
33

44
type Component = {
@@ -100,22 +100,26 @@ export const extractColorSchemes = (theme: any) => {
100100
if (!isTone(value)) return
101101

102102
results.colorSchemes.push(key)
103+
})
103104

104-
const semanticKeys =
105-
Object.entries(semantics?.colorSchemes ?? {})
106-
.filter(([, relatedKey]) => key === relatedKey)
107-
.map(([key]) => key) ?? []
105+
if (!isObject(semantics?.colorSchemes)) return results
108106

109-
if (!semanticKeys.length) return
107+
Object.entries(semantics.colorSchemes).forEach(([key, value]) => {
108+
if (isTone(value)) {
109+
results.colorSchemes.push(key)
110+
results.colorSchemeColors.push(...tones.map((tone) => `${key}.${tone}`))
111+
} else {
112+
const hasColorScheme = isArray(value)
113+
? value.every(
114+
(key) => isString(key) && Object.keys(colors).includes(key),
115+
)
116+
: Object.keys(colors).some((key) => key === value)
110117

111-
results.colorSchemes.push(...semanticKeys)
112-
results.colorSchemeColors.push(
113-
...semanticKeys
114-
.map((semanticKey) =>
115-
Object.keys(value).map((hue) => `${semanticKey}.${hue}`),
116-
)
117-
.flat(),
118-
)
118+
if (!hasColorScheme) return
119+
120+
results.colorSchemes.push(key)
121+
results.colorSchemeColors.push(...tones.map((tone) => `${key}.${tone}`))
122+
}
119123
})
120124

121125
return results

packages/core/src/generated-theme.types.ts

+51-51
Original file line numberDiff line numberDiff line change
@@ -261,39 +261,6 @@ export interface GeneratedTheme extends UITheme {
261261
| "warning"
262262
| "danger"
263263
| "link"
264-
| "danger.50"
265-
| "danger.100"
266-
| "danger.200"
267-
| "danger.300"
268-
| "danger.400"
269-
| "danger.500"
270-
| "danger.600"
271-
| "danger.700"
272-
| "danger.800"
273-
| "danger.900"
274-
| "danger.950"
275-
| "warning.50"
276-
| "warning.100"
277-
| "warning.200"
278-
| "warning.300"
279-
| "warning.400"
280-
| "warning.500"
281-
| "warning.600"
282-
| "warning.700"
283-
| "warning.800"
284-
| "warning.900"
285-
| "warning.950"
286-
| "success.50"
287-
| "success.100"
288-
| "success.200"
289-
| "success.300"
290-
| "success.400"
291-
| "success.500"
292-
| "success.600"
293-
| "success.700"
294-
| "success.800"
295-
| "success.900"
296-
| "success.950"
297264
| "primary.50"
298265
| "primary.100"
299266
| "primary.200"
@@ -305,6 +272,17 @@ export interface GeneratedTheme extends UITheme {
305272
| "primary.800"
306273
| "primary.900"
307274
| "primary.950"
275+
| "secondary.50"
276+
| "secondary.100"
277+
| "secondary.200"
278+
| "secondary.300"
279+
| "secondary.400"
280+
| "secondary.500"
281+
| "secondary.600"
282+
| "secondary.700"
283+
| "secondary.800"
284+
| "secondary.900"
285+
| "secondary.950"
308286
| "info.50"
309287
| "info.100"
310288
| "info.200"
@@ -316,6 +294,39 @@ export interface GeneratedTheme extends UITheme {
316294
| "info.800"
317295
| "info.900"
318296
| "info.950"
297+
| "success.50"
298+
| "success.100"
299+
| "success.200"
300+
| "success.300"
301+
| "success.400"
302+
| "success.500"
303+
| "success.600"
304+
| "success.700"
305+
| "success.800"
306+
| "success.900"
307+
| "success.950"
308+
| "warning.50"
309+
| "warning.100"
310+
| "warning.200"
311+
| "warning.300"
312+
| "warning.400"
313+
| "warning.500"
314+
| "warning.600"
315+
| "warning.700"
316+
| "warning.800"
317+
| "warning.900"
318+
| "warning.950"
319+
| "danger.50"
320+
| "danger.100"
321+
| "danger.200"
322+
| "danger.300"
323+
| "danger.400"
324+
| "danger.500"
325+
| "danger.600"
326+
| "danger.700"
327+
| "danger.800"
328+
| "danger.900"
329+
| "danger.950"
319330
| "link.50"
320331
| "link.100"
321332
| "link.200"
@@ -327,48 +338,37 @@ export interface GeneratedTheme extends UITheme {
327338
| "link.800"
328339
| "link.900"
329340
| "link.950"
330-
| "secondary.50"
331-
| "secondary.100"
332-
| "secondary.200"
333-
| "secondary.300"
334-
| "secondary.400"
335-
| "secondary.500"
336-
| "secondary.600"
337-
| "secondary.700"
338-
| "secondary.800"
339-
| "secondary.900"
340-
| "secondary.950"
341341
| (string & {})
342342
colorSchemes:
343343
| "whiteAlpha"
344344
| "blackAlpha"
345345
| "gray"
346346
| "neutral"
347347
| "red"
348-
| "danger"
349348
| "rose"
350349
| "pink"
351350
| "flashy"
352351
| "orange"
353-
| "warning"
354352
| "amber"
355353
| "yellow"
356354
| "lime"
357355
| "green"
358-
| "success"
359356
| "emerald"
360357
| "teal"
361358
| "cyan"
362359
| "sky"
363360
| "blue"
364-
| "primary"
365-
| "info"
366-
| "link"
367361
| "indigo"
368362
| "violet"
369-
| "secondary"
370363
| "purple"
371364
| "fuchsia"
365+
| "primary"
366+
| "secondary"
367+
| "info"
368+
| "success"
369+
| "warning"
370+
| "danger"
371+
| "link"
372372
| (string & {})
373373
fonts: "heading" | "body" | "mono" | (string & {})
374374
fontSizes:

packages/core/src/theme.ts

+19-7
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import {
44
objectFromEntries,
55
pickObject,
66
omitObject,
7-
tones,
87
isObject,
98
runIfFunc,
109
isFunction,
1110
merge,
11+
isArray,
12+
tones,
1213
} from "@yamada-ui/utils"
1314
import type { CSSUIObject, ThemeProps, UIStyle, UIStyleProps } from "./css"
1415
import { analyzeBreakpoints, createVars } from "./css"
@@ -142,7 +143,7 @@ const createTokens = (
142143
const defaultTokenEntries: [string, VarToken][] = Object.entries(
143144
flattenObject(defaultTokenMap, Infinity, omitKeys),
144145
).map(([token, value]) => {
145-
const enhancedToken = { isSemantic: false, value }
146+
const enhancedToken: VarToken = { isSemantic: false, value }
146147

147148
return [token, enhancedToken]
148149
})
@@ -151,15 +152,26 @@ const createTokens = (
151152
).reduce(
152153
(prev, [token, value]) => {
153154
if (token.startsWith("colorSchemes.")) {
154-
const [, semanticToken] = token.split(".")
155+
const [, semanticToken, tone] = token.split(".")
155156

156-
tones.forEach((tone) => {
157-
const enhancedToken = { isSemantic: true, value: `${value}.${tone}` }
157+
if (tone) {
158+
const enhancedToken = { isSemantic: false, value }
158159

159160
prev.push([`colors.${semanticToken}.${tone}`, enhancedToken])
160-
})
161+
} else {
162+
tones.forEach((tone) => {
163+
const enhancedToken: VarToken = {
164+
isSemantic: true,
165+
value: isArray(value)
166+
? [`${value[0]}.${tone}`, `${value[1]}.${tone}`]
167+
: `${value}.${tone}`,
168+
}
169+
170+
prev.push([`colors.${semanticToken}.${tone}`, enhancedToken])
171+
})
172+
}
161173
} else {
162-
const enhancedToken = { isSemantic: true, value }
174+
const enhancedToken: VarToken = { isSemantic: true, value }
163175

164176
prev.push([token, enhancedToken])
165177
}

packages/core/src/theme.types.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,14 @@ export type ThemeSemantics = Omit<
534534
| "breakpoints"
535535
| "animations"
536536
> & {
537-
colorSchemes?: Partial<Record<string, Theme["colorSchemes"]>>
537+
colorSchemes?: Partial<
538+
Record<
539+
string,
540+
| Theme["colorSchemes"]
541+
| [Theme["colorSchemes"], Theme["colorSchemes"]]
542+
| ThemeTokens
543+
>
544+
>
538545
animations?: ThemeAnimationTokens<AnimationStyle | string>
539546
}
540547
export type ThemeSchemes = Partial<

0 commit comments

Comments
 (0)