@quadrats/react 0.4.0 → 0.4.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.
Files changed (63) hide show
  1. package/blockquote/constants.d.ts +6 -0
  2. package/blockquote/constants.js +8 -0
  3. package/blockquote/createReactBlockquote.d.ts +4 -0
  4. package/blockquote/createReactBlockquote.js +35 -0
  5. package/blockquote/defaultRenderBlockquoteElement.d.ts +12 -0
  6. package/blockquote/defaultRenderBlockquoteElement.js +5 -0
  7. package/blockquote/index.cjs.js +54 -0
  8. package/blockquote/index.d.ts +4 -0
  9. package/blockquote/index.js +3 -0
  10. package/blockquote/jsx-serializer/createJsxSerializeBlockquote.d.ts +5 -0
  11. package/blockquote/jsx-serializer/createJsxSerializeBlockquote.js +10 -0
  12. package/blockquote/jsx-serializer/defaultRenderBlockquoteElement.d.ts +1 -0
  13. package/blockquote/jsx-serializer/index.cjs.js +15 -0
  14. package/blockquote/jsx-serializer/index.d.ts +3 -0
  15. package/blockquote/jsx-serializer/index.js +2 -0
  16. package/blockquote/jsx-serializer/package.json +7 -0
  17. package/blockquote/jsx-serializer/typings.d.ts +3 -0
  18. package/blockquote/package.json +7 -0
  19. package/blockquote/toolbar/BlockquoteToolbarIcon.d.ts +8 -0
  20. package/blockquote/toolbar/BlockquoteToolbarIcon.js +12 -0
  21. package/blockquote/toolbar/index.cjs.js +29 -0
  22. package/blockquote/toolbar/index.d.ts +2 -0
  23. package/blockquote/toolbar/index.js +2 -0
  24. package/blockquote/toolbar/package.json +7 -0
  25. package/blockquote/toolbar/useBlockquoteTool.d.ts +5 -0
  26. package/blockquote/toolbar/useBlockquoteTool.js +11 -0
  27. package/blockquote/typings.d.ts +15 -0
  28. package/footnote/toolbar/FootnoteToolbarIcon.d.ts +10 -0
  29. package/footnote/toolbar/FootnoteToolbarIcon.js +12 -0
  30. package/footnote/toolbar/index.cjs.js +36 -0
  31. package/footnote/toolbar/index.d.ts +2 -0
  32. package/footnote/toolbar/index.js +2 -0
  33. package/footnote/toolbar/package.json +7 -0
  34. package/footnote/toolbar/useFootnoteTool.d.ts +7 -0
  35. package/footnote/toolbar/useFootnoteTool.js +19 -0
  36. package/heading/constants.d.ts +9 -0
  37. package/heading/constants.js +11 -0
  38. package/heading/createReactHeading.d.ts +4 -0
  39. package/heading/createReactHeading.js +47 -0
  40. package/heading/defaultRenderHeadingElement.d.ts +22 -0
  41. package/heading/defaultRenderHeadingElement.js +19 -0
  42. package/heading/index.cjs.js +83 -0
  43. package/heading/index.d.ts +4 -0
  44. package/heading/index.js +3 -0
  45. package/heading/jsx-serializer/createJsxSerializeHeading.d.ts +5 -0
  46. package/heading/jsx-serializer/createJsxSerializeHeading.js +10 -0
  47. package/heading/jsx-serializer/defaultRenderHeadingElement.d.ts +1 -0
  48. package/heading/jsx-serializer/index.cjs.js +15 -0
  49. package/heading/jsx-serializer/index.d.ts +3 -0
  50. package/heading/jsx-serializer/index.js +2 -0
  51. package/heading/jsx-serializer/package.json +7 -0
  52. package/heading/jsx-serializer/typings.d.ts +3 -0
  53. package/heading/package.json +7 -0
  54. package/heading/toolbar/HeadingToolbarIcon.d.ts +10 -0
  55. package/heading/toolbar/HeadingToolbarIcon.js +12 -0
  56. package/heading/toolbar/index.cjs.js +29 -0
  57. package/heading/toolbar/index.d.ts +2 -0
  58. package/heading/toolbar/index.js +2 -0
  59. package/heading/toolbar/package.json +7 -0
  60. package/heading/toolbar/useToggleHeadingTool.d.ts +6 -0
  61. package/heading/toolbar/useToggleHeadingTool.js +11 -0
  62. package/heading/typings.d.ts +15 -0
  63. package/package.json +1 -1
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Default hotkey for toggling blockquote.
3
+ *
4
+ * @see [is-hotkey]{@link https://www.npmjs.com/package/is-hotkey}
5
+ */
6
+ export declare const BLOCKQUOTE_HOTKEY = "ctrl+opt+q";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Default hotkey for toggling blockquote.
3
+ *
4
+ * @see [is-hotkey]{@link https://www.npmjs.com/package/is-hotkey}
5
+ */
6
+ const BLOCKQUOTE_HOTKEY = 'ctrl+opt+q';
7
+
8
+ export { BLOCKQUOTE_HOTKEY };
@@ -0,0 +1,4 @@
1
+ import { CreateBlockquoteOptions } from '@quadrats/common/blockquote';
2
+ import { ReactBlockquote } from './typings';
3
+ export declare type CreateReactBlockquoteOptions = CreateBlockquoteOptions;
4
+ export declare function createReactBlockquote(options?: CreateReactBlockquoteOptions): ReactBlockquote;
@@ -0,0 +1,35 @@
1
+ import isHotkey from 'is-hotkey';
2
+ import { createBlockquote } from '@quadrats/common/blockquote';
3
+ import { createRenderElement } from '@quadrats/react';
4
+ import { createOnKeyDownBreak } from '@quadrats/react/line-break';
5
+ import { BLOCKQUOTE_HOTKEY } from './constants.js';
6
+ import { defaultRenderBlockquoteElement } from './defaultRenderBlockquoteElement.js';
7
+
8
+ function createReactBlockquote(options = {}) {
9
+ const core = createBlockquote(options);
10
+ const { type } = core;
11
+ const onKeyDownBreak = createOnKeyDownBreak({
12
+ softBreak: {
13
+ rules: [
14
+ {
15
+ hotkey: 'enter',
16
+ match: {
17
+ includeTypes: [type],
18
+ },
19
+ },
20
+ ],
21
+ },
22
+ });
23
+ return Object.assign(Object.assign({}, core), { createHandlers: ({ hotkey = BLOCKQUOTE_HOTKEY } = {}) => ({
24
+ onKeyDown: (event, editor, next) => {
25
+ if (isHotkey(hotkey, event)) {
26
+ core.toggleBlockquote(editor);
27
+ }
28
+ else {
29
+ onKeyDownBreak(event, editor, next);
30
+ }
31
+ },
32
+ }), createRenderElement: ({ render = defaultRenderBlockquoteElement } = {}) => createRenderElement({ type, render }) });
33
+ }
34
+
35
+ export { createReactBlockquote };
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ import { RenderElementProps } from '@quadrats/react';
3
+ export declare const defaultRenderBlockquoteElement: ({ attributes, children, }: {
4
+ attributes?: {
5
+ 'data-slate-node': "element";
6
+ 'data-slate-inline'?: true | undefined;
7
+ 'data-slate-void'?: true | undefined;
8
+ dir?: "rtl" | undefined;
9
+ ref: any;
10
+ } | undefined;
11
+ children: RenderElementProps['children'];
12
+ }) => JSX.Element;
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+
3
+ const defaultRenderBlockquoteElement = ({ attributes, children, }) => React.createElement("blockquote", Object.assign({}, attributes), children);
4
+
5
+ export { defaultRenderBlockquoteElement };
@@ -0,0 +1,54 @@
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 blockquote = require('@quadrats/common/blockquote');
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 blockquote.
18
+ *
19
+ * @see [is-hotkey]{@link https://www.npmjs.com/package/is-hotkey}
20
+ */
21
+ const BLOCKQUOTE_HOTKEY = 'ctrl+opt+q';
22
+
23
+ const defaultRenderBlockquoteElement = ({ attributes, children, }) => React__default.createElement("blockquote", Object.assign({}, attributes), children);
24
+
25
+ function createReactBlockquote(options = {}) {
26
+ const core = blockquote.createBlockquote(options);
27
+ const { type } = core;
28
+ const onKeyDownBreak = lineBreak.createOnKeyDownBreak({
29
+ softBreak: {
30
+ rules: [
31
+ {
32
+ hotkey: 'enter',
33
+ match: {
34
+ includeTypes: [type],
35
+ },
36
+ },
37
+ ],
38
+ },
39
+ });
40
+ return Object.assign(Object.assign({}, core), { createHandlers: ({ hotkey = BLOCKQUOTE_HOTKEY } = {}) => ({
41
+ onKeyDown: (event, editor, next) => {
42
+ if (isHotkey__default(hotkey, event)) {
43
+ core.toggleBlockquote(editor);
44
+ }
45
+ else {
46
+ onKeyDownBreak(event, editor, next);
47
+ }
48
+ },
49
+ }), createRenderElement: ({ render = defaultRenderBlockquoteElement } = {}) => react.createRenderElement({ type, render }) });
50
+ }
51
+
52
+ exports.BLOCKQUOTE_HOTKEY = BLOCKQUOTE_HOTKEY;
53
+ exports.createReactBlockquote = createReactBlockquote;
54
+ exports.defaultRenderBlockquoteElement = defaultRenderBlockquoteElement;
@@ -0,0 +1,4 @@
1
+ export * from './typings';
2
+ export { BLOCKQUOTE_HOTKEY } from './constants';
3
+ export { defaultRenderBlockquoteElement } from './defaultRenderBlockquoteElement';
4
+ export { CreateReactBlockquoteOptions, createReactBlockquote } from './createReactBlockquote';
@@ -0,0 +1,3 @@
1
+ export { BLOCKQUOTE_HOTKEY } from './constants.js';
2
+ export { defaultRenderBlockquoteElement } from './defaultRenderBlockquoteElement.js';
3
+ export { createReactBlockquote } from './createReactBlockquote.js';
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ import { CreateJsxSerializeElementOptions } from '@quadrats/react/jsx-serializer';
3
+ import { JsxSerializeBlockquoteElementProps } from './typings';
4
+ export declare type CreateJsxSerializeBlockquoteOptions = Partial<CreateJsxSerializeElementOptions<JsxSerializeBlockquoteElementProps>>;
5
+ export declare function createJsxSerializeBlockquote(options?: CreateJsxSerializeBlockquoteOptions): (props: import("@quadrats/react/jsx-serializer").JsxSerializeElementProps<import("slate").Element>) => JSX.Element | null | undefined;
@@ -0,0 +1,10 @@
1
+ import { BLOCKQUOTE_TYPE } from '@quadrats/common/blockquote';
2
+ import { createJsxSerializeElement } from '@quadrats/react/jsx-serializer';
3
+ import { defaultRenderBlockquoteElement } from '@quadrats/react/blockquote';
4
+
5
+ function createJsxSerializeBlockquote(options = {}) {
6
+ const { type = BLOCKQUOTE_TYPE, render = defaultRenderBlockquoteElement } = options;
7
+ return createJsxSerializeElement({ type, render });
8
+ }
9
+
10
+ export { createJsxSerializeBlockquote };
@@ -0,0 +1 @@
1
+ export { defaultRenderBlockquoteElement } from '@quadrats/react/blockquote';
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var blockquote = require('@quadrats/react/blockquote');
6
+ var blockquote$1 = require('@quadrats/common/blockquote');
7
+ var jsxSerializer = require('@quadrats/react/jsx-serializer');
8
+
9
+ function createJsxSerializeBlockquote(options = {}) {
10
+ const { type = blockquote$1.BLOCKQUOTE_TYPE, render = blockquote.defaultRenderBlockquoteElement } = options;
11
+ return jsxSerializer.createJsxSerializeElement({ type, render });
12
+ }
13
+
14
+ exports.defaultRenderBlockquoteElement = blockquote.defaultRenderBlockquoteElement;
15
+ exports.createJsxSerializeBlockquote = createJsxSerializeBlockquote;
@@ -0,0 +1,3 @@
1
+ export { defaultRenderBlockquoteElement } from './defaultRenderBlockquoteElement';
2
+ export * from './typings';
3
+ export { CreateJsxSerializeBlockquoteOptions, createJsxSerializeBlockquote } from './createJsxSerializeBlockquote';
@@ -0,0 +1,2 @@
1
+ export { defaultRenderBlockquoteElement } from '@quadrats/react/blockquote';
2
+ export { createJsxSerializeBlockquote } from './createJsxSerializeBlockquote.js';
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@quadrats/react/blockquote/jsx-serializer",
3
+ "sideEffects": false,
4
+ "main": "./index.cjs.js",
5
+ "module": "./index.js",
6
+ "typings": "./index.d.ts"
7
+ }
@@ -0,0 +1,3 @@
1
+ import { BlockquoteElement } from '@quadrats/common/blockquote';
2
+ import { JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
3
+ export declare type JsxSerializeBlockquoteElementProps = JsxSerializeElementProps<BlockquoteElement>;
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@quadrats/react/blockquote",
3
+ "sideEffects": false,
4
+ "main": "./index.cjs.js",
5
+ "module": "./index.js",
6
+ "typings": "./index.d.ts"
7
+ }
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { ToolbarIconProps } from '@quadrats/react/toolbar';
3
+ import { ReactBlockquote } from '@quadrats/react/blockquote';
4
+ export interface BlockquoteToolbarIconProps extends Omit<ToolbarIconProps, 'active' | 'onClick'> {
5
+ controller: ReactBlockquote;
6
+ }
7
+ declare function BlockquoteToolbarIcon(props: BlockquoteToolbarIconProps): JSX.Element;
8
+ export default BlockquoteToolbarIcon;
@@ -0,0 +1,12 @@
1
+ import { __rest } from 'tslib';
2
+ import React from 'react';
3
+ import { ToolbarIcon } from '@quadrats/react/toolbar';
4
+ import { useBlockquoteTool } from './useBlockquoteTool.js';
5
+
6
+ function BlockquoteToolbarIcon(props) {
7
+ const { controller } = props, rest = __rest(props, ["controller"]);
8
+ const { active, onClick } = useBlockquoteTool(controller);
9
+ return React.createElement(ToolbarIcon, Object.assign({}, rest, { active: active, onClick: onClick }));
10
+ }
11
+
12
+ export { BlockquoteToolbarIcon as default };
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var react = require('@quadrats/react');
6
+ var tslib = require('tslib');
7
+ var React = require('react');
8
+ var toolbar = require('@quadrats/react/toolbar');
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 useBlockquoteTool(controller) {
15
+ const editor = react.useQuadrats();
16
+ return {
17
+ active: controller.isSelectionInBlockquote(editor),
18
+ onClick: () => controller.toggleBlockquote(editor),
19
+ };
20
+ }
21
+
22
+ function BlockquoteToolbarIcon(props) {
23
+ const { controller } = props, rest = tslib.__rest(props, ["controller"]);
24
+ const { active, onClick } = useBlockquoteTool(controller);
25
+ return React__default.createElement(toolbar.ToolbarIcon, Object.assign({}, rest, { active: active, onClick: onClick }));
26
+ }
27
+
28
+ exports.BlockquoteToolbarIcon = BlockquoteToolbarIcon;
29
+ exports.useBlockquoteTool = useBlockquoteTool;
@@ -0,0 +1,2 @@
1
+ export { useBlockquoteTool } from './useBlockquoteTool';
2
+ export { BlockquoteToolbarIconProps, default as BlockquoteToolbarIcon } from './BlockquoteToolbarIcon';
@@ -0,0 +1,2 @@
1
+ export { useBlockquoteTool } from './useBlockquoteTool.js';
2
+ export { default as BlockquoteToolbarIcon } from './BlockquoteToolbarIcon.js';
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@quadrats/react/blockquote/toolbar",
3
+ "sideEffects": false,
4
+ "main": "./index.cjs.js",
5
+ "module": "./index.js",
6
+ "typings": "./index.d.ts"
7
+ }
@@ -0,0 +1,5 @@
1
+ import { ReactBlockquote } from '@quadrats/react/blockquote';
2
+ export declare function useBlockquoteTool(controller: ReactBlockquote): {
3
+ active: boolean;
4
+ onClick: () => void;
5
+ };
@@ -0,0 +1,11 @@
1
+ import { useQuadrats } from '@quadrats/react';
2
+
3
+ function useBlockquoteTool(controller) {
4
+ const editor = useQuadrats();
5
+ return {
6
+ active: controller.isSelectionInBlockquote(editor),
7
+ onClick: () => controller.toggleBlockquote(editor),
8
+ };
9
+ }
10
+
11
+ export { useBlockquoteTool };
@@ -0,0 +1,15 @@
1
+ /// <reference types="react" />
2
+ import { BlockquoteElement, Blockquote } from '@quadrats/common/blockquote';
3
+ import { WithCreateHandlers, WithCreateRenderElement, RenderElementProps } from '@quadrats/react';
4
+ export declare type RenderBlockquoteElementProps = RenderElementProps<BlockquoteElement>;
5
+ export interface ReactBlockquoteCreateHandlersOptions {
6
+ /**
7
+ * The hotkey to toggle blockquote.
8
+ */
9
+ hotkey?: string;
10
+ }
11
+ export interface ReactBlockquoteCreateRenderElementOptions {
12
+ render?: (props: RenderBlockquoteElementProps) => JSX.Element | null | undefined;
13
+ }
14
+ export interface ReactBlockquote extends Blockquote, WithCreateHandlers<[ReactBlockquoteCreateHandlersOptions?]>, WithCreateRenderElement<[ReactBlockquoteCreateRenderElementOptions?]> {
15
+ }
@@ -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,2 @@
1
+ export * from './useFootnoteTool';
2
+ export { FootnoteToolbarIconProps, default as FootnoteToolbarIcon } from './FootnoteToolbarIcon';
@@ -0,0 +1,2 @@
1
+ export { useFootnoteTool } from './useFootnoteTool.js';
2
+ export { default as FootnoteToolbarIcon } from './FootnoteToolbarIcon.js';
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@quadrats/react/footnote/toolbar",
3
+ "sideEffects": false,
4
+ "main": "./index.cjs.js",
5
+ "module": "./index.js",
6
+ "typings": "./index.d.ts"
7
+ }
@@ -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,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;
@@ -0,0 +1,4 @@
1
+ export * from './typings';
2
+ export { HEADING_HOTKEY } from './constants';
3
+ export { defaultRenderHeadingElement } from './defaultRenderHeadingElement';
4
+ export { CreateReactHeadingOptions, createReactHeading } from './createReactHeading';
@@ -0,0 +1,3 @@
1
+ export { HEADING_HOTKEY } from './constants.js';
2
+ export { defaultRenderHeadingElement } from './defaultRenderHeadingElement.js';
3
+ export { createReactHeading } from './createReactHeading.js';
@@ -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("slate").Element>) => 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,3 @@
1
+ export * from './typings';
2
+ export { defaultRenderHeadingElement } from './defaultRenderHeadingElement';
3
+ export { CreateJsxSerializeHeadingOptions, createJsxSerializeHeading } from './createJsxSerializeHeading';
@@ -0,0 +1,2 @@
1
+ export { defaultRenderHeadingElement } from '@quadrats/react/heading';
2
+ export { createJsxSerializeHeading } from './createJsxSerializeHeading.js';
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@quadrats/react/heading/jsx-serializer",
3
+ "sideEffects": false,
4
+ "main": "./index.cjs.js",
5
+ "module": "./index.js",
6
+ "typings": "./index.d.ts"
7
+ }
@@ -0,0 +1,3 @@
1
+ import { HeadingElement } from '@quadrats/common/heading';
2
+ import { JsxSerializeElementProps } from '@quadrats/react/jsx-serializer';
3
+ export declare type JsxSerializeHeadingElementProps = JsxSerializeElementProps<HeadingElement>;
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@quadrats/react/heading",
3
+ "sideEffects": false,
4
+ "main": "./index.cjs.js",
5
+ "module": "./index.js",
6
+ "typings": "./index.d.ts"
7
+ }
@@ -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;
@@ -0,0 +1,12 @@
1
+ import { __rest } from 'tslib';
2
+ import React from 'react';
3
+ import { ToolbarIcon } from '@quadrats/react/toolbar';
4
+ import { useToggleHeadingTool } from './useToggleHeadingTool.js';
5
+
6
+ function HeadingToolbarIcon(props) {
7
+ const { controller, level } = props, rest = __rest(props, ["controller", "level"]);
8
+ const { active, onClick } = useToggleHeadingTool(controller, level);
9
+ return React.createElement(ToolbarIcon, Object.assign({}, rest, { active: active, onClick: onClick }));
10
+ }
11
+
12
+ export { HeadingToolbarIcon as default };
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var react = require('@quadrats/react');
6
+ var tslib = require('tslib');
7
+ var React = require('react');
8
+ var toolbar = require('@quadrats/react/toolbar');
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 useToggleHeadingTool(controller, level) {
15
+ const editor = react.useQuadrats();
16
+ return {
17
+ active: controller.isSelectionInHeading(editor, level),
18
+ onClick: () => controller.toggleHeadingNodes(editor, level),
19
+ };
20
+ }
21
+
22
+ function HeadingToolbarIcon(props) {
23
+ const { controller, level } = props, rest = tslib.__rest(props, ["controller", "level"]);
24
+ const { active, onClick } = useToggleHeadingTool(controller, level);
25
+ return React__default.createElement(toolbar.ToolbarIcon, Object.assign({}, rest, { active: active, onClick: onClick }));
26
+ }
27
+
28
+ exports.HeadingToolbarIcon = HeadingToolbarIcon;
29
+ exports.useToggleHeadingTool = useToggleHeadingTool;
@@ -0,0 +1,2 @@
1
+ export * from './useToggleHeadingTool';
2
+ export { HeadingToolbarIconProps, default as HeadingToolbarIcon } from './HeadingToolbarIcon';
@@ -0,0 +1,2 @@
1
+ export { useToggleHeadingTool } from './useToggleHeadingTool.js';
2
+ export { default as HeadingToolbarIcon } from './HeadingToolbarIcon.js';
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "@quadrats/react/heading/toolbar",
3
+ "sideEffects": false,
4
+ "main": "./index.cjs.js",
5
+ "module": "./index.js",
6
+ "typings": "./index.d.ts"
7
+ }
@@ -0,0 +1,6 @@
1
+ import { HeadingLevel } from '@quadrats/common/heading';
2
+ import { ReactHeading } from '@quadrats/react/heading';
3
+ export declare function useToggleHeadingTool<Level extends HeadingLevel, ValidLevel extends Level>(controller: ReactHeading<Level>, level: ValidLevel): {
4
+ active: boolean;
5
+ onClick: () => void;
6
+ };
@@ -0,0 +1,11 @@
1
+ import { useQuadrats } from '@quadrats/react';
2
+
3
+ function useToggleHeadingTool(controller, level) {
4
+ const editor = useQuadrats();
5
+ return {
6
+ active: controller.isSelectionInHeading(editor, level),
7
+ onClick: () => controller.toggleHeadingNodes(editor, level),
8
+ };
9
+ }
10
+
11
+ export { useToggleHeadingTool };
@@ -0,0 +1,15 @@
1
+ /// <reference types="react" />
2
+ import { Heading, HeadingElement, HeadingLevel } from '@quadrats/common/heading';
3
+ import { WithCreateHandlers, WithCreateRenderElement, RenderElementProps } from '@quadrats/react';
4
+ export declare type RenderHeadingElementProps = RenderElementProps<HeadingElement>;
5
+ export interface ReactHeadingCreateHandlersOptions {
6
+ /**
7
+ * The hotkey to toggle heading w/ specific level.
8
+ */
9
+ hotkey?: string;
10
+ }
11
+ export interface ReactHeadingCreateRenderElementOptions {
12
+ render?: (props: RenderHeadingElementProps) => JSX.Element | null | undefined;
13
+ }
14
+ export interface ReactHeading<Level extends HeadingLevel> extends Heading<Level>, WithCreateHandlers<[ReactHeadingCreateHandlersOptions?]>, WithCreateRenderElement<[ReactHeadingCreateRenderElementOptions?]> {
15
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quadrats/react",
3
- "version": "0.4.0",
3
+ "version": "0.4.3",
4
4
  "description": "",
5
5
  "author": "Rytass",
6
6
  "homepage": "https://github.com/Quadrats/quadrats#readme",