diff --git a/.changeset/popular-bags-itch.md b/.changeset/popular-bags-itch.md
new file mode 100644
index 00000000..15d30b1f
--- /dev/null
+++ b/.changeset/popular-bags-itch.md
@@ -0,0 +1,5 @@
+---
+"@devup-ui/react": patch
+---
+
+Add group selector
diff --git a/.changeset/strong-parents-change.md b/.changeset/strong-parents-change.md
new file mode 100644
index 00000000..9e408467
--- /dev/null
+++ b/.changeset/strong-parents-change.md
@@ -0,0 +1,5 @@
+---
+"@devup-ui/wasm": patch
+---
+
+Add group selector, Support conditional expression for typography
diff --git a/apps/landing/src/app/(detail)/docs/LeftMenu.tsx b/apps/landing/src/app/(detail)/docs/LeftMenu.tsx
index ce3a5bec..75dc71e4 100644
--- a/apps/landing/src/app/(detail)/docs/LeftMenu.tsx
+++ b/apps/landing/src/app/(detail)/docs/LeftMenu.tsx
@@ -1,109 +1,90 @@
-import { Box, Flex, Image, Text, VStack } from '@devup-ui/react'
+import { VStack } from '@devup-ui/react'
+
+import { URL_PREFIX } from '../../../constants'
+import { MenuItem } from './MenuItem'
export function LeftMenu() {
return (
-
-
- 개요
-
-
- Overview
+
+
+
+
-
-
- 개념
-
-
-
-
-
-
-
-
- 유틸리티 퍼스트
-
-
-
-
- 하이브리드 접근 방식
-
-
-
-
- 헤드리스 컴포넌트
-
-
-
-
-
-
- 구성 요소
-
-
-
-
-
- API
-
-
-
-
-
-
-
-
- 스타일이 지정됨
-
-
-
-
- CSS
-
-
-
-
-
-
- 테마
-
-
-
-
-
-
-
-
- 테마 사용자 정의
-
-
-
-
- 테마 토큰
-
-
-
-
- 중단점
-
-
-
-
- 구성 요소 테마
-
-
-
-
+ Devup
+
)
}
diff --git a/apps/landing/src/app/(detail)/docs/MenuItem.tsx b/apps/landing/src/app/(detail)/docs/MenuItem.tsx
new file mode 100644
index 00000000..7b599645
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/MenuItem.tsx
@@ -0,0 +1,52 @@
+import { Box, css, Flex, Image, Text } from '@devup-ui/react'
+import Link from 'next/link'
+
+import { OpenMenuItem } from './OpenMenuItem'
+
+export interface MenuItemProps {
+ selected?: boolean
+ children?: React.ReactNode
+ to?: string
+ subMenu?: {
+ selected?: boolean
+ children?: React.ReactNode
+ to?: string
+ }[]
+}
+
+export function MenuItem(props: MenuItemProps) {
+ const { selected, children, to, subMenu } = props
+ if (subMenu) return
+ const inner = (
+
+ {selected && }
+
+ {children}
+
+ {subMenu && }
+
+ )
+ return to ? (
+
+ {inner}
+
+ ) : (
+ inner
+ )
+}
diff --git a/apps/landing/src/app/(detail)/docs/OpenMenuItem.tsx b/apps/landing/src/app/(detail)/docs/OpenMenuItem.tsx
new file mode 100644
index 00000000..2e6046e2
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/OpenMenuItem.tsx
@@ -0,0 +1,83 @@
+'use client'
+import { Box, css, Flex, Image, Text, VStack } from '@devup-ui/react'
+import Link from 'next/link'
+import { Fragment, useReducer } from 'react'
+
+import { MenuItemProps } from './MenuItem'
+
+export function OpenMenuItem({
+ selected,
+ children,
+ subMenu,
+}: Omit &
+ Required>) {
+ const [open, handleOpen] = useReducer((state) => !state, false)
+ return (
+ <>
+
+ {selected && }
+
+ {children}
+
+ {subMenu && (
+
+ )}
+
+ {open && (
+
+
+
+ {subMenu.map(({ children, to }, idx) => {
+ const inner = (
+
+
+
+ {children}
+
+
+ )
+
+ return to ? (
+
+ {inner}
+
+ ) : (
+ {inner}
+ )
+ })}
+
+
+ )}
+ >
+ )
+}
diff --git a/apps/landing/src/app/(detail)/docs/api/box/page.mdx b/apps/landing/src/app/(detail)/docs/api/box/page.mdx
new file mode 100644
index 00000000..2436f01e
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/box/page.mdx
@@ -0,0 +1 @@
+# Box
diff --git a/apps/landing/src/app/(detail)/docs/api/button/page.mdx b/apps/landing/src/app/(detail)/docs/api/button/page.mdx
new file mode 100644
index 00000000..88423dcb
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/button/page.mdx
@@ -0,0 +1 @@
+# Button
diff --git a/apps/landing/src/app/(detail)/docs/api/center/page.mdx b/apps/landing/src/app/(detail)/docs/api/center/page.mdx
new file mode 100644
index 00000000..160a1609
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/center/page.mdx
@@ -0,0 +1 @@
+# Center
diff --git a/apps/landing/src/app/(detail)/docs/api/css/page.mdx b/apps/landing/src/app/(detail)/docs/api/css/page.mdx
new file mode 100644
index 00000000..4988447f
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/css/page.mdx
@@ -0,0 +1 @@
+# css
diff --git a/apps/landing/src/app/(detail)/docs/api/flex/page.mdx b/apps/landing/src/app/(detail)/docs/api/flex/page.mdx
new file mode 100644
index 00000000..61104142
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/flex/page.mdx
@@ -0,0 +1 @@
+# Flex
diff --git a/apps/landing/src/app/(detail)/docs/api/group-selector/page.mdx b/apps/landing/src/app/(detail)/docs/api/group-selector/page.mdx
new file mode 100644
index 00000000..3fcbaa3b
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/group-selector/page.mdx
@@ -0,0 +1 @@
+# Group Selector
diff --git a/apps/landing/src/app/(detail)/docs/api/image/page.mdx b/apps/landing/src/app/(detail)/docs/api/image/page.mdx
new file mode 100644
index 00000000..77cfc546
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/image/page.mdx
@@ -0,0 +1 @@
+# Image
diff --git a/apps/landing/src/app/(detail)/docs/api/input/page.mdx b/apps/landing/src/app/(detail)/docs/api/input/page.mdx
new file mode 100644
index 00000000..135b6af3
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/input/page.mdx
@@ -0,0 +1 @@
+# Input
diff --git a/apps/landing/src/app/(detail)/docs/api/selector/page.mdx b/apps/landing/src/app/(detail)/docs/api/selector/page.mdx
new file mode 100644
index 00000000..45ceab8f
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/selector/page.mdx
@@ -0,0 +1 @@
+# Selector
diff --git a/apps/landing/src/app/(detail)/docs/api/style-props/page.mdx b/apps/landing/src/app/(detail)/docs/api/style-props/page.mdx
new file mode 100644
index 00000000..30dcd82e
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/style-props/page.mdx
@@ -0,0 +1 @@
+# Style Props
diff --git a/apps/landing/src/app/(detail)/docs/api/text/page.mdx b/apps/landing/src/app/(detail)/docs/api/text/page.mdx
new file mode 100644
index 00000000..bb182be3
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/text/page.mdx
@@ -0,0 +1 @@
+# Text
diff --git a/apps/landing/src/app/(detail)/docs/api/v-stack/page.mdx b/apps/landing/src/app/(detail)/docs/api/v-stack/page.mdx
new file mode 100644
index 00000000..7172ca68
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/api/v-stack/page.mdx
@@ -0,0 +1 @@
+# VStack
diff --git a/apps/landing/src/app/(detail)/docs/devup/breakpoints/page.mdx b/apps/landing/src/app/(detail)/docs/devup/breakpoints/page.mdx
new file mode 100644
index 00000000..0c337a77
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/devup/breakpoints/page.mdx
@@ -0,0 +1 @@
+# Breakpoints
diff --git a/apps/landing/src/app/(detail)/docs/devup/colors/page.mdx b/apps/landing/src/app/(detail)/docs/devup/colors/page.mdx
new file mode 100644
index 00000000..302161a2
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/devup/colors/page.mdx
@@ -0,0 +1 @@
+# Colors
diff --git a/apps/landing/src/app/(detail)/docs/devup/devup-json/page.mdx b/apps/landing/src/app/(detail)/docs/devup/devup-json/page.mdx
new file mode 100644
index 00000000..b46107a7
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/devup/devup-json/page.mdx
@@ -0,0 +1 @@
+# devup.json
diff --git a/apps/landing/src/app/(detail)/docs/devup/typography/page.mdx b/apps/landing/src/app/(detail)/docs/devup/typography/page.mdx
new file mode 100644
index 00000000..c972c3a8
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/devup/typography/page.mdx
@@ -0,0 +1 @@
+# Typography
diff --git a/apps/landing/src/app/(detail)/docs/features/page.mdx b/apps/landing/src/app/(detail)/docs/features/page.mdx
new file mode 100644
index 00000000..ead02231
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/features/page.mdx
@@ -0,0 +1 @@
+# Features
diff --git a/apps/landing/src/app/(detail)/docs/installation/page.mdx b/apps/landing/src/app/(detail)/docs/installation/page.mdx
new file mode 100644
index 00000000..935fcb2f
--- /dev/null
+++ b/apps/landing/src/app/(detail)/docs/installation/page.mdx
@@ -0,0 +1,6 @@
+# Installation
+
+
+```bash
+npm install @deuvp-ui/react
+```
diff --git a/apps/landing/src/app/page.tsx b/apps/landing/src/app/page.tsx
index 7049be2e..d40efa7f 100644
--- a/apps/landing/src/app/page.tsx
+++ b/apps/landing/src/app/page.tsx
@@ -28,9 +28,9 @@ export default function HomePage() {
diff --git a/apps/landing/src/components/Header/HeaderWrap.tsx b/apps/landing/src/components/Header/HeaderWrap.tsx
index 440c13df..3b5487c8 100644
--- a/apps/landing/src/components/Header/HeaderWrap.tsx
+++ b/apps/landing/src/components/Header/HeaderWrap.tsx
@@ -5,33 +5,23 @@ import { usePathname } from 'next/navigation'
export function HeaderWrap({ children }: { children: React.ReactNode }) {
const path = usePathname()
- if (path !== '/') {
- return (
-
-
- {children}
-
-
- )
- }
+ const isRoot = path === '/'
return (
-
+
diff --git a/apps/landing/src/components/Header/index.tsx b/apps/landing/src/components/Header/index.tsx
index 3d3b1712..d08fed89 100644
--- a/apps/landing/src/components/Header/index.tsx
+++ b/apps/landing/src/components/Header/index.tsx
@@ -9,9 +9,9 @@ export function Header() {
@@ -20,9 +20,9 @@ export function Header() {
@@ -32,9 +32,9 @@ export function Header() {
@@ -45,9 +45,9 @@ export function Header() {
@@ -56,9 +56,9 @@ export function Header() {
diff --git a/bindings/devup-ui-wasm/src/lib.rs b/bindings/devup-ui-wasm/src/lib.rs
index 88c0df51..11592055 100644
--- a/bindings/devup-ui-wasm/src/lib.rs
+++ b/bindings/devup-ui-wasm/src/lib.rs
@@ -8,7 +8,8 @@ use std::collections::HashSet;
use std::sync::Mutex;
use wasm_bindgen::prelude::*;
-static GLOBAL_STYLE_SHEET: Lazy> = Lazy::new(|| Mutex::new(StyleSheet::new()));
+static GLOBAL_STYLE_SHEET: Lazy> =
+ Lazy::new(|| Mutex::new(StyleSheet::default()));
#[wasm_bindgen]
pub struct Output {
@@ -131,7 +132,7 @@ pub fn object_to_typography(obj: Object, level: u8) -> Result Result {
- let mut theme = Theme::new();
+ let mut theme = Theme::default();
if let Ok(obj) = js_value.dyn_into::