From 77742af676d949167928a254a2367cff7cb3ab8b Mon Sep 17 00:00:00 2001 From: Nick Gerleman Date: Tue, 12 Dec 2023 09:06:58 -0800 Subject: [PATCH] Replace Playground with JSX Editor (#1500) Summary: Pull Request resolved: https://github.com/facebook/yoga/pull/1500 Inspired by the frequent usage of Expo snacks to run RN, to repro Yoga issues, this replaces the Playground port with a new ground up Playground UI. This UI right now is pretty simple, with a JSX editor which creates a Yoga tree, which is then rendered using the WebAssembly variant of Yoga. There are a lot of ways we can continue to improve this, but this merges the foundation. Subjectively, I find this more useful as a tool to play with Yoga behavior than the GUI. This also replaces some of the bits of the homepage, and adds a playground entrypoint (though it's pretty identical to the one I've been testing on the home page). Reviewed By: yungsters Differential Revision: D51963201 fbshipit-source-id: 1265cb1784151b685686e189d47ecd42cbacdf8f --- javascript/src/wrapAssembly.ts | 65 +- website-next/docusaurus.config.js | 7 +- website-next/package.json | 11 +- website-next/sidebars.cjs | 13 - .../src/components/EditorToolbar.module.css | 80 ++ website-next/src/components/EditorToolbar.tsx | 82 ++ website-next/src/components/FlexStyle.ts | 411 +++++++++ .../src/components/LayoutBox.module.css | 68 ++ website-next/src/components/LayoutBox.tsx | 56 ++ .../src/components/Playground.module.css | 108 +++ website-next/src/components/Playground.tsx | 165 ++++ .../Playground/EditValue.module.css | 10 - .../src/components/Playground/EditValue.tsx | 47 - .../components/Playground/Editor.module.css | 32 - .../src/components/Playground/Editor.tsx | 268 ------ .../components/Playground/LayoutRecord.tsx | 73 -- .../src/components/Playground/Playground.tsx | 300 ------- .../components/Playground/PositionGuide.css | 16 - .../components/Playground/PositionGuide.tsx | 159 ---- .../components/Playground/PositionRecord.tsx | 28 - .../components/Playground/Sidebar.module.css | 21 - .../src/components/Playground/Sidebar.tsx | 38 - .../Playground/YogaEnumSelect.module.css | 27 - .../components/Playground/YogaEnumSelect.tsx | 93 -- .../src/components/Playground/YogaNode.css | 65 -- .../src/components/Playground/YogaNode.tsx | 307 ------- .../Playground/YogaPositionEditor.css | 30 - .../Playground/YogaPositionEditor.tsx | 71 -- website-next/src/components/YogaViewer.tsx | 114 +++ website-next/src/pages/index.module.css | 156 +--- website-next/src/pages/index.tsx | 80 +- .../playground.module.css} | 26 +- website-next/src/pages/playground.tsx | 27 + website-next/static/img/copy.svg | 3 + website-next/static/img/link.svg | 4 + website-next/tsconfig.json | 7 +- yarn.lock | 828 ++++++++---------- 37 files changed, 1591 insertions(+), 2305 deletions(-) create mode 100644 website-next/src/components/EditorToolbar.module.css create mode 100644 website-next/src/components/EditorToolbar.tsx create mode 100644 website-next/src/components/FlexStyle.ts create mode 100644 website-next/src/components/LayoutBox.module.css create mode 100644 website-next/src/components/LayoutBox.tsx create mode 100644 website-next/src/components/Playground.module.css create mode 100644 website-next/src/components/Playground.tsx delete mode 100644 website-next/src/components/Playground/EditValue.module.css delete mode 100644 website-next/src/components/Playground/EditValue.tsx delete mode 100644 website-next/src/components/Playground/Editor.module.css delete mode 100644 website-next/src/components/Playground/Editor.tsx delete mode 100644 website-next/src/components/Playground/LayoutRecord.tsx delete mode 100644 website-next/src/components/Playground/Playground.tsx delete mode 100644 website-next/src/components/Playground/PositionGuide.css delete mode 100644 website-next/src/components/Playground/PositionGuide.tsx delete mode 100644 website-next/src/components/Playground/PositionRecord.tsx delete mode 100644 website-next/src/components/Playground/Sidebar.module.css delete mode 100644 website-next/src/components/Playground/Sidebar.tsx delete mode 100644 website-next/src/components/Playground/YogaEnumSelect.module.css delete mode 100644 website-next/src/components/Playground/YogaEnumSelect.tsx delete mode 100644 website-next/src/components/Playground/YogaNode.css delete mode 100644 website-next/src/components/Playground/YogaNode.tsx delete mode 100644 website-next/src/components/Playground/YogaPositionEditor.css delete mode 100644 website-next/src/components/Playground/YogaPositionEditor.tsx create mode 100644 website-next/src/components/YogaViewer.tsx rename website-next/src/{components/Playground/Playground.module.css => pages/playground.module.css} (62%) create mode 100644 website-next/src/pages/playground.tsx create mode 100644 website-next/static/img/copy.svg create mode 100644 website-next/static/img/link.svg diff --git a/javascript/src/wrapAssembly.ts b/javascript/src/wrapAssembly.ts index 2f073d18..8d95daa1 100644 --- a/javascript/src/wrapAssembly.ts +++ b/javascript/src/wrapAssembly.ts @@ -71,8 +71,8 @@ export type MeasureFunction = ( export type Node = { calculateLayout( - width?: number | 'auto', - height?: number | 'auto', + width: number | 'auto' | undefined, + height: number | 'auto' | undefined, direction?: Direction, ): void; copyStyle(node: Node): void; @@ -124,45 +124,48 @@ export type Node = { setAlignContent(alignContent: Align): void; setAlignItems(alignItems: Align): void; setAlignSelf(alignSelf: Align): void; - setAspectRatio(aspectRatio: number): void; - setBorder(edge: Edge, borderWidth: number): void; + setAspectRatio(aspectRatio: number | undefined): void; + setBorder(edge: Edge, borderWidth: number | undefined): void; setDisplay(display: Display): void; - setFlex(flex: number): void; - setFlexBasis(flexBasis: number | 'auto' | `${number}%`): void; - setFlexBasisPercent(flexBasis: number): void; + setFlex(flex: number | undefined): void; + setFlexBasis(flexBasis: number | 'auto' | `${number}%` | undefined): void; + setFlexBasisPercent(flexBasis: number | undefined): void; setFlexBasisAuto(): void; setFlexDirection(flexDirection: FlexDirection): void; - setFlexGrow(flexGrow: number): void; - setFlexShrink(flexShrink: number): void; + setFlexGrow(flexGrow: number | undefined): void; + setFlexShrink(flexShrink: number | undefined): void; setFlexWrap(flexWrap: Wrap): void; - setHeight(height: number | 'auto' | `${number}%`): void; + setHeight(height: number | 'auto' | `${number}%` | undefined): void; setIsReferenceBaseline(isReferenceBaseline: boolean): void; setHeightAuto(): void; - setHeightPercent(height: number): void; + setHeightPercent(height: number | undefined): void; setJustifyContent(justifyContent: Justify): void; - setGap(gutter: Gutter, gapLength: number): Value; - setMargin(edge: Edge, margin: number | 'auto' | `${number}%`): void; + setGap(gutter: Gutter, gapLength: number | undefined): Value; + setMargin( + edge: Edge, + margin: number | 'auto' | `${number}%` | undefined, + ): void; setMarginAuto(edge: Edge): void; - setMarginPercent(edge: Edge, margin: number): void; - setMaxHeight(maxHeight: number | `${number}%`): void; - setMaxHeightPercent(maxHeight: number): void; - setMaxWidth(maxWidth: number | `${number}%`): void; - setMaxWidthPercent(maxWidth: number): void; + setMarginPercent(edge: Edge, margin: number | undefined): void; + setMaxHeight(maxHeight: number | `${number}%` | undefined): void; + setMaxHeightPercent(maxHeight: number | undefined): void; + setMaxWidth(maxWidth: number | `${number}%` | undefined): void; + setMaxWidthPercent(maxWidth: number | undefined): void; setDirtiedFunc(dirtiedFunc: DirtiedFunction | null): void; setMeasureFunc(measureFunc: MeasureFunction | null): void; - setMinHeight(minHeight: number | `${number}%`): void; - setMinHeightPercent(minHeight: number): void; - setMinWidth(minWidth: number | `${number}%`): void; - setMinWidthPercent(minWidth: number): void; + setMinHeight(minHeight: number | `${number}%` | undefined): void; + setMinHeightPercent(minHeight: number | undefined): void; + setMinWidth(minWidth: number | `${number}%` | undefined): void; + setMinWidthPercent(minWidth: number | undefined): void; setOverflow(overflow: Overflow): void; - setPadding(edge: Edge, padding: number | `${number}%`): void; - setPaddingPercent(edge: Edge, padding: number): void; - setPosition(edge: Edge, position: number | `${number}%`): void; - setPositionPercent(edge: Edge, position: number): void; + setPadding(edge: Edge, padding: number | `${number}%` | undefined): void; + setPaddingPercent(edge: Edge, padding: number | undefined): void; + setPosition(edge: Edge, position: number | `${number}%` | undefined): void; + setPositionPercent(edge: Edge, position: number | undefined): void; setPositionType(positionType: PositionType): void; - setWidth(width: number | 'auto' | `${number}%`): void; + setWidth(width: number | 'auto' | `${number}%` | undefined): void; setWidthAuto(): void; - setWidthPercent(width: number): void; + setWidthPercent(width: number | undefined): void; unsetDirtiedFunc(): void; unsetMeasureFunc(): void; }; @@ -227,7 +230,11 @@ export default function wrapAssembly(lib: any): Yoga { ? Unit.Percent : Unit.Point; asNumber = parseFloat(value); - if (!Number.isNaN(value) && Number.isNaN(asNumber)) { + if ( + value !== undefined && + !Number.isNaN(value) && + Number.isNaN(asNumber) + ) { throw new Error(`Invalid value ${value} for ${fnName}`); } } diff --git a/website-next/docusaurus.config.js b/website-next/docusaurus.config.js index 3f988ddd..b59c0f55 100644 --- a/website-next/docusaurus.config.js +++ b/website-next/docusaurus.config.js @@ -66,6 +66,7 @@ export default { position: 'left', label: 'Documentation', }, + {to: '/playground', label: 'Playground', position: 'left'}, {to: '/blog', label: 'Blog', position: 'left'}, { href: 'https://github.com/facebook/yoga', @@ -124,7 +125,11 @@ export default { }, prism: { theme: prismThemes.github, - darkTheme: prismThemes.dracula, + darkTheme: prismThemes.oneDark, + }, + colorMode: { + defaultMode: 'dark', + respectPrefersColorScheme: true, }, }), }; diff --git a/website-next/package.json b/website-next/package.json index 1e64c865..69fbfc00 100644 --- a/website-next/package.json +++ b/website-next/package.json @@ -17,14 +17,15 @@ "lint:fix": "eslint . --fix" }, "dependencies": { - "@docusaurus/core": "3.0.0", - "@docusaurus/preset-classic": "3.0.0", + "@docusaurus/core": "3.0.1", + "@docusaurus/preset-classic": "3.0.1", "@mdx-js/react": "^3.0.0", - "clsx": "^1.2.1", - "immutable": "^4.0.0", - "prism-react-renderer": "^2.1.0", + "clsx": "^2.0.0", + "nullthrows": "^1.1.1", + "prism-react-renderer": "^2.3.0", "react": "^18.0.0", "react-dom": "^18.0.0", + "react-live": "^4.1.5", "yoga-layout": "0.0.0" }, "devDependencies": { diff --git a/website-next/sidebars.cjs b/website-next/sidebars.cjs index f41ab4dc..5566ca3c 100644 --- a/website-next/sidebars.cjs +++ b/website-next/sidebars.cjs @@ -22,19 +22,6 @@ const sidebars = { // By default, Docusaurus generates a sidebar from the docs folder structure docsSidebar: [{type: 'autogenerated', dirName: '.'}], - - // But you can create a sidebar manually - /* - tutorialSidebar: [ - 'intro', - 'hello', - { - type: 'category', - label: 'Tutorial', - items: ['tutorial-basics/create-a-document'], - }, - ], - */ }; module.exports = sidebars; diff --git a/website-next/src/components/EditorToolbar.module.css b/website-next/src/components/EditorToolbar.module.css new file mode 100644 index 00000000..442194e3 --- /dev/null +++ b/website-next/src/components/EditorToolbar.module.css @@ -0,0 +1,80 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +.toolbar { + display: flex; + column-gap: 8px; + position: absolute; + top: 10px; + right: 10px; +} + +.toolbar button { + display: flex; + align-items: center; + background: var(--prism-background-color); + color: var(--prism-color); + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: var(--ifm-global-radius); + padding: 0.4rem; + line-height: 0; + transition: opacity var(--ifm-transition-fast) ease-in-out; + opacity: 0.4; +} + +.toolbar button:focus-visible, +.toolbar button:hover { + opacity: 1 !important; +} + +.icon { + width: 24px; + height: 24px; +} + +.iconSwitcher { + position: relative; + width: 24px; + height: 24px; +} + +.actionIcon, +.successIcon { + position: absolute; + top: 0; + left: 0; + fill: currentColor; + opacity: inherit; + width: inherit; + height: inherit; + transition: all var(--ifm-transition-fast) ease; +} + +.successIcon { + top: 50%; + left: 50%; + transform: translate(-50%, -50%) scale(0.33); + opacity: 0; + color: #00d600; +} + +.clicked .actionIcon { + transform: scale(0.33); + opacity: 0; +} + +.clicked .successIcon { + transform: translate(-50%, -50%) scale(1); + opacity: 1; + transition-delay: 0.075s; +} + +@media (max-width: 996px) { + .toolbar { + display: none; + } +} diff --git a/website-next/src/components/EditorToolbar.tsx b/website-next/src/components/EditorToolbar.tsx new file mode 100644 index 00000000..f4581057 --- /dev/null +++ b/website-next/src/components/EditorToolbar.tsx @@ -0,0 +1,82 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import {useCallback, useEffect, useRef, useState} from 'react'; +import clsx from 'clsx'; + +import CopyIcon from '../../static/img/copy.svg'; +import LinkIcon from '../../static/img/link.svg'; +import SuccessIcon from '@theme/Icon/Success'; + +import styles from './EditorToolbar.module.css'; + +export type Props = Readonly<{ + getCode: () => string; +}>; + +export default function EditorToolbar({getCode}: Props): JSX.Element { + const handleCopy = useCallback( + () => navigator.clipboard.writeText(getCode()), + [], + ); + + const handleShare = useCallback( + () => + navigator.clipboard.writeText( + window.location.origin + + `/playground?code=${encodeURIComponent(btoa(getCode()))}`, + ), + [], + ); + + return ( +
+ + +
+ ); +} + +type ToolbarButtonProps = Readonly<{ + onClick: () => void; + Icon: React.ComponentType>; + label?: string; +}>; + +function ToolbarButton({ + onClick, + Icon, + label, +}: ToolbarButtonProps): JSX.Element { + const [isSuccess, setIsSuccess] = useState(false); + const copyTimeout = useRef(undefined); + + useEffect(() => () => window.clearTimeout(copyTimeout.current), []); + + const handleClick = useCallback(() => { + onClick(); + setIsSuccess(true); + copyTimeout.current = window.setTimeout(() => { + setIsSuccess(false); + }, 1000); + }, []); + + return ( + + ); +} diff --git a/website-next/src/components/FlexStyle.ts b/website-next/src/components/FlexStyle.ts new file mode 100644 index 00000000..b428adda --- /dev/null +++ b/website-next/src/components/FlexStyle.ts @@ -0,0 +1,411 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import { + Align, + Display, + Edge, + FlexDirection, + Gutter, + Justify, + Overflow, + PositionType, + Wrap, + Node as YogaNode, +} from 'yoga-layout'; + +export type AlignContent = + | 'flex-start' + | 'flex-end' + | 'center' + | 'stretch' + | 'space-between' + | 'space-around' + | 'space-evenly'; + +export type AlignItems = + | 'flex-start' + | 'flex-end' + | 'center' + | 'stretch' + | 'baseline'; + +export type JustifyContent = + | 'flex-start' + | 'flex-end' + | 'center' + | 'space-between' + | 'space-around' + | 'space-evenly'; + +export type FlexStyle = { + alignContent?: AlignContent; + alignItems?: AlignItems; + alignSelf?: AlignItems; + aspectRatio?: number; + borderBottomWidth?: number; + borderEndWidth?: number; + borderLeftWidth?: number; + borderRightWidth?: number; + borderStartWidth?: number; + borderTopWidth?: number; + borderWidth?: number; + borderInlineWidth?: number; + borderBlockWidth?: number; + bottom?: number | `${number}%`; + display?: 'none' | 'flex'; + end?: number | `${number}%`; + flex?: number; + flexBasis?: number | 'auto' | `${number}%`; + flexDirection?: 'row' | 'column' | 'row-reverse' | 'column-reverse'; + rowGap?: number; + gap?: number; + columnGap?: number; + flexGrow?: number; + flexShrink?: number; + flexWrap?: 'wrap' | 'nowrap' | 'wrap-reverse'; + height?: number | 'auto' | `${number}%`; + justifyContent?: JustifyContent; + left?: number | `${number}%`; + margin?: number | 'auto' | `${number}%`; + marginBottom?: number | 'auto' | `${number}%`; + marginEnd?: number | 'auto' | `${number}%`; + marginLeft?: number | 'auto' | `${number}%`; + marginRight?: number | 'auto' | `${number}%`; + marginStart?: number | 'auto' | `${number}%`; + marginTop?: number | 'auto' | `${number}%`; + marginInline?: number | 'auto' | `${number}%`; + marginBlock?: number | 'auto' | `${number}%`; + maxHeight?: number | `${number}%`; + maxWidth?: number | `${number}%`; + minHeight?: number | `${number}%`; + minWidth?: number | `${number}%`; + overflow?: 'visible' | 'hidden' | 'scroll'; + padding?: number | `${number}%`; + paddingBottom?: number | `${number}%`; + paddingEnd?: number | `${number}%`; + paddingLeft?: number | `${number}%`; + paddingRight?: number | `${number}%`; + paddingStart?: number | `${number}%`; + paddingTop?: number | `${number}%`; + paddingInline?: number | `${number}%`; + paddingBlock?: number | `${number}%`; + position?: 'absolute' | 'relative' | 'static'; + right?: number | `${number}%`; + start?: number | `${number}%`; + top?: number | `${number}%`; + insetInline?: number | `${number}%`; + insetBlock?: number | `${number}%`; + inset?: number | `${number}%`; + width?: number | 'auto' | `${number}%`; +}; + +export function applyStyle(node: YogaNode, style: FlexStyle = {}): void { + for (const key of Object.keys(style)) { + try { + switch (key) { + case 'alignContent': + node.setAlignContent(alignContent(style.alignContent)); + break; + case 'alignItems': + node.setAlignItems(alignItems(style.alignItems)); + break; + case 'alignSelf': + node.setAlignSelf(alignItems(style.alignSelf)); + break; + case 'aspectRatio': + node.setAspectRatio(style.aspectRatio); + break; + case 'borderBottomWidth': + node.setBorder(Edge.Bottom, style.borderBottomWidth); + break; + case 'borderEndWidth': + node.setBorder(Edge.End, style.borderEndWidth); + break; + case 'borderLeftWidth': + node.setBorder(Edge.Left, style.borderLeftWidth); + break; + case 'borderRightWidth': + node.setBorder(Edge.Right, style.borderRightWidth); + break; + case 'borderStartWidth': + node.setBorder(Edge.Start, style.borderStartWidth); + break; + case 'borderTopWidth': + node.setBorder(Edge.Top, style.borderTopWidth); + break; + case 'borderWidth': + node.setBorder(Edge.All, style.borderWidth); + break; + case 'borderInlineWidth': + node.setBorder(Edge.Horizontal, style.borderInlineWidth); + break; + case 'borderBlockWidth': + node.setBorder(Edge.Vertical, style.borderBlockWidth); + break; + case 'bottom': + node.setPosition(Edge.Bottom, style.bottom); + break; + case 'display': + node.setDisplay(display(style.display)); + break; + case 'end': + node.setPosition(Edge.End, style.end); + break; + case 'flex': + node.setFlex(style.flex); + break; + case 'flexBasis': + node.setFlexBasis(style.flexBasis); + break; + case 'flexDirection': + node.setFlexDirection(flexDirection(style.flexDirection)); + break; + case 'rowGap': + node.setGap(Gutter.Row, style.rowGap); + break; + case 'gap': + node.setGap(Gutter.All, style.gap); + break; + case 'columnGap': + node.setGap(Gutter.Column, style.columnGap); + break; + case 'flexGrow': + node.setFlexGrow(style.flexGrow); + break; + case 'flexShrink': + node.setFlexShrink(style.flexShrink); + break; + case 'flexWrap': + node.setFlexWrap(flexWrap(style.flexWrap)); + break; + case 'height': + node.setHeight(style.height); + break; + case 'justifyContent': + node.setJustifyContent(justifyContent(style.justifyContent)); + break; + case 'left': + node.setPosition(Edge.Left, style.left); + break; + case 'margin': + node.setMargin(Edge.All, style.margin); + break; + case 'marginBottom': + node.setMargin(Edge.Bottom, style.marginBottom); + break; + case 'marginEnd': + node.setMargin(Edge.End, style.marginEnd); + break; + case 'marginLeft': + node.setMargin(Edge.Left, style.marginLeft); + break; + case 'marginRight': + node.setMargin(Edge.Right, style.marginRight); + break; + case 'marginStart': + node.setMargin(Edge.Start, style.marginStart); + break; + case 'marginTop': + node.setMargin(Edge.Top, style.marginTop); + break; + case 'marginInline': + node.setMargin(Edge.Horizontal, style.marginInline); + break; + case 'marginBlock': + node.setMargin(Edge.Vertical, style.marginBlock); + break; + case 'maxHeight': + node.setMaxHeight(style.maxHeight); + break; + case 'maxWidth': + node.setMaxWidth(style.maxWidth); + break; + case 'minHeight': + node.setMinHeight(style.minHeight); + break; + case 'minWidth': + node.setMinWidth(style.minWidth); + break; + case 'overflow': + node.setOverflow(overflow(style.overflow)); + break; + case 'padding': + node.setPadding(Edge.All, style.padding); + break; + case 'paddingBottom': + node.setPadding(Edge.Bottom, style.paddingBottom); + break; + case 'paddingEnd': + node.setPadding(Edge.End, style.paddingEnd); + break; + case 'paddingLeft': + node.setPadding(Edge.Left, style.paddingLeft); + break; + case 'paddingRight': + node.setPadding(Edge.Right, style.paddingRight); + break; + case 'paddingStart': + node.setPadding(Edge.Start, style.paddingStart); + break; + case 'paddingTop': + node.setPadding(Edge.Top, style.paddingTop); + break; + case 'paddingInline': + node.setPadding(Edge.Horizontal, style.paddingInline); + break; + case 'paddingBlock': + node.setPadding(Edge.Vertical, style.paddingBlock); + break; + case 'position': + node.setPositionType(position(style.position)); + break; + case 'right': + node.setPosition(Edge.Right, style.right); + break; + case 'start': + node.setPosition(Edge.Start, style.start); + break; + case 'top': + node.setPosition(Edge.Top, style.top); + break; + case 'insetInline': + node.setPosition(Edge.Horizontal, style.insetInline); + break; + case 'insetBlock': + node.setPosition(Edge.Vertical, style.insetBlock); + break; + case 'inset': + node.setPosition(Edge.All, style.inset); + break; + case 'width': + node.setWidth(style.width); + break; + } + } catch (e) { + // Fail gracefully + } + } +} + +function alignContent(str?: AlignContent): Align { + switch (str) { + case 'flex-start': + return Align.FlexStart; + case 'flex-end': + return Align.FlexEnd; + case 'center': + return Align.Center; + case 'stretch': + return Align.Stretch; + case 'space-between': + return Align.SpaceBetween; + case 'space-around': + return Align.SpaceAround; + case 'space-evenly': + return Align.SpaceEvenly; + } + throw new Error(`"${str}" is not a valid value for alignContent`); +} + +function alignItems(str?: AlignItems): Align { + switch (str) { + case 'flex-start': + return Align.FlexStart; + case 'flex-end': + return Align.FlexEnd; + case 'center': + return Align.Center; + case 'stretch': + return Align.Stretch; + case 'baseline': + return Align.Baseline; + } + throw new Error(`"${str}" is not a valid value for alignItems`); +} + +function display(str?: 'none' | 'flex'): Display { + switch (str) { + case 'none': + return Display.None; + case 'flex': + return Display.Flex; + } + throw new Error(`"${str}" is not a valid value for display`); +} + +function flexDirection( + str?: 'row' | 'column' | 'row-reverse' | 'column-reverse', +): FlexDirection { + switch (str) { + case 'row': + return FlexDirection.Row; + case 'column': + return FlexDirection.Column; + case 'row-reverse': + return FlexDirection.RowReverse; + case 'column-reverse': + return FlexDirection.ColumnReverse; + } + throw new Error(`"${str}" is not a valid value for flexDirection`); +} + +function flexWrap(str?: 'wrap' | 'nowrap' | 'wrap-reverse'): Wrap { + switch (str) { + case 'wrap': + return Wrap.Wrap; + case 'nowrap': + return Wrap.NoWrap; + case 'wrap-reverse': + return Wrap.WrapReverse; + } + throw new Error(`"${str}" is not a valid value for flexWrap`); +} + +function justifyContent(str?: JustifyContent): Justify { + switch (str) { + case 'flex-start': + return Justify.FlexStart; + case 'flex-end': + return Justify.FlexEnd; + case 'center': + return Justify.Center; + case 'space-between': + return Justify.SpaceBetween; + case 'space-around': + return Justify.SpaceAround; + case 'space-evenly': + return Justify.SpaceEvenly; + } + throw new Error(`"${str}" is not a valid value for justifyContent`); +} + +function overflow(str?: 'visible' | 'hidden' | 'scroll'): Overflow { + switch (str) { + case 'visible': + return Overflow.Visible; + case 'hidden': + return Overflow.Hidden; + case 'scroll': + return Overflow.Scroll; + } + throw new Error(`"${str}" is not a valid value for overflow`); +} + +function position(str?: 'absolute' | 'relative' | 'static'): PositionType { + switch (str) { + case 'absolute': + return PositionType.Absolute; + case 'relative': + return PositionType.Relative; + case 'static': + return PositionType.Static; + } + throw new Error(`"${str}" is not a valid value for position`); +} diff --git a/website-next/src/components/LayoutBox.module.css b/website-next/src/components/LayoutBox.module.css new file mode 100644 index 00000000..df0febef --- /dev/null +++ b/website-next/src/components/LayoutBox.module.css @@ -0,0 +1,68 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + html[data-theme='light'] { + --yg-color-node-depth-0: var(--ifm-color-gray-0); + --yg-color-node-depth-1: var(--ifm-color-gray-200); + --yg-color-node-depth-2: var(--ifm-color-gray-400); + --yg-color-node-depth-3: var(--ifm-color-gray-600); + --yg-color-node-depth-4: var(--ifm-color-gray-800); + + --yg-border-node-depth-0: 1px solid var(--ifm-color-gray-200); + --yg-border-node-depth-1: 1px solid var(--ifm-color-gray-600); + --yg-border-node-depth-2: 1px solid var(--ifm-color-gray-700); + --yg-border-node-depth-3: 1px solid var(--ifm-color-gray-800); + --yg-border-node-depth-4: 1px solid var(--ifm-color-gray-900); +} + +html[data-theme='dark'] { + --yg-color-node-depth-0: var(--ifm-color-gray-900); + --yg-color-node-depth-1: var(--ifm-color-gray-800); + --yg-color-node-depth-2: var(--ifm-color-gray-700); + --yg-color-node-depth-3: var(--ifm-color-gray-600); + --yg-color-node-depth-4: var(--ifm-color-gray-500); + + --yg-border-node-depth-0: 1px solid var(--ifm-color-gray-800); + --yg-border-node-depth-1: 1px solid var(--ifm-color-gray-700); + --yg-border-node-depth-2: 1px solid var(--ifm-color-gray-600); + --yg-border-node-depth-3: 1px solid var(--ifm-color-gray-500); + --yg-border-node-depth-4: 1px solid var(--ifm-color-gray-400); +} + +.layoutBox { + box-sizing: border-box; + border-radius: 2px; +} + +.zeroDim { + border: 0 !important; +} + +.depthZero { + background: var(--yg-color-node-depth-0); + border: var(--yg-border-node-depth-0); +} + +.depthOne { + background-color: var(--yg-color-node-depth-1); + border: var(--yg-border-node-depth-1); +} + +.depthTwo { + background-color: var(--yg-color-node-depth-2); + border: var(--yg-border-node-depth-2); +} + +.depthThree { + background-color: var(--yg-color-node-depth-3); + border: var(--yg-border-node-depth-3); +} + +.depthFour { + background-color: var(--yg-color-node-depth-4); + border: var(--yg-border-node-depth-4); +} diff --git a/website-next/src/components/LayoutBox.tsx b/website-next/src/components/LayoutBox.tsx new file mode 100644 index 00000000..6622dc7b --- /dev/null +++ b/website-next/src/components/LayoutBox.tsx @@ -0,0 +1,56 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import styles from './LayoutBox.module.css'; +import clsx from 'clsx'; + +export type LayoutMetrics = { + top: number; + left: number; + width: number; + height: number; + overflow?: 'visible' | 'hidden' | 'scroll'; + children?: LayoutMetrics[]; +}; + +export type Props = Readonly<{ + metrics: LayoutMetrics; + className?: string; + depth: number; +}>; + +export default function LayoutBox({metrics, depth, className}: Props) { + const {children, ...style} = metrics; + + return ( +
+ {children?.map((child, i) => ( + + ))} +
+ ); +} diff --git a/website-next/src/components/Playground.module.css b/website-next/src/components/Playground.module.css new file mode 100644 index 00000000..db398a15 --- /dev/null +++ b/website-next/src/components/Playground.module.css @@ -0,0 +1,108 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +html[data-theme='light'] { + --yg-color-preview-background: var(--ifm-color-primary-lighter); + --yg-color-playground-background: var(--ifm-color-gray-200); + --yg-color-editor-border: var(--ifm-color-gray-400); +} + +html[data-theme='dark'] { + --yg-color-preview-background: var(--ifm-color-primary-dark); + --yg-color-playground-background: var(--ifm-color-background); + --yg-color-editor-border: var(--ifm-color-gray-800); +} + +.wrapper { + display: flex; + justify-content: center; + min-width: 900px; + width: 100%; + padding-block: 16px; + background-color: var(--yg-color-playground-background); +} + +.editorColumn { + position: relative; + flex: 8; + min-width: 0; +} + +.playgroundRow { + display: flex; + flex-direction: row; + column-gap: 16px; +} + +.playgroundEditor { + font: var(--ifm-code-font-size) / var(--ifm-pre-line-height) + var(--ifm-font-family-monospace) !important; + direction: ltr; + height: calc(var(--yg-playground-height, 400px) - 32px); + overflow: scroll; +} + +.playgroundEditor :global(.prism-code) { + height: 100%; + box-shadow: var(--ifm-global-shadow-lw); + border: 1px solid var(--yg-color-editor-border); +} + +.previewColumn { + display: flex; + flex: 5; + height: calc(var(--yg-playground-height, 400px) - 32px); + align-items: center; + justify-content: center; + background-color: var(--yg-color-preview-background); + overflow: hidden; + border-radius: var(--ifm-pre-border-radius); + align-self: flex-start; + box-shadow: var(--ifm-global-shadow-lw); +} + +.livePreviewWrapper { + box-shadow: var(--ifm-global-shadow-md); +} + +.liveError { + align-self: flex-start; + font-size: 12px; + box-shadow: var(--ifm-global-shadow-lw); + background-color:var(--ifm-color-danger-darker); + color: white; + width: 100%; + text-align: center; + margin: 10px; +} + +@media (max-width: 996px) { + .wrapper { + min-width: 100%; + } + + .playgroundEditor { + height: max-content; + overflow: visible; + } + + .playgroundRow { + flex-direction: column; + padding-inline: 5px; + } + + .editorColumn { + padding: 0; + flex: 0 !important; + margin-bottom: 10px; + } + + .previewColumn { + padding: 10px; + width: 100%; + } +} diff --git a/website-next/src/components/Playground.tsx b/website-next/src/components/Playground.tsx new file mode 100644 index 00000000..0ee4a58d --- /dev/null +++ b/website-next/src/components/Playground.tsx @@ -0,0 +1,165 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import React, { + CSSProperties, + Suspense, + lazy, + useCallback, + useEffect, + useRef, + useState, +} from 'react'; + +import {usePrismTheme} from '@docusaurus/theme-common'; +import clsx from 'clsx'; +import nullthrows from 'nullthrows'; +import {LiveProvider, LiveEditor, LivePreview, LiveError} from 'react-live'; +import EditorToolbar from './EditorToolbar'; + +import type {FlexStyle} from './FlexStyle'; +import type {StyleNode} from './YogaViewer'; + +import styles from './Playground.module.css'; + +const defaultCode = ` + + + + + +`.trim(); + +export type Props = Readonly<{ + code?: string; + height?: CSSProperties['height']; + autoFocus?: boolean; +}>; + +export default function Playground({code, height, autoFocus}: Props) { + const prismTheme = usePrismTheme(); + const playgroundRef = useRef(null); + const [isLoaded, setIsLoaded] = useState(false); + + const LivePreviewWrapper = useCallback( + (props: React.ComponentProps<'div'>) => { + useEffect(() => { + setIsLoaded(true); + }, []); + + return
; + }, + [], + ); + + useEffect(() => { + // TODO: This is hacky and relies on being called after some operation + // "react-live" does which itself can manipulate global focus + if (isLoaded && autoFocus) { + const codeElem = playgroundRef?.current?.querySelector('.prism-code'); + const sel = window.getSelection(); + if (codeElem != null && sel != null) { + sel.selectAllChildren(codeElem); + sel.collapseToStart(); + } + } + }, [isLoaded, autoFocus]); + + const heightStyle = height + ? ({'--yg-playground-height': height} as React.CSSProperties) + : undefined; + + const resolvedCode = code ?? defaultCode; + + return ( + +
+
+
+ + nullthrows( + playgroundRef.current?.querySelector('.prism-code') + ?.textContent, + ), + [], + )} + /> + +
+
+ + +
+
+
+
+ ); +} + +type LayoutProps = Readonly<{ + children: React.ReactNode; + config?: {useWebDefaults?: boolean}; +}>; + +function Layout({children, config}: LayoutProps) { + if (React.Children.count(children) !== 1) { + return null; + } + + const child = React.Children.only(children); + if (!React.isValidElement(child) || child.type !== Node) { + return null; + } + + const styleNode = styleNodeFromYogaNode(child as unknown as Node); + + return ( + + + + ); +} + +type NodeProps = Readonly<{ + children: React.ReactNode; + style: FlexStyle; +}>; + +class Node extends React.PureComponent {} + +function styleNodeFromYogaNode( + yogaNode: React.ElementRef, +): StyleNode { + const children: StyleNode[] = []; + + React.Children.forEach(yogaNode.props.children, child => { + if (React.isValidElement(child) && child.type === Node) { + children.push(styleNodeFromYogaNode(child as unknown as Node)); + } + }); + + return { + style: yogaNode.props.style, + children, + }; +} + +// Docusaurus SSR does not correctly support top-level await in the import +// chain +// 1. https://github.com/facebook/docusaurus/issues/7238 +// 2. https://github.com/facebook/docusaurus/issues/9468 +const LazyYogaViewer = lazy(() => import('./YogaViewer')); diff --git a/website-next/src/components/Playground/EditValue.module.css b/website-next/src/components/Playground/EditValue.module.css deleted file mode 100644 index ef110373..00000000 --- a/website-next/src/components/Playground/EditValue.module.css +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -.input { - width: 100%; -} diff --git a/website-next/src/components/Playground/EditValue.tsx b/website-next/src/components/Playground/EditValue.tsx deleted file mode 100644 index eaf790fd..00000000 --- a/website-next/src/components/Playground/EditValue.tsx +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import React from 'react'; -import YogaEnumSelect from './YogaEnumSelect'; -import YogaPositionEditor from './YogaPositionEditor'; - -import styles from './EditValue.module.css'; - -type Props = { - property: string; - disabled?: boolean; - value?: T; - onChange: (property: string, value: T) => void; - placeholder?: string; -}; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export default (props: Props) => { - if (YogaEnumSelect.availableProperties.indexOf(props.property) > -1) { - // @ts-ignore - return ; - } else if ( - YogaPositionEditor.availableProperties.indexOf(props.property) > -1 - ) { - // @ts-ignore - return ; - } else { - return ( - props.onChange(props.property, e.target.value)} - placeholder={props.placeholder || 'undefined'} - onFocus={e => e.target.select()} - value={Number.isNaN(props.value) ? '' : props.value} - /> - ); - } -}; diff --git a/website-next/src/components/Playground/Editor.module.css b/website-next/src/components/Playground/Editor.module.css deleted file mode 100644 index 0b5181c9..00000000 --- a/website-next/src/components/Playground/Editor.module.css +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -.editor { - display: flex; - flex-direction: column; - height: 100%; -} - -.editor h2 { - margin-bottom: 8px; - margin-top: 20px; - font-size: 12px; - font-weight: 700; - color: var(--ifm-color-content-secondary); - text-transform: uppercase; -} - -.tabItem { - overflow-y: auto; - max-height: 400px; -} - -.editorButtons { - display: flex; - margin-top: auto; - gap: 5px; -} diff --git a/website-next/src/components/Playground/Editor.tsx b/website-next/src/components/Playground/Editor.tsx deleted file mode 100644 index a2d12cdc..00000000 --- a/website-next/src/components/Playground/Editor.tsx +++ /dev/null @@ -1,268 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import type {LayoutRecordType} from './LayoutRecord'; -import type {Direction} from 'yoga-layout'; - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -import React from 'react'; -import EditValue from './EditValue'; -import styles from './Editor.module.css'; - -type Props = { - node: LayoutRecordType; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onChangeLayout: (key: string, value: any) => void; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onChangeSetting: (key: string, value: any) => void; - direction: Direction; - selectedNodeIsRoot: boolean; - onRemove?: () => void; - onAdd?: () => void; -}; - -export default function Editor(props: Props) { - const {node, selectedNodeIsRoot} = props; - const disabled = node == null; - - return ( -
- - -

Direction

- -

Flex Direction

- - -
-
-

Basis

- -
-
-

Grow

- -
-
-

Shrink

- -
-
- -

Flex Wrap

- -
- -

Justify Content

- - -

Align Items

- - -

Align Self

- - -

Align Content

- -
- -

Width × Height

-
-
- -
-
- -
-
-

Max-Width × Max-Height

-
-
- -
-
- -
-
-

Min-Width × Min-Height

-
-
- -
-
- -
-
- -

Aspect Ratio

- - - {['padding', 'border', 'margin'].map(property => ( - - ))} -

Position Type

- - - -
-
- -
- - -
-
- ); -} diff --git a/website-next/src/components/Playground/LayoutRecord.tsx b/website-next/src/components/Playground/LayoutRecord.tsx deleted file mode 100644 index 0892da1d..00000000 --- a/website-next/src/components/Playground/LayoutRecord.tsx +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import {Record, List} from 'immutable'; -import PositionRecord from './PositionRecord'; -import type {PositionRecordType} from './PositionRecord'; - -import {Align, Justify, FlexDirection, Wrap, PositionType} from 'yoga-layout'; - -export type LayoutRecordType = ReturnType; - -export type LayoutRecordFactory = Record.Factory<{ - width?: number | 'auto'; - height?: number | 'auto'; - minWidth?: number; - minHeight?: number; - maxWidth?: number; - maxHeight?: number; - justifyContent?: Justify; - padding: PositionRecordType; - border: PositionRecordType; - margin: PositionRecordType; - position: PositionRecordType; - positionType: PositionType; - alignItems?: Align; - alignSelf?: Align; - alignContent?: Align; - flexDirection?: FlexDirection; - flexBasis?: number | 'auto'; - flexGrow?: number; - flexShrink?: number; - flexWrap?: Wrap; - aspectRatio?: number | 'auto'; - children?: List; -}>; - -const r: LayoutRecordFactory = Record({ - width: 'auto', - height: 'auto', - justifyContent: Justify.FlexStart, - alignItems: Align.Stretch, - alignSelf: Align.Auto, - alignContent: Align.Stretch, - flexDirection: FlexDirection.Row, - padding: PositionRecord(), - margin: PositionRecord(), - border: PositionRecord(), - position: PositionRecord({ - left: NaN, - top: NaN, - right: NaN, - bottom: NaN, - }), - positionType: PositionType.Relative, - flexWrap: Wrap.NoWrap, - flexBasis: 'auto', - flexGrow: 0, - flexShrink: 1, - children: List(), - aspectRatio: 'auto', - minWidth: NaN, - maxWidth: NaN, - minHeight: NaN, - maxHeight: NaN, -}); - -export default r; diff --git a/website-next/src/components/Playground/Playground.tsx b/website-next/src/components/Playground/Playground.tsx deleted file mode 100644 index 5cfd2526..00000000 --- a/website-next/src/components/Playground/Playground.tsx +++ /dev/null @@ -1,300 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import React, {Component} from 'react'; -import {Direction} from 'yoga-layout'; -import YogaNode from './YogaNode'; -import Editor from './Editor'; -import {List, setIn} from 'immutable'; -import PositionRecord from './PositionRecord'; -import LayoutRecord from './LayoutRecord'; -import Sidebar from './Sidebar'; -import type {LayoutRecordType} from './LayoutRecord'; -import styles from './Playground.module.css'; -import clsx from 'clsx'; - -type Props = { - layoutDefinition?: LayoutRecordType; - direction?: Direction; - maxDepth?: number; - maxChildren?: number; - minChildren?: number; - selectedNodePath?: Array; - showGuides?: boolean; - className?: string; - height?: string | number; - persist?: boolean; - renderSidebar?: ( - layoutDefinition: LayoutRecordType, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onChange: () => any, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ) => any; -}; - -type State = { - selectedNodePath?: Array; - layoutDefinition: LayoutRecordType; - direction: Direction; -}; - -function getPath(path: Array): Array { - return path.reduce((acc, cv) => acc.concat('children', cv), []); -} - -export default class Playground extends Component { - _containerRef?: HTMLElement; - - static defaultProps = { - layoutDefinition: { - width: 500, - height: 500, - children: [ - {width: 100, height: 100}, - {width: 100, height: 100}, - {width: 100, height: 100}, - ], - }, - direction: Direction.LTR, - maxDepth: 3, - showGuides: true, - persist: false, - }; - - rehydrate = (node: LayoutRecordType): LayoutRecordType => { - let record = LayoutRecord(node); - record = record.set('padding', PositionRecord(record.padding)); - record = record.set('border', PositionRecord(record.border)); - record = record.set('margin', PositionRecord(record.margin)); - record = record.set('position', PositionRecord(record.position)); - record = record.set('children', List(record.children.map(this.rehydrate))); - return record; - }; - - state = { - selectedNodePath: this.props.selectedNodePath, - layoutDefinition: this.rehydrate(this.props.layoutDefinition), - direction: this.props.direction, - }; - - componentDidMount() { - document.addEventListener('keydown', this.onKeyDown); - - // rehydrate - if (window.location.search && window.location.search.length > 1) { - try { - const restoredState = JSON.parse( - atob(window.location.search.substr(1)), - ); - this.setState({layoutDefinition: this.rehydrate(restoredState)}); - } catch (e) { - window.history.replaceState( - {}, - null, - window.location.origin + window.location.pathname, - ); - } - } - } - - componentWillUnmount() { - document.removeEventListener('keydown', this.onKeyDown); - } - - onKeyDown = (e: KeyboardEvent) => { - if (e.key === 'Escape') { - this.hideSidePanes(); - } - }; - - onMouseDown = (e: React.MouseEvent) => { - if (e.target === this._containerRef) { - this.hideSidePanes(); - } - }; - - hideSidePanes() { - if (!this.props.renderSidebar) { - // only unselect if we don't have an external sidebar, otherwise the - // sidebar may rely on a certain node to be selected - this.setState({ - selectedNodePath: null, - }); - } - } - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onChangeLayout = (key: string, value: any) => { - const {selectedNodePath} = this.state; - if (selectedNodePath) { - this.modifyAtPath([...getPath(selectedNodePath), key], value); - } - }; - - onRemove = () => { - const {selectedNodePath, layoutDefinition} = this.state; - if (selectedNodePath) { - const index = selectedNodePath.pop(); - const path = getPath(selectedNodePath).concat('children'); - // @ts-ignore - const updatedChildren = layoutDefinition.getIn(path).delete(index); - this.modifyAtPath(path, updatedChildren); - this.setState({selectedNodePath: null}); - } - }; - - onAdd = () => { - const {selectedNodePath, layoutDefinition} = this.state; - if (selectedNodePath) { - const path = getPath(selectedNodePath).concat('children'); - const updatedChildren = layoutDefinition - .getIn(path) - // @ts-ignore - .push(LayoutRecord({width: 100, height: 100})); - this.modifyAtPath(path, updatedChildren); - } - }; - - modifyAtPath( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - path: Array, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - value: any, - selectedNodePath: Array = this.state.selectedNodePath, - ) { - const layoutDefinition = setIn(this.state.layoutDefinition, path, value); - this.setState({ - layoutDefinition, - selectedNodePath, - }); - - if (this.props.persist) { - window.history.replaceState( - {}, - null, - window.location.origin + - window.location.pathname + - '?' + - this.getHash(layoutDefinition), - ); - } - } - - getHash = ( - layoutDefinition: LayoutRecordType = this.state.layoutDefinition, - ): string => - btoa(JSON.stringify(this.removeUnchangedProperties(layoutDefinition))); - - removeUnchangedProperties = ( - node: LayoutRecordType, - ): {children?: unknown} => { - const untouchedLayout = LayoutRecord({}); - const untouchedPosition = PositionRecord({}); - const result: {children?: unknown} = {}; - if (!node.equals(untouchedLayout)) { - Object.keys(node.toJS()).forEach(key => { - if (key === 'children' && node.children.size > 0) { - result.children = node.children - .toJSON() - .map(this.removeUnchangedProperties); - } else if ( - node[key] instanceof PositionRecord && - !node[key].equals(untouchedPosition) - ) { - result[key] = {}; - Object.keys(untouchedPosition.toJS()).forEach(position => { - if (node[key][position] !== untouchedPosition[position]) { - result[key][position] = node[key][position]; - } - }); - } else if (node[key] !== untouchedLayout[key]) { - result[key] = node[key]; - } - }); - } - return result; - }; - - getChildrenCountForSelectedPath = (): number => { - const selectedNode: LayoutRecordType = ( - this.state.selectedNodePath || [] - ).reduce( - (node: LayoutRecordType, cv) => node.children.get(cv), - this.state.layoutDefinition, - ); - return selectedNode ? selectedNode.children.size : 0; - }; - - render() { - const {layoutDefinition, selectedNodePath, direction} = this.state; - const {height} = this.props; - - // @ts-ignore - const selectedNode: LayoutRecordType | null = selectedNodePath - ? layoutDefinition.getIn(getPath(selectedNodePath)) - : null; - - const playground = ( -
{ - this._containerRef = ref; - }}> - this.setState({selectedNodePath})} - onDoubleClick={this.onAdd} - direction={direction} - showGuides={this.props.showGuides} - /> -
- ); - - const sidebarContent = this.props.renderSidebar - ? this.props.renderSidebar( - // @ts-ignore - layoutDefinition.getIn(getPath(selectedNodePath)), - this.onChangeLayout, - ) - : this.state.selectedNodePath != null && ( - - // @ts-ignore - this.setState({[key]: value}) - } - direction={direction} - onRemove={ - selectedNodePath && selectedNodePath.length > 0 - ? this.onRemove - : undefined - } - onAdd={ - selectedNodePath && selectedNodePath.length < this.props.maxDepth - ? this.onAdd - : undefined - } - /> - ); - - return ( -
- {playground} - {sidebarContent} -
- ); - } -} diff --git a/website-next/src/components/Playground/PositionGuide.css b/website-next/src/components/Playground/PositionGuide.css deleted file mode 100644 index fcb11eac..00000000 --- a/website-next/src/components/Playground/PositionGuide.css +++ /dev/null @@ -1,16 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - .PositionGuide { - position: absolute; - pointer-events: none; - display: flex; - align-items: center; - justify-content: center; - font-size: 10px; - user-select: none; -} diff --git a/website-next/src/components/Playground/PositionGuide.tsx b/website-next/src/components/Playground/PositionGuide.tsx deleted file mode 100644 index b46c105f..00000000 --- a/website-next/src/components/Playground/PositionGuide.tsx +++ /dev/null @@ -1,159 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import React, {Component} from 'react'; -import PositionRecord from './PositionRecord'; -import type {PositionRecordType} from './PositionRecord'; -import './PositionGuide.css'; - -type Props = { - inset?: boolean; - reverse?: boolean; - position: PositionRecordType; - offset: PositionRecordType; - color: string; -}; - -export default class PositionGuide extends Component { - static defaultProps = { - offset: PositionRecord({}), - }; - - render() { - const {position, offset, inset, color, reverse} = this.props; - let {top, left, right, bottom} = position; - let {top: oTop, left: oLeft, right: oRight, bottom: oBottom} = offset; - - if ( - typeof top !== 'number' || - typeof left !== 'number' || - typeof right !== 'number' || - typeof bottom !== 'number' || - typeof oTop !== 'number' || - typeof oLeft !== 'number' || - typeof oRight !== 'number' || - typeof oBottom !== 'number' - ) { - return null; - } - if (reverse) { - let temp1 = left; - left = right; - right = temp1; - temp1 = oLeft; - oLeft = oRight; - oRight = temp1; - } - - if (!top) { - top = 0; - } - if (!left) { - left = 0; - } - if (!right) { - right = 0; - } - if (!bottom) { - bottom = 0; - } - if (!oTop) { - oTop = 0; - } - if (!oLeft) { - oLeft = 0; - } - if (!oRight) { - oRight = 0; - } - if (!oBottom) { - oBottom = 0; - } - - if (!inset) { - if (typeof top === 'number' && typeof bottom === 'number') { - if (top < 0) { - bottom -= top; - top = 0; - } - if (bottom < 0) { - top -= bottom; - bottom = 0; - } - } - if (left < 0) { - right -= left; - left = 0; - } - if (right < 0) { - left -= right; - right = 0; - } - } - - return [ - top !== 0 ? ( -
- {top} -
- ) : null, - left !== 0 ? ( -
- {left} -
- ) : null, - right !== 0 ? ( -
- {right} -
- ) : null, - bottom !== 0 ? ( -
- {bottom} -
- ) : null, - ]; - } -} diff --git a/website-next/src/components/Playground/PositionRecord.tsx b/website-next/src/components/Playground/PositionRecord.tsx deleted file mode 100644 index 439294e7..00000000 --- a/website-next/src/components/Playground/PositionRecord.tsx +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import {Record} from 'immutable'; - -export type PositionRecordType = ReturnType; - -export type PositionRecordFactory = Record.Factory<{ - top: string | number; - right: string | number; - bottom: string | number; - left: string | number; -}>; - -const r: PositionRecordFactory = Record({ - top: 0, - right: 0, - bottom: 0, - left: 0, -}); - -export default r; diff --git a/website-next/src/components/Playground/Sidebar.module.css b/website-next/src/components/Playground/Sidebar.module.css deleted file mode 100644 index a6bfef81..00000000 --- a/website-next/src/components/Playground/Sidebar.module.css +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - .placeholder { - color: var(--ifm-color-content-secondary); - margin: auto; - text-align: center; - } - - .sidebar { - z-index: 3; - width: 320px; - background: var(--ifm-background-surface-color); - display: flex; - flex-direction: column; - padding: 20px; -} diff --git a/website-next/src/components/Playground/Sidebar.tsx b/website-next/src/components/Playground/Sidebar.tsx deleted file mode 100644 index fe5943e7..00000000 --- a/website-next/src/components/Playground/Sidebar.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import React, {Component} from 'react'; -import styles from './Sidebar.module.css'; -import clsx from 'clsx'; - -type Props = { - width?: number; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - children: any; -}; - -function PlaceholderContent() { - return ( -
-

Select a node to edit its properties

-
- ); -} - -export default class Sidebar extends Component { - render() { - return ( -
- {this.props.children || } -
- ); - } -} diff --git a/website-next/src/components/Playground/YogaEnumSelect.module.css b/website-next/src/components/Playground/YogaEnumSelect.module.css deleted file mode 100644 index 18fb7a2a..00000000 --- a/website-next/src/components/Playground/YogaEnumSelect.module.css +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -.buttonGroup { - display: flex; -} - -.button { - flex: 1; -} - -.select { - appearance: none; - width: 100%; - padding: calc(var(--ifm-button-padding-vertical) * 0.8) calc(var(--ifm-button-padding-horizontal) * 0.8); - background: transparent; - color: var(--ifm-font-color-base); - border: var(--ifm-button-border-width) solid var(--ifm-color-secondary); - border-radius: var(--ifm-button-border-radius); - font-size: calc(0.875rem * 0.8); - font-weight: var(--ifm-button-font-weight); - line-height: 1.5; -} diff --git a/website-next/src/components/Playground/YogaEnumSelect.tsx b/website-next/src/components/Playground/YogaEnumSelect.tsx deleted file mode 100644 index dc9829ea..00000000 --- a/website-next/src/components/Playground/YogaEnumSelect.tsx +++ /dev/null @@ -1,93 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import React, {Component} from 'react'; -import clsx from 'clsx'; -import Yoga from 'yoga-layout'; - -import styles from './YogaEnumSelect.module.css'; - -const PROPERTY_LOOKUP = { - flexDirection: 'FLEX_DIRECTION', - direction: 'DIRECTION', - justifyContent: 'JUSTIFY', - alignSelf: 'ALIGN', - alignContent: 'ALIGN', - alignItems: 'ALIGN', - positionType: 'POSITION_TYPE', - flexWrap: 'WRAP', -}; - -type Property = keyof typeof PROPERTY_LOOKUP; - -type Props = { - property: Property; - disabled?: boolean; - value: string | number; - onChange: (property: Property, value: number) => void; -}; - -export default class YogaEnumSelect extends Component { - static availableProperties = Object.keys(PROPERTY_LOOKUP); - - values: Array<{key: string; value: number}>; - - constructor(props: Props) { - super(props); - - const property = PROPERTY_LOOKUP[props.property]; - - this.values = Object.keys(Yoga) - .map(key => ({key, value: Yoga[key]})) - .filter( - ({key}) => key.startsWith(property) && key !== `${property}_COUNT`, - ); - } - - handleMenuClick = ({key}: {key: string}) => { - this.props.onChange(this.props.property, Yoga[key]); - }; - - getTitle = (property: string, key: string): string => { - const replacer = new RegExp(`^${property}_`); - return key.replace(replacer, '').replace('_', ' ').toLowerCase(); - }; - - render() { - const property = PROPERTY_LOOKUP[this.props.property]; - const selected = this.values.find(({value}) => value === this.props.value); - - return this.values.length > 3 ? ( - - ) : ( -
- {this.values.map(({key, value}) => ( - - ))} -
- ); - } -} diff --git a/website-next/src/components/Playground/YogaNode.css b/website-next/src/components/Playground/YogaNode.css deleted file mode 100644 index 76873b96..00000000 --- a/website-next/src/components/Playground/YogaNode.css +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -.YogaNode { - box-sizing: border-box; - background: var(--ifm-background-surface-color); - position: absolute; - transform: scale(1); - box-shadow: var(--ifm-global-shadow-lw); - cursor: pointer; - animation: yoga-node-fadein 200ms ease; -} - -@keyframes yoga-node-fadein { - 0% { - transform: scale(1.05); - opacity: 0%; - } - - 100% { - transform: scale(1.0); - opacity: 100%; - } -} - -.YogaNode.hover:not(.focused) { - background-color: var(--ifm-color-emphasis-100); -} - -.YogaNode .YogaNode { - background: rgba(255, 255, 255, 0.7); -} - -.YogaNode .YogaNode.hover{ - background: rgba(240, 255, 249, 0.7); -} - -.YogaNode.focused { - outline: 2px solid var(--ifm-color-primary); - z-index: 2; -} - -.YogaNode.invisible { - transform: scale(0); -} - -.YogaNode .label { - user-select: none; - pointer-events: none; - position: absolute; - left: 0; - bottom: 0; - right: 0; - top: 0; - display: flex; - align-items: center; - justify-content: center; - font-size: 20px; - font-weight: 300; - letter-spacing: 1px; -} diff --git a/website-next/src/components/Playground/YogaNode.tsx b/website-next/src/components/Playground/YogaNode.tsx deleted file mode 100644 index 513678fa..00000000 --- a/website-next/src/components/Playground/YogaNode.tsx +++ /dev/null @@ -1,307 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import React, {Component} from 'react'; -import Yoga from 'yoga-layout'; -import PositionGuide from './PositionGuide'; -import PositionRecord from './PositionRecord'; -import LayoutRecord from './LayoutRecord'; -import type {LayoutRecordType} from './LayoutRecord'; -import {Direction, Display, Edge, Node, Wrap} from 'yoga-layout'; -import clsx from 'clsx'; - -import './YogaNode.css'; - -type ComputedLayout = { - left: number; - top: number; - width: number; - height: number; - children: Array; - node: Node; -}; - -type Props = { - layoutDefinition: LayoutRecordType; - className?: string; - computedLayout?: ComputedLayout; - path: Array; - selectedNodePath?: Array; - direction?: Direction; - label?: string; - showGuides: boolean; - onClick?: (path: Array) => void; - onDoubleClick?: (path: Array) => void; -}; - -type State = { - visible?: boolean; - hovered: boolean; -}; - -export default class YogaNode extends Component { - node: Node; - _ref: HTMLDivElement; - - static defaultProps = { - path: [], - label: 'root', - showGuides: true, - }; - - state = { - hovered: false, - visible: false, - }; - computedLayout?: ComputedLayout; - rootNode?: Node; - - constructor(props: Props) { - super(props); - if (!props.computedLayout) { - // is root node - this.calculateLayout(props); - this.state = { - hovered: false, - visible: !props.computedLayout, - }; - } - } - - componentDidMount() { - setTimeout(() => this.setState({visible: true}), 200); - } - - componentWillReceiveProps(nextProps: Props) { - if ( - !nextProps.computedLayout && - (!this.props.layoutDefinition.equals(nextProps.layoutDefinition) || - this.props.direction !== nextProps.direction) - ) { - // is root node and the layout definition or settings changed - this.calculateLayout(nextProps); - } - } - - componentWillUnmount() { - if (this.rootNode) { - this.rootNode.freeRecursive(); - } - } - - onMouseMove = e => { - this.setState({hovered: e.target === this._ref}); - }; - - calculateLayout(props: Props) { - const root = this.createYogaNodes(props.layoutDefinition); - root.calculateLayout( - props.layoutDefinition.width, - props.layoutDefinition.height, - props.direction, - ); - this.computedLayout = this.getComputedLayout(root); - this.rootNode = root; - } - - createYogaNodes = (layoutDefinition: LayoutRecordType): Node => { - const root = Yoga.Node.create(); - - const defaultLayout = LayoutRecord({}); - [ - 'width', - 'height', - 'minWidth', - 'maxWidth', - 'minHeight', - 'maxHeight', - 'justifyContent', - 'alignItems', - 'alignSelf', - 'alignContent', - 'flexGrow', - 'flexShrink', - 'positionType', - 'aspectRatio', - 'flexWrap', - 'flexDirection', - ].forEach(key => { - try { - const value = - layoutDefinition[key] === '' - ? defaultLayout[key] - : layoutDefinition[key]; - root[`set${key[0].toUpperCase()}${key.substr(1)}`](value); - } catch (e) { - // Do nothing on failure - } - }); - - ['padding', 'margin', 'position', 'border'].forEach(key => { - ['top', 'right', 'bottom', 'left'].forEach(direction => { - try { - root[`set${key[0].toUpperCase()}${key.substr(1)}`]( - Yoga[`EDGE_${direction.toUpperCase()}`], - layoutDefinition[key][direction], - ); - } catch (e) { - // Do nothing on failure - } - }); - }); - - root.setDisplay(Display.Flex); - - (layoutDefinition.children || []) - .map(this.createYogaNodes) - .forEach((node, i) => { - root.insertChild(node, i); - }); - return root; - }; - - getComputedLayout = (node: Node): ComputedLayout => { - return { - ...node.getComputedLayout(), - node, - children: Array(node.getChildCount()).map((_, i) => - this.getComputedLayout(node.getChild(i)), - ), - }; - }; - - onClick = (e: React.MouseEvent) => { - const {onClick} = this.props; - if (onClick) { - e.stopPropagation(); - onClick(this.props.path); - } - }; - - onDoubleClick = (e: React.MouseEvent) => { - const {onDoubleClick} = this.props; - if (onDoubleClick) { - e.stopPropagation(); - onDoubleClick(this.props.path); - } - }; - - onMouseLeave = (_e: React.MouseEvent) => this.setState({hovered: false}); - - showPositionGuides({node}: ComputedLayout) { - const padding = PositionRecord({ - top: node.getComputedPadding(Edge.Top), - left: node.getComputedPadding(Edge.Left), - right: node.getComputedPadding(Edge.Right), - bottom: node.getComputedPadding(Edge.Bottom), - }); - const border = PositionRecord({ - top: node.getComputedBorder(Edge.Top), - left: node.getComputedBorder(Edge.Left), - right: node.getComputedBorder(Edge.Right), - bottom: node.getComputedBorder(Edge.Bottom), - }); - const margin = PositionRecord({ - top: node.getComputedMargin(Edge.Top), - left: node.getComputedMargin(Edge.Left), - right: node.getComputedMargin(Edge.Right), - bottom: node.getComputedMargin(Edge.Bottom), - }); - const position = PositionRecord({ - top: node.getPosition(Edge.Top).value, - left: node.getPosition(Edge.Left).value, - right: node.getPosition(Edge.Right).value, - bottom: node.getPosition(Edge.Bottom).value, - }); - - return [ - , - , - , - , - ]; - } - - render() { - const {layoutDefinition, className, path, selectedNodePath, label} = - this.props; - - const computedLayout: ComputedLayout = - this.props.computedLayout || this.computedLayout; - const {left, top, width, height, children} = computedLayout; - - const isFocused = selectedNodePath && selectedNodePath.length === 0; - - return ( -
{ - this._ref = ref; - }} - onClick={this.onClick}> - {label &&
{label}
} - {isFocused && - this.props.showGuides && - this.showPositionGuides(computedLayout)} - {(children || []).map((child: ComputedLayout, i) => ( - 0 && - selectedNodePath[0] === i - ? selectedNodePath.slice(1) - : null - } - path={path.concat(i)} - onClick={this.props.onClick} - onDoubleClick={this.props.onDoubleClick} - showGuides={this.props.showGuides} - /> - ))} -
- ); - } -} diff --git a/website-next/src/components/Playground/YogaPositionEditor.css b/website-next/src/components/Playground/YogaPositionEditor.css deleted file mode 100644 index 0280e953..00000000 --- a/website-next/src/components/Playground/YogaPositionEditor.css +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - - .YogaPositionEditor { - text-align: center; - margin-top: 20px; - margin-bottom: 20px; - width: 60%; - margin-left: auto; - margin-right: auto; -} - -.YogaPositionEditor input { - width: 55px; - text-align: center; -} - -.YogaPositionEditorRow { - display: flex; - justify-content: space-between; - align-items: center; - flex-direction: row; - font-size: 12px; - font-weight: 700; - color: #444950; -} diff --git a/website-next/src/components/Playground/YogaPositionEditor.tsx b/website-next/src/components/Playground/YogaPositionEditor.tsx deleted file mode 100644 index 39eb87db..00000000 --- a/website-next/src/components/Playground/YogaPositionEditor.tsx +++ /dev/null @@ -1,71 +0,0 @@ -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - * @format - */ - -import React, {Component} from 'react'; -import PositionRecord from './PositionRecord'; -import type {PositionRecordType} from './PositionRecord'; -import './YogaPositionEditor.css'; - -type Property = 'position' | 'margin' | 'padding' | 'border'; - -type Props = { - value: PositionRecordType; - property: Property; - disabled?: boolean; - onChange: (property: Property, value: PositionRecordType) => void; -}; - -export default class YogaPositionEditor extends Component { - static availableProperties = ['position', 'margin', 'padding', 'border']; - - static defaultProps = { - value: PositionRecord(), - }; - - render() { - const {onChange, value, property, disabled} = this.props; - return ( -
- onChange(property, value.set('top', e.target.value))} - /> -
- - onChange(property, value.set('left', e.target.value)) - } - /> - {property.toUpperCase()} - - onChange(property, value.set('right', e.target.value)) - } - /> -
- - onChange(property, value.set('bottom', e.target.value)) - } - /> -
- ); - } -} diff --git a/website-next/src/components/YogaViewer.tsx b/website-next/src/components/YogaViewer.tsx new file mode 100644 index 00000000..534c22ee --- /dev/null +++ b/website-next/src/components/YogaViewer.tsx @@ -0,0 +1,114 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @format + */ + +import React, {useMemo} from 'react'; +import Yoga, {Direction, Overflow, Node as YogaNode} from 'yoga-layout'; +import {FlexStyle, applyStyle} from './FlexStyle'; +import LayoutBox from './LayoutBox'; + +import type {LayoutMetrics} from './LayoutBox'; + +export type Props = Readonly<{ + rootNode: StyleNode; + width?: number; + height?: number; + className?: string; + useWebDefaults?: boolean; +}>; + +export type StyleNode = { + style?: FlexStyle; + children?: StyleNode[]; +}; + +export default function YogaViewer({ + rootNode, + width, + height, + className, + useWebDefaults, +}: Props) { + const layout = useMemo( + () => layoutStyleTree(rootNode, width, height, {useWebDefaults}), + [rootNode, width, height], + ); + return ; +} + +type LayoutConfig = Readonly<{ + useWebDefaults?: boolean; +}>; + +// This is not efficient and not a good real-world-example for the best way to use Yoga, but sufficient for a playground +function layoutStyleTree( + node: StyleNode, + rootWidth: number | undefined, + rootHeight: number | undefined, + layoutConfig: LayoutConfig, +): LayoutMetrics { + const root = yogaNodeFromStyleNode(node, layoutConfig); + root.calculateLayout(rootWidth, rootHeight, Direction.LTR); + + const layoutMetrics = metricsFromYogaNode(root); + layoutMetrics.overflow = node.style?.overflow; + + root.freeRecursive(); + return layoutMetrics; +} + +function yogaNodeFromStyleNode( + styleNode: StyleNode, + layoutConfig: LayoutConfig, +): YogaNode { + const node = Yoga.Node.create( + layoutConfig.useWebDefaults ? webDefaultsConfig : undefined, + ); + applyStyle(node, styleNode.style); + + for (const child of styleNode.children ?? []) { + node.insertChild( + yogaNodeFromStyleNode(child, layoutConfig), + node.getChildCount(), + ); + } + + return node; +} + +const webDefaultsConfig = Yoga.Config.create(); +webDefaultsConfig.setUseWebDefaults(true); + +function metricsFromYogaNode(node: YogaNode): LayoutMetrics { + const children: LayoutMetrics[] = []; + for (let i = 0; i < node.getChildCount(); i++) { + children.push(metricsFromYogaNode(node.getChild(i))); + } + + // Offset is relative to parent padding box, so we need to subtract the extra + // border we show as part of the box. + const parentBorderThickness = 1; + + return { + top: node.getComputedTop() - parentBorderThickness, + left: node.getComputedLeft() - parentBorderThickness, + width: node.getComputedWidth(), + height: node.getComputedHeight(), + overflow: (() => { + switch (node.getOverflow()) { + case Overflow.Hidden: + return 'hidden'; + case Overflow.Scroll: + return 'scroll'; + case Overflow.Visible: + return 'visible'; + } + })(), + children, + }; +} diff --git a/website-next/src/pages/index.module.css b/website-next/src/pages/index.module.css index 406b93b9..6b464571 100644 --- a/website-next/src/pages/index.module.css +++ b/website-next/src/pages/index.module.css @@ -5,156 +5,30 @@ * LICENSE file in the root directory of this source tree. */ -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - - html[data-theme='light'] { - --yg-color-playound-background: var(--ifm-color-gray-200); - } - - html[data-theme='dark'] { - --yg-color-playound-background: var(--ifm-color-background); - } - .heroBanner { - flex: 1; - display: flex; - flex-direction: row; justify-content: center; -} + } .heroRow { align-items: center; -} - -.blueprintColumn { - display: flex; - align-items: center; justify-content: center; } -@media (max-width: 996px) { - .blueprintColumn { - display: none; - } -} - -.blueprint { - --blueprint-gap: 5%; - --fadein-duration: 500ms; - box-shadow: var(--ifm-global-shadow-tl); - background-color: var(--ifm-background-surface-color); - border-radius: 0.5rem; -} - - -.blueprintContainer { - position: relative; - width: var(--ifm-col-width); - aspect-ratio: 1.0; - background-color: var(--ifm-color-primary-lighter); - box-shadow: var(--ifm-global-shadow-lw); -} - -.blueprintAvatar { - position: absolute; - left: 0; - top: 0; - margin: var(--blueprint-gap) 0 0 var(--blueprint-gap); - width: calc(25% - (var(--blueprint-gap))); - height: calc(25% - (var(--blueprint-gap))); - animation: avatar-fadein var(--fadein-duration) ease; -} - -@keyframes avatar-fadein { - 0% { - transform: scale(1.1); - opacity: 0%; - } - - 50% { - transform: scale(1.0); - opacity: 100%; - } -} - -.blueprintTitle { - position: absolute; - left: 25%; - top: 0; - right: 10%; - margin: var(--blueprint-gap) var(--blueprint-gap) 0 var(--blueprint-gap); - height: calc(10% - (var(--blueprint-gap))); - animation: title-fadein var(--fadein-duration) ease; -} - -.blueprintSubtitle { - position: absolute; - left: 25%; - top: 10%; - right: 30%; - margin: var(--blueprint-gap); - height: calc(10% - (var(--blueprint-gap))); - animation: title-fadein var(--fadein-duration) ease; -} - -@keyframes title-fadein { - 0% { - transform: scale(1.1); - opacity: 0%; - } - - 25% { - transform: scale(1.1); - opacity: 0%; - } - - 75% { - transform: scale(1.0); - opacity: 100%; - } -} - -.blueprintContent { - box-sizing: border-box; - position: absolute; - bottom: 0; - margin: var(--blueprint-gap); - width: calc(100% - (var(--blueprint-gap) * 2)); - height: calc(75% - (var(--blueprint-gap) * 2)); - animation: content-fadein var(--fadein-duration) ease; -} - -@keyframes content-fadein { - 0% { - transform: scale(1.1); - opacity: 0%; - } - - 50% { - transform: scale(1.1); - opacity: 0%; - } - - 100% { - transform: scale(1.0); - opacity: 100%; - } -} - -.playgroundSection { - display: flex; - flex-direction: column; - justify-content: center; - height: 600px; - width: 100%; - background-color: var(--yg-color-playound-background); -} +.heroLogo { + width: 200px; + height: 200px; + } @media (max-width: 996px) { - .playgroundSection { + .heroLogo { display: none; - } + } + + .playgroundSection :global(.prism-code) { + display: none; + } +} + +.bg { + background-color: var(--yg-color-playground-background); } diff --git a/website-next/src/pages/index.tsx b/website-next/src/pages/index.tsx index 382adeae..ce2e555d 100644 --- a/website-next/src/pages/index.tsx +++ b/website-next/src/pages/index.tsx @@ -5,83 +5,77 @@ * LICENSE file in the root directory of this source tree. */ -import React, {Suspense} from 'react'; +import React from 'react'; import clsx from 'clsx'; import Link from '@docusaurus/Link'; import Layout from '@theme/Layout'; -import BrowserOnly from '@docusaurus/BrowserOnly'; import styles from './index.module.css'; +import YogaLogo from '../../static/img/logo.svg'; +import Playground from '../components/Playground'; + function HeroSection() { return (
-

Yoga Layout

+

Yoga

- A portable and perfomant layout engine targeting web standards + A portable layout engine targeting web standards

Learn more
-
-
-
-
-
-
-
-
-
+
+
); } -const LazyPlayground = React.lazy( - () => import('../components/Playground/Playground'), -); - -// Docusaurus SSR does not correctly support top-level await -// 1. https://github.com/facebook/docusaurus/issues/7238 -// 2. https://github.com/facebook/docusaurus/issues/9468 -function BrowserOnlyPlayground() { - return ( - - {() => ( - - - - )} - - ); -} +const playgroundCode = ` + + + + + + + + + + + + + + + +`.trim(); function PlaygroundSection() { return (
-
- -
+
); } export default function Home(): JSX.Element { return ( - + diff --git a/website-next/src/components/Playground/Playground.module.css b/website-next/src/pages/playground.module.css similarity index 62% rename from website-next/src/components/Playground/Playground.module.css rename to website-next/src/pages/playground.module.css index c8c7c3dc..0f352d64 100644 --- a/website-next/src/components/Playground/Playground.module.css +++ b/website-next/src/pages/playground.module.css @@ -5,27 +5,19 @@ * LICENSE file in the root directory of this source tree. */ - html[data-theme='light'] { +html[data-theme='light'] { --yg-color-playound-background: var(--ifm-color-gray-200); - } +} - html[data-theme='dark'] { +html[data-theme='dark'] { --yg-color-playound-background: var(--ifm-color-background); - } - - -.container { - display: flex; - flex-direction: row; - background-color: var(--yg-color-playound-background); - min-height: 600px; - padding: 10px; } -.playground { +.playgroundContainer { + display: flex; flex: 1; - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; +} + +.bg { + background-color: var(--yg-color-playound-background); } diff --git a/website-next/src/pages/playground.tsx b/website-next/src/pages/playground.tsx new file mode 100644 index 00000000..3237148f --- /dev/null +++ b/website-next/src/pages/playground.tsx @@ -0,0 +1,27 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import Layout from '@theme/Layout'; +import {useLocation} from '@docusaurus/router'; + +import Playground from '../components/Playground'; + +import styles from './playground.module.css'; + +export default function PlaygroundPage(): JSX.Element { + const params = new URLSearchParams(useLocation().search); + const codeParam = params.get('code'); + const code = codeParam ? atob(codeParam) : undefined; + + return ( + // @ts-ignore missing prop for `wrapperClassName` + + + + ); +} diff --git a/website-next/static/img/copy.svg b/website-next/static/img/copy.svg new file mode 100644 index 00000000..c855d6b6 --- /dev/null +++ b/website-next/static/img/copy.svg @@ -0,0 +1,3 @@ + + + diff --git a/website-next/static/img/link.svg b/website-next/static/img/link.svg new file mode 100644 index 00000000..2cc98388 --- /dev/null +++ b/website-next/static/img/link.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/website-next/tsconfig.json b/website-next/tsconfig.json index 5b7d6bd4..1f199040 100644 --- a/website-next/tsconfig.json +++ b/website-next/tsconfig.json @@ -3,9 +3,8 @@ "extends": "@docusaurus/tsconfig", "compilerOptions": { "baseUrl": ".", - "target": "esnext", - "module": "esnext", - "moduleResolution": "bundler", - "allowImportingTsExtensions": true + "target": "es2022", + "allowImportingTsExtensions": true, + "strict": true } } diff --git a/yarn.lock b/yarn.lock index 562dea86..09294c32 100644 --- a/yarn.lock +++ b/yarn.lock @@ -162,12 +162,12 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.8.3": - version "7.22.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" - integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.8.3": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" + integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== dependencies: - "@babel/highlight" "^7.22.13" + "@babel/highlight" "^7.23.4" chalk "^2.4.2" "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2": @@ -175,33 +175,33 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.19.6", "@babel/core@^7.22.9", "@babel/core@^7.23.0": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" - integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.19.6", "@babel/core@^7.23.0", "@babel/core@^7.23.3": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.5.tgz#6e23f2acbcb77ad283c5ed141f824fd9f70101c7" + integrity sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.5" "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-module-transforms" "^7.23.0" - "@babel/helpers" "^7.23.2" - "@babel/parser" "^7.23.0" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.5" + "@babel/parser" "^7.23.5" "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.23.5" + "@babel/types" "^7.23.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.22.9", "@babel/generator@^7.23.0", "@babel/generator@^7.7.2": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" - integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== +"@babel/generator@^7.23.3", "@babel/generator@^7.23.5", "@babel/generator@^7.7.2": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.5.tgz#17d0a1ea6b62f351d281350a5f80b87a810c4755" + integrity sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== dependencies: - "@babel/types" "^7.23.0" + "@babel/types" "^7.23.5" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" @@ -300,10 +300,10 @@ dependencies: "@babel/types" "^7.22.15" -"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" - integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== +"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0", "@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" @@ -362,10 +362,10 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== +"@babel/helper-string-parser@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" + integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" @@ -386,28 +386,28 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.23.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" - integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== +"@babel/helpers@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.5.tgz#52f522840df8f1a848d06ea6a79b79eefa72401e" + integrity sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg== dependencies: "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.2" - "@babel/types" "^7.23.0" + "@babel/traverse" "^7.23.5" + "@babel/types" "^7.23.5" -"@babel/highlight@^7.22.13": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" - integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== +"@babel/highlight@^7.23.4": + version "7.23.4" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" + integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== dependencies: "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" - integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.22.15", "@babel/parser@^7.22.7", "@babel/parser@^7.23.5": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563" + integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": version "7.22.15" @@ -1159,7 +1159,7 @@ core-js-pure "^3.30.2" regenerator-runtime "^0.14.0" -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.22.6", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.22.6", "@babel/runtime@^7.8.4": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== @@ -1175,28 +1175,28 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.22.8", "@babel/traverse@^7.23.2", "@babel/traverse@^7.7.2": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" - integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== +"@babel/traverse@^7.22.8", "@babel/traverse@^7.23.5", "@babel/traverse@^7.7.2": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec" + integrity sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/generator" "^7.23.0" + "@babel/code-frame" "^7.23.5" + "@babel/generator" "^7.23.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.0" - "@babel/types" "^7.23.0" + "@babel/parser" "^7.23.5" + "@babel/types" "^7.23.5" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" - integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== +"@babel/types@^7.0.0", "@babel/types@^7.20.0", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.23.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602" + integrity sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w== dependencies: - "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" @@ -1230,13 +1230,13 @@ "@docsearch/css" "3.5.2" algoliasearch "^4.19.1" -"@docusaurus/core@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.0.0.tgz#46bc9bf2bcd99ca98a1c8f10a70bf3afaaaf9dcb" - integrity sha512-bHWtY55tJTkd6pZhHrWz1MpWuwN4edZe0/UWgFF7PW/oJeDZvLSXKqwny3L91X1/LGGoypBGkeZn8EOuKeL4yQ== +"@docusaurus/core@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.0.1.tgz#ad9a66b20802ea81b25e65db75d4ca952eda7e01" + integrity sha512-CXrLpOnW+dJdSv8M5FAJ3JBwXtL6mhUWxFA8aS0ozK6jBG/wgxERk5uvH28fCeFxOGbAT9v1e9dOMo1X2IEVhQ== dependencies: - "@babel/core" "^7.22.9" - "@babel/generator" "^7.22.9" + "@babel/core" "^7.23.3" + "@babel/generator" "^7.23.3" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-transform-runtime" "^7.22.9" "@babel/preset-env" "^7.22.9" @@ -1245,13 +1245,13 @@ "@babel/runtime" "^7.22.6" "@babel/runtime-corejs3" "^7.22.6" "@babel/traverse" "^7.22.8" - "@docusaurus/cssnano-preset" "3.0.0" - "@docusaurus/logger" "3.0.0" - "@docusaurus/mdx-loader" "3.0.0" + "@docusaurus/cssnano-preset" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-common" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-common" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" "@slorber/static-site-generator-webpack-plugin" "^4.0.7" "@svgr/webpack" "^6.5.1" autoprefixer "^10.4.14" @@ -1299,41 +1299,40 @@ tslib "^2.6.0" update-notifier "^6.0.2" url-loader "^4.1.1" - wait-on "^7.0.1" webpack "^5.88.1" webpack-bundle-analyzer "^4.9.0" webpack-dev-server "^4.15.1" webpack-merge "^5.9.0" webpackbar "^5.0.2" -"@docusaurus/cssnano-preset@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.0.0.tgz#87fbf9cbc7c383e207119b44c17fb1d05c73af7c" - integrity sha512-FHiRfwmVvIVdIGsHcijUOaX7hMn0mugVYB7m4GkpYI6Mi56zwQV4lH5p7DxcW5CUYNWMVxz2loWSCiWEm5ikwA== +"@docusaurus/cssnano-preset@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.0.1.tgz#22fbf2e97389e338747864baf011743846e8fd26" + integrity sha512-wjuXzkHMW+ig4BD6Ya1Yevx9UJadO4smNZCEljqBoQfIQrQskTswBs7lZ8InHP7mCt273a/y/rm36EZhqJhknQ== dependencies: cssnano-preset-advanced "^5.3.10" postcss "^8.4.26" postcss-sort-media-queries "^4.4.1" tslib "^2.6.0" -"@docusaurus/logger@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.0.0.tgz#02a4bfecec6aa3732c8bd9597ca9d5debab813a6" - integrity sha512-6eX0eOfioMQCk+qgCnHvbLLuyIAA+r2lSID6d6JusiLtDKmYMfNp3F4yyE8bnb0Abmzt2w68XwptEFYyALSAXw== +"@docusaurus/logger@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.0.1.tgz#06f512eef6c6ae4e2da63064257e01b1cdc41a82" + integrity sha512-I5L6Nk8OJzkVA91O2uftmo71LBSxe1vmOn9AMR6JRCzYeEBrqneWMH02AqMvjJ2NpMiviO+t0CyPjyYV7nxCWQ== dependencies: chalk "^4.1.2" tslib "^2.6.0" -"@docusaurus/mdx-loader@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.0.0.tgz#2593889e43dc4bbd8dfa074d86c8bb4206cf4171" - integrity sha512-JkGge6WYDrwjNgMxwkb6kNQHnpISt5L1tMaBWFDBKeDToFr5Kj29IL35MIQm0RfrnoOfr/29RjSH4aRtvlAR0A== +"@docusaurus/mdx-loader@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.0.1.tgz#89f221e5bcc570983fd61d7ab56d6fbe36810b59" + integrity sha512-ldnTmvnvlrONUq45oKESrpy+lXtbnTcTsFkOTIDswe5xx5iWJjt6eSa0f99ZaWlnm24mlojcIGoUWNCS53qVlQ== dependencies: "@babel/parser" "^7.22.7" "@babel/traverse" "^7.22.8" - "@docusaurus/logger" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" + "@docusaurus/logger" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" "@mdx-js/mdx" "^3.0.0" "@slorber/remark-comment" "^1.0.0" escape-html "^1.0.3" @@ -1370,18 +1369,32 @@ react-helmet-async "*" react-loadable "npm:@docusaurus/react-loadable@5.5.2" -"@docusaurus/plugin-content-blog@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.0.0.tgz#5f3ede003b2b7103043918fbe3f436c116839ca8" - integrity sha512-iA8Wc3tIzVnROJxrbIsU/iSfixHW16YeW9RWsBw7hgEk4dyGsip9AsvEDXobnRq3lVv4mfdgoS545iGWf1Ip9w== +"@docusaurus/module-type-aliases@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.1.tgz#d45990fe377d7ffaa68841cf89401188a5d65293" + integrity sha512-DEHpeqUDsLynl3AhQQiO7AbC7/z/lBra34jTcdYuvp9eGm01pfH1wTVq8YqWZq6Jyx0BgcVl/VJqtE9StRd9Ag== dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/logger" "3.0.0" - "@docusaurus/mdx-loader" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-common" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" + "@docusaurus/react-loadable" "5.5.2" + "@docusaurus/types" "3.0.1" + "@types/history" "^4.7.11" + "@types/react" "*" + "@types/react-router-config" "*" + "@types/react-router-dom" "*" + react-helmet-async "*" + react-loadable "npm:@docusaurus/react-loadable@5.5.2" + +"@docusaurus/plugin-content-blog@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.0.1.tgz#dee6147187c2d8b634252444d60312d12c9571a6" + integrity sha512-cLOvtvAyaMQFLI8vm4j26svg3ktxMPSXpuUJ7EERKoGbfpJSsgtowNHcRsaBVmfuCsRSk1HZ/yHBsUkTmHFEsg== + dependencies: + "@docusaurus/core" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-common" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" cheerio "^1.0.0-rc.12" feed "^4.2.2" fs-extra "^11.1.1" @@ -1393,18 +1406,18 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-docs@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.0.0.tgz#b579c65d7386905890043bdd4a8f9da3194e90fa" - integrity sha512-MFZsOSwmeJ6rvoZMLieXxPuJsA9M9vn7/mUZmfUzSUTeHAeq+fEqvLltFOxcj4DVVDTYlQhgWYd+PISIWgamKw== +"@docusaurus/plugin-content-docs@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.0.1.tgz#d9b1884562186573d5c4521ac3546b68512c1126" + integrity sha512-dRfAOA5Ivo+sdzzJGXEu33yAtvGg8dlZkvt/NEJ7nwi1F2j4LEdsxtfX2GKeETB2fP6XoGNSQnFXqa2NYGrHFg== dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/logger" "3.0.0" - "@docusaurus/mdx-loader" "3.0.0" - "@docusaurus/module-type-aliases" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" + "@docusaurus/core" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/module-type-aliases" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" "@types/react-router-config" "^5.0.7" combine-promises "^1.1.0" fs-extra "^11.1.1" @@ -1414,96 +1427,96 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-pages@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.0.0.tgz#519a946a477a203989080db70dd787cb6db15fab" - integrity sha512-EXYHXK2Ea1B5BUmM0DgSwaOYt8EMSzWtYUToNo62Q/EoWxYOQFdWglYnw3n7ZEGyw5Kog4LHaRwlazAdmDomvQ== +"@docusaurus/plugin-content-pages@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.0.1.tgz#27e6424c77173f867760efe53f848bbab8849ea6" + integrity sha512-oP7PoYizKAXyEttcvVzfX3OoBIXEmXTMzCdfmC4oSwjG4SPcJsRge3mmI6O8jcZBgUPjIzXD21bVGWEE1iu8gg== dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/mdx-loader" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" + "@docusaurus/core" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" fs-extra "^11.1.1" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/plugin-debug@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.0.0.tgz#9c6d4abfd5357dbebccf5b41f5aefc06116e03e3" - integrity sha512-gSV07HfQgnUboVEb3lucuVyv5pEoy33E7QXzzn++3kSc/NLEimkjXh3sSnTGOishkxCqlFV9BHfY/VMm5Lko5g== +"@docusaurus/plugin-debug@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.0.1.tgz#886b5dd03c066e970484ca251c1b79613df90700" + integrity sha512-09dxZMdATky4qdsZGzhzlUvvC+ilQ2hKbYF+wez+cM2mGo4qHbv8+qKXqxq0CQZyimwlAOWQLoSozIXU0g0i7g== dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@microlink/react-json-view" "^1.22.2" + "@docusaurus/core" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" fs-extra "^11.1.1" + react-json-view-lite "^1.2.0" tslib "^2.6.0" -"@docusaurus/plugin-google-analytics@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.0.0.tgz#8a54f5e21b55c133b6be803ac51bf92d4a515cca" - integrity sha512-0zcLK8w+ohmSm1fjUQCqeRsjmQc0gflvXnaVA/QVVCtm2yCiBtkrSGQXqt4MdpD7Xq8mwo3qVd5nhIcvrcebqw== +"@docusaurus/plugin-google-analytics@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.0.1.tgz#ec69902131ea3aad8b062eeb1d17bf0962986f80" + integrity sha512-jwseSz1E+g9rXQwDdr0ZdYNjn8leZBnKPjjQhMBEiwDoenL3JYFcNW0+p0sWoVF/f2z5t7HkKA+cYObrUh18gg== dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" + "@docusaurus/core" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" tslib "^2.6.0" -"@docusaurus/plugin-google-gtag@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.0.0.tgz#a4c407b80cb46773bea070816ebb547c5663f0b3" - integrity sha512-asEKavw8fczUqvXu/s9kG2m1epLnHJ19W6CCCRZEmpnkZUZKiM8rlkDiEmxApwIc2JDDbIMk+Y2TMkJI8mInbQ== +"@docusaurus/plugin-google-gtag@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.0.1.tgz#bb5526377d3a324ebec235127846fda386562b05" + integrity sha512-UFTDvXniAWrajsulKUJ1DB6qplui1BlKLQZjX4F7qS/qfJ+qkKqSkhJ/F4VuGQ2JYeZstYb+KaUzUzvaPK1aRQ== dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" + "@docusaurus/core" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" "@types/gtag.js" "^0.0.12" tslib "^2.6.0" -"@docusaurus/plugin-google-tag-manager@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.0.0.tgz#8befa315b4747618e9ea65add3f2f4e84df2c7ba" - integrity sha512-lytgu2eyn+7p4WklJkpMGRhwC29ezj4IjPPmVJ8vGzcSl6JkR1sADTHLG5xWOMuci420xZl9dGEiLTQ8FjCRyA== +"@docusaurus/plugin-google-tag-manager@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.0.1.tgz#4e36d13279cf90c2614b62438aa1109dd4696ec8" + integrity sha512-IPFvuz83aFuheZcWpTlAdiiX1RqWIHM+OH8wS66JgwAKOiQMR3+nLywGjkLV4bp52x7nCnwhNk1rE85Cpy/CIw== dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" + "@docusaurus/core" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" tslib "^2.6.0" -"@docusaurus/plugin-sitemap@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.0.0.tgz#91f300e500d476252ea2f40449ee828766b9b9d6" - integrity sha512-cfcONdWku56Oi7Hdus2uvUw/RKRRlIGMViiHLjvQ21CEsEqnQ297MRoIgjU28kL7/CXD/+OiANSq3T1ezAiMhA== +"@docusaurus/plugin-sitemap@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.0.1.tgz#ab55857e90d4500f892e110b30e4bc3289202bd4" + integrity sha512-xARiWnjtVvoEniZudlCq5T9ifnhCu/GAZ5nA7XgyLfPcNpHQa241HZdsTlLtVcecEVVdllevBKOp7qknBBaMGw== dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/logger" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-common" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" + "@docusaurus/core" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-common" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" fs-extra "^11.1.1" sitemap "^7.1.1" tslib "^2.6.0" -"@docusaurus/preset-classic@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.0.0.tgz#b05c3960c4d0a731b2feb97e94e3757ab073c611" - integrity sha512-90aOKZGZdi0+GVQV+wt8xx4M4GiDrBRke8NO8nWwytMEXNrxrBxsQYFRD1YlISLJSCiHikKf3Z/MovMnQpnZyg== +"@docusaurus/preset-classic@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.0.1.tgz#d363ac837bba967095ed2a896d13c54f3717d6b5" + integrity sha512-il9m9xZKKjoXn6h0cRcdnt6wce0Pv1y5t4xk2Wx7zBGhKG1idu4IFHtikHlD0QPuZ9fizpXspXcTzjL5FXc1Gw== dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/plugin-content-blog" "3.0.0" - "@docusaurus/plugin-content-docs" "3.0.0" - "@docusaurus/plugin-content-pages" "3.0.0" - "@docusaurus/plugin-debug" "3.0.0" - "@docusaurus/plugin-google-analytics" "3.0.0" - "@docusaurus/plugin-google-gtag" "3.0.0" - "@docusaurus/plugin-google-tag-manager" "3.0.0" - "@docusaurus/plugin-sitemap" "3.0.0" - "@docusaurus/theme-classic" "3.0.0" - "@docusaurus/theme-common" "3.0.0" - "@docusaurus/theme-search-algolia" "3.0.0" - "@docusaurus/types" "3.0.0" + "@docusaurus/core" "3.0.1" + "@docusaurus/plugin-content-blog" "3.0.1" + "@docusaurus/plugin-content-docs" "3.0.1" + "@docusaurus/plugin-content-pages" "3.0.1" + "@docusaurus/plugin-debug" "3.0.1" + "@docusaurus/plugin-google-analytics" "3.0.1" + "@docusaurus/plugin-google-gtag" "3.0.1" + "@docusaurus/plugin-google-tag-manager" "3.0.1" + "@docusaurus/plugin-sitemap" "3.0.1" + "@docusaurus/theme-classic" "3.0.1" + "@docusaurus/theme-common" "3.0.1" + "@docusaurus/theme-search-algolia" "3.0.1" + "@docusaurus/types" "3.0.1" "@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": version "5.5.2" @@ -1513,84 +1526,84 @@ "@types/react" "*" prop-types "^15.6.2" -"@docusaurus/theme-classic@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.0.0.tgz#a47eda40747e1a6f79190e6bb786d3a7fc4e06b2" - integrity sha512-wWOHSrKMn7L4jTtXBsb5iEJ3xvTddBye5PjYBnWiCkTAlhle2yMdc4/qRXW35Ot+OV/VXu6YFG8XVUJEl99z0A== +"@docusaurus/theme-classic@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.0.1.tgz#3ba4dc77553d2c1608e433c0d01bed7c6db14eb9" + integrity sha512-XD1FRXaJiDlmYaiHHdm27PNhhPboUah9rqIH0lMpBt5kYtsGjJzhqa27KuZvHLzOP2OEpqd2+GZ5b6YPq7Q05Q== dependencies: - "@docusaurus/core" "3.0.0" - "@docusaurus/mdx-loader" "3.0.0" - "@docusaurus/module-type-aliases" "3.0.0" - "@docusaurus/plugin-content-blog" "3.0.0" - "@docusaurus/plugin-content-docs" "3.0.0" - "@docusaurus/plugin-content-pages" "3.0.0" - "@docusaurus/theme-common" "3.0.0" - "@docusaurus/theme-translations" "3.0.0" - "@docusaurus/types" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-common" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" + "@docusaurus/core" "3.0.1" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/module-type-aliases" "3.0.1" + "@docusaurus/plugin-content-blog" "3.0.1" + "@docusaurus/plugin-content-docs" "3.0.1" + "@docusaurus/plugin-content-pages" "3.0.1" + "@docusaurus/theme-common" "3.0.1" + "@docusaurus/theme-translations" "3.0.1" + "@docusaurus/types" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-common" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" "@mdx-js/react" "^3.0.0" - clsx "^1.2.1" + clsx "^2.0.0" copy-text-to-clipboard "^3.2.0" infima "0.2.0-alpha.43" lodash "^4.17.21" nprogress "^0.2.0" postcss "^8.4.26" - prism-react-renderer "^2.1.0" + prism-react-renderer "^2.3.0" prismjs "^1.29.0" react-router-dom "^5.3.4" rtlcss "^4.1.0" tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-common@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.0.0.tgz#6dc8c39a7458dd39f95a2fa6eb1c6aaf32b7e103" - integrity sha512-PahRpCLRK5owCMEqcNtUeTMOkTUCzrJlKA+HLu7f+8osYOni617YurXvHASCsSTxurjXaLz/RqZMnASnqATxIA== +"@docusaurus/theme-common@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.0.1.tgz#29a5bcb286296a52bc10afa5308e360cbed6b49c" + integrity sha512-cr9TOWXuIOL0PUfuXv6L5lPlTgaphKP+22NdVBOYah5jSq5XAAulJTjfe+IfLsEG4L7lJttLbhW7LXDFSAI7Ag== dependencies: - "@docusaurus/mdx-loader" "3.0.0" - "@docusaurus/module-type-aliases" "3.0.0" - "@docusaurus/plugin-content-blog" "3.0.0" - "@docusaurus/plugin-content-docs" "3.0.0" - "@docusaurus/plugin-content-pages" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-common" "3.0.0" + "@docusaurus/mdx-loader" "3.0.1" + "@docusaurus/module-type-aliases" "3.0.1" + "@docusaurus/plugin-content-blog" "3.0.1" + "@docusaurus/plugin-content-docs" "3.0.1" + "@docusaurus/plugin-content-pages" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-common" "3.0.1" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" - clsx "^1.2.1" + clsx "^2.0.0" parse-numeric-range "^1.3.0" - prism-react-renderer "^2.1.0" + prism-react-renderer "^2.3.0" tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.0.0.tgz#20701c2e7945a236df401365271b511a24ff3cad" - integrity sha512-PyMUNIS9yu0dx7XffB13ti4TG47pJq3G2KE/INvOFb6M0kWh+wwCnucPg4WAOysHOPh+SD9fjlXILoLQstgEIA== +"@docusaurus/theme-search-algolia@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.0.1.tgz#d8fb6bddca8d8355e4706c4c7d30d3b800217cf4" + integrity sha512-DDiPc0/xmKSEdwFkXNf1/vH1SzJPzuJBar8kMcBbDAZk/SAmo/4lf6GU2drou4Ae60lN2waix+jYWTWcJRahSA== dependencies: "@docsearch/react" "^3.5.2" - "@docusaurus/core" "3.0.0" - "@docusaurus/logger" "3.0.0" - "@docusaurus/plugin-content-docs" "3.0.0" - "@docusaurus/theme-common" "3.0.0" - "@docusaurus/theme-translations" "3.0.0" - "@docusaurus/utils" "3.0.0" - "@docusaurus/utils-validation" "3.0.0" + "@docusaurus/core" "3.0.1" + "@docusaurus/logger" "3.0.1" + "@docusaurus/plugin-content-docs" "3.0.1" + "@docusaurus/theme-common" "3.0.1" + "@docusaurus/theme-translations" "3.0.1" + "@docusaurus/utils" "3.0.1" + "@docusaurus/utils-validation" "3.0.1" algoliasearch "^4.18.0" algoliasearch-helper "^3.13.3" - clsx "^1.2.1" + clsx "^2.0.0" eta "^2.2.0" fs-extra "^11.1.1" lodash "^4.17.21" tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.0.0.tgz#98590b80589f15b2064e0daa2acc3a82d126f53b" - integrity sha512-p/H3+5LdnDtbMU+csYukA6601U1ld2v9knqxGEEV96qV27HsHfP63J9Ta2RBZUrNhQAgrwFzIc9GdDO8P1Baag== +"@docusaurus/theme-translations@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.0.1.tgz#837a01a166ccd698a3eceaed0c2f798555bc024b" + integrity sha512-6UrbpzCTN6NIJnAtZ6Ne9492vmPVX+7Fsz4kmp+yor3KQwA1+MCzQP7ItDNkP38UmVLnvB/cYk/IvehCUqS3dg== dependencies: fs-extra "^11.1.1" tslib "^2.6.0" @@ -1614,30 +1627,44 @@ webpack "^5.88.1" webpack-merge "^5.9.0" -"@docusaurus/utils-common@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.0.0.tgz#fb019e5228b20852a5b98f50672a02843a03ba03" - integrity sha512-7iJWAtt4AHf4PFEPlEPXko9LZD/dbYnhLe0q8e3GRK1EXZyRASah2lznpMwB3lLmVjq/FR6ZAKF+E0wlmL5j0g== +"@docusaurus/types@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.0.1.tgz#4fe306aa10ef7c97dbc07588864f6676a40f3b6f" + integrity sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg== + dependencies: + "@types/history" "^4.7.11" + "@types/react" "*" + commander "^5.1.0" + joi "^17.9.2" + react-helmet-async "^1.3.0" + utility-types "^3.10.0" + webpack "^5.88.1" + webpack-merge "^5.9.0" + +"@docusaurus/utils-common@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.0.1.tgz#111f450089d5f0a290c0c25f8a574a270d08436f" + integrity sha512-W0AxD6w6T8g6bNro8nBRWf7PeZ/nn7geEWM335qHU2DDDjHuV4UZjgUGP1AQsdcSikPrlIqTJJbKzer1lRSlIg== dependencies: tslib "^2.6.0" -"@docusaurus/utils-validation@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.0.0.tgz#56f3ba89ceba9826989408a96827897c0b724612" - integrity sha512-MlIGUspB/HBW5CYgHvRhmkZbeMiUWKbyVoCQYvbGN8S19SSzVgzyy97KRpcjCOYYeEdkhmRCUwFBJBlLg3IoNQ== +"@docusaurus/utils-validation@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.0.1.tgz#3c5f12941b328a19fc9acb34d070219f3e865ec6" + integrity sha512-ujTnqSfyGQ7/4iZdB4RRuHKY/Nwm58IIb+41s5tCXOv/MBU2wGAjOHq3U+AEyJ8aKQcHbxvTKJaRchNHYUVUQg== dependencies: - "@docusaurus/logger" "3.0.0" - "@docusaurus/utils" "3.0.0" + "@docusaurus/logger" "3.0.1" + "@docusaurus/utils" "3.0.1" joi "^17.9.2" js-yaml "^4.1.0" tslib "^2.6.0" -"@docusaurus/utils@3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.0.0.tgz#2ef0c8e434036fe104dca4c694fd50022b2ba1ed" - integrity sha512-JwGjh5mtjG9XIAESyPxObL6CZ6LO/yU4OSTpq7Q0x+jN25zi/AMbvLjpSyZzWy+qm5uQiFiIhqFaOxvy+82Ekg== +"@docusaurus/utils@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.0.1.tgz#c64f68980a90c5bc6d53a5b8f32deb9026b1e303" + integrity sha512-TwZ33Am0q4IIbvjhUOs+zpjtD/mXNmLmEgeTGuRq01QzulLHuPhaBTTAC/DHu6kFx3wDgmgpAlaRuCHfTcXv8g== dependencies: - "@docusaurus/logger" "3.0.0" + "@docusaurus/logger" "3.0.1" "@svgr/webpack" "^6.5.1" escape-string-regexp "^4.0.0" file-loader "^6.2.0" @@ -2002,16 +2029,6 @@ dependencies: "@types/mdx" "^2.0.0" -"@microlink/react-json-view@^1.22.2": - version "1.23.0" - resolved "https://registry.yarnpkg.com/@microlink/react-json-view/-/react-json-view-1.23.0.tgz#641c2483b1a0014818303d4e9cce634d5dacc7e9" - integrity sha512-HYJ1nsfO4/qn8afnAMhuk7+5a1vcjEaS8Gm5Vpr1SqdHDY0yLBJGpA+9DvKyxyVKaUkXzKXt3Mif9RcmFSdtYg== - dependencies: - flux "~4.0.1" - react-base16-styling "~0.6.0" - react-lifecycles-compat "~3.0.4" - react-textarea-autosize "~8.3.2" - "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": version "2.1.8-no-fsevents.3" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" @@ -3090,6 +3107,11 @@ ansicolors@~0.3.2: resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + anymatch@^3.0.3, anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -3174,11 +3196,6 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - astring@^1.8.0: version "1.8.6" resolved "https://registry.yarnpkg.com/astring/-/astring-1.8.6.tgz#2c9c157cf1739d67561c56ba896e6948f6b93731" @@ -3222,11 +3239,6 @@ async@^3.2.3: resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" @@ -3244,14 +3256,6 @@ autoprefixer@^10.4.12, autoprefixer@^10.4.14: picocolors "^1.0.0" postcss-value-parser "^4.2.0" -axios@^0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" - integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== - dependencies: - follow-redirects "^1.14.9" - form-data "^4.0.0" - babel-jest@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" @@ -3390,11 +3394,6 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" - integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== - batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" @@ -3776,10 +3775,10 @@ clone-deep@^4.0.1: kind-of "^6.0.2" shallow-clone "^3.0.0" -clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== +clsx@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== co@^4.6.0: version "4.6.0" @@ -3849,13 +3848,6 @@ combine-promises@^1.1.0: resolved "https://registry.yarnpkg.com/combine-promises/-/combine-promises-1.1.0.tgz#72db90743c0ca7aab7d0d8d2052fd7b0f674de71" integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - comma-separated-tokens@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" @@ -3871,7 +3863,7 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.1: +commander@^4.0.0, commander@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== @@ -4063,13 +4055,6 @@ cosmiconfig@^8.2.0: parse-json "^5.0.0" path-type "^4.0.0" -cross-fetch@^3.1.5: - version "3.1.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" - integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== - dependencies: - node-fetch "^2.6.11" - cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -4330,11 +4315,6 @@ del@^6.1.1: rimraf "^3.0.2" slash "^3.0.0" -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -5044,31 +5024,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" - integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.5" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.5.tgz#aa0edb7d5caa6340011790bd9249dbef8a81128d" - integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^1.0.35" - feed@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" @@ -5173,15 +5128,7 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -flux@~4.0.1: - version "4.0.4" - resolved "https://registry.yarnpkg.com/flux/-/flux-4.0.4.tgz#9661182ea81d161ee1a6a6af10d20485ef2ac572" - integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" - -follow-redirects@^1.0.0, follow-redirects@^1.14.9: +follow-redirects@^1.0.0: version "1.15.3" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== @@ -5222,15 +5169,6 @@ form-data-encoder@^2.1.2: resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - format@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" @@ -5378,6 +5316,18 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -5864,11 +5814,6 @@ immer@^9.0.7: resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== -immutable@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" - integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== - import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -6587,7 +6532,7 @@ jju@^1.4.0, jju@~1.4.0: resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== -joi@^17.7.0, joi@^17.9.2: +joi@^17.9.2: version "17.11.0" resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== @@ -6846,11 +6791,6 @@ locate-path@^7.1.0: dependencies: p-locate "^6.0.0" -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" - integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== - lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -6866,11 +6806,6 @@ lodash.flatten@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -7704,7 +7639,7 @@ mime-types@2.1.18: dependencies: mime-db "~1.33.0" -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -7757,7 +7692,7 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.7: +minimist@^1.2.0: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -7817,6 +7752,15 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nanoid@^3.3.6: version "3.3.6" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" @@ -7877,13 +7821,6 @@ node-emoji@^2.1.0: emojilib "^2.4.0" skin-tone "^2.0.0" -node-fetch@^2.6.11: - version "2.6.11" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== - dependencies: - whatwg-url "^5.0.0" - node-forge@^1: version "1.3.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" @@ -7952,7 +7889,12 @@ nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -object-assign@^4.1.0, object-assign@^4.1.1: +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -8289,10 +8231,10 @@ pify@^4.0.1: resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== +pirates@^4.0.1, pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: version "4.2.0" @@ -8644,13 +8586,13 @@ pretty-time@^1.1.0: resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== -prism-react-renderer@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.1.0.tgz#a2f418451647412ea73d18cfe363fea20e419f9d" - integrity sha512-I5cvXHjA1PVGbGm1MsWCpvBCRrYyxEri0MC7/JbfIfYfcXAxHyO5PaUjs3A8H5GW6kJcLhTHxxMaOZZpRZD2iQ== +prism-react-renderer@^2.0.6, prism-react-renderer@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-2.3.0.tgz#5f8f615af6af8201a0b734bd8c946df3d818ea54" + integrity sha512-UYRg2TkVIaI6tRVHC5OJ4/BxqPUxJkJvq/odLT/ykpt1zGYXooNperUxQcCvi87LyRnR4nCh81ceOA+e7nrydg== dependencies: "@types/prismjs" "^1.26.0" - clsx "^1.2.1" + clsx "^2.0.0" prismjs@^1.29.0: version "1.29.0" @@ -8662,13 +8604,6 @@ process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - prompts@^2.0.1, prompts@^2.4.0, prompts@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" @@ -8721,11 +8656,6 @@ pupa@^3.1.0: dependencies: escape-goat "^4.0.0" -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" - integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== - qs@6.11.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" @@ -8787,16 +8717,6 @@ rc@1.2.8: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-base16-styling@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" - integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - react-dev-utils@^12.0.1: version "12.0.1" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" @@ -8866,10 +8786,19 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-lifecycles-compat@~3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== +react-json-view-lite@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-1.2.1.tgz#c59a0bea4ede394db331d482ee02e293d38f8218" + integrity sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ== + +react-live@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/react-live/-/react-live-4.1.5.tgz#a4fa4cfdcad763503a209a29bace3339764fdfb1" + integrity sha512-ul3Zwvqvh6KTg8j7xGCT26+c8J9vQ+LFUrZCbrrrzEExuVB/39s1GKG3NsywnL+aGAjpfnUTaVCe7KlKIvVPiw== + dependencies: + prism-react-renderer "^2.0.6" + sucrase "^3.31.0" + use-editable "^2.3.3" react-loadable-ssr-addon-v5-slorber@^1.0.1: version "1.0.1" @@ -8913,15 +8842,6 @@ react-router@5.3.4, react-router@^5.3.4: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-textarea-autosize@~8.3.2: - version "8.3.4" - resolved "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz#270a343de7ad350534141b02c9cb78903e553524" - integrity sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ== - dependencies: - "@babel/runtime" "^7.10.2" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - react@^18.0.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -9271,13 +9191,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.8.0: - version "7.8.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -9447,11 +9360,6 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -9786,6 +9694,19 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +sucrase@^3.31.0: + version "3.34.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" + integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -9895,6 +9816,20 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -9937,11 +9872,6 @@ totalist@^3.0.0: resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - trim-lines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" @@ -9952,12 +9882,17 @@ trough@^2.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.6.0: +tslib@^2.0.3, tslib@^2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -10031,11 +9966,6 @@ typescript@5.0.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== -ua-parser-js@^1.0.35: - version "1.0.35" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.35.tgz#c4ef44343bc3db0a3cbefdf21822f1b1fc1ab011" - integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== - undertaker-registry@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" @@ -10222,22 +10152,10 @@ url-loader@^4.1.1: mime-types "^2.1.27" schema-utils "^3.0.0" -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" +use-editable@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/use-editable/-/use-editable-2.3.3.tgz#a292fe9ba4c291cd28d1cc2728c75a5fc8d9a33f" + integrity sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA== util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" @@ -10313,17 +10231,6 @@ vfile@^6.0.0, vfile@^6.0.1: unist-util-stringify-position "^4.0.0" vfile-message "^4.0.0" -wait-on@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/wait-on/-/wait-on-7.0.1.tgz#5cff9f8427e94f4deacbc2762e6b0a489b19eae9" - integrity sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog== - dependencies: - axios "^0.27.2" - joi "^17.7.0" - lodash "^4.17.21" - minimist "^1.2.7" - rxjs "^7.8.0" - walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" @@ -10351,11 +10258,6 @@ web-namespaces@^2.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - webpack-bundle-analyzer@^4.9.0: version "4.9.1" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz#d00bbf3f17500c10985084f22f1a2bf45cb2f09d" @@ -10494,14 +10396,6 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"