@umituz/web-dashboard 2.0.7 → 2.0.9

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 (171) hide show
  1. package/package.json +35 -77
  2. package/src/domains/layouts/components/BrandLogo.tsx +83 -0
  3. package/src/domains/layouts/components/DashboardHeader.tsx +240 -0
  4. package/src/domains/layouts/components/DashboardLayout.tsx +155 -0
  5. package/src/domains/layouts/components/DashboardSidebar.tsx +152 -0
  6. package/src/domains/layouts/components/index.ts +8 -0
  7. package/src/domains/layouts/hooks/dashboard.ts +81 -0
  8. package/src/domains/layouts/hooks/index.ts +8 -0
  9. package/src/domains/layouts/index.ts +11 -0
  10. package/{dist/layouts/theme/default.js → src/domains/layouts/theme/default.ts} +18 -11
  11. package/src/domains/layouts/theme/index.ts +18 -0
  12. package/src/domains/layouts/theme/presets.ts +96 -0
  13. package/src/domains/layouts/theme/utils.ts +67 -0
  14. package/src/domains/layouts/types/index.ts +9 -0
  15. package/src/domains/layouts/types/layout.ts +43 -0
  16. package/src/domains/layouts/types/notification.ts +19 -0
  17. package/src/domains/layouts/types/sidebar.ts +35 -0
  18. package/src/domains/layouts/types/theme.ts +64 -0
  19. package/src/domains/layouts/types/user.ts +35 -0
  20. package/src/domains/layouts/utils/dashboard.ts +96 -0
  21. package/src/domains/layouts/utils/index.ts +11 -0
  22. package/src/domains/onboarding/components/AppFocusStep.tsx +113 -0
  23. package/src/domains/onboarding/components/OnboardingWizard.tsx +262 -0
  24. package/src/domains/onboarding/components/PlanStep.tsx +208 -0
  25. package/src/domains/onboarding/components/PlatformsStep.tsx +109 -0
  26. package/src/domains/onboarding/components/UserTypeStep.tsx +135 -0
  27. package/src/domains/onboarding/components/index.ts +9 -0
  28. package/src/domains/onboarding/hooks/index.ts +5 -0
  29. package/{dist/onboarding/hooks/index.js → src/domains/onboarding/hooks/useOnboarding.ts} +65 -19
  30. package/src/domains/onboarding/index.ts +35 -0
  31. package/src/domains/onboarding/types/index.ts +16 -0
  32. package/src/domains/onboarding/types/onboarding.ts +214 -0
  33. package/src/domains/onboarding/utils/index.ts +15 -0
  34. package/src/domains/onboarding/utils/onboarding.ts +166 -0
  35. package/src/domains/settings/components/SettingsLayout.tsx +144 -0
  36. package/src/domains/settings/components/SettingsSection.tsx +106 -0
  37. package/src/domains/settings/components/index.ts +6 -0
  38. package/src/domains/settings/hooks/index.ts +7 -0
  39. package/src/domains/settings/hooks/useSettings.ts +80 -0
  40. package/src/domains/settings/index.ts +22 -0
  41. package/src/domains/settings/types/index.ts +11 -0
  42. package/src/domains/settings/types/settings.ts +81 -0
  43. package/src/domains/settings/utils/index.ts +11 -0
  44. package/src/domains/settings/utils/settings.ts +80 -0
  45. package/dist/layouts/components/BrandLogo.d.ts +0 -18
  46. package/dist/layouts/components/BrandLogo.js +0 -88
  47. package/dist/layouts/components/BrandLogo.js.map +0 -1
  48. package/dist/layouts/components/DashboardHeader.d.ts +0 -36
  49. package/dist/layouts/components/DashboardHeader.js +0 -225
  50. package/dist/layouts/components/DashboardHeader.js.map +0 -1
  51. package/dist/layouts/components/DashboardLayout.d.ts +0 -45
  52. package/dist/layouts/components/DashboardLayout.js +0 -501
  53. package/dist/layouts/components/DashboardLayout.js.map +0 -1
  54. package/dist/layouts/components/DashboardSidebar.d.ts +0 -29
  55. package/dist/layouts/components/DashboardSidebar.js +0 -189
  56. package/dist/layouts/components/DashboardSidebar.js.map +0 -1
  57. package/dist/layouts/components/index.d.ts +0 -10
  58. package/dist/layouts/components/index.js +0 -502
  59. package/dist/layouts/components/index.js.map +0 -1
  60. package/dist/layouts/hooks/dashboard.d.ts +0 -35
  61. package/dist/layouts/hooks/dashboard.js +0 -57
  62. package/dist/layouts/hooks/dashboard.js.map +0 -1
  63. package/dist/layouts/hooks/index.d.ts +0 -3
  64. package/dist/layouts/hooks/index.js +0 -57
  65. package/dist/layouts/hooks/index.js.map +0 -1
  66. package/dist/layouts/index.d.ts +0 -17
  67. package/dist/layouts/index.js +0 -756
  68. package/dist/layouts/index.js.map +0 -1
  69. package/dist/layouts/theme/default.d.ts +0 -18
  70. package/dist/layouts/theme/default.js.map +0 -1
  71. package/dist/layouts/theme/index.d.ts +0 -4
  72. package/dist/layouts/theme/index.js +0 -184
  73. package/dist/layouts/theme/index.js.map +0 -1
  74. package/dist/layouts/theme/presets.d.ts +0 -14
  75. package/dist/layouts/theme/presets.js +0 -137
  76. package/dist/layouts/theme/presets.js.map +0 -1
  77. package/dist/layouts/theme/utils.d.ts +0 -22
  78. package/dist/layouts/theme/utils.js +0 -181
  79. package/dist/layouts/theme/utils.js.map +0 -1
  80. package/dist/layouts/types/index.d.ts +0 -6
  81. package/dist/layouts/types/index.js +0 -2
  82. package/dist/layouts/types/index.js.map +0 -1
  83. package/dist/layouts/types/layout.d.ts +0 -45
  84. package/dist/layouts/types/layout.js +0 -2
  85. package/dist/layouts/types/layout.js.map +0 -1
  86. package/dist/layouts/types/notification.d.ts +0 -20
  87. package/dist/layouts/types/notification.js +0 -2
  88. package/dist/layouts/types/notification.js.map +0 -1
  89. package/dist/layouts/types/sidebar.d.ts +0 -36
  90. package/dist/layouts/types/sidebar.js +0 -2
  91. package/dist/layouts/types/sidebar.js.map +0 -1
  92. package/dist/layouts/types/theme.d.ts +0 -64
  93. package/dist/layouts/types/theme.js +0 -2
  94. package/dist/layouts/types/theme.js.map +0 -1
  95. package/dist/layouts/types/user.d.ts +0 -37
  96. package/dist/layouts/types/user.js +0 -2
  97. package/dist/layouts/types/user.js.map +0 -1
  98. package/dist/layouts/utils/dashboard.d.ts +0 -57
  99. package/dist/layouts/utils/dashboard.js +0 -44
  100. package/dist/layouts/utils/dashboard.js.map +0 -1
  101. package/dist/layouts/utils/index.d.ts +0 -1
  102. package/dist/layouts/utils/index.js +0 -44
  103. package/dist/layouts/utils/index.js.map +0 -1
  104. package/dist/onboarding/components/AppFocusStep.d.ts +0 -26
  105. package/dist/onboarding/components/AppFocusStep.js +0 -86
  106. package/dist/onboarding/components/AppFocusStep.js.map +0 -1
  107. package/dist/onboarding/components/OnboardingWizard.d.ts +0 -13
  108. package/dist/onboarding/components/OnboardingWizard.js +0 -332
  109. package/dist/onboarding/components/OnboardingWizard.js.map +0 -1
  110. package/dist/onboarding/components/PlanStep.d.ts +0 -21
  111. package/dist/onboarding/components/PlanStep.js +0 -167
  112. package/dist/onboarding/components/PlanStep.js.map +0 -1
  113. package/dist/onboarding/components/PlatformsStep.d.ts +0 -26
  114. package/dist/onboarding/components/PlatformsStep.js +0 -86
  115. package/dist/onboarding/components/PlatformsStep.js.map +0 -1
  116. package/dist/onboarding/components/UserTypeStep.d.ts +0 -30
  117. package/dist/onboarding/components/UserTypeStep.js +0 -93
  118. package/dist/onboarding/components/UserTypeStep.js.map +0 -1
  119. package/dist/onboarding/components/index.d.ts +0 -9
  120. package/dist/onboarding/components/index.js +0 -738
  121. package/dist/onboarding/components/index.js.map +0 -1
  122. package/dist/onboarding/hooks/index.d.ts +0 -4
  123. package/dist/onboarding/hooks/index.js.map +0 -1
  124. package/dist/onboarding/hooks/useOnboarding.d.ts +0 -50
  125. package/dist/onboarding/hooks/useOnboarding.js +0 -100
  126. package/dist/onboarding/hooks/useOnboarding.js.map +0 -1
  127. package/dist/onboarding/index.d.ts +0 -11
  128. package/dist/onboarding/index.js +0 -913
  129. package/dist/onboarding/index.js.map +0 -1
  130. package/dist/onboarding/types/index.d.ts +0 -3
  131. package/dist/onboarding/types/index.js +0 -2
  132. package/dist/onboarding/types/index.js.map +0 -1
  133. package/dist/onboarding/types/onboarding.d.ts +0 -209
  134. package/dist/onboarding/types/onboarding.js +0 -2
  135. package/dist/onboarding/types/onboarding.js.map +0 -1
  136. package/dist/onboarding/utils/index.d.ts +0 -4
  137. package/dist/onboarding/utils/index.js +0 -83
  138. package/dist/onboarding/utils/index.js.map +0 -1
  139. package/dist/onboarding/utils/onboarding.d.ts +0 -106
  140. package/dist/onboarding/utils/onboarding.js +0 -83
  141. package/dist/onboarding/utils/onboarding.js.map +0 -1
  142. package/dist/settings/components/SettingsLayout.d.ts +0 -19
  143. package/dist/settings/components/SettingsLayout.js +0 -170
  144. package/dist/settings/components/SettingsLayout.js.map +0 -1
  145. package/dist/settings/components/SettingsSection.d.ts +0 -24
  146. package/dist/settings/components/SettingsSection.js +0 -73
  147. package/dist/settings/components/SettingsSection.js.map +0 -1
  148. package/dist/settings/components/index.d.ts +0 -5
  149. package/dist/settings/components/index.js +0 -169
  150. package/dist/settings/components/index.js.map +0 -1
  151. package/dist/settings/hooks/index.d.ts +0 -3
  152. package/dist/settings/hooks/index.js +0 -59
  153. package/dist/settings/hooks/index.js.map +0 -1
  154. package/dist/settings/hooks/useSettings.d.ts +0 -25
  155. package/dist/settings/hooks/useSettings.js +0 -59
  156. package/dist/settings/hooks/useSettings.js.map +0 -1
  157. package/dist/settings/index.d.ts +0 -7
  158. package/dist/settings/index.js +0 -259
  159. package/dist/settings/index.js.map +0 -1
  160. package/dist/settings/types/index.d.ts +0 -2
  161. package/dist/settings/types/index.js +0 -2
  162. package/dist/settings/types/index.js.map +0 -1
  163. package/dist/settings/types/settings.d.ts +0 -79
  164. package/dist/settings/types/settings.js +0 -2
  165. package/dist/settings/types/settings.js.map +0 -1
  166. package/dist/settings/utils/index.d.ts +0 -3
  167. package/dist/settings/utils/index.js +0 -39
  168. package/dist/settings/utils/index.js.map +0 -1
  169. package/dist/settings/utils/settings.d.ts +0 -50
  170. package/dist/settings/utils/settings.js +0 -39
  171. package/dist/settings/utils/settings.js.map +0 -1
@@ -1,83 +0,0 @@
1
- "use client";
2
-
3
- // src/domains/onboarding/utils/onboarding.ts
4
- function validateStep(state, stepNumber, config) {
5
- const stepConfig = config.steps[stepNumber - 1];
6
- if (stepConfig?.validate) {
7
- return stepConfig.validate(state);
8
- }
9
- switch (stepNumber) {
10
- case 1:
11
- return !!state.selectedUserType;
12
- case 2:
13
- return !!(state.hasMobileApp || state.hasWebApp);
14
- case 3:
15
- return state.connectedPlatforms.length > 0;
16
- case 4:
17
- return !!state.selectedPlan;
18
- default:
19
- return true;
20
- }
21
- }
22
- function getStepTitle(stepNumber, config) {
23
- const stepConfig = config.steps[stepNumber - 1];
24
- return stepConfig?.title || `Step ${stepNumber}`;
25
- }
26
- function getStepDescription(stepNumber, config) {
27
- const stepConfig = config.steps[stepNumber - 1];
28
- return stepConfig?.description;
29
- }
30
- function calculateProgress(currentStep, totalSteps) {
31
- return Math.min(currentStep / totalSteps * 100, 100);
32
- }
33
- function getCompletedSteps(currentStep) {
34
- return Array.from({ length: currentStep - 1 }, (_, i) => i + 1);
35
- }
36
- function formatOnboardingData(state, userId) {
37
- return {
38
- userId,
39
- userType: state.selectedUserType,
40
- hasMobileApp: state.hasMobileApp,
41
- hasWebApp: state.hasWebApp,
42
- connectedPlatforms: state.connectedPlatforms,
43
- selectedPlan: state.selectedPlan,
44
- billingCycle: state.billingCycle,
45
- stepData: state.stepData,
46
- completedAt: (/* @__PURE__ */ new Date()).toISOString()
47
- };
48
- }
49
- function generateOnboardingEvent(event, state, additionalData) {
50
- return {
51
- event,
52
- properties: {
53
- currentStep: state.currentStep,
54
- userType: state.selectedUserType,
55
- hasMobileApp: state.hasMobileApp,
56
- hasWebApp: state.hasWebApp,
57
- platformCount: state.connectedPlatforms.length,
58
- selectedPlan: state.selectedPlan,
59
- billingCycle: state.billingCycle,
60
- ...additionalData
61
- },
62
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
63
- };
64
- }
65
- function isValidEmail(email) {
66
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
67
- return emailRegex.test(email);
68
- }
69
- function isValidPassword(password, minLength = 8) {
70
- return password.length >= minLength;
71
- }
72
- export {
73
- calculateProgress,
74
- formatOnboardingData,
75
- generateOnboardingEvent,
76
- getCompletedSteps,
77
- getStepDescription,
78
- getStepTitle,
79
- isValidEmail,
80
- isValidPassword,
81
- validateStep
82
- };
83
- //# sourceMappingURL=onboarding.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/domains/onboarding/utils/onboarding.ts"],"sourcesContent":["/**\n * Onboarding Utilities\n *\n * Utility functions for onboarding operations\n */\n\nimport type { OnboardingState, OnboardingConfig } from \"../types/onboarding\";\n\n/**\n * Validate onboarding step\n *\n * @param state - Current onboarding state\n * @param stepNumber - Step number to validate\n * @param config - Onboarding configuration\n * @returns Whether the step is valid\n */\nexport function validateStep(\n state: OnboardingState,\n stepNumber: number,\n config: OnboardingConfig\n): boolean {\n const stepConfig = config.steps[stepNumber - 1];\n\n if (stepConfig?.validate) {\n return stepConfig.validate(state);\n }\n\n // Default validations\n switch (stepNumber) {\n case 1:\n // User type step\n return !!state.selectedUserType;\n\n case 2:\n // App focus step\n return !!(state.hasMobileApp || state.hasWebApp);\n\n case 3:\n // Platforms step\n return state.connectedPlatforms.length > 0;\n\n case 4:\n // Plan step\n return !!state.selectedPlan;\n\n default:\n return true;\n }\n}\n\n/**\n * Get step title\n *\n * @param stepNumber - Step number\n * @param config - Onboarding configuration\n * @returns Step title\n */\nexport function getStepTitle(stepNumber: number, config: OnboardingConfig): string {\n const stepConfig = config.steps[stepNumber - 1];\n return stepConfig?.title || `Step ${stepNumber}`;\n}\n\n/**\n * Get step description\n *\n * @param stepNumber - Step number\n * @param config - Onboarding configuration\n * @returns Step description or undefined\n */\nexport function getStepDescription(stepNumber: number, config: OnboardingConfig): string | undefined {\n const stepConfig = config.steps[stepNumber - 1];\n return stepConfig?.description;\n}\n\n/**\n * Calculate onboarding progress\n *\n * @param currentStep - Current step number\n * @param totalSteps - Total number of steps\n * @returns Progress percentage (0-100)\n */\nexport function calculateProgress(currentStep: number, totalSteps: number): number {\n return Math.min((currentStep / totalSteps) * 100, 100);\n}\n\n/**\n * Get completed steps\n *\n * @param currentStep - Current step number\n * @returns Array of completed step numbers\n */\nexport function getCompletedSteps(currentStep: number): number[] {\n return Array.from({ length: currentStep - 1 }, (_, i) => i + 1);\n}\n\n/**\n * Format onboarding data for API submission\n *\n * @param state - Onboarding state\n * @param userId - User ID\n * @returns Formatted data object\n */\nexport function formatOnboardingData(state: OnboardingState, userId?: string) {\n return {\n userId,\n userType: state.selectedUserType,\n hasMobileApp: state.hasMobileApp,\n hasWebApp: state.hasWebApp,\n connectedPlatforms: state.connectedPlatforms,\n selectedPlan: state.selectedPlan,\n billingCycle: state.billingCycle,\n stepData: state.stepData,\n completedAt: new Date().toISOString(),\n };\n}\n\n/**\n * Generate onboarding analytics event\n *\n * @param event - Event name\n * @param state - Onboarding state\n * @param additionalData - Additional event data\n * @returns Analytics event object\n */\nexport function generateOnboardingEvent(\n event: string,\n state: OnboardingState,\n additionalData?: Record<string, unknown>\n) {\n return {\n event,\n properties: {\n currentStep: state.currentStep,\n userType: state.selectedUserType,\n hasMobileApp: state.hasMobileApp,\n hasWebApp: state.hasWebApp,\n platformCount: state.connectedPlatforms.length,\n selectedPlan: state.selectedPlan,\n billingCycle: state.billingCycle,\n ...additionalData,\n },\n timestamp: new Date().toISOString(),\n };\n}\n\n/**\n * Validate email format\n *\n * @param email - Email address\n * @returns Whether email is valid\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n/**\n * Validate password strength\n *\n * @param password - Password\n * @param minLength - Minimum length (default: 8)\n * @returns Whether password meets requirements\n */\nexport function isValidPassword(password: string, minLength: number = 8): boolean {\n return password.length >= minLength;\n}\n"],"mappings":";;;AAgBO,SAAS,aACd,OACA,YACA,QACS;AACT,QAAM,aAAa,OAAO,MAAM,aAAa,CAAC;AAE9C,MAAI,YAAY,UAAU;AACxB,WAAO,WAAW,SAAS,KAAK;AAAA,EAClC;AAGA,UAAQ,YAAY;AAAA,IAClB,KAAK;AAEH,aAAO,CAAC,CAAC,MAAM;AAAA,IAEjB,KAAK;AAEH,aAAO,CAAC,EAAE,MAAM,gBAAgB,MAAM;AAAA,IAExC,KAAK;AAEH,aAAO,MAAM,mBAAmB,SAAS;AAAA,IAE3C,KAAK;AAEH,aAAO,CAAC,CAAC,MAAM;AAAA,IAEjB;AACE,aAAO;AAAA,EACX;AACF;AASO,SAAS,aAAa,YAAoB,QAAkC;AACjF,QAAM,aAAa,OAAO,MAAM,aAAa,CAAC;AAC9C,SAAO,YAAY,SAAS,QAAQ,UAAU;AAChD;AASO,SAAS,mBAAmB,YAAoB,QAA8C;AACnG,QAAM,aAAa,OAAO,MAAM,aAAa,CAAC;AAC9C,SAAO,YAAY;AACrB;AASO,SAAS,kBAAkB,aAAqB,YAA4B;AACjF,SAAO,KAAK,IAAK,cAAc,aAAc,KAAK,GAAG;AACvD;AAQO,SAAS,kBAAkB,aAA+B;AAC/D,SAAO,MAAM,KAAK,EAAE,QAAQ,cAAc,EAAE,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC;AAChE;AASO,SAAS,qBAAqB,OAAwB,QAAiB;AAC5E,SAAO;AAAA,IACL;AAAA,IACA,UAAU,MAAM;AAAA,IAChB,cAAc,MAAM;AAAA,IACpB,WAAW,MAAM;AAAA,IACjB,oBAAoB,MAAM;AAAA,IAC1B,cAAc,MAAM;AAAA,IACpB,cAAc,MAAM;AAAA,IACpB,UAAU,MAAM;AAAA,IAChB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AACF;AAUO,SAAS,wBACd,OACA,OACA,gBACA;AACA,SAAO;AAAA,IACL;AAAA,IACA,YAAY;AAAA,MACV,aAAa,MAAM;AAAA,MACnB,UAAU,MAAM;AAAA,MAChB,cAAc,MAAM;AAAA,MACpB,WAAW,MAAM;AAAA,MACjB,eAAe,MAAM,mBAAmB;AAAA,MACxC,cAAc,MAAM;AAAA,MACpB,cAAc,MAAM;AAAA,MACpB,GAAG;AAAA,IACL;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;AAQO,SAAS,aAAa,OAAwB;AACnD,QAAM,aAAa;AACnB,SAAO,WAAW,KAAK,KAAK;AAC9B;AASO,SAAS,gBAAgB,UAAkB,YAAoB,GAAY;AAChF,SAAO,SAAS,UAAU;AAC5B;","names":[]}
@@ -1,19 +0,0 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { SettingsConfig } from '../types/settings.js';
3
- import 'lucide-react';
4
-
5
- interface SettingsLayoutProps {
6
- /** Settings configuration */
7
- config: SettingsConfig;
8
- }
9
- /**
10
- * Settings Layout Component
11
- *
12
- * Main layout wrapper for settings pages.
13
- * Provides sidebar navigation and content area.
14
- *
15
- * @param props - Settings layout props
16
- */
17
- declare const SettingsLayout: ({ config, }: SettingsLayoutProps) => react_jsx_runtime.JSX.Element;
18
-
19
- export { SettingsLayout, SettingsLayout as default };
@@ -1,170 +0,0 @@
1
- "use client";
2
-
3
- // src/domains/settings/components/SettingsLayout.tsx
4
- import { useState } from "react";
5
- import { Outlet, useLocation, useNavigate } from "react-router-dom";
6
-
7
- // src/domains/settings/components/SettingsSection.tsx
8
- import { Link } from "react-router-dom";
9
- import { ChevronRight } from "lucide-react";
10
- import { cn } from "@umituz/web-design-system/utils";
11
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
- var SettingsSection = ({
13
- section,
14
- currentPath,
15
- onNavigate,
16
- collapsed = false
17
- }) => {
18
- const filteredItems = section.items.filter((item) => item.enabled !== false);
19
- if (filteredItems.length === 0) return null;
20
- return /* @__PURE__ */ jsxs("div", { className: "mb-6 last:mb-0", children: [
21
- !collapsed && /* @__PURE__ */ jsx("h3", { className: "px-2 mb-2 text-xs font-bold uppercase tracking-wider text-muted-foreground", children: section.title }),
22
- /* @__PURE__ */ jsx("div", { className: "space-y-1", children: filteredItems.map((item) => {
23
- const isActive = currentPath === item.path;
24
- const itemContent = /* @__PURE__ */ jsxs(Fragment, { children: [
25
- item.icon && /* @__PURE__ */ jsx(
26
- item.icon,
27
- {
28
- className: cn(
29
- "h-4 w-4 shrink-0",
30
- isActive && "scale-110"
31
- )
32
- }
33
- ),
34
- !collapsed && /* @__PURE__ */ jsxs(Fragment, { children: [
35
- /* @__PURE__ */ jsx("span", { className: "flex-1 text-left", children: item.label }),
36
- item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ jsx("span", { className: "ml-auto flex h-5 min-w-5 items-center justify-center rounded-full bg-destructive px-1.5 text-[10px] font-bold text-destructive-foreground", children: item.badge > 99 ? "99+" : item.badge }),
37
- item.path && /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4 text-muted-foreground" })
38
- ] })
39
- ] });
40
- const itemClassName = cn(
41
- "flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-all duration-200 w-full",
42
- "hover:bg-accent hover:text-accent-foreground",
43
- isActive && "bg-accent text-accent-foreground",
44
- collapsed ? "justify-center" : "justify-start"
45
- );
46
- if (item.path) {
47
- return /* @__PURE__ */ jsx(
48
- Link,
49
- {
50
- to: item.path,
51
- onClick: () => onNavigate?.(item.path),
52
- className: itemClassName,
53
- title: collapsed ? item.label : void 0,
54
- children: itemContent
55
- },
56
- item.key
57
- );
58
- }
59
- return /* @__PURE__ */ jsx(
60
- "button",
61
- {
62
- type: "button",
63
- onClick: () => {
64
- },
65
- className: itemClassName,
66
- title: collapsed ? item.label : void 0,
67
- children: itemContent
68
- },
69
- item.key
70
- );
71
- }) })
72
- ] });
73
- };
74
-
75
- // src/domains/settings/components/SettingsLayout.tsx
76
- import { Skeleton } from "@umituz/web-design-system/atoms";
77
- import { ChevronLeft, Menu } from "lucide-react";
78
- import { Button } from "@umituz/web-design-system/atoms";
79
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
80
- var SettingsLayout = ({
81
- config
82
- }) => {
83
- const location = useLocation();
84
- const navigate = useNavigate();
85
- const [collapsed, setCollapsed] = useState(false);
86
- const [mobileOpen, setMobileOpen] = useState(false);
87
- const [loading, setLoading] = useState(true);
88
- useState(() => {
89
- setLoading(true);
90
- const timer = setTimeout(() => setLoading(false), 200);
91
- return () => clearTimeout(timer);
92
- });
93
- const handleNavigate = (path) => {
94
- navigate(path);
95
- setMobileOpen(false);
96
- };
97
- return /* @__PURE__ */ jsxs2("div", { className: "flex h-screen w-full bg-background font-sans", children: [
98
- /* @__PURE__ */ jsxs2(
99
- "aside",
100
- {
101
- className: `hidden md:flex flex-col shrink-0 border-r border-border bg-card transition-all duration-300 ${collapsed ? "w-16" : "w-64"}`,
102
- children: [
103
- /* @__PURE__ */ jsxs2("div", { className: "flex h-14 items-center justify-between border-b border-border px-4", children: [
104
- !collapsed && /* @__PURE__ */ jsx2("h2", { className: "text-lg font-semibold text-foreground", children: config.brandName || "Settings" }),
105
- /* @__PURE__ */ jsx2(
106
- Button,
107
- {
108
- variant: "ghost",
109
- size: "icon",
110
- onClick: () => setCollapsed(!collapsed),
111
- className: "ml-auto",
112
- children: collapsed ? /* @__PURE__ */ jsx2(Menu, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx2(ChevronLeft, { className: "h-4 w-4" })
113
- }
114
- )
115
- ] }),
116
- /* @__PURE__ */ jsx2("nav", { className: "flex-1 overflow-y-auto p-2", children: config.sections.map((section) => /* @__PURE__ */ jsx2(
117
- SettingsSection,
118
- {
119
- section,
120
- currentPath: location.pathname,
121
- onNavigate: handleNavigate,
122
- collapsed
123
- },
124
- section.key
125
- )) })
126
- ]
127
- }
128
- ),
129
- mobileOpen && /* @__PURE__ */ jsxs2("div", { className: "fixed inset-0 z-50 md:hidden", children: [
130
- /* @__PURE__ */ jsx2(
131
- "div",
132
- {
133
- className: "absolute inset-0 bg-background/80 backdrop-blur-sm",
134
- onClick: () => setMobileOpen(false)
135
- }
136
- ),
137
- /* @__PURE__ */ jsxs2("aside", { className: "absolute left-0 top-0 h-full w-64 border-r border-border bg-card shadow-xl", children: [
138
- /* @__PURE__ */ jsxs2("div", { className: "flex h-14 items-center justify-between border-b border-border px-4", children: [
139
- /* @__PURE__ */ jsx2("h2", { className: "text-lg font-semibold text-foreground", children: config.brandName || "Settings" }),
140
- /* @__PURE__ */ jsx2(Button, { variant: "ghost", size: "icon", onClick: () => setMobileOpen(false), children: /* @__PURE__ */ jsx2(Menu, { className: "h-4 w-4" }) })
141
- ] }),
142
- /* @__PURE__ */ jsx2("nav", { className: "flex-1 overflow-y-auto p-2", children: config.sections.map((section) => /* @__PURE__ */ jsx2(
143
- SettingsSection,
144
- {
145
- section,
146
- currentPath: location.pathname,
147
- onNavigate: handleNavigate
148
- },
149
- section.key
150
- )) })
151
- ] })
152
- ] }),
153
- /* @__PURE__ */ jsxs2("div", { className: "flex flex-1 flex-col overflow-hidden min-w-0", children: [
154
- /* @__PURE__ */ jsx2("header", { className: "flex h-14 items-center justify-between border-b border-border bg-card/50 backdrop-blur-md px-4 shrink-0 md:hidden", children: /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-3", children: [
155
- /* @__PURE__ */ jsx2(Button, { variant: "ghost", size: "icon", onClick: () => setMobileOpen(true), children: /* @__PURE__ */ jsx2(Menu, { className: "h-5 w-5" }) }),
156
- /* @__PURE__ */ jsx2("h2", { className: "text-sm font-semibold text-foreground", children: config.brandName || "Settings" })
157
- ] }) }),
158
- /* @__PURE__ */ jsx2("main", { className: "flex-1 overflow-y-auto p-4 md:p-8", children: loading ? /* @__PURE__ */ jsxs2("div", { className: "mx-auto w-full max-w-4xl space-y-6", children: [
159
- /* @__PURE__ */ jsx2(Skeleton, { className: "h-8 w-1/3 rounded-xl" }),
160
- /* @__PURE__ */ jsx2("div", { className: "grid gap-4", children: Array.from({ length: 3 }).map((_, i) => /* @__PURE__ */ jsx2(Skeleton, { className: "h-24 rounded-xl" }, i)) })
161
- ] }) : /* @__PURE__ */ jsx2(Outlet, {}) })
162
- ] })
163
- ] });
164
- };
165
- var SettingsLayout_default = SettingsLayout;
166
- export {
167
- SettingsLayout,
168
- SettingsLayout_default as default
169
- };
170
- //# sourceMappingURL=SettingsLayout.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/domains/settings/components/SettingsLayout.tsx","../../../src/domains/settings/components/SettingsSection.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { Outlet, useLocation, useNavigate } from \"react-router-dom\";\nimport { SettingsSection } from \"./SettingsSection\";\nimport type { SettingsConfig } from \"../types/settings\";\nimport { Skeleton } from \"@umituz/web-design-system/atoms\";\nimport { ChevronLeft, Menu } from \"lucide-react\";\nimport { Button } from \"@umituz/web-design-system/atoms\";\n\ninterface SettingsLayoutProps {\n /** Settings configuration */\n config: SettingsConfig;\n}\n\n/**\n * Settings Layout Component\n *\n * Main layout wrapper for settings pages.\n * Provides sidebar navigation and content area.\n *\n * @param props - Settings layout props\n */\nexport const SettingsLayout = ({\n config,\n}: SettingsLayoutProps) => {\n const location = useLocation();\n const navigate = useNavigate();\n const [collapsed, setCollapsed] = useState(false);\n const [mobileOpen, setMobileOpen] = useState(false);\n const [loading, setLoading] = useState(true);\n\n // Simulate loading on route change\n useState(() => {\n setLoading(true);\n const timer = setTimeout(() => setLoading(false), 200);\n return () => clearTimeout(timer);\n });\n\n const handleNavigate = (path: string) => {\n navigate(path);\n setMobileOpen(false);\n };\n\n return (\n <div className=\"flex h-screen w-full bg-background font-sans\">\n {/* Desktop Sidebar */}\n <aside\n className={`hidden md:flex flex-col shrink-0 border-r border-border bg-card transition-all duration-300 ${\n collapsed ? \"w-16\" : \"w-64\"\n }`}\n >\n <div className=\"flex h-14 items-center justify-between border-b border-border px-4\">\n {!collapsed && (\n <h2 className=\"text-lg font-semibold text-foreground\">\n {config.brandName || \"Settings\"}\n </h2>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setCollapsed(!collapsed)}\n className=\"ml-auto\"\n >\n {collapsed ? <Menu className=\"h-4 w-4\" /> : <ChevronLeft className=\"h-4 w-4\" />}\n </Button>\n </div>\n\n <nav className=\"flex-1 overflow-y-auto p-2\">\n {config.sections.map((section) => (\n <SettingsSection\n key={section.key}\n section={section}\n currentPath={location.pathname}\n onNavigate={handleNavigate}\n collapsed={collapsed}\n />\n ))}\n </nav>\n </aside>\n\n {/* Mobile Menu Overlay */}\n {mobileOpen && (\n <div className=\"fixed inset-0 z-50 md:hidden\">\n <div\n className=\"absolute inset-0 bg-background/80 backdrop-blur-sm\"\n onClick={() => setMobileOpen(false)}\n />\n <aside className=\"absolute left-0 top-0 h-full w-64 border-r border-border bg-card shadow-xl\">\n <div className=\"flex h-14 items-center justify-between border-b border-border px-4\">\n <h2 className=\"text-lg font-semibold text-foreground\">\n {config.brandName || \"Settings\"}\n </h2>\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setMobileOpen(false)}>\n <Menu className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <nav className=\"flex-1 overflow-y-auto p-2\">\n {config.sections.map((section) => (\n <SettingsSection\n key={section.key}\n section={section}\n currentPath={location.pathname}\n onNavigate={handleNavigate}\n />\n ))}\n </nav>\n </aside>\n </div>\n )}\n\n {/* Main Content Area */}\n <div className=\"flex flex-1 flex-col overflow-hidden min-w-0\">\n {/* Mobile Header */}\n <header className=\"flex h-14 items-center justify-between border-b border-border bg-card/50 backdrop-blur-md px-4 shrink-0 md:hidden\">\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setMobileOpen(true)}>\n <Menu className=\"h-5 w-5\" />\n </Button>\n <h2 className=\"text-sm font-semibold text-foreground\">\n {config.brandName || \"Settings\"}\n </h2>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-4 md:p-8\">\n {loading ? (\n <div className=\"mx-auto w-full max-w-4xl space-y-6\">\n <Skeleton className=\"h-8 w-1/3 rounded-xl\" />\n <div className=\"grid gap-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-24 rounded-xl\" />\n ))}\n </div>\n </div>\n ) : (\n <Outlet />\n )}\n </main>\n </div>\n </div>\n );\n};\n\nexport default SettingsLayout;\n","import { Link } from \"react-router-dom\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"@umituz/web-design-system/utils\";\nimport type { SettingsSection as SettingsSectionType } from \"../types/settings\";\n\ninterface SettingsSectionProps {\n /** Section configuration */\n section: SettingsSectionType;\n /** Current path */\n currentPath?: string;\n /** On navigate callback */\n onNavigate?: (path: string) => void;\n /** Collapsed state */\n collapsed?: boolean;\n}\n\n/**\n * Settings Section Component\n *\n * Displays a section of settings items.\n *\n * @param props - Settings section props\n */\nexport const SettingsSection = ({\n section,\n currentPath,\n onNavigate,\n collapsed = false,\n}: SettingsSectionProps) => {\n const filteredItems = section.items.filter((item) => item.enabled !== false);\n\n if (filteredItems.length === 0) return null;\n\n return (\n <div className=\"mb-6 last:mb-0\">\n {!collapsed && (\n <h3 className=\"px-2 mb-2 text-xs font-bold uppercase tracking-wider text-muted-foreground\">\n {section.title}\n </h3>\n )}\n\n <div className=\"space-y-1\">\n {filteredItems.map((item) => {\n const isActive = currentPath === item.path;\n\n const itemContent = (\n <>\n {item.icon && (\n <item.icon\n className={cn(\n \"h-4 w-4 shrink-0\",\n isActive && \"scale-110\"\n )}\n />\n )}\n {!collapsed && (\n <>\n <span className=\"flex-1 text-left\">{item.label}</span>\n {item.badge !== undefined && item.badge > 0 && (\n <span className=\"ml-auto flex h-5 min-w-5 items-center justify-center rounded-full bg-destructive px-1.5 text-[10px] font-bold text-destructive-foreground\">\n {item.badge > 99 ? \"99+\" : item.badge}\n </span>\n )}\n {item.path && <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />}\n </>\n )}\n </>\n );\n\n const itemClassName = cn(\n \"flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-all duration-200 w-full\",\n \"hover:bg-accent hover:text-accent-foreground\",\n isActive && \"bg-accent text-accent-foreground\",\n collapsed ? \"justify-center\" : \"justify-start\"\n );\n\n if (item.path) {\n return (\n <Link\n key={item.key}\n to={item.path}\n onClick={() => onNavigate?.(item.path!)}\n className={itemClassName}\n title={collapsed ? item.label : undefined}\n >\n {itemContent}\n </Link>\n );\n }\n\n return (\n <button\n key={item.key}\n type=\"button\"\n onClick={() => {}}\n className={itemClassName}\n title={collapsed ? item.label : undefined}\n >\n {itemContent}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n"],"mappings":"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","names":["jsx","jsxs"]}
@@ -1,24 +0,0 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { SettingsSection as SettingsSection$1 } from '../types/settings.js';
3
- import 'lucide-react';
4
-
5
- interface SettingsSectionProps {
6
- /** Section configuration */
7
- section: SettingsSection$1;
8
- /** Current path */
9
- currentPath?: string;
10
- /** On navigate callback */
11
- onNavigate?: (path: string) => void;
12
- /** Collapsed state */
13
- collapsed?: boolean;
14
- }
15
- /**
16
- * Settings Section Component
17
- *
18
- * Displays a section of settings items.
19
- *
20
- * @param props - Settings section props
21
- */
22
- declare const SettingsSection: ({ section, currentPath, onNavigate, collapsed, }: SettingsSectionProps) => react_jsx_runtime.JSX.Element | null;
23
-
24
- export { SettingsSection };
@@ -1,73 +0,0 @@
1
- "use client";
2
-
3
- // src/domains/settings/components/SettingsSection.tsx
4
- import { Link } from "react-router-dom";
5
- import { ChevronRight } from "lucide-react";
6
- import { cn } from "@umituz/web-design-system/utils";
7
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
- var SettingsSection = ({
9
- section,
10
- currentPath,
11
- onNavigate,
12
- collapsed = false
13
- }) => {
14
- const filteredItems = section.items.filter((item) => item.enabled !== false);
15
- if (filteredItems.length === 0) return null;
16
- return /* @__PURE__ */ jsxs("div", { className: "mb-6 last:mb-0", children: [
17
- !collapsed && /* @__PURE__ */ jsx("h3", { className: "px-2 mb-2 text-xs font-bold uppercase tracking-wider text-muted-foreground", children: section.title }),
18
- /* @__PURE__ */ jsx("div", { className: "space-y-1", children: filteredItems.map((item) => {
19
- const isActive = currentPath === item.path;
20
- const itemContent = /* @__PURE__ */ jsxs(Fragment, { children: [
21
- item.icon && /* @__PURE__ */ jsx(
22
- item.icon,
23
- {
24
- className: cn(
25
- "h-4 w-4 shrink-0",
26
- isActive && "scale-110"
27
- )
28
- }
29
- ),
30
- !collapsed && /* @__PURE__ */ jsxs(Fragment, { children: [
31
- /* @__PURE__ */ jsx("span", { className: "flex-1 text-left", children: item.label }),
32
- item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ jsx("span", { className: "ml-auto flex h-5 min-w-5 items-center justify-center rounded-full bg-destructive px-1.5 text-[10px] font-bold text-destructive-foreground", children: item.badge > 99 ? "99+" : item.badge }),
33
- item.path && /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4 text-muted-foreground" })
34
- ] })
35
- ] });
36
- const itemClassName = cn(
37
- "flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-all duration-200 w-full",
38
- "hover:bg-accent hover:text-accent-foreground",
39
- isActive && "bg-accent text-accent-foreground",
40
- collapsed ? "justify-center" : "justify-start"
41
- );
42
- if (item.path) {
43
- return /* @__PURE__ */ jsx(
44
- Link,
45
- {
46
- to: item.path,
47
- onClick: () => onNavigate?.(item.path),
48
- className: itemClassName,
49
- title: collapsed ? item.label : void 0,
50
- children: itemContent
51
- },
52
- item.key
53
- );
54
- }
55
- return /* @__PURE__ */ jsx(
56
- "button",
57
- {
58
- type: "button",
59
- onClick: () => {
60
- },
61
- className: itemClassName,
62
- title: collapsed ? item.label : void 0,
63
- children: itemContent
64
- },
65
- item.key
66
- );
67
- }) })
68
- ] });
69
- };
70
- export {
71
- SettingsSection
72
- };
73
- //# sourceMappingURL=SettingsSection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/domains/settings/components/SettingsSection.tsx"],"sourcesContent":["import { Link } from \"react-router-dom\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"@umituz/web-design-system/utils\";\nimport type { SettingsSection as SettingsSectionType } from \"../types/settings\";\n\ninterface SettingsSectionProps {\n /** Section configuration */\n section: SettingsSectionType;\n /** Current path */\n currentPath?: string;\n /** On navigate callback */\n onNavigate?: (path: string) => void;\n /** Collapsed state */\n collapsed?: boolean;\n}\n\n/**\n * Settings Section Component\n *\n * Displays a section of settings items.\n *\n * @param props - Settings section props\n */\nexport const SettingsSection = ({\n section,\n currentPath,\n onNavigate,\n collapsed = false,\n}: SettingsSectionProps) => {\n const filteredItems = section.items.filter((item) => item.enabled !== false);\n\n if (filteredItems.length === 0) return null;\n\n return (\n <div className=\"mb-6 last:mb-0\">\n {!collapsed && (\n <h3 className=\"px-2 mb-2 text-xs font-bold uppercase tracking-wider text-muted-foreground\">\n {section.title}\n </h3>\n )}\n\n <div className=\"space-y-1\">\n {filteredItems.map((item) => {\n const isActive = currentPath === item.path;\n\n const itemContent = (\n <>\n {item.icon && (\n <item.icon\n className={cn(\n \"h-4 w-4 shrink-0\",\n isActive && \"scale-110\"\n )}\n />\n )}\n {!collapsed && (\n <>\n <span className=\"flex-1 text-left\">{item.label}</span>\n {item.badge !== undefined && item.badge > 0 && (\n <span className=\"ml-auto flex h-5 min-w-5 items-center justify-center rounded-full bg-destructive px-1.5 text-[10px] font-bold text-destructive-foreground\">\n {item.badge > 99 ? \"99+\" : item.badge}\n </span>\n )}\n {item.path && <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />}\n </>\n )}\n </>\n );\n\n const itemClassName = cn(\n \"flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-all duration-200 w-full\",\n \"hover:bg-accent hover:text-accent-foreground\",\n isActive && \"bg-accent text-accent-foreground\",\n collapsed ? \"justify-center\" : \"justify-start\"\n );\n\n if (item.path) {\n return (\n <Link\n key={item.key}\n to={item.path}\n onClick={() => onNavigate?.(item.path!)}\n className={itemClassName}\n title={collapsed ? item.label : undefined}\n >\n {itemContent}\n </Link>\n );\n }\n\n return (\n <button\n key={item.key}\n type=\"button\"\n onClick={() => {}}\n className={itemClassName}\n title={collapsed ? item.label : undefined}\n >\n {itemContent}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n"],"mappings":";;;AAAA,SAAS,YAAY;AACrB,SAAS,oBAAoB;AAC7B,SAAS,UAAU;AAkCX,SAoBQ,UApBR,KAoBQ,YApBR;AAbD,IAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAA4B;AAC1B,QAAM,gBAAgB,QAAQ,MAAM,OAAO,CAAC,SAAS,KAAK,YAAY,KAAK;AAE3E,MAAI,cAAc,WAAW,EAAG,QAAO;AAEvC,SACE,qBAAC,SAAI,WAAU,kBACZ;AAAA,KAAC,aACA,oBAAC,QAAG,WAAU,8EACX,kBAAQ,OACX;AAAA,IAGF,oBAAC,SAAI,WAAU,aACZ,wBAAc,IAAI,CAAC,SAAS;AAC3B,YAAM,WAAW,gBAAgB,KAAK;AAEtC,YAAM,cACJ,iCACG;AAAA,aAAK,QACJ;AAAA,UAAC,KAAK;AAAA,UAAL;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA,YAAY;AAAA,YACd;AAAA;AAAA,QACF;AAAA,QAED,CAAC,aACA,iCACE;AAAA,8BAAC,UAAK,WAAU,oBAAoB,eAAK,OAAM;AAAA,UAC9C,KAAK,UAAU,UAAa,KAAK,QAAQ,KACxC,oBAAC,UAAK,WAAU,6IACb,eAAK,QAAQ,KAAK,QAAQ,KAAK,OAClC;AAAA,UAED,KAAK,QAAQ,oBAAC,gBAAa,WAAU,iCAAgC;AAAA,WACxE;AAAA,SAEJ;AAGF,YAAM,gBAAgB;AAAA,QACpB;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,YAAY,mBAAmB;AAAA,MACjC;AAEA,UAAI,KAAK,MAAM;AACb,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,IAAI,KAAK;AAAA,YACT,SAAS,MAAM,aAAa,KAAK,IAAK;AAAA,YACtC,WAAW;AAAA,YACX,OAAO,YAAY,KAAK,QAAQ;AAAA,YAE/B;AAAA;AAAA,UANI,KAAK;AAAA,QAOZ;AAAA,MAEJ;AAEA,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,MAAK;AAAA,UACL,SAAS,MAAM;AAAA,UAAC;AAAA,UAChB,WAAW;AAAA,UACX,OAAO,YAAY,KAAK,QAAQ;AAAA,UAE/B;AAAA;AAAA,QANI,KAAK;AAAA,MAOZ;AAAA,IAEJ,CAAC,GACH;AAAA,KACF;AAEJ;","names":[]}
@@ -1,5 +0,0 @@
1
- export { SettingsLayout } from './SettingsLayout.js';
2
- export { SettingsSection } from './SettingsSection.js';
3
- import 'react/jsx-runtime';
4
- import '../types/settings.js';
5
- import 'lucide-react';
@@ -1,169 +0,0 @@
1
- "use client";
2
-
3
- // src/domains/settings/components/SettingsLayout.tsx
4
- import { useState } from "react";
5
- import { Outlet, useLocation, useNavigate } from "react-router-dom";
6
-
7
- // src/domains/settings/components/SettingsSection.tsx
8
- import { Link } from "react-router-dom";
9
- import { ChevronRight } from "lucide-react";
10
- import { cn } from "@umituz/web-design-system/utils";
11
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
12
- var SettingsSection = ({
13
- section,
14
- currentPath,
15
- onNavigate,
16
- collapsed = false
17
- }) => {
18
- const filteredItems = section.items.filter((item) => item.enabled !== false);
19
- if (filteredItems.length === 0) return null;
20
- return /* @__PURE__ */ jsxs("div", { className: "mb-6 last:mb-0", children: [
21
- !collapsed && /* @__PURE__ */ jsx("h3", { className: "px-2 mb-2 text-xs font-bold uppercase tracking-wider text-muted-foreground", children: section.title }),
22
- /* @__PURE__ */ jsx("div", { className: "space-y-1", children: filteredItems.map((item) => {
23
- const isActive = currentPath === item.path;
24
- const itemContent = /* @__PURE__ */ jsxs(Fragment, { children: [
25
- item.icon && /* @__PURE__ */ jsx(
26
- item.icon,
27
- {
28
- className: cn(
29
- "h-4 w-4 shrink-0",
30
- isActive && "scale-110"
31
- )
32
- }
33
- ),
34
- !collapsed && /* @__PURE__ */ jsxs(Fragment, { children: [
35
- /* @__PURE__ */ jsx("span", { className: "flex-1 text-left", children: item.label }),
36
- item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ jsx("span", { className: "ml-auto flex h-5 min-w-5 items-center justify-center rounded-full bg-destructive px-1.5 text-[10px] font-bold text-destructive-foreground", children: item.badge > 99 ? "99+" : item.badge }),
37
- item.path && /* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4 text-muted-foreground" })
38
- ] })
39
- ] });
40
- const itemClassName = cn(
41
- "flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-all duration-200 w-full",
42
- "hover:bg-accent hover:text-accent-foreground",
43
- isActive && "bg-accent text-accent-foreground",
44
- collapsed ? "justify-center" : "justify-start"
45
- );
46
- if (item.path) {
47
- return /* @__PURE__ */ jsx(
48
- Link,
49
- {
50
- to: item.path,
51
- onClick: () => onNavigate?.(item.path),
52
- className: itemClassName,
53
- title: collapsed ? item.label : void 0,
54
- children: itemContent
55
- },
56
- item.key
57
- );
58
- }
59
- return /* @__PURE__ */ jsx(
60
- "button",
61
- {
62
- type: "button",
63
- onClick: () => {
64
- },
65
- className: itemClassName,
66
- title: collapsed ? item.label : void 0,
67
- children: itemContent
68
- },
69
- item.key
70
- );
71
- }) })
72
- ] });
73
- };
74
-
75
- // src/domains/settings/components/SettingsLayout.tsx
76
- import { Skeleton } from "@umituz/web-design-system/atoms";
77
- import { ChevronLeft, Menu } from "lucide-react";
78
- import { Button } from "@umituz/web-design-system/atoms";
79
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
80
- var SettingsLayout = ({
81
- config
82
- }) => {
83
- const location = useLocation();
84
- const navigate = useNavigate();
85
- const [collapsed, setCollapsed] = useState(false);
86
- const [mobileOpen, setMobileOpen] = useState(false);
87
- const [loading, setLoading] = useState(true);
88
- useState(() => {
89
- setLoading(true);
90
- const timer = setTimeout(() => setLoading(false), 200);
91
- return () => clearTimeout(timer);
92
- });
93
- const handleNavigate = (path) => {
94
- navigate(path);
95
- setMobileOpen(false);
96
- };
97
- return /* @__PURE__ */ jsxs2("div", { className: "flex h-screen w-full bg-background font-sans", children: [
98
- /* @__PURE__ */ jsxs2(
99
- "aside",
100
- {
101
- className: `hidden md:flex flex-col shrink-0 border-r border-border bg-card transition-all duration-300 ${collapsed ? "w-16" : "w-64"}`,
102
- children: [
103
- /* @__PURE__ */ jsxs2("div", { className: "flex h-14 items-center justify-between border-b border-border px-4", children: [
104
- !collapsed && /* @__PURE__ */ jsx2("h2", { className: "text-lg font-semibold text-foreground", children: config.brandName || "Settings" }),
105
- /* @__PURE__ */ jsx2(
106
- Button,
107
- {
108
- variant: "ghost",
109
- size: "icon",
110
- onClick: () => setCollapsed(!collapsed),
111
- className: "ml-auto",
112
- children: collapsed ? /* @__PURE__ */ jsx2(Menu, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx2(ChevronLeft, { className: "h-4 w-4" })
113
- }
114
- )
115
- ] }),
116
- /* @__PURE__ */ jsx2("nav", { className: "flex-1 overflow-y-auto p-2", children: config.sections.map((section) => /* @__PURE__ */ jsx2(
117
- SettingsSection,
118
- {
119
- section,
120
- currentPath: location.pathname,
121
- onNavigate: handleNavigate,
122
- collapsed
123
- },
124
- section.key
125
- )) })
126
- ]
127
- }
128
- ),
129
- mobileOpen && /* @__PURE__ */ jsxs2("div", { className: "fixed inset-0 z-50 md:hidden", children: [
130
- /* @__PURE__ */ jsx2(
131
- "div",
132
- {
133
- className: "absolute inset-0 bg-background/80 backdrop-blur-sm",
134
- onClick: () => setMobileOpen(false)
135
- }
136
- ),
137
- /* @__PURE__ */ jsxs2("aside", { className: "absolute left-0 top-0 h-full w-64 border-r border-border bg-card shadow-xl", children: [
138
- /* @__PURE__ */ jsxs2("div", { className: "flex h-14 items-center justify-between border-b border-border px-4", children: [
139
- /* @__PURE__ */ jsx2("h2", { className: "text-lg font-semibold text-foreground", children: config.brandName || "Settings" }),
140
- /* @__PURE__ */ jsx2(Button, { variant: "ghost", size: "icon", onClick: () => setMobileOpen(false), children: /* @__PURE__ */ jsx2(Menu, { className: "h-4 w-4" }) })
141
- ] }),
142
- /* @__PURE__ */ jsx2("nav", { className: "flex-1 overflow-y-auto p-2", children: config.sections.map((section) => /* @__PURE__ */ jsx2(
143
- SettingsSection,
144
- {
145
- section,
146
- currentPath: location.pathname,
147
- onNavigate: handleNavigate
148
- },
149
- section.key
150
- )) })
151
- ] })
152
- ] }),
153
- /* @__PURE__ */ jsxs2("div", { className: "flex flex-1 flex-col overflow-hidden min-w-0", children: [
154
- /* @__PURE__ */ jsx2("header", { className: "flex h-14 items-center justify-between border-b border-border bg-card/50 backdrop-blur-md px-4 shrink-0 md:hidden", children: /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-3", children: [
155
- /* @__PURE__ */ jsx2(Button, { variant: "ghost", size: "icon", onClick: () => setMobileOpen(true), children: /* @__PURE__ */ jsx2(Menu, { className: "h-5 w-5" }) }),
156
- /* @__PURE__ */ jsx2("h2", { className: "text-sm font-semibold text-foreground", children: config.brandName || "Settings" })
157
- ] }) }),
158
- /* @__PURE__ */ jsx2("main", { className: "flex-1 overflow-y-auto p-4 md:p-8", children: loading ? /* @__PURE__ */ jsxs2("div", { className: "mx-auto w-full max-w-4xl space-y-6", children: [
159
- /* @__PURE__ */ jsx2(Skeleton, { className: "h-8 w-1/3 rounded-xl" }),
160
- /* @__PURE__ */ jsx2("div", { className: "grid gap-4", children: Array.from({ length: 3 }).map((_, i) => /* @__PURE__ */ jsx2(Skeleton, { className: "h-24 rounded-xl" }, i)) })
161
- ] }) : /* @__PURE__ */ jsx2(Outlet, {}) })
162
- ] })
163
- ] });
164
- };
165
- export {
166
- SettingsLayout,
167
- SettingsSection
168
- };
169
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/domains/settings/components/SettingsLayout.tsx","../../../src/domains/settings/components/SettingsSection.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { Outlet, useLocation, useNavigate } from \"react-router-dom\";\nimport { SettingsSection } from \"./SettingsSection\";\nimport type { SettingsConfig } from \"../types/settings\";\nimport { Skeleton } from \"@umituz/web-design-system/atoms\";\nimport { ChevronLeft, Menu } from \"lucide-react\";\nimport { Button } from \"@umituz/web-design-system/atoms\";\n\ninterface SettingsLayoutProps {\n /** Settings configuration */\n config: SettingsConfig;\n}\n\n/**\n * Settings Layout Component\n *\n * Main layout wrapper for settings pages.\n * Provides sidebar navigation and content area.\n *\n * @param props - Settings layout props\n */\nexport const SettingsLayout = ({\n config,\n}: SettingsLayoutProps) => {\n const location = useLocation();\n const navigate = useNavigate();\n const [collapsed, setCollapsed] = useState(false);\n const [mobileOpen, setMobileOpen] = useState(false);\n const [loading, setLoading] = useState(true);\n\n // Simulate loading on route change\n useState(() => {\n setLoading(true);\n const timer = setTimeout(() => setLoading(false), 200);\n return () => clearTimeout(timer);\n });\n\n const handleNavigate = (path: string) => {\n navigate(path);\n setMobileOpen(false);\n };\n\n return (\n <div className=\"flex h-screen w-full bg-background font-sans\">\n {/* Desktop Sidebar */}\n <aside\n className={`hidden md:flex flex-col shrink-0 border-r border-border bg-card transition-all duration-300 ${\n collapsed ? \"w-16\" : \"w-64\"\n }`}\n >\n <div className=\"flex h-14 items-center justify-between border-b border-border px-4\">\n {!collapsed && (\n <h2 className=\"text-lg font-semibold text-foreground\">\n {config.brandName || \"Settings\"}\n </h2>\n )}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => setCollapsed(!collapsed)}\n className=\"ml-auto\"\n >\n {collapsed ? <Menu className=\"h-4 w-4\" /> : <ChevronLeft className=\"h-4 w-4\" />}\n </Button>\n </div>\n\n <nav className=\"flex-1 overflow-y-auto p-2\">\n {config.sections.map((section) => (\n <SettingsSection\n key={section.key}\n section={section}\n currentPath={location.pathname}\n onNavigate={handleNavigate}\n collapsed={collapsed}\n />\n ))}\n </nav>\n </aside>\n\n {/* Mobile Menu Overlay */}\n {mobileOpen && (\n <div className=\"fixed inset-0 z-50 md:hidden\">\n <div\n className=\"absolute inset-0 bg-background/80 backdrop-blur-sm\"\n onClick={() => setMobileOpen(false)}\n />\n <aside className=\"absolute left-0 top-0 h-full w-64 border-r border-border bg-card shadow-xl\">\n <div className=\"flex h-14 items-center justify-between border-b border-border px-4\">\n <h2 className=\"text-lg font-semibold text-foreground\">\n {config.brandName || \"Settings\"}\n </h2>\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setMobileOpen(false)}>\n <Menu className=\"h-4 w-4\" />\n </Button>\n </div>\n\n <nav className=\"flex-1 overflow-y-auto p-2\">\n {config.sections.map((section) => (\n <SettingsSection\n key={section.key}\n section={section}\n currentPath={location.pathname}\n onNavigate={handleNavigate}\n />\n ))}\n </nav>\n </aside>\n </div>\n )}\n\n {/* Main Content Area */}\n <div className=\"flex flex-1 flex-col overflow-hidden min-w-0\">\n {/* Mobile Header */}\n <header className=\"flex h-14 items-center justify-between border-b border-border bg-card/50 backdrop-blur-md px-4 shrink-0 md:hidden\">\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => setMobileOpen(true)}>\n <Menu className=\"h-5 w-5\" />\n </Button>\n <h2 className=\"text-sm font-semibold text-foreground\">\n {config.brandName || \"Settings\"}\n </h2>\n </div>\n </header>\n\n <main className=\"flex-1 overflow-y-auto p-4 md:p-8\">\n {loading ? (\n <div className=\"mx-auto w-full max-w-4xl space-y-6\">\n <Skeleton className=\"h-8 w-1/3 rounded-xl\" />\n <div className=\"grid gap-4\">\n {Array.from({ length: 3 }).map((_, i) => (\n <Skeleton key={i} className=\"h-24 rounded-xl\" />\n ))}\n </div>\n </div>\n ) : (\n <Outlet />\n )}\n </main>\n </div>\n </div>\n );\n};\n\nexport default SettingsLayout;\n","import { Link } from \"react-router-dom\";\nimport { ChevronRight } from \"lucide-react\";\nimport { cn } from \"@umituz/web-design-system/utils\";\nimport type { SettingsSection as SettingsSectionType } from \"../types/settings\";\n\ninterface SettingsSectionProps {\n /** Section configuration */\n section: SettingsSectionType;\n /** Current path */\n currentPath?: string;\n /** On navigate callback */\n onNavigate?: (path: string) => void;\n /** Collapsed state */\n collapsed?: boolean;\n}\n\n/**\n * Settings Section Component\n *\n * Displays a section of settings items.\n *\n * @param props - Settings section props\n */\nexport const SettingsSection = ({\n section,\n currentPath,\n onNavigate,\n collapsed = false,\n}: SettingsSectionProps) => {\n const filteredItems = section.items.filter((item) => item.enabled !== false);\n\n if (filteredItems.length === 0) return null;\n\n return (\n <div className=\"mb-6 last:mb-0\">\n {!collapsed && (\n <h3 className=\"px-2 mb-2 text-xs font-bold uppercase tracking-wider text-muted-foreground\">\n {section.title}\n </h3>\n )}\n\n <div className=\"space-y-1\">\n {filteredItems.map((item) => {\n const isActive = currentPath === item.path;\n\n const itemContent = (\n <>\n {item.icon && (\n <item.icon\n className={cn(\n \"h-4 w-4 shrink-0\",\n isActive && \"scale-110\"\n )}\n />\n )}\n {!collapsed && (\n <>\n <span className=\"flex-1 text-left\">{item.label}</span>\n {item.badge !== undefined && item.badge > 0 && (\n <span className=\"ml-auto flex h-5 min-w-5 items-center justify-center rounded-full bg-destructive px-1.5 text-[10px] font-bold text-destructive-foreground\">\n {item.badge > 99 ? \"99+\" : item.badge}\n </span>\n )}\n {item.path && <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />}\n </>\n )}\n </>\n );\n\n const itemClassName = cn(\n \"flex items-center gap-3 rounded-lg px-3 py-2 text-sm font-medium transition-all duration-200 w-full\",\n \"hover:bg-accent hover:text-accent-foreground\",\n isActive && \"bg-accent text-accent-foreground\",\n collapsed ? \"justify-center\" : \"justify-start\"\n );\n\n if (item.path) {\n return (\n <Link\n key={item.key}\n to={item.path}\n onClick={() => onNavigate?.(item.path!)}\n className={itemClassName}\n title={collapsed ? item.label : undefined}\n >\n {itemContent}\n </Link>\n );\n }\n\n return (\n <button\n key={item.key}\n type=\"button\"\n onClick={() => {}}\n className={itemClassName}\n title={collapsed ? item.label : undefined}\n >\n {itemContent}\n </button>\n );\n })}\n </div>\n </div>\n );\n};\n"],"mappings":"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","names":["jsx","jsxs"]}
@@ -1,3 +0,0 @@
1
- export { useSettings } from './useSettings.js';
2
- import '../types/settings.js';
3
- import 'lucide-react';