@tower_74/cms-app 0.1.0

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 (189) hide show
  1. package/README.md +102 -0
  2. package/package.json +49 -0
  3. package/src/components/AppContent.vue +21 -0
  4. package/src/components/AppLogoIcon.vue +24 -0
  5. package/src/components/AppShell.vue +37 -0
  6. package/src/components/AppearanceTabs.vue +37 -0
  7. package/src/components/AuthBar.vue +58 -0
  8. package/src/components/BlockEditor.vue +95 -0
  9. package/src/components/DeleteUser.vue +87 -0
  10. package/src/components/FieldBuilder.vue +105 -0
  11. package/src/components/Heading.vue +20 -0
  12. package/src/components/HeadingSmall.vue +17 -0
  13. package/src/components/Icon.vue +30 -0
  14. package/src/components/InputError.vue +13 -0
  15. package/src/components/MenuItemsEditor.vue +59 -0
  16. package/src/components/NavUser.vue +30 -0
  17. package/src/components/Pagination.vue +28 -0
  18. package/src/components/PlaceholderPattern.vue +16 -0
  19. package/src/components/Seo.vue +28 -0
  20. package/src/components/TextLink.vue +24 -0
  21. package/src/components/UserInfo.vue +34 -0
  22. package/src/components/UserMenuContent.vue +37 -0
  23. package/src/components/commerce/OptionsEditor.vue +55 -0
  24. package/src/components/commerce/VariantsEditor.vue +71 -0
  25. package/src/components/ui/avatar/Avatar.vue +24 -0
  26. package/src/components/ui/avatar/AvatarFallback.vue +11 -0
  27. package/src/components/ui/avatar/AvatarImage.vue +9 -0
  28. package/src/components/ui/avatar/index.ts +24 -0
  29. package/src/components/ui/breadcrumb/Breadcrumb.vue +13 -0
  30. package/src/components/ui/breadcrumb/BreadcrumbEllipsis.vue +18 -0
  31. package/src/components/ui/breadcrumb/BreadcrumbItem.vue +14 -0
  32. package/src/components/ui/breadcrumb/BreadcrumbLink.vue +15 -0
  33. package/src/components/ui/breadcrumb/BreadcrumbList.vue +14 -0
  34. package/src/components/ui/breadcrumb/BreadcrumbPage.vue +14 -0
  35. package/src/components/ui/breadcrumb/BreadcrumbSeparator.vue +17 -0
  36. package/src/components/ui/breadcrumb/index.ts +7 -0
  37. package/src/components/ui/button/Button.vue +22 -0
  38. package/src/components/ui/button/index.ts +31 -0
  39. package/src/components/ui/card/Card.vue +14 -0
  40. package/src/components/ui/card/CardContent.vue +14 -0
  41. package/src/components/ui/card/CardDescription.vue +14 -0
  42. package/src/components/ui/card/CardFooter.vue +14 -0
  43. package/src/components/ui/card/CardHeader.vue +14 -0
  44. package/src/components/ui/card/CardTitle.vue +14 -0
  45. package/src/components/ui/card/index.ts +6 -0
  46. package/src/components/ui/checkbox/Checkbox.vue +36 -0
  47. package/src/components/ui/checkbox/index.ts +1 -0
  48. package/src/components/ui/collapsible/Collapsible.vue +15 -0
  49. package/src/components/ui/collapsible/CollapsibleContent.vue +14 -0
  50. package/src/components/ui/collapsible/CollapsibleTrigger.vue +11 -0
  51. package/src/components/ui/collapsible/index.ts +3 -0
  52. package/src/components/ui/dialog/Dialog.vue +14 -0
  53. package/src/components/ui/dialog/DialogClose.vue +11 -0
  54. package/src/components/ui/dialog/DialogContent.vue +51 -0
  55. package/src/components/ui/dialog/DialogDescription.vue +21 -0
  56. package/src/components/ui/dialog/DialogFooter.vue +12 -0
  57. package/src/components/ui/dialog/DialogHeader.vue +14 -0
  58. package/src/components/ui/dialog/DialogScrollContent.vue +59 -0
  59. package/src/components/ui/dialog/DialogTitle.vue +21 -0
  60. package/src/components/ui/dialog/DialogTrigger.vue +11 -0
  61. package/src/components/ui/dialog/index.ts +9 -0
  62. package/src/components/ui/dropdown-menu/DropdownMenu.vue +14 -0
  63. package/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue +42 -0
  64. package/src/components/ui/dropdown-menu/DropdownMenuContent.vue +40 -0
  65. package/src/components/ui/dropdown-menu/DropdownMenuGroup.vue +11 -0
  66. package/src/components/ui/dropdown-menu/DropdownMenuItem.vue +30 -0
  67. package/src/components/ui/dropdown-menu/DropdownMenuLabel.vue +21 -0
  68. package/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue +14 -0
  69. package/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue +43 -0
  70. package/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue +21 -0
  71. package/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue +14 -0
  72. package/src/components/ui/dropdown-menu/DropdownMenuSub.vue +14 -0
  73. package/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue +30 -0
  74. package/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue +31 -0
  75. package/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue +13 -0
  76. package/src/components/ui/dropdown-menu/index.ts +16 -0
  77. package/src/components/ui/input/Input.vue +32 -0
  78. package/src/components/ui/input/index.ts +1 -0
  79. package/src/components/ui/label/Label.vue +22 -0
  80. package/src/components/ui/label/index.ts +1 -0
  81. package/src/components/ui/navigation-menu/NavigationMenu.vue +25 -0
  82. package/src/components/ui/navigation-menu/NavigationMenuContent.vue +31 -0
  83. package/src/components/ui/navigation-menu/NavigationMenuIndicator.vue +29 -0
  84. package/src/components/ui/navigation-menu/NavigationMenuItem.vue +11 -0
  85. package/src/components/ui/navigation-menu/NavigationMenuLink.vue +14 -0
  86. package/src/components/ui/navigation-menu/NavigationMenuList.vue +21 -0
  87. package/src/components/ui/navigation-menu/NavigationMenuTrigger.vue +24 -0
  88. package/src/components/ui/navigation-menu/NavigationMenuViewport.vue +29 -0
  89. package/src/components/ui/navigation-menu/index.ts +14 -0
  90. package/src/components/ui/separator/Separator.vue +31 -0
  91. package/src/components/ui/separator/index.ts +1 -0
  92. package/src/components/ui/sheet/Sheet.vue +14 -0
  93. package/src/components/ui/sheet/SheetClose.vue +11 -0
  94. package/src/components/ui/sheet/SheetContent.vue +53 -0
  95. package/src/components/ui/sheet/SheetDescription.vue +19 -0
  96. package/src/components/ui/sheet/SheetFooter.vue +12 -0
  97. package/src/components/ui/sheet/SheetHeader.vue +12 -0
  98. package/src/components/ui/sheet/SheetTitle.vue +19 -0
  99. package/src/components/ui/sheet/SheetTrigger.vue +11 -0
  100. package/src/components/ui/sheet/index.ts +29 -0
  101. package/src/components/ui/sidebar/Sidebar.vue +99 -0
  102. package/src/components/ui/sidebar/SidebarContent.vue +17 -0
  103. package/src/components/ui/sidebar/SidebarFooter.vue +14 -0
  104. package/src/components/ui/sidebar/SidebarGroup.vue +14 -0
  105. package/src/components/ui/sidebar/SidebarGroupAction.vue +31 -0
  106. package/src/components/ui/sidebar/SidebarGroupContent.vue +14 -0
  107. package/src/components/ui/sidebar/SidebarGroupLabel.vue +29 -0
  108. package/src/components/ui/sidebar/SidebarHeader.vue +14 -0
  109. package/src/components/ui/sidebar/SidebarInput.vue +15 -0
  110. package/src/components/ui/sidebar/SidebarInset.vue +22 -0
  111. package/src/components/ui/sidebar/SidebarMenu.vue +14 -0
  112. package/src/components/ui/sidebar/SidebarMenuAction.vue +41 -0
  113. package/src/components/ui/sidebar/SidebarMenuBadge.vue +27 -0
  114. package/src/components/ui/sidebar/SidebarMenuButton.vue +52 -0
  115. package/src/components/ui/sidebar/SidebarMenuButtonChild.vue +33 -0
  116. package/src/components/ui/sidebar/SidebarMenuItem.vue +14 -0
  117. package/src/components/ui/sidebar/SidebarMenuSkeleton.vue +22 -0
  118. package/src/components/ui/sidebar/SidebarMenuSub.vue +23 -0
  119. package/src/components/ui/sidebar/SidebarMenuSubButton.vue +42 -0
  120. package/src/components/ui/sidebar/SidebarMenuSubItem.vue +7 -0
  121. package/src/components/ui/sidebar/SidebarProvider.vue +89 -0
  122. package/src/components/ui/sidebar/SidebarRail.vue +34 -0
  123. package/src/components/ui/sidebar/SidebarSeparator.vue +15 -0
  124. package/src/components/ui/sidebar/SidebarTrigger.vue +20 -0
  125. package/src/components/ui/sidebar/index.ts +51 -0
  126. package/src/components/ui/sidebar/utils.ts +19 -0
  127. package/src/components/ui/skeleton/Skeleton.vue +14 -0
  128. package/src/components/ui/skeleton/index.ts +1 -0
  129. package/src/components/ui/tooltip/Tooltip.vue +14 -0
  130. package/src/components/ui/tooltip/TooltipContent.vue +39 -0
  131. package/src/components/ui/tooltip/TooltipProvider.vue +11 -0
  132. package/src/components/ui/tooltip/TooltipTrigger.vue +11 -0
  133. package/src/components/ui/tooltip/index.ts +4 -0
  134. package/src/composables/useAppearance.ts +53 -0
  135. package/src/composables/useInitials.ts +14 -0
  136. package/src/index.ts +22 -0
  137. package/src/layouts/AdminLayout.vue +170 -0
  138. package/src/layouts/AuthLayout.vue +14 -0
  139. package/src/layouts/PublicLayout.vue +53 -0
  140. package/src/layouts/auth/AuthCardLayout.vue +36 -0
  141. package/src/layouts/auth/AuthSimpleLayout.vue +31 -0
  142. package/src/layouts/auth/AuthSplitLayout.vue +40 -0
  143. package/src/layouts/settings/Layout.vue +56 -0
  144. package/src/lib/utils.ts +6 -0
  145. package/src/pages/Admin/Appearance/Theme.vue +58 -0
  146. package/src/pages/Admin/Appearance/Widgets.vue +48 -0
  147. package/src/pages/Admin/Commerce/Orders/Index.vue +80 -0
  148. package/src/pages/Admin/Commerce/Orders/Show.vue +200 -0
  149. package/src/pages/Admin/Commerce/Products/Edit.vue +167 -0
  150. package/src/pages/Admin/Commerce/Products/Index.vue +65 -0
  151. package/src/pages/Admin/Content/Edit.vue +170 -0
  152. package/src/pages/Admin/Content/Index.vue +88 -0
  153. package/src/pages/Admin/Content/Preview.vue +25 -0
  154. package/src/pages/Admin/Dashboard.vue +26 -0
  155. package/src/pages/Admin/Forms/Edit.vue +98 -0
  156. package/src/pages/Admin/Forms/Index.vue +68 -0
  157. package/src/pages/Admin/Forms/Submissions/Index.vue +68 -0
  158. package/src/pages/Admin/Forms/Submissions/Show.vue +47 -0
  159. package/src/pages/Admin/Media/Index.vue +75 -0
  160. package/src/pages/Admin/Menus/Create.vue +37 -0
  161. package/src/pages/Admin/Menus/Edit.vue +54 -0
  162. package/src/pages/Admin/Menus/Index.vue +52 -0
  163. package/src/pages/Admin/Settings/Index.vue +184 -0
  164. package/src/pages/Admin/Taxonomy/Edit.vue +83 -0
  165. package/src/pages/Admin/Taxonomy/Index.vue +68 -0
  166. package/src/pages/Admin/Users/Edit.vue +82 -0
  167. package/src/pages/Admin/Users/Index.vue +74 -0
  168. package/src/pages/Public/Cart/Index.vue +108 -0
  169. package/src/pages/Public/Checkout/Confirmation.vue +110 -0
  170. package/src/pages/Public/Checkout/Index.vue +174 -0
  171. package/src/pages/Public/Index.vue +54 -0
  172. package/src/pages/Public/Shop/Index.vue +39 -0
  173. package/src/pages/Public/Shop/Show.vue +46 -0
  174. package/src/pages/Public/Show.vue +41 -0
  175. package/src/pages/Setup/Complete.vue +53 -0
  176. package/src/pages/Setup/Index.vue +85 -0
  177. package/src/pages/Welcome.vue +787 -0
  178. package/src/pages/auth/ConfirmPassword.vue +53 -0
  179. package/src/pages/auth/ForgotPassword.vue +54 -0
  180. package/src/pages/auth/Login.vue +91 -0
  181. package/src/pages/auth/Register.vue +83 -0
  182. package/src/pages/auth/ResetPassword.vue +81 -0
  183. package/src/pages/auth/VerifyEmail.vue +36 -0
  184. package/src/pages/settings/Appearance.vue +23 -0
  185. package/src/pages/settings/Password.vue +120 -0
  186. package/src/pages/settings/Profile.vue +105 -0
  187. package/src/pages.ts +9 -0
  188. package/src/types/index.ts +42 -0
  189. package/src/types/ziggy.ts +12 -0
@@ -0,0 +1,43 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { Circle } from 'lucide-vue-next';
4
+ import {
5
+ DropdownMenuItemIndicator,
6
+ DropdownMenuRadioItem,
7
+ useForwardPropsEmits,
8
+ type DropdownMenuRadioItemEmits,
9
+ type DropdownMenuRadioItemProps,
10
+ } from 'radix-vue';
11
+ import { computed, type HTMLAttributes } from 'vue';
12
+
13
+ const props = defineProps<DropdownMenuRadioItemProps & { class?: HTMLAttributes['class'] }>();
14
+
15
+ const emits = defineEmits<DropdownMenuRadioItemEmits>();
16
+
17
+ const delegatedProps = computed(() => {
18
+ const { class: _, ...delegated } = props;
19
+
20
+ return delegated;
21
+ });
22
+
23
+ const forwarded = useForwardPropsEmits(delegatedProps, emits);
24
+ </script>
25
+
26
+ <template>
27
+ <DropdownMenuRadioItem
28
+ v-bind="forwarded"
29
+ :class="
30
+ cn(
31
+ 'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
32
+ props.class,
33
+ )
34
+ "
35
+ >
36
+ <span class="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
37
+ <DropdownMenuItemIndicator>
38
+ <Circle class="h-2 w-2 fill-current" />
39
+ </DropdownMenuItemIndicator>
40
+ </span>
41
+ <slot />
42
+ </DropdownMenuRadioItem>
43
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { DropdownMenuSeparator, type DropdownMenuSeparatorProps } from 'radix-vue';
4
+ import { computed, type HTMLAttributes } from 'vue';
5
+
6
+ const props = defineProps<
7
+ DropdownMenuSeparatorProps & {
8
+ class?: HTMLAttributes['class'];
9
+ }
10
+ >();
11
+
12
+ const delegatedProps = computed(() => {
13
+ const { class: _, ...delegated } = props;
14
+
15
+ return delegated;
16
+ });
17
+ </script>
18
+
19
+ <template>
20
+ <DropdownMenuSeparator v-bind="delegatedProps" :class="cn('-mx-1 my-1 h-px bg-accent', props.class)" />
21
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import type { HTMLAttributes } from 'vue';
4
+
5
+ const props = defineProps<{
6
+ class?: HTMLAttributes['class'];
7
+ }>();
8
+ </script>
9
+
10
+ <template>
11
+ <span :class="cn('ml-auto text-xs tracking-widest opacity-60', props.class)">
12
+ <slot />
13
+ </span>
14
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import { DropdownMenuSub, useForwardPropsEmits, type DropdownMenuSubEmits, type DropdownMenuSubProps } from 'radix-vue';
3
+
4
+ const props = defineProps<DropdownMenuSubProps>();
5
+ const emits = defineEmits<DropdownMenuSubEmits>();
6
+
7
+ const forwarded = useForwardPropsEmits(props, emits);
8
+ </script>
9
+
10
+ <template>
11
+ <DropdownMenuSub v-bind="forwarded">
12
+ <slot />
13
+ </DropdownMenuSub>
14
+ </template>
@@ -0,0 +1,30 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { DropdownMenuSubContent, useForwardPropsEmits, type DropdownMenuSubContentEmits, type DropdownMenuSubContentProps } from 'radix-vue';
4
+ import { computed, type HTMLAttributes } from 'vue';
5
+
6
+ const props = defineProps<DropdownMenuSubContentProps & { class?: HTMLAttributes['class'] }>();
7
+ const emits = defineEmits<DropdownMenuSubContentEmits>();
8
+
9
+ const delegatedProps = computed(() => {
10
+ const { class: _, ...delegated } = props;
11
+
12
+ return delegated;
13
+ });
14
+
15
+ const forwarded = useForwardPropsEmits(delegatedProps, emits);
16
+ </script>
17
+
18
+ <template>
19
+ <DropdownMenuSubContent
20
+ v-bind="forwarded"
21
+ :class="
22
+ cn(
23
+ 'z-50 min-w-32 overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
24
+ props.class,
25
+ )
26
+ "
27
+ >
28
+ <slot />
29
+ </DropdownMenuSubContent>
30
+ </template>
@@ -0,0 +1,31 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { ChevronRight } from 'lucide-vue-next';
4
+ import { DropdownMenuSubTrigger, useForwardProps, type DropdownMenuSubTriggerProps } from 'radix-vue';
5
+ import { computed, type HTMLAttributes } from 'vue';
6
+
7
+ const props = defineProps<DropdownMenuSubTriggerProps & { class?: HTMLAttributes['class'] }>();
8
+
9
+ const delegatedProps = computed(() => {
10
+ const { class: _, ...delegated } = props;
11
+
12
+ return delegated;
13
+ });
14
+
15
+ const forwardedProps = useForwardProps(delegatedProps);
16
+ </script>
17
+
18
+ <template>
19
+ <DropdownMenuSubTrigger
20
+ v-bind="forwardedProps"
21
+ :class="
22
+ cn(
23
+ 'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent',
24
+ props.class,
25
+ )
26
+ "
27
+ >
28
+ <slot />
29
+ <ChevronRight class="ml-auto h-4 w-4" />
30
+ </DropdownMenuSubTrigger>
31
+ </template>
@@ -0,0 +1,13 @@
1
+ <script setup lang="ts">
2
+ import { DropdownMenuTrigger, useForwardProps, type DropdownMenuTriggerProps } from 'radix-vue';
3
+
4
+ const props = defineProps<DropdownMenuTriggerProps>();
5
+
6
+ const forwardedProps = useForwardProps(props);
7
+ </script>
8
+
9
+ <template>
10
+ <DropdownMenuTrigger class="outline-none" v-bind="forwardedProps">
11
+ <slot />
12
+ </DropdownMenuTrigger>
13
+ </template>
@@ -0,0 +1,16 @@
1
+ export { default as DropdownMenu } from './DropdownMenu.vue';
2
+
3
+ export { DropdownMenuPortal } from 'radix-vue';
4
+ export { default as DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem.vue';
5
+ export { default as DropdownMenuContent } from './DropdownMenuContent.vue';
6
+ export { default as DropdownMenuGroup } from './DropdownMenuGroup.vue';
7
+ export { default as DropdownMenuItem } from './DropdownMenuItem.vue';
8
+ export { default as DropdownMenuLabel } from './DropdownMenuLabel.vue';
9
+ export { default as DropdownMenuRadioGroup } from './DropdownMenuRadioGroup.vue';
10
+ export { default as DropdownMenuRadioItem } from './DropdownMenuRadioItem.vue';
11
+ export { default as DropdownMenuSeparator } from './DropdownMenuSeparator.vue';
12
+ export { default as DropdownMenuShortcut } from './DropdownMenuShortcut.vue';
13
+ export { default as DropdownMenuSub } from './DropdownMenuSub.vue';
14
+ export { default as DropdownMenuSubContent } from './DropdownMenuSubContent.vue';
15
+ export { default as DropdownMenuSubTrigger } from './DropdownMenuSubTrigger.vue';
16
+ export { default as DropdownMenuTrigger } from './DropdownMenuTrigger.vue';
@@ -0,0 +1,32 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { useVModel } from '@vueuse/core';
4
+ import type { HTMLAttributes } from 'vue';
5
+
6
+ const props = defineProps<{
7
+ defaultValue?: string | number;
8
+ modelValue?: string | number;
9
+ class?: HTMLAttributes['class'];
10
+ }>();
11
+
12
+ const emits = defineEmits<{
13
+ (e: 'update:modelValue', payload: string | number): void;
14
+ }>();
15
+
16
+ const modelValue = useVModel(props, 'modelValue', emits, {
17
+ passive: true,
18
+ defaultValue: props.defaultValue,
19
+ });
20
+ </script>
21
+
22
+ <template>
23
+ <input
24
+ v-model="modelValue"
25
+ :class="
26
+ cn(
27
+ 'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm',
28
+ props.class,
29
+ )
30
+ "
31
+ />
32
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Input } from './Input.vue';
@@ -0,0 +1,22 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { Label, type LabelProps } from 'radix-vue';
4
+ import { computed, type HTMLAttributes } from 'vue';
5
+
6
+ const props = defineProps<LabelProps & { class?: HTMLAttributes['class'] }>();
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props;
10
+
11
+ return delegated;
12
+ });
13
+ </script>
14
+
15
+ <template>
16
+ <Label
17
+ v-bind="delegatedProps"
18
+ :class="cn('text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70', props.class)"
19
+ >
20
+ <slot />
21
+ </Label>
22
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Label } from './Label.vue';
@@ -0,0 +1,25 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { NavigationMenuRoot, type NavigationMenuRootEmits, type NavigationMenuRootProps, useForwardPropsEmits } from 'radix-vue';
4
+ import { computed, type HTMLAttributes } from 'vue';
5
+ import NavigationMenuViewport from './NavigationMenuViewport.vue';
6
+
7
+ const props = defineProps<NavigationMenuRootProps & { class?: HTMLAttributes['class'] }>();
8
+
9
+ const emits = defineEmits<NavigationMenuRootEmits>();
10
+
11
+ const delegatedProps = computed(() => {
12
+ const { class: _, ...delegated } = props;
13
+
14
+ return delegated;
15
+ });
16
+
17
+ const forwarded = useForwardPropsEmits(delegatedProps, emits);
18
+ </script>
19
+
20
+ <template>
21
+ <NavigationMenuRoot v-bind="forwarded" :class="cn('relative z-10 flex max-w-max flex-1 items-center justify-center', props.class)">
22
+ <slot />
23
+ <NavigationMenuViewport />
24
+ </NavigationMenuRoot>
25
+ </template>
@@ -0,0 +1,31 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { NavigationMenuContent, type NavigationMenuContentEmits, type NavigationMenuContentProps, useForwardPropsEmits } from 'radix-vue';
4
+ import { computed, type HTMLAttributes } from 'vue';
5
+
6
+ const props = defineProps<NavigationMenuContentProps & { class?: HTMLAttributes['class'] }>();
7
+
8
+ const emits = defineEmits<NavigationMenuContentEmits>();
9
+
10
+ const delegatedProps = computed(() => {
11
+ const { class: _, ...delegated } = props;
12
+
13
+ return delegated;
14
+ });
15
+
16
+ const forwarded = useForwardPropsEmits(delegatedProps, emits);
17
+ </script>
18
+
19
+ <template>
20
+ <NavigationMenuContent
21
+ v-bind="forwarded"
22
+ :class="
23
+ cn(
24
+ 'left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 md:absolute md:w-auto',
25
+ props.class,
26
+ )
27
+ "
28
+ >
29
+ <slot />
30
+ </NavigationMenuContent>
31
+ </template>
@@ -0,0 +1,29 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { NavigationMenuIndicator, type NavigationMenuIndicatorProps, useForwardProps } from 'radix-vue';
4
+ import { computed, type HTMLAttributes } from 'vue';
5
+
6
+ const props = defineProps<NavigationMenuIndicatorProps & { class?: HTMLAttributes['class'] }>();
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props;
10
+
11
+ return delegated;
12
+ });
13
+
14
+ const forwardedProps = useForwardProps(delegatedProps);
15
+ </script>
16
+
17
+ <template>
18
+ <NavigationMenuIndicator
19
+ v-bind="forwardedProps"
20
+ :class="
21
+ cn(
22
+ 'top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in',
23
+ props.class,
24
+ )
25
+ "
26
+ >
27
+ <div class="relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md" />
28
+ </NavigationMenuIndicator>
29
+ </template>
@@ -0,0 +1,11 @@
1
+ <script setup lang="ts">
2
+ import { NavigationMenuItem, type NavigationMenuItemProps } from 'radix-vue';
3
+
4
+ const props = defineProps<NavigationMenuItemProps>();
5
+ </script>
6
+
7
+ <template>
8
+ <NavigationMenuItem v-bind="props">
9
+ <slot />
10
+ </NavigationMenuItem>
11
+ </template>
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import { NavigationMenuLink, type NavigationMenuLinkEmits, type NavigationMenuLinkProps, useForwardPropsEmits } from 'radix-vue';
3
+
4
+ const props = defineProps<NavigationMenuLinkProps>();
5
+ const emits = defineEmits<NavigationMenuLinkEmits>();
6
+
7
+ const forwarded = useForwardPropsEmits(props, emits);
8
+ </script>
9
+
10
+ <template>
11
+ <NavigationMenuLink v-bind="forwarded">
12
+ <slot />
13
+ </NavigationMenuLink>
14
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { NavigationMenuList, type NavigationMenuListProps, useForwardProps } from 'radix-vue';
4
+ import { computed, type HTMLAttributes } from 'vue';
5
+
6
+ const props = defineProps<NavigationMenuListProps & { class?: HTMLAttributes['class'] }>();
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props;
10
+
11
+ return delegated;
12
+ });
13
+
14
+ const forwardedProps = useForwardProps(delegatedProps);
15
+ </script>
16
+
17
+ <template>
18
+ <NavigationMenuList v-bind="forwardedProps" :class="cn('group flex flex-1 list-none items-center justify-center gap-x-1', props.class)">
19
+ <slot />
20
+ </NavigationMenuList>
21
+ </template>
@@ -0,0 +1,24 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { ChevronDown } from 'lucide-vue-next';
4
+ import { NavigationMenuTrigger, type NavigationMenuTriggerProps, useForwardProps } from 'radix-vue';
5
+ import { computed, type HTMLAttributes } from 'vue';
6
+ import { navigationMenuTriggerStyle } from '.';
7
+
8
+ const props = defineProps<NavigationMenuTriggerProps & { class?: HTMLAttributes['class'] }>();
9
+
10
+ const delegatedProps = computed(() => {
11
+ const { class: _, ...delegated } = props;
12
+
13
+ return delegated;
14
+ });
15
+
16
+ const forwardedProps = useForwardProps(delegatedProps);
17
+ </script>
18
+
19
+ <template>
20
+ <NavigationMenuTrigger v-bind="forwardedProps" :class="cn(navigationMenuTriggerStyle(), 'group', props.class)">
21
+ <slot />
22
+ <ChevronDown class="relative top-px ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180" aria-hidden="true" />
23
+ </NavigationMenuTrigger>
24
+ </template>
@@ -0,0 +1,29 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { NavigationMenuViewport, type NavigationMenuViewportProps, useForwardProps } from 'radix-vue';
4
+ import { computed, type HTMLAttributes } from 'vue';
5
+
6
+ const props = defineProps<NavigationMenuViewportProps & { class?: HTMLAttributes['class'] }>();
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props;
10
+
11
+ return delegated;
12
+ });
13
+
14
+ const forwardedProps = useForwardProps(delegatedProps);
15
+ </script>
16
+
17
+ <template>
18
+ <div class="absolute left-0 top-full flex justify-center">
19
+ <NavigationMenuViewport
20
+ v-bind="forwardedProps"
21
+ :class="
22
+ cn(
23
+ 'origin-top-center relative mt-1.5 h-[--radix-navigation-menu-viewport-height] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[--radix-navigation-menu-viewport-width]',
24
+ props.class,
25
+ )
26
+ "
27
+ />
28
+ </div>
29
+ </template>
@@ -0,0 +1,14 @@
1
+ import { cva } from 'class-variance-authority';
2
+
3
+ export { default as NavigationMenu } from './NavigationMenu.vue';
4
+ export { default as NavigationMenuContent } from './NavigationMenuContent.vue';
5
+ export { default as NavigationMenuIndicator } from './NavigationMenuIndicator.vue';
6
+ export { default as NavigationMenuItem } from './NavigationMenuItem.vue';
7
+ export { default as NavigationMenuLink } from './NavigationMenuLink.vue';
8
+ export { default as NavigationMenuList } from './NavigationMenuList.vue';
9
+ export { default as NavigationMenuTrigger } from './NavigationMenuTrigger.vue';
10
+ export { default as NavigationMenuViewport } from './NavigationMenuViewport.vue';
11
+
12
+ export const navigationMenuTriggerStyle = cva(
13
+ 'group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-accent/50 data-[state=open]:bg-accent/50',
14
+ );
@@ -0,0 +1,31 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { Separator, type SeparatorProps } from 'radix-vue';
4
+ import { computed, type HTMLAttributes } from 'vue';
5
+
6
+ const props = defineProps<SeparatorProps & { class?: HTMLAttributes['class']; label?: string }>();
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props;
10
+
11
+ return delegated;
12
+ });
13
+ </script>
14
+
15
+ <template>
16
+ <Separator
17
+ v-bind="delegatedProps"
18
+ :class="cn('relative shrink-0 bg-border', props.orientation === 'vertical' ? 'h-full w-px' : 'h-px w-full', props.class)"
19
+ >
20
+ <span
21
+ v-if="props.label"
22
+ :class="
23
+ cn(
24
+ 'absolute left-1/2 top-1/2 flex -translate-x-1/2 -translate-y-1/2 items-center justify-center bg-background text-xs text-muted-foreground',
25
+ props.orientation === 'vertical' ? 'w-[1px] px-1 py-2' : 'h-[1px] px-2 py-1',
26
+ )
27
+ "
28
+ >{{ props.label }}</span
29
+ >
30
+ </Separator>
31
+ </template>
@@ -0,0 +1 @@
1
+ export { default as Separator } from './Separator.vue';
@@ -0,0 +1,14 @@
1
+ <script setup lang="ts">
2
+ import { DialogRoot, useForwardPropsEmits, type DialogRootEmits, type DialogRootProps } from 'radix-vue';
3
+
4
+ const props = defineProps<DialogRootProps>();
5
+ const emits = defineEmits<DialogRootEmits>();
6
+
7
+ const forwarded = useForwardPropsEmits(props, emits);
8
+ </script>
9
+
10
+ <template>
11
+ <DialogRoot v-bind="forwarded">
12
+ <slot />
13
+ </DialogRoot>
14
+ </template>
@@ -0,0 +1,11 @@
1
+ <script setup lang="ts">
2
+ import { DialogClose, type DialogCloseProps } from 'radix-vue';
3
+
4
+ const props = defineProps<DialogCloseProps>();
5
+ </script>
6
+
7
+ <template>
8
+ <DialogClose v-bind="props">
9
+ <slot />
10
+ </DialogClose>
11
+ </template>
@@ -0,0 +1,53 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { X } from 'lucide-vue-next';
4
+ import {
5
+ DialogClose,
6
+ DialogContent,
7
+ DialogOverlay,
8
+ DialogPortal,
9
+ useForwardPropsEmits,
10
+ type DialogContentEmits,
11
+ type DialogContentProps,
12
+ } from 'radix-vue';
13
+ import { computed, type HTMLAttributes } from 'vue';
14
+ import { sheetVariants, type SheetVariants } from '.';
15
+
16
+ interface SheetContentProps extends DialogContentProps {
17
+ class?: HTMLAttributes['class'];
18
+ side?: SheetVariants['side'];
19
+ }
20
+
21
+ defineOptions({
22
+ inheritAttrs: false,
23
+ });
24
+
25
+ const props = defineProps<SheetContentProps>();
26
+
27
+ const emits = defineEmits<DialogContentEmits>();
28
+
29
+ const delegatedProps = computed(() => {
30
+ const { class: _, side, ...delegated } = props;
31
+
32
+ return delegated;
33
+ });
34
+
35
+ const forwarded = useForwardPropsEmits(delegatedProps, emits);
36
+ </script>
37
+
38
+ <template>
39
+ <DialogPortal>
40
+ <DialogOverlay
41
+ class="fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0"
42
+ />
43
+ <DialogContent :class="cn(sheetVariants({ side }), props.class)" v-bind="{ ...forwarded, ...$attrs }">
44
+ <slot />
45
+
46
+ <DialogClose
47
+ class="absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary"
48
+ >
49
+ <X class="h-4 w-4 text-muted-foreground" />
50
+ </DialogClose>
51
+ </DialogContent>
52
+ </DialogPortal>
53
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { DialogDescription, type DialogDescriptionProps } from 'radix-vue';
4
+ import { computed, type HTMLAttributes } from 'vue';
5
+
6
+ const props = defineProps<DialogDescriptionProps & { class?: HTMLAttributes['class'] }>();
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props;
10
+
11
+ return delegated;
12
+ });
13
+ </script>
14
+
15
+ <template>
16
+ <DialogDescription :class="cn('text-sm text-muted-foreground', props.class)" v-bind="delegatedProps">
17
+ <slot />
18
+ </DialogDescription>
19
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import type { HTMLAttributes } from 'vue';
4
+
5
+ const props = defineProps<{ class?: HTMLAttributes['class'] }>();
6
+ </script>
7
+
8
+ <template>
9
+ <div :class="cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-x-2', props.class)">
10
+ <slot />
11
+ </div>
12
+ </template>
@@ -0,0 +1,12 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import type { HTMLAttributes } from 'vue';
4
+
5
+ const props = defineProps<{ class?: HTMLAttributes['class'] }>();
6
+ </script>
7
+
8
+ <template>
9
+ <div :class="cn('flex flex-col gap-y-2 text-center sm:text-left', props.class)">
10
+ <slot />
11
+ </div>
12
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import { cn } from '@/lib/utils';
3
+ import { DialogTitle, type DialogTitleProps } from 'radix-vue';
4
+ import { computed, type HTMLAttributes } from 'vue';
5
+
6
+ const props = defineProps<DialogTitleProps & { class?: HTMLAttributes['class'] }>();
7
+
8
+ const delegatedProps = computed(() => {
9
+ const { class: _, ...delegated } = props;
10
+
11
+ return delegated;
12
+ });
13
+ </script>
14
+
15
+ <template>
16
+ <DialogTitle :class="cn('text-lg font-semibold text-foreground', props.class)" v-bind="delegatedProps">
17
+ <slot />
18
+ </DialogTitle>
19
+ </template>