diff options
author | 2021-06-19 20:42:41 +0300 | |
---|---|---|
committer | 2021-06-19 20:42:41 +0300 | |
commit | a764beda06a2001d35f0a0f91eec615eb92e322f (patch) | |
tree | 9aaf0670bef90be84b961c70ddad518fdea78b95 | |
parent | Adds Support For Linebreaks In Content (diff) | |
parent | Update HTML Element handler comment (diff) |
Merge pull request #224 from python-discord/codemirror
Implement code field using CodeMirror 6 beta
-rw-r--r-- | package.json | 5 | ||||
-rw-r--r-- | src/components/InputTypes/Code.tsx | 40 | ||||
-rw-r--r-- | src/components/InputTypes/index.tsx | 8 | ||||
-rw-r--r-- | src/components/Question.tsx | 22 | ||||
-rw-r--r-- | yarn.lock | 256 |
5 files changed, 323 insertions, 8 deletions
diff --git a/package.json b/package.json index 5fee15b..ff5e786 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,11 @@ "private": false, "license": "MIT", "dependencies": { + "@codemirror/basic-setup": "^0.18.2", + "@codemirror/lang-python": "^0.18.0", + "@codemirror/state": "^0.18.7", + "@codemirror/theme-one-dark": "^0.18.1", + "@codemirror/view": "^0.18.14", "@emotion/react": "11.4.0", "@fortawesome/fontawesome-svg-core": "1.2.35", "@fortawesome/free-brands-svg-icons": "5.15.3", diff --git a/src/components/InputTypes/Code.tsx b/src/components/InputTypes/Code.tsx index 51ca98d..506e181 100644 --- a/src/components/InputTypes/Code.tsx +++ b/src/components/InputTypes/Code.tsx @@ -1,11 +1,43 @@ /** @jsx jsx */ -import { jsx } from "@emotion/react"; -import React, { ChangeEvent } from "react"; +import { jsx, css } from "@emotion/react"; +import React, { useEffect } from "react"; + +import { basicSetup } from "@codemirror/basic-setup"; +import { python } from "@codemirror/lang-python"; +import { EditorState } from "@codemirror/state"; +import { oneDark } from "@codemirror/theme-one-dark"; +import { EditorView, ViewUpdate } from "@codemirror/view"; interface CodeProps { - handler: (event: ChangeEvent<HTMLInputElement>) => void + handler: (newContent: string) => void, + questionId: string, } +const styles = css` + border: 3px solid lightgray; + border-radius: 5px; + overflow:auto; + height: 20rem; +`; + export default function Code(props: CodeProps): JSX.Element { - return <input type="text" className="text" onChange={props.handler}/>; + const onUpdate = () => EditorView.updateListener.of((v: ViewUpdate) => { + props.handler(v.state.doc.toString()); + + }); + + useEffect(() => { + const el = document.getElementById(`${props.questionId}-code`); + const state = EditorState.create({ + extensions: [basicSetup, python(), onUpdate(), oneDark], + }); + const view = new EditorView({ + state, + parent: el as Element + }); + + return () => view.destroy(); + }, []); + + return <div id={`${props.questionId}-code`} css={styles} />; } diff --git a/src/components/InputTypes/index.tsx b/src/components/InputTypes/index.tsx index c6a83f1..3e13652 100644 --- a/src/components/InputTypes/index.tsx +++ b/src/components/InputTypes/index.tsx @@ -9,6 +9,7 @@ import React, { ChangeEvent } from "react"; import { QuestionType } from "../../api/question"; import { QuestionProp } from "../Question"; +import Code from "./Code"; const require_options: Array<QuestionType> = [ QuestionType.Radio, @@ -18,7 +19,7 @@ const require_options: Array<QuestionType> = [ ]; // eslint-disable-next-line @typescript-eslint/no-explicit-any -export default function create_input({ question, public_state }: QuestionProp, handler: (event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void, onBlurHandler: () => void, focus_ref: React.RefObject<any>): JSX.Element | JSX.Element[] { +export default function create_input({ question, public_state }: QuestionProp, handler: (event: ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | string) => void, onBlurHandler: () => void, focus_ref: React.RefObject<any>): JSX.Element | JSX.Element[] { let result: JSX.Element | JSX.Element[]; // eslint-disable-next-line @@ -37,7 +38,10 @@ export default function create_input({ question, public_state }: QuestionProp, h /* eslint-disable react/react-in-jsx-scope */ switch (question.type) { - case QuestionType.Code: // TODO: Implement + case QuestionType.Code: + result = <Code handler={handler} questionId={question.id}/>; + break; + case QuestionType.TextArea: result = <TextArea handler={handler} valid={valid} onBlurHandler={onBlurHandler} focus_ref={focus_ref}/>; break; diff --git a/src/components/Question.tsx b/src/components/Question.tsx index 2f5c496..2914ae6 100644 --- a/src/components/Question.tsx +++ b/src/components/Question.tsx @@ -28,6 +28,8 @@ class RenderedQuestion extends React.Component<QuestionProp> { super(props); if (props.question.type === QuestionType.TextArea) { this.handler = this.text_area_handler.bind(this); + } else if (props.question.type === QuestionType.Code) { + this.handler = this.code_field_handler.bind(this); } else { this.handler = this.normal_handler.bind(this); } @@ -46,8 +48,8 @@ class RenderedQuestion extends React.Component<QuestionProp> { this.props.public_state.set(target, value); } - // This is here to allow dynamic selection between the general handler, and the textarea handler. - handler(_: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>): void {} // eslint-disable-line + // This is here to allow dynamic selection between the general handler, textarea, and code field handlers. + handler(_: ChangeEvent<HTMLInputElement | HTMLTextAreaElement> | string): void {} // eslint-disable-line blurHandler(): void { if (this.props.question.required) { @@ -132,6 +134,21 @@ class RenderedQuestion extends React.Component<QuestionProp> { this.setPublicState("value", event.target.value); } + code_field_handler(newContent: string): void { + // If content stays same (what means that user have just zoomed in), then don't validate. + let validate = false; + if (newContent != this.props.public_state.get("value")) { + validate = true; + } + + this.setPublicState("value", newContent); + + // CodeMirror don't provide onBlur event, so we have to run validation here. + if (validate) { + this.blurHandler(); + } + } + validateField(): void { if (!this.props.question.required) { return; @@ -142,6 +159,7 @@ class RenderedQuestion extends React.Component<QuestionProp> { switch (this.props.question.type) { case QuestionType.TextArea: case QuestionType.ShortText: + case QuestionType.Code: if (this.props.public_state.get("value") === "") { invalid = true; } @@ -1077,6 +1077,228 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@codemirror/autocomplete@^0.18.0": + version "0.18.5" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-0.18.5.tgz#5c25ddbef858503920fa4912b48bf78be93ee462" + integrity sha512-Zp/HMTwvaP4B01HQx+5Ga0xBBLAwNaAlbALip355NPRBkYX9PZheX5b/F5IUAdI6kIrF2eYz1xAOChXgYg9maw== + dependencies: + "@codemirror/language" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + "@codemirror/tooltip" "^0.18.4" + "@codemirror/view" "^0.18.0" + lezer-tree "^0.13.0" + +"@codemirror/basic-setup@^0.18.2": + version "0.18.2" + resolved "https://registry.yarnpkg.com/@codemirror/basic-setup/-/basic-setup-0.18.2.tgz#a766b7e8898ce5d4cd4782c1ebf87d15a0f1965f" + integrity sha512-4UNFQ4jhU7wKxJH23AJcZW6Ho54VXUpmbtFnN5amIdtGci4ZLvci4M7JKgKFraHmKfDIYQnSzN8d8ohXR7CRhw== + dependencies: + "@codemirror/autocomplete" "^0.18.0" + "@codemirror/closebrackets" "^0.18.0" + "@codemirror/commands" "^0.18.0" + "@codemirror/comment" "^0.18.0" + "@codemirror/fold" "^0.18.0" + "@codemirror/gutter" "^0.18.3" + "@codemirror/highlight" "^0.18.0" + "@codemirror/history" "^0.18.0" + "@codemirror/language" "^0.18.0" + "@codemirror/lint" "^0.18.0" + "@codemirror/matchbrackets" "^0.18.0" + "@codemirror/rectangular-selection" "^0.18.0" + "@codemirror/search" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" + +"@codemirror/closebrackets@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/closebrackets/-/closebrackets-0.18.0.tgz#4bd7e9227ed6e90e590fa6d289d34b0c065cb8cf" + integrity sha512-O1RAgUkzF4nq/B8IyXenZKZ1rJi2Mc7I6y4IhWhELiTnjyQy7YdAthTsJ40mNr8kZ6gRbasYe3K7TraITElZJA== + dependencies: + "@codemirror/language" "^0.18.0" + "@codemirror/rangeset" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + "@codemirror/view" "^0.18.0" + +"@codemirror/commands@^0.18.0": + version "0.18.2" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-0.18.2.tgz#a90067b1e3127ffe2c1be2daa68c0f4aeda59308" + integrity sha512-NeIpsQe5yUIhG7sD1HPaw/9TO5V7miMKwGwhT/0tkgkmgnMtJcgnguM1gjaUlaZ09BBJO6s61D8JHNDUvBI6tA== + dependencies: + "@codemirror/language" "^0.18.0" + "@codemirror/matchbrackets" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + "@codemirror/view" "^0.18.0" + lezer-tree "^0.13.0" + +"@codemirror/comment@^0.18.0": + version "0.18.1" + resolved "https://registry.yarnpkg.com/@codemirror/comment/-/comment-0.18.1.tgz#e39c8b6937b86852246decb3441683c66b03abf4" + integrity sha512-Inhqs0F24WE28Fcp1dBZghwixBGv1HDwY9MjE0d5tpMY/IPGI6uT30fGyHAXrir6hUqk7eJRkO4UYnODGOnoIA== + dependencies: + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + "@codemirror/view" "^0.18.0" + +"@codemirror/fold@^0.18.0": + version "0.18.1" + resolved "https://registry.yarnpkg.com/@codemirror/fold/-/fold-0.18.1.tgz#118019ad79f6e0d48dc932823385d4d9f2e0eaf5" + integrity sha512-vvMUgDeSmeVow7/75YoNTERxPsdnIBeEw1JL2YVpLyscsUlalqwuxdhiHDLT5zjAu6JvMoTC103mwqgAYwM9tA== + dependencies: + "@codemirror/gutter" "^0.18.0" + "@codemirror/language" "^0.18.0" + "@codemirror/rangeset" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" + +"@codemirror/gutter@^0.18.0", "@codemirror/gutter@^0.18.3": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@codemirror/gutter/-/gutter-0.18.3.tgz#d195e2f69c6bdba037ec9c4d97eee0b46b1f02b7" + integrity sha512-9ZLpR3s3MCPtB5fpRAy8af89GjO763XB4GE4HLBnESS7E1CHAuHFSTyd/ZqKHZogueF1mJhv9IQnCamEYcNMQw== + dependencies: + "@codemirror/rangeset" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" + +"@codemirror/highlight@^0.18.0": + version "0.18.4" + resolved "https://registry.yarnpkg.com/@codemirror/highlight/-/highlight-0.18.4.tgz#83dfd402d7cbfe67dc9d0cb93a25755321014829" + integrity sha512-3azJntqWrShOIq/0kVcdMc9k7ACL0LQErgK+A6aWXmCj5Mx0gShq+Iajy8AMQ2zB0v3nhCBgFaniL1LLD5m5hQ== + dependencies: + "@codemirror/language" "^0.18.0" + "@codemirror/rangeset" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" + lezer-tree "^0.13.0" + style-mod "^4.0.0" + +"@codemirror/history@^0.18.0": + version "0.18.1" + resolved "https://registry.yarnpkg.com/@codemirror/history/-/history-0.18.1.tgz#853cde4b138b172235d58f945871f0fc08b7310a" + integrity sha512-Aad3p4zs6UYKCUMXYjh7cvPK0ajuL+rMib9yBZ61w81LLl6OkM31Xrn9J6CLJmPxCwP3OJFiqBmNSBQ05oIsTw== + dependencies: + "@codemirror/state" "^0.18.3" + "@codemirror/view" "^0.18.0" + +"@codemirror/lang-python@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/lang-python/-/lang-python-0.18.0.tgz#d317566f7c51d906e3df98bf41a3c9a2ce03ef40" + integrity sha512-SZrt+TXD3uih4Cb8lTm7yt7JLIqehgI77PdGQXlPcYB/LHQdOuOPzXOXf8jqu/K+PRN72BFxfvb13teaxdERaQ== + dependencies: + "@codemirror/highlight" "^0.18.0" + "@codemirror/language" "^0.18.0" + lezer-python "^0.13.0" + +"@codemirror/language@^0.18.0": + version "0.18.1" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-0.18.1.tgz#23682324228606c4ae5b6a9f7cd0a4b9fdff83dd" + integrity sha512-j/TWV8sNmzU79kk/hPLb9NqSPoH59850kQSpgY11LxOEBlKVRKgaWabgNtUCSeVCAnfisGekupk3aq2ftILqug== + dependencies: + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + "@codemirror/view" "^0.18.0" + lezer "^0.13.4" + lezer-tree "^0.13.0" + +"@codemirror/lint@^0.18.0": + version "0.18.3" + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-0.18.3.tgz#31c629485e910b3f145e2b819d2f012cd17be016" + integrity sha512-ORD8bGQRv5FATJ/LUmhaVPz69ucNjMCQ53WF8TqYMw6KtlTwAFsi+GvEhYyav7CdXPAXS/Z/j0C0Op8d1Dp+lQ== + dependencies: + "@codemirror/panel" "^0.18.1" + "@codemirror/state" "^0.18.0" + "@codemirror/tooltip" "^0.18.4" + "@codemirror/view" "^0.18.0" + crelt "^1.0.5" + +"@codemirror/matchbrackets@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/matchbrackets/-/matchbrackets-0.18.0.tgz#64a493090d942de19f15a9ed3cb0fa19ed55f18b" + integrity sha512-dPDopnZVkD54sSYdmQbyQbPdiuIA83p7XxX6Hp1ScEkOjukwCiFXiA/84x10FUTsQpUYp8bDzm7gwII119bGIw== + dependencies: + "@codemirror/language" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" + lezer-tree "^0.13.0" + +"@codemirror/panel@^0.18.1": + version "0.18.2" + resolved "https://registry.yarnpkg.com/@codemirror/panel/-/panel-0.18.2.tgz#f82dd69fc82d752ec5d6269bbdecbbdb8df69529" + integrity sha512-ea/g2aAKtfmie1kD7C8GDutD/5u+uzRJr/varUiAbHKr1sAdjtz5xYvC3GBAMYMan1GOh0vD5zP1yEupJl3b3Q== + dependencies: + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" + +"@codemirror/rangeset@^0.18.0", "@codemirror/rangeset@^0.18.2": + version "0.18.2" + resolved "https://registry.yarnpkg.com/@codemirror/rangeset/-/rangeset-0.18.2.tgz#37feec9763d5ca88f4c546d28d414a323ca2a430" + integrity sha512-rXXuSLlsbtHDKVx9xvP6jGOcjk4fXHZuIr9//ccKYqrCG5RRBvwzcdNTCi1H9tXzBwj5xA4nmDe8fCi6GCAzLw== + dependencies: + "@codemirror/state" "^0.18.0" + +"@codemirror/rectangular-selection@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/rectangular-selection/-/rectangular-selection-0.18.0.tgz#87e1a4d319b5d55b4e97294e6df0070164e836c0" + integrity sha512-BQ4pp2zhXCVZNqct5LtLR3AOWVseENBF/3oOgBmwsCKH7c11NfTqIqgWG5EW8NLOXp8HP8cDm3np8eWez0VkGQ== + dependencies: + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + "@codemirror/view" "^0.18.0" + +"@codemirror/search@^0.18.0": + version "0.18.4" + resolved "https://registry.yarnpkg.com/@codemirror/search/-/search-0.18.4.tgz#cb258c994db78df8c74c0350b84a0c275cfa2711" + integrity sha512-3chVkMPzl+pTUSqtimTicebhti4SLpvkj03pQx2aPZScXxIiYuDk4cLdIJK9omjmO1+oycRKbOrqvG7iZJJwMg== + dependencies: + "@codemirror/panel" "^0.18.1" + "@codemirror/rangeset" "^0.18.0" + "@codemirror/state" "^0.18.6" + "@codemirror/text" "^0.18.0" + "@codemirror/view" "^0.18.0" + crelt "^1.0.5" + +"@codemirror/state@^0.18.0", "@codemirror/state@^0.18.3", "@codemirror/state@^0.18.6", "@codemirror/state@^0.18.7": + version "0.18.7" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-0.18.7.tgz#3339a732387bb2c034987c57ccf0649ef2f7c4c1" + integrity sha512-cVyTiAC9vv90NKmGOfNtBjyIem3BqKui1L5Hfcxurp8K9votQj2oH9COcgWPnQ2Xs64yC70tEuTt9DF1pj5PFQ== + dependencies: + "@codemirror/text" "^0.18.0" + +"@codemirror/text@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@codemirror/text/-/text-0.18.0.tgz#a4a98862989ccef5545e730b269136d524c6a7c7" + integrity sha512-HMzHNIAbjCiCf3tEJMRg6ul01KPuXxQGNiHlHgAnqPguq/CX+L4Nvj5JlWQAI91Pupk18zhmM1c6eaazX4YeTg== + +"@codemirror/theme-one-dark@^0.18.1": + version "0.18.1" + resolved "https://registry.yarnpkg.com/@codemirror/theme-one-dark/-/theme-one-dark-0.18.1.tgz#fa625db384418e89b778d2ae49824c44d5280e3f" + integrity sha512-0XRfWYDfwUlPlN8yrO7bDB+EuHFqUNhTJwgp2iIixZWejuZQK0NxKmjuhkiGsEz25w7toM12uUsNJ5mo7iFQcA== + dependencies: + "@codemirror/highlight" "^0.18.0" + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" + +"@codemirror/tooltip@^0.18.4": + version "0.18.4" + resolved "https://registry.yarnpkg.com/@codemirror/tooltip/-/tooltip-0.18.4.tgz#981bc0ced792c6754148edbc1f60092f3fa54207" + integrity sha512-LDlDOSEfjoG24uapLN7exK3Z3JchYFKUwWqo1x/9YdlAkmD1ik7cMSQZboCquP1uJVcXhtbpKmaO6vENGVaarg== + dependencies: + "@codemirror/state" "^0.18.0" + "@codemirror/view" "^0.18.0" + +"@codemirror/view@^0.18.0", "@codemirror/view@^0.18.14": + version "0.18.14" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-0.18.14.tgz#509f2a487e1fa62b6b147e3a9db5aab6ce228495" + integrity sha512-b83favt2XtbV343wzmY4e5lTwYBdpklFZ31jJ/SDGixx6Yj5xTgZd6NU6jkK/XOT40D1rcRoKcQfFbbpjLG1SA== + dependencies: + "@codemirror/rangeset" "^0.18.2" + "@codemirror/state" "^0.18.0" + "@codemirror/text" "^0.18.0" + style-mod "^4.0.0" + w3c-keyname "^2.2.4" + "@discoveryjs/json-ext@^0.5.0": version "0.5.2" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" @@ -3391,6 +3613,11 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" +crelt@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" + integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== + cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -6216,6 +6443,25 @@ levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lezer-python@^0.13.0: + version "0.13.6" + resolved "https://registry.yarnpkg.com/lezer-python/-/lezer-python-0.13.6.tgz#3d4c6bc56b9ba2a9d63e85f92ea33e80dc8a7b78" + integrity sha512-cUZSilL3BZ+ssDkvGSOdxfL0ioajEPijWuQ31Z5vAFW8Ons53d5FILYnxRcGhZlwmBnn4cDAtxZyny0K+l6AEw== + dependencies: + lezer "^0.13.2" + +lezer-tree@^0.13.0, lezer-tree@^0.13.2: + version "0.13.2" + resolved "https://registry.yarnpkg.com/lezer-tree/-/lezer-tree-0.13.2.tgz#00f4671309b15c27b131f637e430ce2d4d5f7065" + integrity sha512-15ZxW8TxVNAOkHIo43Iouv4zbSkQQ5chQHBpwXcD2bBFz46RB4jYLEEww5l1V0xyIx9U2clSyyrLes+hAUFrGQ== + +lezer@^0.13.2, lezer@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/lezer/-/lezer-0.13.5.tgz#6000536bca7e24a5bd62e8cb4feff28b37e7dd8f" + integrity sha512-cAiMQZGUo2BD8mpcz7Nv1TlKzWP7YIdIRrX41CiP5bk5t4GHxskOxWUx2iAOuHlz8dO+ivbuXr0J1bfHsWD+lQ== + dependencies: + lezer-tree "^0.13.2" + lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" @@ -8372,6 +8618,11 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +style-mod@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.0.tgz#97e7c2d68b592975f2ca7a63d0dd6fcacfe35a01" + integrity sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw== + stylis@^4.0.3: version "4.0.6" resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.0.6.tgz#0d8b97b6bc4748bea46f68602b6df27641b3c548" @@ -8939,6 +9190,11 @@ w3c-hr-time@^1.0.1, w3c-hr-time@^1.0.2: dependencies: browser-process-hrtime "^1.0.0" +w3c-keyname@^2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.4.tgz#4ade6916f6290224cdbd1db8ac49eab03d0eef6b" + integrity sha512-tOhfEwEzFLJzf6d1ZPkYfGj+FWhIpBux9ppoP3rlclw3Z0BZv3N7b7030Z1kYth+6rDuAsXUFr+d0VE6Ed1ikw== + w3c-xmlserializer@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794" |