@octaviaflow/core 3.0.8 → 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.
@@ -7,6 +7,19 @@ export interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement
7
7
  rightIcon?: ReactNode;
8
8
  fullWidth?: boolean;
9
9
  children?: ReactNode;
10
+ /**
11
+ * Override the cursor shown on hover. When omitted, the cursor auto-resolves:
12
+ * - `not-allowed` when disabled (CSS handles this — see Button.module.scss)
13
+ * - `progress` when loading (request in flight)
14
+ * - `pointer` when the button has an action (onClick, type="submit",
15
+ * or type="reset"). Anchors (href) get pointer too.
16
+ * - `default` otherwise (decorative / placeholder buttons)
17
+ * Pass an explicit value (e.g. `"text"`, `"grab"`) to override the
18
+ * auto-resolve for the specific story / use case.
19
+ */
20
+ cursor?: ButtonHTMLAttributes<HTMLButtonElement>["style"] extends infer S ? S extends {
21
+ cursor?: infer C;
22
+ } ? C : string : string;
10
23
  }
11
- export declare function Button({ variant, size, loading, disabled, leftIcon, rightIcon, fullWidth, className, children, type, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
24
+ export declare function Button({ variant, size, loading, disabled, leftIcon, rightIcon, fullWidth, className, children, type, cursor, style, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
12
25
  //# sourceMappingURL=Button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/Button/Button.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAC;AAK1E,MAAM,WAAW,WACf,SAAQ,IAAI,CACV,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,QAAQ,GAAG,aAAa,GAAG,WAAW,GAAG,kBAAkB,CAC5D;IACD,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAChE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,MAAM,CAAC,EACrB,OAAmB,EACnB,IAAW,EACX,OAAe,EACf,QAAgB,EAChB,QAAQ,EACR,SAAS,EACT,SAAiB,EACjB,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,GAAG,KAAK,EACT,EAAE,WAAW,2CA2Gb"}
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/Button/Button.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAU,MAAM,OAAO,CAAC;AAK1E,MAAM,WAAW,WACf,SAAQ,IAAI,CACV,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,QAAQ,GAAG,aAAa,GAAG,WAAW,GAAG,kBAAkB,CAC5D;IACD,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAChE,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;;;;;OASG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,SAAS,MAAM,CAAC,GACrE,CAAC,SAAS;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAA;KAAE,GAC5B,CAAC,GACD,MAAM,GACR,MAAM,CAAC;CACZ;AAED,wBAAgB,MAAM,CAAC,EACrB,OAAmB,EACnB,IAAW,EACX,OAAe,EACf,QAAgB,EAChB,QAAQ,EACR,SAAS,EACT,SAAiB,EACjB,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,KAAK,EACL,GAAG,KAAK,EACT,EAAE,WAAW,2CAwIb"}
@@ -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
@@ -815,10 +815,14 @@ function Button({
815
815
  className,
816
816
  children,
817
817
  type,
818
+ cursor,
819
+ style,
818
820
  ...props
819
821
  }) {
820
822
  const ref = (0, import_react4.useRef)(null);
821
823
  const isDisabled = disabled || loading;
824
+ const hasAction = Boolean(props.onClick) || type === "submit" || type === "reset" || Boolean(props.href);
825
+ const resolvedCursor = cursor ?? (disabled ? "not-allowed" : loading ? "progress" : hasAction ? "pointer" : "default");
822
826
  const resolvedType = type ?? "button";
823
827
  const hasVisibleText = typeof children === "string" ? children.trim().length > 0 : Boolean(children);
824
828
  const needsAriaName = !hasVisibleText;
@@ -863,6 +867,7 @@ function Button({
863
867
  fullWidth && "ods-btn--full",
864
868
  className
865
869
  ),
870
+ style: { cursor: resolvedCursor, ...style },
866
871
  "data-loading": loading || void 0,
867
872
  whileTap: isDisabled ? void 0 : { scale: 0.97 },
868
873
  transition: { duration: 0.1 },
@@ -6564,6 +6569,7 @@ function DropdownMenu({
6564
6569
  items,
6565
6570
  align = "start",
6566
6571
  className,
6572
+ triggerClassName,
6567
6573
  "aria-label": ariaLabel,
6568
6574
  "aria-labelledby": ariaLabelledby
6569
6575
  }) {
@@ -6582,7 +6588,15 @@ function DropdownMenu({
6582
6588
  );
6583
6589
  const { onDrag, onDragStart, onDragEnd, onAnimationStart, ...safeTriggerProps } = buttonProps;
6584
6590
  return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_jsx_runtime29.Fragment, { children: [
6585
- /* @__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
+ ),
6586
6600
  /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
6587
6601
  MenuPopup,
6588
6602
  {
@@ -11248,15 +11262,17 @@ function Sidebar({
11248
11262
  className
11249
11263
  }) {
11250
11264
  const allSections = sections ?? (items ? [{ items }] : []);
11251
- const [internalPinned, setInternalPinned] = (0, import_react53.useState)(() => {
11252
- 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;
11253
11268
  try {
11254
11269
  const stored = window.localStorage.getItem(pinStorageKey);
11255
- if (stored !== null) return stored === "true";
11270
+ if (stored !== null && stored !== String(internalPinned)) {
11271
+ setInternalPinned(stored === "true");
11272
+ }
11256
11273
  } catch {
11257
11274
  }
11258
- return defaultPinned;
11259
- });
11275
+ }, []);
11260
11276
  const pinned = pinnedProp ?? internalPinned;
11261
11277
  const setPinned = (0, import_react53.useCallback)(
11262
11278
  (p) => {
@@ -11294,6 +11310,17 @@ function Sidebar({
11294
11310
  const autoMode = variant === "auto";
11295
11311
  const showAsRail = autoMode ? !pinned : variant === "rail";
11296
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]);
11297
11324
  return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
11298
11325
  "nav",
11299
11326
  {
@@ -11399,17 +11426,34 @@ function RailLayout({
11399
11426
  },
11400
11427
  item.id
11401
11428
  )) }),
11402
- user && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
11403
- "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,
11404
11438
  {
11405
- type: "button",
11406
- className: "ods-sidebar__user-rail",
11407
- onClick: user.onClick,
11408
- "aria-label": typeof user.name === "string" ? user.name : "User",
11409
- 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"
11410
11444
  }
11411
- )
11412
- ] });
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
+ );
11413
11457
  }
11414
11458
  function RailItem({
11415
11459
  item,
@@ -11528,18 +11572,7 @@ function ExpandedLayout({
11528
11572
  ] }, section.id ?? sIdx)) }),
11529
11573
  (footerItems || user) && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "ods-sidebar__footer", children: [
11530
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)) }),
11531
- user && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("button", { type: "button", className: "ods-sidebar__user-card", onClick: user.onClick, children: [
11532
- /* @__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() : "?") }) }),
11533
- /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("span", { className: "ods-sidebar__user-info", children: [
11534
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__user-name", children: user.name }),
11535
- user.email && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: "ods-sidebar__user-email", children: user.email })
11536
- ] }),
11537
- /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: [
11538
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("circle", { cx: "8", cy: "3", r: "1.3", fill: "currentColor" }),
11539
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("circle", { cx: "8", cy: "8", r: "1.3", fill: "currentColor" }),
11540
- /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("circle", { cx: "8", cy: "13", r: "1.3", fill: "currentColor" })
11541
- ] })
11542
- ] })
11575
+ user && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SidebarUserCard, { user })
11543
11576
  ] })
11544
11577
  ] });
11545
11578
  }
@@ -11629,6 +11662,34 @@ function ExpandedItem({ item, level }) {
11629
11662
  }
11630
11663
  );
11631
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
+ }
11632
11693
  function hasActiveDescendant(item) {
11633
11694
  if (!item.children) return false;
11634
11695
  for (const c of item.children) {