@alepha/ui 0.18.1 → 0.18.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/{AdminApiKeys-C-6_Q-lH.js → AdminApiKeys-Dy_k-4Vd.js} +17 -38
- package/dist/admin/AdminApiKeys-Dy_k-4Vd.js.map +1 -0
- package/dist/admin/{AdminAudits-Bgbf04hO.js → AdminAudits-CKiFMSSU.js} +23 -19
- package/dist/admin/AdminAudits-CKiFMSSU.js.map +1 -0
- package/dist/admin/AdminDashboard-PhC_dZqo.js +67 -0
- package/dist/admin/AdminDashboard-PhC_dZqo.js.map +1 -0
- package/dist/admin/{AdminFiles-B9a7G3cY.js → AdminFiles-DFTjijGp.js} +3 -7
- package/dist/admin/AdminFiles-DFTjijGp.js.map +1 -0
- package/dist/admin/{AdminJobDashboard-DaTwf5OY.js → AdminJobDashboard-BL8gGPDp.js} +2 -2
- package/dist/admin/{AdminJobDashboard-DaTwf5OY.js.map → AdminJobDashboard-BL8gGPDp.js.map} +1 -1
- package/dist/admin/{AdminJobExecutions-B9cek5dl.js → AdminJobExecutions-D9E-CS-U.js} +24 -36
- package/dist/admin/AdminJobExecutions-D9E-CS-U.js.map +1 -0
- package/dist/admin/{AdminJobRegistry-DFgV3oqx.js → AdminJobRegistry-Ci9ue1zC.js} +10 -18
- package/dist/admin/AdminJobRegistry-Ci9ue1zC.js.map +1 -0
- package/dist/admin/AdminLayout-I6TlUMPc.js +61 -0
- package/dist/admin/AdminLayout-I6TlUMPc.js.map +1 -0
- package/dist/admin/AdminNotifications-ZPHCYrv7.js +542 -0
- package/dist/admin/AdminNotifications-ZPHCYrv7.js.map +1 -0
- package/dist/admin/{AdminParameters-DHw9ATgl.js → AdminParameters-CqgvhRsb.js} +120 -105
- package/dist/admin/AdminParameters-CqgvhRsb.js.map +1 -0
- package/dist/admin/{AdminSessions-BhGJPI3z.js → AdminSessions-Bz5NRuoW.js} +48 -53
- package/dist/admin/AdminSessions-Bz5NRuoW.js.map +1 -0
- package/dist/admin/{AdminUserLayout-BdC4Te8m.js → AdminUserLayout-lXT6I0Qq.js} +14 -8
- package/dist/admin/AdminUserLayout-lXT6I0Qq.js.map +1 -0
- package/dist/admin/{AdminUserProfile-DAt23fqY.js → AdminUserProfile-vFBLoJ3h.js} +3 -3
- package/dist/admin/{AdminUserProfile-DAt23fqY.js.map → AdminUserProfile-vFBLoJ3h.js.map} +1 -1
- package/dist/admin/{AdminUserSessions-1uzcx02z.js → AdminUserSessions-CT_YDim0.js} +33 -35
- package/dist/admin/AdminUserSessions-CT_YDim0.js.map +1 -0
- package/dist/admin/AdminUsers-D1UfGya9.js +206 -0
- package/dist/admin/AdminUsers-D1UfGya9.js.map +1 -0
- package/dist/admin/{AuthLayout-DFJvCvzw.js → AuthLayout-_frhdgOO.js} +2 -2
- package/dist/admin/{AuthLayout-DFJvCvzw.js.map → AuthLayout-_frhdgOO.js.map} +1 -1
- package/dist/admin/{IconGoogle-CSQLPYwX.js → IconGoogle-Ch1m3Uzl.js} +1 -1
- package/dist/admin/{IconGoogle-CSQLPYwX.js.map → IconGoogle-Ch1m3Uzl.js.map} +1 -1
- package/dist/admin/Login-xtNmQtGh.js +275 -0
- package/dist/admin/Login-xtNmQtGh.js.map +1 -0
- package/dist/{auth/Profile-BMX_Ar_s.js → admin/Profile-_AtPUwAP.js} +31 -27
- package/dist/admin/Profile-_AtPUwAP.js.map +1 -0
- package/dist/admin/{Register-Cs10l8vX.js → Register-JcCjHUUn.js} +199 -143
- package/dist/admin/Register-JcCjHUUn.js.map +1 -0
- package/dist/admin/{ResetPassword-BwDdfkGH.js → ResetPassword-CwGBPLJO.js} +7 -7
- package/dist/admin/ResetPassword-CwGBPLJO.js.map +1 -0
- package/dist/admin/{VerifyEmail-DfXHAiQl.js → VerifyEmail-hNxWejWf.js} +23 -8
- package/dist/admin/VerifyEmail-hNxWejWf.js.map +1 -0
- package/dist/admin/{core-2xoLiT0o.js → core-CYaRQ8O-.js} +2082 -688
- package/dist/admin/core-CYaRQ8O-.js.map +1 -0
- package/dist/admin/index.d.ts +112 -48
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +467 -69
- package/dist/admin/index.js.map +1 -1
- package/dist/auth/{AuthLayout-CAE1pX9s.js → AuthLayout-AvLlcLjS.js} +2 -2
- package/dist/auth/{AuthLayout-CAE1pX9s.js.map → AuthLayout-AvLlcLjS.js.map} +1 -1
- package/dist/auth/Login-BA1E8IZl.js +275 -0
- package/dist/auth/Login-BA1E8IZl.js.map +1 -0
- package/dist/{admin/Profile-B-c9pCPf.js → auth/Profile-YcWdeuFz.js} +31 -27
- package/dist/auth/Profile-YcWdeuFz.js.map +1 -0
- package/dist/auth/{Register-6hi_cpfF.js → Register-CPhEO5MG.js} +198 -142
- package/dist/auth/Register-CPhEO5MG.js.map +1 -0
- package/dist/{demo/ResetPassword-DWN0lzr5.js → auth/ResetPassword-DCtGcneA.js} +7 -7
- package/dist/auth/ResetPassword-DCtGcneA.js.map +1 -0
- package/dist/{demo/VerifyEmail-DZWL72K4.js → auth/VerifyEmail-DkH7NBfn.js} +23 -8
- package/dist/auth/VerifyEmail-DkH7NBfn.js.map +1 -0
- package/dist/auth/{core-niW0sFLv.js → core-D5jIAVF2.js} +1385 -329
- package/dist/auth/core-D5jIAVF2.js.map +1 -0
- package/dist/auth/index.d.ts +105 -49
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +29 -26
- package/dist/auth/index.js.map +1 -1
- package/dist/core/index.d.ts +210 -74
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +2247 -834
- package/dist/core/index.js.map +1 -1
- package/dist/demo/{AuthLayout-jLa0aKsI.js → AuthLayout-Brri4A-L.js} +2 -2
- package/dist/demo/{AuthLayout-jLa0aKsI.js.map → AuthLayout-Brri4A-L.js.map} +1 -1
- package/dist/demo/DemoButton-wiCxZZ_L.js +182 -0
- package/dist/demo/DemoButton-wiCxZZ_L.js.map +1 -0
- package/dist/demo/DemoControlSelect-D7ILObVg.js +305 -0
- package/dist/demo/DemoControlSelect-D7ILObVg.js.map +1 -0
- package/dist/demo/DemoDataTable-DZ5Y8pFX.js +362 -0
- package/dist/demo/DemoDataTable-DZ5Y8pFX.js.map +1 -0
- package/dist/demo/{DemoDialog-4ItHLf9t.js → DemoDialog-CUWdLHim.js} +2 -2
- package/dist/demo/{DemoDialog-4ItHLf9t.js.map → DemoDialog-CUWdLHim.js.map} +1 -1
- package/dist/demo/{DemoFlex-EtVq8QfX.js → DemoFlex-a8OhMMvq.js} +3 -3
- package/dist/demo/{DemoFlex-EtVq8QfX.js.map → DemoFlex-a8OhMMvq.js.map} +1 -1
- package/dist/demo/{DemoHeading-BS-vGfkI.js → DemoHeading-C13OVDfS.js} +3 -3
- package/dist/demo/{DemoHeading-BS-vGfkI.js.map → DemoHeading-C13OVDfS.js.map} +1 -1
- package/dist/demo/{DemoHome-Clbn8AmS.js → DemoHome-D_De3UiT.js} +2 -2
- package/dist/demo/{DemoHome-Clbn8AmS.js.map → DemoHome-D_De3UiT.js.map} +1 -1
- package/dist/demo/{DemoJsonViewer-DkIX_ky2.js → DemoJsonViewer-B50s9aGM.js} +3 -3
- package/dist/demo/{DemoJsonViewer-DkIX_ky2.js.map → DemoJsonViewer-B50s9aGM.js.map} +1 -1
- package/dist/demo/{DemoLayout-C56xb5EE.js → DemoLayout-CHU8WTwO.js} +14 -5
- package/dist/demo/DemoLayout-CHU8WTwO.js.map +1 -0
- package/dist/demo/{DemoLogin-BZwpicOS.js → DemoLogin-BBlrWpml.js} +49 -32
- package/dist/demo/DemoLogin-BBlrWpml.js.map +1 -0
- package/dist/demo/{DemoRegister-C7_qc4MJ.js → DemoRegister-BuNE3_-f.js} +49 -50
- package/dist/demo/DemoRegister-BuNE3_-f.js.map +1 -0
- package/dist/demo/{DemoResetPassword-BI1Ct4Dw.js → DemoResetPassword-D_IjjjOJ.js} +12 -16
- package/dist/demo/DemoResetPassword-D_IjjjOJ.js.map +1 -0
- package/dist/demo/{DemoSidebar-CcBo4ltC.js → DemoSidebar-Giy2HRBD.js} +3 -3
- package/dist/demo/{DemoSidebar-CcBo4ltC.js.map → DemoSidebar-Giy2HRBD.js.map} +1 -1
- package/dist/demo/{DemoText-CzXuUn3g.js → DemoText-ubcw-vog.js} +3 -3
- package/dist/demo/{DemoText-CzXuUn3g.js.map → DemoText-ubcw-vog.js.map} +1 -1
- package/dist/demo/{DemoToast-BgHDhWrX.js → DemoToast-9die_dYT.js} +2 -2
- package/dist/demo/{DemoToast-BgHDhWrX.js.map → DemoToast-9die_dYT.js.map} +1 -1
- package/dist/demo/{DemoTypeForm-DDzWoMSV.js → DemoTypeForm-D_d6OVKL.js} +8 -4
- package/dist/demo/DemoTypeForm-D_d6OVKL.js.map +1 -0
- package/dist/demo/DemoVerifyEmail-B43KlF4F.js +34 -0
- package/dist/demo/DemoVerifyEmail-B43KlF4F.js.map +1 -0
- package/dist/demo/Login-C12N4oGs.js +275 -0
- package/dist/demo/Login-C12N4oGs.js.map +1 -0
- package/dist/demo/{Profile-CWqti7FB.js → Profile-DS5q4vOh.js} +31 -27
- package/dist/demo/Profile-DS5q4vOh.js.map +1 -0
- package/dist/demo/{Register-a70LPgs2.js → Register-B4hLBeEv.js} +198 -142
- package/dist/demo/Register-B4hLBeEv.js.map +1 -0
- package/dist/{auth/ResetPassword-CqfTk1FI.js → demo/ResetPassword-D8g9ha1N.js} +7 -7
- package/dist/demo/ResetPassword-D8g9ha1N.js.map +1 -0
- package/dist/demo/{Showcase-Dq3MISpd.js → Showcase-D6Fxt4X4.js} +64 -65
- package/dist/demo/Showcase-D6Fxt4X4.js.map +1 -0
- package/dist/{auth/VerifyEmail-nWiSTMjF.js → demo/VerifyEmail-BjDo0cZA.js} +23 -8
- package/dist/demo/VerifyEmail-BjDo0cZA.js.map +1 -0
- package/dist/demo/{auth-d6n3xbug.js → auth-ByVTreDl.js} +8 -8
- package/dist/demo/{auth-d6n3xbug.js.map → auth-ByVTreDl.js.map} +1 -1
- package/dist/demo/{core-RCUw1Q-a.js → core-DFgB3yU4.js} +2182 -756
- package/dist/demo/core-DFgB3yU4.js.map +1 -0
- package/dist/demo/index.d.ts +1 -0
- package/dist/demo/index.d.ts.map +1 -1
- package/dist/demo/index.js +24 -18
- package/dist/demo/index.js.map +1 -1
- package/package.json +7 -7
- package/src/admin/{AdminRouter.ts → AdminRouter.tsx} +150 -18
- package/src/admin/components/AdminDashboard.tsx +52 -0
- package/src/admin/components/AdminLayout.tsx +32 -40
- package/src/admin/components/audits/AdminAudits.tsx +22 -16
- package/src/admin/components/files/AdminFiles.tsx +1 -6
- package/src/admin/components/jobs/AdminJobExecutions.tsx +33 -39
- package/src/admin/components/jobs/AdminJobRegistry.tsx +9 -18
- package/src/admin/components/keys/AdminApiKeys.tsx +23 -41
- package/src/admin/components/notifications/AdminNotifications.tsx +519 -0
- package/src/admin/components/parameters/ParameterDetails.tsx +12 -270
- package/src/admin/components/parameters/ParameterDetailsConfigForm.tsx +238 -0
- package/src/admin/components/parameters/ParameterDetailsLoading.tsx +24 -0
- package/src/admin/components/parameters/ParameterHistory.tsx +10 -11
- package/src/admin/components/parameters/ParameterTree.tsx +28 -184
- package/src/admin/components/parameters/ParameterTreeNode.tsx +151 -0
- package/src/admin/components/sessions/AdminSessions.tsx +71 -71
- package/src/admin/components/shared/AdminResourceHeader.tsx +2 -25
- package/src/admin/components/shared/AdminResourceHeaderMenuItem.tsx +37 -0
- package/src/admin/components/shared/AdminResourceTabs.tsx +2 -26
- package/src/admin/components/shared/AdminResourceTabsItem.tsx +36 -0
- package/src/admin/components/users/AdminUserSessions.tsx +33 -31
- package/src/admin/components/users/AdminUsers.tsx +184 -72
- package/src/admin/index.ts +2 -2
- package/src/admin/primitives/$uiAdmin.ts +1 -1
- package/src/auth/components/Login.tsx +188 -121
- package/src/auth/components/Profile.tsx +1 -22
- package/src/auth/components/ProfileField.tsx +39 -0
- package/src/auth/components/Register.tsx +215 -158
- package/src/auth/components/ResetPassword.tsx +7 -11
- package/src/auth/components/VerifyEmail.tsx +35 -10
- package/src/auth/components/buttons/UserButton.tsx +20 -24
- package/src/auth/index.ts +1 -0
- package/src/core/atoms/alephaSidebarAtom.ts +1 -1
- package/src/core/atoms/alephaThemeListAtom.ts +14 -1
- package/src/core/atoms/alephaThemeOverridesAtom.ts +17 -0
- package/src/core/atoms/themes/editorial.ts +184 -0
- package/src/core/atoms/themes/monochrome.ts +197 -0
- package/src/core/atoms/themes/rosePine.ts +208 -0
- package/src/core/atoms/themes/softBrutalism.ts +221 -0
- package/src/core/atoms/themes/terminal.ts +186 -0
- package/src/core/components/Flex.tsx +101 -1
- package/src/core/components/Text.tsx +1 -1
- package/src/core/components/buttons/ActionButton.tsx +109 -87
- package/src/core/components/buttons/DarkModeButton.tsx +3 -3
- package/src/core/components/buttons/LanguageButton.tsx +1 -1
- package/src/core/components/buttons/OmnibarButton.tsx +1 -2
- package/src/core/components/buttons/ThemeButton.tsx +40 -11
- package/src/core/components/buttons/ThemeExpertModal.tsx +184 -0
- package/src/core/components/buttons/ToggleSidebarButton.tsx +1 -2
- package/src/core/components/data/DetailDrawer.tsx +102 -96
- package/src/core/components/data/DetailList.tsx +2 -1
- package/src/core/components/layout/AppBar.tsx +10 -0
- package/src/core/components/layout/Breadcrumb.tsx +3 -6
- package/src/core/components/layout/DashboardShell.tsx +28 -11
- package/src/core/components/layout/Sidebar.tsx +18 -235
- package/src/core/components/layout/SidebarCollapsedItem.tsx +91 -0
- package/src/core/components/layout/SidebarItem.tsx +146 -0
- package/src/core/components/layout/index.ts +3 -1
- package/src/core/constants/ui.ts +5 -5
- package/src/core/form/components/Control.tsx +31 -29
- package/src/core/form/components/ControlArray.tsx +13 -39
- package/src/core/form/components/ControlDate.tsx +10 -21
- package/src/core/form/components/ControlNumber.tsx +4 -33
- package/src/core/form/components/ControlQueryBuilder.tsx +12 -175
- package/src/core/form/components/ControlQueryBuilderHelp.tsx +165 -0
- package/src/core/form/components/ControlSelect.browser.spec.tsx +343 -0
- package/src/core/form/components/ControlSelect.tsx +294 -92
- package/src/core/form/components/TypeForm.browser.spec.tsx +3 -3
- package/src/core/form/components/TypeForm.tsx +5 -2
- package/src/core/form/index.ts +8 -1
- package/src/core/form/utils/parseInput.ts +7 -3
- package/src/core/hooks/useTheme.ts +26 -3
- package/src/core/index.ts +9 -2
- package/src/core/interfaces/AlephaTheme.ts +2 -0
- package/src/core/json/components/JsonViewer.tsx +103 -319
- package/src/core/json/components/JsonViewerCopyButton.tsx +46 -0
- package/src/core/json/components/JsonViewerRowNode.tsx +120 -0
- package/src/core/json/components/JsonViewerShared.ts +76 -0
- package/src/core/providers/ThemeProvider.ts +108 -8
- package/src/core/services/DialogService.tsx +24 -3
- package/src/core/styles.css +33 -20
- package/src/core/table/components/ColumnPicker.tsx +3 -3
- package/src/core/table/components/DataTable.tsx +233 -143
- package/src/core/table/components/DataTableFilters.tsx +6 -16
- package/src/core/table/components/DataTablePagination.tsx +58 -29
- package/src/core/table/components/DataTableToolbar.tsx +16 -7
- package/src/core/table/components/FilterPicker.tsx +3 -3
- package/src/core/table/index.ts +1 -0
- package/src/core/table/interfaces/types.ts +42 -9
- package/src/core/utils/icons.tsx +2 -2
- package/src/demo/DemoRouter.ts +8 -1
- package/src/demo/components/DemoLayout.tsx +12 -2
- package/src/demo/components/auth/DemoLogin.tsx +35 -28
- package/src/demo/components/auth/DemoRegister.tsx +35 -49
- package/src/demo/components/auth/DemoResetPassword.tsx +5 -9
- package/src/demo/components/auth/DemoVerifyEmail.tsx +7 -6
- package/src/demo/components/core/DemoButton.tsx +123 -103
- package/src/demo/components/core/DemoControlSelect.tsx +325 -0
- package/src/demo/components/core/DemoDataTable.tsx +255 -241
- package/src/demo/components/core/DemoTypeForm.tsx +7 -2
- package/src/demo/components/shared/MacWindow.tsx +5 -11
- package/src/demo/components/shared/Showcase.tsx +28 -42
- package/dist/admin/AdminApiKeys-C-6_Q-lH.js.map +0 -1
- package/dist/admin/AdminAudits-Bgbf04hO.js.map +0 -1
- package/dist/admin/AdminFiles-B9a7G3cY.js.map +0 -1
- package/dist/admin/AdminJobExecutions-B9cek5dl.js.map +0 -1
- package/dist/admin/AdminJobRegistry-DFgV3oqx.js.map +0 -1
- package/dist/admin/AdminLayout-DHsvWxVB.js +0 -70
- package/dist/admin/AdminLayout-DHsvWxVB.js.map +0 -1
- package/dist/admin/AdminParameters-DHw9ATgl.js.map +0 -1
- package/dist/admin/AdminSessions-BhGJPI3z.js.map +0 -1
- package/dist/admin/AdminUserLayout-BdC4Te8m.js.map +0 -1
- package/dist/admin/AdminUserSessions-1uzcx02z.js.map +0 -1
- package/dist/admin/AdminUsers-C85c3eiQ.js +0 -121
- package/dist/admin/AdminUsers-C85c3eiQ.js.map +0 -1
- package/dist/admin/Login-BGheURrg.js +0 -219
- package/dist/admin/Login-BGheURrg.js.map +0 -1
- package/dist/admin/Profile-B-c9pCPf.js.map +0 -1
- package/dist/admin/Register-Cs10l8vX.js.map +0 -1
- package/dist/admin/ResetPassword-BwDdfkGH.js.map +0 -1
- package/dist/admin/VerifyEmail-DfXHAiQl.js.map +0 -1
- package/dist/admin/auth-Dr0Cf8I7.js +0 -319
- package/dist/admin/auth-Dr0Cf8I7.js.map +0 -1
- package/dist/admin/core-2xoLiT0o.js.map +0 -1
- package/dist/auth/Login-Denw_UGy.js +0 -219
- package/dist/auth/Login-Denw_UGy.js.map +0 -1
- package/dist/auth/Profile-BMX_Ar_s.js.map +0 -1
- package/dist/auth/Register-6hi_cpfF.js.map +0 -1
- package/dist/auth/ResetPassword-CqfTk1FI.js.map +0 -1
- package/dist/auth/VerifyEmail-nWiSTMjF.js.map +0 -1
- package/dist/auth/core-niW0sFLv.js.map +0 -1
- package/dist/demo/DemoButton-BmaWZVwf.js +0 -178
- package/dist/demo/DemoButton-BmaWZVwf.js.map +0 -1
- package/dist/demo/DemoDataTable-Z9xyV221.js +0 -362
- package/dist/demo/DemoDataTable-Z9xyV221.js.map +0 -1
- package/dist/demo/DemoLayout-C56xb5EE.js.map +0 -1
- package/dist/demo/DemoLogin-BZwpicOS.js.map +0 -1
- package/dist/demo/DemoRegister-C7_qc4MJ.js.map +0 -1
- package/dist/demo/DemoResetPassword-BI1Ct4Dw.js.map +0 -1
- package/dist/demo/DemoTypeForm-DDzWoMSV.js.map +0 -1
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js +0 -30
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js.map +0 -1
- package/dist/demo/Login-hSOU3jZc.js +0 -219
- package/dist/demo/Login-hSOU3jZc.js.map +0 -1
- package/dist/demo/Profile-CWqti7FB.js.map +0 -1
- package/dist/demo/Register-a70LPgs2.js.map +0 -1
- package/dist/demo/ResetPassword-DWN0lzr5.js.map +0 -1
- package/dist/demo/Showcase-Dq3MISpd.js.map +0 -1
- package/dist/demo/VerifyEmail-DZWL72K4.js.map +0 -1
- package/dist/demo/core-RCUw1Q-a.js.map +0 -1
- package/src/demo/styles.css +0 -0
|
@@ -29,10 +29,71 @@ export interface FlexProps extends MantineFlexProps {
|
|
|
29
29
|
* Shorthand for direction="column".
|
|
30
30
|
*/
|
|
31
31
|
col?: boolean;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Set ground to `var(--alepha-ground)`.
|
|
35
|
+
*/
|
|
36
|
+
ground?: boolean;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Set ground to `var(--alepha-surface)`.
|
|
40
|
+
*/
|
|
41
|
+
surface?: boolean;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Set ground to `var(--alepha-elevated)`.
|
|
45
|
+
*/
|
|
46
|
+
elevated?: boolean;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Add rounded corners to the container. If `true`, a default border radius will be applied. You can also specify a custom border radius value (e.g., "sm", "md", "lg", or any valid CSS border-radius value).
|
|
50
|
+
*/
|
|
51
|
+
rounded?: boolean | number | string;
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Add a border to the container. The color will be determined by the current theme.
|
|
55
|
+
*/
|
|
56
|
+
bordered?: boolean;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Add a top border only.
|
|
60
|
+
*/
|
|
61
|
+
borderedTop?: boolean;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Add a bottom border only.
|
|
65
|
+
*/
|
|
66
|
+
borderedBottom?: boolean;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Add a shadow to the container. The intensity will be determined by the current theme.
|
|
70
|
+
*/
|
|
71
|
+
shadowed?: boolean | number | string;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Set overflow to "auto" to enable scrolling when content overflows the container.
|
|
75
|
+
*/
|
|
76
|
+
overflow?: boolean;
|
|
32
77
|
}
|
|
33
78
|
|
|
34
79
|
const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
|
|
35
|
-
const {
|
|
80
|
+
const {
|
|
81
|
+
fill,
|
|
82
|
+
center,
|
|
83
|
+
centerX,
|
|
84
|
+
centerY,
|
|
85
|
+
col,
|
|
86
|
+
ground,
|
|
87
|
+
surface,
|
|
88
|
+
elevated,
|
|
89
|
+
rounded,
|
|
90
|
+
bordered,
|
|
91
|
+
borderedTop,
|
|
92
|
+
borderedBottom,
|
|
93
|
+
shadowed,
|
|
94
|
+
overflow,
|
|
95
|
+
...rest
|
|
96
|
+
} = props;
|
|
36
97
|
|
|
37
98
|
if (fill) {
|
|
38
99
|
rest.flex ??= 1;
|
|
@@ -55,6 +116,45 @@ const Flex = forwardRef<HTMLDivElement, FlexProps>((props, ref) => {
|
|
|
55
116
|
rest.align ??= "center";
|
|
56
117
|
}
|
|
57
118
|
|
|
119
|
+
if (ground) {
|
|
120
|
+
rest.bg = "var(--alepha-ground)";
|
|
121
|
+
} else if (surface) {
|
|
122
|
+
rest.bg = "var(--alepha-surface)";
|
|
123
|
+
} else if (elevated) {
|
|
124
|
+
rest.bg = "var(--alepha-elevated)";
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
if (rounded) {
|
|
128
|
+
rest.bdrs = rounded === true ? "md" : rounded;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (bordered) {
|
|
132
|
+
rest.bd = "1px solid var(--alepha-border)";
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (borderedTop) {
|
|
136
|
+
rest.style = {
|
|
137
|
+
borderTop: "1px solid var(--alepha-border)",
|
|
138
|
+
...((rest.style as object) ?? {}),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (borderedBottom) {
|
|
143
|
+
rest.style = {
|
|
144
|
+
borderBottom: "1px solid var(--alepha-border)",
|
|
145
|
+
...((rest.style as object) ?? {}),
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (shadowed) {
|
|
150
|
+
rest.className =
|
|
151
|
+
`${rest.className ?? ""} shadow-${shadowed === true ? "md" : shadowed}`.trim();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (overflow) {
|
|
155
|
+
rest.className = `${rest.className ?? ""} overflow-auto`.trim();
|
|
156
|
+
}
|
|
157
|
+
|
|
58
158
|
return <MantineFlex ref={ref} {...rest} />;
|
|
59
159
|
});
|
|
60
160
|
|
|
@@ -8,7 +8,6 @@ import {
|
|
|
8
8
|
type MenuItemProps,
|
|
9
9
|
type MenuProps,
|
|
10
10
|
type MenuTargetProps,
|
|
11
|
-
ThemeIcon,
|
|
12
11
|
type ThemeIconProps,
|
|
13
12
|
Tooltip,
|
|
14
13
|
type TooltipProps,
|
|
@@ -113,6 +112,9 @@ export interface ActionMenuConfig {
|
|
|
113
112
|
export interface ActionCommonProps extends ButtonProps {
|
|
114
113
|
children?: ReactNode;
|
|
115
114
|
|
|
115
|
+
/**
|
|
116
|
+
* If set, the button will show only the icon on smaller screens and reveal the text from the specified breakpoint and up.
|
|
117
|
+
*/
|
|
116
118
|
textVisibleFrom?: "xs" | "sm" | "md" | "lg" | "xl";
|
|
117
119
|
|
|
118
120
|
/**
|
|
@@ -140,6 +142,11 @@ export interface ActionCommonProps extends ButtonProps {
|
|
|
140
142
|
*/
|
|
141
143
|
icon?: ReactNode | ComponentType;
|
|
142
144
|
|
|
145
|
+
/**
|
|
146
|
+
* Size of the icon. Can be a number (pixels) or a string (e.g., "1em", "20px").
|
|
147
|
+
*/
|
|
148
|
+
iconSize?: number | string;
|
|
149
|
+
|
|
143
150
|
/**
|
|
144
151
|
* Additional props to pass to the ThemeIcon wrapping the icon.
|
|
145
152
|
*/
|
|
@@ -149,6 +156,11 @@ export interface ActionCommonProps extends ButtonProps {
|
|
|
149
156
|
* Visual intent of the action button.
|
|
150
157
|
*/
|
|
151
158
|
intent?: "primary" | "success" | "danger" | "warning" | "info" | "none";
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Active state styling for navigation actions. When set, the button will apply active styles based on the current route.
|
|
162
|
+
*/
|
|
163
|
+
variant?: ButtonProps["variant"] | "minimal";
|
|
152
164
|
}
|
|
153
165
|
|
|
154
166
|
export type ActionProps = ActionCommonProps &
|
|
@@ -162,95 +174,21 @@ export type ActionProps = ActionCommonProps &
|
|
|
162
174
|
|
|
163
175
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
164
176
|
|
|
165
|
-
//
|
|
166
|
-
const ActionMenuItem = (props: {
|
|
167
|
-
item: ActionMenuItem;
|
|
168
|
-
index: number;
|
|
169
|
-
}): ReactNode => {
|
|
170
|
-
const { item, index } = props;
|
|
171
|
-
|
|
172
|
-
const router = useRouter();
|
|
173
|
-
const action = useAction(
|
|
174
|
-
{
|
|
175
|
-
handler: async (e: any) => {
|
|
176
|
-
await item.onClick?.();
|
|
177
|
-
},
|
|
178
|
-
},
|
|
179
|
-
[item.onClick],
|
|
180
|
-
);
|
|
181
|
-
|
|
182
|
-
// Render divider
|
|
183
|
-
if (item.type === "divider") {
|
|
184
|
-
return <Menu.Divider key={index} />;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// Render label
|
|
188
|
-
if (item.type === "label") {
|
|
189
|
-
return <Menu.Label key={index}>{item.label}</Menu.Label>;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Render submenu if it has children
|
|
193
|
-
if (item.children && item.children.length > 0) {
|
|
194
|
-
return (
|
|
195
|
-
<Menu key={index} trigger="hover" position="right-start" offset={2}>
|
|
196
|
-
<Menu.Target>
|
|
197
|
-
<Menu.Item
|
|
198
|
-
leftSection={item.icon}
|
|
199
|
-
rightSection={<IconChevronRight size={14} />}
|
|
200
|
-
>
|
|
201
|
-
{item.label}
|
|
202
|
-
</Menu.Item>
|
|
203
|
-
</Menu.Target>
|
|
204
|
-
<Menu.Dropdown>
|
|
205
|
-
{item.children.map((child, childIndex) => (
|
|
206
|
-
<ActionMenuItem item={child} index={childIndex} key={childIndex} />
|
|
207
|
-
))}
|
|
208
|
-
</Menu.Dropdown>
|
|
209
|
-
</Menu>
|
|
210
|
-
);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
const menuItemProps: MenuItemProps & ButtonHTMLAttributes<unknown> = {};
|
|
214
|
-
if (props.item.onClick) {
|
|
215
|
-
menuItemProps.onClick = action.run;
|
|
216
|
-
} else if (props.item.href) {
|
|
217
|
-
Object.assign(menuItemProps, router.anchor(props.item.href));
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// render regular menu item
|
|
221
|
-
return (
|
|
222
|
-
<Menu.Item
|
|
223
|
-
key={index}
|
|
224
|
-
leftSection={item.icon}
|
|
225
|
-
onClick={item.onClick}
|
|
226
|
-
color={item.color}
|
|
227
|
-
rightSection={
|
|
228
|
-
item.active ? (
|
|
229
|
-
<ThemeIcon size={"xs"} variant={"transparent"}>
|
|
230
|
-
<IconCheck />
|
|
231
|
-
</ThemeIcon>
|
|
232
|
-
) : undefined
|
|
233
|
-
}
|
|
234
|
-
{...menuItemProps}
|
|
235
|
-
>
|
|
236
|
-
{item.label}
|
|
237
|
-
</Menu.Item>
|
|
238
|
-
);
|
|
239
|
-
};
|
|
177
|
+
// ---------------------------------------------------------------------------------------------------------------------
|
|
240
178
|
|
|
241
179
|
const ActionButton = (_props: ActionProps) => {
|
|
242
180
|
const theme = useMantineTheme();
|
|
243
181
|
const props = { ..._props };
|
|
244
|
-
const { tooltip, menu, icon, ...restProps } = props;
|
|
245
182
|
|
|
246
|
-
if (props.variant === "
|
|
247
|
-
|
|
183
|
+
if (props.variant === "minimal") {
|
|
184
|
+
//props.variant = "default";
|
|
185
|
+
//props.bd = 0;
|
|
248
186
|
}
|
|
249
187
|
|
|
188
|
+
const { tooltip, menu, icon, iconSize, ...restProps } = props;
|
|
189
|
+
|
|
250
190
|
if (props.intent) {
|
|
251
|
-
if (props.intent === "
|
|
252
|
-
restProps.color ??= "gray";
|
|
253
|
-
} else if (props.intent === "primary") {
|
|
191
|
+
if (props.intent === "primary") {
|
|
254
192
|
restProps.color ??= theme.primaryColor;
|
|
255
193
|
} else if (props.intent === "success") {
|
|
256
194
|
restProps.c ??= "white";
|
|
@@ -268,15 +206,16 @@ const ActionButton = (_props: ActionProps) => {
|
|
|
268
206
|
|
|
269
207
|
if (props.icon) {
|
|
270
208
|
const sizes = ui.sizes.icon as Record<string, number>;
|
|
209
|
+
const iconSize = props.iconSize ?? sizes[props.size || "sm"];
|
|
271
210
|
const icon = isComponentType(props.icon) ? (
|
|
272
|
-
<props.icon size={
|
|
211
|
+
<props.icon size={iconSize} />
|
|
273
212
|
) : (
|
|
274
213
|
<span>{props.icon as ReactNode}</span>
|
|
275
214
|
);
|
|
276
215
|
|
|
277
216
|
if (!props.children) {
|
|
278
217
|
restProps.children = Children.only(icon);
|
|
279
|
-
restProps.
|
|
218
|
+
restProps.p ??= 8;
|
|
280
219
|
} else {
|
|
281
220
|
restProps.leftSection = icon;
|
|
282
221
|
}
|
|
@@ -302,7 +241,13 @@ const ActionButton = (_props: ActionProps) => {
|
|
|
302
241
|
</ActionButton>
|
|
303
242
|
</Flex>
|
|
304
243
|
<Flex w={"100%"} hiddenFrom={textVisibleFrom}>
|
|
305
|
-
<ActionButton
|
|
244
|
+
<ActionButton
|
|
245
|
+
px={"xs"}
|
|
246
|
+
{...rest}
|
|
247
|
+
aria-label={typeof children === "string" ? children : undefined}
|
|
248
|
+
tooltip={tooltip}
|
|
249
|
+
menu={menu}
|
|
250
|
+
>
|
|
306
251
|
{leftSection}
|
|
307
252
|
</ActionButton>
|
|
308
253
|
</Flex>
|
|
@@ -568,6 +513,7 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
|
|
|
568
513
|
propsActive,
|
|
569
514
|
routerGoOptions,
|
|
570
515
|
onClick: propsOnClick,
|
|
516
|
+
anchorProps: buttonAnchorProps,
|
|
571
517
|
anchor,
|
|
572
518
|
...buttonProps
|
|
573
519
|
} = props as ActionNavigationButtonProps & { onClick?: (e: any) => void };
|
|
@@ -592,13 +538,13 @@ const ActionNavigationButton = (props: ActionNavigationButtonProps) => {
|
|
|
592
538
|
buttonProps.className = `${className} ${classNameActive}`.trim();
|
|
593
539
|
}
|
|
594
540
|
|
|
595
|
-
if (
|
|
541
|
+
if (buttonAnchorProps || anchor) {
|
|
596
542
|
return (
|
|
597
543
|
<Anchor
|
|
598
544
|
component={"a"}
|
|
599
545
|
{...anchorProps}
|
|
600
546
|
{...(buttonProps as AnchorProps)}
|
|
601
|
-
{...
|
|
547
|
+
{...buttonAnchorProps}
|
|
602
548
|
onClick={combinedOnClick}
|
|
603
549
|
>
|
|
604
550
|
{props.children}
|
|
@@ -643,3 +589,79 @@ const ActionHrefButton = (props: ActionNavigationButtonProps) => {
|
|
|
643
589
|
};
|
|
644
590
|
|
|
645
591
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
592
|
+
|
|
593
|
+
// Helper function to render menu items recursively
|
|
594
|
+
const ActionMenuItem = (props: {
|
|
595
|
+
item: ActionMenuItem;
|
|
596
|
+
index: number;
|
|
597
|
+
}): ReactNode => {
|
|
598
|
+
const { item, index } = props;
|
|
599
|
+
|
|
600
|
+
const router = useRouter();
|
|
601
|
+
const action = useAction(
|
|
602
|
+
{
|
|
603
|
+
handler: async (e: any) => {
|
|
604
|
+
await item.onClick?.();
|
|
605
|
+
},
|
|
606
|
+
},
|
|
607
|
+
[item.onClick],
|
|
608
|
+
);
|
|
609
|
+
|
|
610
|
+
// Render divider
|
|
611
|
+
if (item.type === "divider") {
|
|
612
|
+
return <Menu.Divider key={index} />;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
// Render label
|
|
616
|
+
if (item.type === "label") {
|
|
617
|
+
return <Menu.Label key={index}>{item.label}</Menu.Label>;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
// Render submenu if it has children
|
|
621
|
+
if (item.children && item.children.length > 0) {
|
|
622
|
+
return (
|
|
623
|
+
<Menu key={index} trigger="hover" position="right-start" offset={2}>
|
|
624
|
+
<Menu.Target>
|
|
625
|
+
<Menu.Item
|
|
626
|
+
leftSection={item.icon}
|
|
627
|
+
rightSection={<IconChevronRight size={14} />}
|
|
628
|
+
>
|
|
629
|
+
{item.label}
|
|
630
|
+
</Menu.Item>
|
|
631
|
+
</Menu.Target>
|
|
632
|
+
<Menu.Dropdown>
|
|
633
|
+
{item.children.map((child, childIndex) => (
|
|
634
|
+
<ActionMenuItem item={child} index={childIndex} key={childIndex} />
|
|
635
|
+
))}
|
|
636
|
+
</Menu.Dropdown>
|
|
637
|
+
</Menu>
|
|
638
|
+
);
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
const menuItemProps: MenuItemProps & ButtonHTMLAttributes<unknown> = {};
|
|
642
|
+
if (props.item.onClick) {
|
|
643
|
+
menuItemProps.onClick = action.run;
|
|
644
|
+
} else if (props.item.href) {
|
|
645
|
+
Object.assign(menuItemProps, router.anchor(props.item.href));
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
// render regular menu item
|
|
649
|
+
return (
|
|
650
|
+
<Menu.Item
|
|
651
|
+
key={index}
|
|
652
|
+
leftSection={
|
|
653
|
+
item.icon ??
|
|
654
|
+
(item.active ? (
|
|
655
|
+
<IconCheck size={ui.sizes.icon.sm} />
|
|
656
|
+
) : (
|
|
657
|
+
<Flex w={ui.sizes.icon.sm} />
|
|
658
|
+
))
|
|
659
|
+
}
|
|
660
|
+
onClick={item.onClick}
|
|
661
|
+
color={item.color}
|
|
662
|
+
{...menuItemProps}
|
|
663
|
+
>
|
|
664
|
+
{item.label}
|
|
665
|
+
</Menu.Item>
|
|
666
|
+
);
|
|
667
|
+
};
|
|
@@ -20,14 +20,14 @@ const DarkModeButton = (props: Partial<ActionProps>) => {
|
|
|
20
20
|
setColorScheme(current === "dark" ? "light" : "dark");
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
-
const size = props.size ?? "
|
|
23
|
+
const size = props.size ?? "sm";
|
|
24
24
|
const iconSize =
|
|
25
|
-
(ui.sizes.icon as Record<string, number>)[size] ?? ui.sizes.icon.
|
|
25
|
+
(ui.sizes.icon as Record<string, number>)[size] ?? ui.sizes.icon.sm;
|
|
26
26
|
|
|
27
27
|
return (
|
|
28
28
|
<ActionButton
|
|
29
29
|
onClick={toggleColorScheme}
|
|
30
|
-
variant={props.variant ?? "
|
|
30
|
+
variant={props.variant ?? "default"}
|
|
31
31
|
size={size}
|
|
32
32
|
aria-label="Toggle color scheme"
|
|
33
33
|
icon={
|
|
@@ -20,8 +20,7 @@ const OmnibarButton = (props: OmnibarButtonProps) => {
|
|
|
20
20
|
<ActionButton
|
|
21
21
|
variant={"subtle"}
|
|
22
22
|
onClick={spotlight.open}
|
|
23
|
-
|
|
24
|
-
icon={<IconSearch size={16} />}
|
|
23
|
+
icon={IconSearch}
|
|
25
24
|
tooltip={{ label: "Search", position: "right" }}
|
|
26
25
|
{...props.actionProps}
|
|
27
26
|
/>
|
|
@@ -1,28 +1,57 @@
|
|
|
1
1
|
import { IconPalette } from "@tabler/icons-react";
|
|
2
2
|
import { useStore } from "alepha/react";
|
|
3
3
|
import { alephaThemeListAtom } from "../../atoms/alephaThemeListAtom.ts";
|
|
4
|
+
import { useDialog } from "../../hooks/useDialog.ts";
|
|
4
5
|
import { useTheme } from "../../hooks/useTheme.ts";
|
|
6
|
+
import type { ActionMenuItem } from "./ActionButton.tsx";
|
|
5
7
|
import ActionButton, { type ActionProps } from "./ActionButton.tsx";
|
|
8
|
+
import ThemeExpertModal from "./ThemeExpertModal.tsx";
|
|
6
9
|
|
|
7
|
-
|
|
10
|
+
type ThemeButtonProps = Partial<ActionProps> & {
|
|
11
|
+
/**
|
|
12
|
+
* Enable expert mode with color, radius, and font customization.
|
|
13
|
+
*/
|
|
14
|
+
expert?: boolean;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const ThemeButton = (props: ThemeButtonProps) => {
|
|
18
|
+
const { expert, ...actionProps } = props;
|
|
8
19
|
const [theme, setTheme] = useTheme();
|
|
9
20
|
const themeList = useStore(alephaThemeListAtom)[0];
|
|
21
|
+
const dialog = useDialog();
|
|
22
|
+
|
|
23
|
+
const items: ActionMenuItem[] = themeList.map((it, index) => ({
|
|
24
|
+
label: it.name,
|
|
25
|
+
onClick: () =>
|
|
26
|
+
setTheme({
|
|
27
|
+
index,
|
|
28
|
+
}),
|
|
29
|
+
active: theme.name === it.name,
|
|
30
|
+
}));
|
|
31
|
+
|
|
32
|
+
if (expert) {
|
|
33
|
+
items.push(
|
|
34
|
+
{ type: "divider" },
|
|
35
|
+
{
|
|
36
|
+
label: "Customize...",
|
|
37
|
+
onClick: () => {
|
|
38
|
+
dialog.open({
|
|
39
|
+
title: "Customize Theme",
|
|
40
|
+
content: <ThemeExpertModal />,
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
);
|
|
45
|
+
}
|
|
10
46
|
|
|
11
47
|
return (
|
|
12
48
|
<ActionButton
|
|
13
|
-
variant="
|
|
49
|
+
variant="default"
|
|
14
50
|
icon={IconPalette}
|
|
15
51
|
menu={{
|
|
16
|
-
items
|
|
17
|
-
label: it.name,
|
|
18
|
-
onClick: () =>
|
|
19
|
-
setTheme({
|
|
20
|
-
index,
|
|
21
|
-
}),
|
|
22
|
-
active: theme.name === it.name,
|
|
23
|
-
})),
|
|
52
|
+
items,
|
|
24
53
|
}}
|
|
25
|
-
{...
|
|
54
|
+
{...actionProps}
|
|
26
55
|
/>
|
|
27
56
|
);
|
|
28
57
|
};
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ColorSwatch,
|
|
3
|
+
Flex,
|
|
4
|
+
Select,
|
|
5
|
+
SimpleGrid,
|
|
6
|
+
Text,
|
|
7
|
+
useMantineTheme,
|
|
8
|
+
} from "@mantine/core";
|
|
9
|
+
import { IconCheck } from "@tabler/icons-react";
|
|
10
|
+
import type { AlephaThemeOverrides } from "../../atoms/alephaThemeOverridesAtom.ts";
|
|
11
|
+
import { useDialog } from "../../hooks/useDialog.ts";
|
|
12
|
+
import { useTheme } from "../../hooks/useTheme.ts";
|
|
13
|
+
import ActionButton from "./ActionButton.tsx";
|
|
14
|
+
|
|
15
|
+
const MANTINE_COLORS = [
|
|
16
|
+
"red",
|
|
17
|
+
"pink",
|
|
18
|
+
"grape",
|
|
19
|
+
"violet",
|
|
20
|
+
"indigo",
|
|
21
|
+
"blue",
|
|
22
|
+
"cyan",
|
|
23
|
+
"teal",
|
|
24
|
+
"green",
|
|
25
|
+
"lime",
|
|
26
|
+
"yellow",
|
|
27
|
+
"orange",
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
const RADIUS_OPTIONS = [
|
|
31
|
+
{ label: "xs", value: "xs" },
|
|
32
|
+
{ label: "sm", value: "sm" },
|
|
33
|
+
{ label: "md", value: "md" },
|
|
34
|
+
{ label: "lg", value: "lg" },
|
|
35
|
+
{ label: "xl", value: "xl" },
|
|
36
|
+
];
|
|
37
|
+
|
|
38
|
+
const SIZE_OPTIONS = [
|
|
39
|
+
{ label: "xs", value: "xs" },
|
|
40
|
+
{ label: "sm", value: "sm" },
|
|
41
|
+
{ label: "md", value: "md" },
|
|
42
|
+
{ label: "lg", value: "lg" },
|
|
43
|
+
{ label: "xl", value: "xl" },
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
const FONT_OPTIONS = [
|
|
47
|
+
{ label: "System", value: "" },
|
|
48
|
+
{ label: "Inter", value: "Inter, sans-serif" },
|
|
49
|
+
{ label: "Mono", value: "ui-monospace, SFMono-Regular, Menlo, monospace" },
|
|
50
|
+
{ label: "Serif", value: "Georgia, 'Times New Roman', serif" },
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
const ThemeExpertModal = () => {
|
|
54
|
+
const [, , expert] = useTheme();
|
|
55
|
+
const dialog = useDialog();
|
|
56
|
+
const mantineTheme = useMantineTheme();
|
|
57
|
+
const { overrides, setOverrides } = expert;
|
|
58
|
+
|
|
59
|
+
const currentColor = overrides.primaryColor || mantineTheme.primaryColor;
|
|
60
|
+
const currentRadius = overrides.radius || mantineTheme.defaultRadius || "md";
|
|
61
|
+
const currentFont = overrides.fontFamily || "";
|
|
62
|
+
const currentFontSize = overrides.fontSize || "md";
|
|
63
|
+
const currentScale = overrides.scale || "md";
|
|
64
|
+
|
|
65
|
+
const updateOverrides = (patch: Partial<AlephaThemeOverrides>) => {
|
|
66
|
+
setOverrides({ ...overrides, ...patch });
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
return (
|
|
70
|
+
<Flex direction="column" gap="lg">
|
|
71
|
+
<Flex direction="column" gap="xs">
|
|
72
|
+
<Text fw={500} size="sm">
|
|
73
|
+
Primary Color
|
|
74
|
+
</Text>
|
|
75
|
+
<SimpleGrid cols={6} spacing="xs">
|
|
76
|
+
{MANTINE_COLORS.map((color) => (
|
|
77
|
+
<Flex key={color} justify="center">
|
|
78
|
+
<ColorSwatch
|
|
79
|
+
color={mantineTheme.colors[color]?.[6] ?? color}
|
|
80
|
+
onClick={() => updateOverrides({ primaryColor: color })}
|
|
81
|
+
style={{ cursor: "pointer" }}
|
|
82
|
+
size={32}
|
|
83
|
+
>
|
|
84
|
+
{currentColor === color && (
|
|
85
|
+
<IconCheck size={14} color="white" />
|
|
86
|
+
)}
|
|
87
|
+
</ColorSwatch>
|
|
88
|
+
</Flex>
|
|
89
|
+
))}
|
|
90
|
+
</SimpleGrid>
|
|
91
|
+
</Flex>
|
|
92
|
+
|
|
93
|
+
<Flex direction="column" gap="xs">
|
|
94
|
+
<Text fw={500} size="sm">
|
|
95
|
+
Border Radius
|
|
96
|
+
</Text>
|
|
97
|
+
<Flex gap="xs">
|
|
98
|
+
{RADIUS_OPTIONS.map((opt) => (
|
|
99
|
+
<ActionButton
|
|
100
|
+
key={opt.value}
|
|
101
|
+
variant={
|
|
102
|
+
String(currentRadius) === opt.value ? "filled" : "default"
|
|
103
|
+
}
|
|
104
|
+
size="xs"
|
|
105
|
+
flex={1}
|
|
106
|
+
onClick={() => updateOverrides({ radius: opt.value })}
|
|
107
|
+
>
|
|
108
|
+
{opt.label}
|
|
109
|
+
</ActionButton>
|
|
110
|
+
))}
|
|
111
|
+
</Flex>
|
|
112
|
+
</Flex>
|
|
113
|
+
|
|
114
|
+
<Flex direction="column" gap="xs">
|
|
115
|
+
<Text fw={500} size="sm">
|
|
116
|
+
Font Family
|
|
117
|
+
</Text>
|
|
118
|
+
<Select
|
|
119
|
+
data={FONT_OPTIONS}
|
|
120
|
+
value={currentFont}
|
|
121
|
+
onChange={(value) => updateOverrides({ fontFamily: value ?? "" })}
|
|
122
|
+
allowDeselect={false}
|
|
123
|
+
/>
|
|
124
|
+
</Flex>
|
|
125
|
+
|
|
126
|
+
<Flex direction="column" gap="xs">
|
|
127
|
+
<Text fw={500} size="sm">
|
|
128
|
+
Font Size
|
|
129
|
+
</Text>
|
|
130
|
+
<Flex gap="xs">
|
|
131
|
+
{SIZE_OPTIONS.map((opt) => (
|
|
132
|
+
<ActionButton
|
|
133
|
+
key={opt.value}
|
|
134
|
+
variant={currentFontSize === opt.value ? "filled" : "default"}
|
|
135
|
+
size="xs"
|
|
136
|
+
flex={1}
|
|
137
|
+
onClick={() => updateOverrides({ fontSize: opt.value })}
|
|
138
|
+
>
|
|
139
|
+
{opt.label}
|
|
140
|
+
</ActionButton>
|
|
141
|
+
))}
|
|
142
|
+
</Flex>
|
|
143
|
+
</Flex>
|
|
144
|
+
|
|
145
|
+
<Flex direction="column" gap="xs">
|
|
146
|
+
<Text fw={500} size="sm">
|
|
147
|
+
Scale
|
|
148
|
+
</Text>
|
|
149
|
+
<Flex gap="xs">
|
|
150
|
+
{SIZE_OPTIONS.map((opt) => (
|
|
151
|
+
<ActionButton
|
|
152
|
+
key={opt.value}
|
|
153
|
+
variant={currentScale === opt.value ? "filled" : "default"}
|
|
154
|
+
size="xs"
|
|
155
|
+
flex={1}
|
|
156
|
+
onClick={() => updateOverrides({ scale: opt.value })}
|
|
157
|
+
>
|
|
158
|
+
{opt.label}
|
|
159
|
+
</ActionButton>
|
|
160
|
+
))}
|
|
161
|
+
</Flex>
|
|
162
|
+
</Flex>
|
|
163
|
+
|
|
164
|
+
<Flex justify="space-between">
|
|
165
|
+
<ActionButton
|
|
166
|
+
variant="subtle"
|
|
167
|
+
color="red"
|
|
168
|
+
onClick={() => expert.resetOverrides()}
|
|
169
|
+
>
|
|
170
|
+
Reset
|
|
171
|
+
</ActionButton>
|
|
172
|
+
<ActionButton
|
|
173
|
+
variant={"default"}
|
|
174
|
+
px={"xl"}
|
|
175
|
+
onClick={() => dialog.close()}
|
|
176
|
+
>
|
|
177
|
+
OK
|
|
178
|
+
</ActionButton>
|
|
179
|
+
</Flex>
|
|
180
|
+
</Flex>
|
|
181
|
+
);
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
export default ThemeExpertModal;
|