sellmate-design-system-react 2.1.2 → 3.0.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 (47) hide show
  1. package/dist/components/SCallout/SCallout.cjs +76 -1
  2. package/dist/components/SCallout/SCallout.cjs.map +1 -1
  3. package/dist/components/SCallout/SCallout.d.ts +6 -2
  4. package/dist/components/SCallout/SCallout.js +76 -1
  5. package/dist/components/SCallout/SCallout.js.map +1 -1
  6. package/dist/components/SDraggableItem/SDraggableItem.cjs +3079 -0
  7. package/dist/components/SDraggableItem/SDraggableItem.cjs.map +1 -0
  8. package/dist/components/SDraggableItem/SDraggableItem.d.ts +33 -0
  9. package/dist/components/SDraggableItem/SDraggableItem.js +3077 -0
  10. package/dist/components/SDraggableItem/SDraggableItem.js.map +1 -0
  11. package/dist/components/SDraggableItem/index.d.ts +1 -0
  12. package/dist/components/SExpansionItem/SExpansionItem.cjs +6 -15
  13. package/dist/components/SExpansionItem/SExpansionItem.cjs.map +1 -1
  14. package/dist/components/SExpansionItem/SExpansionItem.js +6 -15
  15. package/dist/components/SExpansionItem/SExpansionItem.js.map +1 -1
  16. package/dist/components/SList/SList.cjs +38 -0
  17. package/dist/components/SList/SList.cjs.map +1 -0
  18. package/dist/components/SList/SList.d.ts +10 -0
  19. package/dist/components/SList/SList.js +36 -0
  20. package/dist/components/SList/SList.js.map +1 -0
  21. package/dist/components/SList/index.d.ts +1 -0
  22. package/dist/components/SListItem/SListItem.cjs +83 -0
  23. package/dist/components/SListItem/SListItem.cjs.map +1 -0
  24. package/dist/components/SListItem/SListItem.d.ts +26 -0
  25. package/dist/components/SListItem/SListItem.js +81 -0
  26. package/dist/components/SListItem/SListItem.js.map +1 -0
  27. package/dist/components/SListItem/index.d.ts +1 -0
  28. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.cjs +3414 -0
  29. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.cjs.map +1 -0
  30. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +32 -0
  31. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.js +3392 -0
  32. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.js.map +1 -0
  33. package/dist/components/SSectionHeaderCard/index.d.ts +1 -0
  34. package/dist/components/STable/STable.cjs +101 -80
  35. package/dist/components/STable/STable.cjs.map +1 -1
  36. package/dist/components/STable/STable.d.ts +36 -1
  37. package/dist/components/STable/STable.js +102 -81
  38. package/dist/components/STable/STable.js.map +1 -1
  39. package/dist/components/STable/index.d.ts +1 -1
  40. package/dist/index.cjs +1040 -623
  41. package/dist/index.cjs.map +1 -1
  42. package/dist/index.d.ts +4 -0
  43. package/dist/index.js +1040 -627
  44. package/dist/index.js.map +1 -1
  45. package/dist/styles.css +339 -19
  46. package/dist/theme.css +14 -0
  47. package/package.json +1 -1
@@ -0,0 +1,38 @@
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
+ var SList = react.forwardRef(function SList2({ className, children, useGap = false, usePadding = false, ...rest }, ref) {
20
+ return /* @__PURE__ */ jsxRuntime.jsx(
21
+ "div",
22
+ {
23
+ ref,
24
+ className: cn(
25
+ useGap && "flex flex-col gap-(--cmp-list-group-gap)",
26
+ usePadding && "p-(--cmp-list-group-padding)",
27
+ className
28
+ ),
29
+ ...rest,
30
+ children
31
+ }
32
+ );
33
+ });
34
+ SList.displayName = "SList";
35
+
36
+ exports.SList = SList;
37
+ //# sourceMappingURL=SList.cjs.map
38
+ //# sourceMappingURL=SList.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cn.ts","../../../src/components/SList/SList.tsx"],"names":["extendTailwindMerge","clsx","forwardRef","SList","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;ACRO,IAAM,KAAA,GAAQC,gBAAA,CAAuC,SAASC,MAAAA,CACnE,EAAE,SAAA,EAAW,QAAA,EAAU,MAAA,GAAS,KAAA,EAAO,UAAA,GAAa,KAAA,EAAO,GAAG,IAAA,IAC9D,GAAA,EACA;AACA,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,MAAA,IAAU,0CAAA;AAAA,QACV,UAAA,IAAc,8BAAA;AAAA,QACd;AAAA,OACF;AAAA,MACC,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC;AAED,KAAA,CAAM,WAAA,GAAc,OAAA","file":"SList.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","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport interface SListProps extends HTMLAttributes<HTMLDivElement> {\n /** 리스트 컨테이너 내부에 렌더링할 내용 */\n children?: ReactNode;\n /** 리스트 아이템 사이 gap 토큰 적용 여부 */\n useGap?: boolean;\n /** 리스트 컨테이너 padding 토큰 적용 여부 */\n usePadding?: boolean;\n}\n\nexport const SList = forwardRef<HTMLDivElement, SListProps>(function SList(\n { className, children, useGap = false, usePadding = false, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n useGap && 'flex flex-col gap-(--cmp-list-group-gap)',\n usePadding && 'p-(--cmp-list-group-padding)',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n});\n\nSList.displayName = 'SList';\n"]}
@@ -0,0 +1,10 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ export interface SListProps extends HTMLAttributes<HTMLDivElement> {
3
+ /** 리스트 컨테이너 내부에 렌더링할 내용 */
4
+ children?: ReactNode;
5
+ /** 리스트 아이템 사이 gap 토큰 적용 여부 */
6
+ useGap?: boolean;
7
+ /** 리스트 컨테이너 padding 토큰 적용 여부 */
8
+ usePadding?: boolean;
9
+ }
10
+ export declare const SList: import("react").ForwardRefExoticComponent<SListProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,36 @@
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
+ var SList = forwardRef(function SList2({ className, children, useGap = false, usePadding = false, ...rest }, ref) {
18
+ return /* @__PURE__ */ jsx(
19
+ "div",
20
+ {
21
+ ref,
22
+ className: cn(
23
+ useGap && "flex flex-col gap-(--cmp-list-group-gap)",
24
+ usePadding && "p-(--cmp-list-group-padding)",
25
+ className
26
+ ),
27
+ ...rest,
28
+ children
29
+ }
30
+ );
31
+ });
32
+ SList.displayName = "SList";
33
+
34
+ export { SList };
35
+ //# sourceMappingURL=SList.js.map
36
+ //# sourceMappingURL=SList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cn.ts","../../../src/components/SList/SList.tsx"],"names":["SList"],"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;ACRO,IAAM,KAAA,GAAQ,UAAA,CAAuC,SAASA,MAAAA,CACnE,EAAE,SAAA,EAAW,QAAA,EAAU,MAAA,GAAS,KAAA,EAAO,UAAA,GAAa,KAAA,EAAO,GAAG,IAAA,IAC9D,GAAA,EACA;AACA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,MAAA,IAAU,0CAAA;AAAA,QACV,UAAA,IAAc,8BAAA;AAAA,QACd;AAAA,OACF;AAAA,MACC,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ,CAAC;AAED,KAAA,CAAM,WAAA,GAAc,OAAA","file":"SList.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","'use client';\n\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport interface SListProps extends HTMLAttributes<HTMLDivElement> {\n /** 리스트 컨테이너 내부에 렌더링할 내용 */\n children?: ReactNode;\n /** 리스트 아이템 사이 gap 토큰 적용 여부 */\n useGap?: boolean;\n /** 리스트 컨테이너 padding 토큰 적용 여부 */\n usePadding?: boolean;\n}\n\nexport const SList = forwardRef<HTMLDivElement, SListProps>(function SList(\n { className, children, useGap = false, usePadding = false, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn(\n useGap && 'flex flex-col gap-(--cmp-list-group-gap)',\n usePadding && 'p-(--cmp-list-group-padding)',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n );\n});\n\nSList.displayName = 'SList';\n"]}
@@ -0,0 +1 @@
1
+ export { SList, type SListProps } from './SList';
@@ -0,0 +1,83 @@
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
+ var SListItem = react.forwardRef(function SListItem2({
20
+ title,
21
+ depth = 1,
22
+ leading,
23
+ trailing,
24
+ bordered = false,
25
+ accentStripe = false,
26
+ dense = false,
27
+ disabled = false,
28
+ className,
29
+ onMouseEnter,
30
+ onMouseLeave,
31
+ ...rest
32
+ }, ref) {
33
+ const [hovered, setHovered] = react.useState(false);
34
+ const renderState = { hovered, disabled };
35
+ const titleNode = typeof title === "function" ? title(renderState) : title;
36
+ const leadingNode = typeof leading === "function" ? leading(renderState) : leading;
37
+ const trailingNode = typeof trailing === "function" ? trailing(renderState) : trailing;
38
+ const handleMouseEnter = (event) => {
39
+ if (!disabled) setHovered(true);
40
+ onMouseEnter?.(event);
41
+ };
42
+ const handleMouseLeave = (event) => {
43
+ setHovered(false);
44
+ onMouseLeave?.(event);
45
+ };
46
+ return /* @__PURE__ */ jsxRuntime.jsxs(
47
+ "div",
48
+ {
49
+ ref,
50
+ "aria-disabled": disabled || void 0,
51
+ onMouseEnter: handleMouseEnter,
52
+ onMouseLeave: handleMouseLeave,
53
+ className: cn(
54
+ "group/list-item relative flex w-full items-center justify-between bg-(--cmp-listItem-bg-default) text-left text-[14px] font-bold leading-[24px] text-(--cmp-listItem-text-default)",
55
+ disabled ? "pointer-events-none cursor-not-allowed text-(--sys-color-disabled-text)" : "hover:bg-(--cmp-listItem-bg-hover)",
56
+ dense ? "h-[32px] py-(--cmp-listItem-paddingY-dense)" : "h-[40px] py-(--cmp-listItem-paddingY-normal)",
57
+ "gap-(--cmp-listItem-gap)",
58
+ "pr-(--cmp-listItem-paddingX)",
59
+ depth === 2 ? "pl-[calc(var(--cmp-listItem-paddingX)+32px)]" : depth === 3 ? "pl-[calc(var(--cmp-listItem-paddingX)+64px)]" : "pl-(--cmp-listItem-paddingX)",
60
+ bordered ? "overflow-hidden rounded-(--cmp-listItem-radius-bordered) border border-(--cmp-listItem-border-default) hover:border-(--cmp-listItem-bordered-border-hover)" : "border-b border-(--cmp-listItem-border-default)",
61
+ className
62
+ ),
63
+ ...rest,
64
+ children: [
65
+ accentStripe && !bordered && /* @__PURE__ */ jsxRuntime.jsx(
66
+ "span",
67
+ {
68
+ "aria-hidden": "true",
69
+ className: "pointer-events-none absolute bottom-[-1px] left-0 top-0 w-(--cmp-listItem-accentStripe-width) bg-(--cmp-listItem-accentStripe-color)"
70
+ }
71
+ ),
72
+ leadingNode,
73
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex min-w-0 flex-1 flex-col", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: titleNode }) }),
74
+ trailingNode
75
+ ]
76
+ }
77
+ );
78
+ });
79
+ SListItem.displayName = "SListItem";
80
+
81
+ exports.SListItem = SListItem;
82
+ //# sourceMappingURL=SListItem.cjs.map
83
+ //# sourceMappingURL=SListItem.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cn.ts","../../../src/components/SListItem/SListItem.tsx"],"names":["extendTailwindMerge","clsx","forwardRef","SListItem","useState","jsxs","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;ACUO,IAAM,SAAA,GAAYC,gBAAA,CAA2C,SAASC,UAAAA,CAC3E;AAAA,EACE,KAAA;AAAA,EACA,KAAA,GAAQ,CAAA;AAAA,EACR,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,KAAA;AAAA,EACf,KAAA,GAAQ,KAAA;AAAA,EACR,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,EAAE,OAAA,EAAS,QAAA,EAAS;AACxC,EAAA,MAAM,YAAY,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,CAAM,WAAW,CAAA,GAAI,KAAA;AACrE,EAAA,MAAM,cAAc,OAAO,OAAA,KAAY,UAAA,GAAa,OAAA,CAAQ,WAAW,CAAA,GAAI,OAAA;AAC3E,EAAA,MAAM,eAAe,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,CAAS,WAAW,CAAA,GAAI,QAAA;AAE9E,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAsC;AAC9D,IAAA,IAAI,CAAC,QAAA,EAAU,UAAA,CAAW,IAAI,CAAA;AAC9B,IAAA,YAAA,GAAe,KAAK,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAsC;AAC9D,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,YAAA,GAAe,KAAK,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,YAAA,EAAc,gBAAA;AAAA,MACd,YAAA,EAAc,gBAAA;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,QACT,oLAAA;AAAA,QACA,WACI,yEAAA,GACA,oCAAA;AAAA,QACJ,QACI,6CAAA,GACA,8CAAA;AAAA,QACJ,0BAAA;AAAA,QACA,8BAAA;AAAA,QACA,KAAA,KAAU,CAAA,GACN,8CAAA,GACA,KAAA,KAAU,IACR,8CAAA,GACA,8BAAA;AAAA,QACN,WACI,4JAAA,GACA,iDAAA;AAAA,QACJ;AAAA,OACF;AAAA,MACC,GAAG,IAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,YAAA,IAAgB,CAAC,QAAA,oBAChBC,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QAED,WAAA;AAAA,uCACA,MAAA,EAAA,EAAK,SAAA,EAAU,gCACd,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAM,qBAAU,CAAA,EACnB,CAAA;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ,CAAC;AAED,SAAA,CAAU,WAAA,GAAc,WAAA","file":"SListItem.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","'use client';\n\nimport { forwardRef, useState, type HTMLAttributes, type MouseEvent, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport interface SListItemRenderState {\n hovered: boolean;\n disabled: boolean;\n}\n\nexport type SListItemRenderProp = (state: SListItemRenderState) => ReactNode;\nexport type SListItemSlot = ReactNode | SListItemRenderProp;\n\nexport interface SListItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {\n /** 리스트 아이템 제목 */\n title: SListItemSlot;\n /** 중첩 단계. Figma 기준 1~3단계 */\n depth?: 1 | 2 | 3;\n /** 타이틀 앞에 표시할 아이콘/콘텐츠 */\n leading?: SListItemSlot;\n /** 타이틀 뒤에 표시할 태그/콘텐츠 */\n trailing?: SListItemSlot;\n /** 외곽 테두리 사용 여부 */\n bordered?: boolean;\n /** 아이템 왼쪽 accent stripe 표시 여부 */\n accentStripe?: boolean;\n /** 조밀한 높이 사용 여부 */\n dense?: boolean;\n /** 비활성 상태 여부 */\n disabled?: boolean;\n}\n\nexport const SListItem = forwardRef<HTMLDivElement, SListItemProps>(function SListItem(\n {\n title,\n depth = 1,\n leading,\n trailing,\n bordered = false,\n accentStripe = false,\n dense = false,\n disabled = false,\n className,\n onMouseEnter,\n onMouseLeave,\n ...rest\n },\n ref,\n) {\n const [hovered, setHovered] = useState(false);\n const renderState = { hovered, disabled };\n const titleNode = typeof title === 'function' ? title(renderState) : title;\n const leadingNode = typeof leading === 'function' ? leading(renderState) : leading;\n const trailingNode = typeof trailing === 'function' ? trailing(renderState) : trailing;\n\n const handleMouseEnter = (event: MouseEvent<HTMLDivElement>) => {\n if (!disabled) setHovered(true);\n onMouseEnter?.(event);\n };\n\n const handleMouseLeave = (event: MouseEvent<HTMLDivElement>) => {\n setHovered(false);\n onMouseLeave?.(event);\n };\n\n return (\n <div\n ref={ref}\n aria-disabled={disabled || undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={cn(\n 'group/list-item relative flex w-full items-center justify-between bg-(--cmp-listItem-bg-default) text-left text-[14px] font-bold leading-[24px] text-(--cmp-listItem-text-default)',\n disabled\n ? 'pointer-events-none cursor-not-allowed text-(--sys-color-disabled-text)'\n : 'hover:bg-(--cmp-listItem-bg-hover)',\n dense\n ? 'h-[32px] py-(--cmp-listItem-paddingY-dense)'\n : 'h-[40px] py-(--cmp-listItem-paddingY-normal)',\n 'gap-(--cmp-listItem-gap)',\n 'pr-(--cmp-listItem-paddingX)',\n depth === 2\n ? 'pl-[calc(var(--cmp-listItem-paddingX)+32px)]'\n : depth === 3\n ? 'pl-[calc(var(--cmp-listItem-paddingX)+64px)]'\n : 'pl-(--cmp-listItem-paddingX)',\n bordered\n ? 'overflow-hidden rounded-(--cmp-listItem-radius-bordered) border border-(--cmp-listItem-border-default) hover:border-(--cmp-listItem-bordered-border-hover)'\n : 'border-b border-(--cmp-listItem-border-default)',\n className,\n )}\n {...rest}\n >\n {accentStripe && !bordered && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute bottom-[-1px] left-0 top-0 w-(--cmp-listItem-accentStripe-width) bg-(--cmp-listItem-accentStripe-color)\"\n />\n )}\n {leadingNode}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span>{titleNode}</span>\n </span>\n {trailingNode}\n </div>\n );\n});\n\nSListItem.displayName = 'SListItem';\n"]}
@@ -0,0 +1,26 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ export interface SListItemRenderState {
3
+ hovered: boolean;
4
+ disabled: boolean;
5
+ }
6
+ export type SListItemRenderProp = (state: SListItemRenderState) => ReactNode;
7
+ export type SListItemSlot = ReactNode | SListItemRenderProp;
8
+ export interface SListItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {
9
+ /** 리스트 아이템 제목 */
10
+ title: SListItemSlot;
11
+ /** 중첩 단계. Figma 기준 1~3단계 */
12
+ depth?: 1 | 2 | 3;
13
+ /** 타이틀 앞에 표시할 아이콘/콘텐츠 */
14
+ leading?: SListItemSlot;
15
+ /** 타이틀 뒤에 표시할 태그/콘텐츠 */
16
+ trailing?: SListItemSlot;
17
+ /** 외곽 테두리 사용 여부 */
18
+ bordered?: boolean;
19
+ /** 아이템 왼쪽 accent stripe 표시 여부 */
20
+ accentStripe?: boolean;
21
+ /** 조밀한 높이 사용 여부 */
22
+ dense?: boolean;
23
+ /** 비활성 상태 여부 */
24
+ disabled?: boolean;
25
+ }
26
+ export declare const SListItem: import("react").ForwardRefExoticComponent<SListItemProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,81 @@
1
+ "use client";
2
+ import { forwardRef, useState } from 'react';
3
+ import { clsx } from 'clsx';
4
+ import { extendTailwindMerge } from 'tailwind-merge';
5
+ import { jsxs, 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
+ var SListItem = forwardRef(function SListItem2({
18
+ title,
19
+ depth = 1,
20
+ leading,
21
+ trailing,
22
+ bordered = false,
23
+ accentStripe = false,
24
+ dense = false,
25
+ disabled = false,
26
+ className,
27
+ onMouseEnter,
28
+ onMouseLeave,
29
+ ...rest
30
+ }, ref) {
31
+ const [hovered, setHovered] = useState(false);
32
+ const renderState = { hovered, disabled };
33
+ const titleNode = typeof title === "function" ? title(renderState) : title;
34
+ const leadingNode = typeof leading === "function" ? leading(renderState) : leading;
35
+ const trailingNode = typeof trailing === "function" ? trailing(renderState) : trailing;
36
+ const handleMouseEnter = (event) => {
37
+ if (!disabled) setHovered(true);
38
+ onMouseEnter?.(event);
39
+ };
40
+ const handleMouseLeave = (event) => {
41
+ setHovered(false);
42
+ onMouseLeave?.(event);
43
+ };
44
+ return /* @__PURE__ */ jsxs(
45
+ "div",
46
+ {
47
+ ref,
48
+ "aria-disabled": disabled || void 0,
49
+ onMouseEnter: handleMouseEnter,
50
+ onMouseLeave: handleMouseLeave,
51
+ className: cn(
52
+ "group/list-item relative flex w-full items-center justify-between bg-(--cmp-listItem-bg-default) text-left text-[14px] font-bold leading-[24px] text-(--cmp-listItem-text-default)",
53
+ disabled ? "pointer-events-none cursor-not-allowed text-(--sys-color-disabled-text)" : "hover:bg-(--cmp-listItem-bg-hover)",
54
+ dense ? "h-[32px] py-(--cmp-listItem-paddingY-dense)" : "h-[40px] py-(--cmp-listItem-paddingY-normal)",
55
+ "gap-(--cmp-listItem-gap)",
56
+ "pr-(--cmp-listItem-paddingX)",
57
+ depth === 2 ? "pl-[calc(var(--cmp-listItem-paddingX)+32px)]" : depth === 3 ? "pl-[calc(var(--cmp-listItem-paddingX)+64px)]" : "pl-(--cmp-listItem-paddingX)",
58
+ bordered ? "overflow-hidden rounded-(--cmp-listItem-radius-bordered) border border-(--cmp-listItem-border-default) hover:border-(--cmp-listItem-bordered-border-hover)" : "border-b border-(--cmp-listItem-border-default)",
59
+ className
60
+ ),
61
+ ...rest,
62
+ children: [
63
+ accentStripe && !bordered && /* @__PURE__ */ jsx(
64
+ "span",
65
+ {
66
+ "aria-hidden": "true",
67
+ className: "pointer-events-none absolute bottom-[-1px] left-0 top-0 w-(--cmp-listItem-accentStripe-width) bg-(--cmp-listItem-accentStripe-color)"
68
+ }
69
+ ),
70
+ leadingNode,
71
+ /* @__PURE__ */ jsx("span", { className: "flex min-w-0 flex-1 flex-col", children: /* @__PURE__ */ jsx("span", { children: titleNode }) }),
72
+ trailingNode
73
+ ]
74
+ }
75
+ );
76
+ });
77
+ SListItem.displayName = "SListItem";
78
+
79
+ export { SListItem };
80
+ //# sourceMappingURL=SListItem.js.map
81
+ //# sourceMappingURL=SListItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/cn.ts","../../../src/components/SListItem/SListItem.tsx"],"names":["SListItem"],"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;ACUO,IAAM,SAAA,GAAY,UAAA,CAA2C,SAASA,UAAAA,CAC3E;AAAA,EACE,KAAA;AAAA,EACA,KAAA,GAAQ,CAAA;AAAA,EACR,OAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,YAAA,GAAe,KAAA;AAAA,EACf,KAAA,GAAQ,KAAA;AAAA,EACR,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAG;AACL,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,EAAE,OAAA,EAAS,QAAA,EAAS;AACxC,EAAA,MAAM,YAAY,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,CAAM,WAAW,CAAA,GAAI,KAAA;AACrE,EAAA,MAAM,cAAc,OAAO,OAAA,KAAY,UAAA,GAAa,OAAA,CAAQ,WAAW,CAAA,GAAI,OAAA;AAC3E,EAAA,MAAM,eAAe,OAAO,QAAA,KAAa,UAAA,GAAa,QAAA,CAAS,WAAW,CAAA,GAAI,QAAA;AAE9E,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAsC;AAC9D,IAAA,IAAI,CAAC,QAAA,EAAU,UAAA,CAAW,IAAI,CAAA;AAC9B,IAAA,YAAA,GAAe,KAAK,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAAsC;AAC9D,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,YAAA,GAAe,KAAK,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,iBAAe,QAAA,IAAY,MAAA;AAAA,MAC3B,YAAA,EAAc,gBAAA;AAAA,MACd,YAAA,EAAc,gBAAA;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,QACT,oLAAA;AAAA,QACA,WACI,yEAAA,GACA,oCAAA;AAAA,QACJ,QACI,6CAAA,GACA,8CAAA;AAAA,QACJ,0BAAA;AAAA,QACA,8BAAA;AAAA,QACA,KAAA,KAAU,CAAA,GACN,8CAAA,GACA,KAAA,KAAU,IACR,8CAAA,GACA,8BAAA;AAAA,QACN,WACI,4JAAA,GACA,iDAAA;AAAA,QACJ;AAAA,OACF;AAAA,MACC,GAAG,IAAA;AAAA,MAEH,QAAA,EAAA;AAAA,QAAA,YAAA,IAAgB,CAAC,QAAA,oBAChB,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,QAED,WAAA;AAAA,4BACA,MAAA,EAAA,EAAK,SAAA,EAAU,gCACd,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAM,qBAAU,CAAA,EACnB,CAAA;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ,CAAC;AAED,SAAA,CAAU,WAAA,GAAc,WAAA","file":"SListItem.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","'use client';\n\nimport { forwardRef, useState, type HTMLAttributes, type MouseEvent, type ReactNode } from 'react';\nimport { cn } from '../../lib/cn';\n\nexport interface SListItemRenderState {\n hovered: boolean;\n disabled: boolean;\n}\n\nexport type SListItemRenderProp = (state: SListItemRenderState) => ReactNode;\nexport type SListItemSlot = ReactNode | SListItemRenderProp;\n\nexport interface SListItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'title'> {\n /** 리스트 아이템 제목 */\n title: SListItemSlot;\n /** 중첩 단계. Figma 기준 1~3단계 */\n depth?: 1 | 2 | 3;\n /** 타이틀 앞에 표시할 아이콘/콘텐츠 */\n leading?: SListItemSlot;\n /** 타이틀 뒤에 표시할 태그/콘텐츠 */\n trailing?: SListItemSlot;\n /** 외곽 테두리 사용 여부 */\n bordered?: boolean;\n /** 아이템 왼쪽 accent stripe 표시 여부 */\n accentStripe?: boolean;\n /** 조밀한 높이 사용 여부 */\n dense?: boolean;\n /** 비활성 상태 여부 */\n disabled?: boolean;\n}\n\nexport const SListItem = forwardRef<HTMLDivElement, SListItemProps>(function SListItem(\n {\n title,\n depth = 1,\n leading,\n trailing,\n bordered = false,\n accentStripe = false,\n dense = false,\n disabled = false,\n className,\n onMouseEnter,\n onMouseLeave,\n ...rest\n },\n ref,\n) {\n const [hovered, setHovered] = useState(false);\n const renderState = { hovered, disabled };\n const titleNode = typeof title === 'function' ? title(renderState) : title;\n const leadingNode = typeof leading === 'function' ? leading(renderState) : leading;\n const trailingNode = typeof trailing === 'function' ? trailing(renderState) : trailing;\n\n const handleMouseEnter = (event: MouseEvent<HTMLDivElement>) => {\n if (!disabled) setHovered(true);\n onMouseEnter?.(event);\n };\n\n const handleMouseLeave = (event: MouseEvent<HTMLDivElement>) => {\n setHovered(false);\n onMouseLeave?.(event);\n };\n\n return (\n <div\n ref={ref}\n aria-disabled={disabled || undefined}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={cn(\n 'group/list-item relative flex w-full items-center justify-between bg-(--cmp-listItem-bg-default) text-left text-[14px] font-bold leading-[24px] text-(--cmp-listItem-text-default)',\n disabled\n ? 'pointer-events-none cursor-not-allowed text-(--sys-color-disabled-text)'\n : 'hover:bg-(--cmp-listItem-bg-hover)',\n dense\n ? 'h-[32px] py-(--cmp-listItem-paddingY-dense)'\n : 'h-[40px] py-(--cmp-listItem-paddingY-normal)',\n 'gap-(--cmp-listItem-gap)',\n 'pr-(--cmp-listItem-paddingX)',\n depth === 2\n ? 'pl-[calc(var(--cmp-listItem-paddingX)+32px)]'\n : depth === 3\n ? 'pl-[calc(var(--cmp-listItem-paddingX)+64px)]'\n : 'pl-(--cmp-listItem-paddingX)',\n bordered\n ? 'overflow-hidden rounded-(--cmp-listItem-radius-bordered) border border-(--cmp-listItem-border-default) hover:border-(--cmp-listItem-bordered-border-hover)'\n : 'border-b border-(--cmp-listItem-border-default)',\n className,\n )}\n {...rest}\n >\n {accentStripe && !bordered && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute bottom-[-1px] left-0 top-0 w-(--cmp-listItem-accentStripe-width) bg-(--cmp-listItem-accentStripe-color)\"\n />\n )}\n {leadingNode}\n <span className=\"flex min-w-0 flex-1 flex-col\">\n <span>{titleNode}</span>\n </span>\n {trailingNode}\n </div>\n );\n});\n\nSListItem.displayName = 'SListItem';\n"]}
@@ -0,0 +1 @@
1
+ export { SListItem, type SListItemProps } from './SListItem';