sh-ui-cli 0.58.3 → 0.58.5

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 (28) hide show
  1. package/data/changelog/versions.json +26 -0
  2. package/data/registry/react/components/checkbox/styles.css +1 -1
  3. package/data/registry/react/components/checkbox/styles.module.css +1 -1
  4. package/data/registry/react/components/code-editor/index.tailwind.tsx +1 -1
  5. package/data/registry/react/components/color-picker/index.tailwind.tsx +2 -2
  6. package/data/registry/react/components/color-picker/styles.css +3 -3
  7. package/data/registry/react/components/color-picker/styles.module.css +3 -3
  8. package/data/registry/react/components/date-picker/index.tailwind.tsx +1 -1
  9. package/data/registry/react/components/date-picker/styles.css +2 -2
  10. package/data/registry/react/components/date-picker/styles.module.css +2 -2
  11. package/data/registry/react/components/file-upload/index.tailwind.tsx +1 -1
  12. package/data/registry/react/components/input/index.tailwind.tsx +2 -2
  13. package/data/registry/react/components/input/styles.css +4 -4
  14. package/data/registry/react/components/input/styles.css.ts +2 -2
  15. package/data/registry/react/components/input/styles.module.css +4 -4
  16. package/data/registry/react/components/numeric-input/index.tailwind.tsx +1 -1
  17. package/data/registry/react/components/numeric-input/styles.css +1 -1
  18. package/data/registry/react/components/numeric-input/styles.module.css +1 -1
  19. package/data/registry/react/components/radio/styles.css +1 -1
  20. package/data/registry/react/components/radio/styles.module.css +1 -1
  21. package/data/registry/react/components/rich-text-editor/index.tailwind.tsx +1 -1
  22. package/data/registry/react/components/tabs/index.tailwind.tsx +1 -1
  23. package/data/registry/react/components/tabs/styles.css +2 -2
  24. package/data/registry/react/components/tabs/styles.module.css +2 -2
  25. package/data/registry/react/components/textarea/index.tailwind.tsx +1 -1
  26. package/data/registry/react/components/textarea/styles.css +2 -2
  27. package/data/registry/react/components/textarea/styles.module.css +2 -2
  28. package/package.json +1 -1
@@ -2,6 +2,32 @@
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.5",
7
+ "date": "2026-05-06",
8
+ "title": "디자인 디폴트 개편 4라운드 — Tabs/Color-picker 의 active·selected 표시를 primary 로",
9
+ "type": "patch",
10
+ "highlights": [
11
+ "**Tabs underline variant 의 active 표시선** — 가로(`inset 0 -2px 0 var(--foreground)`) / 세로(`inset -2px 0 0 var(--foreground)`) 모두 `var(--primary)` 로 변경. 활성 탭이 브랜드 톤으로 강조 — 다크에서 순백 라인이 stark 했던 문제 해소.",
12
+ "**Color-picker 의 selected 색상 ring** — `0 0 0 3.5px var(--foreground)` (선택된 색 둘레) → `var(--primary)`. 선택 상태가 brand 톤으로 명확.",
13
+ "**v0.58.3·4 ring/focus 와 일관** — 활성/선택/focus 모두 primary 또는 ring (50% primary). 다음 라운드에서 Avatar/Badge/Progress 톤 점검 예정.",
14
+ "**4 variant + 듀얼 카피본 + pactrack 동기화** — 8개 파일 sed."
15
+ ],
16
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.58.5"
17
+ },
18
+ {
19
+ "version": "0.58.4",
20
+ "date": "2026-05-06",
21
+ "title": "디자인 디폴트 개편 3라운드 — 폼 필드의 focus·hover 색을 primary 로",
22
+ "type": "patch",
23
+ "highlights": [
24
+ "**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` 로 변경 — 폼 필드의 활성 시 브랜드 톤으로 자연스럽게 표시.",
25
+ "**v0.58.3 의 ring 패턴과 정렬** — 버튼 / 컴포넌트 focus ring 은 `--ring` (primary 50%), 폼 필드 inline focus 는 `--primary` solid (1px 이라 풀 포화). 두 layer 가 brand 톤으로 일관.",
26
+ "**4 variant + 듀얼 카피본 + 템플릿 모두 동기화** — Tailwind / plain CSS / CSS Modules / vanilla-extract.",
27
+ "**Button danger 의 `hover:brightness-95` 는 다음 라운드** — `--danger-hover` 토큰 추가 필요해서 별도 검토 후 진행."
28
+ ],
29
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.58.4"
30
+ },
5
31
  {
6
32
  "version": "0.58.3",
7
33
  "date": "2026-05-06",
@@ -17,7 +17,7 @@
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 {
@@ -17,7 +17,7 @@
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 {
@@ -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-ring 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}
@@ -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-ring 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(--primary)]"
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 ───────────── */
@@ -162,5 +162,5 @@
162
162
  outline-offset: 2px;
163
163
  }
164
164
  .sh-ui-color-picker__swatch-btn[data-selected] {
165
- box-shadow: 0 0 0 2px var(--background), 0 0 0 3.5px var(--foreground);
165
+ box-shadow: 0 0 0 2px var(--background), 0 0 0 3.5px var(--primary);
166
166
  }
@@ -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 ───────────── */
@@ -162,5 +162,5 @@
162
162
  outline-offset: 2px;
163
163
  }
164
164
  .color-picker__swatch-btn[data-selected] {
165
- box-shadow: 0 0 0 2px var(--background), 0 0 0 3.5px var(--foreground);
165
+ box-shadow: 0 0 0 2px var(--background), 0 0 0 3.5px var(--primary);
166
166
  }
@@ -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 {
@@ -153,7 +153,7 @@ export const FileUploadDropzone = React.forwardRef<HTMLDivElement, FileUploadDro
153
153
  aria-disabled={disabled || undefined}
154
154
  data-dragging={dragging || undefined}
155
155
  className={cn(
156
- "relative flex flex-col items-center justify-center gap-[var(--space-2)] py-[var(--space-8)] px-[var(--space-6)] min-h-40 bg-background-subtle text-foreground-muted border-[1.5px] border-dashed border-border rounded-[var(--radius)] cursor-pointer text-center transition-[border-color,background-color,color] duration-[var(--duration-fast)] hover:border-border-strong hover:text-foreground focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 focus-visible:border-foreground motion-reduce:transition-none",
156
+ "relative flex flex-col items-center justify-center gap-[var(--space-2)] py-[var(--space-8)] px-[var(--space-6)] min-h-40 bg-background-subtle text-foreground-muted border-[1.5px] border-dashed border-border rounded-[var(--radius)] cursor-pointer text-center transition-[border-color,background-color,color] duration-[var(--duration-fast)] hover:border-border-strong hover:text-foreground focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 focus-visible:border-primary motion-reduce:transition-none",
157
157
  dragging && "border-foreground bg-background-muted text-foreground",
158
158
  disabled && "opacity-[var(--opacity-disabled)] cursor-not-allowed pointer-events-none",
159
159
  className,
@@ -14,13 +14,13 @@ export interface InputProps extends Omit<React.InputHTMLAttributes<HTMLInputElem
14
14
  /* ───────── Base utility 묶음 (반복 줄이기) ───────── */
15
15
 
16
16
  const baseInputClasses =
17
- "block 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 transition-[border-color,box-shadow] duration-[var(--duration-fast)] placeholder:text-foreground-subtle hover:not-disabled:not-focus:border-border-strong focus:outline-none focus:border-foreground focus:shadow-[0_0_0_1px_var(--foreground)] disabled:opacity-[var(--opacity-disabled)] disabled:cursor-not-allowed disabled:bg-background-subtle read-only:bg-background-subtle aria-[invalid=true]:border-danger aria-[invalid=true]:focus:shadow-[0_0_0_1px_var(--danger)]";
17
+ "block 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 transition-[border-color,box-shadow] duration-[var(--duration-fast)] placeholder:text-foreground-subtle hover:not-disabled:not-focus:border-border-strong focus:outline-none focus:border-primary focus:shadow-[0_0_0_1px_var(--primary)] disabled:opacity-[var(--opacity-disabled)] disabled:cursor-not-allowed disabled:bg-background-subtle read-only:bg-background-subtle aria-[invalid=true]:border-danger aria-[invalid=true]:focus:shadow-[0_0_0_1px_var(--danger)]";
18
18
 
19
19
  const inGroupOverrides =
20
20
  "data-[in-group]:flex-1 data-[in-group]:min-w-0 data-[in-group]:h-auto data-[in-group]:p-0 data-[in-group]:bg-transparent data-[in-group]:border-none data-[in-group]:rounded-none data-[in-group]:shadow-none data-[in-group]:hover:border-none data-[in-group]:focus:border-none data-[in-group]:focus:outline-none data-[in-group]:focus:shadow-none data-[in-group]:disabled:bg-transparent";
21
21
 
22
22
  const baseGroupClasses =
23
- "flex items-center w-full min-h-[var(--control-md)] px-[var(--space-2)] gap-[var(--space-2)] bg-background text-foreground border border-border rounded-[var(--radius)] transition-[border-color,box-shadow] duration-[var(--duration-fast)] cursor-text hover:not-data-[disabled]:not-focus-within:border-border-strong focus-within:border-foreground focus-within:shadow-[0_0_0_1px_var(--foreground)] aria-[invalid=true]:border-danger aria-[invalid=true]:focus-within:shadow-[0_0_0_1px_var(--danger)] data-[disabled]:opacity-[var(--opacity-disabled)] data-[disabled]:cursor-not-allowed data-[disabled]:bg-background-subtle";
23
+ "flex items-center w-full min-h-[var(--control-md)] px-[var(--space-2)] gap-[var(--space-2)] bg-background text-foreground border border-border rounded-[var(--radius)] transition-[border-color,box-shadow] duration-[var(--duration-fast)] cursor-text hover:not-data-[disabled]:not-focus-within:border-border-strong focus-within:border-primary focus-within:shadow-[0_0_0_1px_var(--primary)] aria-[invalid=true]:border-danger aria-[invalid=true]:focus-within:shadow-[0_0_0_1px_var(--danger)] data-[disabled]:opacity-[var(--opacity-disabled)] data-[disabled]:cursor-not-allowed data-[disabled]:bg-background-subtle";
24
24
 
25
25
  /* ───────── InputGroup + InputAdornment (compound) ───────── */
26
26
 
@@ -32,8 +32,8 @@
32
32
 
33
33
  .sh-ui-input:focus {
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-input:disabled {
@@ -143,8 +143,8 @@
143
143
  }
144
144
 
145
145
  .sh-ui-input-group:focus-within {
146
- border-color: var(--foreground);
147
- box-shadow: 0 0 0 1px var(--foreground);
146
+ border-color: var(--primary);
147
+ box-shadow: 0 0 0 1px var(--primary);
148
148
  }
149
149
 
150
150
  .sh-ui-input-group[aria-invalid="true"] {
@@ -25,7 +25,7 @@ export const input = style({
25
25
  "&:focus": {
26
26
  outline: "none",
27
27
  borderColor: "var(--foreground)",
28
- boxShadow: "0 0 0 1px var(--foreground)",
28
+ boxShadow: "0 0 0 1px var(--primary)",
29
29
  },
30
30
  "&:disabled": {
31
31
  opacity: "var(--opacity-disabled)",
@@ -164,7 +164,7 @@ export const group = style({
164
164
  },
165
165
  "&:focus-within": {
166
166
  borderColor: "var(--foreground)",
167
- boxShadow: "0 0 0 1px var(--foreground)",
167
+ boxShadow: "0 0 0 1px var(--primary)",
168
168
  },
169
169
  '&[aria-invalid="true"]': {
170
170
  borderColor: "var(--danger)",
@@ -32,8 +32,8 @@
32
32
 
33
33
  .input:focus {
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
  .input:disabled {
@@ -141,8 +141,8 @@
141
141
  }
142
142
 
143
143
  .group:focus-within {
144
- border-color: var(--foreground);
145
- box-shadow: 0 0 0 1px var(--foreground);
144
+ border-color: var(--primary);
145
+ box-shadow: 0 0 0 1px var(--primary);
146
146
  }
147
147
 
148
148
  .group[aria-invalid="true"] {
@@ -19,7 +19,7 @@ export interface NumericInputProps
19
19
  }
20
20
 
21
21
  const inputClasses =
22
- "w-10 px-1 py-0.5 font-mono text-[length:var(--text-xs)] leading-tight text-right border border-transparent rounded-[calc(var(--radius)-4px)] bg-transparent text-foreground appearance-none [-moz-appearance:textfield] transition-[border-color,background-color] duration-[var(--duration-fast)] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:m-0 [&::-webkit-outer-spin-button]:m-0 hover:not-disabled:not-focus:border-border focus:outline-none focus:border-foreground focus:bg-background focus-visible:outline-none focus-visible:border-foreground disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]";
22
+ "w-10 px-1 py-0.5 font-mono text-[length:var(--text-xs)] leading-tight text-right border border-transparent rounded-[calc(var(--radius)-4px)] bg-transparent text-foreground appearance-none [-moz-appearance:textfield] transition-[border-color,background-color] duration-[var(--duration-fast)] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:m-0 [&::-webkit-outer-spin-button]:m-0 hover:not-disabled:not-focus:border-border focus:outline-none focus:border-primary focus:bg-background focus-visible:outline-none focus-visible:border-primary disabled:cursor-not-allowed disabled:opacity-[var(--opacity-disabled)]";
23
23
 
24
24
  export const NumericInput = React.forwardRef<HTMLInputElement, NumericInputProps>(
25
25
  (
@@ -40,7 +40,7 @@
40
40
  .sh-ui-numeric-input__input:focus,
41
41
  .sh-ui-numeric-input__input:focus-visible {
42
42
  outline: none;
43
- border-color: var(--foreground);
43
+ border-color: var(--primary);
44
44
  background: var(--background);
45
45
  }
46
46
 
@@ -40,7 +40,7 @@
40
40
  .numeric-input__input:focus,
41
41
  .numeric-input__input:focus-visible {
42
42
  outline: none;
43
- border-color: var(--foreground);
43
+ border-color: var(--primary);
44
44
  background: var(--background);
45
45
  }
46
46
 
@@ -16,7 +16,7 @@
16
16
  }
17
17
 
18
18
  .sh-ui-radio:hover:not([data-disabled]) {
19
- border-color: var(--foreground);
19
+ border-color: var(--primary);
20
20
  }
21
21
 
22
22
  .sh-ui-radio:focus-visible {
@@ -16,7 +16,7 @@
16
16
  }
17
17
 
18
18
  .radio:hover:not([data-disabled]) {
19
- border-color: var(--foreground);
19
+ border-color: var(--primary);
20
20
  }
21
21
 
22
22
  .radio:focus-visible {
@@ -67,7 +67,7 @@ export function RichTextEditor({
67
67
  return (
68
68
  <div
69
69
  className={cn(
70
- "sh-ui-rte flex flex-col border border-border rounded-[var(--radius)] bg-background overflow-hidden transition-[border-color] duration-[var(--duration-fast)] focus-within:border-foreground 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",
70
+ "sh-ui-rte flex flex-col border border-border rounded-[var(--radius)] bg-background 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",
71
71
  className,
72
72
  )}
73
73
  data-readonly={readOnly || undefined}
@@ -75,7 +75,7 @@ export const TabsTrigger = React.forwardRef<
75
75
  TabsTrigger.displayName = "TabsTrigger";
76
76
 
77
77
  const indicatorVariantClasses =
78
- "[[data-variant=underline]_&]:shadow-[inset_0_-2px_0_var(--foreground)] [[data-variant=pill]_&]:bg-background [[data-variant=pill]_&]:rounded-[calc(var(--radius)-2px)] [[data-variant=pill]_&]:shadow-[0_1px_2px_rgba(0,0,0,0.06)] [[data-variant=plain]_&]:hidden [[data-orientation=vertical][data-variant=underline]_&]:shadow-[inset_-2px_0_0_var(--foreground)]";
78
+ "[[data-variant=underline]_&]:shadow-[inset_0_-2px_0_var(--primary)] [[data-variant=pill]_&]:bg-background [[data-variant=pill]_&]:rounded-[calc(var(--radius)-2px)] [[data-variant=pill]_&]:shadow-[0_1px_2px_rgba(0,0,0,0.06)] [[data-variant=plain]_&]:hidden [[data-orientation=vertical][data-variant=underline]_&]:shadow-[inset_-2px_0_0_var(--primary)]";
79
79
 
80
80
  export const TabsIndicator = React.forwardRef<
81
81
  HTMLSpanElement,
@@ -98,7 +98,7 @@
98
98
  left: var(--active-tab-left);
99
99
  width: var(--active-tab-width);
100
100
  height: var(--active-tab-height);
101
- box-shadow: inset 0 -2px 0 var(--foreground);
101
+ box-shadow: inset 0 -2px 0 var(--primary);
102
102
  }
103
103
 
104
104
  .sh-ui-tabs[data-variant="underline"][data-orientation="vertical"] > .sh-ui-tabs__list {
@@ -107,7 +107,7 @@
107
107
  }
108
108
 
109
109
  .sh-ui-tabs[data-variant="underline"][data-orientation="vertical"] .sh-ui-tabs__indicator {
110
- box-shadow: inset -2px 0 0 var(--foreground);
110
+ box-shadow: inset -2px 0 0 var(--primary);
111
111
  }
112
112
 
113
113
  /* ─────────────── variant: pill (세그먼트) ─────────────── */
@@ -98,7 +98,7 @@
98
98
  left: var(--active-tab-left);
99
99
  width: var(--active-tab-width);
100
100
  height: var(--active-tab-height);
101
- box-shadow: inset 0 -2px 0 var(--foreground);
101
+ box-shadow: inset 0 -2px 0 var(--primary);
102
102
  }
103
103
 
104
104
  .tabs[data-variant="underline"][data-orientation="vertical"] > .tabs__list {
@@ -107,7 +107,7 @@
107
107
  }
108
108
 
109
109
  .tabs[data-variant="underline"][data-orientation="vertical"] .tabs__indicator {
110
- box-shadow: inset -2px 0 0 var(--foreground);
110
+ box-shadow: inset -2px 0 0 var(--primary);
111
111
  }
112
112
 
113
113
  /* ─────────────── variant: pill (세그먼트) ─────────────── */
@@ -9,7 +9,7 @@ export const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
9
9
  <textarea
10
10
  ref={ref}
11
11
  className={cn(
12
- "block w-full min-h-20 px-[var(--space-3)] py-[var(--space-2)] bg-background text-foreground border border-border rounded-[var(--radius)] font-[inherit] text-[length:var(--text-sm)] leading-normal resize-y transition-[border-color,box-shadow] duration-[var(--duration-fast)] placeholder:text-foreground-subtle hover:not-disabled:not-focus:border-border-strong focus:outline-none focus:border-foreground focus:shadow-[0_0_0_1px_var(--foreground)] disabled:opacity-[var(--opacity-disabled)] disabled:cursor-not-allowed disabled:bg-background-subtle read-only:bg-background-subtle aria-[invalid=true]:border-danger aria-[invalid=true]:focus:shadow-[0_0_0_1px_var(--danger)] [@media(hover:none)_and_(pointer:coarse)]:text-[length:var(--text-base)]",
12
+ "block w-full min-h-20 px-[var(--space-3)] py-[var(--space-2)] bg-background text-foreground border border-border rounded-[var(--radius)] font-[inherit] text-[length:var(--text-sm)] leading-normal resize-y transition-[border-color,box-shadow] duration-[var(--duration-fast)] placeholder:text-foreground-subtle hover:not-disabled:not-focus:border-border-strong focus:outline-none focus:border-primary focus:shadow-[0_0_0_1px_var(--primary)] disabled:opacity-[var(--opacity-disabled)] disabled:cursor-not-allowed disabled:bg-background-subtle read-only:bg-background-subtle aria-[invalid=true]:border-danger aria-[invalid=true]:focus:shadow-[0_0_0_1px_var(--danger)] [@media(hover:none)_and_(pointer:coarse)]:text-[length:var(--text-base)]",
13
13
  className,
14
14
  )}
15
15
  {...props}
@@ -31,8 +31,8 @@
31
31
 
32
32
  .sh-ui-textarea:focus {
33
33
  outline: none;
34
- border-color: var(--foreground);
35
- box-shadow: 0 0 0 1px var(--foreground);
34
+ border-color: var(--primary);
35
+ box-shadow: 0 0 0 1px var(--primary);
36
36
  }
37
37
 
38
38
  .sh-ui-textarea:disabled {
@@ -31,8 +31,8 @@
31
31
 
32
32
  .textarea:focus {
33
33
  outline: none;
34
- border-color: var(--foreground);
35
- box-shadow: 0 0 0 1px var(--foreground);
34
+ border-color: var(--primary);
35
+ box-shadow: 0 0 0 1px var(--primary);
36
36
  }
37
37
 
38
38
  .textarea:disabled {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-ui-cli",
3
- "version": "0.58.3",
3
+ "version": "0.58.5",
4
4
  "description": "sh-ui CLI — 프로젝트 스캐폴드(create) + 컴포넌트 추가(add/list/remove) + IDE-내 AI용 MCP 서버",
5
5
  "license": "MIT",
6
6
  "repository": {