@bizapps/design-system-testing 1.12.0 → 1.12.2

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.
package/dist/main.d.cts CHANGED
@@ -2455,7 +2455,10 @@ interface FloatingSidebarProps extends Omit<ComponentProps<'nav'>, 'children'> {
2455
2455
  type?: 'single' | 'multiple';
2456
2456
  /** Open module cards (controlled). In `single` mode only the first id is used. */
2457
2457
  openModuleIds?: string[];
2458
- /** Initially open module cards when uncontrolled. Read once on mount. */
2458
+ /**
2459
+ * Initially open module cards when uncontrolled. Read once on mount. Defaults to the module
2460
+ * of the current page (`activeItemId` or `defaultActiveItemId`), or none without one.
2461
+ */
2459
2462
  defaultOpenModuleIds?: string[];
2460
2463
  /** Fires with the new list of open module cards. */
2461
2464
  onOpenModulesChange?: (moduleIds: string[]) => void;
package/dist/main.d.ts CHANGED
@@ -2455,7 +2455,10 @@ interface FloatingSidebarProps extends Omit<ComponentProps<'nav'>, 'children'> {
2455
2455
  type?: 'single' | 'multiple';
2456
2456
  /** Open module cards (controlled). In `single` mode only the first id is used. */
2457
2457
  openModuleIds?: string[];
2458
- /** Initially open module cards when uncontrolled. Read once on mount. */
2458
+ /**
2459
+ * Initially open module cards when uncontrolled. Read once on mount. Defaults to the module
2460
+ * of the current page (`activeItemId` or `defaultActiveItemId`), or none without one.
2461
+ */
2459
2462
  defaultOpenModuleIds?: string[];
2460
2463
  /** Fires with the new list of open module cards. */
2461
2464
  onOpenModulesChange?: (moduleIds: string[]) => void;
package/dist/main.js CHANGED
@@ -9198,6 +9198,13 @@ var DEFAULT_LABELS = {
9198
9198
  var EASE = "cubic-bezier(.2,.8,.2,1)";
9199
9199
  var MOTION_MS = 240;
9200
9200
  var FADE_MS = MOTION_MS / 2;
9201
+ var RAIL_STAGGER_MS = 20;
9202
+ var ACCORDION_EASE = "cubic-bezier(.4,0,.2,1)";
9203
+ var ACCORDION_ITEM_FADE_MS = 260;
9204
+ var ACCORDION_OPEN_DELAY_MS = 120;
9205
+ var ACCORDION_OPEN_STAGGER_MS = 50;
9206
+ var ACCORDION_CLOSE_FADE_MS = 160;
9207
+ var ACCORDION_STAGGER_CAP = 8;
9201
9208
  var MORPH_MS = 360;
9202
9209
  var MORPH_EASE = "cubic-bezier(.65,0,.35,1)";
9203
9210
  var BOUNCE_KEYFRAMES = [
@@ -9335,7 +9342,7 @@ var DEFAULT_WIDTH = 305;
9335
9342
  var DEFAULT_COLLAPSED_WIDTH = 48;
9336
9343
  var TILE_ICON_SIZE = 22;
9337
9344
  var MIN_COLLAPSED_WIDTH = 40;
9338
- var t = (prop, ms = 300, delay = 0) => `${prop} ${ms}ms ${EASE} ${delay}ms`;
9345
+ var t = (prop, ms = 300, delay = 0, ease2 = EASE) => `${prop} ${ms}ms ${ease2} ${delay}ms`;
9339
9346
  function transition2(reduced, ...parts) {
9340
9347
  const kept = reduced ? parts.filter((part) => /^(opacity|visibility|background|color|box-shadow)/.test(part)) : parts;
9341
9348
  return kept.join(", ") || "none";
@@ -9404,7 +9411,7 @@ function FloatingSidebar({
9404
9411
  collapsedWidth = DEFAULT_COLLAPSED_WIDTH,
9405
9412
  type = "single",
9406
9413
  openModuleIds: openModulesProp,
9407
- defaultOpenModuleIds = [],
9414
+ defaultOpenModuleIds,
9408
9415
  onOpenModulesChange,
9409
9416
  hideEmptyModules = true,
9410
9417
  activeItemId: activeItemProp,
@@ -9433,9 +9440,16 @@ function FloatingSidebar({
9433
9440
  const isMobile = useIsMobile();
9434
9441
  const baseId = useId();
9435
9442
  const [open, setOpen] = useControllableState2(openProp, defaultOpen, onOpenChange);
9443
+ const moduleIdByItemId = useMemo(
9444
+ () => new Map(modules.flatMap((module) => module.items.map((item) => [item.id, module.id]))),
9445
+ [modules]
9446
+ );
9447
+ const moduleIdOf = (itemId) => itemId ? moduleIdByItemId.get(itemId) : void 0;
9448
+ const initialActiveModuleId = moduleIdOf(activeItemProp ?? defaultActiveItemId);
9436
9449
  const [rawOpenModuleIds, setOpenModuleIds] = useControllableState2(
9437
9450
  openModulesProp,
9438
- defaultOpenModuleIds,
9451
+ // Without an explicit default, the module of the current page starts open.
9452
+ defaultOpenModuleIds ?? (initialActiveModuleId ? [initialActiveModuleId] : []),
9439
9453
  onOpenModulesChange
9440
9454
  );
9441
9455
  const railWidth = Math.max(MIN_COLLAPSED_WIDTH, collapsedWidth);
@@ -9537,8 +9551,31 @@ function FloatingSidebar({
9537
9551
  document.addEventListener("keydown", onKeyDown);
9538
9552
  return () => document.removeEventListener("keydown", onKeyDown);
9539
9553
  }, [shortcut, toggle, isMobile, mobileOpen, setMobileOpen]);
9554
+ const openModule = (moduleId) => {
9555
+ const opened = rawOpenModuleIds.includes(moduleId);
9556
+ if (type === "multiple") {
9557
+ if (!opened) setOpenModuleIds([...rawOpenModuleIds, moduleId]);
9558
+ } else if (!opened || rawOpenModuleIds.length > 1) {
9559
+ setOpenModuleIds([moduleId]);
9560
+ }
9561
+ };
9562
+ const activeModuleId = moduleIdOf(activeItemId);
9563
+ const syncedActive = useRef(`${activeItemId}|${activeModuleId}`);
9564
+ useEffect(() => {
9565
+ const key = `${activeItemId}|${activeModuleId}`;
9566
+ if (syncedActive.current === key) return;
9567
+ syncedActive.current = key;
9568
+ if (activeModuleId) openModule(activeModuleId);
9569
+ });
9540
9570
  const selectItem = (item, module, navigates) => {
9541
- if (navigates) setActiveItemId(item.id);
9571
+ if (navigates) {
9572
+ setActiveItemId(item.id);
9573
+ openModule(module.id);
9574
+ if (activeItemProp === void 0) {
9575
+ syncedActive.current = `${item.id}|${moduleIdOf(item.id)}`;
9576
+ }
9577
+ if (queries[module.id]) setQueries((current) => ({ ...current, [module.id]: "" }));
9578
+ }
9542
9579
  setFlyoutId(null);
9543
9580
  if (isMobile) setMobileOpen(false);
9544
9581
  onItemSelect?.(item, module);
@@ -9953,6 +9990,11 @@ function ModuleCard({
9953
9990
  });
9954
9991
  return () => animation2?.cancel();
9955
9992
  }, [collapsed, hasActive, reduced]);
9993
+ const [toggle, setToggle] = useState({ collapsed, open, accordion: false });
9994
+ if (toggle.collapsed !== collapsed || toggle.open !== open) {
9995
+ setToggle({ collapsed, open, accordion: toggle.collapsed === collapsed });
9996
+ }
9997
+ const accordion = toggle.accordion && !reduced;
9956
9998
  const items = filterItems(module.items, query);
9957
9999
  const isEmpty = module.items.length === 0;
9958
10000
  const emptyMessage = /* @__PURE__ */ jsx(
@@ -10171,6 +10213,7 @@ function ModuleCard({
10171
10213
  list,
10172
10214
  visible: open,
10173
10215
  staggerIndex: index,
10216
+ accordion,
10174
10217
  onSelect: (navigates) => onSelect(item, navigates)
10175
10218
  },
10176
10219
  item.id
@@ -10295,20 +10338,27 @@ function ModuleCard({
10295
10338
  }
10296
10339
  ) });
10297
10340
  }
10298
- function ItemRow({ item, list, visible, staggerIndex, onSelect }) {
10341
+ function ItemRow({ item, list, visible, staggerIndex, accordion, onSelect }) {
10299
10342
  const { activeItemId, favoriteIds, reduced, labels, resolveIcon, renderLink } = list;
10300
10343
  const active = item.id === activeItemId;
10301
10344
  const favorite = favoriteIds?.includes(item.id) ?? false;
10302
10345
  const tabIndex = visible ? 0 : -1;
10303
10346
  const staggered = staggerIndex !== void 0;
10304
- const delay = staggered && visible ? Math.min(staggerIndex * 20, FADE_MS) : 0;
10347
+ let fade = t("opacity", FADE_MS, 0);
10348
+ if (staggered && accordion) {
10349
+ const step = Math.min(staggerIndex, ACCORDION_STAGGER_CAP);
10350
+ fade = visible ? t(
10351
+ "opacity",
10352
+ ACCORDION_ITEM_FADE_MS,
10353
+ ACCORDION_OPEN_DELAY_MS + step * ACCORDION_OPEN_STAGGER_MS,
10354
+ ACCORDION_EASE
10355
+ ) : t("opacity", ACCORDION_CLOSE_FADE_MS, 0, ACCORDION_EASE);
10356
+ } else if (staggered && visible) {
10357
+ fade = t("opacity", FADE_MS, Math.min(staggerIndex * RAIL_STAGGER_MS, FADE_MS));
10358
+ }
10305
10359
  const rowStyle = staggered ? {
10306
10360
  opacity: visible ? 1 : 0,
10307
- transition: transition2(
10308
- reduced,
10309
- t("opacity", FADE_MS, delay),
10310
- "background-color 180ms ease-out"
10311
- )
10361
+ transition: transition2(reduced, fade, "background-color 180ms ease-out")
10312
10362
  } : { transition: "background-color 180ms ease-out" };
10313
10363
  const className = cn(
10314
10364
  "focus-visible:ring-primary flex min-h-[46px] min-w-0 flex-1 cursor-pointer items-start gap-3 rounded-[10px] border-0 bg-transparent py-[13px] pr-1 pl-3 text-left text-[13px] leading-5 transition-transform duration-180 ease-[cubic-bezier(.2,.8,.2,1)] outline-none hover:text-primary focus-visible:ring-2 focus-visible:ring-inset disabled:cursor-not-allowed disabled:opacity-50",