initial commit

proto-module-actu-react
Jalil Arfaoui 2023-01-29 21:27:02 +01:00
commit 2c15426e8b
21 changed files with 2238 additions and 0 deletions

164
.gitignore vendored Normal file
View File

@ -0,0 +1,164 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
public
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
### Node template
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

13
index.html Normal file
View File

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Résistants Enfance Libre</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<script src="https://cdn.jsdelivr.net/npm/public-google-sheets-parser@latest"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>

25
package.json Normal file
View File

@ -0,0 +1,25 @@
{
"name": "resistants",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "tsc && vite build",
"preview": "vite preview"
},
"dependencies": {
"public-google-sheets-parser": "^1.2.6",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router": "^6.8.0",
"react-router-dom": "^6.8.0"
},
"devDependencies": {
"@types/react": "^18.0.26",
"@types/react-dom": "^18.0.9",
"@vitejs/plugin-react-swc": "^3.0.0",
"typescript": "^4.9.3",
"vite": "^4.0.0"
}
}

6
src/Resistant.ts Normal file
View File

@ -0,0 +1,6 @@
export interface Resistant {
Noms: string
Département: string
Académie: string
["Nombre de familles"]: string
}

40
src/main.tsx Normal file
View File

@ -0,0 +1,40 @@
import React from 'react'
import ReactDOM from 'react-dom/client'
import {Outlet} from "react-router";
import {createHashRouter, RouterProvider} from "react-router-dom"
import {ListeResistants, resistantsLoader} from "./routes/ListeResistants"
import NotFound from "./routes/NotFound";
import { PageResistant } from "./routes/PageResistant";
import './style/SquareSpace/vars.css'
import './style/SquareSpace/global.css'
import './style/SquareSpace/blocks.css'
import './style/SquareSpace/table.css'
import './style/SquareSpace/video.css'
const Layout = () => <div>
<Outlet />
</div>
const router = createHashRouter([{
path: "/",
element: <Layout />,
errorElement: <NotFound />,
children: [
{
path: "/",
element: <ListeResistants/>,
loader: resistantsLoader,
},
{
path: ":nomResistant",
element: <PageResistant/>
}
]
}])
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
<React.StrictMode>
<RouterProvider router={router} />
</React.StrictMode>,
)

1
src/public-google-sheets-parser.d.ts vendored Normal file
View File

@ -0,0 +1 @@
declare class PublicGoogleSheetsParser {parse(id: string, sheet?: string): Promise<any[]> }

View File

@ -0,0 +1,5 @@
#listeResistants {
max-width: 1200px;
margin-left: auto;
margin-right: auto;
}

View File

@ -0,0 +1,24 @@
import { Outlet, useLoaderData } from "react-router";
import {ResistantRow} from "./ResistantRow";
import {Resistant} from "../Resistant";
export const resistantsLoader = async () => {
const spreadsheetId = '1GL1MBChnwNn0t8WtKK5M3PbtCJ_bTJRhoTwAI9jeWck'
let sheetName = "Résistants";
const parser = new PublicGoogleSheetsParser()
const resistants = await parser.parse(spreadsheetId, sheetName);
return { resistants }
}
export const ListeResistants = () => {
const { resistants } = useLoaderData() as { resistants: Resistant[] }
return (
<>
<div id="listeResistants">
{resistants.map((r) => <ResistantRow resistant={r} key={r["Nombre de familles"]} />)}
<Outlet />
</div>
</>
);
};

16
src/routes/NotFound.tsx Normal file
View File

@ -0,0 +1,16 @@
import { useRouteError } from "react-router-dom";
export default function NotFound() {
const error = useRouteError() as any;
console.error(error);
return (
<div id="error-page">
<h1>Oops!</h1>
<p>Sorry, an unexpected error has occurred.</p>
<p>
<i>{error.statusText || error.message}</i>
</p>
</div>
);
}

View File

@ -0,0 +1,7 @@
import {useParams} from "react-router";
export const PageResistant = () => {
const { nomResistant } = useParams()
return <>{nomResistant}</>
}

View File

@ -0,0 +1,98 @@
import {Resistant} from "../Resistant";
interface Props {
resistant: Resistant
}
export const ResistantRow = ({resistant}: Props) => {
return (<>
<div className="row sqs-row">
<div className="col sqs-col-4 span-4">
<div className="sqs-block video-block sqs-block-video"
data-block-json="{&quot;blockAnimation&quot;:&quot;none&quot;,&quot;layout&quot;:&quot;caption-hidden&quot;,&quot;overlay&quot;:true,&quot;description&quot;:{&quot;html&quot;:&quot;<p class=\&quot;\&quot; data-rte-preserve-empty=\&quot;true\&quot; style=\&quot;white-space:pre-wrap;\&quot;></p>&quot;},&quot;hSize&quot;:null,&quot;floatDir&quot;:null,&quot;isOldBlock&quot;:false,&quot;customThumb&quot;:&quot;63cfb74911567d2c9562166d&quot;,&quot;html&quot;:&quot;<iframe class=\&quot;embedly-embed\&quot; src=\&quot;//cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FEPwB2-Mdmag%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DEPwB2-Mdmag&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FEPwB2-Mdmag%2Fhqdefault.jpg&amp;key=61d05c9d54e8455ea7a9677c366be814&amp;type=text%2Fhtml&amp;schema=youtube\&quot; width=\&quot;854\&quot; height=\&quot;480\&quot; scrolling=\&quot;no\&quot; title=\&quot;YouTube embed\&quot; frameborder=\&quot;0\&quot; allow=\&quot;autoplay; fullscreen\&quot; allowfullscreen=\&quot;true\&quot;></iframe>&quot;,&quot;url&quot;:&quot;https://www.youtube.com/watch?v=EPwB2-Mdmag&quot;,&quot;width&quot;:854,&quot;height&quot;:480,&quot;providerName&quot;:&quot;YouTube&quot;,&quot;thumbnailUrl&quot;:&quot;https://i.ytimg.com/vi/EPwB2-Mdmag/hqdefault.jpg&quot;,&quot;resolvedBy&quot;:&quot;youtube&quot;}"
data-block-type="32" id="block-yui_3_17_2_1_1651498459484_85704">
<div className="sqs-block-content" id="yui_3_17_2_1_1674987238932_69">
<div className="intrinsic" style={{maxWidth: "100%"}}>
<div className="embed-block-wrapper " style={{paddingBottom: "56.20609%"}}>
<div className="sqs-video-wrapper video-none" data-provider-name="YouTube"
data-html="<br/><br/><br/><br/><br/><iframe src=&quot;//www.youtube.com/embed/EPwB2-Mdmag?wmode=opaque&quot; height=&quot;480&quot; width=&quot;854&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowfullscreen></iframe><br/>"
id="yui_3_17_2_1_1674987238932_76">
<div className="intrinsic">
<div className="intrinsic-inner" style={{paddingBottom: "56.2061%"}}>
<div className="sqs-video-overlay"
style={{opacity: 1, overflow: "hidden"}}
id="yui_3_17_2_1_1674987238932_99">
<img
data-src="https://images.squarespace-cdn.com/content/v1/5c5c097593a6327956f164c2/58039c37-5044-469f-a724-042866f5b892/Marjorie%26Ramin.jpg"
data-load="false" data-image-focal-point="0.5,0.5"
className="loaded"
data-image-dimensions="100x100" data-parent-ratio="1.8"
style={{
fontSize: "0px",
left: 0,
top: "-75.5px",
width: "344px",
height: "344px",
position: "relative"
}}
data-image-resolution="500w"
src="https://images.squarespace-cdn.com/content/v1/5c5c097593a6327956f164c2/58039c37-5044-469f-a724-042866f5b892/Marjorie%26Ramin.jpg?format=500w"
/>
<div className="sqs-video-opaque"></div>
<div className="sqs-video-icon" tabIndex={0} role="button"
aria-label="Play"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div className="sqs-block html-block sqs-block-html" data-block-type="2"
id="block-yui_3_17_2_1_1651498459484_91313">
<div className="sqs-block-content">
<p className="" style={{whiteSpace: "pre-wrap"}}><em>
Vidéo diffusée le 1er mai 2022, pour déclarer notre entrée en désobéissance civile.</em></p>
</div>
</div>
</div>
<div className="col sqs-col-8 span-8">
<div className="sqs-block code-block sqs-block-code" data-block-type="23"
id="block-yui_3_17_2_1_1666274786250_108799">
<div className="sqs-block-content"><p id="ramin-marjorie">
<strong>
{resistant.Noms}, parents de Zeÿa
</strong>
</p></div>
</div>
<div className="sqs-block html-block sqs-block-html" data-block-type="2"
id="block-yui_3_17_2_1_1602775217144_4986">
<div className="sqs-block-content">
<p className="" style={{whiteSpace: "pre-wrap"}}><strong>({resistant.Département}, Académie de
{resistant.Académie})<br/></strong><em>cofondateurs du mouvement Enfance Libre</em></p><p
className=""
style={{whiteSpace: "pre-wrap"}}>
<em>À l'image des objecteurs de conscience qui refusaient le service militaire pour ne pas
s'entraîner à tuer, nous refusons l'idée d'un service scolaire obligatoire qui
entraînerait
notre enfant à obéir.</em></p><p className="" style={{whiteSpace: "pre-wrap"}}><a
href="https://www.enfance-libre.fr/blog/declaration-officielle-ramin-marjorie">
<strong>
Voir notre communiqué officiel aux autorités le 1er mai 2022.
</strong></a></p>
</div>
</div>
</div>
</div>
<div className="sqs-block horizontalrule-block sqs-block-horizontalrule" data-block-type="47"
id="block-yui_3_17_2_1_1663092647761_201089">
<div className="sqs-block-content">
<hr/>
</div>
</div>
</>
);
}

View File

@ -0,0 +1,57 @@
.embed-block .intrinsic, .video-block .intrinsic, .embed-block .sqs-block-content .intrinsic, .video-block .sqs-block-content .intrinsic {
position: relative;
}
.embed-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud), .video-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud), .embed-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud), .video-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) {
position: relative;
}
.embed-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .sqs-video-wrapper, .video-block .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .sqs-video-wrapper, .embed-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .sqs-video-wrapper, .video-block .sqs-block-content .intrinsic .embed-block-wrapper:not(.embed-block-provider-SoundCloud) .sqs-video-wrapper {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.embed-block .intrinsic, .video-block .intrinsic, .embed-block .sqs-block-content .intrinsic, .video-block .sqs-block-content .intrinsic {
position: relative;
}
.sqs-block-html .sqs-block-content > :last-child {
margin-bottom: 0;
}
.sqs-block-html .sqs-block-content > :first-child {
margin-top: 0;
}
.sqs-block-html .sqs-block-content :not(h1):not(h2):not(h3) {
word-wrap: break-word;
}
/* Séparateur */
.Intro-content .sqs-col-12 > .sqs-block:not(.float):not(.sqs-float-left):not(.sqs-float-right):not(.sqs-block-gallery):not(.sqs-block-image):not(.sqs-block-video):not(.sqs-block-map):not(.sqs-block-calendar):not(.sqs-block-menu):not(.sqs-block-tourdates):not(.sqs-block-summary-v2):not(.sqs-block-archive):not(.sqs-block-instagram), .Main:not(.Main--events-list):not(.Main--events-item):not(.Main--blog-list) .Main-content .sqs-layout .sqs-col-12 > .sqs-block:not(.float):not(.sqs-float-left):not(.sqs-float-right):not(.sqs-block-gallery):not(.sqs-block-image):not(.sqs-block-video):not(.sqs-block-map):not(.sqs-block-calendar):not(.sqs-block-menu):not(.sqs-block-tourdates):not(.sqs-block-summary-v2):not(.sqs-block-archive):not(.sqs-block-instagram), .tweak-blog-list-style-stacked .BlogList--posts-full .sqs-layout .sqs-col-12 > .sqs-block:not(.float):not(.sqs-float-left):not(.sqs-float-right):not(.sqs-block-gallery):not(.sqs-block-image):not(.sqs-block-video):not(.sqs-block-map):not(.sqs-block-calendar):not(.sqs-block-menu):not(.sqs-block-tourdates):not(.sqs-block-summary-v2):not(.sqs-block-archive):not(.sqs-block-instagram), .Index-page .sqs-layout .sqs-col-12 > .sqs-block:not(.float):not(.sqs-float-left):not(.sqs-float-right):not(.sqs-block-gallery):not(.sqs-block-image):not(.sqs-block-video):not(.sqs-block-map):not(.sqs-block-calendar):not(.sqs-block-menu):not(.sqs-block-tourdates):not(.sqs-block-summary-v2):not(.sqs-block-archive):not(.sqs-block-instagram), .Footer-blocks--top .sqs-col-12 > .sqs-block:not(.float):not(.sqs-float-left):not(.sqs-float-right):not(.sqs-block-gallery):not(.sqs-block-image):not(.sqs-block-video):not(.sqs-block-map):not(.sqs-block-calendar):not(.sqs-block-menu):not(.sqs-block-tourdates):not(.sqs-block-summary-v2):not(.sqs-block-archive):not(.sqs-block-instagram), .Footer-blocks--bottom .sqs-col-12 > .sqs-block:not(.float):not(.sqs-float-left):not(.sqs-float-right):not(.sqs-block-gallery):not(.sqs-block-image):not(.sqs-block-video):not(.sqs-block-map):not(.sqs-block-calendar):not(.sqs-block-menu):not(.sqs-block-tourdates):not(.sqs-block-summary-v2):not(.sqs-block-archive):not(.sqs-block-instagram), .tweak-footer-layout-stacked .Footer-blocks--middle .sqs-col-12 > .sqs-block:not(.float):not(.sqs-float-left):not(.sqs-float-right):not(.sqs-block-gallery):not(.sqs-block-image):not(.sqs-block-video):not(.sqs-block-map):not(.sqs-block-calendar):not(.sqs-block-menu):not(.sqs-block-tourdates):not(.sqs-block-summary-v2):not(.sqs-block-archive):not(.sqs-block-instagram) {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
width: 74.995%;
margin-right: auto;
margin-left: auto;
}
.sqs-block:not(.sqs-block-html):not(.sqs-block-markdown) {
clear: both;
}
.sqs-block {
position: relative;
height: auto;
padding-top: 17px;
padding-bottom: 17px;
}
.sqs-block-html .sqs-block-content > :first-child {
margin-top: 0;
}
.sqs-block-html .sqs-block-content :not(h1):not(h2):not(h3) {
word-wrap: break-word;
}
.sqs-block-html .sqs-block-content :not(h1):not(h2):not(h3) {
word-wrap: break-word;
}

View File

@ -0,0 +1,42 @@
html {
pointer-events: auto;
font-family: sans-serif;
-webkit-text-size-adjust: 100%;
}
body {
font-family: Alice;
font-weight: 400;
font-style: normal;
font-size: 18px;
letter-spacing: 0em;
line-height: 1.8em;
text-transform: none;
color: #222;
--fbc-blue-60: #0060df;
--fbc-blue-70: #003eaa;
--fbc-gray-20: #ededf0;
--fbc-light-gray: #F0F0F4;
--fbc-white: #ffffff;
--fbc-transition: all .15s cubic-bezier(.07,.95,0,1);
--fbc-borders: 1px solid #ededf0;
--fbc-primary-text: #15141A;
--fbc-secondary-text: #5B5B66;
--fbc-font-size: 13px;
}
p:last-child {
margin-bottom: 0;
}
p:first-child {
margin-top: 0;
}
b, strong {
font-weight: bold;
}
img {
border: 0;
}

View File

@ -0,0 +1,50 @@
.sqs-row {
width: auto !important;
}
.sqs-row::before, .sqs-row::after {
content: "";
display: table;
}
[class*="sqs-col"] {
float: left;
}
[class*="sqs-col"]:last-child {
padding-right: 0;
}
.sqs-col-8 {
width: 66.6667%;
}
.sqs-col-12 .sqs-col-8 {
width: 66.6667%;
}
.sqs-col-12 .sqs-col-4 {
width: 33.3333%;
}
.sqs-col-4 {
width: 33.3333%;
}
.sqs-layout:not(.sqs-editing) .sqs-row .sqs-block:not(.float):not(.sqs-feature-gated-wrapper):first-child {
padding-top: 17px;
}
.sqs-layout:not(.sqs-editing) .sqs-block + .sqs-row .sqs-block:not(.float):first-child {
padding-top: 17px;
}
.sqs-layout:not(.sqs-editing) .sqs-row .sqs-block:not(.float):not(.sqs-feature-gated-wrapper):first-child {
padding-top: 0;
}
.sqs-block:not(.sqs-block-html):not(.sqs-block-markdown) {
clear: both;
}
[class*="sqs-col"] .sqs-block {
padding-left: 17px;
padding-right: 17px;
}

View File

@ -0,0 +1,30 @@
:root {
--lt-color-gray-100: #f8f9fc;
--lt-color-gray-200: #f1f3f9;
--lt-color-gray-300: #dee3ed;
--lt-color-gray-400: #c2c9d6;
--lt-color-gray-500: #8f96a3;
--lt-color-gray-600: #5e636e;
--lt-color-gray-700: #2f3237;
--lt-color-gray-800: #1d1e20;
--lt-color-gray-900: #111213;
--lt-color-white: #fff !important;
--lt-color-black: #111213 !important;
--lt-color-transparent: rgba(255, 255, 255, 0) !important;
--lt-color-background-light: var(--lt-color-gray-100) !important;
--lt-color-background-default: var(--lt-color-gray-200) !important;
--lt-color-background-dark: var(--lt-color-gray-300) !important;
--lt-color-border-light: var(--lt-color-gray-200) !important;
--lt-color-border-default: var(--lt-color-gray-300) !important;
--lt-color-border-dark: var(--lt-color-gray-400) !important;
--lt-color-text-very-light: var(--lt-color-gray-500) !important;
--lt-color-text-light: var(--lt-color-gray-600) !important;
--lt-color-text-default: var(--lt-color-gray-700) !important;
--lt-color-text-dark: var(--lt-color-gray-800) !important;
--lt-color-overlay-default: #fff !important;
--lt-color-overlay-dark: #fff !important;
--lt-color-overlay-transparent: rgba(0, 0, 0, 0.1) !important;
--lt-shadow-website-overlay: 0 0 7px 0 rgba(0, 0, 0, 0.3) !important;
--lt-shadowDefault: 0 2px 6px -1px rgba(0, 0, 0, 0.16), 0 1px 4px -1px rgba(0, 0, 0, 0.04);
--lt-shadowActive: 0 0 8px -2px rgba(0, 0, 0, 0.1), 0 6px 20px -3px rgba(0, 0, 0, 0.2);
}

View File

@ -0,0 +1,44 @@
.sqs-video-wrapper.video-none {
position: relative;
}
.sqs-video-wrapper .intrinsic {
max-width: 100%;
}
.sqs-video-wrapper .sqs-video-overlay {
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-size: cover;
color: #000;
background-position: center center;
background-repeat: no-repeat;
}
.sqs-video-wrapper .sqs-video-overlay .sqs-video-opaque {
position: absolute;
bottom: 0;
width: 100%;
height: 100%;
background: #000;
opacity: 0;
}
.sqs-video-wrapper .sqs-video-overlay .sqs-video-icon {
position: absolute;
top: 50%;
left: 50%;
background: transparent url('//assets.squarespace.com/universal/images-v6/damask/play-button.png') center center no-repeat;
height: 48px;
width: 48px;
margin-left: -24px;
margin-top: -24px;
cursor: pointer;
}
.sqs-video-wrapper .sqs-video-overlay {
color: #000;
}

1
src/vite-env.d.ts vendored Normal file
View File

@ -0,0 +1 @@
/// <reference types="vite/client" />

21
tsconfig.json Normal file
View File

@ -0,0 +1,21 @@
{
"compilerOptions": {
"target": "ESNext",
"useDefineForClassFields": true,
"lib": ["DOM", "DOM.Iterable", "ESNext"],
"allowJs": false,
"skipLibCheck": true,
"esModuleInterop": false,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "ESNext",
"moduleResolution": "Node",
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx"
},
"include": ["src"],
"references": [{ "path": "./tsconfig.node.json" }]
}

9
tsconfig.node.json Normal file
View File

@ -0,0 +1,9 @@
{
"compilerOptions": {
"composite": true,
"module": "ESNext",
"moduleResolution": "Node",
"allowSyntheticDefaultImports": true
},
"include": ["vite.config.ts"]
}

10
vite.config.ts Normal file
View File

@ -0,0 +1,10 @@
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react()],
build: {
outDir: "public"
}
})

1575
yarn.lock Normal file

File diff suppressed because it is too large Load Diff