├── .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 | 
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 |
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 |
--------------------------------------------------------------------------------