mogh_ui 0.1.0 → 0.2.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.
Files changed (69) hide show
  1. package/dist/auth/index.cjs +156 -0
  2. package/dist/auth/index.cjs.map +1 -0
  3. package/dist/auth/index.d.cts +50 -0
  4. package/dist/auth/index.d.ts +50 -0
  5. package/dist/auth/index.js +115 -0
  6. package/dist/auth/index.js.map +1 -0
  7. package/dist/auth/login/header.cjs +74 -0
  8. package/dist/auth/login/header.cjs.map +1 -0
  9. package/dist/auth/login/header.d.cts +8 -0
  10. package/dist/auth/login/header.d.ts +8 -0
  11. package/dist/auth/login/header.js +60 -0
  12. package/dist/auth/login/header.js.map +1 -0
  13. package/dist/auth/login/index.cjs +245 -0
  14. package/dist/auth/login/index.cjs.map +1 -0
  15. package/dist/auth/login/index.d.cts +15 -0
  16. package/dist/auth/login/index.d.ts +15 -0
  17. package/dist/auth/login/index.js +220 -0
  18. package/dist/auth/login/index.js.map +1 -0
  19. package/dist/auth/profile/index.cjs +27 -0
  20. package/dist/auth/profile/index.cjs.map +1 -0
  21. package/dist/auth/profile/index.d.cts +5 -0
  22. package/dist/auth/profile/index.d.ts +5 -0
  23. package/dist/auth/profile/index.js +4 -0
  24. package/dist/auth/profile/index.js.map +1 -0
  25. package/dist/auth/profile/linked-logins.cjs +177 -0
  26. package/dist/auth/profile/linked-logins.cjs.map +1 -0
  27. package/dist/auth/profile/linked-logins.d.cts +13 -0
  28. package/dist/auth/profile/linked-logins.d.ts +13 -0
  29. package/dist/auth/profile/linked-logins.js +150 -0
  30. package/dist/auth/profile/linked-logins.js.map +1 -0
  31. package/dist/auth/profile/passkey.cjs +109 -0
  32. package/dist/auth/profile/passkey.cjs.map +1 -0
  33. package/dist/auth/profile/passkey.d.cts +9 -0
  34. package/dist/auth/profile/passkey.d.ts +9 -0
  35. package/dist/auth/profile/passkey.js +75 -0
  36. package/dist/auth/profile/passkey.js.map +1 -0
  37. package/dist/auth/profile/totp.cjs +147 -0
  38. package/dist/auth/profile/totp.cjs.map +1 -0
  39. package/dist/auth/profile/totp.d.cts +9 -0
  40. package/dist/auth/profile/totp.d.ts +9 -0
  41. package/dist/auth/profile/totp.js +131 -0
  42. package/dist/auth/profile/totp.js.map +1 -0
  43. package/dist/auth/utils.cjs +42 -0
  44. package/dist/auth/utils.cjs.map +1 -0
  45. package/dist/auth/utils.d.cts +4 -0
  46. package/dist/auth/utils.d.ts +4 -0
  47. package/dist/auth/utils.js +17 -0
  48. package/dist/auth/utils.js.map +1 -0
  49. package/dist/components/page-guard.d.cts +2 -2
  50. package/dist/components/page-guard.d.ts +2 -2
  51. package/dist/components/tabbed-page.cjs +3 -1
  52. package/dist/components/tabbed-page.cjs.map +1 -1
  53. package/dist/components/tabbed-page.d.cts +4 -3
  54. package/dist/components/tabbed-page.d.ts +4 -3
  55. package/dist/components/tabbed-page.js +9 -2
  56. package/dist/components/tabbed-page.js.map +1 -1
  57. package/dist/index.cjs +2 -0
  58. package/dist/index.cjs.map +1 -1
  59. package/dist/index.d.cts +9 -1
  60. package/dist/index.d.ts +9 -1
  61. package/dist/index.js +1 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/theme.cjs +12 -4
  64. package/dist/theme.cjs.map +1 -1
  65. package/dist/theme.d.cts +7 -4
  66. package/dist/theme.d.ts +7 -4
  67. package/dist/theme.js +12 -4
  68. package/dist/theme.js.map +1 -1
  69. package/package.json +7 -1
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var totp_exports = {};
20
+ __export(totp_exports, {
21
+ EnrollTotp: () => EnrollTotp
22
+ });
23
+ module.exports = __toCommonJS(totp_exports);
24
+ var import_jsx_runtime = require("react/jsx-runtime");
25
+ var import_core = require("@mantine/core");
26
+ var import_notifications = require("@mantine/notifications");
27
+ var import_lucide_react = require("lucide-react");
28
+ var import_react = require("react");
29
+ var import__ = require("../..");
30
+ const EnrollTotp = ({
31
+ userInvalidate,
32
+ passkeyEnrolled,
33
+ totpEnrolled
34
+ }) => {
35
+ const [open, setOpen] = (0, import_react.useState)(false);
36
+ const [submitted, setSubmitted] = (0, import_react.useState)();
37
+ const [confirm, setConfirm] = (0, import_react.useState)("");
38
+ const [recovery, setRecovery] = (0, import_react.useState)(void 0);
39
+ const { mutate: beginEnrollment } = (0, import__.useManageAuth)("BeginTotpEnrollment", {
40
+ onSuccess: ({ uri, png }) => setSubmitted({ uri, png })
41
+ });
42
+ const { mutate: confirmEnrollment, isPending: confirmPending } = (0, import__.useManageAuth)("ConfirmTotpEnrollment", {
43
+ onSuccess: ({ recovery_codes }) => {
44
+ setRecovery(recovery_codes);
45
+ userInvalidate?.();
46
+ }
47
+ });
48
+ const { mutateAsync: unenroll, isPending: unenrollPending } = (0, import__.useManageAuth)(
49
+ "UnenrollTotp",
50
+ {
51
+ onSuccess: () => {
52
+ userInvalidate?.();
53
+ import_notifications.notifications.show({
54
+ message: "Unenrolled in TOTP 2FA.",
55
+ color: "green"
56
+ });
57
+ }
58
+ }
59
+ );
60
+ const onOpenChange = (open2) => {
61
+ setOpen(open2);
62
+ if (open2) {
63
+ beginEnrollment({});
64
+ } else {
65
+ setSubmitted(void 0);
66
+ setRecovery(void 0);
67
+ }
68
+ };
69
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
70
+ !totpEnrolled && !passkeyEnrolled && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
71
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Modal, { opened: open, onClose: () => onOpenChange(false), children: [
72
+ recovery && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Flex, { direction: "column", gap: "lg", children: [
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Text, { size: "lg", children: "Save recovery keys" }),
74
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Flex, { direction: "column", gap: "sm", children: recovery.map((code) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.TextInput, { w: 200, value: code, disabled: true }, code)) }),
75
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import__.CopyButton, { content: recovery.join("\n") })
76
+ ] }),
77
+ !recovery && submitted && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Flex, { direction: "column", gap: "lg", children: [
78
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Text, { size: "lg", children: "Scan this QR code with your authenticator app, and enter the 6 digit code below." }),
79
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
80
+ "img",
81
+ {
82
+ width: 250,
83
+ height: 250,
84
+ src: "data:image/png;base64," + submitted.png,
85
+ alt: "QRCode"
86
+ }
87
+ ) }),
88
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Flex, { align: "center", justify: "space-between", gap: "sm", children: [
89
+ "URI",
90
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.TextInput, { w: 250, value: submitted.uri, disabled: true }),
91
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import__.CopyButton, { content: submitted.uri })
92
+ ] }),
93
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_core.Flex, { align: "center", justify: "space-between", children: [
94
+ "Confirm Code",
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
96
+ import_core.TextInput,
97
+ {
98
+ w: 250,
99
+ value: confirm,
100
+ onChange: (e) => setConfirm(e.target.value),
101
+ autoFocus: true
102
+ }
103
+ )
104
+ ] }),
105
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Flex, { justify: "flex-end", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
106
+ import_core.Button,
107
+ {
108
+ onClick: () => confirmEnrollment({ code: confirm }),
109
+ disabled: confirm.length !== 6 || confirmPending,
110
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Check, { size: "1rem" }),
111
+ loading: confirmPending,
112
+ children: "Confirm"
113
+ }
114
+ ) })
115
+ ] }),
116
+ !recovery && !submitted && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Center, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_core.Loader, {}) })
117
+ ] }),
118
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
119
+ import_core.Button,
120
+ {
121
+ leftSection: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.RotateCcwKey, { size: "1rem" }),
122
+ variant: "default",
123
+ onClick: () => onOpenChange(true),
124
+ w: 220,
125
+ children: "Enroll TOTP 2FA"
126
+ }
127
+ )
128
+ ] }),
129
+ totpEnrolled && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
130
+ import__.ConfirmModal,
131
+ {
132
+ confirmText: "Unenroll",
133
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Trash, { size: "1rem" }),
134
+ loading: unenrollPending,
135
+ onConfirm: () => unenroll({}),
136
+ targetProps: { c: "bw", w: 220 },
137
+ confirmProps: { variant: "filled", color: "red" },
138
+ children: "Unenroll TOTP 2FA"
139
+ }
140
+ )
141
+ ] });
142
+ };
143
+ // Annotate the CommonJS export names for ESM import in node:
144
+ 0 && (module.exports = {
145
+ EnrollTotp
146
+ });
147
+ //# sourceMappingURL=totp.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/profile/totp.tsx"],"sourcesContent":["import {\n Button,\n Center,\n Flex,\n Loader,\n Modal,\n Text,\n TextInput,\n} from \"@mantine/core\";\nimport { notifications } from \"@mantine/notifications\";\nimport { Check, RotateCcwKey, Trash } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { ConfirmModal, CopyButton, useManageAuth } from \"../..\";\n\nexport const EnrollTotp = ({\n userInvalidate,\n passkeyEnrolled,\n totpEnrolled,\n}: {\n userInvalidate?: () => void;\n passkeyEnrolled?: boolean;\n totpEnrolled?: boolean;\n}) => {\n const [open, setOpen] = useState(false);\n const [submitted, setSubmitted] = useState<{ uri: string; png: string }>();\n const [confirm, setConfirm] = useState(\"\");\n const [recovery, setRecovery] = useState<string[] | undefined>(undefined);\n\n const { mutate: beginEnrollment } = useManageAuth(\"BeginTotpEnrollment\", {\n onSuccess: ({ uri, png }) => setSubmitted({ uri, png }),\n });\n\n const { mutate: confirmEnrollment, isPending: confirmPending } =\n useManageAuth(\"ConfirmTotpEnrollment\", {\n onSuccess: ({ recovery_codes }) => {\n setRecovery(recovery_codes);\n userInvalidate?.();\n },\n });\n\n const { mutateAsync: unenroll, isPending: unenrollPending } = useManageAuth(\n \"UnenrollTotp\",\n {\n onSuccess: () => {\n userInvalidate?.();\n notifications.show({\n message: \"Unenrolled in TOTP 2FA.\",\n color: \"green\",\n });\n },\n },\n );\n\n const onOpenChange = (open: boolean) => {\n setOpen(open);\n if (open) {\n beginEnrollment({});\n } else {\n setSubmitted(undefined);\n setRecovery(undefined);\n }\n };\n\n return (\n <>\n {!totpEnrolled && !passkeyEnrolled && (\n <>\n <Modal opened={open} onClose={() => onOpenChange(false)}>\n {recovery && (\n <Flex direction=\"column\" gap=\"lg\">\n <Text size=\"lg\">Save recovery keys</Text>\n <Flex direction=\"column\" gap=\"sm\">\n {recovery.map((code) => (\n <TextInput key={code} w={200} value={code} disabled />\n ))}\n </Flex>\n <CopyButton content={recovery.join(\"\\n\")} />\n </Flex>\n )}\n {!recovery && submitted && (\n <Flex direction=\"column\" gap=\"lg\">\n <Text size=\"lg\">\n Scan this QR code with your authenticator app, and enter the 6\n digit code below.\n </Text>\n <Center>\n <img\n width={250}\n height={250}\n src={\"data:image/png;base64,\" + submitted.png}\n alt=\"QRCode\"\n />\n </Center>\n <Flex align=\"center\" justify=\"space-between\" gap=\"sm\">\n URI\n <TextInput w={250} value={submitted.uri} disabled />\n <CopyButton content={submitted.uri} />\n </Flex>\n <Flex align=\"center\" justify=\"space-between\">\n Confirm Code\n <TextInput\n w={250}\n value={confirm}\n onChange={(e) => setConfirm(e.target.value)}\n autoFocus\n />\n </Flex>\n <Flex justify=\"flex-end\">\n <Button\n onClick={() => confirmEnrollment({ code: confirm })}\n disabled={confirm.length !== 6 || confirmPending}\n leftSection={<Check size=\"1rem\" />}\n loading={confirmPending}\n >\n Confirm\n </Button>\n </Flex>\n </Flex>\n )}\n {!recovery && !submitted && (\n <Center>\n <Loader />\n </Center>\n )}\n </Modal>\n <Button\n leftSection={<RotateCcwKey size=\"1rem\" />}\n variant=\"default\"\n onClick={() => onOpenChange(true)}\n w={220}\n >\n Enroll TOTP 2FA\n </Button>\n </>\n )}\n {totpEnrolled && (\n <ConfirmModal\n confirmText=\"Unenroll\"\n icon={<Trash size=\"1rem\" />}\n loading={unenrollPending}\n onConfirm={() => unenroll({})}\n targetProps={{ c: \"bw\", w: 220 }}\n confirmProps={{ variant: \"filled\", color: \"red\" }}\n >\n Unenroll TOTP 2FA\n </ConfirmModal>\n )}\n </>\n );\n};\n"],"mappings":"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","names":["open"]}
@@ -0,0 +1,9 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare const EnrollTotp: ({ userInvalidate, passkeyEnrolled, totpEnrolled, }: {
4
+ userInvalidate?: () => void;
5
+ passkeyEnrolled?: boolean;
6
+ totpEnrolled?: boolean;
7
+ }) => react_jsx_runtime.JSX.Element;
8
+
9
+ export { EnrollTotp };
@@ -0,0 +1,9 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare const EnrollTotp: ({ userInvalidate, passkeyEnrolled, totpEnrolled, }: {
4
+ userInvalidate?: () => void;
5
+ passkeyEnrolled?: boolean;
6
+ totpEnrolled?: boolean;
7
+ }) => react_jsx_runtime.JSX.Element;
8
+
9
+ export { EnrollTotp };
@@ -0,0 +1,131 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import {
3
+ Button,
4
+ Center,
5
+ Flex,
6
+ Loader,
7
+ Modal,
8
+ Text,
9
+ TextInput
10
+ } from "@mantine/core";
11
+ import { notifications } from "@mantine/notifications";
12
+ import { Check, RotateCcwKey, Trash } from "lucide-react";
13
+ import { useState } from "react";
14
+ import { ConfirmModal, CopyButton, useManageAuth } from "../..";
15
+ const EnrollTotp = ({
16
+ userInvalidate,
17
+ passkeyEnrolled,
18
+ totpEnrolled
19
+ }) => {
20
+ const [open, setOpen] = useState(false);
21
+ const [submitted, setSubmitted] = useState();
22
+ const [confirm, setConfirm] = useState("");
23
+ const [recovery, setRecovery] = useState(void 0);
24
+ const { mutate: beginEnrollment } = useManageAuth("BeginTotpEnrollment", {
25
+ onSuccess: ({ uri, png }) => setSubmitted({ uri, png })
26
+ });
27
+ const { mutate: confirmEnrollment, isPending: confirmPending } = useManageAuth("ConfirmTotpEnrollment", {
28
+ onSuccess: ({ recovery_codes }) => {
29
+ setRecovery(recovery_codes);
30
+ userInvalidate?.();
31
+ }
32
+ });
33
+ const { mutateAsync: unenroll, isPending: unenrollPending } = useManageAuth(
34
+ "UnenrollTotp",
35
+ {
36
+ onSuccess: () => {
37
+ userInvalidate?.();
38
+ notifications.show({
39
+ message: "Unenrolled in TOTP 2FA.",
40
+ color: "green"
41
+ });
42
+ }
43
+ }
44
+ );
45
+ const onOpenChange = (open2) => {
46
+ setOpen(open2);
47
+ if (open2) {
48
+ beginEnrollment({});
49
+ } else {
50
+ setSubmitted(void 0);
51
+ setRecovery(void 0);
52
+ }
53
+ };
54
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
55
+ !totpEnrolled && !passkeyEnrolled && /* @__PURE__ */ jsxs(Fragment, { children: [
56
+ /* @__PURE__ */ jsxs(Modal, { opened: open, onClose: () => onOpenChange(false), children: [
57
+ recovery && /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "lg", children: [
58
+ /* @__PURE__ */ jsx(Text, { size: "lg", children: "Save recovery keys" }),
59
+ /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "sm", children: recovery.map((code) => /* @__PURE__ */ jsx(TextInput, { w: 200, value: code, disabled: true }, code)) }),
60
+ /* @__PURE__ */ jsx(CopyButton, { content: recovery.join("\n") })
61
+ ] }),
62
+ !recovery && submitted && /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "lg", children: [
63
+ /* @__PURE__ */ jsx(Text, { size: "lg", children: "Scan this QR code with your authenticator app, and enter the 6 digit code below." }),
64
+ /* @__PURE__ */ jsx(Center, { children: /* @__PURE__ */ jsx(
65
+ "img",
66
+ {
67
+ width: 250,
68
+ height: 250,
69
+ src: "data:image/png;base64," + submitted.png,
70
+ alt: "QRCode"
71
+ }
72
+ ) }),
73
+ /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "space-between", gap: "sm", children: [
74
+ "URI",
75
+ /* @__PURE__ */ jsx(TextInput, { w: 250, value: submitted.uri, disabled: true }),
76
+ /* @__PURE__ */ jsx(CopyButton, { content: submitted.uri })
77
+ ] }),
78
+ /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "space-between", children: [
79
+ "Confirm Code",
80
+ /* @__PURE__ */ jsx(
81
+ TextInput,
82
+ {
83
+ w: 250,
84
+ value: confirm,
85
+ onChange: (e) => setConfirm(e.target.value),
86
+ autoFocus: true
87
+ }
88
+ )
89
+ ] }),
90
+ /* @__PURE__ */ jsx(Flex, { justify: "flex-end", children: /* @__PURE__ */ jsx(
91
+ Button,
92
+ {
93
+ onClick: () => confirmEnrollment({ code: confirm }),
94
+ disabled: confirm.length !== 6 || confirmPending,
95
+ leftSection: /* @__PURE__ */ jsx(Check, { size: "1rem" }),
96
+ loading: confirmPending,
97
+ children: "Confirm"
98
+ }
99
+ ) })
100
+ ] }),
101
+ !recovery && !submitted && /* @__PURE__ */ jsx(Center, { children: /* @__PURE__ */ jsx(Loader, {}) })
102
+ ] }),
103
+ /* @__PURE__ */ jsx(
104
+ Button,
105
+ {
106
+ leftSection: /* @__PURE__ */ jsx(RotateCcwKey, { size: "1rem" }),
107
+ variant: "default",
108
+ onClick: () => onOpenChange(true),
109
+ w: 220,
110
+ children: "Enroll TOTP 2FA"
111
+ }
112
+ )
113
+ ] }),
114
+ totpEnrolled && /* @__PURE__ */ jsx(
115
+ ConfirmModal,
116
+ {
117
+ confirmText: "Unenroll",
118
+ icon: /* @__PURE__ */ jsx(Trash, { size: "1rem" }),
119
+ loading: unenrollPending,
120
+ onConfirm: () => unenroll({}),
121
+ targetProps: { c: "bw", w: 220 },
122
+ confirmProps: { variant: "filled", color: "red" },
123
+ children: "Unenroll TOTP 2FA"
124
+ }
125
+ )
126
+ ] });
127
+ };
128
+ export {
129
+ EnrollTotp
130
+ };
131
+ //# sourceMappingURL=totp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/auth/profile/totp.tsx"],"sourcesContent":["import {\n Button,\n Center,\n Flex,\n Loader,\n Modal,\n Text,\n TextInput,\n} from \"@mantine/core\";\nimport { notifications } from \"@mantine/notifications\";\nimport { Check, RotateCcwKey, Trash } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { ConfirmModal, CopyButton, useManageAuth } from \"../..\";\n\nexport const EnrollTotp = ({\n userInvalidate,\n passkeyEnrolled,\n totpEnrolled,\n}: {\n userInvalidate?: () => void;\n passkeyEnrolled?: boolean;\n totpEnrolled?: boolean;\n}) => {\n const [open, setOpen] = useState(false);\n const [submitted, setSubmitted] = useState<{ uri: string; png: string }>();\n const [confirm, setConfirm] = useState(\"\");\n const [recovery, setRecovery] = useState<string[] | undefined>(undefined);\n\n const { mutate: beginEnrollment } = useManageAuth(\"BeginTotpEnrollment\", {\n onSuccess: ({ uri, png }) => setSubmitted({ uri, png }),\n });\n\n const { mutate: confirmEnrollment, isPending: confirmPending } =\n useManageAuth(\"ConfirmTotpEnrollment\", {\n onSuccess: ({ recovery_codes }) => {\n setRecovery(recovery_codes);\n userInvalidate?.();\n },\n });\n\n const { mutateAsync: unenroll, isPending: unenrollPending } = useManageAuth(\n \"UnenrollTotp\",\n {\n onSuccess: () => {\n userInvalidate?.();\n notifications.show({\n message: \"Unenrolled in TOTP 2FA.\",\n color: \"green\",\n });\n },\n },\n );\n\n const onOpenChange = (open: boolean) => {\n setOpen(open);\n if (open) {\n beginEnrollment({});\n } else {\n setSubmitted(undefined);\n setRecovery(undefined);\n }\n };\n\n return (\n <>\n {!totpEnrolled && !passkeyEnrolled && (\n <>\n <Modal opened={open} onClose={() => onOpenChange(false)}>\n {recovery && (\n <Flex direction=\"column\" gap=\"lg\">\n <Text size=\"lg\">Save recovery keys</Text>\n <Flex direction=\"column\" gap=\"sm\">\n {recovery.map((code) => (\n <TextInput key={code} w={200} value={code} disabled />\n ))}\n </Flex>\n <CopyButton content={recovery.join(\"\\n\")} />\n </Flex>\n )}\n {!recovery && submitted && (\n <Flex direction=\"column\" gap=\"lg\">\n <Text size=\"lg\">\n Scan this QR code with your authenticator app, and enter the 6\n digit code below.\n </Text>\n <Center>\n <img\n width={250}\n height={250}\n src={\"data:image/png;base64,\" + submitted.png}\n alt=\"QRCode\"\n />\n </Center>\n <Flex align=\"center\" justify=\"space-between\" gap=\"sm\">\n URI\n <TextInput w={250} value={submitted.uri} disabled />\n <CopyButton content={submitted.uri} />\n </Flex>\n <Flex align=\"center\" justify=\"space-between\">\n Confirm Code\n <TextInput\n w={250}\n value={confirm}\n onChange={(e) => setConfirm(e.target.value)}\n autoFocus\n />\n </Flex>\n <Flex justify=\"flex-end\">\n <Button\n onClick={() => confirmEnrollment({ code: confirm })}\n disabled={confirm.length !== 6 || confirmPending}\n leftSection={<Check size=\"1rem\" />}\n loading={confirmPending}\n >\n Confirm\n </Button>\n </Flex>\n </Flex>\n )}\n {!recovery && !submitted && (\n <Center>\n <Loader />\n </Center>\n )}\n </Modal>\n <Button\n leftSection={<RotateCcwKey size=\"1rem\" />}\n variant=\"default\"\n onClick={() => onOpenChange(true)}\n w={220}\n >\n Enroll TOTP 2FA\n </Button>\n </>\n )}\n {totpEnrolled && (\n <ConfirmModal\n confirmText=\"Unenroll\"\n icon={<Trash size=\"1rem\" />}\n loading={unenrollPending}\n onConfirm={() => unenroll({})}\n targetProps={{ c: \"bw\", w: 220 }}\n confirmProps={{ variant: \"filled\", color: \"red\" }}\n >\n Unenroll TOTP 2FA\n </ConfirmModal>\n )}\n </>\n );\n};\n"],"mappings":"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","names":["open"]}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var utils_exports = {};
20
+ __export(utils_exports, {
21
+ sanitizeQuery: () => sanitizeQuery,
22
+ sanitizeQueryInner: () => sanitizeQueryInner
23
+ });
24
+ module.exports = __toCommonJS(utils_exports);
25
+ function sanitizeQuery() {
26
+ sanitizeQueryInner(new URLSearchParams(location.search));
27
+ }
28
+ function sanitizeQueryInner(search) {
29
+ search.delete("redeem_ready");
30
+ search.delete("totp");
31
+ search.delete("passkey");
32
+ const query = search.toString();
33
+ location.replace(
34
+ `${location.origin}${location.pathname}${query.length ? "?" + query : ""}`
35
+ );
36
+ }
37
+ // Annotate the CommonJS export names for ESM import in node:
38
+ 0 && (module.exports = {
39
+ sanitizeQuery,
40
+ sanitizeQueryInner
41
+ });
42
+ //# sourceMappingURL=utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/auth/utils.ts"],"sourcesContent":["export function sanitizeQuery() {\n sanitizeQueryInner(new URLSearchParams(location.search));\n}\n\nexport function sanitizeQueryInner(search: URLSearchParams) {\n search.delete(\"redeem_ready\");\n search.delete(\"totp\");\n search.delete(\"passkey\");\n const query = search.toString();\n location.replace(\n `${location.origin}${location.pathname}${query.length ? \"?\" + query : \"\"}`,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,SAAS,gBAAgB;AAC9B,qBAAmB,IAAI,gBAAgB,SAAS,MAAM,CAAC;AACzD;AAEO,SAAS,mBAAmB,QAAyB;AAC1D,SAAO,OAAO,cAAc;AAC5B,SAAO,OAAO,MAAM;AACpB,SAAO,OAAO,SAAS;AACvB,QAAM,QAAQ,OAAO,SAAS;AAC9B,WAAS;AAAA,IACP,GAAG,SAAS,MAAM,GAAG,SAAS,QAAQ,GAAG,MAAM,SAAS,MAAM,QAAQ,EAAE;AAAA,EAC1E;AACF;","names":[]}
@@ -0,0 +1,4 @@
1
+ declare function sanitizeQuery(): void;
2
+ declare function sanitizeQueryInner(search: URLSearchParams): void;
3
+
4
+ export { sanitizeQuery, sanitizeQueryInner };
@@ -0,0 +1,4 @@
1
+ declare function sanitizeQuery(): void;
2
+ declare function sanitizeQueryInner(search: URLSearchParams): void;
3
+
4
+ export { sanitizeQuery, sanitizeQueryInner };
@@ -0,0 +1,17 @@
1
+ function sanitizeQuery() {
2
+ sanitizeQueryInner(new URLSearchParams(location.search));
3
+ }
4
+ function sanitizeQueryInner(search) {
5
+ search.delete("redeem_ready");
6
+ search.delete("totp");
7
+ search.delete("passkey");
8
+ const query = search.toString();
9
+ location.replace(
10
+ `${location.origin}${location.pathname}${query.length ? "?" + query : ""}`
11
+ );
12
+ }
13
+ export {
14
+ sanitizeQuery,
15
+ sanitizeQueryInner
16
+ };
17
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/auth/utils.ts"],"sourcesContent":["export function sanitizeQuery() {\n sanitizeQueryInner(new URLSearchParams(location.search));\n}\n\nexport function sanitizeQueryInner(search: URLSearchParams) {\n search.delete(\"redeem_ready\");\n search.delete(\"totp\");\n search.delete(\"passkey\");\n const query = search.toString();\n location.replace(\n `${location.origin}${location.pathname}${query.length ? \"?\" + query : \"\"}`,\n );\n}\n"],"mappings":"AAAO,SAAS,gBAAgB;AAC9B,qBAAmB,IAAI,gBAAgB,SAAS,MAAM,CAAC;AACzD;AAEO,SAAS,mBAAmB,QAAyB;AAC1D,SAAO,OAAO,cAAc;AAC5B,SAAO,OAAO,MAAM;AACpB,SAAO,OAAO,SAAS;AACvB,QAAM,QAAQ,OAAO,SAAS;AAC9B,WAAS;AAAA,IACP,GAAG,SAAS,MAAM,GAAG,SAAS,QAAQ,GAAG,MAAM,SAAS,MAAM,QAAQ,EAAE;AAAA,EAC1E;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import * as react from 'react';
3
2
  import { ReactNode } from 'react';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { CenterProps } from '@mantine/core';
5
5
 
6
6
  interface PageGuardProps extends CenterProps {
@@ -8,6 +8,6 @@ interface PageGuardProps extends CenterProps {
8
8
  error?: false | string;
9
9
  children?: ReactNode;
10
10
  }
11
- declare function PageGuard({ isPending, error, children, ...centerProps }: PageGuardProps): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
11
+ declare function PageGuard({ isPending, error, children, ...centerProps }: PageGuardProps): string | number | bigint | boolean | react_jsx_runtime.JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
12
12
 
13
13
  export { PageGuard, type PageGuardProps };
@@ -1,6 +1,6 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
1
  import * as react from 'react';
3
2
  import { ReactNode } from 'react';
3
+ import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { CenterProps } from '@mantine/core';
5
5
 
6
6
  interface PageGuardProps extends CenterProps {
@@ -8,6 +8,6 @@ interface PageGuardProps extends CenterProps {
8
8
  error?: false | string;
9
9
  children?: ReactNode;
10
10
  }
11
- declare function PageGuard({ isPending, error, children, ...centerProps }: PageGuardProps): string | number | bigint | boolean | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | react_jsx_runtime.JSX.Element | null | undefined;
11
+ declare function PageGuard({ isPending, error, children, ...centerProps }: PageGuardProps): string | number | bigint | boolean | react_jsx_runtime.JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | react.ReactPortal | react.ReactElement<unknown, string | react.JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
12
12
 
13
13
  export { PageGuard, type PageGuardProps };
@@ -28,7 +28,8 @@ var import_page = require("./page");
28
28
  var import_lucide_react = require("lucide-react");
29
29
  function TabbedPage({
30
30
  storageKey,
31
- tabs
31
+ tabs,
32
+ ...tabsProps
32
33
  }) {
33
34
  const defaultTab = tabs[0]?.tab;
34
35
  const [selectedTab, setSelectedTab] = (0, import_hooks.useLocalStorage)({
@@ -41,6 +42,7 @@ function TabbedPage({
41
42
  {
42
43
  value: selectedTab,
43
44
  onChange: (tab) => setSelectedTab(tab ?? defaultTab),
45
+ ...tabsProps,
44
46
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
45
47
  import_page.Page,
46
48
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/tabbed-page.tsx"],"sourcesContent":["import { Center, Group, Tabs, Text } from \"@mantine/core\";\nimport { useLocalStorage } from \"@mantine/hooks\";\nimport { FC } from \"react\";\nimport { Page } from \"./page\";\nimport { CircleQuestionMark } from \"lucide-react\";\n\nexport type TabbedPageItem<Tab extends string> = {\n tab: Tab;\n icon?: FC<{ size?: string | number }>;\n content?: FC;\n};\n\nexport type TabbedPageProps<Tab extends string> = {\n /** Store current tab on localStorage */\n storageKey: string;\n tabs: TabbedPageItem<Tab>[];\n};\n\nexport function TabbedPage<Tab extends string>({\n storageKey,\n tabs,\n}: TabbedPageProps<Tab>) {\n const defaultTab = tabs[0]?.tab;\n const [selectedTab, setSelectedTab] = useLocalStorage<Tab>({\n key: storageKey,\n defaultValue: defaultTab,\n });\n const Content =\n tabs.find((tab) => tab.tab === selectedTab)?.content ??\n (() => (\n <Center>\n <CircleQuestionMark size={22} />\n </Center>\n ));\n return (\n <Tabs\n value={selectedTab}\n onChange={(tab) => setSelectedTab((tab as Tab) ?? defaultTab)}\n >\n <Page\n customTitle={\n <Tabs.List>\n {tabs.map(({ tab, icon }) => {\n const Icon = icon ?? CircleQuestionMark;\n return (\n <Tabs.Tab key={tab} value={tab}>\n <Group opacity={tab === selectedTab ? 1 : 0.6}>\n <Icon size={20} />\n <Text fz=\"h3\">{tab}</Text>\n </Group>\n </Tabs.Tab>\n );\n })}\n </Tabs.List>\n }\n >\n <Content />\n </Page>\n </Tabs>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BQ;AA/BR,kBAA0C;AAC1C,mBAAgC;AAEhC,kBAAqB;AACrB,0BAAmC;AAc5B,SAAS,WAA+B;AAAA,EAC7C;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,aAAa,KAAK,CAAC,GAAG;AAC5B,QAAM,CAAC,aAAa,cAAc,QAAI,8BAAqB;AAAA,IACzD,KAAK;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,UACJ,KAAK,KAAK,CAAC,QAAQ,IAAI,QAAQ,WAAW,GAAG,YAC5C,MACC,4CAAC,sBACC,sDAAC,0CAAmB,MAAM,IAAI,GAChC;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,UAAU,CAAC,QAAQ,eAAgB,OAAe,UAAU;AAAA,MAE5D;AAAA,QAAC;AAAA;AAAA,UACC,aACE,4CAAC,iBAAK,MAAL,EACE,eAAK,IAAI,CAAC,EAAE,KAAK,KAAK,MAAM;AAC3B,kBAAM,OAAO,QAAQ;AACrB,mBACE,4CAAC,iBAAK,KAAL,EAAmB,OAAO,KACzB,uDAAC,qBAAM,SAAS,QAAQ,cAAc,IAAI,KACxC;AAAA,0DAAC,QAAK,MAAM,IAAI;AAAA,cAChB,4CAAC,oBAAK,IAAG,MAAM,eAAI;AAAA,eACrB,KAJa,GAKf;AAAA,UAEJ,CAAC,GACH;AAAA,UAGF,sDAAC,WAAQ;AAAA;AAAA,MACX;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/tabbed-page.tsx"],"sourcesContent":["import {\n Center,\n DefaultMantineColor,\n Group,\n Tabs,\n TabsProps,\n Text,\n} from \"@mantine/core\";\nimport { useLocalStorage } from \"@mantine/hooks\";\nimport { FC } from \"react\";\nimport { Page } from \"./page\";\nimport { CircleQuestionMark } from \"lucide-react\";\n\nexport type TabbedPageItem<Tab extends string> = {\n tab: Tab;\n icon?: FC<{ size?: string | number }>;\n content?: FC;\n};\n\nexport interface TabbedPageProps<Tab extends string> extends TabsProps {\n /** Store current tab on localStorage */\n storageKey: string;\n tabs: TabbedPageItem<Tab>[];\n}\n\nexport function TabbedPage<Tab extends string>({\n storageKey,\n tabs,\n ...tabsProps\n}: TabbedPageProps<Tab>) {\n const defaultTab = tabs[0]?.tab;\n const [selectedTab, setSelectedTab] = useLocalStorage<Tab>({\n key: storageKey,\n defaultValue: defaultTab,\n });\n const Content =\n tabs.find((tab) => tab.tab === selectedTab)?.content ??\n (() => (\n <Center>\n <CircleQuestionMark size={22} />\n </Center>\n ));\n return (\n <Tabs\n value={selectedTab}\n onChange={(tab) => setSelectedTab((tab as Tab) ?? defaultTab)}\n {...tabsProps}\n >\n <Page\n customTitle={\n <Tabs.List>\n {tabs.map(({ tab, icon }) => {\n const Icon = icon ?? CircleQuestionMark;\n return (\n <Tabs.Tab key={tab} value={tab}>\n <Group opacity={tab === selectedTab ? 1 : 0.6}>\n <Icon size={20} />\n <Text fz=\"h3\">{tab}</Text>\n </Group>\n </Tabs.Tab>\n );\n })}\n </Tabs.List>\n }\n >\n <Content />\n </Page>\n </Tabs>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCQ;AAvCR,kBAOO;AACP,mBAAgC;AAEhC,kBAAqB;AACrB,0BAAmC;AAc5B,SAAS,WAA+B;AAAA,EAC7C;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAyB;AACvB,QAAM,aAAa,KAAK,CAAC,GAAG;AAC5B,QAAM,CAAC,aAAa,cAAc,QAAI,8BAAqB;AAAA,IACzD,KAAK;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,UACJ,KAAK,KAAK,CAAC,QAAQ,IAAI,QAAQ,WAAW,GAAG,YAC5C,MACC,4CAAC,sBACC,sDAAC,0CAAmB,MAAM,IAAI,GAChC;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,UAAU,CAAC,QAAQ,eAAgB,OAAe,UAAU;AAAA,MAC3D,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACC,aACE,4CAAC,iBAAK,MAAL,EACE,eAAK,IAAI,CAAC,EAAE,KAAK,KAAK,MAAM;AAC3B,kBAAM,OAAO,QAAQ;AACrB,mBACE,4CAAC,iBAAK,KAAL,EAAmB,OAAO,KACzB,uDAAC,qBAAM,SAAS,QAAQ,cAAc,IAAI,KACxC;AAAA,0DAAC,QAAK,MAAM,IAAI;AAAA,cAChB,4CAAC,oBAAK,IAAG,MAAM,eAAI;AAAA,eACrB,KAJa,GAKf;AAAA,UAEJ,CAAC,GACH;AAAA,UAGF,sDAAC,WAAQ;AAAA;AAAA,MACX;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1,4 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { TabsProps } from '@mantine/core';
2
3
  import { FC } from 'react';
3
4
 
4
5
  type TabbedPageItem<Tab extends string> = {
@@ -8,11 +9,11 @@ type TabbedPageItem<Tab extends string> = {
8
9
  }>;
9
10
  content?: FC;
10
11
  };
11
- type TabbedPageProps<Tab extends string> = {
12
+ interface TabbedPageProps<Tab extends string> extends TabsProps {
12
13
  /** Store current tab on localStorage */
13
14
  storageKey: string;
14
15
  tabs: TabbedPageItem<Tab>[];
15
- };
16
- declare function TabbedPage<Tab extends string>({ storageKey, tabs, }: TabbedPageProps<Tab>): react_jsx_runtime.JSX.Element;
16
+ }
17
+ declare function TabbedPage<Tab extends string>({ storageKey, tabs, ...tabsProps }: TabbedPageProps<Tab>): react_jsx_runtime.JSX.Element;
17
18
 
18
19
  export { TabbedPage, type TabbedPageItem, type TabbedPageProps };
@@ -1,4 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import { TabsProps } from '@mantine/core';
2
3
  import { FC } from 'react';
3
4
 
4
5
  type TabbedPageItem<Tab extends string> = {
@@ -8,11 +9,11 @@ type TabbedPageItem<Tab extends string> = {
8
9
  }>;
9
10
  content?: FC;
10
11
  };
11
- type TabbedPageProps<Tab extends string> = {
12
+ interface TabbedPageProps<Tab extends string> extends TabsProps {
12
13
  /** Store current tab on localStorage */
13
14
  storageKey: string;
14
15
  tabs: TabbedPageItem<Tab>[];
15
- };
16
- declare function TabbedPage<Tab extends string>({ storageKey, tabs, }: TabbedPageProps<Tab>): react_jsx_runtime.JSX.Element;
16
+ }
17
+ declare function TabbedPage<Tab extends string>({ storageKey, tabs, ...tabsProps }: TabbedPageProps<Tab>): react_jsx_runtime.JSX.Element;
17
18
 
18
19
  export { TabbedPage, type TabbedPageItem, type TabbedPageProps };
@@ -1,11 +1,17 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
- import { Center, Group, Tabs, Text } from "@mantine/core";
2
+ import {
3
+ Center,
4
+ Group,
5
+ Tabs,
6
+ Text
7
+ } from "@mantine/core";
3
8
  import { useLocalStorage } from "@mantine/hooks";
4
9
  import { Page } from "./page";
5
10
  import { CircleQuestionMark } from "lucide-react";
6
11
  function TabbedPage({
7
12
  storageKey,
8
- tabs
13
+ tabs,
14
+ ...tabsProps
9
15
  }) {
10
16
  const defaultTab = tabs[0]?.tab;
11
17
  const [selectedTab, setSelectedTab] = useLocalStorage({
@@ -18,6 +24,7 @@ function TabbedPage({
18
24
  {
19
25
  value: selectedTab,
20
26
  onChange: (tab) => setSelectedTab(tab ?? defaultTab),
27
+ ...tabsProps,
21
28
  children: /* @__PURE__ */ jsx(
22
29
  Page,
23
30
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/tabbed-page.tsx"],"sourcesContent":["import { Center, Group, Tabs, Text } from \"@mantine/core\";\nimport { useLocalStorage } from \"@mantine/hooks\";\nimport { FC } from \"react\";\nimport { Page } from \"./page\";\nimport { CircleQuestionMark } from \"lucide-react\";\n\nexport type TabbedPageItem<Tab extends string> = {\n tab: Tab;\n icon?: FC<{ size?: string | number }>;\n content?: FC;\n};\n\nexport type TabbedPageProps<Tab extends string> = {\n /** Store current tab on localStorage */\n storageKey: string;\n tabs: TabbedPageItem<Tab>[];\n};\n\nexport function TabbedPage<Tab extends string>({\n storageKey,\n tabs,\n}: TabbedPageProps<Tab>) {\n const defaultTab = tabs[0]?.tab;\n const [selectedTab, setSelectedTab] = useLocalStorage<Tab>({\n key: storageKey,\n defaultValue: defaultTab,\n });\n const Content =\n tabs.find((tab) => tab.tab === selectedTab)?.content ??\n (() => (\n <Center>\n <CircleQuestionMark size={22} />\n </Center>\n ));\n return (\n <Tabs\n value={selectedTab}\n onChange={(tab) => setSelectedTab((tab as Tab) ?? defaultTab)}\n >\n <Page\n customTitle={\n <Tabs.List>\n {tabs.map(({ tab, icon }) => {\n const Icon = icon ?? CircleQuestionMark;\n return (\n <Tabs.Tab key={tab} value={tab}>\n <Group opacity={tab === selectedTab ? 1 : 0.6}>\n <Icon size={20} />\n <Text fz=\"h3\">{tab}</Text>\n </Group>\n </Tabs.Tab>\n );\n })}\n </Tabs.List>\n }\n >\n <Content />\n </Page>\n </Tabs>\n );\n}\n"],"mappings":"AA+BQ,cAeU,YAfV;AA/BR,SAAS,QAAQ,OAAO,MAAM,YAAY;AAC1C,SAAS,uBAAuB;AAEhC,SAAS,YAAY;AACrB,SAAS,0BAA0B;AAc5B,SAAS,WAA+B;AAAA,EAC7C;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,aAAa,KAAK,CAAC,GAAG;AAC5B,QAAM,CAAC,aAAa,cAAc,IAAI,gBAAqB;AAAA,IACzD,KAAK;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,UACJ,KAAK,KAAK,CAAC,QAAQ,IAAI,QAAQ,WAAW,GAAG,YAC5C,MACC,oBAAC,UACC,8BAAC,sBAAmB,MAAM,IAAI,GAChC;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,UAAU,CAAC,QAAQ,eAAgB,OAAe,UAAU;AAAA,MAE5D;AAAA,QAAC;AAAA;AAAA,UACC,aACE,oBAAC,KAAK,MAAL,EACE,eAAK,IAAI,CAAC,EAAE,KAAK,KAAK,MAAM;AAC3B,kBAAM,OAAO,QAAQ;AACrB,mBACE,oBAAC,KAAK,KAAL,EAAmB,OAAO,KACzB,+BAAC,SAAM,SAAS,QAAQ,cAAc,IAAI,KACxC;AAAA,kCAAC,QAAK,MAAM,IAAI;AAAA,cAChB,oBAAC,QAAK,IAAG,MAAM,eAAI;AAAA,eACrB,KAJa,GAKf;AAAA,UAEJ,CAAC,GACH;AAAA,UAGF,8BAAC,WAAQ;AAAA;AAAA,MACX;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../src/components/tabbed-page.tsx"],"sourcesContent":["import {\n Center,\n DefaultMantineColor,\n Group,\n Tabs,\n TabsProps,\n Text,\n} from \"@mantine/core\";\nimport { useLocalStorage } from \"@mantine/hooks\";\nimport { FC } from \"react\";\nimport { Page } from \"./page\";\nimport { CircleQuestionMark } from \"lucide-react\";\n\nexport type TabbedPageItem<Tab extends string> = {\n tab: Tab;\n icon?: FC<{ size?: string | number }>;\n content?: FC;\n};\n\nexport interface TabbedPageProps<Tab extends string> extends TabsProps {\n /** Store current tab on localStorage */\n storageKey: string;\n tabs: TabbedPageItem<Tab>[];\n}\n\nexport function TabbedPage<Tab extends string>({\n storageKey,\n tabs,\n ...tabsProps\n}: TabbedPageProps<Tab>) {\n const defaultTab = tabs[0]?.tab;\n const [selectedTab, setSelectedTab] = useLocalStorage<Tab>({\n key: storageKey,\n defaultValue: defaultTab,\n });\n const Content =\n tabs.find((tab) => tab.tab === selectedTab)?.content ??\n (() => (\n <Center>\n <CircleQuestionMark size={22} />\n </Center>\n ));\n return (\n <Tabs\n value={selectedTab}\n onChange={(tab) => setSelectedTab((tab as Tab) ?? defaultTab)}\n {...tabsProps}\n >\n <Page\n customTitle={\n <Tabs.List>\n {tabs.map(({ tab, icon }) => {\n const Icon = icon ?? CircleQuestionMark;\n return (\n <Tabs.Tab key={tab} value={tab}>\n <Group opacity={tab === selectedTab ? 1 : 0.6}>\n <Icon size={20} />\n <Text fz=\"h3\">{tab}</Text>\n </Group>\n </Tabs.Tab>\n );\n })}\n </Tabs.List>\n }\n >\n <Content />\n </Page>\n </Tabs>\n );\n}\n"],"mappings":"AAuCQ,cAgBU,YAhBV;AAvCR;AAAA,EACE;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,uBAAuB;AAEhC,SAAS,YAAY;AACrB,SAAS,0BAA0B;AAc5B,SAAS,WAA+B;AAAA,EAC7C;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAyB;AACvB,QAAM,aAAa,KAAK,CAAC,GAAG;AAC5B,QAAM,CAAC,aAAa,cAAc,IAAI,gBAAqB;AAAA,IACzD,KAAK;AAAA,IACL,cAAc;AAAA,EAChB,CAAC;AACD,QAAM,UACJ,KAAK,KAAK,CAAC,QAAQ,IAAI,QAAQ,WAAW,GAAG,YAC5C,MACC,oBAAC,UACC,8BAAC,sBAAmB,MAAM,IAAI,GAChC;AAEJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,MACP,UAAU,CAAC,QAAQ,eAAgB,OAAe,UAAU;AAAA,MAC3D,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACC,aACE,oBAAC,KAAK,MAAL,EACE,eAAK,IAAI,CAAC,EAAE,KAAK,KAAK,MAAM;AAC3B,kBAAM,OAAO,QAAQ;AACrB,mBACE,oBAAC,KAAK,KAAL,EAAmB,OAAO,KACzB,+BAAC,SAAM,SAAS,QAAQ,cAAc,IAAI,KACxC;AAAA,kCAAC,QAAK,MAAM,IAAI;AAAA,cAChB,oBAAC,QAAK,IAAG,MAAM,eAAI;AAAA,eACrB,KAJa,GAKf;AAAA,UAEJ,CAAC,GACH;AAAA,UAGF,8BAAC,WAAQ;AAAA;AAAA,MACX;AAAA;AAAA,EACF;AAEJ;","names":[]}
package/dist/index.cjs CHANGED
@@ -15,6 +15,7 @@ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "defau
15
15
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
16
  var index_exports = {};
17
17
  module.exports = __toCommonJS(index_exports);
18
+ __reExport(index_exports, require("./auth"), module.exports);
18
19
  __reExport(index_exports, require("./color"), module.exports);
19
20
  __reExport(index_exports, require("./formatting"), module.exports);
20
21
  __reExport(index_exports, require("./hooks"), module.exports);
@@ -56,6 +57,7 @@ __reExport(index_exports, require("./components/text-update-modal"), module.expo
56
57
  __reExport(index_exports, require("./components/theme-toggle"), module.exports);
57
58
  // Annotate the CommonJS export names for ESM import in node:
58
59
  0 && (module.exports = {
60
+ ...require("./auth"),
59
61
  ...require("./color"),
60
62
  ...require("./formatting"),
61
63
  ...require("./hooks"),
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"./color\";\nexport * from \"./formatting\";\nexport * from \"./hooks\";\nexport * from \"./theme\";\nexport * from \"./components/config\";\nexport * from \"./components/divided-children\";\nexport * from \"./components/fancy-card\";\nexport * from \"./components/monaco\";\nexport * from \"./components/back-button\";\nexport * from \"./components/confirm-button\";\nexport * from \"./components/confirm-icon\";\nexport * from \"./components/confirm-modal\";\nexport * from \"./components/copy-button\";\nexport * from \"./components/copy-text\";\nexport * from \"./components/create-modal\";\nexport * from \"./components/data-table\";\nexport * from \"./components/enable-switch\";\nexport * from \"./components/entity-header\";\nexport * from \"./components/entity-page\";\nexport * from \"./components/hover-error\";\nexport * from \"./components/info-card\";\nexport * from \"./components/input-list\";\nexport * from \"./components/labelled-switch\";\nexport * from \"./components/labels-group\";\nexport * from \"./components/loading-screen\";\nexport * from \"./components/mobile-friendly-tabs\";\nexport * from \"./components/page-guard\";\nexport * from \"./components/page\";\nexport * from \"./components/search-input\";\nexport * from \"./components/section\";\nexport * from \"./components/shared-text-update\";\nexport * from \"./components/show-hide-button\";\nexport * from \"./components/stat-bar\";\nexport * from \"./components/stat-cell\";\nexport * from \"./components/status-badge\";\nexport * from \"./components/tabbed-page\";\nexport * from \"./components/table-skeleton\";\nexport * from \"./components/text-update-modal\";\nexport * from \"./components/theme-toggle\";\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,oBAAd;AACA,0BAAc,yBADd;AAEA,0BAAc,oBAFd;AAGA,0BAAc,oBAHd;AAIA,0BAAc,gCAJd;AAKA,0BAAc,0CALd;AAMA,0BAAc,oCANd;AAOA,0BAAc,gCAPd;AAQA,0BAAc,qCARd;AASA,0BAAc,wCATd;AAUA,0BAAc,sCAVd;AAWA,0BAAc,uCAXd;AAYA,0BAAc,qCAZd;AAaA,0BAAc,mCAbd;AAcA,0BAAc,sCAdd;AAeA,0BAAc,oCAfd;AAgBA,0BAAc,uCAhBd;AAiBA,0BAAc,uCAjBd;AAkBA,0BAAc,qCAlBd;AAmBA,0BAAc,qCAnBd;AAoBA,0BAAc,mCApBd;AAqBA,0BAAc,oCArBd;AAsBA,0BAAc,yCAtBd;AAuBA,0BAAc,sCAvBd;AAwBA,0BAAc,wCAxBd;AAyBA,0BAAc,8CAzBd;AA0BA,0BAAc,oCA1Bd;AA2BA,0BAAc,8BA3Bd;AA4BA,0BAAc,sCA5Bd;AA6BA,0BAAc,iCA7Bd;AA8BA,0BAAc,4CA9Bd;AA+BA,0BAAc,0CA/Bd;AAgCA,0BAAc,kCAhCd;AAiCA,0BAAc,mCAjCd;AAkCA,0BAAc,sCAlCd;AAmCA,0BAAc,qCAnCd;AAoCA,0BAAc,wCApCd;AAqCA,0BAAc,2CArCd;AAsCA,0BAAc,sCAtCd;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from \"./auth\";\nexport * from \"./color\";\nexport * from \"./formatting\";\nexport * from \"./hooks\";\nexport * from \"./theme\";\nexport * from \"./components/config\";\nexport * from \"./components/divided-children\";\nexport * from \"./components/fancy-card\";\nexport * from \"./components/monaco\";\nexport * from \"./components/back-button\";\nexport * from \"./components/confirm-button\";\nexport * from \"./components/confirm-icon\";\nexport * from \"./components/confirm-modal\";\nexport * from \"./components/copy-button\";\nexport * from \"./components/copy-text\";\nexport * from \"./components/create-modal\";\nexport * from \"./components/data-table\";\nexport * from \"./components/enable-switch\";\nexport * from \"./components/entity-header\";\nexport * from \"./components/entity-page\";\nexport * from \"./components/hover-error\";\nexport * from \"./components/info-card\";\nexport * from \"./components/input-list\";\nexport * from \"./components/labelled-switch\";\nexport * from \"./components/labels-group\";\nexport * from \"./components/loading-screen\";\nexport * from \"./components/mobile-friendly-tabs\";\nexport * from \"./components/page-guard\";\nexport * from \"./components/page\";\nexport * from \"./components/search-input\";\nexport * from \"./components/section\";\nexport * from \"./components/shared-text-update\";\nexport * from \"./components/show-hide-button\";\nexport * from \"./components/stat-bar\";\nexport * from \"./components/stat-cell\";\nexport * from \"./components/status-badge\";\nexport * from \"./components/tabbed-page\";\nexport * from \"./components/table-skeleton\";\nexport * from \"./components/text-update-modal\";\nexport * from \"./components/theme-toggle\";\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAc,mBAAd;AACA,0BAAc,oBADd;AAEA,0BAAc,yBAFd;AAGA,0BAAc,oBAHd;AAIA,0BAAc,oBAJd;AAKA,0BAAc,gCALd;AAMA,0BAAc,0CANd;AAOA,0BAAc,oCAPd;AAQA,0BAAc,gCARd;AASA,0BAAc,qCATd;AAUA,0BAAc,wCAVd;AAWA,0BAAc,sCAXd;AAYA,0BAAc,uCAZd;AAaA,0BAAc,qCAbd;AAcA,0BAAc,mCAdd;AAeA,0BAAc,sCAfd;AAgBA,0BAAc,oCAhBd;AAiBA,0BAAc,uCAjBd;AAkBA,0BAAc,uCAlBd;AAmBA,0BAAc,qCAnBd;AAoBA,0BAAc,qCApBd;AAqBA,0BAAc,mCArBd;AAsBA,0BAAc,oCAtBd;AAuBA,0BAAc,yCAvBd;AAwBA,0BAAc,sCAxBd;AAyBA,0BAAc,wCAzBd;AA0BA,0BAAc,8CA1Bd;AA2BA,0BAAc,oCA3Bd;AA4BA,0BAAc,8BA5Bd;AA6BA,0BAAc,sCA7Bd;AA8BA,0BAAc,iCA9Bd;AA+BA,0BAAc,4CA/Bd;AAgCA,0BAAc,0CAhCd;AAiCA,0BAAc,kCAjCd;AAkCA,0BAAc,mCAlCd;AAmCA,0BAAc,sCAnCd;AAoCA,0BAAc,qCApCd;AAqCA,0BAAc,wCArCd;AAsCA,0BAAc,2CAtCd;AAuCA,0BAAc,sCAvCd;","names":[]}