doclific 0.2.0 → 0.2.2

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 (220) hide show
  1. package/LICENSE +17 -0
  2. package/dist/bin/doclific.js +36 -8
  3. package/package.json +11 -4
  4. package/readme.md +77 -0
  5. package/.gitattributes +0 -2
  6. package/.prettierignore +0 -5
  7. package/.prettierrc +0 -9
  8. package/.vscode/settings.json +0 -13
  9. package/frontend/components.json +0 -24
  10. package/frontend/eslint.config.js +0 -23
  11. package/frontend/index.html +0 -25
  12. package/frontend/package-lock.json +0 -15754
  13. package/frontend/public/logo.svg +0 -1
  14. package/frontend/src/App.tsx +0 -21
  15. package/frontend/src/components/app-sidebar.tsx +0 -393
  16. package/frontend/src/components/editor/editor-base-kit.tsx +0 -43
  17. package/frontend/src/components/editor/editor-kit.tsx +0 -93
  18. package/frontend/src/components/editor/plugins/align-base-kit.tsx +0 -16
  19. package/frontend/src/components/editor/plugins/align-kit.tsx +0 -18
  20. package/frontend/src/components/editor/plugins/autoformat-kit.tsx +0 -236
  21. package/frontend/src/components/editor/plugins/basic-blocks-base-kit.tsx +0 -35
  22. package/frontend/src/components/editor/plugins/basic-blocks-kit.tsx +0 -88
  23. package/frontend/src/components/editor/plugins/basic-marks-base-kit.tsx +0 -27
  24. package/frontend/src/components/editor/plugins/basic-marks-kit.tsx +0 -41
  25. package/frontend/src/components/editor/plugins/basic-nodes-kit.tsx +0 -6
  26. package/frontend/src/components/editor/plugins/block-menu-kit.tsx +0 -14
  27. package/frontend/src/components/editor/plugins/block-placeholder-kit.tsx +0 -17
  28. package/frontend/src/components/editor/plugins/block-selection-kit.tsx +0 -32
  29. package/frontend/src/components/editor/plugins/callout-base-kit.tsx +0 -7
  30. package/frontend/src/components/editor/plugins/callout-kit.tsx +0 -7
  31. package/frontend/src/components/editor/plugins/code-block-base-kit.tsx +0 -23
  32. package/frontend/src/components/editor/plugins/code-block-kit.tsx +0 -26
  33. package/frontend/src/components/editor/plugins/codebase-kit.tsx +0 -23
  34. package/frontend/src/components/editor/plugins/column-base-kit.tsx +0 -11
  35. package/frontend/src/components/editor/plugins/column-kit.tsx +0 -10
  36. package/frontend/src/components/editor/plugins/comment-base-kit.tsx +0 -7
  37. package/frontend/src/components/editor/plugins/comment-kit.tsx +0 -97
  38. package/frontend/src/components/editor/plugins/cursor-overlay-kit.tsx +0 -13
  39. package/frontend/src/components/editor/plugins/date-base-kit.tsx +0 -5
  40. package/frontend/src/components/editor/plugins/date-kit.tsx +0 -7
  41. package/frontend/src/components/editor/plugins/discussion-kit.tsx +0 -148
  42. package/frontend/src/components/editor/plugins/dnd-kit.tsx +0 -28
  43. package/frontend/src/components/editor/plugins/docx-kit.tsx +0 -6
  44. package/frontend/src/components/editor/plugins/emoji-kit.tsx +0 -13
  45. package/frontend/src/components/editor/plugins/excalidraw-kit.tsx +0 -9
  46. package/frontend/src/components/editor/plugins/exit-break-kit.tsx +0 -12
  47. package/frontend/src/components/editor/plugins/floating-toolbar-kit.tsx +0 -19
  48. package/frontend/src/components/editor/plugins/font-base-kit.tsx +0 -20
  49. package/frontend/src/components/editor/plugins/font-kit.tsx +0 -29
  50. package/frontend/src/components/editor/plugins/indent-base-kit.tsx +0 -19
  51. package/frontend/src/components/editor/plugins/indent-kit.tsx +0 -22
  52. package/frontend/src/components/editor/plugins/line-height-base-kit.tsx +0 -14
  53. package/frontend/src/components/editor/plugins/line-height-kit.tsx +0 -16
  54. package/frontend/src/components/editor/plugins/link-base-kit.tsx +0 -5
  55. package/frontend/src/components/editor/plugins/link-kit.tsx +0 -15
  56. package/frontend/src/components/editor/plugins/list-base-kit.tsx +0 -23
  57. package/frontend/src/components/editor/plugins/list-kit.tsx +0 -26
  58. package/frontend/src/components/editor/plugins/markdown-kit.tsx +0 -46
  59. package/frontend/src/components/editor/plugins/math-base-kit.tsx +0 -11
  60. package/frontend/src/components/editor/plugins/math-kit.tsx +0 -13
  61. package/frontend/src/components/editor/plugins/media-base-kit.tsx +0 -31
  62. package/frontend/src/components/editor/plugins/media-kit.tsx +0 -43
  63. package/frontend/src/components/editor/plugins/mention-base-kit.tsx +0 -7
  64. package/frontend/src/components/editor/plugins/mention-kit.tsx +0 -15
  65. package/frontend/src/components/editor/plugins/slash-kit.tsx +0 -18
  66. package/frontend/src/components/editor/plugins/suggestion-base-kit.tsx +0 -7
  67. package/frontend/src/components/editor/plugins/suggestion-kit.tsx +0 -90
  68. package/frontend/src/components/editor/plugins/table-base-kit.tsx +0 -20
  69. package/frontend/src/components/editor/plugins/table-kit.tsx +0 -22
  70. package/frontend/src/components/editor/plugins/toc-base-kit.tsx +0 -5
  71. package/frontend/src/components/editor/plugins/toc-kit.tsx +0 -14
  72. package/frontend/src/components/editor/plugins/toggle-base-kit.tsx +0 -7
  73. package/frontend/src/components/editor/plugins/toggle-kit.tsx +0 -11
  74. package/frontend/src/components/editor/transforms.ts +0 -194
  75. package/frontend/src/components/markdown-to-slate-demo.tsx +0 -50
  76. package/frontend/src/components/mode-toggle.tsx +0 -15
  77. package/frontend/src/components/theme-provider.tsx +0 -73
  78. package/frontend/src/components/ui/alert-dialog.tsx +0 -155
  79. package/frontend/src/components/ui/align-toolbar-button.tsx +0 -84
  80. package/frontend/src/components/ui/avatar.tsx +0 -51
  81. package/frontend/src/components/ui/block-context-menu.tsx +0 -199
  82. package/frontend/src/components/ui/block-discussion.tsx +0 -365
  83. package/frontend/src/components/ui/block-draggable.tsx +0 -512
  84. package/frontend/src/components/ui/block-list-static.tsx +0 -80
  85. package/frontend/src/components/ui/block-list.tsx +0 -87
  86. package/frontend/src/components/ui/block-selection.tsx +0 -42
  87. package/frontend/src/components/ui/block-suggestion.tsx +0 -473
  88. package/frontend/src/components/ui/blockquote-node-static.tsx +0 -11
  89. package/frontend/src/components/ui/blockquote-node.tsx +0 -13
  90. package/frontend/src/components/ui/button.tsx +0 -62
  91. package/frontend/src/components/ui/calendar.tsx +0 -218
  92. package/frontend/src/components/ui/callout-node-static.tsx +0 -36
  93. package/frontend/src/components/ui/callout-node.tsx +0 -63
  94. package/frontend/src/components/ui/caption.tsx +0 -63
  95. package/frontend/src/components/ui/checkbox.tsx +0 -30
  96. package/frontend/src/components/ui/code-block-node-static.tsx +0 -35
  97. package/frontend/src/components/ui/code-block-node.tsx +0 -287
  98. package/frontend/src/components/ui/code-node-static.tsx +0 -15
  99. package/frontend/src/components/ui/code-node.tsx +0 -17
  100. package/frontend/src/components/ui/codebase-snippet-node.tsx +0 -237
  101. package/frontend/src/components/ui/column-node-static.tsx +0 -29
  102. package/frontend/src/components/ui/column-node.tsx +0 -317
  103. package/frontend/src/components/ui/command.tsx +0 -182
  104. package/frontend/src/components/ui/comment-node-static.tsx +0 -15
  105. package/frontend/src/components/ui/comment-node.tsx +0 -45
  106. package/frontend/src/components/ui/comment-toolbar-button.tsx +0 -24
  107. package/frontend/src/components/ui/comment.tsx +0 -618
  108. package/frontend/src/components/ui/context-menu.tsx +0 -250
  109. package/frontend/src/components/ui/cursor-overlay.tsx +0 -66
  110. package/frontend/src/components/ui/date-node-static.tsx +0 -45
  111. package/frontend/src/components/ui/date-node.tsx +0 -93
  112. package/frontend/src/components/ui/dialog.tsx +0 -143
  113. package/frontend/src/components/ui/dropdown-menu.tsx +0 -255
  114. package/frontend/src/components/ui/dynamic-icon.tsx +0 -12
  115. package/frontend/src/components/ui/editor-static.tsx +0 -53
  116. package/frontend/src/components/ui/editor.tsx +0 -130
  117. package/frontend/src/components/ui/emoji-node.tsx +0 -69
  118. package/frontend/src/components/ui/emoji-toolbar-button.tsx +0 -628
  119. package/frontend/src/components/ui/equation-node-static.tsx +0 -98
  120. package/frontend/src/components/ui/equation-node.tsx +0 -235
  121. package/frontend/src/components/ui/equation-toolbar-button.tsx +0 -25
  122. package/frontend/src/components/ui/excalidraw-node.tsx +0 -36
  123. package/frontend/src/components/ui/export-toolbar-button.tsx +0 -174
  124. package/frontend/src/components/ui/file-selector.tsx +0 -339
  125. package/frontend/src/components/ui/floating-toolbar-buttons.tsx +0 -73
  126. package/frontend/src/components/ui/floating-toolbar.tsx +0 -85
  127. package/frontend/src/components/ui/font-color-toolbar-button.tsx +0 -831
  128. package/frontend/src/components/ui/font-size-toolbar-button.tsx +0 -152
  129. package/frontend/src/components/ui/heading-node-static.tsx +0 -68
  130. package/frontend/src/components/ui/heading-node.tsx +0 -58
  131. package/frontend/src/components/ui/highlight-node-static.tsx +0 -11
  132. package/frontend/src/components/ui/highlight-node.tsx +0 -13
  133. package/frontend/src/components/ui/history-toolbar-button.tsx +0 -50
  134. package/frontend/src/components/ui/hr-node-static.tsx +0 -20
  135. package/frontend/src/components/ui/hr-node.tsx +0 -33
  136. package/frontend/src/components/ui/import-toolbar-button.tsx +0 -97
  137. package/frontend/src/components/ui/indent-toolbar-button.tsx +0 -30
  138. package/frontend/src/components/ui/inline-combobox.tsx +0 -414
  139. package/frontend/src/components/ui/input.tsx +0 -21
  140. package/frontend/src/components/ui/insert-toolbar-button.tsx +0 -254
  141. package/frontend/src/components/ui/kbd-node-static.tsx +0 -15
  142. package/frontend/src/components/ui/kbd-node.tsx +0 -17
  143. package/frontend/src/components/ui/layout-header.tsx +0 -35
  144. package/frontend/src/components/ui/line-height-toolbar-button.tsx +0 -68
  145. package/frontend/src/components/ui/link-node-static.tsx +0 -21
  146. package/frontend/src/components/ui/link-node.tsx +0 -39
  147. package/frontend/src/components/ui/link-toolbar-button.tsx +0 -22
  148. package/frontend/src/components/ui/link-toolbar.tsx +0 -206
  149. package/frontend/src/components/ui/list-toolbar-button.tsx +0 -204
  150. package/frontend/src/components/ui/mark-toolbar-button.tsx +0 -19
  151. package/frontend/src/components/ui/media-audio-node-static.tsx +0 -17
  152. package/frontend/src/components/ui/media-audio-node.tsx +0 -39
  153. package/frontend/src/components/ui/media-embed-node.tsx +0 -136
  154. package/frontend/src/components/ui/media-file-node-static.tsx +0 -29
  155. package/frontend/src/components/ui/media-file-node.tsx +0 -47
  156. package/frontend/src/components/ui/media-image-node-static.tsx +0 -39
  157. package/frontend/src/components/ui/media-image-node.tsx +0 -80
  158. package/frontend/src/components/ui/media-placeholder-node.tsx +0 -249
  159. package/frontend/src/components/ui/media-preview-dialog.tsx +0 -152
  160. package/frontend/src/components/ui/media-toolbar-button.tsx +0 -225
  161. package/frontend/src/components/ui/media-toolbar.tsx +0 -115
  162. package/frontend/src/components/ui/media-upload-toast.tsx +0 -66
  163. package/frontend/src/components/ui/media-video-node-static.tsx +0 -30
  164. package/frontend/src/components/ui/media-video-node.tsx +0 -121
  165. package/frontend/src/components/ui/mention-node-static.tsx +0 -36
  166. package/frontend/src/components/ui/mention-node.tsx +0 -194
  167. package/frontend/src/components/ui/mode-toolbar-button.tsx +0 -123
  168. package/frontend/src/components/ui/more-toolbar-button.tsx +0 -80
  169. package/frontend/src/components/ui/paragraph-node-static.tsx +0 -13
  170. package/frontend/src/components/ui/paragraph-node.tsx +0 -15
  171. package/frontend/src/components/ui/popover.tsx +0 -46
  172. package/frontend/src/components/ui/resize-handle.tsx +0 -87
  173. package/frontend/src/components/ui/separator.tsx +0 -28
  174. package/frontend/src/components/ui/sheet.tsx +0 -139
  175. package/frontend/src/components/ui/sidebar.tsx +0 -726
  176. package/frontend/src/components/ui/skeleton.tsx +0 -13
  177. package/frontend/src/components/ui/slash-node.tsx +0 -233
  178. package/frontend/src/components/ui/sonner.tsx +0 -38
  179. package/frontend/src/components/ui/suggestion-node-static.tsx +0 -35
  180. package/frontend/src/components/ui/suggestion-node.tsx +0 -162
  181. package/frontend/src/components/ui/suggestion-toolbar-button.tsx +0 -25
  182. package/frontend/src/components/ui/table-icons.tsx +0 -862
  183. package/frontend/src/components/ui/table-node-static.tsx +0 -98
  184. package/frontend/src/components/ui/table-node.tsx +0 -656
  185. package/frontend/src/components/ui/table-toolbar-button.tsx +0 -264
  186. package/frontend/src/components/ui/toc-node-static.tsx +0 -92
  187. package/frontend/src/components/ui/toc-node.tsx +0 -55
  188. package/frontend/src/components/ui/toggle-node-static.tsx +0 -18
  189. package/frontend/src/components/ui/toggle-node.tsx +0 -36
  190. package/frontend/src/components/ui/toggle-toolbar-button.tsx +0 -22
  191. package/frontend/src/components/ui/toolbar.tsx +0 -387
  192. package/frontend/src/components/ui/tooltip.tsx +0 -59
  193. package/frontend/src/components/ui/turn-into-toolbar-button.tsx +0 -188
  194. package/frontend/src/hooks/use-debounce.ts +0 -18
  195. package/frontend/src/hooks/use-is-touch-device.ts +0 -24
  196. package/frontend/src/hooks/use-mobile.ts +0 -19
  197. package/frontend/src/hooks/use-mounted.ts +0 -11
  198. package/frontend/src/hooks/use-upload-file.ts +0 -128
  199. package/frontend/src/index.css +0 -128
  200. package/frontend/src/layout.tsx +0 -42
  201. package/frontend/src/lib/markdown-joiner-transform.ts +0 -239
  202. package/frontend/src/lib/orpc.ts +0 -13
  203. package/frontend/src/lib/uploadthing.ts +0 -19
  204. package/frontend/src/lib/utils.ts +0 -6
  205. package/frontend/src/main.tsx +0 -13
  206. package/frontend/src/pages/editor.tsx +0 -44
  207. package/frontend/src/types/docs.d.ts +0 -6
  208. package/frontend/src/types/global.d.ts +0 -9
  209. package/frontend/src/types/router.d.ts +0 -4
  210. package/frontend/tsconfig.app.json +0 -33
  211. package/frontend/tsconfig.json +0 -10
  212. package/frontend/tsconfig.node.json +0 -26
  213. package/frontend/vite.config.ts +0 -14
  214. package/src/bin/doclific.ts +0 -47
  215. package/src/core/codebase.ts +0 -39
  216. package/src/core/docs.ts +0 -90
  217. package/src/core/git.ts +0 -48
  218. package/src/server/index.ts +0 -55
  219. package/src/server/router.ts +0 -65
  220. package/tsconfig.json +0 -15
@@ -1,73 +0,0 @@
1
- import { createContext, useContext, useEffect, useState } from "react"
2
-
3
- type Theme = "dark" | "light" | "system"
4
-
5
- type ThemeProviderProps = {
6
- children: React.ReactNode
7
- defaultTheme?: Theme
8
- storageKey?: string
9
- }
10
-
11
- type ThemeProviderState = {
12
- theme: Theme
13
- setTheme: (theme: Theme) => void
14
- }
15
-
16
- const initialState: ThemeProviderState = {
17
- theme: "system",
18
- setTheme: () => null,
19
- }
20
-
21
- const ThemeProviderContext = createContext<ThemeProviderState>(initialState)
22
-
23
- export function ThemeProvider({
24
- children,
25
- defaultTheme = "system",
26
- storageKey = "vite-ui-theme",
27
- ...props
28
- }: ThemeProviderProps) {
29
- const [theme, setTheme] = useState<Theme>(
30
- () => (localStorage.getItem(storageKey) as Theme) || defaultTheme
31
- )
32
-
33
- useEffect(() => {
34
- const root = window.document.documentElement
35
-
36
- root.classList.remove("light", "dark")
37
-
38
- if (theme === "system") {
39
- const systemTheme = window.matchMedia("(prefers-color-scheme: dark)")
40
- .matches
41
- ? "dark"
42
- : "light"
43
-
44
- root.classList.add(systemTheme)
45
- return
46
- }
47
-
48
- root.classList.add(theme)
49
- }, [theme])
50
-
51
- const value = {
52
- theme,
53
- setTheme: (theme: Theme) => {
54
- localStorage.setItem(storageKey, theme)
55
- setTheme(theme)
56
- },
57
- }
58
-
59
- return (
60
- <ThemeProviderContext.Provider {...props} value={value}>
61
- {children}
62
- </ThemeProviderContext.Provider>
63
- )
64
- }
65
-
66
- export const useTheme = () => {
67
- const context = useContext(ThemeProviderContext)
68
-
69
- if (context === undefined)
70
- throw new Error("useTheme must be used within a ThemeProvider")
71
-
72
- return context
73
- }
@@ -1,155 +0,0 @@
1
- import * as React from "react"
2
- import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"
3
-
4
- import { cn } from "@/lib/utils"
5
- import { buttonVariants } from "@/components/ui/button"
6
-
7
- function AlertDialog({
8
- ...props
9
- }: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {
10
- return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />
11
- }
12
-
13
- function AlertDialogTrigger({
14
- ...props
15
- }: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {
16
- return (
17
- <AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} />
18
- )
19
- }
20
-
21
- function AlertDialogPortal({
22
- ...props
23
- }: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {
24
- return (
25
- <AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} />
26
- )
27
- }
28
-
29
- function AlertDialogOverlay({
30
- className,
31
- ...props
32
- }: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {
33
- return (
34
- <AlertDialogPrimitive.Overlay
35
- data-slot="alert-dialog-overlay"
36
- className={cn(
37
- "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
38
- className
39
- )}
40
- {...props}
41
- />
42
- )
43
- }
44
-
45
- function AlertDialogContent({
46
- className,
47
- ...props
48
- }: React.ComponentProps<typeof AlertDialogPrimitive.Content>) {
49
- return (
50
- <AlertDialogPortal>
51
- <AlertDialogOverlay />
52
- <AlertDialogPrimitive.Content
53
- data-slot="alert-dialog-content"
54
- className={cn(
55
- "bg-background 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 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg",
56
- className
57
- )}
58
- {...props}
59
- />
60
- </AlertDialogPortal>
61
- )
62
- }
63
-
64
- function AlertDialogHeader({
65
- className,
66
- ...props
67
- }: React.ComponentProps<"div">) {
68
- return (
69
- <div
70
- data-slot="alert-dialog-header"
71
- className={cn("flex flex-col gap-2 text-center sm:text-left", className)}
72
- {...props}
73
- />
74
- )
75
- }
76
-
77
- function AlertDialogFooter({
78
- className,
79
- ...props
80
- }: React.ComponentProps<"div">) {
81
- return (
82
- <div
83
- data-slot="alert-dialog-footer"
84
- className={cn(
85
- "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
86
- className
87
- )}
88
- {...props}
89
- />
90
- )
91
- }
92
-
93
- function AlertDialogTitle({
94
- className,
95
- ...props
96
- }: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {
97
- return (
98
- <AlertDialogPrimitive.Title
99
- data-slot="alert-dialog-title"
100
- className={cn("text-lg font-semibold", className)}
101
- {...props}
102
- />
103
- )
104
- }
105
-
106
- function AlertDialogDescription({
107
- className,
108
- ...props
109
- }: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {
110
- return (
111
- <AlertDialogPrimitive.Description
112
- data-slot="alert-dialog-description"
113
- className={cn("text-muted-foreground text-sm", className)}
114
- {...props}
115
- />
116
- )
117
- }
118
-
119
- function AlertDialogAction({
120
- className,
121
- ...props
122
- }: React.ComponentProps<typeof AlertDialogPrimitive.Action>) {
123
- return (
124
- <AlertDialogPrimitive.Action
125
- className={cn(buttonVariants(), className)}
126
- {...props}
127
- />
128
- )
129
- }
130
-
131
- function AlertDialogCancel({
132
- className,
133
- ...props
134
- }: React.ComponentProps<typeof AlertDialogPrimitive.Cancel>) {
135
- return (
136
- <AlertDialogPrimitive.Cancel
137
- className={cn(buttonVariants({ variant: "outline" }), className)}
138
- {...props}
139
- />
140
- )
141
- }
142
-
143
- export {
144
- AlertDialog,
145
- AlertDialogPortal,
146
- AlertDialogOverlay,
147
- AlertDialogTrigger,
148
- AlertDialogContent,
149
- AlertDialogHeader,
150
- AlertDialogFooter,
151
- AlertDialogTitle,
152
- AlertDialogDescription,
153
- AlertDialogAction,
154
- AlertDialogCancel,
155
- }
@@ -1,84 +0,0 @@
1
- import React from 'react';
2
- import type { Alignment } from '@platejs/basic-styles';
3
- import type { DropdownMenuProps } from '@radix-ui/react-dropdown-menu';
4
-
5
- import { TextAlignPlugin } from '@platejs/basic-styles/react';
6
- import {
7
- AlignCenterIcon,
8
- AlignJustifyIcon,
9
- AlignLeftIcon,
10
- AlignRightIcon,
11
- } from 'lucide-react';
12
- import { useEditorPlugin, useSelectionFragmentProp } from 'platejs/react';
13
-
14
- import {
15
- DropdownMenu,
16
- DropdownMenuContent,
17
- DropdownMenuRadioGroup,
18
- DropdownMenuRadioItem,
19
- DropdownMenuTrigger,
20
- } from '@/components/ui/dropdown-menu';
21
-
22
- import { ToolbarButton } from './toolbar';
23
-
24
- const items = [
25
- {
26
- icon: AlignLeftIcon,
27
- value: 'left',
28
- },
29
- {
30
- icon: AlignCenterIcon,
31
- value: 'center',
32
- },
33
- {
34
- icon: AlignRightIcon,
35
- value: 'right',
36
- },
37
- {
38
- icon: AlignJustifyIcon,
39
- value: 'justify',
40
- },
41
- ];
42
-
43
- export function AlignToolbarButton(props: DropdownMenuProps) {
44
- const { editor, tf } = useEditorPlugin(TextAlignPlugin);
45
- const value =
46
- useSelectionFragmentProp({
47
- defaultValue: 'start',
48
- getProp: (node) => node.align,
49
- }) ?? 'left';
50
-
51
- const [open, setOpen] = React.useState(false);
52
- const IconValue =
53
- items.find((item) => item.value === value)?.icon ?? AlignLeftIcon;
54
-
55
- return (
56
- <DropdownMenu open={open} onOpenChange={setOpen} modal={false} {...props}>
57
- <DropdownMenuTrigger asChild>
58
- <ToolbarButton pressed={open} tooltip="Align" isDropdown>
59
- <IconValue />
60
- </ToolbarButton>
61
- </DropdownMenuTrigger>
62
-
63
- <DropdownMenuContent className="min-w-0" align="start">
64
- <DropdownMenuRadioGroup
65
- value={value}
66
- onValueChange={(value) => {
67
- tf.textAlign.setNodes(value as Alignment);
68
- editor.tf.focus();
69
- }}
70
- >
71
- {items.map(({ icon: Icon, value: itemValue }) => (
72
- <DropdownMenuRadioItem
73
- key={itemValue}
74
- className="pl-2 data-[state=checked]:bg-accent *:first:[span]:hidden"
75
- value={itemValue}
76
- >
77
- <Icon />
78
- </DropdownMenuRadioItem>
79
- ))}
80
- </DropdownMenuRadioGroup>
81
- </DropdownMenuContent>
82
- </DropdownMenu>
83
- );
84
- }
@@ -1,51 +0,0 @@
1
- import * as React from "react"
2
- import * as AvatarPrimitive from "@radix-ui/react-avatar"
3
-
4
- import { cn } from "@/lib/utils"
5
-
6
- function Avatar({
7
- className,
8
- ...props
9
- }: React.ComponentProps<typeof AvatarPrimitive.Root>) {
10
- return (
11
- <AvatarPrimitive.Root
12
- data-slot="avatar"
13
- className={cn(
14
- "relative flex size-8 shrink-0 overflow-hidden rounded-full",
15
- className
16
- )}
17
- {...props}
18
- />
19
- )
20
- }
21
-
22
- function AvatarImage({
23
- className,
24
- ...props
25
- }: React.ComponentProps<typeof AvatarPrimitive.Image>) {
26
- return (
27
- <AvatarPrimitive.Image
28
- data-slot="avatar-image"
29
- className={cn("aspect-square size-full", className)}
30
- {...props}
31
- />
32
- )
33
- }
34
-
35
- function AvatarFallback({
36
- className,
37
- ...props
38
- }: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {
39
- return (
40
- <AvatarPrimitive.Fallback
41
- data-slot="avatar-fallback"
42
- className={cn(
43
- "bg-muted flex size-full items-center justify-center rounded-full",
44
- className
45
- )}
46
- {...props}
47
- />
48
- )
49
- }
50
-
51
- export { Avatar, AvatarImage, AvatarFallback }
@@ -1,199 +0,0 @@
1
- import React from 'react';
2
- import { AIChatPlugin } from '@platejs/ai/react';
3
- import {
4
- BLOCK_CONTEXT_MENU_ID,
5
- BlockMenuPlugin,
6
- BlockSelectionPlugin,
7
- } from '@platejs/selection/react';
8
- import { KEYS } from 'platejs';
9
- import { useEditorPlugin, usePlateState, usePluginOption } from 'platejs/react';
10
-
11
- import {
12
- ContextMenu,
13
- ContextMenuContent,
14
- ContextMenuGroup,
15
- ContextMenuItem,
16
- ContextMenuSub,
17
- ContextMenuSubContent,
18
- ContextMenuSubTrigger,
19
- ContextMenuTrigger,
20
- } from '@/components/ui/context-menu';
21
- import { useIsTouchDevice } from '@/hooks/use-is-touch-device';
22
-
23
- type Value = 'askAI' | null;
24
-
25
- export function BlockContextMenu({ children }: { children: React.ReactNode }) {
26
- const { api, editor } = useEditorPlugin(BlockMenuPlugin);
27
- const [value, setValue] = React.useState<Value>(null);
28
- const isTouch = useIsTouchDevice();
29
- const [readOnly] = usePlateState('readOnly');
30
- const openId = usePluginOption(BlockMenuPlugin, 'openId');
31
- const isOpen = openId === BLOCK_CONTEXT_MENU_ID;
32
-
33
- const handleTurnInto = React.useCallback(
34
- (type: string) => {
35
- editor
36
- .getApi(BlockSelectionPlugin)
37
- .blockSelection.getNodes()
38
- .forEach(([node, path]) => {
39
- if (node[KEYS.listType]) {
40
- editor.tf.unsetNodes([KEYS.listType, 'indent'], {
41
- at: path,
42
- });
43
- }
44
-
45
- editor.tf.toggleBlock(type, { at: path });
46
- });
47
- },
48
- [editor]
49
- );
50
-
51
- const handleAlign = React.useCallback(
52
- (align: 'center' | 'left' | 'right') => {
53
- editor
54
- .getTransforms(BlockSelectionPlugin)
55
- .blockSelection.setNodes({ align });
56
- },
57
- [editor]
58
- );
59
-
60
- if (isTouch) {
61
- return children;
62
- }
63
-
64
- return (
65
- <ContextMenu
66
- onOpenChange={(open) => {
67
- if (!open) {
68
- api.blockMenu.hide();
69
- }
70
- }}
71
- modal={false}
72
- >
73
- <ContextMenuTrigger
74
- asChild
75
- onContextMenu={(event) => {
76
- const dataset = (event.target as HTMLElement).dataset;
77
- const disabled =
78
- dataset?.slateEditor === 'true' ||
79
- readOnly ||
80
- dataset?.plateOpenContextMenu === 'false';
81
-
82
- if (disabled) return event.preventDefault();
83
-
84
- setTimeout(() => {
85
- api.blockMenu.show(BLOCK_CONTEXT_MENU_ID, {
86
- x: event.clientX,
87
- y: event.clientY,
88
- });
89
- }, 0);
90
- }}
91
- >
92
- <div className="w-full">{children}</div>
93
- </ContextMenuTrigger>
94
- {isOpen && (
95
- <ContextMenuContent
96
- className="w-64"
97
- onCloseAutoFocus={(e) => {
98
- e.preventDefault();
99
- editor.getApi(BlockSelectionPlugin).blockSelection.focus();
100
-
101
- if (value === 'askAI') {
102
- editor.getApi(AIChatPlugin).aiChat.show();
103
- }
104
-
105
- setValue(null);
106
- }}
107
- >
108
- <ContextMenuGroup>
109
- <ContextMenuItem
110
- onClick={() => {
111
- setValue('askAI');
112
- }}
113
- >
114
- Ask AI
115
- </ContextMenuItem>
116
- <ContextMenuItem
117
- onClick={() => {
118
- editor
119
- .getTransforms(BlockSelectionPlugin)
120
- .blockSelection.removeNodes();
121
- editor.tf.focus();
122
- }}
123
- >
124
- Delete
125
- </ContextMenuItem>
126
- <ContextMenuItem
127
- onClick={() => {
128
- editor
129
- .getTransforms(BlockSelectionPlugin)
130
- .blockSelection.duplicate();
131
- }}
132
- >
133
- Duplicate
134
- {/* <ContextMenuShortcut>⌘ + D</ContextMenuShortcut> */}
135
- </ContextMenuItem>
136
- <ContextMenuSub>
137
- <ContextMenuSubTrigger>Turn into</ContextMenuSubTrigger>
138
- <ContextMenuSubContent className="w-48">
139
- <ContextMenuItem onClick={() => handleTurnInto(KEYS.p)}>
140
- Paragraph
141
- </ContextMenuItem>
142
-
143
- <ContextMenuItem onClick={() => handleTurnInto(KEYS.h1)}>
144
- Heading 1
145
- </ContextMenuItem>
146
- <ContextMenuItem onClick={() => handleTurnInto(KEYS.h2)}>
147
- Heading 2
148
- </ContextMenuItem>
149
- <ContextMenuItem onClick={() => handleTurnInto(KEYS.h3)}>
150
- Heading 3
151
- </ContextMenuItem>
152
- <ContextMenuItem
153
- onClick={() => handleTurnInto(KEYS.blockquote)}
154
- >
155
- Blockquote
156
- </ContextMenuItem>
157
- </ContextMenuSubContent>
158
- </ContextMenuSub>
159
- </ContextMenuGroup>
160
-
161
- <ContextMenuGroup>
162
- <ContextMenuItem
163
- onClick={() =>
164
- editor
165
- .getTransforms(BlockSelectionPlugin)
166
- .blockSelection.setIndent(1)
167
- }
168
- >
169
- Indent
170
- </ContextMenuItem>
171
- <ContextMenuItem
172
- onClick={() =>
173
- editor
174
- .getTransforms(BlockSelectionPlugin)
175
- .blockSelection.setIndent(-1)
176
- }
177
- >
178
- Outdent
179
- </ContextMenuItem>
180
- <ContextMenuSub>
181
- <ContextMenuSubTrigger>Align</ContextMenuSubTrigger>
182
- <ContextMenuSubContent className="w-48">
183
- <ContextMenuItem onClick={() => handleAlign('left')}>
184
- Left
185
- </ContextMenuItem>
186
- <ContextMenuItem onClick={() => handleAlign('center')}>
187
- Center
188
- </ContextMenuItem>
189
- <ContextMenuItem onClick={() => handleAlign('right')}>
190
- Right
191
- </ContextMenuItem>
192
- </ContextMenuSubContent>
193
- </ContextMenuSub>
194
- </ContextMenuGroup>
195
- </ContextMenuContent>
196
- )}
197
- </ContextMenu>
198
- );
199
- }