@alepha/ui 0.11.3 → 0.11.4

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 (44) hide show
  1. package/dist/AlephaMantineProvider-CtIV-8MV.mjs +150 -0
  2. package/dist/AlephaMantineProvider-CtIV-8MV.mjs.map +1 -0
  3. package/dist/AlephaMantineProvider-D-vu9aCD.mjs +3 -0
  4. package/dist/{index.d.ts → index.d.mts} +290 -226
  5. package/dist/index.d.mts.map +1 -0
  6. package/dist/{index.js → index.mjs} +651 -730
  7. package/dist/index.mjs.map +1 -0
  8. package/package.json +14 -12
  9. package/src/RootRouter.ts +1 -1
  10. package/src/components/buttons/ActionButton.tsx +542 -0
  11. package/src/components/buttons/BurgerButton.tsx +20 -0
  12. package/src/components/{DarkModeButton.tsx → buttons/DarkModeButton.tsx} +27 -14
  13. package/src/components/buttons/LanguageButton.tsx +28 -0
  14. package/src/components/buttons/OmnibarButton.tsx +32 -0
  15. package/src/components/buttons/ToggleSidebarButton.tsx +28 -0
  16. package/src/components/dialogs/AlertDialog.tsx +10 -10
  17. package/src/components/dialogs/ConfirmDialog.tsx +18 -18
  18. package/src/components/dialogs/PromptDialog.tsx +5 -3
  19. package/src/components/{Control.tsx → form/Control.tsx} +6 -3
  20. package/src/components/{ControlDate.tsx → form/ControlDate.tsx} +4 -1
  21. package/src/components/{ControlSelect.tsx → form/ControlSelect.tsx} +4 -1
  22. package/src/components/{TypeForm.tsx → form/TypeForm.tsx} +8 -6
  23. package/src/components/layout/AdminShell.tsx +97 -0
  24. package/src/components/{AlephaMantineProvider.tsx → layout/AlephaMantineProvider.tsx} +30 -10
  25. package/src/components/layout/AppBar.tsx +133 -0
  26. package/src/components/layout/Omnibar.tsx +43 -0
  27. package/src/components/layout/Sidebar.tsx +410 -0
  28. package/src/components/table/DataTable.tsx +63 -0
  29. package/src/constants/ui.ts +8 -0
  30. package/src/index.ts +89 -24
  31. package/src/services/DialogService.tsx +13 -32
  32. package/src/services/ToastService.tsx +16 -4
  33. package/src/utils/parseInput.ts +1 -1
  34. package/dist/AlephaMantineProvider-DDbIijPF.js +0 -96
  35. package/dist/AlephaMantineProvider-DDbIijPF.js.map +0 -1
  36. package/dist/AlephaMantineProvider-pOu8hOzK.js +0 -3
  37. package/dist/index.d.ts.map +0 -1
  38. package/dist/index.js.map +0 -1
  39. package/src/components/Action.tsx +0 -345
  40. package/src/components/DataTable.css +0 -199
  41. package/src/components/DataTable.tsx +0 -724
  42. package/src/components/Omnibar.tsx +0 -77
  43. package/src/components/Sidebar.css +0 -217
  44. package/src/components/Sidebar.tsx +0 -255
@@ -29,7 +29,10 @@ export class ToastService {
29
29
  });
30
30
  }
31
31
 
32
- public info(options: Partial<NotificationData>) {
32
+ public info(options: Partial<NotificationData> | string) {
33
+ if (typeof options === "string") {
34
+ options = { message: options };
35
+ }
33
36
  this.show({
34
37
  color: "blue",
35
38
  icon: <IconInfoCircle size={20} />,
@@ -39,7 +42,10 @@ export class ToastService {
39
42
  });
40
43
  }
41
44
 
42
- public success(options: Partial<NotificationData>) {
45
+ public success(options: Partial<NotificationData> | string) {
46
+ if (typeof options === "string") {
47
+ options = { message: options };
48
+ }
43
49
  this.show({
44
50
  color: "green",
45
51
  icon: <IconCheck size={16} />,
@@ -49,7 +55,10 @@ export class ToastService {
49
55
  });
50
56
  }
51
57
 
52
- public warning(options: Partial<NotificationData>) {
58
+ public warning(options: Partial<NotificationData> | string) {
59
+ if (typeof options === "string") {
60
+ options = { message: options };
61
+ }
53
62
  this.show({
54
63
  color: "yellow",
55
64
  icon: <IconAlertTriangle size={20} />,
@@ -59,7 +68,10 @@ export class ToastService {
59
68
  });
60
69
  }
61
70
 
62
- public danger(options: Partial<NotificationData>) {
71
+ public danger(options: Partial<NotificationData> | string) {
72
+ if (typeof options === "string") {
73
+ options = { message: options };
74
+ }
63
75
  this.show({
64
76
  color: "red",
65
77
  icon: <IconX size={20} />,
@@ -1,7 +1,7 @@
1
1
  import { type TObject, TypeBoxError } from "@alepha/core";
2
2
  import type { InputField } from "@alepha/react-form";
3
3
  import type { ReactNode } from "react";
4
- import type { ControlProps } from "../components/Control.tsx";
4
+ import type { ControlProps } from "../components/form/Control.tsx";
5
5
  import { getDefaultIcon } from "./icons.tsx";
6
6
  import { prettyName } from "./string.ts";
7
7
 
@@ -1,96 +0,0 @@
1
- import { NestedView, useRouterEvents } from "@alepha/react";
2
- import { ModalsProvider } from "@mantine/modals";
3
- import { ColorSchemeScript, MantineProvider } from "@mantine/core";
4
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
- import React from "react";
6
- import { Notifications } from "@mantine/notifications";
7
- import { IconDashboard, IconFileText, IconHome, IconSearch, IconSettings, IconUser } from "@tabler/icons-react";
8
- import { NavigationProgress, nprogress } from "@mantine/nprogress";
9
- import { Spotlight } from "@mantine/spotlight";
10
-
11
- //#region src/components/Omnibar.tsx
12
- const defaultActions = [
13
- {
14
- id: "home",
15
- label: "Home",
16
- description: "Go to home page",
17
- onClick: () => console.log("Home"),
18
- leftSection: /* @__PURE__ */ jsx(IconHome, { size: 20 })
19
- },
20
- {
21
- id: "dashboard",
22
- label: "Dashboard",
23
- description: "View your dashboard",
24
- onClick: () => console.log("Dashboard"),
25
- leftSection: /* @__PURE__ */ jsx(IconDashboard, { size: 20 })
26
- },
27
- {
28
- id: "documents",
29
- label: "Documents",
30
- description: "Browse all documents",
31
- onClick: () => console.log("Documents"),
32
- leftSection: /* @__PURE__ */ jsx(IconFileText, { size: 20 })
33
- },
34
- {
35
- id: "profile",
36
- label: "Profile",
37
- description: "View and edit your profile",
38
- onClick: () => console.log("Profile"),
39
- leftSection: /* @__PURE__ */ jsx(IconUser, { size: 20 })
40
- },
41
- {
42
- id: "settings",
43
- label: "Settings",
44
- description: "Manage application settings",
45
- onClick: () => console.log("Settings"),
46
- leftSection: /* @__PURE__ */ jsx(IconSettings, { size: 20 })
47
- }
48
- ];
49
- const Omnibar = (props) => {
50
- const actions = props.actions ?? defaultActions;
51
- const shortcut = props.shortcut ?? "mod+K";
52
- const searchPlaceholder = props.searchPlaceholder ?? "Search...";
53
- const nothingFound = props.nothingFound ?? "Nothing found...";
54
- return /* @__PURE__ */ jsx(Spotlight, {
55
- actions,
56
- shortcut,
57
- searchProps: {
58
- leftSection: /* @__PURE__ */ jsx(IconSearch, { size: 20 }),
59
- placeholder: searchPlaceholder
60
- },
61
- nothingFound
62
- });
63
- };
64
- var Omnibar_default = Omnibar;
65
-
66
- //#endregion
67
- //#region src/components/AlephaMantineProvider.tsx
68
- const AlephaMantineProvider = (props) => {
69
- useRouterEvents({
70
- onBegin: () => {
71
- nprogress.start();
72
- },
73
- onEnd: () => {
74
- nprogress.complete();
75
- }
76
- });
77
- return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(ColorSchemeScript, {
78
- defaultColorScheme: props.mantine?.defaultColorScheme,
79
- ...props.colorSchemeScript
80
- }), /* @__PURE__ */ jsxs(MantineProvider, {
81
- ...props.mantine,
82
- children: [
83
- /* @__PURE__ */ jsx(Notifications, { ...props.notifications }),
84
- /* @__PURE__ */ jsx(NavigationProgress, { ...props.navigationProgress }),
85
- /* @__PURE__ */ jsxs(ModalsProvider, {
86
- ...props.modals,
87
- children: [/* @__PURE__ */ jsx(Omnibar_default, { ...props.omnibar }), props.children ?? /* @__PURE__ */ jsx(NestedView, {})]
88
- })
89
- ]
90
- })] });
91
- };
92
- var AlephaMantineProvider_default = AlephaMantineProvider;
93
-
94
- //#endregion
95
- export { Omnibar_default as n, AlephaMantineProvider_default as t };
96
- //# sourceMappingURL=AlephaMantineProvider-DDbIijPF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AlephaMantineProvider-DDbIijPF.js","names":["defaultActions: SpotlightActionData[]","Omnibar"],"sources":["../src/components/Omnibar.tsx","../src/components/AlephaMantineProvider.tsx"],"sourcesContent":["import { Spotlight, type SpotlightActionData } from \"@mantine/spotlight\";\nimport {\n IconDashboard,\n IconFileText,\n IconHome,\n IconSearch,\n IconSettings,\n IconUser,\n} from \"@tabler/icons-react\";\n// biome-ignore lint/correctness/noUnusedImports: required\nimport React, { type ReactNode } from \"react\";\n\nexport interface OmnibarProps {\n actions?: SpotlightActionData[];\n shortcut?: string | string[];\n searchPlaceholder?: string;\n nothingFound?: ReactNode;\n}\n\nconst defaultActions: SpotlightActionData[] = [\n {\n id: \"home\",\n label: \"Home\",\n description: \"Go to home page\",\n onClick: () => console.log(\"Home\"),\n leftSection: <IconHome size={20} />,\n },\n {\n id: \"dashboard\",\n label: \"Dashboard\",\n description: \"View your dashboard\",\n onClick: () => console.log(\"Dashboard\"),\n leftSection: <IconDashboard size={20} />,\n },\n {\n id: \"documents\",\n label: \"Documents\",\n description: \"Browse all documents\",\n onClick: () => console.log(\"Documents\"),\n leftSection: <IconFileText size={20} />,\n },\n {\n id: \"profile\",\n label: \"Profile\",\n description: \"View and edit your profile\",\n onClick: () => console.log(\"Profile\"),\n leftSection: <IconUser size={20} />,\n },\n {\n id: \"settings\",\n label: \"Settings\",\n description: \"Manage application settings\",\n onClick: () => console.log(\"Settings\"),\n leftSection: <IconSettings size={20} />,\n },\n];\n\nconst Omnibar = (props: OmnibarProps) => {\n const actions = props.actions ?? defaultActions;\n const shortcut = props.shortcut ?? \"mod+K\";\n const searchPlaceholder = props.searchPlaceholder ?? \"Search...\";\n const nothingFound = props.nothingFound ?? \"Nothing found...\";\n\n return (\n <Spotlight\n actions={actions}\n shortcut={shortcut}\n searchProps={{\n leftSection: <IconSearch size={20} />,\n placeholder: searchPlaceholder,\n }}\n nothingFound={nothingFound}\n />\n );\n};\n\nexport default Omnibar;\n","import { NestedView, useRouterEvents } from \"@alepha/react\";\nimport type {\n ColorSchemeScriptProps,\n MantineProviderProps,\n} from \"@mantine/core\";\nimport { ColorSchemeScript, MantineProvider } from \"@mantine/core\";\nimport { ModalsProvider, type ModalsProviderProps } from \"@mantine/modals\";\nimport { Notifications, type NotificationsProps } from \"@mantine/notifications\";\nimport type { NavigationProgressProps } from \"@mantine/nprogress\";\nimport { NavigationProgress, nprogress } from \"@mantine/nprogress\";\nimport type { ReactNode } from \"react\";\nimport Omnibar, { type OmnibarProps } from \"./Omnibar\";\n\nexport interface AlephaMantineProviderProps {\n children?: ReactNode;\n mantine?: MantineProviderProps;\n colorSchemeScript?: ColorSchemeScriptProps;\n navigationProgress?: NavigationProgressProps;\n notifications?: NotificationsProps;\n modals?: ModalsProviderProps;\n omnibar?: OmnibarProps;\n}\n\nconst AlephaMantineProvider = (props: AlephaMantineProviderProps) => {\n useRouterEvents({\n onBegin: () => {\n nprogress.start();\n },\n onEnd: () => {\n nprogress.complete();\n },\n });\n\n return (\n <>\n <ColorSchemeScript\n defaultColorScheme={props.mantine?.defaultColorScheme}\n {...props.colorSchemeScript}\n />\n <MantineProvider {...props.mantine}>\n <Notifications {...props.notifications} />\n <NavigationProgress {...props.navigationProgress} />\n <ModalsProvider {...props.modals}>\n <Omnibar {...props.omnibar} />\n {props.children ?? <NestedView />}\n </ModalsProvider>\n </MantineProvider>\n </>\n );\n};\n\nexport default AlephaMantineProvider;\n"],"mappings":";;;;;;;;;;;AAmBA,MAAMA,iBAAwC;CAC5C;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe,QAAQ,IAAI,OAAO;EAClC,aAAa,oBAAC,YAAS,MAAM,KAAM;EACpC;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe,QAAQ,IAAI,YAAY;EACvC,aAAa,oBAAC,iBAAc,MAAM,KAAM;EACzC;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe,QAAQ,IAAI,YAAY;EACvC,aAAa,oBAAC,gBAAa,MAAM,KAAM;EACxC;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe,QAAQ,IAAI,UAAU;EACrC,aAAa,oBAAC,YAAS,MAAM,KAAM;EACpC;CACD;EACE,IAAI;EACJ,OAAO;EACP,aAAa;EACb,eAAe,QAAQ,IAAI,WAAW;EACtC,aAAa,oBAAC,gBAAa,MAAM,KAAM;EACxC;CACF;AAED,MAAM,WAAW,UAAwB;CACvC,MAAM,UAAU,MAAM,WAAW;CACjC,MAAM,WAAW,MAAM,YAAY;CACnC,MAAM,oBAAoB,MAAM,qBAAqB;CACrD,MAAM,eAAe,MAAM,gBAAgB;AAE3C,QACE,oBAAC;EACU;EACC;EACV,aAAa;GACX,aAAa,oBAAC,cAAW,MAAM,KAAM;GACrC,aAAa;GACd;EACa;GACd;;AAIN,sBAAe;;;;ACrDf,MAAM,yBAAyB,UAAsC;AACnE,iBAAgB;EACd,eAAe;AACb,aAAU,OAAO;;EAEnB,aAAa;AACX,aAAU,UAAU;;EAEvB,CAAC;AAEF,QACE,4CACE,oBAAC;EACC,oBAAoB,MAAM,SAAS;EACnC,GAAI,MAAM;GACV,EACF,qBAAC;EAAgB,GAAI,MAAM;;GACzB,oBAAC,iBAAc,GAAI,MAAM,gBAAiB;GAC1C,oBAAC,sBAAmB,GAAI,MAAM,qBAAsB;GACpD,qBAAC;IAAe,GAAI,MAAM;eACxB,oBAACC,mBAAQ,GAAI,MAAM,UAAW,EAC7B,MAAM,YAAY,oBAAC,eAAa;KAClB;;GACD,IACjB;;AAIP,oCAAe"}
@@ -1,3 +0,0 @@
1
- import { t as AlephaMantineProvider_default } from "./AlephaMantineProvider-DDbIijPF.js";
2
-
3
- export { AlephaMantineProvider_default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/utils/parseInput.ts","../src/components/ControlSelect.tsx","../src/components/Control.tsx","../src/components/Action.tsx","../src/components/Omnibar.tsx","../src/components/AlephaMantineProvider.tsx","../src/components/ControlDate.tsx","../src/components/DarkModeButton.tsx","../src/components/DataTable.tsx","../src/services/DialogService.tsx","../src/components/dialogs/AlertDialog.tsx","../src/components/dialogs/ConfirmDialog.tsx","../src/components/dialogs/PromptDialog.tsx","../src/components/Sidebar.tsx","../src/components/TypeForm.tsx","../src/hooks/useDialog.ts","../src/services/ToastService.tsx","../src/hooks/useToast.ts","../src/RootRouter.ts","../src/utils/icons.tsx","../src/utils/string.ts","../src/index.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["Flex","e","inputProps: InputProps","itemsEnum: string[] | undefined","items: any","segmentedControlProps: Partial<SegmentedControlProps>","Flex","data","Flex","ControlSelect","ControlDate","Flex","newSort: DataTableSort","Flex","Sidebar: FC<SidebarProps>","SidebarItem: React.FC<SidebarItemProps>","SidebarItemHref: React.FC<SidebarItemProps>","Flex","SidebarItemButton: React.FC<SidebarItemProps>","schema: any","Control","Flex","Action"],"sources":["../src/RootRouter.ts","../src/components/dialogs/AlertDialog.tsx","../src/components/dialogs/ConfirmDialog.tsx","../src/components/dialogs/PromptDialog.tsx","../src/services/DialogService.tsx","../src/services/ToastService.tsx","../src/components/Action.tsx","../src/utils/icons.tsx","../src/utils/string.ts","../src/utils/parseInput.ts","../src/components/ControlDate.tsx","../src/components/ControlSelect.tsx","../src/components/Control.tsx","../src/components/DarkModeButton.tsx","../src/components/DataTable.tsx","../src/components/Sidebar.tsx","../src/components/TypeForm.tsx","../src/hooks/useDialog.ts","../src/hooks/useToast.ts","../src/index.ts"],"sourcesContent":["import { $page } from \"@alepha/react\";\n\nexport class RootRouter {\n public readonly root = $page({\n path: \"/\",\n lazy: () => import(\"./components/AlephaMantineProvider.tsx\"),\n });\n}\n","import { Button, Group, Text } from \"@mantine/core\";\nimport type { AlertDialogProps } from \"../../services/DialogService\";\n\nexport function AlertDialog({ options, onClose }: AlertDialogProps) {\n return (\n <>\n {options?.message && <Text mb=\"md\">{options.message}</Text>}\n <Group justify=\"flex-end\">\n <Button onClick={onClose}>{options?.okLabel || \"OK\"}</Button>\n </Group>\n </>\n );\n}\n","import { Button, Group, Text } from \"@mantine/core\";\nimport type { ConfirmDialogProps } from \"../../services/DialogService\";\n\nexport function ConfirmDialog({ options, onConfirm }: ConfirmDialogProps) {\n return (\n <>\n {options?.message && <Text mb=\"md\">{options.message}</Text>}\n <Group justify=\"flex-end\">\n <Button variant=\"subtle\" onClick={() => onConfirm(false)}>\n {options?.cancelLabel || \"Cancel\"}\n </Button>\n <Button\n color={options?.confirmColor || \"blue\"}\n onClick={() => onConfirm(true)}\n >\n {options?.confirmLabel || \"Confirm\"}\n </Button>\n </Group>\n </>\n );\n}\n","import { Button, Group, Text, TextInput } from \"@mantine/core\";\nimport { useEffect, useRef, useState } from \"react\";\nimport type { PromptDialogProps } from \"../../services/DialogService\";\n\nexport function PromptDialog({ options, onSubmit }: PromptDialogProps) {\n const [value, setValue] = useState(options?.defaultValue || \"\");\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n // Auto-focus the input when the dialog opens\n inputRef.current?.focus();\n }, []);\n\n const handleSubmit = () => {\n if (!options?.required || value.trim()) {\n onSubmit(value);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === \"Enter\") {\n handleSubmit();\n }\n };\n\n return (\n <>\n {options?.message && <Text mb=\"md\">{options.message}</Text>}\n <TextInput\n ref={inputRef}\n label={options?.label}\n placeholder={options?.placeholder}\n value={value}\n onChange={(event) => setValue(event.currentTarget.value)}\n onKeyDown={handleKeyDown}\n required={options?.required}\n mb=\"md\"\n />\n <Group justify=\"flex-end\">\n <Button variant=\"subtle\" onClick={() => onSubmit(null)}>\n {options?.cancelLabel || \"Cancel\"}\n </Button>\n <Button\n onClick={handleSubmit}\n disabled={options?.required && !value.trim()}\n >\n {options?.submitLabel || \"OK\"}\n </Button>\n </Group>\n </>\n );\n}\n","import type { ModalProps } from \"@mantine/core\";\nimport { modals } from \"@mantine/modals\";\nimport type { ReactNode } from \"react\";\nimport { AlertDialog } from \"../components/dialogs/AlertDialog\";\nimport { ConfirmDialog } from \"../components/dialogs/ConfirmDialog\";\nimport { PromptDialog } from \"../components/dialogs/PromptDialog\";\n\n// Base interfaces\nexport interface BaseDialogOptions extends Partial<ModalProps> {\n title?: ReactNode;\n message?: ReactNode;\n content?: any; // weird typing for mantine modals content\n}\n\nexport interface AlertDialogOptions extends BaseDialogOptions {\n okLabel?: string;\n}\n\nexport interface ConfirmDialogOptions extends BaseDialogOptions {\n confirmLabel?: string;\n cancelLabel?: string;\n confirmColor?: string;\n}\n\nexport interface PromptDialogOptions extends BaseDialogOptions {\n placeholder?: string;\n defaultValue?: string;\n label?: string;\n required?: boolean;\n submitLabel?: string;\n cancelLabel?: string;\n}\n\n// Component prop interfaces\nexport interface AlertDialogProps {\n options?: AlertDialogOptions;\n onClose: () => void;\n}\n\nexport interface ConfirmDialogProps {\n options?: ConfirmDialogOptions;\n onConfirm: (confirmed: boolean) => void;\n}\n\nexport interface PromptDialogProps {\n options?: PromptDialogOptions;\n onSubmit: (value: string | null) => void;\n}\n\nexport interface DialogServiceOptions {\n default?: Partial<BaseDialogOptions>;\n}\n\nexport class DialogService {\n public readonly options: DialogServiceOptions = {\n default: {\n centered: true,\n withCloseButton: true,\n size: \"md\",\n overlayProps: {\n backgroundOpacity: 0.55,\n blur: 3,\n },\n transitionProps: {\n transition: \"pop\",\n duration: 200,\n },\n },\n };\n\n /**\n * Show an alert dialog with a message\n */\n public alert(options?: AlertDialogOptions): Promise<void> {\n return new Promise((resolve) => {\n const modalId = this.open({\n ...options,\n title: options?.title || \"Alert\",\n content: (\n <AlertDialog\n options={options}\n onClose={() => {\n this.close(modalId);\n resolve();\n }}\n />\n ),\n });\n });\n }\n\n /**\n * Show a confirmation dialog that returns a promise\n */\n public confirm(options?: ConfirmDialogOptions): Promise<boolean> {\n return new Promise((resolve) => {\n const modalId = this.open({\n ...options,\n title: options?.title || \"Confirm\",\n closeOnClickOutside: false,\n closeOnEscape: false,\n content: (\n <ConfirmDialog\n options={options}\n onConfirm={(confirmed) => {\n this.close(modalId);\n resolve(confirmed);\n }}\n />\n ),\n });\n });\n }\n\n /**\n * Show a prompt dialog to get user input\n */\n public prompt(options?: PromptDialogOptions): Promise<string | null> {\n return new Promise((resolve) => {\n const modalId = this.open({\n ...options,\n title: options?.title || \"Input\",\n closeOnClickOutside: false,\n closeOnEscape: false,\n content: (\n <PromptDialog\n options={options}\n onSubmit={(value) => {\n this.close(modalId);\n resolve(value);\n }}\n />\n ),\n });\n });\n }\n\n /**\n * Open a custom dialog with provided content\n */\n public open(options?: BaseDialogOptions): string {\n const modalId = modals.open({\n ...this.options.default,\n ...options,\n children: options?.content || options?.message,\n });\n return modalId;\n }\n\n /**\n * Show a JSON editor/viewer dialog\n */\n public json(data?: any, options?: BaseDialogOptions): void {\n // Implementation to be added\n }\n\n /**\n * Show a form dialog for structured input\n */\n public form(options?: BaseDialogOptions): Promise<any> {\n // Implementation to be added\n return Promise.resolve(null);\n }\n\n /**\n * Close the currently open dialog or a specific dialog by ID\n */\n public close(modalId?: string): void {\n if (modalId) {\n modals.close(modalId);\n } else {\n modals.closeAll();\n }\n }\n\n /**\n * Show a loading/progress dialog with optional progress percentage\n */\n public loading(options?: BaseDialogOptions & { progress?: number }): void {\n // Implementation to be added\n }\n\n /**\n * Show an image viewer/gallery dialog\n */\n public image(src: string | string[], options?: BaseDialogOptions): void {\n // Implementation to be added\n }\n\n /**\n * Show a table/data grid dialog for displaying tabular data\n */\n public table(\n data: any[],\n options?: BaseDialogOptions & { columns?: any[] },\n ): void {\n // Implementation to be added\n }\n\n /**\n * Show a multi-step wizard dialog\n */\n public wizard(steps: any[], options?: BaseDialogOptions): Promise<any> {\n // Implementation to be added\n return Promise.resolve(null);\n }\n}\n","import type { NotificationData } from \"@mantine/notifications\";\nimport { notifications } from \"@mantine/notifications\";\nimport {\n IconAlertTriangle,\n IconCheck,\n IconInfoCircle,\n IconX,\n} from \"@tabler/icons-react\";\n\nexport interface ToastServiceOptions {\n default?: Partial<NotificationData>;\n}\n\nexport class ToastService {\n protected readonly raw = notifications;\n\n public readonly options: ToastServiceOptions = {\n default: {\n autoClose: 5000,\n withCloseButton: true,\n position: \"top-center\",\n },\n };\n\n public show(options: NotificationData) {\n notifications.show({\n ...this.options.default,\n ...options,\n });\n }\n\n public info(options: Partial<NotificationData>) {\n this.show({\n color: \"blue\",\n icon: <IconInfoCircle size={20} />,\n title: \"Info\",\n message: \"Information notification\",\n ...options,\n });\n }\n\n public success(options: Partial<NotificationData>) {\n this.show({\n color: \"green\",\n icon: <IconCheck size={16} />,\n title: \"Success\",\n message: \"Operation completed successfully\",\n ...options,\n });\n }\n\n public warning(options: Partial<NotificationData>) {\n this.show({\n color: \"yellow\",\n icon: <IconAlertTriangle size={20} />,\n title: \"Warning\",\n message: \"Please review this warning\",\n ...options,\n });\n }\n\n public danger(options: Partial<NotificationData>) {\n this.show({\n color: \"red\",\n icon: <IconX size={20} />,\n title: \"Error\",\n message: \"An error occurred\",\n ...options,\n });\n }\n}\n","import {\n type RouterGoOptions,\n type UseActiveOptions,\n useActive,\n useAlepha,\n useRouter,\n} from \"@alepha/react\";\nimport { type FormModel, useFormState } from \"@alepha/react-form\";\nimport {\n Button,\n type ButtonProps,\n Flex,\n Menu,\n Tooltip,\n type TooltipProps,\n} from \"@mantine/core\";\nimport { IconChevronRight } from \"@tabler/icons-react\";\nimport { type ReactNode, useState } from \"react\";\n\nexport interface ActionMenuItem {\n /**\n * Menu item type\n */\n type?: \"item\" | \"divider\" | \"label\";\n\n /**\n * Label text for the menu item\n */\n label?: string;\n\n /**\n * Icon element to display before the label\n */\n icon?: ReactNode;\n\n /**\n * Click handler for menu items\n */\n onClick?: () => void;\n\n /**\n * Color for the menu item (e.g., \"red\" for danger actions)\n */\n color?: string;\n\n /**\n * Nested submenu items\n */\n children?: ActionMenuItem[];\n}\n\nexport interface ActionMenuConfig {\n /**\n * Array of menu items to display\n */\n items: ActionMenuItem[];\n\n /**\n * Menu position relative to the button\n */\n position?:\n | \"bottom\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"top\"\n | \"top-start\"\n | \"top-end\"\n | \"left\"\n | \"right\";\n\n /**\n * Menu width\n */\n width?: number | string;\n\n /**\n * Menu shadow\n */\n shadow?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n}\n\nexport interface ActionCommonProps extends ButtonProps {\n children?: ReactNode;\n textVisibleFrom?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n /**\n * Tooltip to display on hover. Can be a string for simple tooltips\n * or a TooltipProps object for advanced configuration.\n */\n tooltip?: string | TooltipProps;\n\n /**\n * Menu configuration. When provided, the action will display a dropdown menu.\n */\n menu?: ActionMenuConfig;\n\n /**\n * If set, a confirmation dialog will be shown before performing the action.\n * If `true`, a default title and message will be used.\n * If a string, it will be used as the message with a default title.\n * If an object, it can contain `title` and `message` properties to customize the dialog.\n */\n confirm?: boolean | string | { title?: string; message: string };\n}\n\nexport type ActionProps = ActionCommonProps &\n (ActiveHrefProps | ActionClickProps | ActionSubmitProps | {});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Helper function to render menu items recursively\nconst renderMenuItem = (item: ActionMenuItem, index: number): ReactNode => {\n // Render divider\n if (item.type === \"divider\") {\n return <Menu.Divider key={index} />;\n }\n\n // Render label\n if (item.type === \"label\") {\n return <Menu.Label key={index}>{item.label}</Menu.Label>;\n }\n\n // Render submenu if has children\n if (item.children && item.children.length > 0) {\n return (\n <Menu key={index} trigger=\"hover\" position=\"right-start\" offset={2}>\n <Menu.Target>\n <Menu.Item\n leftSection={item.icon}\n rightSection={<IconChevronRight size={14} />}\n >\n {item.label}\n </Menu.Item>\n </Menu.Target>\n <Menu.Dropdown>\n {item.children.map((child, childIndex) =>\n renderMenuItem(child, childIndex),\n )}\n </Menu.Dropdown>\n </Menu>\n );\n }\n\n // Render regular menu item\n return (\n <Menu.Item\n key={index}\n leftSection={item.icon}\n onClick={item.onClick}\n color={item.color}\n >\n {item.label}\n </Menu.Item>\n );\n};\n\nconst Action = (_props: ActionProps) => {\n const props = { variant: \"subtle\", ..._props };\n const { tooltip, menu, ...restProps } = props;\n\n if (props.leftSection && !props.children) {\n restProps.className ??= \"mantine-Action-iconOnly\";\n restProps.p ??= \"xs\";\n }\n\n if (props.textVisibleFrom) {\n const { children, textVisibleFrom, leftSection, ...rest } = restProps;\n return (\n <>\n <Flex w={\"100%\"} visibleFrom={textVisibleFrom}>\n <Action\n flex={1}\n {...rest}\n leftSection={leftSection}\n tooltip={tooltip}\n menu={menu}\n >\n {children}\n </Action>\n </Flex>\n <Flex w={\"100%\"} hiddenFrom={textVisibleFrom}>\n <Action px={\"xs\"} {...rest} tooltip={tooltip} menu={menu}>\n {leftSection}\n </Action>\n </Flex>\n </>\n );\n }\n\n const renderAction = () => {\n if (\"href\" in restProps && restProps.href) {\n return (\n <ActionHref {...restProps} href={restProps.href}>\n {restProps.children}\n </ActionHref>\n );\n }\n\n if (\"onClick\" in restProps && restProps.onClick) {\n return (\n <ActionClick {...restProps} onClick={restProps.onClick}>\n {restProps.children}\n </ActionClick>\n );\n }\n\n if (\"form\" in restProps && restProps.form) {\n return (\n <ActionSubmit {...restProps} form={restProps.form}>\n {restProps.children}\n </ActionSubmit>\n );\n }\n\n return <Button {...(restProps as any)}>{restProps.children}</Button>;\n };\n\n let actionElement = renderAction();\n\n // Wrap with Menu if provided\n if (menu) {\n actionElement = (\n <Menu\n position={menu.position || \"bottom-start\"}\n width={menu.width || 200}\n shadow={menu.shadow || \"md\"}\n >\n <Menu.Target>{actionElement}</Menu.Target>\n <Menu.Dropdown>\n {menu.items.map((item, index) => renderMenuItem(item, index))}\n </Menu.Dropdown>\n </Menu>\n );\n }\n\n // Wrap with Tooltip if provided\n if (tooltip) {\n const tooltipProps: TooltipProps =\n typeof tooltip === \"string\"\n ? { label: tooltip, children: actionElement }\n : { ...tooltip, children: actionElement };\n\n return <Tooltip {...tooltipProps} />;\n }\n\n return actionElement;\n};\n\nexport default Action;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionSubmitProps extends ButtonProps {\n form: FormModel<any>;\n}\n\n/**\n * Action button that submits a form with loading and disabled state handling.\n */\nconst ActionSubmit = (props: ActionSubmitProps) => {\n const { form, ...buttonProps } = props;\n const state = useFormState(form);\n return (\n <Button\n {...buttonProps}\n loading={state.loading}\n disabled={state.loading}\n type={\"submit\"}\n >\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionClickProps extends ButtonProps {\n onClick: (e: any) => any;\n}\n\n/**\n * Basic action button that handles click events with loading and error handling.\n */\nconst ActionClick = (props: ActionClickProps) => {\n const [pending, setPending] = useState(false);\n const alepha = useAlepha();\n\n const onClick = async (e: any) => {\n setPending(true);\n try {\n await props.onClick(e);\n } catch (e) {\n console.error(e);\n await alepha.events.emit(\"form:submit:error\", {\n id: \"action\",\n error: e as Error,\n });\n } finally {\n setPending(false);\n }\n };\n\n return (\n <Button\n {...props}\n disabled={pending || props.disabled}\n loading={pending}\n onClick={onClick}\n >\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActiveHrefProps extends ButtonProps {\n href: string;\n active?: Partial<UseActiveOptions> | false;\n routerGoOptions?: RouterGoOptions;\n}\n\n/**\n * Action for navigation with active state support.\n */\nconst ActionHref = (props: ActiveHrefProps) => {\n const { active: options, routerGoOptions, ...buttonProps } = props;\n const router = useRouter();\n const { isPending, isActive } = useActive(\n options ? { href: props.href, ...options } : { href: props.href },\n );\n const anchorProps = router.anchor(props.href, routerGoOptions);\n\n return (\n <Button\n component={\"a\"}\n loading={isPending}\n {...anchorProps}\n {...buttonProps}\n variant={isActive && options !== false ? \"filled\" : \"subtle\"}\n >\n {props.children}\n </Button>\n );\n};\n","import {\n IconAt,\n IconCalendar,\n IconClock,\n IconColorPicker,\n IconFile,\n IconHash,\n IconKey,\n IconLetterCase,\n IconLink,\n IconList,\n IconMail,\n IconPalette,\n IconPhone,\n IconSelector,\n IconToggleLeft,\n} from \"@tabler/icons-react\";\nimport type { ReactNode } from \"react\";\n\n/**\n * Icon size presets following Mantine's size conventions\n */\nexport const ICON_SIZES = {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 28,\n} as const;\n\nexport type IconSize = keyof typeof ICON_SIZES;\n\n/**\n * Get the default icon for an input based on its type, format, or name.\n */\nexport const getDefaultIcon = (params: {\n type?: string;\n format?: string;\n name?: string;\n isEnum?: boolean;\n isArray?: boolean;\n size?: IconSize;\n}): ReactNode => {\n const { type, format, name, isEnum, isArray, size = \"sm\" } = params;\n const iconSize = ICON_SIZES[size];\n\n // Format-based icons (highest priority)\n if (format) {\n switch (format) {\n case \"email\":\n return <IconMail size={iconSize} />;\n case \"url\":\n case \"uri\":\n return <IconLink size={iconSize} />;\n case \"tel\":\n case \"phone\":\n return <IconPhone size={iconSize} />;\n case \"date\":\n return <IconCalendar size={iconSize} />;\n case \"date-time\":\n return <IconCalendar size={iconSize} />;\n case \"time\":\n return <IconClock size={iconSize} />;\n case \"color\":\n return <IconColorPicker size={iconSize} />;\n case \"uuid\":\n return <IconKey size={iconSize} />;\n }\n }\n\n // Name-based icons (medium priority)\n if (name) {\n const nameLower = name.toLowerCase();\n if (nameLower.includes(\"password\") || nameLower.includes(\"secret\")) {\n return <IconKey size={iconSize} />;\n }\n if (nameLower.includes(\"email\") || nameLower.includes(\"mail\")) {\n return <IconMail size={iconSize} />;\n }\n if (nameLower.includes(\"url\") || nameLower.includes(\"link\")) {\n return <IconLink size={iconSize} />;\n }\n if (nameLower.includes(\"phone\") || nameLower.includes(\"tel\")) {\n return <IconPhone size={iconSize} />;\n }\n if (nameLower.includes(\"color\")) {\n return <IconPalette size={iconSize} />;\n }\n if (nameLower.includes(\"file\") || nameLower.includes(\"upload\")) {\n return <IconFile size={iconSize} />;\n }\n if (nameLower.includes(\"date\")) {\n return <IconCalendar size={iconSize} />;\n }\n if (nameLower.includes(\"time\")) {\n return <IconClock size={iconSize} />;\n }\n }\n\n // Type-based icons (lowest priority)\n if (isEnum || isArray) {\n return <IconSelector size={iconSize} />;\n }\n\n if (type) {\n switch (type) {\n case \"boolean\":\n return <IconToggleLeft size={iconSize} />;\n case \"number\":\n case \"integer\":\n return <IconHash size={iconSize} />;\n case \"array\":\n return <IconList size={iconSize} />;\n case \"string\":\n return <IconLetterCase size={iconSize} />;\n }\n }\n\n // Default icon\n return <IconAt size={iconSize} />;\n};\n","/**\n * Capitalizes the first letter of a string.\n *\n * @example\n * capitalize(\"hello\") // \"Hello\"\n */\nexport const capitalize = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\n/**\n * Converts a path or identifier string into a pretty display name.\n * Removes slashes and capitalizes the first letter.\n *\n * @example\n * prettyName(\"/userName\") // \"UserName\"\n * prettyName(\"email\") // \"Email\"\n */\nexport const prettyName = (name: string): string => {\n return capitalize(name.replaceAll(\"/\", \"\"));\n};\n","import { type TObject, TypeBoxError } from \"@alepha/core\";\nimport type { InputField } from \"@alepha/react-form\";\nimport type { ReactNode } from \"react\";\nimport type { ControlProps } from \"../components/Control.tsx\";\nimport { getDefaultIcon } from \"./icons.tsx\";\nimport { prettyName } from \"./string.ts\";\n\nexport const parseInput = (\n props: GenericControlProps,\n form: {\n error?: Error;\n },\n): ControlInput => {\n const disabled = false; // form.loading;\n const id = props.input.props.id;\n const label =\n props.title ??\n (\"title\" in props.input.schema &&\n typeof props.input.schema.title === \"string\"\n ? props.input.schema.title\n : undefined) ??\n prettyName(props.input.path);\n const description =\n props.description ??\n (\"description\" in props.input.schema &&\n typeof props.input.schema.description === \"string\"\n ? props.input.schema.description\n : undefined);\n const error =\n form.error && form.error instanceof TypeBoxError\n ? form.error.value.message\n : undefined;\n\n // Auto-generate icon if not provided\n const icon =\n props.icon ??\n getDefaultIcon({\n type:\n props.input.schema && \"type\" in props.input.schema\n ? String(props.input.schema.type)\n : undefined,\n format:\n props.input.schema &&\n \"format\" in props.input.schema &&\n typeof props.input.schema.format === \"string\"\n ? props.input.schema.format\n : undefined,\n name: props.input.props.name,\n isEnum:\n props.input.schema &&\n \"enum\" in props.input.schema &&\n Boolean(props.input.schema.enum),\n isArray:\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"array\",\n });\n\n const format =\n props.input.schema &&\n \"format\" in props.input.schema &&\n typeof props.input.schema.format === \"string\"\n ? props.input.schema.format\n : undefined;\n\n const required = props.input.required;\n const schema = props.input.schema as TObject & { $control?: ControlProps };\n\n const inputProps: InputProps = {\n label,\n description,\n error,\n required,\n disabled,\n };\n\n if (\"minLength\" in schema && typeof schema.minLength === \"number\") {\n inputProps.minLength = schema.minLength;\n }\n if (\"maxLength\" in schema && typeof schema.maxLength === \"number\") {\n inputProps.maxLength = schema.maxLength;\n }\n if (\"minimum\" in schema && typeof schema.minimum === \"number\") {\n inputProps.minimum = schema.minimum;\n }\n if (\"maximum\" in schema && typeof schema.maximum === \"number\") {\n inputProps.maximum = schema.maximum;\n }\n\n return {\n id,\n icon,\n format,\n schema: props.input.schema as TObject & { $control?: ControlProps },\n inputProps,\n };\n};\n\nexport interface GenericControlProps {\n input: InputField;\n title?: string;\n description?: string;\n icon?: ReactNode;\n}\n\nexport interface ControlInput {\n id?: string;\n icon: ReactNode;\n format?: string;\n schema: TObject & { $control?: ControlProps };\n inputProps: InputProps;\n}\n\nexport interface InputProps {\n label: string;\n description?: string;\n error?: string;\n required: boolean;\n disabled: boolean;\n\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n}\n","import { useFormState } from \"@alepha/react-form\";\nimport {\n DateInput,\n type DateInputProps,\n DateTimePicker,\n type DateTimePickerProps,\n TimeInput,\n type TimeInputProps,\n} from \"@mantine/dates\";\nimport { type GenericControlProps, parseInput } from \"../utils/parseInput.ts\";\n\nexport interface ControlDateProps extends GenericControlProps {\n date?: boolean | DateInputProps;\n datetime?: boolean | DateTimePickerProps;\n time?: boolean | TimeInputProps;\n}\n\n/**\n * ControlDate component for handling date, datetime, and time inputs.\n *\n * Features:\n * - DateInput for date format\n * - DateTimePicker for date-time format\n * - TimeInput for time format\n *\n * Automatically detects date formats from schema and renders appropriate picker.\n */\nconst ControlDate = (props: ControlDateProps) => {\n const form = useFormState(props.input);\n const { inputProps, id, icon, format } = parseInput(props, form);\n if (!props.input?.props) {\n return null;\n }\n\n // region <DateTimePicker/>\n if (props.datetime || format === \"date-time\") {\n const dateTimePickerProps =\n typeof props.datetime === \"object\" ? props.datetime : {};\n return (\n <DateTimePicker\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={\n props.input.props.defaultValue\n ? new Date(props.input.props.defaultValue)\n : undefined\n }\n onChange={(value) => {\n props.input.set(value ? new Date(value).toISOString() : undefined);\n }}\n {...dateTimePickerProps}\n />\n );\n }\n //endregion\n\n // region <DateInput/>\n if (props.date || format === \"date\") {\n const dateInputProps = typeof props.date === \"object\" ? props.date : {};\n return (\n <DateInput\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={\n props.input.props.defaultValue\n ? new Date(props.input.props.defaultValue)\n : undefined\n }\n onChange={(value) => {\n props.input.set(\n value ? new Date(value).toISOString().slice(0, 10) : undefined,\n );\n }}\n {...dateInputProps}\n />\n );\n }\n //endregion\n\n // region <TimeInput/>\n if (props.time || format === \"time\") {\n const timeInputProps = typeof props.time === \"object\" ? props.time : {};\n return (\n <TimeInput\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={props.input.props.defaultValue}\n onChange={(event) => {\n props.input.set(event.currentTarget.value);\n }}\n {...timeInputProps}\n />\n );\n }\n //endregion\n\n // Fallback - shouldn't happen\n return null;\n};\n\nexport default ControlDate;\n","import { useFormState } from \"@alepha/react-form\";\nimport {\n Autocomplete,\n type AutocompleteProps,\n Flex,\n Input,\n MultiSelect,\n type MultiSelectProps,\n SegmentedControl,\n type SegmentedControlProps,\n Select,\n type SelectProps,\n TagsInput,\n type TagsInputProps,\n} from \"@mantine/core\";\nimport { useEffect, useState } from \"react\";\nimport { type GenericControlProps, parseInput } from \"../utils/parseInput.ts\";\n\nexport type SelectValueLabel =\n | string\n | { value: string; label: string; icon?: string };\n\nexport interface ControlSelectProps extends GenericControlProps {\n select?: boolean | SelectProps;\n multi?: boolean | MultiSelectProps;\n tags?: boolean | TagsInputProps;\n autocomplete?: boolean | AutocompleteProps;\n segmented?: boolean | Partial<SegmentedControlProps>;\n\n loader?: () => Promise<SelectValueLabel[]>;\n}\n\n/**\n * ControlSelect component for handling Select, MultiSelect, and TagsInput.\n *\n * Features:\n * - Basic Select with enum support\n * - MultiSelect for array of enums\n * - TagsInput for array of strings (no enum)\n * - Future: Lazy loading\n * - Future: Searchable/filterable options\n * - Future: Custom option rendering\n *\n * Automatically detects enum values and array types from schema.\n */\nconst ControlSelect = (props: ControlSelectProps) => {\n const form = useFormState(props.input);\n const { inputProps, id, icon } = parseInput(props, form);\n\n // Detect if schema is an array type\n const isArray =\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"array\";\n\n // For arrays, check if items have enum (MultiSelect) or not (TagsInput)\n let itemsEnum: string[] | undefined;\n if (isArray && \"items\" in props.input.schema && props.input.schema.items) {\n const items: any = props.input.schema.items;\n if (\"enum\" in items && Array.isArray(items.enum)) {\n itemsEnum = items.enum;\n }\n }\n\n // Extract enum values from schema (for non-array select)\n const enumValues =\n props.input.schema &&\n \"enum\" in props.input.schema &&\n Array.isArray(props.input.schema.enum)\n ? props.input.schema.enum\n : [];\n\n const [data, setData] = useState<SelectValueLabel[]>([]);\n\n useEffect(() => {\n if (!props.input?.props) {\n return;\n }\n\n if (props.loader) {\n props.loader().then(setData);\n } else {\n setData(enumValues);\n }\n }, [props.input, props.loader]);\n\n if (!props.input?.props) {\n return null;\n }\n\n if (props.segmented) {\n const segmentedControlProps: Partial<SegmentedControlProps> =\n typeof props.segmented === \"object\" ? props.segmented : {};\n\n return (\n <Input.Wrapper {...inputProps}>\n <Flex mt={\"calc(var(--mantine-spacing-xs) / 2)\"}>\n <SegmentedControl\n disabled={inputProps.disabled}\n defaultValue={String(props.input.props.defaultValue)}\n {...segmentedControlProps}\n onChange={(value) => {\n props.input.set(value);\n }}\n data={data.slice(0, 10)}\n />\n </Flex>\n </Input.Wrapper>\n );\n }\n\n if (props.autocomplete) {\n const autocompleteProps =\n typeof props.autocomplete === \"object\" ? props.autocomplete : {};\n\n return (\n <Autocomplete\n {...inputProps}\n id={id}\n leftSection={icon}\n data={data}\n {...props.input.props}\n {...autocompleteProps}\n />\n );\n }\n\n // region <TagsInput/> - for array of strings without enum\n if ((isArray && !itemsEnum) || props.tags) {\n const tagsInputProps = typeof props.tags === \"object\" ? props.tags : {};\n return (\n <TagsInput\n {...inputProps}\n id={id}\n leftSection={icon}\n defaultValue={\n Array.isArray(props.input.props.defaultValue)\n ? props.input.props.defaultValue\n : []\n }\n onChange={(value) => {\n props.input.set(value);\n }}\n {...tagsInputProps}\n />\n );\n }\n // endregion\n\n // region <MultiSelect/> - for array of enums\n if ((isArray && itemsEnum) || props.multi) {\n const data =\n itemsEnum?.map((value: string) => ({\n value,\n label: value,\n })) || [];\n\n const multiSelectProps = typeof props.multi === \"object\" ? props.multi : {};\n\n return (\n <MultiSelect\n {...inputProps}\n id={id}\n leftSection={icon}\n data={data}\n defaultValue={\n Array.isArray(props.input.props.defaultValue)\n ? props.input.props.defaultValue\n : []\n }\n onChange={(value) => {\n props.input.set(value);\n }}\n {...multiSelectProps}\n />\n );\n }\n // endregion\n\n // region <Select/> - for single enum value\n const selectProps = typeof props.select === \"object\" ? props.select : {};\n\n return (\n <Select\n {...inputProps}\n id={id}\n leftSection={icon}\n data={data}\n {...props.input.props}\n {...selectProps}\n />\n );\n // endregion\n};\n\nexport default ControlSelect;\n","import { useFormState } from \"@alepha/react-form\";\nimport {\n ColorInput,\n type ColorInputProps,\n FileInput,\n type FileInputProps,\n Flex,\n Input,\n NumberInput,\n type NumberInputProps,\n PasswordInput,\n type PasswordInputProps,\n Switch,\n type SwitchProps,\n Textarea,\n type TextareaProps,\n TextInput,\n type TextInputProps,\n} from \"@mantine/core\";\nimport type {\n DateInputProps,\n DateTimePickerProps,\n TimeInputProps,\n} from \"@mantine/dates\";\nimport type { ComponentType } from \"react\";\nimport { type GenericControlProps, parseInput } from \"../utils/parseInput.ts\";\nimport ControlDate from \"./ControlDate\";\nimport ControlSelect, { type ControlSelectProps } from \"./ControlSelect\";\n\nexport interface ControlProps extends GenericControlProps {\n text?: TextInputProps;\n area?: boolean | TextareaProps;\n select?: boolean | Partial<ControlSelectProps>;\n password?: boolean | PasswordInputProps;\n switch?: boolean | SwitchProps;\n number?: boolean | NumberInputProps;\n file?: boolean | FileInputProps;\n color?: boolean | ColorInputProps;\n date?: boolean | DateInputProps;\n datetime?: boolean | DateTimePickerProps;\n time?: boolean | TimeInputProps;\n custom?: ComponentType<CustomControlProps>;\n}\n\n/**\n * Generic form control that renders the appropriate input based on the schema and props.\n *\n * Supports:\n * - TextInput (with format detection: email, url, tel)\n * - Textarea\n * - NumberInput (for number/integer types)\n * - FileInput\n * - ColorInput (for color format)\n * - Select (for enum types)\n * - Autocomplete\n * - PasswordInput\n * - Switch (for boolean types)\n * - SegmentedControl (for enum types)\n * - DateInput (for date format)\n * - DateTimePicker (for date-time format)\n * - TimeInput (for time format)\n * - Custom component\n *\n * Automatically handles labels, descriptions, error messages, required state, and default icons.\n */\nconst Control = (_props: ControlProps) => {\n const form = useFormState(_props.input, [\"error\"]);\n const { inputProps, id, icon, format, schema } = parseInput(_props, form);\n if (!_props.input?.props) {\n return null;\n }\n\n const props = {\n ..._props,\n ...schema.$control,\n };\n\n //region <Custom/>\n if (props.custom) {\n const Custom = props.custom;\n return (\n <Input.Wrapper {...inputProps}>\n <Flex flex={1} mt={\"calc(var(--mantine-spacing-xs) / 2)\"}>\n <Custom\n defaultValue={props.input.props.defaultValue}\n onChange={(value) => {\n props.input.set(value);\n }}\n />\n </Flex>\n </Input.Wrapper>\n );\n }\n //endregion\n\n //region <NumberInput/>\n if (\n props.number ||\n (props.input.schema &&\n \"type\" in props.input.schema &&\n (props.input.schema.type === \"number\" ||\n props.input.schema.type === \"integer\"))\n ) {\n const numberInputProps =\n typeof props.number === \"object\" ? props.number : {};\n const { type, ...inputPropsWithoutType } = props.input.props;\n return (\n <NumberInput\n {...inputProps}\n id={id}\n leftSection={icon}\n {...inputPropsWithoutType}\n {...numberInputProps}\n />\n );\n }\n //endregion\n\n //region <FileInput/>\n if (props.file) {\n const fileInputProps = typeof props.file === \"object\" ? props.file : {};\n return (\n <FileInput\n {...inputProps}\n id={id}\n leftSection={icon}\n onChange={(file) => {\n props.input.set(file);\n }}\n {...fileInputProps}\n />\n );\n }\n //endregion\n\n //region <ColorInput/>\n if (props.color || format === \"color\") {\n const colorInputProps = typeof props.color === \"object\" ? props.color : {};\n return (\n <ColorInput\n {...inputProps}\n id={id}\n leftSection={icon}\n {...props.input.props}\n {...colorInputProps}\n />\n );\n }\n //endregion\n\n //region <ControlSelect/>\n // Handle: single enum, array of enum, array of strings, or explicit select/multi/tags props\n const isEnum =\n props.input.schema &&\n \"enum\" in props.input.schema &&\n props.input.schema.enum;\n const isArray =\n props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"array\";\n\n if (isEnum || isArray || props.select) {\n const opts = typeof props.select === \"object\" ? props.select : {};\n return (\n <ControlSelect\n input={props.input}\n title={props.title}\n description={props.description}\n icon={icon}\n {...opts}\n />\n );\n }\n //endregion\n\n //region <Switch/>\n if (\n (props.input.schema &&\n \"type\" in props.input.schema &&\n props.input.schema.type === \"boolean\") ||\n props.switch\n ) {\n const switchProps = typeof props.switch === \"object\" ? props.switch : {};\n\n return (\n <Switch\n {...inputProps}\n id={id}\n color={\"blue\"}\n defaultChecked={props.input.props.defaultValue}\n {...props.input.props}\n {...switchProps}\n />\n );\n }\n //endregion\n\n //region <PasswordInput/>\n if (props.password || props.input.props.name?.includes(\"password\")) {\n const passwordInputProps =\n typeof props.password === \"object\" ? props.password : {};\n return (\n <PasswordInput\n {...inputProps}\n id={id}\n leftSection={icon}\n {...props.input.props}\n {...passwordInputProps}\n />\n );\n }\n //endregion\n\n //region <Textarea/>\n if (props.area) {\n const textAreaProps = typeof props.area === \"object\" ? props.area : {};\n return (\n <Textarea\n {...inputProps}\n id={id}\n leftSection={icon}\n {...props.input.props}\n {...textAreaProps}\n />\n );\n }\n //endregion\n\n //region <ControlDate/>\n // Handle: date, date-time, and time formats\n if (\n props.date ||\n props.datetime ||\n props.time ||\n format === \"date\" ||\n format === \"date-time\" ||\n format === \"time\"\n ) {\n return (\n <ControlDate\n input={props.input}\n title={props.title}\n description={props.description}\n icon={icon}\n date={props.date}\n datetime={props.datetime}\n time={props.time}\n />\n );\n }\n //endregion\n\n //region <TextInput/> with format detection\n const textInputProps = typeof props.text === \"object\" ? props.text : {};\n\n // Detect HTML5 input type from format\n const getInputType = (): string | undefined => {\n switch (format) {\n case \"email\":\n return \"email\";\n case \"url\":\n case \"uri\":\n return \"url\";\n case \"tel\":\n case \"phone\":\n return \"tel\";\n default:\n return undefined;\n }\n };\n\n return (\n <TextInput\n {...inputProps}\n id={id}\n leftSection={icon}\n type={getInputType()}\n {...props.input.props}\n {...textInputProps}\n />\n );\n //endregion\n};\n\nexport default Control;\n\nexport type CustomControlProps = {\n defaultValue: any;\n onChange: (value: any) => void;\n};\n","import {\n ActionIcon,\n Flex,\n SegmentedControl,\n useComputedColorScheme,\n useMantineColorScheme,\n} from \"@mantine/core\";\nimport { IconMoon, IconSun } from \"@tabler/icons-react\";\nimport { useEffect, useState } from \"react\";\n\nexport interface DarkModeButtonProps {\n mode?: \"minimal\" | \"segmented\";\n size?: string | number;\n variant?:\n | \"filled\"\n | \"light\"\n | \"outline\"\n | \"default\"\n | \"subtle\"\n | \"transparent\";\n}\n\nconst DarkModeButton = (props: DarkModeButtonProps) => {\n const { setColorScheme } = useMantineColorScheme();\n const computedColorScheme = useComputedColorScheme(\"light\");\n const [colorScheme, setColorScheme2] = useState(\"default\");\n const mode = props.mode ?? \"minimal\";\n\n useEffect(() => {\n setColorScheme2(computedColorScheme);\n }, [computedColorScheme]);\n\n const toggleColorScheme = () => {\n setColorScheme(computedColorScheme === \"dark\" ? \"light\" : \"dark\");\n };\n\n if (mode === \"segmented\") {\n return (\n <SegmentedControl\n value={colorScheme}\n onChange={(value) => setColorScheme(value as \"light\" | \"dark\")}\n data={[\n {\n value: \"light\",\n label: (\n <Flex h={20} align=\"center\" justify=\"center\">\n <IconSun size={16} />\n </Flex>\n ),\n },\n {\n value: \"dark\",\n label: (\n <Flex h={20} align=\"center\" justify=\"center\">\n <IconMoon size={16} />\n </Flex>\n ),\n },\n ]}\n />\n );\n }\n\n return (\n <ActionIcon\n onClick={toggleColorScheme}\n variant={props.variant ?? \"default\"}\n size={props.size ?? \"lg\"}\n aria-label=\"Toggle color scheme\"\n >\n {colorScheme === \"dark\" ? (\n <IconSun size={20} />\n ) : colorScheme === \"light\" ? (\n <IconMoon size={20} />\n ) : (\n <Flex h={20} />\n )}\n </ActionIcon>\n );\n};\n\nexport default DarkModeButton;\n","import {\n ActionIcon,\n Badge,\n Box,\n Center,\n Checkbox,\n Flex,\n Group,\n Loader,\n Menu,\n Pagination,\n Paper,\n ScrollArea,\n Select,\n Table,\n type TableProps,\n Text,\n TextInput,\n Tooltip,\n} from \"@mantine/core\";\nimport {\n IconChevronDown,\n IconChevronUp,\n IconColumns,\n IconDownload,\n IconRefresh,\n IconSearch,\n IconX,\n} from \"@tabler/icons-react\";\nimport type React from \"react\";\nimport { useCallback, useMemo, useState } from \"react\";\n\n// Types\nexport type SortDirection = \"asc\" | \"desc\" | null;\n\nexport interface DataTableColumn<T = any> {\n accessor: keyof T | string;\n title?: string;\n width?: number | string;\n sortable?: boolean;\n filterable?: boolean;\n hidden?: boolean;\n render?: (value: any, record: T, index: number) => React.ReactNode;\n renderHeader?: () => React.ReactNode;\n align?: \"left\" | \"center\" | \"right\";\n ellipsis?: boolean;\n className?: string;\n headerClassName?: string;\n}\n\nexport interface DataTableSort {\n column: string;\n direction: SortDirection;\n}\n\nexport interface DataTableFilter {\n column: string;\n value: string;\n operator?: \"contains\" | \"equals\" | \"startsWith\" | \"endsWith\";\n}\n\nexport interface DataTableProps<T = any> extends Omit<TableProps, \"data\"> {\n // Data\n data: T[];\n columns: DataTableColumn<T>[];\n loading?: boolean;\n emptyMessage?: string;\n\n // Selection\n selectable?: boolean;\n selectedRows?: T[];\n onRowSelect?: (rows: T[]) => void;\n\n // Sorting\n sortable?: boolean;\n sort?: DataTableSort;\n onSortChange?: (sort: DataTableSort) => void;\n\n // Filtering\n filterable?: boolean;\n filters?: DataTableFilter[];\n onFiltersChange?: (filters: DataTableFilter[]) => void;\n filterPlaceholder?: string;\n\n // Pagination\n paginate?: boolean;\n page?: number;\n pageSize?: number;\n totalRecords?: number;\n pageSizeOptions?: number[];\n onPageChange?: (page: number) => void;\n onPageSizeChange?: (size: number) => void;\n\n // Row actions\n rowActions?: (record: T, index: number) => React.ReactNode;\n onRowClick?: (record: T, index: number) => void;\n rowClassName?: (record: T, index: number) => string;\n\n // Features\n showHeader?: boolean;\n showFooter?: boolean;\n stickyHeader?: boolean;\n striped?: boolean;\n highlightOnHover?: boolean;\n\n // Toolbar\n showToolbar?: boolean;\n title?: string;\n actions?: React.ReactNode;\n showColumnToggle?: boolean;\n showRefresh?: boolean;\n onRefresh?: () => void;\n showExport?: boolean;\n onExport?: () => void;\n\n // Layout\n height?: number | string;\n minHeight?: number | string;\n maxHeight?: number | string;\n}\n\nfunction getNestedValue(obj: any, path: string): any {\n return path.split(\".\").reduce((acc, part) => acc?.[part], obj);\n}\n\nexport default function DataTable<T = any>({\n data = [],\n columns: initialColumns = [],\n loading = false,\n emptyMessage = \"No data available\",\n\n selectable = false,\n selectedRows = [],\n onRowSelect,\n\n sortable = false,\n sort,\n onSortChange,\n\n filterable = false,\n filters = [],\n onFiltersChange,\n filterPlaceholder = \"Search...\",\n\n paginate = false,\n page = 1,\n pageSize = 10,\n totalRecords,\n pageSizeOptions = [10, 25, 50, 100],\n onPageChange,\n onPageSizeChange,\n\n rowActions,\n onRowClick,\n rowClassName,\n\n showHeader = true,\n showFooter = true,\n stickyHeader = false,\n striped = false,\n highlightOnHover = true,\n\n showToolbar = true,\n title,\n actions,\n showColumnToggle = true,\n showRefresh = false,\n onRefresh,\n showExport = false,\n onExport,\n\n height,\n minHeight,\n maxHeight,\n\n ...tableProps\n}: DataTableProps<T>) {\n // State management - use controlled/uncontrolled pattern\n const [hiddenColumns, setHiddenColumns] = useState<Set<string>>(new Set());\n const [globalFilter, setGlobalFilter] = useState(\"\");\n\n // Use props directly if provided, otherwise use internal state\n const [internalPage, setInternalPage] = useState(page);\n const [internalPageSize, setInternalPageSize] = useState(pageSize);\n const [internalSort, setInternalSort] = useState<DataTableSort | undefined>(\n sort,\n );\n const [internalFilters, setInternalFilters] =\n useState<DataTableFilter[]>(filters);\n const [internalSelectedRows, setInternalSelectedRows] =\n useState<T[]>(selectedRows);\n\n // Determine if component is controlled\n const currentPage = onPageChange ? page : internalPage;\n const currentPageSize = onPageSizeChange ? pageSize : internalPageSize;\n const currentSort = onSortChange ? sort : internalSort;\n const currentFilters = onFiltersChange ? filters : internalFilters;\n const currentSelectedRows = onRowSelect ? selectedRows : internalSelectedRows;\n\n // Filter columns\n const visibleColumns = useMemo(\n () =>\n initialColumns.filter(\n (col) => !col.hidden && !hiddenColumns.has(String(col.accessor)),\n ),\n [initialColumns, hiddenColumns],\n );\n\n // Process data\n const processedData = useMemo(() => {\n let result = [...data];\n\n // Apply global filter\n if (filterable && globalFilter) {\n result = result.filter((row) => {\n return visibleColumns.some((col) => {\n const value = getNestedValue(row, String(col.accessor));\n return String(value)\n .toLowerCase()\n .includes(globalFilter.toLowerCase());\n });\n });\n }\n\n // Apply column filters\n if (filterable && currentFilters.length > 0) {\n result = result.filter((row) => {\n return currentFilters.every((filter) => {\n const value = String(\n getNestedValue(row, filter.column),\n ).toLowerCase();\n const filterValue = filter.value.toLowerCase();\n\n switch (filter.operator) {\n case \"equals\":\n return value === filterValue;\n case \"startsWith\":\n return value.startsWith(filterValue);\n case \"endsWith\":\n return value.endsWith(filterValue);\n default:\n return value.includes(filterValue);\n }\n });\n });\n }\n\n // Apply sorting\n if (sortable && currentSort?.direction) {\n result.sort((a, b) => {\n const aVal = getNestedValue(a, currentSort.column);\n const bVal = getNestedValue(b, currentSort.column);\n\n if (aVal === bVal) return 0;\n if (aVal === null || aVal === undefined) return 1;\n if (bVal === null || bVal === undefined) return -1;\n\n const comparison = aVal < bVal ? -1 : 1;\n return currentSort.direction === \"asc\" ? comparison : -comparison;\n });\n }\n\n return result;\n }, [\n data,\n visibleColumns,\n filterable,\n globalFilter,\n currentFilters,\n sortable,\n currentSort,\n ]);\n\n // Paginate data\n const paginatedData = useMemo(() => {\n if (!paginate) return processedData;\n\n const startIndex = (currentPage - 1) * currentPageSize;\n return processedData.slice(startIndex, startIndex + currentPageSize);\n }, [processedData, paginate, currentPage, currentPageSize]);\n\n // Total pages\n const totalPages = useMemo(() => {\n const total = totalRecords ?? processedData.length;\n return Math.ceil(total / currentPageSize);\n }, [totalRecords, processedData.length, currentPageSize]);\n\n // Handlers\n const handleSort = useCallback(\n (column: string) => {\n if (!sortable) return;\n\n const newSort: DataTableSort = {\n column,\n direction:\n currentSort?.column === column\n ? currentSort.direction === \"asc\"\n ? \"desc\"\n : currentSort.direction === \"desc\"\n ? null\n : \"asc\"\n : \"asc\",\n };\n\n if (onSortChange) {\n onSortChange(newSort);\n } else {\n setInternalSort(newSort);\n }\n },\n [sortable, currentSort, onSortChange],\n );\n\n const handlePageChange = useCallback(\n (newPage: number) => {\n if (onPageChange) {\n onPageChange(newPage);\n } else {\n setInternalPage(newPage);\n }\n },\n [onPageChange],\n );\n\n const handlePageSizeChange = useCallback(\n (size: string | null) => {\n const newSize = Number(size) || currentPageSize;\n\n if (onPageSizeChange) {\n onPageSizeChange(newSize);\n onPageChange?.(1);\n } else {\n setInternalPageSize(newSize);\n setInternalPage(1);\n }\n },\n [currentPageSize, onPageSizeChange, onPageChange],\n );\n\n const handleSelectAll = useCallback(\n (checked: boolean) => {\n const newSelection = checked ? paginatedData : [];\n\n if (onRowSelect) {\n onRowSelect(newSelection);\n } else {\n setInternalSelectedRows(newSelection);\n }\n },\n [paginatedData, onRowSelect],\n );\n\n const handleSelectRow = useCallback(\n (row: T, checked: boolean) => {\n const newSelection = checked\n ? [...currentSelectedRows, row]\n : currentSelectedRows.filter((r) => r !== row);\n\n if (onRowSelect) {\n onRowSelect(newSelection);\n } else {\n setInternalSelectedRows(newSelection);\n }\n },\n [currentSelectedRows, onRowSelect],\n );\n\n const handleColumnToggle = useCallback(\n (column: string) => {\n const newHidden = new Set(hiddenColumns);\n if (newHidden.has(column)) {\n newHidden.delete(column);\n } else {\n newHidden.add(column);\n }\n setHiddenColumns(newHidden);\n },\n [hiddenColumns],\n );\n\n const isAllSelected =\n currentSelectedRows.length > 0 &&\n currentSelectedRows.length === paginatedData.length;\n const isIndeterminate =\n currentSelectedRows.length > 0 &&\n currentSelectedRows.length < paginatedData.length;\n\n // Render sort icon\n const renderSortIcon = (column: string) => {\n if (!sortable) return null;\n\n if (currentSort?.column === column) {\n if (currentSort.direction === \"asc\") {\n return (\n <IconChevronUp className=\"alepha-datatable-sort-icon\" size={16} />\n );\n }\n if (currentSort.direction === \"desc\") {\n return (\n <IconChevronDown className=\"alepha-datatable-sort-icon\" size={16} />\n );\n }\n }\n\n return (\n <IconChevronUp\n className=\"alepha-datatable-sort-icon-inactive\"\n size={16}\n />\n );\n };\n\n // Render toolbar\n const toolbar = showToolbar &&\n (title ||\n actions ||\n filterable ||\n showColumnToggle ||\n showRefresh ||\n showExport) && (\n <Paper className=\"alepha-datatable-toolbar\" p=\"md\" mb=\"sm\">\n <Flex justify=\"space-between\" align=\"center\" gap=\"md\">\n <Group>\n {title && (\n <Text size=\"lg\" fw={600}>\n {title}\n </Text>\n )}\n {currentSelectedRows.length > 0 && (\n <Badge color=\"blue\" variant=\"light\">\n {currentSelectedRows.length} selected\n </Badge>\n )}\n </Group>\n\n <Group>\n {filterable && (\n <TextInput\n placeholder={filterPlaceholder}\n value={globalFilter}\n onChange={(e) => setGlobalFilter(e.target.value)}\n leftSection={<IconSearch size={16} />}\n rightSection={\n globalFilter && (\n <ActionIcon\n size=\"xs\"\n variant=\"subtle\"\n onClick={() => setGlobalFilter(\"\")}\n >\n <IconX size={14} />\n </ActionIcon>\n )\n }\n className=\"alepha-datatable-search-input\"\n />\n )}\n\n {showColumnToggle && (\n <Menu position=\"bottom-end\">\n <Menu.Target>\n <Tooltip label=\"Toggle columns\">\n <ActionIcon variant=\"subtle\">\n <IconColumns size={20} />\n </ActionIcon>\n </Tooltip>\n </Menu.Target>\n <Menu.Dropdown>\n <Menu.Label>Visible columns</Menu.Label>\n {initialColumns.map((col) => (\n <Menu.Item\n key={String(col.accessor)}\n onClick={() => handleColumnToggle(String(col.accessor))}\n leftSection={\n <Checkbox\n checked={\n !hiddenColumns.has(String(col.accessor)) &&\n !col.hidden\n }\n readOnly\n size=\"xs\"\n />\n }\n >\n {col.title || String(col.accessor)}\n </Menu.Item>\n ))}\n </Menu.Dropdown>\n </Menu>\n )}\n\n {showRefresh && (\n <Tooltip label=\"Refresh\">\n <ActionIcon\n variant=\"subtle\"\n onClick={onRefresh}\n loading={loading}\n >\n <IconRefresh size={20} />\n </ActionIcon>\n </Tooltip>\n )}\n\n {showExport && (\n <Tooltip label=\"Export\">\n <ActionIcon variant=\"subtle\" onClick={onExport}>\n <IconDownload size={20} />\n </ActionIcon>\n </Tooltip>\n )}\n\n {actions}\n </Group>\n </Flex>\n </Paper>\n );\n\n // Render table\n const tableContent = (\n <Table\n striped={striped}\n highlightOnHover={highlightOnHover}\n stickyHeader={stickyHeader}\n className=\"alepha-datatable-table\"\n {...tableProps}\n >\n {showHeader && (\n <Table.Thead>\n <Table.Tr>\n {selectable && (\n <Table.Th className=\"alepha-datatable-checkbox-column\">\n <Checkbox\n checked={isAllSelected}\n indeterminate={isIndeterminate}\n onChange={(e) => handleSelectAll(e.currentTarget.checked)}\n />\n </Table.Th>\n )}\n\n {visibleColumns.map((column) => (\n <Table.Th\n key={String(column.accessor)}\n className={`alepha-datatable-th ${column.headerClassName || \"\"}`}\n style={{\n width: column.width,\n textAlign: column.align,\n cursor: column.sortable && sortable ? \"pointer\" : \"default\",\n }}\n onClick={() =>\n column.sortable && handleSort(String(column.accessor))\n }\n >\n <Group\n gap=\"xs\"\n justify={\n column.align === \"center\"\n ? \"center\"\n : column.align === \"right\"\n ? \"flex-end\"\n : \"flex-start\"\n }\n >\n {column.renderHeader\n ? column.renderHeader()\n : column.title || String(column.accessor)}\n {column.sortable && renderSortIcon(String(column.accessor))}\n </Group>\n </Table.Th>\n ))}\n\n {rowActions && (\n <Table.Th className=\"alepha-datatable-actions-column\">\n Actions\n </Table.Th>\n )}\n </Table.Tr>\n </Table.Thead>\n )}\n\n <Table.Tbody>\n {loading ? (\n <Table.Tr>\n <Table.Td\n colSpan={\n visibleColumns.length +\n (selectable ? 1 : 0) +\n (rowActions ? 1 : 0)\n }\n >\n <Center py=\"xl\">\n <Loader size=\"sm\" />\n </Center>\n </Table.Td>\n </Table.Tr>\n ) : paginatedData.length === 0 ? (\n <Table.Tr>\n <Table.Td\n colSpan={\n visibleColumns.length +\n (selectable ? 1 : 0) +\n (rowActions ? 1 : 0)\n }\n >\n <Center py=\"xl\">\n <Text c=\"dimmed\">{emptyMessage}</Text>\n </Center>\n </Table.Td>\n </Table.Tr>\n ) : (\n paginatedData.map((row, index) => {\n const isSelected = currentSelectedRows.includes(row);\n return (\n <Table.Tr\n key={index}\n className={`alepha-datatable-tr ${isSelected ? \"alepha-datatable-selected\" : \"\"} ${rowClassName?.(row, index) || \"\"}`}\n onClick={() => onRowClick?.(row, index)}\n style={{ cursor: onRowClick ? \"pointer\" : \"default\" }}\n >\n {selectable && (\n <Table.Td className=\"alepha-datatable-checkbox-column\">\n <Checkbox\n checked={isSelected}\n onChange={(e) =>\n handleSelectRow(row, e.currentTarget.checked)\n }\n onClick={(e) => e.stopPropagation()}\n />\n </Table.Td>\n )}\n\n {visibleColumns.map((column) => {\n const value = getNestedValue(row, String(column.accessor));\n return (\n <Table.Td\n key={String(column.accessor)}\n className={column.className}\n style={{\n textAlign: column.align,\n ...(column.ellipsis && {\n maxWidth: column.width,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }),\n }}\n >\n {column.render ? column.render(value, row, index) : value}\n </Table.Td>\n );\n })}\n\n {rowActions && (\n <Table.Td className=\"alepha-datatable-actions-column\">\n {rowActions(row, index)}\n </Table.Td>\n )}\n </Table.Tr>\n );\n })\n )}\n </Table.Tbody>\n\n {showFooter && paginate && (\n <Table.Tfoot>\n <Table.Tr>\n <Table.Td\n colSpan={\n visibleColumns.length +\n (selectable ? 1 : 0) +\n (rowActions ? 1 : 0)\n }\n >\n <Flex justify=\"space-between\" align=\"center\" py=\"xs\">\n <Group gap=\"xs\">\n <Text size=\"sm\" c=\"dimmed\">\n Showing {(currentPage - 1) * currentPageSize + 1} to{\" \"}\n {Math.min(\n currentPage * currentPageSize,\n totalRecords ?? processedData.length,\n )}{\" \"}\n of {totalRecords ?? processedData.length} records\n </Text>\n\n <Select\n size=\"xs\"\n value={String(currentPageSize)}\n onChange={handlePageSizeChange}\n data={pageSizeOptions.map((size) => ({\n value: String(size),\n label: `${size} / page`,\n }))}\n className=\"alepha-datatable-page-size-select\"\n />\n </Group>\n\n <Pagination\n size=\"sm\"\n value={currentPage}\n onChange={handlePageChange}\n total={totalPages}\n siblings={1}\n boundaries={1}\n />\n </Flex>\n </Table.Td>\n </Table.Tr>\n </Table.Tfoot>\n )}\n </Table>\n );\n\n return (\n <Box className=\"alepha-datatable-container\">\n {toolbar}\n\n {height || maxHeight ? (\n <ScrollArea.Autosize mah={maxHeight} h={height} mih={minHeight}>\n {tableContent}\n </ScrollArea.Autosize>\n ) : (\n tableContent\n )}\n </Box>\n );\n}\n","import { useActive } from \"@alepha/react\";\nimport { Box, Flex, UnstyledButton } from \"@mantine/core\";\nimport {\n IconChevronDown,\n IconChevronRight,\n IconCircle,\n IconSearch,\n} from \"@tabler/icons-react\";\nimport { type FC, type ReactNode, useState } from \"react\";\n\nexport interface MenuItem {\n id: string;\n label: string;\n icon?: ReactNode;\n href?: string;\n activeStartsWith?: boolean; // Use startWith matching for active state\n onClick?: () => void;\n children?: MenuItem[];\n}\n\nexport interface SidebarProps {\n menu: MenuItem[];\n defaultOpenIds?: string[];\n onItemClick?: (item: MenuItem) => void;\n showSearchButton?: boolean;\n onSearchClick?: () => void;\n}\n\nexport const Sidebar: FC<SidebarProps> = ({\n menu,\n defaultOpenIds = [],\n onItemClick,\n showSearchButton = false,\n onSearchClick,\n}) => {\n const [openIds, setOpenIds] = useState<Set<string>>(new Set(defaultOpenIds));\n\n const toggleOpen = (id: string) => {\n setOpenIds((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(id)) {\n newSet.delete(id);\n } else {\n newSet.add(id);\n }\n return newSet;\n });\n };\n\n return (\n <Box component=\"nav\" className=\"alepha-sidebar\">\n {showSearchButton && (\n <UnstyledButton\n className=\"alepha-sidebar-search-button\"\n onClick={onSearchClick}\n >\n <Box className=\"alepha-sidebar-search-button-content\">\n <Box className=\"alepha-sidebar-search-button-left\">\n <IconSearch size={16} />\n <span>Search...</span>\n </Box>\n <Box className=\"alepha-sidebar-search-button-shortcut\">\n <kbd>⌘+K</kbd>\n </Box>\n </Box>\n </UnstyledButton>\n )}\n {menu.map((item) => (\n <SidebarItem\n key={item.id}\n item={item}\n level={0}\n openIds={openIds}\n onToggle={toggleOpen}\n onItemClick={onItemClick}\n />\n ))}\n </Box>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n// SidebarItem - Main component that decides which variant to render\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface SidebarItemProps {\n item: MenuItem;\n level: number;\n openIds: Set<string>;\n onToggle: (id: string) => void;\n onItemClick?: (item: MenuItem) => void;\n}\n\nexport const SidebarItem: React.FC<SidebarItemProps> = (props) => {\n const { item, level } = props;\n const maxLevel = 2; // 0, 1, 2 = 3 levels total\n\n if (level > maxLevel) return null;\n\n // Render different components based on whether item has href or not\n if (item.href) {\n return <SidebarItemHref {...props} />;\n }\n\n return <SidebarItemButton {...props} />;\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n// SidebarItemHref - Component for items with href (navigation)\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst SidebarItemHref: React.FC<SidebarItemProps> = ({\n item,\n level,\n openIds,\n onToggle,\n onItemClick,\n}) => {\n const hasChildren = item.children && item.children.length > 0;\n const isOpen = openIds.has(item.id);\n\n // Use the useActive hook for navigation\n const { isActive, anchorProps } = useActive({\n href: item.href!,\n startWith: item.activeStartsWith,\n });\n\n const handleItemClick = (e: React.MouseEvent) => {\n if (hasChildren) {\n e.preventDefault();\n onToggle(item.id);\n }\n // anchorProps.onClick handles navigation automatically\n };\n\n return (\n <Box className=\"alepha-sidebar-item-wrapper\">\n <UnstyledButton\n component=\"a\"\n {...anchorProps}\n className={`alepha-sidebar-item alepha-sidebar-level-${level} ${isActive ? \"alepha-sidebar-item-active\" : \"\"}`}\n onClick={hasChildren ? handleItemClick : anchorProps.onClick}\n >\n <Flex justify=\"space-between\" align=\"center\" w=\"100%\">\n <Flex className=\"alepha-sidebar-item-content\" align=\"center\" gap={10}>\n <Box className=\"alepha-sidebar-item-icon\">\n {item.icon || <IconCircle size={16} />}\n </Box>\n <Box className=\"alepha-sidebar-item-label\">{item.label}</Box>\n </Flex>\n {hasChildren && (\n <Box className=\"alepha-sidebar-item-caret\">\n {isOpen ? (\n <IconChevronDown size={14} />\n ) : (\n <IconChevronRight size={14} />\n )}\n </Box>\n )}\n </Flex>\n </UnstyledButton>\n {hasChildren && isOpen && (\n <Box className=\"alepha-sidebar-children\" data-parent-level={level}>\n {(level === 0 || level === 1) && (\n <Box className=\"alepha-sidebar-vertical-bar\" />\n )}\n <Box className=\"alepha-sidebar-children-items\">\n {item.children!.map((child) => (\n <SidebarItem\n key={child.id}\n item={child}\n level={level + 1}\n openIds={openIds}\n onToggle={onToggle}\n onItemClick={onItemClick}\n />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n// SidebarItemButton - Component for items without href (buttons with onClick)\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst SidebarItemButton: React.FC<SidebarItemProps> = ({\n item,\n level,\n openIds,\n onToggle,\n onItemClick,\n}) => {\n const hasChildren = item.children && item.children.length > 0;\n const isOpen = openIds.has(item.id);\n\n const handleItemClick = (e: React.MouseEvent) => {\n e.preventDefault();\n if (hasChildren) {\n onToggle(item.id);\n } else {\n onItemClick?.(item);\n item.onClick?.();\n }\n };\n\n return (\n <Box className=\"alepha-sidebar-item-wrapper\">\n <UnstyledButton\n component=\"button\"\n className={`alepha-sidebar-item alepha-sidebar-level-${level}`}\n onClick={handleItemClick}\n >\n <Flex justify=\"space-between\" align=\"center\" w=\"100%\">\n <Flex className=\"alepha-sidebar-item-content\" align=\"center\" gap={10}>\n <Box className=\"alepha-sidebar-item-icon\">\n {item.icon || <IconCircle size={16} />}\n </Box>\n <Box className=\"alepha-sidebar-item-label\">{item.label}</Box>\n </Flex>\n {hasChildren && (\n <Box className=\"alepha-sidebar-item-caret\">\n {isOpen ? (\n <IconChevronDown size={14} />\n ) : (\n <IconChevronRight size={14} />\n )}\n </Box>\n )}\n </Flex>\n </UnstyledButton>\n {hasChildren && isOpen && (\n <Box className=\"alepha-sidebar-children\" data-parent-level={level}>\n {(level === 0 || level === 1) && (\n <Box className=\"alepha-sidebar-vertical-bar\" />\n )}\n <Box className=\"alepha-sidebar-children-items\">\n {item.children!.map((child) => (\n <SidebarItem\n key={child.id}\n item={child}\n level={level + 1}\n openIds={openIds}\n onToggle={onToggle}\n onItemClick={onItemClick}\n />\n ))}\n </Box>\n </Box>\n )}\n </Box>\n );\n};\n","import type { TObject } from \"@alepha/core\";\nimport type { FormModel } from \"@alepha/react-form\";\nimport { Flex, Grid } from \"@mantine/core\";\nimport type { ReactNode } from \"react\";\nimport Action, { type ActionSubmitProps } from \"./Action\";\nimport Control, { type ControlProps } from \"./Control\";\n\nexport interface TypeFormProps<T extends TObject> {\n form: FormModel<T>;\n columns?:\n | number\n | {\n base?: number;\n xs?: number;\n sm?: number;\n md?: number;\n lg?: number;\n xl?: number;\n };\n children?: (input: FormModel<T>[\"input\"]) => ReactNode;\n controlProps?: Partial<Omit<ControlProps, \"input\">>;\n skipFormElement?: boolean;\n skipSubmitButton?: boolean;\n submitButtonProps?: Partial<Omit<ActionSubmitProps, \"form\">>;\n resetButtonProps?: Partial<Omit<ActionSubmitProps, \"form\">>;\n}\n\n/**\n * TypeForm component that automatically renders all form inputs based on schema.\n * Uses the Control component to render individual fields and Mantine Grid for responsive layout.\n *\n * @example\n * ```tsx\n * import { t } from \"alepha\";\n * import { useForm } from \"@alepha/react-form\";\n * import { TypeForm } from \"@alepha/ui\";\n *\n * const form = useForm({\n * schema: t.object({\n * username: t.text(),\n * email: t.text(),\n * age: t.integer(),\n * subscribe: t.boolean(),\n * }),\n * handler: (values) => {\n * console.log(values);\n * },\n * });\n *\n * return <TypeForm form={form} columns={2} />;\n * ```\n */\nconst TypeForm = <T extends TObject>(props: TypeFormProps<T>) => {\n const {\n form,\n columns = 3,\n children,\n controlProps,\n skipFormElement = false,\n skipSubmitButton = false,\n submitButtonProps,\n } = props;\n\n if (!form.options?.schema?.properties) {\n return null;\n }\n\n const fieldNames = Object.keys(form.options.schema.properties);\n\n // Filter out unsupported field types (objects only, arrays are now supported)\n const supportedFields = fieldNames.filter((fieldName) => {\n const field = form.input[fieldName as keyof typeof form.input];\n if (!field || typeof field !== \"object\" || !(\"schema\" in field)) {\n return false;\n }\n\n const schema: any = field.schema;\n\n // Skip if it's an object (not supported by Control)\n // Arrays are now supported via ControlSelect (MultiSelect/TagsInput)\n if (\"type\" in schema) {\n if (schema.type === \"object\") {\n return false;\n }\n }\n\n // Check if it has properties (nested object)\n if (\"properties\" in schema && schema.properties) {\n return false;\n }\n\n return true;\n });\n\n // Handle column configuration with defaults: xs=1, sm=2, lg=3\n const colSpan =\n typeof columns === \"number\"\n ? {\n xs: 12,\n sm: 6,\n lg: 12 / columns,\n }\n : {\n base: columns.base ? 12 / columns.base : undefined,\n xs: columns.xs ? 12 / columns.xs : 12,\n sm: columns.sm ? 12 / columns.sm : 6,\n md: columns.md ? 12 / columns.md : undefined,\n lg: columns.lg ? 12 / columns.lg : 4,\n xl: columns.xl ? 12 / columns.xl : undefined,\n };\n\n const renderFields = () => {\n if (children) {\n return <>{children(form.input)}</>;\n }\n\n return (\n <Grid>\n {supportedFields.map((fieldName) => {\n const field = form.input[fieldName as keyof typeof form.input];\n\n // Type guard to ensure field has the expected structure\n if (!field || typeof field !== \"object\" || !(\"schema\" in field)) {\n return null;\n }\n\n return (\n <Grid.Col key={fieldName} span={colSpan}>\n <Control input={field as any} {...controlProps} />\n </Grid.Col>\n );\n })}\n </Grid>\n );\n };\n\n const content = (\n <Flex direction={\"column\"} gap={\"sm\"}>\n {renderFields()}\n {!skipSubmitButton && (\n <Flex>\n <Action form={form} {...submitButtonProps}>\n {submitButtonProps?.children ?? \"Submit\"}\n </Action>\n <button type={\"reset\"}>Reset</button>\n </Flex>\n )}\n </Flex>\n );\n\n if (skipFormElement) {\n return content;\n }\n\n return <form {...form.props}>{content}</form>;\n};\n\nexport default TypeForm;\n","import { useInject } from \"@alepha/react\";\nimport { DialogService } from \"../services/DialogService.tsx\";\n\n/**\n * Use this hook to access the Dialog Service for showing various dialog types.\n *\n * @example\n * const dialog = useDialog();\n * await dialog.alert({ title: \"Alert\", message: \"This is an alert message\" });\n * const confirmed = await dialog.confirm({ title: \"Confirm\", message: \"Are you sure?\" });\n * const input = await dialog.prompt({ title: \"Input\", message: \"Enter your name:\" });\n */\nexport const useDialog = (): DialogService => {\n return useInject(DialogService);\n};\n","import { useInject } from \"@alepha/react\";\nimport { ToastService } from \"../services/ToastService.tsx\";\n\n/**\n * Use this hook to access the Toast Service for showing notifications.\n *\n * @example\n * const toast = useToast();\n * toast.success({ message: \"Operation completed successfully!\" });\n * toast.error({ title: \"Error\", message: \"Something went wrong\" });\n */\nexport const useToast = (): ToastService => {\n return useInject(ToastService);\n};\n","import { $module } from \"@alepha/core\";\nimport { AlephaReact } from \"@alepha/react\";\nimport type { ControlProps } from \"./components/Control.tsx\";\nimport { RootRouter } from \"./RootRouter.ts\";\nimport { DialogService } from \"./services/DialogService.tsx\";\nimport { ToastService } from \"./services/ToastService.tsx\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport { Flex } from \"@mantine/core\";\nexport { default as Action } from \"./components/Action.tsx\";\nexport { default as AlephaMantineProvider } from \"./components/AlephaMantineProvider.tsx\";\nexport { default as Control } from \"./components/Control.tsx\";\nexport { default as ControlDate } from \"./components/ControlDate.tsx\";\nexport { default as ControlSelect } from \"./components/ControlSelect.tsx\";\nexport { default as DarkModeButton } from \"./components/DarkModeButton.tsx\";\nexport type {\n DataTableColumn,\n DataTableFilter,\n DataTableProps,\n DataTableSort,\n} from \"./components/DataTable.tsx\";\nexport { default as DataTable } from \"./components/DataTable.tsx\";\nexport { AlertDialog } from \"./components/dialogs/AlertDialog.tsx\";\nexport { ConfirmDialog } from \"./components/dialogs/ConfirmDialog.tsx\";\nexport { PromptDialog } from \"./components/dialogs/PromptDialog.tsx\";\nexport { default as Omnibar } from \"./components/Omnibar.tsx\";\nexport type {\n MenuItem,\n SidebarItemProps,\n SidebarProps,\n} from \"./components/Sidebar.tsx\";\nexport { Sidebar, SidebarItem } from \"./components/Sidebar.tsx\";\nexport { default as TypeForm } from \"./components/TypeForm.tsx\";\nexport { useDialog } from \"./hooks/useDialog.ts\";\nexport { useToast } from \"./hooks/useToast.ts\";\nexport * from \"./RootRouter.ts\";\nexport type {\n AlertDialogOptions,\n AlertDialogProps,\n BaseDialogOptions,\n ConfirmDialogOptions,\n ConfirmDialogProps,\n PromptDialogOptions,\n PromptDialogProps,\n} from \"./services/DialogService.tsx\";\nexport { DialogService } from \"./services/DialogService.tsx\";\nexport { ToastService } from \"./services/ToastService.tsx\";\nexport * from \"./utils/icons.tsx\";\nexport * from \"./utils/string.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"typebox\" {\n interface TSchemaOptions {\n $control?: Omit<ControlProps, \"input\">;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Mantine\n *\n * @module alepha.ui\n */\nexport const AlephaUI = $module({\n name: \"alepha.ui\",\n services: [AlephaReact, DialogService, ToastService, RootRouter],\n});\n"],"mappings":"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"}