@nexus-cross/design-system 2.0.0 → 2.0.1

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 (67) hide show
  1. package/README.md +375 -0
  2. package/cursor-rules/nexus-ui-api.mdc +366 -7
  3. package/dist/chunks/{chunk-2T7RUYEK.js → chunk-2BINGHGR.js} +11 -3
  4. package/dist/chunks/{chunk-QOREDNWO.mjs → chunk-53BHDUID.mjs} +2 -1
  5. package/dist/chunks/{chunk-QZ4QR3XV.mjs → chunk-ATZE57ZO.mjs} +11 -3
  6. package/dist/chunks/{chunk-OX5MEJ7B.js → chunk-HU6E2R2T.js} +2 -1
  7. package/dist/chunks/chunk-KT2WKVF7.mjs +5 -0
  8. package/dist/chunks/{chunk-5J63FUAS.mjs → chunk-LNC3TV6N.mjs} +53 -2
  9. package/dist/chunks/chunk-MWWQMVXJ.js +7 -0
  10. package/dist/chunks/{chunk-BJM3NDT2.mjs → chunk-RL5UAEGQ.mjs} +11 -3
  11. package/dist/chunks/{chunk-LAGQ7J5A.js → chunk-VCN7DMCQ.js} +53 -2
  12. package/dist/chunks/{chunk-2ZXDXO4I.js → chunk-VDEB5BMT.js} +11 -3
  13. package/dist/components/ImageUpload.d.ts +14 -0
  14. package/dist/components/ImageUpload.d.ts.map +1 -1
  15. package/dist/components/NumberInput.d.ts +20 -1
  16. package/dist/components/NumberInput.d.ts.map +1 -1
  17. package/dist/components/Select.d.ts +5 -1
  18. package/dist/components/Select.d.ts.map +1 -1
  19. package/dist/components/Tab.d.ts +12 -1
  20. package/dist/components/Tab.d.ts.map +1 -1
  21. package/dist/image-upload.js +3 -3
  22. package/dist/image-upload.mjs +1 -1
  23. package/dist/index.js +16 -16
  24. package/dist/index.mjs +4 -4
  25. package/dist/number-input.js +4 -4
  26. package/dist/number-input.mjs +1 -1
  27. package/dist/schemas/_all.json +48 -10
  28. package/dist/schemas/image-upload.d.ts +6 -0
  29. package/dist/schemas/image-upload.d.ts.map +1 -1
  30. package/dist/schemas/imageUpload.json +19 -1
  31. package/dist/schemas/number-input.d.ts +9 -3
  32. package/dist/schemas/number-input.d.ts.map +1 -1
  33. package/dist/schemas/numberInput.json +10 -3
  34. package/dist/schemas/spinner.json +2 -2
  35. package/dist/schemas/tab.d.ts +11 -0
  36. package/dist/schemas/tab.d.ts.map +1 -1
  37. package/dist/schemas/tab.json +17 -4
  38. package/dist/schemas.js +48 -10
  39. package/dist/schemas.mjs +48 -10
  40. package/dist/select.js +5 -5
  41. package/dist/select.mjs +1 -1
  42. package/dist/styles/.generated/built.d.ts +1 -1
  43. package/dist/styles/.generated/built.d.ts.map +1 -1
  44. package/dist/styles/layer.js +2 -2
  45. package/dist/styles/layer.mjs +1 -1
  46. package/dist/styles.css +185 -44
  47. package/dist/styles.js +2 -2
  48. package/dist/styles.layered.css +185 -44
  49. package/dist/styles.mjs +1 -1
  50. package/dist/tab.js +4 -4
  51. package/dist/tab.mjs +1 -1
  52. package/dist/tokens/TOKENS.md +13 -0
  53. package/dist/tokens/company.css +21 -1
  54. package/dist/tokens/css.css +21 -1
  55. package/dist/tokens/data/color.json +32 -0
  56. package/dist/tokens/data/space.json +1 -1
  57. package/dist/tokens/data/typography.json +55 -1
  58. package/dist/tokens-domains/data/gamehub/domain.json +258 -0
  59. package/dist/tokens-domains/data/index.ts +3 -1
  60. package/dist/tokens-domains/data/prediction/domain.json +0 -12
  61. package/dist/tokens-domains/gamehub.md +62 -0
  62. package/dist/tokens-domains/prediction-vars.css +1 -5
  63. package/dist/tokens-domains/prediction.css +1 -5
  64. package/dist/tokens-domains/prediction.md +0 -1
  65. package/package.json +3 -3
  66. package/dist/chunks/chunk-3SCSND6S.js +0 -7
  67. package/dist/chunks/chunk-QWK4CLS2.mjs +0 -5
@@ -2,7 +2,7 @@ import * as React from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
3
  declare const numberInputVariants: (props?: ({
4
4
  variant?: "basic" | "bind" | null | undefined;
5
- size?: "xl" | "lg" | null | undefined;
5
+ size?: "xl" | "lg" | "md" | null | undefined;
6
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
7
  interface NumberInputRef {
8
8
  input: HTMLInputElement | null;
@@ -23,7 +23,26 @@ interface NumberInputProps extends Omit<React.InputHTMLAttributes<HTMLInputEleme
23
23
  description?: string;
24
24
  showMax?: boolean;
25
25
  hideButtons?: boolean;
26
+ /**
27
+ * 입력 좌측에 표시할 prefix (ReactNode). 단위/통화 기호/아이콘 등.
28
+ * 예: `prefixIcon="$"`, `prefixIcon={<SearchIcon />}`
29
+ */
30
+ prefixIcon?: React.ReactNode;
31
+ /**
32
+ * 입력 우측에 표시할 suffix (ReactNode). 단위(%, 원, kg 등) 표시에 유용.
33
+ * 단, basic variant에서 화살표 버튼이 우측에 있으므로 `hideButtons` 또는 `bind` variant와 함께 사용 권장.
34
+ */
35
+ suffixIcon?: React.ReactNode;
26
36
  onValueChange?: (value: number | undefined) => void;
37
+ /**
38
+ * 입력 박스(border가 있는 container) 자체에 적용. 높이/패딩 조정 시 사용.
39
+ * 예: `containerClassName="h-12 px-4"`
40
+ *
41
+ * 일반 `className`은 outer wrapper(label/box/description 그룹)에 적용된다.
42
+ */
43
+ containerClassName?: string;
44
+ /** <input> element 자체에 적용 (font-size 같은 텍스트 스타일 오버라이드 시). */
45
+ inputClassName?: string;
27
46
  }
28
47
  declare function numberInputBind(ref: React.RefObject<NumberInputRef | null>, direction: 'increment' | 'decrement'): {
29
48
  onPointerDown: (e: React.PointerEvent) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"NumberInput.d.ts","sourceRoot":"","sources":["../../src/components/NumberInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,QAAA,MAAM,mBAAmB;;;8EAYvB,CAAC;AAqDH,UAAU,cAAc;IACtB,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;IAChD,cAAc,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;IAChD,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,UAAU,gBACR,SAAQ,IAAI,CACR,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAC3C,MAAM,GAAG,UAAU,GAAG,OAAO,CAC9B,EACD,YAAY,CAAC,OAAO,mBAAmB,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACrD;AAcD,iBAAS,eAAe,CACtB,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,EAC3C,SAAS,EAAE,WAAW,GAAG,WAAW;uBAGf,KAAK,CAAC,YAAY;;;EAOxC;AAED,QAAA,MAAM,WAAW,yFA+ShB,CAAC;AAIF,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC;AAC7D,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"NumberInput.d.ts","sourceRoot":"","sources":["../../src/components/NumberInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,QAAA,MAAM,mBAAmB;;;8EAcvB,CAAC;AAqDH,UAAU,cAAc;IACtB,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,cAAc,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;IAChD,cAAc,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC;IAChD,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,UAAU,gBACR,SAAQ,IAAI,CACR,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAC3C,MAAM,GAAG,UAAU,GAAG,OAAO,CAC9B,EACD,YAAY,CAAC,OAAO,mBAAmB,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B;;;OAGG;IACH,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IACpD;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAcD,iBAAS,eAAe,CACtB,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,EAC3C,SAAS,EAAE,WAAW,GAAG,WAAW;uBAGf,KAAK,CAAC,YAAY;;;EAOxC;AAED,QAAA,MAAM,WAAW,yFA+ThB,CAAC;AAIF,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,EAAE,CAAC;AAC7D,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC"}
@@ -13,11 +13,15 @@ interface SelectProps extends VariantProps<typeof selectTriggerVariants> {
13
13
  onValueChange?: (value: string) => void;
14
14
  placeholder?: string;
15
15
  disabled?: boolean;
16
+ /** 트리거 wrapper(`<div>`)에 적용. width(`w-*`/`min-w-*`)를 외부에서 오버라이드할 때 사용. */
16
17
  className?: string;
17
18
  displayComponent?: ReactNode;
19
+ /** Radix Trigger 자체에 적용되는 className. */
18
20
  triggerClassName?: string;
21
+ /** 드롭다운(SelectContent)에 적용. 트리거와 별개의 너비로 가져가고 싶을 때 사용. */
22
+ contentClassName?: string;
19
23
  }
20
- declare const Select: ({ children, value, onValueChange, placeholder, disabled, size, variant, className, triggerClassName, displayComponent, }: SelectProps) => import("react/jsx-runtime").JSX.Element;
24
+ declare const Select: ({ children, value, onValueChange, placeholder, disabled, size, variant, className, triggerClassName, contentClassName, displayComponent, }: SelectProps) => import("react/jsx-runtime").JSX.Element;
21
25
  declare const SelectItem: ({ children, value, disabled, className, }: {
22
26
  children: ReactNode;
23
27
  value: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../src/components/Select.tsx"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AAG5C,QAAA,MAAM,qBAAqB;;;8EAczB,CAAC;AAEH,QAAA,MAAM,qBAAqB;;8EAUzB,CAAC;AAQH,UAAU,WAAY,SAAQ,YAAY,CAAC,OAAO,qBAAqB,CAAC;IACtE,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,QAAA,MAAM,MAAM,GAAI,0HAWb,WAAW,4CA8Cb,CAAC;AAEF,QAAA,MAAM,UAAU,GAAI,2CAKjB;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,4CAQA,CAAC;AAEF,OAAO,EACL,MAAM,EACN,UAAU,EACV,qBAAqB,EACrB,qBAAqB,GACtB,CAAC"}
1
+ {"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../../src/components/Select.tsx"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAY,MAAM,OAAO,CAAC;AAG5C,QAAA,MAAM,qBAAqB;;;8EAczB,CAAC;AAEH,QAAA,MAAM,qBAAqB;;8EAUzB,CAAC;AAQH,UAAU,WAAY,SAAQ,YAAY,CAAC,OAAO,qBAAqB,CAAC;IACtE,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,QAAA,MAAM,MAAM,GAAI,4IAYb,WAAW,4CA8Cb,CAAC;AAEF,QAAA,MAAM,UAAU,GAAI,2CAKjB;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,4CAQA,CAAC;AAEF,OAAO,EACL,MAAM,EACN,UAAU,EACV,qBAAqB,EACrB,qBAAqB,GACtB,CAAC"}
@@ -2,6 +2,7 @@ import * as React from 'react';
2
2
  import { type VariantProps } from 'class-variance-authority';
3
3
  declare const tabListVariants: (props?: ({
4
4
  variant?: "line" | "pill" | null | undefined;
5
+ fullWidth?: boolean | null | undefined;
5
6
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
7
  declare const tabTriggerVariants: (props?: ({
7
8
  variant?: "line" | "pill" | null | undefined;
@@ -13,6 +14,8 @@ interface TabItem {
13
14
  label: React.ReactNode;
14
15
  children?: React.ReactNode;
15
16
  disabled?: boolean;
17
+ /** Per-item className applied to the trigger <button>. Useful for one-off width/padding overrides. */
18
+ className?: string;
16
19
  }
17
20
  interface TabProps extends VariantProps<typeof tabListVariants> {
18
21
  items: TabItem[];
@@ -23,9 +26,17 @@ interface TabProps extends VariantProps<typeof tabListVariants> {
23
26
  onTabChange?: (key: string) => void;
24
27
  className?: string;
25
28
  tabListClassName?: string;
29
+ /** className applied to every tab trigger <button>. Combine with `fullWidth` for equal-width tabs. */
30
+ tabItemClassName?: string;
26
31
  tabPanelClassName?: string;
32
+ /**
33
+ * If true, triggers are stretched to evenly fill the tab list width (`flex: 1`),
34
+ * and the list itself is set to `width: 100%`. Use for top-level navigation tabs.
35
+ * Defaults to false (triggers size to their content).
36
+ */
37
+ fullWidth?: boolean;
27
38
  }
28
- declare function Tab({ items, activeKey: controlledKey, defaultActiveKey, variant, size, destroyInactive, onTabChange, className, tabListClassName, tabPanelClassName, }: TabProps): import("react/jsx-runtime").JSX.Element;
39
+ declare function Tab({ items, activeKey: controlledKey, defaultActiveKey, variant, size, fullWidth, destroyInactive, onTabChange, className, tabListClassName, tabItemClassName, tabPanelClassName, }: TabProps): import("react/jsx-runtime").JSX.Element;
29
40
  declare namespace Tab {
30
41
  var displayName: string;
31
42
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Tab.d.ts","sourceRoot":"","sources":["../../src/components/Tab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,QAAA,MAAM,eAAe;;8EAQnB,CAAC;AAEH,QAAA,MAAM,kBAAkB;;;;8EAoBtB,CAAC;AAEH,UAAU,OAAO;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,QAAS,SAAQ,YAAY,CAAC,OAAO,eAAe,CAAC;IAC7D,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,iBAAS,GAAG,CAAC,EACX,KAAK,EACL,SAAS,EAAE,aAAa,EACxB,gBAAgB,EAChB,OAAO,EACP,IAAI,EACJ,eAAuB,EACvB,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,iBAAiB,GAClB,EAAE,QAAQ,2CAwGV;kBAnHQ,GAAG;;;AAuHZ,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC;AACpD,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC"}
1
+ {"version":3,"file":"Tab.d.ts","sourceRoot":"","sources":["../../src/components/Tab.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGlE,QAAA,MAAM,eAAe;;;8EAYnB,CAAC;AAEH,QAAA,MAAM,kBAAkB;;;;8EAoBtB,CAAC;AAEH,UAAU,OAAO;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sGAAsG;IACtG,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,QAAS,SAAQ,YAAY,CAAC,OAAO,eAAe,CAAC;IAC7D,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sGAAsG;IACtG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,iBAAS,GAAG,CAAC,EACX,KAAK,EACL,SAAS,EAAE,aAAa,EACxB,gBAAgB,EAChB,OAAO,EACP,IAAI,EACJ,SAAiB,EACjB,eAAuB,EACvB,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,EAAE,QAAQ,2CA0GV;kBAvHQ,GAAG;;;AA2HZ,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC;AACpD,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC"}
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkLAGQ7J5A_js = require('./chunks/chunk-LAGQ7J5A.js');
3
+ var chunkVCN7DMCQ_js = require('./chunks/chunk-VCN7DMCQ.js');
4
4
  require('./chunks/chunk-CZC76ZD5.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "ImageUpload", {
9
9
  enumerable: true,
10
- get: function () { return chunkLAGQ7J5A_js.ImageUpload; }
10
+ get: function () { return chunkVCN7DMCQ_js.ImageUpload; }
11
11
  });
12
12
  Object.defineProperty(exports, "imageUploadVariants", {
13
13
  enumerable: true,
14
- get: function () { return chunkLAGQ7J5A_js.imageUploadVariants; }
14
+ get: function () { return chunkVCN7DMCQ_js.imageUploadVariants; }
15
15
  });
@@ -1,2 +1,2 @@
1
- export { ImageUpload, imageUploadVariants } from './chunks/chunk-5J63FUAS.mjs';
1
+ export { ImageUpload, imageUploadVariants } from './chunks/chunk-LNC3TV6N.mjs';
2
2
  import './chunks/chunk-MCKOWMLS.mjs';
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ var chunkDICN6GKE_js = require('./chunks/chunk-DICN6GKE.js');
9
9
  var chunkDYPPVXQF_js = require('./chunks/chunk-DYPPVXQF.js');
10
10
  var chunkLYPBQI3Y_js = require('./chunks/chunk-LYPBQI3Y.js');
11
11
  var chunkLTS674LF_js = require('./chunks/chunk-LTS674LF.js');
12
- var chunkLAGQ7J5A_js = require('./chunks/chunk-LAGQ7J5A.js');
12
+ var chunkVCN7DMCQ_js = require('./chunks/chunk-VCN7DMCQ.js');
13
13
  var chunkQK6NCII4_js = require('./chunks/chunk-QK6NCII4.js');
14
14
  var chunkBLGQHR3M_js = require('./chunks/chunk-BLGQHR3M.js');
15
15
  var chunkDLFV7ZZV_js = require('./chunks/chunk-DLFV7ZZV.js');
@@ -27,7 +27,7 @@ var chunkOMN5YQCE_js = require('./chunks/chunk-OMN5YQCE.js');
27
27
  var chunk5JHJNN2K_js = require('./chunks/chunk-5JHJNN2K.js');
28
28
  var chunk2MC7XJSE_js = require('./chunks/chunk-2MC7XJSE.js');
29
29
  var chunkB6G5TJRO_js = require('./chunks/chunk-B6G5TJRO.js');
30
- var chunkOX5MEJ7B_js = require('./chunks/chunk-OX5MEJ7B.js');
30
+ var chunkHU6E2R2T_js = require('./chunks/chunk-HU6E2R2T.js');
31
31
  var chunkRC2Y4UH7_js = require('./chunks/chunk-RC2Y4UH7.js');
32
32
  var chunkIOSIQLZL_js = require('./chunks/chunk-IOSIQLZL.js');
33
33
  var chunkBSZ2LN6E_js = require('./chunks/chunk-BSZ2LN6E.js');
@@ -35,13 +35,13 @@ var chunkIE4DGLMH_js = require('./chunks/chunk-IE4DGLMH.js');
35
35
  var chunk3PCNRCTB_js = require('./chunks/chunk-3PCNRCTB.js');
36
36
  var chunkJLDQNDFT_js = require('./chunks/chunk-JLDQNDFT.js');
37
37
  var chunkRS3SBY3I_js = require('./chunks/chunk-RS3SBY3I.js');
38
- var chunk2ZXDXO4I_js = require('./chunks/chunk-2ZXDXO4I.js');
38
+ var chunkVDEB5BMT_js = require('./chunks/chunk-VDEB5BMT.js');
39
39
  var chunk5PQ3UCKF_js = require('./chunks/chunk-5PQ3UCKF.js');
40
40
  var chunkJ5ZKGPBY_js = require('./chunks/chunk-J5ZKGPBY.js');
41
41
  var chunkX2SHTVZQ_js = require('./chunks/chunk-X2SHTVZQ.js');
42
42
  var chunkBBLBTOP4_js = require('./chunks/chunk-BBLBTOP4.js');
43
43
  var chunkXGIJZ3NZ_js = require('./chunks/chunk-XGIJZ3NZ.js');
44
- var chunk2T7RUYEK_js = require('./chunks/chunk-2T7RUYEK.js');
44
+ var chunk2BINGHGR_js = require('./chunks/chunk-2BINGHGR.js');
45
45
  var chunk4ENXP7WH_js = require('./chunks/chunk-4ENXP7WH.js');
46
46
  var chunkMA2VCCIY_js = require('./chunks/chunk-MA2VCCIY.js');
47
47
  var chunkU53UA76K_js = require('./chunks/chunk-U53UA76K.js');
@@ -438,11 +438,11 @@ Object.defineProperty(exports, "DatePicker", {
438
438
  });
439
439
  Object.defineProperty(exports, "ImageUpload", {
440
440
  enumerable: true,
441
- get: function () { return chunkLAGQ7J5A_js.ImageUpload; }
441
+ get: function () { return chunkVCN7DMCQ_js.ImageUpload; }
442
442
  });
443
443
  Object.defineProperty(exports, "imageUploadVariants", {
444
444
  enumerable: true,
445
- get: function () { return chunkLAGQ7J5A_js.imageUploadVariants; }
445
+ get: function () { return chunkVCN7DMCQ_js.imageUploadVariants; }
446
446
  });
447
447
  Object.defineProperty(exports, "ClientOnly", {
448
448
  enumerable: true,
@@ -590,19 +590,19 @@ Object.defineProperty(exports, "Ellipsis", {
590
590
  });
591
591
  Object.defineProperty(exports, "Select", {
592
592
  enumerable: true,
593
- get: function () { return chunkOX5MEJ7B_js.Select; }
593
+ get: function () { return chunkHU6E2R2T_js.Select; }
594
594
  });
595
595
  Object.defineProperty(exports, "SelectItem", {
596
596
  enumerable: true,
597
- get: function () { return chunkOX5MEJ7B_js.SelectItem; }
597
+ get: function () { return chunkHU6E2R2T_js.SelectItem; }
598
598
  });
599
599
  Object.defineProperty(exports, "selectContentVariants", {
600
600
  enumerable: true,
601
- get: function () { return chunkOX5MEJ7B_js.selectContentVariants; }
601
+ get: function () { return chunkHU6E2R2T_js.selectContentVariants; }
602
602
  });
603
603
  Object.defineProperty(exports, "selectTriggerVariants", {
604
604
  enumerable: true,
605
- get: function () { return chunkOX5MEJ7B_js.selectTriggerVariants; }
605
+ get: function () { return chunkHU6E2R2T_js.selectTriggerVariants; }
606
606
  });
607
607
  Object.defineProperty(exports, "Combobox", {
608
608
  enumerable: true,
@@ -714,15 +714,15 @@ Object.defineProperty(exports, "paginationVariants", {
714
714
  });
715
715
  Object.defineProperty(exports, "Tab", {
716
716
  enumerable: true,
717
- get: function () { return chunk2ZXDXO4I_js.Tab; }
717
+ get: function () { return chunkVDEB5BMT_js.Tab; }
718
718
  });
719
719
  Object.defineProperty(exports, "tabListVariants", {
720
720
  enumerable: true,
721
- get: function () { return chunk2ZXDXO4I_js.tabListVariants; }
721
+ get: function () { return chunkVDEB5BMT_js.tabListVariants; }
722
722
  });
723
723
  Object.defineProperty(exports, "tabTriggerVariants", {
724
724
  enumerable: true,
725
- get: function () { return chunk2ZXDXO4I_js.tabTriggerVariants; }
725
+ get: function () { return chunkVDEB5BMT_js.tabTriggerVariants; }
726
726
  });
727
727
  Object.defineProperty(exports, "Alert", {
728
728
  enumerable: true,
@@ -766,15 +766,15 @@ Object.defineProperty(exports, "textAreaVariants", {
766
766
  });
767
767
  Object.defineProperty(exports, "NumberInput", {
768
768
  enumerable: true,
769
- get: function () { return chunk2T7RUYEK_js.NumberInput; }
769
+ get: function () { return chunk2BINGHGR_js.NumberInput; }
770
770
  });
771
771
  Object.defineProperty(exports, "numberInputBind", {
772
772
  enumerable: true,
773
- get: function () { return chunk2T7RUYEK_js.numberInputBind; }
773
+ get: function () { return chunk2BINGHGR_js.numberInputBind; }
774
774
  });
775
775
  Object.defineProperty(exports, "numberInputVariants", {
776
776
  enumerable: true,
777
- get: function () { return chunk2T7RUYEK_js.numberInputVariants; }
777
+ get: function () { return chunk2BINGHGR_js.numberInputVariants; }
778
778
  });
779
779
  Object.defineProperty(exports, "PriceInput", {
780
780
  enumerable: true,
package/dist/index.mjs CHANGED
@@ -7,7 +7,7 @@ export { Slider, sliderVariants } from './chunks/chunk-H2G5FMRN.mjs';
7
7
  export { TagInput, tagInputVariants } from './chunks/chunk-H2V7RHYV.mjs';
8
8
  export { NxImage } from './chunks/chunk-WZFKTTVX.mjs';
9
9
  export { DatePicker } from './chunks/chunk-FBC53TOS.mjs';
10
- export { ImageUpload, imageUploadVariants } from './chunks/chunk-5J63FUAS.mjs';
10
+ export { ImageUpload, imageUploadVariants } from './chunks/chunk-LNC3TV6N.mjs';
11
11
  export { ClientOnly } from './chunks/chunk-AOXXE5UQ.mjs';
12
12
  export { Skeleton } from './chunks/chunk-P2T72N62.mjs';
13
13
  export { Countdown, useCountdown } from './chunks/chunk-LI7SFBUQ.mjs';
@@ -25,7 +25,7 @@ export { VirtualGrid, VirtualList } from './chunks/chunk-EHAUUUWB.mjs';
25
25
  export { InfiniteScroll } from './chunks/chunk-LMMON5AU.mjs';
26
26
  export { Marquee } from './chunks/chunk-SJMCPSVH.mjs';
27
27
  export { Ellipsis } from './chunks/chunk-6FMDO6TT.mjs';
28
- export { Select, SelectItem, selectContentVariants, selectTriggerVariants } from './chunks/chunk-QOREDNWO.mjs';
28
+ export { Select, SelectItem, selectContentVariants, selectTriggerVariants } from './chunks/chunk-53BHDUID.mjs';
29
29
  export { Combobox, ComboboxOption, ComboboxOptionDescription, ComboboxOptionMeta, comboboxInputVariants } from './chunks/chunk-AG2UJPFX.mjs';
30
30
  export { Spinner } from './chunks/chunk-BPUQ2CO2.mjs';
31
31
  export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerRoot, DrawerTitle, DrawerTrigger, drawerContentVariants, drawerOverlayVariants } from './chunks/chunk-SGNRVYYQ.mjs';
@@ -33,13 +33,13 @@ export { Tooltip, TooltipProvider, tooltipContentVariants } from './chunks/chunk
33
33
  export { Divider, dividerVariants } from './chunks/chunk-GX6GSWX3.mjs';
34
34
  export { RadioGroup, RadioItem, radioGroupVariants, radioItemVariants } from './chunks/chunk-BJMXZJWO.mjs';
35
35
  export { Pagination, pageButtonVariants, paginationVariants } from './chunks/chunk-2RPRCWKV.mjs';
36
- export { Tab, tabListVariants, tabTriggerVariants } from './chunks/chunk-QZ4QR3XV.mjs';
36
+ export { Tab, tabListVariants, tabTriggerVariants } from './chunks/chunk-ATZE57ZO.mjs';
37
37
  export { Alert, alertVariants } from './chunks/chunk-2UPGFY6E.mjs';
38
38
  export { CheckBox, checkBoxVariants } from './chunks/chunk-MRRKW5QN.mjs';
39
39
  export { Switch, switchVariants } from './chunks/chunk-ADO7PDLY.mjs';
40
40
  export { TextInput, textInputVariants } from './chunks/chunk-UKRU46PH.mjs';
41
41
  export { TextArea, textAreaVariants } from './chunks/chunk-ZU4AWAFT.mjs';
42
- export { NumberInput, numberInputBind, numberInputVariants } from './chunks/chunk-BJM3NDT2.mjs';
42
+ export { NumberInput, numberInputBind, numberInputVariants } from './chunks/chunk-RL5UAEGQ.mjs';
43
43
  export { PriceInput, priceInputVariants } from './chunks/chunk-WGGBE4ZD.mjs';
44
44
  export { Avatar, avatarVariants } from './chunks/chunk-YLO4UKSC.mjs';
45
45
  export { ModalContainer_default as ModalContainer, ModalPortalTarget_default as ModalPortalTarget, ModalTemplate_default as ModalTemplate, checkModal, closeModal, getModalDefaultOption, openModal as modal, openModal, resetModal } from './chunks/chunk-3VFBPFZF.mjs';
@@ -1,19 +1,19 @@
1
1
  'use strict';
2
2
 
3
- var chunk2T7RUYEK_js = require('./chunks/chunk-2T7RUYEK.js');
3
+ var chunk2BINGHGR_js = require('./chunks/chunk-2BINGHGR.js');
4
4
  require('./chunks/chunk-CZC76ZD5.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "NumberInput", {
9
9
  enumerable: true,
10
- get: function () { return chunk2T7RUYEK_js.NumberInput; }
10
+ get: function () { return chunk2BINGHGR_js.NumberInput; }
11
11
  });
12
12
  Object.defineProperty(exports, "numberInputBind", {
13
13
  enumerable: true,
14
- get: function () { return chunk2T7RUYEK_js.numberInputBind; }
14
+ get: function () { return chunk2BINGHGR_js.numberInputBind; }
15
15
  });
16
16
  Object.defineProperty(exports, "numberInputVariants", {
17
17
  enumerable: true,
18
- get: function () { return chunk2T7RUYEK_js.numberInputVariants; }
18
+ get: function () { return chunk2BINGHGR_js.numberInputVariants; }
19
19
  });
@@ -1,2 +1,2 @@
1
- export { NumberInput, numberInputBind, numberInputVariants } from './chunks/chunk-BJM3NDT2.mjs';
1
+ export { NumberInput, numberInputBind, numberInputVariants } from './chunks/chunk-RL5UAEGQ.mjs';
2
2
  import './chunks/chunk-MCKOWMLS.mjs';
@@ -1639,13 +1639,31 @@
1639
1639
  "default": "md",
1640
1640
  "description": "Upload area size"
1641
1641
  },
1642
+ "previewMode": {
1643
+ "type": "string",
1644
+ "enum": [
1645
+ "card",
1646
+ "cover"
1647
+ ],
1648
+ "default": "card",
1649
+ "description": "Preview layout after upload. \"card\" = small thumbnail + change button beside it (default). \"cover\" = image fills the entire box (banner / thumbnail slot UX). In cover mode, click the box to change, click the X in the top-right to remove. Box dimensions follow size or className (h-64, aspect-video, etc.)"
1650
+ },
1651
+ "previewFit": {
1652
+ "type": "string",
1653
+ "enum": [
1654
+ "cover",
1655
+ "contain"
1656
+ ],
1657
+ "default": "cover",
1658
+ "description": "Object-fit for previewMode=\"cover\". \"cover\" fills the box (may crop), \"contain\" fits entirely inside (may letterbox)."
1659
+ },
1642
1660
  "className": {
1643
1661
  "type": "string",
1644
1662
  "description": "Style override"
1645
1663
  }
1646
1664
  },
1647
1665
  "additionalProperties": false,
1648
- "description": "ImageUpload — drag-and-drop image upload with preview, file-type/size validation, label/description.\n\nWHEN TO USE:\n • Single image upload: avatar, cover, KYC document, post thumbnail\n • Multiple files / non-image → not yet supported; build custom or use a file dropzone\n • Inline image picker without preview → custom <input type=\"file\">\n\naccept whitelist + maxSize together cover validation. onError fires with i18n-ready string.\n\nANTI-PATTERNS:\n ✗ <input type=\"file\"> + manual preview → ImageUpload (handles drag, validation, preview)\n ✗ ImageUpload without onError handler → silent failure on validation reject\n ✗ Storing image as data-URL value (use File via onChange and upload to server)"
1666
+ "description": "ImageUpload — drag-and-drop image upload with preview, file-type/size validation, label/description.\n\nWHEN TO USE:\n • Single image upload: avatar, cover, KYC document, post thumbnail\n • Banner / hero / thumbnail slot where the picked image should fill the box → previewMode=\"cover\"\n • Multiple files / non-image → not yet supported; build custom or use a file dropzone\n • Inline image picker without preview → custom <input type=\"file\">\n\naccept whitelist + maxSize together cover validation. onError fires with i18n-ready string.\n\nPREVIEW MODES:\n • card (default) — 작은 썸네일 + 우측에 \"이미지 변경\" 버튼 + 포맷 텍스트. form 필드용.\n • cover — 빈 상태 박스를 그대로 유지하고 이미지가 전체를 가득 채움. 클릭 시 변경, 우측 상단 X로 삭제.\n 크기/비율은 className(h-64, aspect-video, w-full 등) 또는 size prop으로 조정.\n\nANTI-PATTERNS:\n ✗ <input type=\"file\"> + manual preview → ImageUpload (handles drag, validation, preview)\n ✗ ImageUpload without onError handler → silent failure on validation reject\n ✗ Storing image as data-URL value (use File via onChange and upload to server)\n ✗ card 모드에서 작은 썸네일이 어색한 배너/카드 슬롯 → previewMode=\"cover\""
1649
1667
  }
1650
1668
  },
1651
1669
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2014,16 +2032,23 @@
2014
2032
  "size": {
2015
2033
  "type": "string",
2016
2034
  "enum": [
2035
+ "md",
2017
2036
  "lg",
2018
2037
  "xl"
2019
2038
  ],
2020
- "default": "lg",
2021
- "description": "Size"
2039
+ "default": "md",
2040
+ "description": "Size (matches TextInput scale)"
2022
2041
  },
2023
2042
  "error": {
2024
2043
  "type": "boolean",
2025
2044
  "description": "Error state"
2026
2045
  },
2046
+ "prefixIcon": {
2047
+ "description": "Prefix node — currency symbol, unit, or icon (ReactNode)"
2048
+ },
2049
+ "suffixIcon": {
2050
+ "description": "Suffix node — unit (%, kg, 원...) or icon. Pair with hideButtons or variant=\"bind\" so it does not collide with arrow buttons"
2051
+ },
2027
2052
  "min": {
2028
2053
  "type": "number",
2029
2054
  "description": "Minimum value"
@@ -2098,7 +2123,7 @@
2098
2123
  }
2099
2124
  },
2100
2125
  "additionalProperties": false,
2101
- "description": "Number input with two variants: basic (chevron arrows) and bind (+/- buttons). Supports label, description, max display (click to fill), accelerated increment on long press. numberInputBind(ref, direction) binds acceleration to external buttons.\n\nWHEN TO USE:\n • Any numeric field — quantity, score, age, count\n • Currency with thousand separators → PriceInput instead\n • Date / time → DatePicker instead\n\nANTI-PATTERNS:\n ✗ <TextInput type=\"number\"> → <NumberInput> (loses keyboard ↑↓, step, accelerated long-press, max click)\n ✗ Custom +/- buttons + <input> → variant=\"bind\" (or numberInputBind for external)\n ✗ Manual thousand separators for currency → PriceInput"
2126
+ "description": "Number input with two variants: basic (chevron arrows) and bind (+/- buttons). Supports label, description, max display (click to fill), accelerated increment on long press. numberInputBind(ref, direction) binds acceleration to external buttons.\n\nWHEN TO USE:\n • Any numeric field — quantity, score, age, count\n • Currency with thousand separators → PriceInput instead\n • Date / time → DatePicker instead\n\nANTI-PATTERNS:\n ✗ <TextInput type=\"number\"> → <NumberInput> (loses keyboard ↑↓, step, accelerated long-press, max click)\n ✗ Custom +/- buttons + <input> → variant=\"bind\" (or numberInputBind for external)\n ✗ Manual thousand separators for currency → PriceInput\n ✗ Inline unit text inside label/description → use prefixIcon/suffixIcon (e.g. suffixIcon=\"%\")"
2102
2127
  }
2103
2128
  },
2104
2129
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2808,7 +2833,7 @@
2808
2833
  },
2809
2834
  "color": {
2810
2835
  "type": "string",
2811
- "description": "Color (CSS color value, default currentColor)"
2836
+ "description": "Color (CSS color value). Default: brand primary (--color-accent-primary)"
2812
2837
  },
2813
2838
  "aria-label": {
2814
2839
  "type": "string",
@@ -2820,7 +2845,7 @@
2820
2845
  },
2821
2846
  "className": {
2822
2847
  "type": "string",
2823
- "description": "Color override etc."
2848
+ "description": "Color override (e.g. text-text-muted) — utility class wins over the default primary"
2824
2849
  }
2825
2850
  },
2826
2851
  "additionalProperties": false,
@@ -2978,6 +3003,10 @@
2978
3003
  "disabled": {
2979
3004
  "type": "boolean",
2980
3005
  "description": "Disabled"
3006
+ },
3007
+ "className": {
3008
+ "type": "string",
3009
+ "description": "Per-item className applied to that single trigger <button>. Use for one-off width/padding overrides; for \"all triggers same style\" use top-level `tabItemClassName`."
2981
3010
  }
2982
3011
  },
2983
3012
  "required": [
@@ -3013,6 +3042,11 @@
3013
3042
  "default": "md",
3014
3043
  "description": "Size"
3015
3044
  },
3045
+ "fullWidth": {
3046
+ "type": "boolean",
3047
+ "default": false,
3048
+ "description": "Stretch all triggers to evenly fill the tab list width (`flex: 1`) and set the list to `width: 100%`. Use for top-level navigation tabs that should span the container. Defaults to false (each trigger sizes to its content)."
3049
+ },
3016
3050
  "destroyInactive": {
3017
3051
  "type": "boolean",
3018
3052
  "default": false,
@@ -3023,22 +3057,26 @@
3023
3057
  },
3024
3058
  "className": {
3025
3059
  "type": "string",
3026
- "description": "Root style"
3060
+ "description": "Root wrapper className"
3027
3061
  },
3028
3062
  "tabListClassName": {
3029
3063
  "type": "string",
3030
- "description": "Tab list style"
3064
+ "description": "className for the tab list (the row of triggers). Width utilities (`w-full`, `max-w-md`, etc.) apply here. Note: `w-full` alone does NOT stretch individual triggers — combine with `fullWidth=true` for that."
3065
+ },
3066
+ "tabItemClassName": {
3067
+ "type": "string",
3068
+ "description": "className applied to EVERY tab trigger <button>. Combine with `fullWidth` for equal-width tabs, or pass spacing/typography utilities to restyle all triggers at once. For per-item overrides use `items[].className`."
3031
3069
  },
3032
3070
  "tabPanelClassName": {
3033
3071
  "type": "string",
3034
- "description": "Tab panel style"
3072
+ "description": "className for each panel <div>"
3035
3073
  }
3036
3074
  },
3037
3075
  "required": [
3038
3076
  "items"
3039
3077
  ],
3040
3078
  "additionalProperties": false,
3041
- "description": "Tab navigation — switch between content panels (settings sections, profile views).\n\nWHEN TO USE:\n • Page area swap where only one panel is visible at a time\n • Mutually exclusive content with stable section labels\n • Form field selection → RadioGroup (semantics: not navigation)\n • Immediate filter/option toggle → ToggleGroup\n • Stacked collapsible sections → Accordion\n\ndestroyInactive=true unmounts hidden panels (saves memory but loses state).\n\nANTI-PATTERNS:\n ✗ Tab with 1 item — just render the panel\n ✗ Tab with 8+ items — consider sub-routing or DropdownMenu\n ✗ Using Tab for form value selection → RadioGroup\n ✗ Custom <button> + onClick + state → Tab (a11y, keyboard, focus management)"
3079
+ "description": "Tab navigation — switch between content panels (settings sections, profile views).\n\nWHEN TO USE:\n • Page area swap where only one panel is visible at a time\n • Mutually exclusive content with stable section labels\n • Form field selection → RadioGroup (semantics: not navigation)\n • Immediate filter/option toggle → ToggleGroup\n • Stacked collapsible sections → Accordion\n\nWIDTH BEHAVIOR (commonly misunderstood):\n • Default: each trigger sizes to its label content; the list is as wide as the sum of triggers\n • Want all triggers to evenly fill a parent? → set `fullWidth` (NOT just `tabListClassName=\"w-full\"`)\n `tabListClassName=\"w-full\"` only widens the list; triggers stay content-width because flex children\n default to `flex: 0 1 auto`. `fullWidth` adds `flex: 1` to every trigger.\n • Want one specific trigger wider? → use `items[i].className=\"flex-2\"` (or any flex utility)\n • Want all triggers wider but not equal? → use `tabItemClassName=\"min-w-[120px]\"` etc.\n\ndestroyInactive=true unmounts hidden panels (saves memory but loses state).\n\nANTI-PATTERNS:\n ✗ Tab with 1 item — just render the panel\n ✗ Tab with 8+ items — consider sub-routing or DropdownMenu\n ✗ Using Tab for form value selection → RadioGroup\n ✗ Custom <button> + onClick + state → Tab (a11y, keyboard, focus management)\n ✗ `tabListClassName=\"w-full\"` expecting triggers to stretch → use `fullWidth` prop"
3042
3080
  }
3043
3081
  },
3044
3082
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -12,6 +12,8 @@ export declare const imageUploadPropsSchema: z.ZodObject<{
12
12
  description: z.ZodOptional<z.ZodAny>;
13
13
  disabled: z.ZodDefault<z.ZodBoolean>;
14
14
  size: z.ZodDefault<z.ZodEnum<["sm", "md", "lg"]>>;
15
+ previewMode: z.ZodDefault<z.ZodEnum<["card", "cover"]>>;
16
+ previewFit: z.ZodDefault<z.ZodEnum<["cover", "contain"]>>;
15
17
  className: z.ZodOptional<z.ZodString>;
16
18
  }, "strip", z.ZodTypeAny, {
17
19
  size: "lg" | "md" | "sm";
@@ -19,6 +21,8 @@ export declare const imageUploadPropsSchema: z.ZodObject<{
19
21
  placeholder: string;
20
22
  accept: string[];
21
23
  maxSize: number;
24
+ previewMode: "cover" | "card";
25
+ previewFit: "contain" | "cover";
22
26
  className?: string | undefined;
23
27
  label?: any;
24
28
  description?: any;
@@ -41,5 +45,7 @@ export declare const imageUploadPropsSchema: z.ZodObject<{
41
45
  accept?: string[] | undefined;
42
46
  maxSize?: number | undefined;
43
47
  formatDescription?: string | undefined;
48
+ previewMode?: "cover" | "card" | undefined;
49
+ previewFit?: "contain" | "cover" | undefined;
44
50
  }>;
45
51
  //# sourceMappingURL=image-upload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-upload.d.ts","sourceRoot":"","sources":["../../src/schemas/image-upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0ChC,CAAC"}
1
+ {"version":3,"file":"image-upload.d.ts","sourceRoot":"","sources":["../../src/schemas/image-upload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DhC,CAAC"}
@@ -70,13 +70,31 @@
70
70
  "default": "md",
71
71
  "description": "Upload area size"
72
72
  },
73
+ "previewMode": {
74
+ "type": "string",
75
+ "enum": [
76
+ "card",
77
+ "cover"
78
+ ],
79
+ "default": "card",
80
+ "description": "Preview layout after upload. \"card\" = small thumbnail + change button beside it (default). \"cover\" = image fills the entire box (banner / thumbnail slot UX). In cover mode, click the box to change, click the X in the top-right to remove. Box dimensions follow size or className (h-64, aspect-video, etc.)"
81
+ },
82
+ "previewFit": {
83
+ "type": "string",
84
+ "enum": [
85
+ "cover",
86
+ "contain"
87
+ ],
88
+ "default": "cover",
89
+ "description": "Object-fit for previewMode=\"cover\". \"cover\" fills the box (may crop), \"contain\" fits entirely inside (may letterbox)."
90
+ },
73
91
  "className": {
74
92
  "type": "string",
75
93
  "description": "Style override"
76
94
  }
77
95
  },
78
96
  "additionalProperties": false,
79
- "description": "ImageUpload — drag-and-drop image upload with preview, file-type/size validation, label/description.\n\nWHEN TO USE:\n • Single image upload: avatar, cover, KYC document, post thumbnail\n • Multiple files / non-image → not yet supported; build custom or use a file dropzone\n • Inline image picker without preview → custom <input type=\"file\">\n\naccept whitelist + maxSize together cover validation. onError fires with i18n-ready string.\n\nANTI-PATTERNS:\n ✗ <input type=\"file\"> + manual preview → ImageUpload (handles drag, validation, preview)\n ✗ ImageUpload without onError handler → silent failure on validation reject\n ✗ Storing image as data-URL value (use File via onChange and upload to server)"
97
+ "description": "ImageUpload — drag-and-drop image upload with preview, file-type/size validation, label/description.\n\nWHEN TO USE:\n • Single image upload: avatar, cover, KYC document, post thumbnail\n • Banner / hero / thumbnail slot where the picked image should fill the box → previewMode=\"cover\"\n • Multiple files / non-image → not yet supported; build custom or use a file dropzone\n • Inline image picker without preview → custom <input type=\"file\">\n\naccept whitelist + maxSize together cover validation. onError fires with i18n-ready string.\n\nPREVIEW MODES:\n • card (default) — 작은 썸네일 + 우측에 \"이미지 변경\" 버튼 + 포맷 텍스트. form 필드용.\n • cover — 빈 상태 박스를 그대로 유지하고 이미지가 전체를 가득 채움. 클릭 시 변경, 우측 상단 X로 삭제.\n 크기/비율은 className(h-64, aspect-video, w-full 등) 또는 size prop으로 조정.\n\nANTI-PATTERNS:\n ✗ <input type=\"file\"> + manual preview → ImageUpload (handles drag, validation, preview)\n ✗ ImageUpload without onError handler → silent failure on validation reject\n ✗ Storing image as data-URL value (use File via onChange and upload to server)\n ✗ card 모드에서 작은 썸네일이 어색한 배너/카드 슬롯 → previewMode=\"cover\""
80
98
  }
81
99
  },
82
100
  "$schema": "http://json-schema.org/draft-07/schema#"
@@ -2,8 +2,10 @@ import { z } from 'zod';
2
2
  export declare const numberInputPropsSchema: z.ZodObject<{
3
3
  variant: z.ZodDefault<z.ZodEnum<["basic", "bind"]>>;
4
4
  value: z.ZodOptional<z.ZodUnion<[z.ZodNumber, z.ZodString]>>;
5
- size: z.ZodDefault<z.ZodEnum<["lg", "xl"]>>;
5
+ size: z.ZodDefault<z.ZodEnum<["md", "lg", "xl"]>>;
6
6
  error: z.ZodOptional<z.ZodBoolean>;
7
+ prefixIcon: z.ZodOptional<z.ZodAny>;
8
+ suffixIcon: z.ZodOptional<z.ZodAny>;
7
9
  min: z.ZodOptional<z.ZodNumber>;
8
10
  max: z.ZodOptional<z.ZodNumber>;
9
11
  step: z.ZodDefault<z.ZodNumber>;
@@ -23,7 +25,7 @@ export declare const numberInputPropsSchema: z.ZodObject<{
23
25
  onFocus: z.ZodOptional<z.ZodAny>;
24
26
  className: z.ZodOptional<z.ZodString>;
25
27
  }, "strip", z.ZodTypeAny, {
26
- size: "xl" | "lg";
28
+ size: "xl" | "lg" | "md";
27
29
  variant: "basic" | "bind";
28
30
  step: number;
29
31
  digit: number;
@@ -44,6 +46,8 @@ export declare const numberInputPropsSchema: z.ZodObject<{
44
46
  onValueChange?: any;
45
47
  placeholder?: string | undefined;
46
48
  readOnly?: boolean | undefined;
49
+ prefixIcon?: any;
50
+ suffixIcon?: any;
47
51
  showMax?: boolean | undefined;
48
52
  }, {
49
53
  name?: string | undefined;
@@ -53,7 +57,7 @@ export declare const numberInputPropsSchema: z.ZodObject<{
53
57
  label?: string | undefined;
54
58
  description?: string | undefined;
55
59
  value?: string | number | undefined;
56
- size?: "xl" | "lg" | undefined;
60
+ size?: "xl" | "lg" | "md" | undefined;
57
61
  disabled?: boolean | undefined;
58
62
  variant?: "basic" | "bind" | undefined;
59
63
  autoFocus?: boolean | undefined;
@@ -65,6 +69,8 @@ export declare const numberInputPropsSchema: z.ZodObject<{
65
69
  placeholder?: string | undefined;
66
70
  step?: number | undefined;
67
71
  readOnly?: boolean | undefined;
72
+ prefixIcon?: any;
73
+ suffixIcon?: any;
68
74
  digit?: number | undefined;
69
75
  showMax?: boolean | undefined;
70
76
  hideButtons?: boolean | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"number-input.d.ts","sourceRoot":"","sources":["../../src/schemas/number-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+DhC,CAAC"}
1
+ {"version":3,"file":"number-input.d.ts","sourceRoot":"","sources":["../../src/schemas/number-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0EhC,CAAC"}
@@ -23,16 +23,23 @@
23
23
  "size": {
24
24
  "type": "string",
25
25
  "enum": [
26
+ "md",
26
27
  "lg",
27
28
  "xl"
28
29
  ],
29
- "default": "lg",
30
- "description": "Size"
30
+ "default": "md",
31
+ "description": "Size (matches TextInput scale)"
31
32
  },
32
33
  "error": {
33
34
  "type": "boolean",
34
35
  "description": "Error state"
35
36
  },
37
+ "prefixIcon": {
38
+ "description": "Prefix node — currency symbol, unit, or icon (ReactNode)"
39
+ },
40
+ "suffixIcon": {
41
+ "description": "Suffix node — unit (%, kg, 원...) or icon. Pair with hideButtons or variant=\"bind\" so it does not collide with arrow buttons"
42
+ },
36
43
  "min": {
37
44
  "type": "number",
38
45
  "description": "Minimum value"
@@ -107,7 +114,7 @@
107
114
  }
108
115
  },
109
116
  "additionalProperties": false,
110
- "description": "Number input with two variants: basic (chevron arrows) and bind (+/- buttons). Supports label, description, max display (click to fill), accelerated increment on long press. numberInputBind(ref, direction) binds acceleration to external buttons.\n\nWHEN TO USE:\n • Any numeric field — quantity, score, age, count\n • Currency with thousand separators → PriceInput instead\n • Date / time → DatePicker instead\n\nANTI-PATTERNS:\n ✗ <TextInput type=\"number\"> → <NumberInput> (loses keyboard ↑↓, step, accelerated long-press, max click)\n ✗ Custom +/- buttons + <input> → variant=\"bind\" (or numberInputBind for external)\n ✗ Manual thousand separators for currency → PriceInput"
117
+ "description": "Number input with two variants: basic (chevron arrows) and bind (+/- buttons). Supports label, description, max display (click to fill), accelerated increment on long press. numberInputBind(ref, direction) binds acceleration to external buttons.\n\nWHEN TO USE:\n • Any numeric field — quantity, score, age, count\n • Currency with thousand separators → PriceInput instead\n • Date / time → DatePicker instead\n\nANTI-PATTERNS:\n ✗ <TextInput type=\"number\"> → <NumberInput> (loses keyboard ↑↓, step, accelerated long-press, max click)\n ✗ Custom +/- buttons + <input> → variant=\"bind\" (or numberInputBind for external)\n ✗ Manual thousand separators for currency → PriceInput\n ✗ Inline unit text inside label/description → use prefixIcon/suffixIcon (e.g. suffixIcon=\"%\")"
111
118
  }
112
119
  },
113
120
  "$schema": "http://json-schema.org/draft-07/schema#"