├── public ├── _redirects ├── robots.txt ├── favicon.ico ├── logo192.png ├── logo512.png ├── static │ ├── filter-definition.json │ ├── model-definition.json │ └── component-definition.json ├── manifest.json └── index.html ├── src ├── images │ ├── footer.jpeg │ ├── wknd-card.jpeg │ ├── icon-close.svg │ ├── Back.svg │ ├── icon-loading.svg │ └── wknd-logo-dk.svg ├── styles │ ├── Poppins-Medium.ttf │ ├── Poppins-Regular.ttf │ ├── AktivGroteskCorp-Medium.woff │ ├── AktivGroteskCorp-Regular.woff │ ├── _fonts.scss │ └── _variables.scss ├── index.css ├── index.jsx ├── utils │ ├── commons.js │ ├── fetchData.js │ └── renderRichText.jsx ├── components │ ├── base │ │ ├── Error.jsx │ │ ├── Loading.jsx │ │ ├── Image.jsx │ │ ├── Text.jsx │ │ ├── Title.jsx │ │ ├── Container.jsx │ │ ├── Accordion.scss │ │ └── Accordion.jsx │ ├── About.jsx │ ├── Articles.scss │ ├── Home.scss │ ├── Teaser.scss │ ├── Home.jsx │ ├── Teaser.jsx │ ├── Adventures.scss │ ├── Articles.jsx │ ├── Adventures.jsx │ ├── AdventureDetail.scss │ ├── ArticleDetail.jsx │ └── AdventureDetail.jsx ├── api │ └── useGraphQL.js ├── App.jsx ├── logo.svg └── App.scss ├── vite.config.js ├── vite.config.manual-ssl.js ├── .gitignore ├── index.html ├── package.json ├── README.md └── yarn.lock /public/_redirects: -------------------------------------------------------------------------------- 1 | /* /index.html 200 -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adobe/universal-editor-sample-editable-app/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adobe/universal-editor-sample-editable-app/HEAD/public/logo192.png -------------------------------------------------------------------------------- /public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adobe/universal-editor-sample-editable-app/HEAD/public/logo512.png -------------------------------------------------------------------------------- /src/images/footer.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adobe/universal-editor-sample-editable-app/HEAD/src/images/footer.jpeg -------------------------------------------------------------------------------- /src/images/wknd-card.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adobe/universal-editor-sample-editable-app/HEAD/src/images/wknd-card.jpeg -------------------------------------------------------------------------------- /src/styles/Poppins-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adobe/universal-editor-sample-editable-app/HEAD/src/styles/Poppins-Medium.ttf -------------------------------------------------------------------------------- /src/styles/Poppins-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adobe/universal-editor-sample-editable-app/HEAD/src/styles/Poppins-Regular.ttf -------------------------------------------------------------------------------- /src/styles/AktivGroteskCorp-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adobe/universal-editor-sample-editable-app/HEAD/src/styles/AktivGroteskCorp-Medium.woff -------------------------------------------------------------------------------- /src/styles/AktivGroteskCorp-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adobe/universal-editor-sample-editable-app/HEAD/src/styles/AktivGroteskCorp-Regular.woff -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | } 4 | 5 | code { 6 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 7 | monospace; 8 | } 9 | -------------------------------------------------------------------------------- /public/static/filter-definition.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "container", 4 | "components": [ 5 | "text", "image", "title", "accordion", "container", "richtext" 6 | ] 7 | }, 8 | { 9 | "id": "accordion", 10 | "components": [ 11 | "accordion-item" 12 | ] 13 | } 14 | ] -------------------------------------------------------------------------------- /src/index.jsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import App from "./App"; 4 | import "./index.css"; 5 | 6 | const root = ReactDOM.createRoot(document.getElementById("root")); 7 | root.render( 8 | 9 | 10 | 11 | ); 12 | -------------------------------------------------------------------------------- /src/images/icon-close.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | import basicSsl from '@vitejs/plugin-basic-ssl' 4 | 5 | // https://vitejs.dev/config/ 6 | export default defineConfig(({ command, mode }) => { 7 | return { 8 | plugins: [react(), basicSsl()], 9 | base: '/', 10 | server: { 11 | https: true, 12 | port: 3000, 13 | } 14 | } 15 | }) 16 | 17 | -------------------------------------------------------------------------------- /src/utils/commons.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Helper function to get the first adventure from the response 3 | * @param {*} response 4 | */ 5 | function getArticle(data) { 6 | if (data && data.articleList && data.articleList.items) { 7 | // expect there only to be a single adventure in the array 8 | if (data.articleList.items.length === 1) { 9 | return data.articleList.items[0]; 10 | } 11 | } 12 | return undefined; 13 | } 14 | 15 | export { getArticle }; -------------------------------------------------------------------------------- /src/components/base/Error.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 Adobe 3 | All Rights Reserved. 4 | 5 | NOTICE: Adobe permits you to use, modify, and distribute this file in 6 | accordance with the terms of the Adobe license agreement accompanying 7 | it. 8 | */ 9 | import React from 'react'; 10 | 11 | const Error = ({ errorMessage }) => ( 12 |
13 | {`Error: ${errorMessage}`} 14 |
15 | ); 16 | 17 | export default Error; -------------------------------------------------------------------------------- /src/components/base/Loading.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 Adobe 3 | All Rights Reserved. 4 | 5 | NOTICE: Adobe permits you to use, modify, and distribute this file in 6 | accordance with the terms of the Adobe license agreement accompanying 7 | it. 8 | */ 9 | import React from 'react'; 10 | import loadingIcon from '../../images/icon-loading.svg'; 11 | 12 | const Loading = () => ( 13 |
14 | Loading... 15 |
16 | ); 17 | 18 | export default Loading; -------------------------------------------------------------------------------- /vite.config.manual-ssl.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | import fs from 'fs' 4 | import path from 'path' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [react()], 9 | base: '/githubpages/', 10 | server: { 11 | https: { 12 | key: fs.readFileSync(path.resolve(__dirname, 'localhost-key.pem')), 13 | cert: fs.readFileSync(path.resolve(__dirname, 'localhost.pem')), 14 | }, 15 | port: 3000, 16 | } 17 | }) 18 | 19 | -------------------------------------------------------------------------------- /src/images/Back.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | #auth_credentials 15 | /src/auth 16 | 17 | # misc 18 | .DS_Store 19 | .env.local 20 | .env.development.local 21 | .env.test.local 22 | .env.production.local 23 | 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | .yalc 28 | 29 | # local Netlify folder 30 | .netlify 31 | 32 | # demo app 33 | auth/ 34 | bin/ 35 | lib/ 36 | yalc.lock 37 | .idea/ 38 | 39 | dist/ -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /src/images/icon-loading.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /src/components/About.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import image from '../images/wknd-card.jpeg'; 3 | 4 | const About = () => ( 5 |
6 |

About Us

7 | Sample 8 |

The WKND is a fictional online magazine and adventure company that focuses 9 | on outdoor activities and trips across the globe. The WKND site is designed 10 | to demonstrate functionality for Adobe Experience Manager. There is also a 11 | corresponding tutorial that walks a developer through the development. 12 | Special thanks to Lorenzo Buosi and Kilian Amendola who created the 13 | beautiful design for the WKND site. 14 |

15 |
16 | ); 17 | 18 | export default About; 19 | -------------------------------------------------------------------------------- /src/components/Articles.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2023 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | @import '../styles/variables'; 9 | 10 | .articles { 11 | padding: 70px; 12 | text-align: left; 13 | max-width: $max-width; 14 | margin: 0 auto; 15 | } 16 | .article-item { 17 | list-style: none; 18 | column-gap: 30px; 19 | padding: 10px; 20 | display: flex; 21 | border-bottom: 1px solid #eee; 22 | 23 | &:nth-child(even) { 24 | flex-direction: row-reverse; 25 | } 26 | 27 | .article-item-image { 28 | max-width: 350px; 29 | max-height: 350px; 30 | } 31 | 32 | .article-content{ 33 | align-self: flex-end; 34 | } 35 | } 36 | @media only screen and (max-width: $mobile-breakpoint) { 37 | .article-item { 38 | display:inherit; 39 | } 40 | } -------------------------------------------------------------------------------- /src/components/base/Image.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2022 Adobe 3 | All Rights Reserved. 4 | 5 | NOTICE: Adobe permits you to use, modify, and distribute this file in 6 | accordance with the terms of the Adobe license agreement accompanying 7 | it. 8 | */ 9 | import React, {useEffect, useMemo} from 'react'; 10 | import {fetchData, getImageURL} from '../../utils/fetchData'; 11 | 12 | const Image = (props) => { 13 | const {resource, prop = "fileReference", type, className, data: initialData} = props; 14 | 15 | const editorProps = useMemo(() => true && { 16 | "data-aue-resource": resource, 17 | "data-aue-prop":prop, 18 | "data-aue-type": type, 19 | }, [resource, prop, type]); 20 | 21 | const [data,setData] = React.useState(initialData || {}); 22 | useEffect(() => { 23 | if(!resource || !prop || initialData) return; 24 | fetchData(resource).then((data) => setData(data)); 25 | }, [resource, prop, initialData]); 26 | const path = data?.["fileReference"]; 27 | 28 | return ( 29 | {data.alt} 30 | ); 31 | }; 32 | 33 | export default Image; 34 | -------------------------------------------------------------------------------- /src/components/Home.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2023 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | @import '../styles/variables'; 9 | 10 | section { 11 | padding: 80px; 12 | text-align: center; 13 | 14 | .content { 15 | display: grid; 16 | align-items: start; 17 | padding-bottom: 20px; 18 | column-gap: 20px; 19 | max-width: $max-width; 20 | margin: 0 auto; 21 | 22 | h1 { 23 | margin-top: 0; 24 | text-align:left; 25 | } 26 | 27 | .container { 28 | text-align: left; 29 | } 30 | } 31 | 32 | &.about-us .content { 33 | grid-template-columns: 1fr 3fr; 34 | } 35 | 36 | &.newsletter { 37 | background-color: $lime; 38 | color: $black; 39 | .content { 40 | grid-template-columns: repeat(2,1fr); 41 | } 42 | } 43 | 44 | @media only screen and (max-width: $mobile-breakpoint) { 45 | .content { 46 | display: inherit; 47 | } 48 | } 49 | } 50 | 51 | @media only screen and (max-width: $tablet-breakpoint) { 52 | section { 53 | padding: $tablet-padding; 54 | } 55 | } -------------------------------------------------------------------------------- /src/components/base/Text.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 Adobe 3 | All Rights Reserved. 4 | 5 | NOTICE: Adobe permits you to use, modify, and distribute this file in 6 | accordance with the terms of the Adobe license agreement accompanying 7 | it. 8 | */ 9 | import React, {useEffect} from 'react'; 10 | import {fetchData} from '../../utils/fetchData'; 11 | 12 | const Text = (props) => { 13 | const {resource, prop = "text", type, className, data: initialData} = props; 14 | const [data,setData] = React.useState(initialData); 15 | 16 | const editorProps = { 17 | "data-aue-resource": resource, 18 | "data-aue-prop":prop, 19 | "data-aue-type": type, 20 | }; 21 | 22 | useEffect(() => { 23 | if(!resource || !prop ) return; 24 | if(!data) { fetchData(resource).then((data) => setData(data)) }; 25 | }, [resource, prop, data]); 26 | 27 | 28 | return data ? ( 29 | type !== "richtext" ?( 30 |
31 | {data[prop]} 32 |
33 | ) :
34 | ): <>; 35 | }; 36 | 37 | export default Text; 38 | -------------------------------------------------------------------------------- /src/images/wknd-logo-dk.svg: -------------------------------------------------------------------------------- 1 | Asset 2 -------------------------------------------------------------------------------- /src/styles/_fonts.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2022 Adobe. All rights reserved. 3 | * This file is licensed to you under the Apache License, Version 2.0 (the "License"); 4 | * you may not use this file except in compliance with the License. You may obtain a copy 5 | * of the License at http://www.apache.org/licenses/LICENSE-2.0 6 | * 7 | * Unless required by applicable law or agreed to in writing, software distributed under 8 | * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS 9 | * OF ANY KIND, either express or implied. See the License for the specific language 10 | * governing permissions and limitations under the License. 11 | * 12 | */ 13 | 14 | @font-face { 15 | font-family: 'Aktiv Grotesk'; 16 | font-style: normal; 17 | font-display: swap; 18 | src: url(AktivGroteskCorp-Regular.woff) format('woff'); 19 | } 20 | 21 | @font-face { 22 | font-family: 'Aktiv Grotesk Medium'; 23 | font-style: normal; 24 | font-display: swap; 25 | src: url(AktivGroteskCorp-Medium.woff) format('woff'); 26 | } 27 | 28 | 29 | @font-face { 30 | font-family: 'Poppins'; 31 | font-style: normal; 32 | font-display: swap; 33 | src: url(Poppins-Regular.ttf); 34 | } 35 | 36 | @font-face { 37 | font-family: 'Poppins Medium'; 38 | font-style: normal; 39 | font-display: swap; 40 | src: url(Poppins-Medium.ttf); 41 | } 42 | -------------------------------------------------------------------------------- /public/static/model-definition.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "text", 4 | "fields": [ 5 | { 6 | "component": "text", 7 | "name": "text", 8 | "value": "Text", 9 | "label": "Text", 10 | "valueType": "string" 11 | } 12 | ] 13 | }, 14 | { 15 | "id": "title", 16 | "fields": [ 17 | { 18 | "component": "select", 19 | "name": "type", 20 | "value": "h1", 21 | "label": "Type", 22 | "valueType": "string", 23 | "options": [ 24 | { "name": "h1", "value": "h1" }, 25 | { "name": "h2", "value": "h2" }, 26 | { "name": "h3", "value": "h3" }, 27 | { "name": "h4", "value": "h4" }, 28 | { "name": "h5", "value": "h5" }, 29 | { "name": "h6", "value": "h6" } 30 | ] 31 | } 32 | ] 33 | }, 34 | { 35 | "id": "richtext", 36 | "fields": [ 37 | { 38 | "component": "richtext", 39 | "name": "text", 40 | "value": "Text", 41 | "label": "Text", 42 | "valueType": "string" 43 | } 44 | ] 45 | }, 46 | { 47 | "id": "accordion-item", 48 | "fields": [ 49 | { 50 | "component": "text", 51 | "name": "cq:panelTitle", 52 | "value": "", 53 | "label": "Accordion Item Title", 54 | "valueType": "string", 55 | "required": true 56 | } 57 | ] 58 | } 59 | ] 60 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | React App 16 | 27 | 28 | 29 | 30 | 31 |
32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/components/Teaser.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2023 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | @import '../styles/variables'; 9 | 10 | .Teaser { 11 | background-color: #141414; 12 | color: #FFFFFF; 13 | padding: 40px 80px 80px; 14 | display: grid; 15 | grid-template-columns: repeat(5, 1fr); 16 | align-items: center; 17 | text-align: left; 18 | max-width: 1280px; 19 | margin: 0 auto; 20 | 21 | article { 22 | grid-column: 1/3; 23 | grid-row: 1; 24 | z-index: 2; 25 | color: $white; 26 | 27 | > div { 28 | margin: 50px 0; 29 | display: -webkit-box; 30 | -webkit-line-clamp: 3; 31 | -webkit-box-orient: vertical; 32 | overflow: hidden; 33 | text-overflow: ellipsis; 34 | } 35 | 36 | .pill { 37 | border: 1px solid $white; 38 | } 39 | 40 | .pill:first-child { 41 | margin-right: 10px; 42 | } 43 | } 44 | img { 45 | border-radius: 16px; 46 | max-width: 100%; 47 | grid-column: span 3; 48 | grid-column: 2 / 6; 49 | grid-row: 1; 50 | opacity: 0.6; 51 | } 52 | } 53 | 54 | @media only screen and (max-width: $tablet-breakpoint) { 55 | .Teaser { 56 | padding: $tablet-padding; 57 | } 58 | } 59 | 60 | @media only screen and (max-width: $mobile-breakpoint) { 61 | .Teaser { 62 | display: flex; 63 | flex-direction: column-reverse; 64 | } 65 | } -------------------------------------------------------------------------------- /src/components/base/Title.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2022 Adobe 3 | All Rights Reserved. 4 | 5 | NOTICE: Adobe permits you to use, modify, and distribute this file in 6 | accordance with the terms of the Adobe license agreement accompanying 7 | it. 8 | */ 9 | import React, {useEffect, useMemo} from 'react'; 10 | import {fetchData} from '../../utils/fetchData'; 11 | 12 | const Title = (props) => { 13 | const {resource, prop = "jcr:title", type, className = "test", data: initialData} = props; 14 | const editorProps = useMemo(() => true && { 15 | "data-aue-resource": resource, 16 | "data-aue-prop":prop, 17 | "data-aue-type": type, 18 | }, [resource, prop, type]); 19 | 20 | const [data,setData] = React.useState(initialData); 21 | 22 | useEffect(() => { 23 | if(!resource || !prop) return; 24 | if (!data) { fetchData(resource, "model").then((data) => setData(data)) }; 25 | }, [resource, prop, data]); 26 | 27 | useEffect(() => { 28 | const handleUpdate = (e) => { 29 | const { itemids = [] } = e.detail; 30 | if(itemids.indexOf(resource) >= 0) { 31 | setData(null); 32 | } 33 | e.stopPropagation(); 34 | }; 35 | document.addEventListener("editor-update", handleUpdate); 36 | return () => { 37 | document.removeEventListener("editor-update", handleUpdate); 38 | } 39 | },[resource]); 40 | 41 | const TitleTag = data?.type ? `${data.type}` : "h1"; 42 | return data ? ( 43 | {data["jcr:title"] ?? "Default Title"} 44 | ):<>; 45 | }; 46 | 47 | export default Title; 48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "universal-editor-sample-app", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "Adobe Universal Editor Sample App", 6 | "author": "Adobe", 7 | "license": "Apache-2.0", 8 | "homepage": "https://github.com/adobe/universal-editor-sample-app", 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/adobe/universal-editor-sample-app.git" 12 | }, 13 | "keywords": [ 14 | "adobe", 15 | "universal-editor", 16 | "sample-app" 17 | ], 18 | "type": "module", 19 | "scripts": { 20 | "start": "vite", 21 | "build": "vite build", 22 | "preview": "vite preview", 23 | "deploy": "npm run build && gh-pages -d dist" 24 | }, 25 | "dependencies": { 26 | "react": "^18.2.0", 27 | "react-dom": "^18.2.0", 28 | "react-router-dom": "^7.9.6", 29 | "sass": "^1.94.1" 30 | }, 31 | "devDependencies": { 32 | "@adobe/aem-headless-client-js": "^4.0.0", 33 | "@adobe/aem-headless-client-nodejs": "^2.0.0", 34 | "@types/react": "^18.2.43", 35 | "@types/react-dom": "^18.2.17", 36 | "@vitejs/plugin-basic-ssl": "^2.1.0", 37 | "@vitejs/plugin-react": "^4.2.1", 38 | "gh-pages": "^6.1.0", 39 | "react-helmet-async": "^2.0.4", 40 | "vite": "^5.0.8" 41 | }, 42 | "eslintConfig": { 43 | "extends": [ 44 | "react-app", 45 | "react-app/jest" 46 | ] 47 | }, 48 | "browserslist": { 49 | "production": [ 50 | ">0.2%", 51 | "not dead", 52 | "not op_mini all" 53 | ], 54 | "development": [ 55 | "last 1 chrome version", 56 | "last 1 firefox version", 57 | "last 1 safari version" 58 | ] 59 | }, 60 | "engines": { 61 | "node": ">=20.0.0" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/api/useGraphQL.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | import {useState, useEffect} from 'react'; 9 | import {getAuthorHost} from "../utils/fetchData"; 10 | import {AEMHeadless} from '@adobe/aem-headless-client-js'; 11 | 12 | 13 | /** 14 | * Custom React Hook to perform a GraphQL query 15 | * @param path - Persistent query path 16 | */ 17 | function useGraphQL(path) { 18 | let [data, setData] = useState(null); 19 | let [errorMessage, setErrors] = useState(null); 20 | useEffect(() => { 21 | function makeRequest() { 22 | const sdk = new AEMHeadless({ 23 | serviceURL: getAuthorHost(), 24 | endpoint: "/content/graphql/global/endpoint.json", 25 | }); 26 | const request = sdk.runPersistedQuery.bind(sdk); 27 | 28 | request(path, {}, {credentials: "include"}) 29 | .then(({data, errors}) => { 30 | //If there are errors in the response set the error message 31 | if (errors) { 32 | setErrors(mapErrors(errors)); 33 | } 34 | //If data in the response set the data as the results 35 | if (data) { 36 | setData(data); 37 | } 38 | }) 39 | .catch((error) => { 40 | setErrors(error); 41 | sessionStorage.removeItem('accessToken'); 42 | }); 43 | } 44 | 45 | makeRequest(); 46 | }, [path]); 47 | 48 | 49 | return {data, errorMessage} 50 | } 51 | 52 | /** 53 | * concatenate error messages into a single string. 54 | * @param {*} errors 55 | */ 56 | function mapErrors(errors) { 57 | return errors.map((error) => error.message).join(","); 58 | } 59 | 60 | export default useGraphQL; 61 | -------------------------------------------------------------------------------- /src/components/Home.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2022 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | import React from 'react'; 9 | import { Link } from 'react-router-dom'; 10 | import Container from './base/Container'; 11 | import Title from './base/Title'; 12 | import Text from './base/Text'; 13 | import Teaser from './Teaser'; 14 | import Adventures from './Adventures'; 15 | import "./Home.scss"; 16 | 17 | /*** 18 | * Displays a grid of current adventures 19 | */ 20 | function Home() { 21 | return ( 22 |
23 | 24 | 25 |
26 |
27 | 28 | <Text resource="urn:aemconnection:/content/wknd/language-masters/en/faqs/jcr:content/root/container/container/text" prop="text" type="richtext" /> 29 | </div> 30 | </section> 31 | <section className="about-us"> 32 | <div className="content"> 33 | <Title resource="urn:aemconnection:/content/wknd/language-masters/en/jcr:content/root/container/container_1679842506/title" prop="jcr:title" type="text"/> 34 | <Container resource="urn:aemconnection:/content/wknd/language-masters/en/faqs/jcr:content/root/container" type="container" /> 35 | </div> 36 | <Link to={`/aboutus${window.location.search}`}> 37 | <button className="dark">Read more</button> 38 | </Link> 39 | </section> 40 | </div> 41 | ); 42 | } 43 | 44 | export default Home; 45 | -------------------------------------------------------------------------------- /src/utils/fetchData.js: -------------------------------------------------------------------------------- 1 | export const fetchData = async (path) => { 2 | const url = `${getAuthorHost()}/${path.split(":/")[1]}.infinity.json`; 3 | const data = await fetch(url, {headers: {"X-Aem-Affinity-Type": "api"}, credentials: "include"}); 4 | const json = await data.json(); 5 | return json; 6 | }; 7 | export const getAuthorHost = () => { 8 | const url = new URL(window.location.href); 9 | const searchParams = new URLSearchParams(url.search); 10 | if (searchParams.has("authorHost")) { 11 | return searchParams.get("authorHost"); 12 | } else { 13 | return "https://author-p7452-e12433.adobeaemcloud.com"; 14 | } 15 | } 16 | 17 | export const getImageURL = (obj) => { 18 | if (obj === null || obj === undefined) { 19 | return undefined; 20 | } 21 | 22 | if (typeof obj === "string") { 23 | if (obj.startsWith("https://")) { 24 | return obj; 25 | } 26 | return `${getAuthorHost()}${obj}`; 27 | } 28 | 29 | if (obj._authorUrl !== undefined) { 30 | return obj._authorUrl; 31 | } 32 | 33 | if (obj.repositoryId !== undefined && obj.assetId !== undefined) { 34 | return `https://${obj.repositoryId}/adobe/assets/${obj.assetId}`; 35 | } 36 | 37 | if (obj._path !== undefined) { 38 | return `${getAuthorHost()}${obj._path}`; 39 | } 40 | 41 | return undefined; 42 | } 43 | 44 | export const getProtocol = () => { 45 | const url = new URL(window.location.href); 46 | const searchParams = new URLSearchParams(url.search); 47 | if (searchParams.has("protocol")) { 48 | return searchParams.get("protocol"); 49 | } else { 50 | return "aem"; 51 | } 52 | } 53 | 54 | export const getService = () => { 55 | const url = new URL(window.location.href); 56 | const searchParams = new URLSearchParams(url.search); 57 | if (searchParams.has("service")) { 58 | return searchParams.get("service"); 59 | } 60 | return null; 61 | } 62 | 63 | -------------------------------------------------------------------------------- /src/styles/_variables.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 Adobe 3 | All Rights Reserved. 4 | 5 | NOTICE: Adobe permits you to use, modify, and distribute this file in 6 | accordance with the terms of the Adobe license agreement accompanying 7 | it. 8 | */ 9 | //_variables.scss 10 | 11 | //== Colors 12 | // 13 | //## Gray and brand colors for use across theme. 14 | 15 | $black: #141414; 16 | $gray: #696969; 17 | $gray-light: #EBEBEB; 18 | $gray-lighter: #F7F7F7; 19 | $white: #FFFFFF; 20 | $yellow: #FFEA00; 21 | $blue: #0045FF; 22 | $red: #ff0048; 23 | $lime: #DBFF00; 24 | //== Typography 25 | // 26 | //## Font, line-height, and color for body text, headings, and more. 27 | 28 | $font-family-sans-serif: "Poppins", "Aktiv Grotesk Medium", sans-serif; 29 | $font-family-serif: "Asar",Georgia, "Times New Roman", Times, serif; 30 | $font-family-base: system-ui; 31 | 32 | $font-size-xsmall: 12px; 33 | $font-size-small: 14px; 34 | $font-size-medium: 16px; 35 | $font-size-base: 1rem; 36 | $font-size-large: 24px; 37 | $font-size-xlarge: 48px; 38 | 39 | $font-size-h1: 48px; 40 | $font-size-h2: 36px; 41 | $font-size-h3: 28px; 42 | $font-size-h4: 16px; 43 | $font-size-h5: 14px; 44 | $font-size-h6: 10px; 45 | 46 | $font-weight-normal: normal; 47 | $font-weight-bold: 600; 48 | 49 | $line-height-base: 1.1; 50 | $line-height-computed: floor(($font-size-base * $line-height-base)); 51 | 52 | // Functional Colors 53 | $brand-primary: $yellow; 54 | $body-bg: $white; 55 | $text-color: $black; 56 | $text-color-inverse: $gray-light; 57 | $link-color: $blue; 58 | $button-color: $lime; 59 | //Layout 60 | $max-width: 1280px; 61 | 62 | // Spacing 63 | $gutter-padding: 12px; 64 | 65 | // Breakpoints 66 | $mobile-breakpoint: 768px; 67 | $tablet-breakpoint: 1024px; 68 | 69 | $tablet-padding: 40px; -------------------------------------------------------------------------------- /src/components/Teaser.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2023 Adobe 3 | All Rights Reserved. 4 | 5 | NOTICE: Adobe permits you to use, modify, and distribute this file in 6 | accordance with the terms of the Adobe license agreement accompanying 7 | it. 8 | */ 9 | import React from 'react'; 10 | import { Link } from 'react-router-dom'; 11 | import useGraphQL from '../api/useGraphQL'; 12 | import { getArticle } from '../utils/commons'; 13 | import { mapJsonRichText } from '../utils/renderRichText'; 14 | import Loading from './base/Loading'; 15 | import "./Teaser.scss"; 16 | import {getImageURL} from "../utils/fetchData"; 17 | 18 | const Teaser = () => { 19 | const persistentQuery = `wknd-shared/article-by-slug;slug=aloha-spirits-in-northern-norway`; 20 | const {data, errorMessage} = useGraphQL(persistentQuery); 21 | //If there is an error with the GraphQL query 22 | if (errorMessage) return; 23 | 24 | //If query response is null then return a loading icon... 25 | if (!data) return <Loading/>; 26 | 27 | const article = getArticle(data); 28 | if(!article) return <></> 29 | const { title, _path, featuredImage, main } = article; 30 | 31 | const editorProps = { 32 | "data-aue-resource": "urn:aemconnection:" + _path + "/jcr:content/data/master", 33 | "data-aue-type": "reference", 34 | "data-aue-filter": "cf", 35 | "data-aue-label": "Hero Teaser" 36 | }; 37 | 38 | return ( 39 | 40 | <section {...editorProps} className="Teaser"> 41 | <article> 42 | <p>Latest article</p> 43 | <h1 data-aue-prop="title" data-aue-type="text" data-aue-label="Title">{title}</h1> 44 | {main && <div data-aue-prop="main" data-aue-type="richtext" data-aue-label="Description">{mapJsonRichText(main.json)}</div>} 45 | <Link to={`/articles/article/aloha-spirits-in-northern-norway${window.location.search}`}> 46 | <button>Read more</button> 47 | </Link> 48 | </article> 49 | {featuredImage && <img src={`${getImageURL(featuredImage)}`} alt={title} data-aue-type="media" data-aue-prop="featuredImage" data-aue-label="Image"/>} 50 | </section> 51 | 52 | ); 53 | } 54 | 55 | export default Teaser; 56 | 57 | -------------------------------------------------------------------------------- /src/components/base/Container.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {fetchData} from '../../utils/fetchData'; 3 | import Text from './Text'; 4 | import Title from './Title'; 5 | import Image from './Image'; 6 | import Accordion from './Accordion'; 7 | 8 | const Container = ({ resource, type, label = "Container"}) => { 9 | const [components, setComponents] = React.useState(null); 10 | 11 | const createChildComponents = (items, itemid) => { 12 | const components = []; 13 | for(let key in items) { 14 | const item = items[key]; 15 | const type = item["sling:resourceType"]?.split("/").pop(); 16 | if (type === undefined) { 17 | continue; 18 | } 19 | 20 | let itemType, Component; 21 | switch(type) { 22 | case "image": 23 | itemType = "media"; 24 | Component = Image; 25 | break; 26 | case "text": 27 | itemType = item.textIsRich ? "richtext" : "text"; 28 | Component = item.type ? Title : Text; 29 | break; 30 | case "title": 31 | itemType = "text"; 32 | Component = Title; 33 | break; 34 | case "accordion": 35 | itemType = "container"; 36 | Component = Accordion; 37 | break; 38 | case "container": 39 | itemType = "container"; 40 | Component = Container; 41 | break; 42 | default: 43 | itemType = "component"; 44 | Component = () => (<div/>); 45 | break; 46 | } 47 | 48 | const props = { 49 | resource: `${itemid}/${key}`, 50 | type: itemType, 51 | data: item, 52 | }; 53 | components.push(<Component key={key} {...props} />) 54 | } 55 | return components; 56 | } 57 | 58 | React.useEffect(() => { 59 | if(!resource) return; 60 | fetchData(resource).then((data) => { 61 | setComponents(createChildComponents(data, resource)); 62 | }); 63 | }, [resource]); 64 | 65 | return ( 66 | <div className="container" data-aue-component="container" data-aue-resource={resource} data-aue-type={type} data-aue-label={label}> 67 | {components} 68 | </div> 69 | ) 70 | }; 71 | 72 | export default Container; -------------------------------------------------------------------------------- /src/App.jsx: -------------------------------------------------------------------------------- 1 | import {React} from "react"; 2 | import { Helmet, HelmetProvider } from 'react-helmet-async'; 3 | import {BrowserRouter as Router, Route, Routes} from "react-router-dom"; 4 | import Home from "./components/Home"; 5 | import AdventureDetail from "./components/AdventureDetail"; 6 | import Articles from "./components/Articles"; 7 | import ArticleDetail from "./components/ArticleDetail"; 8 | import About from "./components/About"; 9 | import {getAuthorHost, getProtocol, getService} from "./utils/fetchData"; 10 | import logo from "./images/wknd-logo-dk.svg"; 11 | import "./App.scss"; 12 | 13 | const NavMenu = () => ( 14 | <nav> 15 | <ul className="menu"> 16 | <li><a href={`/${window.location.search}`}>Adventures</a></li> 17 | <li><a href={`/articles${window.location.search}`}>Magazine</a></li> 18 | <li><a href={`/aboutus${window.location.search}`}>About Us</a></li> 19 | </ul> 20 | </nav> 21 | ); 22 | 23 | const Header = () => { 24 | return ( 25 | <header className="header"> {/*<a href={sparkleAppUrl}><img src={logo} className="logo" alt="WKND Logo" /></a>*/} 26 | <img src={logo} className="logo" alt="WKND Logo" /> 27 | <NavMenu /> 28 | <button className="dark">Sign in</button> 29 | </header> 30 | ); 31 | }; 32 | 33 | const Footer = () => ( 34 | <footer className="footer"> 35 | <img src={logo} className="logo" alt="WKND Logo" /> 36 | <NavMenu /> 37 | <small>Copyright © 2023 Adobe. All rights reserved</small> 38 | </footer> 39 | ); 40 | 41 | function App() { 42 | return ( 43 | <HelmetProvider> 44 | <div className="App"> 45 | <Helmet> 46 | <meta name="urn:adobe:aue:system:aemconnection" content={`${getProtocol()}:${getAuthorHost()}`}/> 47 | { getService() && <meta name="urn:adobe:aue:config:service" content={getService()}/> } 48 | </Helmet> 49 | <Router> 50 | <Header /> 51 | <hr/> 52 | <main> 53 | <Routes> 54 | <Route path="/adventure/:slug" element={<AdventureDetail />} /> 55 | <Route path="/articles" element={<Articles />} /> 56 | <Route path="/articles/article/:slug" element={<ArticleDetail />} /> 57 | <Route path="/aboutus" element={<About />} /> 58 | <Route path="*" element={<Home />} /> 59 | </Routes> 60 | </main> 61 | </Router> 62 | <hr/> 63 | <Footer/> 64 | </div> 65 | </HelmetProvider> 66 | ); 67 | } 68 | 69 | export default App; 70 | -------------------------------------------------------------------------------- /src/components/Adventures.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | @import '../styles/variables'; 9 | 10 | $adventureItemWidth: 420px; 11 | $adventureItemHeight: 360px; 12 | 13 | $adventureItemWidthMobile: 300px; 14 | $adventureItemHeightMobile: 250px; 15 | 16 | 17 | .adventures { 18 | padding: 70px; 19 | background-color: $white; 20 | color: $black; 21 | text-align: left; 22 | 23 | & > h1 { 24 | padding-bottom: 40px; 25 | } 26 | 27 | & > h1, &> ul { 28 | max-width: $max-width; 29 | margin: 0 auto; 30 | } 31 | } 32 | 33 | .adventure-items { 34 | display: grid; 35 | grid-template-columns: repeat(3, 1fr); 36 | list-style: none; 37 | grid-column-gap: 40px; 38 | } 39 | 40 | .adventure-item { 41 | margin: 0 0 2rem; 42 | } 43 | 44 | .adventure-image-card { 45 | .adventure-item-image { 46 | border-radius: 8px; 47 | width: 100%; 48 | aspect-ratio: 5/4; 49 | object-fit: cover; 50 | object-position: center; 51 | overflow: hidden; 52 | } 53 | } 54 | 55 | .adventure-item-title { 56 | margin-bottom: 5px; 57 | text-transform: capitalize; 58 | font-weight: 500; 59 | line-height: 41px; 60 | } 61 | 62 | .adventure-item-details { 63 | display: flex; 64 | justify-content: flex-start; 65 | column-gap: 8px; 66 | 67 | > div { 68 | display: flex; 69 | align-items: center; 70 | } 71 | 72 | > :not(.adventure-item-price) { 73 | text-transform: capitalize; 74 | } 75 | 76 | .adventure-item-price{ 77 | background: $black; 78 | color: $white; 79 | } 80 | } 81 | 82 | 83 | .card { 84 | padding: 20px 10px; 85 | border-radius: 4px; 86 | font-family: sans-serif; 87 | display: flex; 88 | line-height: 1.5em; 89 | img { 90 | width: 400px; 91 | margin: 0 20px; 92 | } 93 | button { 94 | margin-top: 10px; 95 | } 96 | } 97 | 98 | @media only screen and (max-width: $tablet-breakpoint) { 99 | .adventures { 100 | padding: $tablet-padding; 101 | } 102 | 103 | .adventure-items { 104 | grid-template-columns: repeat(2, 1fr); 105 | } 106 | } 107 | 108 | @media only screen and (max-width: $mobile-breakpoint) { 109 | .adventure-items { 110 | grid-template-columns: 1fr; 111 | } 112 | } -------------------------------------------------------------------------------- /src/logo.svg: -------------------------------------------------------------------------------- 1 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"><g fill="#61DAFB"><path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/><circle cx="420.9" cy="296.5" r="45.7"/><path d="M520.5 78.1z"/></g></svg> -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | <!DOCTYPE html> 2 | <html lang="en"> 3 | 4 | <head> 5 | <meta charset="utf-8" /> 6 | <link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> 7 | <meta name="viewport" content="width=device-width, initial-scale=1" /> 8 | <meta name="theme-color" content="#000000" /> 9 | <meta name="description" content="Web site created using create-react-app" /> 10 | 11 | <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> 12 | <!-- 13 | manifest.json provides metadata used when your web app is installed on a 14 | user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ 15 | --> 16 | <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> 17 | <!-- 18 | Notice the use of %PUBLIC_URL% in the tags above. 19 | It will be replaced with the URL of the `public` folder during the build. 20 | Only files inside the `public` folder can be referenced from the HTML. 21 | 22 | Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will 23 | work correctly both with client-side routing and a non-root public URL. 24 | Learn how to configure a non-root public URL by running `npm run build`. 25 | --> 26 | <script type="application/vnd.adobe.aue.component+json" src="/static/component-definition.json"></script> 27 | <script type="application/vnd.adobe.aue.filter+json" src="/static/filter-definition.json"></script> 28 | <script type="application/vnd.adobe.aue.model+json" src="/static/model-definition.json"></script> 29 | <title>React App 30 | 41 | 42 | 43 | 44 | 45 |
46 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /src/components/base/Accordion.scss: -------------------------------------------------------------------------------- 1 | .accordion { 2 | width: 100%; 3 | border-radius: 8px; 4 | overflow: hidden; 5 | } 6 | 7 | .accordion-item { 8 | border: 1px solid #e0e0e0; 9 | border-bottom: none; 10 | transition: all 0.3s ease; 11 | 12 | &:last-child { 13 | border-bottom: 1px solid #e0e0e0; 14 | } 15 | 16 | &:hover { 17 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); 18 | } 19 | } 20 | 21 | .accordion-item-title { 22 | display: flex; 23 | justify-content: space-between; 24 | align-items: center; 25 | padding: 16px 20px; 26 | cursor: pointer; 27 | user-select: none; 28 | background: #fff; 29 | transition: background-color 0.2s ease; 30 | 31 | &:hover { 32 | background-color: #f5f5f5; 33 | } 34 | 35 | h3 { 36 | margin: 0; 37 | font-size: 18px; 38 | font-weight: 500; 39 | color: #333; 40 | flex: 1; 41 | } 42 | } 43 | 44 | .accordion-item-icon { 45 | display: flex; 46 | align-items: center; 47 | justify-content: center; 48 | width: 24px; 49 | height: 24px; 50 | margin-left: 12px; 51 | transition: transform 0.3s ease; 52 | color: #666; 53 | 54 | svg { 55 | display: block; 56 | } 57 | } 58 | 59 | .accordion-item.is-open .accordion-item-icon { 60 | transform: rotate(180deg); 61 | } 62 | 63 | .accordion-item-content { 64 | max-height: 0; 65 | overflow: hidden; 66 | transition: max-height 0.3s ease; 67 | } 68 | 69 | .accordion-item.is-open .accordion-item-content { 70 | max-height: 2000px; /* Adjust based on your content needs */ 71 | } 72 | 73 | .accordion-item-content-inner { 74 | padding: 20px 20px 20px 20px; 75 | } 76 | 77 | /* Optional: Add animation for smooth expansion */ 78 | @media (prefers-reduced-motion: no-preference) { 79 | .accordion-item-content { 80 | transition: max-height 0.4s cubic-bezier(0.4, 0, 0.2, 1); 81 | } 82 | } 83 | 84 | /* Dark mode support (optional) */ 85 | @media (prefers-color-scheme: dark) { 86 | .accordion-item { 87 | border-color: #424242; 88 | background: #2d2d2d; 89 | } 90 | 91 | .accordion-item-title { 92 | background: #2d2d2d; 93 | 94 | &:hover { 95 | background-color: #3a3a3a; 96 | } 97 | 98 | h3 { 99 | color: #e0e0e0; 100 | } 101 | } 102 | 103 | .accordion-item-icon { 104 | color: #b0b0b0; 105 | } 106 | } 107 | 108 | /* Adobe Universal Editor: Open all accordion items in edit mode */ 109 | html.adobe-ue-edit { 110 | .accordion-item { 111 | .accordion-item-content { 112 | max-height: none !important; 113 | } 114 | 115 | .accordion-item-icon { 116 | transform: rotate(180deg); 117 | } 118 | 119 | .accordion-item-title { 120 | cursor: default; 121 | pointer-events: none; 122 | } 123 | } 124 | } 125 | 126 | -------------------------------------------------------------------------------- /src/components/Articles.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 Adobe 3 | All Rights Reserved. 4 | 5 | NOTICE: Adobe permits you to use, modify, and distribute this file in 6 | accordance with the terms of the Adobe license agreement accompanying 7 | it. 8 | */ 9 | import React from 'react'; 10 | import useGraphQL from '../api/useGraphQL'; 11 | import {Link} from 'react-router-dom'; 12 | import Error from './base/Error'; 13 | import Loading from './base/Loading'; 14 | import "./Articles.scss"; 15 | import { mapJsonRichText } from '../utils/renderRichText'; 16 | import {getImageURL} from "../utils/fetchData"; 17 | 18 | const Article = ({_path, title, synopsis, authorFragment, slug}) => { 19 | const editorProps = { 20 | "data-aue-resource": "urn:aemconnection:" + _path + "/jcr:content/data/master", 21 | "data-aue-type": "reference", 22 | "data-aue-filter": "cf" 23 | }; 24 | return ( 25 |
  • 26 | 31 |
    32 | 33 |

    {title}

    34 | 35 | 36 |

    {`By ${authorFragment.firstName} ${authorFragment.lastName}`}

    37 | { synopsis && 38 |
    39 | {mapJsonRichText(synopsis.json)} 40 |
    41 | } 42 | 43 | 44 | 45 |
    46 | 47 |
  • 48 | ); 49 | }; 50 | 51 | const Articles = () => { 52 | const persistentQuery = 'wknd-shared/articles-all'; 53 | 54 | //Use a custom React Hook to execute the GraphQL query 55 | const { data, errorMessage } = useGraphQL(persistentQuery); 56 | 57 | //If there is an error with the GraphQL query 58 | if(errorMessage) return ; 59 | 60 | //If data is null then return a loading state... 61 | if(!data) return ; 62 | 63 | return ( 64 |
    65 |

    Articles

    66 |
      67 | { 68 | data.articleList.items.map((article, index) => { 69 | return ( 70 |
      71 | ); 72 | }) 73 | } 74 |
    75 |
    76 | ); 77 | 78 | }; 79 | 80 | export default Articles; 81 | 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /src/components/base/Accordion.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import Container from './Container'; 3 | import './Accordion.scss'; 4 | 5 | const AccordionItem = (props) => { 6 | const {resource, data, isOpen, onToggle} = props; 7 | 8 | return( 9 |
    10 |
    11 |

    {data["cq:panelTitle"]}

    12 | 13 | 14 | 15 | 16 | 17 |
    18 |
    19 |
    20 | 21 |
    22 |
    23 |
    24 | ); 25 | } 26 | 27 | 28 | const Accordion = (props) => { 29 | const {resource, type, data} = props; 30 | const [items, setItems] = React.useState([]); 31 | const [openItems, setOpenItems] = React.useState(new Set()); 32 | 33 | React.useEffect(() => { 34 | if(!data) return; 35 | const itemKeys = Object.keys(data).filter((item) => { 36 | return data[item]["sling:resourceType"] === "wknd/components/container"; 37 | }); 38 | setItems(itemKeys); 39 | 40 | // Optionally open the first item by default 41 | if (itemKeys.length > 0) { 42 | setOpenItems(new Set([0])); 43 | } 44 | }, [resource, type, data]); 45 | 46 | const toggleItem = (index) => { 47 | setOpenItems(prev => { 48 | const newSet = new Set(prev); 49 | if (newSet.has(index)) { 50 | newSet.delete(index); 51 | } else { 52 | newSet.add(index); 53 | } 54 | return newSet; 55 | }); 56 | }; 57 | 58 | return ( 59 |
    60 | {items.map((item, index) => ( 61 | toggleItem(index)} 68 | /> 69 | ))} 70 |
    71 | ) 72 | } 73 | 74 | export default Accordion; 75 | -------------------------------------------------------------------------------- /public/static/component-definition.json: -------------------------------------------------------------------------------- 1 | { 2 | "groups": [ 3 | { 4 | "title": "General Components", 5 | "id": "general", 6 | "components": [ 7 | { 8 | "title": "Text", 9 | "id": "text", 10 | "model": "text", 11 | "plugins": { 12 | "aem": { 13 | "page": { 14 | "resourceType": "wknd/components/text", 15 | "template": { 16 | "text": "Default Text" 17 | } 18 | } 19 | } 20 | } 21 | }, 22 | { 23 | "title": "Title", 24 | "id": "title", 25 | "model": "title", 26 | "plugins": { 27 | "aem": { 28 | "page": { 29 | "resourceType": "wknd/components/title", 30 | "template": { 31 | "jcr:title": "Default Title" 32 | } 33 | } 34 | } 35 | } 36 | }, 37 | { 38 | "title": "Image", 39 | "id": "image", 40 | "plugins": { 41 | "aem": { 42 | "page": { 43 | "resourceType": "wknd/components/image", 44 | "template": { 45 | "fileReference": "/content/dam/wknd-shared/en/magazine/arctic-surfing/camp-tent.jpg" 46 | } 47 | } 48 | } 49 | } 50 | }, 51 | { 52 | "title": "Container", 53 | "id": "container", 54 | "filter": "container", 55 | "plugins": { 56 | "aem": { 57 | "page": { 58 | "resourceType": "wknd/components/container" 59 | } 60 | } 61 | } 62 | }, 63 | { 64 | "title": "Accordion Item", 65 | "id": "accordion-item", 66 | "model": "accordion-item", 67 | "plugins": { 68 | "aem": { 69 | "page": { 70 | "resourceType": "wknd/components/container" 71 | } 72 | } 73 | } 74 | } 75 | ] 76 | }, 77 | { 78 | "title": "Advanced Components", 79 | "id": "advanced", 80 | "components": [ 81 | { 82 | "title": "Rich Text", 83 | "id": "richtext", 84 | "model": "richtext", 85 | "plugins": { 86 | "aem": { 87 | "page": { 88 | "resourceType": "wknd/components/text", 89 | "template": { 90 | "textIsRich": true, 91 | "text": "

    Default Richtext

    " 92 | } 93 | } 94 | } 95 | } 96 | }, 97 | { 98 | "title": "Accordion", 99 | "id": "accordion", 100 | "model": "accordion", 101 | "filter": "accordion", 102 | "plugins": { 103 | "aem": { 104 | "page": { 105 | "resourceType": "wknd/components/accordion" 106 | } 107 | } 108 | } 109 | } 110 | ] 111 | } 112 | ] 113 | } 114 | -------------------------------------------------------------------------------- /src/components/Adventures.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | import React from 'react'; 9 | import {Link} from 'react-router-dom'; 10 | import useGraphQL from '../api/useGraphQL'; 11 | import Loading from './base/Loading'; 12 | import "./Adventures.scss"; 13 | import Title from './base/Title'; 14 | import {getImageURL} from "../utils/fetchData"; 15 | 16 | function AdventureItem(props) { 17 | const editorProps = { 18 | "data-aue-resource": "urn:aemconnection:" + props?._path + "/jcr:content/data/master", 19 | "data-aue-type": "reference", 20 | "data-aue-filter": "cf", 21 | "data-aue-label": "Adventure: " + props.title 22 | }; 23 | 24 | //Must have title, path, and image 25 | if(!props || !props._path || !props.title || !props.primaryImage ) { 26 | return null; 27 | } 28 | 29 | return ( 30 |
  • 31 |
    32 | 33 | {props.title} 35 | 36 |
    37 |

    {props.title}

    38 |
    39 |
    40 | {props.tripLength?.toLowerCase()} 43 | 44 |
    45 |
    $ 46 | {props.price} 49 | 50 |
    51 |
    52 |
  • 53 | ); 54 | } 55 | 56 | function Adventures() { 57 | const persistentQuery = 'wknd-shared/adventures-all'; 58 | //Use a custom React Hook to execute the GraphQL query 59 | const { data, errorMessage } = useGraphQL(persistentQuery); 60 | 61 | //If there is an error with the GraphQL query 62 | if(errorMessage) return; 63 | 64 | //If data is null then return a loading state... 65 | if(!data) return ; 66 | 67 | return ( 68 |
    69 | 70 | <ul className="adventure-items"> 71 | { 72 | //Iterate over the returned data items from the query 73 | data.adventureList.items.map((adventure, index) => { 74 | return ( 75 | <AdventureItem key={index} {...adventure} /> 76 | ); 77 | }) 78 | } 79 | </ul> 80 | </section> 81 | ); 82 | } 83 | 84 | export default Adventures; 85 | -------------------------------------------------------------------------------- /src/components/AdventureDetail.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2022 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | @use "sass:math"; 9 | 10 | @import '../styles/variables'; 11 | 12 | .adventure-detail { 13 | padding: 0 80px; 14 | background: $white; 15 | color: $black; 16 | button.dark { 17 | border: none; 18 | color: inherit; 19 | padding: 0; 20 | } 21 | 22 | .adventure-detail-header { 23 | display: flex; 24 | justify-content: space-between; 25 | flex-flow: wrap; 26 | align-items: center; 27 | row-gap: 40px; 28 | padding-bottom: 40px; 29 | .adventure-detail-back-nav { 30 | width: 24px; 31 | flex-basis: 100%; 32 | text-align: left; 33 | display: flex; 34 | align-items: center; 35 | column-gap: 15px; 36 | } 37 | } 38 | > div { 39 | max-width: $max-width; 40 | margin: 0 auto; 41 | } 42 | } 43 | 44 | 45 | 46 | .adventure-detail-content, .adventure-detail-header { 47 | padding: 40px 20%; 48 | } 49 | 50 | .adventure-detail-content { 51 | .adventure-detail-info { 52 | display: flex; 53 | background: $lime; 54 | border-radius: 16px; 55 | align-items: flex-start; 56 | padding: 24px 40px; 57 | column-gap: 80px; 58 | justify-content: space-evenly; 59 | margin: 40px 0; 60 | } 61 | h6 { 62 | color: rgba(0, 0, 0, 0.4); 63 | font-size: 12px; 64 | text-transform: inherit; 65 | margin: 0 0 8px 0; 66 | } 67 | span { 68 | line-height: 24px; 69 | } 70 | } 71 | .adventure-detail-title { 72 | margin: 0; 73 | } 74 | 75 | .adventure-detail-content h2 { 76 | margin-top: 32px; 77 | padding: 0px; 78 | } 79 | 80 | .adventure-detail-primaryimage { 81 | margin: 0 auto; 82 | border-radius: 16px; 83 | aspect-ratio: 16/8; 84 | width: 100%; 85 | } 86 | 87 | .adventure-detail-itinerary h2 { 88 | font-family: $font-family-base; 89 | font-weight: bold; 90 | font-size: $font-size-large; 91 | } 92 | 93 | @media only screen and (max-width: $mobile-breakpoint) { 94 | .adventure-detail-content { 95 | .adventure-detail-info { 96 | flex-direction: column; 97 | align-items: flex-start; 98 | row-gap: 10px; 99 | } 100 | } 101 | } 102 | 103 | @media only screen and (max-width: $tablet-breakpoint) { 104 | .adventure-detail-content, .adventure-detail-header { 105 | padding: 40px 0; 106 | } 107 | } 108 | 109 | /* Contributer Styles */ 110 | $contributor-image-size: 60px; 111 | 112 | .contributor { 113 | width: 100%; 114 | float: left; 115 | margin: 20px 0; 116 | &-image { 117 | width: $contributor-image-size; 118 | height: $contributor-image-size; 119 | border-radius: math.div($contributor-image-size, 2); 120 | object-fit: cover; 121 | float: left; 122 | } 123 | 124 | &-name { 125 | margin-left: $contributor-image-size + 20px; 126 | font-family: $font-family-serif; 127 | } 128 | 129 | &-occupation { 130 | margin-left: $contributor-image-size + 20px; 131 | margin-top: 0em; 132 | } 133 | 134 | &-separator { 135 | border-width: 1px solid $gray-light; 136 | margin-top: 2em; 137 | margin-bottom: 2em; 138 | } 139 | 140 | } -------------------------------------------------------------------------------- /src/components/ArticleDetail.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2022 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | import React from 'react'; 9 | import {Link, useNavigate, useParams} from "react-router-dom"; 10 | import backIcon from '../images/Back.svg'; 11 | import Error from './base/Error'; 12 | import Loading from './base/Loading'; 13 | import {mapJsonRichText} from '../utils/renderRichText'; 14 | import './AdventureDetail.scss'; 15 | import useGraphQL from '../api/useGraphQL'; 16 | import {getArticle} from '../utils/commons'; 17 | import {getImageURL} from "../utils/fetchData"; 18 | 19 | function ArticleDetail({article}) { 20 | 21 | // params hook from React router 22 | const {slug} = useParams(); 23 | const navigate = useNavigate(); 24 | const articleSlug = slug || article; 25 | 26 | const persistentQuery = `wknd-shared/article-by-slug;slug=${articleSlug}`; 27 | 28 | //Use a custom React Hook to execute the GraphQL query 29 | const {data, errorMessage} = useGraphQL(persistentQuery); 30 | 31 | //If there is an error with the GraphQL query 32 | if (errorMessage) return <Error errorMessage={errorMessage}/>; 33 | 34 | //If query response is null then return a loading icon... 35 | if (!data) return <Loading/>; 36 | 37 | //Set adventure properties variable based on graphQL response 38 | const currentArticle = getArticle(data); 39 | 40 | //Must have title, path, and image 41 | if (!currentArticle) { 42 | return <NoArticleFound/>; 43 | } 44 | 45 | const editorProps = { 46 | "data-aue-resource": "urn:aemconnection:" + currentArticle._path + "/jcr:content/data/master", 47 | "data-aue-type": "reference", 48 | "data-aue-filter": "cf" 49 | }; 50 | 51 | return (<div {...editorProps} className="adventure-detail"> 52 | <div class="adventure-detail-header"> 53 | <button className="adventure-detail-back-nav dark" onClick={() => navigate(-1)}> 54 | <img className="Backbutton-icon" src={backIcon} alt="Return"/> Back 55 | </button> 56 | <h1 className="adventure-detail-title" data-aue-prop="title" 57 | data-aue-type="text">{currentArticle.title}</h1> 58 | {/* <span className="pill default" itemProp="title" itemType="text">{currentAdventure.activity}</span> */} 59 | </div> 60 | <ArticleDetailRender {...currentArticle} slug={articleSlug}/> 61 | </div>); 62 | } 63 | 64 | function ArticleDetailRender({ 65 | _path, title, 66 | featuredImage, slug, 67 | main, 68 | authorFragment 69 | }) { 70 | 71 | 72 | return (<div> 73 | <img className="adventure-detail-primaryimage" data-aue-type="media" data-aue-prop="featuredImage" 74 | src={`${getImageURL(featuredImage)}`} alt={title}/> 75 | <div className="adventure-detail-content"> 76 | <div data-aue-prop="main" data-aue-type="richtext">{mapJsonRichText(main.json)}</div> 77 | </div> 78 | </div> 79 | ); 80 | } 81 | 82 | function NoArticleFound() { 83 | return ( 84 | <div className="adventure-detail"> 85 | <Link className="adventure-detail-close-button" to={`/${window.location.search}`}> 86 | <img className="Backbutton-icon" src={backIcon} alt="Return"/> 87 | </Link> 88 | <Error errorMessage="Missing data, article could not be rendered."/> 89 | </div> 90 | ); 91 | } 92 | 93 | export default ArticleDetail; 94 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Adobe Universal Editor Sample App 2 | 3 | ## Using the Sample App 4 | The Sample App is hosted at https://ue-remote-app.adobe.net. 5 | Per Default the content is retrieved and written back to the Adobe Experience Manager as a Cloud Service ( Production ) Demo Environment: 6 | 7 | The default settings from [.env](.env) can be overwritten using Query parameters: 8 | * `authorHost`: host to retrieve data from and update content to; default=https://author-p7452-e12433.adobeaemcloud.com 9 | * `service`: Universal Editor Service endpoint; default Universal Editor default 10 | * `protocol`: protocol to use with backend, can be `aem`, `aem65`, `aemcsLegacy`; default: `aem` 11 | * `cors`: defining which cors.js - connection between Universal Editor and application shall be used. Can be `stage` or empty; default `null/empty`. `stage` will use the cors library hosted on stage, else it will use the production version 12 | 13 | To retrieve content from another environment add `authorHost` as query parameters, e.g. 14 | 15 | [https://ue-remote-app.adobe.net?authorHost=https://author-p7452-e12433.adobeaemcloud.com](https://ue-remote-app.adobe.net?authorHost=https://author-p7452-e12433.adobeaemcloud.com) 16 | 17 | Similarly, if running the Universal Editor App on local dev environment, add `authorHost` as query parameters like this: 18 | 19 | [https://localhost:3000?authorHost=https://localhost:8443&service=https://localhost:8443/universal-editor](https://localhost:3000?authorHost=https://localhost:8443&service=https://localhost:8443/universal-editor) 20 | 21 | ## Run locally 22 | 23 | - AEM 6.5 or AEMCS instance 24 | - Latest WKND Content installed on the AEM instance[https://github.com/adobe/aem-guides-wknd/releases/latest](https://github.com/adobe/aem-guides-wknd/releases/latest) 25 | - AEM configured to run on HTTPS [https://experienceleague.adobe.com/en/docs/experience-manager-learn/foundation/security/use-the-ssl-wizard](https://experienceleague.adobe.com/en/docs/experience-manager-learn/foundation/security/use-the-ssl-wizard) 26 | - `Adobe Granite Token Authentication Handler` configured to set `token.samesite.cookie.attr=Partitioned` 27 | - Remove `X-FRAME-Options=SAMEORIGIN` from `Apache Sling Main Servlet`'s `sling.additional.response.headers` attribute if run locally 28 | - Add policy for `https://localhost:3000` to `Adobe Granite Cross-Origin Resource Sharing Policy`. The default `adobe` configuraiton can be used as blueprint if run local copy of the app 29 | - Follow configuration on [https://github.com/maximilianvoss/universal-editor-service-proxy](https://github.com/maximilianvoss/universal-editor-service-proxy) for local development set up 30 | - Open Universal Editor either 31 | - under AEM domain for AEMCS, e.g. [https://author-p7452-e12433.adobeaemcloud.com/ui#/aem/universal-editor/canvas/](https://author-p7452-e12433.adobeaemcloud.com/ui#/aem/universal-editor/canvas/) 32 | - or on [https://experience.adobe.com/#/aem/editor/canvas/](https://experience.adobe.com/#/aem/editor/canvas/) 33 | - For experience.adobe.com use the `Local Developer Login` to authenticate against your local AEM instance when using a local SDK or AEM 6.5 34 | 35 | ## Available Scripts 36 | 37 | In the project directory, you can run: 38 | 39 | ### `yarn start` 40 | 41 | Runs the app in the development mode.\ 42 | Open [https://localhost:3000](https://localhost:3000) to view it in your browser. 43 | 44 | The page will reload when you make changes.\ 45 | You may also see any lint errors in the console. 46 | 47 | ### `yarn build` 48 | 49 | Builds the app for production to the `dist` folder. 50 | 51 | ### `yarn preview` 52 | 53 | Run the built app in production mode locally to verify the build. 54 | 55 | ### `yarn deploy` 56 | 57 | Build the application and push it to GitHub pages -------------------------------------------------------------------------------- /src/App.scss: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2020 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | /* Normalize */ 9 | @import './styles/variables'; 10 | @import './styles/fonts'; 11 | 12 | body { 13 | background-color: $black; 14 | font-family: $font-family-base; 15 | margin: 0; 16 | padding: 0; 17 | font-size: $font-size-base; 18 | text-align: left; 19 | color: $white; 20 | line-height: $line-height-base; 21 | } 22 | 23 | // Headings 24 | // ------------------------- 25 | 26 | h1, h2, h3, h4, h5, h6, 27 | .h1, .h2, .h3, .h4, .h5, .h6 { 28 | line-height: $line-height-base; 29 | font-weight: 500; 30 | } 31 | 32 | h1, .h1, 33 | h2, .h2, 34 | h3, .h3 { 35 | margin-top: $line-height-computed; 36 | margin-bottom: calc($line-height-computed / 2); 37 | } 38 | 39 | h1, .h1 { font-size: $font-size-h1; } 40 | h2, .h2 { font-size: $font-size-h2; } 41 | h3, .h3 { font-size: $font-size-h3; } 42 | h4, .h4 { font-size: $font-size-h4; } 43 | h5, .h5 { font-size: $font-size-h5; } 44 | h6, .h6 { font-size: $font-size-h6; } 45 | 46 | a { 47 | text-decoration: none; 48 | } 49 | 50 | h1 a, h2 a, h3 a { 51 | color: $text-color; 52 | } 53 | 54 | h1 u, h2 u, h3 u { 55 | text-decoration: none; 56 | border-bottom: 1px #ededed solid; 57 | } 58 | 59 | // Body text 60 | // ------------------------- 61 | 62 | p { 63 | margin: 0 0 calc($line-height-computed / 2); 64 | font-size: $font-size-base; 65 | line-height: $line-height-base + 0.75; 66 | text-align: justify; 67 | } 68 | 69 | a { 70 | cursor: pointer; 71 | } 72 | 73 | ul { 74 | list-style-position: inside; 75 | } 76 | 77 | ol, ul { 78 | padding-left: 0; 79 | margin-bottom: 0; 80 | list-style: none; 81 | } 82 | 83 | hr { 84 | border: none; 85 | border-bottom: 1px solid $gray; 86 | margin: 0; 87 | } 88 | 89 | button { 90 | background-color: $button-color; 91 | color: $black; 92 | padding: 12px 40px; 93 | font-size: $font-size-base; 94 | font-family: $font-family-base; 95 | border: 1px solid $black; 96 | border-radius: 4px; 97 | min-width: 4rem; 98 | margin-right: 1rem; 99 | cursor: pointer; 100 | 101 | &:hover { 102 | background-color: #C4E018; 103 | } 104 | 105 | &:focus, &:active{ 106 | background-color: #ABC123; 107 | } 108 | &.dark { 109 | border: 1px solid $white; 110 | background: inherit; 111 | color: $white; 112 | } 113 | } 114 | 115 | .pill { 116 | padding: 11px 16px 13px; 117 | border-radius: 20px 118 | } 119 | .pill.default { 120 | border: 1px solid #696969; 121 | } 122 | 123 | // Error 124 | .error { 125 | /*position: absolute; 126 | top: 50%; 127 | left: 0;*/ 128 | margin-top: 2em; 129 | width: 100%; 130 | text-align: left; 131 | 132 | &-message { 133 | color: $red; 134 | } 135 | 136 | } 137 | 138 | // Loading 139 | .loading { 140 | position: absolute; 141 | top: 40%; 142 | width: 100%; 143 | left: 0; 144 | text-align: center; 145 | } 146 | 147 | .customfont { 148 | font-family: "Crimson Pro", Arial, sans-serif; 149 | } 150 | 151 | .menu a, .article-item article a:first-child { 152 | color: $white; 153 | } 154 | 155 | .article { 156 | > div { 157 | display: grid; 158 | grid-template-columns: 1fr 2fr; 159 | grid-column-gap: 20px; 160 | } 161 | li { 162 | border: 1px solid #ccc; 163 | border-radius: 10px; 164 | padding: 10px; 165 | display: flex; 166 | flex-direction: column; 167 | margin-bottom: 20px; 168 | img { 169 | align-self: end; 170 | } 171 | } 172 | footer { 173 | width: 80%; 174 | margin-top: 50px; 175 | border-top: 1px solid #ccc; 176 | font-size: 0.75rem; 177 | 178 | > p { 179 | font-size: inherit; 180 | } 181 | } 182 | img { 183 | position:relative; 184 | } 185 | img:after { 186 | content: attr(alt); 187 | color: rgb(100, 100, 100); 188 | position: absolute; 189 | z-index: 1; 190 | left: 0; 191 | width: 100%; 192 | color: #fff; 193 | text-align: center; 194 | background-image: url("./images/wknd-card.jpeg") 195 | } 196 | } 197 | 198 | .header, .footer { 199 | background-color: $black; 200 | color: $white; 201 | display: grid; 202 | align-items: center; 203 | max-width: $max-width; 204 | margin: 0 auto; 205 | .logo { 206 | height: 24px; 207 | } 208 | .menu { 209 | margin: 0; 210 | display: flex; 211 | column-gap: 40px; 212 | } 213 | } 214 | .header { 215 | padding: 0 80px; 216 | justify-items: center; 217 | grid-template-columns: 1fr 4fr 1fr; 218 | a { 219 | justify-self: flex-start; 220 | } 221 | .logo { 222 | margin: 44px 0; 223 | } 224 | button { 225 | white-space: nowrap; 226 | justify-self: flex-end; 227 | margin: 0; 228 | } 229 | } 230 | .footer { 231 | padding: 40px 80px; 232 | grid-template-columns: 1fr 1fr; 233 | nav, small { 234 | justify-self: end; 235 | } 236 | small { 237 | padding: 40px 0; 238 | color: $gray; 239 | grid-column: span 2; 240 | } 241 | } 242 | 243 | .container img { 244 | max-width: 50%; 245 | } 246 | 247 | @media only screen and (max-width: $tablet-breakpoint) { 248 | .header, .footer { 249 | padding: $tablet-padding; 250 | } 251 | .header { 252 | .logo { 253 | margin: 0; 254 | } 255 | } 256 | } 257 | 258 | @media only screen and (max-width: $mobile-breakpoint) { 259 | .header { 260 | button { 261 | display:none; 262 | } 263 | } 264 | .header, .footer { 265 | grid-template-columns: 1fr 1.5fr; 266 | white-space: nowrap; 267 | column-gap: 10px; 268 | } 269 | } -------------------------------------------------------------------------------- /src/utils/renderRichText.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2022 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | import React, { isValidElement, cloneElement } from 'react'; 9 | 10 | /** 11 | * Map of JSON nodeTypes to HTML formats 12 | */ 13 | const defaultNodeMap = { 14 | 'header': (node, children, style) => style[node.style]?.(node, children), 15 | 'paragraph': (node, children) => <p>{children}</p>, 16 | 'span': ({ format } , children) => <span style={format}>{children}</span>, 17 | 'unordered-list': (node, children) => <ul>{children}</ul>, 18 | 'ordered-list': (node, children) => <ol>{children}</ol>, 19 | 'list-item': (node, children) => <li>{children}</li>, 20 | 'table': (node, children) => <table>{children}</table>, 21 | 'table-body': (node, children) => <tbody>{children}</tbody>, 22 | 'table-row': (node, children) => <tr>{children}</tr>, 23 | 'table-data': (node, children) => <td>{children}</td>, 24 | 'link': node => <a href={node.data.href} target={node.data.target}>{node.value}</a>, 25 | 'text': (node, format) => defaultRenderText(node, format), 26 | 'reference': (node) => defaultRenderImage(node), 27 | } 28 | 29 | /** 30 | * Map of JSON format variants to HTML equivalents 31 | */ 32 | const defaultTextFormat = { 33 | 'bold': (value) => <b>{value}</b>, 34 | 'italic': (value) => <i>{value}</i>, 35 | 'underline': (value) => <u>{value}</u>, 36 | 'strong': (value) => <strong>{value}</strong>, 37 | 'emphasis': (value) => <em>{value}</em>, 38 | } 39 | 40 | /** 41 | * Map of Header styles 42 | */ 43 | const defaultHeaderStyle = { 44 | 'h1': (node, children) => <h1>{children}</h1>, 45 | 'h2': (node, children) => <h2>{children}</h2>, 46 | 'h3': (node, children) => <h3>{children}</h3> 47 | } 48 | 49 | /** 50 | * Default renderer of Text nodeTypes 51 | * @param {*} node 52 | * @returns 53 | */ 54 | function defaultRenderText(node, format) { 55 | // iterate over variants array to append formatting 56 | if (node.format?.variants?.length > 0) { 57 | return node.format.variants.reduce((previousValue, currentValue) => { 58 | return format[currentValue]?.(previousValue) ?? null; 59 | }, node.value); 60 | } 61 | // if no formatting, simply return the value of the text 62 | return node.value; 63 | } 64 | 65 | /** 66 | * Renders an image based on a reference 67 | * @param {*} node 68 | */ 69 | function defaultRenderImage(node) { 70 | const mimeType = node.data?.mimetype; 71 | if(mimeType && mimeType.startsWith('image')) { 72 | return <img src={node.data.path} alt={'reference'} /> 73 | } 74 | return null; 75 | } 76 | 77 | /** 78 | * Appends a key to valid React Elements 79 | * (avoids having to pass an index everywhere) 80 | * @param {*} element 81 | * @param {*} key 82 | * @returns 83 | */ 84 | function addKeyToElement(element, key) { 85 | if (isValidElement(element) && element.key === null) { 86 | return cloneElement(element, { key }); 87 | } 88 | return element; 89 | } 90 | 91 | /** 92 | * Iterates over an array of nodes and renders each node 93 | * @param {*} childNodes array of 94 | * @returns 95 | */ 96 | function renderNodeList(childNodes, options) { 97 | if(childNodes && options) { 98 | return childNodes.map((node, index) => { 99 | return addKeyToElement(renderNode(node, options), index); 100 | }); 101 | } 102 | 103 | return null; 104 | } 105 | 106 | /** 107 | * Renders an individual node based on nodeType. 108 | * Makes a recursive call to render any children of the current node (node.content) 109 | * @param {*} node 110 | * @param {*} options 111 | * @returns 112 | */ 113 | function renderNode(node, options) { 114 | const {nodeMap, textFormat, headerStyle} = options; 115 | 116 | // null check 117 | if(!node || !options) { 118 | return null; 119 | } 120 | 121 | const children = node.content ? renderNodeList(node.content, options) : null; 122 | 123 | // special case for header, since it requires processing of header styles 124 | if(node.nodeType === 'header') { 125 | return nodeMap[node.nodeType]?.(node, children, headerStyle); 126 | } 127 | 128 | // special case for text, since it may require formatting (i.e bold, italic, underline) 129 | if(node.nodeType === 'text') { 130 | return nodeMap[node.nodeType]?.(node, textFormat); 131 | } 132 | 133 | // use a map to render the current node based on its nodeType 134 | // pass the children (if they exist) 135 | return nodeMap[node.nodeType]?.(node, children) ?? null; 136 | } 137 | 138 | /** 139 | * Expose the utility as a public function mapJsonRichText. 140 | * Calling functions can choose to override various mappings and/or formatting 141 | * by passing in an `options` object that may contain overrides for `nodeMap`, `textFormat` and `headerStyle` 142 | * @param {*} json - the json response of a Multi Line rich text field 143 | * @param {*} options {nodeMap, - override defaultNodeMap 144 | * textFormat, - override defaultTextFormat 145 | * headerStyle, - override defaultHeaderStyle 146 | * } 147 | * @returns a JSX representation of the JSON object 148 | */ 149 | export function mapJsonRichText(json, options={}) { 150 | // merge options override with default options for nodeMap, textFormat, and headerStyle 151 | return renderNodeList(json , { 152 | nodeMap: { 153 | ...defaultNodeMap, 154 | ...options.nodeMap, 155 | }, 156 | textFormat: { 157 | ...defaultTextFormat, 158 | ...options.textFormat, 159 | }, 160 | headerStyle: { 161 | ...defaultHeaderStyle, 162 | ...options.headerStyle 163 | } 164 | }); 165 | } -------------------------------------------------------------------------------- /src/components/AdventureDetail.jsx: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2022 Adobe 3 | All Rights Reserved. 4 | NOTICE: Adobe permits you to use, modify, and distribute this file in 5 | accordance with the terms of the Adobe license agreement accompanying 6 | it. 7 | */ 8 | import React from 'react'; 9 | import {Link, useNavigate, useParams} from "react-router-dom"; 10 | import backIcon from '../images/Back.svg'; 11 | import Error from './base/Error'; 12 | import Loading from './base/Loading'; 13 | import {mapJsonRichText} from '../utils/renderRichText'; 14 | import './AdventureDetail.scss'; 15 | import useGraphQL from '../api/useGraphQL'; 16 | import {getImageURL} from "../utils/fetchData"; 17 | 18 | function AdventureDetail() { 19 | // params hook from React router 20 | const {slug} = useParams(); 21 | const navigate = useNavigate(); 22 | const persistentQuery = `wknd-shared/adventure-by-slug;slug=${slug}`; 23 | 24 | //Use a custom React Hook to execute the GraphQL query 25 | const {data, errorMessage} = useGraphQL(persistentQuery); 26 | 27 | //If there is an error with the GraphQL query 28 | if (errorMessage) return <Error errorMessage={errorMessage}/>; 29 | 30 | //If query response is null then return a loading icon... 31 | if (!data) return <Loading/>; 32 | 33 | //Set adventure properties variable based on graphQL response 34 | const currentAdventure = getAdventure(data); 35 | 36 | // set references of current adventure 37 | const references = data.adventureList._references; 38 | 39 | //Must have title, path, and image 40 | if (!currentAdventure) { 41 | return <NoAdventureFound/>; 42 | } 43 | 44 | const editorProps = { 45 | "data-aue-resource": "urn:aemconnection:" + currentAdventure._path + "/jcr:content/data/master", 46 | "data-aue-type": "reference", 47 | itemfilter: "cf" 48 | }; 49 | 50 | return ( 51 | <div {...editorProps} className="adventure-detail"> 52 | <div><div className="adventure-detail-header"> 53 | <button className="adventure-detail-back-nav dark" onClick={() => navigate(-1)}> 54 | <img className="Backbutton-icon" src={backIcon} alt="Return"/> Adventures 55 | </button> 56 | <h1 className="adventure-detail-title" data-aue-prop="title" data-aue-type="text">{currentAdventure.title}</h1> 57 | <div className="pill default"> 58 | <span 59 | data-aue-prop="activity" data-aue-type="text" 60 | >{currentAdventure.activity} 61 | </span> 62 | </div> 63 | </div></div> 64 | <AdventureDetailRender {...currentAdventure} references={references}/> 65 | </div> 66 | ); 67 | } 68 | 69 | function AdventureDetailRender({ 70 | title, 71 | primaryImage, 72 | adventureType, 73 | tripLength, 74 | groupSize, 75 | difficulty, 76 | description, 77 | itinerary, references 78 | }) { 79 | return (<div> 80 | <img className="adventure-detail-primaryimage" 81 | src={`${getImageURL(primaryImage)}`} alt={title} data-aue-prop="primaryImage" data-aue-type="media"/> 82 | <div className="adventure-detail-content"> 83 | 84 | <div data-aue-prop="description" 85 | data-aue-type="richtext">{mapJsonRichText(description.json, customRenderOptions(references))}</div> 86 | <div className="adventure-detail-info"> 87 | <div className="adventure-detail-info-label"> 88 | <h6>Adventure Type</h6> 89 | <span 90 | data-aue-prop='adventureType' data-aue-type="text" 91 | >{adventureType}</span> 92 | </div> 93 | <div className="adventure-detail-info-label"> 94 | <h6>Trip Length</h6> 95 | <span 96 | data-aue-prop='tripLength' data-aue-type="text" 97 | >{tripLength}</span> 98 | </div> 99 | <div className="adventure-detail-info-label"> 100 | <h6>Difficulty</h6> 101 | <span 102 | data-aue-prop='difficulty' data-aue-type="text" 103 | >{difficulty}</span> 104 | </div> 105 | <div className="adventure-detail-info-label"> 106 | <h6>Group Size</h6> 107 | <span 108 | data-aue-prop='groupSize' data-aue-type="text" 109 | >{groupSize}</span> 110 | </div> 111 | </div> 112 | <h6>Itinerary</h6> 113 | <div data-aue-prop="itinerary" data-aue-type="richtext" 114 | className="adventure-detail-itinerary">{mapJsonRichText(itinerary.json)}</div> 115 | </div> 116 | 117 | </div> 118 | ); 119 | 120 | } 121 | 122 | function NoAdventureFound() { 123 | return ( 124 | <div className="adventure-detail"> 125 | <Link className="adventure-detail-close-button" to={`/${window.location.search}`}> 126 | <img className="Backbutton-icon" src={backIcon} alt="Return"/> 127 | </Link> 128 | <Error errorMessage="Missing data, adventure could not be rendered."/> 129 | </div> 130 | ); 131 | } 132 | 133 | /** 134 | * Helper function to get the first adventure from the response 135 | * @param {*} response 136 | */ 137 | function getAdventure(data) { 138 | 139 | if (data && data.adventureList && data.adventureList.items) { 140 | return data.adventureList.items.find(item => { 141 | return item._path.startsWith("/content/dam/wknd-shared/en"); 142 | }); 143 | } 144 | return undefined; 145 | } 146 | 147 | /** 148 | * Example of using a custom render for in-line references in a multi line field 149 | */ 150 | function customRenderOptions(references) { 151 | 152 | const renderReference = { 153 | // node contains merged properties of the in-line reference and _references object 154 | 'ImageRef': (node) => { 155 | // when __typename === ImageRef 156 | return <img src={node._path} alt={'in-line reference'}/> 157 | }, 158 | 'AdventureModel': (node) => { 159 | // when __typename === AdventureModel 160 | return <Link to={`/adventure:${node.slug}`}>{`${node.title}: ${node.price}`}</Link>; 161 | } 162 | }; 163 | 164 | return { 165 | nodeMap: { 166 | 'reference': (node, children) => { 167 | 168 | // variable for reference in _references object 169 | let reference; 170 | 171 | // asset reference 172 | if (node.data.path) { 173 | // find reference based on path 174 | reference = references.find(ref => ref._path === node.data.path); 175 | } 176 | // Fragment Reference 177 | if (node.data.href) { 178 | // find in-line reference within _references array based on href and _path properties 179 | reference = references.find(ref => ref._path === node.data.href); 180 | } 181 | 182 | // if reference found return render method of it 183 | return reference ? renderReference[reference.__typename]({...reference, ...node}) : null; 184 | } 185 | }, 186 | }; 187 | } 188 | 189 | export default AdventureDetail; 190 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@adobe/aem-headless-client-js@4.0.0", "@adobe/aem-headless-client-js@^4.0.0": 6 | version "4.0.0" 7 | resolved "https://registry.yarnpkg.com/@adobe/aem-headless-client-js/-/aem-headless-client-js-4.0.0.tgz#cce016fc7d9168a5707dcfedff7d5299074714ea" 8 | integrity sha512-jpFDmym/cjJb54lYjTpQfmP3jyueXlPPI7oQM4852V9v0Ak6F3A3fv+6Bq/CvNGyULza1G6NsZ7gzaSjApxcaA== 9 | dependencies: 10 | "@adobe/aio-lib-core-errors" "4.0.1" 11 | 12 | "@adobe/aem-headless-client-nodejs@^2.0.0": 13 | version "2.0.1" 14 | resolved "https://registry.yarnpkg.com/@adobe/aem-headless-client-nodejs/-/aem-headless-client-nodejs-2.0.1.tgz#4fb4f5867f79c24c99866c3be63744d82104a988" 15 | integrity sha512-cTgSgBSsuvRiZSDDX9A1LLIwZkJ7OkrUT4MgbyrJtwy7FYS+YsEa7aoxCyGx9ivCcbUHLBdlGX3ouY8D6ml/IA== 16 | dependencies: 17 | "@adobe/aem-headless-client-js" "4.0.0" 18 | "@adobe/aio-lib-core-logging" "3.0.2" 19 | "@adobe/aio-lib-core-networking" "5.0.4" 20 | jsonwebtoken "^9.0.2" 21 | 22 | "@adobe/aio-lib-core-config@^5.0.0": 23 | version "5.0.1" 24 | resolved "https://registry.yarnpkg.com/@adobe/aio-lib-core-config/-/aio-lib-core-config-5.0.1.tgz#a04292012a55296a0228333ccb458bfeb4278330" 25 | integrity sha512-OQmQublmy/uXM1HC6qXfxSAXEl85nExh/yiajlEfJheKuJ9iPWwVWXR5vBHVVDlOXgWEVMWRUQPMIUu1lmR5lA== 26 | dependencies: 27 | debug "^4.1.1" 28 | deepmerge "^4.0.0" 29 | dotenv "16.3.1" 30 | hjson "^3.1.2" 31 | js-yaml "^4.1.0" 32 | 33 | "@adobe/aio-lib-core-errors@4.0.1", "@adobe/aio-lib-core-errors@^4.0.0": 34 | version "4.0.1" 35 | resolved "https://registry.yarnpkg.com/@adobe/aio-lib-core-errors/-/aio-lib-core-errors-4.0.1.tgz#535457e43fa626350c0425a15b95dd1fc7990c2f" 36 | integrity sha512-zrQm9TJh13wEHH5O2TQAUQvYGGe01R9DHzKy+b6B0URbl2lcuqXyNiUx896lpcgXD2bzUoH7ARRH97aCW2tlfw== 37 | 38 | "@adobe/aio-lib-core-logging@3.0.2", "@adobe/aio-lib-core-logging@^3.0.0": 39 | version "3.0.2" 40 | resolved "https://registry.yarnpkg.com/@adobe/aio-lib-core-logging/-/aio-lib-core-logging-3.0.2.tgz#95111ddee9b53deaa16f7a46e21933e6aaa15aae" 41 | integrity sha512-f6f9IspB7FjpyGiL7eqUKgBkhZukwDnkPXDhGhYLCjrP3dr+jQnK3uQh9VXZoH4SIWcnpayMUTKZsbDs3WXC+g== 42 | dependencies: 43 | debug "^4.1.1" 44 | winston "^3.2.1" 45 | 46 | "@adobe/aio-lib-core-networking@5.0.4": 47 | version "5.0.4" 48 | resolved "https://registry.yarnpkg.com/@adobe/aio-lib-core-networking/-/aio-lib-core-networking-5.0.4.tgz#9446ceed3aca6431d97306b992699655df544c1a" 49 | integrity sha512-LsFPKIXqfWiMwSjD9NJbb6uUSlZ+DZiV8p9NhpqPyzqAAl9NNONAH0jcIKtsKWSULcHc20INaRAw8dqKzQBTbw== 50 | dependencies: 51 | "@adobe/aio-lib-core-config" "^5.0.0" 52 | "@adobe/aio-lib-core-errors" "^4.0.0" 53 | "@adobe/aio-lib-core-logging" "^3.0.0" 54 | fetch-retry "^6.0.0" 55 | http-proxy-agent "^7" 56 | https-proxy-agent "^7" 57 | node-fetch "^2.6.4" 58 | proxy-from-env "^1.1.0" 59 | 60 | "@babel/code-frame@^7.27.1": 61 | version "7.27.1" 62 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" 63 | integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== 64 | dependencies: 65 | "@babel/helper-validator-identifier" "^7.27.1" 66 | js-tokens "^4.0.0" 67 | picocolors "^1.1.1" 68 | 69 | "@babel/compat-data@^7.27.2": 70 | version "7.28.5" 71 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f" 72 | integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== 73 | 74 | "@babel/core@^7.28.0": 75 | version "7.28.5" 76 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.5.tgz#4c81b35e51e1b734f510c99b07dfbc7bbbb48f7e" 77 | integrity sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== 78 | dependencies: 79 | "@babel/code-frame" "^7.27.1" 80 | "@babel/generator" "^7.28.5" 81 | "@babel/helper-compilation-targets" "^7.27.2" 82 | "@babel/helper-module-transforms" "^7.28.3" 83 | "@babel/helpers" "^7.28.4" 84 | "@babel/parser" "^7.28.5" 85 | "@babel/template" "^7.27.2" 86 | "@babel/traverse" "^7.28.5" 87 | "@babel/types" "^7.28.5" 88 | "@jridgewell/remapping" "^2.3.5" 89 | convert-source-map "^2.0.0" 90 | debug "^4.1.0" 91 | gensync "^1.0.0-beta.2" 92 | json5 "^2.2.3" 93 | semver "^6.3.1" 94 | 95 | "@babel/generator@^7.28.5": 96 | version "7.28.5" 97 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.5.tgz#712722d5e50f44d07bc7ac9fe84438742dd61298" 98 | integrity sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== 99 | dependencies: 100 | "@babel/parser" "^7.28.5" 101 | "@babel/types" "^7.28.5" 102 | "@jridgewell/gen-mapping" "^0.3.12" 103 | "@jridgewell/trace-mapping" "^0.3.28" 104 | jsesc "^3.0.2" 105 | 106 | "@babel/helper-compilation-targets@^7.27.2": 107 | version "7.27.2" 108 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" 109 | integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== 110 | dependencies: 111 | "@babel/compat-data" "^7.27.2" 112 | "@babel/helper-validator-option" "^7.27.1" 113 | browserslist "^4.24.0" 114 | lru-cache "^5.1.1" 115 | semver "^6.3.1" 116 | 117 | "@babel/helper-globals@^7.28.0": 118 | version "7.28.0" 119 | resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" 120 | integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== 121 | 122 | "@babel/helper-module-imports@^7.27.1": 123 | version "7.27.1" 124 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" 125 | integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== 126 | dependencies: 127 | "@babel/traverse" "^7.27.1" 128 | "@babel/types" "^7.27.1" 129 | 130 | "@babel/helper-module-transforms@^7.28.3": 131 | version "7.28.3" 132 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" 133 | integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== 134 | dependencies: 135 | "@babel/helper-module-imports" "^7.27.1" 136 | "@babel/helper-validator-identifier" "^7.27.1" 137 | "@babel/traverse" "^7.28.3" 138 | 139 | "@babel/helper-plugin-utils@^7.27.1": 140 | version "7.27.1" 141 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" 142 | integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== 143 | 144 | "@babel/helper-string-parser@^7.27.1": 145 | version "7.27.1" 146 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" 147 | integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== 148 | 149 | "@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": 150 | version "7.28.5" 151 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" 152 | integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== 153 | 154 | "@babel/helper-validator-option@^7.27.1": 155 | version "7.27.1" 156 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" 157 | integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== 158 | 159 | "@babel/helpers@^7.28.4": 160 | version "7.28.4" 161 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" 162 | integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== 163 | dependencies: 164 | "@babel/template" "^7.27.2" 165 | "@babel/types" "^7.28.4" 166 | 167 | "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.2", "@babel/parser@^7.28.5": 168 | version "7.28.5" 169 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.5.tgz#0b0225ee90362f030efd644e8034c99468893b08" 170 | integrity sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== 171 | dependencies: 172 | "@babel/types" "^7.28.5" 173 | 174 | "@babel/plugin-transform-react-jsx-self@^7.27.1": 175 | version "7.27.1" 176 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" 177 | integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== 178 | dependencies: 179 | "@babel/helper-plugin-utils" "^7.27.1" 180 | 181 | "@babel/plugin-transform-react-jsx-source@^7.27.1": 182 | version "7.27.1" 183 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" 184 | integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== 185 | dependencies: 186 | "@babel/helper-plugin-utils" "^7.27.1" 187 | 188 | "@babel/template@^7.27.2": 189 | version "7.27.2" 190 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" 191 | integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== 192 | dependencies: 193 | "@babel/code-frame" "^7.27.1" 194 | "@babel/parser" "^7.27.2" 195 | "@babel/types" "^7.27.1" 196 | 197 | "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.5": 198 | version "7.28.5" 199 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.5.tgz#450cab9135d21a7a2ca9d2d35aa05c20e68c360b" 200 | integrity sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== 201 | dependencies: 202 | "@babel/code-frame" "^7.27.1" 203 | "@babel/generator" "^7.28.5" 204 | "@babel/helper-globals" "^7.28.0" 205 | "@babel/parser" "^7.28.5" 206 | "@babel/template" "^7.27.2" 207 | "@babel/types" "^7.28.5" 208 | debug "^4.3.1" 209 | 210 | "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.28.5": 211 | version "7.28.5" 212 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b" 213 | integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== 214 | dependencies: 215 | "@babel/helper-string-parser" "^7.27.1" 216 | "@babel/helper-validator-identifier" "^7.28.5" 217 | 218 | "@colors/colors@1.6.0", "@colors/colors@^1.6.0": 219 | version "1.6.0" 220 | resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0" 221 | integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== 222 | 223 | "@dabh/diagnostics@^2.0.8": 224 | version "2.0.8" 225 | resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.8.tgz#ead97e72ca312cf0e6dd7af0d300b58993a31a5e" 226 | integrity sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q== 227 | dependencies: 228 | "@so-ric/colorspace" "^1.1.6" 229 | enabled "2.0.x" 230 | kuler "^2.0.0" 231 | 232 | "@esbuild/aix-ppc64@0.21.5": 233 | version "0.21.5" 234 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" 235 | integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== 236 | 237 | "@esbuild/android-arm64@0.21.5": 238 | version "0.21.5" 239 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" 240 | integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== 241 | 242 | "@esbuild/android-arm@0.21.5": 243 | version "0.21.5" 244 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" 245 | integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== 246 | 247 | "@esbuild/android-x64@0.21.5": 248 | version "0.21.5" 249 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" 250 | integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== 251 | 252 | "@esbuild/darwin-arm64@0.21.5": 253 | version "0.21.5" 254 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" 255 | integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== 256 | 257 | "@esbuild/darwin-x64@0.21.5": 258 | version "0.21.5" 259 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" 260 | integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== 261 | 262 | "@esbuild/freebsd-arm64@0.21.5": 263 | version "0.21.5" 264 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" 265 | integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== 266 | 267 | "@esbuild/freebsd-x64@0.21.5": 268 | version "0.21.5" 269 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" 270 | integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== 271 | 272 | "@esbuild/linux-arm64@0.21.5": 273 | version "0.21.5" 274 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" 275 | integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== 276 | 277 | "@esbuild/linux-arm@0.21.5": 278 | version "0.21.5" 279 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" 280 | integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== 281 | 282 | "@esbuild/linux-ia32@0.21.5": 283 | version "0.21.5" 284 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" 285 | integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== 286 | 287 | "@esbuild/linux-loong64@0.21.5": 288 | version "0.21.5" 289 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" 290 | integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== 291 | 292 | "@esbuild/linux-mips64el@0.21.5": 293 | version "0.21.5" 294 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" 295 | integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== 296 | 297 | "@esbuild/linux-ppc64@0.21.5": 298 | version "0.21.5" 299 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" 300 | integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== 301 | 302 | "@esbuild/linux-riscv64@0.21.5": 303 | version "0.21.5" 304 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" 305 | integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== 306 | 307 | "@esbuild/linux-s390x@0.21.5": 308 | version "0.21.5" 309 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" 310 | integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== 311 | 312 | "@esbuild/linux-x64@0.21.5": 313 | version "0.21.5" 314 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" 315 | integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== 316 | 317 | "@esbuild/netbsd-x64@0.21.5": 318 | version "0.21.5" 319 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" 320 | integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== 321 | 322 | "@esbuild/openbsd-x64@0.21.5": 323 | version "0.21.5" 324 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" 325 | integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== 326 | 327 | "@esbuild/sunos-x64@0.21.5": 328 | version "0.21.5" 329 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" 330 | integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== 331 | 332 | "@esbuild/win32-arm64@0.21.5": 333 | version "0.21.5" 334 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" 335 | integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== 336 | 337 | "@esbuild/win32-ia32@0.21.5": 338 | version "0.21.5" 339 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" 340 | integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== 341 | 342 | "@esbuild/win32-x64@0.21.5": 343 | version "0.21.5" 344 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" 345 | integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== 346 | 347 | "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": 348 | version "0.3.13" 349 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" 350 | integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== 351 | dependencies: 352 | "@jridgewell/sourcemap-codec" "^1.5.0" 353 | "@jridgewell/trace-mapping" "^0.3.24" 354 | 355 | "@jridgewell/remapping@^2.3.5": 356 | version "2.3.5" 357 | resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" 358 | integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== 359 | dependencies: 360 | "@jridgewell/gen-mapping" "^0.3.5" 361 | "@jridgewell/trace-mapping" "^0.3.24" 362 | 363 | "@jridgewell/resolve-uri@^3.1.0": 364 | version "3.1.2" 365 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" 366 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 367 | 368 | "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": 369 | version "1.5.5" 370 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" 371 | integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== 372 | 373 | "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": 374 | version "0.3.31" 375 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" 376 | integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== 377 | dependencies: 378 | "@jridgewell/resolve-uri" "^3.1.0" 379 | "@jridgewell/sourcemap-codec" "^1.4.14" 380 | 381 | "@nodelib/fs.scandir@2.1.5": 382 | version "2.1.5" 383 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 384 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 385 | dependencies: 386 | "@nodelib/fs.stat" "2.0.5" 387 | run-parallel "^1.1.9" 388 | 389 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 390 | version "2.0.5" 391 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 392 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 393 | 394 | "@nodelib/fs.walk@^1.2.3": 395 | version "1.2.8" 396 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 397 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 398 | dependencies: 399 | "@nodelib/fs.scandir" "2.1.5" 400 | fastq "^1.6.0" 401 | 402 | "@parcel/watcher-android-arm64@2.5.1": 403 | version "2.5.1" 404 | resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" 405 | integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== 406 | 407 | "@parcel/watcher-darwin-arm64@2.5.1": 408 | version "2.5.1" 409 | resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz#3d26dce38de6590ef79c47ec2c55793c06ad4f67" 410 | integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== 411 | 412 | "@parcel/watcher-darwin-x64@2.5.1": 413 | version "2.5.1" 414 | resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" 415 | integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== 416 | 417 | "@parcel/watcher-freebsd-x64@2.5.1": 418 | version "2.5.1" 419 | resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" 420 | integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== 421 | 422 | "@parcel/watcher-linux-arm-glibc@2.5.1": 423 | version "2.5.1" 424 | resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" 425 | integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== 426 | 427 | "@parcel/watcher-linux-arm-musl@2.5.1": 428 | version "2.5.1" 429 | resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" 430 | integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== 431 | 432 | "@parcel/watcher-linux-arm64-glibc@2.5.1": 433 | version "2.5.1" 434 | resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" 435 | integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== 436 | 437 | "@parcel/watcher-linux-arm64-musl@2.5.1": 438 | version "2.5.1" 439 | resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" 440 | integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== 441 | 442 | "@parcel/watcher-linux-x64-glibc@2.5.1": 443 | version "2.5.1" 444 | resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" 445 | integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== 446 | 447 | "@parcel/watcher-linux-x64-musl@2.5.1": 448 | version "2.5.1" 449 | resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" 450 | integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== 451 | 452 | "@parcel/watcher-win32-arm64@2.5.1": 453 | version "2.5.1" 454 | resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" 455 | integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== 456 | 457 | "@parcel/watcher-win32-ia32@2.5.1": 458 | version "2.5.1" 459 | resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" 460 | integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== 461 | 462 | "@parcel/watcher-win32-x64@2.5.1": 463 | version "2.5.1" 464 | resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" 465 | integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== 466 | 467 | "@parcel/watcher@^2.4.1": 468 | version "2.5.1" 469 | resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.5.1.tgz#342507a9cfaaf172479a882309def1e991fb1200" 470 | integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== 471 | dependencies: 472 | detect-libc "^1.0.3" 473 | is-glob "^4.0.3" 474 | micromatch "^4.0.5" 475 | node-addon-api "^7.0.0" 476 | optionalDependencies: 477 | "@parcel/watcher-android-arm64" "2.5.1" 478 | "@parcel/watcher-darwin-arm64" "2.5.1" 479 | "@parcel/watcher-darwin-x64" "2.5.1" 480 | "@parcel/watcher-freebsd-x64" "2.5.1" 481 | "@parcel/watcher-linux-arm-glibc" "2.5.1" 482 | "@parcel/watcher-linux-arm-musl" "2.5.1" 483 | "@parcel/watcher-linux-arm64-glibc" "2.5.1" 484 | "@parcel/watcher-linux-arm64-musl" "2.5.1" 485 | "@parcel/watcher-linux-x64-glibc" "2.5.1" 486 | "@parcel/watcher-linux-x64-musl" "2.5.1" 487 | "@parcel/watcher-win32-arm64" "2.5.1" 488 | "@parcel/watcher-win32-ia32" "2.5.1" 489 | "@parcel/watcher-win32-x64" "2.5.1" 490 | 491 | "@rolldown/pluginutils@1.0.0-beta.27": 492 | version "1.0.0-beta.27" 493 | resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz#47d2bf4cef6d470b22f5831b420f8964e0bf755f" 494 | integrity sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA== 495 | 496 | "@rollup/rollup-android-arm-eabi@4.53.3": 497 | version "4.53.3" 498 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.3.tgz#7e478b66180c5330429dd161bf84dad66b59c8eb" 499 | integrity sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w== 500 | 501 | "@rollup/rollup-android-arm64@4.53.3": 502 | version "4.53.3" 503 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.3.tgz#2b025510c53a5e3962d3edade91fba9368c9d71c" 504 | integrity sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w== 505 | 506 | "@rollup/rollup-darwin-arm64@4.53.3": 507 | version "4.53.3" 508 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.3.tgz#3577c38af68ccf34c03e84f476bfd526abca10a0" 509 | integrity sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA== 510 | 511 | "@rollup/rollup-darwin-x64@4.53.3": 512 | version "4.53.3" 513 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.3.tgz#2bf5f2520a1f3b551723d274b9669ba5b75ed69c" 514 | integrity sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ== 515 | 516 | "@rollup/rollup-freebsd-arm64@4.53.3": 517 | version "4.53.3" 518 | resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.3.tgz#4bb9cc80252564c158efc0710153c71633f1927c" 519 | integrity sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w== 520 | 521 | "@rollup/rollup-freebsd-x64@4.53.3": 522 | version "4.53.3" 523 | resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.3.tgz#2301289094d49415a380cf942219ae9d8b127440" 524 | integrity sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q== 525 | 526 | "@rollup/rollup-linux-arm-gnueabihf@4.53.3": 527 | version "4.53.3" 528 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.3.tgz#1d03d776f2065e09fc141df7d143476e94acca88" 529 | integrity sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw== 530 | 531 | "@rollup/rollup-linux-arm-musleabihf@4.53.3": 532 | version "4.53.3" 533 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.3.tgz#8623de0e040b2fd52a541c602688228f51f96701" 534 | integrity sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg== 535 | 536 | "@rollup/rollup-linux-arm64-gnu@4.53.3": 537 | version "4.53.3" 538 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz#ce2d1999bc166277935dde0301cde3dd0417fb6e" 539 | integrity sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w== 540 | 541 | "@rollup/rollup-linux-arm64-musl@4.53.3": 542 | version "4.53.3" 543 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz#88c2523778444da952651a2219026416564a4899" 544 | integrity sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A== 545 | 546 | "@rollup/rollup-linux-loong64-gnu@4.53.3": 547 | version "4.53.3" 548 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.3.tgz#578ca2220a200ac4226c536c10c8cc6e4f276714" 549 | integrity sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g== 550 | 551 | "@rollup/rollup-linux-ppc64-gnu@4.53.3": 552 | version "4.53.3" 553 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.3.tgz#aa338d3effd4168a20a5023834a74ba2c3081293" 554 | integrity sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw== 555 | 556 | "@rollup/rollup-linux-riscv64-gnu@4.53.3": 557 | version "4.53.3" 558 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.3.tgz#16ba582f9f6cff58119aa242782209b1557a1508" 559 | integrity sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g== 560 | 561 | "@rollup/rollup-linux-riscv64-musl@4.53.3": 562 | version "4.53.3" 563 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.3.tgz#e404a77ebd6378483888b8064c703adb011340ab" 564 | integrity sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A== 565 | 566 | "@rollup/rollup-linux-s390x-gnu@4.53.3": 567 | version "4.53.3" 568 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.3.tgz#92ad52d306227c56bec43d96ad2164495437ffe6" 569 | integrity sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg== 570 | 571 | "@rollup/rollup-linux-x64-gnu@4.53.3": 572 | version "4.53.3" 573 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz#fd0dea3bb9aa07e7083579f25e1c2285a46cb9fa" 574 | integrity sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w== 575 | 576 | "@rollup/rollup-linux-x64-musl@4.53.3": 577 | version "4.53.3" 578 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.3.tgz#37a3efb09f18d555f8afc490e1f0444885de8951" 579 | integrity sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q== 580 | 581 | "@rollup/rollup-openharmony-arm64@4.53.3": 582 | version "4.53.3" 583 | resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.3.tgz#c489bec9f4f8320d42c9b324cca220c90091c1f7" 584 | integrity sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw== 585 | 586 | "@rollup/rollup-win32-arm64-msvc@4.53.3": 587 | version "4.53.3" 588 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.3.tgz#152832b5f79dc22d1606fac3db946283601b7080" 589 | integrity sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw== 590 | 591 | "@rollup/rollup-win32-ia32-msvc@4.53.3": 592 | version "4.53.3" 593 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.3.tgz#54d91b2bb3bf3e9f30d32b72065a4e52b3a172a5" 594 | integrity sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA== 595 | 596 | "@rollup/rollup-win32-x64-gnu@4.53.3": 597 | version "4.53.3" 598 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.3.tgz#df9df03e61a003873efec8decd2034e7f135c71e" 599 | integrity sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg== 600 | 601 | "@rollup/rollup-win32-x64-msvc@4.53.3": 602 | version "4.53.3" 603 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.3.tgz#38ae84f4c04226c1d56a3b17296ef1e0460ecdfe" 604 | integrity sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ== 605 | 606 | "@so-ric/colorspace@^1.1.6": 607 | version "1.1.6" 608 | resolved "https://registry.yarnpkg.com/@so-ric/colorspace/-/colorspace-1.1.6.tgz#62515d8b9f27746b76950a83bde1af812d91923b" 609 | integrity sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw== 610 | dependencies: 611 | color "^5.0.2" 612 | text-hex "1.0.x" 613 | 614 | "@types/babel__core@^7.20.5": 615 | version "7.20.5" 616 | resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" 617 | integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== 618 | dependencies: 619 | "@babel/parser" "^7.20.7" 620 | "@babel/types" "^7.20.7" 621 | "@types/babel__generator" "*" 622 | "@types/babel__template" "*" 623 | "@types/babel__traverse" "*" 624 | 625 | "@types/babel__generator@*": 626 | version "7.27.0" 627 | resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" 628 | integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== 629 | dependencies: 630 | "@babel/types" "^7.0.0" 631 | 632 | "@types/babel__template@*": 633 | version "7.4.4" 634 | resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" 635 | integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== 636 | dependencies: 637 | "@babel/parser" "^7.1.0" 638 | "@babel/types" "^7.0.0" 639 | 640 | "@types/babel__traverse@*": 641 | version "7.28.0" 642 | resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" 643 | integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== 644 | dependencies: 645 | "@babel/types" "^7.28.2" 646 | 647 | "@types/estree@1.0.8": 648 | version "1.0.8" 649 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" 650 | integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== 651 | 652 | "@types/prop-types@*": 653 | version "15.7.15" 654 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.15.tgz#e6e5a86d602beaca71ce5163fadf5f95d70931c7" 655 | integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== 656 | 657 | "@types/react-dom@^18.2.17": 658 | version "18.3.7" 659 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.3.7.tgz#b89ddf2cd83b4feafcc4e2ea41afdfb95a0d194f" 660 | integrity sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ== 661 | 662 | "@types/react@^18.2.43": 663 | version "18.3.27" 664 | resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.27.tgz#74a3b590ea183983dc65a474dc17553ae1415c34" 665 | integrity sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w== 666 | dependencies: 667 | "@types/prop-types" "*" 668 | csstype "^3.2.2" 669 | 670 | "@types/triple-beam@^1.3.2": 671 | version "1.3.5" 672 | resolved "https://registry.yarnpkg.com/@types/triple-beam/-/triple-beam-1.3.5.tgz#74fef9ffbaa198eb8b588be029f38b00299caa2c" 673 | integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== 674 | 675 | "@vitejs/plugin-basic-ssl@^2.1.0": 676 | version "2.1.0" 677 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz#c70d2a922bc437f154089d7ef0505db4b383eb7b" 678 | integrity sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA== 679 | 680 | "@vitejs/plugin-react@^4.2.1": 681 | version "4.7.0" 682 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz#647af4e7bb75ad3add578e762ad984b90f4a24b9" 683 | integrity sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA== 684 | dependencies: 685 | "@babel/core" "^7.28.0" 686 | "@babel/plugin-transform-react-jsx-self" "^7.27.1" 687 | "@babel/plugin-transform-react-jsx-source" "^7.27.1" 688 | "@rolldown/pluginutils" "1.0.0-beta.27" 689 | "@types/babel__core" "^7.20.5" 690 | react-refresh "^0.17.0" 691 | 692 | agent-base@^7.1.0, agent-base@^7.1.2: 693 | version "7.1.4" 694 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8" 695 | integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== 696 | 697 | argparse@^2.0.1: 698 | version "2.0.1" 699 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 700 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 701 | 702 | array-union@^2.1.0: 703 | version "2.1.0" 704 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 705 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 706 | 707 | async@^3.2.3, async@^3.2.4: 708 | version "3.2.6" 709 | resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" 710 | integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== 711 | 712 | baseline-browser-mapping@^2.8.25: 713 | version "2.8.29" 714 | resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.29.tgz#d8800b71399c783cb1bf2068c2bcc3b6cfd7892c" 715 | integrity sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA== 716 | 717 | braces@^3.0.3: 718 | version "3.0.3" 719 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 720 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 721 | dependencies: 722 | fill-range "^7.1.1" 723 | 724 | browserslist@^4.24.0: 725 | version "4.28.0" 726 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.0.tgz#9cefece0a386a17a3cd3d22ebf67b9deca1b5929" 727 | integrity sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ== 728 | dependencies: 729 | baseline-browser-mapping "^2.8.25" 730 | caniuse-lite "^1.0.30001754" 731 | electron-to-chromium "^1.5.249" 732 | node-releases "^2.0.27" 733 | update-browserslist-db "^1.1.4" 734 | 735 | buffer-equal-constant-time@^1.0.1: 736 | version "1.0.1" 737 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 738 | integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== 739 | 740 | caniuse-lite@^1.0.30001754: 741 | version "1.0.30001756" 742 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001756.tgz#fe80104631102f88e58cad8aa203a2c3e5ec9ebd" 743 | integrity sha512-4HnCNKbMLkLdhJz3TToeVWHSnfJvPaq6vu/eRP0Ahub/07n484XHhBF5AJoSGHdVrS8tKFauUQz8Bp9P7LVx7A== 744 | 745 | chokidar@^4.0.0: 746 | version "4.0.3" 747 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" 748 | integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== 749 | dependencies: 750 | readdirp "^4.0.1" 751 | 752 | color-convert@^3.1.3: 753 | version "3.1.3" 754 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-3.1.3.tgz#db6627b97181cb8facdfce755ae26f97ab0711f1" 755 | integrity sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg== 756 | dependencies: 757 | color-name "^2.0.0" 758 | 759 | color-name@^2.0.0: 760 | version "2.1.0" 761 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-2.1.0.tgz#0b677385c1c4b4edfdeaf77e38fa338e3a40b693" 762 | integrity sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg== 763 | 764 | color-string@^2.1.3: 765 | version "2.1.4" 766 | resolved "https://registry.yarnpkg.com/color-string/-/color-string-2.1.4.tgz#9dcf566ff976e23368c8bd673f5c35103ab41058" 767 | integrity sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg== 768 | dependencies: 769 | color-name "^2.0.0" 770 | 771 | color@^5.0.2: 772 | version "5.0.3" 773 | resolved "https://registry.yarnpkg.com/color/-/color-5.0.3.tgz#f79390b1b778e222ffbb54304d3dbeaef633f97f" 774 | integrity sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA== 775 | dependencies: 776 | color-convert "^3.1.3" 777 | color-string "^2.1.3" 778 | 779 | commander@^13.0.0: 780 | version "13.1.0" 781 | resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" 782 | integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== 783 | 784 | commondir@^1.0.1: 785 | version "1.0.1" 786 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 787 | integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== 788 | 789 | convert-source-map@^2.0.0: 790 | version "2.0.0" 791 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" 792 | integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== 793 | 794 | cookie@^1.0.1: 795 | version "1.0.2" 796 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" 797 | integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== 798 | 799 | csstype@^3.2.2: 800 | version "3.2.3" 801 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" 802 | integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== 803 | 804 | debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4: 805 | version "4.4.3" 806 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" 807 | integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== 808 | dependencies: 809 | ms "^2.1.3" 810 | 811 | deepmerge@^4.0.0: 812 | version "4.3.1" 813 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" 814 | integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== 815 | 816 | detect-libc@^1.0.3: 817 | version "1.0.3" 818 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 819 | integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== 820 | 821 | dir-glob@^3.0.1: 822 | version "3.0.1" 823 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 824 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 825 | dependencies: 826 | path-type "^4.0.0" 827 | 828 | dotenv@16.3.1: 829 | version "16.3.1" 830 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" 831 | integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== 832 | 833 | ecdsa-sig-formatter@1.0.11: 834 | version "1.0.11" 835 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 836 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 837 | dependencies: 838 | safe-buffer "^5.0.1" 839 | 840 | electron-to-chromium@^1.5.249: 841 | version "1.5.256" 842 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.256.tgz#f07f78de0893ab060f60ac897195c029a3b50d1a" 843 | integrity sha512-uqYq1IQhpXXLX+HgiXdyOZml7spy4xfy42yPxcCCRjswp0fYM2X+JwCON07lqnpLEGVCj739B7Yr+FngmHBMEQ== 844 | 845 | email-addresses@^5.0.0: 846 | version "5.0.0" 847 | resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-5.0.0.tgz#7ae9e7f58eef7d5e3e2c2c2d3ea49b78dc854fa6" 848 | integrity sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw== 849 | 850 | enabled@2.0.x: 851 | version "2.0.0" 852 | resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" 853 | integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== 854 | 855 | esbuild@^0.21.3: 856 | version "0.21.5" 857 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" 858 | integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== 859 | optionalDependencies: 860 | "@esbuild/aix-ppc64" "0.21.5" 861 | "@esbuild/android-arm" "0.21.5" 862 | "@esbuild/android-arm64" "0.21.5" 863 | "@esbuild/android-x64" "0.21.5" 864 | "@esbuild/darwin-arm64" "0.21.5" 865 | "@esbuild/darwin-x64" "0.21.5" 866 | "@esbuild/freebsd-arm64" "0.21.5" 867 | "@esbuild/freebsd-x64" "0.21.5" 868 | "@esbuild/linux-arm" "0.21.5" 869 | "@esbuild/linux-arm64" "0.21.5" 870 | "@esbuild/linux-ia32" "0.21.5" 871 | "@esbuild/linux-loong64" "0.21.5" 872 | "@esbuild/linux-mips64el" "0.21.5" 873 | "@esbuild/linux-ppc64" "0.21.5" 874 | "@esbuild/linux-riscv64" "0.21.5" 875 | "@esbuild/linux-s390x" "0.21.5" 876 | "@esbuild/linux-x64" "0.21.5" 877 | "@esbuild/netbsd-x64" "0.21.5" 878 | "@esbuild/openbsd-x64" "0.21.5" 879 | "@esbuild/sunos-x64" "0.21.5" 880 | "@esbuild/win32-arm64" "0.21.5" 881 | "@esbuild/win32-ia32" "0.21.5" 882 | "@esbuild/win32-x64" "0.21.5" 883 | 884 | escalade@^3.2.0: 885 | version "3.2.0" 886 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" 887 | integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 888 | 889 | escape-string-regexp@^1.0.2: 890 | version "1.0.5" 891 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 892 | integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== 893 | 894 | fast-glob@^3.2.9: 895 | version "3.3.3" 896 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" 897 | integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== 898 | dependencies: 899 | "@nodelib/fs.stat" "^2.0.2" 900 | "@nodelib/fs.walk" "^1.2.3" 901 | glob-parent "^5.1.2" 902 | merge2 "^1.3.0" 903 | micromatch "^4.0.8" 904 | 905 | fastq@^1.6.0: 906 | version "1.19.1" 907 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" 908 | integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== 909 | dependencies: 910 | reusify "^1.0.4" 911 | 912 | fecha@^4.2.0: 913 | version "4.2.3" 914 | resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" 915 | integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== 916 | 917 | fetch-retry@^6.0.0: 918 | version "6.0.0" 919 | resolved "https://registry.yarnpkg.com/fetch-retry/-/fetch-retry-6.0.0.tgz#4ffdf92c834d72ae819e42a4ee2a63f1e9454426" 920 | integrity sha512-BUFj1aMubgib37I3v4q78fYo63Po7t4HUPTpQ6/QE6yK6cIQrP+W43FYToeTEyg5m2Y7eFUtijUuAv/PDlWuag== 921 | 922 | filename-reserved-regex@^2.0.0: 923 | version "2.0.0" 924 | resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" 925 | integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== 926 | 927 | filenamify@^4.3.0: 928 | version "4.3.0" 929 | resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" 930 | integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== 931 | dependencies: 932 | filename-reserved-regex "^2.0.0" 933 | strip-outer "^1.0.1" 934 | trim-repeated "^1.0.0" 935 | 936 | fill-range@^7.1.1: 937 | version "7.1.1" 938 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 939 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 940 | dependencies: 941 | to-regex-range "^5.0.1" 942 | 943 | find-cache-dir@^3.3.1: 944 | version "3.3.2" 945 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" 946 | integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== 947 | dependencies: 948 | commondir "^1.0.1" 949 | make-dir "^3.0.2" 950 | pkg-dir "^4.1.0" 951 | 952 | find-up@^4.0.0: 953 | version "4.1.0" 954 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 955 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 956 | dependencies: 957 | locate-path "^5.0.0" 958 | path-exists "^4.0.0" 959 | 960 | fn.name@1.x.x: 961 | version "1.1.0" 962 | resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" 963 | integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== 964 | 965 | fs-extra@^11.1.1: 966 | version "11.3.2" 967 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.2.tgz#c838aeddc6f4a8c74dd15f85e11fe5511bfe02a4" 968 | integrity sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A== 969 | dependencies: 970 | graceful-fs "^4.2.0" 971 | jsonfile "^6.0.1" 972 | universalify "^2.0.0" 973 | 974 | fsevents@~2.3.2, fsevents@~2.3.3: 975 | version "2.3.3" 976 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 977 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 978 | 979 | gensync@^1.0.0-beta.2: 980 | version "1.0.0-beta.2" 981 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 982 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 983 | 984 | gh-pages@^6.1.0: 985 | version "6.3.0" 986 | resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-6.3.0.tgz#a5b9476dd4385ceaf85c6467b2e05397093e7613" 987 | integrity sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA== 988 | dependencies: 989 | async "^3.2.4" 990 | commander "^13.0.0" 991 | email-addresses "^5.0.0" 992 | filenamify "^4.3.0" 993 | find-cache-dir "^3.3.1" 994 | fs-extra "^11.1.1" 995 | globby "^11.1.0" 996 | 997 | glob-parent@^5.1.2: 998 | version "5.1.2" 999 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 1000 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1001 | dependencies: 1002 | is-glob "^4.0.1" 1003 | 1004 | globby@^11.1.0: 1005 | version "11.1.0" 1006 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 1007 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1008 | dependencies: 1009 | array-union "^2.1.0" 1010 | dir-glob "^3.0.1" 1011 | fast-glob "^3.2.9" 1012 | ignore "^5.2.0" 1013 | merge2 "^1.4.1" 1014 | slash "^3.0.0" 1015 | 1016 | graceful-fs@^4.1.6, graceful-fs@^4.2.0: 1017 | version "4.2.11" 1018 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 1019 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 1020 | 1021 | hjson@^3.1.2: 1022 | version "3.2.2" 1023 | resolved "https://registry.yarnpkg.com/hjson/-/hjson-3.2.2.tgz#a5a81138f4c0bb427e4b2ac917fafd4b454436cf" 1024 | integrity sha512-MkUeB0cTIlppeSsndgESkfFD21T2nXPRaBStLtf3cAYA2bVEFdXlodZB0TukwZiobPD1Ksax5DK4RTZeaXCI3Q== 1025 | 1026 | http-proxy-agent@^7: 1027 | version "7.0.2" 1028 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" 1029 | integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== 1030 | dependencies: 1031 | agent-base "^7.1.0" 1032 | debug "^4.3.4" 1033 | 1034 | https-proxy-agent@^7: 1035 | version "7.0.6" 1036 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" 1037 | integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== 1038 | dependencies: 1039 | agent-base "^7.1.2" 1040 | debug "4" 1041 | 1042 | ignore@^5.2.0: 1043 | version "5.3.2" 1044 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" 1045 | integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== 1046 | 1047 | immutable@^5.0.2: 1048 | version "5.1.4" 1049 | resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.1.4.tgz#e3f8c1fe7b567d56cf26698f31918c241dae8c1f" 1050 | integrity sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA== 1051 | 1052 | inherits@^2.0.3: 1053 | version "2.0.4" 1054 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1055 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1056 | 1057 | invariant@^2.2.4: 1058 | version "2.2.4" 1059 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" 1060 | integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== 1061 | dependencies: 1062 | loose-envify "^1.0.0" 1063 | 1064 | is-extglob@^2.1.1: 1065 | version "2.1.1" 1066 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1067 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1068 | 1069 | is-glob@^4.0.1, is-glob@^4.0.3: 1070 | version "4.0.3" 1071 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1072 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1073 | dependencies: 1074 | is-extglob "^2.1.1" 1075 | 1076 | is-number@^7.0.0: 1077 | version "7.0.0" 1078 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1079 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1080 | 1081 | is-stream@^2.0.0: 1082 | version "2.0.1" 1083 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 1084 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 1085 | 1086 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 1087 | version "4.0.0" 1088 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 1089 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1090 | 1091 | js-yaml@^4.1.0: 1092 | version "4.1.1" 1093 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.1.tgz#854c292467705b699476e1a2decc0c8a3458806b" 1094 | integrity sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== 1095 | dependencies: 1096 | argparse "^2.0.1" 1097 | 1098 | jsesc@^3.0.2: 1099 | version "3.1.0" 1100 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" 1101 | integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== 1102 | 1103 | json5@^2.2.3: 1104 | version "2.2.3" 1105 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" 1106 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 1107 | 1108 | jsonfile@^6.0.1: 1109 | version "6.2.0" 1110 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" 1111 | integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== 1112 | dependencies: 1113 | universalify "^2.0.0" 1114 | optionalDependencies: 1115 | graceful-fs "^4.1.6" 1116 | 1117 | jsonwebtoken@^9.0.2: 1118 | version "9.0.2" 1119 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" 1120 | integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== 1121 | dependencies: 1122 | jws "^3.2.2" 1123 | lodash.includes "^4.3.0" 1124 | lodash.isboolean "^3.0.3" 1125 | lodash.isinteger "^4.0.4" 1126 | lodash.isnumber "^3.0.3" 1127 | lodash.isplainobject "^4.0.6" 1128 | lodash.isstring "^4.0.1" 1129 | lodash.once "^4.0.0" 1130 | ms "^2.1.1" 1131 | semver "^7.5.4" 1132 | 1133 | jwa@^1.4.1: 1134 | version "1.4.2" 1135 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9" 1136 | integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== 1137 | dependencies: 1138 | buffer-equal-constant-time "^1.0.1" 1139 | ecdsa-sig-formatter "1.0.11" 1140 | safe-buffer "^5.0.1" 1141 | 1142 | jws@^3.2.2: 1143 | version "3.2.2" 1144 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 1145 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 1146 | dependencies: 1147 | jwa "^1.4.1" 1148 | safe-buffer "^5.0.1" 1149 | 1150 | kuler@^2.0.0: 1151 | version "2.0.0" 1152 | resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" 1153 | integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== 1154 | 1155 | locate-path@^5.0.0: 1156 | version "5.0.0" 1157 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1158 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1159 | dependencies: 1160 | p-locate "^4.1.0" 1161 | 1162 | lodash.includes@^4.3.0: 1163 | version "4.3.0" 1164 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 1165 | integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== 1166 | 1167 | lodash.isboolean@^3.0.3: 1168 | version "3.0.3" 1169 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 1170 | integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== 1171 | 1172 | lodash.isinteger@^4.0.4: 1173 | version "4.0.4" 1174 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 1175 | integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== 1176 | 1177 | lodash.isnumber@^3.0.3: 1178 | version "3.0.3" 1179 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 1180 | integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== 1181 | 1182 | lodash.isplainobject@^4.0.6: 1183 | version "4.0.6" 1184 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 1185 | integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== 1186 | 1187 | lodash.isstring@^4.0.1: 1188 | version "4.0.1" 1189 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 1190 | integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== 1191 | 1192 | lodash.once@^4.0.0: 1193 | version "4.1.1" 1194 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 1195 | integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== 1196 | 1197 | logform@^2.7.0: 1198 | version "2.7.0" 1199 | resolved "https://registry.yarnpkg.com/logform/-/logform-2.7.0.tgz#cfca97528ef290f2e125a08396805002b2d060d1" 1200 | integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== 1201 | dependencies: 1202 | "@colors/colors" "1.6.0" 1203 | "@types/triple-beam" "^1.3.2" 1204 | fecha "^4.2.0" 1205 | ms "^2.1.1" 1206 | safe-stable-stringify "^2.3.1" 1207 | triple-beam "^1.3.0" 1208 | 1209 | loose-envify@^1.0.0, loose-envify@^1.1.0: 1210 | version "1.4.0" 1211 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 1212 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 1213 | dependencies: 1214 | js-tokens "^3.0.0 || ^4.0.0" 1215 | 1216 | lru-cache@^5.1.1: 1217 | version "5.1.1" 1218 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 1219 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1220 | dependencies: 1221 | yallist "^3.0.2" 1222 | 1223 | make-dir@^3.0.2: 1224 | version "3.1.0" 1225 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 1226 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 1227 | dependencies: 1228 | semver "^6.0.0" 1229 | 1230 | merge2@^1.3.0, merge2@^1.4.1: 1231 | version "1.4.1" 1232 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1233 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1234 | 1235 | micromatch@^4.0.5, micromatch@^4.0.8: 1236 | version "4.0.8" 1237 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 1238 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 1239 | dependencies: 1240 | braces "^3.0.3" 1241 | picomatch "^2.3.1" 1242 | 1243 | ms@^2.1.1, ms@^2.1.3: 1244 | version "2.1.3" 1245 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1246 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1247 | 1248 | nanoid@^3.3.11: 1249 | version "3.3.11" 1250 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" 1251 | integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== 1252 | 1253 | node-addon-api@^7.0.0: 1254 | version "7.1.1" 1255 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558" 1256 | integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== 1257 | 1258 | node-fetch@^2.6.4: 1259 | version "2.7.0" 1260 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" 1261 | integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== 1262 | dependencies: 1263 | whatwg-url "^5.0.0" 1264 | 1265 | node-releases@^2.0.27: 1266 | version "2.0.27" 1267 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.27.tgz#eedca519205cf20f650f61d56b070db111231e4e" 1268 | integrity sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== 1269 | 1270 | one-time@^1.0.0: 1271 | version "1.0.0" 1272 | resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" 1273 | integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== 1274 | dependencies: 1275 | fn.name "1.x.x" 1276 | 1277 | p-limit@^2.2.0: 1278 | version "2.3.0" 1279 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1280 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1281 | dependencies: 1282 | p-try "^2.0.0" 1283 | 1284 | p-locate@^4.1.0: 1285 | version "4.1.0" 1286 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1287 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1288 | dependencies: 1289 | p-limit "^2.2.0" 1290 | 1291 | p-try@^2.0.0: 1292 | version "2.2.0" 1293 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1294 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1295 | 1296 | path-exists@^4.0.0: 1297 | version "4.0.0" 1298 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1299 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1300 | 1301 | path-type@^4.0.0: 1302 | version "4.0.0" 1303 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1304 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1305 | 1306 | picocolors@^1.1.1: 1307 | version "1.1.1" 1308 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 1309 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 1310 | 1311 | picomatch@^2.3.1: 1312 | version "2.3.1" 1313 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1314 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1315 | 1316 | pkg-dir@^4.1.0: 1317 | version "4.2.0" 1318 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1319 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 1320 | dependencies: 1321 | find-up "^4.0.0" 1322 | 1323 | postcss@^8.4.43: 1324 | version "8.5.6" 1325 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" 1326 | integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== 1327 | dependencies: 1328 | nanoid "^3.3.11" 1329 | picocolors "^1.1.1" 1330 | source-map-js "^1.2.1" 1331 | 1332 | proxy-from-env@^1.1.0: 1333 | version "1.1.0" 1334 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 1335 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 1336 | 1337 | queue-microtask@^1.2.2: 1338 | version "1.2.3" 1339 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1340 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1341 | 1342 | react-dom@^18.2.0: 1343 | version "18.3.1" 1344 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" 1345 | integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== 1346 | dependencies: 1347 | loose-envify "^1.1.0" 1348 | scheduler "^0.23.2" 1349 | 1350 | react-fast-compare@^3.2.2: 1351 | version "3.2.2" 1352 | resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz#929a97a532304ce9fee4bcae44234f1ce2c21d49" 1353 | integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== 1354 | 1355 | react-helmet-async@^2.0.4: 1356 | version "2.0.5" 1357 | resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-2.0.5.tgz#cfc70cd7bb32df7883a8ed55502a1513747223ec" 1358 | integrity sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg== 1359 | dependencies: 1360 | invariant "^2.2.4" 1361 | react-fast-compare "^3.2.2" 1362 | shallowequal "^1.1.0" 1363 | 1364 | react-refresh@^0.17.0: 1365 | version "0.17.0" 1366 | resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" 1367 | integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== 1368 | 1369 | react-router-dom@^7.9.6: 1370 | version "7.9.6" 1371 | resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.9.6.tgz#f2a0d12961d67bd87ab48e5ef42fa1f45beae357" 1372 | integrity sha512-2MkC2XSXq6HjGcihnx1s0DBWQETI4mlis4Ux7YTLvP67xnGxCvq+BcCQSO81qQHVUTM1V53tl4iVVaY5sReCOA== 1373 | dependencies: 1374 | react-router "7.9.6" 1375 | 1376 | react-router@7.9.6: 1377 | version "7.9.6" 1378 | resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.9.6.tgz#003c8de335fdd7390286a478dcfd9579c1826137" 1379 | integrity sha512-Y1tUp8clYRXpfPITyuifmSoE2vncSME18uVLgaqyxh9H35JWpIfzHo+9y3Fzh5odk/jxPW29IgLgzcdwxGqyNA== 1380 | dependencies: 1381 | cookie "^1.0.1" 1382 | set-cookie-parser "^2.6.0" 1383 | 1384 | react@^18.2.0: 1385 | version "18.3.1" 1386 | resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" 1387 | integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== 1388 | dependencies: 1389 | loose-envify "^1.1.0" 1390 | 1391 | readable-stream@^3.4.0, readable-stream@^3.6.2: 1392 | version "3.6.2" 1393 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" 1394 | integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== 1395 | dependencies: 1396 | inherits "^2.0.3" 1397 | string_decoder "^1.1.1" 1398 | util-deprecate "^1.0.1" 1399 | 1400 | readdirp@^4.0.1: 1401 | version "4.1.2" 1402 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" 1403 | integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== 1404 | 1405 | reusify@^1.0.4: 1406 | version "1.1.0" 1407 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" 1408 | integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== 1409 | 1410 | rollup@^4.20.0: 1411 | version "4.53.3" 1412 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.53.3.tgz#dbc8cd8743b38710019fb8297e8d7a76e3faa406" 1413 | integrity sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA== 1414 | dependencies: 1415 | "@types/estree" "1.0.8" 1416 | optionalDependencies: 1417 | "@rollup/rollup-android-arm-eabi" "4.53.3" 1418 | "@rollup/rollup-android-arm64" "4.53.3" 1419 | "@rollup/rollup-darwin-arm64" "4.53.3" 1420 | "@rollup/rollup-darwin-x64" "4.53.3" 1421 | "@rollup/rollup-freebsd-arm64" "4.53.3" 1422 | "@rollup/rollup-freebsd-x64" "4.53.3" 1423 | "@rollup/rollup-linux-arm-gnueabihf" "4.53.3" 1424 | "@rollup/rollup-linux-arm-musleabihf" "4.53.3" 1425 | "@rollup/rollup-linux-arm64-gnu" "4.53.3" 1426 | "@rollup/rollup-linux-arm64-musl" "4.53.3" 1427 | "@rollup/rollup-linux-loong64-gnu" "4.53.3" 1428 | "@rollup/rollup-linux-ppc64-gnu" "4.53.3" 1429 | "@rollup/rollup-linux-riscv64-gnu" "4.53.3" 1430 | "@rollup/rollup-linux-riscv64-musl" "4.53.3" 1431 | "@rollup/rollup-linux-s390x-gnu" "4.53.3" 1432 | "@rollup/rollup-linux-x64-gnu" "4.53.3" 1433 | "@rollup/rollup-linux-x64-musl" "4.53.3" 1434 | "@rollup/rollup-openharmony-arm64" "4.53.3" 1435 | "@rollup/rollup-win32-arm64-msvc" "4.53.3" 1436 | "@rollup/rollup-win32-ia32-msvc" "4.53.3" 1437 | "@rollup/rollup-win32-x64-gnu" "4.53.3" 1438 | "@rollup/rollup-win32-x64-msvc" "4.53.3" 1439 | fsevents "~2.3.2" 1440 | 1441 | run-parallel@^1.1.9: 1442 | version "1.2.0" 1443 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1444 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1445 | dependencies: 1446 | queue-microtask "^1.2.2" 1447 | 1448 | safe-buffer@^5.0.1, safe-buffer@~5.2.0: 1449 | version "5.2.1" 1450 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1451 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1452 | 1453 | safe-stable-stringify@^2.3.1: 1454 | version "2.5.0" 1455 | resolved "https://registry.yarnpkg.com/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz#4ca2f8e385f2831c432a719b108a3bf7af42a1dd" 1456 | integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== 1457 | 1458 | sass@^1.94.1: 1459 | version "1.94.1" 1460 | resolved "https://registry.yarnpkg.com/sass/-/sass-1.94.1.tgz#79f726f2bdc347a387a954d4c967ac73efdb6676" 1461 | integrity sha512-/YVm5FRQaRlr3oNh2LLFYne1PdPlRZGyKnHh1sLleOqLcohTR4eUUvBjBIqkl1fEXd1MGOHgzJGJh+LgTtV4KQ== 1462 | dependencies: 1463 | chokidar "^4.0.0" 1464 | immutable "^5.0.2" 1465 | source-map-js ">=0.6.2 <2.0.0" 1466 | optionalDependencies: 1467 | "@parcel/watcher" "^2.4.1" 1468 | 1469 | scheduler@^0.23.2: 1470 | version "0.23.2" 1471 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" 1472 | integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== 1473 | dependencies: 1474 | loose-envify "^1.1.0" 1475 | 1476 | semver@^6.0.0, semver@^6.3.1: 1477 | version "6.3.1" 1478 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 1479 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1480 | 1481 | semver@^7.5.4: 1482 | version "7.7.3" 1483 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" 1484 | integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== 1485 | 1486 | set-cookie-parser@^2.6.0: 1487 | version "2.7.2" 1488 | resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz#ccd08673a9ae5d2e44ea2a2de25089e67c7edf68" 1489 | integrity sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw== 1490 | 1491 | shallowequal@^1.1.0: 1492 | version "1.1.0" 1493 | resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" 1494 | integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== 1495 | 1496 | slash@^3.0.0: 1497 | version "3.0.0" 1498 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1499 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1500 | 1501 | "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.1: 1502 | version "1.2.1" 1503 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" 1504 | integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== 1505 | 1506 | stack-trace@0.0.x: 1507 | version "0.0.10" 1508 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" 1509 | integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== 1510 | 1511 | string_decoder@^1.1.1: 1512 | version "1.3.0" 1513 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1514 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1515 | dependencies: 1516 | safe-buffer "~5.2.0" 1517 | 1518 | strip-outer@^1.0.1: 1519 | version "1.0.1" 1520 | resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" 1521 | integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== 1522 | dependencies: 1523 | escape-string-regexp "^1.0.2" 1524 | 1525 | text-hex@1.0.x: 1526 | version "1.0.0" 1527 | resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" 1528 | integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== 1529 | 1530 | to-regex-range@^5.0.1: 1531 | version "5.0.1" 1532 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1533 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1534 | dependencies: 1535 | is-number "^7.0.0" 1536 | 1537 | tr46@~0.0.3: 1538 | version "0.0.3" 1539 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1540 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 1541 | 1542 | trim-repeated@^1.0.0: 1543 | version "1.0.0" 1544 | resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" 1545 | integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== 1546 | dependencies: 1547 | escape-string-regexp "^1.0.2" 1548 | 1549 | triple-beam@^1.3.0: 1550 | version "1.4.1" 1551 | resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" 1552 | integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== 1553 | 1554 | universalify@^2.0.0: 1555 | version "2.0.1" 1556 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" 1557 | integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== 1558 | 1559 | update-browserslist-db@^1.1.4: 1560 | version "1.1.4" 1561 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz#7802aa2ae91477f255b86e0e46dbc787a206ad4a" 1562 | integrity sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A== 1563 | dependencies: 1564 | escalade "^3.2.0" 1565 | picocolors "^1.1.1" 1566 | 1567 | util-deprecate@^1.0.1: 1568 | version "1.0.2" 1569 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1570 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1571 | 1572 | vite@^5.0.8: 1573 | version "5.4.21" 1574 | resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027" 1575 | integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw== 1576 | dependencies: 1577 | esbuild "^0.21.3" 1578 | postcss "^8.4.43" 1579 | rollup "^4.20.0" 1580 | optionalDependencies: 1581 | fsevents "~2.3.3" 1582 | 1583 | webidl-conversions@^3.0.0: 1584 | version "3.0.1" 1585 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 1586 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 1587 | 1588 | whatwg-url@^5.0.0: 1589 | version "5.0.0" 1590 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 1591 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 1592 | dependencies: 1593 | tr46 "~0.0.3" 1594 | webidl-conversions "^3.0.0" 1595 | 1596 | winston-transport@^4.9.0: 1597 | version "4.9.0" 1598 | resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.9.0.tgz#3bba345de10297654ea6f33519424560003b3bf9" 1599 | integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== 1600 | dependencies: 1601 | logform "^2.7.0" 1602 | readable-stream "^3.6.2" 1603 | triple-beam "^1.3.0" 1604 | 1605 | winston@^3.2.1: 1606 | version "3.18.3" 1607 | resolved "https://registry.yarnpkg.com/winston/-/winston-3.18.3.tgz#93ac10808c8e1081d723bc8811cd2f445ddfdcd1" 1608 | integrity sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww== 1609 | dependencies: 1610 | "@colors/colors" "^1.6.0" 1611 | "@dabh/diagnostics" "^2.0.8" 1612 | async "^3.2.3" 1613 | is-stream "^2.0.0" 1614 | logform "^2.7.0" 1615 | one-time "^1.0.0" 1616 | readable-stream "^3.4.0" 1617 | safe-stable-stringify "^2.3.1" 1618 | stack-trace "0.0.x" 1619 | triple-beam "^1.3.0" 1620 | winston-transport "^4.9.0" 1621 | 1622 | yallist@^3.0.2: 1623 | version "3.1.1" 1624 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1625 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1626 | --------------------------------------------------------------------------------