sellmate-design-system-react 0.6.1 → 0.8.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 (92) hide show
  1. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +62 -48
  2. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  3. package/dist/components/SBarcodeInput/SBarcodeInput.js +62 -48
  4. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  5. package/dist/components/SChipInput/SChipInput.cjs +62 -48
  6. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  7. package/dist/components/SChipInput/SChipInput.js +62 -48
  8. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  9. package/dist/components/SDatePicker/SDatePicker.cjs +62 -48
  10. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  11. package/dist/components/SDatePicker/SDatePicker.js +62 -48
  12. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  13. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +62 -48
  14. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  15. package/dist/components/SDateRangePicker/SDateRangePicker.js +62 -48
  16. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  17. package/dist/components/SField/SField.cjs +62 -48
  18. package/dist/components/SField/SField.cjs.map +1 -1
  19. package/dist/components/SField/SField.d.ts +6 -1
  20. package/dist/components/SField/SField.js +62 -48
  21. package/dist/components/SField/SField.js.map +1 -1
  22. package/dist/components/SFilePicker/SFilePicker.cjs +62 -48
  23. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  24. package/dist/components/SFilePicker/SFilePicker.js +62 -48
  25. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  26. package/dist/components/SInput/SInput.cjs +62 -48
  27. package/dist/components/SInput/SInput.cjs.map +1 -1
  28. package/dist/components/SInput/SInput.js +62 -48
  29. package/dist/components/SInput/SInput.js.map +1 -1
  30. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +74 -49
  31. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  32. package/dist/components/SKeyValueTable/SKeyValueTable.js +74 -49
  33. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  34. package/dist/components/SNumberInput/SNumberInput.cjs +62 -48
  35. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  36. package/dist/components/SNumberInput/SNumberInput.js +62 -48
  37. package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
  38. package/dist/components/SPage/SPage.cjs +19 -2
  39. package/dist/components/SPage/SPage.cjs.map +1 -1
  40. package/dist/components/SPage/SPage.d.ts +7 -1
  41. package/dist/components/SPage/SPage.js +19 -2
  42. package/dist/components/SPage/SPage.js.map +1 -1
  43. package/dist/components/SPage/index.d.ts +1 -0
  44. package/dist/components/SPage/page.config.d.ts +8 -0
  45. package/dist/components/SPopup/SPopup.cjs +18 -1
  46. package/dist/components/SPopup/SPopup.cjs.map +1 -1
  47. package/dist/components/SPopup/SPopup.js +18 -1
  48. package/dist/components/SPopup/SPopup.js.map +1 -1
  49. package/dist/components/SScrollArea/SScrollArea.cjs +64 -0
  50. package/dist/components/SScrollArea/SScrollArea.cjs.map +1 -0
  51. package/dist/components/SScrollArea/SScrollArea.d.ts +21 -0
  52. package/dist/components/SScrollArea/SScrollArea.js +62 -0
  53. package/dist/components/SScrollArea/SScrollArea.js.map +1 -0
  54. package/dist/components/SScrollArea/index.d.ts +2 -0
  55. package/dist/components/SScrollArea/scrollArea.config.d.ts +2 -0
  56. package/dist/components/SSelect/SSelect.cjs +74 -49
  57. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  58. package/dist/components/SSelect/SSelect.js +74 -49
  59. package/dist/components/SSelect/SSelect.js.map +1 -1
  60. package/dist/components/SStepper/SStepper.cjs +7 -11
  61. package/dist/components/SStepper/SStepper.cjs.map +1 -1
  62. package/dist/components/SStepper/SStepper.js +7 -11
  63. package/dist/components/SStepper/SStepper.js.map +1 -1
  64. package/dist/components/STable/STable.cjs +83 -55
  65. package/dist/components/STable/STable.cjs.map +1 -1
  66. package/dist/components/STable/STable.d.ts +2 -0
  67. package/dist/components/STable/STable.js +83 -55
  68. package/dist/components/STable/STable.js.map +1 -1
  69. package/dist/components/STextarea/STextarea.cjs +62 -48
  70. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  71. package/dist/components/STextarea/STextarea.js +62 -48
  72. package/dist/components/STextarea/STextarea.js.map +1 -1
  73. package/dist/components/STimePicker/STimePicker.cjs +91 -54
  74. package/dist/components/STimePicker/STimePicker.cjs.map +1 -1
  75. package/dist/components/STimePicker/STimePicker.js +91 -54
  76. package/dist/components/STimePicker/STimePicker.js.map +1 -1
  77. package/dist/components/STimeRangePicker/STimeRangePicker.cjs +93 -54
  78. package/dist/components/STimeRangePicker/STimeRangePicker.cjs.map +1 -1
  79. package/dist/components/STimeRangePicker/STimeRangePicker.js +93 -54
  80. package/dist/components/STimeRangePicker/STimeRangePicker.js.map +1 -1
  81. package/dist/index.cjs +220 -81
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.d.ts +1 -0
  84. package/dist/index.js +218 -82
  85. package/dist/index.js.map +1 -1
  86. package/dist/lib/scrollbar.cjs +15 -0
  87. package/dist/lib/scrollbar.cjs.map +1 -0
  88. package/dist/lib/scrollbar.d.ts +32 -0
  89. package/dist/lib/scrollbar.js +10 -0
  90. package/dist/lib/scrollbar.js.map +1 -0
  91. package/dist/styles.css +168 -17
  92. 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;AAarB,IAAM,wBAAA,GACX,kNAAA;AAkBK,IAAM,4BAAA,GACX,2TAAA;ACxCF,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/**\n * background: 트랙 배경을 채운다. 콘텐츠 영역 배경은 바뀌지 않는다.\n * Stencil 의 scrollbar-track-bg($color) mixin 과 짝이며, 이쪽은 기본값 grey-10 에 해당한다.\n * Tailwind 는 소스에 문자열로 박힌 클래스만 수집하므로 색을 인자로 받는 함수로 만들 수 없다.\n * 색이 필요하면 아래 WHITE 처럼 리터럴 상수를 하나 더 만든다.\n *\n * SCROLLBAR_CLASS 뒤에 와야 Firefox 폴백(scrollbar-color)을 덮어쓸 수 있다.\n */\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 * background(white): 트랙을 흰색으로 채운다.\n * 페이지 표면이 grey-10(#F6F6F6)과 같은 색이라 기본 트랙 배경이 묻히는 자리에 쓴다 — SPage 의 neutral 이 그 경우다.\n */\nexport const SCROLLBAR_TRACK_BG_WHITE_CLASS =\n 'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_var(--color-white)] ' +\n '[&::-webkit-scrollbar]:bg-[var(--color-white)] [&::-webkit-scrollbar-track]:bg-[var(--color-white)]';\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;AAarB,IAAM,wBAAA,GACX,kNAAA;AAkBK,IAAM,4BAAA,GACX,2TAAA;ACxCF,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/**\n * background: 트랙 배경을 채운다. 콘텐츠 영역 배경은 바뀌지 않는다.\n * Stencil 의 scrollbar-track-bg($color) mixin 과 짝이며, 이쪽은 기본값 grey-10 에 해당한다.\n * Tailwind 는 소스에 문자열로 박힌 클래스만 수집하므로 색을 인자로 받는 함수로 만들 수 없다.\n * 색이 필요하면 아래 WHITE 처럼 리터럴 상수를 하나 더 만든다.\n *\n * SCROLLBAR_CLASS 뒤에 와야 Firefox 폴백(scrollbar-color)을 덮어쓸 수 있다.\n */\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 * background(white): 트랙을 흰색으로 채운다.\n * 페이지 표면이 grey-10(#F6F6F6)과 같은 색이라 기본 트랙 배경이 묻히는 자리에 쓴다 — SPage 의 neutral 이 그 경우다.\n */\nexport const SCROLLBAR_TRACK_BG_WHITE_CLASS =\n 'supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_var(--color-white)] ' +\n '[&::-webkit-scrollbar]:bg-[var(--color-white)] [&::-webkit-scrollbar-track]:bg-[var(--color-white)]';\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,
@@ -3387,6 +3394,7 @@ var SField = react.forwardRef(function SField2({
3387
3394
  const resolvedSuccess = status === "pass";
3388
3395
  const showError = resolvedError && errorMessage !== "";
3389
3396
  const interactive = !disabled && !readOnly;
3397
+ const hug = cssLen(width) !== void 0;
3390
3398
  const borderColor = borderless ? "transparent" : disabled ? "var(--color-grey-45)" : interactive && focused ? "var(--sys-color-field-border-focus)" : resolvedSuccess ? "var(--sys-color-field-border-success)" : resolvedError ? "var(--sys-color-field-border-danger)" : "var(--sys-color-field-border-default)";
3391
3399
  const bgColor = borderless ? "transparent" : disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
3392
3400
  const textColor = disabled ? "var(--color-grey-65)" : readOnly ? "var(--sys-color-field-text-readOnly)" : "var(--sys-color-field-text-default)";
@@ -3395,7 +3403,13 @@ var SField = react.forwardRef(function SField2({
3395
3403
  {
3396
3404
  ref: rootRef,
3397
3405
  "data-name": name || void 0,
3398
- className: cn("inline-flex h-fit w-full flex-col", className),
3406
+ className: cn(
3407
+ "h-fit flex-col",
3408
+ // hug 시 inline-flex 를 유지하면 기존에 세로로 쌓여 있던 필드들이 한 줄에 붙어버리므로
3409
+ // 블록 레벨(flex)로 두어 쌓임은 그대로 유지한다. 나란히 놓으려면 부모를 flex 로.
3410
+ hug ? "flex w-fit max-w-full" : "inline-flex w-full",
3411
+ className
3412
+ ),
3399
3413
  style,
3400
3414
  onMouseEnter,
3401
3415
  onMouseLeave,
@@ -3433,54 +3447,60 @@ var SField = react.forwardRef(function SField2({
3433
3447
  ]
3434
3448
  }
3435
3449
  ),
3436
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
3437
- /* @__PURE__ */ jsxRuntime.jsxs(
3438
- "div",
3439
- {
3440
- className: cn(
3441
- "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3442
- interactive && !borderless && "hover:border-(--sys-color-field-border-focus) hover:shadow-[0px_0px_4px_0px_#0071ff66] focus-within:border-(--sys-color-field-border-focus) focus-within:shadow-[0px_0px_4px_0px_#0071ff66]",
3443
- disabled && "cursor-not-allowed"
3450
+ /* @__PURE__ */ jsxRuntime.jsxs(
3451
+ "div",
3452
+ {
3453
+ className: cn("flex min-w-0 flex-col", !hug && "flex-1"),
3454
+ style: { width: cssLen(width), minWidth: cssLen(minWidth) },
3455
+ children: [
3456
+ /* @__PURE__ */ jsxRuntime.jsxs(
3457
+ "div",
3458
+ {
3459
+ className: cn(
3460
+ "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3461
+ interactive && !borderless && "hover:border-(--sys-color-field-border-focus) hover:shadow-[0px_0px_4px_0px_#0071ff66] focus-within:border-(--sys-color-field-border-focus) focus-within:shadow-[0px_0px_4px_0px_#0071ff66]",
3462
+ disabled && "cursor-not-allowed"
3463
+ ),
3464
+ style: {
3465
+ // @ts-expect-error CSS 변수
3466
+ "--field-bc": borderColor,
3467
+ // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3468
+ ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3469
+ ...multiline ? { minHeight: s.height } : { height: s.height },
3470
+ "borderRadius": s.radius,
3471
+ "background": bgColor,
3472
+ "color": textColor
3473
+ },
3474
+ "data-focused": focused || void 0,
3475
+ "data-hovered": hovered || void 0,
3476
+ children: [
3477
+ effectiveAddonLabel !== "" && /* @__PURE__ */ jsxRuntime.jsxs(
3478
+ "div",
3479
+ {
3480
+ className: "flex shrink-0 items-center gap-(--cmp-field-addonLabel-gap) whitespace-nowrap border-r border-solid px-(--cmp-field-addonLabel-paddingX) text-12 font-medium leading-20",
3481
+ style: {
3482
+ // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
3483
+ width: cssLen(labelWidth),
3484
+ justifyContent: ALIGN[addonAlign],
3485
+ background: "var(--cmp-field-addonLabel-bg)",
3486
+ borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
3487
+ borderTopLeftRadius: s.radius - 1,
3488
+ borderBottomLeftRadius: s.radius - 1
3489
+ },
3490
+ children: [
3491
+ icon && !label && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
3492
+ effectiveAddonLabel
3493
+ ]
3494
+ }
3495
+ ),
3496
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 flex-1", children })
3497
+ ]
3498
+ }
3444
3499
  ),
3445
- style: {
3446
- // @ts-expect-error CSS 변수
3447
- "--field-bc": borderColor,
3448
- // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3449
- ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3450
- ...multiline ? { minHeight: s.height } : { height: s.height },
3451
- "width": cssLen(width),
3452
- "borderRadius": s.radius,
3453
- "background": bgColor,
3454
- "color": textColor
3455
- },
3456
- "data-focused": focused || void 0,
3457
- "data-hovered": hovered || void 0,
3458
- children: [
3459
- effectiveAddonLabel !== "" && /* @__PURE__ */ jsxRuntime.jsxs(
3460
- "div",
3461
- {
3462
- className: "flex shrink-0 items-center gap-(--cmp-field-addonLabel-gap) whitespace-nowrap border-r border-solid px-(--cmp-field-addonLabel-paddingX) text-12 font-medium leading-20",
3463
- style: {
3464
- // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
3465
- width: cssLen(labelWidth),
3466
- justifyContent: ALIGN[addonAlign],
3467
- background: "var(--cmp-field-addonLabel-bg)",
3468
- borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
3469
- borderTopLeftRadius: s.radius - 1,
3470
- borderBottomLeftRadius: s.radius - 1
3471
- },
3472
- children: [
3473
- icon && !label && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
3474
- effectiveAddonLabel
3475
- ]
3476
- }
3477
- ),
3478
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-0 flex-1", children })
3479
- ]
3480
- }
3481
- ),
3482
- showError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-errorMessage-color)", children: errorMessage }) : hint !== "" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-hint-color)", children: hint }) : null
3483
- ] })
3500
+ showError ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-errorMessage-color)", children: errorMessage }) : hint !== "" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-hint-color)", children: hint }) : null
3501
+ ]
3502
+ }
3503
+ )
3484
3504
  ] })
3485
3505
  }
3486
3506
  );
@@ -3900,7 +3920,12 @@ var SSelect = react.forwardRef(function SSelect2({
3900
3920
  "div",
3901
3921
  {
3902
3922
  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)]",
3923
+ className: cn(
3924
+ "overflow-auto",
3925
+ SCROLLBAR_CLASS,
3926
+ SCROLLBAR_TRACK_BG_CLASS,
3927
+ SCROLLBAR_TRACK_BORDER_CLASS
3928
+ ),
3904
3929
  style: { maxHeight: dropdownHeight },
3905
3930
  onMouseLeave: () => setFocusedIndex(-1),
3906
3931
  children: [