sellmate-design-system-react 0.6.0 → 0.7.0

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 (91) hide show
  1. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +2 -0
  2. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  3. package/dist/components/SBarcodeInput/SBarcodeInput.js +2 -0
  4. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  5. package/dist/components/SChipInput/SChipInput.cjs +2 -0
  6. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  7. package/dist/components/SChipInput/SChipInput.js +2 -0
  8. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  9. package/dist/components/SDatePicker/SDatePicker.cjs +2 -0
  10. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  11. package/dist/components/SDatePicker/SDatePicker.js +2 -0
  12. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  13. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +2 -0
  14. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  15. package/dist/components/SDateRangePicker/SDateRangePicker.js +2 -0
  16. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  17. package/dist/components/SField/SField.cjs +2 -0
  18. package/dist/components/SField/SField.cjs.map +1 -1
  19. package/dist/components/SField/SField.d.ts +2 -0
  20. package/dist/components/SField/SField.js +2 -0
  21. package/dist/components/SField/SField.js.map +1 -1
  22. package/dist/components/SFilePicker/SFilePicker.cjs +2 -0
  23. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  24. package/dist/components/SFilePicker/SFilePicker.js +2 -0
  25. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  26. package/dist/components/SGnb/SGnb.cjs +21 -3
  27. package/dist/components/SGnb/SGnb.cjs.map +1 -1
  28. package/dist/components/SGnb/SGnb.js +21 -3
  29. package/dist/components/SGnb/SGnb.js.map +1 -1
  30. package/dist/components/SInput/SInput.cjs +2 -0
  31. package/dist/components/SInput/SInput.cjs.map +1 -1
  32. package/dist/components/SInput/SInput.js +2 -0
  33. package/dist/components/SInput/SInput.js.map +1 -1
  34. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +14 -1
  35. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  36. package/dist/components/SKeyValueTable/SKeyValueTable.js +14 -1
  37. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  38. package/dist/components/SNumberInput/SNumberInput.cjs +2 -0
  39. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  40. package/dist/components/SNumberInput/SNumberInput.js +2 -0
  41. package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
  42. package/dist/components/SPopup/SPopup.cjs +18 -1
  43. package/dist/components/SPopup/SPopup.cjs.map +1 -1
  44. package/dist/components/SPopup/SPopup.js +18 -1
  45. package/dist/components/SPopup/SPopup.js.map +1 -1
  46. package/dist/components/SScrollArea/SScrollArea.cjs +64 -0
  47. package/dist/components/SScrollArea/SScrollArea.cjs.map +1 -0
  48. package/dist/components/SScrollArea/SScrollArea.d.ts +21 -0
  49. package/dist/components/SScrollArea/SScrollArea.js +62 -0
  50. package/dist/components/SScrollArea/SScrollArea.js.map +1 -0
  51. package/dist/components/SScrollArea/index.d.ts +2 -0
  52. package/dist/components/SScrollArea/scrollArea.config.d.ts +2 -0
  53. package/dist/components/SSelect/SSelect.cjs +14 -1
  54. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  55. package/dist/components/SSelect/SSelect.js +14 -1
  56. package/dist/components/SSelect/SSelect.js.map +1 -1
  57. package/dist/components/SStepper/SStepper.cjs +3015 -0
  58. package/dist/components/SStepper/SStepper.cjs.map +1 -0
  59. package/dist/components/SStepper/SStepper.d.ts +16 -0
  60. package/dist/components/SStepper/SStepper.js +3013 -0
  61. package/dist/components/SStepper/SStepper.js.map +1 -0
  62. package/dist/components/SStepper/index.d.ts +2 -0
  63. package/dist/components/SStepper/stepper.config.d.ts +42 -0
  64. package/dist/components/STable/STable.cjs +17 -1
  65. package/dist/components/STable/STable.cjs.map +1 -1
  66. package/dist/components/STable/STable.js +17 -1
  67. package/dist/components/STable/STable.js.map +1 -1
  68. package/dist/components/STextarea/STextarea.cjs +2 -0
  69. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  70. package/dist/components/STextarea/STextarea.js +2 -0
  71. package/dist/components/STextarea/STextarea.js.map +1 -1
  72. package/dist/components/STimePicker/STimePicker.cjs +31 -6
  73. package/dist/components/STimePicker/STimePicker.cjs.map +1 -1
  74. package/dist/components/STimePicker/STimePicker.js +31 -6
  75. package/dist/components/STimePicker/STimePicker.js.map +1 -1
  76. package/dist/components/STimeRangePicker/STimeRangePicker.cjs +33 -6
  77. package/dist/components/STimeRangePicker/STimeRangePicker.cjs.map +1 -1
  78. package/dist/components/STimeRangePicker/STimeRangePicker.js +33 -6
  79. package/dist/components/STimeRangePicker/STimeRangePicker.js.map +1 -1
  80. package/dist/index.cjs +323 -28
  81. package/dist/index.cjs.map +1 -1
  82. package/dist/index.d.ts +2 -0
  83. package/dist/index.js +320 -29
  84. package/dist/index.js.map +1 -1
  85. package/dist/lib/scrollbar.cjs +13 -0
  86. package/dist/lib/scrollbar.cjs.map +1 -0
  87. package/dist/lib/scrollbar.d.ts +20 -0
  88. package/dist/lib/scrollbar.js +9 -0
  89. package/dist/lib/scrollbar.js.map +1 -0
  90. package/dist/styles.css +115 -14
  91. package/package.json +1 -1
@@ -0,0 +1,64 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+ var clsx = require('clsx');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ var twMerge = tailwindMerge.extendTailwindMerge({
10
+ extend: {
11
+ classGroups: {
12
+ "font-size": [{ text: ["10", "11", "12", "13", "14", "16", "18", "20", "24", "28", "32"] }]
13
+ }
14
+ }
15
+ });
16
+ function cn(...inputs) {
17
+ return twMerge(clsx.clsx(inputs));
18
+ }
19
+
20
+ // src/lib/scrollbar.ts
21
+ var FIREFOX_SCROLLBAR_CLASS = "supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_transparent]";
22
+ var SCROLLBAR_CLASS = `${FIREFOX_SCROLLBAR_CLASS} [&::-webkit-scrollbar]:h-[12px] [&::-webkit-scrollbar]:w-[12px] [&::-webkit-scrollbar]:bg-transparent [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:border-2 [&::-webkit-scrollbar-thumb]:border-solid [&::-webkit-scrollbar-thumb]:border-transparent [&::-webkit-scrollbar-thumb]:bg-[var(--color-grey-45)] [&::-webkit-scrollbar-thumb]:bg-clip-padding`;
23
+ var SCROLLBAR_TRACK_BG_CLASS = "supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_var(--color-grey-10)] [&::-webkit-scrollbar]:bg-[var(--color-grey-10)] [&::-webkit-scrollbar-track]:bg-[var(--color-grey-10)]";
24
+ var SCROLLBAR_TRACK_BORDER_CLASS = "[&::-webkit-scrollbar-track:vertical]:[border-left:1px_solid_var(--sys-color-border-default)] [&::-webkit-scrollbar-track:horizontal]:[border-top:1px_solid_var(--sys-color-border-default)] [&::-webkit-scrollbar-thumb:vertical]:[border-left-width:3px] [&::-webkit-scrollbar-thumb:horizontal]:[border-top-width:3px]";
25
+ var AXIS_CLASS = {
26
+ vertical: "overflow-x-hidden overflow-y-auto",
27
+ horizontal: "overflow-x-auto overflow-y-hidden",
28
+ both: "overflow-auto"
29
+ };
30
+ var SScrollArea = react.forwardRef(function SScrollArea2({
31
+ axis = "both",
32
+ background = false,
33
+ bordered = false,
34
+ maxHeight,
35
+ maxWidth,
36
+ className,
37
+ style,
38
+ children,
39
+ ...rest
40
+ }, ref) {
41
+ const mergedStyle = { ...style };
42
+ if (maxHeight) mergedStyle.maxHeight = maxHeight;
43
+ if (maxWidth) mergedStyle.maxWidth = maxWidth;
44
+ return /* @__PURE__ */ jsxRuntime.jsx(
45
+ "div",
46
+ {
47
+ ref,
48
+ className: cn(
49
+ AXIS_CLASS[axis],
50
+ SCROLLBAR_CLASS,
51
+ background && SCROLLBAR_TRACK_BG_CLASS,
52
+ bordered && SCROLLBAR_TRACK_BORDER_CLASS,
53
+ className
54
+ ),
55
+ style: mergedStyle,
56
+ ...rest,
57
+ children
58
+ }
59
+ );
60
+ });
61
+
62
+ exports.SScrollArea = SScrollArea;
63
+ //# sourceMappingURL=SScrollArea.cjs.map
64
+ //# sourceMappingURL=SScrollArea.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cn.ts","../../../src/lib/scrollbar.ts","../../../src/components/SScrollArea/SScrollArea.tsx"],"names":["extendTailwindMerge","clsx","forwardRef","SScrollArea","jsx"],"mappings":";;;;;;;AAQA,IAAM,UAAUA,iCAAA,CAAoB;AAAA,EAClC,MAAA,EAAQ;AAAA,IACN,WAAA,EAAa;AAAA,MACX,aAAa,CAAC,EAAE,IAAA,EAAM,CAAC,MAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAI,GAAG;AAAA;AAC5F;AAEJ,CAAC,CAAA;AAMM,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAO,OAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;;;ACVA,IAAM,uBAAA,GACJ,qKAAA;AAIK,IAAM,eAAA,GACX,GAAG,uBAAuB,CAAA,gaAAA,CAAA;AAMrB,IAAM,wBAAA,GACX,kNAAA;AAUK,IAAM,4BAAA,GACX,2TAAA;ACzBF,IAAM,UAAA,GAA8C;AAAA,EAClD,QAAA,EAAU,mCAAA;AAAA,EACV,UAAA,EAAY,mCAAA;AAAA,EACZ,IAAA,EAAM;AACR,CAAA;AAqBO,IAAM,WAAA,GAAcC,gBAAA,CAA6C,SAASC,YAAAA,CAC/E;AAAA,EACE,IAAA,GAAO,MAAA;AAAA,EACP,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,WAAA,GAA6B,EAAE,GAAG,KAAA,EAAM;AAC9C,EAAA,IAAI,SAAA,cAAuB,SAAA,GAAY,SAAA;AACvC,EAAA,IAAI,QAAA,cAAsB,QAAA,GAAW,QAAA;AAErC,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,WAAW,IAAI,CAAA;AAAA,QACf,eAAA;AAAA,QACA,UAAA,IAAc,wBAAA;AAAA,QACd,QAAA,IAAY,4BAAA;AAAA,QACZ;AAAA,OACF;AAAA,MACA,KAAA,EAAO,WAAA;AAAA,MACN,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC","file":"SScrollArea.cjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n/**\n * theme.css 의 --text-* 는 기본 Tailwind 폰트사이즈 스케일(xs/sm/base...)이 아닌\n * 숫자 스케일(10~32)이라, 확장 없이는 tailwind-merge 가 이를 텍스트 컬러 그룹으로\n * 오인해 text-12 같은 클래스를 text-(--color-var) 뒤에서 충돌 제거해버린다.\n */\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': [{ text: ['10', '11', '12', '13', '14', '16', '18', '20', '24', '28', '32'] }],\n },\n },\n});\n\n/**\n * className 병합 유틸.\n * clsx로 조건부 클래스를 합치고, tailwind-merge로 Tailwind 클래스 충돌을 해소한다.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * 공용 커스텀 스크롤바 클래스.\n * Stencil의 styles/scrollbar.scss mixin과 짝을 이루는 단일 기준이며,\n * 스크롤 영역을 가진 컴포넌트는 DOM을 감싸지 않고 이 클래스를 직접 붙여 쓴다.\n *\n * SVG 스펙: 트랙 12px / 썸 8px(grey-45, 2px 인셋, radius 4).\n * 인셋은 투명 테두리 + padding-box 클립으로 만들어, 트랙을 칠하든 안 칠하든 썸이 8px로 보인다.\n */\n\n// Chrome 121+/WebKit는 scrollbar-width·scrollbar-color의 계산값이 초기값(auto)이 아니면\n// ::-webkit-scrollbar-* 를 통째로 무시한다(CSSWG 결정). 표준 속성을 무조건 켜면 아래 트랙/썸이\n// 전부 죽으므로, webkit 유사요소가 없는 브라우저(Firefox)에서만 적용한다.\nconst FIREFOX_SCROLLBAR_CLASS =\n 'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] ' +\n 'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_transparent]';\n\n/** 스크롤 영역 기본 스크롤바. overflow 클래스는 각 컴포넌트가 따로 지정한다. */\nexport const SCROLLBAR_CLASS =\n `${FIREFOX_SCROLLBAR_CLASS} ` +\n '[&::-webkit-scrollbar]:h-[12px] [&::-webkit-scrollbar]:w-[12px] [&::-webkit-scrollbar]:bg-transparent ' +\n '[&::-webkit-scrollbar-track]:bg-transparent ' +\n '[&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:border-2 [&::-webkit-scrollbar-thumb]:border-solid [&::-webkit-scrollbar-thumb]:border-transparent [&::-webkit-scrollbar-thumb]:bg-[var(--color-grey-45)] [&::-webkit-scrollbar-thumb]:bg-clip-padding';\n\n/** background: 트랙 배경을 채운다. 콘텐츠 영역 배경은 바뀌지 않는다. */\nexport const SCROLLBAR_TRACK_BG_CLASS =\n 'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_var(--color-grey-10)] ' +\n '[&::-webkit-scrollbar]:bg-[var(--color-grey-10)] [&::-webkit-scrollbar-track]:bg-[var(--color-grey-10)]';\n\n/**\n * bordered: 스크롤바와 콘텐츠 사이 1px 구분선.\n * 단축 속성으로 한 변만 지정한다 — border-solid는 네 변에 걸려 트랙에 기본 3px 테두리를 만든다.\n * 썸과 트랙은 형제 박스라 트랙의 구분선이 썸을 밀어주지 않는다. 구분선이 인셋 2px 중 1px을\n * 차지해 좌우 여백이 1px/2px로 어긋나므로, 썸 인셋을 같은 만큼 키워 2px/2px로 되돌린다(썸 8px → 7px).\n * Firefox는 thin 스크롤바를 이 수준으로 커스터마이즈할 수 없어 적용되지 않는다.\n */\nexport const SCROLLBAR_TRACK_BORDER_CLASS =\n '[&::-webkit-scrollbar-track:vertical]:[border-left:1px_solid_var(--sys-color-border-default)] ' +\n '[&::-webkit-scrollbar-track:horizontal]:[border-top:1px_solid_var(--sys-color-border-default)] ' +\n '[&::-webkit-scrollbar-thumb:vertical]:[border-left-width:3px] ' +\n '[&::-webkit-scrollbar-thumb:horizontal]:[border-top-width:3px]';\n","'use client';\n\nimport { forwardRef, type CSSProperties, type HTMLAttributes } from 'react';\nimport { cn } from '../../lib/cn';\nimport {\n SCROLLBAR_CLASS,\n SCROLLBAR_TRACK_BG_CLASS,\n SCROLLBAR_TRACK_BORDER_CLASS,\n} from '../../lib/scrollbar';\nimport type { SScrollAreaAxis } from './scrollArea.config';\n\nconst AXIS_CLASS: Record<SScrollAreaAxis, string> = {\n vertical: 'overflow-x-hidden overflow-y-auto',\n horizontal: 'overflow-x-auto overflow-y-hidden',\n both: 'overflow-auto',\n};\n\nexport interface SScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n /** 스크롤 방향. vertical=세로만, horizontal=가로만, both=양방향 */\n axis?: SScrollAreaAxis;\n /** true면 스크롤바 트랙 배경을 채운다. 콘텐츠 영역 배경은 바뀌지 않는다. */\n background?: boolean;\n /** true면 스크롤바와 콘텐츠 사이에 1px 구분선을 그린다. 컨테이너 테두리가 아니다. */\n bordered?: boolean;\n /** viewport 최대 높이 (예: '400px'). 비우면 부모 크기를 따른다. */\n maxHeight?: string;\n /** viewport 최대 너비 (예: '480px'). 비우면 부모 크기를 따른다. */\n maxWidth?: string;\n}\n\n/**\n * SScrollArea — sd-scroll-area 포팅.\n * 오버플로우 콘텐츠를 커스텀 네이티브 스크롤바로 감싸는 영역.\n * background·bordered는 컨테이너가 아니라 스크롤바에만 적용된다.\n * 크기는 소비자가 className/style 로 지정한다(호스트 오버라이드 가능).\n */\nexport const SScrollArea = forwardRef<HTMLDivElement, SScrollAreaProps>(function SScrollArea(\n {\n axis = 'both',\n background = false,\n bordered = false,\n maxHeight,\n maxWidth,\n className,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const mergedStyle: CSSProperties = { ...style };\n if (maxHeight) mergedStyle.maxHeight = maxHeight;\n if (maxWidth) mergedStyle.maxWidth = maxWidth;\n\n return (\n <div\n ref={ref}\n className={cn(\n AXIS_CLASS[axis],\n SCROLLBAR_CLASS,\n background && SCROLLBAR_TRACK_BG_CLASS,\n bordered && SCROLLBAR_TRACK_BORDER_CLASS,\n className,\n )}\n style={mergedStyle}\n {...rest}\n >\n {children}\n </div>\n );\n});\n"]}
@@ -0,0 +1,21 @@
1
+ import { type HTMLAttributes } from 'react';
2
+ import type { SScrollAreaAxis } from './scrollArea.config';
3
+ export interface SScrollAreaProps extends HTMLAttributes<HTMLDivElement> {
4
+ /** 스크롤 방향. vertical=세로만, horizontal=가로만, both=양방향 */
5
+ axis?: SScrollAreaAxis;
6
+ /** true면 스크롤바 트랙 배경을 채운다. 콘텐츠 영역 배경은 바뀌지 않는다. */
7
+ background?: boolean;
8
+ /** true면 스크롤바와 콘텐츠 사이에 1px 구분선을 그린다. 컨테이너 테두리가 아니다. */
9
+ bordered?: boolean;
10
+ /** viewport 최대 높이 (예: '400px'). 비우면 부모 크기를 따른다. */
11
+ maxHeight?: string;
12
+ /** viewport 최대 너비 (예: '480px'). 비우면 부모 크기를 따른다. */
13
+ maxWidth?: string;
14
+ }
15
+ /**
16
+ * SScrollArea — sd-scroll-area 포팅.
17
+ * 오버플로우 콘텐츠를 커스텀 네이티브 스크롤바로 감싸는 영역.
18
+ * background·bordered는 컨테이너가 아니라 스크롤바에만 적용된다.
19
+ * 크기는 소비자가 className/style 로 지정한다(호스트 오버라이드 가능).
20
+ */
21
+ export declare const SScrollArea: import("react").ForwardRefExoticComponent<SScrollAreaProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,62 @@
1
+ "use client";
2
+ import { forwardRef } from 'react';
3
+ import { clsx } from 'clsx';
4
+ import { extendTailwindMerge } from 'tailwind-merge';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ var twMerge = extendTailwindMerge({
8
+ extend: {
9
+ classGroups: {
10
+ "font-size": [{ text: ["10", "11", "12", "13", "14", "16", "18", "20", "24", "28", "32"] }]
11
+ }
12
+ }
13
+ });
14
+ function cn(...inputs) {
15
+ return twMerge(clsx(inputs));
16
+ }
17
+
18
+ // src/lib/scrollbar.ts
19
+ var FIREFOX_SCROLLBAR_CLASS = "supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_transparent]";
20
+ var SCROLLBAR_CLASS = `${FIREFOX_SCROLLBAR_CLASS} [&::-webkit-scrollbar]:h-[12px] [&::-webkit-scrollbar]:w-[12px] [&::-webkit-scrollbar]:bg-transparent [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:border-2 [&::-webkit-scrollbar-thumb]:border-solid [&::-webkit-scrollbar-thumb]:border-transparent [&::-webkit-scrollbar-thumb]:bg-[var(--color-grey-45)] [&::-webkit-scrollbar-thumb]:bg-clip-padding`;
21
+ var SCROLLBAR_TRACK_BG_CLASS = "supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_var(--color-grey-10)] [&::-webkit-scrollbar]:bg-[var(--color-grey-10)] [&::-webkit-scrollbar-track]:bg-[var(--color-grey-10)]";
22
+ var SCROLLBAR_TRACK_BORDER_CLASS = "[&::-webkit-scrollbar-track:vertical]:[border-left:1px_solid_var(--sys-color-border-default)] [&::-webkit-scrollbar-track:horizontal]:[border-top:1px_solid_var(--sys-color-border-default)] [&::-webkit-scrollbar-thumb:vertical]:[border-left-width:3px] [&::-webkit-scrollbar-thumb:horizontal]:[border-top-width:3px]";
23
+ var AXIS_CLASS = {
24
+ vertical: "overflow-x-hidden overflow-y-auto",
25
+ horizontal: "overflow-x-auto overflow-y-hidden",
26
+ both: "overflow-auto"
27
+ };
28
+ var SScrollArea = forwardRef(function SScrollArea2({
29
+ axis = "both",
30
+ background = false,
31
+ bordered = false,
32
+ maxHeight,
33
+ maxWidth,
34
+ className,
35
+ style,
36
+ children,
37
+ ...rest
38
+ }, ref) {
39
+ const mergedStyle = { ...style };
40
+ if (maxHeight) mergedStyle.maxHeight = maxHeight;
41
+ if (maxWidth) mergedStyle.maxWidth = maxWidth;
42
+ return /* @__PURE__ */ jsx(
43
+ "div",
44
+ {
45
+ ref,
46
+ className: cn(
47
+ AXIS_CLASS[axis],
48
+ SCROLLBAR_CLASS,
49
+ background && SCROLLBAR_TRACK_BG_CLASS,
50
+ bordered && SCROLLBAR_TRACK_BORDER_CLASS,
51
+ className
52
+ ),
53
+ style: mergedStyle,
54
+ ...rest,
55
+ children
56
+ }
57
+ );
58
+ });
59
+
60
+ export { SScrollArea };
61
+ //# sourceMappingURL=SScrollArea.js.map
62
+ //# sourceMappingURL=SScrollArea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cn.ts","../../../src/lib/scrollbar.ts","../../../src/components/SScrollArea/SScrollArea.tsx"],"names":["SScrollArea"],"mappings":";;;;;AAQA,IAAM,UAAU,mBAAA,CAAoB;AAAA,EAClC,MAAA,EAAQ;AAAA,IACN,WAAA,EAAa;AAAA,MACX,aAAa,CAAC,EAAE,IAAA,EAAM,CAAC,MAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAA,EAAM,IAAI,GAAG;AAAA;AAC5F;AAEJ,CAAC,CAAA;AAMM,SAAS,MAAM,MAAA,EAA8B;AAClD,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;;;ACVA,IAAM,uBAAA,GACJ,qKAAA;AAIK,IAAM,eAAA,GACX,GAAG,uBAAuB,CAAA,gaAAA,CAAA;AAMrB,IAAM,wBAAA,GACX,kNAAA;AAUK,IAAM,4BAAA,GACX,2TAAA;ACzBF,IAAM,UAAA,GAA8C;AAAA,EAClD,QAAA,EAAU,mCAAA;AAAA,EACV,UAAA,EAAY,mCAAA;AAAA,EACZ,IAAA,EAAM;AACR,CAAA;AAqBO,IAAM,WAAA,GAAc,UAAA,CAA6C,SAASA,YAAAA,CAC/E;AAAA,EACE,IAAA,GAAO,MAAA;AAAA,EACP,UAAA,GAAa,KAAA;AAAA,EACb,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,WAAA,GAA6B,EAAE,GAAG,KAAA,EAAM;AAC9C,EAAA,IAAI,SAAA,cAAuB,SAAA,GAAY,SAAA;AACvC,EAAA,IAAI,QAAA,cAAsB,QAAA,GAAW,QAAA;AAErC,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,WAAW,IAAI,CAAA;AAAA,QACf,eAAA;AAAA,QACA,UAAA,IAAc,wBAAA;AAAA,QACd,QAAA,IAAY,4BAAA;AAAA,QACZ;AAAA,OACF;AAAA,MACA,KAAA,EAAO,WAAA;AAAA,MACN,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC","file":"SScrollArea.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { extendTailwindMerge } from 'tailwind-merge';\n\n/**\n * theme.css 의 --text-* 는 기본 Tailwind 폰트사이즈 스케일(xs/sm/base...)이 아닌\n * 숫자 스케일(10~32)이라, 확장 없이는 tailwind-merge 가 이를 텍스트 컬러 그룹으로\n * 오인해 text-12 같은 클래스를 text-(--color-var) 뒤에서 충돌 제거해버린다.\n */\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n 'font-size': [{ text: ['10', '11', '12', '13', '14', '16', '18', '20', '24', '28', '32'] }],\n },\n },\n});\n\n/**\n * className 병합 유틸.\n * clsx로 조건부 클래스를 합치고, tailwind-merge로 Tailwind 클래스 충돌을 해소한다.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * 공용 커스텀 스크롤바 클래스.\n * Stencil의 styles/scrollbar.scss mixin과 짝을 이루는 단일 기준이며,\n * 스크롤 영역을 가진 컴포넌트는 DOM을 감싸지 않고 이 클래스를 직접 붙여 쓴다.\n *\n * SVG 스펙: 트랙 12px / 썸 8px(grey-45, 2px 인셋, radius 4).\n * 인셋은 투명 테두리 + padding-box 클립으로 만들어, 트랙을 칠하든 안 칠하든 썸이 8px로 보인다.\n */\n\n// Chrome 121+/WebKit는 scrollbar-width·scrollbar-color의 계산값이 초기값(auto)이 아니면\n// ::-webkit-scrollbar-* 를 통째로 무시한다(CSSWG 결정). 표준 속성을 무조건 켜면 아래 트랙/썸이\n// 전부 죽으므로, webkit 유사요소가 없는 브라우저(Firefox)에서만 적용한다.\nconst FIREFOX_SCROLLBAR_CLASS =\n 'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] ' +\n 'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_transparent]';\n\n/** 스크롤 영역 기본 스크롤바. overflow 클래스는 각 컴포넌트가 따로 지정한다. */\nexport const SCROLLBAR_CLASS =\n `${FIREFOX_SCROLLBAR_CLASS} ` +\n '[&::-webkit-scrollbar]:h-[12px] [&::-webkit-scrollbar]:w-[12px] [&::-webkit-scrollbar]:bg-transparent ' +\n '[&::-webkit-scrollbar-track]:bg-transparent ' +\n '[&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:border-2 [&::-webkit-scrollbar-thumb]:border-solid [&::-webkit-scrollbar-thumb]:border-transparent [&::-webkit-scrollbar-thumb]:bg-[var(--color-grey-45)] [&::-webkit-scrollbar-thumb]:bg-clip-padding';\n\n/** background: 트랙 배경을 채운다. 콘텐츠 영역 배경은 바뀌지 않는다. */\nexport const SCROLLBAR_TRACK_BG_CLASS =\n 'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_var(--color-grey-10)] ' +\n '[&::-webkit-scrollbar]:bg-[var(--color-grey-10)] [&::-webkit-scrollbar-track]:bg-[var(--color-grey-10)]';\n\n/**\n * bordered: 스크롤바와 콘텐츠 사이 1px 구분선.\n * 단축 속성으로 한 변만 지정한다 — border-solid는 네 변에 걸려 트랙에 기본 3px 테두리를 만든다.\n * 썸과 트랙은 형제 박스라 트랙의 구분선이 썸을 밀어주지 않는다. 구분선이 인셋 2px 중 1px을\n * 차지해 좌우 여백이 1px/2px로 어긋나므로, 썸 인셋을 같은 만큼 키워 2px/2px로 되돌린다(썸 8px → 7px).\n * Firefox는 thin 스크롤바를 이 수준으로 커스터마이즈할 수 없어 적용되지 않는다.\n */\nexport const SCROLLBAR_TRACK_BORDER_CLASS =\n '[&::-webkit-scrollbar-track:vertical]:[border-left:1px_solid_var(--sys-color-border-default)] ' +\n '[&::-webkit-scrollbar-track:horizontal]:[border-top:1px_solid_var(--sys-color-border-default)] ' +\n '[&::-webkit-scrollbar-thumb:vertical]:[border-left-width:3px] ' +\n '[&::-webkit-scrollbar-thumb:horizontal]:[border-top-width:3px]';\n","'use client';\n\nimport { forwardRef, type CSSProperties, type HTMLAttributes } from 'react';\nimport { cn } from '../../lib/cn';\nimport {\n SCROLLBAR_CLASS,\n SCROLLBAR_TRACK_BG_CLASS,\n SCROLLBAR_TRACK_BORDER_CLASS,\n} from '../../lib/scrollbar';\nimport type { SScrollAreaAxis } from './scrollArea.config';\n\nconst AXIS_CLASS: Record<SScrollAreaAxis, string> = {\n vertical: 'overflow-x-hidden overflow-y-auto',\n horizontal: 'overflow-x-auto overflow-y-hidden',\n both: 'overflow-auto',\n};\n\nexport interface SScrollAreaProps extends HTMLAttributes<HTMLDivElement> {\n /** 스크롤 방향. vertical=세로만, horizontal=가로만, both=양방향 */\n axis?: SScrollAreaAxis;\n /** true면 스크롤바 트랙 배경을 채운다. 콘텐츠 영역 배경은 바뀌지 않는다. */\n background?: boolean;\n /** true면 스크롤바와 콘텐츠 사이에 1px 구분선을 그린다. 컨테이너 테두리가 아니다. */\n bordered?: boolean;\n /** viewport 최대 높이 (예: '400px'). 비우면 부모 크기를 따른다. */\n maxHeight?: string;\n /** viewport 최대 너비 (예: '480px'). 비우면 부모 크기를 따른다. */\n maxWidth?: string;\n}\n\n/**\n * SScrollArea — sd-scroll-area 포팅.\n * 오버플로우 콘텐츠를 커스텀 네이티브 스크롤바로 감싸는 영역.\n * background·bordered는 컨테이너가 아니라 스크롤바에만 적용된다.\n * 크기는 소비자가 className/style 로 지정한다(호스트 오버라이드 가능).\n */\nexport const SScrollArea = forwardRef<HTMLDivElement, SScrollAreaProps>(function SScrollArea(\n {\n axis = 'both',\n background = false,\n bordered = false,\n maxHeight,\n maxWidth,\n className,\n style,\n children,\n ...rest\n },\n ref,\n) {\n const mergedStyle: CSSProperties = { ...style };\n if (maxHeight) mergedStyle.maxHeight = maxHeight;\n if (maxWidth) mergedStyle.maxWidth = maxWidth;\n\n return (\n <div\n ref={ref}\n className={cn(\n AXIS_CLASS[axis],\n SCROLLBAR_CLASS,\n background && SCROLLBAR_TRACK_BG_CLASS,\n bordered && SCROLLBAR_TRACK_BORDER_CLASS,\n className,\n )}\n style={mergedStyle}\n {...rest}\n >\n {children}\n </div>\n );\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export { SScrollArea, type SScrollAreaProps } from './SScrollArea';
2
+ export { SCROLL_AREA_AXES, type SScrollAreaAxis } from './scrollArea.config';
@@ -0,0 +1,2 @@
1
+ export declare const SCROLL_AREA_AXES: readonly ["vertical", "horizontal", "both"];
2
+ export type SScrollAreaAxis = (typeof SCROLL_AREA_AXES)[number];
@@ -37,6 +37,12 @@ var twMerge = tailwindMerge.extendTailwindMerge({
37
37
  function cn(...inputs) {
38
38
  return twMerge(clsx.clsx(inputs));
39
39
  }
40
+
41
+ // src/lib/scrollbar.ts
42
+ var FIREFOX_SCROLLBAR_CLASS = "supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_transparent]";
43
+ var SCROLLBAR_CLASS = `${FIREFOX_SCROLLBAR_CLASS} [&::-webkit-scrollbar]:h-[12px] [&::-webkit-scrollbar]:w-[12px] [&::-webkit-scrollbar]:bg-transparent [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:border-2 [&::-webkit-scrollbar-thumb]:border-solid [&::-webkit-scrollbar-thumb]:border-transparent [&::-webkit-scrollbar-thumb]:bg-[var(--color-grey-45)] [&::-webkit-scrollbar-thumb]:bg-clip-padding`;
44
+ var SCROLLBAR_TRACK_BG_CLASS = "supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_var(--color-grey-10)] [&::-webkit-scrollbar]:bg-[var(--color-grey-10)] [&::-webkit-scrollbar-track]:bg-[var(--color-grey-10)]";
45
+ var SCROLLBAR_TRACK_BORDER_CLASS = "[&::-webkit-scrollbar-track:vertical]:[border-left:1px_solid_var(--sys-color-border-default)] [&::-webkit-scrollbar-track:horizontal]:[border-top:1px_solid_var(--sys-color-border-default)] [&::-webkit-scrollbar-thumb:vertical]:[border-left-width:3px] [&::-webkit-scrollbar-thumb:horizontal]:[border-top-width:3px]";
40
46
  var PortalContainerContext = react.createContext(null);
41
47
  var InsideModalContext = react.createContext(false);
42
48
  PortalContainerContext.Provider;
@@ -3352,6 +3358,7 @@ var SField = react.forwardRef(function SField2({
3352
3358
  disabled = false,
3353
3359
  readOnly = false,
3354
3360
  width,
3361
+ minWidth,
3355
3362
  multiline = false,
3356
3363
  borderless = false,
3357
3364
  children,
@@ -3448,6 +3455,7 @@ var SField = react.forwardRef(function SField2({
3448
3455
  // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3449
3456
  ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3450
3457
  ...multiline ? { minHeight: s.height } : { height: s.height },
3458
+ "minWidth": cssLen(minWidth),
3451
3459
  "width": cssLen(width),
3452
3460
  "borderRadius": s.radius,
3453
3461
  "background": bgColor,
@@ -3900,7 +3908,12 @@ var SSelect = react.forwardRef(function SSelect2({
3900
3908
  "div",
3901
3909
  {
3902
3910
  ref: listRef,
3903
- className: "overflow-auto [scrollbar-width:auto] [&::-webkit-scrollbar]:w-[8px] [&::-webkit-scrollbar]:bg-[var(--color-grey-25)] [&::-webkit-scrollbar:horizontal]:h-[8px] [&::-webkit-scrollbar-thumb]:rounded-[4px] [&::-webkit-scrollbar-thumb]:bg-[var(--color-grey-45)] [&::-webkit-scrollbar-track]:bg-[var(--color-grey-25)]",
3911
+ className: cn(
3912
+ "overflow-auto",
3913
+ SCROLLBAR_CLASS,
3914
+ SCROLLBAR_TRACK_BG_CLASS,
3915
+ SCROLLBAR_TRACK_BORDER_CLASS
3916
+ ),
3904
3917
  style: { maxHeight: dropdownHeight },
3905
3918
  onMouseLeave: () => setFocusedIndex(-1),
3906
3919
  children: [