├── .github └── workflows │ └── main.yml ├── .gitignore ├── README.md ├── README.pdf ├── appicon.xcf └── write ├── README.md ├── app.go ├── build ├── .gitignore ├── README.md ├── appicon.png └── icon.svg ├── frontend ├── index.html ├── package-lock.json ├── package.json ├── package.json.md5 ├── postcss.config.cjs ├── src │ ├── App.css │ ├── App.tsx │ ├── assets │ │ └── wails.png │ ├── index.css │ ├── main.tsx │ └── vite-env.d.ts ├── tailwind.config.cjs ├── tsconfig.json ├── tsconfig.node.json ├── vite.config.ts └── wailsjs │ ├── go │ ├── main │ │ ├── App.d.ts │ │ └── App.js │ └── models.ts │ └── runtime │ ├── package.json │ ├── runtime.d.ts │ └── runtime.js ├── go.mod ├── go.sum ├── lib ├── markdown.go ├── pdf.go ├── pdf_test.go └── test │ ├── test.md │ └── test.pdf ├── main.go ├── scripts ├── build-macos-arm.sh ├── build-macos-intel.sh ├── build-macos.sh ├── build-windows.sh ├── build.sh └── install-wails-cli.sh ├── tmp └── main └── wails.json /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Build and Release 2 | on: 3 | push: 4 | branches: 5 | - main 6 | tags: 7 | - "v*" 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | permissions: 12 | contents: write 13 | steps: 14 | - name: Checkout code 15 | uses: actions/checkout@v2 16 | - name: Set up Go 1.21 17 | uses: actions/setup-go@v2 18 | with: 19 | go-version: 1.21 20 | - name: Setup 21 | run: | 22 | sudo apt install libgtk-3-dev libwebkit2gtk-4.0-dev nsis 23 | - name: Build 24 | run: | 25 | cd write/scripts 26 | ./install-wails-cli.sh 27 | cd .. 28 | wails build 29 | - name: Tests 30 | run: | 31 | cd write 32 | go test ./... 33 | - name: Package 34 | working-directory: write 35 | run: | 36 | wails build --clean --platform windows/amd64 37 | cp build/bin/write.exe build/write-windows.exe 38 | wails build --clean 39 | cp build/bin/write build/write-linux 40 | - name: Release 41 | uses: softprops/action-gh-release@v1 42 | if: startsWith(github.ref, 'refs/tags/v') # only run on tags strting with v 43 | with: 44 | files: | 45 | write/build/write-windows.exe 46 | write/build/write-linux 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | write/frontend/dist 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # A writer application 2 | 3 | This is created as a step by step guide in how to build using the wails framework. 4 | 5 | I'm choosing my favorite SPA fotm (framework of the month), but you could do this with anything else. 6 | 7 | IF you're interested in using tailwind and react to make a tiny bundle for a frontend app, read on! 8 | 9 | ## Step 1: Create a new project 10 | 11 | ```bash 12 | wails init -n write -t https://github.com/hotafrika/wails-vite-react-ts-tailwind-template 13 | cd writer 14 | ``` 15 | 16 | 17 | ## Step 2: 18 | 19 | - "Design" the application: https://v0.dev/t/OpQCijO6Hm8 20 | - Implement the markdown renderer, see lib/markdown.go and `app.SendMarkdownToRenderer` 21 | - Now you can write markdown! 22 | 23 | ## Step 3: 24 | 25 | - Implement all the other buttons etc etc 26 | - Save Button, Open Button, New Button. 27 | 28 | ## Step 4: 29 | 30 | Creating the pdf export, a huge yackshave, but lets gooo! 31 | 32 | - Pdf renderer has a really interesting and useful abstraction with the Walk function and the abillity to skip children. 33 | - It's not feature complete, but we have a good base of links, headings etc etc. 34 | - Wiring up the export function is pretty straightforward! 35 | 36 | It really ain't pretty yet, lets make something cool... 37 | 38 | 39 | ## Step 5: 40 | 41 | Eat your vegetables, time to setup CI/CD and make a release! Yea, you should probably do this as step 1, but being true to the reality of how i worked on this, I'm putting it as step 5. 42 | 43 | Here is the high level steps I took a look through.. 44 | 45 | - Figuring out the production build, windows/linux cross build and copying the binary for later 46 | - Figuring out the release process. https://github.com/softprops/action-gh-release 47 | - Push your code about six times to get build syntax right 48 | - attempt to use a provided github action to matrix build, works for nix but not for windows due to obscure reasons. I think for this simple app a cross compile should be fine, so I'm just going to go with a cross compiled app for simplicity -------------------------------------------------------------------------------- /README.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ebuckley/write/335bc096973f3b5a368e0257c1ffcd053a6c513c/README.pdf -------------------------------------------------------------------------------- /appicon.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ebuckley/write/335bc096973f3b5a368e0257c1ffcd053a6c513c/appicon.xcf -------------------------------------------------------------------------------- /write/README.md: -------------------------------------------------------------------------------- 1 | ## About 2 | 3 | Wails template which includes: Vite, React, TS, TailwindCSS out of the box. 4 | 5 | Build with `Wails CLI v2.0.0`. 6 | 7 | To use this [template](https://wails.io/docs/community/templates): 8 | ```shell 9 | wails init -n "Your Project Name" -t https://github.com/hotafrika/wails-vite-react-ts-tailwind-template 10 | cd frontend/src 11 | npm install 12 | ``` 13 | 14 | [Here](scripts) you can find useful scripts for building on different platforms and Wails CLI installation. 15 | 16 | ## Live Development 17 | 18 | To run in live development mode, run `wails dev` in the project directory. In another terminal, go into the `frontend` 19 | directory and run `npm run dev`. The frontend dev server will run on http://localhost:34115. Connect to this in your 20 | browser and connect to your application. 21 | 22 | ## Building 23 | 24 | To build a redistributable, production mode package, use `wails build`. 25 | 26 | 27 | -------------------------------------------------------------------------------- /write/app.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "changeme/lib" 5 | "context" 6 | "github.com/mitchellh/go-homedir" 7 | "github.com/wailsapp/wails/v2/pkg/runtime" 8 | "os" 9 | "path" 10 | ) 11 | 12 | type FileWithContent struct { 13 | Name string `json:"name,omitempty"` 14 | Content string `json:"content,omitempty"` 15 | HTML string `json:"html,omitempty"` 16 | } 17 | 18 | // App struct 19 | type App struct { 20 | ctx context.Context 21 | filename string 22 | markdown string 23 | renderedHTML string 24 | } 25 | 26 | // NewApp creates a new App application struct 27 | func NewApp() *App { 28 | return &App{} 29 | } 30 | 31 | // startup is called at application startup 32 | func (a *App) startup(ctx context.Context) { 33 | // Perform your setup here 34 | a.ctx = ctx 35 | } 36 | 37 | // domReady is called after front-end resources have been loaded 38 | func (a *App) domReady(ctx context.Context) { 39 | // Add your action here 40 | } 41 | 42 | // beforeClose is called when the application is about to quit, 43 | // either by clicking the window close button or calling runtime.Quit. 44 | // Returning true will cause the application to continue, false will continue shutdown as normal. 45 | func (a *App) beforeClose(ctx context.Context) (prevent bool) { 46 | return false 47 | } 48 | 49 | // shutdown is called at application termination 50 | func (a *App) shutdown(ctx context.Context) { 51 | // Perform your teardown here 52 | } 53 | 54 | // SendMarkdownToRenderer sends markdown to the renderer 55 | func (a *App) SendMarkdownToRenderer(content string) string { 56 | a.markdown = content 57 | a.renderedHTML = lib.RenderMD(content) 58 | return a.renderedHTML 59 | } 60 | 61 | func (a *App) Save() (string, error) { 62 | hd, err := homedir.Dir() 63 | if err != nil { 64 | return "", err 65 | } 66 | 67 | chosenPath, err := runtime.SaveFileDialog(a.ctx, runtime.SaveDialogOptions{ 68 | DefaultDirectory: path.Join(hd, "Documents"), 69 | DefaultFilename: a.filename, 70 | Title: "Save file", 71 | ShowHiddenFiles: false, 72 | CanCreateDirectories: true, 73 | TreatPackagesAsDirectories: true, 74 | }) 75 | if err != nil { 76 | return "", err 77 | } 78 | err = os.WriteFile(chosenPath, []byte(a.markdown), 0644) 79 | if err != nil { 80 | return "", err 81 | } 82 | return chosenPath, nil 83 | } 84 | 85 | func (a *App) Open() (FileWithContent, error) { 86 | hd, err := homedir.Dir() 87 | if err != nil { 88 | return FileWithContent{}, err 89 | } 90 | openedFile, err := runtime.OpenFileDialog(a.ctx, runtime.OpenDialogOptions{ 91 | DefaultDirectory: path.Join(hd, "Documents"), 92 | Title: "Open file", 93 | Filters: []runtime.FileFilter{ 94 | { 95 | DisplayName: "Markdown files", 96 | Pattern: "*.md", 97 | }, 98 | { 99 | DisplayName: "All files", 100 | Pattern: "*", 101 | }, 102 | }, 103 | ShowHiddenFiles: false, 104 | CanCreateDirectories: true, 105 | ResolvesAliases: true, 106 | TreatPackagesAsDirectories: true, 107 | }) 108 | fileContent, err := os.ReadFile(openedFile) 109 | if err != nil { 110 | return FileWithContent{}, err 111 | } 112 | a.filename = openedFile 113 | a.markdown = string(fileContent) 114 | a.renderedHTML = lib.RenderMD(a.markdown) 115 | return FileWithContent{ 116 | Name: a.filename, 117 | Content: a.markdown, 118 | HTML: a.renderedHTML, 119 | }, nil 120 | } 121 | 122 | func (a *App) Export() error { 123 | hd, err := homedir.Dir() 124 | if err != nil { 125 | return err 126 | } 127 | chosenPath, err := runtime.SaveFileDialog(a.ctx, runtime.SaveDialogOptions{ 128 | DefaultDirectory: path.Join(hd, "Documents"), 129 | DefaultFilename: a.filename, 130 | Title: "Export to PDF", 131 | ShowHiddenFiles: false, 132 | CanCreateDirectories: true, 133 | TreatPackagesAsDirectories: true, 134 | }) 135 | if err != nil { 136 | return err 137 | } 138 | 139 | return lib.Pdf(chosenPath, a.markdown) 140 | } 141 | -------------------------------------------------------------------------------- /write/build/.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | darwin 3 | windows 4 | -------------------------------------------------------------------------------- /write/build/README.md: -------------------------------------------------------------------------------- 1 | # Build Directory 2 | 3 | The build directory is used to house all the build files and assets for your application. 4 | 5 | The structure is: 6 | 7 | * bin - Output directory 8 | * darwin - macOS specific files 9 | * windows - Windows specific files 10 | 11 | ## Mac 12 | 13 | The `darwin` directory holds files specific to Mac builds. 14 | These may be customised and used as part of the build. To return these files to the default state, simply delete them 15 | and 16 | build with `wails build`. 17 | 18 | The directory contains the following files: 19 | 20 | - `Info.plist` - the main plist file used for Mac builds. It is used when building using `wails build`. 21 | - `Info.dev.plist` - same as the main plist file but used when building using `wails dev`. 22 | 23 | ## Windows 24 | 25 | The `windows` directory contains the manifest and rc files used when building with `wails build`. 26 | These may be customised for your application. To return these files to the default state, simply delete them and 27 | build with `wails build`. 28 | 29 | - `icon.ico` - The icon used for the application. This is used when building using `wails build`. If you wish to 30 | use a different icon, simply replace this file with your own. If it is missing, a new `icon.ico` file 31 | will be created using the `appicon.png` file in the build directory. 32 | - `installer/*` - The files used to create the Windows installer. These are used when building using `wails build`. 33 | - `info.json` - Application details used for Windows builds. The data here will be used by the Windows installer, 34 | as well as the application itself (right click the exe -> properties -> details) 35 | - `wails.exe.manifest` - The main application manifest file. -------------------------------------------------------------------------------- /write/build/appicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ebuckley/write/335bc096973f3b5a368e0257c1ffcd053a6c513c/write/build/appicon.png -------------------------------------------------------------------------------- /write/build/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /write/frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Vite + React + TS + Tailwind 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /write/frontend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "write", 3 | "version": "0.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "write", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "react": "^18.2.0", 12 | "react-dom": "^18.2.0" 13 | }, 14 | "devDependencies": { 15 | "@types/react": "^18.0.17", 16 | "@types/react-dom": "^18.0.6", 17 | "@vitejs/plugin-react": "^2.1.0", 18 | "autoprefixer": "^10.4.12", 19 | "postcss": "^8.4.17", 20 | "tailwindcss": "^3.1.8", 21 | "typescript": "^4.6.4", 22 | "vite": "^3.1.0" 23 | } 24 | }, 25 | "node_modules/@ampproject/remapping": { 26 | "version": "2.2.0", 27 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", 28 | "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", 29 | "dev": true, 30 | "dependencies": { 31 | "@jridgewell/gen-mapping": "^0.1.0", 32 | "@jridgewell/trace-mapping": "^0.3.9" 33 | }, 34 | "engines": { 35 | "node": ">=6.0.0" 36 | } 37 | }, 38 | "node_modules/@babel/code-frame": { 39 | "version": "7.18.6", 40 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", 41 | "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", 42 | "dev": true, 43 | "dependencies": { 44 | "@babel/highlight": "^7.18.6" 45 | }, 46 | "engines": { 47 | "node": ">=6.9.0" 48 | } 49 | }, 50 | "node_modules/@babel/compat-data": { 51 | "version": "7.19.3", 52 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", 53 | "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", 54 | "dev": true, 55 | "engines": { 56 | "node": ">=6.9.0" 57 | } 58 | }, 59 | "node_modules/@babel/core": { 60 | "version": "7.19.3", 61 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", 62 | "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", 63 | "dev": true, 64 | "dependencies": { 65 | "@ampproject/remapping": "^2.1.0", 66 | "@babel/code-frame": "^7.18.6", 67 | "@babel/generator": "^7.19.3", 68 | "@babel/helper-compilation-targets": "^7.19.3", 69 | "@babel/helper-module-transforms": "^7.19.0", 70 | "@babel/helpers": "^7.19.0", 71 | "@babel/parser": "^7.19.3", 72 | "@babel/template": "^7.18.10", 73 | "@babel/traverse": "^7.19.3", 74 | "@babel/types": "^7.19.3", 75 | "convert-source-map": "^1.7.0", 76 | "debug": "^4.1.0", 77 | "gensync": "^1.0.0-beta.2", 78 | "json5": "^2.2.1", 79 | "semver": "^6.3.0" 80 | }, 81 | "engines": { 82 | "node": ">=6.9.0" 83 | }, 84 | "funding": { 85 | "type": "opencollective", 86 | "url": "https://opencollective.com/babel" 87 | } 88 | }, 89 | "node_modules/@babel/generator": { 90 | "version": "7.19.3", 91 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", 92 | "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", 93 | "dev": true, 94 | "dependencies": { 95 | "@babel/types": "^7.19.3", 96 | "@jridgewell/gen-mapping": "^0.3.2", 97 | "jsesc": "^2.5.1" 98 | }, 99 | "engines": { 100 | "node": ">=6.9.0" 101 | } 102 | }, 103 | "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { 104 | "version": "0.3.2", 105 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", 106 | "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", 107 | "dev": true, 108 | "dependencies": { 109 | "@jridgewell/set-array": "^1.0.1", 110 | "@jridgewell/sourcemap-codec": "^1.4.10", 111 | "@jridgewell/trace-mapping": "^0.3.9" 112 | }, 113 | "engines": { 114 | "node": ">=6.0.0" 115 | } 116 | }, 117 | "node_modules/@babel/helper-annotate-as-pure": { 118 | "version": "7.18.6", 119 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", 120 | "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", 121 | "dev": true, 122 | "dependencies": { 123 | "@babel/types": "^7.18.6" 124 | }, 125 | "engines": { 126 | "node": ">=6.9.0" 127 | } 128 | }, 129 | "node_modules/@babel/helper-compilation-targets": { 130 | "version": "7.19.3", 131 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", 132 | "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", 133 | "dev": true, 134 | "dependencies": { 135 | "@babel/compat-data": "^7.19.3", 136 | "@babel/helper-validator-option": "^7.18.6", 137 | "browserslist": "^4.21.3", 138 | "semver": "^6.3.0" 139 | }, 140 | "engines": { 141 | "node": ">=6.9.0" 142 | }, 143 | "peerDependencies": { 144 | "@babel/core": "^7.0.0" 145 | } 146 | }, 147 | "node_modules/@babel/helper-environment-visitor": { 148 | "version": "7.18.9", 149 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", 150 | "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", 151 | "dev": true, 152 | "engines": { 153 | "node": ">=6.9.0" 154 | } 155 | }, 156 | "node_modules/@babel/helper-function-name": { 157 | "version": "7.19.0", 158 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", 159 | "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", 160 | "dev": true, 161 | "dependencies": { 162 | "@babel/template": "^7.18.10", 163 | "@babel/types": "^7.19.0" 164 | }, 165 | "engines": { 166 | "node": ">=6.9.0" 167 | } 168 | }, 169 | "node_modules/@babel/helper-hoist-variables": { 170 | "version": "7.18.6", 171 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", 172 | "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", 173 | "dev": true, 174 | "dependencies": { 175 | "@babel/types": "^7.18.6" 176 | }, 177 | "engines": { 178 | "node": ">=6.9.0" 179 | } 180 | }, 181 | "node_modules/@babel/helper-module-imports": { 182 | "version": "7.18.6", 183 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", 184 | "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", 185 | "dev": true, 186 | "dependencies": { 187 | "@babel/types": "^7.18.6" 188 | }, 189 | "engines": { 190 | "node": ">=6.9.0" 191 | } 192 | }, 193 | "node_modules/@babel/helper-module-transforms": { 194 | "version": "7.19.0", 195 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", 196 | "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", 197 | "dev": true, 198 | "dependencies": { 199 | "@babel/helper-environment-visitor": "^7.18.9", 200 | "@babel/helper-module-imports": "^7.18.6", 201 | "@babel/helper-simple-access": "^7.18.6", 202 | "@babel/helper-split-export-declaration": "^7.18.6", 203 | "@babel/helper-validator-identifier": "^7.18.6", 204 | "@babel/template": "^7.18.10", 205 | "@babel/traverse": "^7.19.0", 206 | "@babel/types": "^7.19.0" 207 | }, 208 | "engines": { 209 | "node": ">=6.9.0" 210 | } 211 | }, 212 | "node_modules/@babel/helper-plugin-utils": { 213 | "version": "7.19.0", 214 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", 215 | "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", 216 | "dev": true, 217 | "engines": { 218 | "node": ">=6.9.0" 219 | } 220 | }, 221 | "node_modules/@babel/helper-simple-access": { 222 | "version": "7.18.6", 223 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", 224 | "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", 225 | "dev": true, 226 | "dependencies": { 227 | "@babel/types": "^7.18.6" 228 | }, 229 | "engines": { 230 | "node": ">=6.9.0" 231 | } 232 | }, 233 | "node_modules/@babel/helper-split-export-declaration": { 234 | "version": "7.18.6", 235 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", 236 | "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", 237 | "dev": true, 238 | "dependencies": { 239 | "@babel/types": "^7.18.6" 240 | }, 241 | "engines": { 242 | "node": ">=6.9.0" 243 | } 244 | }, 245 | "node_modules/@babel/helper-string-parser": { 246 | "version": "7.18.10", 247 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", 248 | "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", 249 | "dev": true, 250 | "engines": { 251 | "node": ">=6.9.0" 252 | } 253 | }, 254 | "node_modules/@babel/helper-validator-identifier": { 255 | "version": "7.19.1", 256 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", 257 | "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", 258 | "dev": true, 259 | "engines": { 260 | "node": ">=6.9.0" 261 | } 262 | }, 263 | "node_modules/@babel/helper-validator-option": { 264 | "version": "7.18.6", 265 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", 266 | "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", 267 | "dev": true, 268 | "engines": { 269 | "node": ">=6.9.0" 270 | } 271 | }, 272 | "node_modules/@babel/helpers": { 273 | "version": "7.19.0", 274 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", 275 | "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", 276 | "dev": true, 277 | "dependencies": { 278 | "@babel/template": "^7.18.10", 279 | "@babel/traverse": "^7.19.0", 280 | "@babel/types": "^7.19.0" 281 | }, 282 | "engines": { 283 | "node": ">=6.9.0" 284 | } 285 | }, 286 | "node_modules/@babel/highlight": { 287 | "version": "7.18.6", 288 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", 289 | "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", 290 | "dev": true, 291 | "dependencies": { 292 | "@babel/helper-validator-identifier": "^7.18.6", 293 | "chalk": "^2.0.0", 294 | "js-tokens": "^4.0.0" 295 | }, 296 | "engines": { 297 | "node": ">=6.9.0" 298 | } 299 | }, 300 | "node_modules/@babel/parser": { 301 | "version": "7.19.3", 302 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", 303 | "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", 304 | "dev": true, 305 | "bin": { 306 | "parser": "bin/babel-parser.js" 307 | }, 308 | "engines": { 309 | "node": ">=6.0.0" 310 | } 311 | }, 312 | "node_modules/@babel/plugin-syntax-jsx": { 313 | "version": "7.18.6", 314 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", 315 | "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", 316 | "dev": true, 317 | "dependencies": { 318 | "@babel/helper-plugin-utils": "^7.18.6" 319 | }, 320 | "engines": { 321 | "node": ">=6.9.0" 322 | }, 323 | "peerDependencies": { 324 | "@babel/core": "^7.0.0-0" 325 | } 326 | }, 327 | "node_modules/@babel/plugin-transform-react-jsx": { 328 | "version": "7.19.0", 329 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", 330 | "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", 331 | "dev": true, 332 | "dependencies": { 333 | "@babel/helper-annotate-as-pure": "^7.18.6", 334 | "@babel/helper-module-imports": "^7.18.6", 335 | "@babel/helper-plugin-utils": "^7.19.0", 336 | "@babel/plugin-syntax-jsx": "^7.18.6", 337 | "@babel/types": "^7.19.0" 338 | }, 339 | "engines": { 340 | "node": ">=6.9.0" 341 | }, 342 | "peerDependencies": { 343 | "@babel/core": "^7.0.0-0" 344 | } 345 | }, 346 | "node_modules/@babel/plugin-transform-react-jsx-development": { 347 | "version": "7.18.6", 348 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", 349 | "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", 350 | "dev": true, 351 | "dependencies": { 352 | "@babel/plugin-transform-react-jsx": "^7.18.6" 353 | }, 354 | "engines": { 355 | "node": ">=6.9.0" 356 | }, 357 | "peerDependencies": { 358 | "@babel/core": "^7.0.0-0" 359 | } 360 | }, 361 | "node_modules/@babel/plugin-transform-react-jsx-self": { 362 | "version": "7.18.6", 363 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", 364 | "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", 365 | "dev": true, 366 | "dependencies": { 367 | "@babel/helper-plugin-utils": "^7.18.6" 368 | }, 369 | "engines": { 370 | "node": ">=6.9.0" 371 | }, 372 | "peerDependencies": { 373 | "@babel/core": "^7.0.0-0" 374 | } 375 | }, 376 | "node_modules/@babel/plugin-transform-react-jsx-source": { 377 | "version": "7.18.6", 378 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz", 379 | "integrity": "sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==", 380 | "dev": true, 381 | "dependencies": { 382 | "@babel/helper-plugin-utils": "^7.18.6" 383 | }, 384 | "engines": { 385 | "node": ">=6.9.0" 386 | }, 387 | "peerDependencies": { 388 | "@babel/core": "^7.0.0-0" 389 | } 390 | }, 391 | "node_modules/@babel/template": { 392 | "version": "7.18.10", 393 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", 394 | "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", 395 | "dev": true, 396 | "dependencies": { 397 | "@babel/code-frame": "^7.18.6", 398 | "@babel/parser": "^7.18.10", 399 | "@babel/types": "^7.18.10" 400 | }, 401 | "engines": { 402 | "node": ">=6.9.0" 403 | } 404 | }, 405 | "node_modules/@babel/traverse": { 406 | "version": "7.19.3", 407 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", 408 | "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", 409 | "dev": true, 410 | "dependencies": { 411 | "@babel/code-frame": "^7.18.6", 412 | "@babel/generator": "^7.19.3", 413 | "@babel/helper-environment-visitor": "^7.18.9", 414 | "@babel/helper-function-name": "^7.19.0", 415 | "@babel/helper-hoist-variables": "^7.18.6", 416 | "@babel/helper-split-export-declaration": "^7.18.6", 417 | "@babel/parser": "^7.19.3", 418 | "@babel/types": "^7.19.3", 419 | "debug": "^4.1.0", 420 | "globals": "^11.1.0" 421 | }, 422 | "engines": { 423 | "node": ">=6.9.0" 424 | } 425 | }, 426 | "node_modules/@babel/types": { 427 | "version": "7.19.3", 428 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", 429 | "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", 430 | "dev": true, 431 | "dependencies": { 432 | "@babel/helper-string-parser": "^7.18.10", 433 | "@babel/helper-validator-identifier": "^7.19.1", 434 | "to-fast-properties": "^2.0.0" 435 | }, 436 | "engines": { 437 | "node": ">=6.9.0" 438 | } 439 | }, 440 | "node_modules/@esbuild/android-arm": { 441 | "version": "0.15.10", 442 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", 443 | "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", 444 | "cpu": [ 445 | "arm" 446 | ], 447 | "dev": true, 448 | "optional": true, 449 | "os": [ 450 | "android" 451 | ], 452 | "engines": { 453 | "node": ">=12" 454 | } 455 | }, 456 | "node_modules/@esbuild/linux-loong64": { 457 | "version": "0.15.10", 458 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", 459 | "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", 460 | "cpu": [ 461 | "loong64" 462 | ], 463 | "dev": true, 464 | "optional": true, 465 | "os": [ 466 | "linux" 467 | ], 468 | "engines": { 469 | "node": ">=12" 470 | } 471 | }, 472 | "node_modules/@jridgewell/gen-mapping": { 473 | "version": "0.1.1", 474 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", 475 | "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", 476 | "dev": true, 477 | "dependencies": { 478 | "@jridgewell/set-array": "^1.0.0", 479 | "@jridgewell/sourcemap-codec": "^1.4.10" 480 | }, 481 | "engines": { 482 | "node": ">=6.0.0" 483 | } 484 | }, 485 | "node_modules/@jridgewell/resolve-uri": { 486 | "version": "3.1.0", 487 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 488 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 489 | "dev": true, 490 | "engines": { 491 | "node": ">=6.0.0" 492 | } 493 | }, 494 | "node_modules/@jridgewell/set-array": { 495 | "version": "1.1.2", 496 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 497 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 498 | "dev": true, 499 | "engines": { 500 | "node": ">=6.0.0" 501 | } 502 | }, 503 | "node_modules/@jridgewell/sourcemap-codec": { 504 | "version": "1.4.14", 505 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 506 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 507 | "dev": true 508 | }, 509 | "node_modules/@jridgewell/trace-mapping": { 510 | "version": "0.3.15", 511 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", 512 | "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", 513 | "dev": true, 514 | "dependencies": { 515 | "@jridgewell/resolve-uri": "^3.0.3", 516 | "@jridgewell/sourcemap-codec": "^1.4.10" 517 | } 518 | }, 519 | "node_modules/@nodelib/fs.scandir": { 520 | "version": "2.1.5", 521 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 522 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 523 | "dev": true, 524 | "dependencies": { 525 | "@nodelib/fs.stat": "2.0.5", 526 | "run-parallel": "^1.1.9" 527 | }, 528 | "engines": { 529 | "node": ">= 8" 530 | } 531 | }, 532 | "node_modules/@nodelib/fs.stat": { 533 | "version": "2.0.5", 534 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 535 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 536 | "dev": true, 537 | "engines": { 538 | "node": ">= 8" 539 | } 540 | }, 541 | "node_modules/@nodelib/fs.walk": { 542 | "version": "1.2.8", 543 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 544 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 545 | "dev": true, 546 | "dependencies": { 547 | "@nodelib/fs.scandir": "2.1.5", 548 | "fastq": "^1.6.0" 549 | }, 550 | "engines": { 551 | "node": ">= 8" 552 | } 553 | }, 554 | "node_modules/@types/prop-types": { 555 | "version": "15.7.5", 556 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", 557 | "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", 558 | "dev": true 559 | }, 560 | "node_modules/@types/react": { 561 | "version": "18.0.21", 562 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", 563 | "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", 564 | "dev": true, 565 | "dependencies": { 566 | "@types/prop-types": "*", 567 | "@types/scheduler": "*", 568 | "csstype": "^3.0.2" 569 | } 570 | }, 571 | "node_modules/@types/react-dom": { 572 | "version": "18.0.6", 573 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", 574 | "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", 575 | "dev": true, 576 | "dependencies": { 577 | "@types/react": "*" 578 | } 579 | }, 580 | "node_modules/@types/scheduler": { 581 | "version": "0.16.2", 582 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", 583 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", 584 | "dev": true 585 | }, 586 | "node_modules/@vitejs/plugin-react": { 587 | "version": "2.1.0", 588 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.1.0.tgz", 589 | "integrity": "sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA==", 590 | "dev": true, 591 | "dependencies": { 592 | "@babel/core": "^7.18.13", 593 | "@babel/plugin-transform-react-jsx": "^7.18.10", 594 | "@babel/plugin-transform-react-jsx-development": "^7.18.6", 595 | "@babel/plugin-transform-react-jsx-self": "^7.18.6", 596 | "@babel/plugin-transform-react-jsx-source": "^7.18.6", 597 | "magic-string": "^0.26.2", 598 | "react-refresh": "^0.14.0" 599 | }, 600 | "engines": { 601 | "node": "^14.18.0 || >=16.0.0" 602 | }, 603 | "peerDependencies": { 604 | "vite": "^3.0.0" 605 | } 606 | }, 607 | "node_modules/acorn": { 608 | "version": "7.4.1", 609 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 610 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 611 | "dev": true, 612 | "bin": { 613 | "acorn": "bin/acorn" 614 | }, 615 | "engines": { 616 | "node": ">=0.4.0" 617 | } 618 | }, 619 | "node_modules/acorn-node": { 620 | "version": "1.8.2", 621 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 622 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 623 | "dev": true, 624 | "dependencies": { 625 | "acorn": "^7.0.0", 626 | "acorn-walk": "^7.0.0", 627 | "xtend": "^4.0.2" 628 | } 629 | }, 630 | "node_modules/acorn-walk": { 631 | "version": "7.2.0", 632 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 633 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 634 | "dev": true, 635 | "engines": { 636 | "node": ">=0.4.0" 637 | } 638 | }, 639 | "node_modules/ansi-styles": { 640 | "version": "3.2.1", 641 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 642 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 643 | "dev": true, 644 | "dependencies": { 645 | "color-convert": "^1.9.0" 646 | }, 647 | "engines": { 648 | "node": ">=4" 649 | } 650 | }, 651 | "node_modules/anymatch": { 652 | "version": "3.1.2", 653 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 654 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 655 | "dev": true, 656 | "dependencies": { 657 | "normalize-path": "^3.0.0", 658 | "picomatch": "^2.0.4" 659 | }, 660 | "engines": { 661 | "node": ">= 8" 662 | } 663 | }, 664 | "node_modules/arg": { 665 | "version": "5.0.2", 666 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 667 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 668 | "dev": true 669 | }, 670 | "node_modules/autoprefixer": { 671 | "version": "10.4.12", 672 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", 673 | "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", 674 | "dev": true, 675 | "funding": [ 676 | { 677 | "type": "opencollective", 678 | "url": "https://opencollective.com/postcss/" 679 | }, 680 | { 681 | "type": "tidelift", 682 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 683 | } 684 | ], 685 | "dependencies": { 686 | "browserslist": "^4.21.4", 687 | "caniuse-lite": "^1.0.30001407", 688 | "fraction.js": "^4.2.0", 689 | "normalize-range": "^0.1.2", 690 | "picocolors": "^1.0.0", 691 | "postcss-value-parser": "^4.2.0" 692 | }, 693 | "bin": { 694 | "autoprefixer": "bin/autoprefixer" 695 | }, 696 | "engines": { 697 | "node": "^10 || ^12 || >=14" 698 | }, 699 | "peerDependencies": { 700 | "postcss": "^8.1.0" 701 | } 702 | }, 703 | "node_modules/binary-extensions": { 704 | "version": "2.2.0", 705 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 706 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 707 | "dev": true, 708 | "engines": { 709 | "node": ">=8" 710 | } 711 | }, 712 | "node_modules/braces": { 713 | "version": "3.0.2", 714 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 715 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 716 | "dev": true, 717 | "dependencies": { 718 | "fill-range": "^7.0.1" 719 | }, 720 | "engines": { 721 | "node": ">=8" 722 | } 723 | }, 724 | "node_modules/browserslist": { 725 | "version": "4.21.4", 726 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 727 | "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 728 | "dev": true, 729 | "funding": [ 730 | { 731 | "type": "opencollective", 732 | "url": "https://opencollective.com/browserslist" 733 | }, 734 | { 735 | "type": "tidelift", 736 | "url": "https://tidelift.com/funding/github/npm/browserslist" 737 | } 738 | ], 739 | "dependencies": { 740 | "caniuse-lite": "^1.0.30001400", 741 | "electron-to-chromium": "^1.4.251", 742 | "node-releases": "^2.0.6", 743 | "update-browserslist-db": "^1.0.9" 744 | }, 745 | "bin": { 746 | "browserslist": "cli.js" 747 | }, 748 | "engines": { 749 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 750 | } 751 | }, 752 | "node_modules/camelcase-css": { 753 | "version": "2.0.1", 754 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 755 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 756 | "dev": true, 757 | "engines": { 758 | "node": ">= 6" 759 | } 760 | }, 761 | "node_modules/caniuse-lite": { 762 | "version": "1.0.30001414", 763 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", 764 | "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", 765 | "dev": true, 766 | "funding": [ 767 | { 768 | "type": "opencollective", 769 | "url": "https://opencollective.com/browserslist" 770 | }, 771 | { 772 | "type": "tidelift", 773 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 774 | } 775 | ] 776 | }, 777 | "node_modules/chalk": { 778 | "version": "2.4.2", 779 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 780 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 781 | "dev": true, 782 | "dependencies": { 783 | "ansi-styles": "^3.2.1", 784 | "escape-string-regexp": "^1.0.5", 785 | "supports-color": "^5.3.0" 786 | }, 787 | "engines": { 788 | "node": ">=4" 789 | } 790 | }, 791 | "node_modules/chokidar": { 792 | "version": "3.5.3", 793 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 794 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 795 | "dev": true, 796 | "funding": [ 797 | { 798 | "type": "individual", 799 | "url": "https://paulmillr.com/funding/" 800 | } 801 | ], 802 | "dependencies": { 803 | "anymatch": "~3.1.2", 804 | "braces": "~3.0.2", 805 | "glob-parent": "~5.1.2", 806 | "is-binary-path": "~2.1.0", 807 | "is-glob": "~4.0.1", 808 | "normalize-path": "~3.0.0", 809 | "readdirp": "~3.6.0" 810 | }, 811 | "engines": { 812 | "node": ">= 8.10.0" 813 | }, 814 | "optionalDependencies": { 815 | "fsevents": "~2.3.2" 816 | } 817 | }, 818 | "node_modules/chokidar/node_modules/glob-parent": { 819 | "version": "5.1.2", 820 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 821 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 822 | "dev": true, 823 | "dependencies": { 824 | "is-glob": "^4.0.1" 825 | }, 826 | "engines": { 827 | "node": ">= 6" 828 | } 829 | }, 830 | "node_modules/color-convert": { 831 | "version": "1.9.3", 832 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 833 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 834 | "dev": true, 835 | "dependencies": { 836 | "color-name": "1.1.3" 837 | } 838 | }, 839 | "node_modules/color-name": { 840 | "version": "1.1.3", 841 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 842 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 843 | "dev": true 844 | }, 845 | "node_modules/convert-source-map": { 846 | "version": "1.8.0", 847 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 848 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 849 | "dev": true, 850 | "dependencies": { 851 | "safe-buffer": "~5.1.1" 852 | } 853 | }, 854 | "node_modules/cssesc": { 855 | "version": "3.0.0", 856 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 857 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 858 | "dev": true, 859 | "bin": { 860 | "cssesc": "bin/cssesc" 861 | }, 862 | "engines": { 863 | "node": ">=4" 864 | } 865 | }, 866 | "node_modules/csstype": { 867 | "version": "3.1.1", 868 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", 869 | "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", 870 | "dev": true 871 | }, 872 | "node_modules/debug": { 873 | "version": "4.3.4", 874 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 875 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 876 | "dev": true, 877 | "dependencies": { 878 | "ms": "2.1.2" 879 | }, 880 | "engines": { 881 | "node": ">=6.0" 882 | }, 883 | "peerDependenciesMeta": { 884 | "supports-color": { 885 | "optional": true 886 | } 887 | } 888 | }, 889 | "node_modules/defined": { 890 | "version": "1.0.0", 891 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 892 | "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", 893 | "dev": true 894 | }, 895 | "node_modules/detective": { 896 | "version": "5.2.1", 897 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", 898 | "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", 899 | "dev": true, 900 | "dependencies": { 901 | "acorn-node": "^1.8.2", 902 | "defined": "^1.0.0", 903 | "minimist": "^1.2.6" 904 | }, 905 | "bin": { 906 | "detective": "bin/detective.js" 907 | }, 908 | "engines": { 909 | "node": ">=0.8.0" 910 | } 911 | }, 912 | "node_modules/didyoumean": { 913 | "version": "1.2.2", 914 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 915 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 916 | "dev": true 917 | }, 918 | "node_modules/dlv": { 919 | "version": "1.1.3", 920 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 921 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 922 | "dev": true 923 | }, 924 | "node_modules/electron-to-chromium": { 925 | "version": "1.4.270", 926 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", 927 | "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", 928 | "dev": true 929 | }, 930 | "node_modules/esbuild": { 931 | "version": "0.15.10", 932 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", 933 | "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", 934 | "dev": true, 935 | "hasInstallScript": true, 936 | "bin": { 937 | "esbuild": "bin/esbuild" 938 | }, 939 | "engines": { 940 | "node": ">=12" 941 | }, 942 | "optionalDependencies": { 943 | "@esbuild/android-arm": "0.15.10", 944 | "@esbuild/linux-loong64": "0.15.10", 945 | "esbuild-android-64": "0.15.10", 946 | "esbuild-android-arm64": "0.15.10", 947 | "esbuild-darwin-64": "0.15.10", 948 | "esbuild-darwin-arm64": "0.15.10", 949 | "esbuild-freebsd-64": "0.15.10", 950 | "esbuild-freebsd-arm64": "0.15.10", 951 | "esbuild-linux-32": "0.15.10", 952 | "esbuild-linux-64": "0.15.10", 953 | "esbuild-linux-arm": "0.15.10", 954 | "esbuild-linux-arm64": "0.15.10", 955 | "esbuild-linux-mips64le": "0.15.10", 956 | "esbuild-linux-ppc64le": "0.15.10", 957 | "esbuild-linux-riscv64": "0.15.10", 958 | "esbuild-linux-s390x": "0.15.10", 959 | "esbuild-netbsd-64": "0.15.10", 960 | "esbuild-openbsd-64": "0.15.10", 961 | "esbuild-sunos-64": "0.15.10", 962 | "esbuild-windows-32": "0.15.10", 963 | "esbuild-windows-64": "0.15.10", 964 | "esbuild-windows-arm64": "0.15.10" 965 | } 966 | }, 967 | "node_modules/esbuild-android-64": { 968 | "version": "0.15.10", 969 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", 970 | "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", 971 | "cpu": [ 972 | "x64" 973 | ], 974 | "dev": true, 975 | "optional": true, 976 | "os": [ 977 | "android" 978 | ], 979 | "engines": { 980 | "node": ">=12" 981 | } 982 | }, 983 | "node_modules/esbuild-android-arm64": { 984 | "version": "0.15.10", 985 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", 986 | "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", 987 | "cpu": [ 988 | "arm64" 989 | ], 990 | "dev": true, 991 | "optional": true, 992 | "os": [ 993 | "android" 994 | ], 995 | "engines": { 996 | "node": ">=12" 997 | } 998 | }, 999 | "node_modules/esbuild-darwin-64": { 1000 | "version": "0.15.10", 1001 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", 1002 | "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", 1003 | "cpu": [ 1004 | "x64" 1005 | ], 1006 | "dev": true, 1007 | "optional": true, 1008 | "os": [ 1009 | "darwin" 1010 | ], 1011 | "engines": { 1012 | "node": ">=12" 1013 | } 1014 | }, 1015 | "node_modules/esbuild-darwin-arm64": { 1016 | "version": "0.15.10", 1017 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", 1018 | "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", 1019 | "cpu": [ 1020 | "arm64" 1021 | ], 1022 | "dev": true, 1023 | "optional": true, 1024 | "os": [ 1025 | "darwin" 1026 | ], 1027 | "engines": { 1028 | "node": ">=12" 1029 | } 1030 | }, 1031 | "node_modules/esbuild-freebsd-64": { 1032 | "version": "0.15.10", 1033 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", 1034 | "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", 1035 | "cpu": [ 1036 | "x64" 1037 | ], 1038 | "dev": true, 1039 | "optional": true, 1040 | "os": [ 1041 | "freebsd" 1042 | ], 1043 | "engines": { 1044 | "node": ">=12" 1045 | } 1046 | }, 1047 | "node_modules/esbuild-freebsd-arm64": { 1048 | "version": "0.15.10", 1049 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", 1050 | "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", 1051 | "cpu": [ 1052 | "arm64" 1053 | ], 1054 | "dev": true, 1055 | "optional": true, 1056 | "os": [ 1057 | "freebsd" 1058 | ], 1059 | "engines": { 1060 | "node": ">=12" 1061 | } 1062 | }, 1063 | "node_modules/esbuild-linux-32": { 1064 | "version": "0.15.10", 1065 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", 1066 | "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", 1067 | "cpu": [ 1068 | "ia32" 1069 | ], 1070 | "dev": true, 1071 | "optional": true, 1072 | "os": [ 1073 | "linux" 1074 | ], 1075 | "engines": { 1076 | "node": ">=12" 1077 | } 1078 | }, 1079 | "node_modules/esbuild-linux-64": { 1080 | "version": "0.15.10", 1081 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", 1082 | "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", 1083 | "cpu": [ 1084 | "x64" 1085 | ], 1086 | "dev": true, 1087 | "optional": true, 1088 | "os": [ 1089 | "linux" 1090 | ], 1091 | "engines": { 1092 | "node": ">=12" 1093 | } 1094 | }, 1095 | "node_modules/esbuild-linux-arm": { 1096 | "version": "0.15.10", 1097 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", 1098 | "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", 1099 | "cpu": [ 1100 | "arm" 1101 | ], 1102 | "dev": true, 1103 | "optional": true, 1104 | "os": [ 1105 | "linux" 1106 | ], 1107 | "engines": { 1108 | "node": ">=12" 1109 | } 1110 | }, 1111 | "node_modules/esbuild-linux-arm64": { 1112 | "version": "0.15.10", 1113 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", 1114 | "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", 1115 | "cpu": [ 1116 | "arm64" 1117 | ], 1118 | "dev": true, 1119 | "optional": true, 1120 | "os": [ 1121 | "linux" 1122 | ], 1123 | "engines": { 1124 | "node": ">=12" 1125 | } 1126 | }, 1127 | "node_modules/esbuild-linux-mips64le": { 1128 | "version": "0.15.10", 1129 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", 1130 | "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", 1131 | "cpu": [ 1132 | "mips64el" 1133 | ], 1134 | "dev": true, 1135 | "optional": true, 1136 | "os": [ 1137 | "linux" 1138 | ], 1139 | "engines": { 1140 | "node": ">=12" 1141 | } 1142 | }, 1143 | "node_modules/esbuild-linux-ppc64le": { 1144 | "version": "0.15.10", 1145 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", 1146 | "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", 1147 | "cpu": [ 1148 | "ppc64" 1149 | ], 1150 | "dev": true, 1151 | "optional": true, 1152 | "os": [ 1153 | "linux" 1154 | ], 1155 | "engines": { 1156 | "node": ">=12" 1157 | } 1158 | }, 1159 | "node_modules/esbuild-linux-riscv64": { 1160 | "version": "0.15.10", 1161 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", 1162 | "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", 1163 | "cpu": [ 1164 | "riscv64" 1165 | ], 1166 | "dev": true, 1167 | "optional": true, 1168 | "os": [ 1169 | "linux" 1170 | ], 1171 | "engines": { 1172 | "node": ">=12" 1173 | } 1174 | }, 1175 | "node_modules/esbuild-linux-s390x": { 1176 | "version": "0.15.10", 1177 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", 1178 | "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", 1179 | "cpu": [ 1180 | "s390x" 1181 | ], 1182 | "dev": true, 1183 | "optional": true, 1184 | "os": [ 1185 | "linux" 1186 | ], 1187 | "engines": { 1188 | "node": ">=12" 1189 | } 1190 | }, 1191 | "node_modules/esbuild-netbsd-64": { 1192 | "version": "0.15.10", 1193 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", 1194 | "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", 1195 | "cpu": [ 1196 | "x64" 1197 | ], 1198 | "dev": true, 1199 | "optional": true, 1200 | "os": [ 1201 | "netbsd" 1202 | ], 1203 | "engines": { 1204 | "node": ">=12" 1205 | } 1206 | }, 1207 | "node_modules/esbuild-openbsd-64": { 1208 | "version": "0.15.10", 1209 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", 1210 | "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", 1211 | "cpu": [ 1212 | "x64" 1213 | ], 1214 | "dev": true, 1215 | "optional": true, 1216 | "os": [ 1217 | "openbsd" 1218 | ], 1219 | "engines": { 1220 | "node": ">=12" 1221 | } 1222 | }, 1223 | "node_modules/esbuild-sunos-64": { 1224 | "version": "0.15.10", 1225 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", 1226 | "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", 1227 | "cpu": [ 1228 | "x64" 1229 | ], 1230 | "dev": true, 1231 | "optional": true, 1232 | "os": [ 1233 | "sunos" 1234 | ], 1235 | "engines": { 1236 | "node": ">=12" 1237 | } 1238 | }, 1239 | "node_modules/esbuild-windows-32": { 1240 | "version": "0.15.10", 1241 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", 1242 | "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", 1243 | "cpu": [ 1244 | "ia32" 1245 | ], 1246 | "dev": true, 1247 | "optional": true, 1248 | "os": [ 1249 | "win32" 1250 | ], 1251 | "engines": { 1252 | "node": ">=12" 1253 | } 1254 | }, 1255 | "node_modules/esbuild-windows-64": { 1256 | "version": "0.15.10", 1257 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", 1258 | "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", 1259 | "cpu": [ 1260 | "x64" 1261 | ], 1262 | "dev": true, 1263 | "optional": true, 1264 | "os": [ 1265 | "win32" 1266 | ], 1267 | "engines": { 1268 | "node": ">=12" 1269 | } 1270 | }, 1271 | "node_modules/esbuild-windows-arm64": { 1272 | "version": "0.15.10", 1273 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", 1274 | "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", 1275 | "cpu": [ 1276 | "arm64" 1277 | ], 1278 | "dev": true, 1279 | "optional": true, 1280 | "os": [ 1281 | "win32" 1282 | ], 1283 | "engines": { 1284 | "node": ">=12" 1285 | } 1286 | }, 1287 | "node_modules/escalade": { 1288 | "version": "3.1.1", 1289 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 1290 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 1291 | "dev": true, 1292 | "engines": { 1293 | "node": ">=6" 1294 | } 1295 | }, 1296 | "node_modules/escape-string-regexp": { 1297 | "version": "1.0.5", 1298 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 1299 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 1300 | "dev": true, 1301 | "engines": { 1302 | "node": ">=0.8.0" 1303 | } 1304 | }, 1305 | "node_modules/fast-glob": { 1306 | "version": "3.2.12", 1307 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 1308 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 1309 | "dev": true, 1310 | "dependencies": { 1311 | "@nodelib/fs.stat": "^2.0.2", 1312 | "@nodelib/fs.walk": "^1.2.3", 1313 | "glob-parent": "^5.1.2", 1314 | "merge2": "^1.3.0", 1315 | "micromatch": "^4.0.4" 1316 | }, 1317 | "engines": { 1318 | "node": ">=8.6.0" 1319 | } 1320 | }, 1321 | "node_modules/fast-glob/node_modules/glob-parent": { 1322 | "version": "5.1.2", 1323 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1324 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1325 | "dev": true, 1326 | "dependencies": { 1327 | "is-glob": "^4.0.1" 1328 | }, 1329 | "engines": { 1330 | "node": ">= 6" 1331 | } 1332 | }, 1333 | "node_modules/fastq": { 1334 | "version": "1.13.0", 1335 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 1336 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 1337 | "dev": true, 1338 | "dependencies": { 1339 | "reusify": "^1.0.4" 1340 | } 1341 | }, 1342 | "node_modules/fill-range": { 1343 | "version": "7.0.1", 1344 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1345 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1346 | "dev": true, 1347 | "dependencies": { 1348 | "to-regex-range": "^5.0.1" 1349 | }, 1350 | "engines": { 1351 | "node": ">=8" 1352 | } 1353 | }, 1354 | "node_modules/fraction.js": { 1355 | "version": "4.2.0", 1356 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 1357 | "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 1358 | "dev": true, 1359 | "engines": { 1360 | "node": "*" 1361 | }, 1362 | "funding": { 1363 | "type": "patreon", 1364 | "url": "https://www.patreon.com/infusion" 1365 | } 1366 | }, 1367 | "node_modules/fsevents": { 1368 | "version": "2.3.2", 1369 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 1370 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 1371 | "dev": true, 1372 | "hasInstallScript": true, 1373 | "optional": true, 1374 | "os": [ 1375 | "darwin" 1376 | ], 1377 | "engines": { 1378 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1379 | } 1380 | }, 1381 | "node_modules/function-bind": { 1382 | "version": "1.1.1", 1383 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1384 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 1385 | "dev": true 1386 | }, 1387 | "node_modules/gensync": { 1388 | "version": "1.0.0-beta.2", 1389 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1390 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1391 | "dev": true, 1392 | "engines": { 1393 | "node": ">=6.9.0" 1394 | } 1395 | }, 1396 | "node_modules/glob-parent": { 1397 | "version": "6.0.2", 1398 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1399 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1400 | "dev": true, 1401 | "dependencies": { 1402 | "is-glob": "^4.0.3" 1403 | }, 1404 | "engines": { 1405 | "node": ">=10.13.0" 1406 | } 1407 | }, 1408 | "node_modules/globals": { 1409 | "version": "11.12.0", 1410 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1411 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1412 | "dev": true, 1413 | "engines": { 1414 | "node": ">=4" 1415 | } 1416 | }, 1417 | "node_modules/has": { 1418 | "version": "1.0.3", 1419 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1420 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1421 | "dev": true, 1422 | "dependencies": { 1423 | "function-bind": "^1.1.1" 1424 | }, 1425 | "engines": { 1426 | "node": ">= 0.4.0" 1427 | } 1428 | }, 1429 | "node_modules/has-flag": { 1430 | "version": "3.0.0", 1431 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1432 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 1433 | "dev": true, 1434 | "engines": { 1435 | "node": ">=4" 1436 | } 1437 | }, 1438 | "node_modules/is-binary-path": { 1439 | "version": "2.1.0", 1440 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1441 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1442 | "dev": true, 1443 | "dependencies": { 1444 | "binary-extensions": "^2.0.0" 1445 | }, 1446 | "engines": { 1447 | "node": ">=8" 1448 | } 1449 | }, 1450 | "node_modules/is-core-module": { 1451 | "version": "2.10.0", 1452 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 1453 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 1454 | "dev": true, 1455 | "dependencies": { 1456 | "has": "^1.0.3" 1457 | }, 1458 | "funding": { 1459 | "url": "https://github.com/sponsors/ljharb" 1460 | } 1461 | }, 1462 | "node_modules/is-extglob": { 1463 | "version": "2.1.1", 1464 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1465 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1466 | "dev": true, 1467 | "engines": { 1468 | "node": ">=0.10.0" 1469 | } 1470 | }, 1471 | "node_modules/is-glob": { 1472 | "version": "4.0.3", 1473 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1474 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1475 | "dev": true, 1476 | "dependencies": { 1477 | "is-extglob": "^2.1.1" 1478 | }, 1479 | "engines": { 1480 | "node": ">=0.10.0" 1481 | } 1482 | }, 1483 | "node_modules/is-number": { 1484 | "version": "7.0.0", 1485 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1486 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1487 | "dev": true, 1488 | "engines": { 1489 | "node": ">=0.12.0" 1490 | } 1491 | }, 1492 | "node_modules/js-tokens": { 1493 | "version": "4.0.0", 1494 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1495 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 1496 | }, 1497 | "node_modules/jsesc": { 1498 | "version": "2.5.2", 1499 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 1500 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 1501 | "dev": true, 1502 | "bin": { 1503 | "jsesc": "bin/jsesc" 1504 | }, 1505 | "engines": { 1506 | "node": ">=4" 1507 | } 1508 | }, 1509 | "node_modules/json5": { 1510 | "version": "2.2.1", 1511 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", 1512 | "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", 1513 | "dev": true, 1514 | "bin": { 1515 | "json5": "lib/cli.js" 1516 | }, 1517 | "engines": { 1518 | "node": ">=6" 1519 | } 1520 | }, 1521 | "node_modules/lilconfig": { 1522 | "version": "2.0.6", 1523 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", 1524 | "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", 1525 | "dev": true, 1526 | "engines": { 1527 | "node": ">=10" 1528 | } 1529 | }, 1530 | "node_modules/loose-envify": { 1531 | "version": "1.4.0", 1532 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 1533 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 1534 | "dependencies": { 1535 | "js-tokens": "^3.0.0 || ^4.0.0" 1536 | }, 1537 | "bin": { 1538 | "loose-envify": "cli.js" 1539 | } 1540 | }, 1541 | "node_modules/magic-string": { 1542 | "version": "0.26.5", 1543 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.5.tgz", 1544 | "integrity": "sha512-yXUIYOOQnEHKHOftp5shMWpB9ImfgfDJpapa38j/qMtTj5QHWucvxP4lUtuRmHT9vAzvtpHkWKXW9xBwimXeNg==", 1545 | "dev": true, 1546 | "dependencies": { 1547 | "sourcemap-codec": "^1.4.8" 1548 | }, 1549 | "engines": { 1550 | "node": ">=12" 1551 | } 1552 | }, 1553 | "node_modules/merge2": { 1554 | "version": "1.4.1", 1555 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 1556 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 1557 | "dev": true, 1558 | "engines": { 1559 | "node": ">= 8" 1560 | } 1561 | }, 1562 | "node_modules/micromatch": { 1563 | "version": "4.0.5", 1564 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 1565 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 1566 | "dev": true, 1567 | "dependencies": { 1568 | "braces": "^3.0.2", 1569 | "picomatch": "^2.3.1" 1570 | }, 1571 | "engines": { 1572 | "node": ">=8.6" 1573 | } 1574 | }, 1575 | "node_modules/minimist": { 1576 | "version": "1.2.6", 1577 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1578 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 1579 | "dev": true 1580 | }, 1581 | "node_modules/ms": { 1582 | "version": "2.1.2", 1583 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1584 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1585 | "dev": true 1586 | }, 1587 | "node_modules/nanoid": { 1588 | "version": "3.3.4", 1589 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 1590 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 1591 | "dev": true, 1592 | "bin": { 1593 | "nanoid": "bin/nanoid.cjs" 1594 | }, 1595 | "engines": { 1596 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1597 | } 1598 | }, 1599 | "node_modules/node-releases": { 1600 | "version": "2.0.6", 1601 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", 1602 | "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", 1603 | "dev": true 1604 | }, 1605 | "node_modules/normalize-path": { 1606 | "version": "3.0.0", 1607 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1608 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1609 | "dev": true, 1610 | "engines": { 1611 | "node": ">=0.10.0" 1612 | } 1613 | }, 1614 | "node_modules/normalize-range": { 1615 | "version": "0.1.2", 1616 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 1617 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 1618 | "dev": true, 1619 | "engines": { 1620 | "node": ">=0.10.0" 1621 | } 1622 | }, 1623 | "node_modules/object-hash": { 1624 | "version": "3.0.0", 1625 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 1626 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 1627 | "dev": true, 1628 | "engines": { 1629 | "node": ">= 6" 1630 | } 1631 | }, 1632 | "node_modules/path-parse": { 1633 | "version": "1.0.7", 1634 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1635 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1636 | "dev": true 1637 | }, 1638 | "node_modules/picocolors": { 1639 | "version": "1.0.0", 1640 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1641 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 1642 | "dev": true 1643 | }, 1644 | "node_modules/picomatch": { 1645 | "version": "2.3.1", 1646 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1647 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1648 | "dev": true, 1649 | "engines": { 1650 | "node": ">=8.6" 1651 | }, 1652 | "funding": { 1653 | "url": "https://github.com/sponsors/jonschlinkert" 1654 | } 1655 | }, 1656 | "node_modules/pify": { 1657 | "version": "2.3.0", 1658 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1659 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 1660 | "dev": true, 1661 | "engines": { 1662 | "node": ">=0.10.0" 1663 | } 1664 | }, 1665 | "node_modules/postcss": { 1666 | "version": "8.4.17", 1667 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", 1668 | "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", 1669 | "dev": true, 1670 | "funding": [ 1671 | { 1672 | "type": "opencollective", 1673 | "url": "https://opencollective.com/postcss/" 1674 | }, 1675 | { 1676 | "type": "tidelift", 1677 | "url": "https://tidelift.com/funding/github/npm/postcss" 1678 | } 1679 | ], 1680 | "dependencies": { 1681 | "nanoid": "^3.3.4", 1682 | "picocolors": "^1.0.0", 1683 | "source-map-js": "^1.0.2" 1684 | }, 1685 | "engines": { 1686 | "node": "^10 || ^12 || >=14" 1687 | } 1688 | }, 1689 | "node_modules/postcss-import": { 1690 | "version": "14.1.0", 1691 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", 1692 | "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", 1693 | "dev": true, 1694 | "dependencies": { 1695 | "postcss-value-parser": "^4.0.0", 1696 | "read-cache": "^1.0.0", 1697 | "resolve": "^1.1.7" 1698 | }, 1699 | "engines": { 1700 | "node": ">=10.0.0" 1701 | }, 1702 | "peerDependencies": { 1703 | "postcss": "^8.0.0" 1704 | } 1705 | }, 1706 | "node_modules/postcss-js": { 1707 | "version": "4.0.0", 1708 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 1709 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 1710 | "dev": true, 1711 | "dependencies": { 1712 | "camelcase-css": "^2.0.1" 1713 | }, 1714 | "engines": { 1715 | "node": "^12 || ^14 || >= 16" 1716 | }, 1717 | "funding": { 1718 | "type": "opencollective", 1719 | "url": "https://opencollective.com/postcss/" 1720 | }, 1721 | "peerDependencies": { 1722 | "postcss": "^8.3.3" 1723 | } 1724 | }, 1725 | "node_modules/postcss-load-config": { 1726 | "version": "3.1.4", 1727 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 1728 | "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 1729 | "dev": true, 1730 | "dependencies": { 1731 | "lilconfig": "^2.0.5", 1732 | "yaml": "^1.10.2" 1733 | }, 1734 | "engines": { 1735 | "node": ">= 10" 1736 | }, 1737 | "funding": { 1738 | "type": "opencollective", 1739 | "url": "https://opencollective.com/postcss/" 1740 | }, 1741 | "peerDependencies": { 1742 | "postcss": ">=8.0.9", 1743 | "ts-node": ">=9.0.0" 1744 | }, 1745 | "peerDependenciesMeta": { 1746 | "postcss": { 1747 | "optional": true 1748 | }, 1749 | "ts-node": { 1750 | "optional": true 1751 | } 1752 | } 1753 | }, 1754 | "node_modules/postcss-nested": { 1755 | "version": "5.0.6", 1756 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", 1757 | "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", 1758 | "dev": true, 1759 | "dependencies": { 1760 | "postcss-selector-parser": "^6.0.6" 1761 | }, 1762 | "engines": { 1763 | "node": ">=12.0" 1764 | }, 1765 | "funding": { 1766 | "type": "opencollective", 1767 | "url": "https://opencollective.com/postcss/" 1768 | }, 1769 | "peerDependencies": { 1770 | "postcss": "^8.2.14" 1771 | } 1772 | }, 1773 | "node_modules/postcss-selector-parser": { 1774 | "version": "6.0.10", 1775 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", 1776 | "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", 1777 | "dev": true, 1778 | "dependencies": { 1779 | "cssesc": "^3.0.0", 1780 | "util-deprecate": "^1.0.2" 1781 | }, 1782 | "engines": { 1783 | "node": ">=4" 1784 | } 1785 | }, 1786 | "node_modules/postcss-value-parser": { 1787 | "version": "4.2.0", 1788 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 1789 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 1790 | "dev": true 1791 | }, 1792 | "node_modules/queue-microtask": { 1793 | "version": "1.2.3", 1794 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1795 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1796 | "dev": true, 1797 | "funding": [ 1798 | { 1799 | "type": "github", 1800 | "url": "https://github.com/sponsors/feross" 1801 | }, 1802 | { 1803 | "type": "patreon", 1804 | "url": "https://www.patreon.com/feross" 1805 | }, 1806 | { 1807 | "type": "consulting", 1808 | "url": "https://feross.org/support" 1809 | } 1810 | ] 1811 | }, 1812 | "node_modules/quick-lru": { 1813 | "version": "5.1.1", 1814 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 1815 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 1816 | "dev": true, 1817 | "engines": { 1818 | "node": ">=10" 1819 | }, 1820 | "funding": { 1821 | "url": "https://github.com/sponsors/sindresorhus" 1822 | } 1823 | }, 1824 | "node_modules/react": { 1825 | "version": "18.2.0", 1826 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 1827 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 1828 | "dependencies": { 1829 | "loose-envify": "^1.1.0" 1830 | }, 1831 | "engines": { 1832 | "node": ">=0.10.0" 1833 | } 1834 | }, 1835 | "node_modules/react-dom": { 1836 | "version": "18.2.0", 1837 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 1838 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 1839 | "dependencies": { 1840 | "loose-envify": "^1.1.0", 1841 | "scheduler": "^0.23.0" 1842 | }, 1843 | "peerDependencies": { 1844 | "react": "^18.2.0" 1845 | } 1846 | }, 1847 | "node_modules/react-refresh": { 1848 | "version": "0.14.0", 1849 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", 1850 | "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", 1851 | "dev": true, 1852 | "engines": { 1853 | "node": ">=0.10.0" 1854 | } 1855 | }, 1856 | "node_modules/read-cache": { 1857 | "version": "1.0.0", 1858 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 1859 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 1860 | "dev": true, 1861 | "dependencies": { 1862 | "pify": "^2.3.0" 1863 | } 1864 | }, 1865 | "node_modules/readdirp": { 1866 | "version": "3.6.0", 1867 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1868 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1869 | "dev": true, 1870 | "dependencies": { 1871 | "picomatch": "^2.2.1" 1872 | }, 1873 | "engines": { 1874 | "node": ">=8.10.0" 1875 | } 1876 | }, 1877 | "node_modules/resolve": { 1878 | "version": "1.22.1", 1879 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1880 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1881 | "dev": true, 1882 | "dependencies": { 1883 | "is-core-module": "^2.9.0", 1884 | "path-parse": "^1.0.7", 1885 | "supports-preserve-symlinks-flag": "^1.0.0" 1886 | }, 1887 | "bin": { 1888 | "resolve": "bin/resolve" 1889 | }, 1890 | "funding": { 1891 | "url": "https://github.com/sponsors/ljharb" 1892 | } 1893 | }, 1894 | "node_modules/reusify": { 1895 | "version": "1.0.4", 1896 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 1897 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 1898 | "dev": true, 1899 | "engines": { 1900 | "iojs": ">=1.0.0", 1901 | "node": ">=0.10.0" 1902 | } 1903 | }, 1904 | "node_modules/rollup": { 1905 | "version": "2.78.1", 1906 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", 1907 | "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", 1908 | "dev": true, 1909 | "bin": { 1910 | "rollup": "dist/bin/rollup" 1911 | }, 1912 | "engines": { 1913 | "node": ">=10.0.0" 1914 | }, 1915 | "optionalDependencies": { 1916 | "fsevents": "~2.3.2" 1917 | } 1918 | }, 1919 | "node_modules/run-parallel": { 1920 | "version": "1.2.0", 1921 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 1922 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 1923 | "dev": true, 1924 | "funding": [ 1925 | { 1926 | "type": "github", 1927 | "url": "https://github.com/sponsors/feross" 1928 | }, 1929 | { 1930 | "type": "patreon", 1931 | "url": "https://www.patreon.com/feross" 1932 | }, 1933 | { 1934 | "type": "consulting", 1935 | "url": "https://feross.org/support" 1936 | } 1937 | ], 1938 | "dependencies": { 1939 | "queue-microtask": "^1.2.2" 1940 | } 1941 | }, 1942 | "node_modules/safe-buffer": { 1943 | "version": "5.1.2", 1944 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1945 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1946 | "dev": true 1947 | }, 1948 | "node_modules/scheduler": { 1949 | "version": "0.23.0", 1950 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 1951 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 1952 | "dependencies": { 1953 | "loose-envify": "^1.1.0" 1954 | } 1955 | }, 1956 | "node_modules/semver": { 1957 | "version": "6.3.0", 1958 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1959 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 1960 | "dev": true, 1961 | "bin": { 1962 | "semver": "bin/semver.js" 1963 | } 1964 | }, 1965 | "node_modules/source-map-js": { 1966 | "version": "1.0.2", 1967 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1968 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1969 | "dev": true, 1970 | "engines": { 1971 | "node": ">=0.10.0" 1972 | } 1973 | }, 1974 | "node_modules/sourcemap-codec": { 1975 | "version": "1.4.8", 1976 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1977 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 1978 | "dev": true 1979 | }, 1980 | "node_modules/supports-color": { 1981 | "version": "5.5.0", 1982 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1983 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1984 | "dev": true, 1985 | "dependencies": { 1986 | "has-flag": "^3.0.0" 1987 | }, 1988 | "engines": { 1989 | "node": ">=4" 1990 | } 1991 | }, 1992 | "node_modules/supports-preserve-symlinks-flag": { 1993 | "version": "1.0.0", 1994 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1995 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1996 | "dev": true, 1997 | "engines": { 1998 | "node": ">= 0.4" 1999 | }, 2000 | "funding": { 2001 | "url": "https://github.com/sponsors/ljharb" 2002 | } 2003 | }, 2004 | "node_modules/tailwindcss": { 2005 | "version": "3.1.8", 2006 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", 2007 | "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", 2008 | "dev": true, 2009 | "dependencies": { 2010 | "arg": "^5.0.2", 2011 | "chokidar": "^3.5.3", 2012 | "color-name": "^1.1.4", 2013 | "detective": "^5.2.1", 2014 | "didyoumean": "^1.2.2", 2015 | "dlv": "^1.1.3", 2016 | "fast-glob": "^3.2.11", 2017 | "glob-parent": "^6.0.2", 2018 | "is-glob": "^4.0.3", 2019 | "lilconfig": "^2.0.6", 2020 | "normalize-path": "^3.0.0", 2021 | "object-hash": "^3.0.0", 2022 | "picocolors": "^1.0.0", 2023 | "postcss": "^8.4.14", 2024 | "postcss-import": "^14.1.0", 2025 | "postcss-js": "^4.0.0", 2026 | "postcss-load-config": "^3.1.4", 2027 | "postcss-nested": "5.0.6", 2028 | "postcss-selector-parser": "^6.0.10", 2029 | "postcss-value-parser": "^4.2.0", 2030 | "quick-lru": "^5.1.1", 2031 | "resolve": "^1.22.1" 2032 | }, 2033 | "bin": { 2034 | "tailwind": "lib/cli.js", 2035 | "tailwindcss": "lib/cli.js" 2036 | }, 2037 | "engines": { 2038 | "node": ">=12.13.0" 2039 | }, 2040 | "peerDependencies": { 2041 | "postcss": "^8.0.9" 2042 | } 2043 | }, 2044 | "node_modules/tailwindcss/node_modules/color-name": { 2045 | "version": "1.1.4", 2046 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2047 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2048 | "dev": true 2049 | }, 2050 | "node_modules/to-fast-properties": { 2051 | "version": "2.0.0", 2052 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 2053 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 2054 | "dev": true, 2055 | "engines": { 2056 | "node": ">=4" 2057 | } 2058 | }, 2059 | "node_modules/to-regex-range": { 2060 | "version": "5.0.1", 2061 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2062 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2063 | "dev": true, 2064 | "dependencies": { 2065 | "is-number": "^7.0.0" 2066 | }, 2067 | "engines": { 2068 | "node": ">=8.0" 2069 | } 2070 | }, 2071 | "node_modules/typescript": { 2072 | "version": "4.8.4", 2073 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", 2074 | "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", 2075 | "dev": true, 2076 | "bin": { 2077 | "tsc": "bin/tsc", 2078 | "tsserver": "bin/tsserver" 2079 | }, 2080 | "engines": { 2081 | "node": ">=4.2.0" 2082 | } 2083 | }, 2084 | "node_modules/update-browserslist-db": { 2085 | "version": "1.0.9", 2086 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", 2087 | "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", 2088 | "dev": true, 2089 | "funding": [ 2090 | { 2091 | "type": "opencollective", 2092 | "url": "https://opencollective.com/browserslist" 2093 | }, 2094 | { 2095 | "type": "tidelift", 2096 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2097 | } 2098 | ], 2099 | "dependencies": { 2100 | "escalade": "^3.1.1", 2101 | "picocolors": "^1.0.0" 2102 | }, 2103 | "bin": { 2104 | "browserslist-lint": "cli.js" 2105 | }, 2106 | "peerDependencies": { 2107 | "browserslist": ">= 4.21.0" 2108 | } 2109 | }, 2110 | "node_modules/util-deprecate": { 2111 | "version": "1.0.2", 2112 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2113 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2114 | "dev": true 2115 | }, 2116 | "node_modules/vite": { 2117 | "version": "3.1.4", 2118 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.4.tgz", 2119 | "integrity": "sha512-JoQI08aBjY9lycL7jcEq4p9o1xUjq5aRvdH4KWaXtkSx7e7RpAh9D3IjzDWRD4Fg44LS3oDAIOG/Kq1L+82psA==", 2120 | "dev": true, 2121 | "dependencies": { 2122 | "esbuild": "^0.15.6", 2123 | "postcss": "^8.4.16", 2124 | "resolve": "^1.22.1", 2125 | "rollup": "~2.78.0" 2126 | }, 2127 | "bin": { 2128 | "vite": "bin/vite.js" 2129 | }, 2130 | "engines": { 2131 | "node": "^14.18.0 || >=16.0.0" 2132 | }, 2133 | "optionalDependencies": { 2134 | "fsevents": "~2.3.2" 2135 | }, 2136 | "peerDependencies": { 2137 | "less": "*", 2138 | "sass": "*", 2139 | "stylus": "*", 2140 | "terser": "^5.4.0" 2141 | }, 2142 | "peerDependenciesMeta": { 2143 | "less": { 2144 | "optional": true 2145 | }, 2146 | "sass": { 2147 | "optional": true 2148 | }, 2149 | "stylus": { 2150 | "optional": true 2151 | }, 2152 | "terser": { 2153 | "optional": true 2154 | } 2155 | } 2156 | }, 2157 | "node_modules/xtend": { 2158 | "version": "4.0.2", 2159 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2160 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2161 | "dev": true, 2162 | "engines": { 2163 | "node": ">=0.4" 2164 | } 2165 | }, 2166 | "node_modules/yaml": { 2167 | "version": "1.10.2", 2168 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 2169 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 2170 | "dev": true, 2171 | "engines": { 2172 | "node": ">= 6" 2173 | } 2174 | } 2175 | }, 2176 | "dependencies": { 2177 | "@ampproject/remapping": { 2178 | "version": "2.2.0", 2179 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", 2180 | "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", 2181 | "dev": true, 2182 | "requires": { 2183 | "@jridgewell/gen-mapping": "^0.1.0", 2184 | "@jridgewell/trace-mapping": "^0.3.9" 2185 | } 2186 | }, 2187 | "@babel/code-frame": { 2188 | "version": "7.18.6", 2189 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", 2190 | "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", 2191 | "dev": true, 2192 | "requires": { 2193 | "@babel/highlight": "^7.18.6" 2194 | } 2195 | }, 2196 | "@babel/compat-data": { 2197 | "version": "7.19.3", 2198 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", 2199 | "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", 2200 | "dev": true 2201 | }, 2202 | "@babel/core": { 2203 | "version": "7.19.3", 2204 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", 2205 | "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", 2206 | "dev": true, 2207 | "requires": { 2208 | "@ampproject/remapping": "^2.1.0", 2209 | "@babel/code-frame": "^7.18.6", 2210 | "@babel/generator": "^7.19.3", 2211 | "@babel/helper-compilation-targets": "^7.19.3", 2212 | "@babel/helper-module-transforms": "^7.19.0", 2213 | "@babel/helpers": "^7.19.0", 2214 | "@babel/parser": "^7.19.3", 2215 | "@babel/template": "^7.18.10", 2216 | "@babel/traverse": "^7.19.3", 2217 | "@babel/types": "^7.19.3", 2218 | "convert-source-map": "^1.7.0", 2219 | "debug": "^4.1.0", 2220 | "gensync": "^1.0.0-beta.2", 2221 | "json5": "^2.2.1", 2222 | "semver": "^6.3.0" 2223 | } 2224 | }, 2225 | "@babel/generator": { 2226 | "version": "7.19.3", 2227 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", 2228 | "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", 2229 | "dev": true, 2230 | "requires": { 2231 | "@babel/types": "^7.19.3", 2232 | "@jridgewell/gen-mapping": "^0.3.2", 2233 | "jsesc": "^2.5.1" 2234 | }, 2235 | "dependencies": { 2236 | "@jridgewell/gen-mapping": { 2237 | "version": "0.3.2", 2238 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", 2239 | "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", 2240 | "dev": true, 2241 | "requires": { 2242 | "@jridgewell/set-array": "^1.0.1", 2243 | "@jridgewell/sourcemap-codec": "^1.4.10", 2244 | "@jridgewell/trace-mapping": "^0.3.9" 2245 | } 2246 | } 2247 | } 2248 | }, 2249 | "@babel/helper-annotate-as-pure": { 2250 | "version": "7.18.6", 2251 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", 2252 | "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", 2253 | "dev": true, 2254 | "requires": { 2255 | "@babel/types": "^7.18.6" 2256 | } 2257 | }, 2258 | "@babel/helper-compilation-targets": { 2259 | "version": "7.19.3", 2260 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz", 2261 | "integrity": "sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==", 2262 | "dev": true, 2263 | "requires": { 2264 | "@babel/compat-data": "^7.19.3", 2265 | "@babel/helper-validator-option": "^7.18.6", 2266 | "browserslist": "^4.21.3", 2267 | "semver": "^6.3.0" 2268 | } 2269 | }, 2270 | "@babel/helper-environment-visitor": { 2271 | "version": "7.18.9", 2272 | "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", 2273 | "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", 2274 | "dev": true 2275 | }, 2276 | "@babel/helper-function-name": { 2277 | "version": "7.19.0", 2278 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", 2279 | "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", 2280 | "dev": true, 2281 | "requires": { 2282 | "@babel/template": "^7.18.10", 2283 | "@babel/types": "^7.19.0" 2284 | } 2285 | }, 2286 | "@babel/helper-hoist-variables": { 2287 | "version": "7.18.6", 2288 | "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", 2289 | "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", 2290 | "dev": true, 2291 | "requires": { 2292 | "@babel/types": "^7.18.6" 2293 | } 2294 | }, 2295 | "@babel/helper-module-imports": { 2296 | "version": "7.18.6", 2297 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", 2298 | "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", 2299 | "dev": true, 2300 | "requires": { 2301 | "@babel/types": "^7.18.6" 2302 | } 2303 | }, 2304 | "@babel/helper-module-transforms": { 2305 | "version": "7.19.0", 2306 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", 2307 | "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", 2308 | "dev": true, 2309 | "requires": { 2310 | "@babel/helper-environment-visitor": "^7.18.9", 2311 | "@babel/helper-module-imports": "^7.18.6", 2312 | "@babel/helper-simple-access": "^7.18.6", 2313 | "@babel/helper-split-export-declaration": "^7.18.6", 2314 | "@babel/helper-validator-identifier": "^7.18.6", 2315 | "@babel/template": "^7.18.10", 2316 | "@babel/traverse": "^7.19.0", 2317 | "@babel/types": "^7.19.0" 2318 | } 2319 | }, 2320 | "@babel/helper-plugin-utils": { 2321 | "version": "7.19.0", 2322 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz", 2323 | "integrity": "sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==", 2324 | "dev": true 2325 | }, 2326 | "@babel/helper-simple-access": { 2327 | "version": "7.18.6", 2328 | "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", 2329 | "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", 2330 | "dev": true, 2331 | "requires": { 2332 | "@babel/types": "^7.18.6" 2333 | } 2334 | }, 2335 | "@babel/helper-split-export-declaration": { 2336 | "version": "7.18.6", 2337 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", 2338 | "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", 2339 | "dev": true, 2340 | "requires": { 2341 | "@babel/types": "^7.18.6" 2342 | } 2343 | }, 2344 | "@babel/helper-string-parser": { 2345 | "version": "7.18.10", 2346 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", 2347 | "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", 2348 | "dev": true 2349 | }, 2350 | "@babel/helper-validator-identifier": { 2351 | "version": "7.19.1", 2352 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", 2353 | "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", 2354 | "dev": true 2355 | }, 2356 | "@babel/helper-validator-option": { 2357 | "version": "7.18.6", 2358 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", 2359 | "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", 2360 | "dev": true 2361 | }, 2362 | "@babel/helpers": { 2363 | "version": "7.19.0", 2364 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", 2365 | "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", 2366 | "dev": true, 2367 | "requires": { 2368 | "@babel/template": "^7.18.10", 2369 | "@babel/traverse": "^7.19.0", 2370 | "@babel/types": "^7.19.0" 2371 | } 2372 | }, 2373 | "@babel/highlight": { 2374 | "version": "7.18.6", 2375 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", 2376 | "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", 2377 | "dev": true, 2378 | "requires": { 2379 | "@babel/helper-validator-identifier": "^7.18.6", 2380 | "chalk": "^2.0.0", 2381 | "js-tokens": "^4.0.0" 2382 | } 2383 | }, 2384 | "@babel/parser": { 2385 | "version": "7.19.3", 2386 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", 2387 | "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", 2388 | "dev": true 2389 | }, 2390 | "@babel/plugin-syntax-jsx": { 2391 | "version": "7.18.6", 2392 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", 2393 | "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", 2394 | "dev": true, 2395 | "requires": { 2396 | "@babel/helper-plugin-utils": "^7.18.6" 2397 | } 2398 | }, 2399 | "@babel/plugin-transform-react-jsx": { 2400 | "version": "7.19.0", 2401 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz", 2402 | "integrity": "sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==", 2403 | "dev": true, 2404 | "requires": { 2405 | "@babel/helper-annotate-as-pure": "^7.18.6", 2406 | "@babel/helper-module-imports": "^7.18.6", 2407 | "@babel/helper-plugin-utils": "^7.19.0", 2408 | "@babel/plugin-syntax-jsx": "^7.18.6", 2409 | "@babel/types": "^7.19.0" 2410 | } 2411 | }, 2412 | "@babel/plugin-transform-react-jsx-development": { 2413 | "version": "7.18.6", 2414 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", 2415 | "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", 2416 | "dev": true, 2417 | "requires": { 2418 | "@babel/plugin-transform-react-jsx": "^7.18.6" 2419 | } 2420 | }, 2421 | "@babel/plugin-transform-react-jsx-self": { 2422 | "version": "7.18.6", 2423 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz", 2424 | "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==", 2425 | "dev": true, 2426 | "requires": { 2427 | "@babel/helper-plugin-utils": "^7.18.6" 2428 | } 2429 | }, 2430 | "@babel/plugin-transform-react-jsx-source": { 2431 | "version": "7.18.6", 2432 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.18.6.tgz", 2433 | "integrity": "sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==", 2434 | "dev": true, 2435 | "requires": { 2436 | "@babel/helper-plugin-utils": "^7.18.6" 2437 | } 2438 | }, 2439 | "@babel/template": { 2440 | "version": "7.18.10", 2441 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", 2442 | "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", 2443 | "dev": true, 2444 | "requires": { 2445 | "@babel/code-frame": "^7.18.6", 2446 | "@babel/parser": "^7.18.10", 2447 | "@babel/types": "^7.18.10" 2448 | } 2449 | }, 2450 | "@babel/traverse": { 2451 | "version": "7.19.3", 2452 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", 2453 | "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", 2454 | "dev": true, 2455 | "requires": { 2456 | "@babel/code-frame": "^7.18.6", 2457 | "@babel/generator": "^7.19.3", 2458 | "@babel/helper-environment-visitor": "^7.18.9", 2459 | "@babel/helper-function-name": "^7.19.0", 2460 | "@babel/helper-hoist-variables": "^7.18.6", 2461 | "@babel/helper-split-export-declaration": "^7.18.6", 2462 | "@babel/parser": "^7.19.3", 2463 | "@babel/types": "^7.19.3", 2464 | "debug": "^4.1.0", 2465 | "globals": "^11.1.0" 2466 | } 2467 | }, 2468 | "@babel/types": { 2469 | "version": "7.19.3", 2470 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", 2471 | "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", 2472 | "dev": true, 2473 | "requires": { 2474 | "@babel/helper-string-parser": "^7.18.10", 2475 | "@babel/helper-validator-identifier": "^7.19.1", 2476 | "to-fast-properties": "^2.0.0" 2477 | } 2478 | }, 2479 | "@esbuild/android-arm": { 2480 | "version": "0.15.10", 2481 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", 2482 | "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", 2483 | "dev": true, 2484 | "optional": true 2485 | }, 2486 | "@esbuild/linux-loong64": { 2487 | "version": "0.15.10", 2488 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", 2489 | "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", 2490 | "dev": true, 2491 | "optional": true 2492 | }, 2493 | "@jridgewell/gen-mapping": { 2494 | "version": "0.1.1", 2495 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", 2496 | "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", 2497 | "dev": true, 2498 | "requires": { 2499 | "@jridgewell/set-array": "^1.0.0", 2500 | "@jridgewell/sourcemap-codec": "^1.4.10" 2501 | } 2502 | }, 2503 | "@jridgewell/resolve-uri": { 2504 | "version": "3.1.0", 2505 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", 2506 | "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", 2507 | "dev": true 2508 | }, 2509 | "@jridgewell/set-array": { 2510 | "version": "1.1.2", 2511 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", 2512 | "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", 2513 | "dev": true 2514 | }, 2515 | "@jridgewell/sourcemap-codec": { 2516 | "version": "1.4.14", 2517 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", 2518 | "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", 2519 | "dev": true 2520 | }, 2521 | "@jridgewell/trace-mapping": { 2522 | "version": "0.3.15", 2523 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", 2524 | "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", 2525 | "dev": true, 2526 | "requires": { 2527 | "@jridgewell/resolve-uri": "^3.0.3", 2528 | "@jridgewell/sourcemap-codec": "^1.4.10" 2529 | } 2530 | }, 2531 | "@nodelib/fs.scandir": { 2532 | "version": "2.1.5", 2533 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 2534 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 2535 | "dev": true, 2536 | "requires": { 2537 | "@nodelib/fs.stat": "2.0.5", 2538 | "run-parallel": "^1.1.9" 2539 | } 2540 | }, 2541 | "@nodelib/fs.stat": { 2542 | "version": "2.0.5", 2543 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 2544 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 2545 | "dev": true 2546 | }, 2547 | "@nodelib/fs.walk": { 2548 | "version": "1.2.8", 2549 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 2550 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 2551 | "dev": true, 2552 | "requires": { 2553 | "@nodelib/fs.scandir": "2.1.5", 2554 | "fastq": "^1.6.0" 2555 | } 2556 | }, 2557 | "@types/prop-types": { 2558 | "version": "15.7.5", 2559 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", 2560 | "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", 2561 | "dev": true 2562 | }, 2563 | "@types/react": { 2564 | "version": "18.0.21", 2565 | "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.21.tgz", 2566 | "integrity": "sha512-7QUCOxvFgnD5Jk8ZKlUAhVcRj7GuJRjnjjiY/IUBWKgOlnvDvTMLD4RTF7NPyVmbRhNrbomZiOepg7M/2Kj1mA==", 2567 | "dev": true, 2568 | "requires": { 2569 | "@types/prop-types": "*", 2570 | "@types/scheduler": "*", 2571 | "csstype": "^3.0.2" 2572 | } 2573 | }, 2574 | "@types/react-dom": { 2575 | "version": "18.0.6", 2576 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.6.tgz", 2577 | "integrity": "sha512-/5OFZgfIPSwy+YuIBP/FgJnQnsxhZhjjrnxudMddeblOouIodEQ75X14Rr4wGSG/bknL+Omy9iWlLo1u/9GzAA==", 2578 | "dev": true, 2579 | "requires": { 2580 | "@types/react": "*" 2581 | } 2582 | }, 2583 | "@types/scheduler": { 2584 | "version": "0.16.2", 2585 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", 2586 | "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", 2587 | "dev": true 2588 | }, 2589 | "@vitejs/plugin-react": { 2590 | "version": "2.1.0", 2591 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.1.0.tgz", 2592 | "integrity": "sha512-am6rPyyU3LzUYne3Gd9oj9c4Rzbq5hQnuGXSMT6Gujq45Il/+bunwq3lrB7wghLkiF45ygMwft37vgJ/NE8IAA==", 2593 | "dev": true, 2594 | "requires": { 2595 | "@babel/core": "^7.18.13", 2596 | "@babel/plugin-transform-react-jsx": "^7.18.10", 2597 | "@babel/plugin-transform-react-jsx-development": "^7.18.6", 2598 | "@babel/plugin-transform-react-jsx-self": "^7.18.6", 2599 | "@babel/plugin-transform-react-jsx-source": "^7.18.6", 2600 | "magic-string": "^0.26.2", 2601 | "react-refresh": "^0.14.0" 2602 | } 2603 | }, 2604 | "acorn": { 2605 | "version": "7.4.1", 2606 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 2607 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 2608 | "dev": true 2609 | }, 2610 | "acorn-node": { 2611 | "version": "1.8.2", 2612 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 2613 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 2614 | "dev": true, 2615 | "requires": { 2616 | "acorn": "^7.0.0", 2617 | "acorn-walk": "^7.0.0", 2618 | "xtend": "^4.0.2" 2619 | } 2620 | }, 2621 | "acorn-walk": { 2622 | "version": "7.2.0", 2623 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 2624 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 2625 | "dev": true 2626 | }, 2627 | "ansi-styles": { 2628 | "version": "3.2.1", 2629 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2630 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2631 | "dev": true, 2632 | "requires": { 2633 | "color-convert": "^1.9.0" 2634 | } 2635 | }, 2636 | "anymatch": { 2637 | "version": "3.1.2", 2638 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 2639 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 2640 | "dev": true, 2641 | "requires": { 2642 | "normalize-path": "^3.0.0", 2643 | "picomatch": "^2.0.4" 2644 | } 2645 | }, 2646 | "arg": { 2647 | "version": "5.0.2", 2648 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 2649 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 2650 | "dev": true 2651 | }, 2652 | "autoprefixer": { 2653 | "version": "10.4.12", 2654 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", 2655 | "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", 2656 | "dev": true, 2657 | "requires": { 2658 | "browserslist": "^4.21.4", 2659 | "caniuse-lite": "^1.0.30001407", 2660 | "fraction.js": "^4.2.0", 2661 | "normalize-range": "^0.1.2", 2662 | "picocolors": "^1.0.0", 2663 | "postcss-value-parser": "^4.2.0" 2664 | } 2665 | }, 2666 | "binary-extensions": { 2667 | "version": "2.2.0", 2668 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 2669 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 2670 | "dev": true 2671 | }, 2672 | "braces": { 2673 | "version": "3.0.2", 2674 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 2675 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 2676 | "dev": true, 2677 | "requires": { 2678 | "fill-range": "^7.0.1" 2679 | } 2680 | }, 2681 | "browserslist": { 2682 | "version": "4.21.4", 2683 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", 2684 | "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", 2685 | "dev": true, 2686 | "requires": { 2687 | "caniuse-lite": "^1.0.30001400", 2688 | "electron-to-chromium": "^1.4.251", 2689 | "node-releases": "^2.0.6", 2690 | "update-browserslist-db": "^1.0.9" 2691 | } 2692 | }, 2693 | "camelcase-css": { 2694 | "version": "2.0.1", 2695 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 2696 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 2697 | "dev": true 2698 | }, 2699 | "caniuse-lite": { 2700 | "version": "1.0.30001414", 2701 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", 2702 | "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", 2703 | "dev": true 2704 | }, 2705 | "chalk": { 2706 | "version": "2.4.2", 2707 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 2708 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 2709 | "dev": true, 2710 | "requires": { 2711 | "ansi-styles": "^3.2.1", 2712 | "escape-string-regexp": "^1.0.5", 2713 | "supports-color": "^5.3.0" 2714 | } 2715 | }, 2716 | "chokidar": { 2717 | "version": "3.5.3", 2718 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 2719 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 2720 | "dev": true, 2721 | "requires": { 2722 | "anymatch": "~3.1.2", 2723 | "braces": "~3.0.2", 2724 | "fsevents": "~2.3.2", 2725 | "glob-parent": "~5.1.2", 2726 | "is-binary-path": "~2.1.0", 2727 | "is-glob": "~4.0.1", 2728 | "normalize-path": "~3.0.0", 2729 | "readdirp": "~3.6.0" 2730 | }, 2731 | "dependencies": { 2732 | "glob-parent": { 2733 | "version": "5.1.2", 2734 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2735 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2736 | "dev": true, 2737 | "requires": { 2738 | "is-glob": "^4.0.1" 2739 | } 2740 | } 2741 | } 2742 | }, 2743 | "color-convert": { 2744 | "version": "1.9.3", 2745 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2746 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2747 | "dev": true, 2748 | "requires": { 2749 | "color-name": "1.1.3" 2750 | } 2751 | }, 2752 | "color-name": { 2753 | "version": "1.1.3", 2754 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2755 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 2756 | "dev": true 2757 | }, 2758 | "convert-source-map": { 2759 | "version": "1.8.0", 2760 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", 2761 | "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", 2762 | "dev": true, 2763 | "requires": { 2764 | "safe-buffer": "~5.1.1" 2765 | } 2766 | }, 2767 | "cssesc": { 2768 | "version": "3.0.0", 2769 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 2770 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 2771 | "dev": true 2772 | }, 2773 | "csstype": { 2774 | "version": "3.1.1", 2775 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", 2776 | "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", 2777 | "dev": true 2778 | }, 2779 | "debug": { 2780 | "version": "4.3.4", 2781 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 2782 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 2783 | "dev": true, 2784 | "requires": { 2785 | "ms": "2.1.2" 2786 | } 2787 | }, 2788 | "defined": { 2789 | "version": "1.0.0", 2790 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 2791 | "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", 2792 | "dev": true 2793 | }, 2794 | "detective": { 2795 | "version": "5.2.1", 2796 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", 2797 | "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", 2798 | "dev": true, 2799 | "requires": { 2800 | "acorn-node": "^1.8.2", 2801 | "defined": "^1.0.0", 2802 | "minimist": "^1.2.6" 2803 | } 2804 | }, 2805 | "didyoumean": { 2806 | "version": "1.2.2", 2807 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 2808 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 2809 | "dev": true 2810 | }, 2811 | "dlv": { 2812 | "version": "1.1.3", 2813 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 2814 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 2815 | "dev": true 2816 | }, 2817 | "electron-to-chromium": { 2818 | "version": "1.4.270", 2819 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz", 2820 | "integrity": "sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==", 2821 | "dev": true 2822 | }, 2823 | "esbuild": { 2824 | "version": "0.15.10", 2825 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.10.tgz", 2826 | "integrity": "sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng==", 2827 | "dev": true, 2828 | "requires": { 2829 | "@esbuild/android-arm": "0.15.10", 2830 | "@esbuild/linux-loong64": "0.15.10", 2831 | "esbuild-android-64": "0.15.10", 2832 | "esbuild-android-arm64": "0.15.10", 2833 | "esbuild-darwin-64": "0.15.10", 2834 | "esbuild-darwin-arm64": "0.15.10", 2835 | "esbuild-freebsd-64": "0.15.10", 2836 | "esbuild-freebsd-arm64": "0.15.10", 2837 | "esbuild-linux-32": "0.15.10", 2838 | "esbuild-linux-64": "0.15.10", 2839 | "esbuild-linux-arm": "0.15.10", 2840 | "esbuild-linux-arm64": "0.15.10", 2841 | "esbuild-linux-mips64le": "0.15.10", 2842 | "esbuild-linux-ppc64le": "0.15.10", 2843 | "esbuild-linux-riscv64": "0.15.10", 2844 | "esbuild-linux-s390x": "0.15.10", 2845 | "esbuild-netbsd-64": "0.15.10", 2846 | "esbuild-openbsd-64": "0.15.10", 2847 | "esbuild-sunos-64": "0.15.10", 2848 | "esbuild-windows-32": "0.15.10", 2849 | "esbuild-windows-64": "0.15.10", 2850 | "esbuild-windows-arm64": "0.15.10" 2851 | } 2852 | }, 2853 | "esbuild-android-64": { 2854 | "version": "0.15.10", 2855 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", 2856 | "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", 2857 | "dev": true, 2858 | "optional": true 2859 | }, 2860 | "esbuild-android-arm64": { 2861 | "version": "0.15.10", 2862 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", 2863 | "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", 2864 | "dev": true, 2865 | "optional": true 2866 | }, 2867 | "esbuild-darwin-64": { 2868 | "version": "0.15.10", 2869 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", 2870 | "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", 2871 | "dev": true, 2872 | "optional": true 2873 | }, 2874 | "esbuild-darwin-arm64": { 2875 | "version": "0.15.10", 2876 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", 2877 | "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", 2878 | "dev": true, 2879 | "optional": true 2880 | }, 2881 | "esbuild-freebsd-64": { 2882 | "version": "0.15.10", 2883 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", 2884 | "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", 2885 | "dev": true, 2886 | "optional": true 2887 | }, 2888 | "esbuild-freebsd-arm64": { 2889 | "version": "0.15.10", 2890 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", 2891 | "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", 2892 | "dev": true, 2893 | "optional": true 2894 | }, 2895 | "esbuild-linux-32": { 2896 | "version": "0.15.10", 2897 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", 2898 | "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", 2899 | "dev": true, 2900 | "optional": true 2901 | }, 2902 | "esbuild-linux-64": { 2903 | "version": "0.15.10", 2904 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", 2905 | "integrity": "sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA==", 2906 | "dev": true, 2907 | "optional": true 2908 | }, 2909 | "esbuild-linux-arm": { 2910 | "version": "0.15.10", 2911 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", 2912 | "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", 2913 | "dev": true, 2914 | "optional": true 2915 | }, 2916 | "esbuild-linux-arm64": { 2917 | "version": "0.15.10", 2918 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", 2919 | "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", 2920 | "dev": true, 2921 | "optional": true 2922 | }, 2923 | "esbuild-linux-mips64le": { 2924 | "version": "0.15.10", 2925 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", 2926 | "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", 2927 | "dev": true, 2928 | "optional": true 2929 | }, 2930 | "esbuild-linux-ppc64le": { 2931 | "version": "0.15.10", 2932 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", 2933 | "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", 2934 | "dev": true, 2935 | "optional": true 2936 | }, 2937 | "esbuild-linux-riscv64": { 2938 | "version": "0.15.10", 2939 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", 2940 | "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", 2941 | "dev": true, 2942 | "optional": true 2943 | }, 2944 | "esbuild-linux-s390x": { 2945 | "version": "0.15.10", 2946 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", 2947 | "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", 2948 | "dev": true, 2949 | "optional": true 2950 | }, 2951 | "esbuild-netbsd-64": { 2952 | "version": "0.15.10", 2953 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", 2954 | "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", 2955 | "dev": true, 2956 | "optional": true 2957 | }, 2958 | "esbuild-openbsd-64": { 2959 | "version": "0.15.10", 2960 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", 2961 | "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", 2962 | "dev": true, 2963 | "optional": true 2964 | }, 2965 | "esbuild-sunos-64": { 2966 | "version": "0.15.10", 2967 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", 2968 | "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", 2969 | "dev": true, 2970 | "optional": true 2971 | }, 2972 | "esbuild-windows-32": { 2973 | "version": "0.15.10", 2974 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", 2975 | "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", 2976 | "dev": true, 2977 | "optional": true 2978 | }, 2979 | "esbuild-windows-64": { 2980 | "version": "0.15.10", 2981 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", 2982 | "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", 2983 | "dev": true, 2984 | "optional": true 2985 | }, 2986 | "esbuild-windows-arm64": { 2987 | "version": "0.15.10", 2988 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", 2989 | "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", 2990 | "dev": true, 2991 | "optional": true 2992 | }, 2993 | "escalade": { 2994 | "version": "3.1.1", 2995 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2996 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 2997 | "dev": true 2998 | }, 2999 | "escape-string-regexp": { 3000 | "version": "1.0.5", 3001 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 3002 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 3003 | "dev": true 3004 | }, 3005 | "fast-glob": { 3006 | "version": "3.2.12", 3007 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", 3008 | "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", 3009 | "dev": true, 3010 | "requires": { 3011 | "@nodelib/fs.stat": "^2.0.2", 3012 | "@nodelib/fs.walk": "^1.2.3", 3013 | "glob-parent": "^5.1.2", 3014 | "merge2": "^1.3.0", 3015 | "micromatch": "^4.0.4" 3016 | }, 3017 | "dependencies": { 3018 | "glob-parent": { 3019 | "version": "5.1.2", 3020 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 3021 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 3022 | "dev": true, 3023 | "requires": { 3024 | "is-glob": "^4.0.1" 3025 | } 3026 | } 3027 | } 3028 | }, 3029 | "fastq": { 3030 | "version": "1.13.0", 3031 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", 3032 | "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", 3033 | "dev": true, 3034 | "requires": { 3035 | "reusify": "^1.0.4" 3036 | } 3037 | }, 3038 | "fill-range": { 3039 | "version": "7.0.1", 3040 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 3041 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 3042 | "dev": true, 3043 | "requires": { 3044 | "to-regex-range": "^5.0.1" 3045 | } 3046 | }, 3047 | "fraction.js": { 3048 | "version": "4.2.0", 3049 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", 3050 | "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", 3051 | "dev": true 3052 | }, 3053 | "fsevents": { 3054 | "version": "2.3.2", 3055 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 3056 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 3057 | "dev": true, 3058 | "optional": true 3059 | }, 3060 | "function-bind": { 3061 | "version": "1.1.1", 3062 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 3063 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 3064 | "dev": true 3065 | }, 3066 | "gensync": { 3067 | "version": "1.0.0-beta.2", 3068 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 3069 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 3070 | "dev": true 3071 | }, 3072 | "glob-parent": { 3073 | "version": "6.0.2", 3074 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 3075 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 3076 | "dev": true, 3077 | "requires": { 3078 | "is-glob": "^4.0.3" 3079 | } 3080 | }, 3081 | "globals": { 3082 | "version": "11.12.0", 3083 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 3084 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 3085 | "dev": true 3086 | }, 3087 | "has": { 3088 | "version": "1.0.3", 3089 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 3090 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 3091 | "dev": true, 3092 | "requires": { 3093 | "function-bind": "^1.1.1" 3094 | } 3095 | }, 3096 | "has-flag": { 3097 | "version": "3.0.0", 3098 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 3099 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 3100 | "dev": true 3101 | }, 3102 | "is-binary-path": { 3103 | "version": "2.1.0", 3104 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 3105 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 3106 | "dev": true, 3107 | "requires": { 3108 | "binary-extensions": "^2.0.0" 3109 | } 3110 | }, 3111 | "is-core-module": { 3112 | "version": "2.10.0", 3113 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", 3114 | "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", 3115 | "dev": true, 3116 | "requires": { 3117 | "has": "^1.0.3" 3118 | } 3119 | }, 3120 | "is-extglob": { 3121 | "version": "2.1.1", 3122 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 3123 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 3124 | "dev": true 3125 | }, 3126 | "is-glob": { 3127 | "version": "4.0.3", 3128 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 3129 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 3130 | "dev": true, 3131 | "requires": { 3132 | "is-extglob": "^2.1.1" 3133 | } 3134 | }, 3135 | "is-number": { 3136 | "version": "7.0.0", 3137 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 3138 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 3139 | "dev": true 3140 | }, 3141 | "js-tokens": { 3142 | "version": "4.0.0", 3143 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 3144 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 3145 | }, 3146 | "jsesc": { 3147 | "version": "2.5.2", 3148 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 3149 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 3150 | "dev": true 3151 | }, 3152 | "json5": { 3153 | "version": "2.2.1", 3154 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", 3155 | "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", 3156 | "dev": true 3157 | }, 3158 | "lilconfig": { 3159 | "version": "2.0.6", 3160 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", 3161 | "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", 3162 | "dev": true 3163 | }, 3164 | "loose-envify": { 3165 | "version": "1.4.0", 3166 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 3167 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 3168 | "requires": { 3169 | "js-tokens": "^3.0.0 || ^4.0.0" 3170 | } 3171 | }, 3172 | "magic-string": { 3173 | "version": "0.26.5", 3174 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.5.tgz", 3175 | "integrity": "sha512-yXUIYOOQnEHKHOftp5shMWpB9ImfgfDJpapa38j/qMtTj5QHWucvxP4lUtuRmHT9vAzvtpHkWKXW9xBwimXeNg==", 3176 | "dev": true, 3177 | "requires": { 3178 | "sourcemap-codec": "^1.4.8" 3179 | } 3180 | }, 3181 | "merge2": { 3182 | "version": "1.4.1", 3183 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 3184 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 3185 | "dev": true 3186 | }, 3187 | "micromatch": { 3188 | "version": "4.0.5", 3189 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", 3190 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 3191 | "dev": true, 3192 | "requires": { 3193 | "braces": "^3.0.2", 3194 | "picomatch": "^2.3.1" 3195 | } 3196 | }, 3197 | "minimist": { 3198 | "version": "1.2.6", 3199 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 3200 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 3201 | "dev": true 3202 | }, 3203 | "ms": { 3204 | "version": "2.1.2", 3205 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 3206 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 3207 | "dev": true 3208 | }, 3209 | "nanoid": { 3210 | "version": "3.3.4", 3211 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", 3212 | "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", 3213 | "dev": true 3214 | }, 3215 | "node-releases": { 3216 | "version": "2.0.6", 3217 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", 3218 | "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", 3219 | "dev": true 3220 | }, 3221 | "normalize-path": { 3222 | "version": "3.0.0", 3223 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 3224 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 3225 | "dev": true 3226 | }, 3227 | "normalize-range": { 3228 | "version": "0.1.2", 3229 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 3230 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 3231 | "dev": true 3232 | }, 3233 | "object-hash": { 3234 | "version": "3.0.0", 3235 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 3236 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 3237 | "dev": true 3238 | }, 3239 | "path-parse": { 3240 | "version": "1.0.7", 3241 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 3242 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 3243 | "dev": true 3244 | }, 3245 | "picocolors": { 3246 | "version": "1.0.0", 3247 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 3248 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 3249 | "dev": true 3250 | }, 3251 | "picomatch": { 3252 | "version": "2.3.1", 3253 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 3254 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 3255 | "dev": true 3256 | }, 3257 | "pify": { 3258 | "version": "2.3.0", 3259 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 3260 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 3261 | "dev": true 3262 | }, 3263 | "postcss": { 3264 | "version": "8.4.17", 3265 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.17.tgz", 3266 | "integrity": "sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==", 3267 | "dev": true, 3268 | "requires": { 3269 | "nanoid": "^3.3.4", 3270 | "picocolors": "^1.0.0", 3271 | "source-map-js": "^1.0.2" 3272 | } 3273 | }, 3274 | "postcss-import": { 3275 | "version": "14.1.0", 3276 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", 3277 | "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", 3278 | "dev": true, 3279 | "requires": { 3280 | "postcss-value-parser": "^4.0.0", 3281 | "read-cache": "^1.0.0", 3282 | "resolve": "^1.1.7" 3283 | } 3284 | }, 3285 | "postcss-js": { 3286 | "version": "4.0.0", 3287 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", 3288 | "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", 3289 | "dev": true, 3290 | "requires": { 3291 | "camelcase-css": "^2.0.1" 3292 | } 3293 | }, 3294 | "postcss-load-config": { 3295 | "version": "3.1.4", 3296 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", 3297 | "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", 3298 | "dev": true, 3299 | "requires": { 3300 | "lilconfig": "^2.0.5", 3301 | "yaml": "^1.10.2" 3302 | } 3303 | }, 3304 | "postcss-nested": { 3305 | "version": "5.0.6", 3306 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", 3307 | "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", 3308 | "dev": true, 3309 | "requires": { 3310 | "postcss-selector-parser": "^6.0.6" 3311 | } 3312 | }, 3313 | "postcss-selector-parser": { 3314 | "version": "6.0.10", 3315 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", 3316 | "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", 3317 | "dev": true, 3318 | "requires": { 3319 | "cssesc": "^3.0.0", 3320 | "util-deprecate": "^1.0.2" 3321 | } 3322 | }, 3323 | "postcss-value-parser": { 3324 | "version": "4.2.0", 3325 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 3326 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 3327 | "dev": true 3328 | }, 3329 | "queue-microtask": { 3330 | "version": "1.2.3", 3331 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 3332 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 3333 | "dev": true 3334 | }, 3335 | "quick-lru": { 3336 | "version": "5.1.1", 3337 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", 3338 | "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", 3339 | "dev": true 3340 | }, 3341 | "react": { 3342 | "version": "18.2.0", 3343 | "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", 3344 | "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", 3345 | "requires": { 3346 | "loose-envify": "^1.1.0" 3347 | } 3348 | }, 3349 | "react-dom": { 3350 | "version": "18.2.0", 3351 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", 3352 | "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", 3353 | "requires": { 3354 | "loose-envify": "^1.1.0", 3355 | "scheduler": "^0.23.0" 3356 | } 3357 | }, 3358 | "react-refresh": { 3359 | "version": "0.14.0", 3360 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", 3361 | "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", 3362 | "dev": true 3363 | }, 3364 | "read-cache": { 3365 | "version": "1.0.0", 3366 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 3367 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 3368 | "dev": true, 3369 | "requires": { 3370 | "pify": "^2.3.0" 3371 | } 3372 | }, 3373 | "readdirp": { 3374 | "version": "3.6.0", 3375 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 3376 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 3377 | "dev": true, 3378 | "requires": { 3379 | "picomatch": "^2.2.1" 3380 | } 3381 | }, 3382 | "resolve": { 3383 | "version": "1.22.1", 3384 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 3385 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 3386 | "dev": true, 3387 | "requires": { 3388 | "is-core-module": "^2.9.0", 3389 | "path-parse": "^1.0.7", 3390 | "supports-preserve-symlinks-flag": "^1.0.0" 3391 | } 3392 | }, 3393 | "reusify": { 3394 | "version": "1.0.4", 3395 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 3396 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 3397 | "dev": true 3398 | }, 3399 | "rollup": { 3400 | "version": "2.78.1", 3401 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.78.1.tgz", 3402 | "integrity": "sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==", 3403 | "dev": true, 3404 | "requires": { 3405 | "fsevents": "~2.3.2" 3406 | } 3407 | }, 3408 | "run-parallel": { 3409 | "version": "1.2.0", 3410 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 3411 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 3412 | "dev": true, 3413 | "requires": { 3414 | "queue-microtask": "^1.2.2" 3415 | } 3416 | }, 3417 | "safe-buffer": { 3418 | "version": "5.1.2", 3419 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 3420 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 3421 | "dev": true 3422 | }, 3423 | "scheduler": { 3424 | "version": "0.23.0", 3425 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", 3426 | "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", 3427 | "requires": { 3428 | "loose-envify": "^1.1.0" 3429 | } 3430 | }, 3431 | "semver": { 3432 | "version": "6.3.0", 3433 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 3434 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 3435 | "dev": true 3436 | }, 3437 | "source-map-js": { 3438 | "version": "1.0.2", 3439 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 3440 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 3441 | "dev": true 3442 | }, 3443 | "sourcemap-codec": { 3444 | "version": "1.4.8", 3445 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 3446 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 3447 | "dev": true 3448 | }, 3449 | "supports-color": { 3450 | "version": "5.5.0", 3451 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3452 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3453 | "dev": true, 3454 | "requires": { 3455 | "has-flag": "^3.0.0" 3456 | } 3457 | }, 3458 | "supports-preserve-symlinks-flag": { 3459 | "version": "1.0.0", 3460 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 3461 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 3462 | "dev": true 3463 | }, 3464 | "tailwindcss": { 3465 | "version": "3.1.8", 3466 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.8.tgz", 3467 | "integrity": "sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==", 3468 | "dev": true, 3469 | "requires": { 3470 | "arg": "^5.0.2", 3471 | "chokidar": "^3.5.3", 3472 | "color-name": "^1.1.4", 3473 | "detective": "^5.2.1", 3474 | "didyoumean": "^1.2.2", 3475 | "dlv": "^1.1.3", 3476 | "fast-glob": "^3.2.11", 3477 | "glob-parent": "^6.0.2", 3478 | "is-glob": "^4.0.3", 3479 | "lilconfig": "^2.0.6", 3480 | "normalize-path": "^3.0.0", 3481 | "object-hash": "^3.0.0", 3482 | "picocolors": "^1.0.0", 3483 | "postcss": "^8.4.14", 3484 | "postcss-import": "^14.1.0", 3485 | "postcss-js": "^4.0.0", 3486 | "postcss-load-config": "^3.1.4", 3487 | "postcss-nested": "5.0.6", 3488 | "postcss-selector-parser": "^6.0.10", 3489 | "postcss-value-parser": "^4.2.0", 3490 | "quick-lru": "^5.1.1", 3491 | "resolve": "^1.22.1" 3492 | }, 3493 | "dependencies": { 3494 | "color-name": { 3495 | "version": "1.1.4", 3496 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 3497 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 3498 | "dev": true 3499 | } 3500 | } 3501 | }, 3502 | "to-fast-properties": { 3503 | "version": "2.0.0", 3504 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 3505 | "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", 3506 | "dev": true 3507 | }, 3508 | "to-regex-range": { 3509 | "version": "5.0.1", 3510 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3511 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3512 | "dev": true, 3513 | "requires": { 3514 | "is-number": "^7.0.0" 3515 | } 3516 | }, 3517 | "typescript": { 3518 | "version": "4.8.4", 3519 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", 3520 | "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", 3521 | "dev": true 3522 | }, 3523 | "update-browserslist-db": { 3524 | "version": "1.0.9", 3525 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", 3526 | "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", 3527 | "dev": true, 3528 | "requires": { 3529 | "escalade": "^3.1.1", 3530 | "picocolors": "^1.0.0" 3531 | } 3532 | }, 3533 | "util-deprecate": { 3534 | "version": "1.0.2", 3535 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3536 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 3537 | "dev": true 3538 | }, 3539 | "vite": { 3540 | "version": "3.1.4", 3541 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.1.4.tgz", 3542 | "integrity": "sha512-JoQI08aBjY9lycL7jcEq4p9o1xUjq5aRvdH4KWaXtkSx7e7RpAh9D3IjzDWRD4Fg44LS3oDAIOG/Kq1L+82psA==", 3543 | "dev": true, 3544 | "requires": { 3545 | "esbuild": "^0.15.6", 3546 | "fsevents": "~2.3.2", 3547 | "postcss": "^8.4.16", 3548 | "resolve": "^1.22.1", 3549 | "rollup": "~2.78.0" 3550 | } 3551 | }, 3552 | "xtend": { 3553 | "version": "4.0.2", 3554 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 3555 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 3556 | "dev": true 3557 | }, 3558 | "yaml": { 3559 | "version": "1.10.2", 3560 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", 3561 | "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", 3562 | "dev": true 3563 | } 3564 | } 3565 | } 3566 | -------------------------------------------------------------------------------- /write/frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "write", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "tsc && vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "react": "^18.2.0", 13 | "react-dom": "^18.2.0" 14 | }, 15 | "devDependencies": { 16 | "@types/react": "^18.0.17", 17 | "@types/react-dom": "^18.0.6", 18 | "@vitejs/plugin-react": "^2.1.0", 19 | "autoprefixer": "^10.4.12", 20 | "postcss": "^8.4.17", 21 | "tailwindcss": "^3.1.8", 22 | "typescript": "^4.6.4", 23 | "vite": "^3.1.0" 24 | } 25 | ,"author":"ebuckley"} -------------------------------------------------------------------------------- /write/frontend/package.json.md5: -------------------------------------------------------------------------------- 1 | 6960c679bd5bdf4f417a9e19313fa8f5 -------------------------------------------------------------------------------- /write/frontend/postcss.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /write/frontend/src/App.css: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /write/frontend/src/App.tsx: -------------------------------------------------------------------------------- 1 | import './App.css' 2 | import {Save, SendMarkdownToRenderer, Open, Export} from "../wailsjs/go/main/App"; 3 | import {useRef, useState} from "react"; 4 | 5 | function App() { 6 | const [filename, setFileName] = useState(''); 7 | const [md, setMd] = useState(''); 8 | const ref = useRef(null); 9 | const updateValue = async (event: React.ChangeEvent) => { 10 | const value = event.target.value 11 | const html = await SendMarkdownToRenderer(value) 12 | setMd(html); 13 | } 14 | const newAction = async () => { 15 | if (md.length > 0) { 16 | if (!window.confirm('Are you sure you want to create a new document?')) { 17 | return; 18 | } 19 | } 20 | setMd(''); 21 | setFileName(''); 22 | if (ref.current) { 23 | ref.current.value = ''; 24 | } 25 | } 26 | const saveAction = async () => { 27 | try { 28 | const res = await Save() 29 | alert('saved!' + res); 30 | } catch(e) { 31 | alert('error saving: ' + e); 32 | } 33 | 34 | } 35 | const openAction = async () => { 36 | const res = await Open(); 37 | setMd(res.html ?? "") 38 | if (ref.current) { 39 | ref.current.value = res.content ?? ""; 40 | } 41 | setFileName(res.name ?? "") 42 | } 43 | const exportAction = async () => { 44 | try { 45 | await Export(); 46 | alert('exported! to file'); 47 | } catch (e) { 48 | // @ts-ignore shhh! 49 | alert("error: " + e.toString()) 50 | } 51 | } 52 | return ( 53 |
54 |
55 |

{filename}

56 |
57 | 78 | 96 | 116 | 136 |
137 |
138 |
139 |
140 |
145 |
146 |
147 |
148 |
149 |
150 |
151 | ) 152 | } 153 | 154 | export default App 155 | -------------------------------------------------------------------------------- /write/frontend/src/assets/wails.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ebuckley/write/335bc096973f3b5a368e0257c1ffcd053a6c513c/write/frontend/src/assets/wails.png -------------------------------------------------------------------------------- /write/frontend/src/index.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer components { 6 | .markdown-content a { 7 | @apply text-blue-500 underline hover:text-blue-700 transition-colors duration-200; 8 | } 9 | 10 | .markdown-content h1 { 11 | @apply text-gray-900 py-2 font-sans font-bold break-normal text-2xl; 12 | } 13 | 14 | .markdown-content pre { 15 | @apply rounded break-words whitespace-pre-wrap font-mono; 16 | } 17 | 18 | .markdown-content p { 19 | @apply pt-3 pb-5; 20 | } 21 | 22 | .markdown-content h2 { 23 | @apply text-gray-900 py-2 font-sans font-bold break-normal text-xl; 24 | } 25 | 26 | .markdown-content blockquote { 27 | @apply border-l-4 border-green-500 italic my-8 pl-8 md:pl-12; 28 | } 29 | 30 | .markdown-content ul { 31 | @apply list-disc list-inside; 32 | } 33 | 34 | .markdown-content li { 35 | @apply pl-3; 36 | } 37 | } -------------------------------------------------------------------------------- /write/frontend/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from './App' 4 | import './index.css' 5 | 6 | ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( 7 | 8 | 9 | 10 | ) 11 | -------------------------------------------------------------------------------- /write/frontend/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /write/frontend/tailwind.config.cjs: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./src/**/*.{js,jsx,ts,tsx}", 5 | ], 6 | theme: { 7 | extend: {}, 8 | }, 9 | plugins: [], 10 | } 11 | -------------------------------------------------------------------------------- /write/frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ESNext", 4 | "useDefineForClassFields": true, 5 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx" 18 | }, 19 | "include": ["src"], 20 | "references": [{ "path": "./tsconfig.node.json" }] 21 | } 22 | -------------------------------------------------------------------------------- /write/frontend/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /write/frontend/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import react from '@vitejs/plugin-react' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()] 7 | }) 8 | -------------------------------------------------------------------------------- /write/frontend/wailsjs/go/main/App.d.ts: -------------------------------------------------------------------------------- 1 | // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL 2 | // This file is automatically generated. DO NOT EDIT 3 | import {main} from '../models'; 4 | 5 | export function Export():Promise; 6 | 7 | export function Open():Promise; 8 | 9 | export function Save():Promise; 10 | 11 | export function SendMarkdownToRenderer(arg1:string):Promise; 12 | -------------------------------------------------------------------------------- /write/frontend/wailsjs/go/main/App.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL 3 | // This file is automatically generated. DO NOT EDIT 4 | 5 | export function Export() { 6 | return window['go']['main']['App']['Export'](); 7 | } 8 | 9 | export function Open() { 10 | return window['go']['main']['App']['Open'](); 11 | } 12 | 13 | export function Save() { 14 | return window['go']['main']['App']['Save'](); 15 | } 16 | 17 | export function SendMarkdownToRenderer(arg1) { 18 | return window['go']['main']['App']['SendMarkdownToRenderer'](arg1); 19 | } 20 | -------------------------------------------------------------------------------- /write/frontend/wailsjs/go/models.ts: -------------------------------------------------------------------------------- 1 | export namespace main { 2 | 3 | export class FileWithContent { 4 | name?: string; 5 | content?: string; 6 | html?: string; 7 | 8 | static createFrom(source: any = {}) { 9 | return new FileWithContent(source); 10 | } 11 | 12 | constructor(source: any = {}) { 13 | if ('string' === typeof source) source = JSON.parse(source); 14 | this.name = source["name"]; 15 | this.content = source["content"]; 16 | this.html = source["html"]; 17 | } 18 | } 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /write/frontend/wailsjs/runtime/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@wailsapp/runtime", 3 | "version": "2.0.0", 4 | "description": "Wails Javascript runtime library", 5 | "main": "runtime.js", 6 | "types": "runtime.d.ts", 7 | "scripts": { 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/wailsapp/wails.git" 12 | }, 13 | "keywords": [ 14 | "Wails", 15 | "Javascript", 16 | "Go" 17 | ], 18 | "author": "Lea Anthony ", 19 | "license": "MIT", 20 | "bugs": { 21 | "url": "https://github.com/wailsapp/wails/issues" 22 | }, 23 | "homepage": "https://github.com/wailsapp/wails#readme" 24 | } 25 | -------------------------------------------------------------------------------- /write/frontend/wailsjs/runtime/runtime.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | _ __ _ __ 3 | | | / /___ _(_) /____ 4 | | | /| / / __ `/ / / ___/ 5 | | |/ |/ / /_/ / / (__ ) 6 | |__/|__/\__,_/_/_/____/ 7 | The electron alternative for Go 8 | (c) Lea Anthony 2019-present 9 | */ 10 | 11 | export interface Position { 12 | x: number; 13 | y: number; 14 | } 15 | 16 | export interface Size { 17 | w: number; 18 | h: number; 19 | } 20 | 21 | export interface Screen { 22 | isCurrent: boolean; 23 | isPrimary: boolean; 24 | width : number 25 | height : number 26 | } 27 | 28 | // Environment information such as platform, buildtype, ... 29 | export interface EnvironmentInfo { 30 | buildType: string; 31 | platform: string; 32 | arch: string; 33 | } 34 | 35 | // [EventsEmit](https://wails.io/docs/reference/runtime/events#eventsemit) 36 | // emits the given event. Optional data may be passed with the event. 37 | // This will trigger any event listeners. 38 | export function EventsEmit(eventName: string, ...data: any): void; 39 | 40 | // [EventsOn](https://wails.io/docs/reference/runtime/events#eventson) sets up a listener for the given event name. 41 | export function EventsOn(eventName: string, callback: (...data: any) => void): () => void; 42 | 43 | // [EventsOnMultiple](https://wails.io/docs/reference/runtime/events#eventsonmultiple) 44 | // sets up a listener for the given event name, but will only trigger a given number times. 45 | export function EventsOnMultiple(eventName: string, callback: (...data: any) => void, maxCallbacks: number): () => void; 46 | 47 | // [EventsOnce](https://wails.io/docs/reference/runtime/events#eventsonce) 48 | // sets up a listener for the given event name, but will only trigger once. 49 | export function EventsOnce(eventName: string, callback: (...data: any) => void): () => void; 50 | 51 | // [EventsOff](https://wails.io/docs/reference/runtime/events#eventsoff) 52 | // unregisters the listener for the given event name. 53 | export function EventsOff(eventName: string, ...additionalEventNames: string[]): void; 54 | 55 | // [EventsOffAll](https://wails.io/docs/reference/runtime/events#eventsoffall) 56 | // unregisters all listeners. 57 | export function EventsOffAll(): void; 58 | 59 | // [LogPrint](https://wails.io/docs/reference/runtime/log#logprint) 60 | // logs the given message as a raw message 61 | export function LogPrint(message: string): void; 62 | 63 | // [LogTrace](https://wails.io/docs/reference/runtime/log#logtrace) 64 | // logs the given message at the `trace` log level. 65 | export function LogTrace(message: string): void; 66 | 67 | // [LogDebug](https://wails.io/docs/reference/runtime/log#logdebug) 68 | // logs the given message at the `debug` log level. 69 | export function LogDebug(message: string): void; 70 | 71 | // [LogError](https://wails.io/docs/reference/runtime/log#logerror) 72 | // logs the given message at the `error` log level. 73 | export function LogError(message: string): void; 74 | 75 | // [LogFatal](https://wails.io/docs/reference/runtime/log#logfatal) 76 | // logs the given message at the `fatal` log level. 77 | // The application will quit after calling this method. 78 | export function LogFatal(message: string): void; 79 | 80 | // [LogInfo](https://wails.io/docs/reference/runtime/log#loginfo) 81 | // logs the given message at the `info` log level. 82 | export function LogInfo(message: string): void; 83 | 84 | // [LogWarning](https://wails.io/docs/reference/runtime/log#logwarning) 85 | // logs the given message at the `warning` log level. 86 | export function LogWarning(message: string): void; 87 | 88 | // [WindowReload](https://wails.io/docs/reference/runtime/window#windowreload) 89 | // Forces a reload by the main application as well as connected browsers. 90 | export function WindowReload(): void; 91 | 92 | // [WindowReloadApp](https://wails.io/docs/reference/runtime/window#windowreloadapp) 93 | // Reloads the application frontend. 94 | export function WindowReloadApp(): void; 95 | 96 | // [WindowSetAlwaysOnTop](https://wails.io/docs/reference/runtime/window#windowsetalwaysontop) 97 | // Sets the window AlwaysOnTop or not on top. 98 | export function WindowSetAlwaysOnTop(b: boolean): void; 99 | 100 | // [WindowSetSystemDefaultTheme](https://wails.io/docs/next/reference/runtime/window#windowsetsystemdefaulttheme) 101 | // *Windows only* 102 | // Sets window theme to system default (dark/light). 103 | export function WindowSetSystemDefaultTheme(): void; 104 | 105 | // [WindowSetLightTheme](https://wails.io/docs/next/reference/runtime/window#windowsetlighttheme) 106 | // *Windows only* 107 | // Sets window to light theme. 108 | export function WindowSetLightTheme(): void; 109 | 110 | // [WindowSetDarkTheme](https://wails.io/docs/next/reference/runtime/window#windowsetdarktheme) 111 | // *Windows only* 112 | // Sets window to dark theme. 113 | export function WindowSetDarkTheme(): void; 114 | 115 | // [WindowCenter](https://wails.io/docs/reference/runtime/window#windowcenter) 116 | // Centers the window on the monitor the window is currently on. 117 | export function WindowCenter(): void; 118 | 119 | // [WindowSetTitle](https://wails.io/docs/reference/runtime/window#windowsettitle) 120 | // Sets the text in the window title bar. 121 | export function WindowSetTitle(title: string): void; 122 | 123 | // [WindowFullscreen](https://wails.io/docs/reference/runtime/window#windowfullscreen) 124 | // Makes the window full screen. 125 | export function WindowFullscreen(): void; 126 | 127 | // [WindowUnfullscreen](https://wails.io/docs/reference/runtime/window#windowunfullscreen) 128 | // Restores the previous window dimensions and position prior to full screen. 129 | export function WindowUnfullscreen(): void; 130 | 131 | // [WindowIsFullscreen](https://wails.io/docs/reference/runtime/window#windowisfullscreen) 132 | // Returns the state of the window, i.e. whether the window is in full screen mode or not. 133 | export function WindowIsFullscreen(): Promise; 134 | 135 | // [WindowSetSize](https://wails.io/docs/reference/runtime/window#windowsetsize) 136 | // Sets the width and height of the window. 137 | export function WindowSetSize(width: number, height: number): Promise; 138 | 139 | // [WindowGetSize](https://wails.io/docs/reference/runtime/window#windowgetsize) 140 | // Gets the width and height of the window. 141 | export function WindowGetSize(): Promise; 142 | 143 | // [WindowSetMaxSize](https://wails.io/docs/reference/runtime/window#windowsetmaxsize) 144 | // Sets the maximum window size. Will resize the window if the window is currently larger than the given dimensions. 145 | // Setting a size of 0,0 will disable this constraint. 146 | export function WindowSetMaxSize(width: number, height: number): void; 147 | 148 | // [WindowSetMinSize](https://wails.io/docs/reference/runtime/window#windowsetminsize) 149 | // Sets the minimum window size. Will resize the window if the window is currently smaller than the given dimensions. 150 | // Setting a size of 0,0 will disable this constraint. 151 | export function WindowSetMinSize(width: number, height: number): void; 152 | 153 | // [WindowSetPosition](https://wails.io/docs/reference/runtime/window#windowsetposition) 154 | // Sets the window position relative to the monitor the window is currently on. 155 | export function WindowSetPosition(x: number, y: number): void; 156 | 157 | // [WindowGetPosition](https://wails.io/docs/reference/runtime/window#windowgetposition) 158 | // Gets the window position relative to the monitor the window is currently on. 159 | export function WindowGetPosition(): Promise; 160 | 161 | // [WindowHide](https://wails.io/docs/reference/runtime/window#windowhide) 162 | // Hides the window. 163 | export function WindowHide(): void; 164 | 165 | // [WindowShow](https://wails.io/docs/reference/runtime/window#windowshow) 166 | // Shows the window, if it is currently hidden. 167 | export function WindowShow(): void; 168 | 169 | // [WindowMaximise](https://wails.io/docs/reference/runtime/window#windowmaximise) 170 | // Maximises the window to fill the screen. 171 | export function WindowMaximise(): void; 172 | 173 | // [WindowToggleMaximise](https://wails.io/docs/reference/runtime/window#windowtogglemaximise) 174 | // Toggles between Maximised and UnMaximised. 175 | export function WindowToggleMaximise(): void; 176 | 177 | // [WindowUnmaximise](https://wails.io/docs/reference/runtime/window#windowunmaximise) 178 | // Restores the window to the dimensions and position prior to maximising. 179 | export function WindowUnmaximise(): void; 180 | 181 | // [WindowIsMaximised](https://wails.io/docs/reference/runtime/window#windowismaximised) 182 | // Returns the state of the window, i.e. whether the window is maximised or not. 183 | export function WindowIsMaximised(): Promise; 184 | 185 | // [WindowMinimise](https://wails.io/docs/reference/runtime/window#windowminimise) 186 | // Minimises the window. 187 | export function WindowMinimise(): void; 188 | 189 | // [WindowUnminimise](https://wails.io/docs/reference/runtime/window#windowunminimise) 190 | // Restores the window to the dimensions and position prior to minimising. 191 | export function WindowUnminimise(): void; 192 | 193 | // [WindowIsMinimised](https://wails.io/docs/reference/runtime/window#windowisminimised) 194 | // Returns the state of the window, i.e. whether the window is minimised or not. 195 | export function WindowIsMinimised(): Promise; 196 | 197 | // [WindowIsNormal](https://wails.io/docs/reference/runtime/window#windowisnormal) 198 | // Returns the state of the window, i.e. whether the window is normal or not. 199 | export function WindowIsNormal(): Promise; 200 | 201 | // [WindowSetBackgroundColour](https://wails.io/docs/reference/runtime/window#windowsetbackgroundcolour) 202 | // Sets the background colour of the window to the given RGBA colour definition. This colour will show through for all transparent pixels. 203 | export function WindowSetBackgroundColour(R: number, G: number, B: number, A: number): void; 204 | 205 | // [ScreenGetAll](https://wails.io/docs/reference/runtime/window#screengetall) 206 | // Gets the all screens. Call this anew each time you want to refresh data from the underlying windowing system. 207 | export function ScreenGetAll(): Promise; 208 | 209 | // [BrowserOpenURL](https://wails.io/docs/reference/runtime/browser#browseropenurl) 210 | // Opens the given URL in the system browser. 211 | export function BrowserOpenURL(url: string): void; 212 | 213 | // [Environment](https://wails.io/docs/reference/runtime/intro#environment) 214 | // Returns information about the environment 215 | export function Environment(): Promise; 216 | 217 | // [Quit](https://wails.io/docs/reference/runtime/intro#quit) 218 | // Quits the application. 219 | export function Quit(): void; 220 | 221 | // [Hide](https://wails.io/docs/reference/runtime/intro#hide) 222 | // Hides the application. 223 | export function Hide(): void; 224 | 225 | // [Show](https://wails.io/docs/reference/runtime/intro#show) 226 | // Shows the application. 227 | export function Show(): void; 228 | 229 | // [ClipboardGetText](https://wails.io/docs/reference/runtime/clipboard#clipboardgettext) 230 | // Returns the current text stored on clipboard 231 | export function ClipboardGetText(): Promise; 232 | 233 | // [ClipboardSetText](https://wails.io/docs/reference/runtime/clipboard#clipboardsettext) 234 | // Sets a text on the clipboard 235 | export function ClipboardSetText(text: string): Promise; 236 | -------------------------------------------------------------------------------- /write/frontend/wailsjs/runtime/runtime.js: -------------------------------------------------------------------------------- 1 | /* 2 | _ __ _ __ 3 | | | / /___ _(_) /____ 4 | | | /| / / __ `/ / / ___/ 5 | | |/ |/ / /_/ / / (__ ) 6 | |__/|__/\__,_/_/_/____/ 7 | The electron alternative for Go 8 | (c) Lea Anthony 2019-present 9 | */ 10 | 11 | export function LogPrint(message) { 12 | window.runtime.LogPrint(message); 13 | } 14 | 15 | export function LogTrace(message) { 16 | window.runtime.LogTrace(message); 17 | } 18 | 19 | export function LogDebug(message) { 20 | window.runtime.LogDebug(message); 21 | } 22 | 23 | export function LogInfo(message) { 24 | window.runtime.LogInfo(message); 25 | } 26 | 27 | export function LogWarning(message) { 28 | window.runtime.LogWarning(message); 29 | } 30 | 31 | export function LogError(message) { 32 | window.runtime.LogError(message); 33 | } 34 | 35 | export function LogFatal(message) { 36 | window.runtime.LogFatal(message); 37 | } 38 | 39 | export function EventsOnMultiple(eventName, callback, maxCallbacks) { 40 | return window.runtime.EventsOnMultiple(eventName, callback, maxCallbacks); 41 | } 42 | 43 | export function EventsOn(eventName, callback) { 44 | return EventsOnMultiple(eventName, callback, -1); 45 | } 46 | 47 | export function EventsOff(eventName, ...additionalEventNames) { 48 | return window.runtime.EventsOff(eventName, ...additionalEventNames); 49 | } 50 | 51 | export function EventsOnce(eventName, callback) { 52 | return EventsOnMultiple(eventName, callback, 1); 53 | } 54 | 55 | export function EventsEmit(eventName) { 56 | let args = [eventName].slice.call(arguments); 57 | return window.runtime.EventsEmit.apply(null, args); 58 | } 59 | 60 | export function WindowReload() { 61 | window.runtime.WindowReload(); 62 | } 63 | 64 | export function WindowReloadApp() { 65 | window.runtime.WindowReloadApp(); 66 | } 67 | 68 | export function WindowSetAlwaysOnTop(b) { 69 | window.runtime.WindowSetAlwaysOnTop(b); 70 | } 71 | 72 | export function WindowSetSystemDefaultTheme() { 73 | window.runtime.WindowSetSystemDefaultTheme(); 74 | } 75 | 76 | export function WindowSetLightTheme() { 77 | window.runtime.WindowSetLightTheme(); 78 | } 79 | 80 | export function WindowSetDarkTheme() { 81 | window.runtime.WindowSetDarkTheme(); 82 | } 83 | 84 | export function WindowCenter() { 85 | window.runtime.WindowCenter(); 86 | } 87 | 88 | export function WindowSetTitle(title) { 89 | window.runtime.WindowSetTitle(title); 90 | } 91 | 92 | export function WindowFullscreen() { 93 | window.runtime.WindowFullscreen(); 94 | } 95 | 96 | export function WindowUnfullscreen() { 97 | window.runtime.WindowUnfullscreen(); 98 | } 99 | 100 | export function WindowIsFullscreen() { 101 | return window.runtime.WindowIsFullscreen(); 102 | } 103 | 104 | export function WindowGetSize() { 105 | return window.runtime.WindowGetSize(); 106 | } 107 | 108 | export function WindowSetSize(width, height) { 109 | window.runtime.WindowSetSize(width, height); 110 | } 111 | 112 | export function WindowSetMaxSize(width, height) { 113 | window.runtime.WindowSetMaxSize(width, height); 114 | } 115 | 116 | export function WindowSetMinSize(width, height) { 117 | window.runtime.WindowSetMinSize(width, height); 118 | } 119 | 120 | export function WindowSetPosition(x, y) { 121 | window.runtime.WindowSetPosition(x, y); 122 | } 123 | 124 | export function WindowGetPosition() { 125 | return window.runtime.WindowGetPosition(); 126 | } 127 | 128 | export function WindowHide() { 129 | window.runtime.WindowHide(); 130 | } 131 | 132 | export function WindowShow() { 133 | window.runtime.WindowShow(); 134 | } 135 | 136 | export function WindowMaximise() { 137 | window.runtime.WindowMaximise(); 138 | } 139 | 140 | export function WindowToggleMaximise() { 141 | window.runtime.WindowToggleMaximise(); 142 | } 143 | 144 | export function WindowUnmaximise() { 145 | window.runtime.WindowUnmaximise(); 146 | } 147 | 148 | export function WindowIsMaximised() { 149 | return window.runtime.WindowIsMaximised(); 150 | } 151 | 152 | export function WindowMinimise() { 153 | window.runtime.WindowMinimise(); 154 | } 155 | 156 | export function WindowUnminimise() { 157 | window.runtime.WindowUnminimise(); 158 | } 159 | 160 | export function WindowSetBackgroundColour(R, G, B, A) { 161 | window.runtime.WindowSetBackgroundColour(R, G, B, A); 162 | } 163 | 164 | export function ScreenGetAll() { 165 | return window.runtime.ScreenGetAll(); 166 | } 167 | 168 | export function WindowIsMinimised() { 169 | return window.runtime.WindowIsMinimised(); 170 | } 171 | 172 | export function WindowIsNormal() { 173 | return window.runtime.WindowIsNormal(); 174 | } 175 | 176 | export function BrowserOpenURL(url) { 177 | window.runtime.BrowserOpenURL(url); 178 | } 179 | 180 | export function Environment() { 181 | return window.runtime.Environment(); 182 | } 183 | 184 | export function Quit() { 185 | window.runtime.Quit(); 186 | } 187 | 188 | export function Hide() { 189 | window.runtime.Hide(); 190 | } 191 | 192 | export function Show() { 193 | window.runtime.Show(); 194 | } 195 | 196 | export function ClipboardGetText() { 197 | return window.runtime.ClipboardGetText(); 198 | } 199 | 200 | export function ClipboardSetText(text) { 201 | return window.runtime.ClipboardSetText(text); 202 | } -------------------------------------------------------------------------------- /write/go.mod: -------------------------------------------------------------------------------- 1 | module changeme 2 | 3 | go 1.18 4 | 5 | require ( 6 | github.com/go-pdf/fpdf v0.9.0 7 | github.com/mitchellh/go-homedir v1.1.0 8 | github.com/wailsapp/wails/v2 v2.6.0 9 | github.com/yuin/goldmark v1.4.13 10 | ) 11 | 12 | require ( 13 | github.com/bep/debounce v1.2.1 // indirect 14 | github.com/go-ole/go-ole v1.2.6 // indirect 15 | github.com/google/uuid v1.3.0 // indirect 16 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect 17 | github.com/labstack/echo/v4 v4.10.2 // indirect 18 | github.com/labstack/gommon v0.4.0 // indirect 19 | github.com/leaanthony/go-ansi-parser v1.6.0 // indirect 20 | github.com/leaanthony/gosod v1.0.3 // indirect 21 | github.com/leaanthony/slicer v1.6.0 // indirect 22 | github.com/mattn/go-colorable v0.1.13 // indirect 23 | github.com/mattn/go-isatty v0.0.19 // indirect 24 | github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect 25 | github.com/pkg/errors v0.9.1 // indirect 26 | github.com/rivo/uniseg v0.4.4 // indirect 27 | github.com/samber/lo v1.38.1 // indirect 28 | github.com/tkrajina/go-reflector v0.5.6 // indirect 29 | github.com/valyala/bytebufferpool v1.0.0 // indirect 30 | github.com/valyala/fasttemplate v1.2.2 // indirect 31 | github.com/wailsapp/go-webview2 v1.0.1 // indirect 32 | github.com/wailsapp/mimetype v1.4.1 // indirect 33 | golang.org/x/crypto v0.9.0 // indirect 34 | golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect 35 | golang.org/x/net v0.10.0 // indirect 36 | golang.org/x/sys v0.8.0 // indirect 37 | golang.org/x/text v0.9.0 // indirect 38 | ) 39 | 40 | // replace github.com/wailsapp/wails/v2 v2.6.0 => /home/ersin/go/pkg/mod 41 | -------------------------------------------------------------------------------- /write/go.sum: -------------------------------------------------------------------------------- 1 | github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= 2 | github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= 3 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 4 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 5 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 6 | github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= 7 | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= 8 | github.com/go-pdf/fpdf v0.9.0 h1:PPvSaUuo1iMi9KkaAn90NuKi+P4gwMedWPHhj8YlJQw= 9 | github.com/go-pdf/fpdf v0.9.0/go.mod h1:oO8N111TkmKb9D7VvWGLvLJlaZUQVPM+6V42pp3iV4Y= 10 | github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= 11 | github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 12 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= 13 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= 14 | github.com/labstack/echo/v4 v4.10.2 h1:n1jAhnq/elIFTHr1EYpiYtyKgx4RW9ccVgkqByZaN2M= 15 | github.com/labstack/echo/v4 v4.10.2/go.mod h1:OEyqf2//K1DFdE57vw2DRgWY0M7s65IVQO2FzvI4J5k= 16 | github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= 17 | github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= 18 | github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc= 19 | github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= 20 | github.com/leaanthony/go-ansi-parser v1.6.0 h1:T8TuMhFB6TUMIUm0oRrSbgJudTFw9csT3ZK09w0t4Pg= 21 | github.com/leaanthony/go-ansi-parser v1.6.0/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= 22 | github.com/leaanthony/gosod v1.0.3 h1:Fnt+/B6NjQOVuCWOKYRREZnjGyvg+mEhd1nkkA04aTQ= 23 | github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4= 24 | github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= 25 | github.com/leaanthony/slicer v1.6.0 h1:1RFP5uiPJvT93TAHi+ipd3NACobkW53yUiBqZheE/Js= 26 | github.com/leaanthony/slicer v1.6.0/go.mod h1:o/Iz29g7LN0GqH3aMjWAe90381nyZlDNquK+mtH2Fj8= 27 | github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= 28 | github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= 29 | github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= 30 | github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= 31 | github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= 32 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 33 | github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= 34 | github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= 35 | github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= 36 | github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= 37 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 38 | github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= 39 | github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= 40 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 41 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 42 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 43 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 44 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= 45 | github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= 46 | github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 47 | github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM= 48 | github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA= 49 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 50 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 51 | github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= 52 | github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE= 53 | github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= 54 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 55 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 56 | github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= 57 | github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= 58 | github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= 59 | github.com/wailsapp/go-webview2 v1.0.1 h1:dEJIeEApW/MhO2tTMISZBFZPuW7kwrFA1NtgFB1z1II= 60 | github.com/wailsapp/go-webview2 v1.0.1/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo= 61 | github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= 62 | github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= 63 | github.com/wailsapp/wails/v2 v2.6.0 h1:EyH0zR/EO6dDiqNy8qU5spaXDfkluiq77xrkabPYD4c= 64 | github.com/wailsapp/wails/v2 v2.6.0/go.mod h1:WBG9KKWuw0FKfoepBrr/vRlyTmHaMibWesK3yz6nNiM= 65 | github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= 66 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 67 | golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= 68 | golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= 69 | golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= 70 | golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= 71 | golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 72 | golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= 73 | golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 74 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 75 | golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 76 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 77 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 78 | golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 79 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 80 | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 81 | golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 82 | golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 83 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 84 | golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= 85 | golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 86 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 87 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 88 | golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= 89 | golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 90 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 91 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 92 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 93 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 94 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 95 | -------------------------------------------------------------------------------- /write/lib/markdown.go: -------------------------------------------------------------------------------- 1 | package lib 2 | 3 | import ( 4 | "bytes" 5 | "github.com/yuin/goldmark" 6 | "log/slog" 7 | ) 8 | 9 | func renderMD(md []byte) ([]byte, error) { 10 | var buf bytes.Buffer 11 | if err := goldmark.Convert(md, &buf); err != nil { 12 | return nil, err 13 | } 14 | return buf.Bytes(), nil 15 | } 16 | 17 | func RenderMD(md string) string { 18 | m, err := renderMD([]byte(md)) 19 | if err != nil { 20 | slog.Error("Fatal error parsing markdown", "err", err) 21 | return md 22 | } 23 | return `
` + string(m) + `
` 24 | } 25 | -------------------------------------------------------------------------------- /write/lib/pdf.go: -------------------------------------------------------------------------------- 1 | package lib 2 | 3 | import ( 4 | "github.com/go-pdf/fpdf" 5 | "github.com/yuin/goldmark" 6 | "github.com/yuin/goldmark/ast" 7 | "github.com/yuin/goldmark/renderer" 8 | "io" 9 | ) 10 | 11 | type rFunc func(source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) 12 | type pdfRenderer struct { 13 | pdf *fpdf.Fpdf 14 | renderFuncs map[ast.NodeKind]rFunc 15 | } 16 | 17 | func (p *pdfRenderer) Render(w io.Writer, source []byte, n ast.Node) error { 18 | 19 | n.Dump(source, 2) 20 | err := ast.Walk(n, func(n ast.Node, entering bool) (ast.WalkStatus, error) { 21 | s := ast.WalkStatus(ast.WalkContinue) 22 | if cb, ok := p.renderFuncs[n.Kind()]; ok { 23 | return cb(source, n, entering) 24 | } 25 | return s, nil 26 | }) 27 | return err 28 | } 29 | 30 | func (p *pdfRenderer) AddOptions(option ...renderer.Option) { 31 | //TODO implement me 32 | panic("implement me") 33 | } 34 | 35 | const p1 = 12 36 | const baseHeight = 6 37 | const fontSize = 14 38 | 39 | func Pdf(path string, content string) error { 40 | 41 | pdf := fpdf.New("P", "mm", "A4", "") 42 | pdf.AddPage() 43 | 44 | lineIndentLevel := 0 45 | 46 | baseMargin := pdf.GetX() 47 | 48 | renderFuncs := map[ast.NodeKind]rFunc{ 49 | ast.KindHeading: func(source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { 50 | hd := node.(*ast.Heading) 51 | sizeMap := map[int]float64{ 52 | 1: 24, 53 | 2: 18, 54 | 3: 16, 55 | 4: 14, 56 | } 57 | if entering { 58 | pdf.SetFont("Arial", "", sizeMap[hd.Level]) 59 | pdf.MultiCell(0, baseHeight, string(node.Text(source)), "", "", false) 60 | } else { 61 | pdf.MultiCell(0, p1, "", "", "", false) 62 | pdf.SetFont("Arial", "", fontSize) 63 | } 64 | return ast.WalkSkipChildren, nil 65 | }, 66 | ast.KindLink: func(source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { 67 | if entering { 68 | // TODO make link clickable 69 | pdf.SetTextColor(0, 0, 255) 70 | pdf.SetFont("Arial", "U", fontSize) 71 | href := node.(*ast.Link).Destination 72 | pdf.WriteLinkString(baseHeight, string(node.Text(source)), string(href)) 73 | } else { 74 | pdf.SetTextColor(0, 0, 0) 75 | pdf.SetFont("Arial", "", fontSize) 76 | } 77 | return ast.WalkSkipChildren, nil 78 | }, 79 | ast.KindText: func(source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { 80 | if entering { 81 | pdf.Write(baseHeight, string(node.Text(source))) 82 | } 83 | return ast.WalkSkipChildren, nil 84 | }, 85 | ast.KindParagraph: func(source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { 86 | if !entering { 87 | pdf.MultiCell(0, p1, "", "", "", false) 88 | } 89 | return ast.WalkContinue, nil 90 | }, 91 | ast.KindCodeBlock: func(source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { 92 | if entering { 93 | pdf.SetFont("Courier", "", fontSize) 94 | pdf.MultiCell(0, p1, "", "", "", false) 95 | pdf.MultiCell(0, baseHeight, string(node.Text(source)), "", "", false) 96 | pdf.MultiCell(0, p1, "", "", "", false) 97 | } 98 | return ast.WalkContinue, nil 99 | }, 100 | ast.KindList: func(source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { 101 | if entering { 102 | // if it's previous sibling is a paragraph then delete that paragraph margin!! 103 | if node.PreviousSibling() != nil && node.PreviousSibling().Kind() == ast.KindParagraph { 104 | pdf.SetY(pdf.GetY() - 1.5*baseHeight) 105 | } 106 | lineIndentLevel += 1 107 | } else { 108 | pdf.Ln(baseHeight) 109 | pdf.SetLeftMargin(baseMargin) 110 | lineIndentLevel -= 1 111 | } 112 | return ast.WalkContinue, nil 113 | }, 114 | ast.KindListItem: func(source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { 115 | if entering { 116 | pdf.Ln(baseHeight) 117 | pdf.SetLeftMargin(baseMargin + float64(lineIndentLevel)*2) 118 | pdf.Write(baseHeight, "- ") 119 | } 120 | return ast.WalkContinue, nil 121 | }, 122 | ast.KindFencedCodeBlock: func(source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { 123 | if entering { 124 | // y u no text content?? :(:( 125 | cd := node.(*ast.FencedCodeBlock) 126 | txt := string(cd.Info.Text(source)) 127 | // TODO make text content render properly... 128 | pdf.SetFont("Courier", "", fontSize) 129 | pdf.MultiCell(0, p1, "", "", "", false) 130 | pdf.MultiCell(0, baseHeight, txt, "", "", false) 131 | pdf.MultiCell(0, p1, "", "", "", false) 132 | } 133 | return ast.WalkContinue, nil 134 | }, 135 | } 136 | rdr := goldmark.New(goldmark.WithRenderer(&pdfRenderer{pdf, renderFuncs})) 137 | 138 | var wr io.Writer 139 | err := rdr.Convert([]byte(content), wr) 140 | if err != nil { 141 | return err 142 | } 143 | err = pdf.OutputFileAndClose(path) 144 | return err 145 | } 146 | -------------------------------------------------------------------------------- /write/lib/pdf_test.go: -------------------------------------------------------------------------------- 1 | package lib 2 | 3 | import ( 4 | "os" 5 | "path" 6 | "runtime" 7 | "testing" 8 | ) 9 | 10 | func TestPDF(t *testing.T) { 11 | _, filename, _, _ := runtime.Caller(0) 12 | testDir := path.Dir(filename) + "/test/" 13 | testFile := testDir + "test.pdf" 14 | testInput := testDir + "test.md" 15 | t.Logf("Current test filename: %s", testFile) 16 | testContent, err := os.ReadFile(testInput) 17 | if err != nil { 18 | t.Fatal("Error reading test file", err) 19 | } 20 | 21 | err = Pdf(testFile, string(testContent)) 22 | if err != nil { 23 | t.Fatal("Error creating PDF", err) 24 | } 25 | } 26 | 27 | func TestReadmePDF(t *testing.T) { 28 | _, filename, _, _ := runtime.Caller(0) 29 | testDir := path.Dir(filename) + "/../../" 30 | testFile := testDir + "README.pdf" 31 | testInput := testDir + "README.md" 32 | t.Logf("Current test filename: %s", testFile) 33 | testContent, err := os.ReadFile(testInput) 34 | if err != nil { 35 | t.Fatal("Error reading test file", err) 36 | } 37 | 38 | err = Pdf(testFile, string(testContent)) 39 | if err != nil { 40 | t.Fatal("Error creating PDF", err) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /write/lib/test/test.md: -------------------------------------------------------------------------------- 1 | # Hello world 2 | 3 | This is some test content. I am enjoying the search engine [kagi](https://kagi.com) btw. It is really cool how it provides a subtly different window into the internet as opposed to google/bing. DuckDuckGo became to samey, and that sucks. I'm really leaning towards paying for search! 4 | 5 | There are many paragraphs of varying sizes and importances. The stuff I want to work with mostly are. Links, Lists, Code Blocks and paragraphs. 6 | If I could do all that, I would be legit chuffed with this scuffed implementation of a pdf renderer using fpdf 7 | 8 | Features needed: 9 | - links [the ruby doco](https://news.ycombinator.com/item?id=38248421) 10 | - paragraphs 11 | - headings 12 | - lists 13 | - nested 14 | - numbered 15 | - styles? Well, glad you asked. I'm not sure I need them quite yet, but I would be open to extension 16 | - code blocks 17 | - images 18 | - blockquotes!!! 19 | 20 | 21 | Why am I implementing this now? 22 | 23 | 24 | ```javascript 25 | 26 | const js = 'this is a js example, but it will probably show up as a plain old unhighlighted text..'; 27 | 28 | const plan = () => { 29 | console.log(js); 30 | } 31 | ``` 32 | 33 | > Albert Einstein once described his rules of work: “One: Out of clutter, find simplicity. Two: From discord, find harmony. Three: In the middle of difficulty lies opportunity. 34 | 35 | 36 | 37 | The Lakotas concept of teamwork was deeply rooted in their view of the universe. A warrior didn’t try to stand out from his fellow band members; he strove to act bravely and honorably, to help the group in whatever way he could to accomplish its mission. 38 | ― Phil Jackson, Sacred Hoops: Spiritual Lessons of a Hardwood Warrior 39 | 40 | 41 | 42 | Cloud apps like Google Docs and Trello are popular because they enable real-time collaboration with colleagues, and they make it easy for us to access our work from all of our devices. However, by centralizing data storage on servers, cloud apps also take away ownership and agency from users. If a service shuts down, the software stops functioning, and data created with that software is lost. 43 | 44 | In this article we propose “local-first software”: a set of principles for software that enables both collaboration and ownership for users. Local-first ideals include the ability to work offline and collaborate across multiple devices, while also improving the security, privacy, long-term preservation, and user control of data. 45 | 46 | We survey existing approaches to data storage and sharing, ranging from email attachments to web apps to Firebase-backed mobile apps, and we examine the trade-offs of each. We look at Conflict-free Replicated Data Types (CRDTs): data structures that are multi-user from the ground up while also being fundamentally local and private. CRDTs have the potential to be a foundational technology for realizing local-first software. 47 | 48 | We share some of our findings from developing local-first software prototypes at Ink & Switch over the course of several years. These experiments test the viability of CRDTs in practice, and explore the user interface challenges for this new data model. Lastly, we suggest some next steps for moving towards local-first software: for researchers, for app developers, and a startup opportunity for entrepreneurs. 49 | 50 | This article has also been published in PDF format in the proceedings of the Onward! 2019 conference. Please cite it as: -------------------------------------------------------------------------------- /write/lib/test/test.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ebuckley/write/335bc096973f3b5a368e0257c1ffcd053a6c513c/write/lib/test/test.pdf -------------------------------------------------------------------------------- /write/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "embed" 5 | 6 | "github.com/wailsapp/wails/v2" 7 | "github.com/wailsapp/wails/v2/pkg/options" 8 | ) 9 | 10 | //go:embed all:frontend/dist 11 | var assets embed.FS 12 | 13 | //go:embed build/appicon.png 14 | var icon []byte 15 | 16 | func main() { 17 | // Create an instance of the app structure 18 | app := NewApp() 19 | 20 | // Create application with options 21 | err := wails.Run(&options.App{ 22 | Title: "wails-events", 23 | Width: 1024, 24 | Height: 768, 25 | Assets: assets, 26 | BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1}, 27 | OnStartup: app.startup, 28 | Bind: []interface{}{ 29 | app, 30 | }, 31 | }) 32 | 33 | if err != nil { 34 | println("Error:", err.Error()) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /write/scripts/build-macos-arm.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | echo -e "Start running the script..." 4 | cd ../ 5 | 6 | echo -e "Start building the app for macos platform..." 7 | wails build --clean --platform darwin/arm64 8 | 9 | echo -e "End running the script!" 10 | -------------------------------------------------------------------------------- /write/scripts/build-macos-intel.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | echo -e "Start running the script..." 4 | cd ../ 5 | 6 | echo -e "Start building the app for macos platform..." 7 | wails build --clean --platform darwin 8 | 9 | echo -e "End running the script!" 10 | -------------------------------------------------------------------------------- /write/scripts/build-macos.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | echo -e "Start running the script..." 4 | cd ../ 5 | 6 | echo -e "Start building the app for macos platform..." 7 | wails build --clean --platform darwin/universal 8 | 9 | echo -e "End running the script!" 10 | -------------------------------------------------------------------------------- /write/scripts/build-windows.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | echo -e "Start running the script..." 4 | cd ../ 5 | 6 | echo -e "Start building the app for windows platform..." 7 | wails build --clean --platform windows/amd64 8 | 9 | echo -e "End running the script!" 10 | -------------------------------------------------------------------------------- /write/scripts/build.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | echo -e "Start running the script..." 4 | cd ../ 5 | 6 | echo -e "Start building the app..." 7 | wails build --clean 8 | 9 | echo -e "End running the script!" 10 | -------------------------------------------------------------------------------- /write/scripts/install-wails-cli.sh: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | echo -e "Start running the script..." 4 | cd ../ 5 | 6 | echo -e "Current Go version: \c" 7 | go version 8 | 9 | echo -e "Install the Wails command line tool..." 10 | go install github.com/wailsapp/wails/v2/cmd/wails@latest 11 | 12 | echo -e "Successful installation!" 13 | 14 | echo -e "End running the script!" 15 | -------------------------------------------------------------------------------- /write/tmp/main: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ebuckley/write/335bc096973f3b5a368e0257c1ffcd053a6c513c/write/tmp/main -------------------------------------------------------------------------------- /write/wails.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "write", 3 | "outputfilename": "write", 4 | "frontend:install": "npm install", 5 | "frontend:build": "npm run build", 6 | "frontend:dev:watcher": "npm run dev", 7 | "frontend:dev:serverUrl": "auto", 8 | "author": { 9 | "name": "ebuckley", 10 | "email": "ersinbuckley@gmail.com" 11 | } 12 | } 13 | --------------------------------------------------------------------------------