@fairmint/ui 0.3.21 → 0.3.23

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 (53) hide show
  1. package/dist/components/generic/AgentSuggestion/AgentSuggestion.cjs +47 -46
  2. package/dist/components/generic/AgentSuggestion/AgentSuggestion.cjs.map +1 -1
  3. package/dist/components/generic/AgentSuggestion/AgentSuggestion.d.ts +1 -1
  4. package/dist/components/generic/AgentSuggestion/AgentSuggestion.d.ts.map +1 -1
  5. package/dist/components/generic/AgentSuggestion/AgentSuggestion.js +47 -46
  6. package/dist/components/generic/AgentSuggestion/AgentSuggestion.js.map +1 -1
  7. package/dist/components/generic/Banner/Banner.cjs +1 -1
  8. package/dist/components/generic/Banner/Banner.cjs.map +1 -1
  9. package/dist/components/generic/Banner/Banner.js +1 -1
  10. package/dist/components/generic/Banner/Banner.js.map +1 -1
  11. package/dist/components/generic/TaskInboxPopover/TaskInboxPopover.cjs +72 -0
  12. package/dist/components/generic/TaskInboxPopover/TaskInboxPopover.cjs.map +1 -0
  13. package/dist/components/generic/TaskInboxPopover/TaskInboxPopover.d.ts +36 -0
  14. package/dist/components/generic/TaskInboxPopover/TaskInboxPopover.d.ts.map +1 -0
  15. package/dist/components/generic/TaskInboxPopover/TaskInboxPopover.js +72 -0
  16. package/dist/components/generic/TaskInboxPopover/TaskInboxPopover.js.map +1 -0
  17. package/dist/components/generic/TaskRow/TaskRow.cjs +31 -6
  18. package/dist/components/generic/TaskRow/TaskRow.cjs.map +1 -1
  19. package/dist/components/generic/TaskRow/TaskRow.d.ts.map +1 -1
  20. package/dist/components/generic/TaskRow/TaskRow.js +31 -6
  21. package/dist/components/generic/TaskRow/TaskRow.js.map +1 -1
  22. package/dist/components/primitives/Popover/Popover.cjs +13 -0
  23. package/dist/components/primitives/Popover/Popover.cjs.map +1 -0
  24. package/dist/components/primitives/Popover/Popover.d.ts +19 -0
  25. package/dist/components/primitives/Popover/Popover.d.ts.map +1 -0
  26. package/dist/components/primitives/Popover/Popover.js +13 -0
  27. package/dist/components/primitives/Popover/Popover.js.map +1 -0
  28. package/dist/components/primitives/index.d.ts +1 -0
  29. package/dist/components/primitives/index.d.ts.map +1 -1
  30. package/dist/components/primitives/muiIcons.d.ts +2 -0
  31. package/dist/components/primitives/muiIcons.d.ts.map +1 -1
  32. package/dist/fairmint-ui.cjs +4 -0
  33. package/dist/fairmint-ui.cjs.map +1 -1
  34. package/dist/fairmint-ui.js +4 -0
  35. package/dist/fairmint-ui.js.map +1 -1
  36. package/dist/index.d.ts +3 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/mui-icons.cjs +10 -14
  39. package/dist/mui-icons.cjs.map +1 -1
  40. package/dist/mui-icons.js +10 -14
  41. package/dist/mui-icons.js.map +1 -1
  42. package/dist/node_modules/@floating-ui/core/dist/floating-ui.core.js +1 -1
  43. package/dist/node_modules/@floating-ui/dom/dist/floating-ui.dom.js +1 -1
  44. package/dist/node_modules/@floating-ui/react-dom/dist/floating-ui.react-dom.js +1 -1
  45. package/dist/notify.cjs +1 -1
  46. package/dist/notify.cjs.map +1 -1
  47. package/dist/notify.js +1 -1
  48. package/dist/notify.js.map +1 -1
  49. package/dist/theme/colors.cjs.map +1 -1
  50. package/dist/theme/colors.d.ts +16 -0
  51. package/dist/theme/colors.d.ts.map +1 -1
  52. package/dist/theme/colors.js.map +1 -1
  53. package/package.json +1 -1
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const React = require("react");
5
4
  const index = require("../../../theme/index.cjs");
6
5
  const ActionIcon = require("../../primitives/ActionIcon/ActionIcon.cjs");
7
6
  const layout = require("../../primitives/layout.cjs");
@@ -10,53 +9,54 @@ const spacing = require("../../../theme/spacing.cjs");
10
9
  const Text = require("../../../node_modules/@mantine/core/esm/components/Text/Text.cjs");
11
10
  const MantineThemeProvider = require("../../../node_modules/@mantine/core/esm/core/MantineProvider/MantineThemeProvider/MantineThemeProvider.cjs");
12
11
  const useComputedColorScheme = require("../../../node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-computed-color-scheme.cjs");
13
- function useCaptableAiBrandPaint() {
12
+ function useCaptableAiInfoAccent() {
14
13
  const theme = MantineThemeProvider.useMantineTheme();
15
14
  const scheme = useComputedColorScheme.useComputedColorScheme("light");
16
15
  const dark = scheme === "dark";
17
16
  const blue = dark ? theme.colors.fairmintBlue[3] : index.brandColors.blue;
18
17
  const purple = dark ? theme.colors.fairmintPurple[2] : index.brandColors.purple;
19
- const markStops = dark ? ["#D0F8FF", "#AEEBFF", "#557CFF"] : ["#557CFF", theme.colors.fairmintBlue[4], index.brandColors.blue];
20
- return {
21
- blue,
22
- purple,
23
- markStops,
24
- accent: `linear-gradient(180deg, ${blue} 0%, ${purple} 100%)`
25
- };
18
+ return `linear-gradient(180deg, ${blue} 0%, ${purple} 100%)`;
26
19
  }
27
- const CAPTABLE_AI_MARK_PATH = "M 120 2 L 73 48 L 16 81 L 17 134 L 16 148 L 12 166 L 5 187 L 0 212 L 47 261 L 78 315 L 141 316 L 153 318 L 187 328 L 210 333 L 253 290 L 276 275 L 314 254 L 314 194 L 315 185 L 331 126 L 331 122 L 284 74 L 252 19 L 185 18 L 160 12 L 131 3 Z M 15 208 L 23 178 L 26 177 L 93 216 L 101 213 L 148 185 L 154 184 L 140 237 L 138 241 L 67 260 Z M 168 187 L 180 206 L 198 239 L 163 300 L 161 302 L 88 302 L 85 299 L 71 274 L 78 271 L 150 252 L 166 191 Z M 125 17 L 143 21 L 157 26 L 126 78 L 116 97 L 147 149 L 148 155 L 115 147 L 92 140 L 73 69 Z M 56 74 L 60 74 L 79 148 L 81 152 L 135 166 L 146 170 L 94 200 L 31 163 L 30 136 L 31 90 L 37 85 Z M 235 135 L 238 135 L 300 171 L 301 244 L 298 247 L 272 262 L 270 259 L 251 184 L 249 182 L 190 167 L 186 164 Z M 316 128 L 307 159 L 236 118 L 178 152 L 178 146 L 184 127 L 186 116 L 192 95 L 194 93 L 260 75 L 264 75 Z M 181 180 L 187 180 L 191 182 L 232 192 L 239 195 L 252 246 L 258 265 L 205 318 L 178 311 L 174 308 L 214 239 L 204 219 L 190 197 Z M 242 32 L 245 35 L 259 60 L 257 62 L 239 66 L 181 82 L 163 148 L 159 143 L 133 98 L 133 95 L 169 34 L 183 32 L 219 33 Z";
28
- function CaptableAiMarkIcon({ stops }) {
29
- const rawId = React.useId();
30
- const gradId = `agent-suggestion-captable-ai-mark-${rawId.replace(/:/g, "")}`;
31
- const [start, mid, end] = stops;
32
- return /* @__PURE__ */ jsxRuntime.jsxs(
33
- "svg",
34
- {
35
- width: 16,
36
- height: 16,
37
- viewBox: "0 0 333 334",
38
- fill: "none",
39
- "aria-hidden": "true",
40
- focusable: "false",
41
- "data-captable-ai-mark": "",
42
- children: [
43
- /* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsxs("linearGradient", { id: gradId, x1: "0", y1: "0", x2: "1", y2: "1", children: [
44
- /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0%", stopColor: start, "data-mark-stop": "start" }),
45
- /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "48%", stopColor: mid, "data-mark-stop": "mid" }),
46
- /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: end, "data-mark-stop": "end" })
47
- ] }) }),
48
- /* @__PURE__ */ jsxRuntime.jsx(
49
- "path",
50
- {
51
- fill: `url(#${gradId})`,
52
- fillRule: "evenodd",
53
- clipRule: "evenodd",
54
- d: CAPTABLE_AI_MARK_PATH
55
- }
56
- )
57
- ]
58
- }
59
- );
20
+ const iconSvgProps = {
21
+ width: 16,
22
+ height: 16,
23
+ viewBox: "0 0 24 24",
24
+ fill: "none",
25
+ stroke: "currentColor",
26
+ strokeWidth: 1.75,
27
+ strokeLinecap: "round",
28
+ strokeLinejoin: "round",
29
+ "aria-hidden": true,
30
+ focusable: "false"
31
+ };
32
+ function ToneIcon({ tone }) {
33
+ if (tone === "warning") {
34
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { ...iconSvgProps, "data-fairmint-suggestion-icon": "warning", children: [
35
+ /* @__PURE__ */ jsxRuntime.jsx("title", { children: "Warning" }),
36
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10.3 4.2 2.6 18a2 2 0 0 0 1.75 3h15.3a2 2 0 0 0 1.75-3L13.7 4.2a2 2 0 0 0-3.4 0Z" }),
37
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 9v4" }),
38
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 17h.01" })
39
+ ] });
40
+ }
41
+ if (tone === "error") {
42
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { ...iconSvgProps, "data-fairmint-suggestion-icon": "error", children: [
43
+ /* @__PURE__ */ jsxRuntime.jsx("title", { children: "Error" }),
44
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "9" }),
45
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m9 9 6 6" }),
46
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m15 9-6 6" })
47
+ ] });
48
+ }
49
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", { ...iconSvgProps, "data-fairmint-suggestion-icon": "info", children: [
50
+ /* @__PURE__ */ jsxRuntime.jsx("title", { children: "Information" }),
51
+ /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "12", cy: "12", r: "9" }),
52
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 11v5" }),
53
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 8h.01" })
54
+ ] });
55
+ }
56
+ function toneIconColor(tone) {
57
+ if (tone === "warning") return index.fairmintVars.colorWarningText;
58
+ if (tone === "error") return index.fairmintVars.colorErrorText;
59
+ return index.fairmintVars.colorInfoText;
60
60
  }
61
61
  function DismissIcon() {
62
62
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -89,9 +89,9 @@ function AgentSuggestion({
89
89
  className,
90
90
  style
91
91
  }) {
92
- const brand = useCaptableAiBrandPaint();
92
+ const infoAccent = useCaptableAiInfoAccent();
93
93
  const resolvedRole = role ?? (tone === "error" ? "alert" : "status");
94
- const resolvedIcon = icon === null ? null : icon ?? /* @__PURE__ */ jsxRuntime.jsx(CaptableAiMarkIcon, { stops: brand.markStops });
94
+ const resolvedIcon = icon === null ? null : icon ?? /* @__PURE__ */ jsxRuntime.jsx(ToneIcon, { tone });
95
95
  const surface = tone === "warning" ? {
96
96
  background: "transparent",
97
97
  border: index.fairmintVars.colorWarningBorder,
@@ -103,7 +103,7 @@ function AgentSuggestion({
103
103
  } : {
104
104
  background: "transparent",
105
105
  border: index.fairmintVars.colorBorderDefault,
106
- accent: brand.accent
106
+ accent: infoAccent
107
107
  };
108
108
  return /* @__PURE__ */ jsxRuntime.jsxs(
109
109
  layout.Box,
@@ -149,7 +149,8 @@ function AgentSuggestion({
149
149
  flexShrink: 0,
150
150
  marginTop: 2,
151
151
  width: 16,
152
- height: 16
152
+ height: 16,
153
+ color: toneIconColor(tone)
153
154
  },
154
155
  children: resolvedIcon
155
156
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AgentSuggestion.cjs","sources":["../../../../src/components/generic/AgentSuggestion/AgentSuggestion.tsx"],"sourcesContent":["import type { AriaRole, CSSProperties, ReactNode } from \"react\";\nimport { useId } from \"react\";\nimport { brandColors, fairmintVars, spacing } from \"../../../theme\";\nimport { ActionIcon } from \"../../primitives/ActionIcon/ActionIcon\";\nimport { Box, Stack, Text, useComputedColorScheme, useMantineTheme } from \"../../primitives/layout\";\nimport { Tooltip } from \"../../primitives/Tooltip/Tooltip\";\n\nexport type AgentSuggestionTone = \"info\" | \"warning\" | \"error\";\n\nexport interface AgentSuggestionProps {\n /** Short title — typically a humanized agent code label. */\n title: ReactNode;\n /** Supporting detail from the agent. */\n message?: ReactNode;\n /**\n * Semantic meaning. `error` / `warning` use severity surfaces because they\n * map to actionable / blocking review states in CaptableAI. `info` stays\n * CaptableAI-branded (blue→purple accent).\n * @default \"info\"\n */\n tone?: AgentSuggestionTone;\n /**\n * Leading icon. Pass `null` to hide.\n * When omitted, the CaptableAI brand mark is shown.\n */\n icon?: ReactNode | null;\n /** When set, renders a dismiss control. */\n onDismiss?: () => void;\n /** Accessible label for the dismiss control. @default \"Dismiss\" */\n dismissLabel?: string;\n /** Override the default accessible role. Error defaults to alert; other tones use status. */\n role?: AriaRole;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * CaptableAI brand stops for the left accent (Fairmint blue→purple) and the\n * logo-symbol mark (CaptableAI cyan→blue). Dark mode uses the official\n * CaptableAILogoSymbol gradient so the mark reads on charcoal; light mode\n * shifts toward stronger blues for contrast on white.\n */\nfunction useCaptableAiBrandPaint() {\n const theme = useMantineTheme();\n const scheme = useComputedColorScheme(\"light\");\n const dark = scheme === \"dark\";\n\n const blue = dark ? theme.colors.fairmintBlue[3] : brandColors.blue;\n const purple = dark ? theme.colors.fairmintPurple[2] : brandColors.purple;\n\n // From studiov2 CaptableAILogoSymbol.svg (dark / brand-on-navy).\n const markStops: [string, string, string] = dark\n ? [\"#D0F8FF\", \"#AEEBFF\", \"#557CFF\"]\n : [\"#557CFF\", theme.colors.fairmintBlue[4], brandColors.blue];\n\n return {\n blue,\n purple,\n markStops,\n accent: `linear-gradient(180deg, ${blue} 0%, ${purple} 100%)`,\n };\n}\n\n/** CaptableAI logo symbol path — studiov2 `CaptableAILogoSymbol.svg` / `captable-ai-icon.svg`. */\nconst CAPTABLE_AI_MARK_PATH =\n \"M 120 2 L 73 48 L 16 81 L 17 134 L 16 148 L 12 166 L 5 187 L 0 212 L 47 261 L 78 315 L 141 316 L 153 318 L 187 328 L 210 333 L 253 290 L 276 275 L 314 254 L 314 194 L 315 185 L 331 126 L 331 122 L 284 74 L 252 19 L 185 18 L 160 12 L 131 3 Z M 15 208 L 23 178 L 26 177 L 93 216 L 101 213 L 148 185 L 154 184 L 140 237 L 138 241 L 67 260 Z M 168 187 L 180 206 L 198 239 L 163 300 L 161 302 L 88 302 L 85 299 L 71 274 L 78 271 L 150 252 L 166 191 Z M 125 17 L 143 21 L 157 26 L 126 78 L 116 97 L 147 149 L 148 155 L 115 147 L 92 140 L 73 69 Z M 56 74 L 60 74 L 79 148 L 81 152 L 135 166 L 146 170 L 94 200 L 31 163 L 30 136 L 31 90 L 37 85 Z M 235 135 L 238 135 L 300 171 L 301 244 L 298 247 L 272 262 L 270 259 L 251 184 L 249 182 L 190 167 L 186 164 Z M 316 128 L 307 159 L 236 118 L 178 152 L 178 146 L 184 127 L 186 116 L 192 95 L 194 93 L 260 75 L 264 75 Z M 181 180 L 187 180 L 191 182 L 232 192 L 239 195 L 252 246 L 258 265 L 205 318 L 178 311 L 174 308 L 214 239 L 204 219 L 190 197 Z M 242 32 L 245 35 L 259 60 L 257 62 L 239 66 L 181 82 L 163 148 L 159 143 L 133 98 L 133 95 L 169 34 L 183 32 L 219 33 Z\";\n\nfunction CaptableAiMarkIcon({ stops }: { stops: [string, string, string] }) {\n const rawId = useId();\n const gradId = `agent-suggestion-captable-ai-mark-${rawId.replace(/:/g, \"\")}`;\n const [start, mid, end] = stops;\n\n return (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 333 334\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n data-captable-ai-mark=\"\"\n >\n <defs>\n <linearGradient id={gradId} x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0%\" stopColor={start} data-mark-stop=\"start\" />\n <stop offset=\"48%\" stopColor={mid} data-mark-stop=\"mid\" />\n <stop offset=\"100%\" stopColor={end} data-mark-stop=\"end\" />\n </linearGradient>\n </defs>\n <path\n fill={`url(#${gradId})`}\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d={CAPTABLE_AI_MARK_PATH}\n />\n </svg>\n );\n}\n\nfunction DismissIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/**\n * Dense, agent-originated review note. Distinct from Alert/Banner so stacked\n * suggestions do not compete with a single page-level severity summary.\n *\n * Pattern candidate: compose a list of `AgentSuggestion` under one parent\n * Alert or Banner (\"N suggestions need review\") — never N banners.\n */\nexport function AgentSuggestion({\n title,\n message,\n tone = \"info\",\n icon,\n onDismiss,\n dismissLabel = \"Dismiss\",\n role,\n className,\n style,\n}: AgentSuggestionProps) {\n const brand = useCaptableAiBrandPaint();\n const resolvedRole = role ?? (tone === \"error\" ? \"alert\" : \"status\");\n const resolvedIcon =\n icon === null ? null : (icon ?? <CaptableAiMarkIcon stops={brand.markStops} />);\n\n // Warning accent shares the border token so the strip reads orange (not the\n // red-adjacent Solid). Error keeps Solid — in dark it matches the border.\n const surface =\n tone === \"warning\"\n ? {\n background: \"transparent\",\n border: fairmintVars.colorWarningBorder,\n accent: fairmintVars.colorWarningBorder,\n }\n : tone === \"error\"\n ? {\n background: \"transparent\",\n border: fairmintVars.colorErrorBorder,\n accent: fairmintVars.colorErrorSolid,\n }\n : {\n background: \"transparent\",\n border: fairmintVars.colorBorderDefault,\n accent: brand.accent,\n };\n\n return (\n <Box\n className={className}\n role={resolvedRole}\n data-tone={tone}\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: spacing.xs,\n backgroundColor: surface.background,\n border: `1px solid ${surface.border}`,\n borderRadius: 2,\n paddingBlock: spacing.xs,\n paddingInlineStart: spacing.sm,\n paddingInlineEnd: spacing.xs,\n overflow: \"hidden\",\n ...style,\n }}\n >\n <Box\n aria-hidden\n data-accent=\"\"\n style={{\n position: \"absolute\",\n insetBlock: 0,\n insetInlineStart: 0,\n width: 3,\n background: surface.accent,\n // No own radius — container overflow:hidden + borderRadius:2 clips flush.\n }}\n />\n\n {resolvedIcon ? (\n <Box\n style={{\n display: \"flex\",\n flexShrink: 0,\n marginTop: 2,\n width: 16,\n height: 16,\n }}\n >\n {resolvedIcon}\n </Box>\n ) : null}\n\n <Stack gap={4} style={{ flex: 1, minWidth: 0 }}>\n <Text size=\"sm\" fw={500} c={fairmintVars.colorTextPrimary} lh={1.3}>\n {title}\n </Text>\n {message ? (\n <Text size=\"xs\" c={fairmintVars.colorTextSecondary} lh={1.4}>\n {message}\n </Text>\n ) : null}\n </Stack>\n\n {onDismiss ? (\n <Tooltip label={dismissLabel} withArrow position=\"top\">\n <ActionIcon\n size=\"sm\"\n variant=\"subtle\"\n color=\"gray\"\n aria-label={dismissLabel}\n onClick={onDismiss}\n style={{ flexShrink: 0, marginTop: -2 }}\n >\n <DismissIcon />\n </ActionIcon>\n </Tooltip>\n ) : null}\n </Box>\n );\n}\n\n/** Convenience stack for composing multiple agent suggestions without inventing layout. */\nexport interface AgentSuggestionListProps {\n children: ReactNode;\n gap?: number | string;\n className?: string;\n}\n\nexport function AgentSuggestionList({\n children,\n gap = spacing.xs,\n className,\n}: AgentSuggestionListProps) {\n return (\n <Stack gap={gap} className={className}>\n {children}\n </Stack>\n );\n}\n"],"names":["useMantineTheme","useComputedColorScheme","brandColors","useId","jsxs","jsx","fairmintVars","Box","spacing","Stack","Text","Tooltip","ActionIcon"],"mappings":"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"}
1
+ {"version":3,"file":"AgentSuggestion.cjs","sources":["../../../../src/components/generic/AgentSuggestion/AgentSuggestion.tsx"],"sourcesContent":["import type { AriaRole, CSSProperties, ReactNode } from \"react\";\nimport { brandColors, fairmintVars, spacing } from \"../../../theme\";\nimport { ActionIcon } from \"../../primitives/ActionIcon/ActionIcon\";\nimport { Box, Stack, Text, useComputedColorScheme, useMantineTheme } from \"../../primitives/layout\";\nimport { Tooltip } from \"../../primitives/Tooltip/Tooltip\";\n\nexport type AgentSuggestionTone = \"info\" | \"warning\" | \"error\";\n\nexport interface AgentSuggestionProps {\n /** Short title — typically a humanized agent code label. */\n title: ReactNode;\n /** Supporting detail from the agent. */\n message?: ReactNode;\n /**\n * Semantic meaning. `error` / `warning` use severity surfaces because they\n * map to actionable / blocking review states in CaptableAI. `info` stays\n * CaptableAI-branded (blue→purple accent).\n * @default \"info\"\n */\n tone?: AgentSuggestionTone;\n /**\n * Leading icon. Pass `null` to hide.\n * When omitted, an outlined semantic icon matching `tone` is shown.\n */\n icon?: ReactNode | null;\n /** When set, renders a dismiss control. */\n onDismiss?: () => void;\n /** Accessible label for the dismiss control. @default \"Dismiss\" */\n dismissLabel?: string;\n /** Override the default accessible role. Error defaults to alert; other tones use status. */\n role?: AriaRole;\n className?: string;\n style?: CSSProperties;\n}\n\n/** CaptableAI blue→purple left accent for the info tone (scheme-aware). */\nfunction useCaptableAiInfoAccent() {\n const theme = useMantineTheme();\n const scheme = useComputedColorScheme(\"light\");\n const dark = scheme === \"dark\";\n const blue = dark ? theme.colors.fairmintBlue[3] : brandColors.blue;\n const purple = dark ? theme.colors.fairmintPurple[2] : brandColors.purple;\n return `linear-gradient(180deg, ${blue} 0%, ${purple} 100%)`;\n}\n\nconst iconSvgProps = {\n width: 16,\n height: 16,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 1.75,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n \"aria-hidden\": true as const,\n focusable: \"false\" as const,\n};\n\nfunction ToneIcon({ tone }: { tone: AgentSuggestionTone }) {\n if (tone === \"warning\") {\n return (\n <svg {...iconSvgProps} data-fairmint-suggestion-icon=\"warning\">\n <title>Warning</title>\n <path d=\"M10.3 4.2 2.6 18a2 2 0 0 0 1.75 3h15.3a2 2 0 0 0 1.75-3L13.7 4.2a2 2 0 0 0-3.4 0Z\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n }\n\n if (tone === \"error\") {\n return (\n <svg {...iconSvgProps} data-fairmint-suggestion-icon=\"error\">\n <title>Error</title>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"m9 9 6 6\" />\n <path d=\"m15 9-6 6\" />\n </svg>\n );\n }\n\n return (\n <svg {...iconSvgProps} data-fairmint-suggestion-icon=\"info\">\n <title>Information</title>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 11v5\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n}\n\nfunction toneIconColor(tone: AgentSuggestionTone): string {\n if (tone === \"warning\") return fairmintVars.colorWarningText;\n if (tone === \"error\") return fairmintVars.colorErrorText;\n return fairmintVars.colorInfoText;\n}\n\nfunction DismissIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/**\n * Dense, agent-originated review note. Distinct from Alert/Banner so stacked\n * suggestions do not compete with a single page-level severity summary.\n *\n * Pattern candidate: compose a list of `AgentSuggestion` under one parent\n * Alert or Banner (\"N suggestions need review\") — never N banners.\n */\nexport function AgentSuggestion({\n title,\n message,\n tone = \"info\",\n icon,\n onDismiss,\n dismissLabel = \"Dismiss\",\n role,\n className,\n style,\n}: AgentSuggestionProps) {\n const infoAccent = useCaptableAiInfoAccent();\n const resolvedRole = role ?? (tone === \"error\" ? \"alert\" : \"status\");\n const resolvedIcon = icon === null ? null : (icon ?? <ToneIcon tone={tone} />);\n\n // Warning accent shares the border token so the strip reads orange (not the\n // red-adjacent Solid). Error keeps Solid — in dark it matches the border.\n const surface =\n tone === \"warning\"\n ? {\n background: \"transparent\",\n border: fairmintVars.colorWarningBorder,\n accent: fairmintVars.colorWarningBorder,\n }\n : tone === \"error\"\n ? {\n background: \"transparent\",\n border: fairmintVars.colorErrorBorder,\n accent: fairmintVars.colorErrorSolid,\n }\n : {\n background: \"transparent\",\n border: fairmintVars.colorBorderDefault,\n accent: infoAccent,\n };\n\n return (\n <Box\n className={className}\n role={resolvedRole}\n data-tone={tone}\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: spacing.xs,\n backgroundColor: surface.background,\n border: `1px solid ${surface.border}`,\n borderRadius: 2,\n paddingBlock: spacing.xs,\n paddingInlineStart: spacing.sm,\n paddingInlineEnd: spacing.xs,\n overflow: \"hidden\",\n ...style,\n }}\n >\n <Box\n aria-hidden\n data-accent=\"\"\n style={{\n position: \"absolute\",\n insetBlock: 0,\n insetInlineStart: 0,\n width: 3,\n background: surface.accent,\n // No own radius — container overflow:hidden + borderRadius:2 clips flush.\n }}\n />\n\n {resolvedIcon ? (\n <Box\n style={{\n display: \"flex\",\n flexShrink: 0,\n marginTop: 2,\n width: 16,\n height: 16,\n color: toneIconColor(tone),\n }}\n >\n {resolvedIcon}\n </Box>\n ) : null}\n\n <Stack gap={4} style={{ flex: 1, minWidth: 0 }}>\n <Text size=\"sm\" fw={500} c={fairmintVars.colorTextPrimary} lh={1.3}>\n {title}\n </Text>\n {message ? (\n <Text size=\"xs\" c={fairmintVars.colorTextSecondary} lh={1.4}>\n {message}\n </Text>\n ) : null}\n </Stack>\n\n {onDismiss ? (\n <Tooltip label={dismissLabel} withArrow position=\"top\">\n <ActionIcon\n size=\"sm\"\n variant=\"subtle\"\n color=\"gray\"\n aria-label={dismissLabel}\n onClick={onDismiss}\n style={{ flexShrink: 0, marginTop: -2 }}\n >\n <DismissIcon />\n </ActionIcon>\n </Tooltip>\n ) : null}\n </Box>\n );\n}\n\n/** Convenience stack for composing multiple agent suggestions without inventing layout. */\nexport interface AgentSuggestionListProps {\n children: ReactNode;\n gap?: number | string;\n className?: string;\n}\n\nexport function AgentSuggestionList({\n children,\n gap = spacing.xs,\n className,\n}: AgentSuggestionListProps) {\n return (\n <Stack gap={gap} className={className}>\n {children}\n </Stack>\n );\n}\n"],"names":["useMantineTheme","useComputedColorScheme","brandColors","jsxs","jsx","fairmintVars","Box","spacing","Stack","Text","Tooltip","ActionIcon"],"mappings":"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"}
@@ -14,7 +14,7 @@ export interface AgentSuggestionProps {
14
14
  tone?: AgentSuggestionTone;
15
15
  /**
16
16
  * Leading icon. Pass `null` to hide.
17
- * When omitted, the CaptableAI brand mark is shown.
17
+ * When omitted, an outlined semantic icon matching `tone` is shown.
18
18
  */
19
19
  icon?: ReactNode | null;
20
20
  /** When set, renders a dismiss control. */
@@ -1 +1 @@
1
- {"version":3,"file":"AgentSuggestion.d.ts","sourceRoot":"","sources":["../../../../src/components/generic/AgentSuggestion/AgentSuggestion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOhE,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,4DAA4D;IAC5D,KAAK,EAAE,SAAS,CAAC;IACjB,wCAAwC;IACxC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6FAA6F;IAC7F,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAoFD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,OAAO,EACP,IAAa,EACb,IAAI,EACJ,SAAS,EACT,YAAwB,EACxB,IAAI,EACJ,SAAS,EACT,KAAK,GACN,EAAE,oBAAoB,2CAqGtB;AAED,2FAA2F;AAC3F,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,SAAS,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,GAAgB,EAChB,SAAS,GACV,EAAE,wBAAwB,2CAM1B"}
1
+ {"version":3,"file":"AgentSuggestion.d.ts","sourceRoot":"","sources":["../../../../src/components/generic/AgentSuggestion/AgentSuggestion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMhE,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,4DAA4D;IAC5D,KAAK,EAAE,SAAS,CAAC;IACjB,wCAAwC;IACxC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B;;;OAGG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6FAA6F;IAC7F,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAmFD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,OAAO,EACP,IAAa,EACb,IAAI,EACJ,SAAS,EACT,YAAwB,EACxB,IAAI,EACJ,SAAS,EACT,KAAK,GACN,EAAE,oBAAoB,2CAqGtB;AAED,2FAA2F;AAC3F,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,SAAS,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,GAAgB,EAChB,SAAS,GACV,EAAE,wBAAwB,2CAM1B"}
@@ -1,5 +1,4 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
- import { useId } from "react";
3
2
  import { fairmintVars, brandColors } from "../../../theme/index.js";
4
3
  import { ActionIcon } from "../../primitives/ActionIcon/ActionIcon.js";
5
4
  import { Box, Stack } from "../../primitives/layout.js";
@@ -8,53 +7,54 @@ import { spacing } from "../../../theme/spacing.js";
8
7
  import { Text } from "../../../node_modules/@mantine/core/esm/components/Text/Text.js";
9
8
  import { useMantineTheme } from "../../../node_modules/@mantine/core/esm/core/MantineProvider/MantineThemeProvider/MantineThemeProvider.js";
10
9
  import { useComputedColorScheme } from "../../../node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-computed-color-scheme.js";
11
- function useCaptableAiBrandPaint() {
10
+ function useCaptableAiInfoAccent() {
12
11
  const theme = useMantineTheme();
13
12
  const scheme = useComputedColorScheme("light");
14
13
  const dark = scheme === "dark";
15
14
  const blue = dark ? theme.colors.fairmintBlue[3] : brandColors.blue;
16
15
  const purple = dark ? theme.colors.fairmintPurple[2] : brandColors.purple;
17
- const markStops = dark ? ["#D0F8FF", "#AEEBFF", "#557CFF"] : ["#557CFF", theme.colors.fairmintBlue[4], brandColors.blue];
18
- return {
19
- blue,
20
- purple,
21
- markStops,
22
- accent: `linear-gradient(180deg, ${blue} 0%, ${purple} 100%)`
23
- };
16
+ return `linear-gradient(180deg, ${blue} 0%, ${purple} 100%)`;
24
17
  }
25
- const CAPTABLE_AI_MARK_PATH = "M 120 2 L 73 48 L 16 81 L 17 134 L 16 148 L 12 166 L 5 187 L 0 212 L 47 261 L 78 315 L 141 316 L 153 318 L 187 328 L 210 333 L 253 290 L 276 275 L 314 254 L 314 194 L 315 185 L 331 126 L 331 122 L 284 74 L 252 19 L 185 18 L 160 12 L 131 3 Z M 15 208 L 23 178 L 26 177 L 93 216 L 101 213 L 148 185 L 154 184 L 140 237 L 138 241 L 67 260 Z M 168 187 L 180 206 L 198 239 L 163 300 L 161 302 L 88 302 L 85 299 L 71 274 L 78 271 L 150 252 L 166 191 Z M 125 17 L 143 21 L 157 26 L 126 78 L 116 97 L 147 149 L 148 155 L 115 147 L 92 140 L 73 69 Z M 56 74 L 60 74 L 79 148 L 81 152 L 135 166 L 146 170 L 94 200 L 31 163 L 30 136 L 31 90 L 37 85 Z M 235 135 L 238 135 L 300 171 L 301 244 L 298 247 L 272 262 L 270 259 L 251 184 L 249 182 L 190 167 L 186 164 Z M 316 128 L 307 159 L 236 118 L 178 152 L 178 146 L 184 127 L 186 116 L 192 95 L 194 93 L 260 75 L 264 75 Z M 181 180 L 187 180 L 191 182 L 232 192 L 239 195 L 252 246 L 258 265 L 205 318 L 178 311 L 174 308 L 214 239 L 204 219 L 190 197 Z M 242 32 L 245 35 L 259 60 L 257 62 L 239 66 L 181 82 L 163 148 L 159 143 L 133 98 L 133 95 L 169 34 L 183 32 L 219 33 Z";
26
- function CaptableAiMarkIcon({ stops }) {
27
- const rawId = useId();
28
- const gradId = `agent-suggestion-captable-ai-mark-${rawId.replace(/:/g, "")}`;
29
- const [start, mid, end] = stops;
30
- return /* @__PURE__ */ jsxs(
31
- "svg",
32
- {
33
- width: 16,
34
- height: 16,
35
- viewBox: "0 0 333 334",
36
- fill: "none",
37
- "aria-hidden": "true",
38
- focusable: "false",
39
- "data-captable-ai-mark": "",
40
- children: [
41
- /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("linearGradient", { id: gradId, x1: "0", y1: "0", x2: "1", y2: "1", children: [
42
- /* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: start, "data-mark-stop": "start" }),
43
- /* @__PURE__ */ jsx("stop", { offset: "48%", stopColor: mid, "data-mark-stop": "mid" }),
44
- /* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: end, "data-mark-stop": "end" })
45
- ] }) }),
46
- /* @__PURE__ */ jsx(
47
- "path",
48
- {
49
- fill: `url(#${gradId})`,
50
- fillRule: "evenodd",
51
- clipRule: "evenodd",
52
- d: CAPTABLE_AI_MARK_PATH
53
- }
54
- )
55
- ]
56
- }
57
- );
18
+ const iconSvgProps = {
19
+ width: 16,
20
+ height: 16,
21
+ viewBox: "0 0 24 24",
22
+ fill: "none",
23
+ stroke: "currentColor",
24
+ strokeWidth: 1.75,
25
+ strokeLinecap: "round",
26
+ strokeLinejoin: "round",
27
+ "aria-hidden": true,
28
+ focusable: "false"
29
+ };
30
+ function ToneIcon({ tone }) {
31
+ if (tone === "warning") {
32
+ return /* @__PURE__ */ jsxs("svg", { ...iconSvgProps, "data-fairmint-suggestion-icon": "warning", children: [
33
+ /* @__PURE__ */ jsx("title", { children: "Warning" }),
34
+ /* @__PURE__ */ jsx("path", { d: "M10.3 4.2 2.6 18a2 2 0 0 0 1.75 3h15.3a2 2 0 0 0 1.75-3L13.7 4.2a2 2 0 0 0-3.4 0Z" }),
35
+ /* @__PURE__ */ jsx("path", { d: "M12 9v4" }),
36
+ /* @__PURE__ */ jsx("path", { d: "M12 17h.01" })
37
+ ] });
38
+ }
39
+ if (tone === "error") {
40
+ return /* @__PURE__ */ jsxs("svg", { ...iconSvgProps, "data-fairmint-suggestion-icon": "error", children: [
41
+ /* @__PURE__ */ jsx("title", { children: "Error" }),
42
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "9" }),
43
+ /* @__PURE__ */ jsx("path", { d: "m9 9 6 6" }),
44
+ /* @__PURE__ */ jsx("path", { d: "m15 9-6 6" })
45
+ ] });
46
+ }
47
+ return /* @__PURE__ */ jsxs("svg", { ...iconSvgProps, "data-fairmint-suggestion-icon": "info", children: [
48
+ /* @__PURE__ */ jsx("title", { children: "Information" }),
49
+ /* @__PURE__ */ jsx("circle", { cx: "12", cy: "12", r: "9" }),
50
+ /* @__PURE__ */ jsx("path", { d: "M12 11v5" }),
51
+ /* @__PURE__ */ jsx("path", { d: "M12 8h.01" })
52
+ ] });
53
+ }
54
+ function toneIconColor(tone) {
55
+ if (tone === "warning") return fairmintVars.colorWarningText;
56
+ if (tone === "error") return fairmintVars.colorErrorText;
57
+ return fairmintVars.colorInfoText;
58
58
  }
59
59
  function DismissIcon() {
60
60
  return /* @__PURE__ */ jsxs(
@@ -87,9 +87,9 @@ function AgentSuggestion({
87
87
  className,
88
88
  style
89
89
  }) {
90
- const brand = useCaptableAiBrandPaint();
90
+ const infoAccent = useCaptableAiInfoAccent();
91
91
  const resolvedRole = role ?? (tone === "error" ? "alert" : "status");
92
- const resolvedIcon = icon === null ? null : icon ?? /* @__PURE__ */ jsx(CaptableAiMarkIcon, { stops: brand.markStops });
92
+ const resolvedIcon = icon === null ? null : icon ?? /* @__PURE__ */ jsx(ToneIcon, { tone });
93
93
  const surface = tone === "warning" ? {
94
94
  background: "transparent",
95
95
  border: fairmintVars.colorWarningBorder,
@@ -101,7 +101,7 @@ function AgentSuggestion({
101
101
  } : {
102
102
  background: "transparent",
103
103
  border: fairmintVars.colorBorderDefault,
104
- accent: brand.accent
104
+ accent: infoAccent
105
105
  };
106
106
  return /* @__PURE__ */ jsxs(
107
107
  Box,
@@ -147,7 +147,8 @@ function AgentSuggestion({
147
147
  flexShrink: 0,
148
148
  marginTop: 2,
149
149
  width: 16,
150
- height: 16
150
+ height: 16,
151
+ color: toneIconColor(tone)
151
152
  },
152
153
  children: resolvedIcon
153
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AgentSuggestion.js","sources":["../../../../src/components/generic/AgentSuggestion/AgentSuggestion.tsx"],"sourcesContent":["import type { AriaRole, CSSProperties, ReactNode } from \"react\";\nimport { useId } from \"react\";\nimport { brandColors, fairmintVars, spacing } from \"../../../theme\";\nimport { ActionIcon } from \"../../primitives/ActionIcon/ActionIcon\";\nimport { Box, Stack, Text, useComputedColorScheme, useMantineTheme } from \"../../primitives/layout\";\nimport { Tooltip } from \"../../primitives/Tooltip/Tooltip\";\n\nexport type AgentSuggestionTone = \"info\" | \"warning\" | \"error\";\n\nexport interface AgentSuggestionProps {\n /** Short title — typically a humanized agent code label. */\n title: ReactNode;\n /** Supporting detail from the agent. */\n message?: ReactNode;\n /**\n * Semantic meaning. `error` / `warning` use severity surfaces because they\n * map to actionable / blocking review states in CaptableAI. `info` stays\n * CaptableAI-branded (blue→purple accent).\n * @default \"info\"\n */\n tone?: AgentSuggestionTone;\n /**\n * Leading icon. Pass `null` to hide.\n * When omitted, the CaptableAI brand mark is shown.\n */\n icon?: ReactNode | null;\n /** When set, renders a dismiss control. */\n onDismiss?: () => void;\n /** Accessible label for the dismiss control. @default \"Dismiss\" */\n dismissLabel?: string;\n /** Override the default accessible role. Error defaults to alert; other tones use status. */\n role?: AriaRole;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * CaptableAI brand stops for the left accent (Fairmint blue→purple) and the\n * logo-symbol mark (CaptableAI cyan→blue). Dark mode uses the official\n * CaptableAILogoSymbol gradient so the mark reads on charcoal; light mode\n * shifts toward stronger blues for contrast on white.\n */\nfunction useCaptableAiBrandPaint() {\n const theme = useMantineTheme();\n const scheme = useComputedColorScheme(\"light\");\n const dark = scheme === \"dark\";\n\n const blue = dark ? theme.colors.fairmintBlue[3] : brandColors.blue;\n const purple = dark ? theme.colors.fairmintPurple[2] : brandColors.purple;\n\n // From studiov2 CaptableAILogoSymbol.svg (dark / brand-on-navy).\n const markStops: [string, string, string] = dark\n ? [\"#D0F8FF\", \"#AEEBFF\", \"#557CFF\"]\n : [\"#557CFF\", theme.colors.fairmintBlue[4], brandColors.blue];\n\n return {\n blue,\n purple,\n markStops,\n accent: `linear-gradient(180deg, ${blue} 0%, ${purple} 100%)`,\n };\n}\n\n/** CaptableAI logo symbol path — studiov2 `CaptableAILogoSymbol.svg` / `captable-ai-icon.svg`. */\nconst CAPTABLE_AI_MARK_PATH =\n \"M 120 2 L 73 48 L 16 81 L 17 134 L 16 148 L 12 166 L 5 187 L 0 212 L 47 261 L 78 315 L 141 316 L 153 318 L 187 328 L 210 333 L 253 290 L 276 275 L 314 254 L 314 194 L 315 185 L 331 126 L 331 122 L 284 74 L 252 19 L 185 18 L 160 12 L 131 3 Z M 15 208 L 23 178 L 26 177 L 93 216 L 101 213 L 148 185 L 154 184 L 140 237 L 138 241 L 67 260 Z M 168 187 L 180 206 L 198 239 L 163 300 L 161 302 L 88 302 L 85 299 L 71 274 L 78 271 L 150 252 L 166 191 Z M 125 17 L 143 21 L 157 26 L 126 78 L 116 97 L 147 149 L 148 155 L 115 147 L 92 140 L 73 69 Z M 56 74 L 60 74 L 79 148 L 81 152 L 135 166 L 146 170 L 94 200 L 31 163 L 30 136 L 31 90 L 37 85 Z M 235 135 L 238 135 L 300 171 L 301 244 L 298 247 L 272 262 L 270 259 L 251 184 L 249 182 L 190 167 L 186 164 Z M 316 128 L 307 159 L 236 118 L 178 152 L 178 146 L 184 127 L 186 116 L 192 95 L 194 93 L 260 75 L 264 75 Z M 181 180 L 187 180 L 191 182 L 232 192 L 239 195 L 252 246 L 258 265 L 205 318 L 178 311 L 174 308 L 214 239 L 204 219 L 190 197 Z M 242 32 L 245 35 L 259 60 L 257 62 L 239 66 L 181 82 L 163 148 L 159 143 L 133 98 L 133 95 L 169 34 L 183 32 L 219 33 Z\";\n\nfunction CaptableAiMarkIcon({ stops }: { stops: [string, string, string] }) {\n const rawId = useId();\n const gradId = `agent-suggestion-captable-ai-mark-${rawId.replace(/:/g, \"\")}`;\n const [start, mid, end] = stops;\n\n return (\n <svg\n width={16}\n height={16}\n viewBox=\"0 0 333 334\"\n fill=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n data-captable-ai-mark=\"\"\n >\n <defs>\n <linearGradient id={gradId} x1=\"0\" y1=\"0\" x2=\"1\" y2=\"1\">\n <stop offset=\"0%\" stopColor={start} data-mark-stop=\"start\" />\n <stop offset=\"48%\" stopColor={mid} data-mark-stop=\"mid\" />\n <stop offset=\"100%\" stopColor={end} data-mark-stop=\"end\" />\n </linearGradient>\n </defs>\n <path\n fill={`url(#${gradId})`}\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d={CAPTABLE_AI_MARK_PATH}\n />\n </svg>\n );\n}\n\nfunction DismissIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/**\n * Dense, agent-originated review note. Distinct from Alert/Banner so stacked\n * suggestions do not compete with a single page-level severity summary.\n *\n * Pattern candidate: compose a list of `AgentSuggestion` under one parent\n * Alert or Banner (\"N suggestions need review\") — never N banners.\n */\nexport function AgentSuggestion({\n title,\n message,\n tone = \"info\",\n icon,\n onDismiss,\n dismissLabel = \"Dismiss\",\n role,\n className,\n style,\n}: AgentSuggestionProps) {\n const brand = useCaptableAiBrandPaint();\n const resolvedRole = role ?? (tone === \"error\" ? \"alert\" : \"status\");\n const resolvedIcon =\n icon === null ? null : (icon ?? <CaptableAiMarkIcon stops={brand.markStops} />);\n\n // Warning accent shares the border token so the strip reads orange (not the\n // red-adjacent Solid). Error keeps Solid — in dark it matches the border.\n const surface =\n tone === \"warning\"\n ? {\n background: \"transparent\",\n border: fairmintVars.colorWarningBorder,\n accent: fairmintVars.colorWarningBorder,\n }\n : tone === \"error\"\n ? {\n background: \"transparent\",\n border: fairmintVars.colorErrorBorder,\n accent: fairmintVars.colorErrorSolid,\n }\n : {\n background: \"transparent\",\n border: fairmintVars.colorBorderDefault,\n accent: brand.accent,\n };\n\n return (\n <Box\n className={className}\n role={resolvedRole}\n data-tone={tone}\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: spacing.xs,\n backgroundColor: surface.background,\n border: `1px solid ${surface.border}`,\n borderRadius: 2,\n paddingBlock: spacing.xs,\n paddingInlineStart: spacing.sm,\n paddingInlineEnd: spacing.xs,\n overflow: \"hidden\",\n ...style,\n }}\n >\n <Box\n aria-hidden\n data-accent=\"\"\n style={{\n position: \"absolute\",\n insetBlock: 0,\n insetInlineStart: 0,\n width: 3,\n background: surface.accent,\n // No own radius — container overflow:hidden + borderRadius:2 clips flush.\n }}\n />\n\n {resolvedIcon ? (\n <Box\n style={{\n display: \"flex\",\n flexShrink: 0,\n marginTop: 2,\n width: 16,\n height: 16,\n }}\n >\n {resolvedIcon}\n </Box>\n ) : null}\n\n <Stack gap={4} style={{ flex: 1, minWidth: 0 }}>\n <Text size=\"sm\" fw={500} c={fairmintVars.colorTextPrimary} lh={1.3}>\n {title}\n </Text>\n {message ? (\n <Text size=\"xs\" c={fairmintVars.colorTextSecondary} lh={1.4}>\n {message}\n </Text>\n ) : null}\n </Stack>\n\n {onDismiss ? (\n <Tooltip label={dismissLabel} withArrow position=\"top\">\n <ActionIcon\n size=\"sm\"\n variant=\"subtle\"\n color=\"gray\"\n aria-label={dismissLabel}\n onClick={onDismiss}\n style={{ flexShrink: 0, marginTop: -2 }}\n >\n <DismissIcon />\n </ActionIcon>\n </Tooltip>\n ) : null}\n </Box>\n );\n}\n\n/** Convenience stack for composing multiple agent suggestions without inventing layout. */\nexport interface AgentSuggestionListProps {\n children: ReactNode;\n gap?: number | string;\n className?: string;\n}\n\nexport function AgentSuggestionList({\n children,\n gap = spacing.xs,\n className,\n}: AgentSuggestionListProps) {\n return (\n <Stack gap={gap} className={className}>\n {children}\n </Stack>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentSuggestion.js","sources":["../../../../src/components/generic/AgentSuggestion/AgentSuggestion.tsx"],"sourcesContent":["import type { AriaRole, CSSProperties, ReactNode } from \"react\";\nimport { brandColors, fairmintVars, spacing } from \"../../../theme\";\nimport { ActionIcon } from \"../../primitives/ActionIcon/ActionIcon\";\nimport { Box, Stack, Text, useComputedColorScheme, useMantineTheme } from \"../../primitives/layout\";\nimport { Tooltip } from \"../../primitives/Tooltip/Tooltip\";\n\nexport type AgentSuggestionTone = \"info\" | \"warning\" | \"error\";\n\nexport interface AgentSuggestionProps {\n /** Short title — typically a humanized agent code label. */\n title: ReactNode;\n /** Supporting detail from the agent. */\n message?: ReactNode;\n /**\n * Semantic meaning. `error` / `warning` use severity surfaces because they\n * map to actionable / blocking review states in CaptableAI. `info` stays\n * CaptableAI-branded (blue→purple accent).\n * @default \"info\"\n */\n tone?: AgentSuggestionTone;\n /**\n * Leading icon. Pass `null` to hide.\n * When omitted, an outlined semantic icon matching `tone` is shown.\n */\n icon?: ReactNode | null;\n /** When set, renders a dismiss control. */\n onDismiss?: () => void;\n /** Accessible label for the dismiss control. @default \"Dismiss\" */\n dismissLabel?: string;\n /** Override the default accessible role. Error defaults to alert; other tones use status. */\n role?: AriaRole;\n className?: string;\n style?: CSSProperties;\n}\n\n/** CaptableAI blue→purple left accent for the info tone (scheme-aware). */\nfunction useCaptableAiInfoAccent() {\n const theme = useMantineTheme();\n const scheme = useComputedColorScheme(\"light\");\n const dark = scheme === \"dark\";\n const blue = dark ? theme.colors.fairmintBlue[3] : brandColors.blue;\n const purple = dark ? theme.colors.fairmintPurple[2] : brandColors.purple;\n return `linear-gradient(180deg, ${blue} 0%, ${purple} 100%)`;\n}\n\nconst iconSvgProps = {\n width: 16,\n height: 16,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 1.75,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n \"aria-hidden\": true as const,\n focusable: \"false\" as const,\n};\n\nfunction ToneIcon({ tone }: { tone: AgentSuggestionTone }) {\n if (tone === \"warning\") {\n return (\n <svg {...iconSvgProps} data-fairmint-suggestion-icon=\"warning\">\n <title>Warning</title>\n <path d=\"M10.3 4.2 2.6 18a2 2 0 0 0 1.75 3h15.3a2 2 0 0 0 1.75-3L13.7 4.2a2 2 0 0 0-3.4 0Z\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n }\n\n if (tone === \"error\") {\n return (\n <svg {...iconSvgProps} data-fairmint-suggestion-icon=\"error\">\n <title>Error</title>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"m9 9 6 6\" />\n <path d=\"m15 9-6 6\" />\n </svg>\n );\n }\n\n return (\n <svg {...iconSvgProps} data-fairmint-suggestion-icon=\"info\">\n <title>Information</title>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 11v5\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n}\n\nfunction toneIconColor(tone: AgentSuggestionTone): string {\n if (tone === \"warning\") return fairmintVars.colorWarningText;\n if (tone === \"error\") return fairmintVars.colorErrorText;\n return fairmintVars.colorInfoText;\n}\n\nfunction DismissIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/**\n * Dense, agent-originated review note. Distinct from Alert/Banner so stacked\n * suggestions do not compete with a single page-level severity summary.\n *\n * Pattern candidate: compose a list of `AgentSuggestion` under one parent\n * Alert or Banner (\"N suggestions need review\") — never N banners.\n */\nexport function AgentSuggestion({\n title,\n message,\n tone = \"info\",\n icon,\n onDismiss,\n dismissLabel = \"Dismiss\",\n role,\n className,\n style,\n}: AgentSuggestionProps) {\n const infoAccent = useCaptableAiInfoAccent();\n const resolvedRole = role ?? (tone === \"error\" ? \"alert\" : \"status\");\n const resolvedIcon = icon === null ? null : (icon ?? <ToneIcon tone={tone} />);\n\n // Warning accent shares the border token so the strip reads orange (not the\n // red-adjacent Solid). Error keeps Solid — in dark it matches the border.\n const surface =\n tone === \"warning\"\n ? {\n background: \"transparent\",\n border: fairmintVars.colorWarningBorder,\n accent: fairmintVars.colorWarningBorder,\n }\n : tone === \"error\"\n ? {\n background: \"transparent\",\n border: fairmintVars.colorErrorBorder,\n accent: fairmintVars.colorErrorSolid,\n }\n : {\n background: \"transparent\",\n border: fairmintVars.colorBorderDefault,\n accent: infoAccent,\n };\n\n return (\n <Box\n className={className}\n role={resolvedRole}\n data-tone={tone}\n style={{\n position: \"relative\",\n display: \"flex\",\n alignItems: \"flex-start\",\n gap: spacing.xs,\n backgroundColor: surface.background,\n border: `1px solid ${surface.border}`,\n borderRadius: 2,\n paddingBlock: spacing.xs,\n paddingInlineStart: spacing.sm,\n paddingInlineEnd: spacing.xs,\n overflow: \"hidden\",\n ...style,\n }}\n >\n <Box\n aria-hidden\n data-accent=\"\"\n style={{\n position: \"absolute\",\n insetBlock: 0,\n insetInlineStart: 0,\n width: 3,\n background: surface.accent,\n // No own radius — container overflow:hidden + borderRadius:2 clips flush.\n }}\n />\n\n {resolvedIcon ? (\n <Box\n style={{\n display: \"flex\",\n flexShrink: 0,\n marginTop: 2,\n width: 16,\n height: 16,\n color: toneIconColor(tone),\n }}\n >\n {resolvedIcon}\n </Box>\n ) : null}\n\n <Stack gap={4} style={{ flex: 1, minWidth: 0 }}>\n <Text size=\"sm\" fw={500} c={fairmintVars.colorTextPrimary} lh={1.3}>\n {title}\n </Text>\n {message ? (\n <Text size=\"xs\" c={fairmintVars.colorTextSecondary} lh={1.4}>\n {message}\n </Text>\n ) : null}\n </Stack>\n\n {onDismiss ? (\n <Tooltip label={dismissLabel} withArrow position=\"top\">\n <ActionIcon\n size=\"sm\"\n variant=\"subtle\"\n color=\"gray\"\n aria-label={dismissLabel}\n onClick={onDismiss}\n style={{ flexShrink: 0, marginTop: -2 }}\n >\n <DismissIcon />\n </ActionIcon>\n </Tooltip>\n ) : null}\n </Box>\n );\n}\n\n/** Convenience stack for composing multiple agent suggestions without inventing layout. */\nexport interface AgentSuggestionListProps {\n children: ReactNode;\n gap?: number | string;\n className?: string;\n}\n\nexport function AgentSuggestionList({\n children,\n gap = spacing.xs,\n className,\n}: AgentSuggestionListProps) {\n return (\n <Stack gap={gap} className={className}>\n {children}\n </Stack>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -270,7 +270,7 @@ function Banner({
270
270
  title !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(
271
271
  Text.Text,
272
272
  {
273
- fw: 600,
273
+ fw: 500,
274
274
  size: "md",
275
275
  c: titleColor(),
276
276
  style: { lineHeight: 1.35, minWidth: 0, overflowWrap: "anywhere" },
@@ -1 +1 @@
1
- {"version":3,"file":"Banner.cjs","sources":["../../../../src/components/generic/Banner/Banner.tsx"],"sourcesContent":["import type { AriaRole, CSSProperties, ReactNode } from \"react\";\nimport { fairmintVars, fontSizes, radii, spacing } from \"../../../theme\";\nimport { colors } from \"../../../theme/colors\";\nimport { Badge } from \"../../primitives/Badge/Badge\";\nimport { Button, type ButtonProps } from \"../../primitives/Button/Button\";\nimport { Box, Group, Text, ThemeIcon } from \"../../primitives/layout\";\n\nexport type BannerTone = \"brand\" | \"neutral\" | \"info\" | \"success\" | \"warning\" | \"error\";\nexport type BannerPresentation = \"inline\" | \"page-level\";\n\nexport interface BannerActionProps extends Omit<ButtonProps, \"children\" | \"color\" | \"variant\"> {\n /** Visible action label. */\n label: ReactNode;\n}\n\nexport type BannerActions =\n | readonly [BannerActionProps]\n | readonly [BannerActionProps, BannerActionProps];\n\nexport interface BannerProps {\n /** Primary message. Omit when the banner is description-only; set `ariaLabel` for accessibility. */\n title?: ReactNode;\n /** Supporting context. Omit for a title-only banner. */\n description?: ReactNode;\n /** Semantic meaning and visual treatment. @default \"brand\" */\n tone?: BannerTone;\n /** Inline content callout or full-width page-edge treatment. @default \"inline\" */\n presentation?: BannerPresentation;\n /** Icon shown beside the title. Pass `null` to hide. Default is a 20px tone icon. */\n icon?: ReactNode | null;\n /** Optional badge label displayed beside the title. */\n badgeLabel?: ReactNode;\n /** Optional standardized CTA. */\n action?: BannerActionProps;\n /** Up to two CTAs in visual order: secondary first, primary last. */\n actions?: BannerActions;\n /** Override the default accessible role. Error defaults to alert; other tones use status. */\n role?: AriaRole;\n /** Accessible label for the banner region. Defaults to the string title when possible. */\n ariaLabel?: string;\n className?: string;\n style?: CSSProperties;\n}\n\nconst TONE_COLORS = {\n brand: colors.primary,\n neutral: colors.neutral,\n info: colors.info,\n success: colors.success,\n warning: colors.warning,\n error: colors.error,\n} as const;\n\nconst TONE_TOKENS = {\n brand: {\n background: fairmintVars.colorBgBrandSubtle,\n border: fairmintVars.colorBorderFocus,\n icon: fairmintVars.colorBrandPrimary,\n },\n neutral: {\n background: fairmintVars.colorBgSurfaceSecondary,\n border: fairmintVars.colorBorderDefault,\n icon: fairmintVars.colorIconSecondary,\n },\n info: {\n background: fairmintVars.colorInfoBg,\n border: fairmintVars.colorInfoBorder,\n icon: fairmintVars.colorInfoText,\n },\n success: {\n background: fairmintVars.colorSuccessBg,\n border: fairmintVars.colorSuccessBorder,\n icon: fairmintVars.colorSuccessText,\n },\n warning: {\n background: fairmintVars.colorWarningBg,\n border: fairmintVars.colorWarningBorder,\n icon: fairmintVars.colorWarningText,\n },\n error: {\n background: fairmintVars.colorErrorBg,\n border: fairmintVars.colorErrorBorder,\n icon: fairmintVars.colorErrorText,\n },\n} as const;\n\nconst DefaultStatusIcon = ({ tone }: { tone: BannerTone }) => {\n const commonProps = {\n width: 20,\n height: 20,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 1.75,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n \"aria-hidden\": true,\n };\n\n if (tone === \"success\") {\n return (\n <svg {...commonProps}>\n <title>Success</title>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"m8.5 12 2.25 2.25L15.75 9\" />\n </svg>\n );\n }\n\n if (tone === \"warning\") {\n return (\n <svg {...commonProps}>\n <title>Warning</title>\n <path d=\"M10.3 4.2 2.6 18a2 2 0 0 0 1.75 3h15.3a2 2 0 0 0 1.75-3L13.7 4.2a2 2 0 0 0-3.4 0Z\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n }\n\n if (tone === \"error\") {\n return (\n <svg {...commonProps}>\n <title>Error</title>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"m9 9 6 6\" />\n <path d=\"m15 9-6 6\" />\n </svg>\n );\n }\n\n return (\n <svg {...commonProps}>\n <title>Information</title>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 11v5\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n};\n\nconst surfaceProps = (tone: BannerTone, presentation: BannerPresentation) => {\n const tokens = TONE_TOKENS[tone];\n\n if (presentation === \"page-level\") {\n return {\n style: {\n backgroundColor: tokens.background,\n borderRadius: 0,\n } satisfies CSSProperties,\n };\n }\n\n return {\n style: {\n backgroundColor: tokens.background,\n border: `1px solid ${tokens.border}`,\n borderRadius: radii.lg,\n } satisfies CSSProperties,\n };\n};\n\n/**\n * Banner titles always use primary text color regardless of tone or\n * presentation — tinted semantic shades are reserved for the fill/border/icon,\n * keeping title contrast consistent (and WCAG AA) across color schemes.\n */\nconst titleColor = () => fairmintVars.colorTextPrimary;\n\nconst actionVariant = (tone: BannerTone, isSecondary: boolean): ButtonProps[\"variant\"] => {\n if (isSecondary) return \"outline\";\n if (tone === \"brand\") return \"light\";\n if (tone === \"neutral\") return \"outline\";\n return \"filled\";\n};\n\ninterface BannerLayoutOptions {\n hasIcon: boolean;\n hasTitle: boolean;\n hasDescription: boolean;\n hasActions: boolean;\n}\n\nconst getBannerLayout = ({\n hasActions,\n hasDescription,\n hasIcon,\n hasTitle,\n}: BannerLayoutOptions) => {\n const mobileColumns = hasIcon ? \"20px minmax(0, 1fr)\" : \"minmax(0, 1fr)\";\n const desktopContentColumns = hasIcon ? [\"20px\"] : [];\n\n if (hasTitle || hasDescription) {\n desktopContentColumns.push(\"minmax(0, 1fr)\");\n }\n\n if (hasActions) {\n desktopContentColumns.push(\"auto\");\n }\n\n const mobileRows: string[] = [];\n if (hasIcon && hasTitle) mobileRows.push('\"icon title\"');\n else if (hasIcon) mobileRows.push('\"icon icon\"');\n else if (hasTitle) mobileRows.push('\"title\"');\n\n if (hasDescription) mobileRows.push(hasIcon ? '\"description description\"' : '\"description\"');\n if (hasActions) mobileRows.push(hasIcon ? '\"actions actions\"' : '\"actions\"');\n\n const desktopRows: string[] = [];\n const actionCell = hasActions ? \" actions\" : \"\";\n if (hasIcon && hasTitle && hasDescription) {\n desktopRows.push(`\"icon title${actionCell}\"`, `\"icon description${actionCell}\"`);\n } else if (hasIcon && hasTitle) {\n desktopRows.push(`\"icon title${actionCell}\"`);\n } else if (hasIcon && hasDescription) {\n desktopRows.push(`\"icon description${actionCell}\"`);\n } else if (hasIcon) {\n desktopRows.push(`\"icon${hasActions ? \" actions\" : \"\"}\"`);\n } else if (hasTitle && hasDescription) {\n desktopRows.push(`\"title${actionCell}\"`, `\"description${actionCell}\"`);\n } else if (hasTitle) {\n desktopRows.push(`\"title${actionCell}\"`);\n } else if (hasDescription) {\n desktopRows.push(`\"description${actionCell}\"`);\n } else if (hasActions) {\n desktopRows.push('\"actions\"');\n }\n\n return {\n gridTemplateAreas: {\n base: mobileRows.join(\" \"),\n sm: desktopRows.join(\" \"),\n },\n gridTemplateColumns: {\n base: mobileColumns,\n sm: desktopContentColumns.join(\" \") || \"auto\",\n },\n };\n};\n\nconst descriptionTextProps = {\n size: \"sm\" as const,\n c: fairmintVars.colorTextSecondary,\n style: { lineHeight: 1.4 },\n};\n\nfunction BannerDescription({ children }: { children: ReactNode }) {\n if (typeof children === \"string\" || typeof children === \"number\") {\n return <Text {...descriptionTextProps}>{children}</Text>;\n }\n\n return (\n <Box\n c={fairmintVars.colorTextSecondary}\n style={{\n fontSize: fontSizes.sm,\n lineHeight: 1.4,\n }}\n >\n {children}\n </Box>\n );\n}\n\n/**\n * Persistent contextual guidance with semantic inline and page-level presentations.\n * Position page-level banners in the consuming layout; the component does not use fixed positioning.\n */\nexport function Banner({\n action,\n ariaLabel,\n badgeLabel,\n className,\n description,\n icon,\n actions,\n presentation = \"inline\",\n role,\n style,\n title,\n tone = \"brand\",\n}: BannerProps) {\n const color = TONE_COLORS[tone];\n const tokens = TONE_TOKENS[tone];\n const iconNode = icon === undefined ? <DefaultStatusIcon tone={tone} /> : icon;\n const resolvedActions = actions ?? (action === undefined ? [] : [action]);\n const resolvedRole = role ?? (tone === \"error\" ? \"alert\" : \"status\");\n const resolvedAriaLabel = ariaLabel ?? (typeof title === \"string\" ? title : undefined);\n const surface = surfaceProps(tone, presentation);\n const layout = getBannerLayout({\n hasActions: resolvedActions.length > 0,\n hasDescription: description !== undefined,\n hasIcon: iconNode !== null,\n hasTitle: title !== undefined || badgeLabel !== undefined,\n });\n\n return (\n <Box\n aria-label={resolvedAriaLabel}\n className={className}\n data-presentation={presentation}\n data-tone={tone}\n role={resolvedRole}\n pl=\"md\"\n pr=\"lg\"\n py=\"md\"\n style={{\n boxSizing: \"border-box\",\n width: \"100%\",\n ...surface.style,\n ...style,\n }}\n sx={{\n display: \"grid\",\n // Match Alert: icon→copy uses spacing.md; title→body is tighter than xs.\n columnGap: spacing.md,\n rowGap: \"0.25rem\",\n ...layout,\n }}\n >\n {iconNode !== null && (\n <ThemeIcon\n aria-hidden\n color={color}\n radius=\"sm\"\n size={20}\n variant=\"transparent\"\n style={{\n color: tokens.icon,\n gridArea: \"icon\",\n // Top-left of the container — matches Alert; stays with the title\n // when description/actions stretch the grid row span.\n alignSelf: \"start\",\n }}\n >\n {iconNode}\n </ThemeIcon>\n )}\n\n {(title !== undefined || badgeLabel !== undefined) && (\n <Group\n align=\"center\"\n gap=\"xs\"\n wrap=\"wrap\"\n style={{ gridArea: \"title\", minWidth: 0, overflowWrap: \"anywhere\" }}\n >\n {title !== undefined && (\n <Text\n fw={600}\n size=\"md\"\n c={titleColor()}\n style={{ lineHeight: 1.35, minWidth: 0, overflowWrap: \"anywhere\" }}\n >\n {title}\n </Text>\n )}\n {badgeLabel !== undefined && (\n <Badge color={color} size=\"sm\" variant=\"light\">\n {badgeLabel}\n </Badge>\n )}\n </Group>\n )}\n\n {description !== undefined && (\n <Box style={{ gridArea: \"description\", minWidth: 0, overflowWrap: \"anywhere\" }}>\n <BannerDescription>{description}</BannerDescription>\n </Box>\n )}\n\n {resolvedActions.length > 0 && (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { base: \"column\", sm: \"row\" },\n alignItems: \"stretch\",\n justifyContent: \"flex-end\",\n gap: spacing.xs,\n minWidth: 0,\n width: { base: \"100%\", sm: \"max-content\" },\n maxWidth: \"100%\",\n }}\n style={{ gridArea: \"actions\", alignSelf: \"center\", justifySelf: \"end\" }}\n >\n {resolvedActions.map(({ label, size, ...buttonProps }, index) => (\n <Button\n key={buttonProps.id ?? (typeof label === \"string\" ? label : `banner-action-${index}`)}\n {...buttonProps}\n color={color}\n size={size ?? \"sm\"}\n variant={actionVariant(tone, index < resolvedActions.length - 1)}\n style={{\n ...buttonProps.style,\n boxSizing: \"border-box\",\n flex: \"0 1 auto\",\n maxWidth: \"100%\",\n overflowWrap: \"anywhere\",\n whiteSpace: \"normal\",\n width: \"100%\",\n }}\n >\n {label}\n </Button>\n ))}\n </Box>\n )}\n </Box>\n );\n}\n"],"names":["colors","fairmintVars","jsxs","jsx","radii","Text","Box","fontSizes","layout","spacing","ThemeIcon","Group","Badge","index","Button"],"mappings":"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"}
1
+ {"version":3,"file":"Banner.cjs","sources":["../../../../src/components/generic/Banner/Banner.tsx"],"sourcesContent":["import type { AriaRole, CSSProperties, ReactNode } from \"react\";\nimport { fairmintVars, fontSizes, radii, spacing } from \"../../../theme\";\nimport { colors } from \"../../../theme/colors\";\nimport { Badge } from \"../../primitives/Badge/Badge\";\nimport { Button, type ButtonProps } from \"../../primitives/Button/Button\";\nimport { Box, Group, Text, ThemeIcon } from \"../../primitives/layout\";\n\nexport type BannerTone = \"brand\" | \"neutral\" | \"info\" | \"success\" | \"warning\" | \"error\";\nexport type BannerPresentation = \"inline\" | \"page-level\";\n\nexport interface BannerActionProps extends Omit<ButtonProps, \"children\" | \"color\" | \"variant\"> {\n /** Visible action label. */\n label: ReactNode;\n}\n\nexport type BannerActions =\n | readonly [BannerActionProps]\n | readonly [BannerActionProps, BannerActionProps];\n\nexport interface BannerProps {\n /** Primary message. Omit when the banner is description-only; set `ariaLabel` for accessibility. */\n title?: ReactNode;\n /** Supporting context. Omit for a title-only banner. */\n description?: ReactNode;\n /** Semantic meaning and visual treatment. @default \"brand\" */\n tone?: BannerTone;\n /** Inline content callout or full-width page-edge treatment. @default \"inline\" */\n presentation?: BannerPresentation;\n /** Icon shown beside the title. Pass `null` to hide. Default is a 20px tone icon. */\n icon?: ReactNode | null;\n /** Optional badge label displayed beside the title. */\n badgeLabel?: ReactNode;\n /** Optional standardized CTA. */\n action?: BannerActionProps;\n /** Up to two CTAs in visual order: secondary first, primary last. */\n actions?: BannerActions;\n /** Override the default accessible role. Error defaults to alert; other tones use status. */\n role?: AriaRole;\n /** Accessible label for the banner region. Defaults to the string title when possible. */\n ariaLabel?: string;\n className?: string;\n style?: CSSProperties;\n}\n\nconst TONE_COLORS = {\n brand: colors.primary,\n neutral: colors.neutral,\n info: colors.info,\n success: colors.success,\n warning: colors.warning,\n error: colors.error,\n} as const;\n\nconst TONE_TOKENS = {\n brand: {\n background: fairmintVars.colorBgBrandSubtle,\n border: fairmintVars.colorBorderFocus,\n icon: fairmintVars.colorBrandPrimary,\n },\n neutral: {\n background: fairmintVars.colorBgSurfaceSecondary,\n border: fairmintVars.colorBorderDefault,\n icon: fairmintVars.colorIconSecondary,\n },\n info: {\n background: fairmintVars.colorInfoBg,\n border: fairmintVars.colorInfoBorder,\n icon: fairmintVars.colorInfoText,\n },\n success: {\n background: fairmintVars.colorSuccessBg,\n border: fairmintVars.colorSuccessBorder,\n icon: fairmintVars.colorSuccessText,\n },\n warning: {\n background: fairmintVars.colorWarningBg,\n border: fairmintVars.colorWarningBorder,\n icon: fairmintVars.colorWarningText,\n },\n error: {\n background: fairmintVars.colorErrorBg,\n border: fairmintVars.colorErrorBorder,\n icon: fairmintVars.colorErrorText,\n },\n} as const;\n\nconst DefaultStatusIcon = ({ tone }: { tone: BannerTone }) => {\n const commonProps = {\n width: 20,\n height: 20,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 1.75,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n \"aria-hidden\": true,\n };\n\n if (tone === \"success\") {\n return (\n <svg {...commonProps}>\n <title>Success</title>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"m8.5 12 2.25 2.25L15.75 9\" />\n </svg>\n );\n }\n\n if (tone === \"warning\") {\n return (\n <svg {...commonProps}>\n <title>Warning</title>\n <path d=\"M10.3 4.2 2.6 18a2 2 0 0 0 1.75 3h15.3a2 2 0 0 0 1.75-3L13.7 4.2a2 2 0 0 0-3.4 0Z\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n }\n\n if (tone === \"error\") {\n return (\n <svg {...commonProps}>\n <title>Error</title>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"m9 9 6 6\" />\n <path d=\"m15 9-6 6\" />\n </svg>\n );\n }\n\n return (\n <svg {...commonProps}>\n <title>Information</title>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <path d=\"M12 11v5\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n};\n\nconst surfaceProps = (tone: BannerTone, presentation: BannerPresentation) => {\n const tokens = TONE_TOKENS[tone];\n\n if (presentation === \"page-level\") {\n return {\n style: {\n backgroundColor: tokens.background,\n borderRadius: 0,\n } satisfies CSSProperties,\n };\n }\n\n return {\n style: {\n backgroundColor: tokens.background,\n border: `1px solid ${tokens.border}`,\n borderRadius: radii.lg,\n } satisfies CSSProperties,\n };\n};\n\n/**\n * Banner titles always use primary text color regardless of tone or\n * presentation — tinted semantic shades are reserved for the fill/border/icon,\n * keeping title contrast consistent (and WCAG AA) across color schemes.\n */\nconst titleColor = () => fairmintVars.colorTextPrimary;\n\nconst actionVariant = (tone: BannerTone, isSecondary: boolean): ButtonProps[\"variant\"] => {\n if (isSecondary) return \"outline\";\n if (tone === \"brand\") return \"light\";\n if (tone === \"neutral\") return \"outline\";\n return \"filled\";\n};\n\ninterface BannerLayoutOptions {\n hasIcon: boolean;\n hasTitle: boolean;\n hasDescription: boolean;\n hasActions: boolean;\n}\n\nconst getBannerLayout = ({\n hasActions,\n hasDescription,\n hasIcon,\n hasTitle,\n}: BannerLayoutOptions) => {\n const mobileColumns = hasIcon ? \"20px minmax(0, 1fr)\" : \"minmax(0, 1fr)\";\n const desktopContentColumns = hasIcon ? [\"20px\"] : [];\n\n if (hasTitle || hasDescription) {\n desktopContentColumns.push(\"minmax(0, 1fr)\");\n }\n\n if (hasActions) {\n desktopContentColumns.push(\"auto\");\n }\n\n const mobileRows: string[] = [];\n if (hasIcon && hasTitle) mobileRows.push('\"icon title\"');\n else if (hasIcon) mobileRows.push('\"icon icon\"');\n else if (hasTitle) mobileRows.push('\"title\"');\n\n if (hasDescription) mobileRows.push(hasIcon ? '\"description description\"' : '\"description\"');\n if (hasActions) mobileRows.push(hasIcon ? '\"actions actions\"' : '\"actions\"');\n\n const desktopRows: string[] = [];\n const actionCell = hasActions ? \" actions\" : \"\";\n if (hasIcon && hasTitle && hasDescription) {\n desktopRows.push(`\"icon title${actionCell}\"`, `\"icon description${actionCell}\"`);\n } else if (hasIcon && hasTitle) {\n desktopRows.push(`\"icon title${actionCell}\"`);\n } else if (hasIcon && hasDescription) {\n desktopRows.push(`\"icon description${actionCell}\"`);\n } else if (hasIcon) {\n desktopRows.push(`\"icon${hasActions ? \" actions\" : \"\"}\"`);\n } else if (hasTitle && hasDescription) {\n desktopRows.push(`\"title${actionCell}\"`, `\"description${actionCell}\"`);\n } else if (hasTitle) {\n desktopRows.push(`\"title${actionCell}\"`);\n } else if (hasDescription) {\n desktopRows.push(`\"description${actionCell}\"`);\n } else if (hasActions) {\n desktopRows.push('\"actions\"');\n }\n\n return {\n gridTemplateAreas: {\n base: mobileRows.join(\" \"),\n sm: desktopRows.join(\" \"),\n },\n gridTemplateColumns: {\n base: mobileColumns,\n sm: desktopContentColumns.join(\" \") || \"auto\",\n },\n };\n};\n\nconst descriptionTextProps = {\n size: \"sm\" as const,\n c: fairmintVars.colorTextSecondary,\n style: { lineHeight: 1.4 },\n};\n\nfunction BannerDescription({ children }: { children: ReactNode }) {\n if (typeof children === \"string\" || typeof children === \"number\") {\n return <Text {...descriptionTextProps}>{children}</Text>;\n }\n\n return (\n <Box\n c={fairmintVars.colorTextSecondary}\n style={{\n fontSize: fontSizes.sm,\n lineHeight: 1.4,\n }}\n >\n {children}\n </Box>\n );\n}\n\n/**\n * Persistent contextual guidance with semantic inline and page-level presentations.\n * Position page-level banners in the consuming layout; the component does not use fixed positioning.\n */\nexport function Banner({\n action,\n ariaLabel,\n badgeLabel,\n className,\n description,\n icon,\n actions,\n presentation = \"inline\",\n role,\n style,\n title,\n tone = \"brand\",\n}: BannerProps) {\n const color = TONE_COLORS[tone];\n const tokens = TONE_TOKENS[tone];\n const iconNode = icon === undefined ? <DefaultStatusIcon tone={tone} /> : icon;\n const resolvedActions = actions ?? (action === undefined ? [] : [action]);\n const resolvedRole = role ?? (tone === \"error\" ? \"alert\" : \"status\");\n const resolvedAriaLabel = ariaLabel ?? (typeof title === \"string\" ? title : undefined);\n const surface = surfaceProps(tone, presentation);\n const layout = getBannerLayout({\n hasActions: resolvedActions.length > 0,\n hasDescription: description !== undefined,\n hasIcon: iconNode !== null,\n hasTitle: title !== undefined || badgeLabel !== undefined,\n });\n\n return (\n <Box\n aria-label={resolvedAriaLabel}\n className={className}\n data-presentation={presentation}\n data-tone={tone}\n role={resolvedRole}\n pl=\"md\"\n pr=\"lg\"\n py=\"md\"\n style={{\n boxSizing: \"border-box\",\n width: \"100%\",\n ...surface.style,\n ...style,\n }}\n sx={{\n display: \"grid\",\n // Match Alert: icon→copy uses spacing.md; title→body is tighter than xs.\n columnGap: spacing.md,\n rowGap: \"0.25rem\",\n ...layout,\n }}\n >\n {iconNode !== null && (\n <ThemeIcon\n aria-hidden\n color={color}\n radius=\"sm\"\n size={20}\n variant=\"transparent\"\n style={{\n color: tokens.icon,\n gridArea: \"icon\",\n // Top-left of the container — matches Alert; stays with the title\n // when description/actions stretch the grid row span.\n alignSelf: \"start\",\n }}\n >\n {iconNode}\n </ThemeIcon>\n )}\n\n {(title !== undefined || badgeLabel !== undefined) && (\n <Group\n align=\"center\"\n gap=\"xs\"\n wrap=\"wrap\"\n style={{ gridArea: \"title\", minWidth: 0, overflowWrap: \"anywhere\" }}\n >\n {title !== undefined && (\n <Text\n fw={500}\n size=\"md\"\n c={titleColor()}\n style={{ lineHeight: 1.35, minWidth: 0, overflowWrap: \"anywhere\" }}\n >\n {title}\n </Text>\n )}\n {badgeLabel !== undefined && (\n <Badge color={color} size=\"sm\" variant=\"light\">\n {badgeLabel}\n </Badge>\n )}\n </Group>\n )}\n\n {description !== undefined && (\n <Box style={{ gridArea: \"description\", minWidth: 0, overflowWrap: \"anywhere\" }}>\n <BannerDescription>{description}</BannerDescription>\n </Box>\n )}\n\n {resolvedActions.length > 0 && (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: { base: \"column\", sm: \"row\" },\n alignItems: \"stretch\",\n justifyContent: \"flex-end\",\n gap: spacing.xs,\n minWidth: 0,\n width: { base: \"100%\", sm: \"max-content\" },\n maxWidth: \"100%\",\n }}\n style={{ gridArea: \"actions\", alignSelf: \"center\", justifySelf: \"end\" }}\n >\n {resolvedActions.map(({ label, size, ...buttonProps }, index) => (\n <Button\n key={buttonProps.id ?? (typeof label === \"string\" ? label : `banner-action-${index}`)}\n {...buttonProps}\n color={color}\n size={size ?? \"sm\"}\n variant={actionVariant(tone, index < resolvedActions.length - 1)}\n style={{\n ...buttonProps.style,\n boxSizing: \"border-box\",\n flex: \"0 1 auto\",\n maxWidth: \"100%\",\n overflowWrap: \"anywhere\",\n whiteSpace: \"normal\",\n width: \"100%\",\n }}\n >\n {label}\n </Button>\n ))}\n </Box>\n )}\n </Box>\n );\n}\n"],"names":["colors","fairmintVars","jsxs","jsx","radii","Text","Box","fontSizes","layout","spacing","ThemeIcon","Group","Badge","index","Button"],"mappings":"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"}
@@ -268,7 +268,7 @@ function Banner({
268
268
  title !== void 0 && /* @__PURE__ */ jsx(
269
269
  Text,
270
270
  {
271
- fw: 600,
271
+ fw: 500,
272
272
  size: "md",
273
273
  c: titleColor(),
274
274
  style: { lineHeight: 1.35, minWidth: 0, overflowWrap: "anywhere" },