sea-react-components 1.0.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 (168) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -0
  3. package/dist/HOC/can-access-application/index.d.ts +9 -0
  4. package/dist/HOC/can-access-application/index.d.ts.map +1 -0
  5. package/dist/HOC/can-access-application/index.js +11 -0
  6. package/dist/HOC/with-authorization/index.d.ts +12 -0
  7. package/dist/HOC/with-authorization/index.d.ts.map +1 -0
  8. package/dist/HOC/with-authorization/index.js +23 -0
  9. package/dist/components/alert/index.d.ts +12 -0
  10. package/dist/components/alert/index.d.ts.map +1 -0
  11. package/dist/components/alert/index.js +51 -0
  12. package/dist/components/avatar/index.d.ts +10 -0
  13. package/dist/components/avatar/index.d.ts.map +1 -0
  14. package/dist/components/avatar/index.js +26 -0
  15. package/dist/components/badge/index.d.ts +8 -0
  16. package/dist/components/badge/index.d.ts.map +1 -0
  17. package/dist/components/badge/index.js +33 -0
  18. package/dist/components/breadcrumb/index.d.ts +7 -0
  19. package/dist/components/breadcrumb/index.d.ts.map +1 -0
  20. package/dist/components/breadcrumb/index.js +8 -0
  21. package/dist/components/button/index.d.ts +6 -0
  22. package/dist/components/button/index.d.ts.map +1 -0
  23. package/dist/components/button/index.js +18 -0
  24. package/dist/components/carousel/index.d.ts +17 -0
  25. package/dist/components/carousel/index.d.ts.map +1 -0
  26. package/dist/components/carousel/index.js +89 -0
  27. package/dist/components/checkbox/index.d.ts +11 -0
  28. package/dist/components/checkbox/index.d.ts.map +1 -0
  29. package/dist/components/checkbox/index.js +15 -0
  30. package/dist/components/color-picker/index.d.ts +8 -0
  31. package/dist/components/color-picker/index.d.ts.map +1 -0
  32. package/dist/components/color-picker/index.js +21 -0
  33. package/dist/components/count-down/index.d.ts +6 -0
  34. package/dist/components/count-down/index.d.ts.map +1 -0
  35. package/dist/components/count-down/index.js +32 -0
  36. package/dist/components/drawer/index.d.ts +12 -0
  37. package/dist/components/drawer/index.d.ts.map +1 -0
  38. package/dist/components/drawer/index.js +15 -0
  39. package/dist/components/file-input/components/file-item/index.d.ts +9 -0
  40. package/dist/components/file-input/components/file-item/index.d.ts.map +1 -0
  41. package/dist/components/file-input/components/file-item/index.js +10 -0
  42. package/dist/components/file-input/index.d.ts +44 -0
  43. package/dist/components/file-input/index.d.ts.map +1 -0
  44. package/dist/components/file-input/index.js +85 -0
  45. package/dist/components/icon/index.d.ts +7 -0
  46. package/dist/components/icon/index.d.ts.map +1 -0
  47. package/dist/components/icon/index.js +5 -0
  48. package/dist/components/input/index.d.ts +9 -0
  49. package/dist/components/input/index.d.ts.map +1 -0
  50. package/dist/components/input/index.js +33 -0
  51. package/dist/components/list-item/components/page-button/index.d.ts +8 -0
  52. package/dist/components/list-item/components/page-button/index.d.ts.map +1 -0
  53. package/dist/components/list-item/components/page-button/index.js +8 -0
  54. package/dist/components/list-item/components/pagination/index.d.ts +9 -0
  55. package/dist/components/list-item/components/pagination/index.d.ts.map +1 -0
  56. package/dist/components/list-item/components/pagination/index.js +49 -0
  57. package/dist/components/list-item/components/search-input/index.d.ts +7 -0
  58. package/dist/components/list-item/components/search-input/index.d.ts.map +1 -0
  59. package/dist/components/list-item/components/search-input/index.js +38 -0
  60. package/dist/components/list-item/index.d.ts +26 -0
  61. package/dist/components/list-item/index.d.ts.map +1 -0
  62. package/dist/components/list-item/index.js +23 -0
  63. package/dist/components/loader/index.d.ts +6 -0
  64. package/dist/components/loader/index.d.ts.map +1 -0
  65. package/dist/components/loader/index.js +5 -0
  66. package/dist/components/menu/index.d.ts +9 -0
  67. package/dist/components/menu/index.d.ts.map +1 -0
  68. package/dist/components/menu/index.js +19 -0
  69. package/dist/components/menu/menu-item/index.d.ts +10 -0
  70. package/dist/components/menu/menu-item/index.d.ts.map +1 -0
  71. package/dist/components/menu/menu-item/index.js +19 -0
  72. package/dist/components/modal/index.d.ts +12 -0
  73. package/dist/components/modal/index.d.ts.map +1 -0
  74. package/dist/components/modal/index.js +41 -0
  75. package/dist/components/not-authorized/index.d.ts +2 -0
  76. package/dist/components/not-authorized/index.d.ts.map +1 -0
  77. package/dist/components/not-authorized/index.js +5 -0
  78. package/dist/components/otp-input/index.d.ts +7 -0
  79. package/dist/components/otp-input/index.d.ts.map +1 -0
  80. package/dist/components/otp-input/index.js +35 -0
  81. package/dist/components/paper/index.d.ts +4 -0
  82. package/dist/components/paper/index.d.ts.map +1 -0
  83. package/dist/components/paper/index.js +17 -0
  84. package/dist/components/progress-bar/index.d.ts +11 -0
  85. package/dist/components/progress-bar/index.d.ts.map +1 -0
  86. package/dist/components/progress-bar/index.js +32 -0
  87. package/dist/components/radio-button/index.d.ts +10 -0
  88. package/dist/components/radio-button/index.d.ts.map +1 -0
  89. package/dist/components/radio-button/index.js +17 -0
  90. package/dist/components/select/index.d.ts +16 -0
  91. package/dist/components/select/index.d.ts.map +1 -0
  92. package/dist/components/select/index.js +36 -0
  93. package/dist/components/skeleton/index.d.ts +4 -0
  94. package/dist/components/skeleton/index.d.ts.map +1 -0
  95. package/dist/components/skeleton/index.js +5 -0
  96. package/dist/components/stacked-avatars/index.d.ts +10 -0
  97. package/dist/components/stacked-avatars/index.d.ts.map +1 -0
  98. package/dist/components/stacked-avatars/index.js +23 -0
  99. package/dist/components/tab/index.d.ts +16 -0
  100. package/dist/components/tab/index.d.ts.map +1 -0
  101. package/dist/components/tab/index.js +23 -0
  102. package/dist/components/table/index.d.ts +22 -0
  103. package/dist/components/table/index.d.ts.map +1 -0
  104. package/dist/components/table/index.js +67 -0
  105. package/dist/components/text-editor/components/toolbar/index.d.ts +9 -0
  106. package/dist/components/text-editor/components/toolbar/index.d.ts.map +1 -0
  107. package/dist/components/text-editor/components/toolbar/index.js +280 -0
  108. package/dist/components/text-editor/index.d.ts +12 -0
  109. package/dist/components/text-editor/index.d.ts.map +1 -0
  110. package/dist/components/text-editor/index.js +152 -0
  111. package/dist/components/text-editor/style.css +132 -0
  112. package/dist/components/text-editor/utils/index.d.ts +14 -0
  113. package/dist/components/text-editor/utils/index.d.ts.map +1 -0
  114. package/dist/components/text-editor/utils/index.js +82 -0
  115. package/dist/components/textarea/index.d.ts +7 -0
  116. package/dist/components/textarea/index.d.ts.map +1 -0
  117. package/dist/components/textarea/index.js +24 -0
  118. package/dist/components/toggle/index.d.ts +8 -0
  119. package/dist/components/toggle/index.d.ts.map +1 -0
  120. package/dist/components/toggle/index.js +12 -0
  121. package/dist/components/tooltip/index.d.ts +10 -0
  122. package/dist/components/tooltip/index.d.ts.map +1 -0
  123. package/dist/components/tooltip/index.js +15 -0
  124. package/dist/components/tree-checkbox/components/tree-checkbox-item/index.d.ts +10 -0
  125. package/dist/components/tree-checkbox/components/tree-checkbox-item/index.d.ts.map +1 -0
  126. package/dist/components/tree-checkbox/components/tree-checkbox-item/index.js +10 -0
  127. package/dist/components/tree-checkbox/index.d.ts +26 -0
  128. package/dist/components/tree-checkbox/index.d.ts.map +1 -0
  129. package/dist/components/tree-checkbox/index.js +62 -0
  130. package/dist/components/tree-checkbox/utils/index.d.ts +9 -0
  131. package/dist/components/tree-checkbox/utils/index.d.ts.map +1 -0
  132. package/dist/components/tree-checkbox/utils/index.js +14 -0
  133. package/dist/constants/index.d.ts +2 -0
  134. package/dist/constants/index.d.ts.map +1 -0
  135. package/dist/constants/index.js +1 -0
  136. package/dist/hooks/list-items-hook/types.d.ts +18 -0
  137. package/dist/hooks/list-items-hook/types.d.ts.map +1 -0
  138. package/dist/hooks/list-items-hook/types.js +1 -0
  139. package/dist/hooks/list-items-hook/useBulkActions.d.ts +3 -0
  140. package/dist/hooks/list-items-hook/useBulkActions.d.ts.map +1 -0
  141. package/dist/hooks/list-items-hook/useBulkActions.js +8 -0
  142. package/dist/hooks/list-items-hook/useFilters.d.ts +3 -0
  143. package/dist/hooks/list-items-hook/useFilters.d.ts.map +1 -0
  144. package/dist/hooks/list-items-hook/useFilters.js +27 -0
  145. package/dist/hooks/list-items-hook/usePagination.d.ts +2 -0
  146. package/dist/hooks/list-items-hook/usePagination.d.ts.map +1 -0
  147. package/dist/hooks/list-items-hook/usePagination.js +21 -0
  148. package/dist/index.d.ts +40 -0
  149. package/dist/index.d.ts.map +1 -0
  150. package/dist/index.js +42 -0
  151. package/dist/styles.css +7 -0
  152. package/dist/tsconfig.tsbuildinfo +1 -0
  153. package/dist/utils/axios/index.d.ts +7 -0
  154. package/dist/utils/axios/index.d.ts.map +1 -0
  155. package/dist/utils/axios/index.js +23 -0
  156. package/dist/utils/color/index.d.ts +7 -0
  157. package/dist/utils/color/index.d.ts.map +1 -0
  158. package/dist/utils/color/index.js +22 -0
  159. package/dist/utils/file/index.d.ts +2 -0
  160. package/dist/utils/file/index.d.ts.map +1 -0
  161. package/dist/utils/file/index.js +8 -0
  162. package/dist/utils/jwt/index.d.ts +2 -0
  163. package/dist/utils/jwt/index.d.ts.map +1 -0
  164. package/dist/utils/jwt/index.js +1 -0
  165. package/dist/utils/validation/index.d.ts +10 -0
  166. package/dist/utils/validation/index.d.ts.map +1 -0
  167. package/dist/utils/validation/index.js +20 -0
  168. package/package.json +66 -0
@@ -0,0 +1,280 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useCallback, useRef, useState } from "react";
4
+ import Button from "../../../button";
5
+ import Select from "../../../select";
6
+ import Icon from "../../../icon";
7
+ import Menu from "../../../menu";
8
+ import MenuItem from "../../../menu/menu-item";
9
+ import Tooltip from "../../../tooltip";
10
+ import clsx from "clsx";
11
+ import { SupportedFontFamilies } from "../../utils";
12
+ import { convertToBase64 } from "../../../../utils/file";
13
+ export default function Toolbar({ editor, headingLevels = [1, 2, 3] }) {
14
+ const imageFileInputRef = useRef(null);
15
+ const [currentHeadingLevel, setCurrentHeadingLevel] = useState(undefined);
16
+ const [fontFamily, setFontFamily] = useState("default");
17
+ const handleSelectHeadingLevel = (level) => {
18
+ setCurrentHeadingLevel(level);
19
+ editor.chain().focus().toggleHeading({ level }).run();
20
+ };
21
+ const handleSelectFamilyFont = (fontStyle) => {
22
+ setFontFamily(fontStyle);
23
+ if (fontStyle === "default") {
24
+ editor.chain().focus().unsetFontFamily().run();
25
+ }
26
+ else {
27
+ editor.chain().focus().setFontFamily(fontStyle).run();
28
+ }
29
+ };
30
+ const handleClickLink = useCallback(() => {
31
+ const isLink = editor.isActive("link");
32
+ if (isLink) {
33
+ editor.chain().focus().unsetLink().run();
34
+ }
35
+ else {
36
+ const url = window.prompt("URL");
37
+ editor
38
+ .chain()
39
+ .focus()
40
+ .extendMarkRange("link")
41
+ .setLink({ href: url })
42
+ .run();
43
+ }
44
+ }, [editor]);
45
+ const MARKER_SECTIONS = [
46
+ {
47
+ name: "section-1",
48
+ items: [
49
+ {
50
+ name: "paragraph",
51
+ icon: "mdi:format-paragraph",
52
+ type: "button",
53
+ onClick: () => {
54
+ editor.chain().focus().setParagraph().run();
55
+ },
56
+ },
57
+ ],
58
+ },
59
+ {
60
+ name: "section-2",
61
+ items: [
62
+ {
63
+ name: "bold",
64
+ icon: "ooui:bold-b",
65
+ type: "button",
66
+ onClick: () => {
67
+ editor.chain().focus().toggleBold().run();
68
+ },
69
+ },
70
+ {
71
+ name: "italic",
72
+ icon: "tabler:italic",
73
+ type: "button",
74
+ onClick: () => {
75
+ editor.chain().focus().toggleItalic().run();
76
+ },
77
+ },
78
+ {
79
+ name: "strike",
80
+ icon: "dashicons:editor-strikethrough",
81
+ type: "button",
82
+ onClick: () => {
83
+ editor.chain().focus().toggleStrike().run();
84
+ },
85
+ },
86
+ {
87
+ name: "underline",
88
+ icon: "fluent:text-underline-20-filled",
89
+ type: "button",
90
+ onClick: () => {
91
+ editor.commands.toggleUnderline();
92
+ },
93
+ },
94
+ {
95
+ name: "blockquote",
96
+ icon: "mingcute:blockquote-line",
97
+ type: "button",
98
+ onClick: () => editor.chain().focus().toggleBlockquote().run(),
99
+ },
100
+ ],
101
+ },
102
+ {
103
+ name: "section-3",
104
+ items: [
105
+ {
106
+ name: "code",
107
+ icon: "solar:code-outline",
108
+ type: "button",
109
+ onClick: () => {
110
+ editor.chain().focus().toggleCode().run();
111
+ },
112
+ },
113
+ {
114
+ name: "codeBlock",
115
+ icon: "ph:code-block",
116
+ type: "button",
117
+ onClick: () => {
118
+ editor.chain().focus().toggleCodeBlock().run();
119
+ },
120
+ },
121
+ ],
122
+ },
123
+ {
124
+ name: "section-4",
125
+ items: [
126
+ {
127
+ name: "bulletList",
128
+ icon: "clarity:bullet-list-line",
129
+ type: "button",
130
+ onClick: () => {
131
+ editor.chain().focus().toggleBulletList().run();
132
+ },
133
+ },
134
+ {
135
+ name: "orderedList",
136
+ icon: "grommet-icons:ordered-list",
137
+ type: "button",
138
+ onClick: () => {
139
+ editor.chain().focus().toggleOrderedList().run();
140
+ },
141
+ },
142
+ ],
143
+ },
144
+ {
145
+ name: "section-5",
146
+ items: [
147
+ {
148
+ name: "textLeftAlign",
149
+ icon: "mingcute:align-left-line",
150
+ type: "button",
151
+ onClick: () => editor.chain().focus().setTextAlign("left").run(),
152
+ },
153
+ {
154
+ name: "textCenterAlign",
155
+ icon: "mingcute:align-center-line",
156
+ type: "button",
157
+ onClick: () => editor.chain().focus().setTextAlign("center").run(),
158
+ },
159
+ {
160
+ name: "textRightAlign",
161
+ icon: "mingcute:align-right-line",
162
+ type: "button",
163
+ onClick: () => editor.chain().focus().setTextAlign("right").run(),
164
+ },
165
+ ],
166
+ },
167
+ {
168
+ name: "section-6",
169
+ items: [
170
+ {
171
+ name: "horizontalRule",
172
+ icon: "octicon:horizontal-rule-16",
173
+ type: "button",
174
+ onClick: () => {
175
+ editor.chain().focus().setHorizontalRule().run();
176
+ },
177
+ },
178
+ ],
179
+ },
180
+ {
181
+ name: "section-7",
182
+ items: [
183
+ {
184
+ name: "link",
185
+ icon: "line-md:link",
186
+ type: "button",
187
+ onClick: () => handleClickLink(),
188
+ },
189
+ ],
190
+ },
191
+ {
192
+ name: "section-8",
193
+ items: [
194
+ {
195
+ name: "image",
196
+ icon: "material-symbols:image-outline",
197
+ type: "image-input",
198
+ onClick: () => imageFileInputRef.current && imageFileInputRef.current.click(),
199
+ handleFileChange: (file) => {
200
+ convertToBase64(file).then((base64) => {
201
+ editor.commands.setImage({
202
+ src: base64,
203
+ });
204
+ });
205
+ },
206
+ },
207
+ ],
208
+ },
209
+ {
210
+ name: "section-9",
211
+ items: [
212
+ {
213
+ name: "table",
214
+ icon: "majesticons:table-line",
215
+ type: "menu",
216
+ menuContent: (_jsxs("div", { className: "p-1 grid grid-cols-2 gap-1", children: [_jsx("div", { className: "col-span-2 flex items-center gap-1", children: _jsx(MenuItem, { className: "p-1 ", onClick: () => editor
217
+ .chain()
218
+ .focus()
219
+ .insertTable({ rows: 3, cols: 3, withHeaderRow: true })
220
+ .run(), children: _jsx(Tooltip, { text: "Insert Table", placement: "top", containerClassName: "bg-gray-100 w-32", textClassName: "text-black text-center text-sm", children: _jsx(Icon, { icon: "majesticons:table-line", className: "w-5 h-5" }) }) }, "insert-table") }), _jsxs("div", { className: "col-span-2 flex items-center gap-1", children: [_jsx(MenuItem, { className: "p-1 ", onClick: () => editor.chain().focus().addColumnBefore().run(), children: _jsx(Tooltip, { text: "Add Column Before", placement: "top", containerClassName: "bg-gray-100 w-32", textClassName: "text-black text-center text-sm", children: _jsx(Icon, { icon: "mdi:table-column-plus-before", className: "w-5 h-5" }) }) }, "add-column-before"), _jsx(MenuItem, { className: "p-1 ", onClick: () => editor.chain().focus().addColumnAfter().run(), children: _jsx(Tooltip, { text: "Add Column After", placement: "top", containerClassName: "bg-gray-100 w-32", textClassName: "text-black text-center text-sm", children: _jsx(Icon, { icon: "mdi:table-column-plus-after", className: "w-5 h-5" }) }) }, "add-column-after"), _jsx(MenuItem, { className: "p-1 ", onClick: () => editor.chain().focus().deleteColumn().run(), children: _jsx(Tooltip, { text: "Remove Column", placement: "top", containerClassName: "bg-gray-100 w-32", textClassName: "text-black text-center text-sm", children: _jsx(Icon, { icon: "mdi:table-column-remove", className: "w-5 h-5" }) }) }, "remove-column")] }), _jsxs("div", { className: "col-span-2 flex items-center gap-1", children: [_jsx(MenuItem, { className: "p-1", onClick: () => editor.chain().focus().addRowBefore().run(), children: _jsx(Tooltip, { text: "Add Row Before", placement: "top", containerClassName: "bg-gray-100 w-32", textClassName: "text-black text-center text-sm", children: _jsx(Icon, { icon: "mdi:table-row-plus-before", className: "w-5 h-5" }) }) }, "add-row-before"), _jsx(MenuItem, { className: "p-1", onClick: () => editor.chain().focus().addRowAfter().run(), children: _jsx(Tooltip, { text: "Add Row After", placement: "top", containerClassName: "bg-gray-100 w-32", textClassName: "text-black text-center text-sm", children: _jsx(Icon, { icon: "mdi:table-row-plus-after", className: "w-5 h-5" }) }) }, "add-row-after"), _jsx(MenuItem, { className: "p-1", onClick: () => editor.chain().focus().deleteRow().run(), children: _jsx(Tooltip, { text: "Remove Row", placement: "top", containerClassName: "bg-gray-100 w-32", textClassName: "text-black text-center text-sm", children: _jsx(Icon, { icon: "mdi:table-row-remove", className: "w-5 h-5" }) }) }, "remove-row")] }), _jsxs("div", { className: "col-span-2 flex items-center gap-1", children: [_jsx(MenuItem, { className: "p-1", onClick: () => editor.chain().focus().mergeCells().run(), children: _jsx(Tooltip, { text: "Merge Cells", placement: "top", containerClassName: "bg-gray-100 w-32", textClassName: "text-black text-center text-sm", children: _jsx(Icon, { icon: "flowbite:merge-cells-outline", className: "w-5 h-5" }) }) }, "merge-cells"), _jsx(MenuItem, { className: "p-1", onClick: () => editor.chain().focus().splitCell().run(), children: _jsx(Tooltip, { text: "Split Cells", placement: "top", containerClassName: "bg-gray-100 w-32", textClassName: "text-black text-center text-sm", children: _jsx(Icon, { icon: "flowbite:split-cells-outline", className: "w-5 h-5" }) }) }, "split-cells")] })] })),
221
+ },
222
+ ],
223
+ },
224
+ {
225
+ name: "section-10",
226
+ items: [
227
+ {
228
+ name: "undo",
229
+ icon: "material-symbols:undo",
230
+ type: "button",
231
+ disabled: !editor.can().undo(),
232
+ onClick: () => {
233
+ editor.chain().focus().undo().run();
234
+ },
235
+ },
236
+ {
237
+ name: "redo",
238
+ icon: "material-symbols:redo",
239
+ type: "button",
240
+ disabled: !editor.can().redo(),
241
+ onClick: () => {
242
+ editor.chain().focus().redo().run();
243
+ },
244
+ },
245
+ ],
246
+ },
247
+ ];
248
+ return (_jsxs("div", { className: "flex items-center gap-1 flex-wrap", children: [_jsx(Select, { name: "heading", multiselect: false, values: currentHeadingLevel ? [currentHeadingLevel] : [], setValues: (newValues) => {
249
+ handleSelectHeadingLevel(newValues[0]);
250
+ }, options: headingLevels.map((o) => ({
251
+ label: `H${o}`,
252
+ value: o,
253
+ })), placeholder: "Heading" }), _jsx(Select, { name: "font", multiselect: false, values: [fontFamily], setValues: (newValues) => {
254
+ handleSelectFamilyFont(newValues[0]);
255
+ }, options: SupportedFontFamilies.map((o) => ({
256
+ label: o.label,
257
+ value: o.style,
258
+ })), placeholder: "Heading" }), MARKER_SECTIONS.map((s, si) => (_jsxs("div", { className: "flex items-center gap-1", children: [s.items.map((item, ii) => {
259
+ if (item.type === "button")
260
+ return (_jsx(Button, { onClick: () => item.onClick(), disabled: item.disabled, className: clsx(editor.isActive(item.name)
261
+ ? "bg-primary bg-opacity-30"
262
+ : "bg-transparent hover:bg-primary hover:bg-opacity-30"), children: _jsx(Icon, { icon: item.icon, className: "\r\n text-black h-5 w-5" }) }, `${item.name}-${ii}`));
263
+ else if (item.type === "menu") {
264
+ return (_jsx(Menu, { menuButton: _jsx(Icon, { icon: item.icon, className: "\r\n text-black h-5 w-5" }), className: "w-28", children: item.menuContent }, `${item.name}-${ii}`));
265
+ }
266
+ else if (item.type === "image-input") {
267
+ return (_jsxs("div", { children: [_jsx(Button, { onClick: () => item.onClick(), disabled: item.disabled, className: clsx(editor.isActive(item.name)
268
+ ? "bg-primary bg-opacity-30"
269
+ : "bg-transparent hover:bg-primary hover:bg-opacity-30"), children: _jsx(Icon, { icon: item.icon, className: "\r\n text-black h-5 w-5" }) }), _jsx("input", { ref: imageFileInputRef, type: "file", accept: "image/*", className: "hidden", onChange: (event) => {
270
+ const files = event.target.files;
271
+ const file = files[0];
272
+ if (file && item.handleFileChange)
273
+ item.handleFileChange(file);
274
+ } })] }, `${item.name}-${ii}`));
275
+ }
276
+ else {
277
+ return _jsx("div", {}, `${item.name}-${ii}`);
278
+ }
279
+ }), si < MARKER_SECTIONS.length - 1 && (_jsx("div", { className: "h-8 w-[2px] bg-gray-300 rounded-full" }))] }, `${s.name}-${si}`)))] }));
280
+ }
@@ -0,0 +1,12 @@
1
+ import { Level } from "@tiptap/extension-heading";
2
+ import "./style.css";
3
+ export type Props = {
4
+ content: string;
5
+ onChange: (value: string) => void;
6
+ placeholder?: string;
7
+ readOnly: boolean;
8
+ headingLevels?: Level[];
9
+ immediatelyRender?: boolean;
10
+ };
11
+ export default function TextEditor({ content, onChange, readOnly, placeholder, headingLevels, immediatelyRender, }: Props): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/text-editor/index.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AA0BlD,OAAO,aAAa,CAAC;AAQrB,MAAM,MAAM,KAAK,GAAG;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;IACxB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AACF,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EACjC,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,WAA6B,EAC7B,aAAyB,EACzB,iBAAyB,GAC1B,EAAE,KAAK,2CA4IP"}
@@ -0,0 +1,152 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useEditor, EditorContent } from "@tiptap/react";
4
+ import StarterKit from "@tiptap/starter-kit";
5
+ import Document from "@tiptap/extension-document";
6
+ import Highlight from "@tiptap/extension-highlight";
7
+ import Image from "@tiptap/extension-image";
8
+ import Underline from "@tiptap/extension-underline";
9
+ import Link from "@tiptap/extension-link";
10
+ import Dropcursor from "@tiptap/extension-dropcursor";
11
+ import FontFamily from "@tiptap/extension-font-family";
12
+ import Text from "@tiptap/extension-text";
13
+ import TextStyle from "@tiptap/extension-text-style";
14
+ import Placeholder from "@tiptap/extension-placeholder";
15
+ import TextAlign from "@tiptap/extension-text-align";
16
+ import Typography from "@tiptap/extension-typography";
17
+ import CodeBlockLowlight from "@tiptap/extension-code-block-lowlight";
18
+ import Gapcursor from "@tiptap/extension-gapcursor";
19
+ import Table from "@tiptap/extension-table";
20
+ import TableCell from "@tiptap/extension-table-cell";
21
+ import TableHeader from "@tiptap/extension-table-header";
22
+ import TableRow from "@tiptap/extension-table-row";
23
+ import { all, createLowlight } from "lowlight";
24
+ import css from "highlight.js/lib/languages/css";
25
+ import js from "highlight.js/lib/languages/javascript";
26
+ import ts from "highlight.js/lib/languages/typescript";
27
+ import html from "highlight.js/lib/languages/xml";
28
+ import { isAllowedUri, shouldAutoLink } from "./utils";
29
+ import Toolbar from "./components/toolbar";
30
+ import "./style.css";
31
+ const lowlight = createLowlight(all);
32
+ lowlight.register("html", html);
33
+ lowlight.register("css", css);
34
+ lowlight.register("js", js);
35
+ lowlight.register("ts", ts);
36
+ export default function TextEditor({ content, onChange, readOnly, placeholder = "Write Here...", headingLevels = [1, 2, 3], immediatelyRender = false, }) {
37
+ const editor = useEditor({
38
+ // element: document.querySelector(".element"),
39
+ extensions: [
40
+ Document,
41
+ Underline,
42
+ Dropcursor,
43
+ Image,
44
+ Text,
45
+ TextStyle,
46
+ FontFamily,
47
+ Typography,
48
+ Placeholder.configure({
49
+ placeholder,
50
+ showOnlyWhenEditable: false,
51
+ }),
52
+ StarterKit.configure({
53
+ heading: {
54
+ levels: headingLevels,
55
+ HTMLAttributes: {
56
+ // class: "text-6xl text-4xl text-2xl",
57
+ },
58
+ },
59
+ code: {
60
+ HTMLAttributes: {
61
+ class: "bg-orange-200 text-black font-light p-1 rounded-md",
62
+ },
63
+ },
64
+ // codeBlock: {
65
+ // HTMLAttributes: {
66
+ // class:
67
+ // "bg-orange-200 text-black font-light p-1 rounded-md",
68
+ // },
69
+ // },
70
+ bold: {
71
+ HTMLAttributes: {
72
+ class: "font-bold",
73
+ },
74
+ },
75
+ blockquote: {
76
+ HTMLAttributes: {
77
+ class: "p-4 my-4 border-s-4 border-gray-300 bg-gray-50 dark:border-gray-500 dark:bg-gray-300",
78
+ },
79
+ },
80
+ horizontalRule: {},
81
+ // bulletList: {
82
+ // keepMarks: true,
83
+ // keepAttributes: false, // TODO : Making this as `false` becase marks are not preserved when I try to preserve attrs, awaiting a bit of help
84
+ // },
85
+ // orderedList: {
86
+ // keepMarks: true,
87
+ // keepAttributes: false, // TODO : Making this as `false` becase marks are not preserved when I try to preserve attrs, awaiting a bit of help
88
+ // },
89
+ }),
90
+ Highlight.configure({ multicolor: true }),
91
+ Link.configure({
92
+ openOnClick: false,
93
+ autolink: true,
94
+ defaultProtocol: "https",
95
+ protocols: ["http", "https"],
96
+ isAllowedUri: isAllowedUri,
97
+ shouldAutoLink: shouldAutoLink,
98
+ HTMLAttributes: {
99
+ class: "text-primary underline",
100
+ },
101
+ }),
102
+ TextAlign.configure({
103
+ types: ["heading", "paragraph"],
104
+ }),
105
+ CodeBlockLowlight.configure({
106
+ lowlight,
107
+ // HTMLAttributes: {
108
+ // class:
109
+ // "bg-orange-200 text-black font-light p-1 rounded-md",
110
+ // },
111
+ }),
112
+ Image.configure({
113
+ allowBase64: true,
114
+ // HTMLAttributes: {
115
+ // class: "border-2 border-black",
116
+ // },
117
+ }),
118
+ Gapcursor,
119
+ Table.configure({
120
+ resizable: true,
121
+ allowTableNodeSelection: true,
122
+ }),
123
+ TableCell.configure({
124
+ HTMLAttributes: {
125
+ class: "border border-gray-300 box-border min-w-[1em] px-2 py-1 relative align-top",
126
+ },
127
+ }),
128
+ TableHeader.configure({
129
+ HTMLAttributes: {
130
+ class: "bg-gray-100 border border-gray-300",
131
+ },
132
+ }),
133
+ TableRow.configure({}),
134
+ ],
135
+ content,
136
+ editorProps: {
137
+ attributes: {
138
+ class: "prose prose-sm sm:prose-base lg:prose-lg xl:prose-2xl m-5 focus:outline-none",
139
+ },
140
+ },
141
+ autofocus: false,
142
+ // make the text editable (default is true)
143
+ editable: true,
144
+ // prevent loading the default CSS (which isn't much anyway)
145
+ injectCSS: false,
146
+ immediatelyRender,
147
+ });
148
+ if (!editor)
149
+ return null;
150
+ // console.log(editor);
151
+ return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("link", { href: "https://fonts.googleapis.com/css2?family=Exo+2:ital,wght@0,100..900;1,100..900&display=swap", rel: "stylesheet" }), _jsx(Toolbar, { editor: editor, headingLevels: headingLevels }), _jsx(EditorContent, { className: "element", editor: editor, placeholder: placeholder })] }));
152
+ }
@@ -0,0 +1,132 @@
1
+ .tiptap p.is-editor-empty:first-child::before {
2
+ color: #adb5bd;
3
+ content: attr(data-placeholder);
4
+ float: left;
5
+ height: 0;
6
+ pointer-events: none;
7
+ }
8
+
9
+ /* Basic editor styles */
10
+ .tiptap {
11
+ :first-child {
12
+ margin-top: 0;
13
+ }
14
+
15
+ ul,
16
+ ol {
17
+ padding: 0 1rem;
18
+ margin: 1.25rem 1rem 1.25rem 0.4rem;
19
+
20
+ li p {
21
+ margin-top: 0.25em;
22
+ margin-bottom: 0.25em;
23
+ }
24
+ }
25
+
26
+ pre {
27
+ background: var(--black);
28
+ border-radius: 0.5rem;
29
+ color: var(--white);
30
+ font-family: "JetBrainsMono", monospace;
31
+ margin: 1.5rem 0;
32
+ padding: 0.75rem 1rem;
33
+
34
+ code {
35
+ background: none;
36
+ color: inherit;
37
+ font-size: 0.8rem;
38
+ padding: 0;
39
+ }
40
+
41
+ .hljs-comment,
42
+ .hljs-quote {
43
+ color: #616161;
44
+ }
45
+
46
+ .hljs-variable,
47
+ .hljs-template-variable,
48
+ .hljs-attribute,
49
+ .hljs-tag,
50
+ .hljs-regexp,
51
+ .hljs-link,
52
+ .hljs-name,
53
+ .hljs-selector-id,
54
+ .hljs-selector-class {
55
+ color: #f98181;
56
+ }
57
+
58
+ .hljs-number,
59
+ .hljs-meta,
60
+ .hljs-built_in,
61
+ .hljs-builtin-name,
62
+ .hljs-literal,
63
+ .hljs-type,
64
+ .hljs-params {
65
+ color: #fbbc88;
66
+ }
67
+
68
+ .hljs-string,
69
+ .hljs-symbol,
70
+ .hljs-bullet {
71
+ color: #b9f18d;
72
+ }
73
+
74
+ .hljs-title,
75
+ .hljs-section {
76
+ color: #faf594;
77
+ }
78
+
79
+ .hljs-keyword,
80
+ .hljs-selector-tag {
81
+ color: #70cff8;
82
+ }
83
+
84
+ .hljs-emphasis {
85
+ font-style: italic;
86
+ }
87
+
88
+ .hljs-strong {
89
+ font-weight: 700;
90
+ }
91
+ }
92
+
93
+ table {
94
+ border-collapse: collapse;
95
+ margin: 0;
96
+ overflow: hidden;
97
+ table-layout: fixed;
98
+ width: 100%;
99
+
100
+ .column-resize-handle {
101
+ bottom: -2px;
102
+ pointer-events: none;
103
+ position: absolute;
104
+ right: -2px;
105
+ top: 0;
106
+ width: 4px;
107
+ }
108
+
109
+ .selectedCell:after {
110
+ background: #61616140;
111
+ content: "";
112
+ left: 0;
113
+ right: 0;
114
+ top: 0;
115
+ bottom: 0;
116
+ pointer-events: none;
117
+ position: absolute;
118
+ z-index: 2;
119
+ color: #ffffff;
120
+ }
121
+ }
122
+
123
+ .tableWrapper {
124
+ margin: 1.5rem 0;
125
+ overflow-x: auto;
126
+ }
127
+
128
+ &.resize-cursor {
129
+ cursor: ew-resize;
130
+ cursor: col-resize;
131
+ }
132
+ }
@@ -0,0 +1,14 @@
1
+ import { LinkProtocolOptions } from "@tiptap/extension-link/dist";
2
+ export declare const isAllowedUri: (url: string, ctx: {
3
+ defaultValidate: (url: string) => boolean;
4
+ protocols: Array<LinkProtocolOptions | string>;
5
+ defaultProtocol: string;
6
+ }) => boolean;
7
+ export declare const shouldAutoLink: (url: string) => boolean;
8
+ export type FontFamilyStyles = "default" | "Inter" | '"Comic Sans MS", "Comic Sans"' | "serif" | "monospace" | "cursive" | "Exo 2";
9
+ export type FontType = {
10
+ label: string;
11
+ style: FontFamilyStyles;
12
+ };
13
+ export declare const SupportedFontFamilies: FontType[];
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/text-editor/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,eAAO,MAAM,YAAY,QAClB,MAAM,OACN;IACH,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1C,SAAS,EAAE,KAAK,CAAC,mBAAmB,GAAG,MAAM,CAAC,CAAC;IAC/C,eAAe,EAAE,MAAM,CAAC;CACzB,KACA,OA0CF,CAAC;AAEF,eAAO,MAAM,cAAc,QAAS,MAAM,KAAG,OAkB5C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB,SAAS,GACT,OAAO,GACP,+BAA+B,GAC/B,OAAO,GACP,WAAW,GACX,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,gBAAgB,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,QAAQ,EA6B3C,CAAC"}
@@ -0,0 +1,82 @@
1
+ export const isAllowedUri = (url, ctx) => {
2
+ try {
3
+ // construct URL
4
+ const parsedUrl = url.includes(":")
5
+ ? new URL(url)
6
+ : new URL(`${ctx.defaultProtocol}://${url}`);
7
+ // use default validation
8
+ if (!ctx.defaultValidate(parsedUrl.href)) {
9
+ return false;
10
+ }
11
+ // disallowed protocols
12
+ const disallowedProtocols = ["ftp", "file", "mailto"];
13
+ const protocol = parsedUrl.protocol.replace(":", "");
14
+ if (disallowedProtocols.includes(protocol)) {
15
+ return false;
16
+ }
17
+ // only allow protocols specified in ctx.protocols
18
+ const allowedProtocols = ctx.protocols.map((p) => typeof p === "string" ? p : p.scheme);
19
+ if (!allowedProtocols.includes(protocol)) {
20
+ return false;
21
+ }
22
+ // disallowed domains
23
+ const disallowedDomains = ["example-phishing.com", "malicious-site.net"];
24
+ const domain = parsedUrl.hostname;
25
+ if (disallowedDomains.includes(domain)) {
26
+ return false;
27
+ }
28
+ // all checks have passed
29
+ return true;
30
+ }
31
+ catch (_a) {
32
+ return false;
33
+ }
34
+ };
35
+ export const shouldAutoLink = (url) => {
36
+ try {
37
+ // construct URL
38
+ const parsedUrl = url.includes(":")
39
+ ? new URL(url)
40
+ : new URL(`https://${url}`);
41
+ // only auto-link if the domain is not in the disallowed list
42
+ const disallowedDomains = [
43
+ "example-no-autolink.com",
44
+ "another-no-autolink.com",
45
+ ];
46
+ const domain = parsedUrl.hostname;
47
+ return !disallowedDomains.includes(domain);
48
+ }
49
+ catch (_a) {
50
+ return false;
51
+ }
52
+ };
53
+ export const SupportedFontFamilies = [
54
+ {
55
+ label: "Default",
56
+ style: "default",
57
+ },
58
+ {
59
+ label: "Inter",
60
+ style: "Inter",
61
+ },
62
+ {
63
+ label: "Comic Sans",
64
+ style: '"Comic Sans MS", "Comic Sans"',
65
+ },
66
+ {
67
+ label: "Serif",
68
+ style: "serif",
69
+ },
70
+ {
71
+ label: "Monospace",
72
+ style: "monospace",
73
+ },
74
+ {
75
+ label: "Cursive",
76
+ style: "cursive",
77
+ },
78
+ {
79
+ label: "Exo 2",
80
+ style: "Exo 2",
81
+ },
82
+ ];