@alepha/ui 0.16.2 → 0.17.1
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/admin/{AdminApiKeys-CoTOTfgU.js → AdminApiKeys-CF_qOO3u.js} +20 -20
- package/dist/admin/AdminApiKeys-CF_qOO3u.js.map +1 -0
- package/dist/admin/{AdminAudits-BmsxFbDa.js → AdminAudits-BQno3hZG.js} +7 -8
- package/dist/admin/AdminAudits-BQno3hZG.js.map +1 -0
- package/dist/admin/{AdminFiles-BBB8knca.js → AdminFiles-kvuUaASF.js} +3 -5
- package/dist/admin/{AdminFiles-BBB8knca.js.map → AdminFiles-kvuUaASF.js.map} +1 -1
- package/dist/admin/AdminJobDashboard-CrPxp0W1.js +485 -0
- package/dist/admin/AdminJobDashboard-CrPxp0W1.js.map +1 -0
- package/dist/admin/AdminJobExecutions-D-b4Zt7W.js +678 -0
- package/dist/admin/AdminJobExecutions-D-b4Zt7W.js.map +1 -0
- package/dist/admin/AdminJobRegistry-CNX5cpDx.js +301 -0
- package/dist/admin/AdminJobRegistry-CNX5cpDx.js.map +1 -0
- package/dist/admin/{AdminLayout-CsjvpeD1.js → AdminLayout-e-ZP5nWw.js} +1 -1
- package/dist/admin/{AdminLayout-CsjvpeD1.js.map → AdminLayout-e-ZP5nWw.js.map} +1 -1
- package/dist/admin/{AdminNotifications-LwR6RKrx.js → AdminNotifications-DeHJFf6W.js} +3 -5
- package/dist/admin/{AdminNotifications-LwR6RKrx.js.map → AdminNotifications-DeHJFf6W.js.map} +1 -1
- package/dist/admin/{AdminParameters-B_83Vie9.js → AdminParameters-iQE8o7a7.js} +43 -36
- package/dist/admin/AdminParameters-iQE8o7a7.js.map +1 -0
- package/dist/admin/{AdminSessions-CWnPosdd.js → AdminSessions-oKJCbd7w.js} +5 -7
- package/dist/admin/AdminSessions-oKJCbd7w.js.map +1 -0
- package/dist/admin/{AdminUserAudits-nHv636E_.js → AdminUserAudits-BNCEle_E.js} +6 -8
- package/dist/admin/AdminUserAudits-BNCEle_E.js.map +1 -0
- package/dist/admin/{AdminUserCreate-CjYD3Kjc.js → AdminUserCreate-CgqeFwCt.js} +6 -7
- package/dist/admin/AdminUserCreate-CgqeFwCt.js.map +1 -0
- package/dist/admin/{AdminUserDetails-Ccq-LsZ0.js → AdminUserDetails-DDe1A1GP.js} +30 -29
- package/dist/admin/AdminUserDetails-DDe1A1GP.js.map +1 -0
- package/dist/admin/{AdminUserLayout-7s41DiF_.js → AdminUserLayout-HAlobhWf.js} +18 -16
- package/dist/admin/AdminUserLayout-HAlobhWf.js.map +1 -0
- package/dist/admin/{AdminUserSessions-Ds3ODq_d.js → AdminUserSessions-Bq1LnVLf.js} +5 -7
- package/dist/admin/AdminUserSessions-Bq1LnVLf.js.map +1 -0
- package/dist/admin/{AdminUserSettings-CGh4gROo.js → AdminUserSettings-BRsBZoxV.js} +10 -10
- package/dist/admin/AdminUserSettings-BRsBZoxV.js.map +1 -0
- package/dist/admin/{AdminUsers-CvPiBzQK.js → AdminUsers-D71kIOSn.js} +6 -8
- package/dist/admin/AdminUsers-D71kIOSn.js.map +1 -0
- package/dist/admin/index.d.ts +7 -83
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +49 -70
- package/dist/admin/index.js.map +1 -1
- package/dist/auth/{Login-DS_OqA0G.js → Login-BS_FYTy0.js} +13 -8
- package/dist/auth/Login-BS_FYTy0.js.map +1 -0
- package/dist/auth/{Profile-Di7N7HZL.js → Profile-CjDsW378.js} +16 -10
- package/dist/auth/Profile-CjDsW378.js.map +1 -0
- package/dist/auth/{Register-BRR2_gux.js → Register-C5eqzAaD.js} +21 -12
- package/dist/auth/Register-C5eqzAaD.js.map +1 -0
- package/dist/auth/{ResetPassword-oQu72lod.js → ResetPassword-XifinVao.js} +14 -8
- package/dist/auth/ResetPassword-XifinVao.js.map +1 -0
- package/dist/auth/{VerifyEmail-DC6HPZjd.js → VerifyEmail-DTgbeJOO.js} +6 -4
- package/dist/auth/VerifyEmail-DTgbeJOO.js.map +1 -0
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +15 -14
- package/dist/auth/index.js.map +1 -1
- package/dist/core/index.d.ts +37 -26
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +444 -193
- package/dist/core/index.js.map +1 -1
- package/dist/demo/DemoDataTable-lnBKWBf8.js +362 -0
- package/dist/demo/DemoDataTable-lnBKWBf8.js.map +1 -0
- package/dist/demo/{DemoHome-DpRrPlBC.js → DemoHome-CUMZsYaH.js} +6 -7
- package/dist/demo/DemoHome-CUMZsYaH.js.map +1 -0
- package/dist/demo/{DemoJsonViewer-zeucGKHV.js → DemoJsonViewer-_uokbGaW.js} +17 -19
- package/dist/demo/DemoJsonViewer-_uokbGaW.js.map +1 -0
- package/dist/demo/{DemoLayout-PhgbAAiQ.js → DemoLayout-DHVoacE6.js} +2 -4
- package/dist/demo/{DemoLayout-PhgbAAiQ.js.map → DemoLayout-DHVoacE6.js.map} +1 -1
- package/dist/demo/{DemoLogin-DSzP0Lkv.js → DemoLogin-DjJ9314c.js} +22 -17
- package/dist/demo/DemoLogin-DjJ9314c.js.map +1 -0
- package/dist/demo/{DemoRegister-DavFBsCz.js → DemoRegister-DzkJ5M83.js} +34 -25
- package/dist/demo/DemoRegister-DzkJ5M83.js.map +1 -0
- package/dist/demo/{DemoResetPassword-BS2rIAQK.js → DemoResetPassword-DWh4_BpQ.js} +27 -21
- package/dist/demo/DemoResetPassword-DWh4_BpQ.js.map +1 -0
- package/dist/demo/{DemoSidebar-zNkUmHRl.js → DemoSidebar-C1csnGhX.js} +2 -2
- package/dist/demo/{DemoSidebar-zNkUmHRl.js.map → DemoSidebar-C1csnGhX.js.map} +1 -1
- package/dist/demo/{DemoTypeForm-B9q7oT0b.js → DemoTypeForm-CWz6fJrJ.js} +2 -2
- package/dist/demo/{DemoTypeForm-B9q7oT0b.js.map → DemoTypeForm-CWz6fJrJ.js.map} +1 -1
- package/dist/demo/{DemoVerifyEmail-Bi4SdWz0.js → DemoVerifyEmail-DbU_tCj8.js} +13 -11
- package/dist/demo/DemoVerifyEmail-DbU_tCj8.js.map +1 -0
- package/dist/demo/{IconGoogle-CTeZyrek.js → IconGoogle-Ch1m3Uzl.js} +1 -1
- package/dist/demo/{IconGoogle-CTeZyrek.js.map → IconGoogle-Ch1m3Uzl.js.map} +1 -1
- package/dist/demo/{Showcase-C9btr_SJ.js → Showcase-BzoXNlCn.js} +10 -10
- package/dist/demo/Showcase-BzoXNlCn.js.map +1 -0
- package/dist/demo/index.d.ts +1 -68
- package/dist/demo/index.d.ts.map +1 -1
- package/dist/demo/index.js +11 -15
- package/dist/demo/index.js.map +1 -1
- package/dist/json/index.js +2 -2
- package/dist/json/index.js.map +1 -1
- package/package.json +9 -5
- package/src/admin/AdminRouter.ts +36 -5
- package/src/admin/components/audits/AdminAudits.tsx +5 -5
- package/src/admin/components/jobs/AdminJobDashboard.tsx +455 -0
- package/src/admin/components/jobs/AdminJobExecutions.tsx +693 -0
- package/src/admin/components/jobs/AdminJobRegistry.tsx +325 -0
- package/src/admin/components/keys/AdminApiKeys.tsx +28 -31
- package/src/admin/components/parameters/AdminParameters.tsx +3 -3
- package/src/admin/components/parameters/ParameterDetails.tsx +34 -29
- package/src/admin/components/parameters/ParameterEmptyState.tsx +5 -5
- package/src/admin/components/parameters/ParameterHistory.tsx +11 -19
- package/src/admin/components/parameters/ParameterTree.tsx +16 -18
- package/src/admin/components/sessions/AdminSessions.tsx +3 -3
- package/src/admin/components/shared/AdminResourceHeader.tsx +20 -16
- package/src/admin/components/users/AdminUserAudits.tsx +5 -5
- package/src/admin/components/users/AdminUserCreate.tsx +3 -3
- package/src/admin/components/users/AdminUserDetails.tsx +51 -53
- package/src/admin/components/users/AdminUserLayout.tsx +7 -7
- package/src/admin/components/users/AdminUserSessions.tsx +3 -3
- package/src/admin/components/users/AdminUserSettings.tsx +9 -9
- package/src/admin/components/users/AdminUsers.tsx +5 -5
- package/src/admin/components/verifications/AdminVerifications.tsx +3 -3
- package/src/admin/index.ts +0 -24
- package/src/auth/components/Login.tsx +13 -13
- package/src/auth/components/Profile.tsx +17 -26
- package/src/auth/components/Register.tsx +21 -31
- package/src/auth/components/ResetPassword.tsx +13 -22
- package/src/auth/components/VerifyEmail.tsx +5 -5
- package/src/auth/components/buttons/UserButton.tsx +14 -4
- package/src/core/components/buttons/ActionButton.tsx +9 -2
- package/src/core/components/data/ErrorViewer.tsx +15 -15
- package/src/core/components/dialogs/AlertDialog.tsx +3 -3
- package/src/core/components/dialogs/ConfirmDialog.tsx +3 -3
- package/src/core/components/dialogs/PromptDialog.tsx +3 -3
- package/src/core/components/form/Control.tsx +9 -0
- package/src/core/components/form/ControlArray.tsx +6 -7
- package/src/core/components/form/ControlObject.tsx +3 -3
- package/src/core/components/form/ControlQueryBuilder.tsx +20 -22
- package/src/core/components/form/ControlSelect.tsx +4 -0
- package/src/core/components/form/TypeForm.tsx +7 -0
- package/src/core/components/layout/Breadcrumb.tsx +6 -6
- package/src/core/components/layout/Omnibar.tsx +2 -1
- package/src/core/components/layout/Sidebar.tsx +5 -1
- package/src/core/components/table/ColumnPicker.tsx +47 -31
- package/src/core/components/table/DataTable.tsx +277 -201
- package/src/core/components/table/DataTableFilters.tsx +8 -0
- package/src/core/components/table/DataTableToolbar.tsx +98 -5
- package/src/core/components/table/FilterPicker.tsx +28 -26
- package/src/core/components/table/types.ts +52 -37
- package/src/core/components/table/useTableSelection.ts +83 -0
- package/src/core/styles.css +1 -0
- package/src/core/utils/parseInput.ts +1 -0
- package/src/demo/components/DemoHome.tsx +5 -5
- package/src/demo/components/core/DemoDataTable.tsx +209 -5
- package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
- package/src/demo/components/shared/MacWindow.tsx +7 -7
- package/src/demo/components/shared/Showcase.tsx +3 -3
- package/src/demo/index.ts +0 -11
- package/src/json/components/JsonViewer.tsx +3 -3
- package/dist/admin/AdminApiKeys-CoTOTfgU.js.map +0 -1
- package/dist/admin/AdminAudits-BmsxFbDa.js.map +0 -1
- package/dist/admin/AdminJobs-C604joTz.js +0 -698
- package/dist/admin/AdminJobs-C604joTz.js.map +0 -1
- package/dist/admin/AdminParameters-B_83Vie9.js.map +0 -1
- package/dist/admin/AdminSessions-CWnPosdd.js.map +0 -1
- package/dist/admin/AdminUserAudits-nHv636E_.js.map +0 -1
- package/dist/admin/AdminUserCreate-CjYD3Kjc.js.map +0 -1
- package/dist/admin/AdminUserDetails-Ccq-LsZ0.js.map +0 -1
- package/dist/admin/AdminUserLayout-7s41DiF_.js.map +0 -1
- package/dist/admin/AdminUserSessions-Ds3ODq_d.js.map +0 -1
- package/dist/admin/AdminUserSettings-CGh4gROo.js.map +0 -1
- package/dist/admin/AdminUsers-CvPiBzQK.js.map +0 -1
- package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
- package/dist/auth/Login-DS_OqA0G.js.map +0 -1
- package/dist/auth/Profile-Di7N7HZL.js.map +0 -1
- package/dist/auth/Register-BRR2_gux.js.map +0 -1
- package/dist/auth/ResetPassword-oQu72lod.js.map +0 -1
- package/dist/auth/VerifyEmail-DC6HPZjd.js.map +0 -1
- package/dist/demo/DemoDataTable-DCsJq8v5.js +0 -149
- package/dist/demo/DemoDataTable-DCsJq8v5.js.map +0 -1
- package/dist/demo/DemoHome-DpRrPlBC.js.map +0 -1
- package/dist/demo/DemoJsonViewer-zeucGKHV.js.map +0 -1
- package/dist/demo/DemoLogin-DSzP0Lkv.js.map +0 -1
- package/dist/demo/DemoRegister-DavFBsCz.js.map +0 -1
- package/dist/demo/DemoResetPassword-BS2rIAQK.js.map +0 -1
- package/dist/demo/DemoVerifyEmail-Bi4SdWz0.js.map +0 -1
- package/dist/demo/Showcase-C9btr_SJ.js.map +0 -1
- package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
- package/src/admin/components/jobs/AdminJobs.tsx +0 -772
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as Showcase } from "./Showcase-
|
|
1
|
+
import { t as Showcase } from "./Showcase-BzoXNlCn.js";
|
|
2
2
|
import { TypeForm } from "@alepha/ui";
|
|
3
3
|
import { t } from "alepha";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -79,4 +79,4 @@ const DemoTypeForm = () => {
|
|
|
79
79
|
|
|
80
80
|
//#endregion
|
|
81
81
|
export { DemoTypeForm as default };
|
|
82
|
-
//# sourceMappingURL=DemoTypeForm-
|
|
82
|
+
//# sourceMappingURL=DemoTypeForm-CWz6fJrJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DemoTypeForm-
|
|
1
|
+
{"version":3,"file":"DemoTypeForm-CWz6fJrJ.js","names":[],"sources":["../../src/demo/components/core/DemoTypeForm.tsx"],"sourcesContent":["import { TypeForm } from \"@alepha/ui\";\nimport { t } from \"alepha\";\nimport { useForm } from \"alepha/react/form\";\nimport Showcase from \"../shared/Showcase.tsx\";\n\nconst formSchema = t.object({\n username: t.text({ title: \"Username\", default: \"\" }),\n email: t.email({ title: \"Email\", default: \"\" }),\n age: t.integer({ title: \"Age\", minimum: 0, maximum: 120 }),\n role: t.enum([\"admin\", \"user\", \"guest\"], { title: \"Role\", default: \"user\" }),\n subscribe: t.boolean({ title: \"Subscribe\", default: false }),\n});\n\nconst showcaseSchema = t.object({\n columns: t.integer({\n title: \"Columns\",\n default: 1,\n minimum: 1,\n maximum: 4,\n $control: { slider: true },\n }),\n fill: t.boolean({\n title: \"Fill Width\",\n default: false,\n $control: { switch: true },\n }),\n skipSubmitButton: t.boolean({\n title: \"Hide Submit\",\n default: false,\n $control: { switch: true },\n }),\n});\n\nconst DemoTypeForm = () => {\n const form = useForm(\n {\n schema: formSchema,\n handler: (values) => {\n alert(JSON.stringify(values, null, 2));\n },\n },\n [],\n );\n\n return (\n <Showcase\n title=\"TypeForm\"\n schema={showcaseSchema}\n initialValues={{\n columns: 1,\n fill: false,\n skipSubmitButton: false,\n }}\n columns={1}\n >\n {(props) => (\n <TypeForm\n form={form}\n columns={props.columns}\n fill={props.fill}\n skipSubmitButton={props.skipSubmitButton}\n submitButtonProps={{ children: \"Submit\" }}\n />\n )}\n </Showcase>\n );\n};\n\nexport default DemoTypeForm;\n"],"mappings":";;;;;;;AAKA,MAAM,aAAa,EAAE,OAAO;CAC1B,UAAU,EAAE,KAAK;EAAE,OAAO;EAAY,SAAS;EAAI,CAAC;CACpD,OAAO,EAAE,MAAM;EAAE,OAAO;EAAS,SAAS;EAAI,CAAC;CAC/C,KAAK,EAAE,QAAQ;EAAE,OAAO;EAAO,SAAS;EAAG,SAAS;EAAK,CAAC;CAC1D,MAAM,EAAE,KAAK;EAAC;EAAS;EAAQ;EAAQ,EAAE;EAAE,OAAO;EAAQ,SAAS;EAAQ,CAAC;CAC5E,WAAW,EAAE,QAAQ;EAAE,OAAO;EAAa,SAAS;EAAO,CAAC;CAC7D,CAAC;AAEF,MAAM,iBAAiB,EAAE,OAAO;CAC9B,SAAS,EAAE,QAAQ;EACjB,OAAO;EACP,SAAS;EACT,SAAS;EACT,SAAS;EACT,UAAU,EAAE,QAAQ,MAAM;EAC3B,CAAC;CACF,MAAM,EAAE,QAAQ;EACd,OAAO;EACP,SAAS;EACT,UAAU,EAAE,QAAQ,MAAM;EAC3B,CAAC;CACF,kBAAkB,EAAE,QAAQ;EAC1B,OAAO;EACP,SAAS;EACT,UAAU,EAAE,QAAQ,MAAM;EAC3B,CAAC;CACH,CAAC;AAEF,MAAM,qBAAqB;CACzB,MAAM,OAAO,QACX;EACE,QAAQ;EACR,UAAU,WAAW;AACnB,SAAM,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;;EAEzC,EACD,EAAE,CACH;AAED,QACE,oBAAC;EACC,OAAM;EACN,QAAQ;EACR,eAAe;GACb,SAAS;GACT,MAAM;GACN,kBAAkB;GACnB;EACD,SAAS;aAEP,UACA,oBAAC;GACO;GACN,SAAS,MAAM;GACf,MAAM,MAAM;GACZ,kBAAkB,MAAM;GACxB,mBAAmB,EAAE,UAAU,UAAU;IACzC;GAEK"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { t as Showcase } from "./Showcase-
|
|
1
|
+
import { t as Showcase } from "./Showcase-BzoXNlCn.js";
|
|
2
2
|
import { ActionButton } from "@alepha/ui";
|
|
3
3
|
import { t } from "alepha";
|
|
4
4
|
import { IconAlertCircle, IconCheck, IconMailCheck } from "@tabler/icons-react";
|
|
5
5
|
import { useRouter, useRouterState } from "alepha/react/router";
|
|
6
|
-
import { Alert, Card, Flex, Loader,
|
|
6
|
+
import { Alert, Card, Flex, Loader, Text as Text$1 } from "@mantine/core";
|
|
7
7
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
import { useI18n } from "alepha/react/i18n";
|
|
9
9
|
import { useEffect, useState } from "react";
|
|
@@ -43,26 +43,28 @@ const VerifyEmail = (_props) => {
|
|
|
43
43
|
flex: 1,
|
|
44
44
|
justify: "center",
|
|
45
45
|
align: "center",
|
|
46
|
-
children: /* @__PURE__ */ jsx(
|
|
46
|
+
children: /* @__PURE__ */ jsx(Flex, {
|
|
47
|
+
direction: "column",
|
|
47
48
|
gap: "sm",
|
|
48
49
|
w: 400,
|
|
49
50
|
children: /* @__PURE__ */ jsx(Card, {
|
|
50
51
|
withBorder: true,
|
|
51
52
|
p: "lg",
|
|
52
53
|
bg: "var(--alepha-elevated)",
|
|
53
|
-
children: /* @__PURE__ */ jsxs(
|
|
54
|
+
children: /* @__PURE__ */ jsxs(Flex, {
|
|
55
|
+
direction: "column",
|
|
54
56
|
gap: "md",
|
|
55
57
|
align: "center",
|
|
56
58
|
children: [
|
|
57
59
|
step === "verifying" && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
58
60
|
/* @__PURE__ */ jsx(Loader, { size: "lg" }),
|
|
59
|
-
/* @__PURE__ */ jsx(Text, {
|
|
61
|
+
/* @__PURE__ */ jsx(Text$1, {
|
|
60
62
|
size: "lg",
|
|
61
63
|
fw: 500,
|
|
62
64
|
ta: "center",
|
|
63
65
|
children: tr("verifyEmailVerifying")
|
|
64
66
|
}),
|
|
65
|
-
/* @__PURE__ */ jsx(Text, {
|
|
67
|
+
/* @__PURE__ */ jsx(Text$1, {
|
|
66
68
|
size: "sm",
|
|
67
69
|
c: "dimmed",
|
|
68
70
|
ta: "center",
|
|
@@ -74,7 +76,7 @@ const VerifyEmail = (_props) => {
|
|
|
74
76
|
size: 48,
|
|
75
77
|
color: "var(--mantine-color-green-6)"
|
|
76
78
|
}),
|
|
77
|
-
/* @__PURE__ */ jsx(Text, {
|
|
79
|
+
/* @__PURE__ */ jsx(Text$1, {
|
|
78
80
|
size: "lg",
|
|
79
81
|
fw: 500,
|
|
80
82
|
ta: "center",
|
|
@@ -84,7 +86,7 @@ const VerifyEmail = (_props) => {
|
|
|
84
86
|
variant: "light",
|
|
85
87
|
color: "green",
|
|
86
88
|
icon: /* @__PURE__ */ jsx(IconCheck, {}),
|
|
87
|
-
children: /* @__PURE__ */ jsx(Text, {
|
|
89
|
+
children: /* @__PURE__ */ jsx(Text$1, {
|
|
88
90
|
size: "sm",
|
|
89
91
|
children: tr("verifyEmailSuccess")
|
|
90
92
|
})
|
|
@@ -100,7 +102,7 @@ const VerifyEmail = (_props) => {
|
|
|
100
102
|
size: 48,
|
|
101
103
|
color: "var(--mantine-color-red-6)"
|
|
102
104
|
}),
|
|
103
|
-
/* @__PURE__ */ jsx(Text, {
|
|
105
|
+
/* @__PURE__ */ jsx(Text$1, {
|
|
104
106
|
size: "lg",
|
|
105
107
|
fw: 500,
|
|
106
108
|
ta: "center",
|
|
@@ -110,7 +112,7 @@ const VerifyEmail = (_props) => {
|
|
|
110
112
|
variant: "light",
|
|
111
113
|
color: "red",
|
|
112
114
|
icon: /* @__PURE__ */ jsx(IconAlertCircle, {}),
|
|
113
|
-
children: /* @__PURE__ */ jsx(Text, {
|
|
115
|
+
children: /* @__PURE__ */ jsx(Text$1, {
|
|
114
116
|
size: "sm",
|
|
115
117
|
children: error || tr("verifyEmailFailed")
|
|
116
118
|
})
|
|
@@ -147,4 +149,4 @@ const DemoVerifyEmail = () => {
|
|
|
147
149
|
|
|
148
150
|
//#endregion
|
|
149
151
|
export { DemoVerifyEmail as default };
|
|
150
|
-
//# sourceMappingURL=DemoVerifyEmail-
|
|
152
|
+
//# sourceMappingURL=DemoVerifyEmail-DbU_tCj8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DemoVerifyEmail-DbU_tCj8.js","names":["Text"],"sources":["../../src/auth/components/VerifyEmail.tsx","../../src/demo/components/auth/DemoVerifyEmail.tsx"],"sourcesContent":["import { ActionButton } from \"@alepha/ui\";\nimport { Alert, Card, Flex, Loader, Text } from \"@mantine/core\";\nimport { IconAlertCircle, IconCheck, IconMailCheck } from \"@tabler/icons-react\";\nimport type { UserController } from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter, useRouterState } from \"alepha/react/router\";\nimport { useEffect, useState } from \"react\";\nimport type { AuthI18n } from \"../AuthI18n.ts\";\nimport type { AuthRouter } from \"../AuthRouter.ts\";\n\nexport type VerifyEmailProps = {};\n\ntype Step = \"verifying\" | \"success\" | \"error\";\n\nconst VerifyEmail = (_props: VerifyEmailProps) => {\n const router = useRouter<AuthRouter>();\n const state = useRouterState();\n const userCtrl = useClient<UserController>();\n const { tr } = useI18n<AuthI18n, \"en\">();\n\n const [step, setStep] = useState<Step>(\"verifying\");\n const [error, setError] = useState<string | null>(null);\n\n const email = state.query.email as string | undefined;\n const token = state.query.token as string | undefined;\n\n useEffect(() => {\n const verify = async () => {\n if (!email || !token) {\n setError(tr(\"verifyEmailMissingParams\"));\n setStep(\"error\");\n return;\n }\n\n try {\n await userCtrl.verifyEmail({\n body: { email, token },\n });\n setStep(\"success\");\n } catch (err) {\n setError(err instanceof Error ? err.message : tr(\"verifyEmailFailed\"));\n setStep(\"error\");\n }\n };\n\n verify();\n }, [email, token]);\n\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Flex direction=\"column\" gap=\"sm\" w={400}>\n <Card withBorder p=\"lg\" bg=\"var(--alepha-elevated)\">\n <Flex direction=\"column\" gap=\"md\" align=\"center\">\n {step === \"verifying\" && (\n <>\n <Loader size=\"lg\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailVerifying\")}\n </Text>\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\">\n {tr(\"verifyEmailPleaseWait\")}\n </Text>\n </>\n )}\n\n {step === \"success\" && (\n <>\n <IconMailCheck size={48} color=\"var(--mantine-color-green-6)\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"green\" icon={<IconCheck />}>\n <Text size=\"sm\">{tr(\"verifyEmailSuccess\")}</Text>\n </Alert>\n <ActionButton href={router.path(\"login\")} fullWidth>\n {tr(\"verifyEmailSignIn\")}\n </ActionButton>\n </>\n )}\n\n {step === \"error\" && (\n <>\n <IconAlertCircle size={48} color=\"var(--mantine-color-red-6)\" />\n <Text size=\"lg\" fw={500} ta=\"center\">\n {tr(\"verifyEmailTitle\")}\n </Text>\n <Alert variant=\"light\" color=\"red\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">{error || tr(\"verifyEmailFailed\")}</Text>\n </Alert>\n <ActionButton href={router.path(\"login\")} fullWidth>\n {tr(\"verifyEmailBackToSignIn\")}\n </ActionButton>\n </>\n )}\n </Flex>\n </Card>\n </Flex>\n </Flex>\n );\n};\n\nexport default VerifyEmail;\n","import { t } from \"alepha\";\nimport VerifyEmail from \"../../../auth/components/VerifyEmail.tsx\";\nimport Showcase from \"../shared/Showcase.tsx\";\n\nconst showcaseSchema = t.object({\n placeholder: t.boolean({\n title: \"Demo Mode\",\n default: true,\n $control: { switch: true },\n }),\n});\n\nconst DemoVerifyEmail = () => {\n return (\n <Showcase\n title=\"VerifyEmail\"\n schema={showcaseSchema}\n initialValues={{\n placeholder: true,\n }}\n columns={1}\n >\n {() => <VerifyEmail />}\n </Showcase>\n );\n};\n\nexport default DemoVerifyEmail;\n"],"mappings":";;;;;;;;;;;;AAeA,MAAM,eAAe,WAA6B;CAChD,MAAM,SAAS,WAAuB;CACtC,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,WAAW,WAA2B;CAC5C,MAAM,EAAE,OAAO,SAAyB;CAExC,MAAM,CAAC,MAAM,WAAW,SAAe,YAAY;CACnD,MAAM,CAAC,OAAO,YAAY,SAAwB,KAAK;CAEvD,MAAM,QAAQ,MAAM,MAAM;CAC1B,MAAM,QAAQ,MAAM,MAAM;AAE1B,iBAAgB;EACd,MAAM,SAAS,YAAY;AACzB,OAAI,CAAC,SAAS,CAAC,OAAO;AACpB,aAAS,GAAG,2BAA2B,CAAC;AACxC,YAAQ,QAAQ;AAChB;;AAGF,OAAI;AACF,UAAM,SAAS,YAAY,EACzB,MAAM;KAAE;KAAO;KAAO,EACvB,CAAC;AACF,YAAQ,UAAU;YACX,KAAK;AACZ,aAAS,eAAe,QAAQ,IAAI,UAAU,GAAG,oBAAoB,CAAC;AACtE,YAAQ,QAAQ;;;AAIpB,UAAQ;IACP,CAAC,OAAO,MAAM,CAAC;AAElB,QACE,oBAAC;EAAK,MAAM;EAAG,SAAQ;EAAS,OAAM;YACpC,oBAAC;GAAK,WAAU;GAAS,KAAI;GAAK,GAAG;aACnC,oBAAC;IAAK;IAAW,GAAE;IAAK,IAAG;cACzB,qBAAC;KAAK,WAAU;KAAS,KAAI;KAAK,OAAM;;MACrC,SAAS,eACR;OACE,oBAAC,UAAO,MAAK,OAAO;OACpB,oBAACA;QAAK,MAAK;QAAK,IAAI;QAAK,IAAG;kBACzB,GAAG,uBAAuB;SACtB;OACP,oBAACA;QAAK,MAAK;QAAK,GAAE;QAAS,IAAG;kBAC3B,GAAG,wBAAwB;SACvB;UACN;MAGJ,SAAS,aACR;OACE,oBAAC;QAAc,MAAM;QAAI,OAAM;SAAiC;OAChE,oBAACA;QAAK,MAAK;QAAK,IAAI;QAAK,IAAG;kBACzB,GAAG,mBAAmB;SAClB;OACP,oBAAC;QAAM,SAAQ;QAAQ,OAAM;QAAQ,MAAM,oBAAC,cAAY;kBACtD,oBAACA;SAAK,MAAK;mBAAM,GAAG,qBAAqB;UAAQ;SAC3C;OACR,oBAAC;QAAa,MAAM,OAAO,KAAK,QAAQ;QAAE;kBACvC,GAAG,oBAAoB;SACX;UACd;MAGJ,SAAS,WACR;OACE,oBAAC;QAAgB,MAAM;QAAI,OAAM;SAA+B;OAChE,oBAACA;QAAK,MAAK;QAAK,IAAI;QAAK,IAAG;kBACzB,GAAG,mBAAmB;SAClB;OACP,oBAAC;QAAM,SAAQ;QAAQ,OAAM;QAAM,MAAM,oBAAC,oBAAkB;kBAC1D,oBAACA;SAAK,MAAK;mBAAM,SAAS,GAAG,oBAAoB;UAAQ;SACnD;OACR,oBAAC;QAAa,MAAM,OAAO,KAAK,QAAQ;QAAE;kBACvC,GAAG,0BAA0B;SACjB;UACd;;MAEA;KACF;IACF;GACF;;;;;AC9FX,MAAM,iBAAiB,EAAE,OAAO,EAC9B,aAAa,EAAE,QAAQ;CACrB,OAAO;CACP,SAAS;CACT,UAAU,EAAE,QAAQ,MAAM;CAC3B,CAAC,EACH,CAAC;AAEF,MAAM,wBAAwB;AAC5B,QACE,oBAAC;EACC,OAAM;EACN,QAAQ;EACR,eAAe,EACb,aAAa,MACd;EACD,SAAS;kBAEF,oBAAC,gBAAc;GACb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconGoogle-
|
|
1
|
+
{"version":3,"file":"IconGoogle-Ch1m3Uzl.js","names":[],"sources":["../../src/auth/components/icons/IconGithub.tsx","../../src/auth/components/icons/IconGoogle.tsx"],"sourcesContent":["const IconGithub = () => {\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 1024 1024\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 0C3.58 0 0 3.58 0 8C0 11.54 2.29 14.53 5.47 15.59C5.87 15.66 6.02 15.42 6.02 15.21C6.02 15.02 6.01 14.39 6.01 13.72C4 14.09 3.48 13.23 3.32 12.78C3.23 12.55 2.84 11.84 2.5 11.65C2.22 11.5 1.82 11.13 2.49 11.12C3.12 11.11 3.57 11.7 3.72 11.94C4.44 13.15 5.59 12.81 6.05 12.6C6.12 12.08 6.33 11.73 6.56 11.53C4.78 11.33 2.92 10.64 2.92 7.58C2.92 6.71 3.23 5.99 3.74 5.43C3.66 5.23 3.38 4.41 3.82 3.31C3.82 3.31 4.49 3.1 6.02 4.13C6.66 3.95 7.34 3.86 8.02 3.86C8.7 3.86 9.38 3.95 10.02 4.13C11.55 3.09 12.22 3.31 12.22 3.31C12.66 4.41 12.38 5.23 12.3 5.43C12.81 5.99 13.12 6.7 13.12 7.58C13.12 10.65 11.25 11.33 9.47 11.53C9.76 11.78 10.01 12.26 10.01 13.01C10.01 14.08 10 14.94 10 15.21C10 15.42 10.15 15.67 10.55 15.59C13.71 14.53 16 11.53 16 8C16 3.58 12.42 0 8 0Z\"\n transform=\"scale(64)\"\n fill={\"var(--alepha-text)\"}\n />\n </svg>\n );\n};\n\nexport default IconGithub;\n","const IconGoogle = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n width=\"24\"\n >\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill=\"#4285F4\"\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill=\"#34A853\"\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill=\"#FBBC05\"\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill=\"#EA4335\"\n />\n <path d=\"M1 1h22v22H1z\" fill=\"none\" />\n </svg>\n );\n};\n\nexport default IconGoogle;\n"],"mappings":";;;AAAA,MAAM,mBAAmB;AACvB,QACE,oBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,oBAAC;GACC,UAAS;GACT,UAAS;GACT,GAAE;GACF,WAAU;GACV,MAAM;IACN;GACE;;;;;AChBV,MAAM,mBAAmB;AACvB,QACE,qBAAC;EACC,OAAM;EACN,QAAO;EACP,SAAQ;EACR,OAAM;;GAEN,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IACC,GAAE;IACF,MAAK;KACL;GACF,oBAAC;IAAK,GAAE;IAAgB,MAAK;KAAS;;GAClC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { TypeForm, ui } from "@alepha/ui";
|
|
2
|
-
import {
|
|
2
|
+
import { Card, Flex, SegmentedControl, Text as Text$1 } from "@mantine/core";
|
|
3
3
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
-
import { useState } from "react";
|
|
5
4
|
import { useForm } from "alepha/react/form";
|
|
5
|
+
import { useState } from "react";
|
|
6
6
|
|
|
7
7
|
//#region ../../src/demo/components/shared/MacWindow.tsx
|
|
8
8
|
const MacWindow = ({ children, title, containerProps, fill }) => {
|
|
@@ -36,7 +36,7 @@ const MacWindow = ({ children, title, containerProps, fill }) => {
|
|
|
36
36
|
/* @__PURE__ */ jsxs(Flex, {
|
|
37
37
|
gap: 6,
|
|
38
38
|
children: [
|
|
39
|
-
/* @__PURE__ */ jsx(
|
|
39
|
+
/* @__PURE__ */ jsx(Flex, {
|
|
40
40
|
w: 12,
|
|
41
41
|
h: 12,
|
|
42
42
|
style: {
|
|
@@ -44,7 +44,7 @@ const MacWindow = ({ children, title, containerProps, fill }) => {
|
|
|
44
44
|
background: "#ff5f57"
|
|
45
45
|
}
|
|
46
46
|
}),
|
|
47
|
-
/* @__PURE__ */ jsx(
|
|
47
|
+
/* @__PURE__ */ jsx(Flex, {
|
|
48
48
|
w: 12,
|
|
49
49
|
h: 12,
|
|
50
50
|
style: {
|
|
@@ -52,7 +52,7 @@ const MacWindow = ({ children, title, containerProps, fill }) => {
|
|
|
52
52
|
background: "#febc2e"
|
|
53
53
|
}
|
|
54
54
|
}),
|
|
55
|
-
/* @__PURE__ */ jsx(
|
|
55
|
+
/* @__PURE__ */ jsx(Flex, {
|
|
56
56
|
w: 12,
|
|
57
57
|
h: 12,
|
|
58
58
|
style: {
|
|
@@ -62,7 +62,7 @@ const MacWindow = ({ children, title, containerProps, fill }) => {
|
|
|
62
62
|
})
|
|
63
63
|
]
|
|
64
64
|
}),
|
|
65
|
-
/* @__PURE__ */ jsx(
|
|
65
|
+
/* @__PURE__ */ jsx(Flex, {
|
|
66
66
|
style: {
|
|
67
67
|
flex: 1,
|
|
68
68
|
textAlign: "center",
|
|
@@ -144,7 +144,7 @@ const Showcase = ({ title, schema, initialValues, columns = 3, children, windowP
|
|
|
144
144
|
...windowProps,
|
|
145
145
|
children: children(values)
|
|
146
146
|
})
|
|
147
|
-
}), /* @__PURE__ */ jsx(
|
|
147
|
+
}), /* @__PURE__ */ jsx(Flex, {
|
|
148
148
|
bg: ui.colors.surface,
|
|
149
149
|
h: "100%",
|
|
150
150
|
p: "md",
|
|
@@ -161,7 +161,7 @@ const Showcase = ({ title, schema, initialValues, columns = 3, children, windowP
|
|
|
161
161
|
withBorder: true,
|
|
162
162
|
py: "xs",
|
|
163
163
|
inheritPadding: true,
|
|
164
|
-
children: /* @__PURE__ */ jsxs(Text, {
|
|
164
|
+
children: /* @__PURE__ */ jsxs(Text$1, {
|
|
165
165
|
size: "xs",
|
|
166
166
|
fw: 500,
|
|
167
167
|
children: [title, " Props"]
|
|
@@ -181,5 +181,5 @@ const Showcase = ({ title, schema, initialValues, columns = 3, children, windowP
|
|
|
181
181
|
};
|
|
182
182
|
|
|
183
183
|
//#endregion
|
|
184
|
-
export {
|
|
185
|
-
//# sourceMappingURL=Showcase-
|
|
184
|
+
export { Showcase as t };
|
|
185
|
+
//# sourceMappingURL=Showcase-BzoXNlCn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Showcase-BzoXNlCn.js","names":["Text"],"sources":["../../src/demo/components/shared/MacWindow.tsx","../../src/demo/components/shared/Showcase.tsx"],"sourcesContent":["import { Flex, type FlexProps, SegmentedControl } from \"@mantine/core\";\nimport { type ReactNode, useState } from \"react\";\n\nexport interface MacWindowProps {\n children: ReactNode;\n title?: string;\n containerProps?: FlexProps;\n fill?: boolean;\n}\n\ntype WindowSize = \"25\" | \"50\" | \"75\" | \"100\";\n\nconst MacWindow = ({\n children,\n title,\n containerProps,\n fill,\n}: MacWindowProps) => {\n const [size, setSize] = useState<WindowSize>(\"100\");\n\n const getWidth = () => {\n return `${size}%`;\n };\n\n return (\n <Flex\n direction=\"column\"\n flex={fill ? 1 : undefined}\n h={fill ? \"100%\" : undefined}\n bdrs={\"md\"}\n style={{\n width: getWidth(),\n border: \"1px solid var(--mantine-color-default-border)\",\n overflow: \"hidden\",\n background: \"var(--mantine-color-body)\",\n boxShadow: \"0 4px 12px rgba(0, 0, 0, 0.15)\",\n transition: \"width 0.3s ease\",\n }}\n >\n <Flex\n h={36}\n px=\"sm\"\n align=\"center\"\n gap={8}\n style={{\n background: \"var(--mantine-color-default)\",\n borderBottom: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <Flex gap={6}>\n <Flex\n w={12}\n h={12}\n style={{ borderRadius: \"50%\", background: \"#ff5f57\" }}\n />\n <Flex\n w={12}\n h={12}\n style={{ borderRadius: \"50%\", background: \"#febc2e\" }}\n />\n <Flex\n w={12}\n h={12}\n style={{ borderRadius: \"50%\", background: \"#28c840\" }}\n />\n </Flex>\n\n <Flex\n style={{\n flex: 1,\n textAlign: \"center\",\n fontSize: 13,\n color: \"var(--mantine-color-dimmed)\",\n }}\n >\n {title}\n </Flex>\n\n {fill ? undefined : (\n <SegmentedControl\n size=\"xs\"\n value={size}\n onChange={(v) => setSize(v as WindowSize)}\n data={[\n { label: \"25\", value: \"25\" },\n { label: \"50\", value: \"50\" },\n { label: \"75\", value: \"75\" },\n { label: \"100\", value: \"100\" },\n ]}\n />\n )}\n </Flex>\n <Flex\n direction={\"column\"}\n flex={fill ? 1 : undefined}\n p=\"md\"\n {...containerProps}\n >\n {children}\n </Flex>\n </Flex>\n );\n};\n\nexport default MacWindow;\n","import { TypeForm, ui } from \"@alepha/ui\";\nimport { Card, Flex, Text } from \"@mantine/core\";\nimport type { Static, TObject } from \"alepha\";\nimport { useForm } from \"alepha/react/form\";\nimport { type ReactNode, useState } from \"react\";\nimport MacWindow, { type MacWindowProps } from \"./MacWindow.tsx\";\n\nexport interface ShowcaseProps<T extends TObject> {\n /**\n * Component title\n */\n title: string;\n /**\n * Schema for the props configuration\n */\n schema: T;\n /**\n * Initial values for the props\n */\n initialValues?: Partial<Static<T>>;\n /**\n * Number of columns for the props form\n */\n columns?: number;\n /**\n * Render function that receives the current props values\n */\n children: (props: Static<T>) => ReactNode;\n /**\n * Additional props for the MacWindow container\n */\n windowProps?: Partial<MacWindowProps>;\n}\n\n/**\n * Showcase component for demonstrating UI components with interactive props configuration.\n * Uses TypeForm to render a form based on the props schema and displays the component preview.\n */\nconst Showcase = <T extends TObject>({\n title,\n schema,\n initialValues,\n columns = 3,\n children,\n windowProps,\n}: ShowcaseProps<T>) => {\n const [values, setValues] = useState<Record<string, any>>(\n initialValues ?? {},\n );\n\n const form = useForm(\n {\n schema,\n initialValues,\n handler: (values) => {\n setValues(values as Record<string, any>);\n },\n onChange: (key, value) => {\n console.log(\"onChange\", key, value);\n form.submit();\n },\n },\n [schema],\n );\n\n return (\n <Flex flex={1} h={\"100%\"}>\n <Flex\n flex={1}\n bg={ui.colors.background}\n h={\"100%\"}\n p=\"xl\"\n justify=\"center\"\n align=\"flex-start\"\n style={{ flex: 1, minWidth: 0, overflow: \"auto\" }}\n >\n <MacWindow title={title} {...windowProps}>\n {children(values as Static<T>)}\n </MacWindow>\n </Flex>\n\n <Flex\n bg={ui.colors.surface}\n h={\"100%\"}\n p={\"md\"}\n style={{\n flex: \"0 0 300px\",\n overflow: \"auto\",\n }}\n >\n <Card withBorder shadow=\"sm\" radius=\"md\" bg={ui.colors.elevated}>\n <Card.Section withBorder py={\"xs\"} inheritPadding>\n <Text size={\"xs\"} fw={500}>\n {title} Props\n </Text>\n </Card.Section>\n\n <Card.Section p={\"sm\"}>\n <TypeForm\n form={form}\n columns={columns}\n skipSubmitButton\n skipFormElement\n />\n </Card.Section>\n </Card>\n </Flex>\n </Flex>\n );\n};\n\nexport default Showcase;\n"],"mappings":";;;;;;;AAYA,MAAM,aAAa,EACjB,UACA,OACA,gBACA,WACoB;CACpB,MAAM,CAAC,MAAM,WAAW,SAAqB,MAAM;CAEnD,MAAM,iBAAiB;AACrB,SAAO,GAAG,KAAK;;AAGjB,QACE,qBAAC;EACC,WAAU;EACV,MAAM,OAAO,IAAI;EACjB,GAAG,OAAO,SAAS;EACnB,MAAM;EACN,OAAO;GACL,OAAO,UAAU;GACjB,QAAQ;GACR,UAAU;GACV,YAAY;GACZ,WAAW;GACX,YAAY;GACb;aAED,qBAAC;GACC,GAAG;GACH,IAAG;GACH,OAAM;GACN,KAAK;GACL,OAAO;IACL,YAAY;IACZ,cAAc;IACf;;IAED,qBAAC;KAAK,KAAK;;MACT,oBAAC;OACC,GAAG;OACH,GAAG;OACH,OAAO;QAAE,cAAc;QAAO,YAAY;QAAW;QACrD;MACF,oBAAC;OACC,GAAG;OACH,GAAG;OACH,OAAO;QAAE,cAAc;QAAO,YAAY;QAAW;QACrD;MACF,oBAAC;OACC,GAAG;OACH,GAAG;OACH,OAAO;QAAE,cAAc;QAAO,YAAY;QAAW;QACrD;;MACG;IAEP,oBAAC;KACC,OAAO;MACL,MAAM;MACN,WAAW;MACX,UAAU;MACV,OAAO;MACR;eAEA;MACI;IAEN,OAAO,SACN,oBAAC;KACC,MAAK;KACL,OAAO;KACP,WAAW,MAAM,QAAQ,EAAgB;KACzC,MAAM;MACJ;OAAE,OAAO;OAAM,OAAO;OAAM;MAC5B;OAAE,OAAO;OAAM,OAAO;OAAM;MAC5B;OAAE,OAAO;OAAM,OAAO;OAAM;MAC5B;OAAE,OAAO;OAAO,OAAO;OAAO;MAC/B;MACD;;IAEC,EACP,oBAAC;GACC,WAAW;GACX,MAAM,OAAO,IAAI;GACjB,GAAE;GACF,GAAI;GAEH;IACI;GACF;;;;;;;;;AC9DX,MAAM,YAA+B,EACnC,OACA,QACA,eACA,UAAU,GACV,UACA,kBACsB;CACtB,MAAM,CAAC,QAAQ,aAAa,SAC1B,iBAAiB,EAAE,CACpB;CAED,MAAM,OAAO,QACX;EACE;EACA;EACA,UAAU,WAAW;AACnB,aAAU,OAA8B;;EAE1C,WAAW,KAAK,UAAU;AACxB,WAAQ,IAAI,YAAY,KAAK,MAAM;AACnC,QAAK,QAAQ;;EAEhB,EACD,CAAC,OAAO,CACT;AAED,QACE,qBAAC;EAAK,MAAM;EAAG,GAAG;aAChB,oBAAC;GACC,MAAM;GACN,IAAI,GAAG,OAAO;GACd,GAAG;GACH,GAAE;GACF,SAAQ;GACR,OAAM;GACN,OAAO;IAAE,MAAM;IAAG,UAAU;IAAG,UAAU;IAAQ;aAEjD,oBAAC;IAAiB;IAAO,GAAI;cAC1B,SAAS,OAAoB;KACpB;IACP,EAEP,oBAAC;GACC,IAAI,GAAG,OAAO;GACd,GAAG;GACH,GAAG;GACH,OAAO;IACL,MAAM;IACN,UAAU;IACX;aAED,qBAAC;IAAK;IAAW,QAAO;IAAK,QAAO;IAAK,IAAI,GAAG,OAAO;eACrD,oBAAC,KAAK;KAAQ;KAAW,IAAI;KAAM;eACjC,qBAACA;MAAK,MAAM;MAAM,IAAI;iBACnB,OAAM;OACF;MACM,EAEf,oBAAC,KAAK;KAAQ,GAAG;eACf,oBAAC;MACO;MACG;MACT;MACA;OACA;MACW;KACV;IACF;GACF"}
|
package/dist/demo/index.d.ts
CHANGED
|
@@ -1,73 +1,6 @@
|
|
|
1
1
|
import * as alepha from "alepha";
|
|
2
|
-
import { Static, TObject } from "alepha";
|
|
3
2
|
import * as alepha_react_router0 from "alepha/react/router";
|
|
4
|
-
import { BoxProps } from "@mantine/core";
|
|
5
|
-
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
6
|
-
import { ReactNode } from "react";
|
|
7
3
|
|
|
8
|
-
//#region ../../src/demo/components/DemoHome.d.ts
|
|
9
|
-
declare const DemoHome: () => react_jsx_runtime0.JSX.Element;
|
|
10
|
-
//#endregion
|
|
11
|
-
//#region ../../src/demo/components/DemoLayout.d.ts
|
|
12
|
-
declare const DemoLayout: () => react_jsx_runtime0.JSX.Element;
|
|
13
|
-
//#endregion
|
|
14
|
-
//#region ../../src/demo/components/json/DemoJsonViewer.d.ts
|
|
15
|
-
declare const DemoJsonViewer: () => react_jsx_runtime0.JSX.Element;
|
|
16
|
-
//#endregion
|
|
17
|
-
//#region ../../src/demo/components/shared/MacWindow.d.ts
|
|
18
|
-
interface MacWindowProps {
|
|
19
|
-
children: ReactNode;
|
|
20
|
-
title?: string;
|
|
21
|
-
containerProps?: BoxProps;
|
|
22
|
-
fill?: boolean;
|
|
23
|
-
}
|
|
24
|
-
declare const MacWindow: ({
|
|
25
|
-
children,
|
|
26
|
-
title,
|
|
27
|
-
containerProps,
|
|
28
|
-
fill
|
|
29
|
-
}: MacWindowProps) => react_jsx_runtime0.JSX.Element;
|
|
30
|
-
//#endregion
|
|
31
|
-
//#region ../../src/demo/components/shared/Showcase.d.ts
|
|
32
|
-
interface ShowcaseProps<T extends TObject> {
|
|
33
|
-
/**
|
|
34
|
-
* Component title
|
|
35
|
-
*/
|
|
36
|
-
title: string;
|
|
37
|
-
/**
|
|
38
|
-
* Schema for the props configuration
|
|
39
|
-
*/
|
|
40
|
-
schema: T;
|
|
41
|
-
/**
|
|
42
|
-
* Initial values for the props
|
|
43
|
-
*/
|
|
44
|
-
initialValues?: Partial<Static<T>>;
|
|
45
|
-
/**
|
|
46
|
-
* Number of columns for the props form
|
|
47
|
-
*/
|
|
48
|
-
columns?: number;
|
|
49
|
-
/**
|
|
50
|
-
* Render function that receives the current props values
|
|
51
|
-
*/
|
|
52
|
-
children: (props: Static<T>) => ReactNode;
|
|
53
|
-
/**
|
|
54
|
-
* Additional props for the MacWindow container
|
|
55
|
-
*/
|
|
56
|
-
windowProps?: Partial<MacWindowProps>;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Showcase component for demonstrating UI components with interactive props configuration.
|
|
60
|
-
* Uses TypeForm to render a form based on the props schema and displays the component preview.
|
|
61
|
-
*/
|
|
62
|
-
declare const Showcase: <T extends TObject>({
|
|
63
|
-
title,
|
|
64
|
-
schema,
|
|
65
|
-
initialValues,
|
|
66
|
-
columns,
|
|
67
|
-
children,
|
|
68
|
-
windowProps
|
|
69
|
-
}: ShowcaseProps<T>) => react_jsx_runtime0.JSX.Element;
|
|
70
|
-
//#endregion
|
|
71
4
|
//#region ../../src/demo/DemoRouter.d.ts
|
|
72
5
|
declare class DemoRouter {
|
|
73
6
|
demoLayout: alepha_react_router0.PagePrimitive<alepha_react_router0.PageConfigSchema, any, alepha_react_router0.TPropsParentDefault>;
|
|
@@ -103,5 +36,5 @@ declare class DemoRouter {
|
|
|
103
36
|
*/
|
|
104
37
|
declare const AlephaUIDemo: alepha.Service<alepha.Module>;
|
|
105
38
|
//#endregion
|
|
106
|
-
export { AlephaUIDemo,
|
|
39
|
+
export { AlephaUIDemo, DemoRouter };
|
|
107
40
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/demo/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/demo/
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/demo/DemoRouter.ts","../../src/demo/index.ts"],"mappings":";;;;cAiBa,UAAA;EACX,UAAA,EAAU,oBAAA,CAAA,aAAA,CADW,oBAAA,CACX,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAaV,QAAA,EAAQ,oBAAA,CAAA,aAAA,CAbE,oBAAA,CAaF,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAQR,QAAA,EAAQ,oBAAA,CAAA,aAAA,CARA,oBAAA,CAQA,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAOR,YAAA,EAAY,oBAAA,CAAA,aAAA,CAPJ,oBAAA,CAOI,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAOZ,WAAA,EAAW,oBAAA,CAAA,aAAA,CAPC,oBAAA,CAOD,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAOX,aAAA,EAAa,oBAAA,CAAA,aAAA,CAPF,oBAAA,CAOE,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAQb,QAAA,EAAQ,oBAAA,CAAA,aAAA,CARK,oBAAA,CAQL,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAOR,cAAA,EAAc,oBAAA,CAAA,aAAA,CAPN,oBAAA,CAOM,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAQd,QAAA,EAAQ,oBAAA,CAAA,aAAA,CARM,oBAAA,CAQN,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAYR,SAAA,EAAS,oBAAA,CAAA,aAAA,CAZD,oBAAA,CAYC,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAOT,YAAA,EAAY,oBAAA,CAAA,aAAA,CAPH,oBAAA,CAOG,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAOZ,iBAAA,EAAiB,oBAAA,CAAA,aAAA,CAPL,oBAAA,CAOK,gBAAA,OAAA,oBAAA,CAAA,mBAAA;EAOjB,eAAA,EAAe,oBAAA,CAAA,aAAA,CAPE,oBAAA,CAOF,gBAAA,OAAA,oBAAA,CAAA,mBAAA;AAAA;;;;;;AAnGjB;;;;;;;;;;;;cCQa,YAAA,EAAY,MAAA,CAAA,OAAA,CAGvB,MAAA,CAHuB,MAAA"}
|
package/dist/demo/index.js
CHANGED
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import { t as DemoHome } from "./DemoHome-DpRrPlBC.js";
|
|
2
|
-
import { t as DemoLayout } from "./DemoLayout-PhgbAAiQ.js";
|
|
3
|
-
import { t as DemoJsonViewer } from "./DemoJsonViewer-zeucGKHV.js";
|
|
4
|
-
import { n as MacWindow, t as Showcase } from "./Showcase-C9btr_SJ.js";
|
|
5
1
|
import { AlephaUI } from "@alepha/ui";
|
|
6
2
|
import { $module } from "alepha";
|
|
7
3
|
import { IconBinaryTree, IconBraces, IconForms, IconHome, IconKey, IconLayoutSidebar, IconLockQuestion, IconLogin, IconMailCheck, IconPackages, IconTable, IconUserPlus, IconWall } from "@tabler/icons-react";
|
|
@@ -13,7 +9,7 @@ var DemoRouter = class {
|
|
|
13
9
|
icon: IconPackages,
|
|
14
10
|
path: "/demo",
|
|
15
11
|
label: "Demo",
|
|
16
|
-
lazy: () => import("./DemoLayout-
|
|
12
|
+
lazy: () => import("./DemoLayout-DHVoacE6.js"),
|
|
17
13
|
children: () => [
|
|
18
14
|
this.demoHome,
|
|
19
15
|
this.demoCore,
|
|
@@ -25,7 +21,7 @@ var DemoRouter = class {
|
|
|
25
21
|
icon: IconHome,
|
|
26
22
|
path: "/",
|
|
27
23
|
label: "Home",
|
|
28
|
-
lazy: () => import("./DemoHome-
|
|
24
|
+
lazy: () => import("./DemoHome-CUMZsYaH.js")
|
|
29
25
|
});
|
|
30
26
|
demoCore = $page({
|
|
31
27
|
icon: IconWall,
|
|
@@ -41,19 +37,19 @@ var DemoRouter = class {
|
|
|
41
37
|
icon: IconForms,
|
|
42
38
|
path: "/type-form",
|
|
43
39
|
label: "TypeForm",
|
|
44
|
-
lazy: () => import("./DemoTypeForm-
|
|
40
|
+
lazy: () => import("./DemoTypeForm-CWz6fJrJ.js")
|
|
45
41
|
});
|
|
46
42
|
demoSidebar = $page({
|
|
47
43
|
icon: IconLayoutSidebar,
|
|
48
44
|
path: "/sidebar",
|
|
49
45
|
label: "Sidebar",
|
|
50
|
-
lazy: () => import("./DemoSidebar-
|
|
46
|
+
lazy: () => import("./DemoSidebar-C1csnGhX.js")
|
|
51
47
|
});
|
|
52
48
|
demoDataTable = $page({
|
|
53
49
|
icon: IconTable,
|
|
54
50
|
path: "/data-table",
|
|
55
51
|
label: "DataTable",
|
|
56
|
-
lazy: () => import("./DemoDataTable-
|
|
52
|
+
lazy: () => import("./DemoDataTable-lnBKWBf8.js")
|
|
57
53
|
});
|
|
58
54
|
demoJson = $page({
|
|
59
55
|
icon: IconBraces,
|
|
@@ -65,7 +61,7 @@ var DemoRouter = class {
|
|
|
65
61
|
icon: IconBinaryTree,
|
|
66
62
|
path: "/viewer",
|
|
67
63
|
label: "JsonViewer",
|
|
68
|
-
lazy: () => import("./DemoJsonViewer-
|
|
64
|
+
lazy: () => import("./DemoJsonViewer-_uokbGaW.js")
|
|
69
65
|
});
|
|
70
66
|
demoAuth = $page({
|
|
71
67
|
icon: IconKey,
|
|
@@ -82,25 +78,25 @@ var DemoRouter = class {
|
|
|
82
78
|
icon: IconLogin,
|
|
83
79
|
path: "/login",
|
|
84
80
|
label: "Login",
|
|
85
|
-
lazy: () => import("./DemoLogin-
|
|
81
|
+
lazy: () => import("./DemoLogin-DjJ9314c.js")
|
|
86
82
|
});
|
|
87
83
|
demoRegister = $page({
|
|
88
84
|
icon: IconUserPlus,
|
|
89
85
|
path: "/register",
|
|
90
86
|
label: "Register",
|
|
91
|
-
lazy: () => import("./DemoRegister-
|
|
87
|
+
lazy: () => import("./DemoRegister-DzkJ5M83.js")
|
|
92
88
|
});
|
|
93
89
|
demoResetPassword = $page({
|
|
94
90
|
icon: IconLockQuestion,
|
|
95
91
|
path: "/reset-password",
|
|
96
92
|
label: "ResetPassword",
|
|
97
|
-
lazy: () => import("./DemoResetPassword-
|
|
93
|
+
lazy: () => import("./DemoResetPassword-DWh4_BpQ.js")
|
|
98
94
|
});
|
|
99
95
|
demoVerifyEmail = $page({
|
|
100
96
|
icon: IconMailCheck,
|
|
101
97
|
path: "/verify-email",
|
|
102
98
|
label: "VerifyEmail",
|
|
103
|
-
lazy: () => import("./DemoVerifyEmail-
|
|
99
|
+
lazy: () => import("./DemoVerifyEmail-DbU_tCj8.js")
|
|
104
100
|
});
|
|
105
101
|
};
|
|
106
102
|
|
|
@@ -127,5 +123,5 @@ const AlephaUIDemo = $module({
|
|
|
127
123
|
});
|
|
128
124
|
|
|
129
125
|
//#endregion
|
|
130
|
-
export { AlephaUIDemo,
|
|
126
|
+
export { AlephaUIDemo, DemoRouter };
|
|
131
127
|
//# sourceMappingURL=index.js.map
|
package/dist/demo/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/demo/DemoRouter.ts","../../src/demo/index.ts"],"sourcesContent":["import {\n IconBinaryTree,\n IconBraces,\n IconForms,\n IconHome,\n IconKey,\n IconLayoutSidebar,\n IconLockQuestion,\n IconLogin,\n IconMailCheck,\n IconPackages,\n IconTable,\n IconUserPlus,\n IconWall,\n} from \"@tabler/icons-react\";\nimport { $page } from \"alepha/react/router\";\n\nexport class DemoRouter {\n demoLayout = $page({\n icon: IconPackages,\n path: \"/demo\",\n label: \"Demo\",\n lazy: () => import(\"./components/DemoLayout.tsx\"),\n children: () => [\n this.demoHome,\n this.demoCore,\n this.demoJson,\n this.demoAuth,\n ],\n });\n\n demoHome = $page({\n icon: IconHome,\n path: \"/\",\n label: \"Home\",\n lazy: () => import(\"./components/DemoHome.tsx\"),\n });\n\n // Core Components\n demoCore = $page({\n icon: IconWall,\n path: \"/core\",\n label: \"Core\",\n children: () => [this.demoTypeForm, this.demoSidebar, this.demoDataTable],\n });\n\n demoTypeForm = $page({\n icon: IconForms,\n path: \"/type-form\",\n label: \"TypeForm\",\n lazy: () => import(\"./components/core/DemoTypeForm.tsx\"),\n });\n\n demoSidebar = $page({\n icon: IconLayoutSidebar,\n path: \"/sidebar\",\n label: \"Sidebar\",\n lazy: () => import(\"./components/core/DemoSidebar.tsx\"),\n });\n\n demoDataTable = $page({\n icon: IconTable,\n path: \"/data-table\",\n label: \"DataTable\",\n lazy: () => import(\"./components/core/DemoDataTable.tsx\"),\n });\n\n // JSON Components\n demoJson = $page({\n icon: IconBraces,\n path: \"/json\",\n label: \"Json\",\n children: () => [this.demoJsonViewer],\n });\n\n demoJsonViewer = $page({\n icon: IconBinaryTree,\n path: \"/viewer\",\n label: \"JsonViewer\",\n lazy: () => import(\"./components/json/DemoJsonViewer.tsx\"),\n });\n\n // Auth Components\n demoAuth = $page({\n icon: IconKey,\n path: \"/auth\",\n label: \"Auth\",\n children: () => [\n this.demoLogin,\n this.demoRegister,\n this.demoResetPassword,\n this.demoVerifyEmail,\n ],\n });\n\n demoLogin = $page({\n icon: IconLogin,\n path: \"/login\",\n label: \"Login\",\n lazy: () => import(\"./components/auth/DemoLogin.tsx\"),\n });\n\n demoRegister = $page({\n icon: IconUserPlus,\n path: \"/register\",\n label: \"Register\",\n lazy: () => import(\"./components/auth/DemoRegister.tsx\"),\n });\n\n demoResetPassword = $page({\n icon: IconLockQuestion,\n path: \"/reset-password\",\n label: \"ResetPassword\",\n lazy: () => import(\"./components/auth/DemoResetPassword.tsx\"),\n });\n\n demoVerifyEmail = $page({\n icon: IconMailCheck,\n path: \"/verify-email\",\n label: \"VerifyEmail\",\n lazy: () => import(\"./components/auth/DemoVerifyEmail.tsx\"),\n });\n}\n","import { AlephaUI } from \"@alepha/ui\";\nimport { $module } from \"alepha\";\nimport { DemoRouter } from \"./DemoRouter.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport {
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/demo/DemoRouter.ts","../../src/demo/index.ts"],"sourcesContent":["import {\n IconBinaryTree,\n IconBraces,\n IconForms,\n IconHome,\n IconKey,\n IconLayoutSidebar,\n IconLockQuestion,\n IconLogin,\n IconMailCheck,\n IconPackages,\n IconTable,\n IconUserPlus,\n IconWall,\n} from \"@tabler/icons-react\";\nimport { $page } from \"alepha/react/router\";\n\nexport class DemoRouter {\n demoLayout = $page({\n icon: IconPackages,\n path: \"/demo\",\n label: \"Demo\",\n lazy: () => import(\"./components/DemoLayout.tsx\"),\n children: () => [\n this.demoHome,\n this.demoCore,\n this.demoJson,\n this.demoAuth,\n ],\n });\n\n demoHome = $page({\n icon: IconHome,\n path: \"/\",\n label: \"Home\",\n lazy: () => import(\"./components/DemoHome.tsx\"),\n });\n\n // Core Components\n demoCore = $page({\n icon: IconWall,\n path: \"/core\",\n label: \"Core\",\n children: () => [this.demoTypeForm, this.demoSidebar, this.demoDataTable],\n });\n\n demoTypeForm = $page({\n icon: IconForms,\n path: \"/type-form\",\n label: \"TypeForm\",\n lazy: () => import(\"./components/core/DemoTypeForm.tsx\"),\n });\n\n demoSidebar = $page({\n icon: IconLayoutSidebar,\n path: \"/sidebar\",\n label: \"Sidebar\",\n lazy: () => import(\"./components/core/DemoSidebar.tsx\"),\n });\n\n demoDataTable = $page({\n icon: IconTable,\n path: \"/data-table\",\n label: \"DataTable\",\n lazy: () => import(\"./components/core/DemoDataTable.tsx\"),\n });\n\n // JSON Components\n demoJson = $page({\n icon: IconBraces,\n path: \"/json\",\n label: \"Json\",\n children: () => [this.demoJsonViewer],\n });\n\n demoJsonViewer = $page({\n icon: IconBinaryTree,\n path: \"/viewer\",\n label: \"JsonViewer\",\n lazy: () => import(\"./components/json/DemoJsonViewer.tsx\"),\n });\n\n // Auth Components\n demoAuth = $page({\n icon: IconKey,\n path: \"/auth\",\n label: \"Auth\",\n children: () => [\n this.demoLogin,\n this.demoRegister,\n this.demoResetPassword,\n this.demoVerifyEmail,\n ],\n });\n\n demoLogin = $page({\n icon: IconLogin,\n path: \"/login\",\n label: \"Login\",\n lazy: () => import(\"./components/auth/DemoLogin.tsx\"),\n });\n\n demoRegister = $page({\n icon: IconUserPlus,\n path: \"/register\",\n label: \"Register\",\n lazy: () => import(\"./components/auth/DemoRegister.tsx\"),\n });\n\n demoResetPassword = $page({\n icon: IconLockQuestion,\n path: \"/reset-password\",\n label: \"ResetPassword\",\n lazy: () => import(\"./components/auth/DemoResetPassword.tsx\"),\n });\n\n demoVerifyEmail = $page({\n icon: IconMailCheck,\n path: \"/verify-email\",\n label: \"VerifyEmail\",\n lazy: () => import(\"./components/auth/DemoVerifyEmail.tsx\"),\n });\n}\n","import { AlephaUI } from \"@alepha/ui\";\nimport { $module } from \"alepha\";\nimport { DemoRouter } from \"./DemoRouter.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport { DemoRouter } from \"./DemoRouter.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * | type | quality | stability |\n * |------|---------|-----------|\n * | frontend | standard | experimental |\n *\n * Component showcase and documentation.\n *\n * **Features:**\n * - DemoLayout for demo pages\n * - DemoHome landing page\n * - MacWindow component for showcases\n * - Showcase component for component demos\n *\n * @module alepha.ui.demo\n */\nexport const AlephaUIDemo = $module({\n name: \"alepha.ui.demo\",\n services: [AlephaUI, DemoRouter],\n});\n"],"mappings":";;;;;;AAiBA,IAAa,aAAb,MAAwB;CACtB,aAAa,MAAM;EACjB,MAAM;EACN,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACnB,gBAAgB;GACd,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACN;EACF,CAAC;CAEF,WAAW,MAAM;EACf,MAAM;EACN,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;CAGF,WAAW,MAAM;EACf,MAAM;EACN,MAAM;EACN,OAAO;EACP,gBAAgB;GAAC,KAAK;GAAc,KAAK;GAAa,KAAK;GAAc;EAC1E,CAAC;CAEF,eAAe,MAAM;EACnB,MAAM;EACN,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;CAEF,cAAc,MAAM;EAClB,MAAM;EACN,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;CAEF,gBAAgB,MAAM;EACpB,MAAM;EACN,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;CAGF,WAAW,MAAM;EACf,MAAM;EACN,MAAM;EACN,OAAO;EACP,gBAAgB,CAAC,KAAK,eAAe;EACtC,CAAC;CAEF,iBAAiB,MAAM;EACrB,MAAM;EACN,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;CAGF,WAAW,MAAM;EACf,MAAM;EACN,MAAM;EACN,OAAO;EACP,gBAAgB;GACd,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;GACN;EACF,CAAC;CAEF,YAAY,MAAM;EAChB,MAAM;EACN,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;CAEF,eAAe,MAAM;EACnB,MAAM;EACN,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;CAEF,oBAAoB,MAAM;EACxB,MAAM;EACN,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;CAEF,kBAAkB,MAAM;EACtB,MAAM;EACN,MAAM;EACN,OAAO;EACP,YAAY,OAAO;EACpB,CAAC;;;;;;;;;;;;;;;;;;;;AChGJ,MAAa,eAAe,QAAQ;CAClC,MAAM;CACN,UAAU,CAAC,UAAU,WAAW;CACjC,CAAC"}
|
package/dist/json/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DialogService, ui } from "@alepha/ui";
|
|
2
|
-
import { ActionIcon, Flex,
|
|
2
|
+
import { ActionIcon, Flex, Text, Tree, getTreeExpandedState, useTree } from "@mantine/core";
|
|
3
3
|
import { IconCheck, IconChevronDown, IconChevronRight, IconCopy } from "@tabler/icons-react";
|
|
4
4
|
import { useCallback, useMemo, useState } from "react";
|
|
5
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -130,7 +130,7 @@ const RowNode = ({ node, expanded, hasChildren, elementProps, size, config, show
|
|
|
130
130
|
return null;
|
|
131
131
|
};
|
|
132
132
|
const getCopyValue = () => isExpandable ? JSON.stringify(nodeValue, null, 2) : String(nodeValue ?? "");
|
|
133
|
-
return /* @__PURE__ */ jsxs(
|
|
133
|
+
return /* @__PURE__ */ jsxs(Flex, {
|
|
134
134
|
gap: 6,
|
|
135
135
|
wrap: "nowrap",
|
|
136
136
|
...elementProps,
|
package/dist/json/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/json/components/JsonViewer.tsx","../../src/json/extensions/DialogService.tsx"],"sourcesContent":["import {\n ActionIcon,\n Group,\n getTreeExpandedState,\n type MantineSize,\n Text,\n Tree,\n useTree,\n} from \"@mantine/core\";\nimport {\n IconCheck,\n IconChevronDown,\n IconChevronRight,\n IconCopy,\n} from \"@tabler/icons-react\";\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface JsonViewerProps {\n data: any;\n /**\n * Depth level to expand by default (0 = collapsed, Infinity = all expanded)\n */\n defaultExpandedDepth?: number;\n /**\n * Maximum nesting depth to render\n */\n maxDepth?: number;\n /**\n * Size variant\n */\n size?: MantineSize;\n /**\n * Whether to show quotes around keys and strings\n */\n showQuotes?: boolean;\n /**\n * Show copy button on row hover\n */\n showCopyButton?: boolean;\n /**\n * Custom value formatter. Return formatted string or undefined to use default.\n */\n formatValue?: (\n key: string | undefined,\n value: any,\n path: string[],\n ) => string | number | undefined;\n}\n\ninterface JsonTreeNode {\n value: string;\n label: string;\n children?: JsonTreeNode[];\n // Custom properties\n nodeValue: any;\n nodeKey: string | undefined;\n path: string[];\n isArrayItem: boolean;\n isRoot?: boolean;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst SIZE_CONFIG: Record<MantineSize, { icon: number; levelOffset: number }> =\n {\n xs: { icon: 14, levelOffset: 16 },\n sm: { icon: 16, levelOffset: 20 },\n md: { icon: 18, levelOffset: 24 },\n lg: { icon: 20, levelOffset: 28 },\n xl: { icon: 22, levelOffset: 32 },\n };\n\nconst STYLES = {\n root: {\n fontFamily: \"var(--mantine-font-family-monospace)\",\n } satisfies CSSProperties,\n chevron: {\n flexShrink: 0,\n color: \"var(--mantine-color-dimmed)\",\n } satisfies CSSProperties,\n key: {\n color: \"var(--mantine-color-cyan-text)\",\n fontWeight: 500,\n } satisfies CSSProperties,\n colon: {\n color: \"var(--mantine-color-dimmed)\",\n } satisfies CSSProperties,\n string: {\n color: \"var(--mantine-color-teal-text)\",\n } satisfies CSSProperties,\n number: {\n color: \"var(--mantine-color-blue-text)\",\n } satisfies CSSProperties,\n boolean: {\n color: \"var(--mantine-color-violet-text)\",\n } satisfies CSSProperties,\n null: {\n color: \"var(--mantine-color-dimmed)\",\n fontStyle: \"italic\",\n } satisfies CSSProperties,\n preview: {\n color: \"var(--mantine-color-dimmed)\",\n } satisfies CSSProperties,\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nconst getValueType = (val: any): string => {\n if (val === null) return \"null\";\n if (val === undefined) return \"undefined\";\n if (Array.isArray(val)) return \"array\";\n return typeof val;\n};\n\n// Convert JSON to tree data structure\nfunction buildTreeNodes(\n data: any,\n path: string[] = [],\n key?: string,\n isArrayItem = false,\n maxDepth = 10,\n): JsonTreeNode | null {\n const currentPath = key !== undefined ? [...path, key] : path;\n const nodeId = currentPath.length > 0 ? currentPath.join(\".\") : \"root\";\n\n if (currentPath.length > maxDepth) {\n return {\n value: nodeId,\n label: key ?? \"\",\n nodeValue: data,\n nodeKey: key,\n path: currentPath,\n isArrayItem,\n };\n }\n\n const type = getValueType(data);\n\n if (type === \"object\" || type === \"array\") {\n const entries =\n type === \"array\"\n ? (data as any[]).map((v, i) => [String(i), v] as const)\n : Object.entries(data);\n\n const children = entries\n .map(([k, v]) =>\n buildTreeNodes(v, currentPath, k, type === \"array\", maxDepth),\n )\n .filter((n): n is JsonTreeNode => n !== null);\n\n return {\n value: nodeId,\n label: key ?? \"\",\n nodeValue: data,\n nodeKey: key,\n path: currentPath,\n isArrayItem,\n children: children.length > 0 ? children : undefined,\n };\n }\n\n return {\n value: nodeId,\n label: key ?? \"\",\n nodeValue: data,\n nodeKey: key,\n path: currentPath,\n isArrayItem,\n };\n}\n\n// Get all expandable node IDs up to a certain depth\nfunction getExpandedIds(\n nodes: JsonTreeNode[],\n targetDepth: number,\n currentDepth = 0,\n): string[] {\n if (currentDepth >= targetDepth) return [];\n const ids: string[] = [];\n for (const node of nodes) {\n if (node.children) {\n ids.push(node.value);\n ids.push(...getExpandedIds(node.children, targetDepth, currentDepth + 1));\n }\n }\n return ids;\n}\n\n// =============================================================================\n// COPY BUTTON COMPONENT\n// =============================================================================\n\nconst CopyButton = ({\n value,\n iconSize,\n}: {\n value: string;\n iconSize: number;\n}) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n },\n [value],\n );\n\n return (\n <ActionIcon\n size={iconSize + 4}\n variant=\"transparent\"\n c={copied ? \"green\" : \"dimmed\"}\n onClick={handleCopy}\n className=\"alepha-json-viewer-copy\"\n >\n {copied ? <IconCheck size={iconSize} /> : <IconCopy size={iconSize} />}\n </ActionIcon>\n );\n};\n\n// =============================================================================\n// ROW NODE COMPONENT\n// =============================================================================\n\ninterface RowNodeProps {\n node: JsonTreeNode;\n expanded: boolean;\n hasChildren: boolean;\n elementProps: any;\n size: MantineSize;\n config: { icon: number; levelOffset: number };\n showQuotes: boolean;\n showCopyButton: boolean;\n renderValue: (val: any, key: string | undefined, path: string[]) => ReactNode;\n}\n\nconst RowNode = ({\n node,\n expanded,\n hasChildren,\n elementProps,\n size,\n config,\n showQuotes,\n showCopyButton,\n renderValue,\n}: RowNodeProps) => {\n const { nodeValue, nodeKey, path, isArrayItem, isRoot } = node;\n const type = getValueType(nodeValue);\n const isExpandable = type === \"object\" || type === \"array\";\n\n const getPreview = () => {\n if (!isExpandable) return null;\n const entries = type === \"array\" ? nodeValue : Object.keys(nodeValue);\n const count = entries.length;\n const label = type === \"array\" ? \"item\" : \"key\";\n\n // For root node or collapsed nodes, show the count\n if (!expanded) {\n return (\n <Text fs={\"italic\"} component=\"span\" size={size} style={STYLES.preview}>\n {count === 0\n ? type === \"array\"\n ? \"[]\"\n : \"{}\"\n : type === \"array\"\n ? `[ ${count} ${count === 1 ? label : `${label}s`} ]`\n : `{ ${count} ${count === 1 ? label : `${label}s`} }`}\n </Text>\n );\n }\n\n return null;\n };\n\n const getCopyValue = () =>\n isExpandable ? JSON.stringify(nodeValue, null, 2) : String(nodeValue ?? \"\");\n\n return (\n <Group\n gap={6}\n wrap=\"nowrap\"\n {...elementProps}\n className={`alepha-json-viewer-row ${elementProps.className || \"\"}`}\n >\n {hasChildren ? (\n expanded ? (\n <IconChevronDown size={config.icon} style={STYLES.chevron} />\n ) : (\n <IconChevronRight size={config.icon} style={STYLES.chevron} />\n )\n ) : (\n <span style={{ width: config.icon, flexShrink: 0 }} />\n )}\n\n {nodeKey !== undefined && !isArrayItem && (\n <Text component=\"span\" size={size}>\n <span style={STYLES.key}>\n {showQuotes ? `\"${nodeKey}\"` : nodeKey}\n </span>\n <span style={STYLES.colon}>:</span>\n </Text>\n )}\n\n {nodeKey !== undefined && isArrayItem && (\n <Text component=\"span\" size={size}>\n <span style={STYLES.key}>{nodeKey}</span>\n <span style={STYLES.colon}>:</span>\n </Text>\n )}\n\n {hasChildren ? (\n getPreview()\n ) : isExpandable ? (\n type === \"array\" ? (\n <Text component=\"span\" size={size} style={STYLES.preview}>\n []\n </Text>\n ) : (\n <Text component=\"span\" size={size} style={STYLES.preview}>\n {\"{}\"}\n </Text>\n )\n ) : (\n renderValue(nodeValue, nodeKey, path)\n )}\n\n {showCopyButton && (\n <CopyButton value={getCopyValue()} iconSize={config.icon} />\n )}\n </Group>\n );\n};\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\nexport const JsonViewer = ({\n data,\n defaultExpandedDepth = 2,\n maxDepth = 10,\n size = \"sm\",\n showQuotes = false,\n showCopyButton = true,\n formatValue,\n}: JsonViewerProps) => {\n const config = SIZE_CONFIG[size] || SIZE_CONFIG.sm;\n\n // Build tree data from JSON with root wrapper\n const treeData = useMemo(() => {\n const type = getValueType(data);\n\n // For objects and arrays, create a root node wrapper\n if (type === \"object\" || type === \"array\") {\n const entries =\n type === \"array\"\n ? (data as any[]).map((v, i) => [String(i), v] as const)\n : Object.entries(data);\n const children = entries\n .map(([k, v]) => buildTreeNodes(v, [], k, type === \"array\", maxDepth))\n .filter((n): n is JsonTreeNode => n !== null);\n\n const rootNode: JsonTreeNode = {\n value: \"root\",\n label: \"\",\n nodeValue: data,\n nodeKey: undefined,\n path: [],\n isArrayItem: false,\n isRoot: true,\n children: children.length > 0 ? children : undefined,\n };\n return [rootNode];\n }\n\n // For primitives, just show the value directly\n const node = buildTreeNodes(data, [], undefined, false, maxDepth);\n return node ? [node] : [];\n }, [data, maxDepth]);\n\n // Compute initial expanded state (root is always expanded by default unless depth is 0)\n const initialExpandedState = useMemo(() => {\n if (defaultExpandedDepth === 0) return {};\n if (defaultExpandedDepth === Infinity) {\n return getTreeExpandedState(treeData, \"*\");\n }\n // Add 1 to depth to account for root node\n const ids = getExpandedIds(treeData, defaultExpandedDepth + 1);\n return getTreeExpandedState(treeData, ids);\n }, [treeData, defaultExpandedDepth]);\n\n const tree = useTree({ initialExpandedState });\n\n // Render value based on type\n const renderValue = useCallback(\n (val: any, key: string | undefined, path: string[]): ReactNode => {\n const custom = formatValue?.(key, val, path);\n if (custom !== undefined) {\n return (\n <Text\n component=\"span\"\n size={size}\n style={STYLES.string}\n className=\"alepha-json-viewer-value\"\n title={String(val)}\n >\n {custom}\n </Text>\n );\n }\n\n const type = getValueType(val);\n switch (type) {\n case \"string\": {\n return (\n <Text\n style={STYLES.string}\n component=\"span\"\n size={size}\n className=\"alepha-json-viewer-value\"\n title={val}\n >\n \"{val}\"\n </Text>\n );\n }\n case \"number\":\n return (\n <Text component=\"span\" size={size} style={STYLES.number}>\n {val}\n </Text>\n );\n case \"boolean\":\n return (\n <Text component=\"span\" size={size} style={STYLES.boolean}>\n {String(val)}\n </Text>\n );\n case \"null\":\n case \"undefined\":\n return (\n <Text component=\"span\" size={size} style={STYLES.null}>\n {type}\n </Text>\n );\n default:\n return (\n <Text component=\"span\" size={size}>\n {String(val)}\n </Text>\n );\n }\n },\n [formatValue, showQuotes, size],\n );\n\n // Render tree node\n const renderNode = useCallback(\n ({\n node,\n expanded,\n hasChildren,\n elementProps,\n }: {\n node: JsonTreeNode;\n expanded: boolean;\n hasChildren: boolean;\n elementProps: any;\n }): ReactNode => {\n return (\n <RowNode\n node={node}\n expanded={expanded}\n hasChildren={hasChildren}\n elementProps={elementProps}\n size={size}\n config={config}\n showQuotes={showQuotes}\n showCopyButton={showCopyButton}\n renderValue={renderValue}\n />\n );\n },\n [config, renderValue, showCopyButton, showQuotes, size],\n );\n\n if (treeData.length === 0) {\n return (\n <Text size={size} style={STYLES.null}>\n {data === null ? \"null\" : data === undefined ? \"undefined\" : \"{}\"}\n </Text>\n );\n }\n\n return (\n <Tree\n data={treeData}\n tree={tree}\n levelOffset={config.levelOffset}\n expandOnClick\n renderNode={renderNode as any}\n styles={{ root: STYLES.root }}\n />\n );\n};\n\nexport default JsonViewer;\n","import { type BaseDialogOptions, DialogService, ui } from \"@alepha/ui\";\nimport { Flex } from \"@mantine/core\";\nimport { JsonViewer } from \"../components/JsonViewer.tsx\";\n\ndeclare module \"@alepha/ui\" {\n interface DialogService {\n /**\n * Opens a JSON viewer dialog.\n *\n * @param data - The JSON data to display.\n * @param options - Additional dialog options.\n */\n json(data?: any, options?: BaseDialogOptions): void;\n }\n}\n\nDialogService.prototype.json = function (\n data?: any,\n options?: BaseDialogOptions,\n) {\n this.open({\n size: \"lg\",\n title: options?.title || \"Json Viewer\",\n ...options,\n content: (\n <Flex bdrs={\"md\"} w={\"100%\"} flex={1} p={\"sm\"} bg={ui.colors.surface}>\n <JsonViewer size={\"xs\"} data={data} />\n </Flex>\n ),\n });\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/json/components/JsonViewer.tsx","../../src/json/extensions/DialogService.tsx"],"sourcesContent":["import {\n ActionIcon,\n Flex,\n getTreeExpandedState,\n type MantineSize,\n Text,\n Tree,\n useTree,\n} from \"@mantine/core\";\nimport {\n IconCheck,\n IconChevronDown,\n IconChevronRight,\n IconCopy,\n} from \"@tabler/icons-react\";\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useMemo,\n useState,\n} from \"react\";\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\ninterface JsonViewerProps {\n data: any;\n /**\n * Depth level to expand by default (0 = collapsed, Infinity = all expanded)\n */\n defaultExpandedDepth?: number;\n /**\n * Maximum nesting depth to render\n */\n maxDepth?: number;\n /**\n * Size variant\n */\n size?: MantineSize;\n /**\n * Whether to show quotes around keys and strings\n */\n showQuotes?: boolean;\n /**\n * Show copy button on row hover\n */\n showCopyButton?: boolean;\n /**\n * Custom value formatter. Return formatted string or undefined to use default.\n */\n formatValue?: (\n key: string | undefined,\n value: any,\n path: string[],\n ) => string | number | undefined;\n}\n\ninterface JsonTreeNode {\n value: string;\n label: string;\n children?: JsonTreeNode[];\n // Custom properties\n nodeValue: any;\n nodeKey: string | undefined;\n path: string[];\n isArrayItem: boolean;\n isRoot?: boolean;\n}\n\n// =============================================================================\n// CONSTANTS\n// =============================================================================\n\nconst SIZE_CONFIG: Record<MantineSize, { icon: number; levelOffset: number }> =\n {\n xs: { icon: 14, levelOffset: 16 },\n sm: { icon: 16, levelOffset: 20 },\n md: { icon: 18, levelOffset: 24 },\n lg: { icon: 20, levelOffset: 28 },\n xl: { icon: 22, levelOffset: 32 },\n };\n\nconst STYLES = {\n root: {\n fontFamily: \"var(--mantine-font-family-monospace)\",\n } satisfies CSSProperties,\n chevron: {\n flexShrink: 0,\n color: \"var(--mantine-color-dimmed)\",\n } satisfies CSSProperties,\n key: {\n color: \"var(--mantine-color-cyan-text)\",\n fontWeight: 500,\n } satisfies CSSProperties,\n colon: {\n color: \"var(--mantine-color-dimmed)\",\n } satisfies CSSProperties,\n string: {\n color: \"var(--mantine-color-teal-text)\",\n } satisfies CSSProperties,\n number: {\n color: \"var(--mantine-color-blue-text)\",\n } satisfies CSSProperties,\n boolean: {\n color: \"var(--mantine-color-violet-text)\",\n } satisfies CSSProperties,\n null: {\n color: \"var(--mantine-color-dimmed)\",\n fontStyle: \"italic\",\n } satisfies CSSProperties,\n preview: {\n color: \"var(--mantine-color-dimmed)\",\n } satisfies CSSProperties,\n};\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nconst getValueType = (val: any): string => {\n if (val === null) return \"null\";\n if (val === undefined) return \"undefined\";\n if (Array.isArray(val)) return \"array\";\n return typeof val;\n};\n\n// Convert JSON to tree data structure\nfunction buildTreeNodes(\n data: any,\n path: string[] = [],\n key?: string,\n isArrayItem = false,\n maxDepth = 10,\n): JsonTreeNode | null {\n const currentPath = key !== undefined ? [...path, key] : path;\n const nodeId = currentPath.length > 0 ? currentPath.join(\".\") : \"root\";\n\n if (currentPath.length > maxDepth) {\n return {\n value: nodeId,\n label: key ?? \"\",\n nodeValue: data,\n nodeKey: key,\n path: currentPath,\n isArrayItem,\n };\n }\n\n const type = getValueType(data);\n\n if (type === \"object\" || type === \"array\") {\n const entries =\n type === \"array\"\n ? (data as any[]).map((v, i) => [String(i), v] as const)\n : Object.entries(data);\n\n const children = entries\n .map(([k, v]) =>\n buildTreeNodes(v, currentPath, k, type === \"array\", maxDepth),\n )\n .filter((n): n is JsonTreeNode => n !== null);\n\n return {\n value: nodeId,\n label: key ?? \"\",\n nodeValue: data,\n nodeKey: key,\n path: currentPath,\n isArrayItem,\n children: children.length > 0 ? children : undefined,\n };\n }\n\n return {\n value: nodeId,\n label: key ?? \"\",\n nodeValue: data,\n nodeKey: key,\n path: currentPath,\n isArrayItem,\n };\n}\n\n// Get all expandable node IDs up to a certain depth\nfunction getExpandedIds(\n nodes: JsonTreeNode[],\n targetDepth: number,\n currentDepth = 0,\n): string[] {\n if (currentDepth >= targetDepth) return [];\n const ids: string[] = [];\n for (const node of nodes) {\n if (node.children) {\n ids.push(node.value);\n ids.push(...getExpandedIds(node.children, targetDepth, currentDepth + 1));\n }\n }\n return ids;\n}\n\n// =============================================================================\n// COPY BUTTON COMPONENT\n// =============================================================================\n\nconst CopyButton = ({\n value,\n iconSize,\n}: {\n value: string;\n iconSize: number;\n}) => {\n const [copied, setCopied] = useState(false);\n\n const handleCopy = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n navigator.clipboard.writeText(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 1500);\n },\n [value],\n );\n\n return (\n <ActionIcon\n size={iconSize + 4}\n variant=\"transparent\"\n c={copied ? \"green\" : \"dimmed\"}\n onClick={handleCopy}\n className=\"alepha-json-viewer-copy\"\n >\n {copied ? <IconCheck size={iconSize} /> : <IconCopy size={iconSize} />}\n </ActionIcon>\n );\n};\n\n// =============================================================================\n// ROW NODE COMPONENT\n// =============================================================================\n\ninterface RowNodeProps {\n node: JsonTreeNode;\n expanded: boolean;\n hasChildren: boolean;\n elementProps: any;\n size: MantineSize;\n config: { icon: number; levelOffset: number };\n showQuotes: boolean;\n showCopyButton: boolean;\n renderValue: (val: any, key: string | undefined, path: string[]) => ReactNode;\n}\n\nconst RowNode = ({\n node,\n expanded,\n hasChildren,\n elementProps,\n size,\n config,\n showQuotes,\n showCopyButton,\n renderValue,\n}: RowNodeProps) => {\n const { nodeValue, nodeKey, path, isArrayItem, isRoot } = node;\n const type = getValueType(nodeValue);\n const isExpandable = type === \"object\" || type === \"array\";\n\n const getPreview = () => {\n if (!isExpandable) return null;\n const entries = type === \"array\" ? nodeValue : Object.keys(nodeValue);\n const count = entries.length;\n const label = type === \"array\" ? \"item\" : \"key\";\n\n // For root node or collapsed nodes, show the count\n if (!expanded) {\n return (\n <Text fs={\"italic\"} component=\"span\" size={size} style={STYLES.preview}>\n {count === 0\n ? type === \"array\"\n ? \"[]\"\n : \"{}\"\n : type === \"array\"\n ? `[ ${count} ${count === 1 ? label : `${label}s`} ]`\n : `{ ${count} ${count === 1 ? label : `${label}s`} }`}\n </Text>\n );\n }\n\n return null;\n };\n\n const getCopyValue = () =>\n isExpandable ? JSON.stringify(nodeValue, null, 2) : String(nodeValue ?? \"\");\n\n return (\n <Flex\n gap={6}\n wrap=\"nowrap\"\n {...elementProps}\n className={`alepha-json-viewer-row ${elementProps.className || \"\"}`}\n >\n {hasChildren ? (\n expanded ? (\n <IconChevronDown size={config.icon} style={STYLES.chevron} />\n ) : (\n <IconChevronRight size={config.icon} style={STYLES.chevron} />\n )\n ) : (\n <span style={{ width: config.icon, flexShrink: 0 }} />\n )}\n\n {nodeKey !== undefined && !isArrayItem && (\n <Text component=\"span\" size={size}>\n <span style={STYLES.key}>\n {showQuotes ? `\"${nodeKey}\"` : nodeKey}\n </span>\n <span style={STYLES.colon}>:</span>\n </Text>\n )}\n\n {nodeKey !== undefined && isArrayItem && (\n <Text component=\"span\" size={size}>\n <span style={STYLES.key}>{nodeKey}</span>\n <span style={STYLES.colon}>:</span>\n </Text>\n )}\n\n {hasChildren ? (\n getPreview()\n ) : isExpandable ? (\n type === \"array\" ? (\n <Text component=\"span\" size={size} style={STYLES.preview}>\n []\n </Text>\n ) : (\n <Text component=\"span\" size={size} style={STYLES.preview}>\n {\"{}\"}\n </Text>\n )\n ) : (\n renderValue(nodeValue, nodeKey, path)\n )}\n\n {showCopyButton && (\n <CopyButton value={getCopyValue()} iconSize={config.icon} />\n )}\n </Flex>\n );\n};\n\n// =============================================================================\n// MAIN COMPONENT\n// =============================================================================\n\nexport const JsonViewer = ({\n data,\n defaultExpandedDepth = 2,\n maxDepth = 10,\n size = \"sm\",\n showQuotes = false,\n showCopyButton = true,\n formatValue,\n}: JsonViewerProps) => {\n const config = SIZE_CONFIG[size] || SIZE_CONFIG.sm;\n\n // Build tree data from JSON with root wrapper\n const treeData = useMemo(() => {\n const type = getValueType(data);\n\n // For objects and arrays, create a root node wrapper\n if (type === \"object\" || type === \"array\") {\n const entries =\n type === \"array\"\n ? (data as any[]).map((v, i) => [String(i), v] as const)\n : Object.entries(data);\n const children = entries\n .map(([k, v]) => buildTreeNodes(v, [], k, type === \"array\", maxDepth))\n .filter((n): n is JsonTreeNode => n !== null);\n\n const rootNode: JsonTreeNode = {\n value: \"root\",\n label: \"\",\n nodeValue: data,\n nodeKey: undefined,\n path: [],\n isArrayItem: false,\n isRoot: true,\n children: children.length > 0 ? children : undefined,\n };\n return [rootNode];\n }\n\n // For primitives, just show the value directly\n const node = buildTreeNodes(data, [], undefined, false, maxDepth);\n return node ? [node] : [];\n }, [data, maxDepth]);\n\n // Compute initial expanded state (root is always expanded by default unless depth is 0)\n const initialExpandedState = useMemo(() => {\n if (defaultExpandedDepth === 0) return {};\n if (defaultExpandedDepth === Infinity) {\n return getTreeExpandedState(treeData, \"*\");\n }\n // Add 1 to depth to account for root node\n const ids = getExpandedIds(treeData, defaultExpandedDepth + 1);\n return getTreeExpandedState(treeData, ids);\n }, [treeData, defaultExpandedDepth]);\n\n const tree = useTree({ initialExpandedState });\n\n // Render value based on type\n const renderValue = useCallback(\n (val: any, key: string | undefined, path: string[]): ReactNode => {\n const custom = formatValue?.(key, val, path);\n if (custom !== undefined) {\n return (\n <Text\n component=\"span\"\n size={size}\n style={STYLES.string}\n className=\"alepha-json-viewer-value\"\n title={String(val)}\n >\n {custom}\n </Text>\n );\n }\n\n const type = getValueType(val);\n switch (type) {\n case \"string\": {\n return (\n <Text\n style={STYLES.string}\n component=\"span\"\n size={size}\n className=\"alepha-json-viewer-value\"\n title={val}\n >\n \"{val}\"\n </Text>\n );\n }\n case \"number\":\n return (\n <Text component=\"span\" size={size} style={STYLES.number}>\n {val}\n </Text>\n );\n case \"boolean\":\n return (\n <Text component=\"span\" size={size} style={STYLES.boolean}>\n {String(val)}\n </Text>\n );\n case \"null\":\n case \"undefined\":\n return (\n <Text component=\"span\" size={size} style={STYLES.null}>\n {type}\n </Text>\n );\n default:\n return (\n <Text component=\"span\" size={size}>\n {String(val)}\n </Text>\n );\n }\n },\n [formatValue, showQuotes, size],\n );\n\n // Render tree node\n const renderNode = useCallback(\n ({\n node,\n expanded,\n hasChildren,\n elementProps,\n }: {\n node: JsonTreeNode;\n expanded: boolean;\n hasChildren: boolean;\n elementProps: any;\n }): ReactNode => {\n return (\n <RowNode\n node={node}\n expanded={expanded}\n hasChildren={hasChildren}\n elementProps={elementProps}\n size={size}\n config={config}\n showQuotes={showQuotes}\n showCopyButton={showCopyButton}\n renderValue={renderValue}\n />\n );\n },\n [config, renderValue, showCopyButton, showQuotes, size],\n );\n\n if (treeData.length === 0) {\n return (\n <Text size={size} style={STYLES.null}>\n {data === null ? \"null\" : data === undefined ? \"undefined\" : \"{}\"}\n </Text>\n );\n }\n\n return (\n <Tree\n data={treeData}\n tree={tree}\n levelOffset={config.levelOffset}\n expandOnClick\n renderNode={renderNode as any}\n styles={{ root: STYLES.root }}\n />\n );\n};\n\nexport default JsonViewer;\n","import { type BaseDialogOptions, DialogService, ui } from \"@alepha/ui\";\nimport { Flex } from \"@mantine/core\";\nimport { JsonViewer } from \"../components/JsonViewer.tsx\";\n\ndeclare module \"@alepha/ui\" {\n interface DialogService {\n /**\n * Opens a JSON viewer dialog.\n *\n * @param data - The JSON data to display.\n * @param options - Additional dialog options.\n */\n json(data?: any, options?: BaseDialogOptions): void;\n }\n}\n\nDialogService.prototype.json = function (\n data?: any,\n options?: BaseDialogOptions,\n) {\n this.open({\n size: \"lg\",\n title: options?.title || \"Json Viewer\",\n ...options,\n content: (\n <Flex bdrs={\"md\"} w={\"100%\"} flex={1} p={\"sm\"} bg={ui.colors.surface}>\n <JsonViewer size={\"xs\"} data={data} />\n </Flex>\n ),\n });\n};\n"],"mappings":"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"}
|