sh-ui-cli 0.58.2 → 0.58.4

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.
Files changed (104) hide show
  1. package/data/changelog/versions.json +35 -4
  2. package/data/registry/react/components/accordion/index.tailwind.tsx +1 -1
  3. package/data/registry/react/components/accordion/styles.css +1 -1
  4. package/data/registry/react/components/accordion/styles.module.css +1 -1
  5. package/data/registry/react/components/breadcrumb/index.tailwind.tsx +1 -1
  6. package/data/registry/react/components/breadcrumb/styles.css +1 -1
  7. package/data/registry/react/components/breadcrumb/styles.module.css +1 -1
  8. package/data/registry/react/components/button/index.tailwind.tsx +1 -1
  9. package/data/registry/react/components/button/styles.css +1 -2
  10. package/data/registry/react/components/button/styles.css.ts +1 -2
  11. package/data/registry/react/components/button/styles.module.css +1 -2
  12. package/data/registry/react/components/calendar/index.tailwind.tsx +3 -3
  13. package/data/registry/react/components/calendar/styles.css +3 -3
  14. package/data/registry/react/components/calendar/styles.module.css +3 -3
  15. package/data/registry/react/components/card/index.tailwind.tsx +1 -1
  16. package/data/registry/react/components/card/styles.css +1 -0
  17. package/data/registry/react/components/card/styles.css.ts +1 -0
  18. package/data/registry/react/components/card/styles.module.css +1 -0
  19. package/data/registry/react/components/carousel/index.tailwind.tsx +2 -2
  20. package/data/registry/react/components/carousel/styles.css +2 -2
  21. package/data/registry/react/components/carousel/styles.module.css +2 -2
  22. package/data/registry/react/components/checkbox/index.tailwind.tsx +1 -1
  23. package/data/registry/react/components/checkbox/styles.css +2 -2
  24. package/data/registry/react/components/checkbox/styles.module.css +2 -2
  25. package/data/registry/react/components/code-editor/index.tailwind.tsx +1 -1
  26. package/data/registry/react/components/code-editor/styles.css +1 -1
  27. package/data/registry/react/components/code-editor/styles.module.css +1 -1
  28. package/data/registry/react/components/code-panel/styles.css +1 -1
  29. package/data/registry/react/components/code-panel/styles.module.css +1 -1
  30. package/data/registry/react/components/color-picker/index.tailwind.tsx +2 -2
  31. package/data/registry/react/components/color-picker/styles.css +3 -3
  32. package/data/registry/react/components/color-picker/styles.module.css +3 -3
  33. package/data/registry/react/components/combobox/index.tailwind.tsx +1 -1
  34. package/data/registry/react/components/combobox/styles.css +1 -1
  35. package/data/registry/react/components/combobox/styles.module.css +1 -1
  36. package/data/registry/react/components/date-picker/index.tailwind.tsx +1 -1
  37. package/data/registry/react/components/date-picker/styles.css +2 -2
  38. package/data/registry/react/components/date-picker/styles.module.css +2 -2
  39. package/data/registry/react/components/dialog/index.tailwind.tsx +2 -2
  40. package/data/registry/react/components/dialog/styles.css +2 -2
  41. package/data/registry/react/components/dialog/styles.module.css +2 -2
  42. package/data/registry/react/components/dropdown-menu/index.tailwind.tsx +1 -1
  43. package/data/registry/react/components/dropdown-menu/styles.css +1 -1
  44. package/data/registry/react/components/dropdown-menu/styles.module.css +1 -1
  45. package/data/registry/react/components/file-upload/index.tailwind.tsx +3 -3
  46. package/data/registry/react/components/file-upload/styles.css +3 -3
  47. package/data/registry/react/components/file-upload/styles.module.css +3 -3
  48. package/data/registry/react/components/header/index.tailwind.tsx +3 -3
  49. package/data/registry/react/components/header/styles.css +3 -3
  50. package/data/registry/react/components/header/styles.module.css +3 -3
  51. package/data/registry/react/components/input/index.tailwind.tsx +3 -3
  52. package/data/registry/react/components/input/styles.css +5 -5
  53. package/data/registry/react/components/input/styles.css.ts +3 -3
  54. package/data/registry/react/components/input/styles.module.css +5 -5
  55. package/data/registry/react/components/menubar/styles.css +1 -1
  56. package/data/registry/react/components/menubar/styles.module.css +1 -1
  57. package/data/registry/react/components/numeric-input/index.tailwind.tsx +1 -1
  58. package/data/registry/react/components/numeric-input/styles.css +1 -1
  59. package/data/registry/react/components/numeric-input/styles.module.css +1 -1
  60. package/data/registry/react/components/page-toc/index.tailwind.tsx +1 -1
  61. package/data/registry/react/components/page-toc/styles.css +1 -1
  62. package/data/registry/react/components/page-toc/styles.module.css +1 -1
  63. package/data/registry/react/components/pagination/index.tailwind.tsx +1 -1
  64. package/data/registry/react/components/pagination/styles.css +1 -1
  65. package/data/registry/react/components/pagination/styles.module.css +1 -1
  66. package/data/registry/react/components/popover/index.tailwind.tsx +1 -1
  67. package/data/registry/react/components/popover/styles.css +1 -1
  68. package/data/registry/react/components/popover/styles.module.css +1 -1
  69. package/data/registry/react/components/radio/index.tailwind.tsx +1 -1
  70. package/data/registry/react/components/radio/styles.css +2 -2
  71. package/data/registry/react/components/radio/styles.module.css +2 -2
  72. package/data/registry/react/components/rich-text-editor/index.tailwind.tsx +2 -2
  73. package/data/registry/react/components/rich-text-editor/styles.css +2 -2
  74. package/data/registry/react/components/rich-text-editor/styles.module.css +2 -2
  75. package/data/registry/react/components/select/index.tailwind.tsx +1 -1
  76. package/data/registry/react/components/select/styles.css +2 -2
  77. package/data/registry/react/components/select/styles.module.css +2 -2
  78. package/data/registry/react/components/sidebar/index.tailwind.tsx +2 -2
  79. package/data/registry/react/components/sidebar/styles.css +2 -2
  80. package/data/registry/react/components/sidebar/styles.module.css +2 -2
  81. package/data/registry/react/components/slider/index.tailwind.tsx +1 -1
  82. package/data/registry/react/components/slider/styles.css +1 -1
  83. package/data/registry/react/components/slider/styles.module.css +1 -1
  84. package/data/registry/react/components/switch/index.tailwind.tsx +1 -1
  85. package/data/registry/react/components/switch/styles.css +1 -1
  86. package/data/registry/react/components/switch/styles.module.css +1 -1
  87. package/data/registry/react/components/tabs/index.tailwind.tsx +2 -2
  88. package/data/registry/react/components/tabs/styles.css +2 -2
  89. package/data/registry/react/components/tabs/styles.module.css +2 -2
  90. package/data/registry/react/components/textarea/index.tailwind.tsx +1 -1
  91. package/data/registry/react/components/textarea/styles.css +2 -2
  92. package/data/registry/react/components/textarea/styles.module.css +2 -2
  93. package/data/registry/react/components/toast/index.tailwind.tsx +1 -1
  94. package/data/registry/react/components/toast/styles.css +1 -1
  95. package/data/registry/react/components/toast/styles.module.css +1 -1
  96. package/data/registry/react/components/toggle/index.tailwind.tsx +1 -1
  97. package/data/registry/react/components/toggle/styles.css +1 -1
  98. package/data/registry/react/components/toggle/styles.module.css +1 -1
  99. package/package.json +1 -1
  100. package/templates/nextjs-standalone/_arch/flat/lib/styles/tokens.css +1 -0
  101. package/templates/nextjs-standalone/_arch/fsd/src/shared/styles/tokens.css +1 -0
  102. package/templates/nextjs-standalone/app/globals.css +1 -0
  103. package/templates/ui-app-template/src/styles/globals.css +1 -0
  104. package/templates/ui-app-template/src/styles/tokens.css +1 -0
@@ -2,15 +2,46 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$description": "sh-ui 릴리즈 노트 단일 소스. docs(React)와 showcase(Flutter)가 함께 읽는다. 새 릴리즈마다 맨 앞에 추가.",
4
4
  "versions": [
5
+ {
6
+ "version": "0.58.4",
7
+ "date": "2026-05-06",
8
+ "title": "디자인 디폴트 개편 3라운드 — 폼 필드의 focus·hover 색을 primary 로",
9
+ "type": "patch",
10
+ "highlights": [
11
+ "**input / textarea / numeric-input / date-picker / color-picker / checkbox / radio 의 focus·hover 색 통일** — 기존 `border-color: var(--foreground)` + `box-shadow: 0 0 0 1px var(--foreground)` 는 다크에서 순백 강조라 stark. `--primary` 로 변경 — 폼 필드의 활성 시 브랜드 톤으로 자연스럽게 표시.",
12
+ "**v0.58.3 의 ring 패턴과 정렬** — 버튼 / 컴포넌트 focus ring 은 `--ring` (primary 50%), 폼 필드 inline focus 는 `--primary` solid (1px 이라 풀 포화). 두 layer 가 brand 톤으로 일관.",
13
+ "**4 variant + 듀얼 카피본 + 템플릿 모두 동기화** — Tailwind / plain CSS / CSS Modules / vanilla-extract.",
14
+ "**Button danger 의 `hover:brightness-95` 는 다음 라운드** — `--danger-hover` 토큰 추가 필요해서 별도 검토 후 진행."
15
+ ],
16
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.58.4"
17
+ },
18
+ {
19
+ "version": "0.58.3",
20
+ "date": "2026-05-06",
21
+ "title": "디자인 디폴트 개편 2라운드 — `--ring` 토큰 도입 + 모든 focus ring 통일",
22
+ "type": "patch",
23
+ "highlights": [
24
+ "**`--ring` 토큰 신규 — `color-mix(in srgb, var(--primary) 50%, transparent)`** — primary 의 50% 투명도로 부드러운 focus ring. solid primary 는 다크에서 너무 시끄러웠고, foreground 는 너무 stark 했음. 50% 투명도가 둘의 절충 — 키보드 사용자에게는 식별 가능, 시각적으로는 부드러움. shadcn/ui · Radix · Linear 의 ring 패턴과 일관.",
25
+ "**`--color-ring: var(--ring)` @theme inline 매핑 추가** — Tailwind v4 에서 `outline-ring` 유틸로 사용 가능. 템플릿 + apps/docs + ui-app-template 모두 동기화.",
26
+ "**27개 컴포넌트의 focus ring 을 `--ring` 으로 일괄 변경** — accordion / badge / breadcrumb / button / calendar / carousel / card / checkbox / code-editor / code-panel / color-picker / combobox / dialog / dropdown-menu / file-upload / header / input / menubar / page-toc / pagination / popover / radio / rich-text-editor / select / sidebar / slider / switch / tabs / toast / toggle. 모든 컴포넌트가 같은 ring 톤 사용 — 디자인 일관성 확보.",
27
+ "**4가지 variant + 듀얼 카피본 + 템플릿 모두 동기화** — Tailwind / plain CSS / CSS Modules / vanilla-extract + apps/docs + cli/templates. sed 일괄 패치로 110+ 파일 갱신.",
28
+ "**철학 — focus ring 은 별도 token 으로 분리** — 사용자가 brand color 를 바꿔도 focus ring 의 \"부드러움\" 은 유지됨 (color-mix 로 primary 의 투명도 형태 유지). 매번 컴포넌트마다 결정하지 않도록 디자인 시스템이 책임.",
29
+ "**FYI — `outline-primary` 단독 솔리드 (이번 PR 초기 커밋) 는 squash 머지로 사용자에게 도달하지 않음.** 최종 머지 결과는 `outline-ring` (반투명 primary) 로 통일."
30
+ ],
31
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.58.3"
32
+ },
5
33
  {
6
34
  "version": "0.58.2",
7
35
  "date": "2026-05-06",
8
- "title": "Sidebar 메뉴 항목 기본 간격 gap 0 2px (한글/긴 라벨 가독성)",
36
+ "title": "디자인 디폴트 개편 1라운드 Sidebar / Button / Card",
9
37
  "type": "patch",
10
38
  "highlights": [
11
- "**`SidebarMenu` 기본 `gap` 을 `0``2px` (Tailwind `gap-0.5`)** 로 변경 한글이나 라벨에서 항목이 너무 촘촘하게 붙어 시각적으로 압축돼 보이던 문제. 디자인 시스템 디폴트 자체가 더 보편적으로 \"이상적\" 이 되도록 한 결정. shadcn/ui 의 `gap-0` 컨벤션과 살짝 갈리지만, sh-ui 의 한글 우선 + Linear 톤 정체성에 더 자연스러움.",
12
- "**4가지 변종 모두 동기화**plain CSS (`styles.css`), CSS Modules (`styles.module.css`), Tailwind variant (`index.tailwind.tsx`), apps/docs 듀얼 카피본. 영향: 사용자 화면이 항목당 ~2px 늘어남시각 변화 미세하지만 patch release 노트에 명시.",
13
- "**디자인 디폴트 가드 bare 단어 절대 치환 안 함**: 이번 변경은 `SidebarMenu` `gap` 손봤고, `SidebarContent` wrapper `gap-0` 의도적으로 유지 (그룹 간격은 별도 layout 결정)."
39
+ "**`SidebarMenu` 기본 `gap` 0 → 2px** — 한글/긴 라벨에서 항목이 너무 촘촘하게 붙어 시각적으로 압축돼 보이던 문제. shadcn 의 `gap-0` 컨벤션과 살짝 갈리지만 sh-ui 의 한글 우선 + Linear 톤 정체성에 더 자연스러움.",
40
+ "**`Button` `active:` 더블펌프 제거** 기존 `active:scale-[0.97] + active:brightness-90` 효과 동시 적용으로 클릭이 cheap 느낌이었음. `brightness` 빼고 `scale` 유지 Linear/Vercel/Radix 톤과 일관.",
41
+ "**`Button` focus ring `foreground` `primary`** 다크모드에서 순백 outline 과해 사용자가 매번 override 하던 패턴. 브랜드 + 자연스러움.",
42
+ "**`Card` 기본 `box-shadow: var(--shadow-sm)` 추가** — flat border-only 박스에서 미세 elevation 으로. 라이트 모드에서 임팩트 있고 다크에서도 무해함 (`0 1px 2px rgba(0,0,0,0.08)`). 모던 카드는 기본적으로 약간의 깊이를 가지는 게 자연스러움.",
43
+ "**4가지 variant + 듀얼 카피본 모두 동기화** — Tailwind / plain CSS / CSS Modules / vanilla-extract + apps/docs 카피본 + 템플릿. 사용자가 어떤 cssFramework 로 쓰든 동일한 톤.",
44
+ "**철학: 디자인 시스템 디폴트가 \"바로 보기 좋은\" 답을 줘야 함** — 사용자가 매번 같은 override 를 반복하면 그건 디폴트 책임. 이번 라운드는 sh-ui 사용 빈도 1·2·3 위 컴포넌트(Sidebar/Button/Card) 에 집중."
14
45
  ],
15
46
  "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.58.2"
16
47
  },
@@ -45,7 +45,7 @@ export const AccordionTrigger = React.forwardRef<
45
45
  <BaseAccordion.Trigger
46
46
  ref={ref}
47
47
  className={cn(
48
- "flex items-center justify-between gap-[var(--space-4)] w-full px-[var(--space-1)] py-[var(--space-4)] bg-transparent border-none text-foreground text-[0.9375rem] font-medium leading-snug text-left cursor-pointer transition-[background-color] duration-[var(--duration-fast)] hover:not-disabled:not-data-[disabled]:bg-background-muted focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2 focus-visible:rounded-[calc(var(--radius)-2px)] disabled:cursor-not-allowed disabled:text-foreground-muted data-[disabled]:cursor-not-allowed data-[disabled]:text-foreground-muted [[data-size=sm]_&]:py-[var(--space-2)] [[data-size=sm]_&]:text-[length:var(--text-xs)] [[data-size=sm]_&]:leading-[1.2] motion-reduce:transition-none",
48
+ "flex items-center justify-between gap-[var(--space-4)] w-full px-[var(--space-1)] py-[var(--space-4)] bg-transparent border-none text-foreground text-[0.9375rem] font-medium leading-snug text-left cursor-pointer transition-[background-color] duration-[var(--duration-fast)] hover:not-disabled:not-data-[disabled]:bg-background-muted focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 focus-visible:rounded-[calc(var(--radius)-2px)] disabled:cursor-not-allowed disabled:text-foreground-muted data-[disabled]:cursor-not-allowed data-[disabled]:text-foreground-muted [[data-size=sm]_&]:py-[var(--space-2)] [[data-size=sm]_&]:text-[length:var(--text-xs)] [[data-size=sm]_&]:leading-[1.2] motion-reduce:transition-none",
49
49
  className,
50
50
  )}
51
51
  {...props}
@@ -42,7 +42,7 @@
42
42
  }
43
43
 
44
44
  .sh-ui-accordion__trigger:focus-visible {
45
- outline: var(--border-width-strong) solid var(--foreground);
45
+ outline: var(--border-width-strong) solid var(--ring);
46
46
  outline-offset: 2px;
47
47
  border-radius: calc(var(--radius) - 2px);
48
48
  }
@@ -42,7 +42,7 @@
42
42
  }
43
43
 
44
44
  .accordion__trigger:focus-visible {
45
- outline: var(--border-width-strong) solid var(--foreground);
45
+ outline: var(--border-width-strong) solid var(--ring);
46
46
  outline-offset: 2px;
47
47
  border-radius: calc(var(--radius) - 2px);
48
48
  }
@@ -53,7 +53,7 @@ export const BreadcrumbLink = React.forwardRef<
53
53
  <a
54
54
  ref={ref}
55
55
  className={cn(
56
- "text-foreground-muted no-underline rounded-[calc(var(--radius)-2px)] px-0.5 transition-colors duration-[var(--duration-fast)] hover:text-foreground hover:underline hover:underline-offset-[3px] focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2 motion-reduce:transition-none",
56
+ "text-foreground-muted no-underline rounded-[calc(var(--radius)-2px)] px-0.5 transition-colors duration-[var(--duration-fast)] hover:text-foreground hover:underline hover:underline-offset-[3px] focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 motion-reduce:transition-none",
57
57
  className,
58
58
  )}
59
59
  {...props}
@@ -35,7 +35,7 @@
35
35
  }
36
36
 
37
37
  .sh-ui-breadcrumb__link:focus-visible {
38
- outline: var(--border-width-strong) solid var(--foreground);
38
+ outline: var(--border-width-strong) solid var(--ring);
39
39
  outline-offset: 2px;
40
40
  }
41
41
 
@@ -35,7 +35,7 @@
35
35
  }
36
36
 
37
37
  .breadcrumb__link:focus-visible {
38
- outline: var(--border-width-strong) solid var(--foreground);
38
+ outline: var(--border-width-strong) solid var(--ring);
39
39
  outline-offset: 2px;
40
40
  }
41
41
 
@@ -3,7 +3,7 @@ import { cn } from "@SH_UI_UTILS@";
3
3
  import { cva, type VariantProps } from "class-variance-authority";
4
4
 
5
5
  const buttonVariants = cva(
6
- "inline-flex items-center justify-center gap-[var(--space-2)] border border-transparent rounded-[var(--radius)] font-medium leading-none cursor-pointer select-none transition-[background-color,color,border-color] duration-[var(--duration-fast)] disabled:opacity-[var(--opacity-disabled)] disabled:pointer-events-none focus-visible:outline-2 focus-visible:outline-foreground focus-visible:outline-offset-2 active:scale-[0.97] active:brightness-90",
6
+ "inline-flex items-center justify-center gap-[var(--space-2)] border border-transparent rounded-[var(--radius)] font-medium leading-none cursor-pointer select-none transition-[background-color,color,border-color] duration-[var(--duration-fast)] disabled:opacity-[var(--opacity-disabled)] disabled:pointer-events-none focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2 active:scale-[0.97]",
7
7
  {
8
8
  variants: {
9
9
  variant: {
@@ -20,13 +20,12 @@
20
20
  }
21
21
 
22
22
  .sh-ui-button:focus-visible {
23
- outline: var(--border-width-strong) solid var(--foreground);
23
+ outline: var(--border-width-strong) solid var(--ring);
24
24
  outline-offset: 2px;
25
25
  }
26
26
 
27
27
  .sh-ui-button:active:not(:disabled) {
28
28
  transform: scale(0.97);
29
- filter: brightness(0.92);
30
29
  transition-duration: 40ms;
31
30
  }
32
31
 
@@ -21,12 +21,11 @@ export const button = style({
21
21
  pointerEvents: "none",
22
22
  },
23
23
  "&:focus-visible": {
24
- outline: "var(--border-width-strong) solid var(--foreground)",
24
+ outline: "var(--border-width-strong) solid var(--ring)",
25
25
  outlineOffset: "2px",
26
26
  },
27
27
  "&:active:not(:disabled)": {
28
28
  transform: "scale(0.97)",
29
- filter: "brightness(0.92)",
30
29
  transitionDuration: "40ms",
31
30
  },
32
31
  },
@@ -20,13 +20,12 @@
20
20
  }
21
21
 
22
22
  .button:focus-visible {
23
- outline: var(--border-width-strong) solid var(--foreground);
23
+ outline: var(--border-width-strong) solid var(--ring);
24
24
  outline-offset: 2px;
25
25
  }
26
26
 
27
27
  .button:active:not(:disabled) {
28
28
  transform: scale(0.97);
29
- filter: brightness(0.92);
30
29
  transition-duration: 40ms;
31
30
  }
32
31
 
@@ -391,7 +391,7 @@ export const CalendarHeader = React.forwardRef<HTMLDivElement, CalendarHeaderPro
391
391
  );
392
392
 
393
393
  const navButtonClasses =
394
- "inline-flex items-center justify-center w-7 h-7 p-0 border-none rounded-[calc(var(--radius)-2px)] bg-transparent text-foreground-muted cursor-pointer shrink-0 transition-[background-color,color] duration-[var(--duration-fast)] hover:not-disabled:bg-background-muted hover:not-disabled:text-foreground focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2 motion-reduce:transition-none";
394
+ "inline-flex items-center justify-center w-7 h-7 p-0 border-none rounded-[calc(var(--radius)-2px)] bg-transparent text-foreground-muted cursor-pointer shrink-0 transition-[background-color,color] duration-[var(--duration-fast)] hover:not-disabled:bg-background-muted hover:not-disabled:text-foreground focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 motion-reduce:transition-none";
395
395
 
396
396
  function CalendarNavPlaceholder() {
397
397
  return <span className={cn(navButtonClasses, "invisible pointer-events-none")} aria-hidden />;
@@ -501,7 +501,7 @@ export const CalendarGrid = React.forwardRef<HTMLDivElement, CalendarGridProps>(
501
501
  ))}
502
502
  </div>
503
503
  <div
504
- className="grid grid-cols-7 outline-none focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2 focus-visible:rounded-[calc(var(--radius)-2px)]"
504
+ className="grid grid-cols-7 outline-none focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 focus-visible:rounded-[calc(var(--radius)-2px)]"
505
505
  role="grid"
506
506
  tabIndex={0}
507
507
  onKeyDown={ctx.onKeyDown}
@@ -526,7 +526,7 @@ export const CalendarGrid = React.forwardRef<HTMLDivElement, CalendarGridProps>(
526
526
  <button
527
527
  type="button"
528
528
  className={cn(
529
- "flex items-center justify-center w-9 h-9 p-0 border-none rounded-[calc(var(--radius)-2px)] bg-transparent text-foreground text-[0.8125rem] font-[inherit] cursor-pointer transition-[background-color,color] duration-[var(--duration-fast)] hover:not-disabled:bg-background-muted focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2 disabled:opacity-30 disabled:cursor-not-allowed motion-reduce:transition-none",
529
+ "flex items-center justify-center w-9 h-9 p-0 border-none rounded-[calc(var(--radius)-2px)] bg-transparent text-foreground text-[0.8125rem] font-[inherit] cursor-pointer transition-[background-color,color] duration-[var(--duration-fast)] hover:not-disabled:bg-background-muted focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 disabled:opacity-30 disabled:cursor-not-allowed motion-reduce:transition-none",
530
530
  !current && "text-[var(--foreground-subtle,var(--foreground-muted))] opacity-40",
531
531
  isToday && "font-bold underline underline-offset-[0.125rem]",
532
532
  selected && "bg-primary text-primary-foreground font-semibold hover:not-disabled:bg-primary-hover hover:not-disabled:text-primary-foreground",
@@ -56,7 +56,7 @@
56
56
  }
57
57
 
58
58
  .sh-ui-calendar__nav:focus-visible {
59
- outline: var(--border-width-strong) solid var(--foreground);
59
+ outline: var(--border-width-strong) solid var(--ring);
60
60
  outline-offset: 2px;
61
61
  }
62
62
 
@@ -123,7 +123,7 @@
123
123
  }
124
124
 
125
125
  .sh-ui-calendar__grid:focus-visible {
126
- outline: var(--border-width-strong) solid var(--foreground);
126
+ outline: var(--border-width-strong) solid var(--ring);
127
127
  outline-offset: 2px;
128
128
  border-radius: calc(var(--radius) - 2px);
129
129
  }
@@ -181,7 +181,7 @@
181
181
  }
182
182
 
183
183
  .sh-ui-calendar__day:focus-visible {
184
- outline: var(--border-width-strong) solid var(--foreground);
184
+ outline: var(--border-width-strong) solid var(--ring);
185
185
  outline-offset: 2px;
186
186
  }
187
187
 
@@ -56,7 +56,7 @@
56
56
  }
57
57
 
58
58
  .calendar__nav:focus-visible {
59
- outline: var(--border-width-strong) solid var(--foreground);
59
+ outline: var(--border-width-strong) solid var(--ring);
60
60
  outline-offset: 2px;
61
61
  }
62
62
 
@@ -123,7 +123,7 @@
123
123
  }
124
124
 
125
125
  .calendar__grid:focus-visible {
126
- outline: var(--border-width-strong) solid var(--foreground);
126
+ outline: var(--border-width-strong) solid var(--ring);
127
127
  outline-offset: 2px;
128
128
  border-radius: calc(var(--radius) - 2px);
129
129
  }
@@ -181,7 +181,7 @@
181
181
  }
182
182
 
183
183
  .calendar__day:focus-visible {
184
- outline: var(--border-width-strong) solid var(--foreground);
184
+ outline: var(--border-width-strong) solid var(--ring);
185
185
  outline-offset: 2px;
186
186
  }
187
187
 
@@ -9,7 +9,7 @@ export const Card = React.forwardRef<HTMLDivElement, DivProps>(
9
9
  <div
10
10
  ref={ref}
11
11
  className={cn(
12
- "flex flex-col gap-[var(--space-6)] py-[var(--space-6)] bg-background text-foreground border border-border rounded-[var(--radius)] max-sm:gap-[var(--space-4)] max-sm:py-[var(--space-4)]",
12
+ "flex flex-col gap-[var(--space-6)] py-[var(--space-6)] bg-background text-foreground border border-border rounded-[var(--radius)] shadow-[var(--shadow-sm)] max-sm:gap-[var(--space-4)] max-sm:py-[var(--space-4)]",
13
13
  className,
14
14
  )}
15
15
  {...props}
@@ -7,6 +7,7 @@
7
7
  color: var(--foreground);
8
8
  border: 1px solid var(--border);
9
9
  border-radius: var(--radius);
10
+ box-shadow: var(--shadow-sm);
10
11
  }
11
12
 
12
13
  /* 헤더: 기본은 타이틀/설명 세로 스택. action 있으면 2열 그리드로 전환. */
@@ -9,6 +9,7 @@ export const card = style({
9
9
  color: "var(--foreground)",
10
10
  border: "1px solid var(--border)",
11
11
  borderRadius: "var(--radius)",
12
+ boxShadow: "var(--shadow-sm)",
12
13
 
13
14
  "@media": {
14
15
  "(max-width: 640px)": {
@@ -7,6 +7,7 @@
7
7
  color: var(--foreground);
8
8
  border: 1px solid var(--border);
9
9
  border-radius: var(--radius);
10
+ box-shadow: var(--shadow-sm);
10
11
  }
11
12
 
12
13
  /* 헤더: 기본은 타이틀/설명 세로 스택. action 있으면 2열 그리드로 전환. */
@@ -205,7 +205,7 @@ export const CarouselItem = React.forwardRef<HTMLDivElement, React.HTMLAttribute
205
205
  CarouselItem.displayName = "CarouselItem";
206
206
 
207
207
  const navClasses =
208
- "absolute top-1/2 w-8 h-8 inline-flex items-center justify-center bg-background text-foreground border border-border rounded-full cursor-pointer -translate-y-1/2 z-[1] transition-[opacity,background-color] duration-[var(--duration-fast)] hover:not-disabled:bg-background-muted focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2 disabled:opacity-40 disabled:cursor-not-allowed motion-reduce:transition-none data-[orientation=vertical]:left-1/2 data-[orientation=vertical]:-translate-x-1/2 data-[orientation=vertical]:[top:auto]";
208
+ "absolute top-1/2 w-8 h-8 inline-flex items-center justify-center bg-background text-foreground border border-border rounded-full cursor-pointer -translate-y-1/2 z-[1] transition-[opacity,background-color] duration-[var(--duration-fast)] hover:not-disabled:bg-background-muted focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 disabled:opacity-40 disabled:cursor-not-allowed motion-reduce:transition-none data-[orientation=vertical]:left-1/2 data-[orientation=vertical]:-translate-x-1/2 data-[orientation=vertical]:[top:auto]";
209
209
 
210
210
  export const CarouselPrevious = React.forwardRef<HTMLButtonElement, React.ButtonHTMLAttributes<HTMLButtonElement>>(
211
211
  ({ className, onClick, disabled, children, ...props }, ref) => {
@@ -295,7 +295,7 @@ export const CarouselIndicators = React.forwardRef<HTMLDivElement, CarouselIndic
295
295
  role="tab"
296
296
  aria-selected={i === index}
297
297
  aria-label={labelFor ? labelFor(i) : `${i + 1}번 슬라이드`}
298
- className="w-2 h-2 p-0 bg-border border-none rounded-full cursor-pointer transition-[background-color,transform] duration-[var(--duration-fast)] hover:bg-border-strong data-[active]:bg-foreground data-[active]:scale-[1.2] focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2 motion-reduce:transition-none"
298
+ className="w-2 h-2 p-0 bg-border border-none rounded-full cursor-pointer transition-[background-color,transform] duration-[var(--duration-fast)] hover:bg-border-strong data-[active]:bg-foreground data-[active]:scale-[1.2] focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 motion-reduce:transition-none"
299
299
  data-active={i === index || undefined}
300
300
  onClick={() => goTo(i)}
301
301
  />
@@ -65,7 +65,7 @@
65
65
  }
66
66
 
67
67
  .sh-ui-carousel__nav:focus-visible {
68
- outline: var(--border-width-strong) solid var(--foreground);
68
+ outline: var(--border-width-strong) solid var(--ring);
69
69
  outline-offset: 2px;
70
70
  }
71
71
 
@@ -140,7 +140,7 @@
140
140
  }
141
141
 
142
142
  .sh-ui-carousel__indicator:focus-visible {
143
- outline: var(--border-width-strong) solid var(--foreground);
143
+ outline: var(--border-width-strong) solid var(--ring);
144
144
  outline-offset: 2px;
145
145
  }
146
146
 
@@ -65,7 +65,7 @@
65
65
  }
66
66
 
67
67
  .carousel__nav:focus-visible {
68
- outline: var(--border-width-strong) solid var(--foreground);
68
+ outline: var(--border-width-strong) solid var(--ring);
69
69
  outline-offset: 2px;
70
70
  }
71
71
 
@@ -140,7 +140,7 @@
140
140
  }
141
141
 
142
142
  .carousel__indicator:focus-visible {
143
- outline: var(--border-width-strong) solid var(--foreground);
143
+ outline: var(--border-width-strong) solid var(--ring);
144
144
  outline-offset: 2px;
145
145
  }
146
146
 
@@ -16,7 +16,7 @@ export const Checkbox = React.forwardRef<HTMLElement, CheckboxProps>(
16
16
  <BaseCheckbox.Root
17
17
  ref={ref}
18
18
  className={cn(
19
- "inline-flex items-center justify-center w-[1.125rem] h-[1.125rem] border border-border-strong rounded-[calc(var(--radius)-2px)] bg-background text-primary-foreground cursor-pointer shrink-0 transition-[background-color,border-color] duration-[var(--duration-fast)] hover:not-data-[disabled]:border-foreground focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2 data-[checked]:bg-primary data-[checked]:border-primary data-[indeterminate]:bg-primary data-[indeterminate]:border-primary data-[disabled]:opacity-[var(--opacity-disabled)] data-[disabled]:cursor-not-allowed motion-reduce:transition-none [@media(hover:none)_and_(pointer:coarse)]:w-5 [@media(hover:none)_and_(pointer:coarse)]:h-5",
19
+ "inline-flex items-center justify-center w-[1.125rem] h-[1.125rem] border border-border-strong rounded-[calc(var(--radius)-2px)] bg-background text-primary-foreground cursor-pointer shrink-0 transition-[background-color,border-color] duration-[var(--duration-fast)] hover:not-data-[disabled]:border-foreground focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 data-[checked]:bg-primary data-[checked]:border-primary data-[indeterminate]:bg-primary data-[indeterminate]:border-primary data-[disabled]:opacity-[var(--opacity-disabled)] data-[disabled]:cursor-not-allowed motion-reduce:transition-none [@media(hover:none)_and_(pointer:coarse)]:w-5 [@media(hover:none)_and_(pointer:coarse)]:h-5",
20
20
  className,
21
21
  )}
22
22
  {...props}
@@ -17,11 +17,11 @@
17
17
  }
18
18
 
19
19
  .sh-ui-checkbox:hover:not([data-disabled]) {
20
- border-color: var(--foreground);
20
+ border-color: var(--primary);
21
21
  }
22
22
 
23
23
  .sh-ui-checkbox:focus-visible {
24
- outline: var(--border-width-strong) solid var(--foreground);
24
+ outline: var(--border-width-strong) solid var(--ring);
25
25
  outline-offset: 2px;
26
26
  }
27
27
 
@@ -17,11 +17,11 @@
17
17
  }
18
18
 
19
19
  .checkbox:hover:not([data-disabled]) {
20
- border-color: var(--foreground);
20
+ border-color: var(--primary);
21
21
  }
22
22
 
23
23
  .checkbox:focus-visible {
24
- outline: var(--border-width-strong) solid var(--foreground);
24
+ outline: var(--border-width-strong) solid var(--ring);
25
25
  outline-offset: 2px;
26
26
  }
27
27
 
@@ -135,7 +135,7 @@ export function CodeEditor({
135
135
  <div
136
136
  ref={hostRef}
137
137
  className={cn(
138
- "sh-ui-code-editor relative border border-border rounded-[var(--radius)] bg-background text-[0.8125rem] leading-relaxed overflow-hidden transition-[border-color] duration-[var(--duration-fast)] focus-within:border-foreground focus-within:outline-[length:var(--border-width-strong)] focus-within:outline-foreground focus-within:outline-offset-2 data-[readonly]:bg-background-subtle motion-reduce:transition-none",
138
+ "sh-ui-code-editor relative border border-border rounded-[var(--radius)] bg-background text-[0.8125rem] leading-relaxed overflow-hidden transition-[border-color] duration-[var(--duration-fast)] focus-within:border-primary focus-within:outline-[length:var(--border-width-strong)] focus-within:outline-ring focus-within:outline-offset-2 data-[readonly]:bg-background-subtle motion-reduce:transition-none",
139
139
  className,
140
140
  )}
141
141
  data-readonly={readOnly || undefined}
@@ -10,7 +10,7 @@
10
10
  }
11
11
  .sh-ui-code-editor:focus-within {
12
12
  border-color: var(--foreground);
13
- outline: var(--border-width-strong) solid var(--foreground);
13
+ outline: var(--border-width-strong) solid var(--ring);
14
14
  outline-offset: 2px;
15
15
  }
16
16
  .sh-ui-code-editor[data-readonly] {
@@ -10,7 +10,7 @@
10
10
  }
11
11
  .code-editor:focus-within {
12
12
  border-color: var(--foreground);
13
- outline: var(--border-width-strong) solid var(--foreground);
13
+ outline: var(--border-width-strong) solid var(--ring);
14
14
  outline-offset: 2px;
15
15
  }
16
16
  .code-editor[data-readonly] {
@@ -64,7 +64,7 @@
64
64
  border-color: var(--border-strong);
65
65
  }
66
66
  .sh-ui-code__copy:focus-visible {
67
- outline: var(--border-width-strong) solid var(--foreground);
67
+ outline: var(--border-width-strong) solid var(--ring);
68
68
  outline-offset: 2px;
69
69
  }
70
70
  .sh-ui-code__copy-label {
@@ -64,7 +64,7 @@
64
64
  border-color: var(--border-strong);
65
65
  }
66
66
  .code__copy:focus-visible {
67
- outline: var(--border-width-strong) solid var(--foreground);
67
+ outline: var(--border-width-strong) solid var(--ring);
68
68
  outline-offset: 2px;
69
69
  }
70
70
  .code__copy-label {
@@ -262,7 +262,7 @@ export function ColorPickerHex({ className, showSwatch = true, ...rest }: ColorP
262
262
  <input
263
263
  ref={inputRef}
264
264
  type="text"
265
- className="flex-1 min-w-0 h-7 px-[var(--space-2)] border border-border rounded-[calc(var(--radius)-2px)] bg-background text-foreground font-mono text-[0.8125rem] uppercase focus:outline-none focus:border-foreground focus:shadow-[0_0_0_1px_var(--foreground)]"
265
+ className="flex-1 min-w-0 h-7 px-[var(--space-2)] border border-border rounded-[calc(var(--radius)-2px)] bg-background text-foreground font-mono text-[0.8125rem] uppercase focus:outline-none focus:border-primary focus:shadow-[0_0_0_1px_var(--primary)]"
266
266
  value={draft}
267
267
  onChange={(e) => setDraft(e.target.value)}
268
268
  onBlur={onCommit}
@@ -296,7 +296,7 @@ export function ColorPickerSwatches({ className, colors, ...rest }: ColorPickerS
296
296
  <button
297
297
  key={c}
298
298
  type="button"
299
- className="w-5 h-5 p-0 border border-border rounded-[calc(var(--radius)-4px)] cursor-pointer transition-[transform,box-shadow] duration-[var(--duration-fast)] hover:scale-110 focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2 data-[selected]:shadow-[0_0_0_2px_var(--background),0_0_0_3.5px_var(--foreground)]"
299
+ className="w-5 h-5 p-0 border border-border rounded-[calc(var(--radius)-4px)] cursor-pointer transition-[transform,box-shadow] duration-[var(--duration-fast)] hover:scale-110 focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 data-[selected]:shadow-[0_0_0_2px_var(--background),0_0_0_3.5px_var(--foreground)]"
300
300
  aria-label={c}
301
301
  aria-pressed={selected}
302
302
  data-selected={selected || undefined}
@@ -134,8 +134,8 @@
134
134
  }
135
135
  .sh-ui-color-picker__hex:focus {
136
136
  outline: none;
137
- border-color: var(--foreground);
138
- box-shadow: 0 0 0 1px var(--foreground);
137
+ border-color: var(--primary);
138
+ box-shadow: 0 0 0 1px var(--primary);
139
139
  }
140
140
 
141
141
  /* ───────────── Swatches ───────────── */
@@ -158,7 +158,7 @@
158
158
  transform: scale(1.08);
159
159
  }
160
160
  .sh-ui-color-picker__swatch-btn:focus-visible {
161
- outline: var(--border-width-strong) solid var(--foreground);
161
+ outline: var(--border-width-strong) solid var(--ring);
162
162
  outline-offset: 2px;
163
163
  }
164
164
  .sh-ui-color-picker__swatch-btn[data-selected] {
@@ -134,8 +134,8 @@
134
134
  }
135
135
  .color-picker__hex:focus {
136
136
  outline: none;
137
- border-color: var(--foreground);
138
- box-shadow: 0 0 0 1px var(--foreground);
137
+ border-color: var(--primary);
138
+ box-shadow: 0 0 0 1px var(--primary);
139
139
  }
140
140
 
141
141
  /* ───────────── Swatches ───────────── */
@@ -158,7 +158,7 @@
158
158
  transform: scale(1.08);
159
159
  }
160
160
  .color-picker__swatch-btn:focus-visible {
161
- outline: var(--border-width-strong) solid var(--foreground);
161
+ outline: var(--border-width-strong) solid var(--ring);
162
162
  outline-offset: 2px;
163
163
  }
164
164
  .color-picker__swatch-btn[data-selected] {
@@ -23,7 +23,7 @@ export const ComboboxInput = React.forwardRef<
23
23
  <BaseCombobox.Input
24
24
  ref={ref}
25
25
  className={cn(
26
- "inline-flex w-full min-w-40 h-[var(--control-md)] px-[var(--space-3)] bg-background text-foreground border border-border rounded-[var(--radius)] text-[length:var(--text-sm)] leading-none outline-none transition-[border-color] duration-[var(--duration-fast)] placeholder:text-foreground-subtle hover:not-disabled:border-border-strong focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2 disabled:opacity-[var(--opacity-disabled)] disabled:pointer-events-none",
26
+ "inline-flex w-full min-w-40 h-[var(--control-md)] px-[var(--space-3)] bg-background text-foreground border border-border rounded-[var(--radius)] text-[length:var(--text-sm)] leading-none outline-none transition-[border-color] duration-[var(--duration-fast)] placeholder:text-foreground-subtle hover:not-disabled:border-border-strong focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 disabled:opacity-[var(--opacity-disabled)] disabled:pointer-events-none",
27
27
  className,
28
28
  )}
29
29
  {...props}
@@ -21,7 +21,7 @@
21
21
  border-color: var(--border-strong);
22
22
  }
23
23
  .sh-ui-combobox__input:focus-visible {
24
- outline: var(--border-width-strong) solid var(--foreground);
24
+ outline: var(--border-width-strong) solid var(--ring);
25
25
  outline-offset: 2px;
26
26
  }
27
27
  .sh-ui-combobox__input:disabled {
@@ -21,7 +21,7 @@
21
21
  border-color: var(--border-strong);
22
22
  }
23
23
  .combobox__input:focus-visible {
24
- outline: var(--border-width-strong) solid var(--foreground);
24
+ outline: var(--border-width-strong) solid var(--ring);
25
25
  outline-offset: 2px;
26
26
  }
27
27
  .combobox__input:disabled {
@@ -22,7 +22,7 @@ function defaultRangePlaceholder(locale: string): string {
22
22
  }
23
23
 
24
24
  const triggerClasses =
25
- "inline-flex items-center justify-between w-full h-[var(--control-md)] px-[var(--space-3)] bg-background text-foreground border border-border rounded-[var(--radius)] font-[inherit] text-[length:var(--text-sm)] leading-none cursor-pointer transition-[border-color,box-shadow] duration-[var(--duration-fast)] hover:not-disabled:border-border-strong focus-visible:outline-none focus-visible:border-foreground focus-visible:shadow-[0_0_0_1px_var(--foreground)] disabled:opacity-[var(--opacity-disabled)] disabled:cursor-not-allowed disabled:bg-background-subtle aria-[invalid=true]:border-danger aria-[invalid=true]:focus-visible:shadow-[0_0_0_1px_var(--danger)] [@media(hover:none)_and_(pointer:coarse)]:h-11 [@media(hover:none)_and_(pointer:coarse)]:text-[length:var(--text-base)]";
25
+ "inline-flex items-center justify-between w-full h-[var(--control-md)] px-[var(--space-3)] bg-background text-foreground border border-border rounded-[var(--radius)] font-[inherit] text-[length:var(--text-sm)] leading-none cursor-pointer transition-[border-color,box-shadow] duration-[var(--duration-fast)] hover:not-disabled:border-border-strong focus-visible:outline-none focus-visible:border-primary focus-visible:shadow-[0_0_0_1px_var(--primary)] disabled:opacity-[var(--opacity-disabled)] disabled:cursor-not-allowed disabled:bg-background-subtle aria-[invalid=true]:border-danger aria-[invalid=true]:focus-visible:shadow-[0_0_0_1px_var(--danger)] [@media(hover:none)_and_(pointer:coarse)]:h-11 [@media(hover:none)_and_(pointer:coarse)]:text-[length:var(--text-base)]";
26
26
 
27
27
  const popupClasses =
28
28
  "bg-background border border-border rounded-[var(--radius)] shadow-[0_8px_24px_rgba(0,0,0,0.12)] outline-none p-[var(--space-3)] origin-[var(--transform-origin)] transition-[opacity,transform] duration-[140ms] ease-out motion-reduce:transition-none data-[starting-style]:opacity-0 data-[starting-style]:scale-95 data-[ending-style]:opacity-0 data-[ending-style]:scale-95";
@@ -32,8 +32,8 @@
32
32
 
33
33
  .sh-ui-date-picker__trigger:focus-visible {
34
34
  outline: none;
35
- border-color: var(--foreground);
36
- box-shadow: 0 0 0 1px var(--foreground);
35
+ border-color: var(--primary);
36
+ box-shadow: 0 0 0 1px var(--primary);
37
37
  }
38
38
 
39
39
  .sh-ui-date-picker__trigger:disabled {
@@ -32,8 +32,8 @@
32
32
 
33
33
  .date-picker__trigger:focus-visible {
34
34
  outline: none;
35
- border-color: var(--foreground);
36
- box-shadow: 0 0 0 1px var(--foreground);
35
+ border-color: var(--primary);
36
+ box-shadow: 0 0 0 1px var(--primary);
37
37
  }
38
38
 
39
39
  .date-picker__trigger:disabled {
@@ -13,7 +13,7 @@ export function DialogCloseX({ className, children, ...props }: React.ButtonHTML
13
13
  return (
14
14
  <BaseDialog.Close
15
15
  className={cn(
16
- "absolute top-[var(--space-3)] right-[var(--space-3)] inline-flex items-center justify-center w-8 h-8 border-0 rounded-[calc(var(--radius)-2px)] bg-transparent text-foreground-muted text-[length:var(--text-lg)] leading-none cursor-pointer transition-[background-color,color] duration-[var(--duration-fast)] hover:bg-background-muted hover:text-foreground focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2 motion-reduce:transition-none",
16
+ "absolute top-[var(--space-3)] right-[var(--space-3)] inline-flex items-center justify-center w-8 h-8 border-0 rounded-[calc(var(--radius)-2px)] bg-transparent text-foreground-muted text-[length:var(--text-lg)] leading-none cursor-pointer transition-[background-color,color] duration-[var(--duration-fast)] hover:bg-background-muted hover:text-foreground focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 motion-reduce:transition-none",
17
17
  className,
18
18
  )}
19
19
  aria-label="닫기"
@@ -49,7 +49,7 @@ export const DialogContent = React.forwardRef<HTMLDivElement, DialogContentProps
49
49
  <BaseDialog.Popup
50
50
  ref={ref}
51
51
  className={cn(
52
- "fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-[var(--z-modal)] flex flex-col w-[calc(100%-2rem)] max-w-md max-h-[calc(100dvh-4rem)] p-[var(--space-6)] bg-background text-foreground border border-border rounded-[var(--radius)] shadow-[var(--shadow-xl)] outline-none overflow-y-auto transition-[opacity,transform] duration-[var(--duration-slow)] motion-reduce:transition-none data-[starting-style]:opacity-0 data-[starting-style]:translate-y-[calc(-50%+0.5rem)] data-[starting-style]:scale-[0.97] data-[ending-style]:opacity-0 data-[ending-style]:translate-y-[calc(-50%+0.25rem)] data-[ending-style]:scale-[0.98] motion-reduce:data-[starting-style]:translate-y-[-50%] motion-reduce:data-[starting-style]:scale-100 motion-reduce:data-[ending-style]:translate-y-[-50%] motion-reduce:data-[ending-style]:scale-100 focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-foreground focus-visible:outline-offset-2",
52
+ "fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-[var(--z-modal)] flex flex-col w-[calc(100%-2rem)] max-w-md max-h-[calc(100dvh-4rem)] p-[var(--space-6)] bg-background text-foreground border border-border rounded-[var(--radius)] shadow-[var(--shadow-xl)] outline-none overflow-y-auto transition-[opacity,transform] duration-[var(--duration-slow)] motion-reduce:transition-none data-[starting-style]:opacity-0 data-[starting-style]:translate-y-[calc(-50%+0.5rem)] data-[starting-style]:scale-[0.97] data-[ending-style]:opacity-0 data-[ending-style]:translate-y-[calc(-50%+0.25rem)] data-[ending-style]:scale-[0.98] motion-reduce:data-[starting-style]:translate-y-[-50%] motion-reduce:data-[starting-style]:scale-100 motion-reduce:data-[ending-style]:translate-y-[-50%] motion-reduce:data-[ending-style]:scale-100 focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2",
53
53
  className,
54
54
  )}
55
55
  {...props}
@@ -51,7 +51,7 @@
51
51
  }
52
52
 
53
53
  .sh-ui-dialog__content:focus-visible {
54
- outline: var(--border-width-strong) solid var(--foreground);
54
+ outline: var(--border-width-strong) solid var(--ring);
55
55
  outline-offset: 2px;
56
56
  }
57
57
 
@@ -110,7 +110,7 @@
110
110
  color: var(--foreground);
111
111
  }
112
112
  .sh-ui-dialog__close:focus-visible {
113
- outline: var(--border-width-strong) solid var(--foreground);
113
+ outline: var(--border-width-strong) solid var(--ring);
114
114
  outline-offset: 2px;
115
115
  }
116
116