@aviala-design/spiral 2.3.1 → 2.4.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.
package/dist/index.d.cts CHANGED
@@ -1683,7 +1683,7 @@ declare const ListDivider: react.ForwardRefExoticComponent<ListDividerProps & re
1683
1683
  type ListSeparatorProps = HTMLAttributes<HTMLHRElement>;
1684
1684
  /** Horizontal separator between list groups */
1685
1685
  declare const ListSeparator: react.ForwardRefExoticComponent<ListSeparatorProps & react.RefAttributes<HTMLHRElement>>;
1686
- type ListItemProps = ComponentPropsWithoutRef<"div"> & {
1686
+ type ListItemSharedProps = {
1687
1687
  /** Figma `Type` variant */
1688
1688
  itemType?: ListItemType;
1689
1689
  /** Figma `left icon setting` variant */
@@ -1704,42 +1704,40 @@ type ListItemProps = ComponentPropsWithoutRef<"div"> & {
1704
1704
  select?: ReactNode;
1705
1705
  /** Trailing switch props for `switch` type */
1706
1706
  switchProps?: Omit<SwitchProps, "size">;
1707
- /** Fully custom trailing region — overrides type presets */
1707
+ /**
1708
+ * Fully custom trailing region — overrides type presets.
1709
+ * Pass `null` to hide trailing actions + divider (same as `showTrailing={false}`).
1710
+ * For `action` type, the chevron is still shown unless `showChevron={false}`.
1711
+ */
1708
1712
  trailing?: ReactNode;
1713
+ /**
1714
+ * When false, hide trailing actions and the vertical divider.
1715
+ * `action` type still shows the chevron unless `showChevron={false}`.
1716
+ * Default true.
1717
+ */
1718
+ showTrailing?: boolean;
1719
+ /**
1720
+ * Show the trailing chevron for `action` type. Default true when `itemType="action"`.
1721
+ */
1722
+ showChevron?: boolean;
1723
+ /**
1724
+ * Show the top hairline on the content row (between items).
1725
+ * Default: auto — hidden for the first child in a `ListGroup`, shown otherwise.
1726
+ * Set explicitly to force show/hide.
1727
+ */
1728
+ showTopDivider?: boolean;
1709
1729
  selected?: boolean;
1710
1730
  disabled?: boolean;
1711
- /** Enables hover highlight (auto when `onClick` is set) */
1731
+ /** Enables hover highlight (auto when `onClick` / `href` is set) */
1712
1732
  interactive?: boolean;
1733
+ /** Render as a link — navigates when the row is activated */
1734
+ href?: string;
1735
+ target?: ComponentPropsWithoutRef<"a">["target"];
1736
+ rel?: string;
1713
1737
  };
1738
+ type ListItemProps = Omit<ComponentPropsWithoutRef<"div">, "title"> & ListItemSharedProps;
1714
1739
  /** Figma Structure Navigation → List item */
1715
- declare const ListItem: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
1716
- /** Figma `Type` variant */
1717
- itemType?: ListItemType;
1718
- /** Figma `left icon setting` variant */
1719
- leading?: ListItemLeading;
1720
- /** Leading icon node — defaults to GeneralSetting */
1721
- icon?: ReactNode;
1722
- /** Primary line (Typeface text) */
1723
- title: ReactNode;
1724
- /** Secondary line (Typeface caption) */
1725
- subtitle?: ReactNode;
1726
- /** Primary trailing button label */
1727
- actionLabel?: ReactNode;
1728
- /** Override primary trailing button */
1729
- action?: ReactNode;
1730
- /** Secondary icon-only button for `action` type */
1731
- secondaryAction?: ReactNode;
1732
- /** Trailing select slot for `select` type */
1733
- select?: ReactNode;
1734
- /** Trailing switch props for `switch` type */
1735
- switchProps?: Omit<SwitchProps, "size">;
1736
- /** Fully custom trailing region — overrides type presets */
1737
- trailing?: ReactNode;
1738
- selected?: boolean;
1739
- disabled?: boolean;
1740
- /** Enables hover highlight (auto when `onClick` is set) */
1741
- interactive?: boolean;
1742
- } & react.RefAttributes<HTMLDivElement>>;
1740
+ declare const ListItem: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "title"> & ListItemSharedProps & react.RefAttributes<HTMLDivElement>>;
1743
1741
 
1744
1742
  /** Figma Navigation `Background` variant (624:61777) */
1745
1743
  type NavigationBackground = "none" | "default";
package/dist/index.d.ts CHANGED
@@ -1683,7 +1683,7 @@ declare const ListDivider: react.ForwardRefExoticComponent<ListDividerProps & re
1683
1683
  type ListSeparatorProps = HTMLAttributes<HTMLHRElement>;
1684
1684
  /** Horizontal separator between list groups */
1685
1685
  declare const ListSeparator: react.ForwardRefExoticComponent<ListSeparatorProps & react.RefAttributes<HTMLHRElement>>;
1686
- type ListItemProps = ComponentPropsWithoutRef<"div"> & {
1686
+ type ListItemSharedProps = {
1687
1687
  /** Figma `Type` variant */
1688
1688
  itemType?: ListItemType;
1689
1689
  /** Figma `left icon setting` variant */
@@ -1704,42 +1704,40 @@ type ListItemProps = ComponentPropsWithoutRef<"div"> & {
1704
1704
  select?: ReactNode;
1705
1705
  /** Trailing switch props for `switch` type */
1706
1706
  switchProps?: Omit<SwitchProps, "size">;
1707
- /** Fully custom trailing region — overrides type presets */
1707
+ /**
1708
+ * Fully custom trailing region — overrides type presets.
1709
+ * Pass `null` to hide trailing actions + divider (same as `showTrailing={false}`).
1710
+ * For `action` type, the chevron is still shown unless `showChevron={false}`.
1711
+ */
1708
1712
  trailing?: ReactNode;
1713
+ /**
1714
+ * When false, hide trailing actions and the vertical divider.
1715
+ * `action` type still shows the chevron unless `showChevron={false}`.
1716
+ * Default true.
1717
+ */
1718
+ showTrailing?: boolean;
1719
+ /**
1720
+ * Show the trailing chevron for `action` type. Default true when `itemType="action"`.
1721
+ */
1722
+ showChevron?: boolean;
1723
+ /**
1724
+ * Show the top hairline on the content row (between items).
1725
+ * Default: auto — hidden for the first child in a `ListGroup`, shown otherwise.
1726
+ * Set explicitly to force show/hide.
1727
+ */
1728
+ showTopDivider?: boolean;
1709
1729
  selected?: boolean;
1710
1730
  disabled?: boolean;
1711
- /** Enables hover highlight (auto when `onClick` is set) */
1731
+ /** Enables hover highlight (auto when `onClick` / `href` is set) */
1712
1732
  interactive?: boolean;
1733
+ /** Render as a link — navigates when the row is activated */
1734
+ href?: string;
1735
+ target?: ComponentPropsWithoutRef<"a">["target"];
1736
+ rel?: string;
1713
1737
  };
1738
+ type ListItemProps = Omit<ComponentPropsWithoutRef<"div">, "title"> & ListItemSharedProps;
1714
1739
  /** Figma Structure Navigation → List item */
1715
- declare const ListItem: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
1716
- /** Figma `Type` variant */
1717
- itemType?: ListItemType;
1718
- /** Figma `left icon setting` variant */
1719
- leading?: ListItemLeading;
1720
- /** Leading icon node — defaults to GeneralSetting */
1721
- icon?: ReactNode;
1722
- /** Primary line (Typeface text) */
1723
- title: ReactNode;
1724
- /** Secondary line (Typeface caption) */
1725
- subtitle?: ReactNode;
1726
- /** Primary trailing button label */
1727
- actionLabel?: ReactNode;
1728
- /** Override primary trailing button */
1729
- action?: ReactNode;
1730
- /** Secondary icon-only button for `action` type */
1731
- secondaryAction?: ReactNode;
1732
- /** Trailing select slot for `select` type */
1733
- select?: ReactNode;
1734
- /** Trailing switch props for `switch` type */
1735
- switchProps?: Omit<SwitchProps, "size">;
1736
- /** Fully custom trailing region — overrides type presets */
1737
- trailing?: ReactNode;
1738
- selected?: boolean;
1739
- disabled?: boolean;
1740
- /** Enables hover highlight (auto when `onClick` is set) */
1741
- interactive?: boolean;
1742
- } & react.RefAttributes<HTMLDivElement>>;
1740
+ declare const ListItem: react.ForwardRefExoticComponent<Omit<Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "title"> & ListItemSharedProps & react.RefAttributes<HTMLDivElement>>;
1743
1741
 
1744
1742
  /** Figma Navigation `Background` variant (624:61777) */
1745
1743
  type NavigationBackground = "none" | "default";
package/dist/index.js CHANGED
@@ -8133,7 +8133,7 @@ import {
8133
8133
  forwardRef as forwardRef34,
8134
8134
  isValidElement as isValidElement16
8135
8135
  } from "react";
8136
- import { jsx as jsx49, jsxs as jsxs38 } from "react/jsx-runtime";
8136
+ import { Fragment as Fragment7, jsx as jsx49, jsxs as jsxs38 } from "react/jsx-runtime";
8137
8137
  var List = forwardRef34(
8138
8138
  ({ className, title, children, ...props }, ref) => /* @__PURE__ */ jsxs38("div", { ref, className: cn("aviala-list", className), ...props, children: [
8139
8139
  title != null ? /* @__PURE__ */ jsx49(ListTitle, { children: title }) : null,
@@ -8207,15 +8207,27 @@ var ListItem = forwardRef34(
8207
8207
  select,
8208
8208
  switchProps,
8209
8209
  trailing,
8210
+ showTrailing = true,
8211
+ showChevron,
8212
+ showTopDivider,
8210
8213
  selected = false,
8211
8214
  disabled = false,
8212
8215
  interactive,
8216
+ href,
8217
+ target,
8218
+ rel,
8213
8219
  onClick,
8214
8220
  ...props
8215
8221
  }, ref) => {
8216
- const isInteractive = interactive ?? onClick != null;
8222
+ const isInteractive = interactive ?? (onClick != null || href != null);
8223
+ const chevronVisible = showChevron ?? itemType === "action";
8217
8224
  const primaryAction = action ?? /* @__PURE__ */ jsx49(Button, { mode: "primary", size: "regular", leftIcon: /* @__PURE__ */ jsx49(GeneralSetting, { "aria-hidden": true }), children: actionLabel });
8225
+ const chevron = chevronVisible ? /* @__PURE__ */ jsx49("span", { className: "aviala-list-item__chevron", "aria-hidden": true, children: /* @__PURE__ */ jsx49(DirectionArrowRightLight2, { width: 18, height: 18 }) }) : null;
8218
8226
  const renderTrailing = () => {
8227
+ const hideActions = !showTrailing || trailing === null;
8228
+ if (hideActions) {
8229
+ return chevron && itemType === "action" ? /* @__PURE__ */ jsx49("div", { className: "aviala-list-item__more", children: chevron }) : null;
8230
+ }
8219
8231
  if (trailing !== void 0) return trailing;
8220
8232
  switch (itemType) {
8221
8233
  case "action":
@@ -8234,7 +8246,7 @@ var ListItem = forwardRef34(
8234
8246
  )
8235
8247
  ] }),
8236
8248
  /* @__PURE__ */ jsx49(ListDivider, {}),
8237
- /* @__PURE__ */ jsx49("span", { className: "aviala-list-item__chevron", "aria-hidden": true, children: /* @__PURE__ */ jsx49(DirectionArrowRightLight2, { width: 18, height: 18 }) })
8249
+ chevron
8238
8250
  ] });
8239
8251
  case "switch":
8240
8252
  return /* @__PURE__ */ jsxs38("div", { className: "aviala-list-item__trailing", children: [
@@ -8251,26 +8263,50 @@ var ListItem = forwardRef34(
8251
8263
  ] });
8252
8264
  }
8253
8265
  };
8254
- return /* @__PURE__ */ jsxs38(
8266
+ const sharedClassName = cn("aviala-list-item", className);
8267
+ const sharedData = {
8268
+ "data-leading": leading,
8269
+ "data-type": itemType,
8270
+ "data-selected": selected ? "true" : void 0,
8271
+ "data-disabled": disabled ? "true" : void 0,
8272
+ "data-interactive": isInteractive ? "true" : void 0,
8273
+ "data-top-divider": showTopDivider === void 0 ? void 0 : showTopDivider ? "true" : "false"
8274
+ };
8275
+ const trailingNode = renderTrailing();
8276
+ const body = /* @__PURE__ */ jsxs38(Fragment7, { children: [
8277
+ renderLeadingIcon(icon, leading),
8278
+ /* @__PURE__ */ jsx49("div", { className: "aviala-list-item__body", children: /* @__PURE__ */ jsxs38("div", { className: "aviala-list-item__content", children: [
8279
+ /* @__PURE__ */ jsx49("div", { className: "aviala-list-item__head", children: /* @__PURE__ */ jsx49(Typeface, { content: "textCaption", primary: title, secondary: subtitle }) }),
8280
+ trailingNode
8281
+ ] }) })
8282
+ ] });
8283
+ if (href && !disabled) {
8284
+ return /* @__PURE__ */ jsx49(
8285
+ "a",
8286
+ {
8287
+ ref,
8288
+ role: "listitem",
8289
+ className: sharedClassName,
8290
+ href,
8291
+ target,
8292
+ rel,
8293
+ onClick,
8294
+ ...sharedData,
8295
+ ...props,
8296
+ children: body
8297
+ }
8298
+ );
8299
+ }
8300
+ return /* @__PURE__ */ jsx49(
8255
8301
  "div",
8256
8302
  {
8257
8303
  ref,
8258
8304
  role: "listitem",
8259
- className: cn("aviala-list-item", className),
8260
- "data-leading": leading,
8261
- "data-type": itemType,
8262
- "data-selected": selected ? "true" : void 0,
8263
- "data-disabled": disabled ? "true" : void 0,
8264
- "data-interactive": isInteractive ? "true" : void 0,
8305
+ className: sharedClassName,
8265
8306
  onClick: disabled ? void 0 : onClick,
8307
+ ...sharedData,
8266
8308
  ...props,
8267
- children: [
8268
- renderLeadingIcon(icon, leading),
8269
- /* @__PURE__ */ jsx49("div", { className: "aviala-list-item__body", children: /* @__PURE__ */ jsxs38("div", { className: "aviala-list-item__content", children: [
8270
- /* @__PURE__ */ jsx49("div", { className: "aviala-list-item__head", children: /* @__PURE__ */ jsx49(Typeface, { content: "textCaption", primary: title, secondary: subtitle }) }),
8271
- renderTrailing()
8272
- ] }) })
8273
- ]
8309
+ children: body
8274
8310
  }
8275
8311
  );
8276
8312
  }
@@ -8291,7 +8327,7 @@ import {
8291
8327
  useRef as useRef12,
8292
8328
  useState as useState16
8293
8329
  } from "react";
8294
- import { Fragment as Fragment7, jsx as jsx50, jsxs as jsxs39 } from "react/jsx-runtime";
8330
+ import { Fragment as Fragment8, jsx as jsx50, jsxs as jsxs39 } from "react/jsx-runtime";
8295
8331
  function navigationItemButtonMode(active) {
8296
8332
  return active ? "second" : "noBackgroundCustom";
8297
8333
  }
@@ -8837,7 +8873,7 @@ var NavigationItem = forwardRef35(
8837
8873
  const Comp = asChild ? Slot5 : "a";
8838
8874
  const isActive = active ?? ariaCurrent === "page";
8839
8875
  const mode = navigationItemButtonMode(isActive);
8840
- const controlContent = /* @__PURE__ */ jsxs39(Fragment7, { children: [
8876
+ const controlContent = /* @__PURE__ */ jsxs39(Fragment8, { children: [
8841
8877
  renderItemIcon3(leftIcon),
8842
8878
  /* @__PURE__ */ jsx50(
8843
8879
  Typography,
@@ -9608,7 +9644,7 @@ import {
9608
9644
  useContext as useContext9,
9609
9645
  useState as useState18
9610
9646
  } from "react";
9611
- import { Fragment as Fragment8, jsx as jsx54, jsxs as jsxs43 } from "react/jsx-runtime";
9647
+ import { Fragment as Fragment9, jsx as jsx54, jsxs as jsxs43 } from "react/jsx-runtime";
9612
9648
  var BreadcrumbSizeContext = createContext9("default");
9613
9649
  function breadcrumbTypeLevel(size) {
9614
9650
  return size === "small" ? "caption" : "text";
@@ -9644,7 +9680,7 @@ Breadcrumb.displayName = "Breadcrumb";
9644
9680
  var BreadcrumbItem = forwardRef38(
9645
9681
  ({ className, href, current = false, icon, onClick, children, ...props }, ref) => {
9646
9682
  const size = useContext9(BreadcrumbSizeContext);
9647
- const label = /* @__PURE__ */ jsxs43(Fragment8, { children: [
9683
+ const label = /* @__PURE__ */ jsxs43(Fragment9, { children: [
9648
9684
  icon ? /* @__PURE__ */ jsx54("span", { className: "aviala-breadcrumb-item__icon", children: icon }) : null,
9649
9685
  children != null ? /* @__PURE__ */ jsx54(
9650
9686
  Typography,
@@ -9721,7 +9757,7 @@ var BreadcrumbEllipsisItem = forwardRef38(
9721
9757
  children,
9722
9758
  ...props
9723
9759
  }, ref) => {
9724
- const content = /* @__PURE__ */ jsxs43(Fragment8, { children: [
9760
+ const content = /* @__PURE__ */ jsxs43(Fragment9, { children: [
9725
9761
  /* @__PURE__ */ jsx54(Typography, { level: "text", as: "span", className: "aviala-breadcrumb-ellipsis-item__label", children }),
9726
9762
  showChevron ? /* @__PURE__ */ jsx54("span", { className: "aviala-breadcrumb-ellipsis-item__chevron", "aria-hidden": true, children: /* @__PURE__ */ jsx54(DirectionArrowRightLight3, { width: 14, height: 14, thickness: "Light" }) }) : null
9727
9763
  ] });
@@ -10198,7 +10234,7 @@ import {
10198
10234
  forwardRef as forwardRef42,
10199
10235
  isValidElement as isValidElement17
10200
10236
  } from "react";
10201
- import { Fragment as Fragment9, jsx as jsx58, jsxs as jsxs47 } from "react/jsx-runtime";
10237
+ import { Fragment as Fragment10, jsx as jsx58, jsxs as jsxs47 } from "react/jsx-runtime";
10202
10238
  var Card = forwardRef42(
10203
10239
  ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx58("div", { ref, className: cn("aviala-card", className), ...props, children })
10204
10240
  );
@@ -10304,7 +10340,7 @@ var CardBottom = forwardRef42(
10304
10340
  if (children != null) return children;
10305
10341
  switch (slotType) {
10306
10342
  case "switch":
10307
- return /* @__PURE__ */ jsxs47(Fragment9, { children: [
10343
+ return /* @__PURE__ */ jsxs47(Fragment10, { children: [
10308
10344
  primaryAction,
10309
10345
  /* @__PURE__ */ jsx58("span", { className: "aviala-card__divider", "aria-hidden": true }),
10310
10346
  /* @__PURE__ */ jsx58(Switch, { ...switchProps })
@@ -10313,7 +10349,7 @@ var CardBottom = forwardRef42(
10313
10349
  return select;
10314
10350
  case "action":
10315
10351
  default:
10316
- return /* @__PURE__ */ jsxs47(Fragment9, { children: [
10352
+ return /* @__PURE__ */ jsxs47(Fragment10, { children: [
10317
10353
  primaryAction,
10318
10354
  secondaryAction ?? /* @__PURE__ */ jsx58(
10319
10355
  Button,
@@ -10350,7 +10386,7 @@ import {
10350
10386
  forwardRef as forwardRef43,
10351
10387
  isValidElement as isValidElement18
10352
10388
  } from "react";
10353
- import { Fragment as Fragment10, jsx as jsx59, jsxs as jsxs48 } from "react/jsx-runtime";
10389
+ import { Fragment as Fragment11, jsx as jsx59, jsxs as jsxs48 } from "react/jsx-runtime";
10354
10390
  var Table = forwardRef43(
10355
10391
  ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx59(
10356
10392
  "div",
@@ -10425,12 +10461,12 @@ var TableCell = forwardRef43(
10425
10461
  case "checkbox":
10426
10462
  return /* @__PURE__ */ jsx59(Checkbox, { ...checkboxProps });
10427
10463
  case "icon+text":
10428
- return /* @__PURE__ */ jsxs48(Fragment10, { children: [
10464
+ return /* @__PURE__ */ jsxs48(Fragment11, { children: [
10429
10465
  renderCellIcon(icon),
10430
10466
  /* @__PURE__ */ jsx59("span", { className: "aviala-table-cell__text", children: /* @__PURE__ */ jsx59(Typography, { level: "text", as: "span", children: text }) })
10431
10467
  ] });
10432
10468
  case "people":
10433
- return /* @__PURE__ */ jsxs48(Fragment10, { children: [
10469
+ return /* @__PURE__ */ jsxs48(Fragment11, { children: [
10434
10470
  people ?? /* @__PURE__ */ jsx59(Avatar, { content: "text", level: "text", children: "A" }),
10435
10471
  /* @__PURE__ */ jsx59("span", { className: "aviala-table-cell__text", children: /* @__PURE__ */ jsx59(Typography, { level: "text", as: "span", children: text }) })
10436
10472
  ] });