@quadrats/react 0.4.0 → 0.5.1
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/_internal/renderer/typings.d.ts +3 -3
- package/blockquote/constants.d.ts +6 -0
- package/blockquote/constants.js +8 -0
- package/blockquote/createReactBlockquote.d.ts +4 -0
- package/blockquote/createReactBlockquote.js +35 -0
- package/blockquote/defaultRenderBlockquoteElement.d.ts +12 -0
- package/blockquote/defaultRenderBlockquoteElement.js +5 -0
- package/blockquote/index.cjs.js +54 -0
- package/blockquote/index.d.ts +4 -0
- package/blockquote/index.js +3 -0
- package/blockquote/jsx-serializer/createJsxSerializeBlockquote.d.ts +5 -0
- package/blockquote/jsx-serializer/createJsxSerializeBlockquote.js +10 -0
- package/blockquote/jsx-serializer/defaultRenderBlockquoteElement.d.ts +1 -0
- package/blockquote/jsx-serializer/index.cjs.js +15 -0
- package/blockquote/jsx-serializer/index.d.ts +3 -0
- package/blockquote/jsx-serializer/index.js +2 -0
- package/blockquote/jsx-serializer/package.json +7 -0
- package/blockquote/jsx-serializer/typings.d.ts +3 -0
- package/blockquote/package.json +7 -0
- package/blockquote/toolbar/BlockquoteToolbarIcon.d.ts +8 -0
- package/blockquote/toolbar/BlockquoteToolbarIcon.js +12 -0
- package/blockquote/toolbar/index.cjs.js +29 -0
- package/blockquote/toolbar/index.d.ts +2 -0
- package/blockquote/toolbar/index.js +2 -0
- package/blockquote/toolbar/package.json +7 -0
- package/blockquote/toolbar/useBlockquoteTool.d.ts +5 -0
- package/blockquote/toolbar/useBlockquoteTool.js +11 -0
- package/blockquote/typings.d.ts +15 -0
- package/bold/createReactBold.js +1 -1
- package/bold/defaultRenderBold.d.ts +1 -1
- package/bold/defaultRenderBold.js +3 -1
- package/bold/index.cjs.js +3 -2
- package/bold/jsx-serializer/createJsxSerializeBold.js +1 -1
- package/bold/jsx-serializer/index.cjs.js +1 -1
- package/bold/typings.d.ts +5 -0
- package/core/components/Editable.js +2 -1
- package/core/composeHandlers.d.ts +1 -2
- package/core/composeRenderElements.d.ts +1 -1
- package/core/createReactEditor.d.ts +2 -1
- package/core/createRenderElement.d.ts +1 -1
- package/core/createRenderElements.d.ts +1 -1
- package/core/index.d.ts +10 -1
- package/core/typings/handler.d.ts +1 -2
- package/core/typings/renderer.d.ts +3 -3
- package/divider/jsx-serializer/createJsxSerializeDivider.d.ts +1 -1
- package/divider/toolbar/index.cjs.js +1 -1
- package/divider/toolbar/useDividerTool.js +2 -2
- package/embed/jsx-serializer/createJsxSerializeEmbed.d.ts +1 -1
- package/embed/toolbar/index.cjs.js +1 -1
- package/embed/toolbar/useEmbedTool.js +2 -2
- package/file-uploader/hooks/useFileUploader.js +2 -2
- package/file-uploader/index.cjs.js +1 -1
- package/file-uploader/toolbar/index.cjs.js +1 -1
- package/file-uploader/toolbar/useFileUploaderTool.js +2 -2
- package/footnote/createReactFootnote.js +0 -11
- package/footnote/defaultRenderFootnoteElement.js +1 -1
- package/footnote/index.cjs.js +44 -12
- package/footnote/index.d.ts +2 -0
- package/footnote/index.js +2 -0
- package/footnote/jsx-serializer/createJsxSerializeFootnote.d.ts +1 -1
- package/footnote/jsx-serializer/defaultRenderFootnoteElement.js +1 -1
- package/footnote/jsx-serializer/index.cjs.js +1 -1
- package/footnote/toolbar/FootnoteToolbarIcon.d.ts +10 -0
- package/footnote/toolbar/FootnoteToolbarIcon.js +12 -0
- package/footnote/toolbar/index.cjs.js +36 -0
- package/footnote/toolbar/index.d.ts +2 -0
- package/footnote/toolbar/index.js +2 -0
- package/footnote/toolbar/package.json +7 -0
- package/footnote/toolbar/useFootnoteTool.d.ts +7 -0
- package/footnote/toolbar/useFootnoteTool.js +19 -0
- package/footnote/useFootnotes.d.ts +4 -0
- package/footnote/useFootnotes.js +21 -0
- package/footnote/useFootnotesFromNodes.d.ts +4 -0
- package/footnote/useFootnotesFromNodes.js +27 -0
- package/heading/constants.d.ts +9 -0
- package/heading/constants.js +11 -0
- package/heading/createReactHeading.d.ts +4 -0
- package/heading/createReactHeading.js +47 -0
- package/heading/defaultRenderHeadingElement.d.ts +22 -0
- package/heading/defaultRenderHeadingElement.js +19 -0
- package/heading/index.cjs.js +83 -0
- package/heading/index.d.ts +4 -0
- package/heading/index.js +3 -0
- package/heading/jsx-serializer/createJsxSerializeHeading.d.ts +5 -0
- package/heading/jsx-serializer/createJsxSerializeHeading.js +10 -0
- package/heading/jsx-serializer/defaultRenderHeadingElement.d.ts +1 -0
- package/heading/jsx-serializer/index.cjs.js +15 -0
- package/heading/jsx-serializer/index.d.ts +3 -0
- package/heading/jsx-serializer/index.js +2 -0
- package/heading/jsx-serializer/package.json +7 -0
- package/heading/jsx-serializer/typings.d.ts +3 -0
- package/heading/package.json +7 -0
- package/heading/toolbar/HeadingToolbarIcon.d.ts +10 -0
- package/heading/toolbar/HeadingToolbarIcon.js +12 -0
- package/heading/toolbar/index.cjs.js +29 -0
- package/heading/toolbar/index.d.ts +2 -0
- package/heading/toolbar/index.js +2 -0
- package/heading/toolbar/package.json +7 -0
- package/heading/toolbar/useToggleHeadingTool.d.ts +6 -0
- package/heading/toolbar/useToggleHeadingTool.js +11 -0
- package/heading/typings.d.ts +15 -0
- package/highlight/createReactHighlight.js +1 -1
- package/highlight/defaultRenderHighlight.d.ts +1 -1
- package/highlight/defaultRenderHighlight.js +3 -1
- package/highlight/index.cjs.js +3 -2
- package/highlight/jsx-serializer/createJsxSerializeHighlight.js +1 -1
- package/highlight/jsx-serializer/index.cjs.js +1 -1
- package/highlight/typings.d.ts +5 -0
- package/image/components/Image.js +2 -2
- package/image/components/ImageCaption.js +2 -2
- package/image/hooks/useImageResizer.js +2 -2
- package/image/index.cjs.js +3 -3
- package/image/jsx-serializer/createJsxSerializeImage.d.ts +2 -1
- package/image/jsx-serializer/createJsxSerializeImage.js +5 -4
- package/image/jsx-serializer/index.cjs.js +5 -4
- package/index.cjs.js +3 -2
- package/index.js +1 -1
- package/input-block/hooks/useInputBlock.js +2 -1
- package/input-block/index.cjs.js +2 -1
- package/italic/createReactItalic.js +1 -1
- package/italic/defaultRenderItalic.d.ts +1 -1
- package/italic/defaultRenderItalic.js +3 -1
- package/italic/index.cjs.js +3 -2
- package/italic/jsx-serializer/createJsxSerializeItalic.js +1 -1
- package/italic/jsx-serializer/index.cjs.js +1 -1
- package/italic/typings.d.ts +5 -0
- package/jsx-serializer/createJsxSerializeElement.d.ts +1 -1
- package/jsx-serializer/createJsxSerializeElements.d.ts +1 -1
- package/jsx-serializer/createJsxSerializer.d.ts +2 -2
- package/jsx-serializer/createJsxSerializer.js +2 -2
- package/jsx-serializer/index.cjs.js +2 -2
- package/jsx-serializer/typings.d.ts +2 -2
- package/link/jsx-serializer/createJsxSerializeLink.d.ts +1 -1
- package/link/toolbar/index.cjs.js +1 -1
- package/link/toolbar/useUnlinkTool.js +2 -2
- package/list/jsx-serializer/createJsxSerializeList.d.ts +1 -1
- package/package.json +12 -12
- package/paragraph/createRenderParagraphElement.d.ts +1 -1
- package/paragraph/jsx-serializer/createJsxSerializeParagraph.d.ts +1 -1
- package/read-more/jsx-serializer/createJsxSerializeReadMore.d.ts +1 -1
- package/read-more/toolbar/index.cjs.js +1 -1
- package/read-more/toolbar/useReadMoreTool.js +2 -2
- package/strikethrough/createReactStrikethrough.js +1 -1
- package/strikethrough/defaultRenderStrikethrough.d.ts +1 -1
- package/strikethrough/defaultRenderStrikethrough.js +3 -1
- package/strikethrough/index.cjs.js +3 -2
- package/strikethrough/jsx-serializer/createJsxSerializeStrikethrough.js +1 -1
- package/strikethrough/jsx-serializer/index.cjs.js +1 -1
- package/strikethrough/typings.d.ts +5 -0
- package/underline/createReactUnderline.js +1 -1
- package/underline/defaultRenderUnderline.d.ts +1 -1
- package/underline/defaultRenderUnderline.js +3 -1
- package/underline/index.cjs.js +3 -2
- package/underline/jsx-serializer/createJsxSerializeUnderline.js +1 -1
- package/underline/jsx-serializer/index.cjs.js +1 -1
- package/underline/typings.d.ts +5 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useSlateStatic } from '@quadrats/react';
|
|
2
2
|
|
|
3
3
|
function useFileUploaderTool(controller, options) {
|
|
4
|
-
const editor =
|
|
4
|
+
const editor = useSlateStatic();
|
|
5
5
|
return {
|
|
6
6
|
onClick: () => controller.upload(editor, options),
|
|
7
7
|
};
|
|
@@ -6,17 +6,6 @@ function createReactFootnote(options = {}) {
|
|
|
6
6
|
const core = createFootnote(options);
|
|
7
7
|
const { type } = core;
|
|
8
8
|
return Object.assign(Object.assign({}, core), { createRenderElement: ({ render = defaultRenderFootnoteElement } = {}) => createRenderElement({ type, render }), with(editor) {
|
|
9
|
-
const { insertData, insertText } = editor;
|
|
10
|
-
editor.insertData = (data) => {
|
|
11
|
-
const text = data.getData('text/plain');
|
|
12
|
-
if (text) {
|
|
13
|
-
if (core.isSelectionInFootnote(editor)) {
|
|
14
|
-
insertText(text);
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
insertData(data);
|
|
19
|
-
};
|
|
20
9
|
return core.with(editor);
|
|
21
10
|
} });
|
|
22
11
|
}
|
|
@@ -8,7 +8,7 @@ const defaultRenderFootnoteElement = ({ attributes, children, element, placement
|
|
|
8
8
|
const { footnote, index } = element;
|
|
9
9
|
return (React.createElement(React.Fragment, null,
|
|
10
10
|
React.createElement(Tooltip, { placement: placement, popup: footnote },
|
|
11
|
-
React.createElement("
|
|
11
|
+
React.createElement("span", Object.assign({ style: { textDecoration: 'underline' } }, attributes), children)),
|
|
12
12
|
React.createElement("sup", Object.assign({}, attributes, { style: { color: 'var(--qdr-sup)', userSelect: 'none' }, contentEditable: false }), `[${index !== null && index !== void 0 ? index : 1}]`)));
|
|
13
13
|
};
|
|
14
14
|
|
package/footnote/index.cjs.js
CHANGED
|
@@ -6,6 +6,7 @@ var React = require('react');
|
|
|
6
6
|
var components = require('@quadrats/react/components');
|
|
7
7
|
var react = require('@quadrats/react');
|
|
8
8
|
var footnote = require('@quadrats/common/footnote');
|
|
9
|
+
var core = require('@quadrats/core');
|
|
9
10
|
|
|
10
11
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e["default"] : e; }
|
|
11
12
|
|
|
@@ -18,7 +19,7 @@ const defaultRenderFootnoteElement = ({ attributes, children, element, placement
|
|
|
18
19
|
const { footnote, index } = element;
|
|
19
20
|
return (React__default.createElement(React__default.Fragment, null,
|
|
20
21
|
React__default.createElement(components.Tooltip, { placement: placement, popup: footnote },
|
|
21
|
-
React__default.createElement("
|
|
22
|
+
React__default.createElement("span", Object.assign({ style: { textDecoration: 'underline' } }, attributes), children)),
|
|
22
23
|
React__default.createElement("sup", Object.assign({}, attributes, { style: { color: 'var(--qdr-sup)', userSelect: 'none' }, contentEditable: false }), `[${index !== null && index !== void 0 ? index : 1}]`)));
|
|
23
24
|
};
|
|
24
25
|
|
|
@@ -26,20 +27,51 @@ function createReactFootnote(options = {}) {
|
|
|
26
27
|
const core = footnote.createFootnote(options);
|
|
27
28
|
const { type } = core;
|
|
28
29
|
return Object.assign(Object.assign({}, core), { createRenderElement: ({ render = defaultRenderFootnoteElement } = {}) => react.createRenderElement({ type, render }), with(editor) {
|
|
29
|
-
const { insertData, insertText } = editor;
|
|
30
|
-
editor.insertData = (data) => {
|
|
31
|
-
const text = data.getData('text/plain');
|
|
32
|
-
if (text) {
|
|
33
|
-
if (core.isSelectionInFootnote(editor)) {
|
|
34
|
-
insertText(text);
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
insertData(data);
|
|
39
|
-
};
|
|
40
30
|
return core.with(editor);
|
|
41
31
|
} });
|
|
42
32
|
}
|
|
43
33
|
|
|
34
|
+
function useFootnotes(editor) {
|
|
35
|
+
const footnoteNodes = Array.from(core.getNodes(editor, {
|
|
36
|
+
at: [],
|
|
37
|
+
match: (node) => node.type === footnote.FOOTNOTE_TYPE,
|
|
38
|
+
}));
|
|
39
|
+
const footnotes = footnoteNodes.map((node) => {
|
|
40
|
+
var _a, _b;
|
|
41
|
+
const nodeData = node === null || node === void 0 ? void 0 : node[0];
|
|
42
|
+
return {
|
|
43
|
+
wrapperText: (_b = (_a = (nodeData === null || nodeData === void 0 ? void 0 : nodeData.children)) === null || _a === void 0 ? void 0 : _a.map((childNode) => childNode.text).join('')) !== null && _b !== void 0 ? _b : '',
|
|
44
|
+
footnote: nodeData === null || nodeData === void 0 ? void 0 : nodeData.footnote,
|
|
45
|
+
index: nodeData === null || nodeData === void 0 ? void 0 : nodeData.index,
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
return footnotes;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function deepSearchFootnoteFromNodes(nodes) {
|
|
52
|
+
const result = nodes.flatMap((element) => {
|
|
53
|
+
var _a, _b, _c, _d;
|
|
54
|
+
const curNode = core.Node.isNode(element)
|
|
55
|
+
&& element.type === footnote.FOOTNOTE_TYPE ? element : null;
|
|
56
|
+
const child = core.Node.isNodeList((_a = element) === null || _a === void 0 ? void 0 : _a.children)
|
|
57
|
+
? deepSearchFootnoteFromNodes((_c = (_b = element) === null || _b === void 0 ? void 0 : _b.children) !== null && _c !== void 0 ? _c : []) : null;
|
|
58
|
+
return (_d = curNode !== null && curNode !== void 0 ? curNode : child) !== null && _d !== void 0 ? _d : [];
|
|
59
|
+
});
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
function useFootnotesFromNodes(nodes) {
|
|
63
|
+
const filter = deepSearchFootnoteFromNodes(nodes);
|
|
64
|
+
return filter.map((element) => {
|
|
65
|
+
var _a;
|
|
66
|
+
return ({
|
|
67
|
+
wrapperText: (_a = (element === null || element === void 0 ? void 0 : element.children)) === null || _a === void 0 ? void 0 : _a.map((childNode) => childNode.text).join(''),
|
|
68
|
+
footnote: element.footnote,
|
|
69
|
+
index: element.index,
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
44
74
|
exports.createReactFootnote = createReactFootnote;
|
|
45
75
|
exports.defaultRenderFootnoteElement = defaultRenderFootnoteElement;
|
|
76
|
+
exports.useFootnotes = useFootnotes;
|
|
77
|
+
exports.useFootnotesFromNodes = useFootnotesFromNodes;
|
package/footnote/index.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export * from './typings';
|
|
2
2
|
export { defaultRenderFootnoteElement } from './defaultRenderFootnoteElement';
|
|
3
3
|
export { CreateReactFootnoteOptions, createReactFootnote } from './createReactFootnote';
|
|
4
|
+
export { default as useFootnotes } from './useFootnotes';
|
|
5
|
+
export { default as useFootnotesFromNodes } from './useFootnotesFromNodes';
|
package/footnote/index.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
import { CreateJsxSerializeElementOptions } from '@quadrats/react/jsx-serializer';
|
|
3
3
|
import { JsxSerializeFootnoteElementProps } from './typings';
|
|
4
4
|
export declare type CreateJsxSerializeFootnoteOptions = Partial<CreateJsxSerializeElementOptions<JsxSerializeFootnoteElementProps>>;
|
|
5
|
-
export declare function createJsxSerializeFootnote(options?: CreateJsxSerializeFootnoteOptions): (props: import("@quadrats/react/jsx-serializer").JsxSerializeElementProps<import("
|
|
5
|
+
export declare function createJsxSerializeFootnote(options?: CreateJsxSerializeFootnoteOptions): (props: import("@quadrats/react/jsx-serializer").JsxSerializeElementProps<import("@quadrats/core").QuadratsElement>) => JSX.Element | null | undefined;
|
|
@@ -3,7 +3,7 @@ import React from 'react';
|
|
|
3
3
|
const defaultRenderFootnoteElement = ({ children, element }) => {
|
|
4
4
|
var _a;
|
|
5
5
|
return (React.createElement(React.Fragment, null,
|
|
6
|
-
React.createElement("
|
|
6
|
+
React.createElement("span", { style: { textDecoration: 'underline' } }, children),
|
|
7
7
|
React.createElement("sup", { style: { color: 'var(--qdr-sup)' } }, `[${(_a = element.index) !== null && _a !== void 0 ? _a : 1}]`)));
|
|
8
8
|
};
|
|
9
9
|
|
|
@@ -13,7 +13,7 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
|
13
13
|
const defaultRenderFootnoteElement = ({ children, element }) => {
|
|
14
14
|
var _a;
|
|
15
15
|
return (React__default.createElement(React__default.Fragment, null,
|
|
16
|
-
React__default.createElement("
|
|
16
|
+
React__default.createElement("span", { style: { textDecoration: 'underline' } }, children),
|
|
17
17
|
React__default.createElement("sup", { style: { color: 'var(--qdr-sup)' } }, `[${(_a = element.index) !== null && _a !== void 0 ? _a : 1}]`)));
|
|
18
18
|
};
|
|
19
19
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { ToolbarIconProps } from '@quadrats/react/toolbar';
|
|
3
|
+
import { ReactFootnote } from '@quadrats/react/footnote';
|
|
4
|
+
import { UseFootnoteToolOptions } from './useFootnoteTool';
|
|
5
|
+
export interface FootnoteToolbarIconProps extends Omit<ToolbarIconProps, 'active' | 'onClick'> {
|
|
6
|
+
controller: ReactFootnote;
|
|
7
|
+
options?: UseFootnoteToolOptions;
|
|
8
|
+
}
|
|
9
|
+
declare function FootnoteToolbarIcon(props: FootnoteToolbarIconProps): JSX.Element;
|
|
10
|
+
export default FootnoteToolbarIcon;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { __rest } from 'tslib';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { ToolbarIcon } from '@quadrats/react/toolbar';
|
|
4
|
+
import { useFootnoteTool } from './useFootnoteTool.js';
|
|
5
|
+
|
|
6
|
+
function FootnoteToolbarIcon(props) {
|
|
7
|
+
const { controller, options = {} } = props, rest = __rest(props, ["controller", "options"]);
|
|
8
|
+
const { active, onClick } = useFootnoteTool(controller, options);
|
|
9
|
+
return React.createElement(ToolbarIcon, Object.assign({}, rest, { active: active, onClick: onClick }));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export { FootnoteToolbarIcon as default };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var react = require('@quadrats/react');
|
|
6
|
+
var toolbar = require('@quadrats/react/toolbar');
|
|
7
|
+
var tslib = require('tslib');
|
|
8
|
+
var React = require('react');
|
|
9
|
+
|
|
10
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e["default"] : e; }
|
|
11
|
+
|
|
12
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
13
|
+
|
|
14
|
+
function useFootnoteTool(controller, options = {}) {
|
|
15
|
+
const editor = react.useQuadrats();
|
|
16
|
+
const startToolInput = toolbar.useStartToolInput();
|
|
17
|
+
return {
|
|
18
|
+
active: controller.isSelectionInFootnote(editor),
|
|
19
|
+
onClick: () => startToolInput({
|
|
20
|
+
getPlaceholder: (locale) => locale.editor.footnote.inputPlaceholder,
|
|
21
|
+
confirm: (footnoteText) => {
|
|
22
|
+
controller.upsertFootnoteAndUpdateIndex(editor, footnoteText, options);
|
|
23
|
+
},
|
|
24
|
+
defaultValue: controller.getFootnoteText(editor),
|
|
25
|
+
}),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function FootnoteToolbarIcon(props) {
|
|
30
|
+
const { controller, options = {} } = props, rest = tslib.__rest(props, ["controller", "options"]);
|
|
31
|
+
const { active, onClick } = useFootnoteTool(controller, options);
|
|
32
|
+
return React__default.createElement(toolbar.ToolbarIcon, Object.assign({}, rest, { active: active, onClick: onClick }));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
exports.FootnoteToolbarIcon = FootnoteToolbarIcon;
|
|
36
|
+
exports.useFootnoteTool = useFootnoteTool;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { FootnoteUpsertFootnoteOptions } from '@quadrats/common/footnote';
|
|
2
|
+
import { ReactFootnote } from '@quadrats/react/footnote';
|
|
3
|
+
export declare type UseFootnoteToolOptions = FootnoteUpsertFootnoteOptions;
|
|
4
|
+
export declare function useFootnoteTool(controller: ReactFootnote, options?: UseFootnoteToolOptions): {
|
|
5
|
+
active: boolean;
|
|
6
|
+
onClick: () => void;
|
|
7
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useQuadrats } from '@quadrats/react';
|
|
2
|
+
import { useStartToolInput } from '@quadrats/react/toolbar';
|
|
3
|
+
|
|
4
|
+
function useFootnoteTool(controller, options = {}) {
|
|
5
|
+
const editor = useQuadrats();
|
|
6
|
+
const startToolInput = useStartToolInput();
|
|
7
|
+
return {
|
|
8
|
+
active: controller.isSelectionInFootnote(editor),
|
|
9
|
+
onClick: () => startToolInput({
|
|
10
|
+
getPlaceholder: (locale) => locale.editor.footnote.inputPlaceholder,
|
|
11
|
+
confirm: (footnoteText) => {
|
|
12
|
+
controller.upsertFootnoteAndUpdateIndex(editor, footnoteText, options);
|
|
13
|
+
},
|
|
14
|
+
defaultValue: controller.getFootnoteText(editor),
|
|
15
|
+
}),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { useFootnoteTool };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { getNodes } from '@quadrats/core';
|
|
2
|
+
import { FOOTNOTE_TYPE } from '@quadrats/common/footnote';
|
|
3
|
+
|
|
4
|
+
function useFootnotes(editor) {
|
|
5
|
+
const footnoteNodes = Array.from(getNodes(editor, {
|
|
6
|
+
at: [],
|
|
7
|
+
match: (node) => node.type === FOOTNOTE_TYPE,
|
|
8
|
+
}));
|
|
9
|
+
const footnotes = footnoteNodes.map((node) => {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
const nodeData = node === null || node === void 0 ? void 0 : node[0];
|
|
12
|
+
return {
|
|
13
|
+
wrapperText: (_b = (_a = (nodeData === null || nodeData === void 0 ? void 0 : nodeData.children)) === null || _a === void 0 ? void 0 : _a.map((childNode) => childNode.text).join('')) !== null && _b !== void 0 ? _b : '',
|
|
14
|
+
footnote: nodeData === null || nodeData === void 0 ? void 0 : nodeData.footnote,
|
|
15
|
+
index: nodeData === null || nodeData === void 0 ? void 0 : nodeData.index,
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
return footnotes;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { useFootnotes as default, useFootnotes };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Node } from '@quadrats/core';
|
|
2
|
+
import { FOOTNOTE_TYPE } from '@quadrats/common/footnote';
|
|
3
|
+
|
|
4
|
+
function deepSearchFootnoteFromNodes(nodes) {
|
|
5
|
+
const result = nodes.flatMap((element) => {
|
|
6
|
+
var _a, _b, _c, _d;
|
|
7
|
+
const curNode = Node.isNode(element)
|
|
8
|
+
&& element.type === FOOTNOTE_TYPE ? element : null;
|
|
9
|
+
const child = Node.isNodeList((_a = element) === null || _a === void 0 ? void 0 : _a.children)
|
|
10
|
+
? deepSearchFootnoteFromNodes((_c = (_b = element) === null || _b === void 0 ? void 0 : _b.children) !== null && _c !== void 0 ? _c : []) : null;
|
|
11
|
+
return (_d = curNode !== null && curNode !== void 0 ? curNode : child) !== null && _d !== void 0 ? _d : [];
|
|
12
|
+
});
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
function useFootnotesFromNodes(nodes) {
|
|
16
|
+
const filter = deepSearchFootnoteFromNodes(nodes);
|
|
17
|
+
return filter.map((element) => {
|
|
18
|
+
var _a;
|
|
19
|
+
return ({
|
|
20
|
+
wrapperText: (_a = (element === null || element === void 0 ? void 0 : element.children)) === null || _a === void 0 ? void 0 : _a.map((childNode) => childNode.text).join(''),
|
|
21
|
+
footnote: element.footnote,
|
|
22
|
+
index: element.index,
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { useFootnotesFromNodes as default, useFootnotesFromNodes };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default hotkey for toggling heading.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* If the hotkey is `ctrl+opt`, the level 1 hotkey will be `ctrl+opt+1`, and so on.
|
|
6
|
+
*
|
|
7
|
+
* @see [is-hotkey]{@link https://www.npmjs.com/package/is-hotkey}
|
|
8
|
+
*/
|
|
9
|
+
export declare const HEADING_HOTKEY = "ctrl+opt";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default hotkey for toggling heading.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* If the hotkey is `ctrl+opt`, the level 1 hotkey will be `ctrl+opt+1`, and so on.
|
|
6
|
+
*
|
|
7
|
+
* @see [is-hotkey]{@link https://www.npmjs.com/package/is-hotkey}
|
|
8
|
+
*/
|
|
9
|
+
const HEADING_HOTKEY = 'ctrl+opt';
|
|
10
|
+
|
|
11
|
+
export { HEADING_HOTKEY };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { CreateHeadingOptions, HeadingLevel } from '@quadrats/common/heading';
|
|
2
|
+
import { ReactHeading } from './typings';
|
|
3
|
+
export declare type CreateReactHeadingOptions<L extends HeadingLevel> = CreateHeadingOptions<L>;
|
|
4
|
+
export declare function createReactHeading<L extends HeadingLevel = HeadingLevel>(options?: CreateReactHeadingOptions<L>): ReactHeading<L>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import isHotkey from 'is-hotkey';
|
|
2
|
+
import { createHeading } from '@quadrats/common/heading';
|
|
3
|
+
import { createRenderElement } from '@quadrats/react';
|
|
4
|
+
import { createOnKeyDownBreak } from '@quadrats/react/line-break';
|
|
5
|
+
import { HEADING_HOTKEY } from './constants.js';
|
|
6
|
+
import { defaultRenderHeadingElement } from './defaultRenderHeadingElement.js';
|
|
7
|
+
|
|
8
|
+
function createReactHeading(options = {}) {
|
|
9
|
+
const core = createHeading(options);
|
|
10
|
+
const { type } = core;
|
|
11
|
+
return Object.assign(Object.assign({}, core), { createHandlers: ({ hotkey = HEADING_HOTKEY } = {}) => {
|
|
12
|
+
const onKeyDownBreak = createOnKeyDownBreak({
|
|
13
|
+
exitBreak: {
|
|
14
|
+
rules: [
|
|
15
|
+
{
|
|
16
|
+
hotkey: 'enter',
|
|
17
|
+
match: {
|
|
18
|
+
onlyAtEdge: true,
|
|
19
|
+
includeTypes: [type],
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
return {
|
|
26
|
+
onKeyDown(event, editor, next) {
|
|
27
|
+
/**
|
|
28
|
+
* Only toggle if the hotkey is fired and the key is the same as level.
|
|
29
|
+
*/
|
|
30
|
+
const keyAsNumber = +event.key;
|
|
31
|
+
if (!Number.isNaN(keyAsNumber) && isHotkey(hotkey, event)) {
|
|
32
|
+
try {
|
|
33
|
+
core.toggleHeadingNodes(editor, keyAsNumber);
|
|
34
|
+
event.preventDefault();
|
|
35
|
+
// eslint-disable-next-line no-empty
|
|
36
|
+
}
|
|
37
|
+
catch (_a) { }
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
onKeyDownBreak(event, editor, next);
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}, createRenderElement: ({ render = defaultRenderHeadingElement } = {}) => createRenderElement({ type, render }) });
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { createReactHeading };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { HeadingElement } from '@quadrats/common/heading';
|
|
3
|
+
import { RenderElementProps } from '@quadrats/react';
|
|
4
|
+
export declare const HEADING_COMPONENTS: {
|
|
5
|
+
readonly 1: "h1";
|
|
6
|
+
readonly 2: "h2";
|
|
7
|
+
readonly 3: "h3";
|
|
8
|
+
readonly 4: "h4";
|
|
9
|
+
readonly 5: "h5";
|
|
10
|
+
readonly 6: "h6";
|
|
11
|
+
};
|
|
12
|
+
export declare const defaultRenderHeadingElement: ({ attributes, children, element, }: {
|
|
13
|
+
attributes?: {
|
|
14
|
+
'data-slate-node': "element";
|
|
15
|
+
'data-slate-inline'?: true | undefined;
|
|
16
|
+
'data-slate-void'?: true | undefined;
|
|
17
|
+
dir?: "rtl" | undefined;
|
|
18
|
+
ref: any;
|
|
19
|
+
} | undefined;
|
|
20
|
+
children: RenderElementProps['children'];
|
|
21
|
+
element: HeadingElement;
|
|
22
|
+
}) => JSX.Element | null;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
|
|
3
|
+
const HEADING_COMPONENTS = {
|
|
4
|
+
1: 'h1',
|
|
5
|
+
2: 'h2',
|
|
6
|
+
3: 'h3',
|
|
7
|
+
4: 'h4',
|
|
8
|
+
5: 'h5',
|
|
9
|
+
6: 'h6',
|
|
10
|
+
};
|
|
11
|
+
const defaultRenderHeadingElement = ({ attributes, children, element, }) => {
|
|
12
|
+
const Component = HEADING_COMPONENTS[element.level];
|
|
13
|
+
if (!Component) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return React.createElement(Component, Object.assign({}, attributes), children);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export { HEADING_COMPONENTS, defaultRenderHeadingElement };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var React = require('react');
|
|
6
|
+
var isHotkey = require('is-hotkey');
|
|
7
|
+
var heading = require('@quadrats/common/heading');
|
|
8
|
+
var react = require('@quadrats/react');
|
|
9
|
+
var lineBreak = require('@quadrats/react/line-break');
|
|
10
|
+
|
|
11
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e["default"] : e; }
|
|
12
|
+
|
|
13
|
+
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
14
|
+
var isHotkey__default = /*#__PURE__*/_interopDefaultLegacy(isHotkey);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Default hotkey for toggling heading.
|
|
18
|
+
*
|
|
19
|
+
* @remarks
|
|
20
|
+
* If the hotkey is `ctrl+opt`, the level 1 hotkey will be `ctrl+opt+1`, and so on.
|
|
21
|
+
*
|
|
22
|
+
* @see [is-hotkey]{@link https://www.npmjs.com/package/is-hotkey}
|
|
23
|
+
*/
|
|
24
|
+
const HEADING_HOTKEY = 'ctrl+opt';
|
|
25
|
+
|
|
26
|
+
const HEADING_COMPONENTS = {
|
|
27
|
+
1: 'h1',
|
|
28
|
+
2: 'h2',
|
|
29
|
+
3: 'h3',
|
|
30
|
+
4: 'h4',
|
|
31
|
+
5: 'h5',
|
|
32
|
+
6: 'h6',
|
|
33
|
+
};
|
|
34
|
+
const defaultRenderHeadingElement = ({ attributes, children, element, }) => {
|
|
35
|
+
const Component = HEADING_COMPONENTS[element.level];
|
|
36
|
+
if (!Component) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return React__default.createElement(Component, Object.assign({}, attributes), children);
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
function createReactHeading(options = {}) {
|
|
43
|
+
const core = heading.createHeading(options);
|
|
44
|
+
const { type } = core;
|
|
45
|
+
return Object.assign(Object.assign({}, core), { createHandlers: ({ hotkey = HEADING_HOTKEY } = {}) => {
|
|
46
|
+
const onKeyDownBreak = lineBreak.createOnKeyDownBreak({
|
|
47
|
+
exitBreak: {
|
|
48
|
+
rules: [
|
|
49
|
+
{
|
|
50
|
+
hotkey: 'enter',
|
|
51
|
+
match: {
|
|
52
|
+
onlyAtEdge: true,
|
|
53
|
+
includeTypes: [type],
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
onKeyDown(event, editor, next) {
|
|
61
|
+
/**
|
|
62
|
+
* Only toggle if the hotkey is fired and the key is the same as level.
|
|
63
|
+
*/
|
|
64
|
+
const keyAsNumber = +event.key;
|
|
65
|
+
if (!Number.isNaN(keyAsNumber) && isHotkey__default(hotkey, event)) {
|
|
66
|
+
try {
|
|
67
|
+
core.toggleHeadingNodes(editor, keyAsNumber);
|
|
68
|
+
event.preventDefault();
|
|
69
|
+
// eslint-disable-next-line no-empty
|
|
70
|
+
}
|
|
71
|
+
catch (_a) { }
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
onKeyDownBreak(event, editor, next);
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
}, createRenderElement: ({ render = defaultRenderHeadingElement } = {}) => react.createRenderElement({ type, render }) });
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
exports.HEADING_HOTKEY = HEADING_HOTKEY;
|
|
82
|
+
exports.createReactHeading = createReactHeading;
|
|
83
|
+
exports.defaultRenderHeadingElement = defaultRenderHeadingElement;
|
package/heading/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { CreateJsxSerializeElementOptions } from '@quadrats/react/jsx-serializer';
|
|
3
|
+
import { JsxSerializeHeadingElementProps } from './typings';
|
|
4
|
+
export declare type CreateJsxSerializeHeadingOptions = Partial<CreateJsxSerializeElementOptions<JsxSerializeHeadingElementProps>>;
|
|
5
|
+
export declare function createJsxSerializeHeading(options?: CreateJsxSerializeHeadingOptions): (props: import("@quadrats/react/jsx-serializer").JsxSerializeElementProps<import("@quadrats/core").QuadratsElement>) => JSX.Element | null | undefined;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { HEADING_TYPE } from '@quadrats/common/heading';
|
|
2
|
+
import { createJsxSerializeElement } from '@quadrats/react/jsx-serializer';
|
|
3
|
+
import { defaultRenderHeadingElement } from '@quadrats/react/heading';
|
|
4
|
+
|
|
5
|
+
function createJsxSerializeHeading(options = {}) {
|
|
6
|
+
const { type = HEADING_TYPE, render = defaultRenderHeadingElement } = options;
|
|
7
|
+
return createJsxSerializeElement({ type, render });
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { createJsxSerializeHeading };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { defaultRenderHeadingElement } from '@quadrats/react/heading';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var heading = require('@quadrats/react/heading');
|
|
6
|
+
var heading$1 = require('@quadrats/common/heading');
|
|
7
|
+
var jsxSerializer = require('@quadrats/react/jsx-serializer');
|
|
8
|
+
|
|
9
|
+
function createJsxSerializeHeading(options = {}) {
|
|
10
|
+
const { type = heading$1.HEADING_TYPE, render = heading.defaultRenderHeadingElement } = options;
|
|
11
|
+
return jsxSerializer.createJsxSerializeElement({ type, render });
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
exports.defaultRenderHeadingElement = heading.defaultRenderHeadingElement;
|
|
15
|
+
exports.createJsxSerializeHeading = createJsxSerializeHeading;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { HeadingLevel } from '@quadrats/common/heading';
|
|
3
|
+
import { ReactHeading } from '@quadrats/react/heading';
|
|
4
|
+
import { ToolbarIconProps } from '@quadrats/react/toolbar';
|
|
5
|
+
export interface HeadingToolbarIconProps<Level extends HeadingLevel, ValidLevel extends Level> extends Omit<ToolbarIconProps, 'active' | 'onClick'> {
|
|
6
|
+
controller: ReactHeading<Level>;
|
|
7
|
+
level: ValidLevel;
|
|
8
|
+
}
|
|
9
|
+
declare function HeadingToolbarIcon<Level extends HeadingLevel, ValidLevel extends Level>(props: HeadingToolbarIconProps<Level, ValidLevel>): JSX.Element;
|
|
10
|
+
export default HeadingToolbarIcon;
|