From c2df14a425a47971b3a86f9ca352fafed9220c19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Tue, 24 Dec 2024 14:08:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=9F=BA=E7=A1=80=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=BB=93=E6=9E=84=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 74 +++ .gitignore | 1029 ++++++++++++++++++++++++++++++++++++++ .prettierignore | 3 + .prettierrc | 12 + README.md | 50 ++ bun.lockb | Bin 0 -> 101664 bytes color-module/Cargo.toml | 10 + color-module/src/main.rs | 3 + eslint.config.js | 25 + index.html | 13 + package.json | 43 ++ public/vite.svg | 1 + src/App.css | 42 ++ src/App.tsx | 35 ++ src/assets/react.svg | 1 + src/index.css | 68 +++ src/main.tsx | 10 + src/vite-env.d.ts | 1 + tsconfig.app.json | 26 + tsconfig.json | 7 + tsconfig.node.json | 24 + vite.config.ts | 13 + 22 files changed, 1490 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 README.md create mode 100755 bun.lockb create mode 100644 color-module/Cargo.toml create mode 100644 color-module/src/main.rs create mode 100644 eslint.config.js create mode 100644 index.html create mode 100644 package.json create mode 100644 public/vite.svg create mode 100644 src/App.css create mode 100644 src/App.tsx create mode 100644 src/assets/react.svg create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..641881e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,74 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 +max_line_length = 100 + +[*.java] +indent_size = 4 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.{yml, yaml}] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.json] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.sql] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.go] +indent_style = space +indent_size = 4 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.py] +indent_style = space +indent_size = 4 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.sh] +indent_style = space +indent_size = 2 +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 + +[*.rs] +indent_size = 4 +indent_style = space +end_of_line = lf +trim_trailing_whitespace = true +insert_final_newline = true +charset = utf-8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0253e21 --- /dev/null +++ b/.gitignore @@ -0,0 +1,1029 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# 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 + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# 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 + +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Generated by Cargo +# will have compiled files and executables +debug/ +target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html +Cargo.lock + +# These are backup files generated by rustfmt +**/*.rs.bk + +# MSVC Windows builds of rustc generate these, which store debugging information +*.pdb + +# RustRover +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ +# If you prefer the allow list template instead of the deny list, see community template: +# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore +# +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Dependency directories (remove the comment below to include it) +# vendor/ + +# Go workspace file +go.work +go.work.sum + +# env file +.env + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +# 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 + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# 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 + +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +# Prerequisites +*.d + +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# Precompiled Headers +*.gch +*.pch + +# Compiled Dynamic libraries +*.so +*.dylib +*.dll + +# Fortran module files +*.mod +*.smod + +# Compiled Static libraries +*.lai +*.la +*.a +*.lib + +# Executables +*.exe +*.out +*.app + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Log/OS Files +*.log + +# Android Studio generated files and folders +captures/ +.externalNativeBuild/ +.cxx/ +*.apk +output.json + +# IntelliJ +*.iml +.idea/ +misc.xml +deploymentTargetDropDown.xml +render.experimental.xml + +# Keystore files +*.jks +*.keystore + +# Google Services (e.g. APIs or Firebase) +google-services.json + +# Android Profiling +*.hprof + +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps +CMakeUserPresets.json + +# See https://www.dartlang.org/guides/libraries/private-files + +# Files and directories created by pub +.dart_tool/ +.packages +build/ +# If you're building an application, you may want to check-in your pubspec.lock +pubspec.lock + +# Directory created by dartdoc +# If you don't generate documentation locally you can remove this line. +doc/api/ + +# dotenv environment variables file +.env* + +# Avoid committing generated Javascript files: +*.dart.js +*.info.json # Produced by the --dump-info flag. +*.js # When generated by dart2js. Don't specify *.js if your + # project includes source files written in JavaScript. +*.js_ +*.js.deps +*.js.map + +.flutter-plugins +.flutter-plugins-dependencies + +.gradle +**/build/ +!src/**/build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +# Avoid ignore Gradle wrappper properties +!gradle-wrapper.properties + +# Cache of project +.gradletasknamecache + +# Eclipse Gradle plugin generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +# This .gitignore is appropriate for repositories deployed to GitHub Pages and using +# a Gemfile as specified at https://github.com/github/pages-gem#conventional + +# Basic Jekyll gitignores (synchronize to Jekyll.gitignore) +_site/ +.sass-cache/ +.jekyll-cache/ +.jekyll-metadata + +# Additional Ruby/bundler ignore for when you run: bundle install +/vendor + +# Specific ignore for GitHub Pages +# GitHub Pages will always use its own deployed version of pages-gem +# This means GitHub Pages will NOT use your Gemfile.lock and therefore it is +# counterproductive to check this file into the repository. +# Details at https://github.com/github/pages-gem/issues/768 +Gemfile.lock diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..d592b12 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +**/*.md +.env +.env.* diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..ab14e5f --- /dev/null +++ b/.prettierrc @@ -0,0 +1,12 @@ +{ + "bracketSpacing": true, + "bracketSameLine": true, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": true, + "jsxSingleQuote": false, + "trailingComma": "all", + "arrowParens": "always", + "printWidth": 100 +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..74872fd --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..6ee1c7fa679cba94875449e916b12dcd4ef86c37 GIT binary patch literal 101664 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 + + + + + + Vite + React + TS + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..f721ef0 --- /dev/null +++ b/package.json @@ -0,0 +1,43 @@ +{ + "name": "color-lab", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "jotai": "^2.11.0", + "lodash-es": "^4.17.21", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-error-boundary": "^5.0.0", + "react-router-dom": "^7.1.1", + "react-transition-group": "^4.4.5", + "react-use": "^17.6.0", + "sanitize.css": "^13.0.0", + "uuid": "^11.0.3" + }, + "devDependencies": { + "@eslint/js": "^9.17.0", + "@types/lodash-es": "^4.17.12", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@types/react-transition-group": "^4.4.12", + "@types/uuid": "^10.0.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^9.17.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.16", + "globals": "^15.14.0", + "lightningcss": "^1.28.2", + "typescript": "~5.6.2", + "typescript-eslint": "^8.18.2", + "vite": "^6.0.5" + } +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..3d7ded3 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,35 @@ +import { useState } from 'react' +import reactLogo from './assets/react.svg' +import viteLogo from '/vite.svg' +import './App.css' + +function App() { + const [count, setCount] = useState(0) + + return ( + <> + +

Vite + React

+
+ +

+ Edit src/App.tsx and save to test HMR +

+
+

+ Click on the Vite and React logos to learn more +

+ + ) +} + +export default App diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..6119ad9 --- /dev/null +++ b/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..bef5202 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.tsx' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..358ca9b --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..db0becc --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..ee194e6 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,13 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react-swc'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], + css: { + transform: 'lightningcss', + lightningcss: { + cssModules: true, + }, + }, +});