create-nextjs-cms 0.9.23 → 0.9.25

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 (114) hide show
  1. package/package.json +2 -2
  2. package/templates/default/app/(auth)/auth/login/LoginPage.tsx +2 -2
  3. package/templates/default/app/(auth)/layout.tsx +1 -1
  4. package/templates/default/app/(rootLayout)/admins/page.tsx +1 -1
  5. package/templates/default/app/(rootLayout)/browse/[section]/[page]/page.tsx +1 -1
  6. package/templates/default/app/(rootLayout)/categorized/[section]/page.tsx +1 -1
  7. package/templates/default/app/(rootLayout)/edit/[section]/[itemId]/page.tsx +1 -1
  8. package/templates/default/app/(rootLayout)/layout.tsx +2 -2
  9. package/templates/default/app/(rootLayout)/loading.tsx +1 -1
  10. package/templates/default/app/(rootLayout)/log/page.tsx +1 -1
  11. package/templates/default/app/(rootLayout)/new/[section]/page.tsx +1 -1
  12. package/templates/default/app/(rootLayout)/section/[section]/page.tsx +1 -1
  13. package/templates/default/app/(rootLayout)/settings/page.tsx +1 -1
  14. package/templates/default/app/providers.tsx +1 -1
  15. package/templates/default/cms.config.ts +4 -2
  16. package/templates/default/components/{AdminCard.tsx → admin/admin-card.tsx} +3 -3
  17. package/templates/default/components/{AdminEditPage.tsx → admin/admin-edit-page.tsx} +3 -3
  18. package/templates/default/components/{NewAdminForm.tsx → admin/new-admin-form.tsx} +3 -3
  19. package/templates/default/components/{ContainerBox.tsx → container-box.tsx} +1 -1
  20. package/templates/default/components/{ErrorComponent.tsx → feedback/error-component.tsx} +1 -1
  21. package/templates/default/{context/ModalProvider.tsx → components/feedback/modal-context.tsx} +56 -53
  22. package/templates/default/components/{Modal.tsx → feedback/modal.tsx} +1 -1
  23. package/templates/default/components/form/{FormInputs.tsx → form-inputs.tsx} +17 -17
  24. package/templates/default/components/form/{Form.tsx → form.tsx} +8 -10
  25. package/templates/default/components/form/inputs/{CheckboxFormInput.tsx → checkbox-form-input.tsx} +1 -1
  26. package/templates/default/components/form/inputs/{ColorFormInput.tsx → color-form-input.tsx} +1 -1
  27. package/templates/default/components/form/inputs/{DateFormInput.tsx → date-form-input.tsx} +1 -1
  28. package/templates/default/components/form/inputs/{DateRangeFormInput.tsx → date-range-form-input.tsx} +1 -1
  29. package/templates/default/components/form/inputs/{DocumentFormInput.tsx → document-form-input.tsx} +3 -3
  30. package/templates/default/components/form/inputs/{MapFormInput.tsx → map-form-input.tsx} +5 -4
  31. package/templates/default/components/form/inputs/{MultipleSelectFormInput.tsx → multiple-select-form-input.tsx} +1 -1
  32. package/templates/default/components/form/inputs/{NumberFormInput.tsx → number-form-input.tsx} +1 -1
  33. package/templates/default/components/form/inputs/{PasswordFormInput.tsx → password-form-input.tsx} +1 -1
  34. package/templates/default/components/form/inputs/{PhotoFormInput.tsx → photo-form-input.tsx} +3 -3
  35. package/templates/default/components/form/inputs/{RichTextFormInput.tsx → rich-text-form-input.tsx} +2 -2
  36. package/templates/default/components/form/inputs/{SelectFormInput.tsx → select-form-input.tsx} +4 -4
  37. package/templates/default/components/form/inputs/{SlugFormInput.tsx → slug-form-input.tsx} +1 -1
  38. package/templates/default/components/form/inputs/{TagsFormInput.tsx → tags-form-input.tsx} +1 -1
  39. package/templates/default/components/form/inputs/{TextFormInput.tsx → text-form-input.tsx} +2 -2
  40. package/templates/default/components/form/inputs/{TextareaFormInput.tsx → textarea-form-input.tsx} +2 -2
  41. package/templates/default/components/form/inputs/{VideoFormInput.tsx → video-form-input.tsx} +3 -3
  42. package/templates/default/components/{Layout.tsx → layout/layout.tsx} +4 -4
  43. package/templates/default/components/{Navbar.tsx → layout/navbar.tsx} +2 -2
  44. package/templates/default/components/{SidebarDropdownItem.tsx → layout/sidebar-dropdown-item.tsx} +1 -1
  45. package/templates/default/components/{SidebarItem.tsx → layout/sidebar-item.tsx} +1 -1
  46. package/templates/default/components/{SidebarPluginGroup.tsx → layout/sidebar-plugin-group.tsx} +1 -1
  47. package/templates/default/components/{Sidebar.tsx → layout/sidebar.tsx} +4 -4
  48. package/templates/default/components/{LocaleSwitcher.tsx → locale/locale-switcher.tsx} +2 -2
  49. package/templates/default/components/{Dropzone.tsx → media/dropzone.tsx} +1 -1
  50. package/templates/default/components/{GalleryPhoto.tsx → media/gallery-photo.tsx} +2 -2
  51. package/templates/default/components/{PhotoGallery.tsx → media/photo-gallery.tsx} +2 -2
  52. package/templates/default/components/multi-select.tsx +8 -4
  53. package/templates/default/components/{AdminsPage.tsx → pages/admins-page.tsx} +4 -4
  54. package/templates/default/components/{BrowsePage.tsx → pages/browse-page.tsx} +7 -7
  55. package/templates/default/components/{CategorizedSectionPage.tsx → pages/categorized-section-page.tsx} +2 -2
  56. package/templates/default/components/{ItemEditPage.tsx → pages/item-edit-page.tsx} +7 -33
  57. package/templates/default/components/{LogPage.tsx → pages/log-page.tsx} +1 -1
  58. package/templates/default/components/{NewPage.tsx → pages/new-page.tsx} +27 -50
  59. package/templates/default/components/{SectionPage.tsx → pages/section-page.tsx} +6 -6
  60. package/templates/default/components/{SettingsPage.tsx → pages/settings-page.tsx} +4 -4
  61. package/templates/default/components/pagination/{Pagination.tsx → pagination.tsx} +1 -1
  62. package/templates/default/components/{CategoryDeleteConfirmPage.tsx → sections/category-delete-confirm-page.tsx} +4 -4
  63. package/templates/default/components/{CategorySectionSelectInput.tsx → sections/category-section-select-input.tsx} +4 -4
  64. package/templates/default/components/{ConditionalFields.tsx → sections/conditional-fields.tsx} +1 -1
  65. package/templates/default/components/{SectionItemCard.tsx → sections/section-item-card.tsx} +3 -3
  66. package/templates/default/components/{SelectInputButtons.tsx → sections/select-input-buttons.tsx} +4 -4
  67. package/templates/default/env/env.ts +42 -0
  68. package/templates/default/next.config.ts +1 -0
  69. package/templates/default/package.json +4 -5
  70. package/templates/default/components/AnalyticsPage.tsx +0 -144
  71. package/templates/default/components/BarChartBox.tsx +0 -42
  72. package/templates/default/components/NewVariantComponent.tsx +0 -229
  73. package/templates/default/components/PieChartBox.tsx +0 -101
  74. package/templates/default/components/VariantCard.tsx +0 -124
  75. package/templates/default/components/VariantEditPage.tsx +0 -230
  76. package/templates/default/components/analytics/BounceRate.tsx +0 -70
  77. package/templates/default/components/analytics/LivePageViews.tsx +0 -55
  78. package/templates/default/components/analytics/LiveUsersCount.tsx +0 -33
  79. package/templates/default/components/analytics/MonthlyPageViews.tsx +0 -42
  80. package/templates/default/components/analytics/TopCountries.tsx +0 -52
  81. package/templates/default/components/analytics/TopDevices.tsx +0 -46
  82. package/templates/default/components/analytics/TopMediums.tsx +0 -58
  83. package/templates/default/components/analytics/TopSources.tsx +0 -45
  84. package/templates/default/components/analytics/TotalPageViews.tsx +0 -41
  85. package/templates/default/components/analytics/TotalSessions.tsx +0 -41
  86. package/templates/default/components/analytics/TotalUniqueUsers.tsx +0 -41
  87. package/templates/default/components/custom/RightHomeRoomVariantCard.tsx +0 -138
  88. package/templates/default/env/env.js +0 -130
  89. package/templates/default/hooks/useModal.ts +0 -8
  90. package/templates/default/lib/apiHelpers.ts +0 -92
  91. /package/templates/default/components/{AdminPrivilegeCard.tsx → admin/admin-privilege-card.tsx} +0 -0
  92. /package/templates/default/components/{dndKit/Draggable.tsx → dnd-kit/draggable.tsx} +0 -0
  93. /package/templates/default/components/{dndKit/Droppable.tsx → dnd-kit/droppable.tsx} +0 -0
  94. /package/templates/default/components/{dndKit/SortableItem.tsx → dnd-kit/sortable-item.tsx} +0 -0
  95. /package/templates/default/components/{InfoCard.tsx → feedback/info-card.tsx} +0 -0
  96. /package/templates/default/components/{LoadingSpinners.tsx → feedback/loading-spinners.tsx} +0 -0
  97. /package/templates/default/components/{ProgressBar.tsx → feedback/progress-bar.tsx} +0 -0
  98. /package/templates/default/components/{TooltipComponent.tsx → feedback/tooltip-component.tsx} +0 -0
  99. /package/templates/default/components/form/{ContentLocaleContext.tsx → content-locale-context.tsx} +0 -0
  100. /package/templates/default/components/form/{FormInputElement.tsx → form-input-element.tsx} +0 -0
  101. /package/templates/default/components/{language-dropdown.tsx → i18n/language-dropdown.tsx} +0 -0
  102. /package/templates/default/components/{language-picker.tsx → i18n/language-picker.tsx} +0 -0
  103. /package/templates/default/components/{login-language-dropdown.tsx → i18n/login-language-dropdown.tsx} +0 -0
  104. /package/templates/default/components/{DefaultNavItems.tsx → layout/default-nav-items.tsx} +0 -0
  105. /package/templates/default/components/{ThemeProvider.tsx → layout/theme-provider.tsx} +0 -0
  106. /package/templates/default/components/{theme-toggle.tsx → layout/theme-toggle.tsx} +0 -0
  107. /package/templates/default/components/{ProtectedDocument.tsx → media/protected-document.tsx} +0 -0
  108. /package/templates/default/components/{ProtectedImage.tsx → media/protected-image.tsx} +0 -0
  109. /package/templates/default/components/{ProtectedVideo.tsx → media/protected-video.tsx} +0 -0
  110. /package/templates/default/components/{DashboardPageAlt.tsx → pages/dashboard-page-alt.tsx} +0 -0
  111. /package/templates/default/components/pagination/{PaginationButtons.tsx → pagination-buttons.tsx} +0 -0
  112. /package/templates/default/components/{SectionIcon.tsx → sections/section-icon.tsx} +0 -0
  113. /package/templates/default/components/{SectionItemStatusBadge.tsx → sections/section-item-status-badge.tsx} +0 -0
  114. /package/templates/default/components/{SelectBox.tsx → select-box.tsx} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-nextjs-cms",
3
- "version": "0.9.23",
3
+ "version": "0.9.25",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "bin": {
@@ -28,8 +28,8 @@
28
28
  "prettier": "^3.3.3",
29
29
  "tsx": "^4.20.6",
30
30
  "typescript": "^5.9.2",
31
- "@lzcms/prettier-config": "0.1.0",
32
31
  "@lzcms/eslint-config": "0.3.0",
32
+ "@lzcms/prettier-config": "0.1.0",
33
33
  "@lzcms/tsconfig": "0.1.0"
34
34
  },
35
35
  "prettier": "@lzcms/prettier-config",
@@ -3,7 +3,7 @@
3
3
  import React, { useEffect, useRef, useState } from 'react'
4
4
  import { useRouter, useSearchParams } from 'next/navigation'
5
5
  import { useI18n } from 'nextjs-cms/translations/client'
6
- import InfoCard from '@/components/InfoCard'
6
+ import InfoCard from '@/components/feedback/info-card'
7
7
  import Link from 'next/link'
8
8
  import { Switch } from '@/components/ui/switch'
9
9
  import { Label } from '@/components/ui/label'
@@ -12,7 +12,7 @@ import { MoonIcon, SunIcon } from '@radix-ui/react-icons'
12
12
  import { useTheme } from 'next-themes'
13
13
  import { login, useSession } from 'nextjs-cms/auth/react'
14
14
  import { wasLanguageChangedOnLogin } from 'nextjs-cms/translations'
15
- import LoginLanguageDropdown from '@/components/login-language-dropdown'
15
+ import LoginLanguageDropdown from '@/components/i18n/login-language-dropdown'
16
16
  import { useAuthLanguage } from '../../auth-language-provider'
17
17
 
18
18
  type fromErrors = {
@@ -3,7 +3,7 @@ import { cookies } from 'next/headers'
3
3
  import '../globals.css'
4
4
  import type { Metadata } from 'next'
5
5
  import { cn } from '@/lib/utils'
6
- import { ThemeProvider } from '@/components/ThemeProvider'
6
+ import { ThemeProvider } from '@/components/layout/theme-provider'
7
7
  import Providers from '@/app/providers'
8
8
  import auth from 'nextjs-cms/auth'
9
9
  import { getCMSConfig } from 'nextjs-cms/core'
@@ -1,4 +1,4 @@
1
- import AdminsPage from '@/components/AdminsPage'
1
+ import AdminsPage from '@/components/pages/admins-page'
2
2
  import { api, HydrateClient } from '@/app/_trpc/server'
3
3
  export default async function Page() {
4
4
  await api.admins.list.prefetch()
@@ -1,4 +1,4 @@
1
- import BrowsePage from '@/components/BrowsePage'
1
+ import BrowsePage from '@/components/pages/browse-page'
2
2
  import { api, HydrateClient } from '@/app/_trpc/server'
3
3
  type Params = Promise<{ section: string; page: string }>
4
4
  type SearchParams = Promise<{ q: string | undefined }>
@@ -1,4 +1,4 @@
1
- import CategorizedSectionPage from '@/components/CategorizedSectionPage'
1
+ import CategorizedSectionPage from '@/components/pages/categorized-section-page'
2
2
  import { api, HydrateClient } from '@/app/_trpc/server'
3
3
  type Params = Promise<{ section: string }>
4
4
 
@@ -1,4 +1,4 @@
1
- import ItemEditPage from '@/components/ItemEditPage'
1
+ import ItemEditPage from '@/components/pages/item-edit-page'
2
2
  import { api, HydrateClient } from '@/app/_trpc/server'
3
3
  type Params = Promise<{ section: string; itemId: string }>
4
4
  type SearchParams = Promise<{ locale?: string }>
@@ -2,7 +2,7 @@ import { Inter, Cairo } from 'next/font/google'
2
2
  import '../globals.css'
3
3
  import type { Metadata } from 'next'
4
4
  import { cn } from '@/lib/utils'
5
- import { ThemeProvider } from '@/components/ThemeProvider'
5
+ import { ThemeProvider } from '@/components/layout/theme-provider'
6
6
  import Providers from '@/app/providers'
7
7
  import auth from 'nextjs-cms/auth'
8
8
  import { getCMSConfig } from 'nextjs-cms/core'
@@ -10,7 +10,7 @@ import { I18nProviderClient } from 'nextjs-cms/translations/client'
10
10
  import { resolveLanguage, RTL_LANGUAGES } from 'nextjs-cms/translations'
11
11
  import { getClientDictionaries } from 'nextjs-cms/translations/server'
12
12
  import { api, HydrateClient } from '@/app/_trpc/server'
13
- import Layout from '@/components/Layout'
13
+ import Layout from '@/components/layout/layout'
14
14
  import { redirect } from 'next/navigation'
15
15
  import { DirectionProvider } from "@/components/ui/direction"
16
16
 
@@ -1,4 +1,4 @@
1
- import LoadingSpinners from '@/components/LoadingSpinners'
1
+ import LoadingSpinners from '@/components/feedback/loading-spinners'
2
2
 
3
3
  export default function Loading() {
4
4
  // You can add any UI inside Loading, including a Skeleton.
@@ -1,4 +1,4 @@
1
- import LogPage from '@/components/LogPage'
1
+ import LogPage from '@/components/pages/log-page'
2
2
 
3
3
  export const dynamic = 'force-dynamic'
4
4
 
@@ -1,4 +1,4 @@
1
- import NewPage from '@/components/NewPage'
1
+ import NewPage from '@/components/pages/new-page'
2
2
  import { api, HydrateClient } from '@/app/_trpc/server'
3
3
  type Params = Promise<{ section: string }>
4
4
 
@@ -1,4 +1,4 @@
1
- import SectionPage from '@/components/SectionPage'
1
+ import SectionPage from '@/components/pages/section-page'
2
2
  import { api, HydrateClient } from '@/app/_trpc/server'
3
3
  type Params = Promise<{ section: string }>
4
4
  type SearchParams = Promise<{ locale?: string }>
@@ -1,4 +1,4 @@
1
- import SettingsPage from '@/components/SettingsPage'
1
+ import SettingsPage from '@/components/pages/settings-page'
2
2
  import { api, HydrateClient } from '@/app/_trpc/server'
3
3
 
4
4
  export const dynamic = 'force-dynamic'
@@ -2,7 +2,7 @@
2
2
 
3
3
  import type { Session } from 'nextjs-cms/auth'
4
4
  import { NextjsCmsProvider } from '@/app/_trpc/client'
5
- import { ModalProvider } from '@/context/ModalProvider'
5
+ import { ModalProvider } from '@/components/feedback/modal-context'
6
6
 
7
7
  export default function Providers({ children, session }: { children: React.ReactNode; session: Session | undefined }) {
8
8
  return (
@@ -1,5 +1,7 @@
1
- import { defineConfig } from 'nextjs-cms/core/config'
1
+ import { defineConfig } from 'nextjs-cms/core/config'
2
+ import process from 'process'
2
3
  import { resolve } from 'path'
4
+ import { env } from './env/env'
3
5
 
4
6
  export default defineConfig({
5
7
  ui: {
@@ -17,7 +19,7 @@ export default defineConfig({
17
19
  media: {
18
20
  upload: {
19
21
  path:
20
- process.env.NODE_ENV === 'development'
22
+ env.NODE_ENV === 'development'
21
23
  ? 'D:/Work/WebstormProjects/turbo-expo-next/apps/web/public/content/'
22
24
  : '/home2/syriasell/public_html/assets/content',
23
25
  preserveExtension: true,
@@ -1,8 +1,8 @@
1
1
  import { useI18n } from 'nextjs-cms/translations/client'
2
2
  import React from 'react'
3
- import useModal from '@/hooks/useModal'
4
- import ProtectedImage from '@/components/ProtectedImage'
5
- import AdminEditPage from '@/components/AdminEditPage'
3
+ import { useModal } from '@/components/feedback/modal-context'
4
+ import ProtectedImage from '@/components/media/protected-image'
5
+ import AdminEditPage from '@/components/admin/admin-edit-page'
6
6
  import { useToast } from '@/components/ui/use-toast'
7
7
  import { ScrollArea } from '@/components/ui/scroll-area'
8
8
  import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'
@@ -1,9 +1,9 @@
1
1
  import { useI18n } from 'nextjs-cms/translations/client'
2
2
  import React from 'react'
3
- import useModal from '@/hooks/useModal'
3
+ import { useModal } from '@/components/feedback/modal-context'
4
4
  import { trpc } from '@/app/_trpc/client'
5
- import AdminRoleCard from './AdminPrivilegeCard'
6
- import LoadingSpinners from './LoadingSpinners'
5
+ import AdminRoleCard from '@/components/admin/admin-privilege-card'
6
+ import LoadingSpinners from '@/components/feedback/loading-spinners'
7
7
  import { Button } from '@/components/ui/button'
8
8
 
9
9
  export default function AdminEditPage({ id, action }: { id: string; action: any }) {
@@ -1,10 +1,10 @@
1
1
  import { useI18n } from 'nextjs-cms/translations/client'
2
2
  import React from 'react'
3
- import useModal from '@/hooks/useModal'
4
- import InfoCard from '@/components/InfoCard'
3
+ import { useModal } from '@/components/feedback/modal-context'
4
+ import InfoCard from '@/components/feedback/info-card'
5
5
  import { useToast } from '@/components/ui/use-toast'
6
6
  import { trpc } from '@/app/_trpc/client'
7
- import AdminRoleCard from '@/components/AdminPrivilegeCard'
7
+ import AdminRoleCard from '@/components/admin/admin-privilege-card'
8
8
  import { Button } from '@/components/ui/button'
9
9
  import type { RouterOutputs } from '@/app/_trpc/types'
10
10
 
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- // import { Card, CardContent, CardHeader, CardTitle } from './ui/card'
2
+ // import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
3
3
 
4
4
  export default function ContainerBox({ children, title }: { children: React.ReactNode; title?: string }) {
5
5
  return (
@@ -1,4 +1,4 @@
1
- import { Alert, AlertDescription } from './ui/alert'
1
+ import { Alert, AlertDescription } from '@/components/ui/alert'
2
2
  import { ExclamationTriangleIcon } from '@radix-ui/react-icons'
3
3
 
4
4
  export default function ErrorComponent({ message }: { message: string }) {
@@ -1,53 +1,56 @@
1
- 'use client'
2
-
3
- import React, { createContext, useState } from 'react'
4
-
5
- export type ModalResponse = {
6
- message: React.ReactNode | string
7
- messageColor?: string
8
- borderColor?: string
9
- bgColor?: string
10
- }
11
-
12
- export type Modal = {
13
- title: string
14
- titleColor: string
15
- headerColor: string
16
- body: React.ReactNode
17
- lang: string
18
- size?: 'sm' | 'md' | 'lg' | 'xl'
19
- }
20
-
21
- const ModalContext = createContext<{
22
- modal: Modal | null
23
- setModal: React.Dispatch<React.SetStateAction<Modal | null>>
24
- modalResponse: ModalResponse | null
25
- setModalResponse: React.Dispatch<React.SetStateAction<ModalResponse | null>>
26
- }>(
27
- {} as {
28
- modal: Modal | null
29
- setModal: React.Dispatch<React.SetStateAction<Modal | null>>
30
- modalResponse: ModalResponse | null
31
- setModalResponse: React.Dispatch<React.SetStateAction<ModalResponse | null>>
32
- },
33
- )
34
-
35
- export const ModalProvider = ({ children }: { children: React.ReactNode }) => {
36
- const [modal, setModal] = useState<Modal | null>(null)
37
- const [modalResponse, setModalResponse] = useState<ModalResponse | null>(null)
38
-
39
- return (
40
- <ModalContext.Provider
41
- value={{
42
- modal,
43
- setModal,
44
- modalResponse,
45
- setModalResponse,
46
- }}
47
- >
48
- {children}
49
- </ModalContext.Provider>
50
- )
51
- }
52
-
53
- export default ModalContext
1
+ 'use client'
2
+
3
+ import React, { createContext, useContext, useState } from 'react'
4
+
5
+ export type ModalResponse = {
6
+ message: React.ReactNode | string
7
+ messageColor?: string
8
+ borderColor?: string
9
+ bgColor?: string
10
+ }
11
+
12
+ export type Modal = {
13
+ title: string
14
+ titleColor: string
15
+ headerColor: string
16
+ body: React.ReactNode
17
+ lang: string
18
+ size?: 'sm' | 'md' | 'lg' | 'xl'
19
+ }
20
+
21
+ type ModalContextValue = {
22
+ modal: Modal | null
23
+ setModal: React.Dispatch<React.SetStateAction<Modal | null>>
24
+ modalResponse: ModalResponse | null
25
+ setModalResponse: React.Dispatch<React.SetStateAction<ModalResponse | null>>
26
+ }
27
+
28
+ const ModalContext = createContext<ModalContextValue | null>(null)
29
+
30
+ export function ModalProvider({ children }: { children: React.ReactNode }) {
31
+ const [modal, setModal] = useState<Modal | null>(null)
32
+ const [modalResponse, setModalResponse] = useState<ModalResponse | null>(null)
33
+
34
+ return (
35
+ <ModalContext.Provider
36
+ value={{
37
+ modal,
38
+ setModal,
39
+ modalResponse,
40
+ setModalResponse,
41
+ }}
42
+ >
43
+ {children}
44
+ </ModalContext.Provider>
45
+ )
46
+ }
47
+
48
+ export function useModal() {
49
+ const context = useContext(ModalContext)
50
+
51
+ if (!context) {
52
+ throw new Error('useModal must be used within ModalProvider')
53
+ }
54
+
55
+ return context
56
+ }
@@ -1,7 +1,7 @@
1
1
  'use client'
2
2
 
3
3
  import { Suspense, useEffect, useRef, useState } from 'react'
4
- import useModal from '@/hooks/useModal'
4
+ import { useModal } from '@/components/feedback/modal-context'
5
5
  import classNames from 'classnames'
6
6
  import { X, Loader2 } from 'lucide-react'
7
7
 
@@ -1,22 +1,22 @@
1
1
  import type { FieldClientConfig } from 'nextjs-cms/core/fields'
2
2
  import React from 'react'
3
- import CheckboxFormInput from '@/components/form/inputs/CheckboxFormInput'
4
- import ColorFormInput from '@/components/form/inputs/ColorFormInput'
5
- import DateFormInput from '@/components/form/inputs/DateFormInput'
6
- import DateRangeFormInput from '@/components/form/inputs/DateRangeFormInput'
7
- import DocumentFormInput from '@/components/form/inputs/DocumentFormInput'
8
- import MapFormInput from '@/components/form/inputs/MapFormInput'
9
- import MultipleSelectFormInput from '@/components/form/inputs/MultipleSelectFormInput'
10
- import NumberFormInput from '@/components/form/inputs/NumberFormInput'
11
- import PasswordFormInput from '@/components/form/inputs/PasswordFormInput'
12
- import PhotoFormInput from '@/components/form/inputs/PhotoFormInput'
13
- import RichTextFormInput from '@/components/form/inputs/RichTextFormInput'
14
- import SelectFormInput from '@/components/form/inputs/SelectFormInput'
15
- import SlugFormInput from '@/components/form/inputs/SlugFormInput'
16
- import TagsFormInput from '@/components/form/inputs/TagsFormInput'
17
- import TextareaFormInput from '@/components/form/inputs/TextareaFormInput'
18
- import TextFormInput from '@/components/form/inputs/TextFormInput'
19
- import VideoFormInput from '@/components/form/inputs/VideoFormInput'
3
+ import CheckboxFormInput from '@/components/form/inputs/checkbox-form-input'
4
+ import ColorFormInput from '@/components/form/inputs/color-form-input'
5
+ import DateFormInput from '@/components/form/inputs/date-form-input'
6
+ import DateRangeFormInput from '@/components/form/inputs/date-range-form-input'
7
+ import DocumentFormInput from '@/components/form/inputs/document-form-input'
8
+ import MapFormInput from '@/components/form/inputs/map-form-input'
9
+ import MultipleSelectFormInput from '@/components/form/inputs/multiple-select-form-input'
10
+ import NumberFormInput from '@/components/form/inputs/number-form-input'
11
+ import PasswordFormInput from '@/components/form/inputs/password-form-input'
12
+ import PhotoFormInput from '@/components/form/inputs/photo-form-input'
13
+ import RichTextFormInput from '@/components/form/inputs/rich-text-form-input'
14
+ import SelectFormInput from '@/components/form/inputs/select-form-input'
15
+ import SlugFormInput from '@/components/form/inputs/slug-form-input'
16
+ import TagsFormInput from '@/components/form/inputs/tags-form-input'
17
+ import TextareaFormInput from '@/components/form/inputs/textarea-form-input'
18
+ import TextFormInput from '@/components/form/inputs/text-form-input'
19
+ import VideoFormInput from '@/components/form/inputs/video-form-input'
20
20
  import {
21
21
  CheckboxFieldClientConfig,
22
22
  ColorFieldClientConfig,
@@ -1,12 +1,11 @@
1
1
  import type { RouterOutputs } from '@/app/_trpc/types'
2
2
  import React, { RefObject, useCallback, useEffect } from 'react'
3
- import ContainerBox from '@/components/ContainerBox'
4
- import Dropzone, { DropzoneHandles } from '@/components/Dropzone'
5
- import { LocalizationProvider } from '@/components/form/ContentLocaleContext'
6
- import FormInputs from '@/components/form/FormInputs'
3
+ import ContainerBox from '@/components/container-box'
4
+ import Dropzone, { DropzoneHandles } from '@/components/media/dropzone'
5
+ import { LocalizationProvider } from '@/components/form/content-locale-context'
6
+ import FormInputs from '@/components/form/form-inputs'
7
7
  import { configLastUpdated } from '@/components/form/helpers/util'
8
- import NewVariantComponent, { VariantHandles } from '@/components/NewVariantComponent'
9
- import ProgressBar from '@/components/ProgressBar'
8
+ import ProgressBar from '@/components/feedback/progress-bar'
10
9
  import { zodResolver } from '@hookform/resolvers/zod'
11
10
  import classNames from 'classnames'
12
11
  import { useSession } from 'nextjs-cms/auth/react'
@@ -53,7 +52,7 @@ import {
53
52
  import { FormProvider, useForm } from 'react-hook-form'
54
53
  import * as z from 'zod'
55
54
 
56
- import PhotoGallery from '../PhotoGallery'
55
+ import PhotoGallery from '@/components/media/photo-gallery'
57
56
 
58
57
  export const revalidate = 1
59
58
 
@@ -61,7 +60,6 @@ export default function Form({
61
60
  formType,
62
61
  data,
63
62
  dropzoneRef,
64
- variantRef,
65
63
  handleSubmit,
66
64
  isSubmitting,
67
65
  response,
@@ -104,7 +102,6 @@ export default function Form({
104
102
  | undefined
105
103
  }
106
104
  dropzoneRef?: RefObject<DropzoneHandles | null>
107
- variantRef?: RefObject<VariantHandles[]>
108
105
  handleSubmit: any
109
106
  isSubmitting: boolean
110
107
  response?: any
@@ -353,7 +350,8 @@ export default function Form({
353
350
  className={classNames({
354
351
  'w-full': buttonType === 'big',
355
352
  'float-end': buttonType === 'small',
356
- 'bg-linear-to-r rounded px-4 py-2 font-bold text-white drop-shadow-sm': true,
353
+ 'rounded bg-linear-to-r px-4 py-2 font-bold text-white drop-shadow-sm':
354
+ true,
357
355
  'from-emerald-700 via-green-700 to-green-500 dark:from-blue-800 dark:via-sky-800 dark:to-slate-500':
358
356
  !isSubmitting,
359
357
  'from-gray-600 via-gray-500 to-gray-400': isSubmitting,
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import FormInputElement from '@/components/form/FormInputElement'
2
+ import FormInputElement from '@/components/form/form-input-element'
3
3
  import { CheckboxFieldClientConfig } from 'nextjs-cms/core/fields'
4
4
  import { useController, useFormContext } from 'react-hook-form'
5
5
  import { Switch } from '@/components/ui/switch'
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import FormInputElement from '@/components/form/FormInputElement'
2
+ import FormInputElement from '@/components/form/form-input-element'
3
3
  import { ColorFieldClientConfig } from 'nextjs-cms/core/fields'
4
4
  import { useController, useFormContext } from 'react-hook-form'
5
5
 
@@ -1,6 +1,6 @@
1
1
  import React from 'react'
2
2
  import dayjs from 'dayjs'
3
- import FormInputElement from '@/components/form/FormInputElement'
3
+ import FormInputElement from '@/components/form/form-input-element'
4
4
  import { Button } from '@/components/ui/button'
5
5
  import { Calendar } from '@/components/ui/calendar'
6
6
  import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
@@ -8,7 +8,7 @@ import { CalendarIcon, ChevronDownIcon } from '@radix-ui/react-icons'
8
8
  import { Button } from '@/components/ui/button'
9
9
  import { Calendar } from '@/components/ui/calendar'
10
10
  import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'
11
- import FormInputElement from '@/components/form/FormInputElement'
11
+ import FormInputElement from '@/components/form/form-input-element'
12
12
  import type { DateRangeFieldClientConfig } from 'nextjs-cms/core/fields'
13
13
 
14
14
  const seasonEmoji: Record<string, string> = {
@@ -1,9 +1,9 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react'
2
- import FormInputElement from '@/components/form/FormInputElement'
3
- import ProtectedDocument from '@/components/ProtectedDocument'
2
+ import FormInputElement from '@/components/form/form-input-element'
3
+ import ProtectedDocument from '@/components/media/protected-document'
4
4
  import { Badge } from '@/components/ui/badge'
5
5
  import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
6
- import useModal from '@/hooks/useModal'
6
+ import { useModal } from '@/components/feedback/modal-context'
7
7
  import { ChevronRight, InfoIcon, Trash2Icon, Undo2Icon, UploadIcon, X } from 'lucide-react'
8
8
  import { DocumentFieldClientConfig } from 'nextjs-cms/core/fields'
9
9
  import { useI18n } from 'nextjs-cms/translations/client'
@@ -1,12 +1,13 @@
1
1
  import React, { useEffect } from 'react'
2
2
  import { APIProvider, Map, Marker } from '@vis.gl/react-google-maps'
3
- import ContainerBox from '@/components/ContainerBox'
3
+ import ContainerBox from '@/components/container-box'
4
4
  import { Button } from '@/components/ui/button'
5
- import TooltipComponent from '@/components/TooltipComponent'
5
+ import TooltipComponent from '@/components/feedback/tooltip-component'
6
6
  import { useI18n } from 'nextjs-cms/translations/client'
7
7
  import { MapFieldClientConfig } from 'nextjs-cms/core/fields'
8
8
  import { useController, useFormContext } from 'react-hook-form'
9
- import FormInputElement from '@/components/form/FormInputElement'
9
+ import FormInputElement from '@/components/form/form-input-element'
10
+ import { env } from '@/env/env'
10
11
 
11
12
  export default function MapFormInput({ input }: { input: MapFieldClientConfig }) {
12
13
  const t = useI18n()
@@ -62,7 +63,7 @@ export default function MapFormInput({ input }: { input: MapFieldClientConfig })
62
63
  onBlur={field.onBlur}
63
64
  ref={field.ref}
64
65
  />
65
- <APIProvider apiKey={process.env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ?? ''}>
66
+ <APIProvider apiKey={env.NEXT_PUBLIC_GOOGLE_MAPS_API_KEY ?? ''}>
66
67
  <Map
67
68
  clickableIcons={false}
68
69
  zoomControl={true}
@@ -1,4 +1,4 @@
1
- import FormInputElement from '@/components/form/FormInputElement'
1
+ import FormInputElement from '@/components/form/form-input-element'
2
2
  import { useEffect, useState } from 'react'
3
3
  import { SelectMultipleFieldClientConfig, SelectOption } from 'nextjs-cms/core/fields'
4
4
  import { useController, useFormContext } from 'react-hook-form'
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import FormInputElement from '@/components/form/FormInputElement'
2
+ import FormInputElement from '@/components/form/form-input-element'
3
3
  import type { NumberFieldClientConfig } from 'nextjs-cms/core/fields'
4
4
  import { useController, useFormContext } from 'react-hook-form'
5
5
  import { isNumber, toNumber } from 'lodash-es'
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import FormInputElement from '@/components/form/FormInputElement'
2
+ import FormInputElement from '@/components/form/form-input-element'
3
3
  import { PasswordFieldClientConfig } from 'nextjs-cms/core/fields'
4
4
  import { useController, useFormContext } from 'react-hook-form'
5
5
 
@@ -1,9 +1,9 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react'
2
2
  import { useI18n } from 'nextjs-cms/translations/client'
3
- import FormInputElement from '@/components/form/FormInputElement'
4
- import ProtectedImage from '@/components/ProtectedImage'
3
+ import FormInputElement from '@/components/form/form-input-element'
4
+ import ProtectedImage from '@/components/media/protected-image'
5
5
  import Image from 'next/image'
6
- import useModal from '@/hooks/useModal'
6
+ import { useModal } from '@/components/feedback/modal-context'
7
7
  import { ChevronRight, InfoIcon, Trash2Icon, Undo2Icon, UploadIcon, X } from 'lucide-react'
8
8
  import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
9
9
  import { Badge } from '@/components/ui/badge'
@@ -1,11 +1,11 @@
1
1
  import React, { useRef, useState } from 'react'
2
2
  import { Editor } from '@tinymce/tinymce-react'
3
- import FormInputElement from '@/components/form/FormInputElement'
3
+ import FormInputElement from '@/components/form/form-input-element'
4
4
  // import { useTheme } from 'next-themes'
5
5
  import { useAxiosPrivate } from 'nextjs-cms/api/client'
6
6
  import { RichTextFieldClientConfig } from 'nextjs-cms/core/fields'
7
7
  import { FieldError, useFormContext } from 'react-hook-form'
8
- import { useLocale } from '@/components/form/ContentLocaleContext'
8
+ import { useLocale } from '@/components/form/content-locale-context'
9
9
 
10
10
  export default function RichTextFormInput({ input }: { input: RichTextFieldClientConfig }) {
11
11
  const { setValue, register, formState } = useFormContext()
@@ -1,13 +1,13 @@
1
1
  import { useEffect, useState, useMemo } from 'react'
2
- import FormInputElement from '@/components/form/FormInputElement'
3
- import SelectBox from '@/components/SelectBox'
4
- import LoadingSpinners from '@/components/LoadingSpinners'
2
+ import FormInputElement from '@/components/form/form-input-element'
3
+ import SelectBox from '@/components/select-box'
4
+ import LoadingSpinners from '@/components/feedback/loading-spinners'
5
5
  import { useAutoAnimate } from '@formkit/auto-animate/react'
6
6
  import { useI18n } from 'nextjs-cms/translations/client'
7
7
  import { useSession } from 'nextjs-cms/auth/react'
8
8
  import { trpc } from '@/app/_trpc/client'
9
9
  import { SelectFieldClientConfig, SelectOption } from 'nextjs-cms/core/fields'
10
- import { ConditionalFields } from '@/components/ConditionalFields'
10
+ import { ConditionalFields } from '@/components/sections/conditional-fields'
11
11
  import { useController, useFormContext } from 'react-hook-form'
12
12
 
13
13
  export default function SelectFormInput({
@@ -1,7 +1,7 @@
1
1
  'use client'
2
2
 
3
3
  import React, { useCallback, useEffect, useRef } from 'react'
4
- import FormInputElement from '@/components/form/FormInputElement'
4
+ import FormInputElement from '@/components/form/form-input-element'
5
5
  import type { SlugFieldClientConfig } from 'nextjs-cms/core/fields'
6
6
  import { useFormContext, useController, useWatch } from 'react-hook-form'
7
7
  import { InputGroup, InputGroupInput, InputGroupAddon } from '@/components/ui/input-group'
@@ -1,4 +1,4 @@
1
- import FormInputElement from '@/components/form/FormInputElement'
1
+ import FormInputElement from '@/components/form/form-input-element'
2
2
  import { useI18n } from 'nextjs-cms/translations/client'
3
3
  import { TagsFieldClientConfig } from 'nextjs-cms/core/fields'
4
4
  import { useController, useFormContext } from 'react-hook-form'
@@ -1,8 +1,8 @@
1
1
  import React from 'react'
2
- import FormInputElement from '@/components/form/FormInputElement'
2
+ import FormInputElement from '@/components/form/form-input-element'
3
3
  import type { TextFieldClientConfig } from 'nextjs-cms/core/fields'
4
4
  import { useFormContext, useController } from 'react-hook-form'
5
- import { useLocale } from '@/components/form/ContentLocaleContext'
5
+ import { useLocale } from '@/components/form/content-locale-context'
6
6
 
7
7
  export default function TextFormInput({
8
8
  input,