@maizzle/framework 6.0.0-rc.6 → 6.0.0-rc.7

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 (63) hide show
  1. package/dist/components/CodeBlock.vue +12 -19
  2. package/dist/components/Markdown.vue +70 -0
  3. package/dist/plugins/postcss/tailwindCleanup.mjs +22 -13
  4. package/dist/plugins/postcss/tailwindCleanup.mjs.map +1 -1
  5. package/dist/render/createRenderer.d.mts +2 -3
  6. package/dist/render/createRenderer.d.mts.map +1 -1
  7. package/dist/render/createRenderer.mjs +55 -4
  8. package/dist/render/createRenderer.mjs.map +1 -1
  9. package/dist/serve.d.mts.map +1 -1
  10. package/dist/serve.mjs +83 -3
  11. package/dist/serve.mjs.map +1 -1
  12. package/dist/server/compatibility.d.mts +1 -2
  13. package/dist/server/compatibility.d.mts.map +1 -1
  14. package/dist/server/compatibility.mjs +15 -15
  15. package/dist/server/compatibility.mjs.map +1 -1
  16. package/dist/server/email.d.mts +17 -0
  17. package/dist/server/email.d.mts.map +1 -0
  18. package/dist/server/email.mjs +40 -0
  19. package/dist/server/email.mjs.map +1 -0
  20. package/dist/server/ui/App.vue +204 -68
  21. package/dist/server/ui/components/ui/checkbox/Checkbox.vue +35 -0
  22. package/dist/server/ui/components/ui/checkbox/index.ts +1 -0
  23. package/dist/server/ui/components/ui/command/CommandDialog.vue +1 -1
  24. package/dist/server/ui/components/ui/command/CommandInput.vue +19 -1
  25. package/dist/server/ui/components/ui/command/CommandItem.vue +1 -1
  26. package/dist/server/ui/components/ui/command/CommandList.vue +1 -1
  27. package/dist/server/ui/components/ui/command/CommandShortcut.vue +1 -1
  28. package/dist/server/ui/components/ui/dialog/DialogOverlay.vue +9 -1
  29. package/dist/server/ui/components/ui/dropdown-menu/DropdownMenuItem.vue +1 -1
  30. package/dist/server/ui/components/ui/scroll-area/ScrollBar.vue +1 -1
  31. package/dist/server/ui/components/ui/sheet/SheetContent.vue +1 -1
  32. package/dist/server/ui/components/ui/sheet/SheetOverlay.vue +9 -1
  33. package/dist/server/ui/components/ui/sidebar/Sidebar.vue +8 -1
  34. package/dist/server/ui/components/ui/sidebar/SidebarProvider.vue +1 -1
  35. package/dist/server/ui/components/ui/sidebar/SidebarTrigger.vue +5 -4
  36. package/dist/server/ui/components/ui/tags-input/TagsInput.vue +26 -0
  37. package/dist/server/ui/components/ui/tags-input/TagsInputInput.vue +17 -0
  38. package/dist/server/ui/components/ui/tags-input/TagsInputItem.vue +19 -0
  39. package/dist/server/ui/components/ui/tags-input/TagsInputItemDelete.vue +22 -0
  40. package/dist/server/ui/components/ui/tags-input/TagsInputItemText.vue +17 -0
  41. package/dist/server/ui/components/ui/tags-input/index.ts +5 -0
  42. package/dist/server/ui/components/ui/toggle/index.ts +3 -3
  43. package/dist/server/ui/components/ui/toggle-group/ToggleGroup.vue +1 -1
  44. package/dist/server/ui/components/ui/toggle-group/ToggleGroupItem.vue +2 -2
  45. package/dist/server/ui/main.css +20 -20
  46. package/dist/server/ui/pages/Home.vue +12 -5
  47. package/dist/server/ui/pages/Preview.vue +369 -150
  48. package/dist/transformers/inlineCSS.mjs +9 -0
  49. package/dist/transformers/inlineCSS.mjs.map +1 -1
  50. package/dist/transformers/purgeCSS.d.mts.map +1 -1
  51. package/dist/transformers/purgeCSS.mjs +67 -1
  52. package/dist/transformers/purgeCSS.mjs.map +1 -1
  53. package/dist/transformers/tailwindcss.mjs +3 -7
  54. package/dist/transformers/tailwindcss.mjs.map +1 -1
  55. package/dist/types/config.d.mts +38 -4
  56. package/dist/types/config.d.mts.map +1 -1
  57. package/dist/types/index.d.mts +2 -2
  58. package/package.json +7 -3
  59. package/dist/server/ui/components/ui/resizable/ResizableHandle.vue +0 -30
  60. package/dist/server/ui/components/ui/resizable/ResizablePanel.vue +0 -21
  61. package/dist/server/ui/components/ui/resizable/ResizablePanelGroup.vue +0 -25
  62. package/dist/server/ui/components/ui/resizable/index.ts +0 -3
  63. /package/dist/components/{Preview.vue → Preheader.vue} +0 -0
@@ -73,7 +73,7 @@ provideSidebarContext({
73
73
  '--sidebar-width': SIDEBAR_WIDTH,
74
74
  '--sidebar-width-icon': SIDEBAR_WIDTH_ICON,
75
75
  }"
76
- :class="cn('group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex min-h-svh w-full', props.class)"
76
+ :class="cn('group/sidebar-wrapper has-data-[variant=inset]:bg-sidebar flex h-svh w-full', props.class)"
77
77
  v-bind="$attrs"
78
78
  >
79
79
  <slot />
@@ -9,7 +9,7 @@ const props = defineProps<{
9
9
  class?: HTMLAttributes["class"]
10
10
  }>()
11
11
 
12
- const { open, toggleSidebar } = useSidebar()
12
+ const { isMobile, open, toggleSidebar } = useSidebar()
13
13
  </script>
14
14
 
15
15
  <template>
@@ -18,11 +18,12 @@ const { open, toggleSidebar } = useSidebar()
18
18
  data-slot="sidebar-trigger"
19
19
  variant="ghost"
20
20
  size="icon"
21
- :class="cn('h-7 w-7', props.class)"
21
+ :class="cn('h-7 w-7 hover:bg-transparent', props.class)"
22
22
  @click="toggleSidebar"
23
23
  >
24
- <PanelRightOpen v-if="open" />
25
- <PanelRightClose v-else />
24
+ <svg v-if="isMobile" class="size-4 dark:text-gray-400" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round"><line x1="3" y1="7" x2="21" y2="7" /><line x1="3" y1="12" x2="15" y2="12" /><line x1="3" y1="17" x2="18" y2="17" /></svg>
25
+ <PanelRightOpen v-else-if="open" class="dark:text-gray-400" :stroke-width="1" />
26
+ <PanelRightClose v-else class="dark:text-gray-400" :stroke-width="1" />
26
27
  <span class="sr-only">Toggle Sidebar</span>
27
28
  </Button>
28
29
  </template>
@@ -0,0 +1,26 @@
1
+ <script setup lang="ts">
2
+ import type { TagsInputRootEmits, TagsInputRootProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { TagsInputRoot, useForwardPropsEmits } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+
8
+ const props = defineProps<TagsInputRootProps & { class?: HTMLAttributes["class"] }>()
9
+ const emits = defineEmits<TagsInputRootEmits>()
10
+
11
+ const delegatedProps = reactiveOmit(props, "class")
12
+
13
+ const forwarded = useForwardPropsEmits(delegatedProps, emits)
14
+ </script>
15
+
16
+ <template>
17
+ <TagsInputRoot
18
+ v-slot="slotProps" v-bind="forwarded" :class="cn(
19
+ 'flex flex-wrap gap-2 items-center rounded-md border border-input bg-background px-2 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none',
20
+ 'focus-within:border-ring focus-within:ring-ring/50 focus-within:ring-[3px]',
21
+ 'aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive',
22
+ props.class)"
23
+ >
24
+ <slot v-bind="slotProps" />
25
+ </TagsInputRoot>
26
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { TagsInputInputProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { TagsInputInput, useForwardProps } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+
8
+ const props = defineProps<TagsInputInputProps & { class?: HTMLAttributes["class"] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, "class")
11
+
12
+ const forwardedProps = useForwardProps(delegatedProps)
13
+ </script>
14
+
15
+ <template>
16
+ <TagsInputInput v-bind="forwardedProps" :class="cn('text-sm min-h-5 focus:outline-none flex-1 bg-transparent px-1', props.class)" />
17
+ </template>
@@ -0,0 +1,19 @@
1
+ <script setup lang="ts">
2
+ import type { TagsInputItemProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { TagsInputItem, useForwardProps } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+
8
+ const props = defineProps<TagsInputItemProps & { class?: HTMLAttributes["class"] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, "class")
11
+
12
+ const forwardedProps = useForwardProps(delegatedProps)
13
+ </script>
14
+
15
+ <template>
16
+ <TagsInputItem v-bind="forwardedProps" :class="cn('flex h-5 items-center rounded-md bg-secondary data-[state=active]:ring-ring data-[state=active]:ring-2 data-[state=active]:ring-offset-2 ring-offset-background', props.class)">
17
+ <slot />
18
+ </TagsInputItem>
19
+ </template>
@@ -0,0 +1,22 @@
1
+ <script setup lang="ts">
2
+ import type { TagsInputItemDeleteProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { TagsInputItemDelete, useForwardProps } from "reka-ui"
6
+ import { X } from "lucide-vue-next"
7
+ import { cn } from "@/lib/utils"
8
+
9
+ const props = defineProps<TagsInputItemDeleteProps & { class?: HTMLAttributes["class"] }>()
10
+
11
+ const delegatedProps = reactiveOmit(props, "class")
12
+
13
+ const forwardedProps = useForwardProps(delegatedProps)
14
+ </script>
15
+
16
+ <template>
17
+ <TagsInputItemDelete v-bind="forwardedProps" :class="cn('flex rounded bg-transparent mr-1', props.class)">
18
+ <slot>
19
+ <X class="size-3" />
20
+ </slot>
21
+ </TagsInputItemDelete>
22
+ </template>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ import type { TagsInputItemTextProps } from "reka-ui"
3
+ import type { HTMLAttributes } from "vue"
4
+ import { reactiveOmit } from "@vueuse/core"
5
+ import { TagsInputItemText, useForwardProps } from "reka-ui"
6
+ import { cn } from "@/lib/utils"
7
+
8
+ const props = defineProps<TagsInputItemTextProps & { class?: HTMLAttributes["class"] }>()
9
+
10
+ const delegatedProps = reactiveOmit(props, "class")
11
+
12
+ const forwardedProps = useForwardProps(delegatedProps)
13
+ </script>
14
+
15
+ <template>
16
+ <TagsInputItemText v-bind="forwardedProps" :class="cn('py-0.5 px-2 text-sm rounded bg-transparent', props.class)" />
17
+ </template>
@@ -0,0 +1,5 @@
1
+ export { default as TagsInput } from "./TagsInput.vue"
2
+ export { default as TagsInputInput } from "./TagsInputInput.vue"
3
+ export { default as TagsInputItem } from "./TagsInputItem.vue"
4
+ export { default as TagsInputItemDelete } from "./TagsInputItemDelete.vue"
5
+ export { default as TagsInputItemText } from "./TagsInputItemText.vue"
@@ -4,17 +4,17 @@ import { cva } from "class-variance-authority"
4
4
  export { default as Toggle } from "./Toggle.vue"
5
5
 
6
6
  export const toggleVariants = cva(
7
- "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap",
7
+ "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-white data-[state=on]:text-foreground data-[state=on]:shadow-sm data-[state=on]:dark:bg-gray-700 data-[state=on]:dark:text-gray-100 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap",
8
8
  {
9
9
  variants: {
10
10
  variant: {
11
11
  default: "bg-transparent",
12
12
  outline:
13
- "border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground",
13
+ "bg-transparent",
14
14
  },
15
15
  size: {
16
16
  default: "h-9 px-2 min-w-9",
17
- sm: "h-8 px-1.5 min-w-8",
17
+ sm: "h-6 px-1.5 min-w-6",
18
18
  lg: "h-10 px-2.5 min-w-10",
19
19
  },
20
20
  },
@@ -42,7 +42,7 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits)
42
42
  '--gap': spacing,
43
43
  }"
44
44
  v-bind="forwarded"
45
- :class="cn('group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))] rounded-md data-[spacing=default]:data-[variant=outline]:shadow-xs', props.class)"
45
+ :class="cn('group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))] rounded-md bg-gray-50 p-1 dark:bg-gray-800/50 data-[spacing=default]:data-[variant=outline]:shadow-xs', props.class)"
46
46
  >
47
47
  <slot v-bind="slotProps" />
48
48
  </ToggleGroupRoot>
@@ -37,8 +37,8 @@ const forwardedProps = useForwardProps(delegatedProps)
37
37
  variant: context?.variant || variant,
38
38
  size: context?.size || size,
39
39
  }),
40
- 'w-auto min-w-0 shrink-0 px-3 focus:z-10 focus-visible:z-10',
41
- 'data-[spacing=0]:rounded-none data-[spacing=0]:shadow-none data-[spacing=0]:first:rounded-l-md data-[spacing=0]:last:rounded-r-md data-[spacing=0]:data-[variant=outline]:border-l-0 data-[spacing=0]:data-[variant=outline]:first:border-l',
40
+ 'w-auto min-w-0 shrink-0 px-1.5 focus:z-10 focus-visible:z-10',
41
+ 'data-[spacing=0]:rounded-md data-[spacing=0]:shadow-none',
42
42
  props.class)"
43
43
  >
44
44
  <slot v-bind="slotProps" />
@@ -27,7 +27,7 @@
27
27
  --sidebar-foreground: #030712;
28
28
  --sidebar-primary: #111827;
29
29
  --sidebar-primary-foreground: #f9fafb;
30
- --sidebar-accent: #f3f4f6;
30
+ --sidebar-accent: #f9fafb;
31
31
  --sidebar-accent-foreground: #111827;
32
32
  --sidebar-border: #e5e7eb;
33
33
  --sidebar-ring: #9ca3af;
@@ -37,31 +37,31 @@
37
37
  @media (prefers-color-scheme: dark) {
38
38
  :root {
39
39
  --background: #030712; /* gray-950 */
40
- --foreground: #f9fafb; /* gray-50 */
40
+ --foreground: #e5e7eb; /* gray-200 */
41
41
  --card: #030712;
42
- --card-foreground: #f9fafb;
42
+ --card-foreground: #e5e7eb;
43
43
  --popover: #030712;
44
- --popover-foreground: #f9fafb;
45
- --primary: #f9fafb;
44
+ --popover-foreground: #e5e7eb;
45
+ --primary: #e5e7eb;
46
46
  --primary-foreground: #030712;
47
- --secondary: #1f2937; /* gray-800 */
48
- --secondary-foreground: #f9fafb;
49
- --muted: #1f2937;
47
+ --secondary: #111827; /* gray-900 */
48
+ --secondary-foreground: #e5e7eb;
49
+ --muted: #111827;
50
50
  --muted-foreground: #9ca3af; /* gray-400 */
51
- --accent: #1f2937;
52
- --accent-foreground: #f9fafb;
51
+ --accent: #111827;
52
+ --accent-foreground: #e5e7eb;
53
53
  --destructive: #ef4444;
54
- --border: #374151; /* gray-700 */
55
- --input: #374151;
56
- --ring: #6b7280; /* gray-500 */
57
- --sidebar-background: #111827; /* gray-900 */
58
- --sidebar-foreground: #f9fafb;
59
- --sidebar-primary: #f9fafb;
60
- --sidebar-primary-foreground: #111827;
54
+ --border: #1f2937; /* gray-800 */
55
+ --input: #1f2937;
56
+ --ring: #4b5563; /* gray-600 */
57
+ --sidebar-background: #030712; /* gray-950 */
58
+ --sidebar-foreground: #e5e7eb;
59
+ --sidebar-primary: #e5e7eb;
60
+ --sidebar-primary-foreground: #030712;
61
61
  --sidebar-accent: rgb(255 255 255 / 0.06);
62
- --sidebar-accent-foreground: #f9fafb;
63
- --sidebar-border: #374151;
64
- --sidebar-ring: #6b7280;
62
+ --sidebar-accent-foreground: #e5e7eb;
63
+ --sidebar-border: #1f2937;
64
+ --sidebar-ring: #4b5563;
65
65
  }
66
66
  }
67
67
 
@@ -1,5 +1,6 @@
1
1
  <script setup lang="ts">
2
2
  import { computed } from 'vue'
3
+ import { Terminal } from 'lucide-vue-next'
3
4
  import { Kbd } from '@/components/ui/kbd'
4
5
  import {
5
6
  Empty,
@@ -14,6 +15,10 @@ import markUrl from '@/mark.svg'
14
15
  import markGradientUrl from '@/mark-gradient.svg'
15
16
 
16
17
  const isMac = computed(() => navigator.platform.includes('Mac'))
18
+
19
+ function openCommandPalette() {
20
+ document.dispatchEvent(new KeyboardEvent('keydown', { key: 'k', metaKey: true, ctrlKey: true }))
21
+ }
17
22
  </script>
18
23
 
19
24
  <template>
@@ -25,14 +30,16 @@ const isMac = computed(() => navigator.platform.includes('Mac'))
25
30
  </EmptyMedia>
26
31
  <EmptyTitle>Select an email to preview</EmptyTitle>
27
32
  <EmptyDescription>
28
- Choose an email from the sidebar to see a live preview.
33
+ Choose an email from the <span class="md:hidden">menu</span><span class="hidden md:inline">sidebar</span> to see a live preview.
29
34
  </EmptyDescription>
30
35
  </EmptyHeader>
31
36
  <EmptyContent>
32
- <p class="text-gray-500 dark:text-gray-400 text-sm">
33
- Press
34
- <Kbd>{{ isMac ? '⌘' : 'Ctrl' }}</Kbd> + <Kbd>K</Kbd>
35
- to open the command palette
37
+ <p
38
+ class="text-gray-500 dark:text-gray-400 text-sm cursor-pointer hover:text-gray-700 dark:hover:text-gray-200 transition-colors"
39
+ @click="openCommandPalette"
40
+ >
41
+ <span class="md:hidden inline-flex items-center gap-1.5 rounded-md bg-gray-100 dark:bg-gray-800 px-3 py-1.5"><Terminal class="size-3.5" /> Quick search</span>
42
+ <span class="hidden md:inline">Press <Kbd>{{ isMac ? '⌘' : 'Ctrl' }}</Kbd> + <Kbd>K</Kbd> to open the command palette</span>
36
43
  </p>
37
44
  </EmptyContent>
38
45
  </Empty>