@octaviaflow/core 3.0.9 → 3.0.10

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.
@@ -12,6 +12,13 @@ export interface DropdownMenuProps {
12
12
  items: DropdownMenuItem[];
13
13
  align?: "start" | "end";
14
14
  className?: string;
15
+ /**
16
+ * Override the className applied to the auto-generated trigger <button>.
17
+ * Defaults to "ods-dropdown__trigger". Useful when composing the
18
+ * DropdownMenu inside a host component (e.g. Sidebar user card) that
19
+ * supplies its own button styling.
20
+ */
21
+ triggerClassName?: string;
15
22
  /**
16
23
  * Accessible name for the trigger button. Required when `trigger` is not
17
24
  * a plain string (e.g. an icon-only trigger). When omitted and `trigger`
@@ -21,5 +28,5 @@ export interface DropdownMenuProps {
21
28
  /** id of an element that labels the trigger; alternative to aria-label. */
22
29
  "aria-labelledby"?: string;
23
30
  }
24
- export declare function DropdownMenu({ trigger, items, align, className, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, }: DropdownMenuProps): import("react/jsx-runtime").JSX.Element;
31
+ export declare function DropdownMenu({ trigger, items, align, className, triggerClassName, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, }: DropdownMenuProps): import("react/jsx-runtime").JSX.Element;
25
32
  //# sourceMappingURL=DropdownMenu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../../src/components/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAC;AAQ/C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAsID,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,KAAK,EACL,KAAe,EACf,SAAS,EACT,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,GAClC,EAAE,iBAAiB,2CAsCnB"}
1
+ {"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../../src/components/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAC;AAQ/C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,SAAS,CAAC;IACnB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAsID,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,KAAK,EACL,KAAe,EACf,SAAS,EACT,gBAAgB,EAChB,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,GAClC,EAAE,iBAAiB,2CA0CnB"}
@@ -1 +1 @@
1
- {"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/Sidebar/Sidebar.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAA4C,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEnF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,2EAA2E;IAC3E,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IACvC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;IAClD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAGtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,OAAO,CAAC,EACtB,OAAoB,EACpB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,MAAM,EAAE,UAAU,EAClB,aAAqB,EACrB,cAAc,EACd,aAAoC,EACpC,cAAoB,EACpB,eAAqB,EACrB,YAAkB,EAClB,MAAe,EACf,SAAS,GACV,EAAE,YAAY,2CA6Gd"}
1
+ {"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/Sidebar/Sidebar.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAA4C,MAAM,OAAO,CAAC;AAEjF,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEnF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,2EAA2E;IAC3E,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAAC;IACvC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,SAAS,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;IAClD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,cAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAGtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,OAAO,CAAC,EACtB,OAAoB,EACpB,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,WAAW,EACX,IAAI,EACJ,QAAQ,EACR,MAAM,EAAE,UAAU,EAClB,aAAqB,EACrB,cAAc,EACd,aAAoC,EACpC,cAAoB,EACpB,eAAqB,EACrB,YAAkB,EAClB,MAAe,EACf,SAAS,GACV,EAAE,YAAY,2CAuId"}
package/dist/index.cjs CHANGED
@@ -6569,6 +6569,7 @@ function DropdownMenu({
6569
6569
  items,
6570
6570
  align = "start",
6571
6571
  className,
6572
+ triggerClassName,
6572
6573
  "aria-label": ariaLabel,
6573
6574
  "aria-labelledby": ariaLabelledby
6574
6575
  }) {
@@ -6587,7 +6588,15 @@ function DropdownMenu({
6587
6588
  );
6588
6589
  const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeTriggerProps } = buttonProps;
6589
6590
  return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_jsx_runtime29.Fragment, { children: [
6590
- /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("button", { ...safeTriggerProps, ref: triggerRef, className: "ods-dropdown__trigger", children: trigger }),
6591
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
6592
+ "button",
6593
+ {
6594
+ ...safeTriggerProps,
6595
+ ref: triggerRef,
6596
+ className: triggerClassName ?? "ods-dropdown__trigger",
6597
+ children: trigger
6598
+ }
6599
+ ),
6591
6600
  /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
6592
6601
  MenuPopup,
6593
6602
  {
@@ -11253,15 +11262,17 @@ function Sidebar({
11253
11262
  className
11254
11263
  }) {
11255
11264
  const allSections = sections ?? (items ? [{ items }] : []);
11256
- const [internalPinned, setInternalPinned] = (0, import_react53.useState)(() => {
11257
- if (typeof window === "undefined") return defaultPinned;
11265
+ const [internalPinned, setInternalPinned] = (0, import_react53.useState)(defaultPinned);
11266
+ (0, import_react53.useEffect)(() => {
11267
+ if (pinnedProp !== void 0) return;
11258
11268
  try {
11259
11269
  const stored = window.localStorage.getItem(pinStorageKey);
11260
- if (stored !== null) return stored === "true";
11270
+ if (stored !== null && stored !== String(internalPinned)) {
11271
+ setInternalPinned(stored === "true");
11272
+ }
11261
11273
  } catch {
11262
11274
  }
11263
- return defaultPinned;
11264
- });
11275
+ }, []);
11265
11276
  const pinned = pinnedProp ?? internalPinned;
11266
11277
  const setPinned = (0, import_react53.useCallback)(
11267
11278
  (p) => {
@@ -11299,6 +11310,17 @@ function Sidebar({
11299
11310
  const autoMode = variant === "auto";
11300
11311
  const showAsRail = autoMode ? !pinned : variant === "rail";
11301
11312
  const overlayOpen = autoMode && !pinned && hoverOpen;
11313
+ (0, import_react53.useEffect)(() => {
11314
+ if (!overlayOpen) return;
11315
+ const handler = (e) => {
11316
+ if (e.key === "Escape") {
11317
+ clearTimers();
11318
+ setHoverOpen(false);
11319
+ }
11320
+ };
11321
+ window.addEventListener("keydown", handler);
11322
+ return () => window.removeEventListener("keydown", handler);
11323
+ }, [overlayOpen]);
11302
11324
  return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
11303
11325
  "nav",
11304
11326
  {
@@ -11404,17 +11426,34 @@ function RailLayout({
11404
11426
  },
11405
11427
  item.id
11406
11428
  )) }),
11407
- user && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
11408
- "button",
11429
+ user && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SidebarUserRail, { user })
11430
+ ] });
11431
+ }
11432
+ function SidebarUserRail({ user }) {
11433
+ const labelText = typeof user.name === "string" ? user.name : "User";
11434
+ const avatar = user.avatar ?? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { children: user.initial ?? (typeof user.name === "string" ? user.name.charAt(0).toUpperCase() : "?") });
11435
+ if (user.menu && user.menu.length > 0) {
11436
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
11437
+ DropdownMenu,
11409
11438
  {
11410
- type: "button",
11411
- className: "ods-sidebar__user-rail",
11412
- onClick: user.onClick,
11413
- "aria-label": typeof user.name === "string" ? user.name : "User",
11414
- children: user.avatar ?? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { children: user.initial ?? (typeof user.name === "string" ? user.name.charAt(0).toUpperCase() : "?") })
11439
+ trigger: avatar,
11440
+ items: user.menu,
11441
+ align: "end",
11442
+ "aria-label": labelText,
11443
+ triggerClassName: "ods-sidebar__user-rail"
11415
11444
  }
11416
- )
11417
- ] });
11445
+ );
11446
+ }
11447
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
11448
+ "button",
11449
+ {
11450
+ type: "button",
11451
+ className: "ods-sidebar__user-rail",
11452
+ onClick: user.onClick,
11453
+ "aria-label": labelText,
11454
+ children: avatar
11455
+ }
11456
+ );
11418
11457
  }
11419
11458
  function RailItem({
11420
11459
  item,
@@ -11533,18 +11572,7 @@ function ExpandedLayout({
11533
11572
  ] }, section.id ?? sIdx)) }),
11534
11573
  (footerItems || user) && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ods-sidebar__footer", children: [
11535
11574
  footerItems && footerItems.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "ods-sidebar__footer-list", children: footerItems.map((item) => /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(ExpandedItem, { item, level: 0 }, item.id)) }),
11536
- user && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("button", { type: "button", className: "ods-sidebar__user-card", onClick: user.onClick, children: [
11537
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__user-avatar", children: user.avatar ?? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { children: user.initial ?? (typeof user.name === "string" ? user.name.charAt(0).toUpperCase() : "?") }) }),
11538
- /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("span", { className: "ods-sidebar__user-info", children: [
11539
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__user-name", children: user.name }),
11540
- user.email && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__user-email", children: user.email })
11541
- ] }),
11542
- /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [
11543
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("circle", { cx: "8", cy: "3", r: "1.3", fill: "currentColor" }),
11544
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("circle", { cx: "8", cy: "8", r: "1.3", fill: "currentColor" }),
11545
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("circle", { cx: "8", cy: "13", r: "1.3", fill: "currentColor" })
11546
- ] })
11547
- ] })
11575
+ user && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SidebarUserCard, { user })
11548
11576
  ] })
11549
11577
  ] });
11550
11578
  }
@@ -11634,6 +11662,34 @@ function ExpandedItem({ item, level }) {
11634
11662
  }
11635
11663
  );
11636
11664
  }
11665
+ function SidebarUserCard({ user }) {
11666
+ const labelText = typeof user.name === "string" ? user.name : "User";
11667
+ const body = /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_jsx_runtime69.Fragment, { children: [
11668
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__user-avatar", children: user.avatar ?? /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { children: user.initial ?? (typeof user.name === "string" ? user.name.charAt(0).toUpperCase() : "?") }) }),
11669
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("span", { className: "ods-sidebar__user-info", children: [
11670
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__user-name", children: user.name }),
11671
+ user.email && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__user-email", children: user.email })
11672
+ ] }),
11673
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [
11674
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("circle", { cx: "8", cy: "3", r: "1.3", fill: "currentColor" }),
11675
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("circle", { cx: "8", cy: "8", r: "1.3", fill: "currentColor" }),
11676
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("circle", { cx: "8", cy: "13", r: "1.3", fill: "currentColor" })
11677
+ ] })
11678
+ ] });
11679
+ if (user.menu && user.menu.length > 0) {
11680
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
11681
+ DropdownMenu,
11682
+ {
11683
+ trigger: body,
11684
+ items: user.menu,
11685
+ align: "end",
11686
+ "aria-label": labelText,
11687
+ triggerClassName: "ods-sidebar__user-card"
11688
+ }
11689
+ );
11690
+ }
11691
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("button", { type: "button", className: "ods-sidebar__user-card", onClick: user.onClick, children: body });
11692
+ }
11637
11693
  function hasActiveDescendant(item) {
11638
11694
  if (!item.children) return false;
11639
11695
  for (const c of item.children) {