@thangph2146/lexical-editor 0.0.11 → 0.0.13

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 (46) hide show
  1. package/README.md +2 -1
  2. package/dist/editor-x/editor.cjs +280 -20
  3. package/dist/editor-x/editor.cjs.map +1 -1
  4. package/dist/editor-x/editor.css +27 -4
  5. package/dist/editor-x/editor.css.map +1 -1
  6. package/dist/editor-x/editor.js +281 -21
  7. package/dist/editor-x/editor.js.map +1 -1
  8. package/dist/index.cjs +292 -23
  9. package/dist/index.cjs.map +1 -1
  10. package/dist/index.css +27 -4
  11. package/dist/index.css.map +1 -1
  12. package/dist/index.d.cts +26 -1
  13. package/dist/index.d.ts +26 -1
  14. package/dist/index.js +293 -24
  15. package/dist/index.js.map +1 -1
  16. package/package.json +1 -1
  17. package/src/components/lexical-editor.tsx +19 -6
  18. package/src/context/uploads-context.tsx +1 -0
  19. package/src/editor-ui/content-editable.tsx +18 -2
  20. package/src/editor-x/nodes.ts +2 -0
  21. package/src/nodes/download-link-node.tsx +118 -0
  22. package/src/plugins/floating-link-editor-plugin.tsx +338 -91
  23. package/src/themes/core/_tables.scss +0 -1
  24. package/src/themes/plugins/_floating-link-editor.scss +28 -2
  25. package/src/themes/ui-components/_button.scss +1 -1
  26. package/src/themes/ui-components/_flex.scss +1 -0
  27. package/src/ui/button-group.tsx +10 -10
  28. package/src/ui/button.tsx +38 -38
  29. package/src/ui/collapsible.tsx +67 -67
  30. package/src/ui/command.tsx +48 -48
  31. package/src/ui/dialog.tsx +146 -146
  32. package/src/ui/flex.tsx +45 -45
  33. package/src/ui/input.tsx +20 -20
  34. package/src/ui/label.tsx +20 -20
  35. package/src/ui/number-input.tsx +104 -104
  36. package/src/ui/popover.tsx +128 -128
  37. package/src/ui/scroll-area.tsx +17 -17
  38. package/src/ui/select.tsx +171 -171
  39. package/src/ui/separator.tsx +20 -20
  40. package/src/ui/slider.tsx +14 -14
  41. package/src/ui/slot.tsx +3 -3
  42. package/src/ui/tabs.tsx +87 -87
  43. package/src/ui/toggle-group.tsx +109 -109
  44. package/src/ui/toggle.tsx +28 -28
  45. package/src/ui/tooltip.tsx +28 -28
  46. package/src/ui/typography.tsx +44 -44
@@ -1,109 +1,109 @@
1
- import * as React from "react"
2
- import { cn } from "../lib/utils"
3
-
4
- type ToggleGroupContextValue = {
5
- type: "single" | "multiple"
6
- value: string | string[]
7
- onValueChange: (value: string | string[]) => void
8
- size?: "default" | "sm" | "lg"
9
- variant?: "default" | "outline"
10
- }
11
-
12
- const ToggleGroupContext = React.createContext<ToggleGroupContextValue | null>(null)
13
-
14
- type ToggleGroupProps = (
15
- | { type: "single"; value?: string; onValueChange?: (value: string) => void }
16
- | { type: "multiple"; value?: string[]; onValueChange?: (value: string[]) => void }
17
- ) & Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> & {
18
- size?: "default" | "sm" | "lg"
19
- variant?: "default" | "outline"
20
- }
21
-
22
- export const ToggleGroup = React.forwardRef<HTMLDivElement, ToggleGroupProps>(
23
- ({ className, type = "single", value, onValueChange, children, size, variant, ...props }, ref) => {
24
- const contextValue: ToggleGroupContextValue = React.useMemo(() => ({
25
- type: type as "single" | "multiple",
26
- value: value || (type === "multiple" ? [] : ""),
27
- onValueChange: (val: string | string[]) => {
28
- if (type === "single" && typeof val === "string") {
29
- (onValueChange as ((v: string) => void))?.(val)
30
- } else if (type === "multiple" && Array.isArray(val)) {
31
- (onValueChange as ((v: string[]) => void))?.(val)
32
- }
33
- },
34
- size,
35
- variant
36
- }), [type, value, onValueChange, size, variant])
37
-
38
- return (
39
- <ToggleGroupContext.Provider value={contextValue}>
40
- <div ref={ref} className={cn("editor-toggle-group", className)} {...props}>
41
- {children}
42
- </div>
43
- </ToggleGroupContext.Provider>
44
- )
45
- }
46
- )
47
- ToggleGroup.displayName = "ToggleGroup"
48
-
49
- export const ToggleGroupItem = React.forwardRef<
50
- HTMLButtonElement,
51
- React.ButtonHTMLAttributes<HTMLButtonElement> & { value: string, size?: "default" | "sm" | "lg", variant?: "default" | "outline" }
52
- >(({ className, value, onClick, size: itemSize, variant: itemVariant, ...props }, ref) => {
53
- const context = React.useContext(ToggleGroupContext)
54
-
55
- const size = itemSize || context?.size || "default"
56
- // variant is not used in styles yet but good to have in props
57
-
58
- if (!context) {
59
- // Fallback if used outside group
60
- return (
61
- <button
62
- ref={ref}
63
- type="button"
64
- className={cn(
65
- "editor-toggle-group-item",
66
- size !== "default" && `editor-toggle-group-item--size-${size}`,
67
- className
68
- )}
69
- onClick={onClick}
70
- {...props}
71
- />
72
- )
73
- }
74
-
75
- const isSelected = context.type === "single"
76
- ? context.value === value
77
- : Array.isArray(context.value) && context.value.includes(value)
78
-
79
- const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
80
- if (context.type === "single") {
81
- context.onValueChange(isSelected ? "" : value)
82
- } else {
83
- const currentValues = Array.isArray(context.value) ? context.value : []
84
- const newValues = isSelected
85
- ? currentValues.filter((v) => v !== value)
86
- : [...currentValues, value]
87
- context.onValueChange(newValues)
88
- }
89
- onClick?.(e)
90
- }
91
-
92
- return (
93
- <button
94
- ref={ref}
95
- type="button"
96
- aria-pressed={isSelected}
97
- data-state={isSelected ? "on" : "off"}
98
- className={cn(
99
- "editor-toggle-group-item",
100
- size !== "default" && `editor-toggle-group-item--size-${size}`,
101
- (itemVariant === "outline" || (!itemVariant && context?.variant === "outline")) && "editor-toggle-group-item--outline",
102
- className
103
- )}
104
- onClick={handleClick}
105
- {...props}
106
- />
107
- )
108
- })
109
- ToggleGroupItem.displayName = "ToggleGroupItem"
1
+ import * as React from "react"
2
+ import { cn } from "../lib/utils"
3
+
4
+ type ToggleGroupContextValue = {
5
+ type: "single" | "multiple"
6
+ value: string | string[]
7
+ onValueChange: (value: string | string[]) => void
8
+ size?: "default" | "sm" | "lg"
9
+ variant?: "default" | "outline"
10
+ }
11
+
12
+ const ToggleGroupContext = React.createContext<ToggleGroupContextValue | null>(null)
13
+
14
+ type ToggleGroupProps = (
15
+ | { type: "single"; value?: string; onValueChange?: (value: string) => void }
16
+ | { type: "multiple"; value?: string[]; onValueChange?: (value: string[]) => void }
17
+ ) & Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> & {
18
+ size?: "default" | "sm" | "lg"
19
+ variant?: "default" | "outline"
20
+ }
21
+
22
+ export const ToggleGroup = React.forwardRef<HTMLDivElement, ToggleGroupProps>(
23
+ ({ className, type = "single", value, onValueChange, children, size, variant, ...props }, ref) => {
24
+ const contextValue: ToggleGroupContextValue = React.useMemo(() => ({
25
+ type: type as "single" | "multiple",
26
+ value: value || (type === "multiple" ? [] : ""),
27
+ onValueChange: (val: string | string[]) => {
28
+ if (type === "single" && typeof val === "string") {
29
+ (onValueChange as ((v: string) => void))?.(val)
30
+ } else if (type === "multiple" && Array.isArray(val)) {
31
+ (onValueChange as ((v: string[]) => void))?.(val)
32
+ }
33
+ },
34
+ size,
35
+ variant
36
+ }), [type, value, onValueChange, size, variant])
37
+
38
+ return (
39
+ <ToggleGroupContext.Provider value={contextValue}>
40
+ <div ref={ref} className={cn("editor-toggle-group", className)} {...props}>
41
+ {children}
42
+ </div>
43
+ </ToggleGroupContext.Provider>
44
+ )
45
+ }
46
+ )
47
+ ToggleGroup.displayName = "ToggleGroup"
48
+
49
+ export const ToggleGroupItem = React.forwardRef<
50
+ HTMLButtonElement,
51
+ React.ButtonHTMLAttributes<HTMLButtonElement> & { value: string, size?: "default" | "sm" | "lg", variant?: "default" | "outline" }
52
+ >(({ className, value, onClick, size: itemSize, variant: itemVariant, ...props }, ref) => {
53
+ const context = React.useContext(ToggleGroupContext)
54
+
55
+ const size = itemSize || context?.size || "default"
56
+ // variant is not used in styles yet but good to have in props
57
+
58
+ if (!context) {
59
+ // Fallback if used outside group
60
+ return (
61
+ <button
62
+ ref={ref}
63
+ type="button"
64
+ className={cn(
65
+ "editor-toggle-group-item",
66
+ size !== "default" && `editor-toggle-group-item--size-${size}`,
67
+ className
68
+ )}
69
+ onClick={onClick}
70
+ {...props}
71
+ />
72
+ )
73
+ }
74
+
75
+ const isSelected = context.type === "single"
76
+ ? context.value === value
77
+ : Array.isArray(context.value) && context.value.includes(value)
78
+
79
+ const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {
80
+ if (context.type === "single") {
81
+ context.onValueChange(isSelected ? "" : value)
82
+ } else {
83
+ const currentValues = Array.isArray(context.value) ? context.value : []
84
+ const newValues = isSelected
85
+ ? currentValues.filter((v) => v !== value)
86
+ : [...currentValues, value]
87
+ context.onValueChange(newValues)
88
+ }
89
+ onClick?.(e)
90
+ }
91
+
92
+ return (
93
+ <button
94
+ ref={ref}
95
+ type="button"
96
+ aria-pressed={isSelected}
97
+ data-state={isSelected ? "on" : "off"}
98
+ className={cn(
99
+ "editor-toggle-group-item",
100
+ size !== "default" && `editor-toggle-group-item--size-${size}`,
101
+ (itemVariant === "outline" || (!itemVariant && context?.variant === "outline")) && "editor-toggle-group-item--outline",
102
+ className
103
+ )}
104
+ onClick={handleClick}
105
+ {...props}
106
+ />
107
+ )
108
+ })
109
+ ToggleGroupItem.displayName = "ToggleGroupItem"
package/src/ui/toggle.tsx CHANGED
@@ -1,28 +1,28 @@
1
- import * as React from "react"
2
- import { cn } from "../lib/utils"
3
-
4
- export const Toggle = React.forwardRef<
5
- HTMLButtonElement,
6
- React.ButtonHTMLAttributes<HTMLButtonElement> & {
7
- pressed?: boolean
8
- onPressedChange?: (pressed: boolean) => void
9
- variant?: "default" | "outline" | "ghost"
10
- size?: "default" | "sm" | "lg"
11
- }
12
- >(({ className, pressed, onPressedChange, variant = "default", size = "default", ...props }, ref) => (
13
- <button
14
- ref={ref}
15
- type="button"
16
- aria-pressed={pressed}
17
- data-state={pressed ? "on" : "off"}
18
- className={cn(
19
- "editor-toggle",
20
- variant !== "default" && `editor-toggle--${variant}`,
21
- size !== "default" && `editor-toggle--size-${size}`,
22
- className
23
- )}
24
- onClick={() => onPressedChange?.(!pressed)}
25
- {...props}
26
- />
27
- ))
28
- Toggle.displayName = "Toggle"
1
+ import * as React from "react"
2
+ import { cn } from "../lib/utils"
3
+
4
+ export const Toggle = React.forwardRef<
5
+ HTMLButtonElement,
6
+ React.ButtonHTMLAttributes<HTMLButtonElement> & {
7
+ pressed?: boolean
8
+ onPressedChange?: (pressed: boolean) => void
9
+ variant?: "default" | "outline" | "ghost"
10
+ size?: "default" | "sm" | "lg"
11
+ }
12
+ >(({ className, pressed, onPressedChange, variant = "default", size = "default", ...props }, ref) => (
13
+ <button
14
+ ref={ref}
15
+ type="button"
16
+ aria-pressed={pressed}
17
+ data-state={pressed ? "on" : "off"}
18
+ className={cn(
19
+ "editor-toggle",
20
+ variant !== "default" && `editor-toggle--${variant}`,
21
+ size !== "default" && `editor-toggle--size-${size}`,
22
+ className
23
+ )}
24
+ onClick={() => onPressedChange?.(!pressed)}
25
+ {...props}
26
+ />
27
+ ))
28
+ Toggle.displayName = "Toggle"
@@ -1,28 +1,28 @@
1
- import * as React from "react"
2
- import { cn } from "../lib/utils"
3
-
4
- export const TooltipProvider = ({ children }: { children: React.ReactNode }) => <>{children}</>
5
-
6
- export const Tooltip = ({ children }: { children: React.ReactNode, disableHoverableContent?: boolean }) => <div className="editor-tooltip-group">{children}</div>
7
-
8
- export const TooltipTrigger = ({ asChild, children, ...props }: React.HTMLAttributes<HTMLElement> & { asChild?: boolean, children: React.ReactNode }) => {
9
- const child = asChild ? React.Children.only(children) : children
10
- if (!React.isValidElement(child)) return null
11
- return React.cloneElement(child as React.ReactElement<React.HTMLAttributes<HTMLElement>>, {
12
- ...props,
13
- className: cn((child as React.ReactElement<React.HTMLAttributes<HTMLElement>>).props.className, "editor-tooltip-trigger")
14
- })
15
- }
16
-
17
- export const TooltipContent = ({ children, className, side = "top", ...props }: React.HTMLAttributes<HTMLDivElement> & { side?: "top" | "bottom" | "left" | "right" }) => (
18
- <div
19
- className={cn(
20
- "editor-tooltip-content",
21
- `editor-tooltip-content--${side}`,
22
- className
23
- )}
24
- {...props}
25
- >
26
- {children}
27
- </div>
28
- )
1
+ import * as React from "react"
2
+ import { cn } from "../lib/utils"
3
+
4
+ export const TooltipProvider = ({ children }: { children: React.ReactNode }) => <>{children}</>
5
+
6
+ export const Tooltip = ({ children }: { children: React.ReactNode, disableHoverableContent?: boolean }) => <div className="editor-tooltip-group">{children}</div>
7
+
8
+ export const TooltipTrigger = ({ asChild, children, ...props }: React.HTMLAttributes<HTMLElement> & { asChild?: boolean, children: React.ReactNode }) => {
9
+ const child = asChild ? React.Children.only(children) : children
10
+ if (!React.isValidElement(child)) return null
11
+ return React.cloneElement(child as React.ReactElement<React.HTMLAttributes<HTMLElement>>, {
12
+ ...props,
13
+ className: cn((child as React.ReactElement<React.HTMLAttributes<HTMLElement>>).props.className, "editor-tooltip-trigger")
14
+ })
15
+ }
16
+
17
+ export const TooltipContent = ({ children, className, side = "top", ...props }: React.HTMLAttributes<HTMLDivElement> & { side?: "top" | "bottom" | "left" | "right" }) => (
18
+ <div
19
+ className={cn(
20
+ "editor-tooltip-content",
21
+ `editor-tooltip-content--${side}`,
22
+ className
23
+ )}
24
+ {...props}
25
+ >
26
+ {children}
27
+ </div>
28
+ )
@@ -1,44 +1,44 @@
1
- import * as React from "react"
2
- import { cn } from "../lib/utils"
3
-
4
- export const IconSize = ({ size = "medium", children, className }: { size?: "small" | "medium" | "large" | "sm" | "md" | "lg" | "xs" | "xl", children: React.ReactNode, className?: string }) => {
5
- const sizeMap: Record<string, string> = {
6
- xs: "editor-icon-xs",
7
- small: "editor-icon-sm",
8
- medium: "editor-icon-md",
9
- large: "editor-icon-lg",
10
- xl: "editor-icon-xl",
11
- sm: "editor-icon-sm",
12
- md: "editor-icon-md",
13
- lg: "editor-icon-lg",
14
- }
15
-
16
- if (React.isValidElement(children)) {
17
- return React.cloneElement(children as React.ReactElement<React.HTMLAttributes<HTMLElement>>, {
18
- className: cn(sizeMap[size] || sizeMap.medium, (children as React.ReactElement<React.HTMLAttributes<HTMLElement>>).props.className, className)
19
- })
20
- }
21
-
22
- return <>{children}</>
23
- }
24
-
25
- export const TypographyP = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(
26
- ({ className, ...props }, ref) => (
27
- <p ref={ref} className={cn("editor-typography-p", className)} {...props} />
28
- )
29
- )
30
- TypographyP.displayName = "TypographyP"
31
-
32
- export const TypographyPSmall = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(
33
- ({ className, ...props }, ref) => (
34
- <p ref={ref} className={cn("editor-typography-p-small", className)} {...props} />
35
- )
36
- )
37
- TypographyPSmall.displayName = "TypographyPSmall"
38
-
39
- export const TypographySpanSmallMuted = React.forwardRef<HTMLSpanElement, React.HTMLAttributes<HTMLSpanElement>>(
40
- ({ className, ...props }, ref) => (
41
- <span ref={ref} className={cn("editor-typography-span-small-muted", className)} {...props} />
42
- )
43
- )
44
- TypographySpanSmallMuted.displayName = "TypographySpanSmallMuted"
1
+ import * as React from "react"
2
+ import { cn } from "../lib/utils"
3
+
4
+ export const IconSize = ({ size = "medium", children, className }: { size?: "small" | "medium" | "large" | "sm" | "md" | "lg" | "xs" | "xl", children: React.ReactNode, className?: string }) => {
5
+ const sizeMap: Record<string, string> = {
6
+ xs: "editor-icon-xs",
7
+ small: "editor-icon-sm",
8
+ medium: "editor-icon-md",
9
+ large: "editor-icon-lg",
10
+ xl: "editor-icon-xl",
11
+ sm: "editor-icon-sm",
12
+ md: "editor-icon-md",
13
+ lg: "editor-icon-lg",
14
+ }
15
+
16
+ if (React.isValidElement(children)) {
17
+ return React.cloneElement(children as React.ReactElement<React.HTMLAttributes<HTMLElement>>, {
18
+ className: cn(sizeMap[size] || sizeMap.medium, (children as React.ReactElement<React.HTMLAttributes<HTMLElement>>).props.className, className)
19
+ })
20
+ }
21
+
22
+ return <>{children}</>
23
+ }
24
+
25
+ export const TypographyP = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(
26
+ ({ className, ...props }, ref) => (
27
+ <p ref={ref} className={cn("editor-typography-p", className)} {...props} />
28
+ )
29
+ )
30
+ TypographyP.displayName = "TypographyP"
31
+
32
+ export const TypographyPSmall = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(
33
+ ({ className, ...props }, ref) => (
34
+ <p ref={ref} className={cn("editor-typography-p-small", className)} {...props} />
35
+ )
36
+ )
37
+ TypographyPSmall.displayName = "TypographyPSmall"
38
+
39
+ export const TypographySpanSmallMuted = React.forwardRef<HTMLSpanElement, React.HTMLAttributes<HTMLSpanElement>>(
40
+ ({ className, ...props }, ref) => (
41
+ <span ref={ref} className={cn("editor-typography-span-small-muted", className)} {...props} />
42
+ )
43
+ )
44
+ TypographySpanSmallMuted.displayName = "TypographySpanSmallMuted"