├── .gitignore ├── README.md ├── app.go ├── build ├── appicon.png └── windows │ ├── icon.ico │ ├── info.json │ └── wails.exe.manifest ├── demo.gif ├── frontend ├── .vscode │ └── extensions.json ├── README.md ├── index.html ├── jsconfig.json ├── package-lock.json ├── package.json ├── package.json.md5 ├── src │ ├── App.svelte │ ├── assets │ │ ├── fonts │ │ │ ├── OFL.txt │ │ │ └── nunito-v16-latin-regular.woff2 │ │ └── images │ │ │ └── logo-universal.png │ ├── main.js │ ├── style.css │ └── vite-env.d.ts ├── vite.config.js └── wailsjs │ ├── go │ └── main │ │ ├── App.d.ts │ │ └── App.js │ └── runtime │ ├── package.json │ ├── runtime.d.ts │ └── runtime.js ├── go.mod ├── go.sum ├── main.go └── wails.json /.gitignore: -------------------------------------------------------------------------------- 1 | build/bin 2 | node_modules 3 | frontend/dist 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Batch Image Generator 2 | 3 | Generate dynamic image content based on a template image and a CSV file. 4 | 5 | ![Demo](demo.gif) 6 | 7 | - [x] Generate images from a template image and a CSV file 8 | - [x] Basic CSV Support 9 | - [x] Custom Font 10 | - [x] Transform to uppercase, QR Code, Avatar, Initial Avatar 11 | - [x] Text Alignment 12 | - [x] Text Color 13 | - [ ] File for Save/Load 14 | - [ ] More control of rectangle position 15 | - [ ] More Interactive Progress 16 | 17 | ## Development 18 | 19 | Please visit [Wails Getting Started](https://wails.io/docs/gettingstarted/installation) to setup the development environment. 20 | 21 | Made with [Wails](https://wails.app/) and [Svelte](https://svelte.dev/). 22 | -------------------------------------------------------------------------------- /app.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "context" 6 | "encoding/base64" 7 | "encoding/csv" 8 | "encoding/hex" 9 | "encoding/json" 10 | "fmt" 11 | "image" 12 | "image/draw" 13 | "image/png" 14 | "io" 15 | "log" 16 | "os" 17 | "os/exec" 18 | "runtime" 19 | "strings" 20 | 21 | "github.com/disintegration/imaging" 22 | "github.com/fogleman/gg" 23 | "github.com/golang/freetype/truetype" 24 | avatar "github.com/holys/initials-avatar" 25 | "github.com/mitchellh/go-homedir" 26 | "github.com/o1egl/govatar" 27 | "github.com/skip2/go-qrcode" 28 | ) 29 | 30 | // App struct 31 | type App struct { 32 | ctx context.Context 33 | } 34 | 35 | // NewApp creates a new App application struct 36 | func NewApp() *App { 37 | return &App{} 38 | } 39 | 40 | // startup is called when the app starts. The context is saved 41 | // so we can call the runtime methods 42 | func (a *App) startup(ctx context.Context) { 43 | a.ctx = ctx 44 | } 45 | 46 | // Greet returns a greeting for the given name 47 | func (a *App) Greet(name string) string { 48 | return fmt.Sprintf("Hello %s, It's show time!", name) 49 | } 50 | 51 | type Placeholder struct { 52 | ID int `json:"id"` 53 | StartX float64 `json:"startX"` 54 | StartY float64 `json:"startY"` 55 | W float64 `json:"w"` 56 | H float64 `json:"h"` 57 | CsvKey string `json:"csv_key"` 58 | Color string `json:"color"` 59 | Font string `json:"font"` 60 | FontContent string `json:"fontContent"` 61 | TextAlign string `json:"textAlign"` 62 | FontSize float64 `json:"fontSize"` 63 | Transform string `json:"transform"` 64 | } 65 | 66 | func (a *App) OpenBrowser(url string) { 67 | var err error 68 | 69 | switch runtime.GOOS { 70 | case "linux": 71 | err = exec.Command("xdg-open", url).Start() 72 | case "windows": 73 | err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start() 74 | case "darwin": 75 | err = exec.Command("open", url).Start() 76 | default: 77 | err = fmt.Errorf("unsupported platform") 78 | } 79 | if err != nil { 80 | log.Fatal(err) 81 | } 82 | } 83 | 84 | func (a *App) Proceed(b64image string, placehldr string, csvData string) string { 85 | reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(b64image)) 86 | m, _, err := image.Decode(reader) 87 | if err != nil { 88 | log.Println(err) 89 | return err.Error() 90 | } 91 | 92 | // Load placeholders 93 | var placeholders []Placeholder 94 | json.Unmarshal([]byte(placehldr), &placeholders) 95 | 96 | // Load CSV 97 | r := csv.NewReader(bytes.NewReader([]byte(csvData))) 98 | headers, _ := r.Read() 99 | rowIndex := map[string]int{} 100 | for i, h := range headers { 101 | rowIndex[h] = i 102 | } 103 | 104 | // Save each image 105 | home, err := homedir.Dir() 106 | if err != nil { 107 | log.Println(err) 108 | return err.Error() 109 | } 110 | savePath := home + fmt.Sprintf("%sDocuments%sBatch Image Generator", string(os.PathSeparator), string(os.PathSeparator)) 111 | err = os.MkdirAll(savePath, os.ModePerm) 112 | if err != nil { 113 | log.Println(err) 114 | return err.Error() 115 | } 116 | 117 | // counter for naming output images 118 | counter := 0 119 | 120 | for { 121 | row, err := r.Read() 122 | if err == io.EOF { 123 | break 124 | } 125 | 126 | // Create a copy of the image for each row 127 | imgCopy := image.NewRGBA(m.Bounds()) 128 | draw.Draw(imgCopy, imgCopy.Bounds(), m, image.Point{0, 0}, draw.Src) 129 | 130 | dc := gg.NewContextForImage(imgCopy) 131 | 132 | // Draw each placeholder 133 | for _, ph := range placeholders { 134 | if ph.CsvKey != "" { 135 | dc.Push() 136 | 137 | // Load font 138 | data, err := base64.StdEncoding.DecodeString(ph.FontContent) 139 | if err == nil { 140 | if font, err := truetype.Parse(data); err == nil { 141 | face := truetype.NewFace(font, &truetype.Options{Size: ph.FontSize}) 142 | dc.SetFontFace(face) 143 | } else { 144 | log.Println(err) 145 | } 146 | } else { 147 | fmt.Println(err) 148 | } 149 | 150 | // Set color 151 | colorHex := strings.TrimPrefix(ph.Color, "#") 152 | colorRgb, _ := hex.DecodeString(colorHex) 153 | r := float64(colorRgb[0]) / 255.0 154 | g := float64(colorRgb[1]) / 255.0 155 | b := float64(colorRgb[2]) / 255.0 156 | dc.SetRGB(r, g, b) 157 | 158 | // Text alignment 159 | w, h := dc.MeasureString(row[rowIndex[ph.CsvKey]]) 160 | startX := ph.StartX 161 | startY := ph.StartY + ph.H - h*0.8 // adjust the baseline factor if needed 162 | 163 | switch ph.TextAlign { 164 | case "center": 165 | startX = ph.StartX + (ph.W-w)/2 166 | case "right": 167 | startX = ph.StartX + ph.W - w 168 | } 169 | 170 | // Transformation 171 | content := row[rowIndex[ph.CsvKey]] 172 | switch ph.Transform { 173 | case "uppercase": 174 | content = strings.ToUpper(content) 175 | case "qrcode": 176 | qrCode, err := qrcode.New(content, qrcode.Medium) 177 | if err != nil { 178 | log.Println(err) 179 | } else { 180 | qrImage := qrCode.Image(int(ph.W)) 181 | dc.DrawImage(qrImage, int(startX), int(startY)) 182 | dc.Pop() 183 | continue 184 | } 185 | case "avatar": 186 | // current gender are still static, this need to be fixed 187 | if avtr, err := govatar.Generate(govatar.MALE); err == nil { 188 | // Resize the image 189 | resizedImg := imaging.Resize(avtr, int(ph.W), int(ph.W), imaging.Lanczos) 190 | 191 | dc.DrawImage(resizedImg, int(startX), int(startY)) 192 | dc.Pop() 193 | continue 194 | } 195 | case "initial-avatar": 196 | a := avatar.New("") 197 | if raw, err := a.DrawToBytes(content, int(ph.W), "png"); err == nil { 198 | if img, perr := png.Decode(bytes.NewReader(raw)); perr == nil { 199 | dc.DrawImage(img, int(startX), int(startY)) 200 | dc.Pop() 201 | continue 202 | } 203 | } 204 | } 205 | 206 | // Draw the string 207 | dc.DrawStringAnchored(content, startX, startY, 0, 1) 208 | dc.Pop() 209 | } 210 | } 211 | 212 | dc.SavePNG(fmt.Sprintf("%s%sout%d.png", savePath, string(os.PathSeparator), counter)) 213 | counter++ 214 | } 215 | 216 | return "Success, saved in " + savePath 217 | } 218 | -------------------------------------------------------------------------------- /build/appicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenoid/batch-image-generator/ab4efc7484f71163f3253a84f51ecb8c7404d033/build/appicon.png -------------------------------------------------------------------------------- /build/windows/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenoid/batch-image-generator/ab4efc7484f71163f3253a84f51ecb8c7404d033/build/windows/icon.ico -------------------------------------------------------------------------------- /build/windows/info.json: -------------------------------------------------------------------------------- 1 | { 2 | "fixed": { 3 | "file_version": "{{.Info.ProductVersion}}" 4 | }, 5 | "info": { 6 | "0000": { 7 | "ProductVersion": "{{.Info.ProductVersion}}", 8 | "CompanyName": "{{.Info.CompanyName}}", 9 | "FileDescription": "{{.Info.ProductName}}", 10 | "LegalCopyright": "{{.Info.Copyright}}", 11 | "ProductName": "{{.Info.ProductName}}", 12 | "Comments": "{{.Info.Comments}}" 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /build/windows/wails.exe.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | true/pm 12 | permonitorv2,permonitor 13 | 14 | 15 | -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenoid/batch-image-generator/ab4efc7484f71163f3253a84f51ecb8c7404d033/demo.gif -------------------------------------------------------------------------------- /frontend/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "svelte.svelte-vscode" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /frontend/README.md: -------------------------------------------------------------------------------- 1 | # Svelte + Vite 2 | 3 | This template should help get you started developing with Svelte in Vite. 4 | 5 | ## Recommended IDE Setup 6 | 7 | [VS Code](https://code.visualstudio.com/) 8 | 9 | + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). 10 | 11 | ## Need an official Svelte framework? 12 | 13 | Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its 14 | serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, 15 | and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. 16 | 17 | ## Technical considerations 18 | 19 | **Why use this over SvelteKit?** 20 | 21 | - It brings its own routing solution which might not be preferable for some users. 22 | - It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. 23 | `vite dev` and `vite build` wouldn't work in a SvelteKit environment, for example. 24 | 25 | This template contains as little as possible to get started with Vite + Svelte, while taking into account the developer 26 | experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` 27 | templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. 28 | 29 | Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been 30 | structured similarly to SvelteKit so that it is easy to migrate. 31 | 32 | **Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** 33 | 34 | Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash 35 | references keeps the default TypeScript setting of accepting type information from the entire workspace, while also 36 | adding `svelte` and `vite/client` type information. 37 | 38 | **Why include `.vscode/extensions.json`?** 39 | 40 | Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to 41 | install the recommended extension upon opening the project. 42 | 43 | **Why enable `checkJs` in the JS template?** 44 | 45 | It is likely that most cases of changing variable types in runtime are likely to be accidental, rather than deliberate. 46 | This provides advanced typechecking out of the box. Should you like to take advantage of the dynamically-typed nature of 47 | JavaScript, it is trivial to change the configuration. 48 | 49 | **Why is HMR not preserving my local component state?** 50 | 51 | HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` 52 | and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the 53 | details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). 54 | 55 | If you have state that's important to retain within a component, consider creating an external store which would not be 56 | replaced by HMR. 57 | 58 | ```js 59 | // store.js 60 | // An extremely simple external store 61 | import { writable } from 'svelte/store' 62 | export default writable(0) 63 | ``` 64 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | batch-image-generator 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /frontend/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "moduleResolution": "Node", 4 | "target": "ESNext", 5 | "module": "ESNext", 6 | /** 7 | * svelte-preprocess cannot figure out whether you have 8 | * a value or a type, so tell TypeScript to enforce using 9 | * `import type` instead of `import` for Types. 10 | */ 11 | "importsNotUsedAsValues": "error", 12 | "isolatedModules": true, 13 | "resolveJsonModule": true, 14 | /** 15 | * To have warnings / errors of the Svelte compiler at the 16 | * correct position, enable source maps by default. 17 | */ 18 | "sourceMap": true, 19 | "esModuleInterop": true, 20 | "skipLibCheck": true, 21 | "forceConsistentCasingInFileNames": true, 22 | "baseUrl": ".", 23 | /** 24 | * Typecheck JS in `.svelte` and `.js` files by default. 25 | * Disable this if you'd like to use dynamic types. 26 | */ 27 | "checkJs": true 28 | }, 29 | /** 30 | * Use global.d.ts instead of compilerOptions.types 31 | * to avoid limiting type declarations. 32 | */ 33 | "include": [ 34 | "src/**/*.d.ts", 35 | "src/**/*.js", 36 | "src/**/*.svelte" 37 | ] 38 | } 39 | -------------------------------------------------------------------------------- /frontend/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "version": "0.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "frontend", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "@svelteuidev/composables": "^0.13.0", 12 | "@svelteuidev/core": "^0.13.0" 13 | }, 14 | "devDependencies": { 15 | "@sveltejs/vite-plugin-svelte": "^1.0.1", 16 | "carbon-components-svelte": "^0.75.1", 17 | "fluent-svelte": "^1.6.0", 18 | "svelte": "^3.49.0", 19 | "vite": "^3.2.8" 20 | } 21 | }, 22 | "node_modules/@esbuild/android-arm": { 23 | "version": "0.15.18", 24 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", 25 | "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", 26 | "cpu": [ 27 | "arm" 28 | ], 29 | "dev": true, 30 | "optional": true, 31 | "os": [ 32 | "android" 33 | ], 34 | "engines": { 35 | "node": ">=12" 36 | } 37 | }, 38 | "node_modules/@esbuild/linux-loong64": { 39 | "version": "0.15.18", 40 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", 41 | "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", 42 | "cpu": [ 43 | "loong64" 44 | ], 45 | "dev": true, 46 | "optional": true, 47 | "os": [ 48 | "linux" 49 | ], 50 | "engines": { 51 | "node": ">=12" 52 | } 53 | }, 54 | "node_modules/@floating-ui/core": { 55 | "version": "1.2.6", 56 | "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz", 57 | "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==" 58 | }, 59 | "node_modules/@floating-ui/dom": { 60 | "version": "1.2.8", 61 | "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.8.tgz", 62 | "integrity": "sha512-XLwhYV90MxiHDq6S0rzFZj00fnDM+A1R9jhSioZoMsa7G0Q0i+Q4x40ajR8FHSdYDE1bgjG45mIWe6jtv9UPmg==", 63 | "dependencies": { 64 | "@floating-ui/core": "^1.2.6" 65 | } 66 | }, 67 | "node_modules/@stitches/core": { 68 | "version": "1.2.8", 69 | "resolved": "https://registry.npmjs.org/@stitches/core/-/core-1.2.8.tgz", 70 | "integrity": "sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==" 71 | }, 72 | "node_modules/@sveltejs/vite-plugin-svelte": { 73 | "version": "1.4.0", 74 | "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.4.0.tgz", 75 | "integrity": "sha512-6QupI/jemMfK+yI2pMtJcu5iO2gtgTfcBdGwMZZt+lgbFELhszbDl6Qjh000HgAV8+XUA+8EY8DusOFk8WhOIg==", 76 | "dev": true, 77 | "dependencies": { 78 | "debug": "^4.3.4", 79 | "deepmerge": "^4.2.2", 80 | "kleur": "^4.1.5", 81 | "magic-string": "^0.26.7", 82 | "svelte-hmr": "^0.15.1", 83 | "vitefu": "^0.2.2" 84 | }, 85 | "engines": { 86 | "node": "^14.18.0 || >= 16" 87 | }, 88 | "peerDependencies": { 89 | "svelte": "^3.44.0", 90 | "vite": "^3.0.0" 91 | } 92 | }, 93 | "node_modules/@svelteuidev/composables": { 94 | "version": "0.13.0", 95 | "resolved": "https://registry.npmjs.org/@svelteuidev/composables/-/composables-0.13.0.tgz", 96 | "integrity": "sha512-vnDcmSMwav11Xp4f9PUJW5wlHbj1rQTIU9v62C0eOjfq4r/CLyj8FTRslKX5nrBUQxxlYlamsdM5rqCUm4aEbw==", 97 | "peerDependencies": { 98 | "svelte": ">=3.55.0" 99 | } 100 | }, 101 | "node_modules/@svelteuidev/core": { 102 | "version": "0.13.0", 103 | "resolved": "https://registry.npmjs.org/@svelteuidev/core/-/core-0.13.0.tgz", 104 | "integrity": "sha512-Jtl8J8leUkEHTpLQsJ5Rgeb0CqTAcn4ol656bqLjy/ZMLCpaRP867E5W31htLn7BxOVLpUe9QKpiuoTz7nHLcQ==", 105 | "dependencies": { 106 | "@floating-ui/dom": "1.2.8", 107 | "@stitches/core": "1.2.8" 108 | }, 109 | "peerDependencies": { 110 | "@svelteuidev/composables": "0.13.0", 111 | "svelte": ">=3.55.0" 112 | } 113 | }, 114 | "node_modules/carbon-components-svelte": { 115 | "version": "0.75.1", 116 | "resolved": "https://registry.npmjs.org/carbon-components-svelte/-/carbon-components-svelte-0.75.1.tgz", 117 | "integrity": "sha512-q1aCDbUW9U8NJMLj/FesL9E2ymqWONWlGDEKoawRtVK7XvsD5ynK1amu2l3cs5mFvagLnkVAcSmyzyTAaie5ug==", 118 | "dev": true, 119 | "dependencies": { 120 | "flatpickr": "4.6.9" 121 | } 122 | }, 123 | "node_modules/debug": { 124 | "version": "4.3.4", 125 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 126 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 127 | "dev": true, 128 | "dependencies": { 129 | "ms": "2.1.2" 130 | }, 131 | "engines": { 132 | "node": ">=6.0" 133 | }, 134 | "peerDependenciesMeta": { 135 | "supports-color": { 136 | "optional": true 137 | } 138 | } 139 | }, 140 | "node_modules/deepmerge": { 141 | "version": "4.3.1", 142 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", 143 | "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", 144 | "dev": true, 145 | "engines": { 146 | "node": ">=0.10.0" 147 | } 148 | }, 149 | "node_modules/esbuild": { 150 | "version": "0.15.18", 151 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", 152 | "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", 153 | "dev": true, 154 | "hasInstallScript": true, 155 | "bin": { 156 | "esbuild": "bin/esbuild" 157 | }, 158 | "engines": { 159 | "node": ">=12" 160 | }, 161 | "optionalDependencies": { 162 | "@esbuild/android-arm": "0.15.18", 163 | "@esbuild/linux-loong64": "0.15.18", 164 | "esbuild-android-64": "0.15.18", 165 | "esbuild-android-arm64": "0.15.18", 166 | "esbuild-darwin-64": "0.15.18", 167 | "esbuild-darwin-arm64": "0.15.18", 168 | "esbuild-freebsd-64": "0.15.18", 169 | "esbuild-freebsd-arm64": "0.15.18", 170 | "esbuild-linux-32": "0.15.18", 171 | "esbuild-linux-64": "0.15.18", 172 | "esbuild-linux-arm": "0.15.18", 173 | "esbuild-linux-arm64": "0.15.18", 174 | "esbuild-linux-mips64le": "0.15.18", 175 | "esbuild-linux-ppc64le": "0.15.18", 176 | "esbuild-linux-riscv64": "0.15.18", 177 | "esbuild-linux-s390x": "0.15.18", 178 | "esbuild-netbsd-64": "0.15.18", 179 | "esbuild-openbsd-64": "0.15.18", 180 | "esbuild-sunos-64": "0.15.18", 181 | "esbuild-windows-32": "0.15.18", 182 | "esbuild-windows-64": "0.15.18", 183 | "esbuild-windows-arm64": "0.15.18" 184 | } 185 | }, 186 | "node_modules/esbuild-android-64": { 187 | "version": "0.15.18", 188 | "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", 189 | "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", 190 | "cpu": [ 191 | "x64" 192 | ], 193 | "dev": true, 194 | "optional": true, 195 | "os": [ 196 | "android" 197 | ], 198 | "engines": { 199 | "node": ">=12" 200 | } 201 | }, 202 | "node_modules/esbuild-android-arm64": { 203 | "version": "0.15.18", 204 | "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", 205 | "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", 206 | "cpu": [ 207 | "arm64" 208 | ], 209 | "dev": true, 210 | "optional": true, 211 | "os": [ 212 | "android" 213 | ], 214 | "engines": { 215 | "node": ">=12" 216 | } 217 | }, 218 | "node_modules/esbuild-darwin-64": { 219 | "version": "0.15.18", 220 | "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", 221 | "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", 222 | "cpu": [ 223 | "x64" 224 | ], 225 | "dev": true, 226 | "optional": true, 227 | "os": [ 228 | "darwin" 229 | ], 230 | "engines": { 231 | "node": ">=12" 232 | } 233 | }, 234 | "node_modules/esbuild-darwin-arm64": { 235 | "version": "0.15.18", 236 | "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", 237 | "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", 238 | "cpu": [ 239 | "arm64" 240 | ], 241 | "dev": true, 242 | "optional": true, 243 | "os": [ 244 | "darwin" 245 | ], 246 | "engines": { 247 | "node": ">=12" 248 | } 249 | }, 250 | "node_modules/esbuild-freebsd-64": { 251 | "version": "0.15.18", 252 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", 253 | "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", 254 | "cpu": [ 255 | "x64" 256 | ], 257 | "dev": true, 258 | "optional": true, 259 | "os": [ 260 | "freebsd" 261 | ], 262 | "engines": { 263 | "node": ">=12" 264 | } 265 | }, 266 | "node_modules/esbuild-freebsd-arm64": { 267 | "version": "0.15.18", 268 | "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", 269 | "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", 270 | "cpu": [ 271 | "arm64" 272 | ], 273 | "dev": true, 274 | "optional": true, 275 | "os": [ 276 | "freebsd" 277 | ], 278 | "engines": { 279 | "node": ">=12" 280 | } 281 | }, 282 | "node_modules/esbuild-linux-32": { 283 | "version": "0.15.18", 284 | "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", 285 | "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", 286 | "cpu": [ 287 | "ia32" 288 | ], 289 | "dev": true, 290 | "optional": true, 291 | "os": [ 292 | "linux" 293 | ], 294 | "engines": { 295 | "node": ">=12" 296 | } 297 | }, 298 | "node_modules/esbuild-linux-64": { 299 | "version": "0.15.18", 300 | "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", 301 | "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", 302 | "cpu": [ 303 | "x64" 304 | ], 305 | "dev": true, 306 | "optional": true, 307 | "os": [ 308 | "linux" 309 | ], 310 | "engines": { 311 | "node": ">=12" 312 | } 313 | }, 314 | "node_modules/esbuild-linux-arm": { 315 | "version": "0.15.18", 316 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", 317 | "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", 318 | "cpu": [ 319 | "arm" 320 | ], 321 | "dev": true, 322 | "optional": true, 323 | "os": [ 324 | "linux" 325 | ], 326 | "engines": { 327 | "node": ">=12" 328 | } 329 | }, 330 | "node_modules/esbuild-linux-arm64": { 331 | "version": "0.15.18", 332 | "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", 333 | "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", 334 | "cpu": [ 335 | "arm64" 336 | ], 337 | "dev": true, 338 | "optional": true, 339 | "os": [ 340 | "linux" 341 | ], 342 | "engines": { 343 | "node": ">=12" 344 | } 345 | }, 346 | "node_modules/esbuild-linux-mips64le": { 347 | "version": "0.15.18", 348 | "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", 349 | "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", 350 | "cpu": [ 351 | "mips64el" 352 | ], 353 | "dev": true, 354 | "optional": true, 355 | "os": [ 356 | "linux" 357 | ], 358 | "engines": { 359 | "node": ">=12" 360 | } 361 | }, 362 | "node_modules/esbuild-linux-ppc64le": { 363 | "version": "0.15.18", 364 | "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", 365 | "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", 366 | "cpu": [ 367 | "ppc64" 368 | ], 369 | "dev": true, 370 | "optional": true, 371 | "os": [ 372 | "linux" 373 | ], 374 | "engines": { 375 | "node": ">=12" 376 | } 377 | }, 378 | "node_modules/esbuild-linux-riscv64": { 379 | "version": "0.15.18", 380 | "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", 381 | "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", 382 | "cpu": [ 383 | "riscv64" 384 | ], 385 | "dev": true, 386 | "optional": true, 387 | "os": [ 388 | "linux" 389 | ], 390 | "engines": { 391 | "node": ">=12" 392 | } 393 | }, 394 | "node_modules/esbuild-linux-s390x": { 395 | "version": "0.15.18", 396 | "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", 397 | "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", 398 | "cpu": [ 399 | "s390x" 400 | ], 401 | "dev": true, 402 | "optional": true, 403 | "os": [ 404 | "linux" 405 | ], 406 | "engines": { 407 | "node": ">=12" 408 | } 409 | }, 410 | "node_modules/esbuild-netbsd-64": { 411 | "version": "0.15.18", 412 | "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", 413 | "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", 414 | "cpu": [ 415 | "x64" 416 | ], 417 | "dev": true, 418 | "optional": true, 419 | "os": [ 420 | "netbsd" 421 | ], 422 | "engines": { 423 | "node": ">=12" 424 | } 425 | }, 426 | "node_modules/esbuild-openbsd-64": { 427 | "version": "0.15.18", 428 | "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", 429 | "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", 430 | "cpu": [ 431 | "x64" 432 | ], 433 | "dev": true, 434 | "optional": true, 435 | "os": [ 436 | "openbsd" 437 | ], 438 | "engines": { 439 | "node": ">=12" 440 | } 441 | }, 442 | "node_modules/esbuild-sunos-64": { 443 | "version": "0.15.18", 444 | "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", 445 | "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", 446 | "cpu": [ 447 | "x64" 448 | ], 449 | "dev": true, 450 | "optional": true, 451 | "os": [ 452 | "sunos" 453 | ], 454 | "engines": { 455 | "node": ">=12" 456 | } 457 | }, 458 | "node_modules/esbuild-windows-32": { 459 | "version": "0.15.18", 460 | "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", 461 | "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", 462 | "cpu": [ 463 | "ia32" 464 | ], 465 | "dev": true, 466 | "optional": true, 467 | "os": [ 468 | "win32" 469 | ], 470 | "engines": { 471 | "node": ">=12" 472 | } 473 | }, 474 | "node_modules/esbuild-windows-64": { 475 | "version": "0.15.18", 476 | "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", 477 | "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", 478 | "cpu": [ 479 | "x64" 480 | ], 481 | "dev": true, 482 | "optional": true, 483 | "os": [ 484 | "win32" 485 | ], 486 | "engines": { 487 | "node": ">=12" 488 | } 489 | }, 490 | "node_modules/esbuild-windows-arm64": { 491 | "version": "0.15.18", 492 | "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", 493 | "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", 494 | "cpu": [ 495 | "arm64" 496 | ], 497 | "dev": true, 498 | "optional": true, 499 | "os": [ 500 | "win32" 501 | ], 502 | "engines": { 503 | "node": ">=12" 504 | } 505 | }, 506 | "node_modules/flatpickr": { 507 | "version": "4.6.9", 508 | "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz", 509 | "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==", 510 | "dev": true 511 | }, 512 | "node_modules/fluent-svelte": { 513 | "version": "1.6.0", 514 | "resolved": "https://registry.npmjs.org/fluent-svelte/-/fluent-svelte-1.6.0.tgz", 515 | "integrity": "sha512-z+QUvfAzh3t0bpiURO6f2eciZPnPPwl1pZe+sAYM8A8vUDSAHH8D0U4+VT+OHA16PEAd2DYVdPyJqM27ly5lxQ==", 516 | "dev": true, 517 | "dependencies": { 518 | "focus-trap": "^6.7.3", 519 | "tabbable": "^5.2.1" 520 | } 521 | }, 522 | "node_modules/focus-trap": { 523 | "version": "6.9.4", 524 | "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-6.9.4.tgz", 525 | "integrity": "sha512-v2NTsZe2FF59Y+sDykKY+XjqZ0cPfhq/hikWVL88BqLivnNiEffAsac6rP6H45ff9wG9LL5ToiDqrLEP9GX9mw==", 526 | "dev": true, 527 | "dependencies": { 528 | "tabbable": "^5.3.3" 529 | } 530 | }, 531 | "node_modules/fsevents": { 532 | "version": "2.3.2", 533 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 534 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 535 | "dev": true, 536 | "hasInstallScript": true, 537 | "optional": true, 538 | "os": [ 539 | "darwin" 540 | ], 541 | "engines": { 542 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 543 | } 544 | }, 545 | "node_modules/function-bind": { 546 | "version": "1.1.1", 547 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 548 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 549 | "dev": true 550 | }, 551 | "node_modules/has": { 552 | "version": "1.0.3", 553 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 554 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 555 | "dev": true, 556 | "dependencies": { 557 | "function-bind": "^1.1.1" 558 | }, 559 | "engines": { 560 | "node": ">= 0.4.0" 561 | } 562 | }, 563 | "node_modules/is-core-module": { 564 | "version": "2.12.1", 565 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", 566 | "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", 567 | "dev": true, 568 | "dependencies": { 569 | "has": "^1.0.3" 570 | }, 571 | "funding": { 572 | "url": "https://github.com/sponsors/ljharb" 573 | } 574 | }, 575 | "node_modules/kleur": { 576 | "version": "4.1.5", 577 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", 578 | "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", 579 | "dev": true, 580 | "engines": { 581 | "node": ">=6" 582 | } 583 | }, 584 | "node_modules/magic-string": { 585 | "version": "0.26.7", 586 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", 587 | "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", 588 | "dev": true, 589 | "dependencies": { 590 | "sourcemap-codec": "^1.4.8" 591 | }, 592 | "engines": { 593 | "node": ">=12" 594 | } 595 | }, 596 | "node_modules/ms": { 597 | "version": "2.1.2", 598 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 599 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 600 | "dev": true 601 | }, 602 | "node_modules/nanoid": { 603 | "version": "3.3.6", 604 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 605 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 606 | "dev": true, 607 | "funding": [ 608 | { 609 | "type": "github", 610 | "url": "https://github.com/sponsors/ai" 611 | } 612 | ], 613 | "bin": { 614 | "nanoid": "bin/nanoid.cjs" 615 | }, 616 | "engines": { 617 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 618 | } 619 | }, 620 | "node_modules/path-parse": { 621 | "version": "1.0.7", 622 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 623 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 624 | "dev": true 625 | }, 626 | "node_modules/picocolors": { 627 | "version": "1.0.0", 628 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 629 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 630 | "dev": true 631 | }, 632 | "node_modules/postcss": { 633 | "version": "8.4.24", 634 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", 635 | "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", 636 | "dev": true, 637 | "funding": [ 638 | { 639 | "type": "opencollective", 640 | "url": "https://opencollective.com/postcss/" 641 | }, 642 | { 643 | "type": "tidelift", 644 | "url": "https://tidelift.com/funding/github/npm/postcss" 645 | }, 646 | { 647 | "type": "github", 648 | "url": "https://github.com/sponsors/ai" 649 | } 650 | ], 651 | "dependencies": { 652 | "nanoid": "^3.3.6", 653 | "picocolors": "^1.0.0", 654 | "source-map-js": "^1.0.2" 655 | }, 656 | "engines": { 657 | "node": "^10 || ^12 || >=14" 658 | } 659 | }, 660 | "node_modules/resolve": { 661 | "version": "1.22.2", 662 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", 663 | "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", 664 | "dev": true, 665 | "dependencies": { 666 | "is-core-module": "^2.11.0", 667 | "path-parse": "^1.0.7", 668 | "supports-preserve-symlinks-flag": "^1.0.0" 669 | }, 670 | "bin": { 671 | "resolve": "bin/resolve" 672 | }, 673 | "funding": { 674 | "url": "https://github.com/sponsors/ljharb" 675 | } 676 | }, 677 | "node_modules/rollup": { 678 | "version": "2.79.1", 679 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", 680 | "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", 681 | "dev": true, 682 | "bin": { 683 | "rollup": "dist/bin/rollup" 684 | }, 685 | "engines": { 686 | "node": ">=10.0.0" 687 | }, 688 | "optionalDependencies": { 689 | "fsevents": "~2.3.2" 690 | } 691 | }, 692 | "node_modules/source-map-js": { 693 | "version": "1.0.2", 694 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 695 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 696 | "dev": true, 697 | "engines": { 698 | "node": ">=0.10.0" 699 | } 700 | }, 701 | "node_modules/sourcemap-codec": { 702 | "version": "1.4.8", 703 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 704 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 705 | "deprecated": "Please use @jridgewell/sourcemap-codec instead", 706 | "dev": true 707 | }, 708 | "node_modules/supports-preserve-symlinks-flag": { 709 | "version": "1.0.0", 710 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 711 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 712 | "dev": true, 713 | "engines": { 714 | "node": ">= 0.4" 715 | }, 716 | "funding": { 717 | "url": "https://github.com/sponsors/ljharb" 718 | } 719 | }, 720 | "node_modules/svelte": { 721 | "version": "3.59.1", 722 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.59.1.tgz", 723 | "integrity": "sha512-pKj8fEBmqf6mq3/NfrB9SLtcJcUvjYSWyePlfCqN9gujLB25RitWK8PvFzlwim6hD/We35KbPlRteuA6rnPGcQ==", 724 | "engines": { 725 | "node": ">= 8" 726 | } 727 | }, 728 | "node_modules/svelte-hmr": { 729 | "version": "0.15.2", 730 | "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.2.tgz", 731 | "integrity": "sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==", 732 | "dev": true, 733 | "engines": { 734 | "node": "^12.20 || ^14.13.1 || >= 16" 735 | }, 736 | "peerDependencies": { 737 | "svelte": "^3.19.0 || ^4.0.0-next.0" 738 | } 739 | }, 740 | "node_modules/tabbable": { 741 | "version": "5.3.3", 742 | "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", 743 | "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==", 744 | "dev": true 745 | }, 746 | "node_modules/vite": { 747 | "version": "3.2.8", 748 | "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.8.tgz", 749 | "integrity": "sha512-EtQU16PLIJpAZol2cTLttNP1mX6L0SyI0pgQB1VOoWeQnMSvtiwovV3D6NcjN8CZQWWyESD2v5NGnpz5RvgOZA==", 750 | "dev": true, 751 | "dependencies": { 752 | "esbuild": "^0.15.9", 753 | "postcss": "^8.4.18", 754 | "resolve": "^1.22.1", 755 | "rollup": "^2.79.1" 756 | }, 757 | "bin": { 758 | "vite": "bin/vite.js" 759 | }, 760 | "engines": { 761 | "node": "^14.18.0 || >=16.0.0" 762 | }, 763 | "optionalDependencies": { 764 | "fsevents": "~2.3.2" 765 | }, 766 | "peerDependencies": { 767 | "@types/node": ">= 14", 768 | "less": "*", 769 | "sass": "*", 770 | "stylus": "*", 771 | "sugarss": "*", 772 | "terser": "^5.4.0" 773 | }, 774 | "peerDependenciesMeta": { 775 | "@types/node": { 776 | "optional": true 777 | }, 778 | "less": { 779 | "optional": true 780 | }, 781 | "sass": { 782 | "optional": true 783 | }, 784 | "stylus": { 785 | "optional": true 786 | }, 787 | "sugarss": { 788 | "optional": true 789 | }, 790 | "terser": { 791 | "optional": true 792 | } 793 | } 794 | }, 795 | "node_modules/vitefu": { 796 | "version": "0.2.4", 797 | "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", 798 | "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", 799 | "dev": true, 800 | "peerDependencies": { 801 | "vite": "^3.0.0 || ^4.0.0" 802 | }, 803 | "peerDependenciesMeta": { 804 | "vite": { 805 | "optional": true 806 | } 807 | } 808 | } 809 | } 810 | } 811 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "devDependencies": { 12 | "@sveltejs/vite-plugin-svelte": "^1.0.1", 13 | "carbon-components-svelte": "^0.75.1", 14 | "fluent-svelte": "^1.6.0", 15 | "svelte": "^3.49.0", 16 | "vite": "^3.2.8" 17 | }, 18 | "dependencies": { 19 | "@svelteuidev/composables": "^0.13.0", 20 | "@svelteuidev/core": "^0.13.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /frontend/package.json.md5: -------------------------------------------------------------------------------- 1 | c7c8f2f6ef6137e9002a990202d91861 -------------------------------------------------------------------------------- /frontend/src/App.svelte: -------------------------------------------------------------------------------- 1 | 2 | 268 | 269 |
270 |
271 |
272 |
273 |
274 | 275 | 276 |
277 | 278 | document.getElementById('image-template').click()}> 279 | document.getElementById('image-template').click()}> 280 | 281 | 282 | 283 |
284 | 285 | document.getElementById('image-data').click()}> 286 | 287 | 288 | 289 | 290 |
291 | 292 | 293 |
294 | 298 |

299 | 302 |

303 |
304 | Rubi Jihantoro
305 | 306 |
307 |
308 |
309 | 310 | 311 |

312 | {#if rectangles.length > 0 && selectedRect >= 0} 313 | 314 |
320 |
321 |
322 | 323 | document.getElementById('font-data').click()}> 324 | document.getElementById('font-data').click()}> 325 | 326 | 327 | 328 |
329 | 334 |

335 |
336 |
337 | 341 |
342 |
343 | 347 |
348 |
349 |



350 |
351 |
352 | 360 |
361 |
362 | 372 |
373 |
374 | 375 | 376 | {/if} 377 |
378 |
379 |
380 |
381 |


382 |
383 | 390 | 391 |
392 |
393 |
394 | -------------------------------------------------------------------------------- /frontend/src/assets/fonts/OFL.txt: -------------------------------------------------------------------------------- 1 | Copyright 2016 The Nunito Project Authors (contact@sansoxygen.com), 2 | 3 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 4 | This license is copied below, and is also available with a FAQ at: 5 | http://scripts.sil.org/OFL 6 | 7 | 8 | ----------------------------------------------------------- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | ----------------------------------------------------------- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide 14 | development of collaborative font projects, to support the font creation 15 | efforts of academic and linguistic communities, and to provide a free and 16 | open framework in which fonts may be shared and improved in partnership 17 | with others. 18 | 19 | The OFL allows the licensed fonts to be used, studied, modified and 20 | redistributed freely as long as they are not sold by themselves. The 21 | fonts, including any derivative works, can be bundled, embedded, 22 | redistributed and/or sold with any software provided that any reserved 23 | names are not used by derivative works. The fonts and derivatives, 24 | however, cannot be released under any other type of license. The 25 | requirement for fonts to remain under this license does not apply 26 | to any document created using the fonts or their derivatives. 27 | 28 | DEFINITIONS 29 | "Font Software" refers to the set of files released by the Copyright 30 | Holder(s) under this license and clearly marked as such. This may 31 | include source files, build scripts and documentation. 32 | 33 | "Reserved Font Name" refers to any names specified as such after the 34 | copyright statement(s). 35 | 36 | "Original Version" refers to the collection of Font Software components as 37 | distributed by the Copyright Holder(s). 38 | 39 | "Modified Version" refers to any derivative made by adding to, deleting, 40 | or substituting -- in part or in whole -- any of the components of the 41 | Original Version, by changing formats or by porting the Font Software to a 42 | new environment. 43 | 44 | "Author" refers to any designer, engineer, programmer, technical 45 | writer or other person who contributed to the Font Software. 46 | 47 | PERMISSION & CONDITIONS 48 | Permission is hereby granted, free of charge, to any person obtaining 49 | a copy of the Font Software, to use, study, copy, merge, embed, modify, 50 | redistribute, and sell modified and unmodified copies of the Font 51 | Software, subject to the following conditions: 52 | 53 | 1) Neither the Font Software nor any of its individual components, 54 | in Original or Modified Versions, may be sold by itself. 55 | 56 | 2) Original or Modified Versions of the Font Software may be bundled, 57 | redistributed and/or sold with any software, provided that each copy 58 | contains the above copyright notice and this license. These can be 59 | included either as stand-alone text files, human-readable headers or 60 | in the appropriate machine-readable metadata fields within text or 61 | binary files as long as those fields can be easily viewed by the user. 62 | 63 | 3) No Modified Version of the Font Software may use the Reserved Font 64 | Name(s) unless explicit written permission is granted by the corresponding 65 | Copyright Holder. This restriction only applies to the primary font name as 66 | presented to the users. 67 | 68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font 69 | Software shall not be used to promote, endorse or advertise any 70 | Modified Version, except to acknowledge the contribution(s) of the 71 | Copyright Holder(s) and the Author(s) or with their explicit written 72 | permission. 73 | 74 | 5) The Font Software, modified or unmodified, in part or in whole, 75 | must be distributed entirely under this license, and must not be 76 | distributed under any other license. The requirement for fonts to 77 | remain under this license does not apply to any document created 78 | using the Font Software. 79 | 80 | TERMINATION 81 | This license becomes null and void if any of the above conditions are 82 | not met. 83 | 84 | DISCLAIMER 85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF 87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT 88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE 89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL 91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM 93 | OTHER DEALINGS IN THE FONT SOFTWARE. 94 | -------------------------------------------------------------------------------- /frontend/src/assets/fonts/nunito-v16-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenoid/batch-image-generator/ab4efc7484f71163f3253a84f51ecb8c7404d033/frontend/src/assets/fonts/nunito-v16-latin-regular.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/images/logo-universal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codenoid/batch-image-generator/ab4efc7484f71163f3253a84f51ecb8c7404d033/frontend/src/assets/images/logo-universal.png -------------------------------------------------------------------------------- /frontend/src/main.js: -------------------------------------------------------------------------------- 1 | import './style.css' 2 | import App from './App.svelte' 3 | 4 | const app = new App({ 5 | target: document.getElementById('app') 6 | }) 7 | 8 | export default app 9 | -------------------------------------------------------------------------------- /frontend/src/style.css: -------------------------------------------------------------------------------- 1 | html { 2 | background-color: #393939; 3 | text-align: center; 4 | color: white; 5 | } 6 | 7 | body { 8 | -ms-overflow-style: none; /* IE and Edge / 9 | scrollbar-width: none; / Firefox */ 10 | padding: 6px !important; 11 | margin: 0; 12 | color: white; 13 | font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", 14 | "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", 15 | sans-serif; 16 | } 17 | 18 | html::-webkit-scrollbar { 19 | display: none; 20 | } 21 | 22 | select { 23 | appearance: none; 24 | -webkit-appearance: none; 25 | -moz-appearance: none; 26 | padding: 8px 16px; 27 | border: 1px solid #ccc; 28 | border-radius: 4px; 29 | background-color: transparent; /* Set the background to transparent */ 30 | color: white; 31 | font-family: 'Segoe UI', Arial, sans-serif; 32 | font-size: 14px; 33 | outline: none; 34 | border-radius: 5px !important; 35 | border-bottom: 1px solid white !important; 36 | } 37 | 38 | select::-ms-expand { 39 | display: none; 40 | } 41 | 42 | select:hover { 43 | border-color: #666; 44 | } 45 | 46 | select:focus { 47 | border-color: #0078d7; 48 | box-shadow: 0 0 0 2px rgba(0, 120, 215, 0.3); 49 | } 50 | 51 | select option { 52 | background-color: white; 53 | color: #333; 54 | font-family: 'Segoe UI', Arial, sans-serif; 55 | font-size: 14px; 56 | } 57 | 58 | select option:hover { 59 | background-color: #f2f2f2; 60 | } 61 | 62 | @font-face { 63 | font-family: "Nunito"; 64 | font-style: normal; 65 | font-weight: 400; 66 | src: local(""), 67 | url("assets/fonts/nunito-v16-latin-regular.woff2") format("woff2"); 68 | } 69 | 70 | #app { 71 | height: 100vh; 72 | text-align: center; 73 | } 74 | 75 | .container { 76 | position: relative; 77 | width: 100%; 78 | max-width: 960px; 79 | margin: 0 auto; 80 | padding: 0 20px; 81 | box-sizing: border-box; } 82 | .column, 83 | .columns { 84 | width: 100%; 85 | float: left; 86 | box-sizing: border-box; } 87 | 88 | /* For devices larger than 400px */ 89 | @media (min-width: 400px) { 90 | .container { 91 | width: 85%; 92 | padding: 0; } 93 | } 94 | 95 | /* For devices larger than 550px */ 96 | @media (min-width: 550px) { 97 | .container { 98 | width: 80%; } 99 | .column, 100 | .columns { 101 | margin-left: 4%; } 102 | .column:first-child, 103 | .columns:first-child { 104 | margin-left: 0; } 105 | 106 | .one.column, 107 | .one.columns { width: 4.66666666667%; } 108 | .two.columns { width: 13.3333333333%; } 109 | .three.columns { width: 22%; } 110 | .four.columns { width: 30.6666666667%; } 111 | .five.columns { width: 39.3333333333%; } 112 | .six.columns { width: 48%; } 113 | .seven.columns { width: 56.6666666667%; } 114 | .eight.columns { width: 65.3333333333%; } 115 | .nine.columns { width: 74.0%; } 116 | .ten.columns { width: 82.6666666667%; } 117 | .eleven.columns { width: 91.3333333333%; } 118 | .twelve.columns { width: 100%; margin-left: 0; } 119 | 120 | .one-third.column { width: 30.6666666667%; } 121 | .two-thirds.column { width: 65.3333333333%; } 122 | 123 | .one-half.column { width: 48%; } 124 | 125 | /* Offsets */ 126 | .offset-by-one.column, 127 | .offset-by-one.columns { margin-left: 8.66666666667%; } 128 | .offset-by-two.column, 129 | .offset-by-two.columns { margin-left: 17.3333333333%; } 130 | .offset-by-three.column, 131 | .offset-by-three.columns { margin-left: 26%; } 132 | .offset-by-four.column, 133 | .offset-by-four.columns { margin-left: 34.6666666667%; } 134 | .offset-by-five.column, 135 | .offset-by-five.columns { margin-left: 43.3333333333%; } 136 | .offset-by-six.column, 137 | .offset-by-six.columns { margin-left: 52%; } 138 | .offset-by-seven.column, 139 | .offset-by-seven.columns { margin-left: 60.6666666667%; } 140 | .offset-by-eight.column, 141 | .offset-by-eight.columns { margin-left: 69.3333333333%; } 142 | .offset-by-nine.column, 143 | .offset-by-nine.columns { margin-left: 78.0%; } 144 | .offset-by-ten.column, 145 | .offset-by-ten.columns { margin-left: 86.6666666667%; } 146 | .offset-by-eleven.column, 147 | .offset-by-eleven.columns { margin-left: 95.3333333333%; } 148 | 149 | .offset-by-one-third.column, 150 | .offset-by-one-third.columns { margin-left: 34.6666666667%; } 151 | .offset-by-two-thirds.column, 152 | .offset-by-two-thirds.columns { margin-left: 69.3333333333%; } 153 | 154 | .offset-by-one-half.column, 155 | .offset-by-one-half.columns { margin-left: 52%; } 156 | 157 | } -------------------------------------------------------------------------------- /frontend/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /frontend/vite.config.js: -------------------------------------------------------------------------------- 1 | import {defineConfig} from 'vite' 2 | import {svelte} from '@sveltejs/vite-plugin-svelte' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [svelte()] 7 | }) 8 | -------------------------------------------------------------------------------- /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 | 4 | export function Greet(arg1:string):Promise; 5 | 6 | export function OpenBrowser(arg1:string):Promise; 7 | 8 | export function Proceed(arg1:string,arg2:string,arg3:string):Promise; 9 | -------------------------------------------------------------------------------- /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 Greet(arg1) { 6 | return window['go']['main']['App']['Greet'](arg1); 7 | } 8 | 9 | export function OpenBrowser(arg1) { 10 | return window['go']['main']['App']['OpenBrowser'](arg1); 11 | } 12 | 13 | export function Proceed(arg1, arg2, arg3) { 14 | return window['go']['main']['App']['Proceed'](arg1, arg2, arg3); 15 | } 16 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module changeme 2 | 3 | go 1.18 4 | 5 | require ( 6 | github.com/disintegration/imaging v1.6.2 7 | github.com/fogleman/gg v1.3.0 8 | github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 9 | github.com/holys/initials-avatar v0.0.0-20180809162153-a82edcad3408 10 | github.com/mitchellh/go-homedir v1.1.0 11 | github.com/o1egl/govatar v0.4.1 12 | github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e 13 | github.com/wailsapp/wails/v2 v2.5.1 14 | ) 15 | 16 | require ( 17 | github.com/bep/debounce v1.2.1 // indirect 18 | github.com/dchest/lru v0.0.0-20151022103600-d8fd1e40a385 // indirect 19 | github.com/go-ole/go-ole v1.2.6 // indirect 20 | github.com/google/uuid v1.1.2 // indirect 21 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect 22 | github.com/labstack/echo/v4 v4.9.0 // indirect 23 | github.com/labstack/gommon v0.3.1 // indirect 24 | github.com/leaanthony/go-ansi-parser v1.0.1 // indirect 25 | github.com/leaanthony/gosod v1.0.3 // indirect 26 | github.com/leaanthony/slicer v1.5.0 // indirect 27 | github.com/mattn/go-colorable v0.1.11 // indirect 28 | github.com/mattn/go-isatty v0.0.14 // indirect 29 | github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 // indirect 30 | github.com/pkg/errors v0.9.1 // indirect 31 | github.com/samber/lo v1.27.1 // indirect 32 | github.com/tkrajina/go-reflector v0.5.5 // indirect 33 | github.com/valyala/bytebufferpool v1.0.0 // indirect 34 | github.com/valyala/fasttemplate v1.2.1 // indirect 35 | github.com/wailsapp/mimetype v1.4.1 // indirect 36 | golang.org/x/crypto v0.14.0 // indirect 37 | golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 // indirect 38 | golang.org/x/image v0.5.0 // indirect 39 | golang.org/x/net v0.17.0 // indirect 40 | golang.org/x/sys v0.13.0 // indirect 41 | golang.org/x/text v0.13.0 // indirect 42 | stathat.com/c/consistent v1.0.0 // indirect 43 | ) 44 | 45 | // replace github.com/wailsapp/wails/v2 v2.5.1 => C:\Users\jihan\go\pkg\mod 46 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 2 | github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= 3 | github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= 4 | github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 5 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 6 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 7 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 8 | github.com/dchest/lru v0.0.0-20151022103600-d8fd1e40a385 h1:bsWC+WL0VqFG85ucdZyayCI4lxtPi6/Qjzeafmd7MJ8= 9 | github.com/dchest/lru v0.0.0-20151022103600-d8fd1e40a385/go.mod h1:6+CE/izTvubxinWvlD1279UemqaW55aa6fbKhMOL0cE= 10 | github.com/disintegration/imaging v1.6.2 h1:w1LecBlG2Lnp8B3jk5zSuNqd7b4DXhcjwek1ei82L+c= 11 | github.com/disintegration/imaging v1.6.2/go.mod h1:44/5580QXChDfwIclfc/PCwrr44amcmDAg8hxG0Ewe4= 12 | github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= 13 | github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= 14 | github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= 15 | github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= 16 | github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= 17 | github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= 18 | github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= 19 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 20 | github.com/holys/initials-avatar v0.0.0-20180809162153-a82edcad3408 h1:OqLxZaCEit6/5mADgORYceh/0rmgrYx7sKJXsexKcvo= 21 | github.com/holys/initials-avatar v0.0.0-20180809162153-a82edcad3408/go.mod h1:/x3iN/T2oO1yFXzDs6BF/Y3THT1R753nBr5vPv/HrWA= 22 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= 23 | github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= 24 | github.com/labstack/echo/v4 v4.9.0 h1:wPOF1CE6gvt/kmbMR4dGzWvHMPT+sAEUJOwOTtvITVY= 25 | github.com/labstack/echo/v4 v4.9.0/go.mod h1:xkCDAdFCIf8jsFQ5NnbK7oqaF/yU1A1X20Ltm0OvSks= 26 | github.com/labstack/gommon v0.3.1 h1:OomWaJXm7xR6L1HmEtGyQf26TEn7V6X88mktX9kee9o= 27 | github.com/labstack/gommon v0.3.1/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= 28 | github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc= 29 | github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= 30 | github.com/leaanthony/go-ansi-parser v1.0.1 h1:97v6c5kYppVsbScf4r/VZdXyQ21KQIfeQOk2DgKxGG4= 31 | github.com/leaanthony/go-ansi-parser v1.0.1/go.mod h1:7arTzgVI47srICYhvgUV4CGd063sGEeoSlych5yeSPM= 32 | github.com/leaanthony/gosod v1.0.3 h1:Fnt+/B6NjQOVuCWOKYRREZnjGyvg+mEhd1nkkA04aTQ= 33 | github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4= 34 | github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY= 35 | github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= 36 | github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= 37 | github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= 38 | github.com/mattn/go-colorable v0.1.11 h1:nQ+aFkoE2TMGc0b68U2OKSexC+eq46+XwZzWXHRmPYs= 39 | github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= 40 | github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= 41 | github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= 42 | github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= 43 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 44 | github.com/o1egl/govatar v0.4.1 h1:RRzAxm52WpZMSEoWgAXrTcXWKhIUPpgpI54KP+UI0Ew= 45 | github.com/o1egl/govatar v0.4.1/go.mod h1:cSBJjpgYiKmQ8E+C4zNBcsbuDwy9UH4HS8BwE4m6JmQ= 46 | github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2 h1:acNfDZXmm28D2Yg/c3ALnZStzNaZMSagpbr96vY6Zjc= 47 | github.com/pkg/browser v0.0.0-20210706143420-7d21f8c997e2/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= 48 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 49 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 50 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 51 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 52 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 53 | github.com/samber/lo v1.27.1 h1:sTXwkRiIFIQG+G0HeAvOEnGjqWeWtI9cg5/n51KrxPg= 54 | github.com/samber/lo v1.27.1/go.mod h1:it33p9UtPMS7z72fP4gw/EIfQB2eI8ke7GR2wc6+Rhg= 55 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 56 | github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= 57 | github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= 58 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 59 | github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 60 | github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= 61 | github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M= 62 | github.com/tkrajina/go-reflector v0.5.5 h1:gwoQFNye30Kk7NrExj8zm3zFtrGPqOkzFMLuQZg1DtQ= 63 | github.com/tkrajina/go-reflector v0.5.5/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= 64 | github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= 65 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 66 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 67 | github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= 68 | github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= 69 | github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= 70 | github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= 71 | github.com/wailsapp/wails/v2 v2.5.1 h1:mfG+2kWqQXYOwdgI43HEILjOZDXbk5woPYI3jP2b+js= 72 | github.com/wailsapp/wails/v2 v2.5.1/go.mod h1:jbOZbcr/zm79PxXxAjP8UoVlDd9wLW3uDs+isIthDfs= 73 | github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 74 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 75 | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 76 | golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= 77 | golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= 78 | golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17 h1:3MTrJm4PyNL9NBqvYDSj3DHl46qQakyfqfWo4jgfaEM= 79 | golang.org/x/exp v0.0.0-20220303212507-bbda1eaf7a17/go.mod h1:lgLbSvA5ygNOMpwM/9anMpWVlVJ7Z+cHWq/eFuinpGE= 80 | golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 81 | golang.org/x/image v0.5.0 h1:5JMiNunQeQw++mMOz48/ISeNu3Iweh/JaZU8ZLqHRrI= 82 | golang.org/x/image v0.5.0/go.mod h1:FVC7BI/5Ym8R25iw5OLsgshdUBbT1h5jZTpA+mvAdZ4= 83 | golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 84 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 85 | golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 86 | golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 87 | golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 88 | golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= 89 | golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= 90 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 91 | golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 92 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 93 | golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 94 | golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 95 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 96 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 97 | golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 98 | golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 99 | golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 100 | golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 101 | golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 102 | golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 103 | golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 104 | golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= 105 | golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 106 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 107 | golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 108 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 109 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 110 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 111 | golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 112 | golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 113 | golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= 114 | golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 115 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 116 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 117 | golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 118 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 119 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 120 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 121 | gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 122 | gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 123 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 124 | stathat.com/c/consistent v1.0.0 h1:ezyc51EGcRPJUxfHGSgJjWzJdj3NiMU9pNfLNGiXV0c= 125 | stathat.com/c/consistent v1.0.0/go.mod h1:QkzMWzcbB+yQBL2AttO6sgsQS/JSTapcDISJalmCDS0= 126 | -------------------------------------------------------------------------------- /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 | "github.com/wailsapp/wails/v2/pkg/options/assetserver" 9 | ) 10 | 11 | //go:embed all:frontend/dist 12 | var assets embed.FS 13 | 14 | func main() { 15 | // Create an instance of the app structure 16 | app := NewApp() 17 | 18 | // Create application with options 19 | err := wails.Run(&options.App{ 20 | Title: "Batch Image Generator", 21 | Width: 1000, 22 | Height: 480, 23 | AssetServer: &assetserver.Options{ 24 | Assets: assets, 25 | }, 26 | OnStartup: app.startup, 27 | Bind: []interface{}{ 28 | app, 29 | }, 30 | }) 31 | 32 | if err != nil { 33 | println("Error:", err.Error()) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /wails.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://wails.io/schemas/config.v2.json", 3 | "name": "batch-image-generator", 4 | "outputfilename": "batch-image-generator", 5 | "frontend:install": "npm install", 6 | "frontend:build": "npm run build", 7 | "frontend:dev:watcher": "npm run dev", 8 | "frontend:dev:serverUrl": "auto", 9 | "author": { 10 | "name": "codenoid", 11 | "email": "14269809+codenoid@users.noreply.github.com" 12 | } 13 | } 14 | --------------------------------------------------------------------------------