@ctzhian/tiptap 1.11.3 → 1.12.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 (53) hide show
  1. package/dist/Editor/demo.js +16 -21
  2. package/dist/EditorMarkdown/index.js +2 -2
  3. package/dist/asset/css/index.css +19 -8
  4. package/dist/component/ActionDropdown/index.d.ts +25 -0
  5. package/dist/component/ActionDropdown/index.js +147 -0
  6. package/dist/component/CustomDragHandle/index.js +2 -2
  7. package/dist/component/FloatingPopover/index.d.ts +2 -0
  8. package/dist/component/FloatingPopover/index.js +7 -1
  9. package/dist/component/HoverPopover/index.d.ts +29 -0
  10. package/dist/component/HoverPopover/index.js +143 -0
  11. package/dist/component/Icons/chrome-icon.d.ts +6 -0
  12. package/dist/component/Icons/chrome-icon.js +31 -0
  13. package/dist/component/Icons/edit-line-icon.d.ts +6 -0
  14. package/dist/component/Icons/edit-line-icon.js +13 -0
  15. package/dist/component/Icons/file-icon.d.ts +6 -0
  16. package/dist/component/Icons/file-icon.js +20 -0
  17. package/dist/component/Icons/index.d.ts +3 -0
  18. package/dist/component/Icons/index.js +3 -0
  19. package/dist/component/index.d.ts +2 -0
  20. package/dist/component/index.js +2 -0
  21. package/dist/extension/component/Alert/index.js +73 -85
  22. package/dist/extension/component/Attachment/AttachmentContent.d.ts +14 -0
  23. package/dist/extension/component/Attachment/AttachmentContent.js +142 -0
  24. package/dist/extension/component/Attachment/index.js +144 -201
  25. package/dist/extension/component/CodeBlock/Readonly.js +43 -35
  26. package/dist/extension/component/CodeBlock/index.js +139 -90
  27. package/dist/extension/component/Image/Insert.js +41 -26
  28. package/dist/extension/component/Image/Readonly.js +13 -6
  29. package/dist/extension/component/Image/index.d.ts +1 -0
  30. package/dist/extension/component/Image/index.js +234 -92
  31. package/dist/extension/component/Link/Insert.js +1 -1
  32. package/dist/extension/component/Link/LinkContent.d.ts +13 -0
  33. package/dist/extension/component/Link/LinkContent.js +169 -0
  34. package/dist/extension/component/Link/index.js +182 -264
  35. package/dist/extension/component/MentionList/index.js +1 -1
  36. package/dist/extension/component/UploadProgress/index.d.ts +1 -1
  37. package/dist/extension/index.js +1 -1
  38. package/dist/index.css +64 -63
  39. package/dist/themes/dark.js +2 -2
  40. package/dist/themes/light.d.ts +1 -1
  41. package/dist/themes/light.js +2 -2
  42. package/dist/themes/palette.d.ts +1 -1
  43. package/package.json +1 -1
  44. package/dist/extension/component/Attachment/Readonly.d.ts +0 -9
  45. package/dist/extension/component/Attachment/Readonly.js +0 -91
  46. package/dist/extension/component/CustomLink/Insert.d.ts +0 -0
  47. package/dist/extension/component/CustomLink/Insert.js +0 -176
  48. package/dist/extension/component/CustomLink/Readonly.d.ts +0 -0
  49. package/dist/extension/component/CustomLink/Readonly.js +0 -106
  50. package/dist/extension/component/CustomLink/index.d.ts +0 -0
  51. package/dist/extension/component/CustomLink/index.js +0 -440
  52. package/dist/extension/component/Link/Readonly.d.ts +0 -8
  53. package/dist/extension/component/Link/Readonly.js +0 -110
package/dist/index.css CHANGED
@@ -1,9 +1,16 @@
1
1
  @import url('./asset/css/index.css');
2
2
 
3
+ :root {
4
+ --common-row-font-size: 16px;
5
+ --common-row-line-height: 26px;
6
+ --udtoken-quote-bar-bg: #bbbfc4;
7
+ }
8
+
3
9
  .tiptap.ProseMirror {
4
10
  overflow-y: auto;
5
11
  outline: none;
6
12
  color: var(--mui-palette-text-primary);
13
+ line-height: 1.8;
7
14
  }
8
15
 
9
16
  /* 节点缩进(依赖 data-indent 属性) */
@@ -51,28 +58,19 @@
51
58
  margin-bottom: 0 !important;
52
59
  }
53
60
 
54
- .tiptap.ProseMirror a {
55
- text-decoration: underline;
56
- }
57
-
58
61
  .tiptap.ProseMirror p {
59
- line-height: 1.625;
60
- margin-top: 0;
61
- font-size: 16px;
62
- margin-bottom: 20px;
63
- }
64
-
65
- .tiptap.ProseMirror blockquote p,
66
- .tiptap.ProseMirror .node-alert p {
67
- margin: 10px;
62
+ line-height: var(--common-row-line-height);
63
+ font-size: var(--common-row-font-size);
64
+ margin: 8px 0;
68
65
  }
69
66
 
70
67
  /* blockquote */
71
68
  .tiptap.ProseMirror blockquote {
72
69
  position: relative;
73
- padding: 8px 16px;
74
- margin: 0 0 20px;
75
- background-color: var(--mui-palette-background-paper3);
70
+ padding-left: 12px;
71
+ margin: 8px 0;
72
+ line-height: var(--common-row-line-height);
73
+ color: var(--mui-palette-text-auxiliary);
76
74
  }
77
75
 
78
76
  .tiptap.ProseMirror blockquote::after {
@@ -80,53 +78,60 @@
80
78
  position: absolute;
81
79
  top: 0;
82
80
  left: 0;
83
- width: 4px;
81
+ width: 2px;
84
82
  height: 100%;
85
- background-color: var(--mui-palette-action-selected);
83
+ background-color: var(--udtoken-quote-bar-bg);
86
84
  }
87
85
 
88
86
  /* list */
89
87
  .tiptap.ProseMirror ol,
90
88
  .tiptap.ProseMirror ul {
91
89
  padding: 0 32px;
92
- margin: 20px 16px 20px 0;
90
+ margin: 8px 0;
93
91
  list-style: none;
94
92
  }
95
93
 
96
- .tiptap.ProseMirror li ol,
97
- .tiptap.ProseMirror li ul {
98
- margin: 0;
94
+ .tiptap.ProseMirror li {
95
+ margin: 8px 0;
99
96
  }
100
97
 
101
- .tiptap.ProseMirror ol {
98
+ .tiptap.ProseMirror ol ol ol ol {
102
99
  list-style: decimal;
103
100
  }
104
101
 
102
+ .tiptap.ProseMirror ol ol ol {
103
+ list-style: lower-roman;
104
+ }
105
+
105
106
  .tiptap.ProseMirror ol ol {
106
107
  list-style: lower-alpha;
107
108
  }
108
109
 
109
- .tiptap.ProseMirror ol ol ol {
110
- list-style: lower-roman;
110
+ .tiptap.ProseMirror ol {
111
+ list-style: decimal;
111
112
  }
112
113
 
113
114
  .tiptap.ProseMirror ul:not([data-type='taskList']) {
114
115
  list-style: disc;
115
116
  }
116
117
 
117
- .tiptap.ProseMirror ul:not([data-type='taskList']) li {
118
- position: relative;
119
- padding-left: 0;
120
- }
121
-
122
118
  .tiptap.ProseMirror ul:not([data-type='taskList']) ul {
123
- list-style: disc;
119
+ list-style: circle;
124
120
  }
125
121
 
126
122
  .tiptap.ProseMirror ul:not([data-type='taskList']) ul ul {
123
+ list-style: square;
124
+ }
125
+
126
+ .tiptap.ProseMirror ul:not([data-type='taskList']) ul ul ul {
127
127
  list-style: disc;
128
128
  }
129
129
 
130
+ .tiptap.ProseMirror ul:not([data-type='taskList']) li {
131
+ position: relative;
132
+ padding-left: 0;
133
+ }
134
+
130
135
  .tiptap.ProseMirror ul[data-type='taskList'] {
131
136
  list-style: none;
132
137
  margin-left: 0;
@@ -141,7 +146,7 @@
141
146
  .tiptap.ProseMirror ul[data-type='taskList'] li>label {
142
147
  flex: 0 0 auto;
143
148
  user-select: none;
144
- margin-right: 0.5rem;
149
+ margin-right: 8px;
145
150
  height: 28px;
146
151
  display: flex;
147
152
  align-items: center;
@@ -153,7 +158,8 @@
153
158
  }
154
159
 
155
160
  .tiptap.ProseMirror ul[data-type='taskList'] li[data-checked='true']>div {
156
- color: var(--mui-palette-text-disabled);
161
+ color: var(--mui-palette-text-auxiliary);
162
+ opacity: 0.7;
157
163
  text-decoration: line-through;
158
164
  }
159
165
 
@@ -169,14 +175,10 @@
169
175
  margin: 0;
170
176
  }
171
177
 
172
- .tiptap.ProseMirror ul p,
173
- .tiptap.ProseMirror ol p {
174
- margin-top: 0.25rem;
175
- margin-bottom: 0.25rem;
176
- }
177
-
178
- .tiptap.ProseMirror ol li::marker {
179
- font-family: monospace;
178
+ .tiptap.ProseMirror li::marker {
179
+ font-size: 16px;
180
+ line-height: 26px;
181
+ color: var(--mui-palette-primary-main);
180
182
  }
181
183
 
182
184
  /* code */
@@ -186,8 +188,11 @@
186
188
 
187
189
  .tiptap.ProseMirror pre {
188
190
  position: relative;
189
- color: var(--mui-palette-common-white);
190
- background-color: #171c19;
191
+ border: 1px solid;
192
+ border-color: var(--mui-palette-divider);
193
+ border-radius: var(--mui-shape-borderRadius);
194
+ color: var(--mui-palette-text-auxiliary);
195
+ background-color: var(--mui-palette-background-paper3);
191
196
  }
192
197
 
193
198
  .tiptap.ProseMirror pre[data-type="yaml-frontmatter"] {
@@ -315,48 +320,38 @@
315
320
  position: relative;
316
321
  color: inherit;
317
322
  font-style: inherit;
323
+ line-height: 1.4;
324
+ font-weight: 500;
318
325
  }
319
326
 
320
327
  .tiptap.ProseMirror h1 {
321
- font-size: 30px;
322
- line-height: 36px;
323
- font-weight: 700;
324
- margin: 48px 0 20px;
328
+ font-size: 26px;
329
+ margin: 26px 0 10px;
325
330
  }
326
331
 
327
332
  .tiptap.ProseMirror h2 {
328
- font-size: 24px;
329
- line-height: 32px;
330
- font-weight: 700;
331
- margin: 40px 0 20px;
333
+ font-size: 22px;
334
+ margin: 22px 0 8px;
332
335
  }
333
336
 
334
337
  .tiptap.ProseMirror h3 {
335
338
  font-size: 20px;
336
- line-height: 28px;
337
- font-weight: 600;
338
- margin: 36px 0 20px;
339
+ margin: 20px 0 8px;
339
340
  }
340
341
 
341
342
  .tiptap.ProseMirror h4 {
342
343
  font-size: 18px;
343
- line-height: 26px;
344
- font-weight: 600;
345
- margin: 32px 0 20px;
344
+ margin: 18px 0 8px;
346
345
  }
347
346
 
348
347
  .tiptap.ProseMirror h5 {
349
348
  font-size: 18px;
350
- line-height: 26px;
351
- font-weight: 600;
352
- margin: 32px 0 20px;
349
+ margin: 16px 0 8px;
353
350
  }
354
351
 
355
352
  .tiptap.ProseMirror h6 {
356
353
  font-size: 16px;
357
- line-height: 24px;
358
- font-weight: 600;
359
- margin: 32px 0 20px;
354
+ margin: 16px 0 8px;
360
355
  }
361
356
 
362
357
  /* horizontal rule */
@@ -534,4 +529,10 @@
534
529
  .tiptap.ProseMirror table *[data-placeholder]::before,
535
530
  .tiptap.ProseMirror li p[data-placeholder]::before {
536
531
  display: none;
532
+ }
533
+
534
+ .text-ellipsis {
535
+ overflow: hidden;
536
+ text-overflow: ellipsis;
537
+ white-space: nowrap;
537
538
  }
@@ -1,6 +1,6 @@
1
1
  var dark = {
2
2
  primary: {
3
- main: '#3248F2',
3
+ main: '#4c88ff',
4
4
  contrastText: '#000'
5
5
  },
6
6
  secondary: {
@@ -57,7 +57,7 @@ var dark = {
57
57
  inverseAuxiliary: 'rgba(0,0,0,0.5)',
58
58
  inverseDisabled: 'rgba(0,0,0,0.15)'
59
59
  },
60
- divider: '#ededed',
60
+ divider: '#505050',
61
61
  background: {
62
62
  default: '#141923',
63
63
  paper: '#141923',
@@ -50,7 +50,7 @@ declare const light: {
50
50
  text: {
51
51
  primary: string;
52
52
  secondary: string;
53
- tertiary: string;
53
+ auxiliary: string;
54
54
  disabled: string;
55
55
  slave: string;
56
56
  inverse: string;
@@ -48,9 +48,9 @@ var light = {
48
48
  contrastText: '#FFFFFF'
49
49
  },
50
50
  text: {
51
- primary: '#171c19',
51
+ primary: '#1f2329',
52
52
  secondary: '#3f4441',
53
- tertiary: '#717572',
53
+ auxiliary: '#646a73',
54
54
  disabled: '#6e7781',
55
55
  slave: 'rgba(33,34,35,0.3)',
56
56
  inverse: '#FFFFFF',
@@ -58,7 +58,7 @@ export default function themePalette(color: ThemeColor, mode: Omit<ThemeMode, 's
58
58
  text: {
59
59
  primary: string;
60
60
  secondary: string;
61
- tertiary: string;
61
+ auxiliary: string;
62
62
  disabled: string;
63
63
  slave: string;
64
64
  inverse: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ctzhian/tiptap",
3
- "version": "1.11.3",
3
+ "version": "1.12.0",
4
4
  "description": "基于 Tiptap 二次开发的编辑器组件",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -1,9 +0,0 @@
1
- import { NodeViewProps } from "@tiptap/react";
2
- import React from "react";
3
- import { AttachmentAttributes } from ".";
4
- interface ReadonlyAttachmentProps extends Partial<NodeViewProps> {
5
- attrs: AttachmentAttributes;
6
- type: 'icon' | 'block';
7
- }
8
- declare const ReadonlyAttachment: ({ attrs, type }: ReadonlyAttachmentProps) => React.JSX.Element;
9
- export default ReadonlyAttachment;
@@ -1,91 +0,0 @@
1
- import { Attachment2Icon } from "../../../component/Icons";
2
- import { Box, Stack } from "@mui/material";
3
- import { NodeViewWrapper } from "@tiptap/react";
4
- import React from "react";
5
- var ReadonlyAttachment = function ReadonlyAttachment(_ref) {
6
- var attrs = _ref.attrs,
7
- type = _ref.type;
8
- return /*#__PURE__*/React.createElement(NodeViewWrapper, {
9
- className: "attachment-wrapper".concat(type === 'block' ? ' block-attachment-wrapper' : ''),
10
- as: type === 'block' ? 'div' : 'span'
11
- }, /*#__PURE__*/React.createElement(Box, {
12
- component: "a",
13
- href: attrs.url,
14
- target: "_blank",
15
- download: attrs.title,
16
- sx: {
17
- textDecoration: 'none !important',
18
- color: 'inherit'
19
- }
20
- }, type === 'block' ? /*#__PURE__*/React.createElement(Stack, {
21
- direction: 'row',
22
- alignItems: 'center',
23
- gap: 2,
24
- sx: {
25
- border: '1px solid',
26
- borderColor: attrs.url === 'error' ? 'error.main' : 'divider',
27
- cursor: 'pointer',
28
- borderRadius: 'var(--mui-shape-borderRadius)',
29
- p: 2,
30
- ':hover': {
31
- borderColor: attrs.url === 'error' ? 'error.main' : 'primary.main',
32
- color: attrs.url === 'error' ? 'error.main' : 'primary.main'
33
- }
34
- }
35
- }, /*#__PURE__*/React.createElement(Attachment2Icon, {
36
- sx: {
37
- fontSize: '2rem',
38
- cursor: 'grab',
39
- color: attrs.url === 'error' ? 'error.main' : 'primary.main',
40
- alignSelf: 'center',
41
- ':active': {
42
- cursor: 'grabbing'
43
- }
44
- }
45
- }), /*#__PURE__*/React.createElement(Stack, {
46
- sx: {
47
- flex: 1
48
- },
49
- gap: 0.5
50
- }, /*#__PURE__*/React.createElement(Box, {
51
- sx: {
52
- fontSize: '0.875rem',
53
- fontWeight: 'bold'
54
- }
55
- }, attrs.title), /*#__PURE__*/React.createElement(Box, {
56
- sx: {
57
- fontSize: '0.75rem',
58
- color: 'text.secondary'
59
- }
60
- }, attrs.size))) : /*#__PURE__*/React.createElement(Box, {
61
- component: 'span',
62
- sx: {
63
- color: 'primary.main',
64
- textDecoration: 'none',
65
- cursor: 'pointer',
66
- borderRadius: 'var(--mui-shape-borderRadius)',
67
- transition: 'background-color 0.2s ease',
68
- ':hover': {
69
- bgcolor: 'background.paper'
70
- }
71
- }
72
- }, /*#__PURE__*/React.createElement(Box, {
73
- component: 'span',
74
- sx: {
75
- display: 'inline-flex',
76
- alignItems: 'center',
77
- gap: 0.5
78
- }
79
- }, /*#__PURE__*/React.createElement(Attachment2Icon, {
80
- sx: {
81
- fontSize: '0.875rem',
82
- cursor: 'grab',
83
- color: 'primary.main',
84
- alignSelf: 'center',
85
- ':active': {
86
- cursor: 'grabbing'
87
- }
88
- }
89
- }), attrs.title))));
90
- };
91
- export default ReadonlyAttachment;
File without changes
@@ -1,176 +0,0 @@
1
- // import { Box, Button, FormControl, FormControlLabel, FormLabel, Radio, RadioGroup, Stack, TextField } from "@mui/material"
2
- // import { MarkViewContent } from "@tiptap/react"
3
- // import FloatingPopover from "@ctzhian/tiptap/component/FloatingPopover"
4
- // import { LinkIcon } from "@ctzhian/tiptap/component/Icons"
5
- // import React, { useRef, useState } from "react"
6
- // import { LinkAttributes } from "."
7
-
8
- // interface InsertLinkProps {
9
- // updateAttributes?: (attrs: Partial<LinkAttributes>) => void
10
- // }
11
-
12
- // export const InsertLink: React.FC<InsertLinkProps> = ({ updateAttributes }) => {
13
- // const [title, setTitle] = useState('')
14
- // const [href, setHref] = useState('')
15
- // const [type, setType] = useState<'link' | 'card'>('link')
16
- // const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)
17
- // const containerRef = useRef<HTMLAnchorElement>(null)
18
-
19
- // const handleShowPopover = (event: React.MouseEvent<HTMLElement>) => {
20
- // setAnchorEl(event.currentTarget)
21
- // }
22
-
23
- // const handleClosePopover = () => {
24
- // setAnchorEl(null)
25
- // // 重置表单
26
- // setTitle('')
27
- // setHref('')
28
- // setType('link')
29
- // }
30
-
31
- // const handleSave = () => {
32
- // if (href.trim() && updateAttributes) {
33
- // updateAttributes({
34
- // href: href.trim(),
35
- // title: title.trim() || href.trim(),
36
- // type
37
- // })
38
- // handleClosePopover()
39
- // }
40
- // }
41
-
42
- // const handleKeyDown = (event: React.KeyboardEvent) => {
43
- // if (event.key === 'Enter') {
44
- // event.preventDefault()
45
- // handleSave()
46
- // } else if (event.key === 'Escape') {
47
- // event.preventDefault()
48
- // handleClosePopover()
49
- // }
50
- // }
51
-
52
- // return <>
53
- // <MarkViewContent
54
- // as="span"
55
- // ref={containerRef}
56
- // className="link-insert-wrapper"
57
- // data-drag-handle
58
- // role="button"
59
- // tabIndex={0}
60
- // onClick={handleShowPopover}
61
- // onKeyDown={handleKeyDown}
62
- // style={{
63
- // display: 'inline-block',
64
- // margin: '0 2px',
65
- // }}
66
- // >
67
- // <Stack
68
- // direction="row"
69
- // alignItems="center"
70
- // gap={1}
71
- // sx={{
72
- // border: '1px dashed',
73
- // borderColor: 'divider',
74
- // borderRadius: 1,
75
- // px: 2,
76
- // py: 1,
77
- // minWidth: 120,
78
- // color: 'text.secondary',
79
- // bgcolor: 'action.hover',
80
- // cursor: 'pointer',
81
- // transition: 'all 0.2s ease',
82
- // '&:hover': {
83
- // bgcolor: 'action.selected',
84
- // borderColor: 'primary.main',
85
- // color: 'primary.main',
86
- // },
87
- // '&:focus-within': {
88
- // outline: '2px solid',
89
- // outlineColor: 'primary.main',
90
- // outlineOffset: 1,
91
- // },
92
- // }}
93
- // >
94
- // <LinkIcon sx={{ fontSize: '1rem' }} />
95
- // <Box sx={{
96
- // fontSize: '0.875rem',
97
- // fontWeight: 500,
98
- // whiteSpace: 'nowrap'
99
- // }}>
100
- // 插入链接
101
- // </Box>
102
- // </Stack>
103
- // </MarkViewContent>
104
- // <FloatingPopover
105
- // open={Boolean(anchorEl)}
106
- // anchorEl={anchorEl}
107
- // onClose={handleClosePopover}
108
- // placement="bottom"
109
- // >
110
- // <Stack gap={2} sx={{ p: 2, width: 320 }}>
111
- // <TextField
112
- // fullWidth
113
- // size="small"
114
- // label="标题"
115
- // value={title}
116
- // onChange={(e) => setTitle(e.target.value)}
117
- // placeholder="链接标题(可选)"
118
- // onKeyDown={handleKeyDown}
119
- // />
120
- // <TextField
121
- // fullWidth
122
- // size="small"
123
- // label="地址"
124
- // value={href}
125
- // onChange={(e) => setHref(e.target.value)}
126
- // placeholder="https://example.com"
127
- // required
128
- // autoFocus
129
- // error={href.length > 0 && !href.trim()}
130
- // helperText={href.length > 0 && !href.trim() ? "请输入有效的链接地址" : ""}
131
- // onKeyDown={handleKeyDown}
132
- // />
133
- // <FormControl component="fieldset">
134
- // <FormLabel component="legend" sx={{ fontSize: '0.875rem' }}>显示风格</FormLabel>
135
- // <RadioGroup
136
- // row
137
- // value={type}
138
- // onChange={(e) => setType(e.target.value as 'link' | 'card')}
139
- // >
140
- // <FormControlLabel
141
- // value="link"
142
- // control={<Radio size="small" />}
143
- // label="文字链接"
144
- // />
145
- // <FormControlLabel
146
- // value="card"
147
- // control={<Radio size="small" />}
148
- // label="卡片链接"
149
- // />
150
- // </RadioGroup>
151
- // </FormControl>
152
- // <Stack direction="row" gap={1}>
153
- // <Button
154
- // variant="outlined"
155
- // size="small"
156
- // fullWidth
157
- // onClick={handleClosePopover}
158
- // >
159
- // 取消
160
- // </Button>
161
- // <Button
162
- // variant="contained"
163
- // size="small"
164
- // fullWidth
165
- // onClick={handleSave}
166
- // disabled={!href.trim()}
167
- // >
168
- // 插入链接
169
- // </Button>
170
- // </Stack>
171
- // </Stack>
172
- // </FloatingPopover>
173
- // </>
174
- // }
175
-
176
- // export default InsertLink
File without changes