@aviala-design/spiral 2.6.2 → 2.7.1

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
@@ -2488,10 +2488,16 @@ declare const CardBottom: react.ForwardRefExoticComponent<Omit<react.DetailedHTM
2488
2488
  trailing?: ReactNode;
2489
2489
  } & react.RefAttributes<HTMLDivElement>>;
2490
2490
 
2491
- /** Figma Components → Information Display → Table (1457:1475) */
2492
- type TableCellContent = "text" | "icon+text" | "people" | "badge" | "switch" | "action" | "checkbox";
2493
- type TableProps = HTMLAttributes<HTMLDivElement>;
2494
- declare const Table: react.ForwardRefExoticComponent<TableProps & react.RefAttributes<HTMLDivElement>>;
2491
+ /** Figma Components → Information Display → Table (953:75844 / 1457:1475) */
2492
+ type TableCellContent = "text" | "icon+text" | "icon-place+text" | "people" | "badge" | "switch" | "action" | "checkbox";
2493
+ type TableProps = HTMLAttributes<HTMLDivElement> & {
2494
+ /** Freeze header row while the table body scrolls */
2495
+ stickyHeader?: boolean;
2496
+ };
2497
+ declare const Table: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & {
2498
+ /** Freeze header row while the table body scrolls */
2499
+ stickyHeader?: boolean;
2500
+ } & react.RefAttributes<HTMLDivElement>>;
2495
2501
  type TableRowProps = HTMLAttributes<HTMLDivElement> & {
2496
2502
  header?: boolean;
2497
2503
  };
@@ -2500,30 +2506,52 @@ declare const TableRow: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivEl
2500
2506
  } & react.RefAttributes<HTMLDivElement>>;
2501
2507
  type TableHeadProps = ComponentPropsWithoutRef<"div"> & {
2502
2508
  content?: Extract<TableCellContent, "text" | "checkbox">;
2509
+ /** Header trailing button area (Figma Table Head Default) */
2510
+ actions?: ReactNode;
2511
+ /** Select-all / indeterminate / unchecked via Checkbox props */
2512
+ checkboxProps?: ComponentPropsWithoutRef<typeof Checkbox>;
2503
2513
  };
2504
2514
  declare const TableHead: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
2505
2515
  content?: Extract<TableCellContent, "text" | "checkbox">;
2516
+ /** Header trailing button area (Figma Table Head Default) */
2517
+ actions?: ReactNode;
2518
+ /** Select-all / indeterminate / unchecked via Checkbox props */
2519
+ checkboxProps?: ComponentPropsWithoutRef<typeof Checkbox>;
2506
2520
  } & react.RefAttributes<HTMLDivElement>>;
2507
2521
  type TableCellProps = ComponentPropsWithoutRef<"div"> & {
2508
2522
  content?: TableCellContent;
2509
2523
  icon?: ReactNode;
2524
+ /** Shaped icon place (Figma `icon place+text`) */
2525
+ iconPlace?: ReactNode;
2510
2526
  text?: ReactNode;
2527
+ /** Secondary caption under primary text (Figma Typeface pair) */
2528
+ caption?: ReactNode;
2511
2529
  people?: ReactNode;
2512
2530
  badge?: ReactNode;
2513
2531
  badgeLabel?: ReactNode;
2514
2532
  switchProps?: SwitchProps;
2533
+ /** Trailing button area — supported on text / icon / people / badge / action */
2515
2534
  actions?: ReactNode;
2535
+ /** Optional leading grabber control */
2536
+ grabber?: ReactNode;
2516
2537
  checkboxProps?: ComponentPropsWithoutRef<typeof Checkbox>;
2517
2538
  };
2518
2539
  declare const TableCell: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
2519
2540
  content?: TableCellContent;
2520
2541
  icon?: ReactNode;
2542
+ /** Shaped icon place (Figma `icon place+text`) */
2543
+ iconPlace?: ReactNode;
2521
2544
  text?: ReactNode;
2545
+ /** Secondary caption under primary text (Figma Typeface pair) */
2546
+ caption?: ReactNode;
2522
2547
  people?: ReactNode;
2523
2548
  badge?: ReactNode;
2524
2549
  badgeLabel?: ReactNode;
2525
2550
  switchProps?: SwitchProps;
2551
+ /** Trailing button area — supported on text / icon / people / badge / action */
2526
2552
  actions?: ReactNode;
2553
+ /** Optional leading grabber control */
2554
+ grabber?: ReactNode;
2527
2555
  checkboxProps?: ComponentPropsWithoutRef<typeof Checkbox>;
2528
2556
  } & react.RefAttributes<HTMLDivElement>>;
2529
2557
 
package/dist/index.d.ts CHANGED
@@ -2488,10 +2488,16 @@ declare const CardBottom: react.ForwardRefExoticComponent<Omit<react.DetailedHTM
2488
2488
  trailing?: ReactNode;
2489
2489
  } & react.RefAttributes<HTMLDivElement>>;
2490
2490
 
2491
- /** Figma Components → Information Display → Table (1457:1475) */
2492
- type TableCellContent = "text" | "icon+text" | "people" | "badge" | "switch" | "action" | "checkbox";
2493
- type TableProps = HTMLAttributes<HTMLDivElement>;
2494
- declare const Table: react.ForwardRefExoticComponent<TableProps & react.RefAttributes<HTMLDivElement>>;
2491
+ /** Figma Components → Information Display → Table (953:75844 / 1457:1475) */
2492
+ type TableCellContent = "text" | "icon+text" | "icon-place+text" | "people" | "badge" | "switch" | "action" | "checkbox";
2493
+ type TableProps = HTMLAttributes<HTMLDivElement> & {
2494
+ /** Freeze header row while the table body scrolls */
2495
+ stickyHeader?: boolean;
2496
+ };
2497
+ declare const Table: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivElement> & {
2498
+ /** Freeze header row while the table body scrolls */
2499
+ stickyHeader?: boolean;
2500
+ } & react.RefAttributes<HTMLDivElement>>;
2495
2501
  type TableRowProps = HTMLAttributes<HTMLDivElement> & {
2496
2502
  header?: boolean;
2497
2503
  };
@@ -2500,30 +2506,52 @@ declare const TableRow: react.ForwardRefExoticComponent<HTMLAttributes<HTMLDivEl
2500
2506
  } & react.RefAttributes<HTMLDivElement>>;
2501
2507
  type TableHeadProps = ComponentPropsWithoutRef<"div"> & {
2502
2508
  content?: Extract<TableCellContent, "text" | "checkbox">;
2509
+ /** Header trailing button area (Figma Table Head Default) */
2510
+ actions?: ReactNode;
2511
+ /** Select-all / indeterminate / unchecked via Checkbox props */
2512
+ checkboxProps?: ComponentPropsWithoutRef<typeof Checkbox>;
2503
2513
  };
2504
2514
  declare const TableHead: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
2505
2515
  content?: Extract<TableCellContent, "text" | "checkbox">;
2516
+ /** Header trailing button area (Figma Table Head Default) */
2517
+ actions?: ReactNode;
2518
+ /** Select-all / indeterminate / unchecked via Checkbox props */
2519
+ checkboxProps?: ComponentPropsWithoutRef<typeof Checkbox>;
2506
2520
  } & react.RefAttributes<HTMLDivElement>>;
2507
2521
  type TableCellProps = ComponentPropsWithoutRef<"div"> & {
2508
2522
  content?: TableCellContent;
2509
2523
  icon?: ReactNode;
2524
+ /** Shaped icon place (Figma `icon place+text`) */
2525
+ iconPlace?: ReactNode;
2510
2526
  text?: ReactNode;
2527
+ /** Secondary caption under primary text (Figma Typeface pair) */
2528
+ caption?: ReactNode;
2511
2529
  people?: ReactNode;
2512
2530
  badge?: ReactNode;
2513
2531
  badgeLabel?: ReactNode;
2514
2532
  switchProps?: SwitchProps;
2533
+ /** Trailing button area — supported on text / icon / people / badge / action */
2515
2534
  actions?: ReactNode;
2535
+ /** Optional leading grabber control */
2536
+ grabber?: ReactNode;
2516
2537
  checkboxProps?: ComponentPropsWithoutRef<typeof Checkbox>;
2517
2538
  };
2518
2539
  declare const TableCell: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
2519
2540
  content?: TableCellContent;
2520
2541
  icon?: ReactNode;
2542
+ /** Shaped icon place (Figma `icon place+text`) */
2543
+ iconPlace?: ReactNode;
2521
2544
  text?: ReactNode;
2545
+ /** Secondary caption under primary text (Figma Typeface pair) */
2546
+ caption?: ReactNode;
2522
2547
  people?: ReactNode;
2523
2548
  badge?: ReactNode;
2524
2549
  badgeLabel?: ReactNode;
2525
2550
  switchProps?: SwitchProps;
2551
+ /** Trailing button area — supported on text / icon / people / badge / action */
2526
2552
  actions?: ReactNode;
2553
+ /** Optional leading grabber control */
2554
+ grabber?: ReactNode;
2527
2555
  checkboxProps?: ComponentPropsWithoutRef<typeof Checkbox>;
2528
2556
  } & react.RefAttributes<HTMLDivElement>>;
2529
2557
 
package/dist/index.js CHANGED
@@ -2924,9 +2924,9 @@ var Progress = forwardRef13(
2924
2924
  const resolvedShape = shape ?? "bar";
2925
2925
  const displayLabel = label ?? `${Math.round(percent)}%`;
2926
2926
  const diameter = resolvedSize === "big" ? 24 : 16;
2927
- const radius = diameter / 2;
2927
+ const center = diameter / 2;
2928
2928
  const stroke = 2;
2929
- const normalizedRadius = radius - stroke;
2929
+ const normalizedRadius = center - stroke / 2;
2930
2930
  const circumference = normalizedRadius * 2 * Math.PI;
2931
2931
  const strokeDashoffset = circumference - percent / 100 * circumference;
2932
2932
  return /* @__PURE__ */ jsx17(
@@ -2972,17 +2972,17 @@ var Progress = forwardRef13(
2972
2972
  "svg",
2973
2973
  {
2974
2974
  className: "aviala-progress__ring",
2975
- width: radius * 2,
2976
- height: radius * 2,
2977
- viewBox: `0 0 ${radius * 2} ${radius * 2}`,
2975
+ width: diameter,
2976
+ height: diameter,
2977
+ viewBox: `0 0 ${diameter} ${diameter}`,
2978
2978
  "aria-hidden": true,
2979
2979
  children: [
2980
2980
  /* @__PURE__ */ jsx17(
2981
2981
  "circle",
2982
2982
  {
2983
2983
  className: "aviala-progress__ring-track",
2984
- cx: radius,
2985
- cy: radius,
2984
+ cx: center,
2985
+ cy: center,
2986
2986
  r: normalizedRadius,
2987
2987
  fill: "none",
2988
2988
  strokeWidth: stroke
@@ -2992,15 +2992,15 @@ var Progress = forwardRef13(
2992
2992
  "circle",
2993
2993
  {
2994
2994
  className: "aviala-progress__ring-fill",
2995
- cx: radius,
2996
- cy: radius,
2995
+ cx: center,
2996
+ cy: center,
2997
2997
  r: normalizedRadius,
2998
2998
  fill: "none",
2999
2999
  strokeWidth: stroke,
3000
3000
  strokeDasharray: `${circumference} ${circumference}`,
3001
3001
  strokeDashoffset,
3002
3002
  strokeLinecap: "round",
3003
- transform: `rotate(-90 ${radius} ${radius})`
3003
+ transform: `rotate(-90 ${center} ${center})`
3004
3004
  }
3005
3005
  )
3006
3006
  ]
@@ -11775,12 +11775,13 @@ import {
11775
11775
  } from "react";
11776
11776
  import { Fragment as Fragment11, jsx as jsx63, jsxs as jsxs48 } from "react/jsx-runtime";
11777
11777
  var Table = forwardRef44(
11778
- ({ className, children, ...props }, ref) => /* @__PURE__ */ jsx63(
11778
+ ({ className, stickyHeader = false, children, ...props }, ref) => /* @__PURE__ */ jsx63(
11779
11779
  "div",
11780
11780
  {
11781
11781
  ref,
11782
11782
  role: "table",
11783
11783
  className: cn("aviala-table", className),
11784
+ "data-sticky-header": stickyHeader ? "true" : void 0,
11784
11785
  ...props,
11785
11786
  children
11786
11787
  }
@@ -11801,23 +11802,9 @@ var TableRow = forwardRef44(
11801
11802
  )
11802
11803
  );
11803
11804
  TableRow.displayName = "TableRow";
11804
- var TableHead = forwardRef44(
11805
- ({ className, content = "text", children, ...props }, ref) => /* @__PURE__ */ jsx63(
11806
- "div",
11807
- {
11808
- ref,
11809
- role: "columnheader",
11810
- className: cn("aviala-table-head", className),
11811
- "data-content": content,
11812
- ...props,
11813
- children: typeof children === "string" || typeof children === "number" ? /* @__PURE__ */ jsx63(Typography, { level: "caption", as: "span", children }) : children
11814
- }
11815
- )
11816
- );
11817
- TableHead.displayName = "TableHead";
11818
- function renderCellIcon(node) {
11805
+ function renderCellIcon(node, sized = true) {
11819
11806
  if (!node) return null;
11820
- const content = isValidElement18(node) && typeof node.type !== "string" ? cloneElement13(node, {
11807
+ const content = sized && isValidElement18(node) && typeof node.type !== "string" ? cloneElement13(node, {
11821
11808
  width: 16,
11822
11809
  height: 16,
11823
11810
  className: cn(
@@ -11827,17 +11814,64 @@ function renderCellIcon(node) {
11827
11814
  }) : node;
11828
11815
  return /* @__PURE__ */ jsx63("span", { className: "aviala-table-cell__icon", children: content });
11829
11816
  }
11817
+ function renderTextBlock(text, caption) {
11818
+ return /* @__PURE__ */ jsxs48("span", { className: "aviala-table-cell__text", children: [
11819
+ /* @__PURE__ */ jsx63(Typography, { level: "text", as: "span", children: text }),
11820
+ caption != null && caption !== false ? /* @__PURE__ */ jsx63(Typography, { level: "caption", as: "span", className: "aviala-table-cell__caption", children: caption }) : null
11821
+ ] });
11822
+ }
11823
+ function renderActions(actions) {
11824
+ if (actions == null) return null;
11825
+ return /* @__PURE__ */ jsx63("div", { className: "aviala-table-cell__actions", children: actions });
11826
+ }
11827
+ function renderCellBody(main, actions) {
11828
+ return /* @__PURE__ */ jsxs48("span", { className: "aviala-table-cell__body", children: [
11829
+ /* @__PURE__ */ jsx63("span", { className: "aviala-table-cell__main", children: main }),
11830
+ renderActions(actions)
11831
+ ] });
11832
+ }
11833
+ var TableHead = forwardRef44(
11834
+ ({ className, content = "text", actions, checkboxProps, children, ...props }, ref) => {
11835
+ const renderBody = () => {
11836
+ if (content === "checkbox") {
11837
+ return children ?? /* @__PURE__ */ jsx63(Checkbox, { ...checkboxProps });
11838
+ }
11839
+ if (children != null) {
11840
+ return /* @__PURE__ */ jsxs48(Fragment11, { children: [
11841
+ /* @__PURE__ */ jsx63("span", { className: "aviala-table-cell__main", children: typeof children === "string" || typeof children === "number" ? /* @__PURE__ */ jsx63(Typography, { level: "text", as: "span", children }) : children }),
11842
+ renderActions(actions)
11843
+ ] });
11844
+ }
11845
+ return null;
11846
+ };
11847
+ return /* @__PURE__ */ jsx63(
11848
+ "div",
11849
+ {
11850
+ ref,
11851
+ role: "columnheader",
11852
+ className: cn("aviala-table-head", className),
11853
+ "data-content": content,
11854
+ ...props,
11855
+ children: renderBody()
11856
+ }
11857
+ );
11858
+ }
11859
+ );
11860
+ TableHead.displayName = "TableHead";
11830
11861
  var TableCell = forwardRef44(
11831
11862
  ({
11832
11863
  className,
11833
11864
  content = "text",
11834
11865
  icon,
11866
+ iconPlace,
11835
11867
  text,
11868
+ caption,
11836
11869
  people,
11837
11870
  badge,
11838
11871
  badgeLabel,
11839
11872
  switchProps,
11840
11873
  actions,
11874
+ grabber,
11841
11875
  checkboxProps,
11842
11876
  children,
11843
11877
  ...props
@@ -11847,25 +11881,57 @@ var TableCell = forwardRef44(
11847
11881
  switch (content) {
11848
11882
  case "checkbox":
11849
11883
  return /* @__PURE__ */ jsx63(Checkbox, { ...checkboxProps });
11884
+ case "switch":
11885
+ return /* @__PURE__ */ jsx63(Switch, { ...switchProps });
11886
+ case "action":
11887
+ return renderActions(actions);
11850
11888
  case "icon+text":
11851
11889
  return /* @__PURE__ */ jsxs48(Fragment11, { children: [
11852
- renderCellIcon(icon),
11853
- /* @__PURE__ */ jsx63("span", { className: "aviala-table-cell__text", children: /* @__PURE__ */ jsx63(Typography, { level: "text", as: "span", children: text }) })
11890
+ grabber,
11891
+ renderCellBody(
11892
+ /* @__PURE__ */ jsxs48(Fragment11, { children: [
11893
+ renderCellIcon(icon),
11894
+ renderTextBlock(text, caption)
11895
+ ] }),
11896
+ actions
11897
+ )
11898
+ ] });
11899
+ case "icon-place+text":
11900
+ return /* @__PURE__ */ jsxs48(Fragment11, { children: [
11901
+ grabber,
11902
+ renderCellBody(
11903
+ /* @__PURE__ */ jsxs48(Fragment11, { children: [
11904
+ /* @__PURE__ */ jsx63("span", { className: "aviala-table-cell__icon-place", children: iconPlace ?? renderCellIcon(icon, false) ?? /* @__PURE__ */ jsx63(Avatar, { content: "text", level: "text", lineHeightFix: false, children: "A" }) }),
11905
+ renderTextBlock(text, caption)
11906
+ ] }),
11907
+ actions
11908
+ )
11854
11909
  ] });
11855
11910
  case "people":
11856
11911
  return /* @__PURE__ */ jsxs48(Fragment11, { children: [
11857
- people ?? /* @__PURE__ */ jsx63(Avatar, { content: "text", level: "text", children: "A" }),
11858
- /* @__PURE__ */ jsx63("span", { className: "aviala-table-cell__text", children: /* @__PURE__ */ jsx63(Typography, { level: "text", as: "span", children: text }) })
11912
+ grabber,
11913
+ renderCellBody(
11914
+ /* @__PURE__ */ jsxs48(Fragment11, { children: [
11915
+ people ?? /* @__PURE__ */ jsx63(Avatar, { content: "text", level: "text", lineHeightFix: false, children: "A" }),
11916
+ renderTextBlock(text, caption)
11917
+ ] }),
11918
+ actions
11919
+ )
11859
11920
  ] });
11860
11921
  case "badge":
11861
- return badge ?? /* @__PURE__ */ jsx63(Badge, { style: "theme", level: "caption", children: badgeLabel ?? "Text" });
11862
- case "switch":
11863
- return /* @__PURE__ */ jsx63(Switch, { ...switchProps });
11864
- case "action":
11865
- return /* @__PURE__ */ jsx63("div", { className: "aviala-table-cell__actions", children: actions });
11922
+ return /* @__PURE__ */ jsxs48(Fragment11, { children: [
11923
+ grabber,
11924
+ renderCellBody(
11925
+ badge ?? /* @__PURE__ */ jsx63(Badge, { style: "theme", level: "caption", children: badgeLabel ?? "Text" }),
11926
+ actions
11927
+ )
11928
+ ] });
11866
11929
  case "text":
11867
11930
  default:
11868
- return /* @__PURE__ */ jsx63("span", { className: "aviala-table-cell__text", children: /* @__PURE__ */ jsx63(Typography, { level: "text", as: "span", children: text }) });
11931
+ return /* @__PURE__ */ jsxs48(Fragment11, { children: [
11932
+ grabber,
11933
+ renderCellBody(renderTextBlock(text, caption), actions)
11934
+ ] });
11869
11935
  }
11870
11936
  };
11871
11937
  return /* @__PURE__ */ jsx63(