@acronis-platform/ui-react 1.0.0 → 3.0.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.
Files changed (82) hide show
  1. package/dist/components/ui/accordion-container/accordion-container.js +144 -0
  2. package/dist/components/ui/accordion-container/accordion-container.js.map +1 -0
  3. package/dist/components/ui/alert/alert.js +55 -55
  4. package/dist/components/ui/alert/alert.js.map +1 -1
  5. package/dist/components/ui/avatar/avatar.js +33 -22
  6. package/dist/components/ui/avatar/avatar.js.map +1 -1
  7. package/dist/components/ui/card/card.js +150 -74
  8. package/dist/components/ui/card/card.js.map +1 -1
  9. package/dist/components/ui/card-section/card-section.js +111 -0
  10. package/dist/components/ui/card-section/card-section.js.map +1 -0
  11. package/dist/components/ui/checkbox/checkbox.js +1 -1
  12. package/dist/components/ui/checkbox/checkbox.js.map +1 -1
  13. package/dist/components/ui/data-table/data-table-bulk-actions-bar.js +38 -0
  14. package/dist/components/ui/data-table/data-table-bulk-actions-bar.js.map +1 -0
  15. package/dist/components/ui/data-table/data-table-column-header.js +23 -20
  16. package/dist/components/ui/data-table/data-table-column-header.js.map +1 -1
  17. package/dist/components/ui/data-table/data-table-expand-trigger.js +23 -15
  18. package/dist/components/ui/data-table/data-table-expand-trigger.js.map +1 -1
  19. package/dist/components/ui/data-table/data-table-pagination.js +29 -28
  20. package/dist/components/ui/data-table/data-table-pagination.js.map +1 -1
  21. package/dist/components/ui/data-table/data-table-selection.js +7 -0
  22. package/dist/components/ui/data-table/data-table-selection.js.map +1 -0
  23. package/dist/components/ui/data-table/data-table-toolbar.js +21 -23
  24. package/dist/components/ui/data-table/data-table-toolbar.js.map +1 -1
  25. package/dist/components/ui/data-table/data-table-view-options.js +12 -10
  26. package/dist/components/ui/data-table/data-table-view-options.js.map +1 -1
  27. package/dist/components/ui/data-table/data-table.js +349 -183
  28. package/dist/components/ui/data-table/data-table.js.map +1 -1
  29. package/dist/components/ui/empty-overlay/empty-overlay.js +49 -0
  30. package/dist/components/ui/empty-overlay/empty-overlay.js.map +1 -0
  31. package/dist/components/ui/stepper/stepper.js +70 -0
  32. package/dist/components/ui/stepper/stepper.js.map +1 -0
  33. package/dist/components/ui/stepper-item/stepper-item.js +97 -0
  34. package/dist/components/ui/stepper-item/stepper-item.js.map +1 -0
  35. package/dist/components/ui/table/table-pagination.js +54 -47
  36. package/dist/components/ui/table/table-pagination.js.map +1 -1
  37. package/dist/components/ui/table/table-view-options.js +32 -19
  38. package/dist/components/ui/table/table-view-options.js.map +1 -1
  39. package/dist/components/ui/table/table.js +112 -63
  40. package/dist/components/ui/table/table.js.map +1 -1
  41. package/dist/components/ui/timeline/timeline.js +10 -10
  42. package/dist/components/ui/timeline/timeline.js.map +1 -1
  43. package/dist/components/ui/toast/toast.js +15 -15
  44. package/dist/components/ui/toast/toast.js.map +1 -1
  45. package/dist/index.js +529 -506
  46. package/dist/index.js.map +1 -1
  47. package/dist/react.js +529 -506
  48. package/dist/react.js.map +1 -1
  49. package/dist/src/components/ui/accordion-container/accordion-container.d.ts +44 -0
  50. package/dist/src/components/ui/accordion-container/index.d.ts +1 -0
  51. package/dist/src/components/ui/avatar/avatar.d.ts +26 -7
  52. package/dist/src/components/ui/button/button.d.ts +1 -1
  53. package/dist/src/components/ui/card/card.d.ts +69 -8
  54. package/dist/src/components/ui/card/index.d.ts +1 -1
  55. package/dist/src/components/ui/card-section/card-section.d.ts +50 -0
  56. package/dist/src/components/ui/card-section/index.d.ts +1 -0
  57. package/dist/src/components/ui/data-table/data-table-bulk-actions-bar.d.ts +26 -0
  58. package/dist/src/components/ui/data-table/data-table-column-header.d.ts +6 -1
  59. package/dist/src/components/ui/data-table/data-table-expand-trigger.d.ts +4 -0
  60. package/dist/src/components/ui/data-table/data-table-pagination.d.ts +15 -1
  61. package/dist/src/components/ui/data-table/data-table-selection.d.ts +11 -0
  62. package/dist/src/components/ui/data-table/data-table-view-options.d.ts +3 -2
  63. package/dist/src/components/ui/data-table/data-table.d.ts +88 -3
  64. package/dist/src/components/ui/data-table/data-table.docs.d.ts +61 -1
  65. package/dist/src/components/ui/data-table/index.d.ts +3 -1
  66. package/dist/src/components/ui/dialog/dialog.d.ts +1 -1
  67. package/dist/src/components/ui/empty-overlay/empty-overlay.d.ts +20 -0
  68. package/dist/src/components/ui/empty-overlay/index.d.ts +2 -0
  69. package/dist/src/components/ui/grid/grid.d.ts +1 -1
  70. package/dist/src/components/ui/sheet/sheet.d.ts +1 -1
  71. package/dist/src/components/ui/stack/stack.d.ts +1 -1
  72. package/dist/src/components/ui/stepper/index.d.ts +1 -0
  73. package/dist/src/components/ui/stepper/stepper.d.ts +40 -0
  74. package/dist/src/components/ui/stepper-item/index.d.ts +1 -0
  75. package/dist/src/components/ui/stepper-item/stepper-item.d.ts +41 -0
  76. package/dist/src/components/ui/table/index.d.ts +1 -1
  77. package/dist/src/components/ui/table/table-pagination.d.ts +21 -0
  78. package/dist/src/components/ui/table/table-view-options.d.ts +9 -2
  79. package/dist/src/components/ui/table/table.d.ts +40 -1
  80. package/dist/src/index.d.ts +5 -0
  81. package/dist/ui-react.css +1 -1
  82. package/package.json +3 -3
@@ -0,0 +1,144 @@
1
+ import { jsx as c, Fragment as I } from "react/jsx-runtime";
2
+ import * as t from "react";
3
+ import { Collapsible as h } from "@base-ui/react/collapsible";
4
+ import { useRender as x } from "@base-ui/react/use-render";
5
+ import { mergeProps as N } from "@base-ui/react/merge-props";
6
+ import { ChevronRightIcon as O } from "@acronis-platform/icons-react/stroke-mono";
7
+ import { cn as T } from "../../../lib/utils.js";
8
+ const y = t.createContext({
9
+ collapsible: !1,
10
+ open: !1
11
+ }), j = () => t.useContext(y), k = t.forwardRef(
12
+ ({
13
+ collapsible: n = !1,
14
+ open: o,
15
+ defaultOpen: r = !1,
16
+ onOpenChange: e,
17
+ disabled: a,
18
+ className: i,
19
+ style: s,
20
+ render: l,
21
+ children: u,
22
+ ...f
23
+ }, m) => {
24
+ const [S, W] = t.useState(r), g = o !== void 0, d = g ? o : S, z = t.useCallback(
25
+ (p, F) => {
26
+ g || W(p), e == null || e(p, F);
27
+ },
28
+ [g, e]
29
+ ), A = t.useMemo(
30
+ () => ({ open: d, disabled: a ?? !1 }),
31
+ [d, a]
32
+ ), C = typeof u == "function" ? u({ open: d }) : u, v = typeof i == "function" ? i(A) : i, b = typeof s == "function" ? s(A) : s, R = t.useMemo(
33
+ () => ({ collapsible: n, open: d }),
34
+ [n, d]
35
+ ), M = x({
36
+ render: l,
37
+ ref: m,
38
+ defaultTagName: "div",
39
+ props: N(
40
+ { className: v, style: b },
41
+ f,
42
+ {
43
+ children: C
44
+ }
45
+ )
46
+ });
47
+ if (!n) {
48
+ const p = m != null || v != null || b != null || l != null || Object.keys(f).length > 0;
49
+ return /* @__PURE__ */ c(y.Provider, { value: R, children: p ? M : C });
50
+ }
51
+ return /* @__PURE__ */ c(y.Provider, { value: R, children: /* @__PURE__ */ c(
52
+ h.Root,
53
+ {
54
+ ref: m,
55
+ render: l,
56
+ className: v,
57
+ style: b,
58
+ open: d,
59
+ onOpenChange: z,
60
+ disabled: a,
61
+ ...f,
62
+ children: C
63
+ }
64
+ ) });
65
+ }
66
+ );
67
+ k.displayName = "AccordionContainer";
68
+ const w = t.forwardRef(({ className: n, children: o, "aria-label": r, ...e }, a) => {
69
+ const { collapsible: i } = j();
70
+ return i ? /* @__PURE__ */ c(
71
+ h.Trigger,
72
+ {
73
+ ref: a,
74
+ "aria-label": e["aria-labelledby"] || o != null ? r : r ?? "Toggle",
75
+ className: T(
76
+ "inline-flex size-8 shrink-0 cursor-pointer items-center justify-center border-0 bg-transparent p-0 text-[var(--ui-glyph-on-surface-neutral-dark)]",
77
+ "outline-none focus-visible:rounded-sm focus-visible:ring-2 focus-visible:ring-[var(--ui-focus-primary)]",
78
+ "[&[data-panel-open]>svg]:rotate-90 [&:not([data-panel-open])>svg]:rtl:rotate-180",
79
+ n
80
+ ),
81
+ ...e,
82
+ children: o ?? /* @__PURE__ */ c(
83
+ O,
84
+ {
85
+ size: 16,
86
+ className: "transition-transform duration-200"
87
+ }
88
+ )
89
+ }
90
+ ) : null;
91
+ });
92
+ w.displayName = "AccordionContainerTrigger";
93
+ const P = t.forwardRef(
94
+ ({
95
+ className: n,
96
+ style: o,
97
+ children: r,
98
+ render: e,
99
+ hiddenUntilFound: a,
100
+ keepMounted: i,
101
+ ...s
102
+ }, l) => {
103
+ const { collapsible: u } = j(), f = x({
104
+ render: e,
105
+ ref: l,
106
+ defaultTagName: "div",
107
+ props: N(
108
+ {
109
+ className: n,
110
+ style: o
111
+ },
112
+ s,
113
+ { children: r }
114
+ )
115
+ });
116
+ return u ? /* @__PURE__ */ c(
117
+ h.Panel,
118
+ {
119
+ ref: l,
120
+ style: o,
121
+ className: T(
122
+ "overflow-hidden transition-[height] duration-200 ease-out data-[ending-style]:h-0 data-[starting-style]:h-0",
123
+ n
124
+ ),
125
+ hiddenUntilFound: a,
126
+ keepMounted: i,
127
+ ...s,
128
+ children: r
129
+ }
130
+ ) : l != null || n != null || o != null || e != null || Object.keys(s).length > 0 ? f : /* @__PURE__ */ c(I, { children: r });
131
+ }
132
+ );
133
+ P.displayName = "AccordionContainerContent";
134
+ const G = Object.assign(k, {
135
+ Trigger: w,
136
+ Content: P
137
+ });
138
+ export {
139
+ G as AccordionContainer,
140
+ P as AccordionContainerContent,
141
+ w as AccordionContainerTrigger,
142
+ j as useAccordionContainerContext
143
+ };
144
+ //# sourceMappingURL=accordion-container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accordion-container.js","sources":["../../../../src/components/ui/accordion-container/accordion-container.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Collapsible as CollapsiblePrimitive } from '@base-ui/react/collapsible';\nimport { useRender } from '@base-ui/react/use-render';\nimport { mergeProps } from '@base-ui/react/merge-props';\nimport { ChevronRightIcon } from '@acronis-platform/icons-react/stroke-mono';\n\nimport { cn } from '@/lib/utils';\n\n// The shared disclosure primitive behind Card's and Section's `isCollapsable`\n// variant (Figma file lrU3ydIyvPYQNE6ixdsKtJ, node 10561:83806). Built directly\n// on Base UI's Collapsible — Root/Trigger/Panel own all open/close state, ARIA\n// wiring, and height animation; this component only adds the chevron rotation\n// and the `collapsible=false` bypass. It never imposes visual styling beyond\n// what the disclosure mechanic itself requires: no padding/background/border on\n// Root or Content, no position/hover opinion on Trigger beyond its chevron's\n// glyph color (--ui-glyph-on-surface-neutral-dark, the same neutral treatment\n// Accordion's chevron uses). Every other visual decision (header layout,\n// spacing, background, borders) stays owned by the consumer composing this\n// primitive into their own component (Card, Section, ...).\n\ninterface AccordionContainerState {\n open: boolean;\n}\n\ntype AccordionContainerChildren =\n | React.ReactNode\n | ((state: AccordionContainerState) => React.ReactNode);\n\ntype AccordionContainerBaseProps = Omit<\n React.ComponentPropsWithoutRef<typeof CollapsiblePrimitive.Root>,\n 'children'\n>;\n\ninterface AccordionContainerProps extends AccordionContainerBaseProps {\n /**\n * Whether the disclosure exists at all. When `false`, `children` render\n * directly with no trigger and no panel wrapper — the Figma\n * `isCollapsable=false` state has no disclosure UI.\n * @default false\n */\n collapsible?: boolean;\n /**\n * Accepts a plain node, or a render-prop function receiving the current\n * `{ open }` state — for content outside `AccordionContainer.Content` (e.g.\n * a header) that still needs to know whether the panel is expanded, even\n * when this component owns the open state itself (uncontrolled).\n */\n children?: AccordionContainerChildren;\n}\n\ninterface AccordionContainerContextValue {\n collapsible: boolean;\n open: boolean;\n}\n\nconst AccordionContainerContext =\n React.createContext<AccordionContainerContextValue>({\n collapsible: false,\n open: false,\n });\n\n/**\n * Reads whether the nearest `AccordionContainer` ancestor is `collapsible`\n * and, if so, its current `open` state — for content outside\n * `AccordionContainer.Content` (e.g. a header) that needs to react to the\n * panel's state without a dedicated prop, such as `CardHeader` dropping its\n * bottom divider while collapsed.\n */\nconst useAccordionContainerContext = () =>\n React.useContext(AccordionContainerContext);\n\nconst AccordionContainer = React.forwardRef<\n HTMLDivElement,\n AccordionContainerProps\n>(\n (\n {\n collapsible = false,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n disabled,\n className,\n style,\n render,\n children,\n ...props\n },\n ref\n ) => {\n const [uncontrolledOpen, setUncontrolledOpen] = React.useState(defaultOpen);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : uncontrolledOpen;\n\n const handleOpenChange = React.useCallback<\n NonNullable<AccordionContainerBaseProps['onOpenChange']>\n >(\n (nextOpen, eventDetails) => {\n if (!isControlled) {\n setUncontrolledOpen(nextOpen);\n }\n onOpenChange?.(nextOpen, eventDetails);\n },\n [isControlled, onOpenChange]\n );\n\n const collapsibleState = React.useMemo(\n () => ({ open, disabled: disabled ?? false }),\n [open, disabled]\n );\n\n const resolvedChildren =\n typeof children === 'function' ? children({ open }) : children;\n const resolvedClassName =\n typeof className === 'function' ? className(collapsibleState) : className;\n const resolvedStyle =\n typeof style === 'function' ? style(collapsibleState) : style;\n\n const contextValue = React.useMemo<AccordionContainerContextValue>(\n () => ({ collapsible, open }),\n [collapsible, open]\n );\n\n const bypassRendered = useRender({\n render,\n ref,\n defaultTagName: 'div',\n props: mergeProps<'div'>(\n { className: resolvedClassName, style: resolvedStyle },\n props,\n {\n children: resolvedChildren,\n }\n ),\n });\n\n if (!collapsible) {\n // No wrapper is imposed for the common case (no ref/className/style/render/\n // extra DOM props) so this bypass stays style-isolation-neutral; a consumer\n // that does pass any of those gets a `div` so they aren't silently dropped.\n const needsWrapper =\n ref != null ||\n resolvedClassName != null ||\n resolvedStyle != null ||\n render != null ||\n Object.keys(props).length > 0;\n\n return (\n <AccordionContainerContext.Provider value={contextValue}>\n {needsWrapper ? bypassRendered : resolvedChildren}\n </AccordionContainerContext.Provider>\n );\n }\n\n return (\n <AccordionContainerContext.Provider value={contextValue}>\n <CollapsiblePrimitive.Root\n ref={ref}\n render={render}\n className={resolvedClassName}\n style={resolvedStyle}\n open={open}\n onOpenChange={handleOpenChange}\n disabled={disabled}\n {...props}\n >\n {resolvedChildren}\n </CollapsiblePrimitive.Root>\n </AccordionContainerContext.Provider>\n );\n }\n);\nAccordionContainer.displayName = 'AccordionContainer';\n\ntype AccordionContainerTriggerProps = React.ComponentPropsWithoutRef<\n typeof CollapsiblePrimitive.Trigger\n>;\n\nconst AccordionContainerTrigger = React.forwardRef<\n HTMLButtonElement,\n AccordionContainerTriggerProps\n>(({ className, children, 'aria-label': ariaLabel, ...props }, ref) => {\n const { collapsible } = useAccordionContainerContext();\n\n if (!collapsible) {\n return null;\n }\n\n return (\n <CollapsiblePrimitive.Trigger\n ref={ref}\n aria-label={\n props['aria-labelledby'] || children != null\n ? ariaLabel\n : (ariaLabel ?? 'Toggle')\n }\n className={cn(\n 'inline-flex size-8 shrink-0 cursor-pointer items-center justify-center border-0 bg-transparent p-0 text-[var(--ui-glyph-on-surface-neutral-dark)]',\n 'outline-none focus-visible:rounded-sm focus-visible:ring-2 focus-visible:ring-[var(--ui-focus-primary)]',\n '[&[data-panel-open]>svg]:rotate-90 [&:not([data-panel-open])>svg]:rtl:rotate-180',\n className\n )}\n {...props}\n >\n {children ?? (\n <ChevronRightIcon\n size={16}\n className=\"transition-transform duration-200\"\n />\n )}\n </CollapsiblePrimitive.Trigger>\n );\n});\nAccordionContainerTrigger.displayName = 'AccordionContainerTrigger';\n\ntype AccordionContainerContentProps = React.ComponentPropsWithoutRef<\n typeof CollapsiblePrimitive.Panel\n>;\n\nconst AccordionContainerContent = React.forwardRef<\n React.ComponentRef<typeof CollapsiblePrimitive.Panel>,\n AccordionContainerContentProps\n>(\n (\n {\n className,\n style,\n children,\n render,\n hiddenUntilFound,\n keepMounted,\n ...props\n },\n ref\n ) => {\n const { collapsible } = useAccordionContainerContext();\n\n // Unlike Root, Content doesn't support the render-prop `(state) => value`\n // form for className/style, so the bypass div below only ever sees plain\n // values.\n const bypassRendered = useRender({\n render: render as\n | useRender.RenderProp<Record<string, unknown>>\n | undefined,\n ref,\n defaultTagName: 'div',\n props: mergeProps<'div'>(\n {\n className: className as string | undefined,\n style: style as React.CSSProperties | undefined,\n },\n props,\n { children }\n ),\n });\n\n if (!collapsible) {\n // Same style-isolation-neutral bypass as the Root: no wrapper unless the\n // consumer actually passed something that would otherwise be dropped.\n // hiddenUntilFound/keepMounted are Panel-only props, destructured above\n // so they never leak onto this plain div.\n const needsWrapper =\n ref != null ||\n className != null ||\n style != null ||\n render != null ||\n Object.keys(props).length > 0;\n\n return needsWrapper ? bypassRendered : <>{children}</>;\n }\n\n return (\n <CollapsiblePrimitive.Panel\n ref={ref}\n style={style}\n className={cn(\n 'overflow-hidden transition-[height] duration-200 ease-out data-[ending-style]:h-0 data-[starting-style]:h-0',\n className\n )}\n hiddenUntilFound={hiddenUntilFound}\n keepMounted={keepMounted}\n {...props}\n >\n {children}\n </CollapsiblePrimitive.Panel>\n );\n }\n);\nAccordionContainerContent.displayName = 'AccordionContainerContent';\n\nconst AccordionContainerRoot = Object.assign(AccordionContainer, {\n Trigger: AccordionContainerTrigger,\n Content: AccordionContainerContent,\n});\n\nexport {\n AccordionContainerRoot as AccordionContainer,\n AccordionContainerTrigger,\n AccordionContainerContent,\n useAccordionContainerContext,\n type AccordionContainerProps,\n type AccordionContainerTriggerProps,\n type AccordionContainerContentProps,\n type AccordionContainerState,\n type AccordionContainerContextValue,\n};\n"],"names":["AccordionContainerContext","React","useAccordionContainerContext","AccordionContainer","collapsible","openProp","defaultOpen","onOpenChange","disabled","className","style","render","children","props","ref","uncontrolledOpen","setUncontrolledOpen","isControlled","open","handleOpenChange","nextOpen","eventDetails","collapsibleState","resolvedChildren","resolvedClassName","resolvedStyle","contextValue","bypassRendered","useRender","mergeProps","needsWrapper","jsx","CollapsiblePrimitive","AccordionContainerTrigger","ariaLabel","cn","ChevronRightIcon","AccordionContainerContent","hiddenUntilFound","keepMounted","Fragment","AccordionContainerRoot"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- import { jsx as t } from "react/jsx-runtime";
2
- import * as o from "react";
1
+ import { jsx as e } from "react/jsx-runtime";
2
+ import * as l from "react";
3
3
  import { cva as d } from "../../../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.js";
4
4
  import { TimesIcon as g } from "@acronis-platform/icons-react/stroke-mono";
5
5
  import { DiamondWarningRedIcon as f, CircleWarningOrangeIcon as b, TriangleWarningYellowIcon as p, CircleCheckGreenIcon as u, CircleInfoBlueIcon as v } from "@acronis-platform/icons-react/stroke-multi";
6
- import { cn as l } from "../../../lib/utils.js";
7
- import { ButtonIcon as m } from "../button-icon/button-icon.js";
8
- const x = d(
6
+ import { cn as o } from "../../../lib/utils.js";
7
+ import { ButtonIcon as x } from "../button-icon/button-icon.js";
8
+ const m = d(
9
9
  "relative flex w-full items-start overflow-clip [overflow-clip-margin:border-box] border-solid min-w-[var(--ui-alert-global-container-width-min)] gap-[var(--ui-alert-global-container-gap)] px-[var(--ui-alert-global-container-padding-x)] py-[var(--ui-alert-global-container-padding-y)] rounded-[var(--ui-alert-global-container-border-radius)] border-[length:var(--ui-alert-global-container-border-width)] bg-[var(--ui-alert-global-container-background)] before:absolute before:content-[''] before:-inset-y-px before:start-[-1px] before:w-[var(--ui-alert-global-container-status-width)]",
10
10
  {
11
11
  variants: {
@@ -27,118 +27,118 @@ const x = d(
27
27
  warning: p,
28
28
  critical: b,
29
29
  danger: f
30
- }, i = o.createContext("info"), y = o.forwardRef(
31
- ({ className: r, variant: a, ...e }, n) => /* @__PURE__ */ t(i.Provider, { value: a ?? "info", children: /* @__PURE__ */ t(
30
+ }, i = l.createContext("info"), y = l.forwardRef(
31
+ ({ className: t, variant: r, ...a }, n) => /* @__PURE__ */ e(i.Provider, { value: r ?? "info", children: /* @__PURE__ */ e(
32
32
  "div",
33
33
  {
34
34
  ref: n,
35
35
  role: "alert",
36
36
  "data-slot": "alert",
37
- "data-variant": a ?? "info",
38
- className: l(x({ variant: a }), r),
39
- ...e
37
+ "data-variant": r ?? "info",
38
+ className: o(m({ variant: r }), t),
39
+ ...a
40
40
  }
41
41
  ) })
42
42
  );
43
43
  y.displayName = "Alert";
44
- const A = o.forwardRef(({ className: r, children: a, ...e }, n) => {
45
- const c = o.useContext(i), s = w[c];
44
+ const A = l.forwardRef(({ className: t, children: r, ...a }, n) => {
45
+ const c = l.useContext(i), s = w[c];
46
46
  return (
47
47
  // The icon box's padding (4/8) is what optically aligns the 16px glyph with
48
48
  // the first line of the title: glyph centre 8 + 8 = 16, title centre
49
49
  // (AlertText's 4px padding) 4 + 12 = 16.
50
- /* @__PURE__ */ t(
50
+ /* @__PURE__ */ e(
51
51
  "div",
52
52
  {
53
53
  ref: n,
54
54
  "data-slot": "alert-icon",
55
- className: l(
55
+ className: o(
56
56
  "flex shrink-0 items-start px-[var(--ui-alert-global-icon-padding-x)] py-[var(--ui-alert-global-icon-padding-y)] [&_svg]:size-[var(--ui-alert-global-icon-size)] [&_svg]:shrink-0",
57
- r
57
+ t
58
58
  ),
59
- ...e,
60
- children: a ?? /* @__PURE__ */ t(s, { size: 16 })
59
+ ...a,
60
+ children: r ?? /* @__PURE__ */ e(s, { size: 16 })
61
61
  }
62
62
  )
63
63
  );
64
64
  });
65
65
  A.displayName = "AlertIcon";
66
- const h = o.forwardRef(({ className: r, ...a }, e) => /* @__PURE__ */ t(
66
+ const N = l.forwardRef(({ className: t, ...r }, a) => /* @__PURE__ */ e(
67
67
  "div",
68
68
  {
69
- ref: e,
69
+ ref: a,
70
70
  "data-slot": "alert-content",
71
- className: l(
71
+ className: o(
72
72
  "flex min-w-0 flex-1 flex-col items-start gap-[var(--ui-alert-global-content-gap)] px-[var(--ui-alert-global-content-padding-x)] py-[var(--ui-alert-global-content-padding-y)]",
73
- r
73
+ t
74
74
  ),
75
- ...a
75
+ ...r
76
76
  }
77
77
  ));
78
- h.displayName = "AlertContent";
79
- const N = o.forwardRef(({ className: r, ...a }, e) => /* @__PURE__ */ t(
78
+ N.displayName = "AlertContent";
79
+ const h = l.forwardRef(({ className: t, ...r }, a) => /* @__PURE__ */ e(
80
80
  "div",
81
81
  {
82
- ref: e,
82
+ ref: a,
83
83
  "data-slot": "alert-text",
84
- className: l(
84
+ className: o(
85
85
  "flex w-full shrink-0 flex-col items-start gap-[var(--ui-alert-global-content-text-container-gap)] px-[var(--ui-alert-global-content-text-container-padding-x)] py-[var(--ui-alert-global-content-text-container-padding-y)] [word-break:break-word]",
86
- r
86
+ t
87
87
  ),
88
- ...a
88
+ ...r
89
89
  }
90
90
  ));
91
- N.displayName = "AlertText";
92
- const C = o.forwardRef(({ className: r, ...a }, e) => /* @__PURE__ */ t(
91
+ h.displayName = "AlertText";
92
+ const C = l.forwardRef(({ className: t, ...r }, a) => /* @__PURE__ */ e(
93
93
  "h5",
94
94
  {
95
- ref: e,
95
+ ref: a,
96
96
  "data-slot": "alert-title",
97
- className: l(
98
- "ui-typography-headings-lead mb-0 w-full text-[var(--ui-alert-global-content-text-container-title-color)]",
99
- r
97
+ className: o(
98
+ "ui-alert-global-content-text-container-title-text-style mb-0 w-full text-[var(--ui-alert-global-content-text-container-title-color)]",
99
+ t
100
100
  ),
101
- ...a
101
+ ...r
102
102
  }
103
103
  ));
104
104
  C.displayName = "AlertTitle";
105
- const I = o.forwardRef(({ className: r, ...a }, e) => /* @__PURE__ */ t(
105
+ const I = l.forwardRef(({ className: t, ...r }, a) => /* @__PURE__ */ e(
106
106
  "p",
107
107
  {
108
- ref: e,
108
+ ref: a,
109
109
  "data-slot": "alert-description",
110
- className: l(
110
+ className: o(
111
111
  "ui-alert-global-content-text-container-description-text-style w-full text-[var(--ui-alert-global-content-text-container-description-color)]",
112
- r
112
+ t
113
113
  ),
114
- ...a
114
+ ...r
115
115
  }
116
116
  ));
117
117
  I.displayName = "AlertDescription";
118
- const R = o.forwardRef(({ className: r, ...a }, e) => /* @__PURE__ */ t(
118
+ const R = l.forwardRef(({ className: t, ...r }, a) => /* @__PURE__ */ e(
119
119
  "div",
120
120
  {
121
- ref: e,
121
+ ref: a,
122
122
  "data-slot": "alert-actions",
123
- className: l(
123
+ className: o(
124
124
  "flex w-full shrink-0 flex-wrap content-start items-start gap-x-[var(--ui-alert-global-content-actions-container-gap-x)] gap-y-[var(--ui-alert-global-content-actions-container-gap-y)] px-[var(--ui-alert-global-content-actions-container-padding-x)] py-[var(--ui-alert-global-content-actions-container-padding-y)]",
125
- r
125
+ t
126
126
  ),
127
- ...a
127
+ ...r
128
128
  }
129
129
  ));
130
130
  R.displayName = "AlertActions";
131
- const k = o.forwardRef(
132
- ({ className: r, ariaLabel: a = "Close", ...e }, n) => /* @__PURE__ */ t(
133
- m,
131
+ const k = l.forwardRef(
132
+ ({ className: t, ariaLabel: r = "Close", ...a }, n) => /* @__PURE__ */ e(
133
+ x,
134
134
  {
135
135
  ref: n,
136
136
  "data-slot": "alert-close",
137
- className: l("shrink-0", r),
138
- ...e,
137
+ className: o("shrink-0", t),
138
+ ...a,
139
139
  variant: "ghost",
140
- "aria-label": a,
141
- children: /* @__PURE__ */ t(g, {})
140
+ "aria-label": r,
141
+ children: /* @__PURE__ */ e(g, {})
142
142
  }
143
143
  )
144
144
  );
@@ -147,11 +147,11 @@ export {
147
147
  y as Alert,
148
148
  R as AlertActions,
149
149
  k as AlertClose,
150
- h as AlertContent,
150
+ N as AlertContent,
151
151
  I as AlertDescription,
152
152
  A as AlertIcon,
153
- N as AlertText,
153
+ h as AlertText,
154
154
  C as AlertTitle,
155
- x as alertVariants
155
+ m as alertVariants
156
156
  };
157
157
  //# sourceMappingURL=alert.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alert.js","sources":["../../../../src/components/ui/alert/alert.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { TimesIcon } from '@acronis-platform/icons-react/stroke-mono';\nimport {\n CircleCheckGreenIcon,\n CircleInfoBlueIcon,\n CircleWarningOrangeIcon,\n DiamondWarningRedIcon,\n TriangleWarningYellowIcon,\n type IconProps,\n} from '@acronis-platform/icons-react/stroke-multi';\n\nimport { cn } from '@/lib/utils';\nimport { ButtonIcon, type ButtonIconProps } from '../button-icon';\n\n// Mirrors the Figma \"Alert\" component set (node 7421:125155). The banner is a\n// *neutral* surface — not a status tint — with the severity carried by two\n// things: a 1px border in the status color and a 6px status line down the\n// leading edge. Geometry, colors, and spacing all come from the dedicated\n// `--ui-alert-*` tier (imported in `src/styles/index.css`).\n//\n// The status line is a `::before` pseudo-element rather than a DOM node: it is\n// never optional and never a slot, so a real element would only add markup for\n// consumers to get wrong. It is bled 1px outwards on three sides so it paints\n// *over* the border it sits on (matching the Figma, where the line covers the\n// leading border), and the root's clip rounds its square corners to the\n// container radius. `start-` keeps it on the leading edge under `dir=\"rtl\"`.\n//\n// `overflow-clip-margin: border-box` is load-bearing, not decoration. `overflow:\n// clip` alone clips at the *padding* box, which is exactly where the bleed has to\n// reach — and an absolutely positioned pseudo-element's containing block is that\n// same padding box — so the outward 1px gets shaved off and the line renders 5px\n// wide starting *inside* the border. Since the border and the line are different\n// tokens, that reads as two adjacent stripes rather than one 6px line. Moving the\n// clip edge out to the border box lets the bleed survive while still rounding the\n// corners.\n//\n// Typography comes from the generated classes: `ui-typography-headings-lead` for\n// the title (Inter Regular 18 / 24) and the Alert tier's own emitted class for the\n// description (Inter Regular 14 / 24) — the same pair Toast uses, since the two are\n// the same card. Only the *colors* are separate token references. Every other value\n// is a `var(--ui-alert-*)` reference, so a brand override is honored without\n// touching this file.\nconst alertVariants = cva(\n 'relative flex w-full items-start overflow-clip [overflow-clip-margin:border-box] border-solid ' +\n 'min-w-[var(--ui-alert-global-container-width-min)] ' +\n 'gap-[var(--ui-alert-global-container-gap)] ' +\n 'px-[var(--ui-alert-global-container-padding-x)] py-[var(--ui-alert-global-container-padding-y)] ' +\n 'rounded-[var(--ui-alert-global-container-border-radius)] ' +\n 'border-[length:var(--ui-alert-global-container-border-width)] ' +\n 'bg-[var(--ui-alert-global-container-background)] ' +\n \"before:absolute before:content-[''] before:-inset-y-px before:start-[-1px] \" +\n 'before:w-[var(--ui-alert-global-container-status-width)]',\n {\n variants: {\n variant: {\n info: 'border-[color:var(--ui-alert-info-border-color)] before:bg-[var(--ui-alert-info-left-line)]',\n success:\n 'border-[color:var(--ui-alert-success-border-color)] before:bg-[var(--ui-alert-success-left-line)]',\n warning:\n 'border-[color:var(--ui-alert-warning-border-color)] before:bg-[var(--ui-alert-warning-left-line)]',\n critical:\n 'border-[color:var(--ui-alert-critical-border-color)] before:bg-[var(--ui-alert-critical-left-line)]',\n danger:\n 'border-[color:var(--ui-alert-danger-border-color)] before:bg-[var(--ui-alert-danger-left-line)]',\n },\n },\n defaultVariants: {\n variant: 'info',\n },\n }\n);\n\nexport type AlertVariant = NonNullable<\n VariantProps<typeof alertVariants>['variant']\n>;\n\n// The Figma binds exactly one icon to each variant, and they are multicolor\n// (`stroke-multi`) glyphs that carry their own fills — so unlike the previous\n// monocolor port, nothing here tints them.\nconst STATUS_ICON: Record<AlertVariant, React.ComponentType<IconProps>> = {\n info: CircleInfoBlueIcon,\n success: CircleCheckGreenIcon,\n warning: TriangleWarningYellowIcon,\n critical: CircleWarningOrangeIcon,\n danger: DiamondWarningRedIcon,\n};\n\nconst AlertVariantContext = React.createContext<AlertVariant>('info');\n\nexport interface AlertProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof alertVariants> {}\n\n/**\n * A status banner: neutral surface, a status-colored border, and a status line\n * down the leading edge. Compose it from `AlertIcon`, `AlertContent`\n * (`AlertText` + `AlertTitle` / `AlertDescription`, optionally `AlertActions`)\n * and `AlertClose`.\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant, ...props }, ref) => (\n <AlertVariantContext.Provider value={variant ?? 'info'}>\n <div\n ref={ref}\n role=\"alert\"\n data-slot=\"alert\"\n data-variant={variant ?? 'info'}\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n </AlertVariantContext.Provider>\n )\n);\nAlert.displayName = 'Alert';\n\n/**\n * The leading status icon. Renders the variant's own icon when given no\n * `children`; pass children to substitute a different glyph.\n */\nconst AlertIcon = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n const variant = React.useContext(AlertVariantContext);\n const StatusIcon = STATUS_ICON[variant];\n return (\n // The icon box's padding (4/8) is what optically aligns the 16px glyph with\n // the first line of the title: glyph centre 8 + 8 = 16, title centre\n // (AlertText's 4px padding) 4 + 12 = 16.\n <div\n ref={ref}\n data-slot=\"alert-icon\"\n className={cn(\n 'flex shrink-0 items-start px-[var(--ui-alert-global-icon-padding-x)] py-[var(--ui-alert-global-icon-padding-y)] [&_svg]:size-[var(--ui-alert-global-icon-size)] [&_svg]:shrink-0',\n className\n )}\n {...props}\n >\n {children ?? <StatusIcon size={16} />}\n </div>\n );\n});\nAlertIcon.displayName = 'AlertIcon';\n\nconst AlertContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"alert-content\"\n className={cn(\n 'flex min-w-0 flex-1 flex-col items-start gap-[var(--ui-alert-global-content-gap)] px-[var(--ui-alert-global-content-padding-x)] py-[var(--ui-alert-global-content-padding-y)]',\n className\n )}\n {...props}\n />\n));\nAlertContent.displayName = 'AlertContent';\n\n/**\n * The title + description block. Its own vertical padding is what keeps the\n * text aligned with the icon, so keep the title and description inside it\n * rather than directly under `AlertContent`.\n */\nconst AlertText = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"alert-text\"\n className={cn(\n 'flex w-full shrink-0 flex-col items-start gap-[var(--ui-alert-global-content-text-container-gap)] px-[var(--ui-alert-global-content-text-container-padding-x)] py-[var(--ui-alert-global-content-text-container-padding-y)] [word-break:break-word]',\n className\n )}\n {...props}\n />\n));\nAlertText.displayName = 'AlertText';\n\nconst AlertTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n data-slot=\"alert-title\"\n className={cn(\n 'ui-typography-headings-lead mb-0 w-full text-[var(--ui-alert-global-content-text-container-title-color)]',\n className\n )}\n {...props}\n />\n));\nAlertTitle.displayName = 'AlertTitle';\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"alert-description\"\n className={cn(\n 'ui-alert-global-content-text-container-description-text-style w-full text-[var(--ui-alert-global-content-text-container-description-color)]',\n className\n )}\n {...props}\n />\n));\nAlertDescription.displayName = 'AlertDescription';\n\n/**\n * Action buttons under the text. Place inside `AlertContent` (after\n * `AlertText`), as the Figma does — the row wraps when it runs out of width.\n */\nconst AlertActions = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"alert-actions\"\n className={cn(\n 'flex w-full shrink-0 flex-wrap content-start items-start gap-x-[var(--ui-alert-global-content-actions-container-gap-x)] gap-y-[var(--ui-alert-global-content-actions-container-gap-y)] px-[var(--ui-alert-global-content-actions-container-padding-x)] py-[var(--ui-alert-global-content-actions-container-padding-y)]',\n className\n )}\n {...props}\n />\n));\nAlertActions.displayName = 'AlertActions';\n\n// The spec pins this control to a ghost ButtonIcon with a times glyph, so the\n// props that would change that are omitted from the type instead of merely being\n// defaulted — `...props` spreads after them, so keeping them would let\n// `<AlertClose variant=\"secondary\" />` silently win over the documented behavior.\n//\n// `aria-label` needs the belt *and* braces. Omitting it from the type is not\n// enough: TypeScript deliberately skips checking hyphenated JSX attributes (the\n// same rule that lets `data-*` through), so `<AlertClose aria-label=\"X\" />` still\n// compiles. Pinning `aria-label` after the spread is what actually makes\n// `ariaLabel` authoritative.\nexport interface AlertCloseProps\n extends Omit<ButtonIconProps, 'children' | 'variant' | 'render' | 'aria-label'> {\n /** Accessible name for the dismiss control. */\n ariaLabel?: string;\n}\n\n/**\n * The trailing dismiss control. Rendering it is what makes an alert\n * dismissable — wire `onClick` to remove the alert. Name it with `ariaLabel`.\n */\nconst AlertClose = React.forwardRef<HTMLButtonElement, AlertCloseProps>(\n ({ className, ariaLabel = 'Close', ...props }, ref) => (\n <ButtonIcon\n ref={ref}\n data-slot=\"alert-close\"\n className={cn('shrink-0', className)}\n {...props}\n variant=\"ghost\"\n aria-label={ariaLabel}\n >\n <TimesIcon />\n </ButtonIcon>\n )\n);\nAlertClose.displayName = 'AlertClose';\n\nexport {\n Alert,\n AlertIcon,\n AlertContent,\n AlertText,\n AlertTitle,\n AlertDescription,\n AlertActions,\n AlertClose,\n alertVariants,\n};\n"],"names":["alertVariants","cva","STATUS_ICON","CircleInfoBlueIcon","CircleCheckGreenIcon","TriangleWarningYellowIcon","CircleWarningOrangeIcon","DiamondWarningRedIcon","AlertVariantContext","React","Alert","className","variant","props","ref","jsx","cn","AlertIcon","children","StatusIcon","AlertContent","AlertText","AlertTitle","AlertDescription","AlertActions","AlertClose","ariaLabel","ButtonIcon","TimesIcon"],"mappings":"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"}
1
+ {"version":3,"file":"alert.js","sources":["../../../../src/components/ui/alert/alert.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { TimesIcon } from '@acronis-platform/icons-react/stroke-mono';\nimport {\n CircleCheckGreenIcon,\n CircleInfoBlueIcon,\n CircleWarningOrangeIcon,\n DiamondWarningRedIcon,\n TriangleWarningYellowIcon,\n type IconProps,\n} from '@acronis-platform/icons-react/stroke-multi';\n\nimport { cn } from '@/lib/utils';\nimport { ButtonIcon, type ButtonIconProps } from '../button-icon';\n\n// Mirrors the Figma \"Alert\" component set (node 7421:125155). The banner is a\n// *neutral* surface — not a status tint — with the severity carried by two\n// things: a 1px border in the status color and a 6px status line down the\n// leading edge. Geometry, colors, and spacing all come from the dedicated\n// `--ui-alert-*` tier (imported in `src/styles/index.css`).\n//\n// The status line is a `::before` pseudo-element rather than a DOM node: it is\n// never optional and never a slot, so a real element would only add markup for\n// consumers to get wrong. It is bled 1px outwards on three sides so it paints\n// *over* the border it sits on (matching the Figma, where the line covers the\n// leading border), and the root's clip rounds its square corners to the\n// container radius. `start-` keeps it on the leading edge under `dir=\"rtl\"`.\n//\n// `overflow-clip-margin: border-box` is load-bearing, not decoration. `overflow:\n// clip` alone clips at the *padding* box, which is exactly where the bleed has to\n// reach — and an absolutely positioned pseudo-element's containing block is that\n// same padding box — so the outward 1px gets shaved off and the line renders 5px\n// wide starting *inside* the border. Since the border and the line are different\n// tokens, that reads as two adjacent stripes rather than one 6px line. Moving the\n// clip edge out to the border box lets the bleed survive while still rounding the\n// corners.\n//\n// Typography comes from the Alert tier's own emitted classes — the title (Inter\n// Regular 18 / 24) and the description (Inter Regular 14 / 24) — the same pair\n// Toast uses, since the two are the same card. The title previously borrowed the\n// semantic `ui-typography-headings-lead` because the tier emitted no title class;\n// it does now, and the two resolve identically today, so a brand that re-styles\n// only Alert's title is honored. Only the *colors* are separate token references.\n// Every other value is a `var(--ui-alert-*)` reference, so a brand override is\n// honored without touching this file.\nconst alertVariants = cva(\n 'relative flex w-full items-start overflow-clip [overflow-clip-margin:border-box] border-solid ' +\n 'min-w-[var(--ui-alert-global-container-width-min)] ' +\n 'gap-[var(--ui-alert-global-container-gap)] ' +\n 'px-[var(--ui-alert-global-container-padding-x)] py-[var(--ui-alert-global-container-padding-y)] ' +\n 'rounded-[var(--ui-alert-global-container-border-radius)] ' +\n 'border-[length:var(--ui-alert-global-container-border-width)] ' +\n 'bg-[var(--ui-alert-global-container-background)] ' +\n \"before:absolute before:content-[''] before:-inset-y-px before:start-[-1px] \" +\n 'before:w-[var(--ui-alert-global-container-status-width)]',\n {\n variants: {\n variant: {\n info: 'border-[color:var(--ui-alert-info-border-color)] before:bg-[var(--ui-alert-info-left-line)]',\n success:\n 'border-[color:var(--ui-alert-success-border-color)] before:bg-[var(--ui-alert-success-left-line)]',\n warning:\n 'border-[color:var(--ui-alert-warning-border-color)] before:bg-[var(--ui-alert-warning-left-line)]',\n critical:\n 'border-[color:var(--ui-alert-critical-border-color)] before:bg-[var(--ui-alert-critical-left-line)]',\n danger:\n 'border-[color:var(--ui-alert-danger-border-color)] before:bg-[var(--ui-alert-danger-left-line)]',\n },\n },\n defaultVariants: {\n variant: 'info',\n },\n }\n);\n\nexport type AlertVariant = NonNullable<\n VariantProps<typeof alertVariants>['variant']\n>;\n\n// The Figma binds exactly one icon to each variant, and they are multicolor\n// (`stroke-multi`) glyphs that carry their own fills — so unlike the previous\n// monocolor port, nothing here tints them.\nconst STATUS_ICON: Record<AlertVariant, React.ComponentType<IconProps>> = {\n info: CircleInfoBlueIcon,\n success: CircleCheckGreenIcon,\n warning: TriangleWarningYellowIcon,\n critical: CircleWarningOrangeIcon,\n danger: DiamondWarningRedIcon,\n};\n\nconst AlertVariantContext = React.createContext<AlertVariant>('info');\n\nexport interface AlertProps\n extends\n React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof alertVariants> {}\n\n/**\n * A status banner: neutral surface, a status-colored border, and a status line\n * down the leading edge. Compose it from `AlertIcon`, `AlertContent`\n * (`AlertText` + `AlertTitle` / `AlertDescription`, optionally `AlertActions`)\n * and `AlertClose`.\n */\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant, ...props }, ref) => (\n <AlertVariantContext.Provider value={variant ?? 'info'}>\n <div\n ref={ref}\n role=\"alert\"\n data-slot=\"alert\"\n data-variant={variant ?? 'info'}\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n </AlertVariantContext.Provider>\n )\n);\nAlert.displayName = 'Alert';\n\n/**\n * The leading status icon. Renders the variant's own icon when given no\n * `children`; pass children to substitute a different glyph.\n */\nconst AlertIcon = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => {\n const variant = React.useContext(AlertVariantContext);\n const StatusIcon = STATUS_ICON[variant];\n return (\n // The icon box's padding (4/8) is what optically aligns the 16px glyph with\n // the first line of the title: glyph centre 8 + 8 = 16, title centre\n // (AlertText's 4px padding) 4 + 12 = 16.\n <div\n ref={ref}\n data-slot=\"alert-icon\"\n className={cn(\n 'flex shrink-0 items-start px-[var(--ui-alert-global-icon-padding-x)] py-[var(--ui-alert-global-icon-padding-y)] [&_svg]:size-[var(--ui-alert-global-icon-size)] [&_svg]:shrink-0',\n className\n )}\n {...props}\n >\n {children ?? <StatusIcon size={16} />}\n </div>\n );\n});\nAlertIcon.displayName = 'AlertIcon';\n\nconst AlertContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"alert-content\"\n className={cn(\n 'flex min-w-0 flex-1 flex-col items-start gap-[var(--ui-alert-global-content-gap)] px-[var(--ui-alert-global-content-padding-x)] py-[var(--ui-alert-global-content-padding-y)]',\n className\n )}\n {...props}\n />\n));\nAlertContent.displayName = 'AlertContent';\n\n/**\n * The title + description block. Its own vertical padding is what keeps the\n * text aligned with the icon, so keep the title and description inside it\n * rather than directly under `AlertContent`.\n */\nconst AlertText = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"alert-text\"\n className={cn(\n 'flex w-full shrink-0 flex-col items-start gap-[var(--ui-alert-global-content-text-container-gap)] px-[var(--ui-alert-global-content-text-container-padding-x)] py-[var(--ui-alert-global-content-text-container-padding-y)] [word-break:break-word]',\n className\n )}\n {...props}\n />\n));\nAlertText.displayName = 'AlertText';\n\nconst AlertTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n data-slot=\"alert-title\"\n className={cn(\n 'ui-alert-global-content-text-container-title-text-style mb-0 w-full text-[var(--ui-alert-global-content-text-container-title-color)]',\n className\n )}\n {...props}\n />\n));\nAlertTitle.displayName = 'AlertTitle';\n\nconst AlertDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"alert-description\"\n className={cn(\n 'ui-alert-global-content-text-container-description-text-style w-full text-[var(--ui-alert-global-content-text-container-description-color)]',\n className\n )}\n {...props}\n />\n));\nAlertDescription.displayName = 'AlertDescription';\n\n/**\n * Action buttons under the text. Place inside `AlertContent` (after\n * `AlertText`), as the Figma does — the row wraps when it runs out of width.\n */\nconst AlertActions = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"alert-actions\"\n className={cn(\n 'flex w-full shrink-0 flex-wrap content-start items-start gap-x-[var(--ui-alert-global-content-actions-container-gap-x)] gap-y-[var(--ui-alert-global-content-actions-container-gap-y)] px-[var(--ui-alert-global-content-actions-container-padding-x)] py-[var(--ui-alert-global-content-actions-container-padding-y)]',\n className\n )}\n {...props}\n />\n));\nAlertActions.displayName = 'AlertActions';\n\n// The spec pins this control to a ghost ButtonIcon with a times glyph, so the\n// props that would change that are omitted from the type instead of merely being\n// defaulted — `...props` spreads after them, so keeping them would let\n// `<AlertClose variant=\"secondary\" />` silently win over the documented behavior.\n//\n// `aria-label` needs the belt *and* braces. Omitting it from the type is not\n// enough: TypeScript deliberately skips checking hyphenated JSX attributes (the\n// same rule that lets `data-*` through), so `<AlertClose aria-label=\"X\" />` still\n// compiles. Pinning `aria-label` after the spread is what actually makes\n// `ariaLabel` authoritative.\nexport interface AlertCloseProps\n extends Omit<ButtonIconProps, 'children' | 'variant' | 'render' | 'aria-label'> {\n /** Accessible name for the dismiss control. */\n ariaLabel?: string;\n}\n\n/**\n * The trailing dismiss control. Rendering it is what makes an alert\n * dismissable — wire `onClick` to remove the alert. Name it with `ariaLabel`.\n */\nconst AlertClose = React.forwardRef<HTMLButtonElement, AlertCloseProps>(\n ({ className, ariaLabel = 'Close', ...props }, ref) => (\n <ButtonIcon\n ref={ref}\n data-slot=\"alert-close\"\n className={cn('shrink-0', className)}\n {...props}\n variant=\"ghost\"\n aria-label={ariaLabel}\n >\n <TimesIcon />\n </ButtonIcon>\n )\n);\nAlertClose.displayName = 'AlertClose';\n\nexport {\n Alert,\n AlertIcon,\n AlertContent,\n AlertText,\n AlertTitle,\n AlertDescription,\n AlertActions,\n AlertClose,\n alertVariants,\n};\n"],"names":["alertVariants","cva","STATUS_ICON","CircleInfoBlueIcon","CircleCheckGreenIcon","TriangleWarningYellowIcon","CircleWarningOrangeIcon","DiamondWarningRedIcon","AlertVariantContext","React","Alert","className","variant","props","ref","jsx","cn","AlertIcon","children","StatusIcon","AlertContent","AlertText","AlertTitle","AlertDescription","AlertActions","AlertClose","ariaLabel","ButtonIcon","TimesIcon"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { jsx as t } from "react/jsx-runtime";
2
2
  import * as o from "react";
3
3
  import { Avatar as v } from "@base-ui/react/avatar";
4
- import { cva as c } from "../../../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.js";
4
+ import { cva as d } from "../../../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.js";
5
5
  import { cn as l } from "../../../lib/utils.js";
6
- const s = c(
6
+ const g = d(
7
7
  "relative inline-flex shrink-0 select-none items-center justify-center overflow-hidden size-[var(--ui-avatar-global-avatar-size)] rounded-[var(--ui-avatar-global-avatar-border-border-radius)] [box-shadow:0_0_0_var(--ui-avatar-global-avatar-border-border-width)_var(--ui-avatar-global-avatar-border-color)] text-xs font-semibold leading-4",
8
8
  {
9
9
  variants: {
@@ -22,16 +22,7 @@ const s = c(
22
22
  color: "teal"
23
23
  }
24
24
  }
25
- ), b = o.forwardRef(({ className: a, color: r, ...e }, i) => /* @__PURE__ */ t(
26
- v.Root,
27
- {
28
- ref: i,
29
- className: l(s({ color: r }), a),
30
- ...e
31
- }
32
- ));
33
- b.displayName = "Avatar";
34
- const u = o.forwardRef(({ className: a, ...r }, e) => /* @__PURE__ */ t(
25
+ ), m = o.forwardRef(({ className: a, ...r }, e) => /* @__PURE__ */ t(
35
26
  v.Image,
36
27
  {
37
28
  ref: e,
@@ -39,8 +30,8 @@ const u = o.forwardRef(({ className: a, ...r }, e) => /* @__PURE__ */ t(
39
30
  ...r
40
31
  }
41
32
  ));
42
- u.displayName = "AvatarImage";
43
- const n = o.forwardRef(({ className: a, ...r }, e) => /* @__PURE__ */ t(
33
+ m.displayName = "AvatarImage";
34
+ const c = o.forwardRef(({ className: a, ...r }, e) => /* @__PURE__ */ t(
44
35
  v.Fallback,
45
36
  {
46
37
  ref: e,
@@ -48,8 +39,28 @@ const n = o.forwardRef(({ className: a, ...r }, e) => /* @__PURE__ */ t(
48
39
  ...r
49
40
  }
50
41
  ));
51
- n.displayName = "AvatarFallback";
52
- const d = o.forwardRef(
42
+ c.displayName = "AvatarFallback";
43
+ const f = o.forwardRef(
44
+ ({
45
+ className: a,
46
+ color: r,
47
+ variant: e = "text",
48
+ label: s = "SB",
49
+ icon: b,
50
+ children: i,
51
+ ...u
52
+ }, n) => /* @__PURE__ */ t(
53
+ v.Root,
54
+ {
55
+ ref: n,
56
+ className: l(g({ color: r }), a),
57
+ ...u,
58
+ children: i !== void 0 ? i : e === "icon" ? b : /* @__PURE__ */ t(c, { children: s })
59
+ }
60
+ )
61
+ );
62
+ f.displayName = "Avatar";
63
+ const x = o.forwardRef(
53
64
  ({ className: a, ...r }, e) => /* @__PURE__ */ t(
54
65
  "div",
55
66
  {
@@ -62,12 +73,12 @@ const d = o.forwardRef(
62
73
  }
63
74
  )
64
75
  );
65
- d.displayName = "AvatarGroup";
76
+ x.displayName = "AvatarGroup";
66
77
  export {
67
- b as Avatar,
68
- n as AvatarFallback,
69
- d as AvatarGroup,
70
- u as AvatarImage,
71
- s as avatarVariants
78
+ f as Avatar,
79
+ c as AvatarFallback,
80
+ x as AvatarGroup,
81
+ m as AvatarImage,
82
+ g as avatarVariants
72
83
  };
73
84
  //# sourceMappingURL=avatar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"avatar.js","sources":["../../../../src/components/ui/avatar/avatar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Avatar as AvatarPrimitive } from '@base-ui/react/avatar';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\n// Wraps Base UI's Avatar primitive (Root / Image / Fallback), themed by the\n// dedicated next-gen `--ui-avatar-*` token tier from @acronis-platform/tokens-pd.\n// A 32px circle (`--ui-avatar-global-avatar-size` / `-border-border-radius`) with a 2px\n// ring (`-border-border-width` / `-border-color`) — the ring is what visually\n// separates avatars when they overlap in an `AvatarGroup`. When no image is set\n// (or it fails to load) the `AvatarFallback` shows initials.\n//\n// The ring is a `box-shadow`, not a CSS `border`: Figma draws the 2px stroke\n// with `strokeAlign: OUTSIDE`, so the 32px is the *colored circle* and the ring\n// sits outside it. A CSS border would be drawn inside the border-box, shrinking\n// the visible circle to 28px (PLTFRM-92393). A box-shadow ring paints outside\n// without inflating the 32px layout box, so the `AvatarGroup` overlap step\n// (32px − 6px gap) still matches the design.\n//\n// It is written as a raw `[box-shadow:…]` arbitrary property, not Tailwind's\n// `shadow-[…]` utility: the utility routes the value through `--tw-shadow-color`\n// (`0 0 0 var(--tw-shadow-color, <spread>) <color>`), which resolves\n// inconsistently for a spread-only ring across engine versions. The raw property\n// emits the literal declaration so every renderer draws the same 2px outset ring.\n//\n// `color` selects one of the eight Figma color schemes; it tints the fallback\n// background (`--ui-avatar-color-<scheme>`) and the initials\n// (`--ui-avatar-label-color-<scheme>`). Initials use the 12px/16px/600 caption\n// style baked into the design (`text-xs font-semibold leading-4`).\nconst avatarVariants = cva(\n 'relative inline-flex shrink-0 select-none items-center justify-center overflow-hidden ' +\n 'size-[var(--ui-avatar-global-avatar-size)] rounded-[var(--ui-avatar-global-avatar-border-border-radius)] ' +\n '[box-shadow:0_0_0_var(--ui-avatar-global-avatar-border-border-width)_var(--ui-avatar-global-avatar-border-color)] ' +\n 'text-xs font-semibold leading-4',\n {\n variants: {\n color: {\n teal: 'bg-[var(--ui-avatar-color-teal)] text-[var(--ui-avatar-label-color-teal)]',\n violet:\n 'bg-[var(--ui-avatar-color-violet)] text-[var(--ui-avatar-label-color-violet)]',\n red: 'bg-[var(--ui-avatar-color-red)] text-[var(--ui-avatar-label-color-red)]',\n yellow:\n 'bg-[var(--ui-avatar-color-yellow)] text-[var(--ui-avatar-label-color-yellow)]',\n orange:\n 'bg-[var(--ui-avatar-color-orange)] text-[var(--ui-avatar-label-color-orange)]',\n blue: 'bg-[var(--ui-avatar-color-blue)] text-[var(--ui-avatar-label-color-blue)]',\n gray: 'bg-[var(--ui-avatar-color-gray)] text-[var(--ui-avatar-label-color-gray)]',\n green:\n 'bg-[var(--ui-avatar-color-green)] text-[var(--ui-avatar-label-color-green)]',\n },\n },\n defaultVariants: {\n color: 'teal',\n },\n }\n);\n\nexport interface AvatarProps\n extends\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n VariantProps<typeof avatarVariants> {}\n\n/**\n * A user/entity avatar: a colored circle showing an image or initials. Compose\n * `AvatarImage` and/or `AvatarFallback` inside; stack several in `AvatarGroup`.\n */\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n AvatarProps\n>(({ className, color, ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(avatarVariants({ color }), className)}\n {...props}\n />\n));\nAvatar.displayName = 'Avatar';\n\nexport type AvatarImageProps = React.ComponentPropsWithoutRef<\n typeof AvatarPrimitive.Image\n>;\n\n/** The avatar image; hidden by Base UI until it loads, revealing the fallback. */\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n AvatarImageProps\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('size-full object-cover', className)}\n {...props}\n />\n));\nAvatarImage.displayName = 'AvatarImage';\n\nexport type AvatarFallbackProps = React.ComponentPropsWithoutRef<\n typeof AvatarPrimitive.Fallback\n>;\n\n/** Shown when there's no image (or it fails) — typically the user's initials. */\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n AvatarFallbackProps\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn('flex size-full items-center justify-center', className)}\n {...props}\n />\n));\nAvatarFallback.displayName = 'AvatarFallback';\n\nexport type AvatarGroupProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Overlapping stack of avatars. Each avatar after the first is pulled left by\n * `--ui-avatar-global-avatar-group-gap` (a negative offset), so their 2px\n * borders form the layered look; later avatars render above earlier ones.\n */\nconst AvatarGroup = React.forwardRef<HTMLDivElement, AvatarGroupProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex items-center [&>*:not(:first-child)]:ms-[var(--ui-avatar-global-avatar-group-gap)]',\n className\n )}\n {...props}\n />\n )\n);\nAvatarGroup.displayName = 'AvatarGroup';\n\nexport { Avatar, AvatarImage, AvatarFallback, AvatarGroup, avatarVariants };\n"],"names":["avatarVariants","cva","Avatar","React","className","color","props","ref","jsx","AvatarPrimitive","cn","AvatarImage","AvatarFallback","AvatarGroup"],"mappings":";;;;;AA8BA,MAAMA,IAAiBC;AAAA,EACrB;AAAA,EAIA;AAAA,IACE,UAAU;AAAA,MACR,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QACE;AAAA,QACF,KAAK;AAAA,QACL,QACE;AAAA,QACF,QACE;AAAA,QACF,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAEF,iBAAiB;AAAA,MACf,OAAO;AAAA,IAAA;AAAA,EACT;AAEJ,GAWMC,IAASC,EAAM,WAGnB,CAAC,EAAE,WAAAC,GAAW,OAAAC,GAAO,GAAGC,KAASC,MACjC,gBAAAC;AAAA,EAACC,EAAgB;AAAA,EAAhB;AAAA,IACC,KAAAF;AAAA,IACA,WAAWG,EAAGV,EAAe,EAAE,OAAAK,EAAA,CAAO,GAAGD,CAAS;AAAA,IACjD,GAAGE;AAAA,EAAA;AACN,CACD;AACDJ,EAAO,cAAc;AAOrB,MAAMS,IAAcR,EAAM,WAGxB,CAAC,EAAE,WAAAC,GAAW,GAAGE,EAAA,GAASC,MAC1B,gBAAAC;AAAA,EAACC,EAAgB;AAAA,EAAhB;AAAA,IACC,KAAAF;AAAA,IACA,WAAWG,EAAG,0BAA0BN,CAAS;AAAA,IAChD,GAAGE;AAAA,EAAA;AACN,CACD;AACDK,EAAY,cAAc;AAO1B,MAAMC,IAAiBT,EAAM,WAG3B,CAAC,EAAE,WAAAC,GAAW,GAAGE,EAAA,GAASC,MAC1B,gBAAAC;AAAA,EAACC,EAAgB;AAAA,EAAhB;AAAA,IACC,KAAAF;AAAA,IACA,WAAWG,EAAG,8CAA8CN,CAAS;AAAA,IACpE,GAAGE;AAAA,EAAA;AACN,CACD;AACDM,EAAe,cAAc;AAS7B,MAAMC,IAAcV,EAAM;AAAA,EACxB,CAAC,EAAE,WAAAC,GAAW,GAAGE,EAAA,GAASC,MACxB,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAD;AAAA,MACA,WAAWG;AAAA,QACT;AAAA,QACAN;AAAA,MAAA;AAAA,MAED,GAAGE;AAAA,IAAA;AAAA,EAAA;AAGV;AACAO,EAAY,cAAc;"}
1
+ {"version":3,"file":"avatar.js","sources":["../../../../src/components/ui/avatar/avatar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Avatar as AvatarPrimitive } from '@base-ui/react/avatar';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '@/lib/utils';\n\n// Wraps Base UI's Avatar primitive (Root / Image / Fallback), themed by the\n// dedicated next-gen `--ui-avatar-*` token tier from @acronis-platform/tokens-pd.\n// A 32px circle (`--ui-avatar-global-avatar-size` / `-border-border-radius`) with a 2px\n// ring (`-border-border-width` / `-border-color`) — the ring is what visually\n// separates avatars when they overlap in an `AvatarGroup`. When no image is set\n// (or it fails to load) the `AvatarFallback` shows initials.\n//\n// `variant`/`label`/`icon` are a convenience for the common no-photo case (the\n// Figma component has no \"image\" variant at all — just Text/Icon): with no\n// `children` composed, Avatar auto-renders either `label` (Text) or `icon`\n// (Icon). Composing `AvatarImage`/`AvatarFallback` as `children` — for the real\n// photo-with-fallback case — always takes precedence over both.\n//\n// \"No `children` composed\" means `children === undefined` specifically, not\n// merely falsy. An explicit `null` child is a deliberate \"render nothing\" and\n// has to stay empty: `timeline.tsx`'s marker passes\n// `icon ?? (initials ? <AvatarFallback/> : null)`, so a blank marker resolves to\n// `null`, and a `children ?? …` check would paint the default 'SB' label over\n// what should be an empty dot.\n//\n// The ring is a `box-shadow`, not a CSS `border`: Figma draws the 2px stroke\n// with `strokeAlign: OUTSIDE`, so the 32px is the *colored circle* and the ring\n// sits outside it. A CSS border would be drawn inside the border-box, shrinking\n// the visible circle to 28px (PLTFRM-92393). A box-shadow ring paints outside\n// without inflating the 32px layout box, so the `AvatarGroup` overlap step\n// (32px − 6px gap) still matches the design.\n//\n// It is written as a raw `[box-shadow:…]` arbitrary property, not Tailwind's\n// `shadow-[…]` utility: the utility routes the value through `--tw-shadow-color`\n// (`0 0 0 var(--tw-shadow-color, <spread>) <color>`), which resolves\n// inconsistently for a spread-only ring across engine versions. The raw property\n// emits the literal declaration so every renderer draws the same 2px outset ring.\n//\n// `color` selects one of the eight Figma color schemes; it tints the fallback\n// background (`--ui-avatar-color-<scheme>`) and the initials\n// (`--ui-avatar-label-color-<scheme>`). Initials use the 12px/16px/600 caption\n// style baked into the design (`text-xs font-semibold leading-4`).\nconst avatarVariants = cva(\n 'relative inline-flex shrink-0 select-none items-center justify-center overflow-hidden ' +\n 'size-[var(--ui-avatar-global-avatar-size)] rounded-[var(--ui-avatar-global-avatar-border-border-radius)] ' +\n '[box-shadow:0_0_0_var(--ui-avatar-global-avatar-border-border-width)_var(--ui-avatar-global-avatar-border-color)] ' +\n 'text-xs font-semibold leading-4',\n {\n variants: {\n color: {\n teal: 'bg-[var(--ui-avatar-color-teal)] text-[var(--ui-avatar-label-color-teal)]',\n violet:\n 'bg-[var(--ui-avatar-color-violet)] text-[var(--ui-avatar-label-color-violet)]',\n red: 'bg-[var(--ui-avatar-color-red)] text-[var(--ui-avatar-label-color-red)]',\n yellow:\n 'bg-[var(--ui-avatar-color-yellow)] text-[var(--ui-avatar-label-color-yellow)]',\n orange:\n 'bg-[var(--ui-avatar-color-orange)] text-[var(--ui-avatar-label-color-orange)]',\n blue: 'bg-[var(--ui-avatar-color-blue)] text-[var(--ui-avatar-label-color-blue)]',\n gray: 'bg-[var(--ui-avatar-color-gray)] text-[var(--ui-avatar-label-color-gray)]',\n green:\n 'bg-[var(--ui-avatar-color-green)] text-[var(--ui-avatar-label-color-green)]',\n },\n },\n defaultVariants: {\n color: 'teal',\n },\n }\n);\n\nexport type AvatarImageProps = React.ComponentPropsWithoutRef<\n typeof AvatarPrimitive.Image\n>;\n\n/** The avatar image; hidden by Base UI until it loads, revealing the fallback. */\nconst AvatarImage = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Image>,\n AvatarImageProps\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n className={cn('size-full object-cover', className)}\n {...props}\n />\n));\nAvatarImage.displayName = 'AvatarImage';\n\nexport type AvatarFallbackProps = React.ComponentPropsWithoutRef<\n typeof AvatarPrimitive.Fallback\n>;\n\n/** Shown when there's no image (or it fails) — typically the user's initials. */\nconst AvatarFallback = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Fallback>,\n AvatarFallbackProps\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n className={cn('flex size-full items-center justify-center', className)}\n {...props}\n />\n));\nAvatarFallback.displayName = 'AvatarFallback';\n\nexport interface AvatarProps\n extends\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>,\n VariantProps<typeof avatarVariants> {\n /**\n * Selects the auto-rendered fallback content when no `children` are\n * composed: initials (`label`) or an `icon`. Ignored once `children` (e.g.\n * `AvatarImage`/`AvatarFallback`) are composed directly — including an\n * explicit `null`, which renders an empty circle.\n */\n variant?: 'text' | 'icon';\n /**\n * Initials shown for the `text` variant when no `children` are composed\n * (i.e. `children` is `undefined`).\n */\n label?: string;\n /**\n * Icon shown for the `icon` variant when no `children` are composed\n * (i.e. `children` is `undefined`).\n */\n icon?: React.ReactNode;\n}\n\n/**\n * A user/entity avatar: a colored circle showing an image, initials, or an\n * icon. Compose `AvatarImage`/`AvatarFallback` for the photo-with-fallback\n * case, or use `variant`/`label`/`icon` for a quick text or icon badge; stack\n * several in `AvatarGroup`.\n */\nconst Avatar = React.forwardRef<\n React.ElementRef<typeof AvatarPrimitive.Root>,\n AvatarProps\n>(\n (\n {\n className,\n color,\n variant = 'text',\n label = 'SB',\n icon,\n children,\n ...props\n },\n ref\n ) => (\n <AvatarPrimitive.Root\n ref={ref}\n className={cn(avatarVariants({ color }), className)}\n {...props}\n >\n {children !== undefined ? (\n children\n ) : variant === 'icon' ? (\n icon\n ) : (\n <AvatarFallback>{label}</AvatarFallback>\n )}\n </AvatarPrimitive.Root>\n )\n);\nAvatar.displayName = 'Avatar';\n\nexport type AvatarGroupProps = React.HTMLAttributes<HTMLDivElement>;\n\n/**\n * Overlapping stack of avatars. Each avatar after the first is pulled left by\n * `--ui-avatar-global-avatar-group-gap` (a negative offset), so their 2px\n * borders form the layered look; later avatars render above earlier ones.\n */\nconst AvatarGroup = React.forwardRef<HTMLDivElement, AvatarGroupProps>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'flex items-center [&>*:not(:first-child)]:ms-[var(--ui-avatar-global-avatar-group-gap)]',\n className\n )}\n {...props}\n />\n )\n);\nAvatarGroup.displayName = 'AvatarGroup';\n\nexport { Avatar, AvatarImage, AvatarFallback, AvatarGroup, avatarVariants };\n"],"names":["avatarVariants","cva","AvatarImage","React","className","props","ref","jsx","AvatarPrimitive","cn","AvatarFallback","Avatar","color","variant","label","icon","children","AvatarGroup"],"mappings":";;;;;AA2CA,MAAMA,IAAiBC;AAAA,EACrB;AAAA,EAIA;AAAA,IACE,UAAU;AAAA,MACR,OAAO;AAAA,QACL,MAAM;AAAA,QACN,QACE;AAAA,QACF,KAAK;AAAA,QACL,QACE;AAAA,QACF,QACE;AAAA,QACF,MAAM;AAAA,QACN,MAAM;AAAA,QACN,OACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAEF,iBAAiB;AAAA,MACf,OAAO;AAAA,IAAA;AAAA,EACT;AAEJ,GAOMC,IAAcC,EAAM,WAGxB,CAAC,EAAE,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAC1B,gBAAAC;AAAA,EAACC,EAAgB;AAAA,EAAhB;AAAA,IACC,KAAAF;AAAA,IACA,WAAWG,EAAG,0BAA0BL,CAAS;AAAA,IAChD,GAAGC;AAAA,EAAA;AACN,CACD;AACDH,EAAY,cAAc;AAO1B,MAAMQ,IAAiBP,EAAM,WAG3B,CAAC,EAAE,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAC1B,gBAAAC;AAAA,EAACC,EAAgB;AAAA,EAAhB;AAAA,IACC,KAAAF;AAAA,IACA,WAAWG,EAAG,8CAA8CL,CAAS;AAAA,IACpE,GAAGC;AAAA,EAAA;AACN,CACD;AACDK,EAAe,cAAc;AA+B7B,MAAMC,IAASR,EAAM;AAAA,EAInB,CACE;AAAA,IACE,WAAAC;AAAA,IACA,OAAAQ;AAAA,IACA,SAAAC,IAAU;AAAA,IACV,OAAAC,IAAQ;AAAA,IACR,MAAAC;AAAA,IACA,UAAAC;AAAA,IACA,GAAGX;AAAA,EAAA,GAELC,MAEA,gBAAAC;AAAA,IAACC,EAAgB;AAAA,IAAhB;AAAA,MACC,KAAAF;AAAA,MACA,WAAWG,EAAGT,EAAe,EAAE,OAAAY,EAAA,CAAO,GAAGR,CAAS;AAAA,MACjD,GAAGC;AAAA,MAEH,UAAAW,MAAa,SACZA,IACEH,MAAY,SACdE,IAEA,gBAAAR,EAACG,KAAgB,UAAAI,EAAA,CAAM;AAAA,IAAA;AAAA,EAAA;AAI/B;AACAH,EAAO,cAAc;AASrB,MAAMM,IAAcd,EAAM;AAAA,EACxB,CAAC,EAAE,WAAAC,GAAW,GAAGC,EAAA,GAASC,MACxB,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAAD;AAAA,MACA,WAAWG;AAAA,QACT;AAAA,QACAL;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,IAAA;AAAA,EAAA;AAGV;AACAY,EAAY,cAAc;"}