From a91137689566a3702683d2a543401c27bd09818f Mon Sep 17 00:00:00 2001 From: Yossi Saadi Date: Sun, 12 May 2024 19:21:10 +0300 Subject: [PATCH] feat: new design (#54) --- .gitignore | 3 +- README.md | 139 ++---- assets/img.png | Bin 13925 -> 29166 bytes package.json | 3 + src/components/Addons/Panel.tsx | 44 +- src/components/Addons/PanelTitle.tsx | 4 +- src/components/Editor/Editor.module.css | 10 + src/components/Editor/Editor.tsx | 6 +- src/components/Editor/EditorTab.module.css | 31 +- src/components/Editor/EditorTabs.module.css | 7 +- src/components/Editor/EditorTabs.tsx | 4 +- .../Editor/EditorToolbar.module.css | 16 +- src/components/Editor/EditorToolbar.tsx | 124 +++-- .../Editor/EditorToolbarButton.module.css | 13 + src/components/Editor/EditorToolbarButton.tsx | 12 +- .../__tests__/EditorToolbarButton.test.tsx | 21 +- src/consts/state-consts.ts | 1 - src/hooks/useEditorTheme.ts | 16 +- src/icons/Beaker.tsx | 20 + src/icons/Copy.tsx | 20 + src/icons/Edit.tsx | 20 + src/icons/Reset.tsx | 18 + src/icons/Share.tsx | 20 + src/icons/index.ts | 5 + src/types.ts | 1 - structure.mermaid | 63 +++ tsconfig.json | 1 + yarn.lock | 470 +++++++++++++++++- 28 files changed, 845 insertions(+), 247 deletions(-) create mode 100644 src/icons/Beaker.tsx create mode 100644 src/icons/Copy.tsx create mode 100644 src/icons/Edit.tsx create mode 100644 src/icons/Reset.tsx create mode 100644 src/icons/Share.tsx create mode 100644 src/icons/index.ts create mode 100644 structure.mermaid diff --git a/.gitignore b/.gitignore index 5cfda04..2d57dc3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,8 @@ dist/ +assets/icons node_modules/ storybook-static/ build-storybook.log .DS_Store .env -/.idea/ \ No newline at end of file +/.idea/ diff --git a/README.md b/README.md index 87ce7ca..271342b 100644 --- a/README.md +++ b/README.md @@ -1,42 +1,22 @@ -# Storybook Addon Playground +# Playground - Storybook Addon -![img.png](assets/img.png) - -## Develop locally - -Install dependencies and start - -```bash -yarn -yarn start -``` +This addon enhances your Storybook experience by allowing you to interactively play with your components. It's perfect for developers looking to experiment in real time, debug issues, or build complex compositions. -Or - -```bash -npm i -npm start -``` - -Go to [localhost:6006](http://localhost:6006) +![img.png](assets/img.png) -## How to add to your Storybook project +## Installation -### Install +To install the addon, run one of the following commands in your project directory: ```bash yarn add -D storybook-addon-playground -``` - -Or - -```bash +# or npm install -D storybook-addon-playground ``` -### Register addon +## Configuration -On your `.storybook/main.ts` file, add the following: +Add the addon to your Storybook configuration in `.storybook/main.js` or `.storybook/main.ts`: ```js const config = { @@ -47,16 +27,16 @@ const config = { }; ``` -### Addon Configuration +The addon configuration is done through Storybook's `preview` parameters. -The addon configuration is done through Storybook's `preview`. Few of the parameters are required for the addon to work properly: - -- `storyId`: **Required**. The story id that your playground has on Storybook. -- `components`: **Required**. An object with the components that should be rendered in the playground. The key is the component name and the value is the component itself. -- `autocompletions`: Optional. An array of autocompletions that should be used on the playground. Default is an empty array. We recommend on using `react-docgen` to generate a documentation output and run our util function on the output. You can use whatever tool you'd like as long as it matches the expected format in the addon. _Default is no autocompletions._ -- `editorTheme`: Optional. The theme that should be used on the playground. _Default is your Storybook theme._ -- `initialCode`: Optional. The initial code ("welcome") that should be rendered on the playground. _Default is empty editor._ -- `share`: Optional. A boolean that allow users to share the code. _Default is false._ +| Parameter | Required | Default | Description | +|------------------|----------|-----------------------------------|-----------------------------------------------------------------------------------------------------------------------| +| `storyId` | `true` | | The story id that your playground has on Storybook. | +| `components` | `true` | | An object with the components that should be rendered in the playground. The key is the component name and the value is the component itself. | +| `autocompletions`| `false` | `[]` | An array of autocompletions that should be used on the playground. Recommended to use `react-docgen` for generating documentation outputs. | +| `editorTheme` | `false` | Your Storybook theme | The theme that should be used on the playground. | +| `initialCode` | `false` | Empty editor | The initial code ("welcome") that should be rendered on the playground. | +| `share` | `false` | `false` | Whether to allow share capabilities. | On your `.storybook/preview.ts` file, you should add something similar to the following: @@ -79,9 +59,7 @@ const preview = { }; ``` -### Render a story including the playground in the sidebar - -Create a story with the following content: +Set up the playground environment in your Storybook stories: ```js import { withPlayground } from "storybook-addon-playground"; @@ -94,78 +72,41 @@ export default { export const Playground = {}; ``` -## Build +## Usage -### Vite +To use the Playground, navigate to the Storybook UI and select a story that has the playground decorator. In your addons panel, see an interactive code editor alongside your component, where you can modify the code and immediately see your changes reflected. -Vite is used to build the local Storybook for testing and dev purposes +## Contributing -### Rollup +Contributions are welcome! Feel free to open an issue or submit a pull request. -Rollup is used to build the addon for publishing +### Develop locally -```mermaid -graph TD; - subgraph ADDON - A{{Rollup}} - B[index.ts] - C[manager.ts] - - D[Panel addon] - E[Tool addon] - - F[withPlayground] - U[generateAutocompletions] - G[PlaygroundPreview] - H[react-live] - - I[Editor] - J[useCopyToClipboard] - K[usePlaygroundArgs] - Q[useInitialCode] - R[useBroadcastEditorChanges] - S[usePlaygroundState] - T[useEditorTheme] - L[useToolbarActions] - M[prettier] - N[react-codemirror] +Install dependencies and start - O[Toolbar icon] +```bash +yarn +yarn start +``` - P[Storybook Addon API] +Go to [localhost:6006](http://localhost:6006) - A -->|Entry| B - A -->|Entry| C +### Add new icons - B -->|Exports| F - B -->|Exports| U +Icons are generated using [svgr](https://react-svgr.com/docs/). - P --> D - P --> E +In order to add new icons to the addon, drop the icons somewhere in the repo and run the following command: - E -->|Renders| O +```bash +yarn build:icons path/to/your/icons +``` - C -->|Registers Addons| P +### Build - F -->|Renders in a story| G - G ======>|Using lib| H +#### Rollup - D -->|Calls| Q - D -->|Calls| R - R -->|Uses| S - D --->|Renders| I - I ====>|Using lib| N - I -->|Uses| L - I -->|Uses| K - I -->|Uses| T - I -->|Uses| J +Rollup is used to build the addon for publishing. - L ===>|Using lib| M - end +#### Vite - subgraph UI - X{{Vite}} - Z["Storybook UI (.storybook - Testing and Development)"] - X --> Z - end -``` +Vite serves the build to a local Storybook for testing and dev purposes. diff --git a/assets/img.png b/assets/img.png index 46ec1c4b63cb60b71d9e49c40b031983c823cd8c..8175db708d731212e4970c21100895c9b53678aa 100644 GIT binary patch literal 29166 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�Ne>TV=O{U1>IOx@rRBTFWPj;A_Rvk_ zUp@QGC|Z$uJ@0TZC2)Mk^s0>C0Dx)IC6C`gRV*+KdRyWCR8KHcG+ri~t}y+6yerT) zUM-$wU>Q8vpH6>pfwkK5GPurRkx}AmTr!D0+7AvzN9QNnYYAwD*#Td{!9>7}&Nvve zcX{#Vz+^4N{Ob>^?re2@h!vB~gsem98&lMYz+x&gSIGAw%9A4|i@vWJ=HVMiAy_jv z)k>y5_-d$nei8`rPzPWGo8(K*t5EMUREcs^ud@Cz>)>ndR#DKD#W>#TBaB2=<(Rqq za-XPj37)JgzwrV+|70ZUb?m(cG4))7z|Sefh)BY$CT51r#nWCll?W5ii!+j5Tld=p zV9mg{*ZQht)^ICZtp9}cZon{^J2;7SdL!wHV*Up_)%{7APic4rZ}^T3>E6ya$;ydK^3gJT(|h zAy;=cnYROBo907}UWSesVQXlFimCj0BHQTd{Wql1pk~7H*R$uwS>HW?ESA|`y8g7l zu(;fFQ7j^*Oi?Y(k_Dp$u63z$3~@Pzl+yu>o%DH5>#NZ_IY0)8XAIJQ5t56{hjDC< zS>$Vx`W#OwFi(O|n2cTGMi5rzG>)EFxw}FO-VYiz8BS`2cqgzK>n1^^QW@_u(wp27 z=~ii0W8}R+!Uo{Cl|tjb$N%BJU$fwJN6VJzxJE0z{GG;cXK($Aqc&umc0_uW?KbMl zS8q2{ot)DlD<543O%!roPxWM$jpFAi4EokuWe)qoso&%cm*V&VAV$H^{gt1xbn~_g zm460%#B;-+TYs(C)%ck!P;UgE*hPcX7MzuN5WJaKO)GN%*oS#f5Qet52ECn-WWEro z0ZqFPTfhG>p2yyd7%d%|M*1PYyHGV+8RLc6&lvXh>GxL~kjJh4ew^~^{GwC;K z&&+|{o5jZK$8H$UVKZU>ln0-$KJMLkZ;l%UUk>QwNRfsrvrv5!qo5`c1{Miw1>1Uq zKd^4Xg5FNeOlIxNQ)AOLUpIuf zI)K{amD3+$6GqvaX*K_XSn6;08b7i<>g+6~>yGFc0y}eB&JDx+VEQO~iNk zrOOhhE%gSGNd)qDzLmwhJcn4B#Bch|Flu@3;Xgm#jdCrs1L;lA-sbHlY>I6;N7`Lo z*iaxM?=(XRcJmC0a$$VZlY7+G1x`wm&B%u?B})SjsvoquMx|}zkea5SVh3=^U8Y?n z1G#{JYhN6#t$xyYs=#dx4vnS!D@G5LtBS(PGjt#VBD;P+iBxgZp6KEb-0`(nv#||$ ztb-$)XgVJEk|e0@pi>o3%GxOdaKG4qHkH+dHB<}CjluhHQ!K&K2jd%9Cp0$7*1^( zJl2lJzNh<3QX&ahFIB~>=tucDZ*6R359+m#?9D~)TTkotW$^pv>`bpNVw0mbIBf#_ z8%j(}*q&+9cy3k5Xcj=`H7_WsG1m+=zH4~eSTywYQ(tpZ5`QRFgvAY;q5tI}~mr}}^5axA`7?Um=IZnSDCrbm}^rB0XD%cSnC--@K zb<{hAQbN>h4F64oGNdA@R0BspQ_YG _sl8w7ZCqJwzDpPaGFRX6GJ+z<<<7xzu+ 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 OTMDwOGLRQ0@BRmDWpEq- diff --git a/package.json b/package.json index 187fcab..9bbad76 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "test:watch": "yarn test -- -w", "build": "rollup -c", "build:watch": "yarn build -- -w", + "build:icons": "yarn svgr --typescript --no-svgo --out-dir src/icons", "lint": "eslint . --max-warnings 0", "lint:fix": "yarn lint -- --fix", "storybook": "storybook dev -p 6006", @@ -56,6 +57,7 @@ "dependencies": { "@storybook/addon-links": "^7.6.4", "@uiw/codemirror-extensions-langs": "^4.21.21", + "@uiw/codemirror-theme-github": "^4.21.21", "@uiw/react-codemirror": "^4.21.21", "classnames": "^2.3.2", "lodash-es": "^4.17.21", @@ -74,6 +76,7 @@ "@storybook/react": "^7.6.4", "@storybook/react-vite": "^7.6.4", "@storybook/theming": "^7.6.4", + "@svgr/cli": "^8.1.0", "@testing-library/jest-dom": "^6.1.6", "@testing-library/react": "^14.1.2", "@types/lodash-es": "^4.17.12", diff --git a/src/components/Addons/Panel.tsx b/src/components/Addons/Panel.tsx index 8267b6d..c40ad8a 100644 --- a/src/components/Addons/Panel.tsx +++ b/src/components/Addons/Panel.tsx @@ -1,5 +1,5 @@ -import React, { Suspense, useCallback, useMemo, useRef } from "react"; -import { Editor, EditorTabs, EditorToolbar } from "../Editor"; +import React, { Suspense, useMemo, useRef } from "react"; +import { Editor, EditorToolbar } from "../Editor"; import { useInitialCode, useBroadcastEditorChanges, @@ -36,47 +36,21 @@ const Panel: React.FC = ({ active }) => { ADDON_ID_FOR_PARAMETERS, DEFAULT_ADDON_PARAMETERS ); - const [state, setState] = useAddonState( - PANEL_ID, - DEFAULT_ADDON_STATE - ); + const [state] = useAddonState(PANEL_ID, DEFAULT_ADDON_STATE); const extensions = useMemo>( () => ({ jsx: [ - langs.html(), - langs.javascript(), playgroundAutocompletion(autocompletions), keymap.of(playgroundKeymaps), + langs.javascript({ jsx: true, typescript: true }), ], css: [langs.css()], }), [autocompletions] ); - const { code, selectedTab, fontSize, hasInitialCodeLoaded, editorState } = - state; - - const onTabChange = useCallback( - (newTab: Tab) => { - setState((prev) => { - const updates = { - ...prev, - selectedTab: newTab, - }; - const editorStateJson = - editorRef.current?.view?.state?.toJSON?.(EDITOR_STATE_FIELDS); - if (editorStateJson) { - updates.editorState = { - ...prev.editorState, - [prev.selectedTab]: editorStateJson, - }; - } - return updates; - }); - }, - [setState] - ); + const { code, selectedTab, hasInitialCodeLoaded, editorState } = state; const editorInitialState = useMemo( () => ({ @@ -89,9 +63,8 @@ const Panel: React.FC = ({ active }) => { return (

- +
-
= ({ active }) => { code={code[selectedTab]} theme={theme} extensions={extensions[selectedTab]} - style={{ fontSize }} + style={{ fontSize: 13 }} onChange={updateCode} initialState={editorInitialState} + setup={{ + foldGutter: false, + }} />
diff --git a/src/components/Addons/PanelTitle.tsx b/src/components/Addons/PanelTitle.tsx index 3e06715..e5ebc10 100644 --- a/src/components/Addons/PanelTitle.tsx +++ b/src/components/Addons/PanelTitle.tsx @@ -1,11 +1,11 @@ import React from "react"; -import { Icons } from "@storybook/components"; import styles from "./PanelTitle.module.css"; +import { Beaker } from "@/icons"; const PanelTitle: React.FC = () => ( + Playground - ); export default PanelTitle; diff --git a/src/components/Editor/Editor.module.css b/src/components/Editor/Editor.module.css index b5054a5..16f47a6 100644 --- a/src/components/Editor/Editor.module.css +++ b/src/components/Editor/Editor.module.css @@ -87,3 +87,13 @@ ) { margin-right: 8px; } + +:global(.cm-theme), +:global(.cm-editor) { + height: 100%; +} + +:global(.cm-gutter.cm-lineNumbers .cm-gutterElement) { + min-width: 35px; + padding-inline: 8px; +} diff --git a/src/components/Editor/Editor.tsx b/src/components/Editor/Editor.tsx index 2fbf219..de073fc 100644 --- a/src/components/Editor/Editor.tsx +++ b/src/components/Editor/Editor.tsx @@ -7,14 +7,14 @@ import { import { Loader } from "@storybook/components"; const CodeMirror = lazy(() => import("@uiw/react-codemirror")); import "./Editor.module.css"; -import { EditorInitialState } from "@/types"; +import { EditorInitialState, EditorTheme } from "@/types"; interface EditorProps { code: string; onChange: (newVal: string) => void; placeholder?: string; loading?: boolean; - theme?: "light" | "dark" | Extension; + theme: EditorTheme; style?: React.CSSProperties; extensions?: Extension[]; setup?: BasicSetupOptions; @@ -32,7 +32,7 @@ const Editor: EditorComponent = forwardRef( onChange, placeholder, loading, - theme = "light", + theme, style, extensions, setup, diff --git a/src/components/Editor/EditorTab.module.css b/src/components/Editor/EditorTab.module.css index 62402b7..67a0623 100644 --- a/src/components/Editor/EditorTab.module.css +++ b/src/components/Editor/EditorTab.module.css @@ -1,24 +1,39 @@ .tab { position: relative; - width: 100%; - height: 50px; + height: 100%; cursor: default; margin: 0; - padding: 0; + padding: 4px 16px; border-radius: unset; font-weight: normal; } -.tab.selected::after { +.tab::after { content: ""; position: absolute; - top: 0; - right: 0; - height: 100%; - width: 3px; + bottom: -4px; + left: 0; + width: 100%; +} + +.tab:not(.selected)::after { + height: 1px; + background: #c3c6d4; +} + +.tab.selected::after { + height: 2px; background: #029cfd; } +.tab:hover { + background: transparent; +} + +.tab:hover.selected { + color: inherit; +} + .tab:hover:not(.selected) { cursor: pointer; } diff --git a/src/components/Editor/EditorTabs.module.css b/src/components/Editor/EditorTabs.module.css index 90b6ef0..16e5481 100644 --- a/src/components/Editor/EditorTabs.module.css +++ b/src/components/Editor/EditorTabs.module.css @@ -1,4 +1,7 @@ .tabs { - border-inline-end: 1px solid rgba(0, 0, 0, 0.1); - min-width: 50px; + display: flex; + position: relative; + left: -8px; + flex: 1; + height: 100%; } diff --git a/src/components/Editor/EditorTabs.tsx b/src/components/Editor/EditorTabs.tsx index c0252aa..4a3f2bd 100644 --- a/src/components/Editor/EditorTabs.tsx +++ b/src/components/Editor/EditorTabs.tsx @@ -12,7 +12,7 @@ const EditorTabs: React.FC = ({ selectedTab, onTabChange, }) => ( -
+
= ({ selected={selectedTab === "css"} onClick={() => onTabChange("css")} /> -
+ ); export default EditorTabs; diff --git a/src/components/Editor/EditorToolbar.module.css b/src/components/Editor/EditorToolbar.module.css index 04920dc..c0b52d5 100644 --- a/src/components/Editor/EditorToolbar.module.css +++ b/src/components/Editor/EditorToolbar.module.css @@ -1,8 +1,10 @@ .toolbar { - position: relative; - display: flex; - align-items: center; - gap: 4px; - padding: 4px; - border-block-end: 1px solid rgba(0, 0, 0, 0.1); -} \ No newline at end of file + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + gap: 4px; + padding: 4px 8px; + border-block-end: 1px solid rgba(0, 0, 0, 0.1); + background-color: #f6f7fb; +} diff --git a/src/components/Editor/EditorToolbar.tsx b/src/components/Editor/EditorToolbar.tsx index f1f3819..2812b9b 100644 --- a/src/components/Editor/EditorToolbar.tsx +++ b/src/components/Editor/EditorToolbar.tsx @@ -4,28 +4,27 @@ import { useShare, useToolbarActions, usePlaygroundArgs, - usePlaygroundState, } from "@/hooks"; import EditorToolbarButton from "./EditorToolbarButton"; -import EditorToolbarDivider from "./EditorToolbarDivider"; -import { - useAddonState, - useParameter, - useStorybookApi, -} from "@storybook/manager-api"; +import { useAddonState, useParameter } from "@storybook/manager-api"; import { ADDON_ID_FOR_PARAMETERS, DEFAULT_ADDON_PARAMETERS, DEFAULT_ADDON_STATE, + EDITOR_STATE_FIELDS, PANEL_ID, } from "@/consts"; -import { PlaygroundParameters, PlaygroundState } from "@/types"; +import { PlaygroundParameters, PlaygroundState, Tab } from "@/types"; import styles from "./EditorToolbar.module.css"; +import EditorTabs from "@/components/Editor/EditorTabs"; +import { ReactCodeMirrorRef } from "@uiw/react-codemirror"; +import { Copy, Edit, Reset, Share } from "@/icons"; -const EditorToolbar: React.FC = () => { - const { selectStory } = useStorybookApi(); - const { playgroundStoryId } = usePlaygroundState(); +interface EditorToolbarProps { + editorRef: React.RefObject; +} +const EditorToolbar: React.FC = ({ editorRef }) => { const { updateCode, resetCode } = usePlaygroundArgs(); const [state, setState] = useAddonState( PANEL_ID, @@ -35,21 +34,7 @@ const EditorToolbar: React.FC = () => { ADDON_ID_FOR_PARAMETERS, DEFAULT_ADDON_PARAMETERS ); - const { code, selectedTab, fontSize } = state; - - const selectPlaygroundStory = useCallback(() => { - selectStory(playgroundStoryId); - }, [selectStory, playgroundStoryId]); - - const onFontSizeChange = useCallback( - (amount: number) => { - setState((state) => ({ - ...state, - fontSize: Math.max(12, Math.min(18, fontSize + amount)), - })); - }, - [fontSize, setState] - ); + const { code, selectedTab } = state; const { onCopy, isCopied, shouldAllowCopy } = useCopyToClipboard(code); const { onShare, isShareCopied, shouldAllowShare } = useShare(code); @@ -61,49 +46,58 @@ const EditorToolbar: React.FC = () => { selectedTab ); + const onTabChange = useCallback( + (newTab: Tab) => { + setState((prev) => { + const updates = { + ...prev, + selectedTab: newTab, + }; + const editorStateJson = + editorRef.current?.view?.state?.toJSON?.(EDITOR_STATE_FIELDS); + if (editorStateJson) { + updates.editorState = { + ...prev.editorState, + [prev.selectedTab]: editorStateJson, + }; + } + return updates; + }); + }, + [editorRef, setState] + ); + return (
- - - {enableShare && ( + +
+ } + disabled={isCopied || !shouldAllowCopy} + onClick={onCopy} + /> + {enableShare && ( + } + disabled={isShareCopied || !shouldAllowShare} + onClick={onShare} + /> + )} + } + onClick={onFormatCode} + /> } + onClick={onReset} /> - )} - - - - onFontSizeChange(1)} - /> - Font - onFontSizeChange(-1)} - /> +
); }; diff --git a/src/components/Editor/EditorToolbarButton.module.css b/src/components/Editor/EditorToolbarButton.module.css index f299ccd..a96852c 100644 --- a/src/components/Editor/EditorToolbarButton.module.css +++ b/src/components/Editor/EditorToolbarButton.module.css @@ -7,3 +7,16 @@ .toolbarButton.smallPadding { padding-inline: 8px; } + +.toolbarButton, +.toolbarButton:hover { + color: #4a4a4a; +} + +.toolbarButton:hover { + background-color: #6768791a; +} + +.toolbarButton > svg { + width: auto; +} diff --git a/src/components/Editor/EditorToolbarButton.tsx b/src/components/Editor/EditorToolbarButton.tsx index bfda74c..b6116ac 100644 --- a/src/components/Editor/EditorToolbarButton.tsx +++ b/src/components/Editor/EditorToolbarButton.tsx @@ -1,13 +1,12 @@ -import React, { SVGAttributes, memo } from "react"; -import { IconButton, Icons, IconsProps } from "@storybook/components"; +import React, { memo } from "react"; +import { IconButton } from "@storybook/components"; import cx from "classnames"; import styles from "./EditorToolbarButton.module.css"; interface EditorToolbarButtonProps { tooltip?: string; text?: string; - icon: IconsProps["icon"]; - color?: SVGAttributes["color"]; + renderIcon: React.ReactElement; disabled?: boolean; smallPadding?: boolean; onClick?: () => void; @@ -16,8 +15,7 @@ interface EditorToolbarButtonProps { const EditorToolbarButton: React.FC = ({ tooltip, text, - icon, - color, + renderIcon, disabled, smallPadding, onClick, @@ -31,7 +29,7 @@ const EditorToolbarButton: React.FC = ({ [styles.smallPadding]: smallPadding, })} > - + {renderIcon} {text && {text}} ); diff --git a/src/components/Editor/__tests__/EditorToolbarButton.test.tsx b/src/components/Editor/__tests__/EditorToolbarButton.test.tsx index cdf0fbb..9131e84 100644 --- a/src/components/Editor/__tests__/EditorToolbarButton.test.tsx +++ b/src/components/Editor/__tests__/EditorToolbarButton.test.tsx @@ -4,7 +4,9 @@ import EditorToolbarButton from "../EditorToolbarButton"; describe("EditorToolbarButton", () => { it("should render button correctly", () => { - const { getByRole } = render(); + const { getByRole } = render( + Icon} /> + ); const button = getByRole("button"); expect(button).toBeInTheDocument(); }); @@ -12,7 +14,7 @@ describe("EditorToolbarButton", () => { it("should render text within the button", () => { const text = "Button text"; const { getByRole } = render( - + Icon} /> ); const button = getByRole("button"); const textElement = within(button).getByText(text); @@ -20,7 +22,9 @@ describe("EditorToolbarButton", () => { }); it("should render button as disabled", () => { - const { getByRole } = render(); + const { getByRole } = render( + Icon} disabled /> + ); const button = getByRole("button"); expect(button).toBeDisabled(); }); @@ -28,7 +32,10 @@ describe("EditorToolbarButton", () => { it('should call the "onClick" function when a button is clicked', () => { const onClickMock = vi.fn(); const { getByRole } = render( - + Icon} + onClick={onClickMock} + /> ); const button = getByRole("button"); fireEvent.click(button); @@ -38,7 +45,11 @@ describe("EditorToolbarButton", () => { it('should not call the "onClick" function when a button is disabled and clicked', () => { const onClickMock = vi.fn(); const { getByRole } = render( - + Icon} + disabled + onClick={onClickMock} + /> ); const button = getByRole("button"); fireEvent.click(button); diff --git a/src/consts/state-consts.ts b/src/consts/state-consts.ts index 2b77187..2a3522a 100644 --- a/src/consts/state-consts.ts +++ b/src/consts/state-consts.ts @@ -3,7 +3,6 @@ import { PlaygroundState } from "@/types"; export const DEFAULT_ADDON_STATE: PlaygroundState = { hasInitialCodeLoaded: false, code: { jsx: "", css: "" }, - fontSize: 13, selectedTab: "jsx", editorState: { jsx: null, diff --git a/src/hooks/useEditorTheme.ts b/src/hooks/useEditorTheme.ts index fd2ea71..6910312 100644 --- a/src/hooks/useEditorTheme.ts +++ b/src/hooks/useEditorTheme.ts @@ -1,6 +1,17 @@ import { useParameter, useStorybookState } from "@storybook/manager-api"; import { EditorTheme, PlaygroundParameters } from "@/types"; import { ADDON_ID_FOR_PARAMETERS, DEFAULT_ADDON_PARAMETERS } from "@/consts"; +import { githubDark, githubLight } from "@uiw/codemirror-theme-github"; + +type DefaultThemes = typeof githubDark | typeof githubDark; + +function isBasicTheme(theme: EditorTheme): theme is "light" | "dark" { + return typeof theme === "string" && ["light", "dark"].includes(theme); +} + +function getTheme(basicThemeName: string): DefaultThemes { + return basicThemeName === "dark" ? githubDark : githubLight; +} const useEditorTheme = (): EditorTheme => { const { theme: storybookTheme } = useStorybookState(); @@ -8,7 +19,10 @@ const useEditorTheme = (): EditorTheme => { ADDON_ID_FOR_PARAMETERS, DEFAULT_ADDON_PARAMETERS ); - return addonTheme || (storybookTheme.base === "dark" ? "dark" : "light"); + if (isBasicTheme(addonTheme)) { + return getTheme(addonTheme); + } + return addonTheme || getTheme(storybookTheme.base); }; export default useEditorTheme; diff --git a/src/icons/Beaker.tsx b/src/icons/Beaker.tsx new file mode 100644 index 0000000..528de92 --- /dev/null +++ b/src/icons/Beaker.tsx @@ -0,0 +1,20 @@ +import * as React from "react"; +import type { SVGProps } from "react"; +const SvgBeaker = (props: SVGProps) => ( + + + +); +export default SvgBeaker; diff --git a/src/icons/Copy.tsx b/src/icons/Copy.tsx new file mode 100644 index 0000000..a8a0876 --- /dev/null +++ b/src/icons/Copy.tsx @@ -0,0 +1,20 @@ +import * as React from "react"; +import type { SVGProps } from "react"; +const SvgCopy = (props: SVGProps) => ( + + + +); +export default SvgCopy; diff --git a/src/icons/Edit.tsx b/src/icons/Edit.tsx new file mode 100644 index 0000000..70d5941 --- /dev/null +++ b/src/icons/Edit.tsx @@ -0,0 +1,20 @@ +import * as React from "react"; +import type { SVGProps } from "react"; +const SvgEdit = (props: SVGProps) => ( + + + +); +export default SvgEdit; diff --git a/src/icons/Reset.tsx b/src/icons/Reset.tsx new file mode 100644 index 0000000..f350daa --- /dev/null +++ b/src/icons/Reset.tsx @@ -0,0 +1,18 @@ +import * as React from "react"; +import type { SVGProps } from "react"; +const SvgReset = (props: SVGProps) => ( + + + +); +export default SvgReset; diff --git a/src/icons/Share.tsx b/src/icons/Share.tsx new file mode 100644 index 0000000..c860564 --- /dev/null +++ b/src/icons/Share.tsx @@ -0,0 +1,20 @@ +import * as React from "react"; +import type { SVGProps } from "react"; +const SvgShare = (props: SVGProps) => ( + + + +); +export default SvgShare; diff --git a/src/icons/index.ts b/src/icons/index.ts new file mode 100644 index 0000000..e2a9aea --- /dev/null +++ b/src/icons/index.ts @@ -0,0 +1,5 @@ +export { default as Beaker } from "./Beaker"; +export { default as Copy } from "./Copy"; +export { default as Edit } from "./Edit"; +export { default as Reset } from "./Reset"; +export { default as Share } from "./Share"; diff --git a/src/types.ts b/src/types.ts index b26d62e..bea2a78 100644 --- a/src/types.ts +++ b/src/types.ts @@ -33,7 +33,6 @@ export interface PlaygroundArgs { export interface PlaygroundState { hasInitialCodeLoaded?: boolean; - fontSize?: number; code?: Code; selectedTab?: Tab; editorState?: Record; diff --git a/structure.mermaid b/structure.mermaid new file mode 100644 index 0000000..38402b5 --- /dev/null +++ b/structure.mermaid @@ -0,0 +1,63 @@ +graph TD; +subgraph ADDON +A{{Rollup}} +B[index.ts] +C[manager.ts] + +D[Panel addon] +E[Tool addon] + +F[withPlayground] +U[generateAutocompletions] +G[PlaygroundPreview] +H[react-live] + +I[Editor] +J[useCopyToClipboard] +K[usePlaygroundArgs] +Q[useInitialCode] +R[useBroadcastEditorChanges] +S[usePlaygroundState] +T[useEditorTheme] +L[useToolbarActions] +M[prettier] +N[react-codemirror] + +O[Toolbar icon] + +P[Storybook Addon API] + +A -->|Entry| B +A -->|Entry| C + +B -->|Exports| F +B -->|Exports| U + +P --> D +P --> E + +E -->|Renders| O + +C -->|Registers Addons| P + +F -->|Renders in a story| G +G ======>|Using lib| H + +D -->|Calls| Q +D -->|Calls| R +R -->|Uses| S +D --->|Renders| I +I ====>|Using lib| N +I -->|Uses| L +I -->|Uses| K +I -->|Uses| T +I -->|Uses| J + +L ===>|Using lib| M +end + +subgraph UI +X{{Vite}} +Z["Storybook UI (.storybook - Testing and Development)"] +X --> Z +end diff --git a/tsconfig.json b/tsconfig.json index 1fe36d9..3baa222 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "baseUrl": ".", "paths": { "@/components/*": ["src/components/*"], + "@/icons": ["src/icons"], "@/codemirror/extensions": ["src/codemirror/extensions"], "@/codemirror/keymaps": ["src/codemirror/keymaps"], "@/consts": ["src/consts"], diff --git a/yarn.lock b/yarn.lock index 4625387..e60bb1a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -35,6 +35,14 @@ "@babel/highlight" "^7.23.4" chalk "^2.4.2" +"@babel/code-frame@^7.24.2": + version "7.24.2" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== + dependencies: + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" + "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5": version "7.23.5" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" @@ -61,6 +69,27 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@^7.21.3": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" + integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-module-transforms" "^7.24.5" + "@babel/helpers" "^7.24.5" + "@babel/parser" "^7.24.5" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.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.23.0", "@babel/generator@^7.23.5": version "7.23.5" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz#17d0a1ea6b62f351d281350a5f80b87a810c4755" @@ -71,6 +100,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" + integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== + dependencies: + "@babel/types" "^7.24.5" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^2.5.1" + "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" @@ -96,6 +135,17 @@ lru-cache "^5.1.1" semver "^6.3.1" +"@babel/helper-compilation-targets@^7.23.6": + version "7.23.6" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" + integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== + dependencies: + "@babel/compat-data" "^7.23.5" + "@babel/helper-validator-option" "^7.23.5" + browserslist "^4.22.2" + lru-cache "^5.1.1" + semver "^6.3.1" + "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.5": version "7.23.5" resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.5.tgz#2a8792357008ae9ce8c0f2b78b9f646ac96b314b" @@ -165,6 +215,13 @@ dependencies: "@babel/types" "^7.22.15" +"@babel/helper-module-imports@^7.24.3": + version "7.24.3" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" + integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== + dependencies: + "@babel/types" "^7.24.0" + "@babel/helper-module-transforms@^7.23.3": version "7.23.3" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" @@ -176,6 +233,17 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" +"@babel/helper-module-transforms@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" + integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.24.3" + "@babel/helper-simple-access" "^7.24.5" + "@babel/helper-split-export-declaration" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.5" + "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" @@ -213,6 +281,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-simple-access@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" + integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== + dependencies: + "@babel/types" "^7.24.5" + "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" @@ -227,16 +302,33 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-split-export-declaration@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" + integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== + dependencies: + "@babel/types" "^7.24.5" + "@babel/helper-string-parser@^7.23.4": version "7.23.4" resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== +"@babel/helper-string-parser@^7.24.1": + version "7.24.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== + "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== +"@babel/helper-validator-identifier@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" + integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== + "@babel/helper-validator-option@^7.22.15", "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" @@ -260,6 +352,15 @@ "@babel/traverse" "^7.23.5" "@babel/types" "^7.23.5" +"@babel/helpers@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" + integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== + dependencies: + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.5" + "@babel/types" "^7.24.5" + "@babel/highlight@^7.23.4": version "7.23.4" resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" @@ -269,11 +370,26 @@ chalk "^2.4.2" js-tokens "^4.0.0" +"@babel/highlight@^7.24.2": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" + integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + picocolors "^1.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.23.5": version "7.23.5" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563" integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ== +"@babel/parser@^7.24.0", "@babel/parser@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" + integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": version "7.23.3" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" @@ -1018,6 +1134,15 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" +"@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" + "@babel/traverse@^7.18.9", "@babel/traverse@^7.23.2", "@babel/traverse@^7.23.5": version "7.23.5" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec" @@ -1034,6 +1159,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" + integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== + dependencies: + "@babel/code-frame" "^7.24.2" + "@babel/generator" "^7.24.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.24.5" + "@babel/parser" "^7.24.5" + "@babel/types" "^7.24.5" + debug "^4.3.1" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@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.4.4": version "7.23.5" resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602" @@ -1043,6 +1184,15 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.21.3", "@babel/types@^7.24.0", "@babel/types@^7.24.5": + version "7.24.5" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" + integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== + dependencies: + "@babel/helper-string-parser" "^7.24.1" + "@babel/helper-validator-identifier" "^7.24.5" + to-fast-properties "^2.0.0" + "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" @@ -1849,6 +1999,15 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" @@ -1859,6 +2018,11 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" @@ -1872,6 +2036,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@juggle/resize-observer@^3.3.1": version "3.4.0" resolved "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" @@ -3166,6 +3338,122 @@ "@types/express" "^4.7.0" file-system-cache "2.3.0" +"@svgr/babel-plugin-add-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz#4001f5d5dd87fa13303e36ee106e3ff3a7eb8b22" + integrity sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g== + +"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" + integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== + +"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" + integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz#8fbb6b2e91fa26ac5d4aa25c6b6e4f20f9c0ae27" + integrity sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ== + +"@svgr/babel-plugin-svg-dynamic-title@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz#1d5ba1d281363fc0f2f29a60d6d936f9bbc657b0" + integrity sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og== + +"@svgr/babel-plugin-svg-em-dimensions@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz#35e08df300ea8b1d41cb8f62309c241b0369e501" + integrity sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g== + +"@svgr/babel-plugin-transform-react-native-svg@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz#90a8b63998b688b284f255c6a5248abd5b28d754" + integrity sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q== + +"@svgr/babel-plugin-transform-svg-component@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz#013b4bfca88779711f0ed2739f3f7efcefcf4f7e" + integrity sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw== + +"@svgr/babel-preset@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz#0e87119aecdf1c424840b9d4565b7137cabf9ece" + integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-attribute" "8.0.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "8.0.0" + "@svgr/babel-plugin-replace-jsx-attribute-value" "8.0.0" + "@svgr/babel-plugin-svg-dynamic-title" "8.0.0" + "@svgr/babel-plugin-svg-em-dimensions" "8.0.0" + "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" + "@svgr/babel-plugin-transform-svg-component" "8.0.0" + +"@svgr/cli@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/cli/-/cli-8.1.0.tgz#dd7fcf42a144eb681bb9923c5d806bf6cafd7512" + integrity sha512-SnlaLspB610XFXvs3PmhzViHErsXp0yIy4ERyZlHDlO1ro2iYtHMWYk2mztdLD/lBjiA4ZXe4RePON3qU/Tc4A== + dependencies: + "@svgr/core" "8.1.0" + "@svgr/plugin-jsx" "8.1.0" + "@svgr/plugin-prettier" "8.1.0" + "@svgr/plugin-svgo" "8.1.0" + camelcase "^6.2.0" + chalk "^4.1.2" + commander "^9.4.1" + dashify "^2.0.0" + glob "^8.0.3" + snake-case "^3.0.4" + +"@svgr/core@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz#41146f9b40b1a10beaf5cc4f361a16a3c1885e88" + integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + camelcase "^6.2.0" + cosmiconfig "^8.1.3" + snake-case "^3.0.4" + +"@svgr/hast-util-to-babel-ast@8.0.0": + version "8.0.0" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz#6952fd9ce0f470e1aded293b792a2705faf4ffd4" + integrity sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q== + dependencies: + "@babel/types" "^7.21.3" + entities "^4.4.0" + +"@svgr/plugin-jsx@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz#96969f04a24b58b174ee4cd974c60475acbd6928" + integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== + dependencies: + "@babel/core" "^7.21.3" + "@svgr/babel-preset" "8.1.0" + "@svgr/hast-util-to-babel-ast" "8.0.0" + svg-parser "^2.0.4" + +"@svgr/plugin-prettier@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/plugin-prettier/-/plugin-prettier-8.1.0.tgz#71bf0d0b0ae4c2234a2deb0e5bad21c2cfe31364" + integrity sha512-o4/uFI8G64tAjBZ4E7gJfH+VP7Qi3T0+M4WnIsP91iFnGPqs5WvPDkpZALXPiyWEtzfYs1Rmwy1Zdfu8qoZuKw== + dependencies: + deepmerge "^4.3.1" + prettier "^2.8.7" + +"@svgr/plugin-svgo@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz#b115b7b967b564f89ac58feae89b88c3decd0f00" + integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== + dependencies: + cosmiconfig "^8.1.3" + deepmerge "^4.3.1" + svgo "^3.0.2" + "@testing-library/dom@^9.0.0": version "9.3.3" resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz#108c23a5b0ef51121c26ae92eb3179416b0434f5" @@ -3684,6 +3972,22 @@ "@replit/codemirror-lang-svelte" "^6.0.0" codemirror-lang-mermaid "^0.5.0" +"@uiw/codemirror-theme-github@^4.21.21": + version "4.22.0" + resolved "https://registry.npmjs.org/@uiw/codemirror-theme-github/-/codemirror-theme-github-4.22.0.tgz#a415f0348c212dd7364506ef7032ecb21375525e" + integrity sha512-toRG+V8xCKVvqZnyEHgR9posQ8fA28U0m8ALqn0fWTRRFuGPvYCSSX+i2mpA3HF06Sv7GWCzgHe8ioyYbrN2Lg== + dependencies: + "@uiw/codemirror-themes" "4.22.0" + +"@uiw/codemirror-themes@4.22.0": + version "4.22.0" + resolved "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.22.0.tgz#79b0d1775c007b8507b7207be9a1851040dc9c48" + integrity sha512-nn7K+lkfdLOSQN6NZx651ae24L5L2RiCuNOxIeP3/CcGm9tnic8i+9pq42IXZe+hEoxX64yUTZisoB5qtocvrQ== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@uiw/react-codemirror@^4.21.21": version "4.21.21" resolved "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.21.21.tgz#986b18dbd6dc69aa470fc3d4e47b89b504af6778" @@ -4405,6 +4709,11 @@ camelcase@^5.3.1: resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caniuse-api@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" @@ -4623,6 +4932,11 @@ commander@^7.2.0: resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^9.4.1: + version "9.5.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -4748,6 +5062,16 @@ cosmiconfig@^7.1.0: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^8.1.3: + version "8.3.6" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + crelt@^1.0.5: version "1.0.6" resolved "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz#7cc898ea74e190fb6ef9dae57f8f81cf7302df72" @@ -4788,6 +5112,17 @@ css-select@^4.1.3: domutils "^2.8.0" nth-check "^2.0.1" +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + css-tree@^1.1.2, css-tree@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" @@ -4796,7 +5131,23 @@ css-tree@^1.1.2, css-tree@^1.1.3: mdn-data "2.0.14" source-map "^0.6.1" -css-what@^6.0.1: +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + +css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== @@ -4867,6 +5218,13 @@ csso@^4.2.0: dependencies: css-tree "^1.1.2" +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== + dependencies: + css-tree "~2.2.0" + cssstyle@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" @@ -4884,6 +5242,11 @@ csstype@^3.0.2: resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +dashify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dashify/-/dashify-2.0.0.tgz#fff270ca2868ca427fee571de35691d6e437a648" + integrity sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A== + data-urls@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde" @@ -4899,7 +5262,7 @@ debug@2.6.9, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -4965,7 +5328,7 @@ deepmerge@^1.5.2: resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== -deepmerge@^4.2.2: +deepmerge@^4.2.2, deepmerge@^4.3.1: version "4.3.1" resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== @@ -5132,7 +5495,16 @@ dom-serializer@^1.0.1: domhandler "^4.2.0" entities "^2.0.0" -domelementtype@^2.0.1, domelementtype@^2.2.0: +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== @@ -5144,6 +5516,13 @@ domhandler@^4.2.0, domhandler@^4.3.1: dependencies: domelementtype "^2.2.0" +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + domutils@^2.8.0: version "2.8.0" resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -5153,6 +5532,23 @@ domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + dotenv-expand@^10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" @@ -5222,7 +5618,7 @@ entities@^2.0.0: resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== -entities@^4.4.0: +entities@^4.2.0, entities@^4.4.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== @@ -6449,7 +6845,7 @@ import-cwd@^3.0.0: dependencies: import-from "^3.0.0" -import-fresh@^3.1.0, import-fresh@^3.2.1: +import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -7240,6 +7636,13 @@ loupe@^2.3.6, loupe@^2.3.7: dependencies: get-func-name "^2.0.1" +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -7342,6 +7745,16 @@ mdn-data@2.0.14: resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + media-typer@0.3.0: version "0.3.0" resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -7623,6 +8036,14 @@ neo-async@^2.5.0, neo-async@^2.6.2: resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + node-dir@^0.1.17: version "0.1.17" resolved "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" @@ -7936,7 +8357,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -8422,7 +8843,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.3.2, prettier@^2.8.0: +prettier@^2.3.2, prettier@^2.8.0, prettier@^2.8.7: version "2.8.8" resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== @@ -9447,11 +9868,24 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +source-map-js@^1.0.1: + version "1.2.0" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== + source-map-support@^0.5.16: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -9838,6 +10272,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + svg-tags@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" @@ -9856,6 +10295,19 @@ svgo@^2.7.0: picocolors "^1.0.0" stable "^0.1.8" +svgo@^3.0.2: + version "3.3.0" + resolved "https://registry.npmjs.org/svgo/-/svgo-3.3.0.tgz#26d0b220f44ae96819ed6d040573334366fffa9b" + integrity sha512-y350OL6eAmhDbWcASdukXoG0MbpdfJQPHwEUAaTW1HBNSO2VErJ35fs7uNLSWjzFDhfua517RcouBzjZoO1JFg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^5.1.0" + css-tree "^2.3.1" + css-what "^6.1.0" + csso "^5.0.5" + picocolors "^1.0.0" + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -10084,7 +10536,7 @@ tslib@^1.13.0: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==