From 784e39467b7e4d1b55527ddd3bd7e4bc295de49d Mon Sep 17 00:00:00 2001 From: CRBroughton Date: Tue, 14 Nov 2023 18:22:36 +0000 Subject: [PATCH 01/21] build: :construction_worker: compiled binaries are now zipped and compressed --- taskfile.yml | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/taskfile.yml b/taskfile.yml index c67fff3..43f7c40 100644 --- a/taskfile.yml +++ b/taskfile.yml @@ -1,16 +1,22 @@ version: '3' vars: - version: 1.2.0 + version: 2.0.0 tasks: build: - deps: [linux32, linux64, windows64, apple, applesilicon] + deps: [clean, linux32, linux64, windows64, apple, applesilicon, cleanoutput] + + clean: + cmds: + - rm -rf build + - rm -rf dist + - rm -rf db/dist front: + deps: [clean] cmds: - npm run build - - rm -rf db/dist - cp -R dist db/ run: once @@ -18,23 +24,39 @@ tasks: deps: [front] cmds: - cd db && GOOS=linux GOARCH=386 go build -o ../build/forager-"{{.version}}"-linux32 + - cd build && zip forager-"{{.version}}"-linux32.zip forager-"{{.version}}"-linux32 linux64: deps: [front] cmds: - cd db && GOOS=linux GOARCH=amd64 go build -o ../build/forager-"{{.version}}"-linux + - cd build && zip forager-"{{.version}}"-linux.zip forager-"{{.version}}"-linux + windows64: deps: [front] cmds: - cd db && GOOS=windows GOARCH=amd64 go build -o ../build/forager-"{{.version}}".exe - + - cd build && zip forager-"{{.version}}"-windows.zip forager-"{{.version}}".exe + apple: deps: [front] cmds: - cd db && GOOS=darwin GOARCH=amd64 go build -o ../build/forager-"{{.version}}"-apple.app + - cd build && zip forager-"{{.version}}"-apple.zip forager-"{{.version}}"-apple.app applesilicon: deps: [front] cmds: - cd db && GOOS=darwin GOARCH=arm64 go build -o ../build/forager-"{{.version}}"-appliesilicon.app + - cd build && zip forager-"{{.version}}"-appliesilicon.zip forager-"{{.version}}"-appliesilicon.app + + cleanoutput: + deps: [apple, applesilicon] + cmds: + - cd build && rm -rf forager-"{{.version}}"-linux32 + - cd build && rm -rf forager-"{{.version}}"-linux + - cd build && rm -rf forager-"{{.version}}".exe + - cd build && rm -rf forager-"{{.version}}"-appliesilicon.app + - cd build && rm -rf forager-"{{.version}}"-apple.app + \ No newline at end of file From c03d753c54fcd04e9881a33e76f213ccd0dec64a Mon Sep 17 00:00:00 2001 From: CRBroughton Date: Tue, 14 Nov 2023 20:33:33 +0000 Subject: [PATCH 02/21] feat: :seedling: create user and item seeder --- .changeset/red-peaches-own.md | 5 + db/main.go | 3 + db/seeder/seeder.go | 183 ++++++++++++++++++++++++++++++++++ 3 files changed, 191 insertions(+) create mode 100644 .changeset/red-peaches-own.md create mode 100644 db/seeder/seeder.go diff --git a/.changeset/red-peaches-own.md b/.changeset/red-peaches-own.md new file mode 100644 index 0000000..4424c63 --- /dev/null +++ b/.changeset/red-peaches-own.md @@ -0,0 +1,5 @@ +--- +"forager": patch +--- + +Create user and item seeder diff --git a/db/main.go b/db/main.go index dbfae13..9e350a8 100644 --- a/db/main.go +++ b/db/main.go @@ -13,6 +13,7 @@ import ( "github.com/pocketbase/pocketbase/plugins/migratecmd" _ "github.com/crbroughton/forager/migrations" + "github.com/crbroughton/forager/seeder" ) //go:embed all:dist @@ -21,6 +22,8 @@ var distDir embed.FS func main() { app := pocketbase.New() + seeder.AddSeederCommand(app) + // loosely check if it was executed using "go run" isGoRun := strings.HasPrefix(os.Args[0], os.TempDir()) diff --git a/db/seeder/seeder.go b/db/seeder/seeder.go new file mode 100644 index 0000000..d8cc63e --- /dev/null +++ b/db/seeder/seeder.go @@ -0,0 +1,183 @@ +package seeder + +import ( + "encoding/json" + "log" + + "github.com/pocketbase/pocketbase" + "github.com/pocketbase/pocketbase/daos" + "github.com/pocketbase/pocketbase/models" + "github.com/spf13/cobra" +) + +func AddSeederCommand(app *pocketbase.PocketBase) { + app.RootCmd.AddCommand(&cobra.Command{ + Use: "seed", + Short: "Seeds the database with a default admin user and item markers", + Run: func(cmd *cobra.Command, args []string) { + seedTestUser(app) + seedTestUsersMarkers(app) + }, + }) +} + +func seedTestUsersMarkers(app *pocketbase.PocketBase) { + db := app.Dao() + + collection, err := db.FindCollectionByNameOrId("items") + if err != nil { + log.Fatal(err) + } + + type item struct { + Id int `json:"id"` + Name string `json:"name"` + Date string `json:"date"` + LastForaged string `json:"lastForaged"` + Owner int `json:"owner"` + Lng string `json:"lng"` + Lat string `json:"lat"` + Colour string `json:"colour"` + StartMonth string `json:"startMonth"` + EndMonth string `json:"endMonth"` + ImageURL string `json:"imageURL"` + } + + items := []item{ + { + Id: 1, + Name: "Blackberries", + Date: "2023-11-14 19:23:57", + Owner: 1, + Lng: "-0.13107839490911033", + Lat: "50.8315128991386", + Colour: "purple", + StartMonth: "January", + EndMonth: "September", + ImageURL: "https://upload.wikimedia.org/wikipedia/commons/7/78/Ripe%2C_ripening%2C_and_green_blackberries.jpg", + }, + { + Id: 2, + Name: "Hawthorn", + Date: "2023-11-14 19:23:58", + Owner: 1, + Lng: "-0.13254663509749776", + Lat: "50.8304424332006", + Colour: "deeppink", + StartMonth: "January", + EndMonth: "December", + ImageURL: "https://images.immediate.co.uk/production/volatile/sites/23/2019/09/GettyImages-513147101-hawthorn-Neil-Holmes-dba76ab.jpg", + }, + { + Id: 3, + Name: "Elderberries", + Date: "2023-11-14 19:23:60", + Owner: 1, + Lng: "-0.13364328363357458", + Lat: "50.83169035368675", + Colour: "cadetblue", + StartMonth: "January", + EndMonth: "December", + ImageURL: "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Sambucus-berries.jpg/1280px-Sambucus-berries.jpg", + }, + { + Id: 4, + Name: "Rhubarb", + Date: "2023-11-14 19:23:12", + Owner: 1, + Lng: "-0.13408738097555783", + Lat: "50.83086604297725", + Colour: "purple", + StartMonth: "January", + EndMonth: "December", + ImageURL: "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2b/Rheum_rhabarbarum.2006-04-27.uellue.jpg/1280px-Rheum_rhabarbarum.2006-04-27.uellue.jpg", + }, + } + + app.Dao().RunInTransaction(func(txDao *daos.Dao) error { + for _, item := range items { + record := models.NewRecord(collection) + + record.Set("id", item.Id) + record.Set("name", item.Name) + record.Set("date", item.Date) + record.Set("owner", item.Owner) + record.Set("lastForaged", item.LastForaged) + record.Set("lng", item.Lng) + record.Set("lat", item.Lat) + record.Set("colour", item.Colour) + record.Set("startMonth", item.StartMonth) + record.Set("endMonth", item.EndMonth) + record.Set("imageURL", item.ImageURL) + + err = txDao.Save(record) + if err != nil { + log.Fatal(err) + } + + } + return nil + }) + +} + +func seedTestUser(app *pocketbase.PocketBase) { + db := app.Dao() + + collection, err := db.FindCollectionByNameOrId("users") + if err != nil { + log.Fatal(err) + } + + record := models.NewRecord(collection) + + type image struct { + Colour string `json:"colour"` + Name string `json:"name"` + Url string `json:"url"` + } + + images := []image{ + { + Colour: "purple", + Name: "Blackberries", + Url: "https://upload.wikimedia.org/wikipedia/commons/7/78/Ripe%2C_ripening%2C_and_green_blackberries.jpg", + }, + { + Colour: "deeppink", + Name: "Hawthorn", + Url: "https://images.immediate.co.uk/production/volatile/sites/23/2019/09/GettyImages-513147101-hawthorn-Neil-Holmes-dba76ab.jpg", + }, + { + Name: "Rhubarb", + Url: "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2b/Rheum_rhabarbarum.2006-04-27.uellue.jpg/1280px-Rheum_rhabarbarum.2006-04-27.uellue.jpg", + }, + { + Colour: "cadetblue", + Name: "Elderberries", + Url: "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Sambucus-berries.jpg/1280px-Sambucus-berries.jpg", + }, + } + + JSON, err := json.MarshalIndent(images, "", " ") + if err != nil { + log.Fatal(err) + } + + log.Default().Println(JSON, images) + + record.Set("id", 1) + record.Set("name", "testuser") + record.Set("username", "testuser") + record.Set("password", "testuser") + record.Set("lng", -0.13309169393016873) + record.Set("lat", 50.83106120191778) + record.Set("disclaimerAgreed", true) + record.Set("tokenKey", 1) + record.Set("images", JSON) + + err = db.SaveRecord(record) + if err != nil { + log.Fatal(err) + } +} From 7a88666b3045606902d85d09a2eaeaa5010f5aa2 Mon Sep 17 00:00:00 2001 From: CRBroughton Date: Tue, 14 Nov 2023 20:37:21 +0000 Subject: [PATCH 03/21] docs: :memo: update docs with seeder information, add new seeder command to package.json --- README.md | 4 ++++ package.json | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 81e5da2..11eb1cd 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,10 @@ Dependant on your operating system's architecture, download the latest release o into the db folder. When running `pnpm run pocketbase:serve` for the first time, the database migrations will ensure the correct tables are created. +If you wish to seed the database with a test user, one is provided +if you run `pnpm run pocketbase:seed` - You will need to update this +users password and Mapbox API key. + ## Progressive Web Application (PWA) Forager is a Progressive Web Application (PWA), and therefore can be installed via any browser, however requires an active connection to your [Pocketbase](https://github.com/pocketbase/pocketbase) instance. diff --git a/package.json b/package.json index b434436..f7f86fe 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "lint:check": "eslint \"src/*.{vue,ts,js}\"", "lint:fix": "eslint \"src/*.{vue,ts,js}\" --fix", "serve": "vite preview", - "pocketbase:serve": "./db/pocketbase serve", + "pocketbase:serve": "cd db && go run main.go serve", + "pocketbase:seed":"cd db && go run main.go seed", "pocketbase:types": "npx pocketbase-typegen --db ./db/pb_data/data.db --out ./src/pocketbase-types.ts", "changeset": "npx changeset", "changeset:status": "npx changeset status --verbose", From bb3202abb9cac4c5e22e48d729f1820160489b03 Mon Sep 17 00:00:00 2001 From: CRBroughton Date: Tue, 14 Nov 2023 21:03:10 +0000 Subject: [PATCH 04/21] feat: :sparkles: Create loading screen on application login --- .changeset/hot-cats-admire.md | 5 +++ components.d.ts | 1 + src/App.vue | 1 + src/components/LoadingScreen.vue | 67 ++++++++++++++++++++++++++++++++ src/mapbox.ts | 2 +- 5 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 .changeset/hot-cats-admire.md create mode 100644 src/components/LoadingScreen.vue diff --git a/.changeset/hot-cats-admire.md b/.changeset/hot-cats-admire.md new file mode 100644 index 0000000..395a576 --- /dev/null +++ b/.changeset/hot-cats-admire.md @@ -0,0 +1,5 @@ +--- +"forager": patch +--- + +Create loading screen on application login diff --git a/components.d.ts b/components.d.ts index de8097f..67d44bf 100644 --- a/components.d.ts +++ b/components.d.ts @@ -16,6 +16,7 @@ declare module 'vue' { ImageSettings: typeof import('./src/views/settings/ImageSettings.vue')['default'] InformationMark: typeof import('./src/components/InformationMark.vue')['default'] ItemDetails: typeof import('./src/components/ItemDetails.vue')['default'] + LoadingScreen: typeof import('./src/components/LoadingScreen.vue')['default'] LoginForm: typeof import('./src/components/LoginForm.vue')['default'] MonthSelector: typeof import('./src/components/MonthSelector.vue')['default'] ReferenceImage: typeof import('./src/components/ReferenceImage.vue')['default'] diff --git a/src/App.vue b/src/App.vue index 9d7fe4d..82a91b8 100644 --- a/src/App.vue +++ b/src/App.vue @@ -93,6 +93,7 @@ const settingsMenuVisible = ref(false)
+
diff --git a/src/components/LoadingScreen.vue b/src/components/LoadingScreen.vue new file mode 100644 index 0000000..7bb7160 --- /dev/null +++ b/src/components/LoadingScreen.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/mapbox.ts b/src/mapbox.ts index 20cbf05..a9552e1 100644 --- a/src/mapbox.ts +++ b/src/mapbox.ts @@ -16,7 +16,7 @@ export const useMapbox = defineStore('mapbox-store', () => { const markerUIHidden = ref(true) const selectedItem = ref(undefined) const detailsHidden = ref(true) - const items = ref([]) + const items = ref(null) const translateItemToLayerItem = (items: ItemsRecordWithID[]) => { const records = ref([]) From f2d92e530d9af6ff9fd2d7c8fd1ed3ccb228e937 Mon Sep 17 00:00:00 2001 From: CRBroughton Date: Tue, 14 Nov 2023 21:15:38 +0000 Subject: [PATCH 05/21] fix: :bug: correct type of parameter --- src/pocketbase.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/pocketbase.ts b/src/pocketbase.ts index f79030a..13b39b6 100644 --- a/src/pocketbase.ts +++ b/src/pocketbase.ts @@ -244,7 +244,9 @@ export const usePocketBase = defineStore('pocketbase-store', () => { } } - const deleteAllMarkers = async (items: ItemsRecordWithID[]) => { + const deleteAllMarkers = async (items: ItemsRecordWithID[] | null) => { + if (items === null) + return const promises: Promise[] = [] try { // eslint-disable-next-line no-console From 68ed2d7686236cabda8169f50afd73d8b0962090 Mon Sep 17 00:00:00 2001 From: CRBroughton Date: Wed, 15 Nov 2023 17:44:41 +0000 Subject: [PATCH 06/21] build: :construction_worker: Include Docker deployment options - Forager can now be deployed with a Docker image --- .changeset/dull-timers-train.md | 5 +++++ Dockerfile | 26 +++++++++++++------------- README.md | 6 ++++++ docker-compose.yml | 18 +++++++++--------- package.json | 3 +++ 5 files changed, 36 insertions(+), 22 deletions(-) create mode 100644 .changeset/dull-timers-train.md diff --git a/.changeset/dull-timers-train.md b/.changeset/dull-timers-train.md new file mode 100644 index 0000000..0b1c0fd --- /dev/null +++ b/.changeset/dull-timers-train.md @@ -0,0 +1,5 @@ +--- +"forager": patch +--- + +Include Docker deployment options - Forager can now be deployed with a Docker image diff --git a/Dockerfile b/Dockerfile index f0c9a2c..10cf1a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,19 +1,19 @@ -FROM node:18.12.1 +FROM alpine:latest -LABEL author="Craig Broughton" -LABEL author.email="CRBroughton@posteo.uk" +ARG FORAGER_VERSION=2.0.0 -WORKDIR /app +RUN apk add --no-cache \ + unzip \ + ca-certificates -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh +# download and unzip Forager +ADD https://github.com/CRBroughton/forager/releases/download/${FORAGER_VERSION}/forager-${FORAGER_VERSION}-linux.zip /tmp/forager.zip -ADD . . +RUN unzip /tmp/forager.zip -d forager +RUN cd forager && mv forager-${FORAGER_VERSION}-linux forager +RUN rm -rf /tmp/forager/zip -RUN npm i -g pnpm && pnpm i +EXPOSE 8080 -ENTRYPOINT ["/entrypoint.sh"] - -EXPOSE 4000 - -CMD ["npm", "run", "dev"] \ No newline at end of file +# start Forager +CMD ["forager/forager", "serve", "--http=0.0.0.0:8090"] \ No newline at end of file diff --git a/README.md b/README.md index 11eb1cd..b8c8634 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,12 @@ This binary will provide both the back-end and front-end of the application. For deployment of the application, see [Pocketbases Going to Production documentation](https://pocketbase.io/docs/going-to-production/). +### Docker + +The Forager repository includes a `docker-compose.yml` file, enabling +quick deployment of Forager. Simply install Docker, clone the repository +and then run `docker compose up -d`. + ## Manual Installation Regardless of manual installation method, you will require the following to build Forager: diff --git a/docker-compose.yml b/docker-compose.yml index 59b3247..8741b18 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,14 +1,14 @@ -version: '3.8' +version: "3.8" services: - ui: - container_name: vite-ui - build: - context: ./ - dockerfile: Dockerfile + forager: + build: . + container_name: forager + environment: + - PUID=1000 + - PGID=1000 volumes: - - ./:/app - - ./node_modules:/app/node_modules + - forager:/pb/pb_data ports: - - '4000:4000' + - 8090:8090 restart: unless-stopped \ No newline at end of file diff --git a/package.json b/package.json index f7f86fe..425ad91 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,9 @@ "pocketbase:serve": "cd db && go run main.go serve", "pocketbase:seed":"cd db && go run main.go seed", "pocketbase:types": "npx pocketbase-typegen --db ./db/pb_data/data.db --out ./src/pocketbase-types.ts", + "pocketbase:migrate": "cd db && go run main.go migrate", + "pocketbase:migrate:down": "cd db && go run main.go migrate down", + "pocketbase:migrate:create": "cd db && go run main.go migrate create", "changeset": "npx changeset", "changeset:status": "npx changeset status --verbose", "changeset:version": "npx changeset version" From 0bdfe91d2a6ad2df4acac102a4bd4b7a9dab9cb0 Mon Sep 17 00:00:00 2001 From: CRBroughton Date: Wed, 15 Nov 2023 17:45:11 +0000 Subject: [PATCH 07/21] fix: :bug: add CGO_ENABLED flag to linux build for docker/alpine compat --- taskfile.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/taskfile.yml b/taskfile.yml index 43f7c40..35ed637 100644 --- a/taskfile.yml +++ b/taskfile.yml @@ -23,13 +23,13 @@ tasks: linux32: deps: [front] cmds: - - cd db && GOOS=linux GOARCH=386 go build -o ../build/forager-"{{.version}}"-linux32 + - cd db && CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -o ../build/forager-"{{.version}}"-linux32 - cd build && zip forager-"{{.version}}"-linux32.zip forager-"{{.version}}"-linux32 linux64: deps: [front] cmds: - - cd db && GOOS=linux GOARCH=amd64 go build -o ../build/forager-"{{.version}}"-linux + - cd db && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ../build/forager-"{{.version}}"-linux - cd build && zip forager-"{{.version}}"-linux.zip forager-"{{.version}}"-linux @@ -52,7 +52,7 @@ tasks: - cd build && zip forager-"{{.version}}"-appliesilicon.zip forager-"{{.version}}"-appliesilicon.app cleanoutput: - deps: [apple, applesilicon] + deps: [linux32, linux64, windows64, apple, applesilicon] cmds: - cd build && rm -rf forager-"{{.version}}"-linux32 - cd build && rm -rf forager-"{{.version}}"-linux From ad34d8224fb70d426b8617dc618a3e52a7765982 Mon Sep 17 00:00:00 2001 From: CRBroughton Date: Wed, 15 Nov 2023 20:28:53 +0000 Subject: [PATCH 08/21] fix: :bug: Add migration for default services, canCreateAccounts now defaults to true --- .changeset/moody-beans-act.md | 5 ++ db/migrations/1700070534_default_services.go | 50 ++++++++++++++++++++ 2 files changed, 55 insertions(+) create mode 100644 .changeset/moody-beans-act.md create mode 100644 db/migrations/1700070534_default_services.go diff --git a/.changeset/moody-beans-act.md b/.changeset/moody-beans-act.md new file mode 100644 index 0000000..2afba34 --- /dev/null +++ b/.changeset/moody-beans-act.md @@ -0,0 +1,5 @@ +--- +"forager": patch +--- + +Add migration for default services, canCreateAccounts now defaults to true diff --git a/db/migrations/1700070534_default_services.go b/db/migrations/1700070534_default_services.go new file mode 100644 index 0000000..c22bbc1 --- /dev/null +++ b/db/migrations/1700070534_default_services.go @@ -0,0 +1,50 @@ +package migrations + +import ( + "github.com/pocketbase/dbx" + "github.com/pocketbase/pocketbase/daos" + m "github.com/pocketbase/pocketbase/migrations" + "github.com/pocketbase/pocketbase/models" +) + +func init() { + m.Register(func(db dbx.Builder) error { + dao := daos.New(db) + + collection, err := dao.FindCollectionByNameOrId("Services") + if err != nil { + return err + } + + record := models.NewRecord(collection) + + record.Set("id", 1) + record.Set("canCreateAccounts", true) + + err = dao.SaveRecord(record) + if err != nil { + return err + } + + return nil + }, func(db dbx.Builder) error { + dao := daos.New(db) + + collection, err := dao.FindCollectionByNameOrId("Services") + if err != nil { + return err + } + + record, err := dao.FindRecordById(collection.Id, "1") + if err != nil { + return err + } + + err = dao.DeleteRecord(record) + if err != nil { + return err + } + + return nil + }) +} From fee0ad9fea1a2652a1fc8f59961856c429237173 Mon Sep 17 00:00:00 2001 From: CRBroughton Date: Wed, 15 Nov 2023 20:34:07 +0000 Subject: [PATCH 09/21] chore: :fire: remove mapbox key:value from .env.example --- .env.example | 1 - 1 file changed, 1 deletion(-) diff --git a/.env.example b/.env.example index 115daa7..89db7b2 100644 --- a/.env.example +++ b/.env.example @@ -1,2 +1 @@ -VITE_MAPBOX_KEY="MAPBOX_API_KEY" VITE_POCKETBASE_URL="http://localhost:8090" From 862d4310492329c236e252ca0fa79b451322c7a8 Mon Sep 17 00:00:00 2001 From: CRBroughton Date: Wed, 15 Nov 2023 20:43:07 +0000 Subject: [PATCH 10/21] fix: :bug: fix docker volume mounting --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8741b18..15d0ef1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,7 +8,7 @@ services: - PUID=1000 - PGID=1000 volumes: - - forager:/pb/pb_data + - ./forager:/pb/pb_data ports: - 8090:8090 restart: unless-stopped \ No newline at end of file From 2b364e7becf00a3817945ffcbd5ec8c2c279deae Mon Sep 17 00:00:00 2001 From: CRBroughton Date: Sat, 18 Nov 2023 19:34:49 +0000 Subject: [PATCH 11/21] fix: :bug: fix position of reference image cross --- src/components/ReferenceImage.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ReferenceImage.vue b/src/components/ReferenceImage.vue index e29f47c..f52f549 100644 --- a/src/components/ReferenceImage.vue +++ b/src/components/ReferenceImage.vue @@ -16,8 +16,8 @@ const { isLoading } = useImage({ src: props.image.url })