@octaviaflow/core 3.0.10 → 3.0.12

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.
@@ -38,6 +38,13 @@ export interface AuthTabsProps {
38
38
  className?: string;
39
39
  }
40
40
  export declare function AuthTabs({ tabs, defaultTab, value, onChange, className }: AuthTabsProps): import("react/jsx-runtime").JSX.Element;
41
+ export interface AuthFieldRowProps {
42
+ children: ReactNode;
43
+ /** Grid template columns. Default: "1fr 1fr". */
44
+ columns?: string;
45
+ className?: string;
46
+ }
47
+ export declare function AuthFieldRow({ children, columns, className }: AuthFieldRowProps): import("react/jsx-runtime").JSX.Element;
41
48
  export type AuthBadgeTone = "neutral" | "org" | "personal" | "developer";
42
49
  export interface AuthBadgeProps {
43
50
  tone?: AuthBadgeTone;
@@ -1 +1 @@
1
- {"version":3,"file":"AuthCard.d.ts","sourceRoot":"","sources":["../../../src/components/AuthCard/AuthCard.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAGjD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,oEAAoE;IACpE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,OAAO,EACP,MAAM,EACN,SAAS,GACV,EAAE,aAAa,2CAgBf;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAe,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAQ3E;AAKD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAYxF;AAKD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,aAAa,2CA8BvF;AAKD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,cAAc,2CAIlF"}
1
+ {"version":3,"file":"AuthCard.d.ts","sourceRoot":"","sources":["../../../src/components/AuthCard/AuthCard.tsx"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,SAAS,EAA2B,MAAM,OAAO,CAAC;AAGpF,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,oEAAoE;IACpE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,KAAK,EACL,QAAQ,EACR,OAAO,EACP,MAAM,EACN,SAAS,GACV,EAAE,aAAa,2CAgBf;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAe,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAQ3E;AAKD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAYxF;AAKD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,OAAO,EAAE,SAAS,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,aAAa,2CA6EvF;AASD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,OAAmB,EAAE,SAAS,EAAE,EAAE,iBAAiB,2CAa3F;AAKD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,WAAW,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAgB,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,cAAc,2CAIlF"}
@@ -1,2 +1,2 @@
1
- export { AuthBadge, type AuthBadgeProps, type AuthBadgeTone, AuthCard, type AuthCardProps, AuthDivider, type AuthDividerProps, AuthSection, type AuthSectionProps, type AuthTab, AuthTabs, type AuthTabsProps, } from "./AuthCard";
1
+ export { AuthBadge, type AuthBadgeProps, type AuthBadgeTone, AuthCard, type AuthCardProps, AuthDivider, type AuthDividerProps, AuthFieldRow, type AuthFieldRowProps, AuthSection, type AuthSectionProps, type AuthTab, AuthTabs, type AuthTabsProps, } from "./AuthCard";
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AuthCard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,QAAQ,EACR,KAAK,aAAa,EAClB,WAAW,EACX,KAAK,gBAAgB,EACrB,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,QAAQ,EACR,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/AuthCard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,QAAQ,EACR,KAAK,aAAa,EAClB,WAAW,EACX,KAAK,gBAAgB,EACrB,YAAY,EACZ,KAAK,iBAAiB,EACtB,WAAW,EACX,KAAK,gBAAgB,EACrB,KAAK,OAAO,EACZ,QAAQ,EACR,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC"}
@@ -19,6 +19,18 @@ export interface DropdownMenuProps {
19
19
  * supplies its own button styling.
20
20
  */
21
21
  triggerClassName?: string;
22
+ /**
23
+ * Close the menu when the user clicks (mousedown) outside both the menu
24
+ * and the trigger. Default: true — the standard popover behaviour users
25
+ * expect. Disable only when you need an explicitly-controlled menu
26
+ * (e.g. anchored to a different dismissal flow).
27
+ */
28
+ closeOnOutsideClick?: boolean;
29
+ /**
30
+ * Close the menu when the user presses Escape. Default: true.
31
+ * Disable only if Escape is needed by a parent surface.
32
+ */
33
+ closeOnEscape?: boolean;
22
34
  /**
23
35
  * Accessible name for the trigger button. Required when `trigger` is not
24
36
  * a plain string (e.g. an icon-only trigger). When omitted and `trigger`
@@ -28,5 +40,5 @@ export interface DropdownMenuProps {
28
40
  /** id of an element that labels the trigger; alternative to aria-label. */
29
41
  "aria-labelledby"?: string;
30
42
  }
31
- export declare function DropdownMenu({ trigger, items, align, className, triggerClassName, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, }: DropdownMenuProps): import("react/jsx-runtime").JSX.Element;
43
+ export declare function DropdownMenu({ trigger, items, align, className, triggerClassName, closeOnOutsideClick, closeOnEscape, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledby, }: DropdownMenuProps): import("react/jsx-runtime").JSX.Element;
32
44
  //# 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;;;;;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
+ {"version":3,"file":"DropdownMenu.d.ts","sourceRoot":"","sources":["../../../src/components/DropdownMenu/DropdownMenu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,OAAO,CAAC;AAQ1D,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;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AA8KD,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,KAAK,EACL,KAAe,EACf,SAAS,EACT,gBAAgB,EAChB,mBAA0B,EAC1B,aAAoB,EACpB,YAAY,EAAE,SAAS,EACvB,iBAAiB,EAAE,cAAc,GAClC,EAAE,iBAAiB,2CA4CnB"}
package/dist/index.cjs CHANGED
@@ -415,24 +415,61 @@ function AuthTabs({ tabs, defaultTab, value, onChange, className }) {
415
415
  onChange?.(id);
416
416
  };
417
417
  const activeTab = tabs.find((t) => t.id === active) ?? tabs[0];
418
+ const scopeId = (0, import_react2.useId)();
419
+ const tabRefs = (0, import_react2.useRef)({});
420
+ const handleKeyDown = (e) => {
421
+ const ids = tabs.map((t) => t.id);
422
+ const currentIdx = ids.indexOf(active);
423
+ if (currentIdx === -1) return;
424
+ let nextIdx = null;
425
+ if (e.key === "ArrowRight") nextIdx = (currentIdx + 1) % ids.length;
426
+ else if (e.key === "ArrowLeft") nextIdx = (currentIdx - 1 + ids.length) % ids.length;
427
+ else if (e.key === "Home") nextIdx = 0;
428
+ else if (e.key === "End") nextIdx = ids.length - 1;
429
+ if (nextIdx === null) return;
430
+ e.preventDefault();
431
+ const nextId = ids[nextIdx];
432
+ select(nextId);
433
+ tabRefs.current[nextId]?.focus();
434
+ };
418
435
  return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: cn("ods-auth-tabs", className), children: [
419
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "ods-auth-tabs__list", role: "tablist", children: tabs.map((t) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
420
- "button",
436
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "ods-auth-tabs__list", role: "tablist", children: tabs.map((t) => {
437
+ const isActive2 = t.id === active;
438
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
439
+ "button",
440
+ {
441
+ ref: (el) => {
442
+ tabRefs.current[t.id] = el;
443
+ },
444
+ type: "button",
445
+ role: "tab",
446
+ id: `${scopeId}-tab-${t.id}`,
447
+ "aria-selected": isActive2,
448
+ "aria-controls": `${scopeId}-panel-${t.id}`,
449
+ tabIndex: isActive2 ? 0 : -1,
450
+ className: cn("ods-auth-tabs__tab", isActive2 && "ods-auth-tabs__tab--active"),
451
+ onClick: () => select(t.id),
452
+ onKeyDown: handleKeyDown,
453
+ children: [
454
+ t.icon && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "ods-auth-tabs__icon", children: t.icon }),
455
+ /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "ods-auth-tabs__label", children: t.label }),
456
+ t.description && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "ods-auth-tabs__desc", children: t.description })
457
+ ]
458
+ },
459
+ t.id
460
+ );
461
+ }) }),
462
+ activeTab && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
463
+ "div",
421
464
  {
422
- type: "button",
423
- role: "tab",
424
- "aria-selected": t.id === active,
425
- className: cn("ods-auth-tabs__tab", t.id === active && "ods-auth-tabs__tab--active"),
426
- onClick: () => select(t.id),
427
- children: [
428
- t.icon && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "ods-auth-tabs__icon", children: t.icon }),
429
- /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "ods-auth-tabs__label", children: t.label }),
430
- t.description && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("span", { className: "ods-auth-tabs__desc", children: t.description })
431
- ]
432
- },
433
- t.id
434
- )) }),
435
- activeTab && /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "ods-auth-tabs__panel", children: activeTab.content })
465
+ role: "tabpanel",
466
+ id: `${scopeId}-panel-${activeTab.id}`,
467
+ "aria-labelledby": `${scopeId}-tab-${activeTab.id}`,
468
+ tabIndex: 0,
469
+ className: "ods-auth-tabs__panel",
470
+ children: activeTab.content
471
+ }
472
+ )
436
473
  ] });
437
474
  }
438
475
  function AuthBadge({ tone = "neutral", children, className }) {
@@ -6488,9 +6525,37 @@ function MenuPopup({
6488
6525
  menuItems,
6489
6526
  triggerRef,
6490
6527
  align,
6491
- className
6528
+ className,
6529
+ closeOnOutsideClick,
6530
+ closeOnEscape
6492
6531
  }) {
6493
6532
  const menuRef = (0, import_react31.useRef)(null);
6533
+ (0, import_react31.useEffect)(() => {
6534
+ if (!state.isOpen || !closeOnOutsideClick) return;
6535
+ const handler = (e) => {
6536
+ const target = e.target;
6537
+ if (!target) return;
6538
+ const insideMenu = menuRef.current?.contains(target);
6539
+ const insideTrigger = triggerRef.current?.contains(target);
6540
+ if (!insideMenu && !insideTrigger) {
6541
+ state.close();
6542
+ }
6543
+ };
6544
+ document.addEventListener("mousedown", handler, true);
6545
+ return () => document.removeEventListener("mousedown", handler, true);
6546
+ }, [state.isOpen, closeOnOutsideClick]);
6547
+ (0, import_react31.useEffect)(() => {
6548
+ if (!state.isOpen || !closeOnEscape) return;
6549
+ const handler = (e) => {
6550
+ if (e.key === "Escape") {
6551
+ e.stopPropagation();
6552
+ state.close();
6553
+ triggerRef.current?.focus();
6554
+ }
6555
+ };
6556
+ document.addEventListener("keydown", handler);
6557
+ return () => document.removeEventListener("keydown", handler);
6558
+ }, [state.isOpen, closeOnEscape]);
6494
6559
  const nonSepItems = menuItems.filter((i) => !i.separator);
6495
6560
  const children = nonSepItems.map((item, idx) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)($05678f3aee5e7d1a$export$6d08773d2e66f8f2, { textValue: item.label, children: item.label }, idx));
6496
6561
  const treeState = $6b915bde6cd300dd$export$728d6ba534403756({
@@ -6570,6 +6635,8 @@ function DropdownMenu({
6570
6635
  align = "start",
6571
6636
  className,
6572
6637
  triggerClassName,
6638
+ closeOnOutsideClick = true,
6639
+ closeOnEscape = true,
6573
6640
  "aria-label": ariaLabel,
6574
6641
  "aria-labelledby": ariaLabelledby
6575
6642
  }) {
@@ -6604,7 +6671,9 @@ function DropdownMenu({
6604
6671
  menuItems: items,
6605
6672
  triggerRef,
6606
6673
  align,
6607
- className
6674
+ className,
6675
+ closeOnOutsideClick,
6676
+ closeOnEscape
6608
6677
  }
6609
6678
  )
6610
6679
  ] });
@@ -11460,8 +11529,9 @@ function RailItem({
11460
11529
  tooltipDelay,
11461
11530
  suppressTooltip
11462
11531
  }) {
11463
- const [tipOpen, setTipOpen] = (0, import_react53.useState)(false);
11532
+ const [open, setOpen] = (0, import_react53.useState)(false);
11464
11533
  const timerRef = (0, import_react53.useRef)(null);
11534
+ const hasChildren = !!(item.children && item.children.length > 0);
11465
11535
  const clear = () => {
11466
11536
  if (timerRef.current) {
11467
11537
  clearTimeout(timerRef.current);
@@ -11472,11 +11542,11 @@ function RailItem({
11472
11542
  const show = () => {
11473
11543
  if (suppressTooltip) return;
11474
11544
  clear();
11475
- timerRef.current = setTimeout(() => setTipOpen(true), tooltipDelay);
11545
+ timerRef.current = setTimeout(() => setOpen(true), tooltipDelay);
11476
11546
  };
11477
11547
  const hide = () => {
11478
11548
  clear();
11479
- setTipOpen(false);
11549
+ setOpen(false);
11480
11550
  };
11481
11551
  const Comp = item.href ? "a" : "button";
11482
11552
  const labelText = typeof item.label === "string" ? item.label : void 0;
@@ -11495,13 +11565,20 @@ function RailItem({
11495
11565
  type: item.href ? void 0 : "button",
11496
11566
  href: item.href,
11497
11567
  onClick: item.onClick,
11498
- className: cn("ods-sidebar__rail-item", item.active && "ods-sidebar__rail-item--active"),
11568
+ className: cn(
11569
+ "ods-sidebar__rail-item",
11570
+ hasChildren && "ods-sidebar__rail-item--parent",
11571
+ item.active && "ods-sidebar__rail-item--active"
11572
+ ),
11499
11573
  "aria-current": item.active ? "page" : void 0,
11500
11574
  "aria-label": labelText,
11575
+ "aria-haspopup": hasChildren ? "menu" : void 0,
11576
+ "aria-expanded": hasChildren ? open : void 0,
11501
11577
  children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__rail-icon", children: item.icon })
11502
11578
  }
11503
11579
  ),
11504
- tipOpen && labelText && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ods-sidebar__rail-tooltip", role: "tooltip", children: [
11580
+ open && labelText && hasChildren && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(RailFlyout, { title: labelText, items: item.children ?? [] }),
11581
+ open && labelText && !hasChildren && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ods-sidebar__rail-tooltip", role: "tooltip", children: [
11505
11582
  /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__rail-tooltip-label", children: labelText }),
11506
11583
  item.shortcut && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("kbd", { className: "ods-sidebar__rail-kbd", children: item.shortcut })
11507
11584
  ] })
@@ -11509,6 +11586,34 @@ function RailItem({
11509
11586
  }
11510
11587
  );
11511
11588
  }
11589
+ function RailFlyout({ title, items }) {
11590
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ods-sidebar__rail-flyout", role: "menu", children: [
11591
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "ods-sidebar__rail-flyout-header", children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__rail-flyout-title", children: title }) }),
11592
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("ul", { className: "ods-sidebar__rail-flyout-list", children: items.map((child) => {
11593
+ const ChildComp = child.href ? "a" : "button";
11594
+ return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
11595
+ ChildComp,
11596
+ {
11597
+ type: child.href ? void 0 : "button",
11598
+ href: child.href,
11599
+ onClick: child.onClick,
11600
+ role: "menuitem",
11601
+ className: cn(
11602
+ "ods-sidebar__rail-flyout-item",
11603
+ child.active && "ods-sidebar__rail-flyout-item--active"
11604
+ ),
11605
+ "aria-current": child.active ? "page" : void 0,
11606
+ children: [
11607
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__rail-flyout-icon", children: child.icon }),
11608
+ /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__rail-flyout-label", children: child.label }),
11609
+ child.tag && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__rail-flyout-tag", children: child.tag }),
11610
+ child.badge && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__rail-flyout-badge", children: child.badge })
11611
+ ]
11612
+ }
11613
+ ) }, child.id);
11614
+ }) })
11615
+ ] });
11616
+ }
11512
11617
  function ExpandedLayout({
11513
11618
  logo,
11514
11619
  brand,