From 6cb88cdba13077be3354c1cf31344efe85aa40b1 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Tue, 29 Jul 2025 11:11:05 +0900 Subject: [PATCH 1/4] Optimize typing --- packages/react/src/types/props/index.ts | 8 ++++++-- packages/react/src/utils/css.ts | 14 +++----------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/react/src/types/props/index.ts b/packages/react/src/types/props/index.ts index 7dd84558..73725cb3 100644 --- a/packages/react/src/types/props/index.ts +++ b/packages/react/src/types/props/index.ts @@ -23,6 +23,7 @@ export interface DevupShortcutsProps DevupUiMotionPathProps, DevupUiPositionProps, DevupUiTextProps {} + export type DevupCommonProps = Merge< { [K in keyof Properties]?: ResponsiveValue @@ -30,10 +31,13 @@ export type DevupCommonProps = Merge< DevupShortcutsProps > -export interface DevupProps +export interface DevupProps extends DevupCommonProps, DevupSelectorProps, - DevupThemeSelectorProps { + DevupThemeSelectorProps {} + +export interface DevupComponentProps + extends DevupProps { as?: T styleVars?: Record } diff --git a/packages/react/src/utils/css.ts b/packages/react/src/utils/css.ts index 22414662..4d649f5e 100644 --- a/packages/react/src/utils/css.ts +++ b/packages/react/src/utils/css.ts @@ -1,20 +1,12 @@ -import type { DevupCommonProps } from '../types/props' -import type { DevupSelectorProps } from '../types/props/selector' -import type { DevupThemeSelectorProps } from '../types/props/selector' +import type { DevupProps } from '../types/props' -export function css( - props: DevupCommonProps | DevupSelectorProps | DevupThemeSelectorProps, -): string +export function css(props: DevupProps): string export function css(strings: TemplateStringsArray): string export function css(): string export function css( // eslint-disable-next-line @typescript-eslint/no-unused-vars - strings?: - | TemplateStringsArray - | DevupCommonProps - | DevupSelectorProps - | DevupThemeSelectorProps, + strings?: TemplateStringsArray | DevupProps, ): string { throw new Error('Cannot run on the runtime') } From 7dba3e91347c870a84fef4705bd744e940c271b3 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Tue, 29 Jul 2025 11:15:47 +0900 Subject: [PATCH 2/4] Optimize typing --- .changeset/tough-swans-see.md | 5 ++++ .../src/types/props/__tests__/index.test-d.ts | 23 ++++++++++--------- 2 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 .changeset/tough-swans-see.md diff --git a/.changeset/tough-swans-see.md b/.changeset/tough-swans-see.md new file mode 100644 index 00000000..1f7234be --- /dev/null +++ b/.changeset/tough-swans-see.md @@ -0,0 +1,5 @@ +--- +"@devup-ui/react": patch +--- + +Optimize typing diff --git a/packages/react/src/types/props/__tests__/index.test-d.ts b/packages/react/src/types/props/__tests__/index.test-d.ts index 31a43321..4e540007 100644 --- a/packages/react/src/types/props/__tests__/index.test-d.ts +++ b/packages/react/src/types/props/__tests__/index.test-d.ts @@ -1,5 +1,4 @@ -import type { DevupCommonProps, DevupProps } from '..' -import type { DevupSelectorProps } from '../selector' +import type { DevupCommonProps, DevupComponentProps } from '..' describe('index', () => { it('DevupCommonProps', () => { @@ -10,7 +9,7 @@ describe('index', () => { }) it('DevupCommonProps _selector', () => { - assertType>({ + assertType>({ _hover: { bg: 'red', _active: { @@ -19,24 +18,26 @@ describe('index', () => { }, }) - assertType>({ + assertType>({ _hover: ` background-color: red; `, }) - expectTypeOf>().toExtend['_hover']>() + expectTypeOf>().toExtend< + DevupComponentProps<'div'>['_hover'] + >() }) it('DevupCommonProps selectors', () => { - assertType>({ + assertType>({ selectors: { '&:hover': { bg: 'red', }, }, }) - assertType>({ + assertType>({ selectors: { '&:hover': ` background-color: red; @@ -44,7 +45,7 @@ describe('index', () => { }, }) - assertType>({ + assertType>({ selectors: { '&:hover': [ ` @@ -58,7 +59,7 @@ describe('index', () => { }) }) it('DevupSelectorProps', () => { - assertType({ + assertType>({ _hover: { bg: 'red', }, @@ -68,7 +69,7 @@ describe('index', () => { }, }, }) - assertType({ + assertType>({ selectors: { '&:hover': ` background-color: red; @@ -79,7 +80,7 @@ describe('index', () => { }, }) - assertType({ + assertType>({ _hover: ` background-color: red; `, From 75cf638ceeba4864cc1404dfafb8b80be4a745bc Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Tue, 29 Jul 2025 11:18:54 +0900 Subject: [PATCH 3/4] Optimize typing --- packages/react/src/components/Box.tsx | 4 ++-- packages/react/src/components/Button.tsx | 4 ++-- packages/react/src/components/Center.tsx | 4 ++-- packages/react/src/components/Flex.tsx | 4 ++-- packages/react/src/components/Grid.tsx | 4 ++-- packages/react/src/components/Image.tsx | 4 ++-- packages/react/src/components/Input.tsx | 4 ++-- packages/react/src/components/Text.tsx | 4 ++-- packages/react/src/components/ThemeScript.tsx | 3 +-- packages/react/src/components/VStack.tsx | 4 ++-- 10 files changed, 19 insertions(+), 20 deletions(-) diff --git a/packages/react/src/components/Box.tsx b/packages/react/src/components/Box.tsx index 5a08f423..d2531a0d 100644 --- a/packages/react/src/components/Box.tsx +++ b/packages/react/src/components/Box.tsx @@ -1,9 +1,9 @@ -import type { DevupProps } from '../types/props' +import type { DevupComponentProps } from '../types/props' import type { Merge } from '../types/utils' export function Box( // eslint-disable-next-line @typescript-eslint/no-unused-vars - props: Merge, DevupProps>, + props: Merge, DevupComponentProps>, ): React.ReactElement { throw new Error('Cannot run on the runtime') } diff --git a/packages/react/src/components/Button.tsx b/packages/react/src/components/Button.tsx index 809db4c3..3a56bd2b 100644 --- a/packages/react/src/components/Button.tsx +++ b/packages/react/src/components/Button.tsx @@ -1,9 +1,9 @@ -import type { DevupProps } from '../types/props' +import type { DevupComponentProps } from '../types/props' import type { Merge } from '../types/utils' export function Button( // eslint-disable-next-line @typescript-eslint/no-unused-vars - props: Merge, DevupProps>, + props: Merge, DevupComponentProps>, ): React.ReactElement { throw new Error('Cannot run on the runtime') } diff --git a/packages/react/src/components/Center.tsx b/packages/react/src/components/Center.tsx index 6b3fa786..3b04b514 100644 --- a/packages/react/src/components/Center.tsx +++ b/packages/react/src/components/Center.tsx @@ -1,9 +1,9 @@ -import type { DevupProps } from '../types/props' +import type { DevupComponentProps } from '../types/props' import type { Merge } from '../types/utils' export function Center( // eslint-disable-next-line @typescript-eslint/no-unused-vars - props: Merge, DevupProps>, + props: Merge, DevupComponentProps>, ): React.ReactElement { throw new Error('Cannot run on the runtime') } diff --git a/packages/react/src/components/Flex.tsx b/packages/react/src/components/Flex.tsx index 7f664c2c..cfc30109 100644 --- a/packages/react/src/components/Flex.tsx +++ b/packages/react/src/components/Flex.tsx @@ -1,9 +1,9 @@ -import type { DevupProps } from '../types/props' +import type { DevupComponentProps } from '../types/props' import type { Merge } from '../types/utils' export function Flex( // eslint-disable-next-line @typescript-eslint/no-unused-vars - props: Merge, DevupProps>, + props: Merge, DevupComponentProps>, ): React.ReactElement { throw new Error('Cannot run on the runtime') } diff --git a/packages/react/src/components/Grid.tsx b/packages/react/src/components/Grid.tsx index a507d0cc..5fcdec42 100644 --- a/packages/react/src/components/Grid.tsx +++ b/packages/react/src/components/Grid.tsx @@ -1,9 +1,9 @@ -import type { DevupProps } from '../types/props' +import type { DevupComponentProps } from '../types/props' import type { Merge } from '../types/utils' export function Grid( // eslint-disable-next-line @typescript-eslint/no-unused-vars - props: Merge, DevupProps>, + props: Merge, DevupComponentProps>, ): React.ReactElement { throw new Error('Cannot run on the runtime') } diff --git a/packages/react/src/components/Image.tsx b/packages/react/src/components/Image.tsx index 00c9a82a..8ab61153 100644 --- a/packages/react/src/components/Image.tsx +++ b/packages/react/src/components/Image.tsx @@ -1,9 +1,9 @@ -import type { DevupProps } from '../types/props' +import type { DevupComponentProps } from '../types/props' import type { Merge } from '../types/utils' export function Image( // eslint-disable-next-line @typescript-eslint/no-unused-vars - props: Merge, DevupProps>, + props: Merge, DevupComponentProps>, ): React.ReactElement { throw new Error('Cannot run on the runtime') } diff --git a/packages/react/src/components/Input.tsx b/packages/react/src/components/Input.tsx index 524c6560..caf9dcdb 100644 --- a/packages/react/src/components/Input.tsx +++ b/packages/react/src/components/Input.tsx @@ -1,9 +1,9 @@ -import type { DevupProps } from '../types/props' +import type { DevupComponentProps } from '../types/props' import type { Merge } from '../types/utils' export function Input( // eslint-disable-next-line @typescript-eslint/no-unused-vars - props: Merge, DevupProps>, + props: Merge, DevupComponentProps>, ): React.ReactElement { throw new Error('Cannot run on the runtime') } diff --git a/packages/react/src/components/Text.tsx b/packages/react/src/components/Text.tsx index b99be487..5a9cd0db 100644 --- a/packages/react/src/components/Text.tsx +++ b/packages/react/src/components/Text.tsx @@ -1,9 +1,9 @@ -import type { DevupProps } from '../types/props' +import type { DevupComponentProps } from '../types/props' import type { Merge } from '../types/utils' export function Text( // eslint-disable-next-line @typescript-eslint/no-unused-vars - props: Merge, DevupProps>, + props: Merge, DevupComponentProps>, ): React.ReactElement { throw new Error('Cannot run on the runtime') } diff --git a/packages/react/src/components/ThemeScript.tsx b/packages/react/src/components/ThemeScript.tsx index 14fffed6..07c2ff54 100644 --- a/packages/react/src/components/ThemeScript.tsx +++ b/packages/react/src/components/ThemeScript.tsx @@ -1,6 +1,5 @@ -import type { Conditional } from 'src/types/utils' - import type { DevupTheme } from '../types/theme' +import type { Conditional } from '../types/utils' interface ThemeScriptProps { auto?: boolean diff --git a/packages/react/src/components/VStack.tsx b/packages/react/src/components/VStack.tsx index 58df5e3b..2814af4d 100644 --- a/packages/react/src/components/VStack.tsx +++ b/packages/react/src/components/VStack.tsx @@ -1,9 +1,9 @@ -import type { DevupProps } from '../types/props' +import type { DevupComponentProps } from '../types/props' import type { Merge } from '../types/utils' export function VStack( // eslint-disable-next-line @typescript-eslint/no-unused-vars - props: Merge, DevupProps>, + props: Merge, DevupComponentProps>, ): React.ReactElement { throw new Error('Cannot run on the runtime') } From a92eb63d4f7383f33a14d6041771a77a0d742d89 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Tue, 29 Jul 2025 12:04:01 +0900 Subject: [PATCH 4/4] Optimize typing --- packages/react/src/types/props/index.ts | 9 +++++---- packages/react/src/types/props/selector/index.ts | 13 ++++--------- packages/react/src/utils/css.ts | 6 +++--- 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/packages/react/src/types/props/index.ts b/packages/react/src/types/props/index.ts index 73725cb3..76f68bc7 100644 --- a/packages/react/src/types/props/index.ts +++ b/packages/react/src/types/props/index.ts @@ -31,13 +31,14 @@ export type DevupCommonProps = Merge< DevupShortcutsProps > -export interface DevupProps - extends DevupCommonProps, - DevupSelectorProps, +export interface DevupProps extends DevupCommonProps, DevupSelectorProps {} + +export interface DevupPropsWithTheme + extends DevupProps, DevupThemeSelectorProps {} export interface DevupComponentProps - extends DevupProps { + extends DevupPropsWithTheme { as?: T styleVars?: Record } diff --git a/packages/react/src/types/props/selector/index.ts b/packages/react/src/types/props/selector/index.ts index 5b7f5334..683d0f6b 100644 --- a/packages/react/src/types/props/selector/index.ts +++ b/packages/react/src/types/props/selector/index.ts @@ -2,7 +2,7 @@ import type { Pseudos } from 'csstype' import type { ResponsiveValue } from '../../responsive-value' import type { DevupTheme } from '../../theme' -import type { DevupCommonProps } from '../index' +import type { DevupProps } from '../index' type CamelCase = S extends Lowercase @@ -13,18 +13,13 @@ type CamelCase = type PascalCase = Capitalize> +type SelectorProps = ResponsiveValue export type DevupThemeSelectorProps = keyof DevupTheme extends undefined - ? Record<`_theme${string}`, DevupCommonProps & DevupSelectorProps> + ? Record<`_theme${string}`, SelectorProps> : { - [K in keyof DevupTheme as `_theme${PascalCase}`]?: DevupCommonProps & - DevupSelectorProps + [K in keyof DevupTheme as `_theme${PascalCase}`]?: SelectorProps } -type SelectorProps = ResponsiveValue< - | (DevupCommonProps & DevupSelectorProps & DevupThemeSelectorProps) - | string - | false -> type NormalSelector = Exclude< Pseudos, `:-${string}` | `::-${string}` | `${string}()` diff --git a/packages/react/src/utils/css.ts b/packages/react/src/utils/css.ts index 4d649f5e..63d6b483 100644 --- a/packages/react/src/utils/css.ts +++ b/packages/react/src/utils/css.ts @@ -1,12 +1,12 @@ -import type { DevupProps } from '../types/props' +import type { DevupPropsWithTheme } from '../types/props' -export function css(props: DevupProps): string +export function css(props: DevupPropsWithTheme): string export function css(strings: TemplateStringsArray): string export function css(): string export function css( // eslint-disable-next-line @typescript-eslint/no-unused-vars - strings?: TemplateStringsArray | DevupProps, + strings?: TemplateStringsArray | DevupPropsWithTheme, ): string { throw new Error('Cannot run on the runtime') }