@fairmint/ui 0.3.20 → 0.3.22

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 (47) hide show
  1. package/dist/_virtual/index3.cjs +5 -3
  2. package/dist/_virtual/index3.cjs.map +1 -1
  3. package/dist/_virtual/index3.js +5 -2
  4. package/dist/_virtual/index3.js.map +1 -1
  5. package/dist/_virtual/index4.cjs +3 -5
  6. package/dist/_virtual/index4.cjs.map +1 -1
  7. package/dist/_virtual/index4.js +2 -5
  8. package/dist/_virtual/index4.js.map +1 -1
  9. package/dist/components/generic/AgentSuggestion/AgentSuggestion.cjs +187 -0
  10. package/dist/components/generic/AgentSuggestion/AgentSuggestion.cjs.map +1 -0
  11. package/dist/components/generic/AgentSuggestion/AgentSuggestion.d.ts +44 -0
  12. package/dist/components/generic/AgentSuggestion/AgentSuggestion.d.ts.map +1 -0
  13. package/dist/components/generic/AgentSuggestion/AgentSuggestion.js +187 -0
  14. package/dist/components/generic/AgentSuggestion/AgentSuggestion.js.map +1 -0
  15. package/dist/components/primitives/layout.cjs.map +1 -1
  16. package/dist/components/primitives/layout.d.ts +1 -1
  17. package/dist/components/primitives/layout.d.ts.map +1 -1
  18. package/dist/components/primitives/layout.js.map +1 -1
  19. package/dist/components/primitives/muiIcons.d.ts +2 -0
  20. package/dist/components/primitives/muiIcons.d.ts.map +1 -1
  21. package/dist/fairmint-ui.cjs +3 -0
  22. package/dist/fairmint-ui.cjs.map +1 -1
  23. package/dist/fairmint-ui.js +3 -0
  24. package/dist/fairmint-ui.js.map +1 -1
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/mui-icons.cjs +10 -14
  28. package/dist/mui-icons.cjs.map +1 -1
  29. package/dist/mui-icons.js +10 -14
  30. package/dist/mui-icons.js.map +1 -1
  31. package/dist/node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-computed-color-scheme.cjs +11 -0
  32. package/dist/node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-computed-color-scheme.cjs.map +1 -0
  33. package/dist/node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-computed-color-scheme.js +11 -0
  34. package/dist/node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-computed-color-scheme.js.map +1 -0
  35. package/dist/node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-mantine-color-scheme.cjs +66 -0
  36. package/dist/node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-mantine-color-scheme.cjs.map +1 -0
  37. package/dist/node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-mantine-color-scheme.js +66 -0
  38. package/dist/node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-mantine-color-scheme.js.map +1 -0
  39. package/dist/node_modules/@mantine/form/esm/hooks/use-form-status/use-form-status.cjs +1 -1
  40. package/dist/node_modules/@mantine/form/esm/hooks/use-form-status/use-form-status.js +1 -1
  41. package/dist/node_modules/@mantine/hooks/esm/use-color-scheme/use-color-scheme.cjs +8 -0
  42. package/dist/node_modules/@mantine/hooks/esm/use-color-scheme/use-color-scheme.cjs.map +1 -0
  43. package/dist/node_modules/@mantine/hooks/esm/use-color-scheme/use-color-scheme.js +8 -0
  44. package/dist/node_modules/@mantine/hooks/esm/use-color-scheme/use-color-scheme.js.map +1 -0
  45. package/dist/node_modules/prop-types/index.cjs +1 -1
  46. package/dist/node_modules/prop-types/index.js +1 -1
  47. package/package.json +1 -1
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- var propTypes = { exports: {} };
4
- exports.__module = propTypes;
2
+ const _commonjsHelpers = require("./_commonjsHelpers.cjs");
3
+ const index = require("../node_modules/fast-deep-equal/index.cjs");
4
+ var fastDeepEqualExports = index.__require();
5
+ const isEqual = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(fastDeepEqualExports);
6
+ module.exports = isEqual;
5
7
  //# sourceMappingURL=index3.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index3.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index3.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,5 +1,8 @@
1
- var propTypes = { exports: {} };
1
+ import { getDefaultExportFromCjs } from "./_commonjsHelpers.js";
2
+ import { __require as requireFastDeepEqual } from "../node_modules/fast-deep-equal/index.js";
3
+ var fastDeepEqualExports = requireFastDeepEqual();
4
+ const isEqual = /* @__PURE__ */ getDefaultExportFromCjs(fastDeepEqualExports);
2
5
  export {
3
- propTypes as __module
6
+ isEqual as default
4
7
  };
5
8
  //# sourceMappingURL=index3.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"index3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
- const _commonjsHelpers = require("./_commonjsHelpers.cjs");
3
- const index = require("../node_modules/fast-deep-equal/index.cjs");
4
- var fastDeepEqualExports = index.__require();
5
- const isEqual = /* @__PURE__ */ _commonjsHelpers.getDefaultExportFromCjs(fastDeepEqualExports);
6
- module.exports = isEqual;
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ var propTypes = { exports: {} };
4
+ exports.__module = propTypes;
7
5
  //# sourceMappingURL=index4.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index4.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
1
+ {"version":3,"file":"index4.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -1,8 +1,5 @@
1
- import { getDefaultExportFromCjs } from "./_commonjsHelpers.js";
2
- import { __require as requireFastDeepEqual } from "../node_modules/fast-deep-equal/index.js";
3
- var fastDeepEqualExports = requireFastDeepEqual();
4
- const isEqual = /* @__PURE__ */ getDefaultExportFromCjs(fastDeepEqualExports);
1
+ var propTypes = { exports: {} };
5
2
  export {
6
- isEqual as default
3
+ propTypes as __module
7
4
  };
8
5
  //# sourceMappingURL=index4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index4.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index4.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const index = require("../../../theme/index.cjs");
5
+ const ActionIcon = require("../../primitives/ActionIcon/ActionIcon.cjs");
6
+ const layout = require("../../primitives/layout.cjs");
7
+ const Tooltip = require("../../primitives/Tooltip/Tooltip.cjs");
8
+ const spacing = require("../../../theme/spacing.cjs");
9
+ const Text = require("../../../node_modules/@mantine/core/esm/components/Text/Text.cjs");
10
+ const MantineThemeProvider = require("../../../node_modules/@mantine/core/esm/core/MantineProvider/MantineThemeProvider/MantineThemeProvider.cjs");
11
+ const useComputedColorScheme = require("../../../node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-computed-color-scheme.cjs");
12
+ function useCaptableAiInfoAccent() {
13
+ const theme = MantineThemeProvider.useMantineTheme();
14
+ const scheme = useComputedColorScheme.useComputedColorScheme("light");
15
+ const dark = scheme === "dark";
16
+ const blue = dark ? theme.colors.fairmintBlue[3] : index.brandColors.blue;
17
+ const purple = dark ? theme.colors.fairmintPurple[2] : index.brandColors.purple;
18
+ return `linear-gradient(180deg, ${blue} 0%, ${purple} 100%)`;
19
+ }
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
+ }
61
+ function DismissIcon() {
62
+ return /* @__PURE__ */ jsxRuntime.jsxs(
63
+ "svg",
64
+ {
65
+ "aria-hidden": "true",
66
+ width: "14",
67
+ height: "14",
68
+ viewBox: "0 0 24 24",
69
+ fill: "none",
70
+ stroke: "currentColor",
71
+ strokeWidth: "2",
72
+ strokeLinecap: "round",
73
+ strokeLinejoin: "round",
74
+ children: [
75
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M18 6 6 18" }),
76
+ /* @__PURE__ */ jsxRuntime.jsx("path", { d: "m6 6 12 12" })
77
+ ]
78
+ }
79
+ );
80
+ }
81
+ function AgentSuggestion({
82
+ title,
83
+ message,
84
+ tone = "info",
85
+ icon,
86
+ onDismiss,
87
+ dismissLabel = "Dismiss",
88
+ role,
89
+ className,
90
+ style
91
+ }) {
92
+ const infoAccent = useCaptableAiInfoAccent();
93
+ const resolvedRole = role ?? (tone === "error" ? "alert" : "status");
94
+ const resolvedIcon = icon === null ? null : icon ?? /* @__PURE__ */ jsxRuntime.jsx(ToneIcon, { tone });
95
+ const surface = tone === "warning" ? {
96
+ background: "transparent",
97
+ border: index.fairmintVars.colorWarningBorder,
98
+ accent: index.fairmintVars.colorWarningBorder
99
+ } : tone === "error" ? {
100
+ background: "transparent",
101
+ border: index.fairmintVars.colorErrorBorder,
102
+ accent: index.fairmintVars.colorErrorSolid
103
+ } : {
104
+ background: "transparent",
105
+ border: index.fairmintVars.colorBorderDefault,
106
+ accent: infoAccent
107
+ };
108
+ return /* @__PURE__ */ jsxRuntime.jsxs(
109
+ layout.Box,
110
+ {
111
+ className,
112
+ role: resolvedRole,
113
+ "data-tone": tone,
114
+ style: {
115
+ position: "relative",
116
+ display: "flex",
117
+ alignItems: "flex-start",
118
+ gap: spacing.spacing.xs,
119
+ backgroundColor: surface.background,
120
+ border: `1px solid ${surface.border}`,
121
+ borderRadius: 2,
122
+ paddingBlock: spacing.spacing.xs,
123
+ paddingInlineStart: spacing.spacing.sm,
124
+ paddingInlineEnd: spacing.spacing.xs,
125
+ overflow: "hidden",
126
+ ...style
127
+ },
128
+ children: [
129
+ /* @__PURE__ */ jsxRuntime.jsx(
130
+ layout.Box,
131
+ {
132
+ "aria-hidden": true,
133
+ "data-accent": "",
134
+ style: {
135
+ position: "absolute",
136
+ insetBlock: 0,
137
+ insetInlineStart: 0,
138
+ width: 3,
139
+ background: surface.accent
140
+ // No own radius — container overflow:hidden + borderRadius:2 clips flush.
141
+ }
142
+ }
143
+ ),
144
+ resolvedIcon ? /* @__PURE__ */ jsxRuntime.jsx(
145
+ layout.Box,
146
+ {
147
+ style: {
148
+ display: "flex",
149
+ flexShrink: 0,
150
+ marginTop: 2,
151
+ width: 16,
152
+ height: 16,
153
+ color: toneIconColor(tone)
154
+ },
155
+ children: resolvedIcon
156
+ }
157
+ ) : null,
158
+ /* @__PURE__ */ jsxRuntime.jsxs(layout.Stack, { gap: 4, style: { flex: 1, minWidth: 0 }, children: [
159
+ /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size: "sm", fw: 500, c: index.fairmintVars.colorTextPrimary, lh: 1.3, children: title }),
160
+ message ? /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size: "xs", c: index.fairmintVars.colorTextSecondary, lh: 1.4, children: message }) : null
161
+ ] }),
162
+ onDismiss ? /* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, { label: dismissLabel, withArrow: true, position: "top", children: /* @__PURE__ */ jsxRuntime.jsx(
163
+ ActionIcon.ActionIcon,
164
+ {
165
+ size: "sm",
166
+ variant: "subtle",
167
+ color: "gray",
168
+ "aria-label": dismissLabel,
169
+ onClick: onDismiss,
170
+ style: { flexShrink: 0, marginTop: -2 },
171
+ children: /* @__PURE__ */ jsxRuntime.jsx(DismissIcon, {})
172
+ }
173
+ ) }) : null
174
+ ]
175
+ }
176
+ );
177
+ }
178
+ function AgentSuggestionList({
179
+ children,
180
+ gap = spacing.spacing.xs,
181
+ className
182
+ }) {
183
+ return /* @__PURE__ */ jsxRuntime.jsx(layout.Stack, { gap, className, children });
184
+ }
185
+ exports.AgentSuggestion = AgentSuggestion;
186
+ exports.AgentSuggestionList = AgentSuggestionList;
187
+ //# sourceMappingURL=AgentSuggestion.cjs.map
@@ -0,0 +1 @@
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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"}
@@ -0,0 +1,44 @@
1
+ import { AriaRole, CSSProperties, ReactNode } from 'react';
2
+ export type AgentSuggestionTone = "info" | "warning" | "error";
3
+ export interface AgentSuggestionProps {
4
+ /** Short title — typically a humanized agent code label. */
5
+ title: ReactNode;
6
+ /** Supporting detail from the agent. */
7
+ message?: ReactNode;
8
+ /**
9
+ * Semantic meaning. `error` / `warning` use severity surfaces because they
10
+ * map to actionable / blocking review states in CaptableAI. `info` stays
11
+ * CaptableAI-branded (blue→purple accent).
12
+ * @default "info"
13
+ */
14
+ tone?: AgentSuggestionTone;
15
+ /**
16
+ * Leading icon. Pass `null` to hide.
17
+ * When omitted, an outlined semantic icon matching `tone` is shown.
18
+ */
19
+ icon?: ReactNode | null;
20
+ /** When set, renders a dismiss control. */
21
+ onDismiss?: () => void;
22
+ /** Accessible label for the dismiss control. @default "Dismiss" */
23
+ dismissLabel?: string;
24
+ /** Override the default accessible role. Error defaults to alert; other tones use status. */
25
+ role?: AriaRole;
26
+ className?: string;
27
+ style?: CSSProperties;
28
+ }
29
+ /**
30
+ * Dense, agent-originated review note. Distinct from Alert/Banner so stacked
31
+ * suggestions do not compete with a single page-level severity summary.
32
+ *
33
+ * Pattern candidate: compose a list of `AgentSuggestion` under one parent
34
+ * Alert or Banner ("N suggestions need review") — never N banners.
35
+ */
36
+ export declare function AgentSuggestion({ title, message, tone, icon, onDismiss, dismissLabel, role, className, style, }: AgentSuggestionProps): import("react/jsx-runtime").JSX.Element;
37
+ /** Convenience stack for composing multiple agent suggestions without inventing layout. */
38
+ export interface AgentSuggestionListProps {
39
+ children: ReactNode;
40
+ gap?: number | string;
41
+ className?: string;
42
+ }
43
+ export declare function AgentSuggestionList({ children, gap, className, }: AgentSuggestionListProps): import("react/jsx-runtime").JSX.Element;
44
+ //# sourceMappingURL=AgentSuggestion.d.ts.map
@@ -0,0 +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;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"}
@@ -0,0 +1,187 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { fairmintVars, brandColors } from "../../../theme/index.js";
3
+ import { ActionIcon } from "../../primitives/ActionIcon/ActionIcon.js";
4
+ import { Box, Stack } from "../../primitives/layout.js";
5
+ import { Tooltip } from "../../primitives/Tooltip/Tooltip.js";
6
+ import { spacing } from "../../../theme/spacing.js";
7
+ import { Text } from "../../../node_modules/@mantine/core/esm/components/Text/Text.js";
8
+ import { useMantineTheme } from "../../../node_modules/@mantine/core/esm/core/MantineProvider/MantineThemeProvider/MantineThemeProvider.js";
9
+ import { useComputedColorScheme } from "../../../node_modules/@mantine/core/esm/core/MantineProvider/use-mantine-color-scheme/use-computed-color-scheme.js";
10
+ function useCaptableAiInfoAccent() {
11
+ const theme = useMantineTheme();
12
+ const scheme = useComputedColorScheme("light");
13
+ const dark = scheme === "dark";
14
+ const blue = dark ? theme.colors.fairmintBlue[3] : brandColors.blue;
15
+ const purple = dark ? theme.colors.fairmintPurple[2] : brandColors.purple;
16
+ return `linear-gradient(180deg, ${blue} 0%, ${purple} 100%)`;
17
+ }
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
+ }
59
+ function DismissIcon() {
60
+ return /* @__PURE__ */ jsxs(
61
+ "svg",
62
+ {
63
+ "aria-hidden": "true",
64
+ width: "14",
65
+ height: "14",
66
+ viewBox: "0 0 24 24",
67
+ fill: "none",
68
+ stroke: "currentColor",
69
+ strokeWidth: "2",
70
+ strokeLinecap: "round",
71
+ strokeLinejoin: "round",
72
+ children: [
73
+ /* @__PURE__ */ jsx("path", { d: "M18 6 6 18" }),
74
+ /* @__PURE__ */ jsx("path", { d: "m6 6 12 12" })
75
+ ]
76
+ }
77
+ );
78
+ }
79
+ function AgentSuggestion({
80
+ title,
81
+ message,
82
+ tone = "info",
83
+ icon,
84
+ onDismiss,
85
+ dismissLabel = "Dismiss",
86
+ role,
87
+ className,
88
+ style
89
+ }) {
90
+ const infoAccent = useCaptableAiInfoAccent();
91
+ const resolvedRole = role ?? (tone === "error" ? "alert" : "status");
92
+ const resolvedIcon = icon === null ? null : icon ?? /* @__PURE__ */ jsx(ToneIcon, { tone });
93
+ const surface = tone === "warning" ? {
94
+ background: "transparent",
95
+ border: fairmintVars.colorWarningBorder,
96
+ accent: fairmintVars.colorWarningBorder
97
+ } : tone === "error" ? {
98
+ background: "transparent",
99
+ border: fairmintVars.colorErrorBorder,
100
+ accent: fairmintVars.colorErrorSolid
101
+ } : {
102
+ background: "transparent",
103
+ border: fairmintVars.colorBorderDefault,
104
+ accent: infoAccent
105
+ };
106
+ return /* @__PURE__ */ jsxs(
107
+ Box,
108
+ {
109
+ className,
110
+ role: resolvedRole,
111
+ "data-tone": tone,
112
+ style: {
113
+ position: "relative",
114
+ display: "flex",
115
+ alignItems: "flex-start",
116
+ gap: spacing.xs,
117
+ backgroundColor: surface.background,
118
+ border: `1px solid ${surface.border}`,
119
+ borderRadius: 2,
120
+ paddingBlock: spacing.xs,
121
+ paddingInlineStart: spacing.sm,
122
+ paddingInlineEnd: spacing.xs,
123
+ overflow: "hidden",
124
+ ...style
125
+ },
126
+ children: [
127
+ /* @__PURE__ */ jsx(
128
+ Box,
129
+ {
130
+ "aria-hidden": true,
131
+ "data-accent": "",
132
+ style: {
133
+ position: "absolute",
134
+ insetBlock: 0,
135
+ insetInlineStart: 0,
136
+ width: 3,
137
+ background: surface.accent
138
+ // No own radius — container overflow:hidden + borderRadius:2 clips flush.
139
+ }
140
+ }
141
+ ),
142
+ resolvedIcon ? /* @__PURE__ */ jsx(
143
+ Box,
144
+ {
145
+ style: {
146
+ display: "flex",
147
+ flexShrink: 0,
148
+ marginTop: 2,
149
+ width: 16,
150
+ height: 16,
151
+ color: toneIconColor(tone)
152
+ },
153
+ children: resolvedIcon
154
+ }
155
+ ) : null,
156
+ /* @__PURE__ */ jsxs(Stack, { gap: 4, style: { flex: 1, minWidth: 0 }, children: [
157
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: fairmintVars.colorTextPrimary, lh: 1.3, children: title }),
158
+ message ? /* @__PURE__ */ jsx(Text, { size: "xs", c: fairmintVars.colorTextSecondary, lh: 1.4, children: message }) : null
159
+ ] }),
160
+ onDismiss ? /* @__PURE__ */ jsx(Tooltip, { label: dismissLabel, withArrow: true, position: "top", children: /* @__PURE__ */ jsx(
161
+ ActionIcon,
162
+ {
163
+ size: "sm",
164
+ variant: "subtle",
165
+ color: "gray",
166
+ "aria-label": dismissLabel,
167
+ onClick: onDismiss,
168
+ style: { flexShrink: 0, marginTop: -2 },
169
+ children: /* @__PURE__ */ jsx(DismissIcon, {})
170
+ }
171
+ ) }) : null
172
+ ]
173
+ }
174
+ );
175
+ }
176
+ function AgentSuggestionList({
177
+ children,
178
+ gap = spacing.xs,
179
+ className
180
+ }) {
181
+ return /* @__PURE__ */ jsx(Stack, { gap, className, children });
182
+ }
183
+ export {
184
+ AgentSuggestion,
185
+ AgentSuggestionList
186
+ };
187
+ //# sourceMappingURL=AgentSuggestion.js.map
@@ -0,0 +1 @@
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":";;;;;;;;;AAoCA,SAAS,0BAA0B;AACjC,QAAM,QAAQ,gBAAA;AACd,QAAM,SAAS,uBAAuB,OAAO;AAC7C,QAAM,OAAO,WAAW;AACxB,QAAM,OAAO,OAAO,MAAM,OAAO,aAAa,CAAC,IAAI,YAAY;AAC/D,QAAM,SAAS,OAAO,MAAM,OAAO,eAAe,CAAC,IAAI,YAAY;AACnE,SAAO,2BAA2B,IAAI,QAAQ,MAAM;AACtD;AAEA,MAAM,eAAe;AAAA,EACnB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,WAAW;AACb;AAEA,SAAS,SAAS,EAAE,QAAuC;AACzD,MAAI,SAAS,WAAW;AACtB,WACE,qBAAC,OAAA,EAAK,GAAG,cAAc,iCAA8B,WACnD,UAAA;AAAA,MAAA,oBAAC,WAAM,UAAA,UAAA,CAAO;AAAA,MACd,oBAAC,QAAA,EAAK,GAAE,oFAAA,CAAoF;AAAA,MAC5F,oBAAC,QAAA,EAAK,GAAE,UAAA,CAAU;AAAA,MAClB,oBAAC,QAAA,EAAK,GAAE,aAAA,CAAa;AAAA,IAAA,GACvB;AAAA,EAEJ;AAEA,MAAI,SAAS,SAAS;AACpB,WACE,qBAAC,OAAA,EAAK,GAAG,cAAc,iCAA8B,SACnD,UAAA;AAAA,MAAA,oBAAC,WAAM,UAAA,QAAA,CAAK;AAAA,0BACX,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,MAC9B,oBAAC,QAAA,EAAK,GAAE,WAAA,CAAW;AAAA,MACnB,oBAAC,QAAA,EAAK,GAAE,YAAA,CAAY;AAAA,IAAA,GACtB;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAK,GAAG,cAAc,iCAA8B,QACnD,UAAA;AAAA,IAAA,oBAAC,WAAM,UAAA,cAAA,CAAW;AAAA,wBACjB,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAC9B,oBAAC,QAAA,EAAK,GAAE,WAAA,CAAW;AAAA,IACnB,oBAAC,QAAA,EAAK,GAAE,YAAA,CAAY;AAAA,EAAA,GACtB;AAEJ;AAEA,SAAS,cAAc,MAAmC;AACxD,MAAI,SAAS,UAAW,QAAO,aAAa;AAC5C,MAAI,SAAS,QAAS,QAAO,aAAa;AAC1C,SAAO,aAAa;AACtB;AAEA,SAAS,cAAc;AACrB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,eAAY;AAAA,MACZ,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MAEf,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,GAAE,aAAA,CAAa;AAAA,QACrB,oBAAC,QAAA,EAAK,GAAE,aAAA,CAAa;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG3B;AASO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,aAAa,wBAAA;AACnB,QAAM,eAAe,SAAS,SAAS,UAAU,UAAU;AAC3D,QAAM,eAAe,SAAS,OAAO,OAAQ,QAAQ,oBAAC,YAAS,MAAY;AAI3E,QAAM,UACJ,SAAS,YACL;AAAA,IACE,YAAY;AAAA,IACZ,QAAQ,aAAa;AAAA,IACrB,QAAQ,aAAa;AAAA,EAAA,IAEvB,SAAS,UACP;AAAA,IACE,YAAY;AAAA,IACZ,QAAQ,aAAa;AAAA,IACrB,QAAQ,aAAa;AAAA,EAAA,IAEvB;AAAA,IACE,YAAY;AAAA,IACZ,QAAQ,aAAa;AAAA,IACrB,QAAQ;AAAA,EAAA;AAGlB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,MAAM;AAAA,MACN,aAAW;AAAA,MACX,OAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK,QAAQ;AAAA,QACb,iBAAiB,QAAQ;AAAA,QACzB,QAAQ,aAAa,QAAQ,MAAM;AAAA,QACnC,cAAc;AAAA,QACd,cAAc,QAAQ;AAAA,QACtB,oBAAoB,QAAQ;AAAA,QAC5B,kBAAkB,QAAQ;AAAA,QAC1B,UAAU;AAAA,QACV,GAAG;AAAA,MAAA;AAAA,MAGL,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,eAAW;AAAA,YACX,eAAY;AAAA,YACZ,OAAO;AAAA,cACL,UAAU;AAAA,cACV,YAAY;AAAA,cACZ,kBAAkB;AAAA,cAClB,OAAO;AAAA,cACP,YAAY,QAAQ;AAAA;AAAA,YAAA;AAAA,UAEtB;AAAA,QAAA;AAAA,QAGD,eACC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,cACL,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,WAAW;AAAA,cACX,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,OAAO,cAAc,IAAI;AAAA,YAAA;AAAA,YAG1B,UAAA;AAAA,UAAA;AAAA,QAAA,IAED;AAAA,QAEJ,qBAAC,OAAA,EAAM,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,UAAU,EAAA,GACzC,UAAA;AAAA,UAAA,oBAAC,MAAA,EAAK,MAAK,MAAK,IAAI,KAAK,GAAG,aAAa,kBAAkB,IAAI,KAC5D,UAAA,MAAA,CACH;AAAA,UACC,UACC,oBAAC,MAAA,EAAK,MAAK,MAAK,GAAG,aAAa,oBAAoB,IAAI,KACrD,UAAA,QAAA,CACH,IACE;AAAA,QAAA,GACN;AAAA,QAEC,gCACE,SAAA,EAAQ,OAAO,cAAc,WAAS,MAAC,UAAS,OAC/C,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,OAAM;AAAA,YACN,cAAY;AAAA,YACZ,SAAS;AAAA,YACT,OAAO,EAAE,YAAY,GAAG,WAAW,GAAA;AAAA,YAEnC,8BAAC,aAAA,CAAA,CAAY;AAAA,UAAA;AAAA,QAAA,GAEjB,IACE;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGV;AASO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA,MAAM,QAAQ;AAAA,EACd;AACF,GAA6B;AAC3B,SACE,oBAAC,OAAA,EAAM,KAAU,WACd,SAAA,CACH;AAEJ;"}