@burdenoff/microfe-proserviceworld 2026.720.1 → 2026.728.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/dist/proserviceworld/ProServiceWorldRoot.d.ts.map +1 -1
- package/dist/proserviceworld/ProServiceWorldRoot.js +49 -19
- package/dist/proserviceworld/ProServiceWorldRoot.js.map +1 -1
- package/dist/proserviceworld/ProServiceWorldRoutes.d.ts.map +1 -1
- package/dist/proserviceworld/ProServiceWorldRoutes.js +62 -27
- package/dist/proserviceworld/ProServiceWorldRoutes.js.map +1 -1
- package/dist/proserviceworld/components/ui.d.ts.map +1 -1
- package/dist/proserviceworld/components/ui.js +7 -1
- package/dist/proserviceworld/components/ui.js.map +1 -1
- package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts +187 -0
- package/dist/proserviceworld/hooks/useProServiceWorldApi.d.ts.map +1 -1
- package/dist/proserviceworld/hooks/useProServiceWorldApi.js +416 -140
- package/dist/proserviceworld/hooks/useProServiceWorldApi.js.map +1 -1
- package/dist/proserviceworld/pages/ClientPortalAccessPage.d.ts +4 -0
- package/dist/proserviceworld/pages/ClientPortalAccessPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/ClientPortalAccessPage.js +191 -0
- package/dist/proserviceworld/pages/ClientPortalAccessPage.js.map +1 -0
- package/dist/proserviceworld/pages/DashboardPage.d.ts.map +1 -1
- package/dist/proserviceworld/pages/DashboardPage.js +94 -82
- package/dist/proserviceworld/pages/DashboardPage.js.map +1 -1
- package/dist/proserviceworld/pages/MyPortalPage.d.ts +4 -0
- package/dist/proserviceworld/pages/MyPortalPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/MyPortalPage.js +162 -0
- package/dist/proserviceworld/pages/MyPortalPage.js.map +1 -0
- package/dist/proserviceworld/pages/MySignaturesPage.d.ts +4 -0
- package/dist/proserviceworld/pages/MySignaturesPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/MySignaturesPage.js +240 -0
- package/dist/proserviceworld/pages/MySignaturesPage.js.map +1 -0
- package/dist/proserviceworld/pages/SignaturesPage.d.ts +4 -0
- package/dist/proserviceworld/pages/SignaturesPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/SignaturesPage.js +317 -0
- package/dist/proserviceworld/pages/SignaturesPage.js.map +1 -0
- package/dist/proserviceworld/pages/TrustPage.d.ts +14 -0
- package/dist/proserviceworld/pages/TrustPage.d.ts.map +1 -0
- package/dist/proserviceworld/pages/TrustPage.js +603 -0
- package/dist/proserviceworld/pages/TrustPage.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProServiceWorldRoot.d.ts","sourceRoot":"","sources":["../../src/proserviceworld/ProServiceWorldRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ProServiceWorldRoot.d.ts","sourceRoot":"","sources":["../../src/proserviceworld/ProServiceWorldRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAqBhC,OAAO,KAAK,EAAW,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAkCjE,eAAO,MAAM,mBAAmB,EAAE,EAAE,CAAC,wBAAwB,CA8B5D,CAAC"}
|
|
@@ -2,16 +2,16 @@ import { ProServiceWorldProvider as e } from "./providers/ProServiceWorldProvide
|
|
|
2
2
|
import { ProServiceWorldRoutes as t } from "./ProServiceWorldRoutes.js";
|
|
3
3
|
import { joinPath as n } from "./utils/navigation.js";
|
|
4
4
|
import { useEffect as r } from "react";
|
|
5
|
-
import { BarChart2 as i, Briefcase as a, Building2 as o, Clock as s,
|
|
6
|
-
import { FeatureFlagProvider as
|
|
7
|
-
import { jsx as
|
|
5
|
+
import { BarChart2 as i, Briefcase as a, Building2 as o, Clock as s, Contact as c, FileSignature as l, FileText as u, FolderKanban as d, GitBranch as f, LayoutDashboard as p, LayoutGrid as m, PenTool as h, Receipt as g, ShieldCheck as _, Wallet as v } from "lucide-react";
|
|
6
|
+
import { FeatureFlagProvider as y } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
7
|
+
import { jsx as b } from "react/jsx-runtime";
|
|
8
8
|
//#region src/proserviceworld/ProServiceWorldRoot.tsx
|
|
9
|
-
var
|
|
9
|
+
var x = [
|
|
10
10
|
{
|
|
11
11
|
id: "dashboard",
|
|
12
12
|
label: "Dashboard",
|
|
13
13
|
path: "",
|
|
14
|
-
icon:
|
|
14
|
+
icon: p
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
id: "clients",
|
|
@@ -29,7 +29,7 @@ var _ = [
|
|
|
29
29
|
id: "matters",
|
|
30
30
|
label: "Matters",
|
|
31
31
|
path: "matters",
|
|
32
|
-
icon:
|
|
32
|
+
icon: d
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
id: "time",
|
|
@@ -41,39 +41,69 @@ var _ = [
|
|
|
41
41
|
id: "invoices",
|
|
42
42
|
label: "Invoices",
|
|
43
43
|
path: "invoices",
|
|
44
|
-
icon:
|
|
44
|
+
icon: g
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "trust",
|
|
48
|
+
label: "Trust Accounting",
|
|
49
|
+
path: "trust",
|
|
50
|
+
icon: v
|
|
45
51
|
},
|
|
46
52
|
{
|
|
47
53
|
id: "compliance",
|
|
48
54
|
label: "Compliance",
|
|
49
55
|
path: "compliance",
|
|
50
|
-
icon:
|
|
56
|
+
icon: _
|
|
51
57
|
},
|
|
52
58
|
{
|
|
53
59
|
id: "conflicts",
|
|
54
60
|
label: "Conflict Checks",
|
|
55
61
|
path: "conflicts",
|
|
56
|
-
icon:
|
|
62
|
+
icon: f
|
|
57
63
|
},
|
|
58
64
|
{
|
|
59
65
|
id: "documents",
|
|
60
66
|
label: "Documents",
|
|
61
67
|
path: "documents",
|
|
62
|
-
icon:
|
|
68
|
+
icon: u
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "signatures",
|
|
72
|
+
label: "Signatures",
|
|
73
|
+
path: "signatures",
|
|
74
|
+
icon: l
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: "my-signatures",
|
|
78
|
+
label: "My Signatures",
|
|
79
|
+
path: "my-signatures",
|
|
80
|
+
icon: h
|
|
63
81
|
},
|
|
64
82
|
{
|
|
65
83
|
id: "practice-areas",
|
|
66
84
|
label: "Practice Areas",
|
|
67
85
|
path: "practice-areas",
|
|
68
|
-
icon:
|
|
86
|
+
icon: m
|
|
69
87
|
},
|
|
70
88
|
{
|
|
71
89
|
id: "analytics",
|
|
72
90
|
label: "Analytics",
|
|
73
91
|
path: "analytics",
|
|
74
92
|
icon: i
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: "client-portal-access",
|
|
96
|
+
label: "Client Portal Access",
|
|
97
|
+
path: "client-portal-access",
|
|
98
|
+
icon: c
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: "portal",
|
|
102
|
+
label: "My Portal",
|
|
103
|
+
path: "portal",
|
|
104
|
+
icon: c
|
|
75
105
|
}
|
|
76
|
-
],
|
|
106
|
+
], S = (i) => {
|
|
77
107
|
let { registerNavItems: a, basePath: o = "/" } = i;
|
|
78
108
|
return r(() => {
|
|
79
109
|
if (!a) return;
|
|
@@ -81,29 +111,29 @@ var _ = [
|
|
|
81
111
|
id: "proserviceworld",
|
|
82
112
|
label: "ProServiceWorld",
|
|
83
113
|
path: o,
|
|
84
|
-
icon: /* @__PURE__ */
|
|
114
|
+
icon: /* @__PURE__ */ b(p, { size: 20 }),
|
|
85
115
|
order: 80,
|
|
86
116
|
group: "products",
|
|
87
|
-
children:
|
|
117
|
+
children: x.map((e, t) => ({
|
|
88
118
|
id: `proserviceworld-${e.id}`,
|
|
89
119
|
label: e.label,
|
|
90
120
|
path: n(o, e.path),
|
|
91
|
-
icon: /* @__PURE__ */
|
|
121
|
+
icon: /* @__PURE__ */ b(e.icon, { size: 16 }),
|
|
92
122
|
order: t
|
|
93
123
|
}))
|
|
94
124
|
};
|
|
95
125
|
return a(e);
|
|
96
|
-
}, [a, o]), /* @__PURE__ */
|
|
126
|
+
}, [a, o]), /* @__PURE__ */ b(y, {
|
|
97
127
|
workspaceId: null,
|
|
98
128
|
gateway: "global",
|
|
99
129
|
defaultEnabled: !0,
|
|
100
|
-
children: /* @__PURE__ */
|
|
130
|
+
children: /* @__PURE__ */ b(e, {
|
|
101
131
|
...i,
|
|
102
|
-
children: /* @__PURE__ */
|
|
132
|
+
children: /* @__PURE__ */ b(t, {})
|
|
103
133
|
})
|
|
104
134
|
});
|
|
105
135
|
};
|
|
106
136
|
//#endregion
|
|
107
|
-
export {
|
|
137
|
+
export { S as ProServiceWorldRoot };
|
|
108
138
|
|
|
109
139
|
//# sourceMappingURL=ProServiceWorldRoot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProServiceWorldRoot.js","names":[],"sources":["../../src/proserviceworld/ProServiceWorldRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport {\n LayoutDashboard,\n Building2,\n Briefcase,\n FolderKanban,\n Clock,\n Receipt,\n ShieldCheck,\n GitBranch,\n FileText,\n LayoutGrid,\n BarChart2,\n} from 'lucide-react';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { ProServiceWorldProvider } from './providers/ProServiceWorldProvider';\nimport type { NavItem, ProServiceWorldRootProps } from './types';\nimport { ProServiceWorldRoutes } from './ProServiceWorldRoutes';\nimport { joinPath } from './utils/navigation';\n\n/**\n * The authoritative sidebar navigation is registered by the host app shell\n * (proserviceworld-app NavRegistration). These items are only used when the MFE\n * is mounted standalone with `registerNavItems` provided — they mirror the\n * shell's canonical professional-services routes exactly.\n */\nconst NAV: { id: string; label: string; path: string; icon: FC<{ size?: number }> }[] = [\n { id: 'dashboard', label: 'Dashboard', path: '', icon: LayoutDashboard },\n { id: 'clients', label: 'Clients', path: 'clients', icon: Building2 },\n { id: 'engagements', label: 'Engagements', path: 'engagements', icon: Briefcase },\n { id: 'matters', label: 'Matters', path: 'matters', icon: FolderKanban },\n { id: 'time', label: 'Time', path: 'time', icon: Clock },\n { id: 'invoices', label: 'Invoices', path: 'invoices', icon: Receipt },\n { id: 'compliance', label: 'Compliance', path: 'compliance', icon: ShieldCheck },\n { id: 'conflicts', label: 'Conflict Checks', path: 'conflicts', icon: GitBranch },\n { id: 'documents', label: 'Documents', path: 'documents', icon: FileText },\n { id: 'practice-areas', label: 'Practice Areas', path: 'practice-areas', icon: LayoutGrid },\n { id: 'analytics', label: 'Analytics', path: 'analytics', icon: BarChart2 },\n];\n\nexport const ProServiceWorldRoot: FC<ProServiceWorldRootProps> = (props) => {\n const { registerNavItems, basePath = '/' } = props;\n\n useEffect(() => {\n if (!registerNavItems) return;\n const navItem: NavItem = {\n id: 'proserviceworld',\n label: 'ProServiceWorld',\n path: basePath,\n icon: <LayoutDashboard size={20} />,\n order: 80,\n group: 'products',\n children: NAV.map((n, i) => ({\n id: `proserviceworld-${n.id}`,\n label: n.label,\n path: joinPath(basePath, n.path),\n icon: <n.icon size={16} />,\n order: i,\n })),\n };\n return registerNavItems(navItem);\n }, [registerNavItems, basePath]);\n\n return (\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <ProServiceWorldProvider {...props}>\n <ProServiceWorldRoutes />\n </ProServiceWorldProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"ProServiceWorldRoot.js","names":[],"sources":["../../src/proserviceworld/ProServiceWorldRoot.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { useEffect } from 'react';\nimport {\n LayoutDashboard,\n Building2,\n Briefcase,\n FolderKanban,\n Clock,\n Receipt,\n Wallet,\n ShieldCheck,\n GitBranch,\n FileText,\n LayoutGrid,\n BarChart2,\n FileSignature,\n PenTool,\n Contact,\n} from 'lucide-react';\nimport { FeatureFlagProvider } from '@burdenoff/fe-libs/shared/feature-flags';\nimport { ProServiceWorldProvider } from './providers/ProServiceWorldProvider';\nimport type { NavItem, ProServiceWorldRootProps } from './types';\nimport { ProServiceWorldRoutes } from './ProServiceWorldRoutes';\nimport { joinPath } from './utils/navigation';\n\n/**\n * The authoritative sidebar navigation is registered by the host app shell\n * (proserviceworld-app NavRegistration). These items are only used when the MFE\n * is mounted standalone with `registerNavItems` provided — they mirror the\n * shell's canonical professional-services routes exactly.\n */\nconst NAV: { id: string; label: string; path: string; icon: FC<{ size?: number }> }[] = [\n { id: 'dashboard', label: 'Dashboard', path: '', icon: LayoutDashboard },\n { id: 'clients', label: 'Clients', path: 'clients', icon: Building2 },\n { id: 'engagements', label: 'Engagements', path: 'engagements', icon: Briefcase },\n { id: 'matters', label: 'Matters', path: 'matters', icon: FolderKanban },\n { id: 'time', label: 'Time', path: 'time', icon: Clock },\n { id: 'invoices', label: 'Invoices', path: 'invoices', icon: Receipt },\n { id: 'trust', label: 'Trust Accounting', path: 'trust', icon: Wallet },\n { id: 'compliance', label: 'Compliance', path: 'compliance', icon: ShieldCheck },\n { id: 'conflicts', label: 'Conflict Checks', path: 'conflicts', icon: GitBranch },\n { id: 'documents', label: 'Documents', path: 'documents', icon: FileText },\n { id: 'signatures', label: 'Signatures', path: 'signatures', icon: FileSignature },\n { id: 'my-signatures', label: 'My Signatures', path: 'my-signatures', icon: PenTool },\n { id: 'practice-areas', label: 'Practice Areas', path: 'practice-areas', icon: LayoutGrid },\n { id: 'analytics', label: 'Analytics', path: 'analytics', icon: BarChart2 },\n {\n id: 'client-portal-access',\n label: 'Client Portal Access',\n path: 'client-portal-access',\n icon: Contact,\n },\n { id: 'portal', label: 'My Portal', path: 'portal', icon: Contact },\n];\n\nexport const ProServiceWorldRoot: FC<ProServiceWorldRootProps> = (props) => {\n const { registerNavItems, basePath = '/' } = props;\n\n useEffect(() => {\n if (!registerNavItems) return;\n const navItem: NavItem = {\n id: 'proserviceworld',\n label: 'ProServiceWorld',\n path: basePath,\n icon: <LayoutDashboard size={20} />,\n order: 80,\n group: 'products',\n children: NAV.map((n, i) => ({\n id: `proserviceworld-${n.id}`,\n label: n.label,\n path: joinPath(basePath, n.path),\n icon: <n.icon size={16} />,\n order: i,\n })),\n };\n return registerNavItems(navItem);\n }, [registerNavItems, basePath]);\n\n return (\n <FeatureFlagProvider workspaceId={null} gateway=\"global\" defaultEnabled={true}>\n <ProServiceWorldProvider {...props}>\n <ProServiceWorldRoutes />\n </ProServiceWorldProvider>\n </FeatureFlagProvider>\n );\n};\n"],"mappings":";;;;;;;;AA+BA,IAAM,IAAkF;CACtF;EAAE,IAAI;EAAa,OAAO;EAAa,MAAM;EAAI,MAAM;CAAgB;CACvE;EAAE,IAAI;EAAW,OAAO;EAAW,MAAM;EAAW,MAAM;CAAU;CACpE;EAAE,IAAI;EAAe,OAAO;EAAe,MAAM;EAAe,MAAM;CAAU;CAChF;EAAE,IAAI;EAAW,OAAO;EAAW,MAAM;EAAW,MAAM;CAAa;CACvE;EAAE,IAAI;EAAQ,OAAO;EAAQ,MAAM;EAAQ,MAAM;CAAM;CACvD;EAAE,IAAI;EAAY,OAAO;EAAY,MAAM;EAAY,MAAM;CAAQ;CACrE;EAAE,IAAI;EAAS,OAAO;EAAoB,MAAM;EAAS,MAAM;CAAO;CACtE;EAAE,IAAI;EAAc,OAAO;EAAc,MAAM;EAAc,MAAM;CAAY;CAC/E;EAAE,IAAI;EAAa,OAAO;EAAmB,MAAM;EAAa,MAAM;CAAU;CAChF;EAAE,IAAI;EAAa,OAAO;EAAa,MAAM;EAAa,MAAM;CAAS;CACzE;EAAE,IAAI;EAAc,OAAO;EAAc,MAAM;EAAc,MAAM;CAAc;CACjF;EAAE,IAAI;EAAiB,OAAO;EAAiB,MAAM;EAAiB,MAAM;CAAQ;CACpF;EAAE,IAAI;EAAkB,OAAO;EAAkB,MAAM;EAAkB,MAAM;CAAW;CAC1F;EAAE,IAAI;EAAa,OAAO;EAAa,MAAM;EAAa,MAAM;CAAU;CAC1E;EACE,IAAI;EACJ,OAAO;EACP,MAAM;EACN,MAAM;CACR;CACA;EAAE,IAAI;EAAU,OAAO;EAAa,MAAM;EAAU,MAAM;CAAQ;AACpE,GAEa,KAAqD,MAAU;CAC1E,IAAM,EAAE,qBAAkB,cAAW,QAAQ;CAsB7C,OApBA,QAAgB;EACd,IAAI,CAAC,GAAkB;EACvB,IAAM,IAAmB;GACvB,IAAI;GACJ,OAAO;GACP,MAAM;GACN,MAAM,kBAAC,GAAD,EAAiB,MAAM,GAAK,CAAA;GAClC,OAAO;GACP,OAAO;GACP,UAAU,EAAI,KAAK,GAAG,OAAO;IAC3B,IAAI,mBAAmB,EAAE;IACzB,OAAO,EAAE;IACT,MAAM,EAAS,GAAU,EAAE,IAAI;IAC/B,MAAM,kBAAC,EAAE,MAAH,EAAQ,MAAM,GAAK,CAAA;IACzB,OAAO;GACT,EAAE;EACJ;EACA,OAAO,EAAiB,CAAO;CACjC,GAAG,CAAC,GAAkB,CAAQ,CAAC,GAG7B,kBAAC,GAAD;EAAqB,aAAa;EAAM,SAAQ;EAAS,gBAAgB;YACvE,kBAAC,GAAD;GAAyB,GAAI;aAC3B,kBAAC,GAAD,CAAwB,CAAA;EACD,CAAA;CACN,CAAA;AAEzB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProServiceWorldRoutes.d.ts","sourceRoot":"","sources":["../../src/proserviceworld/ProServiceWorldRoutes.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ProServiceWorldRoutes.d.ts","sourceRoot":"","sources":["../../src/proserviceworld/ProServiceWorldRoutes.tsx"],"names":[],"mappings":"AA4EA,wBAAgB,qBAAqB,gCAyJpC"}
|
|
@@ -6,118 +6,153 @@ import { Loader2 as a } from "lucide-react";
|
|
|
6
6
|
import { Navigate as o, Route as s, Routes as c } from "react-router-dom";
|
|
7
7
|
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
8
8
|
//#region src/proserviceworld/ProServiceWorldRoutes.tsx
|
|
9
|
-
var d = i(() => import("./pages/ClientsPage.js").then((e) => ({ default: e.ClientsPage }))), f = i(() => import("./pages/ClientDetailPage.js").then((e) => ({ default: e.ClientDetailPage }))), p = i(() => import("./pages/EngagementsPage.js").then((e) => ({ default: e.EngagementsPage }))), m = i(() => import("./pages/EngagementDetailPage.js").then((e) => ({ default: e.EngagementDetailPage }))), h = i(() => import("./pages/MattersPage.js").then((e) => ({ default: e.MattersPage }))), g = i(() => import("./pages/TimePage.js").then((e) => ({ default: e.TimePage }))), _ = i(() => import("./pages/InvoicesPage.js").then((e) => ({ default: e.InvoicesPage }))), v = i(() => import("./pages/CompliancePage.js").then((e) => ({ default: e.CompliancePage }))),
|
|
10
|
-
function
|
|
9
|
+
var d = i(() => import("./pages/ClientsPage.js").then((e) => ({ default: e.ClientsPage }))), f = i(() => import("./pages/ClientDetailPage.js").then((e) => ({ default: e.ClientDetailPage }))), p = i(() => import("./pages/EngagementsPage.js").then((e) => ({ default: e.EngagementsPage }))), m = i(() => import("./pages/EngagementDetailPage.js").then((e) => ({ default: e.EngagementDetailPage }))), h = i(() => import("./pages/MattersPage.js").then((e) => ({ default: e.MattersPage }))), g = i(() => import("./pages/TimePage.js").then((e) => ({ default: e.TimePage }))), _ = i(() => import("./pages/InvoicesPage.js").then((e) => ({ default: e.InvoicesPage }))), v = i(() => import("./pages/TrustPage.js").then((e) => ({ default: e.TrustPage }))), y = i(() => import("./pages/CompliancePage.js").then((e) => ({ default: e.CompliancePage }))), b = i(() => import("./pages/ConflictsPage.js").then((e) => ({ default: e.ConflictsPage }))), x = i(() => import("./pages/DocumentsPage.js").then((e) => ({ default: e.DocumentsPage }))), S = i(() => import("./pages/PracticeAreasPage.js").then((e) => ({ default: e.PracticeAreasPage }))), C = i(() => import("./pages/AnalyticsPage.js").then((e) => ({ default: e.AnalyticsPage }))), w = i(() => import("./pages/SignaturesPage.js").then((e) => ({ default: e.SignaturesPage }))), T = i(() => import("./pages/MySignaturesPage.js").then((e) => ({ default: e.MySignaturesPage }))), E = i(() => import("./pages/ClientPortalAccessPage.js").then((e) => ({ default: e.ClientPortalAccessPage }))), D = i(() => import("./pages/MyPortalPage.js").then((e) => ({ default: e.MyPortalPage })));
|
|
10
|
+
function O() {
|
|
11
11
|
return /* @__PURE__ */ l("div", {
|
|
12
12
|
className: "flex min-h-[320px] items-center justify-center",
|
|
13
13
|
children: /* @__PURE__ */ l(a, { className: "h-8 w-8 animate-spin text-accent" })
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
|
-
function
|
|
16
|
+
function k() {
|
|
17
17
|
return t(), null;
|
|
18
18
|
}
|
|
19
|
-
function
|
|
19
|
+
function A({ pageId: e, children: t }) {
|
|
20
20
|
return /* @__PURE__ */ l(n, {
|
|
21
21
|
pageId: e,
|
|
22
22
|
children: /* @__PURE__ */ l(r, {
|
|
23
|
-
fallback: /* @__PURE__ */ l(
|
|
23
|
+
fallback: /* @__PURE__ */ l(O, {}),
|
|
24
24
|
children: t
|
|
25
25
|
})
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
|
-
function
|
|
28
|
+
function j() {
|
|
29
29
|
return /* @__PURE__ */ u(r, {
|
|
30
|
-
fallback: /* @__PURE__ */ l(
|
|
31
|
-
children: [/* @__PURE__ */ l(
|
|
30
|
+
fallback: /* @__PURE__ */ l(O, {}),
|
|
31
|
+
children: [/* @__PURE__ */ l(k, {}), /* @__PURE__ */ u(c, { children: [
|
|
32
32
|
/* @__PURE__ */ l(s, {
|
|
33
33
|
index: !0,
|
|
34
|
-
element: /* @__PURE__ */ l(
|
|
34
|
+
element: /* @__PURE__ */ l(A, {
|
|
35
35
|
pageId: "dashboard",
|
|
36
36
|
children: /* @__PURE__ */ l(e, {})
|
|
37
37
|
})
|
|
38
38
|
}),
|
|
39
39
|
/* @__PURE__ */ l(s, {
|
|
40
40
|
path: "clients",
|
|
41
|
-
element: /* @__PURE__ */ l(
|
|
41
|
+
element: /* @__PURE__ */ l(A, {
|
|
42
42
|
pageId: "clients",
|
|
43
43
|
children: /* @__PURE__ */ l(d, {})
|
|
44
44
|
})
|
|
45
45
|
}),
|
|
46
46
|
/* @__PURE__ */ l(s, {
|
|
47
47
|
path: "clients/:id",
|
|
48
|
-
element: /* @__PURE__ */ l(
|
|
48
|
+
element: /* @__PURE__ */ l(A, {
|
|
49
49
|
pageId: "client-detail",
|
|
50
50
|
children: /* @__PURE__ */ l(f, {})
|
|
51
51
|
})
|
|
52
52
|
}),
|
|
53
53
|
/* @__PURE__ */ l(s, {
|
|
54
54
|
path: "engagements",
|
|
55
|
-
element: /* @__PURE__ */ l(
|
|
55
|
+
element: /* @__PURE__ */ l(A, {
|
|
56
56
|
pageId: "engagements",
|
|
57
57
|
children: /* @__PURE__ */ l(p, {})
|
|
58
58
|
})
|
|
59
59
|
}),
|
|
60
60
|
/* @__PURE__ */ l(s, {
|
|
61
61
|
path: "engagements/:id",
|
|
62
|
-
element: /* @__PURE__ */ l(
|
|
62
|
+
element: /* @__PURE__ */ l(A, {
|
|
63
63
|
pageId: "engagement-detail",
|
|
64
64
|
children: /* @__PURE__ */ l(m, {})
|
|
65
65
|
})
|
|
66
66
|
}),
|
|
67
67
|
/* @__PURE__ */ l(s, {
|
|
68
68
|
path: "matters",
|
|
69
|
-
element: /* @__PURE__ */ l(
|
|
69
|
+
element: /* @__PURE__ */ l(A, {
|
|
70
70
|
pageId: "matters",
|
|
71
71
|
children: /* @__PURE__ */ l(h, {})
|
|
72
72
|
})
|
|
73
73
|
}),
|
|
74
74
|
/* @__PURE__ */ l(s, {
|
|
75
75
|
path: "time",
|
|
76
|
-
element: /* @__PURE__ */ l(
|
|
76
|
+
element: /* @__PURE__ */ l(A, {
|
|
77
77
|
pageId: "time",
|
|
78
78
|
children: /* @__PURE__ */ l(g, {})
|
|
79
79
|
})
|
|
80
80
|
}),
|
|
81
81
|
/* @__PURE__ */ l(s, {
|
|
82
82
|
path: "invoices",
|
|
83
|
-
element: /* @__PURE__ */ l(
|
|
83
|
+
element: /* @__PURE__ */ l(A, {
|
|
84
84
|
pageId: "invoices",
|
|
85
85
|
children: /* @__PURE__ */ l(_, {})
|
|
86
86
|
})
|
|
87
87
|
}),
|
|
88
|
+
/* @__PURE__ */ l(s, {
|
|
89
|
+
path: "trust",
|
|
90
|
+
element: /* @__PURE__ */ l(A, {
|
|
91
|
+
pageId: "trust",
|
|
92
|
+
children: /* @__PURE__ */ l(v, {})
|
|
93
|
+
})
|
|
94
|
+
}),
|
|
88
95
|
/* @__PURE__ */ l(s, {
|
|
89
96
|
path: "compliance",
|
|
90
|
-
element: /* @__PURE__ */ l(
|
|
97
|
+
element: /* @__PURE__ */ l(A, {
|
|
91
98
|
pageId: "compliance",
|
|
92
|
-
children: /* @__PURE__ */ l(
|
|
99
|
+
children: /* @__PURE__ */ l(y, {})
|
|
93
100
|
})
|
|
94
101
|
}),
|
|
95
102
|
/* @__PURE__ */ l(s, {
|
|
96
103
|
path: "conflicts",
|
|
97
|
-
element: /* @__PURE__ */ l(
|
|
104
|
+
element: /* @__PURE__ */ l(A, {
|
|
98
105
|
pageId: "conflicts",
|
|
99
|
-
children: /* @__PURE__ */ l(
|
|
106
|
+
children: /* @__PURE__ */ l(b, {})
|
|
100
107
|
})
|
|
101
108
|
}),
|
|
102
109
|
/* @__PURE__ */ l(s, {
|
|
103
110
|
path: "documents",
|
|
104
|
-
element: /* @__PURE__ */ l(
|
|
111
|
+
element: /* @__PURE__ */ l(A, {
|
|
105
112
|
pageId: "documents",
|
|
106
|
-
children: /* @__PURE__ */ l(
|
|
113
|
+
children: /* @__PURE__ */ l(x, {})
|
|
107
114
|
})
|
|
108
115
|
}),
|
|
109
116
|
/* @__PURE__ */ l(s, {
|
|
110
117
|
path: "practice-areas",
|
|
111
|
-
element: /* @__PURE__ */ l(
|
|
118
|
+
element: /* @__PURE__ */ l(A, {
|
|
112
119
|
pageId: "practice-areas",
|
|
113
|
-
children: /* @__PURE__ */ l(
|
|
120
|
+
children: /* @__PURE__ */ l(S, {})
|
|
114
121
|
})
|
|
115
122
|
}),
|
|
116
123
|
/* @__PURE__ */ l(s, {
|
|
117
124
|
path: "analytics",
|
|
118
|
-
element: /* @__PURE__ */ l(
|
|
125
|
+
element: /* @__PURE__ */ l(A, {
|
|
119
126
|
pageId: "analytics",
|
|
120
|
-
children: /* @__PURE__ */ l(
|
|
127
|
+
children: /* @__PURE__ */ l(C, {})
|
|
128
|
+
})
|
|
129
|
+
}),
|
|
130
|
+
/* @__PURE__ */ l(s, {
|
|
131
|
+
path: "signatures",
|
|
132
|
+
element: /* @__PURE__ */ l(A, {
|
|
133
|
+
pageId: "signatures",
|
|
134
|
+
children: /* @__PURE__ */ l(w, {})
|
|
135
|
+
})
|
|
136
|
+
}),
|
|
137
|
+
/* @__PURE__ */ l(s, {
|
|
138
|
+
path: "my-signatures",
|
|
139
|
+
element: /* @__PURE__ */ l(A, {
|
|
140
|
+
pageId: "my-signatures",
|
|
141
|
+
children: /* @__PURE__ */ l(T, {})
|
|
142
|
+
})
|
|
143
|
+
}),
|
|
144
|
+
/* @__PURE__ */ l(s, {
|
|
145
|
+
path: "client-portal-access",
|
|
146
|
+
element: /* @__PURE__ */ l(A, {
|
|
147
|
+
pageId: "client-portal-access",
|
|
148
|
+
children: /* @__PURE__ */ l(E, {})
|
|
149
|
+
})
|
|
150
|
+
}),
|
|
151
|
+
/* @__PURE__ */ l(s, {
|
|
152
|
+
path: "portal",
|
|
153
|
+
element: /* @__PURE__ */ l(A, {
|
|
154
|
+
pageId: "portal",
|
|
155
|
+
children: /* @__PURE__ */ l(D, {})
|
|
121
156
|
})
|
|
122
157
|
}),
|
|
123
158
|
/* @__PURE__ */ l(s, {
|
|
@@ -131,6 +166,6 @@ function E() {
|
|
|
131
166
|
});
|
|
132
167
|
}
|
|
133
168
|
//#endregion
|
|
134
|
-
export {
|
|
169
|
+
export { j as ProServiceWorldRoutes };
|
|
135
170
|
|
|
136
171
|
//# sourceMappingURL=ProServiceWorldRoutes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProServiceWorldRoutes.js","names":[],"sources":["../../src/proserviceworld/ProServiceWorldRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, type ReactNode } from 'react';\nimport { Navigate, Route, Routes } from 'react-router-dom';\nimport { Loader2 } from 'lucide-react';\nimport { DashboardPage } from './pages/DashboardPage';\nimport { usePageViewAnalytics } from './hooks/usePageViewAnalytics';\nimport { FeatureFlaggedPage } from './components/FeatureFlaggedPage';\n\nconst ClientsPage = lazy(() =>\n import('./pages/ClientsPage').then((m) => ({ default: m.ClientsPage }))\n);\nconst ClientDetailPage = lazy(() =>\n import('./pages/ClientDetailPage').then((m) => ({ default: m.ClientDetailPage }))\n);\nconst EngagementsPage = lazy(() =>\n import('./pages/EngagementsPage').then((m) => ({ default: m.EngagementsPage }))\n);\nconst EngagementDetailPage = lazy(() =>\n import('./pages/EngagementDetailPage').then((m) => ({ default: m.EngagementDetailPage }))\n);\nconst MattersPage = lazy(() =>\n import('./pages/MattersPage').then((m) => ({ default: m.MattersPage }))\n);\nconst TimePage = lazy(() => import('./pages/TimePage').then((m) => ({ default: m.TimePage })));\nconst InvoicesPage = lazy(() =>\n import('./pages/InvoicesPage').then((m) => ({ default: m.InvoicesPage }))\n);\nconst CompliancePage = lazy(() =>\n import('./pages/CompliancePage').then((m) => ({ default: m.CompliancePage }))\n);\nconst ConflictsPage = lazy(() =>\n import('./pages/ConflictsPage').then((m) => ({ default: m.ConflictsPage }))\n);\nconst DocumentsPage = lazy(() =>\n import('./pages/DocumentsPage').then((m) => ({ default: m.DocumentsPage }))\n);\nconst PracticeAreasPage = lazy(() =>\n import('./pages/PracticeAreasPage').then((m) => ({ default: m.PracticeAreasPage }))\n);\nconst AnalyticsPage = lazy(() =>\n import('./pages/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-accent\" />\n </div>\n );\n}\n\nfunction PageViewTracker() {\n usePageViewAnalytics();\n return null;\n}\n\nfunction Gate({ pageId, children }: { pageId: string; children: ReactNode }) {\n return (\n <FeatureFlaggedPage pageId={pageId}>\n <Suspense fallback={<PageLoader />}>{children}</Suspense>\n </FeatureFlaggedPage>\n );\n}\n\nexport function ProServiceWorldRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <PageViewTracker />\n <Routes>\n <Route\n index\n element={\n <Gate pageId=\"dashboard\">\n <DashboardPage />\n </Gate>\n }\n />\n <Route\n path=\"clients\"\n element={\n <Gate pageId=\"clients\">\n <ClientsPage />\n </Gate>\n }\n />\n <Route\n path=\"clients/:id\"\n element={\n <Gate pageId=\"client-detail\">\n <ClientDetailPage />\n </Gate>\n }\n />\n <Route\n path=\"engagements\"\n element={\n <Gate pageId=\"engagements\">\n <EngagementsPage />\n </Gate>\n }\n />\n <Route\n path=\"engagements/:id\"\n element={\n <Gate pageId=\"engagement-detail\">\n <EngagementDetailPage />\n </Gate>\n }\n />\n <Route\n path=\"matters\"\n element={\n <Gate pageId=\"matters\">\n <MattersPage />\n </Gate>\n }\n />\n <Route\n path=\"time\"\n element={\n <Gate pageId=\"time\">\n <TimePage />\n </Gate>\n }\n />\n <Route\n path=\"invoices\"\n element={\n <Gate pageId=\"invoices\">\n <InvoicesPage />\n </Gate>\n }\n />\n <Route\n path=\"compliance\"\n element={\n <Gate pageId=\"compliance\">\n <CompliancePage />\n </Gate>\n }\n />\n <Route\n path=\"conflicts\"\n element={\n <Gate pageId=\"conflicts\">\n <ConflictsPage />\n </Gate>\n }\n />\n <Route\n path=\"documents\"\n element={\n <Gate pageId=\"documents\">\n <DocumentsPage />\n </Gate>\n }\n />\n <Route\n path=\"practice-areas\"\n element={\n <Gate pageId=\"practice-areas\">\n <PracticeAreasPage />\n </Gate>\n }\n />\n <Route\n path=\"analytics\"\n element={\n <Gate pageId=\"analytics\">\n <AnalyticsPage />\n </Gate>\n }\n />\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProServiceWorldRoutes.js","names":[],"sources":["../../src/proserviceworld/ProServiceWorldRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, type ReactNode } from 'react';\nimport { Navigate, Route, Routes } from 'react-router-dom';\nimport { Loader2 } from 'lucide-react';\nimport { DashboardPage } from './pages/DashboardPage';\nimport { usePageViewAnalytics } from './hooks/usePageViewAnalytics';\nimport { FeatureFlaggedPage } from './components/FeatureFlaggedPage';\n\nconst ClientsPage = lazy(() =>\n import('./pages/ClientsPage').then((m) => ({ default: m.ClientsPage }))\n);\nconst ClientDetailPage = lazy(() =>\n import('./pages/ClientDetailPage').then((m) => ({ default: m.ClientDetailPage }))\n);\nconst EngagementsPage = lazy(() =>\n import('./pages/EngagementsPage').then((m) => ({ default: m.EngagementsPage }))\n);\nconst EngagementDetailPage = lazy(() =>\n import('./pages/EngagementDetailPage').then((m) => ({ default: m.EngagementDetailPage }))\n);\nconst MattersPage = lazy(() =>\n import('./pages/MattersPage').then((m) => ({ default: m.MattersPage }))\n);\nconst TimePage = lazy(() => import('./pages/TimePage').then((m) => ({ default: m.TimePage })));\nconst InvoicesPage = lazy(() =>\n import('./pages/InvoicesPage').then((m) => ({ default: m.InvoicesPage }))\n);\nconst TrustPage = lazy(() => import('./pages/TrustPage').then((m) => ({ default: m.TrustPage })));\nconst CompliancePage = lazy(() =>\n import('./pages/CompliancePage').then((m) => ({ default: m.CompliancePage }))\n);\nconst ConflictsPage = lazy(() =>\n import('./pages/ConflictsPage').then((m) => ({ default: m.ConflictsPage }))\n);\nconst DocumentsPage = lazy(() =>\n import('./pages/DocumentsPage').then((m) => ({ default: m.DocumentsPage }))\n);\nconst PracticeAreasPage = lazy(() =>\n import('./pages/PracticeAreasPage').then((m) => ({ default: m.PracticeAreasPage }))\n);\nconst AnalyticsPage = lazy(() =>\n import('./pages/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst SignaturesPage = lazy(() =>\n import('./pages/SignaturesPage').then((m) => ({ default: m.SignaturesPage }))\n);\nconst MySignaturesPage = lazy(() =>\n import('./pages/MySignaturesPage').then((m) => ({ default: m.MySignaturesPage }))\n);\nconst ClientPortalAccessPage = lazy(() =>\n import('./pages/ClientPortalAccessPage').then((m) => ({ default: m.ClientPortalAccessPage }))\n);\nconst MyPortalPage = lazy(() =>\n import('./pages/MyPortalPage').then((m) => ({ default: m.MyPortalPage }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-accent\" />\n </div>\n );\n}\n\nfunction PageViewTracker() {\n usePageViewAnalytics();\n return null;\n}\n\nfunction Gate({ pageId, children }: { pageId: string; children: ReactNode }) {\n return (\n <FeatureFlaggedPage pageId={pageId}>\n <Suspense fallback={<PageLoader />}>{children}</Suspense>\n </FeatureFlaggedPage>\n );\n}\n\nexport function ProServiceWorldRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <PageViewTracker />\n <Routes>\n <Route\n index\n element={\n <Gate pageId=\"dashboard\">\n <DashboardPage />\n </Gate>\n }\n />\n <Route\n path=\"clients\"\n element={\n <Gate pageId=\"clients\">\n <ClientsPage />\n </Gate>\n }\n />\n <Route\n path=\"clients/:id\"\n element={\n <Gate pageId=\"client-detail\">\n <ClientDetailPage />\n </Gate>\n }\n />\n <Route\n path=\"engagements\"\n element={\n <Gate pageId=\"engagements\">\n <EngagementsPage />\n </Gate>\n }\n />\n <Route\n path=\"engagements/:id\"\n element={\n <Gate pageId=\"engagement-detail\">\n <EngagementDetailPage />\n </Gate>\n }\n />\n <Route\n path=\"matters\"\n element={\n <Gate pageId=\"matters\">\n <MattersPage />\n </Gate>\n }\n />\n <Route\n path=\"time\"\n element={\n <Gate pageId=\"time\">\n <TimePage />\n </Gate>\n }\n />\n <Route\n path=\"invoices\"\n element={\n <Gate pageId=\"invoices\">\n <InvoicesPage />\n </Gate>\n }\n />\n <Route\n path=\"trust\"\n element={\n <Gate pageId=\"trust\">\n <TrustPage />\n </Gate>\n }\n />\n <Route\n path=\"compliance\"\n element={\n <Gate pageId=\"compliance\">\n <CompliancePage />\n </Gate>\n }\n />\n <Route\n path=\"conflicts\"\n element={\n <Gate pageId=\"conflicts\">\n <ConflictsPage />\n </Gate>\n }\n />\n <Route\n path=\"documents\"\n element={\n <Gate pageId=\"documents\">\n <DocumentsPage />\n </Gate>\n }\n />\n <Route\n path=\"practice-areas\"\n element={\n <Gate pageId=\"practice-areas\">\n <PracticeAreasPage />\n </Gate>\n }\n />\n <Route\n path=\"analytics\"\n element={\n <Gate pageId=\"analytics\">\n <AnalyticsPage />\n </Gate>\n }\n />\n <Route\n path=\"signatures\"\n element={\n <Gate pageId=\"signatures\">\n <SignaturesPage />\n </Gate>\n }\n />\n <Route\n path=\"my-signatures\"\n element={\n <Gate pageId=\"my-signatures\">\n <MySignaturesPage />\n </Gate>\n }\n />\n <Route\n path=\"client-portal-access\"\n element={\n <Gate pageId=\"client-portal-access\">\n <ClientPortalAccessPage />\n </Gate>\n }\n />\n <Route\n path=\"portal\"\n element={\n <Gate pageId=\"portal\">\n <MyPortalPage />\n </Gate>\n }\n />\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/components/ui.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAS3C,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAIX,CAAC;AAE9C,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAMxD,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,iBAAgB,KAAG,MAW9E,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MACgB,CAAC;AACzE,eAAO,MAAM,iBAAiB,GAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MAAiC,CAAC;AAKnG,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../src/proserviceworld/components/ui.tsx"],"names":[],"mappings":"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"}
|
|
@@ -68,7 +68,13 @@ var u = (e) => (e ?? "").toLowerCase().replace(/_/g, " ").replace(/\b\w/g, (e) =
|
|
|
68
68
|
CLEAR: "success",
|
|
69
69
|
POTENTIAL_CONFLICT: "warning",
|
|
70
70
|
CONFLICT: "danger",
|
|
71
|
-
COMPLETED: "success"
|
|
71
|
+
COMPLETED: "success",
|
|
72
|
+
VIEWED: "info",
|
|
73
|
+
PARTIALLY_SIGNED: "accent",
|
|
74
|
+
SIGNED: "success",
|
|
75
|
+
DECLINED: "danger",
|
|
76
|
+
EXPIRED: "neutral",
|
|
77
|
+
REVOKED: "neutral"
|
|
72
78
|
}, _ = ({ status: t, className: n }) => /* @__PURE__ */ c("span", {
|
|
73
79
|
className: e("inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium whitespace-nowrap", h[g[t] ?? "neutral"], n),
|
|
74
80
|
children: [/* @__PURE__ */ s("span", { className: "h-1.5 w-1.5 rounded-full bg-current opacity-70" }), u(t)]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui.js","names":[],"sources":["../../../src/proserviceworld/components/ui.tsx"],"sourcesContent":["/**\n * ProServiceWorld shared UI kit.\n *\n * Self-contained, token-driven primitives (no raw colors) shared by every page:\n * page header, metric cards, section cards, a mobile-friendly modal, token-styled\n * native form controls, status pills, inline banners, and empty/loading/error\n * states. Actions reuse the fe-libs Button (brand variants); everything else is\n * built from semantic tokens so theming works across light/dark/any theme.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { useEffect } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { AlertCircle, CheckCircle2, Info, Loader2, X } from 'lucide-react';\nimport { cn } from '../utils/cn';\n\n// ---------------------------------------------------------------------------\n// Formatters\n// ---------------------------------------------------------------------------\nexport const humanize = (v: string | null | undefined): string =>\n (v ?? '')\n .toLowerCase()\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n\nexport const fmtDate = (iso: string | null | undefined): string => {\n if (!iso) return '—';\n const d = new Date(iso);\n return Number.isNaN(d.getTime())\n ? '—'\n : d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n};\n\nexport const fmtMoney = (amount: number | null | undefined, currency = 'USD'): string => {\n const n = amount ?? 0;\n try {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n }).format(n);\n } catch {\n return `${currency} ${n.toLocaleString()}`;\n }\n};\n\nexport const fmtHours = (h: number | null | undefined): string =>\n `${(h ?? 0).toLocaleString(undefined, { maximumFractionDigits: 1 })}h`;\nexport const fmtMinutesAsHours = (m: number | null | undefined): string => fmtHours((m ?? 0) / 60);\n\n// ---------------------------------------------------------------------------\n// Status tone mapping\n// ---------------------------------------------------------------------------\nexport type Tone = 'neutral' | 'success' | 'warning' | 'danger' | 'info' | 'accent';\n\nconst TONE_CLASS: Record<Tone, string> = {\n neutral: 'bg-bg-sunken text-text-secondary',\n success: 'bg-status-success-bg-subtle text-status-success-text',\n warning: 'bg-status-warning-bg-subtle text-status-warning-text',\n danger: 'bg-status-error-bg-subtle text-status-error-text',\n info: 'bg-bg-sunken text-text-link',\n accent: 'bg-bg-sunken text-accent',\n};\n\nconst STATUS_TONE: Record<string, Tone> = {\n // clients / generic\n ACTIVE: 'success',\n PROSPECT: 'info',\n INACTIVE: 'neutral',\n ARCHIVED: 'neutral',\n // engagements\n PROPOSAL: 'info',\n ACCEPTED: 'accent',\n IN_PROGRESS: 'accent',\n REVIEW: 'warning',\n DELIVERED: 'success',\n INVOICED: 'success',\n CLOSED: 'neutral',\n CANCELLED: 'danger',\n // matters\n OPEN: 'accent',\n ON_HOLD: 'warning',\n // priority\n LOW: 'neutral',\n MEDIUM: 'info',\n HIGH: 'warning',\n CRITICAL: 'danger',\n // deliverable / doc\n DRAFT: 'neutral',\n INTERNAL_REVIEW: 'info',\n CLIENT_REVIEW: 'warning',\n REJECTED: 'danger',\n FINAL: 'success',\n // time\n SUBMITTED: 'info',\n APPROVED: 'success',\n BILLED: 'accent',\n // invoice\n SENT: 'info',\n PAID: 'success',\n OVERDUE: 'danger',\n // compliance / conflict\n PENDING: 'warning',\n IN_REVIEW: 'info',\n PASSED: 'success',\n FAILED: 'danger',\n WAIVED: 'neutral',\n CLEAR: 'success',\n POTENTIAL_CONFLICT: 'warning',\n CONFLICT: 'danger',\n // milestone\n COMPLETED: 'success',\n};\n\nexport const StatusPill: FC<{ status: string; className?: string }> = ({ status, className }) => (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium whitespace-nowrap',\n TONE_CLASS[STATUS_TONE[status] ?? 'neutral'],\n className\n )}\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-current opacity-70\" />\n {humanize(status)}\n </span>\n);\n\n// ---------------------------------------------------------------------------\n// Page header\n// ---------------------------------------------------------------------------\nexport const PageHeader: FC<{\n title: string;\n subtitle?: string;\n actions?: ReactNode;\n icon?: ReactNode;\n}> = ({ title, subtitle, actions, icon }) => (\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex items-start gap-3.5\">\n {icon ? (\n <div className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-bg-sunken text-accent\">\n {icon}\n </div>\n ) : null}\n <div>\n <h1 className=\"text-2xl font-bold tracking-tight text-text-primary sm:text-3xl\">{title}</h1>\n {subtitle ? (\n <p className=\"mt-1.5 max-w-2xl text-sm leading-relaxed text-text-secondary\">{subtitle}</p>\n ) : null}\n </div>\n </div>\n {actions ? <div className=\"flex flex-wrap items-center gap-2\">{actions}</div> : null}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Metric card\n// ---------------------------------------------------------------------------\nexport const MetricCard: FC<{\n label: string;\n value: ReactNode;\n hint?: string;\n icon?: ReactNode;\n tone?: Tone;\n}> = ({ label, value, hint, icon, tone = 'neutral' }) => (\n <div className=\"vc-lift-on-hover rounded-2xl border border-border-seam bg-bg-surface p-5 shadow-sm\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium uppercase tracking-wider text-text-tertiary\">\n {label}\n </span>\n {icon ? (\n <span\n className={cn('flex h-9 w-9 items-center justify-center rounded-full', TONE_CLASS[tone])}\n >\n {icon}\n </span>\n ) : null}\n </div>\n <div className=\"mt-3 text-2xl font-semibold tracking-tight text-text-primary sm:text-3xl\">\n {value}\n </div>\n {hint ? <div className=\"mt-1 text-xs text-text-tertiary\">{hint}</div> : null}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Section card\n// ---------------------------------------------------------------------------\nexport const SectionCard: FC<{\n title?: string;\n description?: string;\n action?: ReactNode;\n children: ReactNode;\n className?: string;\n}> = ({ title, description, action, children, className }) => (\n <section\n className={cn('rounded-2xl border border-border-seam bg-bg-surface shadow-sm', className)}\n >\n {(title || action) && (\n <header className=\"flex items-center justify-between gap-3 border-b border-border-seam px-5 py-3.5\">\n <div>\n {title ? <h2 className=\"text-sm font-semibold text-text-primary\">{title}</h2> : null}\n {description ? <p className=\"mt-0.5 text-xs text-text-tertiary\">{description}</p> : null}\n </div>\n {action}\n </header>\n )}\n <div className=\"p-5\">{children}</div>\n </section>\n);\n\n// ---------------------------------------------------------------------------\n// Form controls (token-styled native elements — reliable inside modals)\n// ---------------------------------------------------------------------------\nconst controlClass =\n 'w-full rounded-lg border border-border-seam bg-bg-canvas px-3 py-2 text-sm text-text-primary placeholder:text-text-tertiary focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent/30 disabled:opacity-50';\n\nexport const Field: FC<{\n label: string;\n required?: boolean;\n hint?: string;\n children: ReactNode;\n className?: string;\n}> = ({ label, required, hint, children, className }) => (\n <label className={cn('block', className)}>\n <span className=\"mb-1 block text-xs font-medium text-text-secondary\">\n {label}\n {required ? <span className=\"text-status-error-text\"> *</span> : null}\n </span>\n {children}\n {hint ? <span className=\"mt-1 block text-xs text-text-tertiary\">{hint}</span> : null}\n </label>\n);\n\nexport const TextInput: FC<React.InputHTMLAttributes<HTMLInputElement>> = ({\n className,\n ...props\n}) => <input className={cn(controlClass, className)} {...props} />;\nexport const TextArea: FC<React.TextareaHTMLAttributes<HTMLTextAreaElement>> = ({\n className,\n ...props\n}) => <textarea className={cn(controlClass, 'min-h-[80px] resize-y', className)} {...props} />;\nexport const NativeSelect: FC<React.SelectHTMLAttributes<HTMLSelectElement>> = ({\n className,\n children,\n ...props\n}) => (\n <select className={cn(controlClass, 'appearance-none pr-8')} {...props}>\n {children}\n </select>\n);\n\n/** Turn an enum-value list into <option>s with humanized labels. */\nexport const enumOptions = (values: readonly string[]): ReactNode =>\n values.map((v) => (\n <option key={v} value={v}>\n {humanize(v)}\n </option>\n ));\n\n// ---------------------------------------------------------------------------\n// Inline banner\n// ---------------------------------------------------------------------------\nexport const Banner: FC<{\n tone?: 'success' | 'danger' | 'info';\n children: ReactNode;\n onClose?: () => void;\n}> = ({ tone = 'info', children, onClose }) => {\n const Icon = tone === 'success' ? CheckCircle2 : tone === 'danger' ? AlertCircle : Info;\n const toneClass =\n tone === 'success'\n ? TONE_CLASS.success\n : tone === 'danger'\n ? TONE_CLASS.danger\n : 'bg-bg-sunken text-text-secondary';\n return (\n <div className={cn('flex items-start gap-2 rounded-lg px-3 py-2 text-sm', toneClass)}>\n <Icon className=\"mt-0.5 h-4 w-4 shrink-0\" />\n <div className=\"flex-1\">{children}</div>\n {onClose ? (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"opacity-70 hover:opacity-100\"\n aria-label=\"Dismiss\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n ) : null}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Modal (centered on desktop, full-height sheet on mobile)\n// ---------------------------------------------------------------------------\nexport const Modal: FC<{\n open: boolean;\n onClose: () => void;\n title: string;\n children: ReactNode;\n footer?: ReactNode;\n wide?: boolean;\n}> = ({ open, onClose, title, children, footer, wide }) => {\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', onKey);\n document.body.style.overflow = 'hidden';\n return () => {\n document.removeEventListener('keydown', onKey);\n document.body.style.overflow = '';\n };\n }, [open, onClose]);\n\n if (!open) return null;\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-end justify-center sm:items-center\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title}\n >\n <div className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\" onClick={onClose} />\n <div\n className={cn(\n 'relative flex max-h-[92vh] w-full flex-col overflow-hidden rounded-t-2xl border border-border-seam bg-bg-surface shadow-xl sm:max-h-[88vh] sm:rounded-2xl',\n wide ? 'sm:max-w-3xl' : 'sm:max-w-lg'\n )}\n >\n <header className=\"flex items-center justify-between border-b border-border-seam px-4 py-3\">\n <h2 className=\"text-base font-semibold text-text-primary\">{title}</h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-text-tertiary hover:bg-bg-sunken hover:text-text-primary\"\n aria-label=\"Close\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </header>\n <div className=\"flex-1 overflow-y-auto px-4 py-4\">{children}</div>\n {footer ? (\n <footer className=\"flex items-center justify-end gap-2 border-t border-border-seam px-4 py-3\">\n {footer}\n </footer>\n ) : null}\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// States\n// ---------------------------------------------------------------------------\nexport const LoadingBlock: FC<{ label?: string }> = ({ label = 'Loading…' }) => (\n <div className=\"flex min-h-[220px] flex-col items-center justify-center gap-3 text-text-tertiary\">\n <Loader2 className=\"h-7 w-7 animate-spin text-accent\" />\n <span className=\"text-sm\">{label}</span>\n </div>\n);\n\nexport const ErrorState: FC<{ error: unknown; onRetry?: () => void }> = ({ error, onRetry }) => (\n <div className=\"flex min-h-[220px] flex-col items-center justify-center gap-3 text-center\">\n <AlertCircle className=\"h-8 w-8 text-status-error-text\" />\n <p className=\"max-w-md text-sm text-text-secondary\">\n {error instanceof Error ? error.message : 'Something went wrong.'}\n </p>\n {onRetry ? (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n Try again\n </Button>\n ) : null}\n </div>\n);\n\nexport const Empty: FC<{\n title: string;\n description?: string;\n icon?: ReactNode;\n action?: ReactNode;\n}> = ({ title, description, icon, action }) => (\n <div className=\"flex min-h-[240px] flex-col items-center justify-center gap-4 rounded-2xl border border-dashed border-border-seam bg-bg-surface/50 px-6 py-12 text-center\">\n {icon ? (\n <div className=\"flex h-14 w-14 items-center justify-center rounded-2xl bg-bg-sunken text-text-tertiary\">\n {icon}\n </div>\n ) : null}\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{title}</p>\n {description ? (\n <p className=\"mt-1 max-w-sm text-sm text-text-tertiary\">{description}</p>\n ) : null}\n </div>\n {action}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Simple responsive table wrapper (scrolls horizontally on small screens)\n// ---------------------------------------------------------------------------\nexport const TableWrap: FC<{ children: ReactNode }> = ({ children }) => (\n <div className=\"overflow-x-auto rounded-xl border border-border-seam\">\n <table className=\"w-full min-w-[560px] text-left text-sm\">{children}</table>\n </div>\n);\nexport const Th: FC<{ children?: ReactNode; className?: string }> = ({ children, className }) => (\n <th\n className={cn(\n 'bg-bg-sunken px-4 py-2.5 text-xs font-semibold uppercase tracking-wide text-text-tertiary',\n className\n )}\n >\n {children}\n </th>\n);\nexport const Td: FC<{ children?: ReactNode; className?: string }> = ({ children, className }) => (\n <td className={cn('border-t border-border-seam px-4 py-3 text-text-secondary', className)}>\n {children}\n </td>\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ui.js","names":[],"sources":["../../../src/proserviceworld/components/ui.tsx"],"sourcesContent":["/**\n * ProServiceWorld shared UI kit.\n *\n * Self-contained, token-driven primitives (no raw colors) shared by every page:\n * page header, metric cards, section cards, a mobile-friendly modal, token-styled\n * native form controls, status pills, inline banners, and empty/loading/error\n * states. Actions reuse the fe-libs Button (brand variants); everything else is\n * built from semantic tokens so theming works across light/dark/any theme.\n */\n\nimport type { FC, ReactNode } from 'react';\nimport { useEffect } from 'react';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { AlertCircle, CheckCircle2, Info, Loader2, X } from 'lucide-react';\nimport { cn } from '../utils/cn';\n\n// ---------------------------------------------------------------------------\n// Formatters\n// ---------------------------------------------------------------------------\nexport const humanize = (v: string | null | undefined): string =>\n (v ?? '')\n .toLowerCase()\n .replace(/_/g, ' ')\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n\nexport const fmtDate = (iso: string | null | undefined): string => {\n if (!iso) return '—';\n const d = new Date(iso);\n return Number.isNaN(d.getTime())\n ? '—'\n : d.toLocaleDateString(undefined, { year: 'numeric', month: 'short', day: 'numeric' });\n};\n\nexport const fmtMoney = (amount: number | null | undefined, currency = 'USD'): string => {\n const n = amount ?? 0;\n try {\n return new Intl.NumberFormat(undefined, {\n style: 'currency',\n currency,\n maximumFractionDigits: 0,\n }).format(n);\n } catch {\n return `${currency} ${n.toLocaleString()}`;\n }\n};\n\nexport const fmtHours = (h: number | null | undefined): string =>\n `${(h ?? 0).toLocaleString(undefined, { maximumFractionDigits: 1 })}h`;\nexport const fmtMinutesAsHours = (m: number | null | undefined): string => fmtHours((m ?? 0) / 60);\n\n// ---------------------------------------------------------------------------\n// Status tone mapping\n// ---------------------------------------------------------------------------\nexport type Tone = 'neutral' | 'success' | 'warning' | 'danger' | 'info' | 'accent';\n\nconst TONE_CLASS: Record<Tone, string> = {\n neutral: 'bg-bg-sunken text-text-secondary',\n success: 'bg-status-success-bg-subtle text-status-success-text',\n warning: 'bg-status-warning-bg-subtle text-status-warning-text',\n danger: 'bg-status-error-bg-subtle text-status-error-text',\n info: 'bg-bg-sunken text-text-link',\n accent: 'bg-bg-sunken text-accent',\n};\n\nconst STATUS_TONE: Record<string, Tone> = {\n // clients / generic\n ACTIVE: 'success',\n PROSPECT: 'info',\n INACTIVE: 'neutral',\n ARCHIVED: 'neutral',\n // engagements\n PROPOSAL: 'info',\n ACCEPTED: 'accent',\n IN_PROGRESS: 'accent',\n REVIEW: 'warning',\n DELIVERED: 'success',\n INVOICED: 'success',\n CLOSED: 'neutral',\n CANCELLED: 'danger',\n // matters\n OPEN: 'accent',\n ON_HOLD: 'warning',\n // priority\n LOW: 'neutral',\n MEDIUM: 'info',\n HIGH: 'warning',\n CRITICAL: 'danger',\n // deliverable / doc\n DRAFT: 'neutral',\n INTERNAL_REVIEW: 'info',\n CLIENT_REVIEW: 'warning',\n REJECTED: 'danger',\n FINAL: 'success',\n // time\n SUBMITTED: 'info',\n APPROVED: 'success',\n BILLED: 'accent',\n // invoice\n SENT: 'info',\n PAID: 'success',\n OVERDUE: 'danger',\n // compliance / conflict\n PENDING: 'warning',\n IN_REVIEW: 'info',\n PASSED: 'success',\n FAILED: 'danger',\n WAIVED: 'neutral',\n CLEAR: 'success',\n POTENTIAL_CONFLICT: 'warning',\n CONFLICT: 'danger',\n // milestone\n COMPLETED: 'success',\n // e-signatures (BOFF-4212)\n VIEWED: 'info',\n PARTIALLY_SIGNED: 'accent',\n SIGNED: 'success',\n DECLINED: 'danger',\n EXPIRED: 'neutral',\n // client portal (BOFF-4283)\n REVOKED: 'neutral',\n};\n\nexport const StatusPill: FC<{ status: string; className?: string }> = ({ status, className }) => (\n <span\n className={cn(\n 'inline-flex items-center gap-1.5 rounded-full px-2.5 py-0.5 text-xs font-medium whitespace-nowrap',\n TONE_CLASS[STATUS_TONE[status] ?? 'neutral'],\n className\n )}\n >\n <span className=\"h-1.5 w-1.5 rounded-full bg-current opacity-70\" />\n {humanize(status)}\n </span>\n);\n\n// ---------------------------------------------------------------------------\n// Page header\n// ---------------------------------------------------------------------------\nexport const PageHeader: FC<{\n title: string;\n subtitle?: string;\n actions?: ReactNode;\n icon?: ReactNode;\n}> = ({ title, subtitle, actions, icon }) => (\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"flex items-start gap-3.5\">\n {icon ? (\n <div className=\"flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-bg-sunken text-accent\">\n {icon}\n </div>\n ) : null}\n <div>\n <h1 className=\"text-2xl font-bold tracking-tight text-text-primary sm:text-3xl\">{title}</h1>\n {subtitle ? (\n <p className=\"mt-1.5 max-w-2xl text-sm leading-relaxed text-text-secondary\">{subtitle}</p>\n ) : null}\n </div>\n </div>\n {actions ? <div className=\"flex flex-wrap items-center gap-2\">{actions}</div> : null}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Metric card\n// ---------------------------------------------------------------------------\nexport const MetricCard: FC<{\n label: string;\n value: ReactNode;\n hint?: string;\n icon?: ReactNode;\n tone?: Tone;\n}> = ({ label, value, hint, icon, tone = 'neutral' }) => (\n <div className=\"vc-lift-on-hover rounded-2xl border border-border-seam bg-bg-surface p-5 shadow-sm\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-xs font-medium uppercase tracking-wider text-text-tertiary\">\n {label}\n </span>\n {icon ? (\n <span\n className={cn('flex h-9 w-9 items-center justify-center rounded-full', TONE_CLASS[tone])}\n >\n {icon}\n </span>\n ) : null}\n </div>\n <div className=\"mt-3 text-2xl font-semibold tracking-tight text-text-primary sm:text-3xl\">\n {value}\n </div>\n {hint ? <div className=\"mt-1 text-xs text-text-tertiary\">{hint}</div> : null}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Section card\n// ---------------------------------------------------------------------------\nexport const SectionCard: FC<{\n title?: string;\n description?: string;\n action?: ReactNode;\n children: ReactNode;\n className?: string;\n}> = ({ title, description, action, children, className }) => (\n <section\n className={cn('rounded-2xl border border-border-seam bg-bg-surface shadow-sm', className)}\n >\n {(title || action) && (\n <header className=\"flex items-center justify-between gap-3 border-b border-border-seam px-5 py-3.5\">\n <div>\n {title ? <h2 className=\"text-sm font-semibold text-text-primary\">{title}</h2> : null}\n {description ? <p className=\"mt-0.5 text-xs text-text-tertiary\">{description}</p> : null}\n </div>\n {action}\n </header>\n )}\n <div className=\"p-5\">{children}</div>\n </section>\n);\n\n// ---------------------------------------------------------------------------\n// Form controls (token-styled native elements — reliable inside modals)\n// ---------------------------------------------------------------------------\nconst controlClass =\n 'w-full rounded-lg border border-border-seam bg-bg-canvas px-3 py-2 text-sm text-text-primary placeholder:text-text-tertiary focus:border-accent focus:outline-none focus:ring-2 focus:ring-accent/30 disabled:opacity-50';\n\nexport const Field: FC<{\n label: string;\n required?: boolean;\n hint?: string;\n children: ReactNode;\n className?: string;\n}> = ({ label, required, hint, children, className }) => (\n <label className={cn('block', className)}>\n <span className=\"mb-1 block text-xs font-medium text-text-secondary\">\n {label}\n {required ? <span className=\"text-status-error-text\"> *</span> : null}\n </span>\n {children}\n {hint ? <span className=\"mt-1 block text-xs text-text-tertiary\">{hint}</span> : null}\n </label>\n);\n\nexport const TextInput: FC<React.InputHTMLAttributes<HTMLInputElement>> = ({\n className,\n ...props\n}) => <input className={cn(controlClass, className)} {...props} />;\nexport const TextArea: FC<React.TextareaHTMLAttributes<HTMLTextAreaElement>> = ({\n className,\n ...props\n}) => <textarea className={cn(controlClass, 'min-h-[80px] resize-y', className)} {...props} />;\nexport const NativeSelect: FC<React.SelectHTMLAttributes<HTMLSelectElement>> = ({\n className,\n children,\n ...props\n}) => (\n <select className={cn(controlClass, 'appearance-none pr-8')} {...props}>\n {children}\n </select>\n);\n\n/** Turn an enum-value list into <option>s with humanized labels. */\nexport const enumOptions = (values: readonly string[]): ReactNode =>\n values.map((v) => (\n <option key={v} value={v}>\n {humanize(v)}\n </option>\n ));\n\n// ---------------------------------------------------------------------------\n// Inline banner\n// ---------------------------------------------------------------------------\nexport const Banner: FC<{\n tone?: 'success' | 'danger' | 'info';\n children: ReactNode;\n onClose?: () => void;\n}> = ({ tone = 'info', children, onClose }) => {\n const Icon = tone === 'success' ? CheckCircle2 : tone === 'danger' ? AlertCircle : Info;\n const toneClass =\n tone === 'success'\n ? TONE_CLASS.success\n : tone === 'danger'\n ? TONE_CLASS.danger\n : 'bg-bg-sunken text-text-secondary';\n return (\n <div className={cn('flex items-start gap-2 rounded-lg px-3 py-2 text-sm', toneClass)}>\n <Icon className=\"mt-0.5 h-4 w-4 shrink-0\" />\n <div className=\"flex-1\">{children}</div>\n {onClose ? (\n <button\n type=\"button\"\n onClick={onClose}\n className=\"opacity-70 hover:opacity-100\"\n aria-label=\"Dismiss\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n ) : null}\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Modal (centered on desktop, full-height sheet on mobile)\n// ---------------------------------------------------------------------------\nexport const Modal: FC<{\n open: boolean;\n onClose: () => void;\n title: string;\n children: ReactNode;\n footer?: ReactNode;\n wide?: boolean;\n}> = ({ open, onClose, title, children, footer, wide }) => {\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n document.addEventListener('keydown', onKey);\n document.body.style.overflow = 'hidden';\n return () => {\n document.removeEventListener('keydown', onKey);\n document.body.style.overflow = '';\n };\n }, [open, onClose]);\n\n if (!open) return null;\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-end justify-center sm:items-center\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title}\n >\n <div className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\" onClick={onClose} />\n <div\n className={cn(\n 'relative flex max-h-[92vh] w-full flex-col overflow-hidden rounded-t-2xl border border-border-seam bg-bg-surface shadow-xl sm:max-h-[88vh] sm:rounded-2xl',\n wide ? 'sm:max-w-3xl' : 'sm:max-w-lg'\n )}\n >\n <header className=\"flex items-center justify-between border-b border-border-seam px-4 py-3\">\n <h2 className=\"text-base font-semibold text-text-primary\">{title}</h2>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-lg p-1 text-text-tertiary hover:bg-bg-sunken hover:text-text-primary\"\n aria-label=\"Close\"\n >\n <X className=\"h-5 w-5\" />\n </button>\n </header>\n <div className=\"flex-1 overflow-y-auto px-4 py-4\">{children}</div>\n {footer ? (\n <footer className=\"flex items-center justify-end gap-2 border-t border-border-seam px-4 py-3\">\n {footer}\n </footer>\n ) : null}\n </div>\n </div>\n );\n};\n\n// ---------------------------------------------------------------------------\n// States\n// ---------------------------------------------------------------------------\nexport const LoadingBlock: FC<{ label?: string }> = ({ label = 'Loading…' }) => (\n <div className=\"flex min-h-[220px] flex-col items-center justify-center gap-3 text-text-tertiary\">\n <Loader2 className=\"h-7 w-7 animate-spin text-accent\" />\n <span className=\"text-sm\">{label}</span>\n </div>\n);\n\nexport const ErrorState: FC<{ error: unknown; onRetry?: () => void }> = ({ error, onRetry }) => (\n <div className=\"flex min-h-[220px] flex-col items-center justify-center gap-3 text-center\">\n <AlertCircle className=\"h-8 w-8 text-status-error-text\" />\n <p className=\"max-w-md text-sm text-text-secondary\">\n {error instanceof Error ? error.message : 'Something went wrong.'}\n </p>\n {onRetry ? (\n <Button variant=\"outline\" size=\"sm\" onClick={onRetry}>\n Try again\n </Button>\n ) : null}\n </div>\n);\n\nexport const Empty: FC<{\n title: string;\n description?: string;\n icon?: ReactNode;\n action?: ReactNode;\n}> = ({ title, description, icon, action }) => (\n <div className=\"flex min-h-[240px] flex-col items-center justify-center gap-4 rounded-2xl border border-dashed border-border-seam bg-bg-surface/50 px-6 py-12 text-center\">\n {icon ? (\n <div className=\"flex h-14 w-14 items-center justify-center rounded-2xl bg-bg-sunken text-text-tertiary\">\n {icon}\n </div>\n ) : null}\n <div>\n <p className=\"text-sm font-medium text-text-primary\">{title}</p>\n {description ? (\n <p className=\"mt-1 max-w-sm text-sm text-text-tertiary\">{description}</p>\n ) : null}\n </div>\n {action}\n </div>\n);\n\n// ---------------------------------------------------------------------------\n// Simple responsive table wrapper (scrolls horizontally on small screens)\n// ---------------------------------------------------------------------------\nexport const TableWrap: FC<{ children: ReactNode }> = ({ children }) => (\n <div className=\"overflow-x-auto rounded-xl border border-border-seam\">\n <table className=\"w-full min-w-[560px] text-left text-sm\">{children}</table>\n </div>\n);\nexport const Th: FC<{ children?: ReactNode; className?: string }> = ({ children, className }) => (\n <th\n className={cn(\n 'bg-bg-sunken px-4 py-2.5 text-xs font-semibold uppercase tracking-wide text-text-tertiary',\n className\n )}\n >\n {children}\n </th>\n);\nexport const Td: FC<{ children?: ReactNode; className?: string }> = ({ children, className }) => (\n <td className={cn('border-t border-border-seam px-4 py-3 text-text-secondary', className)}>\n {children}\n </td>\n);\n"],"mappings":";;;;;;AAmBA,IAAa,KAAY,OACtB,KAAK,GAAA,CACH,YAAY,CAAC,CACb,QAAQ,MAAM,GAAG,CAAC,CAClB,QAAQ,UAAU,MAAM,EAAE,YAAY,CAAC,GAE/B,KAAW,MAA2C;CACjE,IAAI,CAAC,GAAK,OAAO;CACjB,IAAM,IAAI,IAAI,KAAK,CAAG;CACtB,OAAO,OAAO,MAAM,EAAE,QAAQ,CAAC,IAC3B,MACA,EAAE,mBAAmB,KAAA,GAAW;EAAE,MAAM;EAAW,OAAO;EAAS,KAAK;CAAU,CAAC;AACzF,GAEa,KAAY,GAAmC,IAAW,UAAkB;CACvF,IAAM,IAAI,KAAU;CACpB,IAAI;EACF,OAAO,IAAI,KAAK,aAAa,KAAA,GAAW;GACtC,OAAO;GACP;GACA,uBAAuB;EACzB,CAAC,CAAC,CAAC,OAAO,CAAC;CACb,QAAQ;EACN,OAAO,GAAG,EAAS,GAAG,EAAE,eAAe;CACzC;AACF,GAEa,KAAY,MACvB,IAAI,KAAK,EAAA,CAAG,eAAe,KAAA,GAAW,EAAE,uBAAuB,EAAE,CAAC,EAAE,IACzD,KAAqB,MAAyC,GAAU,KAAK,KAAK,EAAE,GAO3F,IAAmC;CACvC,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;CACR,MAAM;CACN,QAAQ;AACV,GAEM,IAAoC;CAExC,QAAQ;CACR,UAAU;CACV,UAAU;CACV,UAAU;CAEV,UAAU;CACV,UAAU;CACV,aAAa;CACb,QAAQ;CACR,WAAW;CACX,UAAU;CACV,QAAQ;CACR,WAAW;CAEX,MAAM;CACN,SAAS;CAET,KAAK;CACL,QAAQ;CACR,MAAM;CACN,UAAU;CAEV,OAAO;CACP,iBAAiB;CACjB,eAAe;CACf,UAAU;CACV,OAAO;CAEP,WAAW;CACX,UAAU;CACV,QAAQ;CAER,MAAM;CACN,MAAM;CACN,SAAS;CAET,SAAS;CACT,WAAW;CACX,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,oBAAoB;CACpB,UAAU;CAEV,WAAW;CAEX,QAAQ;CACR,kBAAkB;CAClB,QAAQ;CACR,UAAU;CACV,SAAS;CAET,SAAS;AACX,GAEa,KAA0D,EAAE,WAAQ,mBAC/E,kBAAC,QAAD;CACE,WAAW,EACT,qGACA,EAAW,EAAY,MAAW,YAClC,CACF;WALF,CAOE,kBAAC,QAAD,EAAM,WAAU,iDAAkD,CAAA,GACjE,EAAS,CAAM,CACZ;IAMK,KAKP,EAAE,UAAO,aAAU,YAAS,cAChC,kBAAC,OAAD;CAAK,WAAU;WAAf,CACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACG,IACC,kBAAC,OAAD;GAAK,WAAU;aACZ;EACE,CAAA,IACH,MACJ,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;GAAI,WAAU;aAAmE;EAAU,CAAA,GAC1F,IACC,kBAAC,KAAD;GAAG,WAAU;aAAgE;EAAY,CAAA,IACvF,IACD,EAAA,CAAA,CACF;KACJ,IAAU,kBAAC,OAAD;EAAK,WAAU;YAAqC;CAAa,CAAA,IAAI,IAC7E;IAMM,KAMP,EAAE,UAAO,UAAO,SAAM,SAAM,UAAO,gBACvC,kBAAC,OAAD;CAAK,WAAU;WAAf;EACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,QAAD;IAAM,WAAU;cACb;GACG,CAAA,GACL,IACC,kBAAC,QAAD;IACE,WAAW,EAAG,yDAAyD,EAAW,EAAK;cAEtF;GACG,CAAA,IACJ,IACD;;EACL,kBAAC,OAAD;GAAK,WAAU;aACZ;EACE,CAAA;EACJ,IAAO,kBAAC,OAAD;GAAK,WAAU;aAAmC;EAAU,CAAA,IAAI;CACrE;IAMM,KAMP,EAAE,UAAO,gBAAa,WAAQ,aAAU,mBAC5C,kBAAC,WAAD;CACE,WAAW,EAAG,iEAAiE,CAAS;WAD1F,EAGI,KAAS,MACT,kBAAC,UAAD;EAAQ,WAAU;YAAlB,CACE,kBAAC,OAAD,EAAA,UAAA,CACG,IAAQ,kBAAC,MAAD;GAAI,WAAU;aAA2C;EAAU,CAAA,IAAI,MAC/E,IAAc,kBAAC,KAAD;GAAG,WAAU;aAAqC;EAAe,CAAA,IAAI,IACjF,EAAA,CAAA,GACJ,CACK;KAEV,kBAAC,OAAD;EAAK,WAAU;EAAO;CAAc,CAAA,CAC7B;IAML,IACJ,4NAEW,KAMP,EAAE,UAAO,aAAU,SAAM,aAAU,mBACvC,kBAAC,SAAD;CAAO,WAAW,EAAG,SAAS,CAAS;WAAvC;EACE,kBAAC,QAAD;GAAM,WAAU;aAAhB,CACG,GACA,IAAW,kBAAC,QAAD;IAAM,WAAU;cAAyB;GAAQ,CAAA,IAAI,IAC7D;;EACL;EACA,IAAO,kBAAC,QAAD;GAAM,WAAU;aAAyC;EAAW,CAAA,IAAI;CAC3E;IAGI,KAA8D,EACzE,cACA,GAAG,QACC,kBAAC,SAAD;CAAO,WAAW,EAAG,GAAc,CAAS;CAAG,GAAI;AAAQ,CAAA,GACpD,KAAmE,EAC9E,cACA,GAAG,QACC,kBAAC,YAAD;CAAU,WAAW,EAAG,GAAc,yBAAyB,CAAS;CAAG,GAAI;AAAQ,CAAA,GAChF,KAAmE,EAC9E,cACA,aACA,GAAG,QAEH,kBAAC,UAAD;CAAQ,WAAW,EAAG,GAAc,sBAAsB;CAAG,GAAI;CAC9D;AACK,CAAA,GAIG,KAAe,MAC1B,EAAO,KAAK,MACV,kBAAC,UAAD;CAAgB,OAAO;WACpB,EAAS,CAAC;AACL,GAFK,CAEL,CACT,GAKU,KAIP,EAAE,UAAO,QAAQ,aAAU,iBAAc;CAC7C,IAAM,IAAO,MAAS,YAAY,IAAe,MAAS,WAAW,IAAc;CAOnF,OACE,kBAAC,OAAD;EAAK,WAAW,EAAG,uDANnB,MAAS,YACL,EAAW,UACX,MAAS,WACP,EAAW,SACX,kCAE6E;YAAnF;GACE,kBAAC,GAAD,EAAM,WAAU,0BAA2B,CAAA;GAC3C,kBAAC,OAAD;IAAK,WAAU;IAAU;GAAc,CAAA;GACtC,IACC,kBAAC,UAAD;IACE,MAAK;IACL,SAAS;IACT,WAAU;IACV,cAAW;cAEX,kBAAC,GAAD,EAAG,WAAU,UAAW,CAAA;GAClB,CAAA,IACN;EACD;;AAET,GAKa,KAOP,EAAE,SAAM,YAAS,UAAO,aAAU,WAAQ,eAC9C,QAAgB;CACd,IAAI,CAAC,GAAM;CACX,IAAM,KAAS,MAAqB;EAClC,AAAI,EAAE,QAAQ,YAAU,EAAQ;CAClC;CAGA,OAFA,SAAS,iBAAiB,WAAW,CAAK,GAC1C,SAAS,KAAK,MAAM,WAAW,gBAClB;EAEX,AADA,SAAS,oBAAoB,WAAW,CAAK,GAC7C,SAAS,KAAK,MAAM,WAAW;CACjC;AACF,GAAG,CAAC,GAAM,CAAO,CAAC,GAEb,IAEH,kBAAC,OAAD;CACE,WAAU;CACV,MAAK;CACL,cAAW;CACX,cAAY;WAJd,CAME,kBAAC,OAAD;EAAK,WAAU;EAAgD,SAAS;CAAU,CAAA,GAClF,kBAAC,OAAD;EACE,WAAW,EACT,6JACA,IAAO,iBAAiB,aAC1B;YAJF;GAME,kBAAC,UAAD;IAAQ,WAAU;cAAlB,CACE,kBAAC,MAAD;KAAI,WAAU;eAA6C;IAAU,CAAA,GACrE,kBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,WAAU;KACV,cAAW;eAEX,kBAAC,GAAD,EAAG,WAAU,UAAW,CAAA;IAClB,CAAA,CACF;;GACR,kBAAC,OAAD;IAAK,WAAU;IAAoC;GAAc,CAAA;GAChE,IACC,kBAAC,UAAD;IAAQ,WAAU;cACf;GACK,CAAA,IACN;EACD;GACF;KAjCW,OAwCP,KAAwC,EAAE,WAAQ,iBAC7D,kBAAC,OAAD;CAAK,WAAU;WAAf,CACE,kBAAC,GAAD,EAAS,WAAU,mCAAoC,CAAA,GACvD,kBAAC,QAAD;EAAM,WAAU;YAAW;CAAY,CAAA,CACpC;IAGM,KAA4D,EAAE,UAAO,iBAChF,kBAAC,OAAD;CAAK,WAAU;WAAf;EACE,kBAAC,GAAD,EAAa,WAAU,iCAAkC,CAAA;EACzD,kBAAC,KAAD;GAAG,WAAU;aACV,aAAiB,QAAQ,EAAM,UAAU;EACzC,CAAA;EACF,IACC,kBAAC,GAAD;GAAQ,SAAQ;GAAU,MAAK;GAAK,SAAS;aAAS;EAE9C,CAAA,IACN;CACD;IAGM,KAKP,EAAE,UAAO,gBAAa,SAAM,gBAChC,kBAAC,OAAD;CAAK,WAAU;WAAf;EACG,IACC,kBAAC,OAAD;GAAK,WAAU;aACZ;EACE,CAAA,IACH;EACJ,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;GAAG,WAAU;aAAyC;EAAS,CAAA,GAC9D,IACC,kBAAC,KAAD;GAAG,WAAU;aAA4C;EAAe,CAAA,IACtE,IACD,EAAA,CAAA;EACJ;CACE;IAMM,KAA0C,EAAE,kBACvD,kBAAC,OAAD;CAAK,WAAU;WACb,kBAAC,SAAD;EAAO,WAAU;EAA0C;CAAgB,CAAA;AACxE,CAAA,GAEM,KAAwD,EAAE,aAAU,mBAC/E,kBAAC,MAAD;CACE,WAAW,EACT,6FACA,CACF;CAEC;AACC,CAAA,GAEO,KAAwD,EAAE,aAAU,mBAC/E,kBAAC,MAAD;CAAI,WAAW,EAAG,6DAA6D,CAAS;CACrF;AACC,CAAA"}
|