@portabletext/editor 1.57.2 → 1.57.3

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portabletext/editor",
3
- "version": "1.57.2",
3
+ "version": "1.57.3",
4
4
  "description": "Portable Text Editor made in React",
5
5
  "keywords": [
6
6
  "sanity",
@@ -81,6 +81,7 @@
81
81
  "use-effect-event": "^1.0.2",
82
82
  "xstate": "^5.20.1",
83
83
  "@portabletext/block-tools": "1.1.37",
84
+ "@portabletext/keyboard-shortcuts": "1.1.0",
84
85
  "@portabletext/patches": "1.1.5"
85
86
  },
86
87
  "devDependencies": {
@@ -16,7 +16,7 @@ interface HotKey {
16
16
  shiftKey: boolean | null
17
17
  }
18
18
 
19
- const IS_MAC =
19
+ export const IS_MAC =
20
20
  typeof window !== 'undefined' &&
21
21
  /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)
22
22
 
@@ -1,207 +1,82 @@
1
- import {isKeyboardShortcut} from './is-keyboard-shortcut'
2
- import {createKeyboardShortcut} from './keyboard-shortcuts'
1
+ import {
2
+ bold,
3
+ code,
4
+ createKeyboardShortcut,
5
+ italic,
6
+ redo,
7
+ underline,
8
+ undo,
9
+ } from '@portabletext/keyboard-shortcuts'
3
10
 
4
11
  export const defaultKeyboardShortcuts = {
5
12
  arrowDown: createKeyboardShortcut({
6
- default: {
7
- guard: (event) =>
8
- isKeyboardShortcut(event, 'ArrowDown', {
9
- ctrlKey: false,
10
- metaKey: false,
11
- shiftKey: false,
12
- altKey: false,
13
- }),
14
- keys: ['ArrowDown'],
15
- },
13
+ default: [
14
+ {
15
+ key: 'ArrowDown',
16
+ alt: false,
17
+ ctrl: false,
18
+ meta: false,
19
+ shift: false,
20
+ },
21
+ ],
16
22
  }),
17
23
  arrowUp: createKeyboardShortcut({
18
- default: {
19
- guard: (event) =>
20
- isKeyboardShortcut(event, 'ArrowUp', {
21
- ctrlKey: false,
22
- metaKey: false,
23
- shiftKey: false,
24
- altKey: false,
25
- }),
26
- keys: ['ArrowUp'],
27
- },
24
+ default: [
25
+ {
26
+ key: 'ArrowUp',
27
+ alt: false,
28
+ ctrl: false,
29
+ meta: false,
30
+ shift: false,
31
+ },
32
+ ],
28
33
  }),
29
34
  break: createKeyboardShortcut({
30
- default: {
31
- guard: (event) => isKeyboardShortcut(event, 'Enter', {shiftKey: false}),
32
- keys: ['Enter'],
33
- },
35
+ default: [
36
+ {
37
+ key: 'Enter',
38
+ shift: false,
39
+ },
40
+ ],
34
41
  }),
35
42
  lineBreak: createKeyboardShortcut({
36
- default: {
37
- guard: (event) => isKeyboardShortcut(event, 'Enter', {shiftKey: true}),
38
- keys: ['Shift', 'Enter'],
39
- },
43
+ default: [
44
+ {
45
+ key: 'Enter',
46
+ shift: true,
47
+ },
48
+ ],
40
49
  }),
41
50
  decorators: {
42
- strong: createKeyboardShortcut({
43
- default: {
44
- guard: (event) =>
45
- isKeyboardShortcut(event, 'b', {
46
- altKey: false,
47
- ctrlKey: true,
48
- metaKey: false,
49
- shiftKey: false,
50
- }),
51
- keys: ['Ctrl', 'B'],
52
- },
53
- apple: {
54
- guard: (event) =>
55
- isKeyboardShortcut(event, 'b', {
56
- altKey: false,
57
- ctrlKey: false,
58
- metaKey: true,
59
- shiftKey: false,
60
- }),
61
- keys: ['⌘', 'B'],
62
- },
63
- }),
64
- em: createKeyboardShortcut({
65
- default: {
66
- guard: (event) =>
67
- isKeyboardShortcut(event, 'i', {
68
- altKey: false,
69
- ctrlKey: true,
70
- metaKey: false,
71
- shiftKey: false,
72
- }),
73
- keys: ['Ctrl', 'I'],
74
- },
75
- apple: {
76
- guard: (event) =>
77
- isKeyboardShortcut(event, 'i', {
78
- altKey: false,
79
- ctrlKey: false,
80
- metaKey: true,
81
- shiftKey: false,
82
- }),
83
- keys: ['⌘', 'I'],
84
- },
85
- }),
86
- underline: createKeyboardShortcut({
87
- default: {
88
- guard: (event) =>
89
- isKeyboardShortcut(event, 'u', {
90
- altKey: false,
91
- ctrlKey: true,
92
- metaKey: false,
93
- shiftKey: false,
94
- }),
95
- keys: ['Ctrl', 'U'],
96
- },
97
- apple: {
98
- guard: (event) =>
99
- isKeyboardShortcut(event, 'u', {
100
- altKey: false,
101
- ctrlKey: false,
102
- metaKey: true,
103
- shiftKey: false,
104
- }),
105
- keys: ['⌘', 'U'],
106
- },
107
- }),
108
- code: createKeyboardShortcut({
109
- default: {
110
- guard: (event) =>
111
- isKeyboardShortcut(event, "'", {
112
- altKey: false,
113
- ctrlKey: true,
114
- metaKey: false,
115
- shiftKey: false,
116
- }),
117
- keys: ['Ctrl', "'"],
118
- },
119
- apple: {
120
- guard: (event) =>
121
- isKeyboardShortcut(event, "'", {
122
- altKey: false,
123
- ctrlKey: false,
124
- metaKey: true,
125
- shiftKey: false,
126
- }),
127
- keys: ['⌘', "'"],
128
- },
129
- }),
51
+ strong: bold,
52
+ em: italic,
53
+ underline: underline,
54
+ code: code,
130
55
  },
131
56
  history: {
132
- undo: createKeyboardShortcut({
133
- default: {
134
- guard: (event) =>
135
- isKeyboardShortcut(event, 'z', {
136
- altKey: false,
137
- ctrlKey: true,
138
- metaKey: false,
139
- shiftKey: false,
140
- }),
141
- keys: ['Ctrl', 'Z'],
142
- },
143
- apple: {
144
- guard: (event) =>
145
- isKeyboardShortcut(event, 'z', {
146
- altKey: false,
147
- ctrlKey: false,
148
- metaKey: true,
149
- shiftKey: false,
150
- }),
151
- keys: ['⌘', 'Z'],
152
- },
153
- }),
154
- redo: createKeyboardShortcut({
155
- default: {
156
- guard: (event) =>
157
- isKeyboardShortcut(event, 'y', {
158
- ctrlKey: true,
159
- metaKey: false,
160
- shiftKey: false,
161
- altKey: false,
162
- }) ||
163
- isKeyboardShortcut(event, 'z', {
164
- ctrlKey: true,
165
- metaKey: false,
166
- shiftKey: true,
167
- altKey: false,
168
- }),
169
- keys: ['Ctrl', 'Y'],
170
- },
171
- apple: {
172
- guard: (event) =>
173
- isKeyboardShortcut(event, 'z', {
174
- ctrlKey: false,
175
- metaKey: true,
176
- shiftKey: true,
177
- altKey: false,
178
- }),
179
- keys: ['⌘', 'Shift', 'Z'],
180
- },
181
- }),
57
+ undo,
58
+ redo,
182
59
  },
183
60
  tab: createKeyboardShortcut({
184
- default: {
185
- guard: (event) =>
186
- isKeyboardShortcut(event, 'Tab', {
187
- ctrlKey: false,
188
- metaKey: false,
189
- shiftKey: false,
190
- altKey: false,
191
- }),
192
- keys: ['Tab'],
193
- },
61
+ default: [
62
+ {
63
+ key: 'Tab',
64
+ alt: false,
65
+ ctrl: false,
66
+ meta: false,
67
+ shift: false,
68
+ },
69
+ ],
194
70
  }),
195
71
  shiftTab: createKeyboardShortcut({
196
- default: {
197
- guard: (event) =>
198
- isKeyboardShortcut(event, 'Tab', {
199
- ctrlKey: false,
200
- metaKey: false,
201
- shiftKey: true,
202
- altKey: false,
203
- }),
204
- keys: ['Shift', 'Tab'],
205
- },
72
+ default: [
73
+ {
74
+ key: 'Tab',
75
+ alt: false,
76
+ ctrl: false,
77
+ meta: false,
78
+ shift: true,
79
+ },
80
+ ],
206
81
  }),
207
82
  }
@@ -1,93 +0,0 @@
1
- import {expect, test} from 'vitest'
2
- import {isKeyboardShortcut} from './is-keyboard-shortcut'
3
-
4
- test(isKeyboardShortcut.name, () => {
5
- expect(
6
- isKeyboardShortcut(
7
- {
8
- key: 'Enter',
9
- code: 'Enter',
10
- metaKey: false,
11
- ctrlKey: false,
12
- altKey: false,
13
- shiftKey: false,
14
- },
15
- 'Enter',
16
- {shiftKey: false},
17
- ),
18
- ).toBe(true)
19
-
20
- expect(
21
- isKeyboardShortcut(
22
- {
23
- key: 'Enter',
24
- code: 'Enter',
25
- metaKey: false,
26
- ctrlKey: false,
27
- altKey: false,
28
- shiftKey: true,
29
- },
30
- 'Enter',
31
- {shiftKey: false},
32
- ),
33
- ).toBe(false)
34
-
35
- expect(
36
- isKeyboardShortcut(
37
- {
38
- key: 'Enter',
39
- code: 'Enter',
40
- metaKey: false,
41
- ctrlKey: false,
42
- altKey: false,
43
- shiftKey: true,
44
- },
45
- 'Enter',
46
- {shiftKey: true},
47
- ),
48
- ).toBe(true)
49
-
50
- expect(
51
- isKeyboardShortcut(
52
- {
53
- key: 'Enter',
54
- code: 'Enter',
55
- metaKey: false,
56
- ctrlKey: false,
57
- altKey: false,
58
- shiftKey: true,
59
- },
60
- 'Enter',
61
- ),
62
- ).toBe(true)
63
-
64
- expect(
65
- isKeyboardShortcut(
66
- {
67
- key: 'b',
68
- code: 'KeyB',
69
- metaKey: false,
70
- ctrlKey: true,
71
- altKey: false,
72
- shiftKey: false,
73
- },
74
- 'B',
75
- {ctrlKey: true, metaKey: false},
76
- ),
77
- ).toBe(true)
78
-
79
- expect(
80
- isKeyboardShortcut(
81
- {
82
- key: 'b',
83
- code: 'KeyB',
84
- metaKey: false,
85
- ctrlKey: true,
86
- altKey: false,
87
- shiftKey: false,
88
- },
89
- 'B',
90
- {ctrlKey: false, metaKey: true},
91
- ),
92
- ).toBe(false)
93
- })
@@ -1,28 +0,0 @@
1
- type AllowedModifiers = {
2
- ctrlKey?: boolean
3
- metaKey?: boolean
4
- shiftKey?: boolean
5
- altKey?: boolean
6
- }
7
-
8
- export function isKeyboardShortcut<
9
- TKeyboardEvent extends Pick<
10
- KeyboardEvent,
11
- 'key' | 'shiftKey' | 'altKey' | 'ctrlKey' | 'metaKey'
12
- > = Pick<
13
- KeyboardEvent,
14
- 'key' | 'shiftKey' | 'altKey' | 'ctrlKey' | 'metaKey'
15
- >,
16
- >(event: TKeyboardEvent, key: string, allowedModifiers: AllowedModifiers = {}) {
17
- return (
18
- event.key.toLowerCase() === key.toLowerCase() &&
19
- (allowedModifiers.ctrlKey === event.ctrlKey ||
20
- allowedModifiers.ctrlKey === undefined) &&
21
- (allowedModifiers.metaKey === event.metaKey ||
22
- allowedModifiers.metaKey === undefined) &&
23
- (allowedModifiers.shiftKey === event.shiftKey ||
24
- allowedModifiers.shiftKey === undefined) &&
25
- (allowedModifiers.altKey === event.altKey ||
26
- allowedModifiers.altKey === undefined)
27
- )
28
- }
@@ -1,120 +0,0 @@
1
- export type KeyboardEventGuard<
2
- TKeyboardEvent extends Pick<
3
- KeyboardEvent,
4
- 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'
5
- > = Pick<
6
- KeyboardEvent,
7
- 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'
8
- >,
9
- > = (event: TKeyboardEvent) => boolean
10
-
11
- /**
12
- * @beta
13
- * Definition of an editor keyboard shortcut with platform-specific key mappings.
14
- *
15
- * @example
16
- * ```typescript
17
- * const boldShortcut: ShortcutDefinition = {
18
- * default: {
19
- * guard: (event) => isKeyboardShortcut(event, 'B', {ctrlKey: true, metaKey: false}),
20
- * keys: ['Ctrl', 'B'],
21
- * },
22
- * apple: {
23
- * guard: (event) => isKeyboardShortcut(event, 'B', {ctrlKey: false, metaKey: true}),
24
- * keys: ['⌘', 'B'],
25
- * },
26
- * }
27
- * ```
28
- */
29
- export type KeyboardShortcutDefinition<
30
- TKeyboardEvent extends Pick<
31
- KeyboardEvent,
32
- 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'
33
- > = Pick<
34
- KeyboardEvent,
35
- 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'
36
- >,
37
- > = {
38
- /**
39
- * Default shortcut for non-Apple platforms (Windows, Linux).
40
- */
41
- default: {
42
- guard: KeyboardEventGuard<TKeyboardEvent>
43
- keys: ReadonlyArray<string>
44
- }
45
- /**
46
- * Shortcut for Apple platforms (macOS).
47
- */
48
- apple?: {
49
- guard: KeyboardEventGuard<TKeyboardEvent>
50
- keys: ReadonlyArray<string>
51
- }
52
- }
53
-
54
- /**
55
- * @beta
56
- * A resolved keyboard shortcut for the current platform.
57
- *
58
- * This type represents a shortcut that has been processed by `createShortcut()`
59
- * to select the appropriate platform-specific key combination. The `guard` function
60
- * determines if the shortcut applies to the current `KeyboardEvent`, while `keys`
61
- * contains the display-friendly key combination for the current platform.
62
- *
63
- * @example
64
- * ```typescript
65
- * const shortcut = createShortcut({
66
- * guard: (event) => isKeyboardShortcut(event, 'B', {ctrlKey: true, metaKey: false}),
67
- * keys: {
68
- * default: ['Ctrl', 'B'],
69
- * apple: ['⌘', 'B'],
70
- * },
71
- * })
72
- * // On macOS: shortcut.keys = ['⌘', 'B']
73
- * // On Windows: shortcut.keys = ['Ctrl', 'B']
74
- * ```
75
- */
76
- export type KeyboardShortcut<
77
- TKeyboardEvent extends Pick<
78
- KeyboardEvent,
79
- 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'
80
- > = Pick<
81
- KeyboardEvent,
82
- 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'
83
- >,
84
- > = {
85
- /**
86
- * Function that determines if the shortcut should be triggered for a given
87
- * keyboard event.
88
- */
89
- guard: KeyboardEventGuard<TKeyboardEvent>
90
- /**
91
- * Platform-specific key combination for display purposes (resolved for the
92
- * current platform).
93
- */
94
- keys: ReadonlyArray<string>
95
- }
96
-
97
- export const IS_APPLE =
98
- typeof window !== 'undefined' &&
99
- /Mac|iPod|iPhone|iPad/.test(window.navigator.userAgent)
100
-
101
- /**
102
- * @beta
103
- * Utility function for creating a `KeyboardShortcut` from a
104
- * `KeyboardShortcutDefinition`.
105
- */
106
- export function createKeyboardShortcut<
107
- TKeyboardEvent extends Pick<
108
- KeyboardEvent,
109
- 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'
110
- > = Pick<
111
- KeyboardEvent,
112
- 'key' | 'code' | 'altKey' | 'ctrlKey' | 'metaKey' | 'shiftKey'
113
- >,
114
- >(
115
- definition: KeyboardShortcutDefinition<TKeyboardEvent>,
116
- ): KeyboardShortcut<TKeyboardEvent> {
117
- return IS_APPLE
118
- ? (definition.apple ?? definition.default)
119
- : definition.default
120
- }