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
package/dist/index.d.ts CHANGED
@@ -5,7 +5,9 @@ export * from './components/SIcon';
5
5
  export * from './components/SBadge';
6
6
  export * from './components/SCard';
7
7
  export * from './components/SDraggableItem';
8
+ export * from './components/SDraggableList';
8
9
  export * from './components/SExpansionItem';
10
+ export * from './components/SExpansionList';
9
11
  export * from './components/SList';
10
12
  export * from './components/SListItem';
11
13
  export * from './components/SSectionHeaderCard';
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { clsx } from 'clsx';
3
3
  import { extendTailwindMerge } from 'tailwind-merge';
4
- import { forwardRef, useState, useRef, useEffect, useId, createContext, useCallback, useImperativeHandle, useMemo, useContext, Fragment as Fragment$1, useLayoutEffect, useSyncExternalStore } from 'react';
4
+ import { forwardRef, useState, useRef, useEffect, createContext, useContext, useCallback, useMemo, useId, Children, cloneElement, useImperativeHandle, Fragment as Fragment$1, useLayoutEffect, isValidElement, useSyncExternalStore } from 'react';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
  import { createPortal } from 'react-dom';
7
7
  import * as RPopover2 from '@radix-ui/react-popover';
@@ -2997,6 +2997,7 @@ var SDraggableItem = forwardRef(
2997
2997
  accentStripe = false,
2998
2998
  bordered = false,
2999
2999
  selected = false,
3000
+ dragging = false,
3000
3001
  dense = false,
3001
3002
  disabled = false,
3002
3003
  dragOverlay = true,
@@ -3067,7 +3068,7 @@ var SDraggableItem = forwardRef(
3067
3068
  bordered,
3068
3069
  selected,
3069
3070
  dense,
3070
- dragging: overlayVisible,
3071
+ dragging: dragging || overlayVisible,
3071
3072
  disabled,
3072
3073
  hovered,
3073
3074
  dragHandleProps,
@@ -3113,6 +3114,130 @@ var SDraggableItem = forwardRef(
3113
3114
  }
3114
3115
  );
3115
3116
  SDraggableItem.displayName = "SDraggableItem";
3117
+ var SList = forwardRef(function SList2({ className, children, useGap = false, usePadding = false, ...rest }, ref) {
3118
+ return /* @__PURE__ */ jsx(
3119
+ "div",
3120
+ {
3121
+ ref,
3122
+ className: cn(
3123
+ useGap && "flex flex-col gap-(--cmp-list-group-gap)",
3124
+ usePadding && "p-(--cmp-list-group-padding)",
3125
+ className
3126
+ ),
3127
+ ...rest,
3128
+ children
3129
+ }
3130
+ );
3131
+ });
3132
+ SList.displayName = "SList";
3133
+ function reorder(items, fromIndex, toIndex) {
3134
+ if (fromIndex === toIndex) return items;
3135
+ const nextItems = [...items];
3136
+ const [movedItem] = nextItems.splice(fromIndex, 1);
3137
+ nextItems.splice(toIndex, 0, movedItem);
3138
+ return nextItems;
3139
+ }
3140
+ function SDraggableListInner({
3141
+ items,
3142
+ getKey,
3143
+ renderItem,
3144
+ onChange,
3145
+ selectedKey,
3146
+ defaultSelectedKey,
3147
+ onSelectedKeyChange,
3148
+ getDisabled,
3149
+ ...rest
3150
+ }, ref) {
3151
+ const [draggingIndex, setDraggingIndex] = useState(null);
3152
+ const [dropIndex, setDropIndex] = useState(null);
3153
+ const [internalSelectedKey, setInternalSelectedKey] = useState(
3154
+ defaultSelectedKey
3155
+ );
3156
+ const listRef = useRef(null);
3157
+ const fromIndexRef = useRef(null);
3158
+ const currentSelectedKey = selectedKey ?? internalSelectedKey;
3159
+ const startDrag = useCallback((event, index) => {
3160
+ event.preventDefault();
3161
+ fromIndexRef.current = index;
3162
+ setDraggingIndex(index);
3163
+ setDropIndex(index);
3164
+ }, []);
3165
+ useEffect(() => {
3166
+ if (draggingIndex == null) return void 0;
3167
+ const handleMouseMove = (event) => {
3168
+ const itemElements = listRef.current?.querySelectorAll(
3169
+ "[data-draggable-list-item]"
3170
+ );
3171
+ if (!itemElements) return;
3172
+ let nextDropIndex = items.length;
3173
+ itemElements.forEach((itemElement, index) => {
3174
+ const rect = itemElement.getBoundingClientRect();
3175
+ if (event.clientY < rect.top + rect.height / 2 && nextDropIndex === items.length) {
3176
+ nextDropIndex = index;
3177
+ }
3178
+ });
3179
+ setDropIndex(nextDropIndex);
3180
+ };
3181
+ const handleMouseUp = () => {
3182
+ const fromIndex = fromIndexRef.current;
3183
+ const nextDropIndex = dropIndex;
3184
+ if (fromIndex != null && nextDropIndex != null) {
3185
+ const toIndex = nextDropIndex > fromIndex ? nextDropIndex - 1 : nextDropIndex;
3186
+ if (fromIndex !== toIndex) onChange(reorder(items, fromIndex, toIndex));
3187
+ }
3188
+ fromIndexRef.current = null;
3189
+ setDraggingIndex(null);
3190
+ setDropIndex(null);
3191
+ };
3192
+ window.addEventListener("mousemove", handleMouseMove);
3193
+ window.addEventListener("mouseup", handleMouseUp);
3194
+ return () => {
3195
+ window.removeEventListener("mousemove", handleMouseMove);
3196
+ window.removeEventListener("mouseup", handleMouseUp);
3197
+ };
3198
+ }, [draggingIndex, dropIndex, items, onChange]);
3199
+ return /* @__PURE__ */ jsx(
3200
+ SList,
3201
+ {
3202
+ ref: (node) => {
3203
+ listRef.current = node;
3204
+ if (typeof ref === "function") ref(node);
3205
+ else if (ref) ref.current = node;
3206
+ },
3207
+ ...rest,
3208
+ children: items.map((item, index) => {
3209
+ const itemKey = getKey(item, index);
3210
+ const disabled = getDisabled?.(item, index) ?? false;
3211
+ const showBefore = draggingIndex != null && dropIndex === index;
3212
+ const showAfter = draggingIndex != null && dropIndex === items.length && index === items.length - 1;
3213
+ return /* @__PURE__ */ jsx(
3214
+ "div",
3215
+ {
3216
+ "data-draggable-list-item": true,
3217
+ "aria-disabled": disabled || void 0,
3218
+ onClick: () => {
3219
+ if (disabled) return;
3220
+ setInternalSelectedKey(itemKey);
3221
+ onSelectedKeyChange?.(itemKey);
3222
+ },
3223
+ className: `relative ${showBefore ? "before:absolute before:left-0 before:right-0 before:top-0 before:z-10 before:h-[2px] before:bg-(--sys-color-border-accent) before:content-['']" : ""} ${showAfter ? "after:absolute after:bottom-0 after:left-0 after:right-0 after:z-10 after:h-[2px] after:bg-(--sys-color-border-accent) after:content-['']" : ""}`,
3224
+ children: renderItem(item, index, {
3225
+ onDragHandleMouseDown: (event) => {
3226
+ if (!disabled) startDrag(event, index);
3227
+ },
3228
+ selected: currentSelectedKey === itemKey
3229
+ })
3230
+ },
3231
+ itemKey
3232
+ );
3233
+ })
3234
+ }
3235
+ );
3236
+ }
3237
+ var SDraggableList = forwardRef(SDraggableListInner);
3238
+ var SExpansionItemDescendantContext = createContext(
3239
+ null
3240
+ );
3116
3241
  var SExpansionItem = forwardRef(
3117
3242
  function SExpansionItem2({
3118
3243
  title,
@@ -3123,6 +3248,9 @@ var SExpansionItem = forwardRef(
3123
3248
  bordered = false,
3124
3249
  expanded,
3125
3250
  defaultExpanded = false,
3251
+ selected = false,
3252
+ interaction,
3253
+ accentStripe = false,
3126
3254
  dense = false,
3127
3255
  disabled = false,
3128
3256
  onToggle,
@@ -3131,15 +3259,39 @@ var SExpansionItem = forwardRef(
3131
3259
  ...rest
3132
3260
  }, ref) {
3133
3261
  const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);
3262
+ const [expandedDescendantCount, setExpandedDescendantCount] = useState(0);
3263
+ const [hovered, setHovered] = useState(false);
3264
+ const parentDescendantContext = useContext(SExpansionItemDescendantContext);
3134
3265
  const isExpanded = expanded ?? internalExpanded;
3135
- const leadingNode = typeof leading === "function" ? leading({ expanded: isExpanded, disabled }) : leading;
3266
+ const isSelected = isExpanded && (selected || expandedDescendantCount === 0);
3267
+ const hasChevronInteraction = interaction === "chevron";
3268
+ const showInteractionChevron = hasChevronInteraction && !disabled && (isSelected || hovered);
3269
+ const interactionChevronColor = isSelected ? "var(--sys-color-fg-brand)" : "var(--sys-color-fg-quaternary)";
3270
+ const reportExpandedDescendant = useCallback(
3271
+ (delta) => {
3272
+ setExpandedDescendantCount((current) => Math.max(0, current + delta));
3273
+ parentDescendantContext?.reportExpandedDescendant(delta);
3274
+ },
3275
+ [parentDescendantContext]
3276
+ );
3277
+ const descendantContextValue = useMemo(
3278
+ () => ({ reportExpandedDescendant }),
3279
+ [reportExpandedDescendant]
3280
+ );
3281
+ const leadingNode = typeof leading === "function" ? leading({ expanded: isExpanded, selected: isSelected, disabled }) : leading;
3136
3282
  const id = useId();
3283
+ useEffect(() => {
3284
+ if (!isExpanded) return;
3285
+ parentDescendantContext?.reportExpandedDescendant(1);
3286
+ return () => parentDescendantContext?.reportExpandedDescendant(-1);
3287
+ }, [isExpanded, parentDescendantContext]);
3137
3288
  return /* @__PURE__ */ jsxs(
3138
3289
  "div",
3139
3290
  {
3140
3291
  ref,
3141
3292
  className: cn(
3142
- "group/expansion-item overflow-hidden bg-(--cmp-listExpansionItem-title-bg-default)",
3293
+ "group/expansion-item relative overflow-hidden bg-(--cmp-listExpansionItem-title-bg-default)",
3294
+ !bordered && "border-b border-(--cmp-listExpansionItem-border-default)",
3143
3295
  // TODO: expansionItem/bordered/radius 및 border intent 토큰 생성 후 고정값을 토큰으로 교체한다.
3144
3296
  bordered && "rounded-[8px] border border-[#E1E1E1] hover:border-[#AAAAAA] [&:has(>button:hover)]:border-[#AAAAAA]",
3145
3297
  bordered && isExpanded && "!border-[#93C4FF]",
@@ -3147,6 +3299,13 @@ var SExpansionItem = forwardRef(
3147
3299
  ),
3148
3300
  ...rest,
3149
3301
  children: [
3302
+ accentStripe && !bordered && /* @__PURE__ */ jsx(
3303
+ "span",
3304
+ {
3305
+ "aria-hidden": "true",
3306
+ className: "pointer-events-none absolute bottom-[-1px] left-0 top-0 z-[1] w-(--cmp-listItem-accentStripe-width) bg-(--cmp-listItem-accentStripe-color)"
3307
+ }
3308
+ ),
3150
3309
  /* @__PURE__ */ jsxs(
3151
3310
  "button",
3152
3311
  {
@@ -3154,6 +3313,8 @@ var SExpansionItem = forwardRef(
3154
3313
  disabled,
3155
3314
  "aria-expanded": isExpanded,
3156
3315
  "aria-controls": id,
3316
+ onMouseEnter: () => setHovered(true),
3317
+ onMouseLeave: () => setHovered(false),
3157
3318
  onClick: (event) => {
3158
3319
  if (disabled) return;
3159
3320
  const next = !isExpanded;
@@ -3161,14 +3322,17 @@ var SExpansionItem = forwardRef(
3161
3322
  onToggle?.(next, event);
3162
3323
  },
3163
3324
  className: cn(
3164
- "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)",
3325
+ "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)",
3165
3326
  isExpanded && "border-b border-(--cmp-listExpansionItem-title-border)",
3166
- !isExpanded && "hover:bg-(--cmp-listExpansionItem-title-bg-hover)",
3327
+ hasChevronInteraction ? "hover:bg-(--sys-color-bg-neutralBright)" : !isExpanded && "hover:bg-(--cmp-listExpansionItem-title-bg-hover)",
3167
3328
  dense ? "h-[32px] py-(--cmp-listExpansionItem-title-paddingY-dense)" : "h-[40px] py-(--cmp-listExpansionItem-title-paddingY-normal)",
3168
3329
  "gap-(--cmp-listExpansionItem-title-gap)",
3169
3330
  "pr-(--cmp-listExpansionItem-title-paddingX)",
3170
- 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)",
3171
- isExpanded && "bg-(--cmp-listExpansionItem-title-bg-expanded) text-(--cmp-listExpansionItem-title-text-expanded)"
3331
+ depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-[16px]",
3332
+ isExpanded && cn(
3333
+ "text-(--cmp-listExpansionItem-title-text-expanded)",
3334
+ isSelected && "bg-(--cmp-listExpansionItem-title-bg-expanded)"
3335
+ )
3172
3336
  ),
3173
3337
  children: [
3174
3338
  !leading && /* @__PURE__ */ jsx(
@@ -3183,11 +3347,12 @@ var SExpansionItem = forwardRef(
3183
3347
  ),
3184
3348
  leadingNode,
3185
3349
  /* @__PURE__ */ jsx("span", { className: "flex min-w-0 flex-1 flex-col", children: /* @__PURE__ */ jsx("span", { children: title }) }),
3186
- trailing
3350
+ trailing,
3351
+ showInteractionChevron && /* @__PURE__ */ jsx(SIcon, { name: "chevronRight", size: 12, color: interactionChevronColor })
3187
3352
  ]
3188
3353
  }
3189
3354
  ),
3190
- /* @__PURE__ */ jsx(
3355
+ /* @__PURE__ */ jsx(SExpansionItemDescendantContext.Provider, { value: descendantContextValue, children: /* @__PURE__ */ jsx(
3191
3356
  "div",
3192
3357
  {
3193
3358
  id,
@@ -3198,34 +3363,21 @@ var SExpansionItem = forwardRef(
3198
3363
  ),
3199
3364
  children: /* @__PURE__ */ jsx("div", { className: "min-h-0 overflow-hidden", children: /* @__PURE__ */ jsx("div", { className: cn(bodyPadding && "p-(--cmp-listExpansionItem-body-padding)"), children }) })
3200
3365
  }
3201
- )
3366
+ ) })
3202
3367
  ]
3203
3368
  }
3204
3369
  );
3205
3370
  }
3206
3371
  );
3207
- var SList = forwardRef(function SList2({ className, children, useGap = false, usePadding = false, ...rest }, ref) {
3208
- return /* @__PURE__ */ jsx(
3209
- "div",
3210
- {
3211
- ref,
3212
- className: cn(
3213
- useGap && "flex flex-col gap-(--cmp-list-group-gap)",
3214
- usePadding && "p-(--cmp-list-group-padding)",
3215
- className
3216
- ),
3217
- ...rest,
3218
- children
3219
- }
3220
- );
3221
- });
3222
- SList.displayName = "SList";
3223
3372
  var SListItem = forwardRef(function SListItem2({
3224
3373
  title,
3225
3374
  depth = 1,
3226
3375
  leading,
3227
3376
  trailing,
3228
3377
  bordered = false,
3378
+ selected = false,
3379
+ clickable = true,
3380
+ interaction,
3229
3381
  accentStripe = false,
3230
3382
  dense = false,
3231
3383
  disabled = false,
@@ -3239,8 +3391,13 @@ var SListItem = forwardRef(function SListItem2({
3239
3391
  const titleNode = typeof title === "function" ? title(renderState) : title;
3240
3392
  const leadingNode = typeof leading === "function" ? leading(renderState) : leading;
3241
3393
  const trailingNode = typeof trailing === "function" ? trailing(renderState) : trailing;
3394
+ const isInteractive = clickable && !disabled;
3395
+ const isSelected = isInteractive && selected;
3396
+ const hasChevronInteraction = interaction === "chevron";
3397
+ const showInteractionChevron = hasChevronInteraction && isInteractive && (isSelected || hovered);
3398
+ const interactionChevronColor = isSelected ? "var(--sys-color-fg-brand)" : "var(--sys-color-fg-quaternary)";
3242
3399
  const handleMouseEnter = (event) => {
3243
- if (!disabled) setHovered(true);
3400
+ if (isInteractive) setHovered(true);
3244
3401
  onMouseEnter?.(event);
3245
3402
  };
3246
3403
  const handleMouseLeave = (event) => {
@@ -3256,12 +3413,21 @@ var SListItem = forwardRef(function SListItem2({
3256
3413
  onMouseLeave: handleMouseLeave,
3257
3414
  className: cn(
3258
3415
  "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)",
3259
- disabled ? "pointer-events-none cursor-not-allowed text-(--sys-color-disabled-text)" : "hover:bg-(--cmp-listItem-bg-hover)",
3416
+ disabled ? "pointer-events-none cursor-not-allowed text-(--sys-color-disabled-text)" : isSelected ? cn(
3417
+ "cursor-pointer text-(--cmp-listItem-text-selected)",
3418
+ "bg-(--cmp-listItem-bg-selected)"
3419
+ ) : isInteractive ? cn(
3420
+ "cursor-pointer",
3421
+ hasChevronInteraction ? "hover:bg-(--sys-color-bg-neutralBright)" : "hover:bg-(--cmp-listItem-bg-hover)"
3422
+ ) : "cursor-default",
3260
3423
  dense ? "h-[32px] py-(--cmp-listItem-paddingY-dense)" : "h-[40px] py-(--cmp-listItem-paddingY-normal)",
3261
3424
  "gap-(--cmp-listItem-gap)",
3262
3425
  "pr-(--cmp-listItem-paddingX)",
3263
- depth === 2 ? "pl-[calc(var(--cmp-listItem-paddingX)+32px)]" : depth === 3 ? "pl-[calc(var(--cmp-listItem-paddingX)+64px)]" : "pl-(--cmp-listItem-paddingX)",
3264
- 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)",
3426
+ depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-[16px]",
3427
+ bordered ? cn(
3428
+ "overflow-hidden rounded-(--cmp-listItem-radius-bordered) border border-(--cmp-listItem-border-default)",
3429
+ isSelected ? "border-(--cmp-listItem-bordered-border-selected)" : isInteractive && "hover:border-(--cmp-listItem-bordered-border-hover)"
3430
+ ) : "border-b border-(--cmp-listItem-border-default)",
3265
3431
  className
3266
3432
  ),
3267
3433
  ...rest,
@@ -3275,12 +3441,77 @@ var SListItem = forwardRef(function SListItem2({
3275
3441
  ),
3276
3442
  leadingNode,
3277
3443
  /* @__PURE__ */ jsx("span", { className: "flex min-w-0 flex-1 flex-col", children: /* @__PURE__ */ jsx("span", { children: titleNode }) }),
3278
- trailingNode
3444
+ trailingNode,
3445
+ showInteractionChevron && /* @__PURE__ */ jsx(SIcon, { name: "chevronRight", size: 12, color: interactionChevronColor })
3279
3446
  ]
3280
3447
  }
3281
3448
  );
3282
3449
  });
3283
3450
  SListItem.displayName = "SListItem";
3451
+ function isExpansionItemElement(node) {
3452
+ return isValidElement(node) && node.type === SExpansionItem;
3453
+ }
3454
+ function isListItemElement(node) {
3455
+ return isValidElement(node) && node.type === SListItem;
3456
+ }
3457
+ function getInitialOpenKeys(children) {
3458
+ const openKeys = {};
3459
+ Children.forEach(children, (child, index) => {
3460
+ if (!isExpansionItemElement(child)) return;
3461
+ const depth = child.props.depth ?? 1;
3462
+ if (openKeys[depth] != null) return;
3463
+ if (child.props.expanded === true || child.props.defaultExpanded === true) {
3464
+ openKeys[depth] = String(child.key ?? index);
3465
+ }
3466
+ });
3467
+ return openKeys;
3468
+ }
3469
+ function getInitialSelectedKeys(children) {
3470
+ const selectedKeys = {};
3471
+ Children.forEach(children, (child, index) => {
3472
+ if (!isListItemElement(child) || !child.props.selected) return;
3473
+ const depth = child.props.depth ?? 1;
3474
+ if (selectedKeys[depth] == null) selectedKeys[depth] = String(child.key ?? index);
3475
+ });
3476
+ return selectedKeys;
3477
+ }
3478
+ var SExpansionList = forwardRef(
3479
+ function SExpansionList2({ children, ...rest }, ref) {
3480
+ const [openKeys, setOpenKeys] = useState(() => getInitialOpenKeys(children));
3481
+ const [selectedKeys, setSelectedKeys] = useState(
3482
+ () => getInitialSelectedKeys(children)
3483
+ );
3484
+ const listChildren = Children.map(children, (child, index) => {
3485
+ if (isListItemElement(child)) {
3486
+ const depth2 = child.props.depth ?? 1;
3487
+ const itemKey2 = String(child.key ?? index);
3488
+ return cloneElement(child, {
3489
+ selected: selectedKeys[depth2] === itemKey2,
3490
+ onClick: (event) => {
3491
+ setSelectedKeys((current) => ({ ...current, [depth2]: itemKey2 }));
3492
+ child.props.onClick?.(event);
3493
+ }
3494
+ });
3495
+ }
3496
+ if (!isExpansionItemElement(child)) return child;
3497
+ const depth = child.props.depth ?? 1;
3498
+ const itemKey = String(child.key ?? index);
3499
+ return cloneElement(child, {
3500
+ expanded: openKeys[depth] === itemKey,
3501
+ selected: void 0,
3502
+ onToggle: (next, event) => {
3503
+ setOpenKeys((current) => ({
3504
+ ...current,
3505
+ [depth]: next ? itemKey : current[depth] === itemKey ? void 0 : current[depth]
3506
+ }));
3507
+ child.props.onToggle?.(next, event);
3508
+ }
3509
+ });
3510
+ });
3511
+ return /* @__PURE__ */ jsx(SList, { ref, ...rest, children: listChildren });
3512
+ }
3513
+ );
3514
+ SExpansionList.displayName = "SExpansionList";
3284
3515
 
3285
3516
  // src/lib/floating-anim.ts
3286
3517
  var FLOATING_SLIDE_ANIM = [
@@ -3757,6 +3988,10 @@ var topBorderColorClass = {
3757
3988
  default: "bg-(--cmp-sectionHeaderCard-topBorder-color-default)",
3758
3989
  accent: "bg-(--cmp-sectionHeaderCard-topBorder-color-accent)"
3759
3990
  };
3991
+ var titleSizeClass = {
3992
+ xs: "typo-heading-xs",
3993
+ sm: "typo-heading-sm"
3994
+ };
3760
3995
  var SSectionHeaderCardBody = forwardRef(
3761
3996
  function SSectionHeaderCardBody2({ className, children, ...rest }, ref) {
3762
3997
  return /* @__PURE__ */ jsx("div", { ref, className, ...rest, children });
@@ -3765,6 +4000,7 @@ var SSectionHeaderCardBody = forwardRef(
3765
4000
  var SSectionHeaderCardHeader = forwardRef(
3766
4001
  function SSectionHeaderCardHeader2({
3767
4002
  title,
4003
+ titleSize = "xs",
3768
4004
  marker = false,
3769
4005
  required = false,
3770
4006
  helpText,
@@ -3797,7 +4033,16 @@ var SSectionHeaderCardHeader = forwardRef(
3797
4033
  children: [
3798
4034
  marker && /* @__PURE__ */ jsx(SBadge, { color: "darkblue", className: "shrink-0" }),
3799
4035
  /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 shrink-0 items-center gap-[8px]", children: [
3800
- /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate text-[12px] font-bold leading-[20px] text-(--sys-color-fg-brand)", children: title }),
4036
+ /* @__PURE__ */ jsx(
4037
+ "span",
4038
+ {
4039
+ className: cn(
4040
+ "min-w-0 truncate text-(--sys-color-fg-brand)",
4041
+ titleSizeClass[titleSize]
4042
+ ),
4043
+ children: title
4044
+ }
4045
+ ),
3801
4046
  required && /* @__PURE__ */ jsx(
3802
4047
  SIcon,
3803
4048
  {
@@ -12417,6 +12662,6 @@ function STimeRangePicker({
12417
12662
  );
12418
12663
  }
12419
12664
 
12420
- export { BADGE_COLORS, BUTTON_COLORS, BUTTON_SIZES, COLOR_KEYS, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_HEADER, GNB_MENU, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, ICONS, PAGE_BACKGROUNDS, SActionModal, SBadge, SBarcodeInput, SButton, SCROLL_AREA_AXES, SCalendar, SCallout, SCard, SCheckbox, SChip, SChipInput, SCircleProgress, SConfirmModal, SDatePicker, SDateRangePicker, SDivider, SDraggableItem, SDropdownButton, SExpansionItem, SField, SFilePicker, SForm, SGhostButton, SGnb, SGuide, SIcon, SInput, SKeyValueTable, SLayout, SLayoutContext, SLinearProgress, SList, SListItem, SLoadingContainer, SLoadingModal, SLoadingViewport, SModal, SNumberInput, SPage, SPagination, SPopover, SPopup, SPortal, SRadio, SRadioButton, SRadioGroup, SScrollArea, SSectionHeaderCard2 as SSectionHeaderCard, SSelect, SStepper, SSwitch, STEPPER_SIZES, STable, STableBar, STabs, STag, STextLink, STextarea, STimePicker, STimeRangePicker, SToast, SToastContainer, SToggle, STooltip, TAG_COLORS, TAG_SHAPES, TAG_SIZES, TIMEPICKER_SIZES, TIMEPICKER_SIZE_CONFIG, buttonPreset, cn, findGnbAncestors, findGnbRailValue, isColorKey, loading, resolveColor, useSLayout };
12665
+ export { BADGE_COLORS, BUTTON_COLORS, BUTTON_SIZES, COLOR_KEYS, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_HEADER, GNB_MENU, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, ICONS, PAGE_BACKGROUNDS, SActionModal, SBadge, SBarcodeInput, SButton, SCROLL_AREA_AXES, SCalendar, SCallout, SCard, SCheckbox, SChip, SChipInput, SCircleProgress, SConfirmModal, SDatePicker, SDateRangePicker, SDivider, SDraggableItem, SDraggableList, SDropdownButton, SExpansionItem, SExpansionList, SField, SFilePicker, SForm, SGhostButton, SGnb, SGuide, SIcon, SInput, SKeyValueTable, SLayout, SLayoutContext, SLinearProgress, SList, SListItem, SLoadingContainer, SLoadingModal, SLoadingViewport, SModal, SNumberInput, SPage, SPagination, SPopover, SPopup, SPortal, SRadio, SRadioButton, SRadioGroup, SScrollArea, SSectionHeaderCard2 as SSectionHeaderCard, SSelect, SStepper, SSwitch, STEPPER_SIZES, STable, STableBar, STabs, STag, STextLink, STextarea, STimePicker, STimeRangePicker, SToast, SToastContainer, SToggle, STooltip, TAG_COLORS, TAG_SHAPES, TAG_SIZES, TIMEPICKER_SIZES, TIMEPICKER_SIZE_CONFIG, buttonPreset, cn, findGnbAncestors, findGnbRailValue, isColorKey, loading, resolveColor, useSLayout };
12421
12666
  //# sourceMappingURL=index.js.map
12422
12667
  //# sourceMappingURL=index.js.map