sh-ui-cli 0.58.6 → 0.58.8

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.
@@ -2,6 +2,34 @@
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.8",
7
+ "date": "2026-05-06",
8
+ "title": "디자인 디폴트 개편 7라운드 — Tooltip 의 duration·shadow 를 토큰으로",
9
+ "type": "patch",
10
+ "highlights": [
11
+ "**Tooltip 의 `duration-[120ms]` → `duration-[var(--duration-fast)]`** — 정확히 같은 값(120ms = `--duration-fast`)을 하드코딩하던 걸 토큰으로. 향후 token 단에서 motion 속도를 일괄 조정 가능.",
12
+ "**Tooltip 의 `shadow-[0_4px_12px_rgba(0,0,0,0.12)]` → `shadow-[var(--shadow-md)]`** — 토큰 `--shadow-md` 와 정확히 동일한 값을 하드코딩하던 걸 정리. 향후 elevation 일괄 조정 가능.",
13
+ "**다른 컴포넌트들의 shadow 는 별도로 보존** — Popover/Toast/DropdownMenu 등은 component-specific tuning (multi-layer, negative spread 등) 이라 토큰과 정확히 매칭되지 않음. 무리한 표준화는 visual diff 손실로 보류.",
14
+ "**Heading typography / hover state 일관성** — audit 결과 모두 의도된 차이 (Dialog/Card/Popover 의 size 차등 = 컨텍스트, hover 는 이미 모두 token-driven). 변경 안 함.",
15
+ "**4 variant + 듀얼 카피본 동기화** — Tooltip Tailwind / plain CSS / CSS Modules / vanilla-extract."
16
+ ],
17
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.58.8"
18
+ },
19
+ {
20
+ "version": "0.58.7",
21
+ "date": "2026-05-06",
22
+ "title": "디자인 디폴트 개편 6라운드 — disabled opacity 토큰 통일",
23
+ "type": "patch",
24
+ "highlights": [
25
+ "**`--opacity-disabled` (0.5) 토큰을 모든 컴포넌트가 사용** — 그동안 calendar(0.3) / carousel(0.4) / pagination(0.45) / rich-text-editor(0.5) 가 각자 다른 disabled opacity 값을 쓰고 있었음. 단일 토큰으로 정렬해 \"disabled 느낌\"이 모든 컴포넌트에서 동일.",
26
+ "**Tailwind variant 의 하드코딩 opacity 클래스 제거** — `disabled:opacity-30` / `disabled:opacity-40` / `disabled:opacity-50` / `aria-disabled:opacity-45` / `data-[disabled]:opacity-45` → `disabled:opacity-[var(--opacity-disabled)]`.",
27
+ "**plain CSS / module / vanilla-extract 동기화** — `:disabled { opacity: 0.X }` 의 0.3/0.4/0.45/0.5 하드코딩 → `var(--opacity-disabled)`.",
28
+ "**outside / inactive 같은 \"비활성이지만 disabled 아님\" 상태는 별도 유지** — calendar 의 day--outside (0.4) 는 disabled 와 다른 시각 의도라 이번 통일에서 제외.",
29
+ "**철학 — \"disabled 느낌\" 은 토큰의 책임**: 사용자가 brand 톤 한 번 결정하면 모든 컴포넌트의 disabled 가 같은 깊이로 fade. 컴포넌트별 미세 조정 X."
30
+ ],
31
+ "url": "https://github.com/sanghyeonKim0201/sh-ui/releases/tag/v0.58.7"
32
+ },
5
33
  {
6
34
  "version": "0.58.6",
7
35
  "date": "2026-05-06",
@@ -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-ring 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-[var(--opacity-disabled)] 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",
@@ -208,6 +208,6 @@
208
208
  }
209
209
 
210
210
  .sh-ui-calendar__day:disabled {
211
- opacity: 0.3;
211
+ opacity: var(--opacity-disabled);
212
212
  cursor: not-allowed;
213
213
  }
@@ -208,6 +208,6 @@
208
208
  }
209
209
 
210
210
  .calendar__day:disabled {
211
- opacity: 0.3;
211
+ opacity: var(--opacity-disabled);
212
212
  cursor: not-allowed;
213
213
  }
@@ -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-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]";
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-[var(--opacity-disabled)] 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) => {
@@ -70,7 +70,7 @@
70
70
  }
71
71
 
72
72
  .sh-ui-carousel__nav:disabled {
73
- opacity: 0.4;
73
+ opacity: var(--opacity-disabled);
74
74
  cursor: not-allowed;
75
75
  }
76
76
 
@@ -70,7 +70,7 @@
70
70
  }
71
71
 
72
72
  .carousel__nav:disabled {
73
- opacity: 0.4;
73
+ opacity: var(--opacity-disabled);
74
74
  cursor: not-allowed;
75
75
  }
76
76
 
@@ -34,7 +34,7 @@ export const PaginationItem = React.forwardRef<HTMLLIElement, React.LiHTMLAttrib
34
34
  );
35
35
 
36
36
  const linkBase =
37
- "inline-flex items-center justify-center gap-1.5 min-w-9 h-9 px-3 rounded-[calc(var(--radius)-2px)] border border-transparent bg-transparent text-foreground no-underline transition-[background-color,border-color,color] duration-[var(--duration-fast)] cursor-pointer select-none hover:bg-background-muted focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 data-[active]:bg-foreground data-[active]:text-background data-[active]:font-medium data-[active]:hover:opacity-90 aria-disabled:pointer-events-none aria-disabled:opacity-45 data-[disabled]:pointer-events-none data-[disabled]:opacity-45 data-[size=sm]:min-w-8 data-[size=sm]:h-8 data-[size=sm]:px-2 motion-reduce:transition-none";
37
+ "inline-flex items-center justify-center gap-1.5 min-w-9 h-9 px-3 rounded-[calc(var(--radius)-2px)] border border-transparent bg-transparent text-foreground no-underline transition-[background-color,border-color,color] duration-[var(--duration-fast)] cursor-pointer select-none hover:bg-background-muted focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-2 data-[active]:bg-foreground data-[active]:text-background data-[active]:font-medium data-[active]:hover:opacity-90 aria-disabled:pointer-events-none aria-disabled:opacity-[var(--opacity-disabled)] data-[disabled]:pointer-events-none data-[disabled]:opacity-[var(--opacity-disabled)] data-[size=sm]:min-w-8 data-[size=sm]:h-8 data-[size=sm]:px-2 motion-reduce:transition-none";
38
38
 
39
39
  export interface PaginationLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
40
40
  isActive?: boolean;
@@ -70,7 +70,7 @@
70
70
  .sh-ui-pagination__link[aria-disabled="true"],
71
71
  .sh-ui-pagination__link[data-disabled] {
72
72
  pointer-events: none;
73
- opacity: 0.45;
73
+ opacity: var(--opacity-disabled);
74
74
  }
75
75
 
76
76
  .sh-ui-pagination__nav {
@@ -70,7 +70,7 @@
70
70
  .pagination__link[aria-disabled="true"],
71
71
  .pagination__link[data-disabled] {
72
72
  pointer-events: none;
73
- opacity: 0.45;
73
+ opacity: var(--opacity-disabled);
74
74
  }
75
75
 
76
76
  .pagination__nav {
@@ -157,7 +157,7 @@ function ToolbarButton({ editor, label, icon, isActive, canRun, run, disabled }:
157
157
  <button
158
158
  type="button"
159
159
  className={cn(
160
- "inline-flex items-center justify-center w-7 h-7 p-0 bg-transparent text-foreground-muted border border-transparent rounded-[calc(var(--radius)-2px)] cursor-pointer transition-[color,background-color,border-color] duration-[var(--duration-fast)] hover:not-disabled:text-foreground hover:not-disabled:bg-background hover:not-disabled:border-border focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-1 disabled:opacity-50 disabled:cursor-not-allowed motion-reduce:transition-none",
160
+ "inline-flex items-center justify-center w-7 h-7 p-0 bg-transparent text-foreground-muted border border-transparent rounded-[calc(var(--radius)-2px)] cursor-pointer transition-[color,background-color,border-color] duration-[var(--duration-fast)] hover:not-disabled:text-foreground hover:not-disabled:bg-background hover:not-disabled:border-border focus-visible:outline-[length:var(--border-width-strong)] focus-visible:outline-ring focus-visible:outline-offset-1 disabled:opacity-[var(--opacity-disabled)] disabled:cursor-not-allowed motion-reduce:transition-none",
161
161
  isActive && "text-foreground bg-background border-border-strong",
162
162
  )}
163
163
  aria-label={label}
@@ -59,7 +59,7 @@
59
59
  border-color: var(--border-strong);
60
60
  }
61
61
  .sh-ui-rte__btn:disabled {
62
- opacity: 0.5;
62
+ opacity: var(--opacity-disabled);
63
63
  cursor: not-allowed;
64
64
  }
65
65
  .sh-ui-rte__sep {
@@ -59,7 +59,7 @@
59
59
  border-color: var(--border-strong);
60
60
  }
61
61
  .rte__btn:disabled {
62
- opacity: 0.5;
62
+ opacity: var(--opacity-disabled);
63
63
  cursor: not-allowed;
64
64
  }
65
65
  .rte__sep {
@@ -38,7 +38,7 @@ export const TooltipContent = React.forwardRef<HTMLDivElement, TooltipContentPro
38
38
  <BaseTooltip.Popup
39
39
  ref={ref}
40
40
  className={cn(
41
- "px-2.5 py-1.5 bg-foreground text-background rounded-[calc(var(--radius)-2px)] text-[length:var(--text-xs)] leading-snug max-w-xs shadow-[0_4px_12px_rgba(0,0,0,0.12)] origin-[var(--transform-origin)] outline-none transition-[opacity,transform] duration-[120ms] 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 motion-reduce:data-[starting-style]:scale-100 motion-reduce:data-[ending-style]:scale-100",
41
+ "px-2.5 py-1.5 bg-foreground text-background rounded-[calc(var(--radius)-2px)] text-[length:var(--text-xs)] leading-snug max-w-xs shadow-[var(--shadow-md)] origin-[var(--transform-origin)] outline-none transition-[opacity,transform] duration-[var(--duration-fast)] 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 motion-reduce:data-[starting-style]:scale-100 motion-reduce:data-[ending-style]:scale-100",
42
42
  className,
43
43
  )}
44
44
  {...props}
@@ -11,7 +11,7 @@
11
11
  font-size: var(--text-xs);
12
12
  line-height: 1.4;
13
13
  max-width: 20rem;
14
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
14
+ box-shadow: var(--shadow-md);
15
15
  transform-origin: var(--transform-origin);
16
16
  outline: none;
17
17
  transition:
@@ -11,7 +11,7 @@
11
11
  font-size: var(--text-xs);
12
12
  line-height: 1.4;
13
13
  max-width: 20rem;
14
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
14
+ box-shadow: var(--shadow-md);
15
15
  transform-origin: var(--transform-origin);
16
16
  outline: none;
17
17
  transition:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sh-ui-cli",
3
- "version": "0.58.6",
3
+ "version": "0.58.8",
4
4
  "description": "sh-ui CLI — 프로젝트 스캐폴드(create) + 컴포넌트 추가(add/list/remove) + IDE-내 AI용 MCP 서버",
5
5
  "license": "MIT",
6
6
  "repository": {