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 +1 @@
1
- export { SSectionHeaderCard, type SSectionHeaderCardBodyChildren, type SSectionHeaderCardBodyProps, type SSectionHeaderCardChildren, type SSectionHeaderCardHeaderProps, type SSectionHeaderCardProps, type SSectionHeaderCardThickness, } from './SSectionHeaderCard';
1
+ export { SSectionHeaderCard, type SSectionHeaderCardBodyChildren, type SSectionHeaderCardBodyProps, type SSectionHeaderCardChildren, type SSectionHeaderCardHeaderProps, type SSectionHeaderCardProps, type SSectionHeaderCardThickness, type SSectionHeaderCardTitleSize, } from './SSectionHeaderCard';
package/dist/index.cjs CHANGED
@@ -3025,6 +3025,7 @@ var SDraggableItem = react.forwardRef(
3025
3025
  accentStripe = false,
3026
3026
  bordered = false,
3027
3027
  selected = false,
3028
+ dragging = false,
3028
3029
  dense = false,
3029
3030
  disabled = false,
3030
3031
  dragOverlay = true,
@@ -3095,7 +3096,7 @@ var SDraggableItem = react.forwardRef(
3095
3096
  bordered,
3096
3097
  selected,
3097
3098
  dense,
3098
- dragging: overlayVisible,
3099
+ dragging: dragging || overlayVisible,
3099
3100
  disabled,
3100
3101
  hovered,
3101
3102
  dragHandleProps,
@@ -3141,6 +3142,130 @@ var SDraggableItem = react.forwardRef(
3141
3142
  }
3142
3143
  );
3143
3144
  SDraggableItem.displayName = "SDraggableItem";
3145
+ var SList = react.forwardRef(function SList2({ className, children, useGap = false, usePadding = false, ...rest }, ref) {
3146
+ return /* @__PURE__ */ jsxRuntime.jsx(
3147
+ "div",
3148
+ {
3149
+ ref,
3150
+ className: cn(
3151
+ useGap && "flex flex-col gap-(--cmp-list-group-gap)",
3152
+ usePadding && "p-(--cmp-list-group-padding)",
3153
+ className
3154
+ ),
3155
+ ...rest,
3156
+ children
3157
+ }
3158
+ );
3159
+ });
3160
+ SList.displayName = "SList";
3161
+ function reorder(items, fromIndex, toIndex) {
3162
+ if (fromIndex === toIndex) return items;
3163
+ const nextItems = [...items];
3164
+ const [movedItem] = nextItems.splice(fromIndex, 1);
3165
+ nextItems.splice(toIndex, 0, movedItem);
3166
+ return nextItems;
3167
+ }
3168
+ function SDraggableListInner({
3169
+ items,
3170
+ getKey,
3171
+ renderItem,
3172
+ onChange,
3173
+ selectedKey,
3174
+ defaultSelectedKey,
3175
+ onSelectedKeyChange,
3176
+ getDisabled,
3177
+ ...rest
3178
+ }, ref) {
3179
+ const [draggingIndex, setDraggingIndex] = react.useState(null);
3180
+ const [dropIndex, setDropIndex] = react.useState(null);
3181
+ const [internalSelectedKey, setInternalSelectedKey] = react.useState(
3182
+ defaultSelectedKey
3183
+ );
3184
+ const listRef = react.useRef(null);
3185
+ const fromIndexRef = react.useRef(null);
3186
+ const currentSelectedKey = selectedKey ?? internalSelectedKey;
3187
+ const startDrag = react.useCallback((event, index) => {
3188
+ event.preventDefault();
3189
+ fromIndexRef.current = index;
3190
+ setDraggingIndex(index);
3191
+ setDropIndex(index);
3192
+ }, []);
3193
+ react.useEffect(() => {
3194
+ if (draggingIndex == null) return void 0;
3195
+ const handleMouseMove = (event) => {
3196
+ const itemElements = listRef.current?.querySelectorAll(
3197
+ "[data-draggable-list-item]"
3198
+ );
3199
+ if (!itemElements) return;
3200
+ let nextDropIndex = items.length;
3201
+ itemElements.forEach((itemElement, index) => {
3202
+ const rect = itemElement.getBoundingClientRect();
3203
+ if (event.clientY < rect.top + rect.height / 2 && nextDropIndex === items.length) {
3204
+ nextDropIndex = index;
3205
+ }
3206
+ });
3207
+ setDropIndex(nextDropIndex);
3208
+ };
3209
+ const handleMouseUp = () => {
3210
+ const fromIndex = fromIndexRef.current;
3211
+ const nextDropIndex = dropIndex;
3212
+ if (fromIndex != null && nextDropIndex != null) {
3213
+ const toIndex = nextDropIndex > fromIndex ? nextDropIndex - 1 : nextDropIndex;
3214
+ if (fromIndex !== toIndex) onChange(reorder(items, fromIndex, toIndex));
3215
+ }
3216
+ fromIndexRef.current = null;
3217
+ setDraggingIndex(null);
3218
+ setDropIndex(null);
3219
+ };
3220
+ window.addEventListener("mousemove", handleMouseMove);
3221
+ window.addEventListener("mouseup", handleMouseUp);
3222
+ return () => {
3223
+ window.removeEventListener("mousemove", handleMouseMove);
3224
+ window.removeEventListener("mouseup", handleMouseUp);
3225
+ };
3226
+ }, [draggingIndex, dropIndex, items, onChange]);
3227
+ return /* @__PURE__ */ jsxRuntime.jsx(
3228
+ SList,
3229
+ {
3230
+ ref: (node) => {
3231
+ listRef.current = node;
3232
+ if (typeof ref === "function") ref(node);
3233
+ else if (ref) ref.current = node;
3234
+ },
3235
+ ...rest,
3236
+ children: items.map((item, index) => {
3237
+ const itemKey = getKey(item, index);
3238
+ const disabled = getDisabled?.(item, index) ?? false;
3239
+ const showBefore = draggingIndex != null && dropIndex === index;
3240
+ const showAfter = draggingIndex != null && dropIndex === items.length && index === items.length - 1;
3241
+ return /* @__PURE__ */ jsxRuntime.jsx(
3242
+ "div",
3243
+ {
3244
+ "data-draggable-list-item": true,
3245
+ "aria-disabled": disabled || void 0,
3246
+ onClick: () => {
3247
+ if (disabled) return;
3248
+ setInternalSelectedKey(itemKey);
3249
+ onSelectedKeyChange?.(itemKey);
3250
+ },
3251
+ 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-['']" : ""}`,
3252
+ children: renderItem(item, index, {
3253
+ onDragHandleMouseDown: (event) => {
3254
+ if (!disabled) startDrag(event, index);
3255
+ },
3256
+ selected: currentSelectedKey === itemKey
3257
+ })
3258
+ },
3259
+ itemKey
3260
+ );
3261
+ })
3262
+ }
3263
+ );
3264
+ }
3265
+ var SDraggableList = react.forwardRef(SDraggableListInner);
3266
+ var SExpansionItemDescendantContext = react.createContext(
3267
+ null
3268
+ );
3144
3269
  var SExpansionItem = react.forwardRef(
3145
3270
  function SExpansionItem2({
3146
3271
  title,
@@ -3151,6 +3276,9 @@ var SExpansionItem = react.forwardRef(
3151
3276
  bordered = false,
3152
3277
  expanded,
3153
3278
  defaultExpanded = false,
3279
+ selected = false,
3280
+ interaction,
3281
+ accentStripe = false,
3154
3282
  dense = false,
3155
3283
  disabled = false,
3156
3284
  onToggle,
@@ -3159,15 +3287,39 @@ var SExpansionItem = react.forwardRef(
3159
3287
  ...rest
3160
3288
  }, ref) {
3161
3289
  const [internalExpanded, setInternalExpanded] = react.useState(defaultExpanded);
3290
+ const [expandedDescendantCount, setExpandedDescendantCount] = react.useState(0);
3291
+ const [hovered, setHovered] = react.useState(false);
3292
+ const parentDescendantContext = react.useContext(SExpansionItemDescendantContext);
3162
3293
  const isExpanded = expanded ?? internalExpanded;
3163
- const leadingNode = typeof leading === "function" ? leading({ expanded: isExpanded, disabled }) : leading;
3294
+ const isSelected = isExpanded && (selected || expandedDescendantCount === 0);
3295
+ const hasChevronInteraction = interaction === "chevron";
3296
+ const showInteractionChevron = hasChevronInteraction && !disabled && (isSelected || hovered);
3297
+ const interactionChevronColor = isSelected ? "var(--sys-color-fg-brand)" : "var(--sys-color-fg-quaternary)";
3298
+ const reportExpandedDescendant = react.useCallback(
3299
+ (delta) => {
3300
+ setExpandedDescendantCount((current) => Math.max(0, current + delta));
3301
+ parentDescendantContext?.reportExpandedDescendant(delta);
3302
+ },
3303
+ [parentDescendantContext]
3304
+ );
3305
+ const descendantContextValue = react.useMemo(
3306
+ () => ({ reportExpandedDescendant }),
3307
+ [reportExpandedDescendant]
3308
+ );
3309
+ const leadingNode = typeof leading === "function" ? leading({ expanded: isExpanded, selected: isSelected, disabled }) : leading;
3164
3310
  const id = react.useId();
3311
+ react.useEffect(() => {
3312
+ if (!isExpanded) return;
3313
+ parentDescendantContext?.reportExpandedDescendant(1);
3314
+ return () => parentDescendantContext?.reportExpandedDescendant(-1);
3315
+ }, [isExpanded, parentDescendantContext]);
3165
3316
  return /* @__PURE__ */ jsxRuntime.jsxs(
3166
3317
  "div",
3167
3318
  {
3168
3319
  ref,
3169
3320
  className: cn(
3170
- "group/expansion-item overflow-hidden bg-(--cmp-listExpansionItem-title-bg-default)",
3321
+ "group/expansion-item relative overflow-hidden bg-(--cmp-listExpansionItem-title-bg-default)",
3322
+ !bordered && "border-b border-(--cmp-listExpansionItem-border-default)",
3171
3323
  // TODO: expansionItem/bordered/radius 및 border intent 토큰 생성 후 고정값을 토큰으로 교체한다.
3172
3324
  bordered && "rounded-[8px] border border-[#E1E1E1] hover:border-[#AAAAAA] [&:has(>button:hover)]:border-[#AAAAAA]",
3173
3325
  bordered && isExpanded && "!border-[#93C4FF]",
@@ -3175,6 +3327,13 @@ var SExpansionItem = react.forwardRef(
3175
3327
  ),
3176
3328
  ...rest,
3177
3329
  children: [
3330
+ accentStripe && !bordered && /* @__PURE__ */ jsxRuntime.jsx(
3331
+ "span",
3332
+ {
3333
+ "aria-hidden": "true",
3334
+ className: "pointer-events-none absolute bottom-[-1px] left-0 top-0 z-[1] w-(--cmp-listItem-accentStripe-width) bg-(--cmp-listItem-accentStripe-color)"
3335
+ }
3336
+ ),
3178
3337
  /* @__PURE__ */ jsxRuntime.jsxs(
3179
3338
  "button",
3180
3339
  {
@@ -3182,6 +3341,8 @@ var SExpansionItem = react.forwardRef(
3182
3341
  disabled,
3183
3342
  "aria-expanded": isExpanded,
3184
3343
  "aria-controls": id,
3344
+ onMouseEnter: () => setHovered(true),
3345
+ onMouseLeave: () => setHovered(false),
3185
3346
  onClick: (event) => {
3186
3347
  if (disabled) return;
3187
3348
  const next = !isExpanded;
@@ -3189,14 +3350,17 @@ var SExpansionItem = react.forwardRef(
3189
3350
  onToggle?.(next, event);
3190
3351
  },
3191
3352
  className: cn(
3192
- "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)",
3353
+ "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)",
3193
3354
  isExpanded && "border-b border-(--cmp-listExpansionItem-title-border)",
3194
- !isExpanded && "hover:bg-(--cmp-listExpansionItem-title-bg-hover)",
3355
+ hasChevronInteraction ? "hover:bg-(--sys-color-bg-neutralBright)" : !isExpanded && "hover:bg-(--cmp-listExpansionItem-title-bg-hover)",
3195
3356
  dense ? "h-[32px] py-(--cmp-listExpansionItem-title-paddingY-dense)" : "h-[40px] py-(--cmp-listExpansionItem-title-paddingY-normal)",
3196
3357
  "gap-(--cmp-listExpansionItem-title-gap)",
3197
3358
  "pr-(--cmp-listExpansionItem-title-paddingX)",
3198
- 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)",
3199
- isExpanded && "bg-(--cmp-listExpansionItem-title-bg-expanded) text-(--cmp-listExpansionItem-title-text-expanded)"
3359
+ depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-[16px]",
3360
+ isExpanded && cn(
3361
+ "text-(--cmp-listExpansionItem-title-text-expanded)",
3362
+ isSelected && "bg-(--cmp-listExpansionItem-title-bg-expanded)"
3363
+ )
3200
3364
  ),
3201
3365
  children: [
3202
3366
  !leading && /* @__PURE__ */ jsxRuntime.jsx(
@@ -3211,11 +3375,12 @@ var SExpansionItem = react.forwardRef(
3211
3375
  ),
3212
3376
  leadingNode,
3213
3377
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex min-w-0 flex-1 flex-col", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: title }) }),
3214
- trailing
3378
+ trailing,
3379
+ showInteractionChevron && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "chevronRight", size: 12, color: interactionChevronColor })
3215
3380
  ]
3216
3381
  }
3217
3382
  ),
3218
- /* @__PURE__ */ jsxRuntime.jsx(
3383
+ /* @__PURE__ */ jsxRuntime.jsx(SExpansionItemDescendantContext.Provider, { value: descendantContextValue, children: /* @__PURE__ */ jsxRuntime.jsx(
3219
3384
  "div",
3220
3385
  {
3221
3386
  id,
@@ -3226,34 +3391,21 @@ var SExpansionItem = react.forwardRef(
3226
3391
  ),
3227
3392
  children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-0 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(bodyPadding && "p-(--cmp-listExpansionItem-body-padding)"), children }) })
3228
3393
  }
3229
- )
3394
+ ) })
3230
3395
  ]
3231
3396
  }
3232
3397
  );
3233
3398
  }
3234
3399
  );
3235
- var SList = react.forwardRef(function SList2({ className, children, useGap = false, usePadding = false, ...rest }, ref) {
3236
- return /* @__PURE__ */ jsxRuntime.jsx(
3237
- "div",
3238
- {
3239
- ref,
3240
- className: cn(
3241
- useGap && "flex flex-col gap-(--cmp-list-group-gap)",
3242
- usePadding && "p-(--cmp-list-group-padding)",
3243
- className
3244
- ),
3245
- ...rest,
3246
- children
3247
- }
3248
- );
3249
- });
3250
- SList.displayName = "SList";
3251
3400
  var SListItem = react.forwardRef(function SListItem2({
3252
3401
  title,
3253
3402
  depth = 1,
3254
3403
  leading,
3255
3404
  trailing,
3256
3405
  bordered = false,
3406
+ selected = false,
3407
+ clickable = true,
3408
+ interaction,
3257
3409
  accentStripe = false,
3258
3410
  dense = false,
3259
3411
  disabled = false,
@@ -3267,8 +3419,13 @@ var SListItem = react.forwardRef(function SListItem2({
3267
3419
  const titleNode = typeof title === "function" ? title(renderState) : title;
3268
3420
  const leadingNode = typeof leading === "function" ? leading(renderState) : leading;
3269
3421
  const trailingNode = typeof trailing === "function" ? trailing(renderState) : trailing;
3422
+ const isInteractive = clickable && !disabled;
3423
+ const isSelected = isInteractive && selected;
3424
+ const hasChevronInteraction = interaction === "chevron";
3425
+ const showInteractionChevron = hasChevronInteraction && isInteractive && (isSelected || hovered);
3426
+ const interactionChevronColor = isSelected ? "var(--sys-color-fg-brand)" : "var(--sys-color-fg-quaternary)";
3270
3427
  const handleMouseEnter = (event) => {
3271
- if (!disabled) setHovered(true);
3428
+ if (isInteractive) setHovered(true);
3272
3429
  onMouseEnter?.(event);
3273
3430
  };
3274
3431
  const handleMouseLeave = (event) => {
@@ -3284,12 +3441,21 @@ var SListItem = react.forwardRef(function SListItem2({
3284
3441
  onMouseLeave: handleMouseLeave,
3285
3442
  className: cn(
3286
3443
  "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)",
3287
- disabled ? "pointer-events-none cursor-not-allowed text-(--sys-color-disabled-text)" : "hover:bg-(--cmp-listItem-bg-hover)",
3444
+ disabled ? "pointer-events-none cursor-not-allowed text-(--sys-color-disabled-text)" : isSelected ? cn(
3445
+ "cursor-pointer text-(--cmp-listItem-text-selected)",
3446
+ "bg-(--cmp-listItem-bg-selected)"
3447
+ ) : isInteractive ? cn(
3448
+ "cursor-pointer",
3449
+ hasChevronInteraction ? "hover:bg-(--sys-color-bg-neutralBright)" : "hover:bg-(--cmp-listItem-bg-hover)"
3450
+ ) : "cursor-default",
3288
3451
  dense ? "h-[32px] py-(--cmp-listItem-paddingY-dense)" : "h-[40px] py-(--cmp-listItem-paddingY-normal)",
3289
3452
  "gap-(--cmp-listItem-gap)",
3290
3453
  "pr-(--cmp-listItem-paddingX)",
3291
- depth === 2 ? "pl-[calc(var(--cmp-listItem-paddingX)+32px)]" : depth === 3 ? "pl-[calc(var(--cmp-listItem-paddingX)+64px)]" : "pl-(--cmp-listItem-paddingX)",
3292
- 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)",
3454
+ depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-[16px]",
3455
+ bordered ? cn(
3456
+ "overflow-hidden rounded-(--cmp-listItem-radius-bordered) border border-(--cmp-listItem-border-default)",
3457
+ isSelected ? "border-(--cmp-listItem-bordered-border-selected)" : isInteractive && "hover:border-(--cmp-listItem-bordered-border-hover)"
3458
+ ) : "border-b border-(--cmp-listItem-border-default)",
3293
3459
  className
3294
3460
  ),
3295
3461
  ...rest,
@@ -3303,12 +3469,77 @@ var SListItem = react.forwardRef(function SListItem2({
3303
3469
  ),
3304
3470
  leadingNode,
3305
3471
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex min-w-0 flex-1 flex-col", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: titleNode }) }),
3306
- trailingNode
3472
+ trailingNode,
3473
+ showInteractionChevron && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "chevronRight", size: 12, color: interactionChevronColor })
3307
3474
  ]
3308
3475
  }
3309
3476
  );
3310
3477
  });
3311
3478
  SListItem.displayName = "SListItem";
3479
+ function isExpansionItemElement(node) {
3480
+ return react.isValidElement(node) && node.type === SExpansionItem;
3481
+ }
3482
+ function isListItemElement(node) {
3483
+ return react.isValidElement(node) && node.type === SListItem;
3484
+ }
3485
+ function getInitialOpenKeys(children) {
3486
+ const openKeys = {};
3487
+ react.Children.forEach(children, (child, index) => {
3488
+ if (!isExpansionItemElement(child)) return;
3489
+ const depth = child.props.depth ?? 1;
3490
+ if (openKeys[depth] != null) return;
3491
+ if (child.props.expanded === true || child.props.defaultExpanded === true) {
3492
+ openKeys[depth] = String(child.key ?? index);
3493
+ }
3494
+ });
3495
+ return openKeys;
3496
+ }
3497
+ function getInitialSelectedKeys(children) {
3498
+ const selectedKeys = {};
3499
+ react.Children.forEach(children, (child, index) => {
3500
+ if (!isListItemElement(child) || !child.props.selected) return;
3501
+ const depth = child.props.depth ?? 1;
3502
+ if (selectedKeys[depth] == null) selectedKeys[depth] = String(child.key ?? index);
3503
+ });
3504
+ return selectedKeys;
3505
+ }
3506
+ var SExpansionList = react.forwardRef(
3507
+ function SExpansionList2({ children, ...rest }, ref) {
3508
+ const [openKeys, setOpenKeys] = react.useState(() => getInitialOpenKeys(children));
3509
+ const [selectedKeys, setSelectedKeys] = react.useState(
3510
+ () => getInitialSelectedKeys(children)
3511
+ );
3512
+ const listChildren = react.Children.map(children, (child, index) => {
3513
+ if (isListItemElement(child)) {
3514
+ const depth2 = child.props.depth ?? 1;
3515
+ const itemKey2 = String(child.key ?? index);
3516
+ return react.cloneElement(child, {
3517
+ selected: selectedKeys[depth2] === itemKey2,
3518
+ onClick: (event) => {
3519
+ setSelectedKeys((current) => ({ ...current, [depth2]: itemKey2 }));
3520
+ child.props.onClick?.(event);
3521
+ }
3522
+ });
3523
+ }
3524
+ if (!isExpansionItemElement(child)) return child;
3525
+ const depth = child.props.depth ?? 1;
3526
+ const itemKey = String(child.key ?? index);
3527
+ return react.cloneElement(child, {
3528
+ expanded: openKeys[depth] === itemKey,
3529
+ selected: void 0,
3530
+ onToggle: (next, event) => {
3531
+ setOpenKeys((current) => ({
3532
+ ...current,
3533
+ [depth]: next ? itemKey : current[depth] === itemKey ? void 0 : current[depth]
3534
+ }));
3535
+ child.props.onToggle?.(next, event);
3536
+ }
3537
+ });
3538
+ });
3539
+ return /* @__PURE__ */ jsxRuntime.jsx(SList, { ref, ...rest, children: listChildren });
3540
+ }
3541
+ );
3542
+ SExpansionList.displayName = "SExpansionList";
3312
3543
 
3313
3544
  // src/lib/floating-anim.ts
3314
3545
  var FLOATING_SLIDE_ANIM = [
@@ -3785,6 +4016,10 @@ var topBorderColorClass = {
3785
4016
  default: "bg-(--cmp-sectionHeaderCard-topBorder-color-default)",
3786
4017
  accent: "bg-(--cmp-sectionHeaderCard-topBorder-color-accent)"
3787
4018
  };
4019
+ var titleSizeClass = {
4020
+ xs: "typo-heading-xs",
4021
+ sm: "typo-heading-sm"
4022
+ };
3788
4023
  var SSectionHeaderCardBody = react.forwardRef(
3789
4024
  function SSectionHeaderCardBody2({ className, children, ...rest }, ref) {
3790
4025
  return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className, ...rest, children });
@@ -3793,6 +4028,7 @@ var SSectionHeaderCardBody = react.forwardRef(
3793
4028
  var SSectionHeaderCardHeader = react.forwardRef(
3794
4029
  function SSectionHeaderCardHeader2({
3795
4030
  title,
4031
+ titleSize = "xs",
3796
4032
  marker = false,
3797
4033
  required = false,
3798
4034
  helpText,
@@ -3825,7 +4061,16 @@ var SSectionHeaderCardHeader = react.forwardRef(
3825
4061
  children: [
3826
4062
  marker && /* @__PURE__ */ jsxRuntime.jsx(SBadge, { color: "darkblue", className: "shrink-0" }),
3827
4063
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 shrink-0 items-center gap-[8px]", children: [
3828
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate text-[12px] font-bold leading-[20px] text-(--sys-color-fg-brand)", children: title }),
4064
+ /* @__PURE__ */ jsxRuntime.jsx(
4065
+ "span",
4066
+ {
4067
+ className: cn(
4068
+ "min-w-0 truncate text-(--sys-color-fg-brand)",
4069
+ titleSizeClass[titleSize]
4070
+ ),
4071
+ children: title
4072
+ }
4073
+ ),
3829
4074
  required && /* @__PURE__ */ jsxRuntime.jsx(
3830
4075
  SIcon,
3831
4076
  {
@@ -12476,8 +12721,10 @@ exports.SDatePicker = SDatePicker;
12476
12721
  exports.SDateRangePicker = SDateRangePicker;
12477
12722
  exports.SDivider = SDivider;
12478
12723
  exports.SDraggableItem = SDraggableItem;
12724
+ exports.SDraggableList = SDraggableList;
12479
12725
  exports.SDropdownButton = SDropdownButton;
12480
12726
  exports.SExpansionItem = SExpansionItem;
12727
+ exports.SExpansionList = SExpansionList;
12481
12728
  exports.SField = SField;
12482
12729
  exports.SFilePicker = SFilePicker;
12483
12730
  exports.SForm = SForm;