@fairmint/ui 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -60
- package/dist/components/AppHeader/AppHeader.d.ts +15 -0
- package/dist/components/AppHeader/AppHeader.d.ts.map +1 -0
- package/dist/components/ErrorFallback/ErrorFallback.d.ts +14 -0
- package/dist/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
- package/dist/components/FairmintLogo/FairmintLogo.d.ts +14 -0
- package/dist/components/FairmintLogo/FairmintLogo.d.ts.map +1 -0
- package/dist/components/FairmintProvider/FairmintProvider.d.ts +9 -0
- package/dist/components/FairmintProvider/FairmintProvider.d.ts.map +1 -0
- package/dist/components/LoadingSpinner/LoadingSpinner.d.ts +10 -0
- package/dist/components/LoadingSpinner/LoadingSpinner.d.ts.map +1 -0
- package/dist/components/PageHeader/PageHeader.d.ts +11 -0
- package/dist/components/PageHeader/PageHeader.d.ts.map +1 -0
- package/dist/components/SideNav/SideNav.d.ts +21 -0
- package/dist/components/SideNav/SideNav.d.ts.map +1 -0
- package/dist/components/UserMenu/UserMenu.d.ts +31 -0
- package/dist/components/UserMenu/UserMenu.d.ts.map +1 -0
- package/dist/{fairmint-ui.cjs.js → fairmint-ui.cjs} +76 -62
- package/dist/fairmint-ui.cjs.map +1 -0
- package/dist/{fairmint-ui.es.js → fairmint-ui.js} +77 -63
- package/dist/fairmint-ui.js.map +1 -0
- package/dist/index.d.ts +18 -301
- package/dist/index.d.ts.map +1 -0
- package/dist/styles.css +6 -2
- package/dist/test/setup.d.ts +1 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/theme/index.d.ts +170 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/vite.cjs +33 -0
- package/dist/vite.cjs.map +1 -0
- package/dist/vite.d.ts +20 -0
- package/dist/vite.d.ts.map +1 -0
- package/dist/vite.js +33 -0
- package/dist/vite.js.map +1 -0
- package/package.json +30 -23
- package/dist/fairmint-ui.cjs.js.map +0 -1
- package/dist/fairmint-ui.es.js.map +0 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { MantineColorsTuple } from '@mantine/core';
|
|
2
|
+
export declare const theme: {
|
|
3
|
+
focusRing?: "auto" | "always" | "never" | undefined;
|
|
4
|
+
scale?: number | undefined;
|
|
5
|
+
fontSmoothing?: boolean | undefined;
|
|
6
|
+
white?: string | undefined;
|
|
7
|
+
black?: string | undefined;
|
|
8
|
+
colors?: {
|
|
9
|
+
[x: string & {}]: MantineColorsTuple | undefined;
|
|
10
|
+
dark?: MantineColorsTuple | undefined;
|
|
11
|
+
gray?: MantineColorsTuple | undefined;
|
|
12
|
+
red?: MantineColorsTuple | undefined;
|
|
13
|
+
pink?: MantineColorsTuple | undefined;
|
|
14
|
+
grape?: MantineColorsTuple | undefined;
|
|
15
|
+
violet?: MantineColorsTuple | undefined;
|
|
16
|
+
indigo?: MantineColorsTuple | undefined;
|
|
17
|
+
blue?: MantineColorsTuple | undefined;
|
|
18
|
+
cyan?: MantineColorsTuple | undefined;
|
|
19
|
+
green?: MantineColorsTuple | undefined;
|
|
20
|
+
lime?: MantineColorsTuple | undefined;
|
|
21
|
+
yellow?: MantineColorsTuple | undefined;
|
|
22
|
+
orange?: MantineColorsTuple | undefined;
|
|
23
|
+
teal?: MantineColorsTuple | undefined;
|
|
24
|
+
} | undefined;
|
|
25
|
+
primaryShade?: import('@mantine/core').MantineColorShade | {
|
|
26
|
+
light?: import('@mantine/core').MantineColorShade | undefined;
|
|
27
|
+
dark?: import('@mantine/core').MantineColorShade | undefined;
|
|
28
|
+
} | undefined;
|
|
29
|
+
primaryColor?: string | undefined;
|
|
30
|
+
variantColorResolver?: import('@mantine/core').VariantColorsResolver | undefined;
|
|
31
|
+
autoContrast?: boolean | undefined;
|
|
32
|
+
luminanceThreshold?: number | undefined;
|
|
33
|
+
fontFamily?: string | undefined;
|
|
34
|
+
fontFamilyMonospace?: string | undefined;
|
|
35
|
+
headings?: {
|
|
36
|
+
fontFamily?: string | undefined;
|
|
37
|
+
fontWeight?: string | undefined;
|
|
38
|
+
textWrap?: "wrap" | "nowrap" | "balance" | "pretty" | "stable" | undefined;
|
|
39
|
+
sizes?: {
|
|
40
|
+
h1?: {
|
|
41
|
+
fontSize?: string | undefined;
|
|
42
|
+
fontWeight?: string | undefined;
|
|
43
|
+
lineHeight?: string | undefined;
|
|
44
|
+
} | undefined;
|
|
45
|
+
h2?: {
|
|
46
|
+
fontSize?: string | undefined;
|
|
47
|
+
fontWeight?: string | undefined;
|
|
48
|
+
lineHeight?: string | undefined;
|
|
49
|
+
} | undefined;
|
|
50
|
+
h3?: {
|
|
51
|
+
fontSize?: string | undefined;
|
|
52
|
+
fontWeight?: string | undefined;
|
|
53
|
+
lineHeight?: string | undefined;
|
|
54
|
+
} | undefined;
|
|
55
|
+
h4?: {
|
|
56
|
+
fontSize?: string | undefined;
|
|
57
|
+
fontWeight?: string | undefined;
|
|
58
|
+
lineHeight?: string | undefined;
|
|
59
|
+
} | undefined;
|
|
60
|
+
h5?: {
|
|
61
|
+
fontSize?: string | undefined;
|
|
62
|
+
fontWeight?: string | undefined;
|
|
63
|
+
lineHeight?: string | undefined;
|
|
64
|
+
} | undefined;
|
|
65
|
+
h6?: {
|
|
66
|
+
fontSize?: string | undefined;
|
|
67
|
+
fontWeight?: string | undefined;
|
|
68
|
+
lineHeight?: string | undefined;
|
|
69
|
+
} | undefined;
|
|
70
|
+
} | undefined;
|
|
71
|
+
} | undefined;
|
|
72
|
+
radius?: {
|
|
73
|
+
[x: string & {}]: string | undefined;
|
|
74
|
+
xs?: string | undefined;
|
|
75
|
+
sm?: string | undefined;
|
|
76
|
+
md?: string | undefined;
|
|
77
|
+
lg?: string | undefined;
|
|
78
|
+
xl?: string | undefined;
|
|
79
|
+
} | undefined;
|
|
80
|
+
defaultRadius?: import('@mantine/core').MantineRadius | undefined;
|
|
81
|
+
spacing?: {
|
|
82
|
+
[x: number]: string | undefined;
|
|
83
|
+
[x: string & {}]: string | undefined;
|
|
84
|
+
xs?: string | undefined;
|
|
85
|
+
sm?: string | undefined;
|
|
86
|
+
md?: string | undefined;
|
|
87
|
+
lg?: string | undefined;
|
|
88
|
+
xl?: string | undefined;
|
|
89
|
+
} | undefined;
|
|
90
|
+
fontSizes?: {
|
|
91
|
+
[x: string & {}]: string | undefined;
|
|
92
|
+
xs?: string | undefined;
|
|
93
|
+
sm?: string | undefined;
|
|
94
|
+
md?: string | undefined;
|
|
95
|
+
lg?: string | undefined;
|
|
96
|
+
xl?: string | undefined;
|
|
97
|
+
} | undefined;
|
|
98
|
+
lineHeights?: {
|
|
99
|
+
[x: string & {}]: string | undefined;
|
|
100
|
+
xs?: string | undefined;
|
|
101
|
+
sm?: string | undefined;
|
|
102
|
+
md?: string | undefined;
|
|
103
|
+
lg?: string | undefined;
|
|
104
|
+
xl?: string | undefined;
|
|
105
|
+
} | undefined;
|
|
106
|
+
breakpoints?: {
|
|
107
|
+
[x: string & {}]: string | undefined;
|
|
108
|
+
xs?: string | undefined;
|
|
109
|
+
sm?: string | undefined;
|
|
110
|
+
md?: string | undefined;
|
|
111
|
+
lg?: string | undefined;
|
|
112
|
+
xl?: string | undefined;
|
|
113
|
+
} | undefined;
|
|
114
|
+
shadows?: {
|
|
115
|
+
[x: string & {}]: string | undefined;
|
|
116
|
+
xs?: string | undefined;
|
|
117
|
+
sm?: string | undefined;
|
|
118
|
+
md?: string | undefined;
|
|
119
|
+
lg?: string | undefined;
|
|
120
|
+
xl?: string | undefined;
|
|
121
|
+
} | undefined;
|
|
122
|
+
respectReducedMotion?: boolean | undefined;
|
|
123
|
+
cursorType?: "default" | "pointer" | undefined;
|
|
124
|
+
defaultGradient?: {
|
|
125
|
+
from?: string | undefined;
|
|
126
|
+
to?: string | undefined;
|
|
127
|
+
deg?: number | undefined;
|
|
128
|
+
} | undefined;
|
|
129
|
+
activeClassName?: string | undefined;
|
|
130
|
+
focusClassName?: string | undefined;
|
|
131
|
+
components?: {
|
|
132
|
+
[x: string]: {
|
|
133
|
+
classNames?: any;
|
|
134
|
+
styles?: any;
|
|
135
|
+
vars?: any;
|
|
136
|
+
defaultProps?: any;
|
|
137
|
+
} | undefined;
|
|
138
|
+
} | undefined;
|
|
139
|
+
other?: {
|
|
140
|
+
[x: string]: any;
|
|
141
|
+
} | undefined;
|
|
142
|
+
};
|
|
143
|
+
/** Brand colors for gradients and custom styling. */
|
|
144
|
+
export declare const brandColors: {
|
|
145
|
+
readonly blue: "#0A4EFB";
|
|
146
|
+
readonly purple: "#9E03FF";
|
|
147
|
+
readonly indigo: "#6366F1";
|
|
148
|
+
readonly gradient: "linear-gradient(90deg, #0A4EFB 0%, #9E03FF 100%)";
|
|
149
|
+
};
|
|
150
|
+
/** Neutral scale for direct access outside Mantine's theme system. Keys are numeric literals. */
|
|
151
|
+
export declare const neutralColors: {
|
|
152
|
+
readonly 50: "#F8F9FA";
|
|
153
|
+
readonly 100: "#F3F4F6";
|
|
154
|
+
readonly 200: "#E5E7EB";
|
|
155
|
+
readonly 300: "#D2D6DB";
|
|
156
|
+
readonly 400: "#9DA4AE";
|
|
157
|
+
readonly 500: "#6C737F";
|
|
158
|
+
readonly 600: "#4D5761";
|
|
159
|
+
readonly 700: "#2F3746";
|
|
160
|
+
readonly 800: "#1C2536";
|
|
161
|
+
readonly 900: "#111927";
|
|
162
|
+
};
|
|
163
|
+
/** Semantic colors for status-based styling. */
|
|
164
|
+
export declare const semanticColors: {
|
|
165
|
+
readonly success: "#10B981";
|
|
166
|
+
readonly warning: "#F79009";
|
|
167
|
+
readonly error: "#F04438";
|
|
168
|
+
readonly info: "#06AED4";
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/theme/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAiIrE,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiEhB,CAAC;AAEH,qDAAqD;AACrD,eAAO,MAAM,WAAW;;;;;CAKd,CAAC;AAEX,iGAAiG;AACjG,eAAO,MAAM,aAAa;;;;;;;;;;;CAWhB,CAAC;AAEX,gDAAgD;AAChD,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC"}
|
package/dist/vite.cjs
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const node_fs = require("node:fs");
|
|
4
|
+
const node_path = require("node:path");
|
|
5
|
+
function fairmintUiLocal(options) {
|
|
6
|
+
const enabled = process.env.LOCAL_UI === "1";
|
|
7
|
+
const localSource = options?.source ?? node_path.resolve(process.cwd(), "../ui/src/index.ts");
|
|
8
|
+
const localStyles = node_path.resolve(localSource, "../styles.css");
|
|
9
|
+
const found = enabled && node_fs.existsSync(localSource);
|
|
10
|
+
if (enabled && !node_fs.existsSync(localSource)) {
|
|
11
|
+
console.warn("[@fairmint/ui] LOCAL_UI=1 but source not found at:", localSource);
|
|
12
|
+
}
|
|
13
|
+
if (found) {
|
|
14
|
+
console.log("[@fairmint/ui] Using local source:", localSource);
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
name: "fairmint-ui-local",
|
|
18
|
+
config() {
|
|
19
|
+
if (!found) return {};
|
|
20
|
+
return {
|
|
21
|
+
resolve: {
|
|
22
|
+
alias: {
|
|
23
|
+
"@fairmint/ui/styles.css": localStyles,
|
|
24
|
+
"@fairmint/ui": localSource
|
|
25
|
+
},
|
|
26
|
+
dedupe: ["@mantine/core", "@mantine/hooks", "react", "react-dom"]
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
exports.fairmintUiLocal = fairmintUiLocal;
|
|
33
|
+
//# sourceMappingURL=vite.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.cjs","sources":["../src/vite.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { Plugin } from \"vite\";\n\ninterface FairmintUiLocalOptions {\n /** Path to the ui repo's src/index.ts. Auto-detected from ../ui/src/index.ts if not set. */\n source?: string;\n}\n\n/**\n * Vite plugin for local @fairmint/ui development.\n *\n * Resolves @fairmint/ui to local source for instant HMR without building.\n * Disabled by default — enable with LOCAL_UI=1 env var.\n *\n * Usage in consumer vite.config.ts:\n * import { fairmintUiLocal } from '@fairmint/ui/vite';\n * plugins: [fairmintUiLocal(), react()]\n *\n * Then run: LOCAL_UI=1 bun run dev\n */\nexport function fairmintUiLocal(options?: FairmintUiLocalOptions): Plugin {\n const enabled = process.env.LOCAL_UI === \"1\";\n\n const localSource = options?.source ?? resolve(process.cwd(), \"../ui/src/index.ts\");\n const localStyles = resolve(localSource, \"../styles.css\");\n const found = enabled && existsSync(localSource);\n\n if (enabled && !existsSync(localSource)) {\n console.warn(\"[@fairmint/ui] LOCAL_UI=1 but source not found at:\", localSource);\n }\n\n if (found) {\n console.log(\"[@fairmint/ui] Using local source:\", localSource);\n }\n\n return {\n name: \"fairmint-ui-local\",\n config() {\n if (!found) return {};\n\n return {\n resolve: {\n alias: {\n \"@fairmint/ui/styles.css\": localStyles,\n \"@fairmint/ui\": localSource,\n },\n dedupe: [\"@mantine/core\", \"@mantine/hooks\", \"react\", \"react-dom\"],\n },\n };\n },\n };\n}\n"],"names":["resolve","existsSync"],"mappings":";;;;AAqBO,SAAS,gBAAgB,SAA0C;AACxE,QAAM,UAAU,QAAQ,IAAI,aAAa;AAEzC,QAAM,cAAc,SAAS,UAAUA,UAAAA,QAAQ,QAAQ,IAAA,GAAO,oBAAoB;AAClF,QAAM,cAAcA,UAAAA,QAAQ,aAAa,eAAe;AACxD,QAAM,QAAQ,WAAWC,QAAAA,WAAW,WAAW;AAE/C,MAAI,WAAW,CAACA,mBAAW,WAAW,GAAG;AACvC,YAAQ,KAAK,sDAAsD,WAAW;AAAA,EAChF;AAEA,MAAI,OAAO;AACT,YAAQ,IAAI,sCAAsC,WAAW;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AACP,UAAI,CAAC,MAAO,QAAO,CAAA;AAEnB,aAAO;AAAA,QACL,SAAS;AAAA,UACP,OAAO;AAAA,YACL,2BAA2B;AAAA,YAC3B,gBAAgB;AAAA,UAAA;AAAA,UAElB,QAAQ,CAAC,iBAAiB,kBAAkB,SAAS,WAAW;AAAA,QAAA;AAAA,MAClE;AAAA,IAEJ;AAAA,EAAA;AAEJ;;"}
|
package/dist/vite.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Plugin } from 'vite';
|
|
2
|
+
interface FairmintUiLocalOptions {
|
|
3
|
+
/** Path to the ui repo's src/index.ts. Auto-detected from ../ui/src/index.ts if not set. */
|
|
4
|
+
source?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Vite plugin for local @fairmint/ui development.
|
|
8
|
+
*
|
|
9
|
+
* Resolves @fairmint/ui to local source for instant HMR without building.
|
|
10
|
+
* Disabled by default — enable with LOCAL_UI=1 env var.
|
|
11
|
+
*
|
|
12
|
+
* Usage in consumer vite.config.ts:
|
|
13
|
+
* import { fairmintUiLocal } from '@fairmint/ui/vite';
|
|
14
|
+
* plugins: [fairmintUiLocal(), react()]
|
|
15
|
+
*
|
|
16
|
+
* Then run: LOCAL_UI=1 bun run dev
|
|
17
|
+
*/
|
|
18
|
+
export declare function fairmintUiLocal(options?: FairmintUiLocalOptions): Plugin;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=vite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,UAAU,sBAAsB;IAC9B,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,MAAM,CA+BxE"}
|
package/dist/vite.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
function fairmintUiLocal(options) {
|
|
4
|
+
const enabled = process.env.LOCAL_UI === "1";
|
|
5
|
+
const localSource = options?.source ?? resolve(process.cwd(), "../ui/src/index.ts");
|
|
6
|
+
const localStyles = resolve(localSource, "../styles.css");
|
|
7
|
+
const found = enabled && existsSync(localSource);
|
|
8
|
+
if (enabled && !existsSync(localSource)) {
|
|
9
|
+
console.warn("[@fairmint/ui] LOCAL_UI=1 but source not found at:", localSource);
|
|
10
|
+
}
|
|
11
|
+
if (found) {
|
|
12
|
+
console.log("[@fairmint/ui] Using local source:", localSource);
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
name: "fairmint-ui-local",
|
|
16
|
+
config() {
|
|
17
|
+
if (!found) return {};
|
|
18
|
+
return {
|
|
19
|
+
resolve: {
|
|
20
|
+
alias: {
|
|
21
|
+
"@fairmint/ui/styles.css": localStyles,
|
|
22
|
+
"@fairmint/ui": localSource
|
|
23
|
+
},
|
|
24
|
+
dedupe: ["@mantine/core", "@mantine/hooks", "react", "react-dom"]
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
fairmintUiLocal
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=vite.js.map
|
package/dist/vite.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.js","sources":["../src/vite.ts"],"sourcesContent":["import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { Plugin } from \"vite\";\n\ninterface FairmintUiLocalOptions {\n /** Path to the ui repo's src/index.ts. Auto-detected from ../ui/src/index.ts if not set. */\n source?: string;\n}\n\n/**\n * Vite plugin for local @fairmint/ui development.\n *\n * Resolves @fairmint/ui to local source for instant HMR without building.\n * Disabled by default — enable with LOCAL_UI=1 env var.\n *\n * Usage in consumer vite.config.ts:\n * import { fairmintUiLocal } from '@fairmint/ui/vite';\n * plugins: [fairmintUiLocal(), react()]\n *\n * Then run: LOCAL_UI=1 bun run dev\n */\nexport function fairmintUiLocal(options?: FairmintUiLocalOptions): Plugin {\n const enabled = process.env.LOCAL_UI === \"1\";\n\n const localSource = options?.source ?? resolve(process.cwd(), \"../ui/src/index.ts\");\n const localStyles = resolve(localSource, \"../styles.css\");\n const found = enabled && existsSync(localSource);\n\n if (enabled && !existsSync(localSource)) {\n console.warn(\"[@fairmint/ui] LOCAL_UI=1 but source not found at:\", localSource);\n }\n\n if (found) {\n console.log(\"[@fairmint/ui] Using local source:\", localSource);\n }\n\n return {\n name: \"fairmint-ui-local\",\n config() {\n if (!found) return {};\n\n return {\n resolve: {\n alias: {\n \"@fairmint/ui/styles.css\": localStyles,\n \"@fairmint/ui\": localSource,\n },\n dedupe: [\"@mantine/core\", \"@mantine/hooks\", \"react\", \"react-dom\"],\n },\n };\n },\n };\n}\n"],"names":[],"mappings":";;AAqBO,SAAS,gBAAgB,SAA0C;AACxE,QAAM,UAAU,QAAQ,IAAI,aAAa;AAEzC,QAAM,cAAc,SAAS,UAAU,QAAQ,QAAQ,IAAA,GAAO,oBAAoB;AAClF,QAAM,cAAc,QAAQ,aAAa,eAAe;AACxD,QAAM,QAAQ,WAAW,WAAW,WAAW;AAE/C,MAAI,WAAW,CAAC,WAAW,WAAW,GAAG;AACvC,YAAQ,KAAK,sDAAsD,WAAW;AAAA,EAChF;AAEA,MAAI,OAAO;AACT,YAAQ,IAAI,sCAAsC,WAAW;AAAA,EAC/D;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AACP,UAAI,CAAC,MAAO,QAAO,CAAA;AAEnB,aAAO;AAAA,QACL,SAAS;AAAA,UACP,OAAO;AAAA,YACL,2BAA2B;AAAA,YAC3B,gBAAgB;AAAA,UAAA;AAAA,UAElB,QAAQ,CAAC,iBAAiB,kBAAkB,SAAS,WAAW;AAAA,QAAA;AAAA,MAClE;AAAA,IAEJ;AAAA,EAAA;AAEJ;"}
|
package/package.json
CHANGED
|
@@ -1,25 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fairmint/ui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Fairmint design system and UI component library",
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Fairmint/design.git",
|
|
10
|
+
"directory": "ui"
|
|
11
|
+
},
|
|
7
12
|
"engines": {
|
|
8
13
|
"node": ">=22"
|
|
9
14
|
},
|
|
10
15
|
"files": [
|
|
11
16
|
"dist"
|
|
12
17
|
],
|
|
13
|
-
"main": "./dist/fairmint-ui.cjs
|
|
14
|
-
"module": "./dist/fairmint-ui.
|
|
18
|
+
"main": "./dist/fairmint-ui.cjs",
|
|
19
|
+
"module": "./dist/fairmint-ui.js",
|
|
15
20
|
"types": "./dist/index.d.ts",
|
|
16
21
|
"exports": {
|
|
17
22
|
".": {
|
|
18
23
|
"types": "./dist/index.d.ts",
|
|
19
|
-
"import": "./dist/fairmint-ui.
|
|
20
|
-
"require": "./dist/fairmint-ui.cjs
|
|
24
|
+
"import": "./dist/fairmint-ui.js",
|
|
25
|
+
"require": "./dist/fairmint-ui.cjs"
|
|
21
26
|
},
|
|
22
|
-
"./styles.css": "./dist/styles.css"
|
|
27
|
+
"./styles.css": "./dist/styles.css",
|
|
28
|
+
"./vite": {
|
|
29
|
+
"types": "./dist/vite.d.ts",
|
|
30
|
+
"import": "./dist/vite.js",
|
|
31
|
+
"require": "./dist/vite.cjs"
|
|
32
|
+
}
|
|
23
33
|
},
|
|
24
34
|
"sideEffects": [
|
|
25
35
|
"*.css"
|
|
@@ -27,28 +37,31 @@
|
|
|
27
37
|
"publishConfig": {
|
|
28
38
|
"access": "restricted"
|
|
29
39
|
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@mantine/core": "~8.3.0",
|
|
42
|
+
"@mantine/hooks": "~8.3.0"
|
|
43
|
+
},
|
|
30
44
|
"scripts": {
|
|
31
45
|
"dev": "storybook dev -p 6006",
|
|
32
46
|
"build": "tsc --noEmit && vite build",
|
|
33
47
|
"build:storybook": "storybook build",
|
|
34
|
-
"lint": "
|
|
35
|
-
"lint:check": "
|
|
48
|
+
"lint": "biome check --fix .",
|
|
49
|
+
"lint:check": "biome check .",
|
|
36
50
|
"typecheck": "tsc --noEmit",
|
|
37
51
|
"test": "vitest run",
|
|
38
52
|
"test:watch": "vitest",
|
|
39
53
|
"test:coverage": "vitest run --coverage",
|
|
40
|
-
"
|
|
54
|
+
"prepare": "husky",
|
|
55
|
+
"prepublishOnly": "bun run build"
|
|
41
56
|
},
|
|
42
57
|
"peerDependencies": {
|
|
43
|
-
"@mantine/core": "
|
|
44
|
-
"@mantine/hooks": "
|
|
58
|
+
"@mantine/core": "~8.3.0",
|
|
59
|
+
"@mantine/hooks": "~8.3.0",
|
|
45
60
|
"react": "^19.0.0",
|
|
46
61
|
"react-dom": "^19.0.0"
|
|
47
62
|
},
|
|
48
63
|
"devDependencies": {
|
|
49
|
-
"@
|
|
50
|
-
"@mantine/core": "8.3.15",
|
|
51
|
-
"@mantine/hooks": "8.3.15",
|
|
64
|
+
"@biomejs/biome": "2.4.5",
|
|
52
65
|
"@storybook/addon-a11y": "10.2.13",
|
|
53
66
|
"@storybook/react": "10.2.13",
|
|
54
67
|
"@storybook/react-vite": "10.2.13",
|
|
@@ -57,26 +70,20 @@
|
|
|
57
70
|
"@testing-library/jest-dom": "6.9.1",
|
|
58
71
|
"@testing-library/react": "16.3.2",
|
|
59
72
|
"@testing-library/user-event": "14.6.1",
|
|
73
|
+
"@types/node": "25.3.3",
|
|
60
74
|
"@types/react": "19.2.14",
|
|
61
75
|
"@types/react-dom": "19.2.3",
|
|
62
|
-
"@typescript-eslint/eslint-plugin": "8.56.1",
|
|
63
|
-
"@typescript-eslint/parser": "8.56.1",
|
|
64
76
|
"@vitejs/plugin-react": "5.1.4",
|
|
65
77
|
"@vitest/coverage-v8": "4.0.18",
|
|
66
|
-
"eslint": "9.39.3",
|
|
67
|
-
"eslint-plugin-react-hooks": "7.0.1",
|
|
68
|
-
"eslint-plugin-react-refresh": "0.5.2",
|
|
69
|
-
"globals": "17.3.0",
|
|
70
78
|
"jsdom": "28.1.0",
|
|
79
|
+
"husky": "9.1.7",
|
|
71
80
|
"react": "19.2.4",
|
|
72
81
|
"react-dom": "19.2.4",
|
|
73
82
|
"storybook": "10.2.13",
|
|
74
83
|
"typescript": "5.9.3",
|
|
75
|
-
"typescript-eslint": "8.56.1",
|
|
76
84
|
"vite": "7.3.1",
|
|
77
85
|
"vite-plugin-dts": "4.5.4",
|
|
78
86
|
"vite-tsconfig-paths": "6.1.1",
|
|
79
87
|
"vitest": "4.0.18"
|
|
80
|
-
}
|
|
81
|
-
"packageManager": "yarn@4.12.0"
|
|
88
|
+
}
|
|
82
89
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fairmint-ui.cjs.js","sources":["../src/theme/index.ts","../src/components/FairmintLogo/FairmintLogo.tsx","../src/components/LoadingSpinner/LoadingSpinner.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/ErrorFallback/ErrorFallback.tsx","../src/components/AppHeader/AppHeader.tsx","../src/components/SideNav/SideNav.tsx","../src/components/UserMenu/UserMenu.tsx"],"sourcesContent":["import { createTheme, MantineColorsTuple } from '@mantine/core';\n\n/**\n * Indigo palette — primary UI color.\n * Used for buttons, links, active navigation, focus rings.\n * Shade [5] (#6366F1) is the default primary.\n */\nconst indigo: MantineColorsTuple = [\n '#EEF2FF', '#E0E7FF', '#C7D2FE', '#A5B4FC', '#818CF8',\n '#6366F1', '#4F46E5', '#4338CA', '#3730A3', '#312E81',\n];\n\n/**\n * Neutral scale — replaces Mantine's default gray.\n * Used for text, borders, backgrounds, disabled states.\n */\nconst neutral: MantineColorsTuple = [\n '#F8F9FA', '#F3F4F6', '#E5E7EB', '#D2D6DB', '#9DA4AE',\n '#6C737F', '#4D5761', '#2F3746', '#1C2536', '#111927',\n];\n\n/**\n * Fairmint brand blue — accent color for gradients and brand elements.\n * Shade [5] (#0A4EFB) is the primary brand blue.\n *\n * NOTE: design/README.md lists #2D00F7 as Fairmint Blue.\n * This library uses #0A4EFB (production value from investorv2).\n */\nconst fairmintBlue: MantineColorsTuple = [\n '#e6f0ff', '#cce0ff', '#99c2ff', '#66a3ff', '#3385ff',\n '#0A4EFB', '#083ec9', '#062e97', '#041f64', '#020f32',\n];\n\n/**\n * Fairmint brand purple — accent color for gradients and brand elements.\n * Shade [5] (#9E03FF) is the primary brand purple.\n *\n * NOTE: design/README.md lists #6739FD as Fairmint Purple.\n * This library uses #9E03FF (production value from investorv2).\n */\nconst fairmintPurple: MantineColorsTuple = [\n '#f5e6ff', '#e6ccff', '#cc99ff', '#b366ff', '#9933ff',\n '#9E03FF', '#7e02cc', '#5f0299', '#3f0166', '#200133',\n];\n\nconst success: MantineColorsTuple = [\n '#F0FDF9', '#D1FAE5', '#A7F3D0', '#6EE7B7', '#34D399',\n '#10B981', '#059669', '#047857', '#065F46', '#134E48',\n];\n\nconst warning: MantineColorsTuple = [\n '#FFFAEB', '#FEF0C7', '#FEDF89', '#FEC84B', '#FDB022',\n '#F79009', '#DC6803', '#B54708', '#93370D', '#7A2E0E',\n];\n\nconst error: MantineColorsTuple = [\n '#FEF3F2', '#FEE4E2', '#FECDCA', '#FDA29B', '#F97066',\n '#F04438', '#D92D20', '#B42318', '#912018', '#7A271A',\n];\n\nconst info: MantineColorsTuple = [\n '#ECFDFF', '#CFF9FE', '#A5F0FC', '#67E3F9', '#22CCEE',\n '#06AED4', '#088AB2', '#0E7090', '#155B75', '#164C63',\n];\n\nexport const theme = createTheme({\n primaryColor: 'indigo',\n colors: { indigo, gray: neutral, fairmintBlue, fairmintPurple, success, warning, error, info },\n\n fontFamily: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\"',\n headings: {\n fontFamily: '\"Plus Jakarta Sans\", sans-serif',\n fontWeight: '700',\n },\n\n radius: {\n xs: '0.25rem',\n sm: '0.375rem',\n md: '0.5rem',\n lg: '0.75rem',\n xl: '1rem',\n },\n defaultRadius: 'md',\n\n breakpoints: {\n xs: '30em',\n sm: '48em',\n md: '64em',\n lg: '74em',\n xl: '90em',\n },\n\n components: {\n Button: {\n defaultProps: { size: 'md' },\n styles: {\n root: {\n fontWeight: 600,\n borderRadius: '0.75rem',\n textTransform: 'none' as const,\n },\n },\n },\n TextInput: {\n defaultProps: { size: 'md' },\n },\n Card: {\n defaultProps: {\n padding: 'lg',\n radius: 'xl',\n withBorder: true,\n },\n },\n Paper: {\n styles: {\n root: { backgroundImage: 'none' },\n },\n },\n Table: {\n styles: {\n thead: {\n fontSize: '0.75rem',\n fontWeight: 600,\n letterSpacing: '0.5px',\n textTransform: 'uppercase' as const,\n },\n },\n },\n },\n});\n\n/** Brand colors for gradients and custom styling. */\nexport const brandColors = {\n blue: '#0A4EFB',\n purple: '#9E03FF',\n indigo: '#6366F1',\n gradient: 'linear-gradient(90deg, #0A4EFB 0%, #9E03FF 100%)',\n} as const;\n\n/** Neutral scale for direct access outside Mantine's theme system. Keys are numeric literals. */\nexport const neutralColors = {\n 50: '#F8F9FA',\n 100: '#F3F4F6',\n 200: '#E5E7EB',\n 300: '#D2D6DB',\n 400: '#9DA4AE',\n 500: '#6C737F',\n 600: '#4D5761',\n 700: '#2F3746',\n 800: '#1C2536',\n 900: '#111927',\n} as const;\n\n/** Semantic colors for status-based styling. */\nexport const semanticColors = {\n success: '#10B981',\n warning: '#F79009',\n error: '#F04438',\n info: '#06AED4',\n} as const;\n","export interface FairmintLogoProps {\n /** Image source URL. Defaults to the CDN-hosted black wordmark. */\n src?: string;\n /** Width in pixels. @default 140 */\n width?: number;\n /** Height in pixels. @default 30 */\n height?: number;\n /** Additional CSS class. */\n className?: string;\n /** Alt text. @default \"Fairmint\" */\n alt?: string;\n}\n\nexport function FairmintLogo({\n src = 'https://imagedelivery.net/Lm6ChJXR4cIKKycsNMvGjA/0367be38-c9d8-4206-aaae-eba5ff830600/public',\n width = 140,\n height = 30,\n className,\n alt = 'Fairmint',\n}: FairmintLogoProps) {\n return (\n <img\n src={src}\n alt={alt}\n width={width}\n height={height}\n className={className}\n style={{ objectFit: 'contain' }}\n />\n );\n}\n","import { Box } from '@mantine/core';\n\nexport interface LoadingSpinnerProps {\n /** Icon size in pixels. @default 32 */\n size?: number;\n}\n\n/**\n * Animated certificate icon that fills from bottom to top.\n * Requires the consumer to import `@fairmint/ui/styles.css` for the keyframe animation.\n */\nexport function LoadingSpinner({ size = 32 }: LoadingSpinnerProps) {\n const iconProps = {\n xmlns: 'http://www.w3.org/2000/svg',\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n };\n\n const paths = (\n <>\n <path d=\"M15 15m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0\" />\n <path d=\"M13 17.5v4.5l2 -1.5l2 1.5v-4.5\" />\n <path d=\"M10 19h-5a2 2 0 0 1 -2 -2v-10c0 -1.1 .9 -2 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-1\" />\n <path d=\"M6 9h12\" />\n <path d=\"M6 12h3\" />\n <path d=\"M6 15h2\" />\n </>\n );\n\n return (\n <Box pos=\"relative\" style={{ width: size, height: size }} role=\"status\" aria-label=\"Loading\">\n <svg {...iconProps} stroke=\"var(--mantine-color-gray-3)\" style={{ position: 'absolute', inset: 0 }}>\n {paths}\n </svg>\n <svg\n {...iconProps}\n stroke=\"var(--mantine-color-indigo-5)\"\n style={{ position: 'absolute', inset: 0, animation: 'fillUp 1.4s ease-in-out infinite' }}\n >\n {paths}\n </svg>\n </Box>\n );\n}\n","import { Title, Text, Stack, Group } from '@mantine/core';\nimport type { ReactNode } from 'react';\n\nexport interface PageHeaderProps {\n /** Page title text. */\n title: string;\n /** Optional subtitle text. */\n subtitle?: string;\n /** Optional right-aligned action element (button, date picker, etc.). */\n action?: ReactNode;\n}\n\nexport function PageHeader({ title, subtitle, action }: PageHeaderProps) {\n return (\n <Group justify=\"space-between\" align=\"flex-start\" mb=\"lg\">\n <Stack gap={4}>\n <Title order={2}>{title}</Title>\n {subtitle && <Text c=\"dimmed\" size=\"sm\">{subtitle}</Text>}\n </Stack>\n {action}\n </Group>\n );\n}\n","import { Container, Title, Text, Button, Stack } from '@mantine/core';\n\nexport interface ErrorFallbackProps {\n /** Title text. @default \"Something went wrong\" */\n title?: string;\n /** Description text. @default \"We've been notified and are working on a fix.\" */\n description?: string;\n /** Callback when the user clicks the action button. Defaults to window.location.reload(). */\n onAction?: () => void;\n /** Action button label. @default \"Reload Page\" */\n actionLabel?: string;\n /** Optional error object for dev-mode display or logging. Compatible with Sentry ErrorBoundary render props. */\n error?: unknown;\n}\n\nexport function ErrorFallback({\n title = 'Something went wrong',\n description = \"We've been notified and are working on a fix.\",\n onAction,\n actionLabel = 'Reload Page',\n error,\n}: ErrorFallbackProps) {\n if (error !== undefined) {\n console.error('[ErrorFallback]', error);\n }\n\n const handleAction = onAction ?? (() => window.location.reload());\n\n return (\n <Container size=\"sm\" py=\"xl\">\n <Stack align=\"center\" gap=\"md\">\n <Title order={2}>{title}</Title>\n <Text c=\"dimmed\">{description}</Text>\n <Button onClick={handleAction}>{actionLabel}</Button>\n </Stack>\n </Container>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Group, Burger } from '@mantine/core';\n\nexport interface AppHeaderProps {\n /** Logo element (typically FairmintLogo). */\n logo: ReactNode;\n /** Right-aligned content (user menu, actions). */\n rightSection?: ReactNode;\n /** Whether mobile nav is open. Controls burger state. */\n mobileNavOpened?: boolean;\n /** Toggle mobile nav callback. */\n onMobileNavToggle?: () => void;\n /** Header height in pixels. @default 60 */\n height?: number;\n}\n\nexport function AppHeader({\n logo,\n rightSection,\n mobileNavOpened = false,\n onMobileNavToggle,\n height = 60,\n}: AppHeaderProps) {\n return (\n <Group h={height} px=\"md\" justify=\"space-between\">\n <Group>\n {onMobileNavToggle && (\n <Burger\n opened={mobileNavOpened}\n onClick={onMobileNavToggle}\n hiddenFrom=\"sm\"\n size=\"sm\"\n aria-label=\"Toggle navigation\"\n />\n )}\n {logo}\n </Group>\n {rightSection}\n </Group>\n );\n}\n","import { NavLink, Stack } from '@mantine/core';\nimport type { ReactNode } from 'react';\n\nexport interface SideNavItem {\n /** Unique identifier for this nav item (e.g., route path or slug). */\n id: string;\n /** Display label. */\n label: string;\n /** Icon element. */\n icon?: ReactNode;\n /** Whether this item is currently active. */\n active?: boolean;\n}\n\nexport interface SideNavProps {\n /** Navigation items to render. */\n items: SideNavItem[];\n /** Callback when a nav item is clicked. Receives the item's `id`. */\n onItemClick: (id: string) => void;\n /** Active color. @default \"indigo\" */\n color?: string;\n}\n\nexport function SideNav({ items, onItemClick, color = 'indigo' }: SideNavProps) {\n return (\n <Stack component=\"nav\" gap={4} p=\"md\" aria-label=\"Main navigation\">\n {items.map((item) => (\n <NavLink\n key={item.id}\n label={item.label}\n leftSection={item.icon}\n active={item.active}\n onClick={() => onItemClick(item.id)}\n color={color}\n variant=\"light\"\n style={{ borderRadius: 'var(--mantine-radius-md)' }}\n styles={{\n root: {\n color: item.active ? undefined : 'var(--mantine-color-gray-5)',\n fontWeight: item.active ? 500 : 400,\n },\n section: {\n color: item.active ? undefined : 'var(--mantine-color-gray-4)',\n },\n }}\n />\n ))}\n </Stack>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Menu, UnstyledButton, Group, Avatar, Box, Text, Divider } from '@mantine/core';\n\nexport interface UserMenuItem {\n /** Unique identifier for this menu item. */\n id: string;\n /** Display label. */\n label: string;\n /** Icon element. */\n icon?: ReactNode;\n /** Item color (e.g., \"red\" for destructive actions). */\n color?: string;\n /** Optional section label above this item. Set on the first item in a group. */\n sectionLabel?: string;\n /** Show a divider before this item. */\n dividerBefore?: boolean;\n}\n\nexport interface UserMenuProps {\n /** User display name or email. */\n displayName: string;\n /** Single-character avatar initial. Derived from displayName[0] if not provided. */\n avatarInitial?: string;\n /** Avatar color. @default \"indigo\" */\n avatarColor?: string;\n /** Optional indicator element after the display name (e.g., chevron icon from your app's icon library). */\n indicator?: ReactNode;\n /** Menu items. */\n items: UserMenuItem[];\n /** Callback when a menu item is clicked. Receives the item's `id`. */\n onItemClick: (id: string) => void;\n}\n\nexport function UserMenu({\n displayName,\n avatarInitial,\n avatarColor = 'indigo',\n indicator,\n items,\n onItemClick,\n}: UserMenuProps) {\n const initial = avatarInitial ?? displayName.charAt(0).toUpperCase();\n\n return (\n <Menu shadow=\"md\" width={200} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton aria-label=\"User menu\">\n <Group gap=\"xs\">\n <Avatar size=\"sm\" radius=\"xl\" color={avatarColor}>{initial}</Avatar>\n <Box visibleFrom=\"sm\">\n <Text size=\"sm\" fw={500} lineClamp={1} style={{ maxWidth: 150 }}>\n {displayName}\n </Text>\n </Box>\n {indicator}\n </Group>\n </UnstyledButton>\n </Menu.Target>\n\n <Menu.Dropdown>\n {items.map((item) => (\n <div key={item.id}>\n {item.dividerBefore && <Divider my=\"xs\" />}\n {item.sectionLabel && <Menu.Label>{item.sectionLabel}</Menu.Label>}\n <Menu.Item\n leftSection={item.icon}\n color={item.color}\n onClick={() => onItemClick(item.id)}\n >\n {item.label}\n </Menu.Item>\n </div>\n ))}\n </Menu.Dropdown>\n </Menu>\n );\n}\n"],"names":["createTheme","jsx","jsxs","Fragment","Box","Group","Stack","Title","Text","error","Container","Button","Burger","NavLink","Menu","UnstyledButton","Avatar","Divider"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fairmint-ui.es.js","sources":["../src/theme/index.ts","../src/components/FairmintLogo/FairmintLogo.tsx","../src/components/LoadingSpinner/LoadingSpinner.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/ErrorFallback/ErrorFallback.tsx","../src/components/AppHeader/AppHeader.tsx","../src/components/SideNav/SideNav.tsx","../src/components/UserMenu/UserMenu.tsx"],"sourcesContent":["import { createTheme, MantineColorsTuple } from '@mantine/core';\n\n/**\n * Indigo palette — primary UI color.\n * Used for buttons, links, active navigation, focus rings.\n * Shade [5] (#6366F1) is the default primary.\n */\nconst indigo: MantineColorsTuple = [\n '#EEF2FF', '#E0E7FF', '#C7D2FE', '#A5B4FC', '#818CF8',\n '#6366F1', '#4F46E5', '#4338CA', '#3730A3', '#312E81',\n];\n\n/**\n * Neutral scale — replaces Mantine's default gray.\n * Used for text, borders, backgrounds, disabled states.\n */\nconst neutral: MantineColorsTuple = [\n '#F8F9FA', '#F3F4F6', '#E5E7EB', '#D2D6DB', '#9DA4AE',\n '#6C737F', '#4D5761', '#2F3746', '#1C2536', '#111927',\n];\n\n/**\n * Fairmint brand blue — accent color for gradients and brand elements.\n * Shade [5] (#0A4EFB) is the primary brand blue.\n *\n * NOTE: design/README.md lists #2D00F7 as Fairmint Blue.\n * This library uses #0A4EFB (production value from investorv2).\n */\nconst fairmintBlue: MantineColorsTuple = [\n '#e6f0ff', '#cce0ff', '#99c2ff', '#66a3ff', '#3385ff',\n '#0A4EFB', '#083ec9', '#062e97', '#041f64', '#020f32',\n];\n\n/**\n * Fairmint brand purple — accent color for gradients and brand elements.\n * Shade [5] (#9E03FF) is the primary brand purple.\n *\n * NOTE: design/README.md lists #6739FD as Fairmint Purple.\n * This library uses #9E03FF (production value from investorv2).\n */\nconst fairmintPurple: MantineColorsTuple = [\n '#f5e6ff', '#e6ccff', '#cc99ff', '#b366ff', '#9933ff',\n '#9E03FF', '#7e02cc', '#5f0299', '#3f0166', '#200133',\n];\n\nconst success: MantineColorsTuple = [\n '#F0FDF9', '#D1FAE5', '#A7F3D0', '#6EE7B7', '#34D399',\n '#10B981', '#059669', '#047857', '#065F46', '#134E48',\n];\n\nconst warning: MantineColorsTuple = [\n '#FFFAEB', '#FEF0C7', '#FEDF89', '#FEC84B', '#FDB022',\n '#F79009', '#DC6803', '#B54708', '#93370D', '#7A2E0E',\n];\n\nconst error: MantineColorsTuple = [\n '#FEF3F2', '#FEE4E2', '#FECDCA', '#FDA29B', '#F97066',\n '#F04438', '#D92D20', '#B42318', '#912018', '#7A271A',\n];\n\nconst info: MantineColorsTuple = [\n '#ECFDFF', '#CFF9FE', '#A5F0FC', '#67E3F9', '#22CCEE',\n '#06AED4', '#088AB2', '#0E7090', '#155B75', '#164C63',\n];\n\nexport const theme = createTheme({\n primaryColor: 'indigo',\n colors: { indigo, gray: neutral, fairmintBlue, fairmintPurple, success, warning, error, info },\n\n fontFamily: '\"Inter\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\"',\n headings: {\n fontFamily: '\"Plus Jakarta Sans\", sans-serif',\n fontWeight: '700',\n },\n\n radius: {\n xs: '0.25rem',\n sm: '0.375rem',\n md: '0.5rem',\n lg: '0.75rem',\n xl: '1rem',\n },\n defaultRadius: 'md',\n\n breakpoints: {\n xs: '30em',\n sm: '48em',\n md: '64em',\n lg: '74em',\n xl: '90em',\n },\n\n components: {\n Button: {\n defaultProps: { size: 'md' },\n styles: {\n root: {\n fontWeight: 600,\n borderRadius: '0.75rem',\n textTransform: 'none' as const,\n },\n },\n },\n TextInput: {\n defaultProps: { size: 'md' },\n },\n Card: {\n defaultProps: {\n padding: 'lg',\n radius: 'xl',\n withBorder: true,\n },\n },\n Paper: {\n styles: {\n root: { backgroundImage: 'none' },\n },\n },\n Table: {\n styles: {\n thead: {\n fontSize: '0.75rem',\n fontWeight: 600,\n letterSpacing: '0.5px',\n textTransform: 'uppercase' as const,\n },\n },\n },\n },\n});\n\n/** Brand colors for gradients and custom styling. */\nexport const brandColors = {\n blue: '#0A4EFB',\n purple: '#9E03FF',\n indigo: '#6366F1',\n gradient: 'linear-gradient(90deg, #0A4EFB 0%, #9E03FF 100%)',\n} as const;\n\n/** Neutral scale for direct access outside Mantine's theme system. Keys are numeric literals. */\nexport const neutralColors = {\n 50: '#F8F9FA',\n 100: '#F3F4F6',\n 200: '#E5E7EB',\n 300: '#D2D6DB',\n 400: '#9DA4AE',\n 500: '#6C737F',\n 600: '#4D5761',\n 700: '#2F3746',\n 800: '#1C2536',\n 900: '#111927',\n} as const;\n\n/** Semantic colors for status-based styling. */\nexport const semanticColors = {\n success: '#10B981',\n warning: '#F79009',\n error: '#F04438',\n info: '#06AED4',\n} as const;\n","export interface FairmintLogoProps {\n /** Image source URL. Defaults to the CDN-hosted black wordmark. */\n src?: string;\n /** Width in pixels. @default 140 */\n width?: number;\n /** Height in pixels. @default 30 */\n height?: number;\n /** Additional CSS class. */\n className?: string;\n /** Alt text. @default \"Fairmint\" */\n alt?: string;\n}\n\nexport function FairmintLogo({\n src = 'https://imagedelivery.net/Lm6ChJXR4cIKKycsNMvGjA/0367be38-c9d8-4206-aaae-eba5ff830600/public',\n width = 140,\n height = 30,\n className,\n alt = 'Fairmint',\n}: FairmintLogoProps) {\n return (\n <img\n src={src}\n alt={alt}\n width={width}\n height={height}\n className={className}\n style={{ objectFit: 'contain' }}\n />\n );\n}\n","import { Box } from '@mantine/core';\n\nexport interface LoadingSpinnerProps {\n /** Icon size in pixels. @default 32 */\n size?: number;\n}\n\n/**\n * Animated certificate icon that fills from bottom to top.\n * Requires the consumer to import `@fairmint/ui/styles.css` for the keyframe animation.\n */\nexport function LoadingSpinner({ size = 32 }: LoadingSpinnerProps) {\n const iconProps = {\n xmlns: 'http://www.w3.org/2000/svg',\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n strokeWidth: 1.5,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n };\n\n const paths = (\n <>\n <path d=\"M15 15m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0\" />\n <path d=\"M13 17.5v4.5l2 -1.5l2 1.5v-4.5\" />\n <path d=\"M10 19h-5a2 2 0 0 1 -2 -2v-10c0 -1.1 .9 -2 2 -2h14a2 2 0 0 1 2 2v10a2 2 0 0 1 -2 2h-1\" />\n <path d=\"M6 9h12\" />\n <path d=\"M6 12h3\" />\n <path d=\"M6 15h2\" />\n </>\n );\n\n return (\n <Box pos=\"relative\" style={{ width: size, height: size }} role=\"status\" aria-label=\"Loading\">\n <svg {...iconProps} stroke=\"var(--mantine-color-gray-3)\" style={{ position: 'absolute', inset: 0 }}>\n {paths}\n </svg>\n <svg\n {...iconProps}\n stroke=\"var(--mantine-color-indigo-5)\"\n style={{ position: 'absolute', inset: 0, animation: 'fillUp 1.4s ease-in-out infinite' }}\n >\n {paths}\n </svg>\n </Box>\n );\n}\n","import { Title, Text, Stack, Group } from '@mantine/core';\nimport type { ReactNode } from 'react';\n\nexport interface PageHeaderProps {\n /** Page title text. */\n title: string;\n /** Optional subtitle text. */\n subtitle?: string;\n /** Optional right-aligned action element (button, date picker, etc.). */\n action?: ReactNode;\n}\n\nexport function PageHeader({ title, subtitle, action }: PageHeaderProps) {\n return (\n <Group justify=\"space-between\" align=\"flex-start\" mb=\"lg\">\n <Stack gap={4}>\n <Title order={2}>{title}</Title>\n {subtitle && <Text c=\"dimmed\" size=\"sm\">{subtitle}</Text>}\n </Stack>\n {action}\n </Group>\n );\n}\n","import { Container, Title, Text, Button, Stack } from '@mantine/core';\n\nexport interface ErrorFallbackProps {\n /** Title text. @default \"Something went wrong\" */\n title?: string;\n /** Description text. @default \"We've been notified and are working on a fix.\" */\n description?: string;\n /** Callback when the user clicks the action button. Defaults to window.location.reload(). */\n onAction?: () => void;\n /** Action button label. @default \"Reload Page\" */\n actionLabel?: string;\n /** Optional error object for dev-mode display or logging. Compatible with Sentry ErrorBoundary render props. */\n error?: unknown;\n}\n\nexport function ErrorFallback({\n title = 'Something went wrong',\n description = \"We've been notified and are working on a fix.\",\n onAction,\n actionLabel = 'Reload Page',\n error,\n}: ErrorFallbackProps) {\n if (error !== undefined) {\n console.error('[ErrorFallback]', error);\n }\n\n const handleAction = onAction ?? (() => window.location.reload());\n\n return (\n <Container size=\"sm\" py=\"xl\">\n <Stack align=\"center\" gap=\"md\">\n <Title order={2}>{title}</Title>\n <Text c=\"dimmed\">{description}</Text>\n <Button onClick={handleAction}>{actionLabel}</Button>\n </Stack>\n </Container>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Group, Burger } from '@mantine/core';\n\nexport interface AppHeaderProps {\n /** Logo element (typically FairmintLogo). */\n logo: ReactNode;\n /** Right-aligned content (user menu, actions). */\n rightSection?: ReactNode;\n /** Whether mobile nav is open. Controls burger state. */\n mobileNavOpened?: boolean;\n /** Toggle mobile nav callback. */\n onMobileNavToggle?: () => void;\n /** Header height in pixels. @default 60 */\n height?: number;\n}\n\nexport function AppHeader({\n logo,\n rightSection,\n mobileNavOpened = false,\n onMobileNavToggle,\n height = 60,\n}: AppHeaderProps) {\n return (\n <Group h={height} px=\"md\" justify=\"space-between\">\n <Group>\n {onMobileNavToggle && (\n <Burger\n opened={mobileNavOpened}\n onClick={onMobileNavToggle}\n hiddenFrom=\"sm\"\n size=\"sm\"\n aria-label=\"Toggle navigation\"\n />\n )}\n {logo}\n </Group>\n {rightSection}\n </Group>\n );\n}\n","import { NavLink, Stack } from '@mantine/core';\nimport type { ReactNode } from 'react';\n\nexport interface SideNavItem {\n /** Unique identifier for this nav item (e.g., route path or slug). */\n id: string;\n /** Display label. */\n label: string;\n /** Icon element. */\n icon?: ReactNode;\n /** Whether this item is currently active. */\n active?: boolean;\n}\n\nexport interface SideNavProps {\n /** Navigation items to render. */\n items: SideNavItem[];\n /** Callback when a nav item is clicked. Receives the item's `id`. */\n onItemClick: (id: string) => void;\n /** Active color. @default \"indigo\" */\n color?: string;\n}\n\nexport function SideNav({ items, onItemClick, color = 'indigo' }: SideNavProps) {\n return (\n <Stack component=\"nav\" gap={4} p=\"md\" aria-label=\"Main navigation\">\n {items.map((item) => (\n <NavLink\n key={item.id}\n label={item.label}\n leftSection={item.icon}\n active={item.active}\n onClick={() => onItemClick(item.id)}\n color={color}\n variant=\"light\"\n style={{ borderRadius: 'var(--mantine-radius-md)' }}\n styles={{\n root: {\n color: item.active ? undefined : 'var(--mantine-color-gray-5)',\n fontWeight: item.active ? 500 : 400,\n },\n section: {\n color: item.active ? undefined : 'var(--mantine-color-gray-4)',\n },\n }}\n />\n ))}\n </Stack>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Menu, UnstyledButton, Group, Avatar, Box, Text, Divider } from '@mantine/core';\n\nexport interface UserMenuItem {\n /** Unique identifier for this menu item. */\n id: string;\n /** Display label. */\n label: string;\n /** Icon element. */\n icon?: ReactNode;\n /** Item color (e.g., \"red\" for destructive actions). */\n color?: string;\n /** Optional section label above this item. Set on the first item in a group. */\n sectionLabel?: string;\n /** Show a divider before this item. */\n dividerBefore?: boolean;\n}\n\nexport interface UserMenuProps {\n /** User display name or email. */\n displayName: string;\n /** Single-character avatar initial. Derived from displayName[0] if not provided. */\n avatarInitial?: string;\n /** Avatar color. @default \"indigo\" */\n avatarColor?: string;\n /** Optional indicator element after the display name (e.g., chevron icon from your app's icon library). */\n indicator?: ReactNode;\n /** Menu items. */\n items: UserMenuItem[];\n /** Callback when a menu item is clicked. Receives the item's `id`. */\n onItemClick: (id: string) => void;\n}\n\nexport function UserMenu({\n displayName,\n avatarInitial,\n avatarColor = 'indigo',\n indicator,\n items,\n onItemClick,\n}: UserMenuProps) {\n const initial = avatarInitial ?? displayName.charAt(0).toUpperCase();\n\n return (\n <Menu shadow=\"md\" width={200} position=\"bottom-end\">\n <Menu.Target>\n <UnstyledButton aria-label=\"User menu\">\n <Group gap=\"xs\">\n <Avatar size=\"sm\" radius=\"xl\" color={avatarColor}>{initial}</Avatar>\n <Box visibleFrom=\"sm\">\n <Text size=\"sm\" fw={500} lineClamp={1} style={{ maxWidth: 150 }}>\n {displayName}\n </Text>\n </Box>\n {indicator}\n </Group>\n </UnstyledButton>\n </Menu.Target>\n\n <Menu.Dropdown>\n {items.map((item) => (\n <div key={item.id}>\n {item.dividerBefore && <Divider my=\"xs\" />}\n {item.sectionLabel && <Menu.Label>{item.sectionLabel}</Menu.Label>}\n <Menu.Item\n leftSection={item.icon}\n color={item.color}\n onClick={() => onItemClick(item.id)}\n >\n {item.label}\n </Menu.Item>\n </div>\n ))}\n </Menu.Dropdown>\n </Menu>\n );\n}\n"],"names":["error"],"mappings":"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"}
|