notra-editor 0.3.0 → 0.5.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 (234) hide show
  1. package/README.md +4 -8
  2. package/dist/components/blockquote-button/blockquote-button.cjs +91 -0
  3. package/dist/components/blockquote-button/blockquote-button.cjs.map +1 -0
  4. package/dist/components/blockquote-button/blockquote-button.d.cts +9 -0
  5. package/dist/components/blockquote-button/blockquote-button.d.ts +9 -0
  6. package/dist/components/blockquote-button/blockquote-button.mjs +67 -0
  7. package/dist/components/blockquote-button/blockquote-button.mjs.map +1 -0
  8. package/dist/components/code-block-button/code-block-button.cjs +91 -0
  9. package/dist/components/code-block-button/code-block-button.cjs.map +1 -0
  10. package/dist/components/code-block-button/code-block-button.d.cts +9 -0
  11. package/dist/components/code-block-button/code-block-button.d.ts +9 -0
  12. package/dist/components/code-block-button/code-block-button.mjs +67 -0
  13. package/dist/components/code-block-button/code-block-button.mjs.map +1 -0
  14. package/dist/components/code-block-view.cjs +39 -0
  15. package/dist/components/code-block-view.cjs.map +1 -0
  16. package/dist/components/code-block-view.d.cts +12 -0
  17. package/dist/components/code-block-view.d.ts +12 -0
  18. package/dist/components/code-block-view.mjs +17 -0
  19. package/dist/components/code-block-view.mjs.map +1 -0
  20. package/dist/components/copy-button.cjs +49 -0
  21. package/dist/components/copy-button.cjs.map +1 -0
  22. package/dist/components/copy-button.d.cts +9 -0
  23. package/dist/components/copy-button.d.ts +9 -0
  24. package/dist/components/copy-button.mjs +25 -0
  25. package/dist/components/copy-button.mjs.map +1 -0
  26. package/dist/components/heading-dropdown-menu/heading-dropdown-menu.cjs +67 -0
  27. package/dist/components/heading-dropdown-menu/heading-dropdown-menu.cjs.map +1 -0
  28. package/dist/components/heading-dropdown-menu/heading-dropdown-menu.d.cts +17 -0
  29. package/dist/components/heading-dropdown-menu/heading-dropdown-menu.d.ts +17 -0
  30. package/dist/components/heading-dropdown-menu/heading-dropdown-menu.mjs +51 -0
  31. package/dist/components/heading-dropdown-menu/heading-dropdown-menu.mjs.map +1 -0
  32. package/dist/components/heading-dropdown-menu/heading-menu-item.cjs +56 -0
  33. package/dist/components/heading-dropdown-menu/heading-menu-item.cjs.map +1 -0
  34. package/dist/components/heading-dropdown-menu/heading-menu-item.d.cts +12 -0
  35. package/dist/components/heading-dropdown-menu/heading-menu-item.d.ts +12 -0
  36. package/dist/components/heading-dropdown-menu/heading-menu-item.mjs +32 -0
  37. package/dist/components/heading-dropdown-menu/heading-menu-item.mjs.map +1 -0
  38. package/dist/components/heading-dropdown-menu/use-heading.cjs +109 -0
  39. package/dist/components/heading-dropdown-menu/use-heading.cjs.map +1 -0
  40. package/dist/components/heading-dropdown-menu/use-heading.d.cts +19 -0
  41. package/dist/components/heading-dropdown-menu/use-heading.d.ts +19 -0
  42. package/dist/components/heading-dropdown-menu/use-heading.mjs +83 -0
  43. package/dist/components/heading-dropdown-menu/use-heading.mjs.map +1 -0
  44. package/dist/components/image-popover/image-popover.cjs +161 -0
  45. package/dist/components/image-popover/image-popover.cjs.map +1 -0
  46. package/dist/components/image-popover/image-popover.d.cts +9 -0
  47. package/dist/components/image-popover/image-popover.d.ts +9 -0
  48. package/dist/components/image-popover/image-popover.mjs +137 -0
  49. package/dist/components/image-popover/image-popover.mjs.map +1 -0
  50. package/dist/components/image-popover/use-image-popover.cjs +88 -0
  51. package/dist/components/image-popover/use-image-popover.cjs.map +1 -0
  52. package/dist/components/image-popover/use-image-popover.d.cts +19 -0
  53. package/dist/components/image-popover/use-image-popover.d.ts +19 -0
  54. package/dist/components/image-popover/use-image-popover.mjs +64 -0
  55. package/dist/components/image-popover/use-image-popover.mjs.map +1 -0
  56. package/dist/components/link-popover/link-popover.cjs +157 -0
  57. package/dist/components/link-popover/link-popover.cjs.map +1 -0
  58. package/dist/components/link-popover/link-popover.d.cts +9 -0
  59. package/dist/components/link-popover/link-popover.d.ts +9 -0
  60. package/dist/components/link-popover/link-popover.mjs +138 -0
  61. package/dist/components/link-popover/link-popover.mjs.map +1 -0
  62. package/dist/components/link-popover/use-link-popover.cjs +86 -0
  63. package/dist/components/link-popover/use-link-popover.cjs.map +1 -0
  64. package/dist/components/link-popover/use-link-popover.d.cts +18 -0
  65. package/dist/components/link-popover/use-link-popover.d.ts +18 -0
  66. package/dist/components/link-popover/use-link-popover.mjs +62 -0
  67. package/dist/components/link-popover/use-link-popover.mjs.map +1 -0
  68. package/dist/components/list-dropdown-menu/list-dropdown-menu.cjs +73 -0
  69. package/dist/components/list-dropdown-menu/list-dropdown-menu.cjs.map +1 -0
  70. package/dist/components/list-dropdown-menu/list-dropdown-menu.d.cts +17 -0
  71. package/dist/components/list-dropdown-menu/list-dropdown-menu.d.ts +17 -0
  72. package/dist/components/list-dropdown-menu/list-dropdown-menu.mjs +57 -0
  73. package/dist/components/list-dropdown-menu/list-dropdown-menu.mjs.map +1 -0
  74. package/dist/components/list-dropdown-menu/list-menu-item.cjs +56 -0
  75. package/dist/components/list-dropdown-menu/list-menu-item.cjs.map +1 -0
  76. package/dist/components/list-dropdown-menu/list-menu-item.d.cts +12 -0
  77. package/dist/components/list-dropdown-menu/list-menu-item.d.ts +12 -0
  78. package/dist/components/list-dropdown-menu/list-menu-item.mjs +32 -0
  79. package/dist/components/list-dropdown-menu/list-menu-item.mjs.map +1 -0
  80. package/dist/components/list-dropdown-menu/use-list.cjs +111 -0
  81. package/dist/components/list-dropdown-menu/use-list.cjs.map +1 -0
  82. package/dist/components/list-dropdown-menu/use-list.d.cts +19 -0
  83. package/dist/components/list-dropdown-menu/use-list.d.ts +19 -0
  84. package/dist/components/list-dropdown-menu/use-list.mjs +85 -0
  85. package/dist/components/list-dropdown-menu/use-list.mjs.map +1 -0
  86. package/dist/components/mark-button/mark-button.cjs +72 -0
  87. package/dist/components/mark-button/mark-button.cjs.map +1 -0
  88. package/dist/components/mark-button/mark-button.d.cts +12 -0
  89. package/dist/components/mark-button/mark-button.d.ts +12 -0
  90. package/dist/components/mark-button/mark-button.mjs +48 -0
  91. package/dist/components/mark-button/mark-button.mjs.map +1 -0
  92. package/dist/components/mark-button/use-mark.cjs +71 -0
  93. package/dist/components/mark-button/use-mark.cjs.map +1 -0
  94. package/dist/components/mark-button/use-mark.d.cts +17 -0
  95. package/dist/components/mark-button/use-mark.d.ts +17 -0
  96. package/dist/components/mark-button/use-mark.mjs +47 -0
  97. package/dist/components/mark-button/use-mark.mjs.map +1 -0
  98. package/dist/components/toolbar/toolbar.cjs +77 -0
  99. package/dist/components/toolbar/toolbar.cjs.map +1 -0
  100. package/dist/components/toolbar/toolbar.d.cts +14 -0
  101. package/dist/components/toolbar/toolbar.d.ts +14 -0
  102. package/dist/components/toolbar/toolbar.mjs +51 -0
  103. package/dist/components/toolbar/toolbar.mjs.map +1 -0
  104. package/dist/components/ui/button.cjs +82 -0
  105. package/dist/components/ui/button.cjs.map +1 -0
  106. package/dist/components/ui/button.d.cts +14 -0
  107. package/dist/components/ui/button.d.ts +14 -0
  108. package/dist/components/ui/button.mjs +57 -0
  109. package/dist/components/ui/button.mjs.map +1 -0
  110. package/dist/components/ui/dropdown-menu.cjs +290 -0
  111. package/dist/components/ui/dropdown-menu.cjs.map +1 -0
  112. package/dist/components/ui/dropdown-menu.d.cts +32 -0
  113. package/dist/components/ui/dropdown-menu.d.ts +32 -0
  114. package/dist/components/ui/dropdown-menu.mjs +252 -0
  115. package/dist/components/ui/dropdown-menu.mjs.map +1 -0
  116. package/dist/components/ui/input.cjs +44 -0
  117. package/dist/components/ui/input.cjs.map +1 -0
  118. package/dist/components/ui/input.d.cts +6 -0
  119. package/dist/components/ui/input.d.ts +6 -0
  120. package/dist/components/ui/input.mjs +20 -0
  121. package/dist/components/ui/input.mjs.map +1 -0
  122. package/dist/components/ui/popover.cjs +72 -0
  123. package/dist/components/ui/popover.cjs.map +1 -0
  124. package/dist/components/ui/popover.d.cts +10 -0
  125. package/dist/components/ui/popover.d.ts +10 -0
  126. package/dist/components/ui/popover.mjs +45 -0
  127. package/dist/components/ui/popover.mjs.map +1 -0
  128. package/dist/components/ui/separator.cjs +51 -0
  129. package/dist/components/ui/separator.cjs.map +1 -0
  130. package/dist/components/ui/separator.d.cts +7 -0
  131. package/dist/components/ui/separator.d.ts +7 -0
  132. package/dist/components/ui/separator.mjs +27 -0
  133. package/dist/components/ui/separator.mjs.map +1 -0
  134. package/dist/components/ui/spacer.cjs +32 -0
  135. package/dist/components/ui/spacer.cjs.map +1 -0
  136. package/dist/components/ui/spacer.d.cts +5 -0
  137. package/dist/components/ui/spacer.d.ts +5 -0
  138. package/dist/components/ui/spacer.mjs +8 -0
  139. package/dist/components/ui/spacer.mjs.map +1 -0
  140. package/dist/components/undo-redo-button/undo-redo-button.cjs +63 -0
  141. package/dist/components/undo-redo-button/undo-redo-button.cjs.map +1 -0
  142. package/dist/components/undo-redo-button/undo-redo-button.d.cts +12 -0
  143. package/dist/components/undo-redo-button/undo-redo-button.d.ts +12 -0
  144. package/dist/components/undo-redo-button/undo-redo-button.mjs +39 -0
  145. package/dist/components/undo-redo-button/undo-redo-button.mjs.map +1 -0
  146. package/dist/components/undo-redo-button/use-undo-redo.cjs +68 -0
  147. package/dist/components/undo-redo-button/use-undo-redo.cjs.map +1 -0
  148. package/dist/components/undo-redo-button/use-undo-redo.d.cts +17 -0
  149. package/dist/components/undo-redo-button/use-undo-redo.d.ts +17 -0
  150. package/dist/components/undo-redo-button/use-undo-redo.mjs +44 -0
  151. package/dist/components/undo-redo-button/use-undo-redo.mjs.map +1 -0
  152. package/dist/extensions/code-block.cjs +46 -0
  153. package/dist/extensions/code-block.cjs.map +1 -0
  154. package/dist/extensions/code-block.d.cts +6 -0
  155. package/dist/extensions/code-block.d.ts +6 -0
  156. package/dist/extensions/code-block.mjs +12 -0
  157. package/dist/extensions/code-block.mjs.map +1 -0
  158. package/dist/extensions/editor.cjs +55 -0
  159. package/dist/extensions/editor.cjs.map +1 -0
  160. package/dist/extensions/editor.d.cts +10 -0
  161. package/dist/extensions/editor.d.ts +10 -0
  162. package/dist/extensions/editor.mjs +21 -0
  163. package/dist/extensions/editor.mjs.map +1 -0
  164. package/dist/extensions/index.cjs +32 -0
  165. package/dist/extensions/index.cjs.map +1 -0
  166. package/dist/extensions/index.d.cts +8 -0
  167. package/dist/extensions/index.d.ts +8 -0
  168. package/dist/extensions/index.mjs +7 -0
  169. package/dist/extensions/index.mjs.map +1 -0
  170. package/dist/extensions/shared.cjs +66 -0
  171. package/dist/extensions/shared.cjs.map +1 -0
  172. package/dist/extensions/shared.d.cts +9 -0
  173. package/dist/extensions/shared.d.ts +9 -0
  174. package/dist/extensions/shared.mjs +31 -0
  175. package/dist/extensions/shared.mjs.map +1 -0
  176. package/dist/hooks/use-copy-to-clipboard.cjs +50 -0
  177. package/dist/hooks/use-copy-to-clipboard.cjs.map +1 -0
  178. package/dist/hooks/use-copy-to-clipboard.d.cts +10 -0
  179. package/dist/hooks/use-copy-to-clipboard.d.ts +10 -0
  180. package/dist/hooks/use-copy-to-clipboard.mjs +26 -0
  181. package/dist/hooks/use-copy-to-clipboard.mjs.map +1 -0
  182. package/dist/hooks/use-markdown-editor.cjs +80 -0
  183. package/dist/hooks/use-markdown-editor.cjs.map +1 -0
  184. package/dist/hooks/use-markdown-editor.d.cts +13 -0
  185. package/dist/hooks/use-markdown-editor.d.ts +13 -0
  186. package/dist/hooks/use-markdown-editor.mjs +56 -0
  187. package/dist/hooks/use-markdown-editor.mjs.map +1 -0
  188. package/dist/icons/redo-icon.cjs +54 -0
  189. package/dist/icons/redo-icon.cjs.map +1 -0
  190. package/dist/icons/redo-icon.d.cts +7 -0
  191. package/dist/icons/redo-icon.d.ts +7 -0
  192. package/dist/icons/redo-icon.mjs +30 -0
  193. package/dist/icons/redo-icon.mjs.map +1 -0
  194. package/dist/icons/undo-icon.cjs +54 -0
  195. package/dist/icons/undo-icon.cjs.map +1 -0
  196. package/dist/icons/undo-icon.d.cts +7 -0
  197. package/dist/icons/undo-icon.d.ts +7 -0
  198. package/dist/icons/undo-icon.mjs +30 -0
  199. package/dist/icons/undo-icon.mjs.map +1 -0
  200. package/dist/index.cjs +27 -1322
  201. package/dist/index.cjs.map +1 -1
  202. package/dist/index.d.cts +23 -105
  203. package/dist/index.d.ts +23 -105
  204. package/dist/index.mjs +16 -1301
  205. package/dist/index.mjs.map +1 -1
  206. package/dist/lib/utils.cjs +33 -0
  207. package/dist/lib/utils.cjs.map +1 -0
  208. package/dist/lib/utils.d.cts +5 -0
  209. package/dist/lib/utils.d.ts +5 -0
  210. package/dist/lib/utils.mjs +9 -0
  211. package/dist/lib/utils.mjs.map +1 -0
  212. package/dist/notra-editor.cjs +90 -0
  213. package/dist/notra-editor.cjs.map +1 -0
  214. package/dist/notra-editor.d.cts +17 -0
  215. package/dist/notra-editor.d.ts +17 -0
  216. package/dist/notra-editor.mjs +70 -0
  217. package/dist/notra-editor.mjs.map +1 -0
  218. package/dist/notra-reader.cjs +47 -0
  219. package/dist/notra-reader.cjs.map +1 -0
  220. package/dist/notra-reader.d.cts +11 -0
  221. package/dist/notra-reader.d.ts +11 -0
  222. package/dist/notra-reader.mjs +23 -0
  223. package/dist/notra-reader.mjs.map +1 -0
  224. package/dist/styles/globals.css +32 -0
  225. package/dist/themes/default/editor.css +2 -0
  226. package/dist/themes/default/reader.css +2 -0
  227. package/dist/themes/default/shared.css +18 -0
  228. package/dist/utils/markdown-to-json.cjs +50 -0
  229. package/dist/utils/markdown-to-json.cjs.map +1 -0
  230. package/dist/utils/markdown-to-json.d.cts +7 -0
  231. package/dist/utils/markdown-to-json.d.ts +7 -0
  232. package/dist/utils/markdown-to-json.mjs +26 -0
  233. package/dist/utils/markdown-to-json.mjs.map +1 -0
  234. package/package.json +3 -1
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var link_popover_exports = {};
21
+ __export(link_popover_exports, {
22
+ LinkPopover: () => LinkPopover
23
+ });
24
+ module.exports = __toCommonJS(link_popover_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_lucide_react = require("lucide-react");
27
+ var import_react = require("react");
28
+ var import_use_link_popover = require("./use-link-popover");
29
+ var import_button = require("../ui/button");
30
+ var import_input = require("../ui/input");
31
+ var import_popover = require("../ui/popover");
32
+ var import_separator = require("../ui/separator");
33
+ const LinkPopover = (0, import_react.forwardRef)(
34
+ ({ editor, ...buttonProps }, ref) => {
35
+ const [isOpen, setIsOpen] = (0, import_react.useState)(false);
36
+ const {
37
+ url,
38
+ setUrl,
39
+ isActive,
40
+ canSet,
41
+ setLink,
42
+ removeLink,
43
+ openLink,
44
+ wasSelectionMove
45
+ } = (0, import_use_link_popover.useLinkPopover)({ editor });
46
+ (0, import_react.useEffect)(() => {
47
+ if (isActive && wasSelectionMove) {
48
+ setIsOpen(true);
49
+ }
50
+ }, [isActive, wasSelectionMove]);
51
+ const handleSetLink = (0, import_react.useCallback)(() => {
52
+ setLink();
53
+ setIsOpen(false);
54
+ }, [setLink]);
55
+ const handleRemoveLink = (0, import_react.useCallback)(() => {
56
+ removeLink();
57
+ setIsOpen(false);
58
+ }, [removeLink]);
59
+ const handleKeyDown = (0, import_react.useCallback)(
60
+ (event) => {
61
+ if (event.key === "Enter") {
62
+ event.preventDefault();
63
+ handleSetLink();
64
+ }
65
+ },
66
+ [handleSetLink]
67
+ );
68
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_popover.Popover, { open: isOpen, onOpenChange: setIsOpen, children: [
69
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_popover.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
70
+ import_button.Button,
71
+ {
72
+ ref,
73
+ "aria-label": "Link",
74
+ "aria-pressed": isActive,
75
+ "data-active-state": isActive ? "on" : "off",
76
+ disabled: !canSet,
77
+ size: "icon",
78
+ tabIndex: -1,
79
+ type: "button",
80
+ variant: "ghost",
81
+ ...buttonProps,
82
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
83
+ import_lucide_react.Link,
84
+ {
85
+ className: isActive ? "nt:text-[var(--tt-brand-color-500)]" : void 0
86
+ }
87
+ )
88
+ }
89
+ ) }),
90
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
91
+ import_popover.PopoverContent,
92
+ {
93
+ align: "start",
94
+ className: "nt:flex nt:w-auto nt:items-center nt:gap-1 nt:p-1",
95
+ children: [
96
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
97
+ import_input.Input,
98
+ {
99
+ autoFocus: true,
100
+ className: "nt:h-7 nt:min-w-48 nt:border-none nt:shadow-none nt:focus-visible:ring-0",
101
+ placeholder: "Paste a link...",
102
+ type: "url",
103
+ value: url,
104
+ onChange: (e) => setUrl(e.target.value),
105
+ onKeyDown: handleKeyDown
106
+ }
107
+ ),
108
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
109
+ import_button.Button,
110
+ {
111
+ "aria-label": "Apply link",
112
+ disabled: !url && !isActive,
113
+ size: "icon-sm",
114
+ tabIndex: -1,
115
+ type: "button",
116
+ variant: "ghost",
117
+ onClick: handleSetLink,
118
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.CornerDownLeft, {})
119
+ }
120
+ ),
121
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_separator.Separator, { className: "nt:h-5", orientation: "vertical" }),
122
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
123
+ import_button.Button,
124
+ {
125
+ "aria-label": "Open link in new window",
126
+ size: "icon-sm",
127
+ tabIndex: -1,
128
+ type: "button",
129
+ variant: "ghost",
130
+ onClick: openLink,
131
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ExternalLink, {})
132
+ }
133
+ ),
134
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
135
+ import_button.Button,
136
+ {
137
+ "aria-label": "Remove link",
138
+ size: "icon-sm",
139
+ tabIndex: -1,
140
+ type: "button",
141
+ variant: "ghost",
142
+ onClick: handleRemoveLink,
143
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.Trash2, {})
144
+ }
145
+ )
146
+ ]
147
+ }
148
+ )
149
+ ] });
150
+ }
151
+ );
152
+ LinkPopover.displayName = "LinkPopover";
153
+ // Annotate the CommonJS export names for ESM import in node:
154
+ 0 && (module.exports = {
155
+ LinkPopover
156
+ });
157
+ //# sourceMappingURL=link-popover.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/link-popover/link-popover.tsx"],"sourcesContent":["'use client';\n\nimport {\n\tCornerDownLeft,\n\tExternalLink,\n\tLink as LinkIcon,\n\tTrash2\n} from 'lucide-react';\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\n\nimport { useLinkPopover } from './use-link-popover';\nimport { Button } from '../ui/button';\nimport { Input } from '../ui/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { Separator } from '../ui/separator';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface LinkPopoverProps extends Omit<\n\tReact.ButtonHTMLAttributes<HTMLButtonElement>,\n\t'type'\n> {\n\teditor: Editor | null;\n}\n\nexport const LinkPopover = forwardRef<HTMLButtonElement, LinkPopoverProps>(\n\t({ editor, ...buttonProps }, ref) => {\n\t\tconst [isOpen, setIsOpen] = useState(false);\n\n\t\tconst {\n\t\t\turl,\n\t\t\tsetUrl,\n\t\t\tisActive,\n\t\t\tcanSet,\n\t\t\tsetLink,\n\t\t\tremoveLink,\n\t\t\topenLink,\n\t\t\twasSelectionMove\n\t\t} = useLinkPopover({ editor });\n\n\t\t// Auto-open popover when cursor moves onto an existing link (selection-only transaction)\n\t\tuseEffect(() => {\n\t\t\tif (isActive && wasSelectionMove) {\n\t\t\t\tsetIsOpen(true);\n\t\t\t}\n\t\t}, [isActive, wasSelectionMove]);\n\n\t\tconst handleSetLink = useCallback(() => {\n\t\t\tsetLink();\n\t\t\tsetIsOpen(false);\n\t\t}, [setLink]);\n\n\t\tconst handleRemoveLink = useCallback(() => {\n\t\t\tremoveLink();\n\t\t\tsetIsOpen(false);\n\t\t}, [removeLink]);\n\n\t\tconst handleKeyDown = useCallback(\n\t\t\t(event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\t\tif (event.key === 'Enter') {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\thandleSetLink();\n\t\t\t\t}\n\t\t\t},\n\t\t\t[handleSetLink]\n\t\t);\n\n\t\treturn (\n\t\t\t<Popover open={isOpen} onOpenChange={setIsOpen}>\n\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\taria-label=\"Link\"\n\t\t\t\t\t\taria-pressed={isActive}\n\t\t\t\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\t\t\t\tdisabled={!canSet}\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t{...buttonProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t<LinkIcon\n\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\tisActive ? 'nt:text-[var(--tt-brand-color-500)]' : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Button>\n\t\t\t\t</PopoverTrigger>\n\t\t\t\t<PopoverContent\n\t\t\t\t\talign=\"start\"\n\t\t\t\t\tclassName=\"nt:flex nt:w-auto nt:items-center nt:gap-1 nt:p-1\"\n\t\t\t\t>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tclassName=\"nt:h-7 nt:min-w-48 nt:border-none nt:shadow-none nt:focus-visible:ring-0\"\n\t\t\t\t\t\tplaceholder=\"Paste a link...\"\n\t\t\t\t\t\ttype=\"url\"\n\t\t\t\t\t\tvalue={url}\n\t\t\t\t\t\tonChange={(e) => setUrl(e.target.value)}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t/>\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Apply link\"\n\t\t\t\t\t\tdisabled={!url && !isActive}\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tonClick={handleSetLink}\n\t\t\t\t\t>\n\t\t\t\t\t\t<CornerDownLeft />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Separator className=\"nt:h-5\" orientation=\"vertical\" />\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Open link in new window\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tonClick={openLink}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ExternalLink />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Remove link\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tonClick={handleRemoveLink}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trash2 />\n\t\t\t\t\t</Button>\n\t\t\t\t</PopoverContent>\n\t\t\t</Popover>\n\t\t);\n\t}\n);\n\nLinkPopover.displayName = 'LinkPopover';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAkFM;AAhFN,0BAKO;AACP,mBAA6D;AAE7D,8BAA+B;AAC/B,oBAAuB;AACvB,mBAAsB;AACtB,qBAAwD;AACxD,uBAA0B;AAWnB,MAAM,kBAAc;AAAA,EAC1B,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ;AACpC,UAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAE1C,UAAM;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,QAAI,wCAAe,EAAE,OAAO,CAAC;AAG7B,gCAAU,MAAM;AACf,UAAI,YAAY,kBAAkB;AACjC,kBAAU,IAAI;AAAA,MACf;AAAA,IACD,GAAG,CAAC,UAAU,gBAAgB,CAAC;AAE/B,UAAM,oBAAgB,0BAAY,MAAM;AACvC,cAAQ;AACR,gBAAU,KAAK;AAAA,IAChB,GAAG,CAAC,OAAO,CAAC;AAEZ,UAAM,uBAAmB,0BAAY,MAAM;AAC1C,iBAAW;AACX,gBAAU,KAAK;AAAA,IAChB,GAAG,CAAC,UAAU,CAAC;AAEf,UAAM,oBAAgB;AAAA,MACrB,CAAC,UAAiD;AACjD,YAAI,MAAM,QAAQ,SAAS;AAC1B,gBAAM,eAAe;AACrB,wBAAc;AAAA,QACf;AAAA,MACD;AAAA,MACA,CAAC,aAAa;AAAA,IACf;AAEA,WACC,6CAAC,0BAAQ,MAAM,QAAQ,cAAc,WACpC;AAAA,kDAAC,iCAAe,SAAO,MACtB;AAAA,QAAC;AAAA;AAAA,UACA;AAAA,UACA,cAAW;AAAA,UACX,gBAAc;AAAA,UACd,qBAAmB,WAAW,OAAO;AAAA,UACrC,UAAU,CAAC;AAAA,UACX,MAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAK;AAAA,UACL,SAAQ;AAAA,UACP,GAAG;AAAA,UAEJ;AAAA,YAAC,oBAAAA;AAAA,YAAA;AAAA,cACA,WACC,WAAW,wCAAwC;AAAA;AAAA,UAErD;AAAA;AAAA,MACD,GACD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACA,OAAM;AAAA,UACN,WAAU;AAAA,UAEV;AAAA;AAAA,cAAC;AAAA;AAAA,gBACA,WAAS;AAAA,gBACT,WAAU;AAAA,gBACV,aAAY;AAAA,gBACZ,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,gBACtC,WAAW;AAAA;AAAA,YACZ;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACA,cAAW;AAAA,gBACX,UAAU,CAAC,OAAO,CAAC;AAAA,gBACnB,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,SAAS;AAAA,gBAET,sDAAC,sCAAe;AAAA;AAAA,YACjB;AAAA,YACA,4CAAC,8BAAU,WAAU,UAAS,aAAY,YAAW;AAAA,YACrD;AAAA,cAAC;AAAA;AAAA,gBACA,cAAW;AAAA,gBACX,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,SAAS;AAAA,gBAET,sDAAC,oCAAa;AAAA;AAAA,YACf;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACA,cAAW;AAAA,gBACX,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,SAAS;AAAA,gBAET,sDAAC,8BAAO;AAAA;AAAA,YACT;AAAA;AAAA;AAAA,MACD;AAAA,OACD;AAAA,EAEF;AACD;AAEA,YAAY,cAAc;","names":["LinkIcon"]}
@@ -0,0 +1,9 @@
1
+ import * as react from 'react';
2
+ import { Editor } from '@tiptap/core';
3
+
4
+ interface LinkPopoverProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
5
+ editor: Editor | null;
6
+ }
7
+ declare const LinkPopover: react.ForwardRefExoticComponent<LinkPopoverProps & react.RefAttributes<HTMLButtonElement>>;
8
+
9
+ export { LinkPopover, type LinkPopoverProps };
@@ -0,0 +1,9 @@
1
+ import * as react from 'react';
2
+ import { Editor } from '@tiptap/core';
3
+
4
+ interface LinkPopoverProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> {
5
+ editor: Editor | null;
6
+ }
7
+ declare const LinkPopover: react.ForwardRefExoticComponent<LinkPopoverProps & react.RefAttributes<HTMLButtonElement>>;
8
+
9
+ export { LinkPopover, type LinkPopoverProps };
@@ -0,0 +1,138 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import {
4
+ CornerDownLeft,
5
+ ExternalLink,
6
+ Link as LinkIcon,
7
+ Trash2
8
+ } from "lucide-react";
9
+ import { forwardRef, useCallback, useEffect, useState } from "react";
10
+ import { useLinkPopover } from "./use-link-popover";
11
+ import { Button } from "../ui/button";
12
+ import { Input } from "../ui/input";
13
+ import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover";
14
+ import { Separator } from "../ui/separator";
15
+ const LinkPopover = forwardRef(
16
+ ({ editor, ...buttonProps }, ref) => {
17
+ const [isOpen, setIsOpen] = useState(false);
18
+ const {
19
+ url,
20
+ setUrl,
21
+ isActive,
22
+ canSet,
23
+ setLink,
24
+ removeLink,
25
+ openLink,
26
+ wasSelectionMove
27
+ } = useLinkPopover({ editor });
28
+ useEffect(() => {
29
+ if (isActive && wasSelectionMove) {
30
+ setIsOpen(true);
31
+ }
32
+ }, [isActive, wasSelectionMove]);
33
+ const handleSetLink = useCallback(() => {
34
+ setLink();
35
+ setIsOpen(false);
36
+ }, [setLink]);
37
+ const handleRemoveLink = useCallback(() => {
38
+ removeLink();
39
+ setIsOpen(false);
40
+ }, [removeLink]);
41
+ const handleKeyDown = useCallback(
42
+ (event) => {
43
+ if (event.key === "Enter") {
44
+ event.preventDefault();
45
+ handleSetLink();
46
+ }
47
+ },
48
+ [handleSetLink]
49
+ );
50
+ return /* @__PURE__ */ jsxs(Popover, { open: isOpen, onOpenChange: setIsOpen, children: [
51
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsx(
52
+ Button,
53
+ {
54
+ ref,
55
+ "aria-label": "Link",
56
+ "aria-pressed": isActive,
57
+ "data-active-state": isActive ? "on" : "off",
58
+ disabled: !canSet,
59
+ size: "icon",
60
+ tabIndex: -1,
61
+ type: "button",
62
+ variant: "ghost",
63
+ ...buttonProps,
64
+ children: /* @__PURE__ */ jsx(
65
+ LinkIcon,
66
+ {
67
+ className: isActive ? "nt:text-[var(--tt-brand-color-500)]" : void 0
68
+ }
69
+ )
70
+ }
71
+ ) }),
72
+ /* @__PURE__ */ jsxs(
73
+ PopoverContent,
74
+ {
75
+ align: "start",
76
+ className: "nt:flex nt:w-auto nt:items-center nt:gap-1 nt:p-1",
77
+ children: [
78
+ /* @__PURE__ */ jsx(
79
+ Input,
80
+ {
81
+ autoFocus: true,
82
+ className: "nt:h-7 nt:min-w-48 nt:border-none nt:shadow-none nt:focus-visible:ring-0",
83
+ placeholder: "Paste a link...",
84
+ type: "url",
85
+ value: url,
86
+ onChange: (e) => setUrl(e.target.value),
87
+ onKeyDown: handleKeyDown
88
+ }
89
+ ),
90
+ /* @__PURE__ */ jsx(
91
+ Button,
92
+ {
93
+ "aria-label": "Apply link",
94
+ disabled: !url && !isActive,
95
+ size: "icon-sm",
96
+ tabIndex: -1,
97
+ type: "button",
98
+ variant: "ghost",
99
+ onClick: handleSetLink,
100
+ children: /* @__PURE__ */ jsx(CornerDownLeft, {})
101
+ }
102
+ ),
103
+ /* @__PURE__ */ jsx(Separator, { className: "nt:h-5", orientation: "vertical" }),
104
+ /* @__PURE__ */ jsx(
105
+ Button,
106
+ {
107
+ "aria-label": "Open link in new window",
108
+ size: "icon-sm",
109
+ tabIndex: -1,
110
+ type: "button",
111
+ variant: "ghost",
112
+ onClick: openLink,
113
+ children: /* @__PURE__ */ jsx(ExternalLink, {})
114
+ }
115
+ ),
116
+ /* @__PURE__ */ jsx(
117
+ Button,
118
+ {
119
+ "aria-label": "Remove link",
120
+ size: "icon-sm",
121
+ tabIndex: -1,
122
+ type: "button",
123
+ variant: "ghost",
124
+ onClick: handleRemoveLink,
125
+ children: /* @__PURE__ */ jsx(Trash2, {})
126
+ }
127
+ )
128
+ ]
129
+ }
130
+ )
131
+ ] });
132
+ }
133
+ );
134
+ LinkPopover.displayName = "LinkPopover";
135
+ export {
136
+ LinkPopover
137
+ };
138
+ //# sourceMappingURL=link-popover.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/link-popover/link-popover.tsx"],"sourcesContent":["'use client';\n\nimport {\n\tCornerDownLeft,\n\tExternalLink,\n\tLink as LinkIcon,\n\tTrash2\n} from 'lucide-react';\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\n\nimport { useLinkPopover } from './use-link-popover';\nimport { Button } from '../ui/button';\nimport { Input } from '../ui/input';\nimport { Popover, PopoverContent, PopoverTrigger } from '../ui/popover';\nimport { Separator } from '../ui/separator';\n\nimport type { Editor } from '@tiptap/core';\n\nexport interface LinkPopoverProps extends Omit<\n\tReact.ButtonHTMLAttributes<HTMLButtonElement>,\n\t'type'\n> {\n\teditor: Editor | null;\n}\n\nexport const LinkPopover = forwardRef<HTMLButtonElement, LinkPopoverProps>(\n\t({ editor, ...buttonProps }, ref) => {\n\t\tconst [isOpen, setIsOpen] = useState(false);\n\n\t\tconst {\n\t\t\turl,\n\t\t\tsetUrl,\n\t\t\tisActive,\n\t\t\tcanSet,\n\t\t\tsetLink,\n\t\t\tremoveLink,\n\t\t\topenLink,\n\t\t\twasSelectionMove\n\t\t} = useLinkPopover({ editor });\n\n\t\t// Auto-open popover when cursor moves onto an existing link (selection-only transaction)\n\t\tuseEffect(() => {\n\t\t\tif (isActive && wasSelectionMove) {\n\t\t\t\tsetIsOpen(true);\n\t\t\t}\n\t\t}, [isActive, wasSelectionMove]);\n\n\t\tconst handleSetLink = useCallback(() => {\n\t\t\tsetLink();\n\t\t\tsetIsOpen(false);\n\t\t}, [setLink]);\n\n\t\tconst handleRemoveLink = useCallback(() => {\n\t\t\tremoveLink();\n\t\t\tsetIsOpen(false);\n\t\t}, [removeLink]);\n\n\t\tconst handleKeyDown = useCallback(\n\t\t\t(event: React.KeyboardEvent<HTMLInputElement>) => {\n\t\t\t\tif (event.key === 'Enter') {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\thandleSetLink();\n\t\t\t\t}\n\t\t\t},\n\t\t\t[handleSetLink]\n\t\t);\n\n\t\treturn (\n\t\t\t<Popover open={isOpen} onOpenChange={setIsOpen}>\n\t\t\t\t<PopoverTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\taria-label=\"Link\"\n\t\t\t\t\t\taria-pressed={isActive}\n\t\t\t\t\t\tdata-active-state={isActive ? 'on' : 'off'}\n\t\t\t\t\t\tdisabled={!canSet}\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t{...buttonProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t<LinkIcon\n\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\tisActive ? 'nt:text-[var(--tt-brand-color-500)]' : undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Button>\n\t\t\t\t</PopoverTrigger>\n\t\t\t\t<PopoverContent\n\t\t\t\t\talign=\"start\"\n\t\t\t\t\tclassName=\"nt:flex nt:w-auto nt:items-center nt:gap-1 nt:p-1\"\n\t\t\t\t>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\tclassName=\"nt:h-7 nt:min-w-48 nt:border-none nt:shadow-none nt:focus-visible:ring-0\"\n\t\t\t\t\t\tplaceholder=\"Paste a link...\"\n\t\t\t\t\t\ttype=\"url\"\n\t\t\t\t\t\tvalue={url}\n\t\t\t\t\t\tonChange={(e) => setUrl(e.target.value)}\n\t\t\t\t\t\tonKeyDown={handleKeyDown}\n\t\t\t\t\t/>\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Apply link\"\n\t\t\t\t\t\tdisabled={!url && !isActive}\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tonClick={handleSetLink}\n\t\t\t\t\t>\n\t\t\t\t\t\t<CornerDownLeft />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Separator className=\"nt:h-5\" orientation=\"vertical\" />\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Open link in new window\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tonClick={openLink}\n\t\t\t\t\t>\n\t\t\t\t\t\t<ExternalLink />\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\taria-label=\"Remove link\"\n\t\t\t\t\t\tsize=\"icon-sm\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tonClick={handleRemoveLink}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trash2 />\n\t\t\t\t\t</Button>\n\t\t\t\t</PopoverContent>\n\t\t\t</Popover>\n\t\t);\n\t}\n);\n\nLinkPopover.displayName = 'LinkPopover';\n"],"mappings":";AAkFM,cAOF,YAPE;AAhFN;AAAA,EACC;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,OACM;AACP,SAAS,YAAY,aAAa,WAAW,gBAAgB;AAE7D,SAAS,sBAAsB;AAC/B,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,SAAS,gBAAgB,sBAAsB;AACxD,SAAS,iBAAiB;AAWnB,MAAM,cAAc;AAAA,EAC1B,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,QAAQ;AACpC,UAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAE1C,UAAM;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,IAAI,eAAe,EAAE,OAAO,CAAC;AAG7B,cAAU,MAAM;AACf,UAAI,YAAY,kBAAkB;AACjC,kBAAU,IAAI;AAAA,MACf;AAAA,IACD,GAAG,CAAC,UAAU,gBAAgB,CAAC;AAE/B,UAAM,gBAAgB,YAAY,MAAM;AACvC,cAAQ;AACR,gBAAU,KAAK;AAAA,IAChB,GAAG,CAAC,OAAO,CAAC;AAEZ,UAAM,mBAAmB,YAAY,MAAM;AAC1C,iBAAW;AACX,gBAAU,KAAK;AAAA,IAChB,GAAG,CAAC,UAAU,CAAC;AAEf,UAAM,gBAAgB;AAAA,MACrB,CAAC,UAAiD;AACjD,YAAI,MAAM,QAAQ,SAAS;AAC1B,gBAAM,eAAe;AACrB,wBAAc;AAAA,QACf;AAAA,MACD;AAAA,MACA,CAAC,aAAa;AAAA,IACf;AAEA,WACC,qBAAC,WAAQ,MAAM,QAAQ,cAAc,WACpC;AAAA,0BAAC,kBAAe,SAAO,MACtB;AAAA,QAAC;AAAA;AAAA,UACA;AAAA,UACA,cAAW;AAAA,UACX,gBAAc;AAAA,UACd,qBAAmB,WAAW,OAAO;AAAA,UACrC,UAAU,CAAC;AAAA,UACX,MAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAK;AAAA,UACL,SAAQ;AAAA,UACP,GAAG;AAAA,UAEJ;AAAA,YAAC;AAAA;AAAA,cACA,WACC,WAAW,wCAAwC;AAAA;AAAA,UAErD;AAAA;AAAA,MACD,GACD;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACA,OAAM;AAAA,UACN,WAAU;AAAA,UAEV;AAAA;AAAA,cAAC;AAAA;AAAA,gBACA,WAAS;AAAA,gBACT,WAAU;AAAA,gBACV,aAAY;AAAA,gBACZ,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,OAAO,EAAE,OAAO,KAAK;AAAA,gBACtC,WAAW;AAAA;AAAA,YACZ;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACA,cAAW;AAAA,gBACX,UAAU,CAAC,OAAO,CAAC;AAAA,gBACnB,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,SAAS;AAAA,gBAET,8BAAC,kBAAe;AAAA;AAAA,YACjB;AAAA,YACA,oBAAC,aAAU,WAAU,UAAS,aAAY,YAAW;AAAA,YACrD;AAAA,cAAC;AAAA;AAAA,gBACA,cAAW;AAAA,gBACX,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,SAAS;AAAA,gBAET,8BAAC,gBAAa;AAAA;AAAA,YACf;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACA,cAAW;AAAA,gBACX,MAAK;AAAA,gBACL,UAAU;AAAA,gBACV,MAAK;AAAA,gBACL,SAAQ;AAAA,gBACR,SAAS;AAAA,gBAET,8BAAC,UAAO;AAAA;AAAA,YACT;AAAA;AAAA;AAAA,MACD;AAAA,OACD;AAAA,EAEF;AACD;AAEA,YAAY,cAAc;","names":[]}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var use_link_popover_exports = {};
20
+ __export(use_link_popover_exports, {
21
+ useLinkPopover: () => useLinkPopover
22
+ });
23
+ module.exports = __toCommonJS(use_link_popover_exports);
24
+ var import_react = require("react");
25
+ function useLinkPopover({ editor }) {
26
+ const [url, setUrl] = (0, import_react.useState)("");
27
+ const [isActive, setIsActive] = (0, import_react.useState)(false);
28
+ const [canSet, setCanSet] = (0, import_react.useState)(false);
29
+ const [wasSelectionMove, setWasSelectionMove] = (0, import_react.useState)(false);
30
+ (0, import_react.useEffect)(() => {
31
+ if (!editor) return;
32
+ const handleUpdate = ({
33
+ transaction
34
+ } = {}) => {
35
+ const active = editor.isActive("link");
36
+ setIsActive(active);
37
+ setCanSet(editor.isEditable);
38
+ if (transaction) {
39
+ setWasSelectionMove(!transaction.docChanged);
40
+ }
41
+ if (active) {
42
+ setUrl(editor.getAttributes("link").href ?? "");
43
+ }
44
+ };
45
+ handleUpdate();
46
+ editor.on("selectionUpdate", handleUpdate);
47
+ editor.on("transaction", handleUpdate);
48
+ return () => {
49
+ editor.off("selectionUpdate", handleUpdate);
50
+ editor.off("transaction", handleUpdate);
51
+ };
52
+ }, [editor]);
53
+ const setLink = (0, import_react.useCallback)(() => {
54
+ if (!editor) return;
55
+ if (!url) {
56
+ editor.chain().focus().extendMarkRange("link").unsetLink().run();
57
+ return;
58
+ }
59
+ editor.chain().focus().extendMarkRange("link").setLink({ href: url }).run();
60
+ }, [editor, url]);
61
+ const removeLink = (0, import_react.useCallback)(() => {
62
+ if (!editor) return;
63
+ editor.chain().focus().extendMarkRange("link").unsetLink().run();
64
+ setUrl("");
65
+ }, [editor]);
66
+ const openLink = (0, import_react.useCallback)(() => {
67
+ if (!url) return;
68
+ const sanitized = /^https?:\/\//i.test(url) ? url : `https://${url}`;
69
+ window.open(sanitized, "_blank", "noopener,noreferrer");
70
+ }, [url]);
71
+ return {
72
+ url,
73
+ setUrl,
74
+ isActive,
75
+ canSet,
76
+ setLink,
77
+ removeLink,
78
+ openLink,
79
+ wasSelectionMove
80
+ };
81
+ }
82
+ // Annotate the CommonJS export names for ESM import in node:
83
+ 0 && (module.exports = {
84
+ useLinkPopover
85
+ });
86
+ //# sourceMappingURL=use-link-popover.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/link-popover/use-link-popover.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nimport type { Editor } from '@tiptap/core';\nimport type { Transaction } from '@tiptap/pm/state';\n\nexport interface UseLinkPopoverConfig {\n\teditor: Editor | null;\n}\n\nexport function useLinkPopover({ editor }: UseLinkPopoverConfig) {\n\tconst [url, setUrl] = useState('');\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canSet, setCanSet] = useState(false);\n\tconst [wasSelectionMove, setWasSelectionMove] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = ({\n\t\t\ttransaction\n\t\t}: { transaction?: Transaction } = {}) => {\n\t\t\tconst active = editor.isActive('link');\n\n\t\t\tsetIsActive(active);\n\t\t\tsetCanSet(editor.isEditable);\n\n\t\t\tif (transaction) {\n\t\t\t\tsetWasSelectionMove(!transaction.docChanged);\n\t\t\t}\n\n\t\t\tif (active) {\n\t\t\t\tsetUrl(editor.getAttributes('link').href ?? '');\n\t\t\t}\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor]);\n\n\tconst setLink = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\tif (!url) {\n\t\t\teditor.chain().focus().extendMarkRange('link').unsetLink().run();\n\n\t\t\treturn;\n\t\t}\n\n\t\teditor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n\t}, [editor, url]);\n\n\tconst removeLink = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\teditor.chain().focus().extendMarkRange('link').unsetLink().run();\n\t\tsetUrl('');\n\t}, [editor]);\n\n\tconst openLink = useCallback(() => {\n\t\tif (!url) return;\n\n\t\tconst sanitized = /^https?:\\/\\//i.test(url) ? url : `https://${url}`;\n\n\t\twindow.open(sanitized, '_blank', 'noopener,noreferrer');\n\t}, [url]);\n\n\treturn {\n\t\turl,\n\t\tsetUrl,\n\t\tisActive,\n\t\tcanSet,\n\t\tsetLink,\n\t\tremoveLink,\n\t\topenLink,\n\t\twasSelectionMove\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAiD;AAS1C,SAAS,eAAe,EAAE,OAAO,GAAyB;AAChE,QAAM,CAAC,KAAK,MAAM,QAAI,uBAAS,EAAE;AACjC,QAAM,CAAC,UAAU,WAAW,QAAI,uBAAS,KAAK;AAC9C,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,KAAK;AAC1C,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,uBAAS,KAAK;AAE9D,8BAAU,MAAM;AACf,QAAI,CAAC,OAAQ;AAEb,UAAM,eAAe,CAAC;AAAA,MACrB;AAAA,IACD,IAAmC,CAAC,MAAM;AACzC,YAAM,SAAS,OAAO,SAAS,MAAM;AAErC,kBAAY,MAAM;AAClB,gBAAU,OAAO,UAAU;AAE3B,UAAI,aAAa;AAChB,4BAAoB,CAAC,YAAY,UAAU;AAAA,MAC5C;AAEA,UAAI,QAAQ;AACX,eAAO,OAAO,cAAc,MAAM,EAAE,QAAQ,EAAE;AAAA,MAC/C;AAAA,IACD;AAEA,iBAAa;AAEb,WAAO,GAAG,mBAAmB,YAAY;AACzC,WAAO,GAAG,eAAe,YAAY;AAErC,WAAO,MAAM;AACZ,aAAO,IAAI,mBAAmB,YAAY;AAC1C,aAAO,IAAI,eAAe,YAAY;AAAA,IACvC;AAAA,EACD,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,cAAU,0BAAY,MAAM;AACjC,QAAI,CAAC,OAAQ;AAEb,QAAI,CAAC,KAAK;AACT,aAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,MAAM,EAAE,UAAU,EAAE,IAAI;AAE/D;AAAA,IACD;AAEA,WAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,IAAI;AAAA,EAC3E,GAAG,CAAC,QAAQ,GAAG,CAAC;AAEhB,QAAM,iBAAa,0BAAY,MAAM;AACpC,QAAI,CAAC,OAAQ;AAEb,WAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,MAAM,EAAE,UAAU,EAAE,IAAI;AAC/D,WAAO,EAAE;AAAA,EACV,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,eAAW,0BAAY,MAAM;AAClC,QAAI,CAAC,IAAK;AAEV,UAAM,YAAY,gBAAgB,KAAK,GAAG,IAAI,MAAM,WAAW,GAAG;AAElE,WAAO,KAAK,WAAW,UAAU,qBAAqB;AAAA,EACvD,GAAG,CAAC,GAAG,CAAC;AAER,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;","names":[]}
@@ -0,0 +1,18 @@
1
+ import * as react from 'react';
2
+ import { Editor } from '@tiptap/core';
3
+
4
+ interface UseLinkPopoverConfig {
5
+ editor: Editor | null;
6
+ }
7
+ declare function useLinkPopover({ editor }: UseLinkPopoverConfig): {
8
+ url: string;
9
+ setUrl: react.Dispatch<react.SetStateAction<string>>;
10
+ isActive: boolean;
11
+ canSet: boolean;
12
+ setLink: () => void;
13
+ removeLink: () => void;
14
+ openLink: () => void;
15
+ wasSelectionMove: boolean;
16
+ };
17
+
18
+ export { type UseLinkPopoverConfig, useLinkPopover };
@@ -0,0 +1,18 @@
1
+ import * as react from 'react';
2
+ import { Editor } from '@tiptap/core';
3
+
4
+ interface UseLinkPopoverConfig {
5
+ editor: Editor | null;
6
+ }
7
+ declare function useLinkPopover({ editor }: UseLinkPopoverConfig): {
8
+ url: string;
9
+ setUrl: react.Dispatch<react.SetStateAction<string>>;
10
+ isActive: boolean;
11
+ canSet: boolean;
12
+ setLink: () => void;
13
+ removeLink: () => void;
14
+ openLink: () => void;
15
+ wasSelectionMove: boolean;
16
+ };
17
+
18
+ export { type UseLinkPopoverConfig, useLinkPopover };
@@ -0,0 +1,62 @@
1
+ import { useCallback, useEffect, useState } from "react";
2
+ function useLinkPopover({ editor }) {
3
+ const [url, setUrl] = useState("");
4
+ const [isActive, setIsActive] = useState(false);
5
+ const [canSet, setCanSet] = useState(false);
6
+ const [wasSelectionMove, setWasSelectionMove] = useState(false);
7
+ useEffect(() => {
8
+ if (!editor) return;
9
+ const handleUpdate = ({
10
+ transaction
11
+ } = {}) => {
12
+ const active = editor.isActive("link");
13
+ setIsActive(active);
14
+ setCanSet(editor.isEditable);
15
+ if (transaction) {
16
+ setWasSelectionMove(!transaction.docChanged);
17
+ }
18
+ if (active) {
19
+ setUrl(editor.getAttributes("link").href ?? "");
20
+ }
21
+ };
22
+ handleUpdate();
23
+ editor.on("selectionUpdate", handleUpdate);
24
+ editor.on("transaction", handleUpdate);
25
+ return () => {
26
+ editor.off("selectionUpdate", handleUpdate);
27
+ editor.off("transaction", handleUpdate);
28
+ };
29
+ }, [editor]);
30
+ const setLink = useCallback(() => {
31
+ if (!editor) return;
32
+ if (!url) {
33
+ editor.chain().focus().extendMarkRange("link").unsetLink().run();
34
+ return;
35
+ }
36
+ editor.chain().focus().extendMarkRange("link").setLink({ href: url }).run();
37
+ }, [editor, url]);
38
+ const removeLink = useCallback(() => {
39
+ if (!editor) return;
40
+ editor.chain().focus().extendMarkRange("link").unsetLink().run();
41
+ setUrl("");
42
+ }, [editor]);
43
+ const openLink = useCallback(() => {
44
+ if (!url) return;
45
+ const sanitized = /^https?:\/\//i.test(url) ? url : `https://${url}`;
46
+ window.open(sanitized, "_blank", "noopener,noreferrer");
47
+ }, [url]);
48
+ return {
49
+ url,
50
+ setUrl,
51
+ isActive,
52
+ canSet,
53
+ setLink,
54
+ removeLink,
55
+ openLink,
56
+ wasSelectionMove
57
+ };
58
+ }
59
+ export {
60
+ useLinkPopover
61
+ };
62
+ //# sourceMappingURL=use-link-popover.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/link-popover/use-link-popover.ts"],"sourcesContent":["import { useCallback, useEffect, useState } from 'react';\n\nimport type { Editor } from '@tiptap/core';\nimport type { Transaction } from '@tiptap/pm/state';\n\nexport interface UseLinkPopoverConfig {\n\teditor: Editor | null;\n}\n\nexport function useLinkPopover({ editor }: UseLinkPopoverConfig) {\n\tconst [url, setUrl] = useState('');\n\tconst [isActive, setIsActive] = useState(false);\n\tconst [canSet, setCanSet] = useState(false);\n\tconst [wasSelectionMove, setWasSelectionMove] = useState(false);\n\n\tuseEffect(() => {\n\t\tif (!editor) return;\n\n\t\tconst handleUpdate = ({\n\t\t\ttransaction\n\t\t}: { transaction?: Transaction } = {}) => {\n\t\t\tconst active = editor.isActive('link');\n\n\t\t\tsetIsActive(active);\n\t\t\tsetCanSet(editor.isEditable);\n\n\t\t\tif (transaction) {\n\t\t\t\tsetWasSelectionMove(!transaction.docChanged);\n\t\t\t}\n\n\t\t\tif (active) {\n\t\t\t\tsetUrl(editor.getAttributes('link').href ?? '');\n\t\t\t}\n\t\t};\n\n\t\thandleUpdate();\n\n\t\teditor.on('selectionUpdate', handleUpdate);\n\t\teditor.on('transaction', handleUpdate);\n\n\t\treturn () => {\n\t\t\teditor.off('selectionUpdate', handleUpdate);\n\t\t\teditor.off('transaction', handleUpdate);\n\t\t};\n\t}, [editor]);\n\n\tconst setLink = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\tif (!url) {\n\t\t\teditor.chain().focus().extendMarkRange('link').unsetLink().run();\n\n\t\t\treturn;\n\t\t}\n\n\t\teditor.chain().focus().extendMarkRange('link').setLink({ href: url }).run();\n\t}, [editor, url]);\n\n\tconst removeLink = useCallback(() => {\n\t\tif (!editor) return;\n\n\t\teditor.chain().focus().extendMarkRange('link').unsetLink().run();\n\t\tsetUrl('');\n\t}, [editor]);\n\n\tconst openLink = useCallback(() => {\n\t\tif (!url) return;\n\n\t\tconst sanitized = /^https?:\\/\\//i.test(url) ? url : `https://${url}`;\n\n\t\twindow.open(sanitized, '_blank', 'noopener,noreferrer');\n\t}, [url]);\n\n\treturn {\n\t\turl,\n\t\tsetUrl,\n\t\tisActive,\n\t\tcanSet,\n\t\tsetLink,\n\t\tremoveLink,\n\t\topenLink,\n\t\twasSelectionMove\n\t};\n}\n"],"mappings":"AAAA,SAAS,aAAa,WAAW,gBAAgB;AAS1C,SAAS,eAAe,EAAE,OAAO,GAAyB;AAChE,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,EAAE;AACjC,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,SAAS,KAAK;AAE9D,YAAU,MAAM;AACf,QAAI,CAAC,OAAQ;AAEb,UAAM,eAAe,CAAC;AAAA,MACrB;AAAA,IACD,IAAmC,CAAC,MAAM;AACzC,YAAM,SAAS,OAAO,SAAS,MAAM;AAErC,kBAAY,MAAM;AAClB,gBAAU,OAAO,UAAU;AAE3B,UAAI,aAAa;AAChB,4BAAoB,CAAC,YAAY,UAAU;AAAA,MAC5C;AAEA,UAAI,QAAQ;AACX,eAAO,OAAO,cAAc,MAAM,EAAE,QAAQ,EAAE;AAAA,MAC/C;AAAA,IACD;AAEA,iBAAa;AAEb,WAAO,GAAG,mBAAmB,YAAY;AACzC,WAAO,GAAG,eAAe,YAAY;AAErC,WAAO,MAAM;AACZ,aAAO,IAAI,mBAAmB,YAAY;AAC1C,aAAO,IAAI,eAAe,YAAY;AAAA,IACvC;AAAA,EACD,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,UAAU,YAAY,MAAM;AACjC,QAAI,CAAC,OAAQ;AAEb,QAAI,CAAC,KAAK;AACT,aAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,MAAM,EAAE,UAAU,EAAE,IAAI;AAE/D;AAAA,IACD;AAEA,WAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAE,IAAI;AAAA,EAC3E,GAAG,CAAC,QAAQ,GAAG,CAAC;AAEhB,QAAM,aAAa,YAAY,MAAM;AACpC,QAAI,CAAC,OAAQ;AAEb,WAAO,MAAM,EAAE,MAAM,EAAE,gBAAgB,MAAM,EAAE,UAAU,EAAE,IAAI;AAC/D,WAAO,EAAE;AAAA,EACV,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,WAAW,YAAY,MAAM;AAClC,QAAI,CAAC,IAAK;AAEV,UAAM,YAAY,gBAAgB,KAAK,GAAG,IAAI,MAAM,WAAW,GAAG;AAElE,WAAO,KAAK,WAAW,UAAU,qBAAqB;AAAA,EACvD,GAAG,CAAC,GAAG,CAAC;AAER,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;","names":[]}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var list_dropdown_menu_exports = {};
21
+ __export(list_dropdown_menu_exports, {
22
+ ListDropdownMenu: () => ListDropdownMenu
23
+ });
24
+ module.exports = __toCommonJS(list_dropdown_menu_exports);
25
+ var import_jsx_runtime = require("react/jsx-runtime");
26
+ var import_lucide_react = require("lucide-react");
27
+ var import_react = require("react");
28
+ var import_list_menu_item = require("./list-menu-item");
29
+ var import_use_list = require("./use-list");
30
+ var import_button = require("../ui/button");
31
+ var import_dropdown_menu = require("../ui/dropdown-menu");
32
+ const ListDropdownMenu = (0, import_react.forwardRef)(
33
+ ({
34
+ editor,
35
+ types = ["bulletList", "orderedList", "taskList"],
36
+ ...buttonProps
37
+ }, ref) => {
38
+ const activeType = (0, import_use_list.useActiveListType)(editor, types);
39
+ const TriggerIcon = (0, import_use_list.getListTriggerIcon)(activeType);
40
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_dropdown_menu.DropdownMenu, { children: [
41
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dropdown_menu.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
42
+ import_button.Button,
43
+ {
44
+ ref,
45
+ "aria-label": "List",
46
+ className: "nt:gap-1 nt:px-2",
47
+ "data-active-state": activeType !== null ? "on" : "off",
48
+ size: "default",
49
+ tabIndex: -1,
50
+ type: "button",
51
+ variant: "ghost",
52
+ ...buttonProps,
53
+ children: [
54
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
55
+ TriggerIcon,
56
+ {
57
+ className: activeType !== null ? "nt:text-[var(--tt-brand-color-500)]" : void 0
58
+ }
59
+ ),
60
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ChevronDown, { className: "nt:size-3" })
61
+ ]
62
+ }
63
+ ) }),
64
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dropdown_menu.DropdownMenuContent, { align: "start", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_dropdown_menu.DropdownMenuGroup, { children: types.map((type) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_list_menu_item.ListMenuItem, { editor, listType: type }, type)) }) })
65
+ ] });
66
+ }
67
+ );
68
+ ListDropdownMenu.displayName = "ListDropdownMenu";
69
+ // Annotate the CommonJS export names for ESM import in node:
70
+ 0 && (module.exports = {
71
+ ListDropdownMenu
72
+ });
73
+ //# sourceMappingURL=list-dropdown-menu.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/list-dropdown-menu/list-dropdown-menu.tsx"],"sourcesContent":["'use client';\n\nimport { ChevronDown } from 'lucide-react';\nimport { forwardRef } from 'react';\n\nimport { ListMenuItem } from './list-menu-item';\nimport {\n\tgetListTriggerIcon,\n\tuseActiveListType,\n\ttype ListType\n} from './use-list';\nimport { Button } from '../ui/button';\nimport {\n\tDropdownMenu,\n\tDropdownMenuTrigger,\n\tDropdownMenuContent,\n\tDropdownMenuGroup\n} from '../ui/dropdown-menu';\n\nimport type { Editor } from '@tiptap/core';\nimport type { ComponentProps } from 'react';\n\nexport interface ListDropdownMenuProps extends Omit<\n\tComponentProps<typeof Button>,\n\t'type'\n> {\n\teditor: Editor | null;\n\ttypes?: ListType[];\n}\n\nexport const ListDropdownMenu = forwardRef<\n\tHTMLButtonElement,\n\tListDropdownMenuProps\n>(\n\t(\n\t\t{\n\t\t\teditor,\n\t\t\ttypes = ['bulletList', 'orderedList', 'taskList'],\n\t\t\t...buttonProps\n\t\t},\n\t\tref\n\t) => {\n\t\tconst activeType = useActiveListType(editor, types);\n\t\tconst TriggerIcon = getListTriggerIcon(activeType);\n\n\t\treturn (\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tref={ref}\n\t\t\t\t\t\taria-label=\"List\"\n\t\t\t\t\t\tclassName=\"nt:gap-1 nt:px-2\"\n\t\t\t\t\t\tdata-active-state={activeType !== null ? 'on' : 'off'}\n\t\t\t\t\t\tsize=\"default\"\n\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t{...buttonProps}\n\t\t\t\t\t>\n\t\t\t\t\t\t<TriggerIcon\n\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\tactiveType !== null\n\t\t\t\t\t\t\t\t\t? 'nt:text-[var(--tt-brand-color-500)]'\n\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<ChevronDown className=\"nt:size-3\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"start\">\n\t\t\t\t\t<DropdownMenuGroup>\n\t\t\t\t\t\t{types.map((type) => (\n\t\t\t\t\t\t\t<ListMenuItem key={type} editor={editor} listType={type} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</DropdownMenuGroup>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t);\n\t}\n);\n\nListDropdownMenu.displayName = 'ListDropdownMenu';\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgDK;AA9CL,0BAA4B;AAC5B,mBAA2B;AAE3B,4BAA6B;AAC7B,sBAIO;AACP,oBAAuB;AACvB,2BAKO;AAaA,MAAM,uBAAmB;AAAA,EAI/B,CACC;AAAA,IACC;AAAA,IACA,QAAQ,CAAC,cAAc,eAAe,UAAU;AAAA,IAChD,GAAG;AAAA,EACJ,GACA,QACI;AACJ,UAAM,iBAAa,mCAAkB,QAAQ,KAAK;AAClD,UAAM,kBAAc,oCAAmB,UAAU;AAEjD,WACC,6CAAC,qCACA;AAAA,kDAAC,4CAAoB,SAAO,MAC3B;AAAA,QAAC;AAAA;AAAA,UACA;AAAA,UACA,cAAW;AAAA,UACX,WAAU;AAAA,UACV,qBAAmB,eAAe,OAAO,OAAO;AAAA,UAChD,MAAK;AAAA,UACL,UAAU;AAAA,UACV,MAAK;AAAA,UACL,SAAQ;AAAA,UACP,GAAG;AAAA,UAEJ;AAAA;AAAA,cAAC;AAAA;AAAA,gBACA,WACC,eAAe,OACZ,wCACA;AAAA;AAAA,YAEL;AAAA,YACA,4CAAC,mCAAY,WAAU,aAAY;AAAA;AAAA;AAAA,MACpC,GACD;AAAA,MACA,4CAAC,4CAAoB,OAAM,SAC1B,sDAAC,0CACC,gBAAM,IAAI,CAAC,SACX,4CAAC,sCAAwB,QAAgB,UAAU,QAAhC,IAAsC,CACzD,GACF,GACD;AAAA,OACD;AAAA,EAEF;AACD;AAEA,iBAAiB,cAAc;","names":[]}
@@ -0,0 +1,17 @@
1
+ import * as react from 'react';
2
+ import { ComponentProps } from 'react';
3
+ import { ListType } from './use-list.cjs';
4
+ import { Button } from '../ui/button.cjs';
5
+ import { Editor } from '@tiptap/core';
6
+ import 'lucide-react';
7
+ import 'react/jsx-runtime';
8
+ import 'class-variance-authority/types';
9
+ import 'class-variance-authority';
10
+
11
+ interface ListDropdownMenuProps extends Omit<ComponentProps<typeof Button>, 'type'> {
12
+ editor: Editor | null;
13
+ types?: ListType[];
14
+ }
15
+ declare const ListDropdownMenu: react.ForwardRefExoticComponent<Omit<ListDropdownMenuProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
16
+
17
+ export { ListDropdownMenu, type ListDropdownMenuProps };