sellmate-design-system-react 3.5.0 → 3.6.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 (49) hide show
  1. package/dist/components/SDraggableItem/README.md +1 -0
  2. package/dist/components/SDraggableItem/SDraggableItem.cjs +2 -1
  3. package/dist/components/SDraggableItem/SDraggableItem.cjs.map +1 -1
  4. package/dist/components/SDraggableItem/SDraggableItem.d.ts +2 -0
  5. package/dist/components/SDraggableItem/SDraggableItem.js +2 -1
  6. package/dist/components/SDraggableItem/SDraggableItem.js.map +1 -1
  7. package/dist/components/SDraggableList/README.md +37 -0
  8. package/dist/components/SDraggableList/SDraggableList.cjs +143 -0
  9. package/dist/components/SDraggableList/SDraggableList.cjs.map +1 -0
  10. package/dist/components/SDraggableList/SDraggableList.d.ts +27 -0
  11. package/dist/components/SDraggableList/SDraggableList.js +141 -0
  12. package/dist/components/SDraggableList/SDraggableList.js.map +1 -0
  13. package/dist/components/SDraggableList/index.d.ts +1 -0
  14. package/dist/components/SExpansionItem/README.md +8 -0
  15. package/dist/components/SExpansionItem/SExpansionItem.cjs +52 -9
  16. package/dist/components/SExpansionItem/SExpansionItem.cjs.map +1 -1
  17. package/dist/components/SExpansionItem/SExpansionItem.d.ts +7 -0
  18. package/dist/components/SExpansionItem/SExpansionItem.js +53 -10
  19. package/dist/components/SExpansionItem/SExpansionItem.js.map +1 -1
  20. package/dist/components/SExpansionList/README.md +9 -0
  21. package/dist/components/SExpansionList/SExpansionList.cjs +3150 -0
  22. package/dist/components/SExpansionList/SExpansionList.cjs.map +1 -0
  23. package/dist/components/SExpansionList/SExpansionList.d.ts +3 -0
  24. package/dist/components/SExpansionList/SExpansionList.js +3148 -0
  25. package/dist/components/SExpansionList/SExpansionList.js.map +1 -0
  26. package/dist/components/SExpansionList/index.d.ts +1 -0
  27. package/dist/components/SList/README.md +15 -0
  28. package/dist/components/SListItem/README.md +21 -0
  29. package/dist/components/SListItem/SListItem.cjs +2858 -5
  30. package/dist/components/SListItem/SListItem.cjs.map +1 -1
  31. package/dist/components/SListItem/SListItem.d.ts +7 -0
  32. package/dist/components/SListItem/SListItem.js +2859 -6
  33. package/dist/components/SListItem/SListItem.js.map +1 -1
  34. package/dist/components/SSectionHeaderCard/README.md +1 -0
  35. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.cjs +15 -1
  36. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.cjs.map +1 -1
  37. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +3 -0
  38. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.js +15 -1
  39. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.js.map +1 -1
  40. package/dist/components/SSectionHeaderCard/index.d.ts +1 -1
  41. package/dist/index.cjs +279 -32
  42. package/dist/index.cjs.map +1 -1
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.js +279 -34
  45. package/dist/index.js.map +1 -1
  46. package/dist/llms-full.txt +79 -0
  47. package/dist/llms.txt +2 -2
  48. package/dist/styles.css +50 -63
  49. package/package.json +1 -1
@@ -1,9 +1,11 @@
1
1
  import { type HTMLAttributes, type MouseEvent, type ReactNode } from 'react';
2
2
  export interface SExpansionItemRenderState {
3
3
  expanded: boolean;
4
+ selected: boolean;
4
5
  disabled: boolean;
5
6
  }
6
7
  export type SExpansionItemRenderProp = (state: SExpansionItemRenderState) => ReactNode;
8
+ export type SExpansionItemInteraction = 'chevron';
7
9
  export interface SExpansionItemProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onToggle' | 'title'> {
8
10
  title: ReactNode;
9
11
  /** 중첩 단계. Figma 기준 1~3단계 */
@@ -18,6 +20,11 @@ export interface SExpansionItemProps extends Omit<HTMLAttributes<HTMLDivElement>
18
20
  bordered?: boolean;
19
21
  expanded?: boolean;
20
22
  defaultExpanded?: boolean;
23
+ selected?: boolean;
24
+ /** hover/selected 상태에서 적용할 인터랙션 preset */
25
+ interaction?: SExpansionItemInteraction;
26
+ /** 아이템 왼쪽 accent stripe 표시 여부 */
27
+ accentStripe?: boolean;
21
28
  dense?: boolean;
22
29
  disabled?: boolean;
23
30
  onToggle?: (expanded: boolean, event: MouseEvent<HTMLButtonElement>) => void;
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { forwardRef, useState, useId } from 'react';
2
+ import { forwardRef, createContext, useState, useContext, useCallback, useMemo, useId, useEffect } from 'react';
3
3
  import { clsx } from 'clsx';
4
4
  import { extendTailwindMerge } from 'tailwind-merge';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -2849,6 +2849,9 @@ var SIcon = forwardRef(function SIcon2({ name, size = 24, color, rotate, label,
2849
2849
  }
2850
2850
  );
2851
2851
  });
2852
+ var SExpansionItemDescendantContext = createContext(
2853
+ null
2854
+ );
2852
2855
  var SExpansionItem = forwardRef(
2853
2856
  function SExpansionItem2({
2854
2857
  title,
@@ -2859,6 +2862,9 @@ var SExpansionItem = forwardRef(
2859
2862
  bordered = false,
2860
2863
  expanded,
2861
2864
  defaultExpanded = false,
2865
+ selected = false,
2866
+ interaction,
2867
+ accentStripe = false,
2862
2868
  dense = false,
2863
2869
  disabled = false,
2864
2870
  onToggle,
@@ -2867,15 +2873,39 @@ var SExpansionItem = forwardRef(
2867
2873
  ...rest
2868
2874
  }, ref) {
2869
2875
  const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);
2876
+ const [expandedDescendantCount, setExpandedDescendantCount] = useState(0);
2877
+ const [hovered, setHovered] = useState(false);
2878
+ const parentDescendantContext = useContext(SExpansionItemDescendantContext);
2870
2879
  const isExpanded = expanded ?? internalExpanded;
2871
- const leadingNode = typeof leading === "function" ? leading({ expanded: isExpanded, disabled }) : leading;
2880
+ const isSelected = isExpanded && (selected || expandedDescendantCount === 0);
2881
+ const hasChevronInteraction = interaction === "chevron";
2882
+ const showInteractionChevron = hasChevronInteraction && !disabled && (isSelected || hovered);
2883
+ const interactionChevronColor = isSelected ? "var(--sys-color-fg-brand)" : "var(--sys-color-fg-quaternary)";
2884
+ const reportExpandedDescendant = useCallback(
2885
+ (delta) => {
2886
+ setExpandedDescendantCount((current) => Math.max(0, current + delta));
2887
+ parentDescendantContext?.reportExpandedDescendant(delta);
2888
+ },
2889
+ [parentDescendantContext]
2890
+ );
2891
+ const descendantContextValue = useMemo(
2892
+ () => ({ reportExpandedDescendant }),
2893
+ [reportExpandedDescendant]
2894
+ );
2895
+ const leadingNode = typeof leading === "function" ? leading({ expanded: isExpanded, selected: isSelected, disabled }) : leading;
2872
2896
  const id = useId();
2897
+ useEffect(() => {
2898
+ if (!isExpanded) return;
2899
+ parentDescendantContext?.reportExpandedDescendant(1);
2900
+ return () => parentDescendantContext?.reportExpandedDescendant(-1);
2901
+ }, [isExpanded, parentDescendantContext]);
2873
2902
  return /* @__PURE__ */ jsxs(
2874
2903
  "div",
2875
2904
  {
2876
2905
  ref,
2877
2906
  className: cn(
2878
- "group/expansion-item overflow-hidden bg-(--cmp-listExpansionItem-title-bg-default)",
2907
+ "group/expansion-item relative overflow-hidden bg-(--cmp-listExpansionItem-title-bg-default)",
2908
+ !bordered && "border-b border-(--cmp-listExpansionItem-border-default)",
2879
2909
  // TODO: expansionItem/bordered/radius 및 border intent 토큰 생성 후 고정값을 토큰으로 교체한다.
2880
2910
  bordered && "rounded-[8px] border border-[#E1E1E1] hover:border-[#AAAAAA] [&:has(>button:hover)]:border-[#AAAAAA]",
2881
2911
  bordered && isExpanded && "!border-[#93C4FF]",
@@ -2883,6 +2913,13 @@ var SExpansionItem = forwardRef(
2883
2913
  ),
2884
2914
  ...rest,
2885
2915
  children: [
2916
+ accentStripe && !bordered && /* @__PURE__ */ jsx(
2917
+ "span",
2918
+ {
2919
+ "aria-hidden": "true",
2920
+ className: "pointer-events-none absolute bottom-[-1px] left-0 top-0 z-[1] w-(--cmp-listItem-accentStripe-width) bg-(--cmp-listItem-accentStripe-color)"
2921
+ }
2922
+ ),
2886
2923
  /* @__PURE__ */ jsxs(
2887
2924
  "button",
2888
2925
  {
@@ -2890,6 +2927,8 @@ var SExpansionItem = forwardRef(
2890
2927
  disabled,
2891
2928
  "aria-expanded": isExpanded,
2892
2929
  "aria-controls": id,
2930
+ onMouseEnter: () => setHovered(true),
2931
+ onMouseLeave: () => setHovered(false),
2893
2932
  onClick: (event) => {
2894
2933
  if (disabled) return;
2895
2934
  const next = !isExpanded;
@@ -2897,14 +2936,17 @@ var SExpansionItem = forwardRef(
2897
2936
  onToggle?.(next, event);
2898
2937
  },
2899
2938
  className: cn(
2900
- "flex w-full cursor-pointer items-center justify-between border-0 text-left text-[14px] font-bold leading-[24px] text-(--cmp-listExpansionItem-title-text-default) focus-visible:outline focus-visible:outline-2 focus-visible:outline-(--sys-color-border-accent) disabled:cursor-not-allowed disabled:text-(--sys-color-disabled-text)",
2939
+ "group/expansion-item-button flex w-full cursor-pointer items-center justify-between border-0 text-left text-[14px] font-bold leading-[24px] text-(--cmp-listExpansionItem-title-text-default) focus-visible:outline focus-visible:outline-2 focus-visible:outline-(--sys-color-border-accent) disabled:cursor-not-allowed disabled:text-(--sys-color-disabled-text)",
2901
2940
  isExpanded && "border-b border-(--cmp-listExpansionItem-title-border)",
2902
- !isExpanded && "hover:bg-(--cmp-listExpansionItem-title-bg-hover)",
2941
+ hasChevronInteraction ? "hover:bg-(--sys-color-bg-neutralBright)" : !isExpanded && "hover:bg-(--cmp-listExpansionItem-title-bg-hover)",
2903
2942
  dense ? "h-[32px] py-(--cmp-listExpansionItem-title-paddingY-dense)" : "h-[40px] py-(--cmp-listExpansionItem-title-paddingY-normal)",
2904
2943
  "gap-(--cmp-listExpansionItem-title-gap)",
2905
2944
  "pr-(--cmp-listExpansionItem-title-paddingX)",
2906
- depth === 2 ? "pl-[calc(var(--cmp-listExpansionItem-title-paddingX)+32px)]" : depth === 3 ? "pl-[calc(var(--cmp-listExpansionItem-title-paddingX)+64px)]" : "pl-(--cmp-listExpansionItem-title-paddingX)",
2907
- isExpanded && "bg-(--cmp-listExpansionItem-title-bg-expanded) text-(--cmp-listExpansionItem-title-text-expanded)"
2945
+ depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-[16px]",
2946
+ isExpanded && cn(
2947
+ "text-(--cmp-listExpansionItem-title-text-expanded)",
2948
+ isSelected && "bg-(--cmp-listExpansionItem-title-bg-expanded)"
2949
+ )
2908
2950
  ),
2909
2951
  children: [
2910
2952
  !leading && /* @__PURE__ */ jsx(
@@ -2919,11 +2961,12 @@ var SExpansionItem = forwardRef(
2919
2961
  ),
2920
2962
  leadingNode,
2921
2963
  /* @__PURE__ */ jsx("span", { className: "flex min-w-0 flex-1 flex-col", children: /* @__PURE__ */ jsx("span", { children: title }) }),
2922
- trailing
2964
+ trailing,
2965
+ showInteractionChevron && /* @__PURE__ */ jsx(SIcon, { name: "chevronRight", size: 12, color: interactionChevronColor })
2923
2966
  ]
2924
2967
  }
2925
2968
  ),
2926
- /* @__PURE__ */ jsx(
2969
+ /* @__PURE__ */ jsx(SExpansionItemDescendantContext.Provider, { value: descendantContextValue, children: /* @__PURE__ */ jsx(
2927
2970
  "div",
2928
2971
  {
2929
2972
  id,
@@ -2934,7 +2977,7 @@ var SExpansionItem = forwardRef(
2934
2977
  ),
2935
2978
  children: /* @__PURE__ */ jsx("div", { className: "min-h-0 overflow-hidden", children: /* @__PURE__ */ jsx("div", { className: cn(bodyPadding && "p-(--cmp-listExpansionItem-body-padding)"), children }) })
2936
2979
  }
2937
- )
2980
+ ) })
2938
2981
  ]
2939
2982
  }
2940
2983
  );