From 0fcb0d03a0876afe92a9b3c238809e25170fd44e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20B=C3=A4dorf?= Date: Fri, 30 Dec 2022 00:33:04 +0100 Subject: [PATCH] Start work on inline tools --- docs/creating-blocks/index.md | 4 + packages/core/lib/components/Block.tsx | 1 + .../core/lib/components/Contenteditable.tsx | 76 + packages/core/lib/components/Main.tsx | 28 +- packages/core/lib/index.ts | 6 + packages/core/lib/inline/InlineToolbar.scss | 12 + packages/core/lib/inline/InlineToolbar.tsx | 115 ++ packages/core/lib/inline/dom.ts | 37 + packages/core/lib/inline/index.ts | 4 + packages/core/lib/inline/selection.ts | 93 ++ packages/core/lib/inline/use-inline.ts | 49 + packages/core/lib/types.ts | 19 + packages/core/lib/use-activation.ts | 4 +- packages/core/lib/use-block-tree.ts | 8 +- packages/core/lib/use-resize-observer.ts | 4 +- packages/core/lib/use-root-element.ts | 11 + packages/example-site/app.scss | 4 +- packages/example-site/app.tsx | 4 +- .../components/{admin => _}/Nav.scss | 25 +- packages/example-site/components/_/Nav.tsx | 67 + .../example-site/components/admin/Nav.tsx | 73 - packages/example-site/nuxt.config.ts | 1 + packages/example-site/package-lock.json | 49 +- packages/example-site/package.json | 6 +- .../example-site/pages/{admin => _}/login.tsx | 0 packages/example-site/plugins/fontawesome.ts | 19 - packages/italic/lib/ItalicToolUI.tsx | 0 packages/italic/lib/index.ts | 8 + packages/italic/lib/ui.tsx | 28 + packages/italic/lib/util.ts | 25 + packages/italic/package-lock.json | 1334 +++++++++++++++++ packages/italic/package.json | 36 + packages/paragraph/lib/edit.tsx | 32 +- 33 files changed, 2013 insertions(+), 169 deletions(-) create mode 100644 packages/core/lib/components/Contenteditable.tsx create mode 100644 packages/core/lib/inline/InlineToolbar.scss create mode 100644 packages/core/lib/inline/InlineToolbar.tsx create mode 100644 packages/core/lib/inline/dom.ts create mode 100644 packages/core/lib/inline/index.ts create mode 100644 packages/core/lib/inline/selection.ts create mode 100644 packages/core/lib/inline/use-inline.ts create mode 100644 packages/core/lib/use-root-element.ts rename packages/example-site/components/{admin => _}/Nav.scss (82%) create mode 100644 packages/example-site/components/_/Nav.tsx delete mode 100644 packages/example-site/components/admin/Nav.tsx rename packages/example-site/pages/{admin => _}/login.tsx (100%) delete mode 100644 packages/example-site/plugins/fontawesome.ts create mode 100644 packages/italic/lib/ItalicToolUI.tsx create mode 100644 packages/italic/lib/index.ts create mode 100644 packages/italic/lib/ui.tsx create mode 100644 packages/italic/lib/util.ts create mode 100644 packages/italic/package-lock.json create mode 100644 packages/italic/package.json diff --git a/docs/creating-blocks/index.md b/docs/creating-blocks/index.md index 002105d..2aaa518 100644 --- a/docs/creating-blocks/index.md +++ b/docs/creating-blocks/index.md @@ -21,3 +21,7 @@ export default { view: defineAsyncComponent(() => import('./view')), } as IBlockDefinition; ``` + +## Go by example + +As Schlechtenburg is still in active development, it's good to check out the official blocks to see what they look like. diff --git a/packages/core/lib/components/Block.tsx b/packages/core/lib/components/Block.tsx index 77415a4..62c542a 100644 --- a/packages/core/lib/components/Block.tsx +++ b/packages/core/lib/components/Block.tsx @@ -164,6 +164,7 @@ export const SbBlock = defineComponent({ eventRemoveSelf={props.eventRemoveSelf} eventActivatePrevious={props.eventActivatePrevious} eventActivateNext={props.eventActivateNext} + data-sb-block--content {...{ onClick: ($event: MouseEvent) => { diff --git a/packages/core/lib/components/Contenteditable.tsx b/packages/core/lib/components/Contenteditable.tsx new file mode 100644 index 0000000..1501c5e --- /dev/null +++ b/packages/core/lib/components/Contenteditable.tsx @@ -0,0 +1,76 @@ +import { + ref, + Ref, + h, + defineComponent, + onMounted, + onBeforeUnmount, + PropType, + watchEffect, +} from 'vue'; +import { useInline } from '../inline'; + +export const SbContenteditable = defineComponent({ + name: 'sb-contenteditable', + + props: { + inputRef: { + type: (null as unknown) as PropType>, + default: ref(null), + }, + tag: { type: String, default: 'div' }, + + value: { type: String, default: '' }, + + onValueChange: { + type: (null as unknown) as PropType<(value: string) => void>, + default: (_:string) => {}, + }, + }, + + setup(props) { + const { + registerClient, + unregisterClient, + } = useInline(); + const onKeyup = (event: KeyboardEvent) => { + if (event.code !== 'Backspace' && event.code !== 'Delete') { + return; + } + + if (!props.inputRef.value) { + return; + } + + const textContent = props.inputRef.value.textContent; + if (textContent === '') { + props.inputRef.value.innerHTML = ''; + } + }; + + onMounted(() => { + props.inputRef.value?.focus(); + registerClient(props.inputRef.value!); + }); + + watchEffect(() => { + if (props.inputRef.value && props.inputRef.value.innerHTML != props.value) { + props.inputRef.value.innerHTML = props.value; + } + }); + + onBeforeUnmount(() => { + unregisterClient(props.inputRef.value!); + }); + + return () => h(props.tag, { + class: 'sb-contenteditable', + contenteditable: 'true', + ref: props.inputRef, + onKeyup, + onInput: () => { + props.onValueChange(props.inputRef.value?.innerHTML || ''); + }, + }); + }, +}); diff --git a/packages/core/lib/components/Main.tsx b/packages/core/lib/components/Main.tsx index 1107d2e..adadcd4 100644 --- a/packages/core/lib/components/Main.tsx +++ b/packages/core/lib/components/Main.tsx @@ -2,6 +2,7 @@ import { defineComponent, provide, shallowReactive, + shallowRef, ref, watch, computed, @@ -15,6 +16,8 @@ import { IBlockLibrary, ITreeNode, OnUpdateBlockCb, + IInlineToolDefinition, + IInlineToolLibrary, } from '../types'; import { model } from '../block-helpers'; import { SymMode, SbMode } from '../mode'; @@ -26,12 +29,19 @@ import { } from '../use-block-tree'; import { SymEditorDimensions, useResizeObserver } from '../use-resize-observer'; import { SymActiveBlock } from '../use-activation'; +import { SymRootElement } from '../use-root-element'; +import { + SbInlineToolbar, + SymInlineToolbarClients, + SymInlineToolLibrary, +} from '../inline'; import { SbMainMenu } from './MainMenu'; import { SbBlock } from './Block'; export interface ISbMainProps { availableBlocks: IBlockDefinition[]; + availableInlineTools: IInlineToolDefinition[]; block: IBlockData; eventUpdate: OnUpdateBlockCb; mode: SbMode; @@ -49,6 +59,10 @@ export const SbMain = defineComponent({ type: Array as PropType[]>, default: () => [], }, + availableInlineTools: { + type: Array as PropType, + default: () => [], + }, block: { type: Object as PropType>, required: true, @@ -72,6 +86,10 @@ export const SbMain = defineComponent({ setup(props: ISbMainProps) { const el: Ref = ref(null); useResizeObserver(el, SymEditorDimensions); + provide(SymRootElement, el); + + const inlineClients = shallowRef([]); + provide(SymInlineToolbarClients, inlineClients); const mode = ref(props.mode); provide(SymMode, mode); @@ -99,9 +117,16 @@ export const SbMain = defineComponent({ {}, ), }); - provide(SymBlockLibrary, blockLibrary); + const inlineToolLibrary: IInlineToolLibrary = shallowReactive({ + ...props.availableInlineTools.reduce( + (tools: IInlineToolLibrary, tool: IInlineToolDefinition) => ({ ...tools, [tool.name]: tool }), + {}, + ), + }); + provide(SymInlineToolLibrary, inlineToolLibrary); + return () => (
+
); }, diff --git a/packages/core/lib/index.ts b/packages/core/lib/index.ts index 4f0ae5e..dab71bd 100644 --- a/packages/core/lib/index.ts +++ b/packages/core/lib/index.ts @@ -1,6 +1,8 @@ export * from './mode'; export * from './types'; +export * from './inline'; + export * from './block-helpers'; export * from './use-activation'; @@ -8,10 +10,14 @@ export * from './use-dynamic-blocks'; export * from './use-resize-observer'; export * from './components/Main'; + export * from './components/Block'; export * from './components/BlockPicker'; export * from './components/BlockOrdering'; export * from './components/BlockPlaceholder'; + +export * from './components/Contenteditable'; + export * from './components/Toolbar'; export * from './components/Button'; export * from './components/Select'; diff --git a/packages/core/lib/inline/InlineToolbar.scss b/packages/core/lib/inline/InlineToolbar.scss new file mode 100644 index 0000000..60d55d0 --- /dev/null +++ b/packages/core/lib/inline/InlineToolbar.scss @@ -0,0 +1,12 @@ +.sb-inline-toolbar { + position: absolute; + background-color: var(--bg); + height: 2rem; + min-width: 2rem; + display: flex; + z-index: var(--z-toolbar); + + &_hidden { + display: none; + } +} diff --git a/packages/core/lib/inline/InlineToolbar.tsx b/packages/core/lib/inline/InlineToolbar.tsx new file mode 100644 index 0000000..3dbe77b --- /dev/null +++ b/packages/core/lib/inline/InlineToolbar.tsx @@ -0,0 +1,115 @@ +import { + ref, + Ref, + onMounted, + onBeforeUnmount, + defineComponent, + computed, +} from 'vue'; +import debounce from 'lodash/debounce'; +import { useRootElement } from '../use-root-element'; +import { useInline } from './use-inline'; +import { + getSelection, + getAnchorElementForSelection, + getRangeFromSelection, + getRect, +} from './selection'; + +import './InlineToolbar.scss'; + +export const SbInlineToolbar = defineComponent({ + name: 'sb-inlinetoolbar', + + setup() { + const { rootElement } = useRootElement(); + const { + clients, + getAllTools, + } = useInline(); + + const allTools = computed(() => getAllTools()); + + const selectionRect: Ref= ref(null); + const updateSelectionRect = () => { + const selection = getSelection(); + if (!selection) { + console.warn('Could not get selection'); + return; + } + selectionRect.value = getRect(selection); + }; + + const showing: Ref = ref(false); + + const show = () => { + showing.value = true; + updateSelectionRect(); + }; + const hide = () => { showing.value = false; }; + + const style = computed(() => { + const rootRect = rootElement.value?.getBoundingClientRect(); + const x = (selectionRect.value?.x || 0) + - (rootRect?.left || 0); + const y = (selectionRect.value?.y || 0) + + (selectionRect.value?.height || 0) + - (rootRect?.top || 0); + return { + left: Math.floor(x) + 'px', + top: Math.floor(y) + 'px', + }; + }); + + const classes = computed(() => ({ + 'sb-inline-toolbar': true, + 'sb-inline-toolbar_hidden': !showing.value, + })); + + const onSelectionChanged = debounce(() => { + const selection = getSelection(); + if (!selection) { + console.warn('Could not get selection'); + return + } + + const range = getRangeFromSelection(selection); + // If we're not selecting anything, bail + if (!range || range.endOffset === range.startOffset) { + hide(); + return; + } + + const focusedElement = getAnchorElementForSelection(selection); + if (!focusedElement) { + hide(); + return; + } + + // If new selection is not in registered clients, close it + if (!clients.value.find(client => client === focusedElement)) { + hide(); + return; + } + + show(); + }, 50); + + onMounted(() => { + rootElement.value?.addEventListener('click', close); + document.addEventListener('selectionchange', onSelectionChanged, true); + }); + + onBeforeUnmount(() => { + rootElement.value?.removeEventListener('click', close); + document.removeEventListener('selectionchange', onSelectionChanged); + }); + + return () => allTools.value.length + ?
{allTools.value.map(tool => tool.ui)}
+ : null; + }, +}); diff --git a/packages/core/lib/inline/dom.ts b/packages/core/lib/inline/dom.ts new file mode 100644 index 0000000..65ad0d8 --- /dev/null +++ b/packages/core/lib/inline/dom.ts @@ -0,0 +1,37 @@ +/* + * Copyright notice: + * + * Large parts of this file are heavily inspired if not downright copied from editor.js, + * copyright MIT. + * https://editorjs.io/ + */ + +/** + * Check if object is DOM node + * + * @param {*} node - object to check + * @returns {boolean} + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const isElement = (node: any): node is Element => { + if (node instanceof Number) { + return false; + } + + return node && node.nodeType && node.nodeType === Node.ELEMENT_NODE; +} + +/** + * Check if object is DocumentFragment node + * + * @param {object} node - object to check + * @returns {boolean} + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const isFragment = (node: any): node is DocumentFragment => { + if (node instanceof Number) { + return false; + } + + return node && node.nodeType && node.nodeType === Node.DOCUMENT_FRAGMENT_NODE; +} diff --git a/packages/core/lib/inline/index.ts b/packages/core/lib/inline/index.ts new file mode 100644 index 0000000..13d8e9a --- /dev/null +++ b/packages/core/lib/inline/index.ts @@ -0,0 +1,4 @@ +export * from './InlineToolbar'; +export * from './use-inline'; +export * from './selection'; +export * from './dom'; diff --git a/packages/core/lib/inline/selection.ts b/packages/core/lib/inline/selection.ts new file mode 100644 index 0000000..0ed60c1 --- /dev/null +++ b/packages/core/lib/inline/selection.ts @@ -0,0 +1,93 @@ +/* + * Copyright notice: + * + * Large parts of this file are heavily inspired if not downright copied from editor.js, + * copyright MIT. + * https://editorjs.io/ + */ + +import { isElement } from './dom'; + +export const getSelection = globalThis.getSelection ? globalThis.getSelection : () => null; + +/** + * Returns range from passed Selection object + * + * @param selection - Selection object to get Range from + */ +export const getRangeFromSelection = (selection: Selection): Range|null => { + return selection && selection.rangeCount ? selection.getRangeAt(0) : null; +} + + +/** + * Returns selected anchor element + * + * @returns {Element|null} + */ +export const getAnchorElementForSelection = (selection: Selection): Element | null => { + const anchorNode = selection.anchorNode; + + if (!anchorNode) { + return null; + } + + if (!isElement(anchorNode)) { + return anchorNode.parentElement; + } else { + return anchorNode; + } +} + +/** + * Calculates position and size of selected text + * + * @returns {DOMRect} + */ +export const getRect = (selection: Selection): DOMRect => { + const defaultRect = { + x: 0, + y: 0, + width: 0, + height: 0, + } as DOMRect; + + if (selection.rangeCount === null || isNaN(selection.rangeCount)) { + console.warn('Method SelectionUtils.rangeCount is not supported'); + return defaultRect; + } + + if (selection.rangeCount === 0) { + return defaultRect; + } + + const range = selection.getRangeAt(0).cloneRange() as Range; + + let rect = { ...defaultRect }; + + if (range.getBoundingClientRect) { + rect = range.getBoundingClientRect() as DOMRect; + } + // Fall back to inserting a temporary element + if (rect.x === 0 && rect.y === 0) { + const span = document.createElement('span'); + + if (span.getBoundingClientRect) { + // Ensure span has dimensions and position by + // adding a zero-width space character + span.appendChild(document.createTextNode('\u200b')); + range.insertNode(span); + rect = span.getBoundingClientRect() as DOMRect; + + const spanParent = span.parentNode; + if (spanParent) { + spanParent.removeChild(span); + + // Glue any broken text nodes back together + spanParent.normalize(); + } + } + } + + return rect; +}; diff --git a/packages/core/lib/inline/use-inline.ts b/packages/core/lib/inline/use-inline.ts new file mode 100644 index 0000000..6272739 --- /dev/null +++ b/packages/core/lib/inline/use-inline.ts @@ -0,0 +1,49 @@ +import { + ref, + Ref, + inject, + reactive, +} from 'vue'; +import { IInlineToolLibrary } from '../types'; + +export const SymInlineToolbarClients = Symbol('Schlechtenburg inline toolbar client elements'); +export const SymInlineToolLibrary = Symbol('Schlechtenburg inline tool library'); + +export const useInline = () => { + const clients: Ref = inject(SymInlineToolbarClients, ref([])); + const tools: IInlineToolLibrary = inject(SymInlineToolLibrary, reactive({})); + const getTool = (name: string) => tools[name]; + const getAllTools = () => Object.keys(tools).map(name => tools[name]); + + const setClients = (newClients: HTMLElement[]) => { + clients.value = newClients; + }; + + const clientIsRegistered = (el: HTMLElement) => !!clients.value.find(cl => cl === el); + + const registerClient = (el: HTMLElement) => { + if (clientIsRegistered(el)) { + console.warn('Not reregistering toolbar client that is already registered:', el); + return; + } + + setClients([ + ...clients.value, + el, + ]); + }; + + const unregisterClient = (el: HTMLElement) => { + setClients(clients.value.filter(cl => cl !== el)); + }; + + return { + tools, + getTool, + getAllTools, + + clients, + registerClient, + unregisterClient, + }; +}; diff --git a/packages/core/lib/types.ts b/packages/core/lib/types.ts index 5d4225e..8981d42 100644 --- a/packages/core/lib/types.ts +++ b/packages/core/lib/types.ts @@ -170,3 +170,22 @@ export interface IBlockDefinition { export interface IBlockLibrary { [name: string]: IBlockDefinition; } + +/** + * Any Block that you create + */ +export interface IInlineToolDefinition { + name: string; + ui: Component; + surround: (range: Range) => void; + checkState: (selection: Selection) => void; +} + +/** + * Schlechtenburg maintains a library of inline tools that are available + * + * @internal + */ +export interface IInlineToolLibrary { + [name: string]: IInlineToolDefinition; +} diff --git a/packages/core/lib/use-activation.ts b/packages/core/lib/use-activation.ts index 9def995..7b52e34 100644 --- a/packages/core/lib/use-activation.ts +++ b/packages/core/lib/use-activation.ts @@ -7,7 +7,7 @@ import { } from 'vue'; export const SymActiveBlock = Symbol('Schlechtenburg active block'); -export function useActivation(currentBlockId: string|null = null) { +export const useActivation = (currentBlockId: string|null = null) => { const activeBlockId: Ref = inject(SymActiveBlock, ref(null)); const isActive = computed(() => activeBlockId.value === currentBlockId); @@ -46,4 +46,4 @@ export function useActivation(currentBlockId: string|null = null) { deactivate, requestActivation, }; -} +}; diff --git a/packages/core/lib/use-block-tree.ts b/packages/core/lib/use-block-tree.ts index 656b23c..2c18504 100644 --- a/packages/core/lib/use-block-tree.ts +++ b/packages/core/lib/use-block-tree.ts @@ -10,14 +10,12 @@ import { ITreeNode, IBlockData, } from './types'; -import { useDynamicBlocks } from './use-dynamic-blocks'; -import { SbMode } from './mode'; export const SymBlockTree= Symbol('Schlechtenburg block tree'); export const SymBlockTreeRegister = Symbol('Schlechtenburg block tree register'); export const SymBlockTreeUnregister = Symbol('Schlechtenburg block tree unregister'); -export function useBlockTree() { +export const useBlockTree = () => { const blockTree: Ref = inject(SymBlockTree, ref(null)); const registerWithParent = inject(SymBlockTreeRegister, (_b: ITreeNode, _i: number) => {}); const unregisterWithParent = inject(SymBlockTreeUnregister, (_b: ITreeNode) => {}); @@ -52,8 +50,6 @@ export function useBlockTree() { self.children = self.children.filter((child: ITreeNode) => child.id !== id); }); - const { mode } = useDynamicBlocks(); - const register = (block: IBlockData, index: number = 0) => { if (!block.id) { throw new Error(`Cannot register a block without an id: ${JSON.stringify(block)}`); @@ -77,4 +73,4 @@ export function useBlockTree() { blockTree, register, }; -} +}; diff --git a/packages/core/lib/use-resize-observer.ts b/packages/core/lib/use-resize-observer.ts index 6d1b22c..5dc902f 100644 --- a/packages/core/lib/use-resize-observer.ts +++ b/packages/core/lib/use-resize-observer.ts @@ -16,7 +16,7 @@ interface BlockRect { export const SymBlockDimensions = Symbol('Schlechtenburg block dimensions'); export const SymEditorDimensions = Symbol('Schlechtenburg editor dimensions'); -export function useResizeObserver(el: Ref, symbol: symbol) { +export const useResizeObserver = (el: Ref, symbol: symbol) => { const dimensions: Ref = ref(null); provide(symbol, dimensions); const triggerSizeCalculation = () => { @@ -47,7 +47,7 @@ export function useResizeObserver(el: Ref, symbol: symbol) { }) return { triggerSizeCalculation, dimensions }; -} +}; export function useBlockSizing() { const editorDimensions: Ref = inject(SymEditorDimensions, ref(null)); diff --git a/packages/core/lib/use-root-element.ts b/packages/core/lib/use-root-element.ts new file mode 100644 index 0000000..700bd79 --- /dev/null +++ b/packages/core/lib/use-root-element.ts @@ -0,0 +1,11 @@ +import { + Ref, + ref, + inject, +} from 'vue'; + +export const SymRootElement = Symbol('Schlechtenburg root element'); +export const useRootElement = () => { + const rootElement: Ref = inject(SymRootElement, ref(null)); + return { rootElement }; +}; diff --git a/packages/example-site/app.scss b/packages/example-site/app.scss index 27d6d36..2001af0 100644 --- a/packages/example-site/app.scss +++ b/packages/example-site/app.scss @@ -43,7 +43,7 @@ body { box-sizing: border-box; } - &--admin-nav { + &--edit-nav { z-index: 100; position: fixed; top: 0; @@ -62,7 +62,7 @@ body { @media screen and (min-width: 1000px) { --ex-nav-width: var(--ex-nav-expanded-width); - &--admin-nav { + &--edit-nav { position: unset; width: unset; flex-basis: var(--ex-nav-width); diff --git a/packages/example-site/app.tsx b/packages/example-site/app.tsx index f3d5ca5..f4d76a9 100644 --- a/packages/example-site/app.tsx +++ b/packages/example-site/app.tsx @@ -3,14 +3,14 @@ import { NuxtPage } from '#components'; import './app.scss'; -const AdminNav = defineAsyncComponent(() => import('~~/components/admin/Nav')); +const AdminNav = defineAsyncComponent(() => import('~~/components/_/Nav')); export default defineComponent({ setup() { const { me } = useMe(); return () => (
- {me.value ? : null} + {me.value ? : null}
); diff --git a/packages/example-site/components/admin/Nav.scss b/packages/example-site/components/_/Nav.scss similarity index 82% rename from packages/example-site/components/admin/Nav.scss rename to packages/example-site/components/_/Nav.scss index f4d7fc2..b68da8c 100644 --- a/packages/example-site/components/admin/Nav.scss +++ b/packages/example-site/components/_/Nav.scss @@ -1,10 +1,14 @@ -.ex-admin-nav { +.ex-edit-nav { background-color: white; width: var(--ex-nav-width); display: flex; flex-direction: column; align-items: stretch; - transition: width 0.2s ease; + + .icon { + height: 1.5rem; + width: 1.5rem; + } &_expanded { width: 300px; @@ -54,24 +58,17 @@ width: calc(100% - 60px); overflow: hidden; margin: 0px; - margin-left: 16px; - transition: opacity 0.1s ease; - } - - &-icon { - position: absolute; - left: calc((var(--ex-nav-width) / 2) - 8px); - right: 0; } } &_expanded &--menu-item { - &-title { - //width: calc(100% - (32px + 24px)); - opacity: 1; + &-action { + justify-content: flex-start; } - &-icon { + &-title { + opacity: 1; + margin-left: 16px; } } diff --git a/packages/example-site/components/_/Nav.tsx b/packages/example-site/components/_/Nav.tsx new file mode 100644 index 0000000..11a8b08 --- /dev/null +++ b/packages/example-site/components/_/Nav.tsx @@ -0,0 +1,67 @@ +import { defineComponent } from 'vue'; +import { NuxtLink } from '#components'; + +import './Nav.scss'; + +export default defineComponent({ + setup() { + const { setMe } = useMe(); + + const expanded = useState(() => false); + const toggle = () => { + expanded.value = !expanded.value; + }; + + const classes = computed(() => ({ + 'ex-edit-nav': true, + 'ex-edit-nav_expanded': expanded.value, + })); + + const logout = () => { + setMe(null); + useGqlToken({ + token: null, + config: { type: 'Bearer' }, + }); + }; + + return () => ( + + ); + }, +}); diff --git a/packages/example-site/components/admin/Nav.tsx b/packages/example-site/components/admin/Nav.tsx deleted file mode 100644 index 052adcc..0000000 --- a/packages/example-site/components/admin/Nav.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { defineComponent } from 'vue'; -import { NuxtLink } from '#components'; - -import './Nav.scss'; - -export default defineComponent({ - setup() { - const { setMe } = useMe(); - - const expanded = useState(() => false); - const toggle = () => { - expanded.value = !expanded.value; - }; - - const classes = computed(() => ({ - 'ex-admin-nav': true, - 'ex-admin-nav_expanded': expanded.value, - })); - - const logout = () => { - setMe(null); - useGqlToken({ - token: null, - config: { type: 'Bearer' }, - }); - }; - - return () => ( - - ); - }, -}); diff --git a/packages/example-site/nuxt.config.ts b/packages/example-site/nuxt.config.ts index 3e7d927..4e99c64 100644 --- a/packages/example-site/nuxt.config.ts +++ b/packages/example-site/nuxt.config.ts @@ -3,6 +3,7 @@ import { defineNuxtConfig } from 'nuxt/config'; export default defineNuxtConfig({ modules: [ 'nuxt-graphql-client', + 'nuxt-icon', ], runtimeConfig: { diff --git a/packages/example-site/package-lock.json b/packages/example-site/package-lock.json index 9a1ff5c..11c7004 100644 --- a/packages/example-site/package-lock.json +++ b/packages/example-site/package-lock.json @@ -812,32 +812,6 @@ "dev": true, "optional": true }, - "@fortawesome/fontawesome-common-types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz", - "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==" - }, - "@fortawesome/fontawesome-svg-core": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz", - "integrity": "sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA==", - "requires": { - "@fortawesome/fontawesome-common-types": "6.2.1" - } - }, - "@fortawesome/free-solid-svg-icons": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.1.tgz", - "integrity": "sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw==", - "requires": { - "@fortawesome/fontawesome-common-types": "6.2.1" - } - }, - "@fortawesome/vue-fontawesome": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.2.tgz", - "integrity": "sha512-xHVtVY8ASUeEvgcA/7vULUesENhD+pi/EirRHdMBqooHlXBqK+yrV6d8tUye1m5UKQKVgYAHMhUBfOnoiwvc8Q==" - }, "@graphql-codegen/cli": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-2.16.1.tgz", @@ -2033,6 +2007,19 @@ "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==" }, + "@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" + }, + "@iconify/vue": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@iconify/vue/-/vue-4.0.2.tgz", + "integrity": "sha512-LRp+mYh8N0bcX4lustHtI5o1aEoio9HN3/19uIzVOvI78qopKBjzsDK5hkEZYDSc6+LKG8hfLxTxpW8CejXGZg==", + "requires": { + "@iconify/types": "^2.0.0" + } + }, "@ioredis/commands": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", @@ -2165,7 +2152,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.0.0.tgz", "integrity": "sha512-7ZsOLt5s9a0ZleAIzmoD70JwkZf5ti6bDdxl6f8ew7Huxz+ni/oRfTPTX9TrORXsgW5CvDt6Q9M7IJNPkAN/Iw==", - "dev": true, "requires": { "@nuxt/schema": "3.0.0", "c12": "^1.0.1", @@ -6713,6 +6699,15 @@ } } }, + "nuxt-icon": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/nuxt-icon/-/nuxt-icon-0.1.8.tgz", + "integrity": "sha512-oPFlLOZCy80MN+hf49+mBkOIHWVF3sOqZREQZw3qD0N6wGlR15QeRQtKQC8qGeQcc+xvpLQm0GvrdJ8FxFOPYg==", + "requires": { + "@iconify/vue": "^4.0.1", + "@nuxt/kit": "^3.0.0" + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", diff --git a/packages/example-site/package.json b/packages/example-site/package.json index 214fc90..be2e93a 100644 --- a/packages/example-site/package.json +++ b/packages/example-site/package.json @@ -13,9 +13,6 @@ "nuxt": "3.0.0" }, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^6.2.1", - "@fortawesome/free-solid-svg-icons": "^6.2.1", - "@fortawesome/vue-fontawesome": "^3.0.2", "@graphql-codegen/cli": "^2.16.1", "@schlechtenburg/core": "^0.0.0", "@schlechtenburg/heading": "^0.0.0", @@ -24,6 +21,7 @@ "@schlechtenburg/paragraph": "^0.0.0", "@schlechtenburg/style": "^0.0.0", "event-target-polyfill": "^0.0.3", - "nuxt-graphql-client": "^0.2.23" + "nuxt-graphql-client": "^0.2.23", + "nuxt-icon": "^0.1.8" } } diff --git a/packages/example-site/pages/admin/login.tsx b/packages/example-site/pages/_/login.tsx similarity index 100% rename from packages/example-site/pages/admin/login.tsx rename to packages/example-site/pages/_/login.tsx diff --git a/packages/example-site/plugins/fontawesome.ts b/packages/example-site/plugins/fontawesome.ts deleted file mode 100644 index b02f98a..0000000 --- a/packages/example-site/plugins/fontawesome.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { library } from '@fortawesome/fontawesome-svg-core'; -import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'; -import { - faRightFromBracket, - faHome, - faArrowRight, - faArrowLeft, -} from '@fortawesome/free-solid-svg-icons'; - -/* add icons to the library */ -library.add(faRightFromBracket); -library.add(faArrowRight); -library.add(faArrowLeft); -library.add(faHome); - - -export default defineNuxtPlugin((nuxtApp) => { - nuxtApp.vueApp.component('font-awesome-icon', FontAwesomeIcon); -}) diff --git a/packages/italic/lib/ItalicToolUI.tsx b/packages/italic/lib/ItalicToolUI.tsx new file mode 100644 index 0000000..e69de29 diff --git a/packages/italic/lib/index.ts b/packages/italic/lib/index.ts new file mode 100644 index 0000000..20e3072 --- /dev/null +++ b/packages/italic/lib/index.ts @@ -0,0 +1,8 @@ +import { defineAsyncComponent } from 'vue'; + +export const name = 'sb-italic'; + +export default { + name, + ui: defineAsyncComponent(() => import('./ui')), +}; diff --git a/packages/italic/lib/ui.tsx b/packages/italic/lib/ui.tsx new file mode 100644 index 0000000..d4c9814 --- /dev/null +++ b/packages/italic/lib/ui.tsx @@ -0,0 +1,28 @@ +import { defineComponent } from 'vue'; +import { + SbButton, + getSelection, + getRangeFromSelection, +} from '@schlechtenburg/core'; +import { surround } from './util'; + +export default defineComponent({ + async setup() { + return () => { + const selection = getSelection(); + if (!selection) { + return; + } + + const range = getRangeFromSelection(selection); + if (!range) { + return; + } + + surround(range); + }} + >i; + }, +}); diff --git a/packages/italic/lib/util.ts b/packages/italic/lib/util.ts new file mode 100644 index 0000000..717b00c --- /dev/null +++ b/packages/italic/lib/util.ts @@ -0,0 +1,25 @@ +import { + getSelection, + getRangeFromSelection, +} from '@schlechtenburg/core'; + +/** + * Wrap range with tag + */ +export const surround = (range: Range) => { + range.surroundContents(document.createElement('i')); +} + +/** + * Check selection and set activated state to button if there are tag + */ +export const checkState = (): boolean => { + const selection = getSelection(); + const range = getRangeFromSelection(selection); + + console.log(range); + + const isActive = document.queryCommandState('italic'); + + return isActive; +} diff --git a/packages/italic/package-lock.json b/packages/italic/package-lock.json new file mode 100644 index 0000000..515a81c --- /dev/null +++ b/packages/italic/package-lock.json @@ -0,0 +1,1334 @@ +{ + "name": "@schlechtenburg/italic", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "dev": true, + "requires": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/parser": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.7.tgz", + "integrity": "sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==", + "dev": true + }, + "@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "dependencies": { + "@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz", + "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.1", + "@babel/types": "^7.12.1", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz", + "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@intlify/core": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/core/-/core-9.2.2.tgz", + "integrity": "sha512-ldTDIwi4Lm1+KhCYWL/y++3UwgtZ1qU2gWjKjh30lQJUX2GN0zJbCggJmcKVMzdnuVniOOcjMEgGhj690LFdMQ==", + "dev": true, + "requires": { + "@intlify/core-base": "9.2.2" + } + }, + "@intlify/core-base": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz", + "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", + "dev": true, + "requires": { + "@intlify/devtools-if": "9.2.2", + "@intlify/message-compiler": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2" + } + }, + "@intlify/devtools-if": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", + "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", + "dev": true, + "requires": { + "@intlify/shared": "9.2.2" + } + }, + "@intlify/message-compiler": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", + "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", + "dev": true, + "requires": { + "@intlify/shared": "9.2.2", + "source-map": "0.6.1" + } + }, + "@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "dev": true + }, + "@intlify/vue-devtools": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz", + "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==", + "dev": true, + "requires": { + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dev": true, + "requires": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dev": true, + "requires": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + } + }, + "@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dev": true, + "requires": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "dev": true + }, + "@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dev": true, + "requires": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + } + }, + "@types/braces": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/braces/-/braces-3.0.1.tgz", + "integrity": "sha512-+euflG6ygo4bn0JHtn4pYqcXwRtLvElQ7/nnjDu7iYG56H0+OhCd7d6Ug0IE3WcFpZozBKW2+80FUbv5QGk5AQ==", + "dev": true + }, + "@types/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-oqXqVb0ci19GtH0vOA/U2TmHTcRY9kuZl4mqUxe0QmJAlIW13kzhuK5pi1i9+ngav8FjpSb9FVS/GE00GLX1VA==", + "dev": true, + "requires": { + "@types/braces": "*" + } + }, + "@vue/compiler-core": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", + "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", + "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", + "dev": true, + "requires": { + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", + "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.45", + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-ssr": "3.2.45", + "@vue/reactivity-transform": "3.2.45", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", + "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "@vue/reactivity": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz", + "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", + "dev": true, + "requires": { + "@vue/shared": "3.2.45" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", + "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz", + "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", + "dev": true, + "requires": { + "@vue/reactivity": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "@vue/runtime-dom": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", + "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", + "dev": true, + "requires": { + "@vue/runtime-core": "3.2.45", + "@vue/shared": "3.2.45", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz", + "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", + "dev": true, + "requires": { + "@vue/compiler-ssr": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "@vue/shared": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", + "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==", + "dev": true + }, + "@vuedx/analyze": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@vuedx/analyze/-/analyze-0.6.3.tgz", + "integrity": "sha512-LiQ7Ppw4nEr5qjth+gg1m48yXD7usOcAygUU10lLwfRRlDZevxAdZRcNuC0vBOXUG3xbl6CSDXnAMeWFdlUiyw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.1", + "@babel/parser": "^7.12.3", + "@babel/template": "^7.12.7", + "@babel/traverse": "7.12.1", + "@babel/types": "7.12.1", + "@types/micromatch": "^4.0.1", + "@vuedx/compiler-sfc": "0.6.2", + "@vuedx/compiler-tsx": "0.6.3", + "@vuedx/projectconfig": "0.6.2", + "@vuedx/shared": "0.6.2", + "@vuedx/template-ast-types": "0.6.2", + "cli-highlight": "^2.1.4", + "commander": "^6.1.0", + "fast-glob": "^3.2.4", + "hash-sum": "^2.0.0", + "micromatch": "^4.0.2" + } + }, + "@vuedx/compiler-sfc": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@vuedx/compiler-sfc/-/compiler-sfc-0.6.2.tgz", + "integrity": "sha512-mJehCyO6BJiHCLPfVQQZb7RliuwBh7voGkrF27SkA3yhv44VSDaMbDIX2VRm3utl1CacFEVdNFqB9QYviZByfg==", + "dev": true, + "requires": { + "@vue/compiler-core": "^3.0.2", + "lru-cache": "^6.0.0", + "source-map": "^0.6.1" + } + }, + "@vuedx/compiler-tsx": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@vuedx/compiler-tsx/-/compiler-tsx-0.6.3.tgz", + "integrity": "sha512-H1SSgUHQXWoTnrIxvl9uXGMUqKlWjNddp8xc+EAg7BRQ4F7kFzHTzOsafG5xzrqnmZujj8cLUknG123rWgsxIg==", + "dev": true, + "requires": { + "@babel/parser": "7.12.3", + "@babel/types": "7.12.1", + "@vue/compiler-core": "^3.0.1", + "@vuedx/shared": "0.6.2", + "@vuedx/template-ast-types": "0.6.2" + }, + "dependencies": { + "@babel/parser": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz", + "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==", + "dev": true + } + } + }, + "@vuedx/projectconfig": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@vuedx/projectconfig/-/projectconfig-0.6.2.tgz", + "integrity": "sha512-qoekczmYpg4bOHMUduGgwGEWYq2CZL9HfztNzSPaJnErTBc4VNFnCBLsAtFPLkILASh6vzE2m/EpIzSpMW5mJQ==", + "dev": true + }, + "@vuedx/shared": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@vuedx/shared/-/shared-0.6.2.tgz", + "integrity": "sha512-xCXK+X5iDXkNfLglxFGFeEtqSWlopU8Cj6dGgMABWlee7HVDl47A4sj5oQpKuTjwRJHyE+BYtgGxtf1eLee5Yg==", + "dev": true, + "requires": { + "@sentry/node": "^5.30.0", + "node-unique-machine-id": "^1.1.0", + "uuid": "^8.3.2" + } + }, + "@vuedx/template-ast-types": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@vuedx/template-ast-types/-/template-ast-types-0.6.2.tgz", + "integrity": "sha512-TY3IesmF6/XbZnlLnImE30MXVJeXpMh8F5ZKZeeVDIvDWmPDZ6fC8DbDj1GycZtx77C85yZRnJJqq5v0AED4aw==", + "dev": true, + "requires": { + "@vue/compiler-core": "^3.0.0" + } + }, + "@vuedx/typecheck": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@vuedx/typecheck/-/typecheck-0.6.3.tgz", + "integrity": "sha512-1WfUI+bqg1O8Vklz24EZdsUE6ak4QCxtV6gWrUw+VUbep7ANhZM4RkaMsDFWVdeb2dip9ROrO8ESBrsIViPT8Q==", + "dev": true, + "requires": { + "@vuedx/shared": "0.6.2", + "@vuedx/typescript-plugin-vue": "0.6.3", + "@vuedx/vue-virtual-textdocument": "0.6.3", + "chalk": "^4.1.0", + "fast-glob": "^3.2.4", + "minimist": "^1.2.5", + "resolve-from": "^5.0.0", + "typescript": "^4.0.3" + } + }, + "@vuedx/typescript-plugin-vue": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@vuedx/typescript-plugin-vue/-/typescript-plugin-vue-0.6.3.tgz", + "integrity": "sha512-zAhXM9LDVYvjAMnTiqf6yZcJXXh1rQrH3JhcmQNmlxk26sRysfa/VWNC8qkfq9vcOKRf1eQusH4g+Vov6qPGig==", + "dev": true, + "requires": { + "@intlify/core": "^9.0.0-beta.15", + "@vuedx/analyze": "0.6.3", + "@vuedx/compiler-sfc": "0.6.2", + "@vuedx/projectconfig": "0.6.2", + "@vuedx/shared": "0.6.2", + "@vuedx/template-ast-types": "0.6.2", + "@vuedx/vue-virtual-textdocument": "0.6.3", + "de-indent": "^1.0.2", + "json5": "^2.1.3", + "quick-lru": "^5.1.1", + "vscode-uri": "^2.1.2", + "vscode-web-custom-data": "^0.3.2" + } + }, + "@vuedx/vue-virtual-textdocument": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@vuedx/vue-virtual-textdocument/-/vue-virtual-textdocument-0.6.3.tgz", + "integrity": "sha512-FN5h4GsIcYAIfFbal0+1ryddDgpxMx/gxGE5QYinbwj5PwILZzyAUt//drQfppIHzCL+TJuZSml7fAod5tYvQA==", + "dev": true, + "requires": { + "@vuedx/analyze": "0.6.3", + "@vuedx/compiler-sfc": "0.6.2", + "@vuedx/compiler-tsx": "0.6.3", + "@vuedx/shared": "0.6.2", + "source-map": "^0.6.1", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^2.1.2" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true + }, + "csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "dev": true + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "dev": true + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", + "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "dev": true + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dev": true + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "dev": true + }, + "node-unique-machine-id": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/node-unique-machine-id/-/node-unique-machine-id-1.1.0.tgz", + "integrity": "sha512-uJtdcFelVD08XdvxYWYzMYprSTPYl9CYiQbyGYbjXZcMZtLRlEqNUs+C/va/81DNgExsMHL5g0YDYQFS0pENRQ==", + "dev": true, + "requires": { + "uuid": "^3.3.3" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "dev": true + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "postcss": { + "version": "8.4.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", + "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", + "dev": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "dev": true + }, + "vscode-uri": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz", + "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==", + "dev": true + }, + "vscode-web-custom-data": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/vscode-web-custom-data/-/vscode-web-custom-data-0.3.6.tgz", + "integrity": "sha512-9r2DOv4YMXL/WBTBB6zxde93hmg6AM7thr7GMR6c5LvPxXe/lwD8gsrJGe0tha4CUvoz86ElUieThGVpM+4PLg==", + "dev": true + }, + "vue": { + "version": "3.2.45", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz", + "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", + "dev": true, + "requires": { + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-sfc": "3.2.45", + "@vue/runtime-dom": "3.2.45", + "@vue/server-renderer": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } +} diff --git a/packages/italic/package.json b/packages/italic/package.json new file mode 100644 index 0000000..d8ecd27 --- /dev/null +++ b/packages/italic/package.json @@ -0,0 +1,36 @@ +{ + "name": "@schlechtenburg/italic", + "version": "0.0.0", + "description": "> TODO: description", + "author": "Benjamin Bädorf ", + "homepage": "", + "license": "GPL-3.0-or-later", + "main": "lib/index.ts", + "scripts": { + "typecheck": "vuedx-typecheck --no-pretty ./lib", + "test": "echo \"Error: run tests from root\" && exit 1" + }, + "directories": { + "lib": "lib", + "test": "__tests__" + }, + "files": [ + "lib", + "docs" + ], + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git@git.b12f.io:b12f/schlechtenburg.git" + }, + "dependencies": { + "@schlechtenburg/core": "^0.0.0" + }, + "devDependencies": { + "@vuedx/typecheck": "^0.6.3", + "@vuedx/typescript-plugin-vue": "^0.6.3", + "vue": "^3.2.31" + } +} diff --git a/packages/paragraph/lib/edit.tsx b/packages/paragraph/lib/edit.tsx index 06487c2..7af05b0 100644 --- a/packages/paragraph/lib/edit.tsx +++ b/packages/paragraph/lib/edit.tsx @@ -14,6 +14,8 @@ import { SbToolbar, SbSelect, generateBlockId, + SbContenteditable, + getSelection, } from '@schlechtenburg/core'; import { isEmptyContentEditable } from './contenteditable'; import { @@ -77,21 +79,11 @@ export default defineComponent({ } }; - onMounted(() => { - focusInput(); - if (inputEl.value) { - inputEl.value.innerHTML = localData.value; - } - }); - watch(isActive, focusInput); watch(() => props.data, () => { localData.value = props.data.value; localData.align = props.data.align; - if (inputEl.value) { - inputEl.value.innerHTML = localData.value; - } }); const onTextUpdate = ($event: Event) => { @@ -136,7 +128,7 @@ export default defineComponent({ activate(id); $event.preventDefault(); - } + }window }; const onKeyup = ($event: KeyboardEvent) => { @@ -144,7 +136,7 @@ export default defineComponent({ props.eventRemoveSelf(); } - const selection = window.getSelection(); + const selection = getSelection(); const node = selection?.focusNode; const childNodes = Array.from(inputEl?.value?.childNodes || []); const index = node ? childNodes.indexOf(node as ChildNode) : -1; @@ -174,16 +166,22 @@ export default defineComponent({ -

{ + localData.value = value; + }} + onFocus={onFocus} onBlur={onBlur} onKeydown={onKeydown} onKeyup={onKeyup} - >

+ > ); },