From 5f9353841ba76cc0560d3f4ddb08c05f687e52f5 Mon Sep 17 00:00:00 2001 From: Jakub Zych Date: Sun, 27 Sep 2026 15:21:48 +0200 Subject: [PATCH] feat(10-01): serve the embedded admin SPA at backend.uri with cookie login - backend.uri prefix (default /backend) mounts the admin API at {prefix}/api/v1 and the embedded SPA shell at {prefix} with an api/ JSON 404 fallback - cookie transport: an X-Requested-With login sets the HttpOnly summer_admin cookie and returns no token; the backend guard reads the cookie after Bearer - CSRF wrapper refuses cookie-only POST/PUT/DELETE without X-Requested-With - boardwalk package embeds boardwalk/dist, rewrites index.html once per prefix and sets cache and security headers - framework admin OpenAPI pipeline (swag, swagger2openapi, openapi-typescript) with prefix-relative paths and typed envelopes for the tracer routes - admin/ Vite SPA: login, plugin rail, section panel and read-only list through the openapi-fetch client typed by the generated schema --- .gitignore | 3 + admin/env.d.ts | 1 + admin/index.html | 14 + admin/openapi/admin.json | 2238 +++++++++ admin/package-lock.json | 4403 +++++++++++++++++ admin/package.json | 36 + admin/src/App.vue | 15 + admin/src/api/client.ts | 44 + admin/src/api/schema.d.ts | 1532 ++++++ admin/src/api/types.ts | 16 + admin/src/app/controllerRoutes.ts | 42 + admin/src/app/i18n.ts | 42 + admin/src/app/icons.ts | 111 + admin/src/app/router.ts | 63 + admin/src/app/runtime.ts | 23 + admin/src/components/list/DataTable.vue | 85 + admin/src/components/shell/AppShell.vue | 72 + admin/src/components/shell/PluginRail.vue | 43 + admin/src/components/shell/SectionPanel.vue | 45 + admin/src/main.ts | 30 + admin/src/state/useAuth.ts | 44 + admin/src/state/useNavigation.ts | 65 + admin/src/styles/main.css | 160 + admin/src/views/ListView.vue | 89 + admin/src/views/LoginView.vue | 99 + admin/src/views/NotFoundView.vue | 13 + admin/tests/fixtures/navigation.json | 55 + admin/tests/fixtures/widgets.list-schema.json | 22 + admin/tests/fixtures/widgets.list.json | 7 + admin/tests/setup.ts | 6 + admin/tests/smoke/tracer.smoke.test.ts | 199 + admin/tsconfig.json | 21 + admin/vite.config.ts | 34 + admin/vitest.config.ts | 12 + boardwalk/boardwalk.go | 167 + .../dm-mono-latin-400-normal--0xN8mdc.woff | Bin 0 -> 11212 bytes .../dm-mono-latin-400-normal-4GdczIuU.woff2 | Bin 0 -> 14820 bytes .../dm-mono-latin-500-normal-CN8Miw6E.woff | Bin 0 -> 11248 bytes .../dm-mono-latin-500-normal-DRMDZjhP.woff2 | Bin 0 -> 14988 bytes ...dm-mono-latin-ext-400-normal-1aZr6b2b.woff | Bin 0 -> 7500 bytes ...m-mono-latin-ext-400-normal-C2zvOubV.woff2 | Bin 0 -> 9552 bytes ...m-mono-latin-ext-500-normal-BtRyHRi6.woff2 | Bin 0 -> 9616 bytes ...dm-mono-latin-ext-500-normal-Dw3M13d8.woff | Bin 0 -> 7488 bytes .../dm-sans-latin-400-normal-BwCSEQnW.woff | Bin 0 -> 18356 bytes .../dm-sans-latin-400-normal-CW0RaeGs.woff2 | Bin 0 -> 14200 bytes .../dm-sans-latin-500-normal-B9HHJjqV.woff2 | Bin 0 -> 14304 bytes .../dm-sans-latin-500-normal-Dr3UlScf.woff | Bin 0 -> 18520 bytes .../dm-sans-latin-600-normal-Aqo67rzb.woff2 | Bin 0 -> 14144 bytes .../dm-sans-latin-600-normal-BmdmIIQ2.woff | Bin 0 -> 18320 bytes .../dm-sans-latin-700-normal-CUSSCpQX.woff | Bin 0 -> 18504 bytes .../dm-sans-latin-700-normal-DvUfVpUG.woff2 | Bin 0 -> 14348 bytes ...dm-sans-latin-ext-400-normal-BjWJ59Pq.woff | Bin 0 -> 9976 bytes ...m-sans-latin-ext-400-normal-BtiwyxMk.woff2 | Bin 0 -> 7364 bytes ...m-sans-latin-ext-500-normal-BJfUCQsA.woff2 | Bin 0 -> 7432 bytes ...dm-sans-latin-ext-500-normal-DR84L5F-.woff | Bin 0 -> 10068 bytes ...m-sans-latin-ext-600-normal-4vooXBpG.woff2 | Bin 0 -> 7420 bytes ...dm-sans-latin-ext-600-normal-DRtaDpgU.woff | Bin 0 -> 10024 bytes ...dm-sans-latin-ext-700-normal-BLI3TTWz.woff | Bin 0 -> 10012 bytes ...m-sans-latin-ext-700-normal-CJIcxD6K.woff2 | Bin 0 -> 7452 bytes boardwalk/dist/assets/index-UTAit0wB.css | 1 + boardwalk/dist/assets/index-ZNCn30hM.js | 1 + boardwalk/dist/index.html | 15 + bouncer/jwt.go | 9 +- cabana/admin_openapi.go | 152 +- cabana/admin_paths_test.go | 7 + cabana/auth.go | 62 +- cabana/auth_test.go | 50 +- cabana/bulk_test.go | 2 +- cabana/commands_test.go | 2 +- cabana/crud_lifecycle_test.go | 8 +- cabana/csrf.go | 45 + cabana/http.go | 82 +- cabana/phase09_contract_test.go | 40 +- cabana/prefix.go | 49 + cabana/security_coverage_test.go | 71 +- cabana/security_test.go | 2 +- go.mod | 3 + internal/tools/swagger2openapi/main.go | 380 ++ scripts/check-admin-openapi.sh | 60 + 79 files changed, 10745 insertions(+), 147 deletions(-) create mode 100644 admin/env.d.ts create mode 100644 admin/index.html create mode 100644 admin/openapi/admin.json create mode 100644 admin/package-lock.json create mode 100644 admin/package.json create mode 100644 admin/src/App.vue create mode 100644 admin/src/api/client.ts create mode 100644 admin/src/api/schema.d.ts create mode 100644 admin/src/api/types.ts create mode 100644 admin/src/app/controllerRoutes.ts create mode 100644 admin/src/app/i18n.ts create mode 100644 admin/src/app/icons.ts create mode 100644 admin/src/app/router.ts create mode 100644 admin/src/app/runtime.ts create mode 100644 admin/src/components/list/DataTable.vue create mode 100644 admin/src/components/shell/AppShell.vue create mode 100644 admin/src/components/shell/PluginRail.vue create mode 100644 admin/src/components/shell/SectionPanel.vue create mode 100644 admin/src/main.ts create mode 100644 admin/src/state/useAuth.ts create mode 100644 admin/src/state/useNavigation.ts create mode 100644 admin/src/styles/main.css create mode 100644 admin/src/views/ListView.vue create mode 100644 admin/src/views/LoginView.vue create mode 100644 admin/src/views/NotFoundView.vue create mode 100644 admin/tests/fixtures/navigation.json create mode 100644 admin/tests/fixtures/widgets.list-schema.json create mode 100644 admin/tests/fixtures/widgets.list.json create mode 100644 admin/tests/setup.ts create mode 100644 admin/tests/smoke/tracer.smoke.test.ts create mode 100644 admin/tsconfig.json create mode 100644 admin/vite.config.ts create mode 100644 admin/vitest.config.ts create mode 100644 boardwalk/boardwalk.go create mode 100644 boardwalk/dist/assets/dm-mono-latin-400-normal--0xN8mdc.woff create mode 100644 boardwalk/dist/assets/dm-mono-latin-400-normal-4GdczIuU.woff2 create mode 100644 boardwalk/dist/assets/dm-mono-latin-500-normal-CN8Miw6E.woff create mode 100644 boardwalk/dist/assets/dm-mono-latin-500-normal-DRMDZjhP.woff2 create mode 100644 boardwalk/dist/assets/dm-mono-latin-ext-400-normal-1aZr6b2b.woff create mode 100644 boardwalk/dist/assets/dm-mono-latin-ext-400-normal-C2zvOubV.woff2 create mode 100644 boardwalk/dist/assets/dm-mono-latin-ext-500-normal-BtRyHRi6.woff2 create mode 100644 boardwalk/dist/assets/dm-mono-latin-ext-500-normal-Dw3M13d8.woff create mode 100644 boardwalk/dist/assets/dm-sans-latin-400-normal-BwCSEQnW.woff create mode 100644 boardwalk/dist/assets/dm-sans-latin-400-normal-CW0RaeGs.woff2 create mode 100644 boardwalk/dist/assets/dm-sans-latin-500-normal-B9HHJjqV.woff2 create mode 100644 boardwalk/dist/assets/dm-sans-latin-500-normal-Dr3UlScf.woff create mode 100644 boardwalk/dist/assets/dm-sans-latin-600-normal-Aqo67rzb.woff2 create mode 100644 boardwalk/dist/assets/dm-sans-latin-600-normal-BmdmIIQ2.woff create mode 100644 boardwalk/dist/assets/dm-sans-latin-700-normal-CUSSCpQX.woff create mode 100644 boardwalk/dist/assets/dm-sans-latin-700-normal-DvUfVpUG.woff2 create mode 100644 boardwalk/dist/assets/dm-sans-latin-ext-400-normal-BjWJ59Pq.woff create mode 100644 boardwalk/dist/assets/dm-sans-latin-ext-400-normal-BtiwyxMk.woff2 create mode 100644 boardwalk/dist/assets/dm-sans-latin-ext-500-normal-BJfUCQsA.woff2 create mode 100644 boardwalk/dist/assets/dm-sans-latin-ext-500-normal-DR84L5F-.woff create mode 100644 boardwalk/dist/assets/dm-sans-latin-ext-600-normal-4vooXBpG.woff2 create mode 100644 boardwalk/dist/assets/dm-sans-latin-ext-600-normal-DRtaDpgU.woff create mode 100644 boardwalk/dist/assets/dm-sans-latin-ext-700-normal-BLI3TTWz.woff create mode 100644 boardwalk/dist/assets/dm-sans-latin-ext-700-normal-CJIcxD6K.woff2 create mode 100644 boardwalk/dist/assets/index-UTAit0wB.css create mode 100644 boardwalk/dist/assets/index-ZNCn30hM.js create mode 100644 boardwalk/dist/index.html create mode 100644 cabana/admin_paths_test.go create mode 100644 cabana/csrf.go create mode 100644 cabana/prefix.go create mode 100644 internal/tools/swagger2openapi/main.go create mode 100755 scripts/check-admin-openapi.sh diff --git a/.gitignore b/.gitignore index 87907f5..ffce916 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ *.out coverage.* +# Admin SPA +/admin/node_modules/ + # Env and local config .env .env.* diff --git a/admin/env.d.ts b/admin/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/admin/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/admin/index.html b/admin/index.html new file mode 100644 index 0000000..30bc6ca --- /dev/null +++ b/admin/index.html @@ -0,0 +1,14 @@ + + + + + + + + SummerCMS + + +
+ + + diff --git a/admin/openapi/admin.json b/admin/openapi/admin.json new file mode 100644 index 0000000..b8a6386 --- /dev/null +++ b/admin/openapi/admin.json @@ -0,0 +1,2238 @@ +{ + "components": { + "schemas": { + "cabana.AdminLoginData": { + "properties": { + "access_token": { + "type": "string" + }, + "expires_in": { + "type": "integer" + }, + "token_type": { + "type": "string" + } + }, + "required": [ + "token_type" + ], + "type": "object" + }, + "cabana.AdminLoginRequest": { + "properties": { + "email": { + "type": "string" + }, + "login": { + "type": "string" + }, + "password": { + "type": "string" + } + }, + "required": [ + "password" + ], + "type": "object" + }, + "cabana.AdminProfile": { + "properties": { + "email": { + "type": "string" + }, + "first_name": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "is_superuser": { + "type": "boolean" + }, + "last_name": { + "type": "string" + }, + "login": { + "type": "string" + }, + "role": { + "$ref": "#/components/schemas/cabana.AdminRoleSummary" + } + }, + "required": [ + "email", + "first_name", + "id", + "is_superuser", + "last_name", + "login" + ], + "type": "object" + }, + "cabana.AdminRoleSummary": { + "properties": { + "code": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "code", + "id", + "name" + ], + "type": "object" + }, + "cabana.BulkAction": { + "properties": { + "label": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "cabana.Envelope-array_cabana_NavigationEntry": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/cabana.NavigationEntry" + }, + "type": "array" + }, + "meta": { + "$ref": "#/components/schemas/cabana.SuccessMeta" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + "cabana.Envelope-cabana_AdminLoginData": { + "properties": { + "data": { + "$ref": "#/components/schemas/cabana.AdminLoginData" + }, + "meta": { + "$ref": "#/components/schemas/cabana.SuccessMeta" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + "cabana.Envelope-cabana_AdminProfile": { + "properties": { + "data": { + "$ref": "#/components/schemas/cabana.AdminProfile" + }, + "meta": { + "$ref": "#/components/schemas/cabana.SuccessMeta" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + "cabana.Envelope-cabana_ListSchema": { + "properties": { + "data": { + "$ref": "#/components/schemas/cabana.ListSchema" + }, + "meta": { + "$ref": "#/components/schemas/cabana.SuccessMeta" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + "cabana.ErrorBody": { + "properties": { + "code": { + "type": "string" + }, + "details": { + "additionalProperties": {}, + "type": "object" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "details", + "message" + ], + "type": "object" + }, + "cabana.ErrorEnvelope": { + "properties": { + "error": { + "$ref": "#/components/schemas/cabana.ErrorBody" + } + }, + "required": [ + "error" + ], + "type": "object" + }, + "cabana.FormMeta": { + "properties": { + "locale": { + "type": "string" + } + }, + "required": [ + "locale" + ], + "type": "object" + }, + "cabana.FormOption": { + "properties": { + "label": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/cabana.jsonScalar" + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "cabana.ListColumn": { + "properties": { + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "relation": { + "type": "string" + }, + "searchable": { + "type": "boolean" + }, + "select": { + "type": "string" + }, + "sortable": { + "type": "boolean" + }, + "type": { + "type": "string" + } + }, + "required": [ + "key", + "label", + "searchable", + "sortable" + ], + "type": "object" + }, + "cabana.ListEnvelope-array_cabana_AdminRecord": { + "properties": { + "data": { + "items": { + "additionalProperties": {}, + "type": "object" + }, + "type": "array" + }, + "meta": { + "$ref": "#/components/schemas/cabana.ListMeta" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + "cabana.ListFilter": { + "properties": { + "column": { + "type": "string" + }, + "falseValue": { + "$ref": "#/components/schemas/cabana.jsonScalar" + }, + "label": { + "type": "string" + }, + "modelClass": { + "type": "string" + }, + "name": { + "type": "string" + }, + "nameFrom": { + "type": "string" + }, + "options": { + "items": { + "$ref": "#/components/schemas/cabana.FormOption" + }, + "type": "array" + }, + "scope": { + "type": "string" + }, + "trueValue": { + "$ref": "#/components/schemas/cabana.jsonScalar" + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" + }, + "cabana.ListMeta": { + "properties": { + "last_page": { + "type": "integer" + }, + "page": { + "type": "integer" + }, + "per_page": { + "type": "integer" + }, + "total": { + "type": "integer" + } + }, + "required": [ + "last_page", + "page", + "per_page", + "total" + ], + "type": "object" + }, + "cabana.ListSchema": { + "properties": { + "bulkActions": { + "items": { + "$ref": "#/components/schemas/cabana.BulkAction" + }, + "type": "array" + }, + "columns": { + "items": { + "$ref": "#/components/schemas/cabana.ListColumn" + }, + "type": "array" + }, + "defaultSort": { + "$ref": "#/components/schemas/cabana.ListSort" + }, + "filters": { + "items": { + "$ref": "#/components/schemas/cabana.ListFilter" + }, + "type": "array" + }, + "meta": { + "$ref": "#/components/schemas/cabana.FormMeta" + }, + "modelClass": { + "type": "string" + }, + "noRecordsMessage": { + "type": "string" + }, + "perPageOptions": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "recordUrl": { + "type": "string" + }, + "recordsPerPage": { + "type": "integer" + }, + "rowActions": { + "items": { + "$ref": "#/components/schemas/cabana.RowAction" + }, + "type": "array" + }, + "searchPrompt": { + "type": "string" + }, + "searchTerm": { + "type": "string" + }, + "showCheckboxes": { + "type": "boolean" + }, + "showSearch": { + "type": "boolean" + }, + "showSetup": { + "type": "boolean" + }, + "showSorting": { + "type": "boolean" + }, + "title": { + "type": "string" + }, + "toolbarButtons": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "bulkActions", + "columns", + "filters", + "perPageOptions", + "recordsPerPage", + "rowActions", + "searchTerm", + "showCheckboxes", + "showSearch", + "showSetup", + "showSorting", + "toolbarButtons" + ], + "type": "object" + }, + "cabana.ListSort": { + "properties": { + "column": { + "type": "string" + }, + "direction": { + "type": "string" + } + }, + "required": [ + "column", + "direction" + ], + "type": "object" + }, + "cabana.NavigationEntry": { + "properties": { + "code": { + "type": "string" + }, + "controller": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "label": { + "type": "string" + }, + "order": { + "type": "integer" + }, + "sideMenu": { + "items": { + "$ref": "#/components/schemas/cabana.NavigationEntry" + }, + "type": "array" + } + }, + "required": [ + "code", + "controller", + "icon", + "label", + "order", + "sideMenu" + ], + "type": "object" + }, + "cabana.RowAction": { + "properties": { + "label": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "cabana.SuccessEnvelope": { + "properties": { + "data": {}, + "meta": { + "$ref": "#/components/schemas/cabana.SuccessMeta" + } + }, + "required": [ + "data", + "meta" + ], + "type": "object" + }, + "cabana.SuccessMeta": { + "properties": { + "last_page": { + "type": "integer" + }, + "locale": { + "type": "string" + }, + "page": { + "type": "integer" + }, + "per_page": { + "type": "integer" + }, + "total": { + "type": "integer" + } + }, + "type": "object" + }, + "cabana.jsonScalar": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "securitySchemes": { + "BackendBearer": { + "description": "Backend admin bearer token. Send \"Bearer {access_token}\".", + "in": "header", + "name": "Authorization", + "type": "apiKey" + } + } + }, + "info": { + "contact": {}, + "description": "Framework admin API consumed by the embedded admin SPA. Every path is relative to {backend.uri}/api/v1 (for example /backend/api/v1). The SPA authenticates with the HttpOnly summer_admin cookie set by a login that sends X-Requested-With: XMLHttpRequest, and sends that header on every request; CLI clients and tests send the BackendBearer Authorization header instead.", + "title": "SummerCMS Admin API", + "version": "1" + }, + "openapi": "3.0.3", + "paths": { + "/auth/login": { + "post": { + "parameters": [ + { + "description": "XMLHttpRequest selects cookie transport", + "in": "header", + "name": "X-Requested-With", + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.AdminLoginRequest" + } + } + }, + "description": "Credentials", + "required": true + }, + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.Envelope-cabana_AdminLoginData" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + } + }, + "summary": "Admin login", + "tags": [ + "admin" + ] + } + }, + "/auth/logout": { + "post": { + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Admin logout", + "tags": [ + "admin" + ] + } + }, + "/auth/me": { + "get": { + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.Envelope-cabana_AdminProfile" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Current admin", + "tags": [ + "admin" + ] + } + }, + "/auth/refresh": { + "post": { + "parameters": [ + { + "description": "XMLHttpRequest; required unless a Bearer token is sent", + "in": "header", + "name": "X-Requested-With", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.Envelope-cabana_AdminLoginData" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + } + }, + "summary": "Refresh an admin token", + "tags": [ + "admin" + ] + } + }, + "/navigation": { + "get": { + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.Envelope-array_cabana_NavigationEntry" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Admin navigation", + "tags": [ + "admin" + ] + } + }, + "/settings": { + "get": { + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "List admin settings", + "tags": [ + "admin" + ] + } + }, + "/settings/{code}": { + "get": { + "parameters": [ + { + "description": "Settings code", + "in": "path", + "name": "code", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Not Found" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Read admin settings", + "tags": [ + "admin" + ] + }, + "put": { + "parameters": [ + { + "description": "Settings code", + "in": "path", + "name": "code", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unprocessable Entity" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Update admin settings", + "tags": [ + "admin" + ] + } + }, + "/settings/{code}/schema": { + "get": { + "parameters": [ + { + "description": "Settings code", + "in": "path", + "name": "code", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Not Found" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Admin settings schema", + "tags": [ + "admin" + ] + } + }, + "/{vendor}/{plugin}/{controller}": { + "get": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Search term", + "in": "query", + "name": "search", + "schema": { + "type": "string" + } + }, + { + "description": "Sort column", + "in": "query", + "name": "sort", + "schema": { + "type": "string" + } + }, + { + "description": "Sort direction (asc or desc)", + "in": "query", + "name": "dir", + "schema": { + "type": "string" + } + }, + { + "description": "Page", + "in": "query", + "name": "page", + "schema": { + "type": "integer" + } + }, + { + "description": "Records per page", + "in": "query", + "name": "per_page", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ListEnvelope-array_cabana_AdminRecord" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unprocessable Entity" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "List admin records", + "tags": [ + "admin" + ] + }, + "post": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unprocessable Entity" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Create an admin record", + "tags": [ + "admin" + ] + } + }, + "/{vendor}/{plugin}/{controller}/bulk-delete": { + "post": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unprocessable Entity" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Bulk-delete admin records", + "tags": [ + "admin" + ] + } + }, + "/{vendor}/{plugin}/{controller}/schema/form": { + "get": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Not Found" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Admin form schema", + "tags": [ + "admin" + ] + } + }, + "/{vendor}/{plugin}/{controller}/schema/list": { + "get": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.Envelope-cabana_ListSchema" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Not Found" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Admin list schema", + "tags": [ + "admin" + ] + } + }, + "/{vendor}/{plugin}/{controller}/schema/relation/{name}": { + "get": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Relation name", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Not Found" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Admin relation schema", + "tags": [ + "admin" + ] + } + }, + "/{vendor}/{plugin}/{controller}/{id}": { + "delete": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Record id", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Not Found" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Delete an admin record", + "tags": [ + "admin" + ] + }, + "get": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Record id", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Not Found" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Show an admin record", + "tags": [ + "admin" + ] + }, + "put": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Record id", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unprocessable Entity" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Update an admin record", + "tags": [ + "admin" + ] + } + }, + "/{vendor}/{plugin}/{controller}/{id}/relations/{name}": { + "get": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Owner id", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Relation name", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "List linked relation records", + "tags": [ + "admin" + ] + } + }, + "/{vendor}/{plugin}/{controller}/{id}/relations/{name}/candidates": { + "get": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Owner id", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Relation name", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "List relation candidates", + "tags": [ + "admin" + ] + } + }, + "/{vendor}/{plugin}/{controller}/{id}/relations/{name}/link": { + "post": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Owner id", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Relation name", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unprocessable Entity" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Link relation records", + "tags": [ + "admin" + ] + } + }, + "/{vendor}/{plugin}/{controller}/{id}/relations/{name}/unlink": { + "post": { + "parameters": [ + { + "description": "Vendor", + "in": "path", + "name": "vendor", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Plugin", + "in": "path", + "name": "plugin", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Controller", + "in": "path", + "name": "controller", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "Owner id", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "description": "Relation name", + "in": "path", + "name": "name", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.SuccessEnvelope" + } + } + }, + "description": "OK" + }, + "401": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unauthorized" + }, + "403": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Forbidden" + }, + "422": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cabana.ErrorEnvelope" + } + } + }, + "description": "Unprocessable Entity" + } + }, + "security": [ + { + "BackendBearer": [] + } + ], + "summary": "Unlink relation records", + "tags": [ + "admin" + ] + } + } + } +} diff --git a/admin/package-lock.json b/admin/package-lock.json new file mode 100644 index 0000000..60c375e --- /dev/null +++ b/admin/package-lock.json @@ -0,0 +1,4403 @@ +{ + "name": "summercms-admin", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "summercms-admin", + "dependencies": { + "@fontsource/dm-mono": "5.3.0", + "@fontsource/dm-sans": "5.3.0", + "@lucide/vue": "1.17.0", + "openapi-fetch": "0.17.0", + "reka-ui": "2.9.10", + "vue": "3.5.35", + "vue-router": "5.1.0" + }, + "devDependencies": { + "@tailwindcss/vite": "4.3.0", + "@vitejs/plugin-vue": "6.0.8", + "@vue/test-utils": "2.4.11", + "happy-dom": "20.11.6", + "openapi-typescript": "7.13.0", + "tailwindcss": "4.3.0", + "typescript": "5.9.3", + "vite": "7.3.5", + "vitest": "3.2.7", + "vue-tsc": "3.3.11" + }, + "engines": { + "node": ">=22.6" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-8.0.6.tgz", + "integrity": "sha512-/pcanjdRsonCexCuxgGD8fKnBLLzk2i9uM4kmcmGyyev2R5YDs+rafMYZ89RvaGY1mW8T7C5au0TyYaEeHBGng==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^8.0.6", + "@babel/types": "^8.0.6", + "@jridgewell/gen-mapping": "0.4.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.31", + "@types/jsesc": "^2.5.0", + "jsesc": "^3.0.2" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/helper-string-parser": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-8.0.6.tgz", + "integrity": "sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/helper-validator-identifier": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.6.tgz", + "integrity": "sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==", + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/parser": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-8.0.6.tgz", + "integrity": "sha512-LpGDIYJAzc3Y3PT9x+FxBrGYu2PlWxLmyN7SwPTzaX0LSwEmFJBsRnPBqmaXF2r1v+Zhz6lNiEJ+7yKtM5+Ugg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^8.0.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/generator/node_modules/@babel/types": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-8.0.6.tgz", + "integrity": "sha512-c+xgSWboV2pdwXP67BUWDVRHi2BO5Q3KwxyFVs7taVTY+fsK47/L51ZXQoV9rozHJDNHvJ4v4WEsI/IlxV2l2A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^8.0.6", + "@babel/helper-validator-identifier": "^8.0.6" + }, + "engines": { + "node": "^22.18.0 || >=24.11.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@floating-ui/vue": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@floating-ui/vue/-/vue-1.1.11.tgz", + "integrity": "sha512-HzHKCNVxnGS35r9fCHBc3+uCnjw9IWIlCPL683cGgM9Kgj2BiAl8x1mS7vtvP6F9S/e/q4O6MApwSHj8hNLGfw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6", + "@floating-ui/utils": "^0.2.11", + "vue-demi": ">=0.13.0" + } + }, + "node_modules/@floating-ui/vue/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@fontsource/dm-mono": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/dm-mono/-/dm-mono-5.3.0.tgz", + "integrity": "sha512-OINjI8C1S/wpchhQxl7njZdMn4+hnDCpQ4YtvvOpKNARo+0J8O1x1IcrChxNjHOhfVv1by8C/FQoy3hXK+C1Ug==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource/dm-sans": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/dm-sans/-/dm-sans-5.3.0.tgz", + "integrity": "sha512-lYJtMXXO28q1z+yz+z8XKd0s4hXaa9QdkETzkyD760sidCv5heI86weYA0sx0Nc4pAMAQTUuyf4gO44cYKKS9g==", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@internationalized/date": { + "version": "3.12.4", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.4.tgz", + "integrity": "sha512-M1dEn4c1U1HsSlaVR8upZtSqvXrTkHDfv18H01uCSJyjVLDxnBR38v/fMxecmlwXKR4i9HeZcmgQAPE6A+aGJQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.8", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.8.tgz", + "integrity": "sha512-8UmMFia46DUt+k97zKd9fKWXcWHR+k8ae3eYzILETuT2KbIvLyOfac7zesw+sJdRAAZ7Q9pM1Mk22aXp2LD0Ig==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.4.0-beta.0.tgz", + "integrity": "sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.6.0-beta.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lucide/vue": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@lucide/vue/-/vue-1.17.0.tgz", + "integrity": "sha512-6Q1ZHgr5FbmJzKWe5BxlNdjLj2lbmuH1zwDtVzUJofX0w9UREwKgq4F4jwKqFYyyIS4Rj3FiJvDi2k6djukmmw==", + "license": "ISC", + "peerDependencies": { + "vue": ">=3.0.1" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@one-ini/wasm": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", + "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redocly/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js-replace": "^1.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@redocly/config": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.22.0.tgz", + "integrity": "sha512-gAy93Ddo01Z3bHuVdPWfCwzgfaYgMdaZPcfL7JZ7hWJoK9V0lXDbigTWkhiPFAaLWzbOJ+kbUQG1+XwIm0KRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@redocly/openapi-core": { + "version": "1.34.20", + "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.34.20.tgz", + "integrity": "sha512-ypeBZ/6BKXR9+7/TtbKhbl4UgD7raHhPS12oknlKno2A8+lnFkxIwiE/Aklu6L2cd/ioH+fCWuMxi9/p3EyAPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/ajv": "8.11.2", + "@redocly/config": "0.22.0", + "colorette": "1.4.0", + "https-proxy-agent": "7.0.6", + "js-levenshtein": "1.1.6", + "js-yaml": "4.3.2", + "minimatch": "5.1.9", + "pluralize": "8.0.0", + "yaml-ast-parser": "0.0.43" + }, + "engines": { + "node": ">=18.17.0", + "npm": ">=9.5.0" + } + }, + "node_modules/@redocly/openapi-core/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.5.tgz", + "integrity": "sha512-J25QJU+B78T4FhhBsNpLJyVWOi31mwtpcMwywHmOKH65Q9IWGA81gPj+dnwlhU8wktVriYE+tFAaQgrnJRzAZg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.5.tgz", + "integrity": "sha512-LDopB3zuZM5Ux9TT2luNEBJW/tYbGU2g1d+VpKk6I+gSKDb+/7sYE6M225gRQt4RbMX6MSwMsVR/phdjVUgRLg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.5.tgz", + "integrity": "sha512-wlJEERGfeuHeBavCL2qVnNacOK43NDoZM4sjkeRPymd04OAE9T1zBqDJgmZ+CIsPTYKwdzpUC8vmOw84dwY4Tg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.5.tgz", + "integrity": "sha512-4nJJGg5jbo2wwPP4JP+LfEBA3bvP8rU9CLuhp7jWvq9sxEyhjQFTFdrqi+/dHEin/pd8jpT0vcehIpnZtmEdcQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.5.tgz", + "integrity": "sha512-DrZbyCDF1hneuO6jRbvZ2D7+PIBM6yIwYnJpg2vIk58T+wuFpiaGZrfUr59lDWw45bg+IrpTGLPiNi/Fk4w3Cg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.5.tgz", + "integrity": "sha512-gqfUVMJMB3mehqywxp6hTBFfgtMQykZY19+cfiaYP0toIJLb/1DZRJHVkQQGP13W4TAwfZDWeg1qBcheTRioXQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.5.tgz", + "integrity": "sha512-CFmhpvAwzSaWMlN3VN7UtmoTihlZNzoP0juQib5TQRnYUyDV8dXeWOp29sobWAT6gXl/hQgAClLlEiYozQG3OQ==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.5.tgz", + "integrity": "sha512-Uc9H8eXCOayV6JLTH5bXKMId6qbhNHa818/BgYjm4jrlq3vZquC9cqyvHBw17xy5Mnj5f+I3gFK5JcEf3hSqrw==", + "cpu": [ + "arm" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.5.tgz", + "integrity": "sha512-VcPr/szv/1BFw112Kt//fxulXt/JPqzzidU84iW68L2DdjnOO8QFUv2zTSYBEPHD6movBD4z+bbr5y60GYM7Jw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.5.tgz", + "integrity": "sha512-BnxtJ5/91BrIHYIkGrmjz/lbMhqEHt1dPFqIxIFR+jPn0xVc/oUSCtIT089zfp5ufwGDlYz2UC+Fe1SRBpYFbQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.5.tgz", + "integrity": "sha512-LrYcHZwF+fAMNKHYTOQ5osWM4AZF7YF6D+XtsjDyEvljtt11twc+zHVXBLNEjxVSUnKYsOhvVz4Z213eW02COQ==", + "cpu": [ + "loong64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.5.tgz", + "integrity": "sha512-nj7QKQePAAUpCpJHtg0pR0W/b92A9NO17JS3BAQmHDn/yhmkir2p8llrKY9TOhleKIaSzy1JhxS3T9FVld6coA==", + "cpu": [ + "loong64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.5.tgz", + "integrity": "sha512-5ylkX6dWMeBKge9nTU+Rxfb+ZfaCIJ9lRqIFaK0eAMcWp7OJbYnLveLgXmm0VrvuLKb8qIK+mHyH0qu88RM+iA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.5.tgz", + "integrity": "sha512-oHK4ZHYFDKjZviK34I+NwgfbGxgI7ztrNxj2hPTSSNFgeq1a/lEd7dHV2fdGAuTH4Iym3RHJg+vAbWaWG4B7Zg==", + "cpu": [ + "ppc64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.5.tgz", + "integrity": "sha512-UcetmHZ6XOXuUByiKZyQmb55ZPr0LABr3Ec/HB9wKZn6CEAFWZkE+hsJErJ9hbPBC7nI0dKuELx7CoV6IM7TMg==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.5.tgz", + "integrity": "sha512-C5CmDPQBtvjVo8cgQsBs+w6WB0JLkiixhgi6hVLV11hERWdn/p0XcPU2OUcZzac9BPOFq7SbaHFa8r3SWEysCQ==", + "cpu": [ + "riscv64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.5.tgz", + "integrity": "sha512-lHVQHJFKsuuxLMi3MQO9XVL8Tje3JR82CzB+QDKC5NWBcsIWuwsn9uIM5e3lBhI+fF1/s63qnyYqsg65+8rV/w==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.5.tgz", + "integrity": "sha512-3W9bTFcQNJn71cSJVM9RKIiZOy8DO/XLDii8Uv/Pm6WKqDRj7JV3ZfuXIEfyuy5LXpIzAbB/1M4Ukp9GKNa7nA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.5.tgz", + "integrity": "sha512-VDC7rRJlee/scpki96GZ27Omf6yU87s1YXwVTpjE5841faVlDYYT565rgfmoR1U0sqL7z5ivQSDjcsF6VRXyBA==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.5.tgz", + "integrity": "sha512-z86Ok2p4pTdv5xqCKZsTooO7yBEiaJR/HzU3Wx8RmWsPoLppnMKROhJusQob8B3IE1ghC343kUW9rC2r+Wf3ig==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.5.tgz", + "integrity": "sha512-IzQmj+xXwQFGhMAMKMQVXkMwMZN3TqkJgAE0nSsqvVwWWciP4AIPMmWRqOQ2GfX7TUDZr+xqGFcBS36CRPGw0g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.5.tgz", + "integrity": "sha512-F6qpTaPc9bwBH85kjy0/BLmLSW1uv7AoOXCoRIkg2arlgCYlWYcAbiMkvZuAcaWk9TpCRG//okznLAqLGshkMw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.5.tgz", + "integrity": "sha512-igoDsTFhhwECBeGbUuLeIk7t8Y1apa+cs6mDWpx2EZ0ch7oEQgzHbFUXN9euoHekCAQzXdXApAGkV6jznS7tWw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.5.tgz", + "integrity": "sha512-U3teMeMbXFmaM5D+OTJpsOXd+wV/qftIeYF9kBKL4v73641qyJmoXFtA28DQLsnmlyayEsTe72xpLHrArq6vHw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.5.tgz", + "integrity": "sha512-ypfC34F3RKXvCXBglGqGMsUSMKlgwd1HX9AOAlx9RoZZ6GaI42YHVeKpzg3JG+wpBUJYTG+NNZhqbDWL8tBZkw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/helpers": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz", + "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.0.tgz", + "integrity": "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.21.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.0.tgz", + "integrity": "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-arm64": "4.3.0", + "@tailwindcss/oxide-darwin-x64": "4.3.0", + "@tailwindcss/oxide-freebsd-x64": "4.3.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", + "@tailwindcss/oxide-linux-x64-musl": "4.3.0", + "@tailwindcss/oxide-wasm32-wasi": "4.3.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.0.tgz", + "integrity": "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.0.tgz", + "integrity": "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.0.tgz", + "integrity": "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.0.tgz", + "integrity": "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.0.tgz", + "integrity": "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.0.tgz", + "integrity": "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.0.tgz", + "integrity": "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.0.tgz", + "integrity": "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.0.tgz", + "integrity": "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.0.tgz", + "integrity": "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", + "@emnapi/wasi-threads": "^1.2.1", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.0.tgz", + "integrity": "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.0.tgz", + "integrity": "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.0.tgz", + "integrity": "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.0", + "@tailwindcss/oxide": "4.3.0", + "tailwindcss": "4.3.0" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.17.11", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.11.tgz", + "integrity": "sha512-+ILjvtHup6Y2hzQ6YzwMgX1Q+oQpxEGOXCEsCNaPoIP0VxMbizIBTmYTDtkerkIQS8/CbP1BRuyt8V/8BCsy1g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-virtual": { + "version": "3.13.39", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.39.tgz", + "integrity": "sha512-AG8sI+6nfrDvN6ixuHJL9LaJTf3//0V5VITZYW3UOaIuSVexnEzsbMu4LH/JhMfRTxwhUXPnLqkl1DlzkZbRtg==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.17.11" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.0.0" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/jsesc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@types/jsesc/-/jsesc-2.5.1.tgz", + "integrity": "sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.6.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.3.tgz", + "integrity": "sha512-dsqMQQoeTLqu9wynDD00q573mNzso3IdQOAfHRJqLCcmCFPoGo9A1bDpUcv/9tnKpErQWv9uKeGfl37EIS02Yg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.9.0" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-mimetype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", + "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.8.tgz", + "integrity": "sha512-0ZjgOg7oO6farnNGup7yvoM/YXZV84OZxHAwtflItNa/6zzQyVb5LNxyea3FEKEX2XlagIKzrlH7wwxkKgtiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.7.tgz", + "integrity": "sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.7", + "@vitest/utils": "3.2.7", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.7.tgz", + "integrity": "sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.7.tgz", + "integrity": "sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.7.tgz", + "integrity": "sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.7", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.7.tgz", + "integrity": "sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.7", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.7.tgz", + "integrity": "sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.7.tgz", + "integrity": "sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.7", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-macros/common": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.4.tgz", + "integrity": "sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.35.tgz", + "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/shared": "3.5.35", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz", + "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.35.tgz", + "integrity": "sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@vue/compiler-core": "3.5.35", + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz", + "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/devtools-api": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.2.1.tgz", + "integrity": "sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.2.1" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-8.2.1.tgz", + "integrity": "sha512-FIGIuq3AWReEpbAHY/cRGeHDfI0qOb8OCQ3YjbEAX04uaxIDbGc9rhkbVcG7rnfHPXE3RsU5KrWOu9V/okd8AQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.2.1", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-8.2.1.tgz", + "integrity": "sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.3.11.tgz", + "integrity": "sha512-QJmpliwAVpC/OxubIByPAhNzsQPRc8/gxlN2qnVzVfIMjMDz/9RnXRFoetjz5yEgXVXyp4LqhXq3V53PjmNzFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.2.1", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.4" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.35.tgz", + "integrity": "sha512-tVc+SsHConvh/Lz64qq1pP3rYArBmK42xonovEcxY74SQtvctZodG/zhq54P5dr38cVuw25d27cPNRdlMidpGQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.35.tgz", + "integrity": "sha512-A/xFNX9loIcWDygeQuNCfKuh0CoYBzxhqEMNah5TSFg9Z53DrFYEN2qi5CU9necjM1OWYegYREUTHmXTmhfXtg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.35", + "@vue/shared": "3.5.35" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.35.tgz", + "integrity": "sha512-odrJ1C391dbGnyDRh8U+rnP7J2amIEzfmRk5vXy7xi3aZhEXofTvpi0T4HJb6jlNqQZTNPR5MPHSB3RHNkIORA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.35", + "@vue/runtime-core": "3.5.35", + "@vue/shared": "3.5.35", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.35.tgz", + "integrity": "sha512-NkebSOYdB97wi8OQcO3HqzZSlymJi/aWsN/7h74OSVhRTm6qGs3Jp3e0rCXynmWwSlKeRrnlIug+ilYoHBmQDA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.35", + "@vue/shared": "3.5.35" + }, + "peerDependencies": { + "vue": "3.5.35" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.35.tgz", + "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==", + "license": "MIT" + }, + "node_modules/@vue/test-utils": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.4.11.tgz", + "integrity": "sha512-GDqaqZsA6m2E5vNzej0aYiIb6BX8xV9pNSbbbXKOfEYwg7ZNblVX8suyqmUBThq8VIrgAJNxn+z72hVtUeiWHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-beautify": "^1.14.9", + "vue-component-type-helpers": "^3.0.0" + }, + "peerDependencies": { + "@vue/compiler-dom": "3.x", + "@vue/server-renderer": "3.x", + "vue": "3.x" + }, + "peerDependenciesMeta": { + "@vue/server-renderer": { + "optional": true + } + } + }, + "node_modules/@vueuse/core": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.4.0.tgz", + "integrity": "sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.4.0", + "@vueuse/shared": "14.4.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@vueuse/metadata": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.4.0.tgz", + "integrity": "sha512-swx/255R6JyHZFJhx845iz5CRWDZdCfvkZOpACWc5+c5WHcG24mv8gUT1WIdFQaHt6dq79rvILd9QnCWiyVm9g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.4.0.tgz", + "integrity": "sha512-JRgY90Sz8DDtPMsaDflvPMp9xYk69JZAmbuDvAquUVXKr2gEjqtzGNTTthLfckH0BzBqvnu31gb4a8TGLRe79g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/alien-signals": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.2.1.tgz", + "integrity": "sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.4.0.tgz", + "integrity": "sha512-KzTVk2tCWAHtYrvvvaP8bJKJq2pVinhLcGEQdtLIYPbmNGNyYe8QwNaTUYQp2J7/vIsUKt5QCqAfUkYyG9DkOw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", + "integrity": "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.9.0.tgz", + "integrity": "sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@babel/types": "^7.29.0", + "ast-kit": "^2.2.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer-image-size": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/buffer-image-size/-/buffer-image-size-0.6.4.tgz", + "integrity": "sha512-nEh+kZOPY1w+gcCMobZ6ETUp9WfibndnosbpwB1iJk/8Gt5ZF2bhS6+B6bPYz424KtwsR6Rflc3tCz1/ghX2dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/confbox": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.3.1.tgz", + "integrity": "sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/editorconfig": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.7.tgz", + "integrity": "sha512-e0GOtq/aTQhVdNyDU9e02+wz9oDDM+SIOQxWME2QRjzRX5yyLAuHDE+0aE8vHb9XRC8XD37eO2u57+F09JqFhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@one-ini/wasm": "0.1.1", + "commander": "^10.0.0", + "minimatch": "^9.0.1", + "semver": "^7.5.3" + }, + "bin": { + "editorconfig": "bin/editorconfig" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.25.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", + "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exsolve": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz", + "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/happy-dom": { + "version": "20.11.6", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.11.6.tgz", + "integrity": "sha512-Hldbg8AdAa5a5oDcZpjqnGitp7JB0hqWmfv/8qr+kft4vzSD8BHsbdRfzYvL/0QcbKcURC/yyoygbeDQarPvYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": ">=20.0.0", + "@types/whatwg-mimetype": "^3.0.2", + "@types/ws": "^8.18.1", + "buffer-image-size": "^0.6.4", + "entities": "^7.0.1", + "whatwg-mimetype": "^3.0.0", + "ws": "^8.21.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/index-to-position": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz", + "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-beautify": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz", + "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "config-chain": "^1.1.13", + "editorconfig": "^1.0.4", + "glob": "^10.4.2", + "js-cookie": "^3.0.5", + "nopt": "^7.2.1" + }, + "bin": { + "css-beautify": "js/bin/css-beautify.js", + "html-beautify": "js/bin/html-beautify.js", + "js-beautify": "js/bin/js-beautify.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/js-cookie": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz", + "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "devOptional": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/local-pkg": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", + "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-1.0.3.tgz", + "integrity": "sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.19" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ohash": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.12.tgz", + "integrity": "sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==", + "license": "MIT" + }, + "node_modules/openapi-fetch": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/openapi-fetch/-/openapi-fetch-0.17.0.tgz", + "integrity": "sha512-PsbZR1wAPcG91eEthKhN+Zn92FMHxv+/faECIwjXdxfTODGSGegYv0sc1Olz+HYPvKOuoXfp+0pA2XVt2cI0Ig==", + "license": "MIT", + "dependencies": { + "openapi-typescript-helpers": "^0.1.0" + } + }, + "node_modules/openapi-typescript": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.13.0.tgz", + "integrity": "sha512-EFP392gcqXS7ntPvbhBzbF8TyBA+baIYEm791Hy5YkjDYKTnk/Tn5OQeKm5BIZvJihpp8Zzr4hzx0Irde1LNGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@redocly/openapi-core": "^1.34.6", + "ansi-colors": "^4.1.3", + "change-case": "^5.4.4", + "parse-json": "^8.3.0", + "supports-color": "^10.2.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "openapi-typescript": "bin/cli.js" + }, + "peerDependencies": { + "typescript": "^5.x" + } + }, + "node_modules/openapi-typescript-helpers": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/openapi-typescript-helpers/-/openapi-typescript-helpers-0.1.0.tgz", + "integrity": "sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw==", + "license": "MIT" + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-json": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz", + "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "index-to-position": "^1.1.0", + "type-fest": "^4.39.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.3.tgz", + "integrity": "sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w==", + "license": "MIT", + "dependencies": { + "confbox": "^0.3.1", + "exsolve": "^1.1.1", + "pathe": "^2.0.3" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true, + "license": "ISC" + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", + "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reka-ui": { + "version": "2.9.10", + "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.9.10.tgz", + "integrity": "sha512-yuvZVTp4fWH2G3qk+ze/x6YYlyc2Xl1d+eMUlIYrKqzTowBKteoDoN17fitURmqSUck3mc7JbcYgp49DnGu2EQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.13", + "@floating-ui/vue": "^1.1.6", + "@internationalized/date": "^3.5.0", + "@internationalized/number": "^3.5.0", + "@tanstack/vue-virtual": "^3.12.0", + "@vueuse/core": "^14.1.0", + "@vueuse/shared": "^14.1.0", + "aria-hidden": "^1.2.4", + "defu": "^6.1.5", + "ohash": "^2.0.11" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/zernonia" + }, + "peerDependencies": { + "vue": ">= 3.4.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.63.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.5.tgz", + "integrity": "sha512-KRWwmNLlPw5M7HcdYfm15oBv9n9LPtjzpzCIxS/phwqvPyxHSoKX6Y2YU3pxSPfy0CLquVgsx/j/hBi6OvH1Nw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.5", + "@rollup/rollup-android-arm64": "4.63.5", + "@rollup/rollup-darwin-arm64": "4.63.5", + "@rollup/rollup-darwin-x64": "4.63.5", + "@rollup/rollup-freebsd-arm64": "4.63.5", + "@rollup/rollup-freebsd-x64": "4.63.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.5", + "@rollup/rollup-linux-arm-musleabihf": "4.63.5", + "@rollup/rollup-linux-arm64-gnu": "4.63.5", + "@rollup/rollup-linux-arm64-musl": "4.63.5", + "@rollup/rollup-linux-loong64-gnu": "4.63.5", + "@rollup/rollup-linux-loong64-musl": "4.63.5", + "@rollup/rollup-linux-ppc64-gnu": "4.63.5", + "@rollup/rollup-linux-ppc64-musl": "4.63.5", + "@rollup/rollup-linux-riscv64-gnu": "4.63.5", + "@rollup/rollup-linux-riscv64-musl": "4.63.5", + "@rollup/rollup-linux-s390x-gnu": "4.63.5", + "@rollup/rollup-linux-x64-gnu": "4.63.5", + "@rollup/rollup-linux-x64-musl": "4.63.5", + "@rollup/rollup-openbsd-x64": "4.63.5", + "@rollup/rollup-openharmony-arm64": "4.63.5", + "@rollup/rollup-win32-arm64-msvc": "4.63.5", + "@rollup/rollup-win32-ia32-msvc": "4.63.5", + "@rollup/rollup-win32-x64-gnu": "4.63.5", + "@rollup/rollup-win32-x64-msvc": "4.63.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", + "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.6.tgz", + "integrity": "sha512-u8KszXvGfU68hVcZpRHKG28T0krMuv2G5nDhiHaMLen/gIuFEgIJhaJuO69qjnXg5paSrbPMFfx3brNuN8eVSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", + "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/unplugin": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-3.4.0.tgz", + "integrity": "sha512-9skdIFlCsPdFV7wUfZxNsFInlW+7nJmGu2gkTu0OUhF56aXGsHab9x52/QhdJ4lC7ZDPWTxbiC4ANqVlsuaW3w==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.7", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@farmfe/core": "*", + "@rsbuild/core": "*", + "@rspack/core": "*", + "bun-types-no-globals": "*", + "esbuild": "*", + "rolldown": "*", + "rollup": "*", + "unloader": "*", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "@farmfe/core": { + "optional": true + }, + "@rsbuild/core": { + "optional": true + }, + "@rspack/core": { + "optional": true + }, + "bun-types-no-globals": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + }, + "unloader": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.2.tgz", + "integrity": "sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/uri-js-replace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", + "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.5.tgz", + "integrity": "sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.7.tgz", + "integrity": "sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.7", + "@vitest/mocker": "3.2.7", + "@vitest/pretty-format": "^3.2.7", + "@vitest/runner": "3.2.7", + "@vitest/snapshot": "3.2.7", + "@vitest/spy": "3.2.7", + "@vitest/utils": "3.2.7", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.7", + "@vitest/ui": "3.2.7", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", + "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.35", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.35.tgz", + "integrity": "sha512-cx89fnr+0kVGHiNFG6y6s0bdjypJRFNZn6x3WPstNdQR1bi1mbB7h4v5IBGTsPJU3nK1+0Iqj3Zf+hZWMieR4Q==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.35", + "@vue/compiler-sfc": "3.5.35", + "@vue/runtime-dom": "3.5.35", + "@vue/server-renderer": "3.5.35", + "@vue/shared": "3.5.35" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-component-type-helpers": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-3.3.11.tgz", + "integrity": "sha512-LwcxzeliO9fkQcpJG0PoX8X5kmAhKmH9wkpDLxNabwzkQ9Zeib2YVHwFV4pcWmMLfXVfjr/dSV+DaJ3cIPgSNA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-router": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.1.0.tgz", + "integrity": "sha512-HAbiLzLEHQwxPgvsbOJDAwtavszEgLwri6XfyrsPECIFez8+59xc9LofWVdc/HEaSRT822lJ8H9Ns38VVond5g==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^8.0.0-rc.4", + "@vue-macros/common": "^3.1.1", + "@vue/devtools-api": "^8.1.2", + "ast-walker-scope": "^0.9.0", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.2", + "muggle-string": "^0.4.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "scule": "^1.3.0", + "tinyglobby": "^0.2.16", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1", + "yaml": "^2.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": ">=0.21.2", + "@vue/compiler-sfc": "^3.5.34", + "pinia": "^3.0.4", + "vite": "^7.0.0 || ^8.0.0", + "vue": "^3.5.34" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.3.11.tgz", + "integrity": "sha512-gOb0B9rtU2+f1dszwPqSH5kAieIF9ReeLhD3kSRNHv5WZZUQz/JdVXW0RTdqhNTMlQkqKzrTTviqKr/4FYZraQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.28", + "@vue/language-core": "3.3.11" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ws": { + "version": "8.22.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.0.tgz", + "integrity": "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yaml": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yaml-ast-parser": { + "version": "0.0.43", + "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", + "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + } + } +} diff --git a/admin/package.json b/admin/package.json new file mode 100644 index 0000000..c910fa3 --- /dev/null +++ b/admin/package.json @@ -0,0 +1,36 @@ +{ + "name": "summercms-admin", + "private": true, + "type": "module", + "engines": { + "node": ">=22.6" + }, + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "typecheck": "vue-tsc --noEmit", + "test": "vitest run", + "gen:api": "openapi-typescript openapi/admin.json -o src/api/schema.d.ts" + }, + "dependencies": { + "@fontsource/dm-mono": "5.3.0", + "@fontsource/dm-sans": "5.3.0", + "@lucide/vue": "1.17.0", + "openapi-fetch": "0.17.0", + "reka-ui": "2.9.10", + "vue": "3.5.35", + "vue-router": "5.1.0" + }, + "devDependencies": { + "@tailwindcss/vite": "4.3.0", + "@vitejs/plugin-vue": "6.0.8", + "@vue/test-utils": "2.4.11", + "happy-dom": "20.11.6", + "openapi-typescript": "7.13.0", + "tailwindcss": "4.3.0", + "typescript": "5.9.3", + "vite": "7.3.5", + "vitest": "3.2.7", + "vue-tsc": "3.3.11" + } +} diff --git a/admin/src/App.vue b/admin/src/App.vue new file mode 100644 index 0000000..a63b032 --- /dev/null +++ b/admin/src/App.vue @@ -0,0 +1,15 @@ + + + diff --git a/admin/src/api/client.ts b/admin/src/api/client.ts new file mode 100644 index 0000000..f0489c2 --- /dev/null +++ b/admin/src/api/client.ts @@ -0,0 +1,44 @@ +// The only HTTP client of the SPA: openapi-fetch typed by the generated +// paths (D-15). Every request carries X-Requested-With (the CSRF header the +// admin API requires on state-changing cookie requests, D-19) and same-origin +// credentials; the JWT lives in an HttpOnly cookie the SPA never reads. +import createClient, { type Middleware } from 'openapi-fetch' +import type { paths } from './schema' +import { runtime } from '../app/runtime' + +export const REQUESTED_WITH = 'XMLHttpRequest' + +type UnauthorizedHandler = () => void + +let unauthorizedHandler: UnauthorizedHandler | null = null + +/** Registers what happens when an API call other than login returns 401. */ +export function onUnauthorized(handler: UnauthorizedHandler | null): void { + unauthorizedHandler = handler +} + +function isLoginRequest(request: Request): boolean { + return new URL(request.url, 'http://local').pathname.endsWith('/auth/login') +} + +export const transport: Middleware = { + onRequest({ request }) { + request.headers.set('X-Requested-With', REQUESTED_WITH) + return request + }, + onResponse({ request, response }) { + if (response.status === 401 && !isLoginRequest(request)) { + unauthorizedHandler?.() + } + return response + }, +} + +export const api = createClient({ + baseUrl: runtime.api, + credentials: 'same-origin', + // Resolve fetch per call so tests can replace globalThis.fetch. + fetch: (request: Request) => globalThis.fetch(request), +}) + +api.use(transport) diff --git a/admin/src/api/schema.d.ts b/admin/src/api/schema.d.ts new file mode 100644 index 0000000..ad07c17 --- /dev/null +++ b/admin/src/api/schema.d.ts @@ -0,0 +1,1532 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/auth/login": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Admin login */ + post: { + parameters: { + query?: never; + header?: { + /** @description XMLHttpRequest selects cookie transport */ + "X-Requested-With"?: string; + }; + path?: never; + cookie?: never; + }; + /** @description Credentials */ + requestBody: { + content: { + "application/json": components["schemas"]["cabana.AdminLoginRequest"]; + }; + }; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.Envelope-cabana_AdminLoginData"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/logout": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Admin logout */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/me": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Current admin */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.Envelope-cabana_AdminProfile"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/auth/refresh": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Refresh an admin token */ + post: { + parameters: { + query?: never; + header?: { + /** @description XMLHttpRequest; required unless a Bearer token is sent */ + "X-Requested-With"?: string; + }; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.Envelope-cabana_AdminLoginData"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/navigation": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Admin navigation */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.Envelope-array_cabana_NavigationEntry"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/settings": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List admin settings */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/settings/{code}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Read admin settings */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Settings code */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + /** Update admin settings */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Settings code */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Unprocessable Entity */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/settings/{code}/schema": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Admin settings schema */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Settings code */ + code: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{vendor}/{plugin}/{controller}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List admin records */ + get: { + parameters: { + query?: { + /** @description Search term */ + search?: string; + /** @description Sort column */ + sort?: string; + /** @description Sort direction (asc or desc) */ + dir?: string; + /** @description Page */ + page?: number; + /** @description Records per page */ + per_page?: number; + }; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ListEnvelope-array_cabana_AdminRecord"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Unprocessable Entity */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + put?: never; + /** Create an admin record */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Unprocessable Entity */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{vendor}/{plugin}/{controller}/bulk-delete": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Bulk-delete admin records */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Unprocessable Entity */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{vendor}/{plugin}/{controller}/schema/form": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Admin form schema */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{vendor}/{plugin}/{controller}/schema/list": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Admin list schema */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.Envelope-cabana_ListSchema"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{vendor}/{plugin}/{controller}/schema/relation/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Admin relation schema */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + /** @description Relation name */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{vendor}/{plugin}/{controller}/{id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Show an admin record */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + /** @description Record id */ + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + /** Update an admin record */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + /** @description Record id */ + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Unprocessable Entity */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + post?: never; + /** Delete an admin record */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + /** @description Record id */ + id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{vendor}/{plugin}/{controller}/{id}/relations/{name}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List linked relation records */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + /** @description Owner id */ + id: number; + /** @description Relation name */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{vendor}/{plugin}/{controller}/{id}/relations/{name}/candidates": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List relation candidates */ + get: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + /** @description Owner id */ + id: number; + /** @description Relation name */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{vendor}/{plugin}/{controller}/{id}/relations/{name}/link": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Link relation records */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + /** @description Owner id */ + id: number; + /** @description Relation name */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Unprocessable Entity */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/{vendor}/{plugin}/{controller}/{id}/relations/{name}/unlink": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Unlink relation records */ + post: { + parameters: { + query?: never; + header?: never; + path: { + /** @description Vendor */ + vendor: string; + /** @description Plugin */ + plugin: string; + /** @description Controller */ + controller: string; + /** @description Owner id */ + id: number; + /** @description Relation name */ + name: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description OK */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.SuccessEnvelope"]; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + /** @description Unprocessable Entity */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["cabana.ErrorEnvelope"]; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: { + "cabana.AdminLoginData": { + access_token?: string; + expires_in?: number; + token_type: string; + }; + "cabana.AdminLoginRequest": { + email?: string; + login?: string; + password: string; + }; + "cabana.AdminProfile": { + email: string; + first_name: string; + id: number; + is_superuser: boolean; + last_name: string; + login: string; + role?: components["schemas"]["cabana.AdminRoleSummary"]; + }; + "cabana.AdminRoleSummary": { + code: string; + id: number; + name: string; + }; + "cabana.BulkAction": { + label?: string; + name: string; + }; + "cabana.Envelope-array_cabana_NavigationEntry": { + data: components["schemas"]["cabana.NavigationEntry"][]; + meta: components["schemas"]["cabana.SuccessMeta"]; + }; + "cabana.Envelope-cabana_AdminLoginData": { + data: components["schemas"]["cabana.AdminLoginData"]; + meta: components["schemas"]["cabana.SuccessMeta"]; + }; + "cabana.Envelope-cabana_AdminProfile": { + data: components["schemas"]["cabana.AdminProfile"]; + meta: components["schemas"]["cabana.SuccessMeta"]; + }; + "cabana.Envelope-cabana_ListSchema": { + data: components["schemas"]["cabana.ListSchema"]; + meta: components["schemas"]["cabana.SuccessMeta"]; + }; + "cabana.ErrorBody": { + code: string; + details: { + [key: string]: unknown; + }; + message: string; + }; + "cabana.ErrorEnvelope": { + error: components["schemas"]["cabana.ErrorBody"]; + }; + "cabana.FormMeta": { + locale: string; + }; + "cabana.FormOption": { + label: string; + value: components["schemas"]["cabana.jsonScalar"]; + }; + "cabana.ListColumn": { + key: string; + label: string; + relation?: string; + searchable: boolean; + select?: string; + sortable: boolean; + type?: string; + }; + "cabana.ListEnvelope-array_cabana_AdminRecord": { + data: { + [key: string]: unknown; + }[]; + meta: components["schemas"]["cabana.ListMeta"]; + }; + "cabana.ListFilter": { + column?: string; + falseValue?: components["schemas"]["cabana.jsonScalar"]; + label?: string; + modelClass?: string; + name: string; + nameFrom?: string; + options?: components["schemas"]["cabana.FormOption"][]; + scope?: string; + trueValue?: components["schemas"]["cabana.jsonScalar"]; + type: string; + }; + "cabana.ListMeta": { + last_page: number; + page: number; + per_page: number; + total: number; + }; + "cabana.ListSchema": { + bulkActions: components["schemas"]["cabana.BulkAction"][]; + columns: components["schemas"]["cabana.ListColumn"][]; + defaultSort?: components["schemas"]["cabana.ListSort"]; + filters: components["schemas"]["cabana.ListFilter"][]; + meta?: components["schemas"]["cabana.FormMeta"]; + modelClass?: string; + noRecordsMessage?: string; + perPageOptions: number[]; + recordUrl?: string; + recordsPerPage: number; + rowActions: components["schemas"]["cabana.RowAction"][]; + searchPrompt?: string; + searchTerm: string; + showCheckboxes: boolean; + showSearch: boolean; + showSetup: boolean; + showSorting: boolean; + title?: string; + toolbarButtons: string[]; + }; + "cabana.ListSort": { + column: string; + direction: string; + }; + "cabana.NavigationEntry": { + code: string; + controller: string; + icon: string; + label: string; + order: number; + sideMenu: components["schemas"]["cabana.NavigationEntry"][]; + }; + "cabana.RowAction": { + label?: string; + name: string; + url?: string; + }; + "cabana.SuccessEnvelope": { + data: unknown; + meta: components["schemas"]["cabana.SuccessMeta"]; + }; + "cabana.SuccessMeta": { + last_page?: number; + locale?: string; + page?: number; + per_page?: number; + total?: number; + }; + "cabana.jsonScalar": (string | number | boolean) | null; + }; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export type operations = Record; diff --git a/admin/src/api/types.ts b/admin/src/api/types.ts new file mode 100644 index 0000000..de63f05 --- /dev/null +++ b/admin/src/api/types.ts @@ -0,0 +1,16 @@ +// Aliases onto the generated OpenAPI schema (D-15, D-16). No API shape is +// written by hand: every type here points at components['schemas']. +import type { components } from './schema' + +type Schemas = components['schemas'] + +export type AdminLoginData = Schemas['cabana.AdminLoginData'] +export type AdminLoginRequest = Schemas['cabana.AdminLoginRequest'] +export type AdminProfile = Schemas['cabana.AdminProfile'] +export type NavigationEntry = Schemas['cabana.NavigationEntry'] +export type ListSchema = Schemas['cabana.ListSchema'] +export type ListColumn = Schemas['cabana.ListColumn'] +export type ListMeta = Schemas['cabana.ListMeta'] +export type ErrorEnvelope = Schemas['cabana.ErrorEnvelope'] +/** One record: a string-keyed map read through its list or form schema. */ +export type AdminRecord = Schemas['cabana.ListEnvelope-array_cabana_AdminRecord']['data'][number] diff --git a/admin/src/app/controllerRoutes.ts b/admin/src/app/controllerRoutes.ts new file mode 100644 index 0000000..03b0056 --- /dev/null +++ b/admin/src/app/controllerRoutes.ts @@ -0,0 +1,42 @@ +// Controller IDs map one to one onto SPA paths (D-10): +// vendor.plugin.controller <-> /vendor/plugin/controller. +export interface ControllerParams { + vendor: string + plugin: string + controller: string +} + +const SEGMENT = /^[A-Za-z0-9_-]+$/ + +export function parseControllerId(id: string): ControllerParams | null { + const parts = id.split('.') + if (parts.length !== 3 || !parts.every((part) => SEGMENT.test(part))) { + return null + } + const [vendor, plugin, controller] = parts as [string, string, string] + return { vendor, plugin, controller } +} + +export function controllerPath(id: string): string | null { + const params = parseControllerId(id) + return params ? `/${params.vendor}/${params.plugin}/${params.controller}` : null +} + +export function controllerIdFromParams(params: ControllerParams): string { + return `${params.vendor}.${params.plugin}.${params.controller}` +} + +export function controllerIdFromPath(path: string): string | null { + const parts = path.replace(/^\/+|\/+$/g, '').split('/') + if (parts.length < 3) { + return null + } + const id = parts.slice(0, 3).join('.') + return parseControllerId(id) ? id : null +} + +/** vendor.plugin prefix of a controller ID, used to find the owning plugin. */ +export function pluginKey(id: string): string | null { + const params = parseControllerId(id) + return params ? `${params.vendor}.${params.plugin}` : null +} diff --git a/admin/src/app/i18n.ts b/admin/src/app/i18n.ts new file mode 100644 index 0000000..03ad1b3 --- /dev/null +++ b/admin/src/app/i18n.ts @@ -0,0 +1,42 @@ +// UI strings (D-20). The resolved backend::lang bundle is loaded from the +// server in a later plan; until a key is loaded, t() returns the key itself, +// mirroring phrasebook's missing-key fallback. Placeholders use phrasebook's +// :name syntax with :Name and :NAME casing variants (D-24). +import { ref } from 'vue' + +type Forms = Record + +const bundle = ref>({}) + +export function setBundle(next: Record): void { + bundle.value = next +} + +export function interpolate(text: string, params: Record = {}): string { + const replacements: Array<[string, string]> = [] + for (const [rawName, raw] of Object.entries(params)) { + const name = rawName.replace(/^:/, '') + if (name === '') { + continue + } + const value = String(raw) + replacements.push([`:${name.charAt(0).toUpperCase()}${name.slice(1)}`, value.charAt(0).toUpperCase() + value.slice(1)]) + replacements.push([`:${name.toUpperCase()}`, value.toUpperCase()]) + replacements.push([`:${name}`, value]) + } + replacements.sort((a, b) => b[0].length - a[0].length) + let out = text + for (const [placeholder, value] of replacements) { + out = out.split(placeholder).join(value) + } + return out +} + +export function t(key: string, params: Record = {}): string { + const forms = bundle.value[key] + const text = forms?.other + if (text === undefined) { + return key + } + return interpolate(text, params) +} diff --git a/admin/src/app/icons.ts b/admin/src/app/icons.ts new file mode 100644 index 0000000..b1d8255 --- /dev/null +++ b/admin/src/app/icons.ts @@ -0,0 +1,111 @@ +// Navigation icons (D-11). The registry stores lucide names; ported Winter +// plugins may still send icon-* names, which map onto lucide equivalents. +// Named imports only: a namespace import would bundle every lucide icon. +import type { Component } from 'vue' +import { + Archive, + ArrowDown, + ArrowLeft, + ArrowRight, + ArrowUp, + ArrowUpRight, + CassetteTape, + Check, + ChevronDown, + ChevronLeft, + ChevronRight, + Circle, + CircleAlert, + Disc, + Disc3, + Image, + Library, + List, + LogOut, + MicVocal, + Minus, + Palette, + PanelLeftClose, + PanelLeftOpen, + Plus, + Puzzle, + Search, + SearchX, + Settings, + ShieldCheck, + Square, + Sun, + Tags, + Trash2, + User, + UserMinus, + UserPlus, + Users, + UsersRound, + X, +} from '@lucide/vue' + +export const icons: Readonly> = { + archive: Archive, + 'arrow-down': ArrowDown, + 'arrow-left': ArrowLeft, + 'arrow-right': ArrowRight, + 'arrow-up': ArrowUp, + 'arrow-up-right': ArrowUpRight, + 'cassette-tape': CassetteTape, + check: Check, + 'chevron-down': ChevronDown, + 'chevron-left': ChevronLeft, + 'chevron-right': ChevronRight, + circle: Circle, + 'circle-alert': CircleAlert, + disc: Disc, + 'disc-3': Disc3, + image: Image, + library: Library, + list: List, + 'log-out': LogOut, + 'mic-vocal': MicVocal, + minus: Minus, + palette: Palette, + 'panel-left-close': PanelLeftClose, + 'panel-left-open': PanelLeftOpen, + plus: Plus, + puzzle: Puzzle, + search: Search, + 'search-x': SearchX, + settings: Settings, + 'shield-check': ShieldCheck, + sun: Sun, + tags: Tags, + 'trash-2': Trash2, + user: User, + 'user-minus': UserMinus, + 'user-plus': UserPlus, + users: Users, + 'users-round': UsersRound, + x: X, +} + +/** Winter backend icon classes mapped to lucide names. */ +export const winterIcons: Readonly> = { + 'icon-archive': 'archive', + 'icon-circle': 'circle', + 'icon-list-ul': 'list', + 'icon-tags': 'tags', + 'icon-user': 'user', + 'icon-search': 'search', + 'icon-cog': 'settings', + 'icon-users': 'users', +} + +/** Neutral icon for names neither lucide map knows. */ +export const fallbackIcon: Component = Square + +export function iconFor(name: string | null | undefined): Component { + if (!name) { + return fallbackIcon + } + const key = name.trim() + return icons[key] ?? icons[winterIcons[key] ?? ''] ?? fallbackIcon +} diff --git a/admin/src/app/router.ts b/admin/src/app/router.ts new file mode 100644 index 0000000..f8440cd --- /dev/null +++ b/admin/src/app/router.ts @@ -0,0 +1,63 @@ +import { createRouter, createWebHistory, type RouterHistory } from 'vue-router' +import { runtime } from './runtime' +import { currentUser } from '../state/useAuth' +import { homePath } from '../state/useNavigation' +import LoginView from '../views/LoginView.vue' +import ListView from '../views/ListView.vue' +import NotFoundView from '../views/NotFoundView.vue' + +declare module 'vue-router' { + interface RouteMeta { + /** Reachable without a session. */ + public?: boolean + /** Rendered inside the navigation shell. */ + shell?: boolean + } +} + +/** + * Accepts a post-login redirect only when it is an in-app path: it must start + * with exactly one slash, which rejects absolute and protocol-relative URLs. + */ +export function safeRedirect(value: unknown): string | null { + if (typeof value !== 'string' || value.length === 0) { + return null + } + if (!value.startsWith('/') || value.startsWith('//') || value.startsWith('/\\')) { + return null + } + return value +} + +export function createAdminRouter(history: RouterHistory = createWebHistory(runtime.base)) { + const router = createRouter({ + history, + routes: [ + { path: '/login', name: 'login', component: LoginView, meta: { public: true } }, + { + path: '/', + name: 'home', + component: NotFoundView, + props: { home: true }, + meta: { shell: true }, + beforeEnter: () => homePath() ?? true, + }, + { path: '/:vendor/:plugin/:controller', name: 'list', component: ListView, meta: { shell: true } }, + { path: '/:pathMatch(.*)*', name: 'not-found', component: NotFoundView, meta: { shell: true } }, + ], + }) + router.beforeEach((to) => { + const signedIn = currentUser.value !== null + if (to.meta.public) { + if (signedIn && to.name === 'login') { + return safeRedirect(to.query.redirect) ?? '/' + } + return true + } + if (!signedIn) { + return { name: 'login', query: { redirect: to.fullPath } } + } + return true + }) + return router +} diff --git a/admin/src/app/runtime.ts b/admin/src/app/runtime.ts new file mode 100644 index 0000000..313fc8d --- /dev/null +++ b/admin/src/app/runtime.ts @@ -0,0 +1,23 @@ +// Runtime configuration read once from the served index.html. The Go server +// (boardwalk) writes the configured backend.uri into the summer-admin-base +// meta; the SPA derives its router base and API base from it (D-02, D-03). +export const DEFAULT_BASE = '/backend' +const TOKEN = '__SUMMER_ADMIN_BASE__' + +export function readBase(doc: Document = document): string { + const content = doc.querySelector('meta[name="summer-admin-base"]')?.content.trim() ?? '' + if (content === '' || content === TOKEN || !content.startsWith('/')) { + return DEFAULT_BASE + } + const trimmed = content.replace(/\/+$/, '') + return trimmed === '' ? DEFAULT_BASE : trimmed +} + +const base = readBase() + +export const runtime = { + /** Admin mount path, for example /backend. */ + base, + /** Admin API root, the mount path plus /api/v1. */ + api: `${base}/api/v1`, +} as const diff --git a/admin/src/components/list/DataTable.vue b/admin/src/components/list/DataTable.vue new file mode 100644 index 0000000..2ded6d8 --- /dev/null +++ b/admin/src/components/list/DataTable.vue @@ -0,0 +1,85 @@ + + + diff --git a/admin/src/components/shell/AppShell.vue b/admin/src/components/shell/AppShell.vue new file mode 100644 index 0000000..26066a6 --- /dev/null +++ b/admin/src/components/shell/AppShell.vue @@ -0,0 +1,72 @@ + + + diff --git a/admin/src/components/shell/PluginRail.vue b/admin/src/components/shell/PluginRail.vue new file mode 100644 index 0000000..f08ea68 --- /dev/null +++ b/admin/src/components/shell/PluginRail.vue @@ -0,0 +1,43 @@ + + + diff --git a/admin/src/components/shell/SectionPanel.vue b/admin/src/components/shell/SectionPanel.vue new file mode 100644 index 0000000..1035d34 --- /dev/null +++ b/admin/src/components/shell/SectionPanel.vue @@ -0,0 +1,45 @@ + + + diff --git a/admin/src/main.ts b/admin/src/main.ts new file mode 100644 index 0000000..0b1925f --- /dev/null +++ b/admin/src/main.ts @@ -0,0 +1,30 @@ +import { createApp } from 'vue' +import App from './App.vue' +import { createAdminRouter } from './app/router' +import { onUnauthorized } from './api/client' +import { clearUser, me } from './state/useAuth' +import { loadNavigation } from './state/useNavigation' +import './styles/main.css' + +async function boot(): Promise { + // A 401 here only means "not signed in"; the router guard sends the + // visitor to the login route with the requested path as redirect. + const user = await me().catch(() => null) + if (user) { + await loadNavigation().catch(() => []) + } + const router = createAdminRouter() + onUnauthorized(() => { + clearUser() + const current = router.currentRoute.value + if (current.name !== 'login') { + void router.push({ name: 'login', query: { redirect: current.fullPath } }) + } + }) + const app = createApp(App) + app.use(router) + await router.isReady() + app.mount('#app') +} + +void boot() diff --git a/admin/src/state/useAuth.ts b/admin/src/state/useAuth.ts new file mode 100644 index 0000000..cf7b4ce --- /dev/null +++ b/admin/src/state/useAuth.ts @@ -0,0 +1,44 @@ +// Admin session state. The JWT travels in an HttpOnly cookie (D-19): the SPA +// keeps only the profile and the access lifetime, never a token. +import { readonly, ref } from 'vue' +import { api } from '../api/client' +import type { AdminProfile } from '../api/types' + +const user = ref(null) +const expiresIn = ref(null) + +export const currentUser = readonly(user) + +/** Logs in over cookie transport. Returns false on invalid credentials. */ +export async function login(identifier: string, password: string): Promise { + const { data, response } = await api.POST('/auth/login', { + body: { login: identifier, password }, + }) + if (!response.ok || !data) { + return false + } + expiresIn.value = typeof data.data.expires_in === 'number' ? data.data.expires_in : null + return true +} + +/** Loads the signed-in admin; null when the session is missing or expired. */ +export async function me(): Promise { + const { data, response } = await api.GET('/auth/me') + user.value = response.ok && data ? data.data : null + return user.value +} + +export function clearUser(): void { + user.value = null + expiresIn.value = null +} + +export function useAuth() { + return { + user: currentUser, + expiresIn: readonly(expiresIn), + login, + me, + clearUser, + } +} diff --git a/admin/src/state/useNavigation.ts b/admin/src/state/useNavigation.ts new file mode 100644 index 0000000..d5bb45d --- /dev/null +++ b/admin/src/state/useNavigation.ts @@ -0,0 +1,65 @@ +// Server-filtered navigation (D-10). The server removes items the admin may +// not open; the rail also omits a plugin whose side menu ends up empty. +import { computed, readonly, ref } from 'vue' +import { api } from '../api/client' +import type { NavigationEntry } from '../api/types' +import { controllerPath, pluginKey } from '../app/controllerRoutes' + +const entries = ref([]) + +export const navigation = readonly(entries) + +export async function loadNavigation(): Promise { + const { data, response } = await api.GET('/navigation') + entries.value = response.ok && data ? data.data : [] + return entries.value +} + +export function setNavigation(next: NavigationEntry[]): void { + entries.value = next +} + +/** Rail entries: plugins with at least one permitted side-menu item, by order. */ +export const railEntries = computed(() => + entries.value + .filter((entry) => entry.sideMenu.length > 0) + .map((entry, index) => ({ entry, index })) + .sort((a, b) => a.entry.order - b.entry.order || a.index - b.index) + .map(({ entry }) => entry), +) + +/** Path of the plugin's first permitted side-menu controller. */ +export function firstControllerPath(entry: NavigationEntry): string | null { + for (const item of entry.sideMenu) { + const path = controllerPath(item.controller) + if (path) { + return path + } + } + return controllerPath(entry.controller) +} + +/** The rail entry owning a route's vendor and plugin segments. */ +export function activeEntry(vendor: string, plugin: string): NavigationEntry | null { + const key = `${vendor}.${plugin}` + return ( + railEntries.value.find( + (entry) => pluginKey(entry.controller) === key || entry.sideMenu.some((item) => pluginKey(item.controller) === key), + ) ?? null + ) +} + +/** Where "/" lands: the first plugin's first controller. */ +export function homePath(): string | null { + for (const entry of railEntries.value) { + const path = firstControllerPath(entry) + if (path) { + return path + } + } + return null +} + +export function useNavigation() { + return { navigation, railEntries, loadNavigation, firstControllerPath, activeEntry, homePath } +} diff --git a/admin/src/styles/main.css b/admin/src/styles/main.css new file mode 100644 index 0000000..312a4d5 --- /dev/null +++ b/admin/src/styles/main.css @@ -0,0 +1,160 @@ +@import "tailwindcss"; + +/* Self-hosted fonts (D-07). Whole-weight files carry latin and latin-ext with + unicode-range, so Polish diacritics and basic Latin both resolve. */ +@import "@fontsource/dm-sans/400.css"; +@import "@fontsource/dm-sans/500.css"; +@import "@fontsource/dm-sans/600.css"; +@import "@fontsource/dm-sans/700.css"; +@import "@fontsource/dm-mono/400.css"; +@import "@fontsource/dm-mono/500.css"; + +@custom-variant dark (&:where(.dark, .dark *)); + +/* Design tokens from design/README.md (Direction C v2). Utilities read CSS + variables so light and dark mode swap values without new classes. */ +@theme { + --font-sans: "DM Sans", ui-sans-serif, system-ui, sans-serif; + --font-mono: "DM Mono", ui-monospace, monospace; + + --color-bg: var(--c-bg); + --color-surface: var(--c-surface); + --color-subtle: var(--c-subtle); + --color-border: var(--c-border); + --color-border-strong: var(--c-border-strong); + --color-text: var(--c-text); + --color-muted: var(--c-muted); + --color-placeholder: var(--c-placeholder); + --color-primary: var(--c-primary); + --color-on-primary: var(--c-on-primary); + --color-danger: var(--c-danger); + --color-danger-soft: var(--c-danger-soft); + --color-ok-bg: var(--c-ok-bg); + --color-ok-text: var(--c-ok-text); + --color-ring: var(--c-ring); + --color-hover: var(--c-hover); + --color-sel: var(--c-sel); + --color-skel: var(--c-skel); + --color-overlay: var(--c-overlay); + --color-side: var(--c-side); + --color-side-border: var(--c-side-border); + --color-accent: #fcd34d; + --color-on-accent: #1b2540; + --color-accent-soft: rgba(252, 211, 77, 0.14); + --color-side-text: #c3cbda; + --color-side-label: #9aa6bd; + --color-side-hover: rgba(255, 255, 255, 0.08); + + --radius-control: 10px; + --radius-card: 16px; + --radius-modal: 20px; + --radius-inner: 12px; + --radius-tab: 9px; + --radius-checkbox: 5px; + --radius-pager: 8px; + --radius-pill: 999px; + + --spacing-button: 42px; + --spacing-input: 44px; + --spacing-header: 64px; + --spacing-nav: 40px; + --spacing-row: 54px; + --spacing-row-head: 44px; + --spacing-pager: 34px; + --spacing-rail: 80px; + --spacing-panel: 224px; + + --shadow-card: var(--c-shadow-card); + --shadow-login: 0 24px 60px rgba(0, 0, 0, 0.35); + --shadow-pop: 0 16px 40px rgba(20, 27, 45, 0.18); + --shadow-menu: 0 16px 40px rgba(20, 27, 45, 0.16); + --shadow-toast: 0 16px 40px rgba(0, 0, 0, 0.25); + --shadow-tab: 0 1px 3px rgba(20, 27, 45, 0.12); +} + +:root { + --c-bg: #f4f6f9; + --c-surface: #ffffff; + --c-subtle: #f3f5f8; + --c-border: #e6e9ef; + --c-border-strong: #d2d8e2; + --c-text: #141b2d; + --c-muted: #566175; + --c-placeholder: #6b7588; + --c-primary: #22304d; + --c-on-primary: #ffffff; + --c-danger: #c62828; + --c-danger-soft: #fdf0f0; + --c-ok-bg: #e3f4e8; + --c-ok-text: #1c6b35; + --c-ring: rgba(252, 196, 40, 0.55); + --c-hover: #f1f3f7; + --c-sel: #fdf3cf; + --c-skel: #eceff4; + --c-overlay: rgba(20, 27, 45, 0.5); + --c-side: #1d2740; + --c-side-border: transparent; + --c-shadow-card: 0 1px 2px rgba(20, 27, 45, 0.04), 0 4px 16px rgba(20, 27, 45, 0.05); +} + +.dark { + --c-bg: #111726; + --c-surface: #182033; + --c-subtle: #1f283d; + --c-border: #29334b; + --c-border-strong: #3a4661; + --c-text: #eef1f6; + --c-muted: #a9b3c6; + --c-placeholder: #8a95ab; + --c-primary: #fcd34d; + --c-on-primary: #1b2540; + --c-danger: #f58a8a; + --c-danger-soft: #3a1d24; + --c-ok-bg: #173826; + --c-ok-text: #8fdfa8; + --c-ring: rgba(252, 211, 77, 0.45); + --c-hover: #212b42; + --c-sel: #3a3622; + --c-skel: #263049; + --c-overlay: rgba(5, 8, 16, 0.7); + --c-side: #0d1320; + --c-side-border: #222b40; + --c-shadow-card: none; +} + +@layer base { + html { + font-family: var(--font-sans); + font-size: 14px; + line-height: 1.5; + color: var(--c-text); + background: var(--c-bg); + } + + body { + margin: 0; + min-height: 100vh; + } + + /* Every interactive element shows the 3px ring; never remove it. */ + a:focus-visible, + button:focus-visible, + [role="button"]:focus-visible, + [tabindex]:focus-visible { + outline: 3px solid var(--c-ring); + outline-offset: 2px; + } + + input:focus-visible, + select:focus-visible, + textarea:focus-visible { + outline: none; + border-color: var(--c-primary); + box-shadow: 0 0 0 3px var(--c-ring); + } + + input::placeholder, + textarea::placeholder { + color: var(--c-placeholder); + } +} diff --git a/admin/src/views/ListView.vue b/admin/src/views/ListView.vue new file mode 100644 index 0000000..5587a4f --- /dev/null +++ b/admin/src/views/ListView.vue @@ -0,0 +1,89 @@ + + + diff --git a/admin/src/views/LoginView.vue b/admin/src/views/LoginView.vue new file mode 100644 index 0000000..393d9b8 --- /dev/null +++ b/admin/src/views/LoginView.vue @@ -0,0 +1,99 @@ + + + diff --git a/admin/src/views/NotFoundView.vue b/admin/src/views/NotFoundView.vue new file mode 100644 index 0000000..43cce99 --- /dev/null +++ b/admin/src/views/NotFoundView.vue @@ -0,0 +1,13 @@ + + + diff --git a/admin/tests/fixtures/navigation.json b/admin/tests/fixtures/navigation.json new file mode 100644 index 0000000..19e5f19 --- /dev/null +++ b/admin/tests/fixtures/navigation.json @@ -0,0 +1,55 @@ +{ + "data": [ + { + "code": "demo", + "label": "Demo", + "icon": "disc-3", + "order": 100, + "controller": "acme.demo.widgets", + "sideMenu": [ + { + "code": "widgets", + "label": "Widgets", + "icon": "tags", + "order": 0, + "controller": "acme.demo.widgets", + "sideMenu": [] + }, + { + "code": "gadgets", + "label": "Gadgets", + "icon": "icon-archive", + "order": 0, + "controller": "acme.demo.gadgets", + "sideMenu": [] + } + ] + }, + { + "code": "tools", + "label": "Tools", + "icon": "unknown-icon-name", + "order": 300, + "controller": "acme.tools.hammers", + "sideMenu": [ + { + "code": "hammers", + "label": "Hammers", + "icon": "puzzle", + "order": 0, + "controller": "acme.tools.hammers", + "sideMenu": [] + } + ] + }, + { + "code": "hidden", + "label": "Hidden", + "icon": "users", + "order": 200, + "controller": "acme.hidden.items", + "sideMenu": [] + } + ], + "meta": { "locale": "en" } +} diff --git a/admin/tests/fixtures/widgets.list-schema.json b/admin/tests/fixtures/widgets.list-schema.json new file mode 100644 index 0000000..91743bb --- /dev/null +++ b/admin/tests/fixtures/widgets.list-schema.json @@ -0,0 +1,22 @@ +{ + "data": { + "title": "Widgets", + "recordsPerPage": 20, + "perPageOptions": [], + "showSearch": true, + "showSetup": false, + "showCheckboxes": true, + "showSorting": true, + "searchTerm": "", + "toolbarButtons": ["create"], + "columns": [ + { "key": "name", "label": "Name", "searchable": true, "sortable": true }, + { "key": "code", "label": "Code", "searchable": true, "sortable": true }, + { "key": "tags", "label": "Tags", "searchable": false, "sortable": false, "type": "relation", "relation": "tags", "select": "name" } + ], + "filters": [], + "rowActions": [], + "bulkActions": [] + }, + "meta": { "locale": "en" } +} diff --git a/admin/tests/fixtures/widgets.list.json b/admin/tests/fixtures/widgets.list.json new file mode 100644 index 0000000..e4f74da --- /dev/null +++ b/admin/tests/fixtures/widgets.list.json @@ -0,0 +1,7 @@ +{ + "data": [ + { "id": 1, "name": "Blue widget", "code": "W-01", "tags": ["small", "round"] }, + { "id": 2, "name": "Green widget", "code": "W-02", "tags": [] } + ], + "meta": { "page": 1, "per_page": 20, "total": 2, "last_page": 1 } +} diff --git a/admin/tests/setup.ts b/admin/tests/setup.ts new file mode 100644 index 0000000..ed9a30e --- /dev/null +++ b/admin/tests/setup.ts @@ -0,0 +1,6 @@ +// The served index.html carries the admin base in a meta element; tests use a +// non-default base to prove the SPA reads it at runtime (D-02, D-03). +const meta = document.createElement('meta') +meta.setAttribute('name', 'summer-admin-base') +meta.setAttribute('content', '/admin-test') +document.head.appendChild(meta) diff --git a/admin/tests/smoke/tracer.smoke.test.ts b/admin/tests/smoke/tracer.smoke.test.ts new file mode 100644 index 0000000..95916fb --- /dev/null +++ b/admin/tests/smoke/tracer.smoke.test.ts @@ -0,0 +1,199 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { flushPromises, mount } from '@vue/test-utils' +import { createMemoryHistory } from 'vue-router' +import App from '../../src/App.vue' +import LoginView from '../../src/views/LoginView.vue' +import { createAdminRouter, safeRedirect } from '../../src/app/router' +import { runtime } from '../../src/app/runtime' +import { onUnauthorized } from '../../src/api/client' +import { clearUser, me, useAuth } from '../../src/state/useAuth' +import { loadNavigation, setNavigation } from '../../src/state/useNavigation' +import navigation from '../fixtures/navigation.json' +import listSchema from '../fixtures/widgets.list-schema.json' +import listRows from '../fixtures/widgets.list.json' + +const API = '/admin-test/api/v1' + +const profile = { + data: { + id: 7, + login: 'dev', + email: 'dev@example.test', + first_name: 'Dana', + last_name: 'Dev', + is_superuser: false, + role: { id: 2, code: 'developer', name: 'Developer' }, + }, + meta: {}, +} + +type Routes = Record + +function mockApi(routes: Routes): Request[] { + const calls: Request[] = [] + vi.spyOn(globalThis, 'fetch').mockImplementation(async (input: RequestInfo | URL) => { + const request = input as Request + calls.push(request) + const key = `${request.method} ${new URL(request.url).pathname}` + const route = routes[key] + const status = route ? (route.status ?? 200) : 404 + const body = route ? route.body : { error: { code: 'not_found', message: 'Not found', details: {} } } + return new Response(JSON.stringify(body), { status, headers: { 'Content-Type': 'application/json' } }) + }) + return calls +} + +function pathOf(request: Request): string { + return new URL(request.url).pathname +} + +beforeEach(() => { + clearUser() + setNavigation([]) + onUnauthorized(null) +}) + +afterEach(() => { + localStorage.clear() + sessionStorage.clear() +}) + +describe('runtime', () => { + it('reads the admin base and API base from the served meta', () => { + expect(runtime.base).toBe('/admin-test') + expect(runtime.api).toBe(API) + }) +}) + +describe('login', () => { + it('posts the CSRF header with same-origin credentials and stores no token', async () => { + const calls = mockApi({ + [`POST ${API}/auth/login`]: { + body: { data: { token_type: 'cookie', expires_in: 3600, access_token: 'must-not-be-kept' }, meta: {} }, + }, + }) + const auth = useAuth() + + expect(await auth.login('dev', 'secret')).toBe(true) + + expect(calls).toHaveLength(1) + const request = calls[0]! + expect(request.method).toBe('POST') + expect(pathOf(request)).toBe(`${API}/auth/login`) + expect(request.headers.get('X-Requested-With')).toBe('XMLHttpRequest') + expect(request.credentials).toBe('same-origin') + expect(await request.json()).toEqual({ login: 'dev', password: 'secret' }) + expect(auth.expiresIn.value).toBe(3600) + expect(localStorage.length).toBe(0) + expect(sessionStorage.length).toBe(0) + expect(document.cookie).not.toContain('must-not-be-kept') + expect(JSON.stringify({ user: auth.user.value, expiresIn: auth.expiresIn.value })).not.toContain('must-not-be-kept') + }) + + it('shows the invalid-credentials alert and marks the password invalid', async () => { + mockApi({ + [`POST ${API}/auth/login`]: { + status: 401, + body: { error: { code: 'unauthenticated', message: 'Invalid credentials', details: {} } }, + }, + }) + const router = createAdminRouter(createMemoryHistory()) + await router.push('/login') + const wrapper = mount(LoginView, { global: { plugins: [router] } }) + await wrapper.find('input[name="login"]').setValue('dev') + await wrapper.find('input[name="password"]').setValue('wrong') + await wrapper.find('form').trigger('submit') + await flushPromises() + + expect(wrapper.find('[role="alert"]').exists()).toBe(true) + expect(wrapper.find('input[name="password"]').attributes('aria-invalid')).toBe('true') + expect(router.currentRoute.value.name).toBe('login') + }) +}) + +describe('redirects', () => { + it('accepts only in-app paths that start with exactly one slash', () => { + expect(safeRedirect('/acme/demo/widgets?page=2')).toBe('/acme/demo/widgets?page=2') + expect(safeRedirect('https://evil.example/steal')).toBeNull() + expect(safeRedirect('//evil.example/steal')).toBeNull() + expect(safeRedirect('/\\evil.example')).toBeNull() + expect(safeRedirect('acme/demo')).toBeNull() + expect(safeRedirect(['/acme'])).toBeNull() + }) + + it('sends an unauthenticated visitor to login with the requested path', async () => { + const router = createAdminRouter(createMemoryHistory()) + await router.push('/acme/demo/widgets?page=2') + expect(router.currentRoute.value.name).toBe('login') + expect(router.currentRoute.value.query.redirect).toBe('/acme/demo/widgets?page=2') + }) + + it('reports a 401 on any call other than login', async () => { + mockApi({ + [`GET ${API}/auth/me`]: { status: 401, body: { error: { code: 'unauthenticated', message: 'Unauthenticated', details: {} } } }, + [`POST ${API}/auth/login`]: { status: 401, body: { error: { code: 'unauthenticated', message: 'Invalid credentials', details: {} } } }, + }) + const handler = vi.fn() + onUnauthorized(handler) + await useAuth().login('dev', 'wrong') + expect(handler).not.toHaveBeenCalled() + await me() + expect(handler).toHaveBeenCalledTimes(1) + }) +}) + +describe('navigation shell and list', () => { + async function mountApp() { + const calls = mockApi({ + [`GET ${API}/auth/me`]: { body: profile }, + [`GET ${API}/navigation`]: { body: navigation }, + [`GET ${API}/acme/demo/widgets/schema/list`]: { body: listSchema }, + [`GET ${API}/acme/demo/widgets`]: { body: listRows }, + }) + await me() + await loadNavigation() + const router = createAdminRouter(createMemoryHistory()) + await router.push('/acme/demo/widgets') + const wrapper = mount(App, { global: { plugins: [router] } }) + await flushPromises() + return { wrapper, calls, router } + } + + it('renders navigation grouped by plugin and omits a plugin with an empty side menu', async () => { + const { wrapper } = await mountApp() + const rail = wrapper.find('nav[aria-label="backend::lang.nav.plugins"]') + expect(rail.exists()).toBe(true) + const railLinks = rail.findAll('a') + expect(railLinks.map((link) => link.text())).toEqual(['Demo', 'Tools']) + expect(railLinks[0]!.attributes('aria-current')).toBe('page') + expect(railLinks[1]!.attributes('aria-current')).toBeUndefined() + expect(railLinks[1]!.attributes('href')).toBe('/acme/tools/hammers') + // An unknown icon name renders the neutral fallback instead of failing. + expect(railLinks[1]!.find('svg').exists()).toBe(true) + + const panel = wrapper.find('aside') + const panelLinks = panel.findAll('a') + expect(panel.text()).toContain('Demo') + expect(panelLinks.map((link) => link.text())).toEqual(['Widgets', 'Gadgets']) + expect(panelLinks[0]!.attributes('aria-current')).toBe('page') + expect(panelLinks[1]!.attributes('href')).toBe('/acme/demo/gadgets') + }) + + it('renders the list schema columns and rows through the typed client', async () => { + const { wrapper, calls } = await mountApp() + const requested = calls.map(pathOf) + expect(requested).toContain(`${API}/acme/demo/widgets/schema/list`) + expect(requested).toContain(`${API}/acme/demo/widgets`) + for (const request of calls) { + expect(request.headers.get('X-Requested-With')).toBe('XMLHttpRequest') + } + + expect(wrapper.find('h1').text()).toBe('Widgets') + expect(wrapper.findAll('th').map((th) => th.text())).toEqual(['Name', 'Code', 'Tags']) + const rows = wrapper.findAll('tbody tr').map((tr) => tr.findAll('td').map((td) => td.text())) + expect(rows).toEqual([ + ['Blue widget', 'W-01', 'small, round'], + ['Green widget', 'W-02', '—'], + ]) + }) +}) diff --git a/admin/tsconfig.json b/admin/tsconfig.json new file mode 100644 index 0000000..8dbaf9a --- /dev/null +++ b/admin/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "verbatimModuleSyntax": true, + "isolatedModules": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "noEmit": true, + "jsx": "preserve", + "types": [] + }, + "include": ["src/**/*.ts", "src/**/*.vue", "tests/**/*.ts", "env.d.ts"] +} diff --git a/admin/vite.config.ts b/admin/vite.config.ts new file mode 100644 index 0000000..d7670df --- /dev/null +++ b/admin/vite.config.ts @@ -0,0 +1,34 @@ +import { defineConfig, type Plugin } from 'vite' +import vue from '@vitejs/plugin-vue' +import tailwindcss from '@tailwindcss/vite' + +// The committed build is path-agnostic (D-02): assets use a relative base and +// index.html keeps the __SUMMER_ADMIN_BASE__ token, which the Go server +// (boardwalk) replaces with the configured backend.uri. The dev server +// replaces it with SUMMER_ADMIN_DEV_PREFIX and proxies the admin API to a +// running `summer serve` at SUMMER_ADMIN_DEV_TARGET. +const devPrefix = (process.env.SUMMER_ADMIN_DEV_PREFIX ?? '/backend').replace(/\/+$/, '') +const devTarget = process.env.SUMMER_ADMIN_DEV_TARGET ?? 'http://localhost:8080' + +function devBase(): Plugin { + return { + name: 'summer-admin-dev-base', + apply: 'serve', + transformIndexHtml: (html) => html.replace('__SUMMER_ADMIN_BASE__', devPrefix), + } +} + +export default defineConfig(({ command }) => ({ + base: command === 'build' ? './' : '/', + plugins: [vue(), tailwindcss(), devBase()], + build: { + outDir: '../boardwalk/dist', + emptyOutDir: true, + sourcemap: false, + }, + server: { + proxy: { + [`${devPrefix}/api`]: { target: devTarget, changeOrigin: false }, + }, + }, +})) diff --git a/admin/vitest.config.ts b/admin/vitest.config.ts new file mode 100644 index 0000000..8a2d0a2 --- /dev/null +++ b/admin/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vitest/config' +import vue from '@vitejs/plugin-vue' + +export default defineConfig({ + plugins: [vue()], + test: { + environment: 'happy-dom', + include: ['tests/**/*.test.ts'], + setupFiles: ['tests/setup.ts'], + restoreMocks: true, + }, +}) diff --git a/boardwalk/boardwalk.go b/boardwalk/boardwalk.go new file mode 100644 index 0000000..aacf193 --- /dev/null +++ b/boardwalk/boardwalk.go @@ -0,0 +1,167 @@ +// Package boardwalk serves the embedded admin SPA build (D-01, D-02). +// +// The committed dist/ is path-agnostic: Vite builds it with a relative base +// and index.html carries the __SUMMER_ADMIN_BASE__ token. Handler rewrites +// index.html once for the configured backend.uri, serves hashed assets with +// long-lived caching, falls back to index.html for client-side routes and +// hands every unmatched api/ path back to the caller so API misses stay JSON. +package boardwalk + +import ( + "bytes" + "embed" + "errors" + "fmt" + "html" + "io/fs" + "mime" + "net/http" + "path" + "strings" + "time" +) + +//go:embed all:dist +var distFS embed.FS + +// BaseToken is replaced in dist/index.html by the configured admin prefix. +const BaseToken = "__SUMMER_ADMIN_BASE__" + +// contentSecurityPolicy keeps the admin out of frames and allows scripts +// only from its own origin; the build contains no inline script. +const contentSecurityPolicy = "frame-ancestors 'none'; base-uri 'none'; object-src 'none'; script-src 'self'" + +var contentTypes = map[string]string{ + ".js": "text/javascript; charset=utf-8", + ".mjs": "text/javascript; charset=utf-8", + ".css": "text/css; charset=utf-8", + ".html": "text/html; charset=utf-8", + ".woff2": "font/woff2", + ".woff": "font/woff", + ".svg": "image/svg+xml", + ".json": "application/json", +} + +// Dist returns the embedded build tree rooted at dist/. +func Dist() (fs.FS, error) { + return fs.Sub(distFS, "dist") +} + +// Handler serves the embedded SPA under prefix (for example /backend). +// notFoundAPI answers any request whose path under the prefix is api or +// starts with api/; it must write the admin API's JSON 404 envelope. +func Handler(prefix string, notFoundAPI http.Handler) (http.Handler, error) { + root, err := Dist() + if err != nil { + return nil, err + } + return newHandler(root, prefix, notFoundAPI) +} + +func newHandler(root fs.FS, prefix string, notFoundAPI http.Handler) (http.Handler, error) { + if notFoundAPI == nil { + return nil, errors.New("boardwalk: notFoundAPI handler is nil") + } + prefix = strings.TrimRight(prefix, "/") + if !strings.HasPrefix(prefix, "/") { + return nil, fmt.Errorf("boardwalk: prefix %q must start with /", prefix) + } + raw, err := fs.ReadFile(root, "index.html") + if err != nil { + return nil, fmt.Errorf("boardwalk: dist/index.html: %w", err) + } + index, err := RewriteIndex(raw, prefix) + if err != nil { + return nil, err + } + return &handler{root: root, prefix: prefix, index: index, notFoundAPI: notFoundAPI}, nil +} + +// RewriteIndex points relative asset URLs at prefix and injects the prefix +// into the summer-admin-base meta. It fails when the token is absent, which +// catches a stale or hand-edited dist at boot. +func RewriteIndex(raw []byte, prefix string) ([]byte, error) { + if !bytes.Contains(raw, []byte(BaseToken)) { + return nil, errors.New("boardwalk: dist/index.html has no " + BaseToken + " token; rebuild the admin SPA") + } + escaped := html.EscapeString(prefix) + out := bytes.ReplaceAll(raw, []byte(`="./`), []byte(`="`+escaped+`/`)) + out = bytes.ReplaceAll(out, []byte(BaseToken), []byte(escaped)) + return out, nil +} + +type handler struct { + root fs.FS + prefix string + index []byte + notFoundAPI http.Handler +} + +func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + setSecurityHeaders(w.Header()) + rel := strings.TrimPrefix(r.URL.Path, h.prefix) + rel = strings.TrimPrefix(rel, "/") + if rel == "api" || strings.HasPrefix(rel, "api/") { + h.notFoundAPI.ServeHTTP(w, r) + return + } + name := strings.TrimPrefix(path.Clean("/"+rel), "/") + if name == "" || name == "index.html" { + h.serveIndex(w, r) + return + } + if info, err := fs.Stat(h.root, name); err == nil { + if info.Mode().IsRegular() { + h.serveFile(w, r, name) + return + } + // A directory is never listed; it is treated as a client route. + h.serveIndex(w, r) + return + } + if path.Ext(name) != "" { + http.NotFound(w, r) + return + } + h.serveIndex(w, r) +} + +func (h *handler) serveIndex(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.Header().Set("Cache-Control", "no-store") + http.ServeContent(w, r, "index.html", time.Time{}, bytes.NewReader(h.index)) +} + +func (h *handler) serveFile(w http.ResponseWriter, r *http.Request, name string) { + body, err := fs.ReadFile(h.root, name) + if err != nil { + http.NotFound(w, r) + return + } + w.Header().Set("Content-Type", contentType(name)) + if strings.HasPrefix(name, "assets/") { + w.Header().Set("Cache-Control", "public, max-age=31536000, immutable") + } else { + w.Header().Set("Cache-Control", "no-cache") + } + http.ServeContent(w, r, path.Base(name), time.Time{}, bytes.NewReader(body)) +} + +func contentType(name string) string { + ext := strings.ToLower(path.Ext(name)) + if ct, ok := contentTypes[ext]; ok { + return ct + } + if ct := mime.TypeByExtension(ext); ct != "" { + return ct + } + return "application/octet-stream" +} + +func setSecurityHeaders(h http.Header) { + h.Set("X-Content-Type-Options", "nosniff") + h.Set("Referrer-Policy", "same-origin") + h.Set("X-Frame-Options", "DENY") + h.Set("Content-Security-Policy", contentSecurityPolicy) + h.Set("X-Robots-Tag", "noindex, nofollow") +} diff --git a/boardwalk/dist/assets/dm-mono-latin-400-normal--0xN8mdc.woff b/boardwalk/dist/assets/dm-mono-latin-400-normal--0xN8mdc.woff new file mode 100644 index 0000000000000000000000000000000000000000..b04bf00a15e625a5005215517ab123d5eba301aa GIT binary patch literal 11212 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 literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-mono-latin-400-normal-4GdczIuU.woff2 b/boardwalk/dist/assets/dm-mono-latin-400-normal-4GdczIuU.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..03e4859816da02b8d788146d1b80847cf8b03fdb GIT binary patch literal 14820 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 WNo?L6xNB_kt5n5zqCy4&rvm_d*X()# literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-mono-latin-ext-400-normal-1aZr6b2b.woff b/boardwalk/dist/assets/dm-mono-latin-ext-400-normal-1aZr6b2b.woff new file mode 100644 index 0000000000000000000000000000000000000000..fc53f73d22996ec79896546b5f8e367c9534c012 GIT binary patch literal 7500 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 literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-mono-latin-ext-400-normal-C2zvOubV.woff2 b/boardwalk/dist/assets/dm-mono-latin-ext-400-normal-C2zvOubV.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9785e9177291ef526d28285e086ba823315a0bd6 GIT binary patch literal 9552 zcmV-WC9m3dPew8T0RR9103}cW5dZ)H0942T03_}J0RR9100000000000000000000 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 literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-mono-latin-ext-500-normal-BtRyHRi6.woff2 b/boardwalk/dist/assets/dm-mono-latin-ext-500-normal-BtRyHRi6.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..b87200956400a4ac0638c4d84342bb5ef859bf91 GIT binary patch literal 9616 zcmV;BC2!hyPew8T0RR91040zB5dZ)H097mi03|R00RR9100000000000000000000 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 Gw*mkL5_L5I literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-mono-latin-ext-500-normal-Dw3M13d8.woff b/boardwalk/dist/assets/dm-mono-latin-ext-500-normal-Dw3M13d8.woff new file mode 100644 index 0000000000000000000000000000000000000000..9490ad7b2e8bf5fc5f9496465f9c951ae3dbb951 GIT binary patch literal 7488 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 aL6r9}<<{enm_zbFQ{4@uf8&cU^#A}nsPbI^ literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-sans-latin-400-normal-CW0RaeGs.woff2 b/boardwalk/dist/assets/dm-sans-latin-400-normal-CW0RaeGs.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..0b8bc556cf4b4cbd5c82418947a159f9aaa3c6cc GIT binary patch literal 14200 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 DJVHD( literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-sans-latin-500-normal-B9HHJjqV.woff2 b/boardwalk/dist/assets/dm-sans-latin-500-normal-B9HHJjqV.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..48e161289603aa2d4c9b83f294dc73af969b339a GIT binary patch literal 14304 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

cXva|Hg)2S=yXKRi7!R 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 literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-sans-latin-500-normal-Dr3UlScf.woff b/boardwalk/dist/assets/dm-sans-latin-500-normal-Dr3UlScf.woff new file mode 100644 index 0000000000000000000000000000000000000000..d34469f2e6ee2282a2afb7b758a8471f845b3c50 GIT binary patch literal 18520 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 literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-sans-latin-600-normal-Aqo67rzb.woff2 b/boardwalk/dist/assets/dm-sans-latin-600-normal-Aqo67rzb.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5e39dbc959ff4cb85134d5666d5251aa54b430ad GIT binary patch literal 14144 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 l#1H()>V<>c{~wx51;qdW literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-sans-latin-600-normal-BmdmIIQ2.woff b/boardwalk/dist/assets/dm-sans-latin-600-normal-BmdmIIQ2.woff new file mode 100644 index 0000000000000000000000000000000000000000..4a8bb66121cec0835bc077cb683f1d97b67c1a98 GIT binary patch literal 18320 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 OQ{4@uf8&cU^#A~PWg@Zw literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-sans-latin-700-normal-DvUfVpUG.woff2 b/boardwalk/dist/assets/dm-sans-latin-700-normal-DvUfVpUG.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..26edc56c122261f14290330af50bbff92e0a17b4 GIT binary patch literal 14348 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 KF@gpH`u_m@HIb44 literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-sans-latin-ext-400-normal-BjWJ59Pq.woff b/boardwalk/dist/assets/dm-sans-latin-ext-400-normal-BjWJ59Pq.woff new file mode 100644 index 0000000000000000000000000000000000000000..0113bc2fdb439e6a9b01fbb2ef6ec41cdb7bebfb GIT binary patch literal 9976 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 literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-sans-latin-ext-500-normal-BJfUCQsA.woff2 b/boardwalk/dist/assets/dm-sans-latin-ext-500-normal-BJfUCQsA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ab2af3e14e6623d461632484987cce2659ec6ce4 GIT binary patch literal 7432 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 G1pom1@oy^t literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-sans-latin-ext-500-normal-DR84L5F-.woff b/boardwalk/dist/assets/dm-sans-latin-ext-500-normal-DR84L5F-.woff new file mode 100644 index 0000000000000000000000000000000000000000..d1f80c637c30fd6346bfa7b363bc64bbe251943c GIT binary patch literal 10068 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 literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-sans-latin-ext-600-normal-4vooXBpG.woff2 b/boardwalk/dist/assets/dm-sans-latin-ext-600-normal-4vooXBpG.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..16ca393e5f83c481655269ab06dc772ae078a199 GIT binary patch literal 7420 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 literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/dm-sans-latin-ext-700-normal-CJIcxD6K.woff2 b/boardwalk/dist/assets/dm-sans-latin-ext-700-normal-CJIcxD6K.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..78d90f34b97ec4c2b6462484842d7d22b59dd423 GIT binary patch literal 7452 zcmV+%9pmD6Pew8T0RR910393v5C8xG07a|-035sk0RR9100000000000000000000 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 aUl0am5QE2qggv6#vQqUBXy?B#Z&d{xHH7Z~ literal 0 HcmV?d00001 diff --git a/boardwalk/dist/assets/index-UTAit0wB.css b/boardwalk/dist/assets/index-UTAit0wB.css new file mode 100644 index 0000000..6edd8fe --- /dev/null +++ b/boardwalk/dist/assets/index-UTAit0wB.css @@ -0,0 +1 @@ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:"DM Sans", ui-sans-serif, system-ui, sans-serif;--font-mono:"DM Mono", ui-monospace, monospace;--color-white:#fff;--spacing:.25rem;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--leading-tight:1.25;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:var(--c-bg);--color-surface:var(--c-surface);--color-subtle:var(--c-subtle);--color-border:var(--c-border);--color-text:var(--c-text);--color-muted:var(--c-muted);--color-danger:var(--c-danger);--color-hover:var(--c-hover);--color-sel:var(--c-sel);--color-skel:var(--c-skel);--color-side:var(--c-side);--color-side-border:var(--c-side-border);--color-accent:#fcd34d;--color-on-accent:#1b2540;--color-accent-soft:#fcd34d24;--color-side-text:#c3cbda;--color-side-hover:#ffffff14;--radius-control:10px;--radius-card:16px;--radius-inner:12px;--spacing-input:44px;--spacing-header:64px;--spacing-nav:40px;--spacing-row:54px;--spacing-row-head:44px;--spacing-rail:80px;--spacing-panel:224px}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}html{font-family:var(--font-sans);color:var(--c-text);background:var(--c-bg);font-size:14px;line-height:1.5}body{min-height:100vh;margin:0}a:focus-visible,button:focus-visible,[role=button]:focus-visible,[tabindex]:focus-visible{outline:3px solid var(--c-ring);outline-offset:2px}input:focus-visible,select:focus-visible,textarea:focus-visible{border-color:var(--c-primary);box-shadow:0 0 0 3px var(--c-ring);outline:none}input::placeholder,textarea::placeholder{color:var(--c-placeholder)}}@layer components;@layer utilities{.absolute{position:absolute}.relative{position:relative}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.block{display:block}.flex{display:flex}.hidden{display:none}.table{display:table}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-\[34px\]{width:34px;height:34px}.h-3{height:calc(var(--spacing) * 3)}.h-10{height:calc(var(--spacing) * 10)}.h-header{height:var(--spacing-header)}.h-input{height:var(--spacing-input)}.h-nav{height:var(--spacing-nav)}.h-row{height:var(--spacing-row)}.h-row-head{height:var(--spacing-row-head)}.min-h-screen{min-height:100vh}.w-3\/5{width:60%}.w-\[68px\]{width:68px}.w-full{width:100%}.w-panel{width:var(--spacing-panel)}.w-rail{width:var(--spacing-rail)}.max-w-\[400px\]{max-width:400px}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[640px\]{min-width:640px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-\[18px\]{gap:18px}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-\[6px\]{border-radius:6px}.rounded-card{border-radius:var(--radius-card)}.rounded-control{border-radius:var(--radius-control)}.rounded-full{border-radius:3.40282e38px}.rounded-inner{border-radius:var(--radius-inner)}.border{border-style:var(--tw-border-style);border-width:1px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-\[\#c62828\]{border-color:#c62828}.border-\[\#d2d8e2\]{border-color:#d2d8e2}.border-border{border-color:var(--color-border)}.border-side-border{border-color:var(--color-side-border)}.bg-\[\#22304d\]{background-color:#22304d}.bg-\[\#fdf0f0\]{background-color:#fdf0f0}.bg-accent{background-color:var(--color-accent)}.bg-accent-soft{background-color:var(--color-accent-soft)}.bg-bg{background-color:var(--color-bg)}.bg-sel{background-color:var(--color-sel)}.bg-side{background-color:var(--color-side)}.bg-skel{background-color:var(--color-skel)}.bg-subtle{background-color:var(--color-subtle)}.bg-surface{background-color:var(--color-surface)}.bg-white{background-color:var(--color-white)}.p-8{padding:calc(var(--spacing) * 8)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-8{padding-inline:calc(var(--spacing) * 8)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-7{padding-block:calc(var(--spacing) * 7)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[22px\]{font-size:22px}.text-\[26px\]{font-size:26px}.leading-\[1\.2\]{--tw-leading:1.2;line-height:1.2}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-\[-0\.02em\]{--tw-tracking:-.02em;letter-spacing:-.02em}.text-\[\#141b2d\]{color:#141b2d}.text-\[\#c62828\]{color:#c62828}.text-accent{color:var(--color-accent)}.text-danger{color:var(--color-danger)}.text-muted{color:var(--color-muted)}.text-on-accent{color:var(--color-on-accent)}.text-side-text{color:var(--color-side-text)}.text-text{color:var(--color-text)}.text-white{color:var(--color-white)}.no-underline{text-decoration-line:none}.shadow-card{--tw-shadow:var(--c-shadow-card);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-login{--tw-shadow:0 24px 60px var(--tw-shadow-color,#00000059);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.first\:pl-5:first-child{padding-left:calc(var(--spacing) * 5)}.last\:pr-5:last-child{padding-right:calc(var(--spacing) * 5)}@media(hover:hover){.hover\:bg-hover:hover{background-color:var(--color-hover)}.hover\:bg-side-hover:hover{background-color:var(--color-side-hover)}.hover\:text-text:hover{color:var(--color-text)}.hover\:text-white:hover{color:var(--color-white)}}.disabled\:opacity-60:disabled{opacity:.6}}@font-face{font-family:DM Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./dm-sans-latin-ext-400-normal-BtiwyxMk.woff2)format("woff2"),url(./dm-sans-latin-ext-400-normal-BjWJ59Pq.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Sans;font-style:normal;font-display:swap;font-weight:400;src:url(./dm-sans-latin-400-normal-CW0RaeGs.woff2)format("woff2"),url(./dm-sans-latin-400-normal-BwCSEQnW.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:DM Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./dm-sans-latin-ext-500-normal-BJfUCQsA.woff2)format("woff2"),url(./dm-sans-latin-ext-500-normal-DR84L5F-.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Sans;font-style:normal;font-display:swap;font-weight:500;src:url(./dm-sans-latin-500-normal-B9HHJjqV.woff2)format("woff2"),url(./dm-sans-latin-500-normal-Dr3UlScf.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:DM Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./dm-sans-latin-ext-600-normal-4vooXBpG.woff2)format("woff2"),url(./dm-sans-latin-ext-600-normal-DRtaDpgU.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Sans;font-style:normal;font-display:swap;font-weight:600;src:url(./dm-sans-latin-600-normal-Aqo67rzb.woff2)format("woff2"),url(./dm-sans-latin-600-normal-BmdmIIQ2.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:DM Sans;font-style:normal;font-display:swap;font-weight:700;src:url(./dm-sans-latin-ext-700-normal-CJIcxD6K.woff2)format("woff2"),url(./dm-sans-latin-ext-700-normal-BLI3TTWz.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Sans;font-style:normal;font-display:swap;font-weight:700;src:url(./dm-sans-latin-700-normal-DvUfVpUG.woff2)format("woff2"),url(./dm-sans-latin-700-normal-CUSSCpQX.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:DM Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./dm-mono-latin-ext-400-normal-C2zvOubV.woff2)format("woff2"),url(./dm-mono-latin-ext-400-normal-1aZr6b2b.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Mono;font-style:normal;font-display:swap;font-weight:400;src:url(./dm-mono-latin-400-normal-4GdczIuU.woff2)format("woff2"),url(./dm-mono-latin-400-normal--0xN8mdc.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:DM Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./dm-mono-latin-ext-500-normal-BtRyHRi6.woff2)format("woff2"),url(./dm-mono-latin-ext-500-normal-Dw3M13d8.woff)format("woff");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Mono;font-style:normal;font-display:swap;font-weight:500;src:url(./dm-mono-latin-500-normal-DRMDZjhP.woff2)format("woff2"),url(./dm-mono-latin-500-normal-CN8Miw6E.woff)format("woff");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--c-bg:#f4f6f9;--c-surface:#fff;--c-subtle:#f3f5f8;--c-border:#e6e9ef;--c-border-strong:#d2d8e2;--c-text:#141b2d;--c-muted:#566175;--c-placeholder:#6b7588;--c-primary:#22304d;--c-on-primary:#fff;--c-danger:#c62828;--c-danger-soft:#fdf0f0;--c-ok-bg:#e3f4e8;--c-ok-text:#1c6b35;--c-ring:#fcc4288c;--c-hover:#f1f3f7;--c-sel:#fdf3cf;--c-skel:#eceff4;--c-overlay:#141b2d80;--c-side:#1d2740;--c-side-border:transparent;--c-shadow-card:0 1px 2px #141b2d0a, 0 4px 16px #141b2d0d}.dark{--c-bg:#111726;--c-surface:#182033;--c-subtle:#1f283d;--c-border:#29334b;--c-border-strong:#3a4661;--c-text:#eef1f6;--c-muted:#a9b3c6;--c-placeholder:#8a95ab;--c-primary:#fcd34d;--c-on-primary:#1b2540;--c-danger:#f58a8a;--c-danger-soft:#3a1d24;--c-ok-bg:#173826;--c-ok-text:#8fdfa8;--c-ring:#fcd34d73;--c-hover:#212b42;--c-sel:#3a3622;--c-skel:#263049;--c-overlay:#050810b3;--c-side:#0d1320;--c-side-border:#222b40;--c-shadow-card:none}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000} diff --git a/boardwalk/dist/assets/index-ZNCn30hM.js b/boardwalk/dist/assets/index-ZNCn30hM.js new file mode 100644 index 0000000..f674cd4 --- /dev/null +++ b/boardwalk/dist/assets/index-ZNCn30hM.js @@ -0,0 +1 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const i of o.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(s){if(s.ep)return;s.ep=!0;const o=n(s);fetch(s.href,o)}})();function Pr(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const re={},Lt=[],it=()=>{},fo=()=>!1,In=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Ln=e=>e.startsWith("onUpdate:"),Ee=Object.assign,Tr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Wi=Object.prototype.hasOwnProperty,Y=(e,t)=>Wi.call(e,t),F=Array.isArray,Dt=e=>yn(e)==="[object Map]",ho=e=>yn(e)==="[object Set]",rs=e=>yn(e)==="[object Date]",U=e=>typeof e=="function",ae=e=>typeof e=="string",Ke=e=>typeof e=="symbol",Z=e=>e!==null&&typeof e=="object",po=e=>(Z(e)||U(e))&&U(e.then)&&U(e.catch),go=Object.prototype.toString,yn=e=>go.call(e),Gi=e=>yn(e).slice(8,-1),mo=e=>yn(e)==="[object Object]",Mr=e=>ae(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,tn=Pr(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Dn=e=>{const t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},Qi=/-\w/g,$e=Dn(e=>e.replace(Qi,t=>t.slice(1).toUpperCase())),Ji=/\B([A-Z])/g,Tt=Dn(e=>e.replace(Ji,"-$1").toLowerCase()),Fn=Dn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Xn=Dn(e=>e?`on${Fn(e)}`:""),ot=(e,t)=>!Object.is(e,t),Sn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},$r=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let ss;const Hn=()=>ss||(ss=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Or(e){if(F(e)){const t={};for(let n=0;n{if(n){const r=n.split(Xi);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function wt(e){let t="";if(ae(e))t=e;else if(F(e))for(let n=0;n!!(e&&e.__v_isRef===!0),de=e=>ae(e)?e:e==null?"":F(e)||Z(e)&&(e.toString===go||!U(e.toString))?vo(e)?de(e.value):JSON.stringify(e,bo,2):String(e),bo=(e,t)=>vo(t)?bo(e,t.value):Dt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],o)=>(n[Zn(r,o)+" =>"]=s,n),{})}:ho(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Zn(n))}:Ke(t)?Zn(t):Z(t)&&!F(t)&&!mo(t)?String(t):t,Zn=(e,t="")=>{var n;return Ke(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};let xe;class sl{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!t&&xe&&(xe.active?(this.parent=xe,this.index=(xe.scopes||(xe.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0){if(xe===this)xe=this.prevScope;else{let t=xe;for(;t;){if(t.prevScope===this){t.prevScope=this.prevScope;break}t=t.prevScope}}this.prevScope=void 0}}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n0)return;if(rn){let t=rn;for(rn=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;nn;){let t=nn;for(nn=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function Eo(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ro(e){let t,n=e.depsTail,r=n;for(;r;){const s=r.prevDep;r.version===-1?(r===n&&(n=s),Lr(r),il(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=s}e.deps=t,e.depsTail=n}function hr(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Co(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Co(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===un)||(e.globalVersion=un,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!hr(e))))return;e.flags|=2;const t=e.dep,n=ie,r=Be;ie=e,Be=!0;try{Eo(e);const s=e.fn(e._value);(t.version===0||ot(s,e._value))&&(e.flags|=128,e._value=s,t.version++)}catch(s){throw t.version++,s}finally{ie=n,Be=r,Ro(e),e.flags&=-3}}function Lr(e,t=!1){const{dep:n,prevSub:r,nextSub:s}=e;if(r&&(r.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let o=n.computed.deps;o;o=o.nextDep)Lr(o,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function il(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Be=!0;const ko=[];function pt(){ko.push(Be),Be=!1}function gt(){const e=ko.pop();Be=e===void 0?!0:e}function os(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ie;ie=void 0;try{t()}finally{ie=n}}}let un=0;class ll{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Dr{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!ie||!Be||ie===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ie)n=this.activeLink=new ll(ie,this),ie.deps?(n.prevDep=ie.depsTail,ie.depsTail.nextDep=n,ie.depsTail=n):ie.deps=ie.depsTail=n,Ao(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=ie.depsTail,n.nextDep=void 0,ie.depsTail.nextDep=n,ie.depsTail=n,ie.deps===n&&(ie.deps=r)}return n}trigger(t){this.version++,un++,this.notify(t)}notify(t){Nr();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Ir()}}}function Ao(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)Ao(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const pr=new WeakMap,At=Symbol(""),gr=Symbol(""),fn=Symbol("");function Re(e,t,n){if(Be&&ie){let r=pr.get(e);r||pr.set(e,r=new Map);let s=r.get(n);s||(r.set(n,s=new Dr),s.map=r,s.key=n),s.track()}}function dt(e,t,n,r,s,o){const i=pr.get(e);if(!i){un++;return}const l=c=>{c&&c.trigger()};if(Nr(),t==="clear")i.forEach(l);else{const c=F(e),f=c&&Mr(n);if(c&&n==="length"){const u=Number(r);i.forEach((h,p)=>{(p==="length"||p===fn||!Ke(p)&&p>=u)&&l(h)})}else switch((n!==void 0||i.has(void 0))&&l(i.get(n)),f&&l(i.get(fn)),t){case"add":c?f&&l(i.get("length")):(l(i.get(At)),Dt(e)&&l(i.get(gr)));break;case"delete":c||(l(i.get(At)),Dt(e)&&l(i.get(gr)));break;case"set":Dt(e)&&l(i.get(At));break}}Ir()}function Mt(e){const t=J(e);return t===e?t:(Re(t,"iterate",fn),Ve(e)?t:t.map(We))}function Un(e){return Re(e=J(e),"iterate",fn),e}function rt(e,t){return mt(e)?qt(Pt(e)?We(t):t):We(t)}const cl={__proto__:null,[Symbol.iterator](){return tr(this,Symbol.iterator,e=>rt(this,e))},concat(...e){return Mt(this).concat(...e.map(t=>F(t)?Mt(t):t))},entries(){return tr(this,"entries",e=>(e[1]=rt(this,e[1]),e))},every(e,t){return ct(this,"every",e,t,void 0,arguments)},filter(e,t){return ct(this,"filter",e,t,n=>n.map(r=>rt(this,r)),arguments)},find(e,t){return ct(this,"find",e,t,n=>rt(this,n),arguments)},findIndex(e,t){return ct(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return ct(this,"findLast",e,t,n=>rt(this,n),arguments)},findLastIndex(e,t){return ct(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return ct(this,"forEach",e,t,void 0,arguments)},includes(...e){return nr(this,"includes",e)},indexOf(...e){return nr(this,"indexOf",e)},join(e){return Mt(this).join(e)},lastIndexOf(...e){return nr(this,"lastIndexOf",e)},map(e,t){return ct(this,"map",e,t,void 0,arguments)},pop(){return Qt(this,"pop")},push(...e){return Qt(this,"push",e)},reduce(e,...t){return is(this,"reduce",e,t)},reduceRight(e,...t){return is(this,"reduceRight",e,t)},shift(){return Qt(this,"shift")},some(e,t){return ct(this,"some",e,t,void 0,arguments)},splice(...e){return Qt(this,"splice",e)},toReversed(){return Mt(this).toReversed()},toSorted(e){return Mt(this).toSorted(e)},toSpliced(...e){return Mt(this).toSpliced(...e)},unshift(...e){return Qt(this,"unshift",e)},values(){return tr(this,"values",e=>rt(this,e))}};function tr(e,t,n){const r=Un(e),s=r[t]();return r!==e&&!Ve(e)&&(s._next=s.next,s.next=()=>{const o=s._next();return o.done||(o.value=n(o.value)),o}),s}const al=Array.prototype;function ct(e,t,n,r,s,o){const i=Un(e),l=i!==e&&!Ve(e),c=i[t];if(c!==al[t]){const h=c.apply(e,o);return l?We(h):h}let f=n;i!==e&&(l?f=function(h,p){return n.call(this,rt(e,h),p,e)}:n.length>2&&(f=function(h,p){return n.call(this,h,p,e)}));const u=c.call(i,f,r);return l&&s?s(u):u}function is(e,t,n,r){const s=Un(e),o=s!==e&&!Ve(e);let i=n,l=!1;s!==e&&(o?(l=r.length===0,i=function(f,u,h){return l&&(l=!1,f=rt(e,f)),n.call(this,f,rt(e,u),h,e)}):n.length>3&&(i=function(f,u,h){return n.call(this,f,u,h,e)}));const c=s[t](i,...r);return l?rt(e,c):c}function nr(e,t,n){const r=J(e);Re(r,"iterate",fn);const s=r[t](...n);return(s===-1||s===!1)&&Ur(n[0])?(n[0]=J(n[0]),r[t](...n)):s}function Qt(e,t,n=[]){pt(),Nr();const r=J(e)[t].apply(e,n);return Ir(),gt(),r}const ul=Pr("__proto__,__v_isRef,__isVue"),Po=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ke));function fl(e){Ke(e)||(e=String(e));const t=J(this);return Re(t,"has",e),t.hasOwnProperty(e)}class To{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const s=this._isReadonly,o=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return o;if(n==="__v_raw")return r===(s?o?xl:jo:o?Oo:$o).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=F(t);if(!s){let c;if(i&&(c=cl[n]))return c;if(n==="hasOwnProperty")return fl}const l=Reflect.get(t,n,ke(t)?t:r);if((Ke(n)?Po.has(n):ul(n))||(s||Re(t,"get",n),o))return l;if(ke(l)){const c=i&&Mr(n)?l:l.value;return s&&Z(c)?Cn(c):c}return Z(l)?s?Cn(l):qn(l):l}}class Mo extends To{constructor(t=!1){super(!1,t)}set(t,n,r,s){let o=t[n];const i=F(t)&&Mr(n);if(!this._isShallow){const f=mt(o);if(!Ve(r)&&!mt(r)&&(o=J(o),r=J(r)),!i&&ke(o)&&!ke(r))return f||(o.value=r),!0}const l=i?Number(n)e,bn=e=>Reflect.getPrototypeOf(e);function ml(e,t,n){return function(...r){const s=this.__v_raw,o=J(s),i=Dt(o),l=e==="entries"||e===Symbol.iterator&&i,c=e==="keys"&&i,f=s[e](...r),u=n?mr:t?qt:We;return!t&&Re(o,"iterate",c?gr:At),Ee(Object.create(f),{next(){const{value:h,done:p}=f.next();return p?{value:h,done:p}:{value:l?[u(h[0]),u(h[1])]:u(h),done:p}}})}}function xn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function yl(e,t){const n={get(s){const o=this.__v_raw,i=J(o),l=J(s);e||(ot(s,l)&&Re(i,"get",s),Re(i,"get",l));const{has:c}=bn(i),f=t?mr:e?qt:We;if(c.call(i,s))return f(o.get(s));if(c.call(i,l))return f(o.get(l));o!==i&&o.get(s)},get size(){const s=this.__v_raw;return!e&&Re(J(s),"iterate",At),s.size},has(s){const o=this.__v_raw,i=J(o),l=J(s);return e||(ot(s,l)&&Re(i,"has",s),Re(i,"has",l)),s===l?o.has(s):o.has(s)||o.has(l)},forEach(s,o){const i=this,l=i.__v_raw,c=J(l),f=t?mr:e?qt:We;return!e&&Re(c,"iterate",At),l.forEach((u,h)=>s.call(o,f(u),f(h),i))}};return Ee(n,e?{add:xn("add"),set:xn("set"),delete:xn("delete"),clear:xn("clear")}:{add(s){const o=J(this),i=bn(o),l=J(s),c=!t&&!Ve(s)&&!mt(s)?l:s;return i.has.call(o,c)||ot(s,c)&&i.has.call(o,s)||ot(l,c)&&i.has.call(o,l)||(o.add(c),dt(o,"add",c,c)),this},set(s,o){!t&&!Ve(o)&&!mt(o)&&(o=J(o));const i=J(this),{has:l,get:c}=bn(i);let f=l.call(i,s);f||(s=J(s),f=l.call(i,s));const u=c.call(i,s);return i.set(s,o),f?ot(o,u)&&dt(i,"set",s,o):dt(i,"add",s,o),this},delete(s){const o=J(this),{has:i,get:l}=bn(o);let c=i.call(o,s);c||(s=J(s),c=i.call(o,s)),l&&l.call(o,s);const f=o.delete(s);return c&&dt(o,"delete",s,void 0),f},clear(){const s=J(this),o=s.size!==0,i=s.clear();return o&&dt(s,"clear",void 0,void 0),i}}),["keys","values","entries",Symbol.iterator].forEach(s=>{n[s]=ml(s,e,t)}),n}function Fr(e,t){const n=yl(e,t);return(r,s,o)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(Y(n,s)&&s in r?n:r,s,o)}const _l={get:Fr(!1,!1)},vl={get:Fr(!1,!0)},bl={get:Fr(!0,!1)};const $o=new WeakMap,Oo=new WeakMap,jo=new WeakMap,xl=new WeakMap;function wl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function qn(e){return mt(e)?e:Hr(e,!1,hl,_l,$o)}function No(e){return Hr(e,!1,gl,vl,Oo)}function Cn(e){return Hr(e,!0,pl,bl,jo)}function Hr(e,t,n,r,s){if(!Z(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;const o=s.get(e);if(o)return o;const i=wl(Gi(e));if(i===0)return e;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function Pt(e){return mt(e)?Pt(e.__v_raw):!!(e&&e.__v_isReactive)}function mt(e){return!!(e&&e.__v_isReadonly)}function Ve(e){return!!(e&&e.__v_isShallow)}function Ur(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function Sl(e){return!Y(e,"__v_skip")&&Object.isExtensible(e)&&yo(e,"__v_skip",!0),e}const We=e=>Z(e)?qn(e):e,qt=e=>Z(e)?Cn(e):e;function ke(e){return e?e.__v_isRef===!0:!1}function Ie(e){return Io(e,!1)}function El(e){return Io(e,!0)}function Io(e,t){return ke(e)?e:new Rl(e,t)}class Rl{constructor(t,n){this.dep=new Dr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:J(t),this._value=n?t:We(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||Ve(t)||mt(t);t=r?t:J(t),ot(t,n)&&(this._rawValue=t,this._value=r?t:We(t),this.dep.trigger())}}function X(e){return ke(e)?e.value:e}const Cl={get:(e,t,n)=>t==="__v_raw"?e:X(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return ke(s)&&!ke(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Lo(e){return Pt(e)?e:new Proxy(e,Cl)}class kl{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Dr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=un-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&ie!==this)return So(this,!0),!0}get value(){const t=this.dep.track();return Co(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Al(e,t,n=!1){let r,s;return U(e)?r=e:(r=e.get,s=e.set),new kl(r,s,n)}const wn={},kn=new WeakMap;let Ct;function Pl(e,t=!1,n=Ct){if(n){let r=kn.get(n);r||kn.set(n,r=[]),r.push(e)}}function Tl(e,t,n=re){const{immediate:r,deep:s,once:o,scheduler:i,augmentJob:l,call:c}=n,f=$=>s?$:Ve($)||s===!1||s===0?ht($,1):ht($);let u,h,p,g,R=!1,w=!1;if(ke(e)?(h=()=>e.value,R=Ve(e)):Pt(e)?(h=()=>f(e),R=!0):F(e)?(w=!0,R=e.some($=>Pt($)||Ve($)),h=()=>e.map($=>{if(ke($))return $.value;if(Pt($))return f($);if(U($))return c?c($,2):$()})):U(e)?t?h=c?()=>c(e,2):e:h=()=>{if(p){pt();try{p()}finally{gt()}}const $=Ct;Ct=u;try{return c?c(e,3,[g]):e(g)}finally{Ct=$}}:h=it,t&&s){const $=h,G=s===!0?1/0:s;h=()=>ht($(),G)}const I=ol(),O=()=>{u.stop(),I&&I.active&&Tr(I.effects,u)};if(o&&t){const $=t;t=(...G)=>{$(...G),O()}}let k=w?new Array(e.length).fill(wn):wn;const M=$=>{if(!(!(u.flags&1)||!u.dirty&&!$))if(t){const G=u.run();if(s||R||(w?G.some((me,se)=>ot(me,k[se])):ot(G,k))){p&&p();const me=Ct;Ct=u;try{const se=[G,k===wn?void 0:w&&k[0]===wn?[]:k,g];k=G,c?c(t,3,se):t(...se)}finally{Ct=me}}}else u.run()};return l&&l(M),u=new xo(h),u.scheduler=i?()=>i(M,!1):M,g=$=>Pl($,!1,u),p=u.onStop=()=>{const $=kn.get(u);if($){if(c)c($,4);else for(const G of $)G();kn.delete(u)}},t?r?M(!0):k=u.run():i?i(M.bind(null,!0),!0):u.run(),O.pause=u.pause.bind(u),O.resume=u.resume.bind(u),O.stop=O,O}function ht(e,t=1/0,n){if(t<=0||!Z(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,ke(e))ht(e.value,t,n);else if(F(e))for(let r=0;r{ht(r,t,n)});else if(mo(e)){for(const r in e)ht(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&ht(e[r],t,n)}return e}function _n(e,t,n,r){try{return r?e(...r):e()}catch(s){Vn(s,t,n)}}function Ge(e,t,n,r){if(U(e)){const s=_n(e,t,n,r);return s&&po(s)&&s.catch(o=>{Vn(o,t,n)}),s}if(F(e)){const s=[];for(let o=0;o>>1,s=Me[r],o=dn(s);o=dn(n)?Me.push(e):Me.splice($l(t),0,e),e.flags|=1,Ho()}}function Ho(){An||(An=Do.then(qo))}function Ol(e){F(e)?Ft.push(...e):bt&&e.id===-1?bt.splice(Ot+1,0,e):e.flags&1||(Ft.push(e),e.flags|=1),Ho()}function ls(e,t,n=nt+1){for(;ndn(n)-dn(r));if(Ft.length=0,bt){bt.push(...t);return}for(bt=t,Ot=0;Ote.id==null?e.flags&2?-1:1/0:e.id;function qo(e){try{for(nt=0;nt{r._d&&$n(-1);const o=Pn(t);let i;try{i=e(...s)}finally{Pn(o),r._d&&$n(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function cs(e,t){if(Se===null)return e;const n=Gn(Se),r=e.dirs||(e.dirs=[]);for(let s=0;s1)return n&&U(t)?t.call(r&&r.proxy):t}}const jl=Symbol.for("v-scx"),Nl=()=>ze(jl);function sn(e,t,n){return zo(e,t,n)}function zo(e,t,n=re){const{immediate:r,deep:s,flush:o,once:i}=n,l=Ee({},n),c=t&&r||!t&&o!=="post";let f;if(gn){if(o==="sync"){const g=Nl();f=g.__watcherHandles||(g.__watcherHandles=[])}else if(!c){const g=()=>{};return g.stop=it,g.resume=it,g.pause=it,g}}const u=Ce;l.call=(g,R,w)=>Ge(g,u,R,w);let h=!1;o==="post"?l.scheduler=g=>{Ne(g,u&&u.suspense)}:o!=="sync"&&(h=!0,l.scheduler=(g,R)=>{R?g():qr(g)}),l.augmentJob=g=>{t&&(g.flags|=4),h&&(g.flags|=2,u&&(g.id=u.uid,g.i=u))};const p=Tl(e,t,l);return gn&&(f?f.push(p):c&&p()),p}function Il(e,t,n){const r=this.proxy,s=ae(e)?e.includes(".")?Bo(r,e):()=>r[e]:e.bind(r,r);let o;U(t)?o=t:(o=t.handler,n=t);const i=vn(this),l=zo(s,o.bind(r),n);return i(),l}function Bo(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;se.__isTeleport,rr=Symbol("_leaveCb");function Vr(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Vr(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function lt(e,t){return U(e)?Ee({name:e.name},t,{setup:e}):e}function Ko(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function as(e,t){let n;return!!((n=Object.getOwnPropertyDescriptor(e,t))&&!n.configurable)}const Tn=new WeakMap;function on(e,t,n,r,s=!1){if(F(e)){e.forEach((w,I)=>on(w,t&&(F(t)?t[I]:t),n,r,s));return}if(Ht(r)&&!s){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&on(e,t,n,r.component.subTree);return}const o=r.shapeFlag&4?Gn(r.component):r.el,i=s?null:o,{i:l,r:c}=e,f=t&&t.r,u=l.refs===re?l.refs={}:l.refs,h=l.setupState,p=J(h),g=h===re?fo:w=>as(u,w)?!1:Y(p,w),R=(w,I)=>!(I&&as(u,I));if(f!=null&&f!==c){if(us(t),ae(f))u[f]=null,g(f)&&(h[f]=null);else if(ke(f)){const w=t;R(f,w.k)&&(f.value=null),w.k&&(u[w.k]=null)}}if(U(c))_n(c,l,12,[i,u]);else{const w=ae(c),I=ke(c);if(w||I){const O=()=>{if(e.f){const k=w?g(c)?h[c]:u[c]:R()||!e.k?c.value:u[e.k];if(s)F(k)&&Tr(k,o);else if(F(k))k.includes(o)||k.push(o);else if(w)u[c]=[o],g(c)&&(h[c]=u[c]);else{const M=[o];R(c,e.k)&&(c.value=M),e.k&&(u[e.k]=M)}}else w?(u[c]=i,g(c)&&(h[c]=i)):I&&(R(c,e.k)&&(c.value=i),e.k&&(u[e.k]=i))};if(i){const k=()=>{O(),Tn.delete(e)};k.id=-1,Tn.set(e,k),Ne(k,n)}else us(e),O()}}}function us(e){const t=Tn.get(e);t&&(t.flags|=8,Tn.delete(e))}Hn().requestIdleCallback;Hn().cancelIdleCallback;const Ht=e=>!!e.type.__asyncLoader,Wo=e=>e.type.__isKeepAlive;function Fl(e,t){Go(e,"a",t)}function Hl(e,t){Go(e,"da",t)}function Go(e,t,n=Ce){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Bn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)Wo(s.parent.vnode)&&Ul(r,t,n,s),s=s.parent}}function Ul(e,t,n,r){const s=Bn(t,e,r,!0);Qo(()=>{Tr(r[t],s)},n)}function Bn(e,t,n=Ce,r=!1){if(n){const s=n[e]||(n[e]=[]),o=t.__weh||(t.__weh=(...i)=>{pt();const l=vn(n),c=Ge(t,n,e,i);return l(),gt(),c});return r?s.unshift(o):s.push(o),o}}const _t=e=>(t,n=Ce)=>{(!gn||e==="sp")&&Bn(e,(...r)=>t(...r),n)},ql=_t("bm"),Vl=_t("m"),zl=_t("bu"),Bl=_t("u"),Kl=_t("bum"),Qo=_t("um"),Wl=_t("sp"),Gl=_t("rtg"),Ql=_t("rtc");function Jl(e,t=Ce){Bn("ec",e,t)}const Yl="components",Jo=Symbol.for("v-ndc");function Yo(e){return ae(e)?Xl(Yl,e,!1)||e:e||Jo}function Xl(e,t,n=!0,r=!1){const s=Se||Ce;if(s){const o=s.type;{const l=Dc(o,!1);if(l&&(l===t||l===$e(t)||l===Fn($e(t))))return o}const i=fs(s[e]||o[e],t)||fs(s.appContext[e],t);return!i&&r?o:i}}function fs(e,t){return e&&(e[t]||e[$e(t)]||e[Fn($e(t))])}function kt(e,t,n,r){let s;const o=n,i=F(e);if(i||ae(e)){const l=i&&Pt(e);let c=!1,f=!1;l&&(c=!Ve(e),f=mt(e),e=Un(e)),s=new Array(e.length);for(let u=0,h=e.length;ut(l,c,void 0,o));else{const l=Object.keys(e);s=new Array(l.length);for(let c=0,f=l.length;c0;return V(),Qe(fe,null,[ge("slot",n,r)],f?-2:64)}let o=e[t];o&&o._c&&(o._d=!1),V();const i=o&&Xo(o(n)),l=n.key||i&&i.key,c=Qe(fe,{key:(l&&!Ke(l)?l:`_${t}`)+(!i&&r?"_fb":"")},i||[],i&&e._===1?64:-2);return c.scopeId&&(c.slotScopeIds=[c.scopeId+"-s"]),o&&o._c&&(o._d=!0),c}function Xo(e){return e.some(t=>pn(t)?!(t.type===yt||t.type===fe&&!Xo(t.children)):!0)?e:null}const yr=e=>e?vi(e)?Gn(e):yr(e.parent):null,ln=Ee(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>yr(e.parent),$root:e=>yr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>ei(e),$forceUpdate:e=>e.f||(e.f=()=>{qr(e.update)}),$nextTick:e=>e.n||(e.n=Fo.bind(e.proxy)),$watch:e=>Il.bind(e)}),sr=(e,t)=>e!==re&&!e.__isScriptSetup&&Y(e,t),ec={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:o,accessCache:i,type:l,appContext:c}=e;if(t[0]!=="$"){const p=i[t];if(p!==void 0)switch(p){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return o[t]}else{if(sr(r,t))return i[t]=1,r[t];if(s!==re&&Y(s,t))return i[t]=2,s[t];if(Y(o,t))return i[t]=3,o[t];if(n!==re&&Y(n,t))return i[t]=4,n[t];_r&&(i[t]=0)}}const f=ln[t];let u,h;if(f)return t==="$attrs"&&Re(e.attrs,"get",""),f(e);if((u=l.__cssModules)&&(u=u[t]))return u;if(n!==re&&Y(n,t))return i[t]=4,n[t];if(h=c.config.globalProperties,Y(h,t))return h[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:o}=e;return sr(s,t)?(s[t]=n,!0):r!==re&&Y(r,t)?(r[t]=n,!0):Y(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(o[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,props:o,type:i}},l){let c;return!!(n[l]||e!==re&&l[0]!=="$"&&Y(e,l)||sr(t,l)||Y(o,l)||Y(r,l)||Y(ln,l)||Y(s.config.globalProperties,l)||(c=i.__cssModules)&&c[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Y(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function ds(e){return F(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let _r=!0;function tc(e){const t=ei(e),n=e.proxy,r=e.ctx;_r=!1,t.beforeCreate&&hs(t.beforeCreate,e,"bc");const{data:s,computed:o,methods:i,watch:l,provide:c,inject:f,created:u,beforeMount:h,mounted:p,beforeUpdate:g,updated:R,activated:w,deactivated:I,beforeDestroy:O,beforeUnmount:k,destroyed:M,unmounted:$,render:G,renderTracked:me,renderTriggered:se,errorCaptured:He,serverPrefetch:Ue,expose:Oe,inheritAttrs:qe,components:Ye,directives:je,filters:St}=t;if(f&&nc(f,r,null),i)for(const K in i){const z=i[K];U(z)&&(r[K]=z.bind(n))}if(s){const K=s.call(n,n);Z(K)&&(e.data=qn(K))}if(_r=!0,o)for(const K in o){const z=o[K],ye=U(z)?z.bind(n,n):U(z.get)?z.get.bind(n,n):it,ee=!U(z)&&U(z.set)?z.set.bind(n):it,Le=ce({get:ye,set:ee});Object.defineProperty(r,K,{enumerable:!0,configurable:!0,get:()=>Le.value,set:_e=>Le.value=_e})}if(l)for(const K in l)Zo(l[K],r,n,K);if(c){const K=U(c)?c.call(n):c;Reflect.ownKeys(K).forEach(z=>{En(z,K[z])})}u&&hs(u,e,"c");function he(K,z){F(z)?z.forEach(ye=>K(ye.bind(n))):z&&K(z.bind(n))}if(he(ql,h),he(Vl,p),he(zl,g),he(Bl,R),he(Fl,w),he(Hl,I),he(Jl,He),he(Ql,me),he(Gl,se),he(Kl,k),he(Qo,$),he(Wl,Ue),F(Oe))if(Oe.length){const K=e.exposed||(e.exposed={});Oe.forEach(z=>{Object.defineProperty(K,z,{get:()=>n[z],set:ye=>n[z]=ye,enumerable:!0})})}else e.exposed||(e.exposed={});G&&e.render===it&&(e.render=G),qe!=null&&(e.inheritAttrs=qe),Ye&&(e.components=Ye),je&&(e.directives=je),Ue&&Ko(e)}function nc(e,t,n=it){F(e)&&(e=vr(e));for(const r in e){const s=e[r];let o;Z(s)?"default"in s?o=ze(s.from||r,s.default,!0):o=ze(s.from||r):o=ze(s),ke(o)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>o.value,set:i=>o.value=i}):t[r]=o}}function hs(e,t,n){Ge(F(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Zo(e,t,n,r){let s=r.includes(".")?Bo(n,r):()=>n[r];if(ae(e)){const o=t[e];U(o)&&sn(s,o)}else if(U(e))sn(s,e.bind(n));else if(Z(e))if(F(e))e.forEach(o=>Zo(o,t,n,r));else{const o=U(e.handler)?e.handler.bind(n):t[e.handler];U(o)&&sn(s,o,e)}}function ei(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:o,config:{optionMergeStrategies:i}}=e.appContext,l=o.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(f=>Mn(c,f,i,!0)),Mn(c,t,i)),Z(t)&&o.set(t,c),c}function Mn(e,t,n,r=!1){const{mixins:s,extends:o}=t;o&&Mn(e,o,n,!0),s&&s.forEach(i=>Mn(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const l=rc[i]||n&&n[i];e[i]=l?l(e[i],t[i]):t[i]}return e}const rc={data:ps,props:gs,emits:gs,methods:Xt,computed:Xt,beforeCreate:Te,created:Te,beforeMount:Te,mounted:Te,beforeUpdate:Te,updated:Te,beforeDestroy:Te,beforeUnmount:Te,destroyed:Te,unmounted:Te,activated:Te,deactivated:Te,errorCaptured:Te,serverPrefetch:Te,components:Xt,directives:Xt,watch:oc,provide:ps,inject:sc};function ps(e,t){return t?e?function(){return Ee(U(e)?e.call(this,this):e,U(t)?t.call(this,this):t)}:t:e}function sc(e,t){return Xt(vr(e),vr(t))}function vr(e){if(F(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${$e(t)}Modifiers`]||e[`${Tt(t)}Modifiers`];function ac(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||re;let s=n;const o=t.startsWith("update:"),i=o&&cc(r,t.slice(7));i&&(i.trim&&(s=n.map(u=>ae(u)?u.trim():u)),i.number&&(s=n.map($r)));let l,c=r[l=Xn(t)]||r[l=Xn($e(t))];!c&&o&&(c=r[l=Xn(Tt(t))]),c&&Ge(c,e,6,s);const f=r[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ge(f,e,6,s)}}const uc=new WeakMap;function ni(e,t,n=!1){const r=n?uc:t.emitsCache,s=r.get(e);if(s!==void 0)return s;const o=e.emits;let i={},l=!1;if(!U(e)){const c=f=>{const u=ni(f,t,!0);u&&(l=!0,Ee(i,u))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!o&&!l?(Z(e)&&r.set(e,null),null):(F(o)?o.forEach(c=>i[c]=null):Ee(i,o),Z(e)&&r.set(e,i),i)}function Kn(e,t){return!e||!In(t)?!1:(t=t.slice(2).replace(/Once$/,""),Y(e,t[0].toLowerCase()+t.slice(1))||Y(e,Tt(t))||Y(e,t))}function ms(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[o],slots:i,attrs:l,emit:c,render:f,renderCache:u,props:h,data:p,setupState:g,ctx:R,inheritAttrs:w}=e,I=Pn(e);let O,k;try{if(n.shapeFlag&4){const $=s||r,G=$;O=st(f.call(G,$,u,h,g,p,R)),k=l}else{const $=t;O=st($.length>1?$(h,{attrs:l,slots:i,emit:c}):$(h,null)),k=t.props?l:fc(l)}}catch($){cn.length=0,Vn($,e,1),O=ge(yt)}let M=O;if(k&&w!==!1){const $=Object.keys(k),{shapeFlag:G}=M;$.length&&G&7&&(o&&$.some(Ln)&&(k=dc(k,o)),M=Vt(M,k,!1,!0))}return n.dirs&&(M=Vt(M,null,!1,!0),M.dirs=M.dirs?M.dirs.concat(n.dirs):n.dirs),n.transition&&Vr(M,n.transition),O=M,Pn(I),O}const fc=e=>{let t;for(const n in e)(n==="class"||n==="style"||In(n))&&((t||(t={}))[n]=e[n]);return t},dc=(e,t)=>{const n={};for(const r in e)(!Ln(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function hc(e,t,n){const{props:r,children:s,component:o}=e,{props:i,children:l,patchFlag:c}=t,f=o.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?ys(r,i,f):!!i;if(c&8){const u=t.dynamicProps;for(let h=0;hObject.create(si),ii=e=>Object.getPrototypeOf(e)===si;function gc(e,t,n,r=!1){const s={},o=oi();e.propsDefaults=Object.create(null),li(e,t,s,o);for(const i in e.propsOptions[0])i in s||(s[i]=void 0);n?e.props=r?s:No(s):e.type.props?e.props=s:e.props=o,e.attrs=o}function mc(e,t,n,r){const{props:s,attrs:o,vnode:{patchFlag:i}}=e,l=J(s),[c]=e.propsOptions;let f=!1;if((r||i>0)&&!(i&16)){if(i&8){const u=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[p,g]=ci(h,t,!0);Ee(i,p),g&&l.push(...g)};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}if(!o&&!c)return Z(e)&&r.set(e,Lt),Lt;if(F(o))for(let u=0;ue==="_"||e==="_ctx"||e==="$stable",Br=e=>F(e)?e.map(st):[st(e)],_c=(e,t,n)=>{if(t._n)return t;const r=zn((...s)=>Br(t(...s)),n);return r._c=!1,r},ai=(e,t,n)=>{const r=e._ctx;for(const s in e){if(zr(s))continue;const o=e[s];if(U(o))t[s]=_c(s,o,r);else if(o!=null){const i=Br(o);t[s]=()=>i}}},ui=(e,t)=>{const n=Br(t);e.slots.default=()=>n},fi=(e,t,n)=>{for(const r in t)(n||!zr(r))&&(e[r]=t[r])},vc=(e,t,n)=>{const r=e.slots=oi();if(e.vnode.shapeFlag&32){const s=t._;s?(fi(r,t,n),n&&yo(r,"_",s,!0)):ai(t,r)}else t&&ui(e,t)},bc=(e,t,n)=>{const{vnode:r,slots:s}=e;let o=!0,i=re;if(r.shapeFlag&32){const l=t._;l?n&&l===1?o=!1:fi(s,t,n):(o=!t.$stable,ai(t,s)),i=t}else t&&(ui(e,t),i={default:1});if(o)for(const l in s)!zr(l)&&i[l]==null&&delete s[l]},Ne=Rc;function xc(e){return wc(e)}function wc(e,t){const n=Hn();n.__VUE__=!0;const{insert:r,remove:s,patchProp:o,createElement:i,createText:l,createComment:c,setText:f,setElementText:u,parentNode:h,nextSibling:p,setScopeId:g=it,insertStaticContent:R}=e,w=(a,d,m,v=null,b=null,_=null,C=void 0,E=null,S=!!d.dynamicChildren)=>{if(a===d)return;a&&!Jt(a,d)&&(v=y(a),_e(a,b,_,!0),a=null),d.patchFlag===-2&&(S=!1,d.dynamicChildren=null);const{type:x,ref:L,shapeFlag:P}=d;switch(x){case Wn:I(a,d,m,v);break;case yt:O(a,d,m,v);break;case ir:a==null&&k(d,m,v,C);break;case fe:Ye(a,d,m,v,b,_,C,E,S);break;default:P&1?G(a,d,m,v,b,_,C,E,S):P&6?je(a,d,m,v,b,_,C,E,S):(P&64||P&128)&&x.process(a,d,m,v,b,_,C,E,S,j)}L!=null&&b?on(L,a&&a.ref,_,d||a,!d):L==null&&a&&a.ref!=null&&on(a.ref,null,_,a,!0)},I=(a,d,m,v)=>{if(a==null)r(d.el=l(d.children),m,v);else{const b=d.el=a.el;d.children!==a.children&&f(b,d.children)}},O=(a,d,m,v)=>{a==null?r(d.el=c(d.children||""),m,v):d.el=a.el},k=(a,d,m,v)=>{[a.el,a.anchor]=R(a.children,d,m,v,a.el,a.anchor)},M=({el:a,anchor:d},m,v)=>{let b;for(;a&&a!==d;)b=p(a),r(a,m,v),a=b;r(d,m,v)},$=({el:a,anchor:d})=>{let m;for(;a&&a!==d;)m=p(a),s(a),a=m;s(d)},G=(a,d,m,v,b,_,C,E,S)=>{if(d.type==="svg"?C="svg":d.type==="math"&&(C="mathml"),a==null)me(d,m,v,b,_,C,E,S);else{const x=a.el&&a.el._isVueCE?a.el:null;try{x&&x._beginPatch(),Ue(a,d,b,_,C,E,S)}finally{x&&x._endPatch()}}},me=(a,d,m,v,b,_,C,E)=>{let S,x;const{props:L,shapeFlag:P,transition:N,dirs:D}=a;if(S=a.el=i(a.type,_,L&&L.is,L),P&8?u(S,a.children):P&16&&He(a.children,S,null,v,b,or(a,_),C,E),D&&Et(a,null,v,"created"),se(S,a,a.scopeId,C,v),L){for(const ne in L)ne!=="value"&&!tn(ne)&&o(S,ne,null,L[ne],_,v);"value"in L&&o(S,"value",null,L.value,_),(x=L.onVnodeBeforeMount)&&tt(x,v,a)}D&&Et(a,null,v,"beforeMount");const W=Sc(b,N);W&&N.beforeEnter(S),r(S,d,m),((x=L&&L.onVnodeMounted)||W||D)&&Ne(()=>{x&&tt(x,v,a),W&&N.enter(S),D&&Et(a,null,v,"mounted")},b)},se=(a,d,m,v,b)=>{if(m&&g(a,m),v)for(let _=0;_{for(let x=S;x{const E=d.el=a.el;let{patchFlag:S,dynamicChildren:x,dirs:L}=d;S|=a.patchFlag&16;const P=a.props||re,N=d.props||re;let D;if(m&&Rt(m,!1),(D=N.onVnodeBeforeUpdate)&&tt(D,m,d,a),L&&Et(d,a,m,"beforeUpdate"),m&&Rt(m,!0),(P.innerHTML&&N.innerHTML==null||P.textContent&&N.textContent==null)&&u(E,""),x?Oe(a.dynamicChildren,x,E,m,v,or(d,b),_):C||z(a,d,E,null,m,v,or(d,b),_,!1),S>0){if(S&16)qe(E,P,N,m,b);else if(S&2&&P.class!==N.class&&o(E,"class",null,N.class,b),S&4&&o(E,"style",P.style,N.style,b),S&8){const W=d.dynamicProps;for(let ne=0;ne{D&&tt(D,m,d,a),L&&Et(d,a,m,"updated")},v)},Oe=(a,d,m,v,b,_,C)=>{for(let E=0;E{if(d!==m){if(d!==re)for(const _ in d)!tn(_)&&!(_ in m)&&o(a,_,d[_],null,b,v);for(const _ in m){if(tn(_))continue;const C=m[_],E=d[_];C!==E&&_!=="value"&&o(a,_,E,C,b,v)}"value"in m&&o(a,"value",d.value,m.value,b)}},Ye=(a,d,m,v,b,_,C,E,S)=>{const x=d.el=a?a.el:l(""),L=d.anchor=a?a.anchor:l("");let{patchFlag:P,dynamicChildren:N,slotScopeIds:D}=d;D&&(E=E?E.concat(D):D),a==null?(r(x,m,v),r(L,m,v),He(d.children||[],m,L,b,_,C,E,S)):P>0&&P&64&&N&&a.dynamicChildren&&a.dynamicChildren.length===N.length?(Oe(a.dynamicChildren,N,m,b,_,C,E),(d.key!=null||b&&d===b.subTree)&&di(a,d,!0)):z(a,d,m,L,b,_,C,E,S)},je=(a,d,m,v,b,_,C,E,S)=>{d.slotScopeIds=E,a==null?d.shapeFlag&512?b.ctx.activate(d,m,v,C,S):St(d,m,v,b,_,C,S):Ae(a,d,S)},St=(a,d,m,v,b,_,C)=>{const E=a.component=$c(a,v,b);if(Wo(a)&&(E.ctx.renderer=j),jc(E,!1,C),E.asyncDep){if(b&&b.registerDep(E,he,C),!a.el){const S=E.subTree=ge(yt);O(null,S,d,m),a.placeholder=S.el}}else he(E,a,d,m,b,_,C)},Ae=(a,d,m)=>{const v=d.component=a.component;if(hc(a,d,m))if(v.asyncDep&&!v.asyncResolved){K(v,d,m);return}else v.next=d,v.update();else d.el=a.el,v.vnode=d},he=(a,d,m,v,b,_,C)=>{const E=()=>{if(a.isMounted){let{next:P,bu:N,u:D,parent:W,vnode:ne}=a;{const Ze=hi(a);if(Ze){P&&(P.el=ne.el,K(a,P,C)),Ze.asyncDep.then(()=>{Ne(()=>{a.isUnmounted||x()},b)});return}}let te=P,pe;Rt(a,!1),P?(P.el=ne.el,K(a,P,C)):P=ne,N&&Sn(N),(pe=P.props&&P.props.onVnodeBeforeUpdate)&&tt(pe,W,P,ne),Rt(a,!0);const be=ms(a),Xe=a.subTree;a.subTree=be,w(Xe,be,h(Xe.el),y(Xe),a,b,_),P.el=be.el,te===null&&pc(a,be.el),D&&Ne(D,b),(pe=P.props&&P.props.onVnodeUpdated)&&Ne(()=>tt(pe,W,P,ne),b)}else{let P;const{el:N,props:D}=d,{bm:W,m:ne,parent:te,root:pe,type:be}=a,Xe=Ht(d);Rt(a,!1),W&&Sn(W),!Xe&&(P=D&&D.onVnodeBeforeMount)&&tt(P,te,d),Rt(a,!0);{pe.ce&&pe.ce._hasShadowRoot()&&pe.ce._injectChildStyle(be,a.parent?a.parent.type:void 0);const Ze=a.subTree=ms(a);w(null,Ze,m,v,a,b,_),d.el=Ze.el}if(ne&&Ne(ne,b),!Xe&&(P=D&&D.onVnodeMounted)){const Ze=d;Ne(()=>tt(P,te,Ze),b)}(d.shapeFlag&256||te&&Ht(te.vnode)&&te.vnode.shapeFlag&256)&&a.a&&Ne(a.a,b),a.isMounted=!0,d=m=v=null}};a.scope.on();const S=a.effect=new xo(E);a.scope.off();const x=a.update=S.run.bind(S),L=a.job=S.runIfDirty.bind(S);L.i=a,L.id=a.uid,S.scheduler=()=>qr(L),Rt(a,!0),x()},K=(a,d,m)=>{d.component=a;const v=a.vnode.props;a.vnode=d,a.next=null,mc(a,d.props,v,m),bc(a,d.children,m),pt(),ls(a),gt()},z=(a,d,m,v,b,_,C,E,S=!1)=>{const x=a&&a.children,L=a?a.shapeFlag:0,P=d.children,{patchFlag:N,shapeFlag:D}=d;if(N>0){if(N&128){ee(x,P,m,v,b,_,C,E,S);return}else if(N&256){ye(x,P,m,v,b,_,C,E,S);return}}D&8?(L&16&&ve(x,b,_),P!==x&&u(m,P)):L&16?D&16?ee(x,P,m,v,b,_,C,E,S):ve(x,b,_,!0):(L&8&&u(m,""),D&16&&He(P,m,v,b,_,C,E,S))},ye=(a,d,m,v,b,_,C,E,S)=>{a=a||Lt,d=d||Lt;const x=a.length,L=d.length,P=Math.min(x,L);let N;for(N=0;NL?ve(a,b,_,!0,!1,P):He(d,m,v,b,_,C,E,S,P)},ee=(a,d,m,v,b,_,C,E,S)=>{let x=0;const L=d.length;let P=a.length-1,N=L-1;for(;x<=P&&x<=N;){const D=a[x],W=d[x]=S?ft(d[x]):st(d[x]);if(Jt(D,W))w(D,W,m,null,b,_,C,E,S);else break;x++}for(;x<=P&&x<=N;){const D=a[P],W=d[N]=S?ft(d[N]):st(d[N]);if(Jt(D,W))w(D,W,m,null,b,_,C,E,S);else break;P--,N--}if(x>P){if(x<=N){const D=N+1,W=DN)for(;x<=P;)_e(a[x],b,_,!0),x++;else{const D=x,W=x,ne=new Map;for(x=W;x<=N;x++){const De=d[x]=S?ft(d[x]):st(d[x]);De.key!=null&&ne.set(De.key,x)}let te,pe=0;const be=N-W+1;let Xe=!1,Ze=0;const Gt=new Array(be);for(x=0;x=be){_e(De,b,_,!0);continue}let et;if(De.key!=null)et=ne.get(De.key);else for(te=W;te<=N;te++)if(Gt[te-W]===0&&Jt(De,d[te])){et=te;break}et===void 0?_e(De,b,_,!0):(Gt[et-W]=x+1,et>=Ze?Ze=et:Xe=!0,w(De,d[et],m,null,b,_,C,E,S),pe++)}const es=Xe?Ec(Gt):Lt;for(te=es.length-1,x=be-1;x>=0;x--){const De=W+x,et=d[De],ts=d[De+1],ns=De+1{const{el:_,type:C,transition:E,children:S,shapeFlag:x}=a;if(x&6){Le(a.component.subTree,d,m,v);return}if(x&128){a.suspense.move(d,m,v);return}if(x&64){C.move(a,d,m,j);return}if(C===fe){r(_,d,m);for(let P=0;PE.enter(_),b));else{const{leave:P,delayLeave:N,afterLeave:D}=E,W=()=>{a.ctx.isUnmounted?s(_):r(_,d,m)},ne=()=>{const te=_._isLeaving||!!_[rr];_._isLeaving&&_[rr](!0),E.persisted&&!te?W():P(_,()=>{W(),D&&D()})};N?N(_,W,ne):ne()}else r(_,d,m)},_e=(a,d,m,v=!1,b=!1)=>{const{type:_,props:C,ref:E,children:S,dynamicChildren:x,shapeFlag:L,patchFlag:P,dirs:N,cacheIndex:D,memo:W}=a;if(P===-2&&(b=!1),E!=null&&(pt(),on(E,null,m,a,!0),gt()),D!=null&&(d.renderCache[D]=void 0),L&256){d.ctx.deactivate(a);return}const ne=L&1&&N,te=!Ht(a);let pe;if(te&&(pe=C&&C.onVnodeBeforeUnmount)&&tt(pe,d,a),L&6)Pe(a.component,m,v);else{if(L&128){a.suspense.unmount(m,v);return}ne&&Et(a,null,d,"beforeUnmount"),L&64?a.type.remove(a,d,m,j,v):x&&!x.hasOnce&&(_!==fe||P>0&&P&64)?ve(x,d,m,!1,!0):(_===fe&&P&384||!b&&L&16)&&ve(S,d,m),v&&ue(a)}const be=W!=null&&D==null;(te&&(pe=C&&C.onVnodeUnmounted)||ne||be)&&Ne(()=>{pe&&tt(pe,d,a),ne&&Et(a,null,d,"unmounted"),be&&(a.el=null)},m)},ue=a=>{const{type:d,el:m,anchor:v,transition:b}=a;if(d===fe){oe(m,v);return}if(d===ir){$(a);return}const _=()=>{s(m),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(a.shapeFlag&1&&b&&!b.persisted){const{leave:C,delayLeave:E}=b,S=()=>C(m,_);E?E(a.el,_,S):S()}else _()},oe=(a,d)=>{let m;for(;a!==d;)m=p(a),s(a),a=m;s(d)},Pe=(a,d,m)=>{const{bum:v,scope:b,job:_,subTree:C,um:E,m:S,a:x}=a;vs(S),vs(x),v&&Sn(v),b.stop(),_&&(_.flags|=8,_e(C,a,d,m)),E&&Ne(E,d),Ne(()=>{a.isUnmounted=!0},d)},ve=(a,d,m,v=!1,b=!1,_=0)=>{for(let C=_;C{if(a.shapeFlag&6)return y(a.component.subTree);if(a.shapeFlag&128)return a.suspense.next();const d=p(a.anchor||a.el),m=d&&d[Ll];return m?p(m):d};let T=!1;const A=(a,d,m)=>{let v;a==null?d._vnode&&(_e(d._vnode,null,null,!0),v=d._vnode.component):w(d._vnode||null,a,d,null,null,null,m),d._vnode=a,T||(T=!0,ls(v),Uo(),T=!1)},j={p:w,um:_e,m:Le,r:ue,mt:St,mc:He,pc:z,pbc:Oe,n:y,o:e};return{render:A,hydrate:void 0,createApp:lc(A)}}function or({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Rt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Sc(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function di(e,t,n=!1){const r=e.children,s=t.children;if(F(r)&&F(s))for(let o=0;o>1,e[n[l]]0&&(t[r]=n[o-1]),n[o]=r)}}for(o=n.length,i=n[o-1];o-- >0;)n[o]=i,i=t[i];return n}function hi(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:hi(t)}function vs(e){if(e)for(let t=0;te.__isSuspense;function Rc(e,t){t&&t.pendingBranch?F(e)?t.effects.push(...e):t.effects.push(e):Ol(e)}const fe=Symbol.for("v-fgt"),Wn=Symbol.for("v-txt"),yt=Symbol.for("v-cmt"),ir=Symbol.for("v-stc"),cn=[];let Fe=null;function V(e=!1){cn.push(Fe=e?null:[])}function Cc(){cn.pop(),Fe=cn[cn.length-1]||null}let hn=1;function $n(e,t=!1){hn+=e,e<0&&Fe&&t&&(Fe.hasOnce=!0)}function mi(e){return e.dynamicChildren=hn>0?Fe||Lt:null,Cc(),hn>0&&Fe&&Fe.push(e),e}function le(e,t,n,r,s,o){return mi(H(e,t,n,r,s,o,!0))}function Qe(e,t,n,r,s){return mi(ge(e,t,n,r,s,!0))}function pn(e){return e?e.__v_isVNode===!0:!1}function Jt(e,t){return e.type===t.type&&e.key===t.key}const yi=({key:e})=>e??null,Rn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ae(e)||ke(e)||U(e)?{i:Se,r:e,k:t,f:!!n}:e:null);function H(e,t=null,n=null,r=0,s=null,o=e===fe?0:1,i=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&yi(t),ref:t&&Rn(t),scopeId:Vo,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:o,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:Se};return l?(Kr(c,n),o&128&&e.normalize(c)):n&&(c.shapeFlag|=ae(n)?8:16),hn>0&&!i&&Fe&&(c.patchFlag>0||o&6)&&c.patchFlag!==32&&Fe.push(c),c}const ge=kc;function kc(e,t=null,n=null,r=0,s=null,o=!1){if((!e||e===Jo)&&(e=yt),pn(e)){const l=Vt(e,t,!0);return n&&Kr(l,n),hn>0&&!o&&Fe&&(l.shapeFlag&6?Fe[Fe.indexOf(e)]=l:Fe.push(l)),l.patchFlag=-2,l}if(Fc(e)&&(e=e.__vccOpts),t){t=Ac(t);let{class:l,style:c}=t;l&&!ae(l)&&(t.class=wt(l)),Z(c)&&(Ur(c)&&!F(c)&&(c=Ee({},c)),t.style=Or(c))}const i=ae(e)?1:gi(e)?128:Dl(e)?64:Z(e)?4:U(e)?2:0;return H(e,t,n,r,s,i,o,!0)}function Ac(e){return e?Ur(e)||ii(e)?Ee({},e):e:null}function Vt(e,t,n=!1,r=!1){const{props:s,ref:o,patchFlag:i,children:l,transition:c}=e,f=t?Pc(s||{},t):s,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&yi(f),ref:t&&t.ref?n&&o?F(o)?o.concat(Rn(t)):[o,Rn(t)]:Rn(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==fe?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Vt(e.ssContent),ssFallback:e.ssFallback&&Vt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&Vr(u,c.clone(u)),u}function _i(e=" ",t=0){return ge(Wn,null,e,t)}function jt(e="",t=!1){return t?(V(),Qe(yt,null,e)):ge(yt,null,e)}function st(e){return e==null||typeof e=="boolean"?ge(yt):F(e)?ge(fe,null,e.slice()):pn(e)?ft(e):ge(Wn,null,String(e))}function ft(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Vt(e)}function Kr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(F(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),Kr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!ii(t)?t._ctx=Se:s===3&&Se&&(Se.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else U(t)?(t={default:t,_ctx:Se},n=32):(t=String(t),r&64?(n=16,t=[_i(t)]):n=8);e.children=t,e.shapeFlag|=n}function Pc(...e){const t={};for(let n=0;nCe||Se;let On,xr;{const e=Hn(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),o=>{s.length>1?s.forEach(i=>i(o)):s[0](o)}};On=t("__VUE_INSTANCE_SETTERS__",n=>Ce=n),xr=t("__VUE_SSR_SETTERS__",n=>gn=n)}const vn=e=>{const t=Ce;return On(e),e.scope.on(),()=>{e.scope.off(),On(t)}},bs=()=>{Ce&&Ce.scope.off(),On(null)};function vi(e){return e.vnode.shapeFlag&4}let gn=!1;function jc(e,t=!1,n=!1){t&&xr(t);const{props:r,children:s}=e.vnode,o=vi(e);gc(e,r,o,t),vc(e,s,n||t);const i=o?Nc(e,t):void 0;return t&&xr(!1),i}function Nc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,ec);const{setup:r}=n;if(r){pt();const s=e.setupContext=r.length>1?Lc(e):null,o=vn(e),i=_n(r,e,0,[e.props,s]),l=po(i);if(gt(),o(),(l||e.sp)&&!Ht(e)&&Ko(e),l){if(i.then(bs,bs),t)return i.then(c=>{xs(e,c)}).catch(c=>{Vn(c,e,0)});e.asyncDep=i}else xs(e,i)}else bi(e)}function xs(e,t,n){U(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Z(t)&&(e.setupState=Lo(t)),bi(e)}function bi(e,t,n){const r=e.type;e.render||(e.render=r.render||it);{const s=vn(e);pt();try{tc(e)}finally{gt(),s()}}}const Ic={get(e,t){return Re(e,"get",""),e[t]}};function Lc(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Ic),slots:e.slots,emit:e.emit,expose:t}}function Gn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Lo(Sl(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in ln)return ln[n](e)},has(t,n){return n in t||n in ln}})):e.proxy}function Dc(e,t=!0){return U(e)?e.displayName||e.name:e.name||t&&e.__name}function Fc(e){return U(e)&&"__vccOpts"in e}const ce=(e,t)=>Al(e,t,gn);function mn(e,t,n){try{$n(-1);const r=arguments.length;return r===2?Z(t)&&!F(t)?pn(t)?ge(e,null,[t]):ge(e,t):ge(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&pn(n)&&(n=[n]),ge(e,t,n))}finally{$n(1)}}const Hc="3.5.35";let wr;const ws=typeof window<"u"&&window.trustedTypes;if(ws)try{wr=ws.createPolicy("vue",{createHTML:e=>e})}catch{}const xi=wr?e=>wr.createHTML(e):e=>e,Uc="http://www.w3.org/2000/svg",qc="http://www.w3.org/1998/Math/MathML",ut=typeof document<"u"?document:null,Ss=ut&&ut.createElement("template"),Vc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?ut.createElementNS(Uc,e):t==="mathml"?ut.createElementNS(qc,e):n?ut.createElement(e,{is:n}):ut.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>ut.createTextNode(e),createComment:e=>ut.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ut.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{Ss.innerHTML=xi(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const l=Ss.content;if(r==="svg"||r==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},zc=Symbol("_vtc");function Bc(e,t,n){const r=e[zc];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Es=Symbol("_vod"),Kc=Symbol("_vsh"),Wc=Symbol(""),Gc=/(?:^|;)\s*display\s*:/;function Qc(e,t,n){const r=e.style,s=ae(n);let o=!1;if(n&&!s){if(t)if(ae(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&Zt(r,l,"")}else for(const i in t)n[i]==null&&Zt(r,i,"");for(const i in n){i==="display"&&(o=!0);const l=n[i];l!=null?Yc(e,i,!ae(t)&&t?t[i]:void 0,l)||Zt(r,i,l):Zt(r,i,"")}}else if(s){if(t!==n){const i=r[Wc];i&&(n+=";"+i),r.cssText=n,o=Gc.test(n)}}else t&&e.removeAttribute("style");Es in e&&(e[Es]=o?r.display:"",e[Kc]&&(r.display="none"))}const Rs=/\s*!important$/;function Zt(e,t,n){if(F(n))n.forEach(r=>Zt(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Jc(e,t);Rs.test(n)?e.setProperty(Tt(r),n.replace(Rs,""),"important"):e[r]=n}}const Cs=["Webkit","Moz","ms"],lr={};function Jc(e,t){const n=lr[t];if(n)return n;let r=$e(t);if(r!=="filter"&&r in e)return lr[t]=r;r=Fn(r);for(let s=0;scr||(ta.then(()=>cr=0),cr=Date.now());function ra(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;const s=n.value;if(F(s)){const o=r.stopImmediatePropagation;r.stopImmediatePropagation=()=>{o.call(r),r._stopped=!0};const i=s.slice(),l=[r];for(let c=0;ce.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,sa=(e,t,n,r,s,o)=>{const i=s==="svg";t==="class"?Bc(e,r,i):t==="style"?Qc(e,n,r):In(t)?Ln(t)||Zc(e,t,n,r,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):oa(e,t,r,i))?(Ps(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&As(e,t,r,i,o,t!=="value")):e._isVueCE&&(ia(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!ae(r)))?Ps(e,$e(t),r,o,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),As(e,t,r,i))};function oa(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&$s(t)&&U(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return $s(t)&&ae(n)?!1:t in e}function ia(e,t){const n=e._def.props;if(!n)return!1;const r=$e(t);return Array.isArray(n)?n.some(s=>$e(s)===r):Object.keys(n).some(s=>$e(s)===r)}const Os=e=>{const t=e.props["onUpdate:modelValue"]||!1;return F(t)?n=>Sn(t,n):t};function la(e){e.target.composing=!0}function js(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ar=Symbol("_assign");function Ns(e,t,n){return t&&(e=e.trim()),n&&(e=$r(e)),e}const Is={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[ar]=Os(s);const o=r||s.props&&s.props.type==="number";Nt(e,t?"change":"input",i=>{i.target.composing||e[ar](Ns(e.value,n,o))}),(n||o)&&Nt(e,"change",()=>{e.value=Ns(e.value,n,o)}),t||(Nt(e,"compositionstart",la),Nt(e,"compositionend",js),Nt(e,"change",js))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:o}},i){if(e[ar]=Os(i),e.composing)return;const l=(o||e.type==="number")&&!/^0\d/.test(e.value)?$r(e.value):e.value,c=t??"";if(l===c)return;const f=e.getRootNode();(f instanceof Document||f instanceof ShadowRoot)&&f.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===c)||(e.value=c)}},ca=["ctrl","shift","alt","meta"],aa={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>ca.some(n=>e[`${n}Key`]&&!t.includes(n))},ua=(e,t)=>{if(!e)return e;const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=((s,...o)=>{for(let i=0;i{const t=da().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=ga(r);if(!s)return;const o=t._component;!U(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.nodeType===1&&(s.textContent="");const i=n(s,!1,pa(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t});function pa(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function ga(e){return ae(e)?document.querySelector(e):e}const It=typeof document<"u";function wi(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function ma(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&wi(e.default)}const Q=Object.assign;function ur(e,t){const n={};for(const r in t){const s=t[r];n[r]=Je(s)?s.map(e):e(s)}return n}const an=()=>{},Je=Array.isArray;function Ds(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}const Si=Symbol("");function zt(e,t){return Q(new Error,{type:e,[Si]:!0},t)}function at(e,t){return e instanceof Error&&Si in e&&(t==null||!!(e.type&t))}const ya=Symbol(""),Fs=Symbol(""),Qn=Symbol(""),Wr=Symbol(""),Sr=Symbol("");function _a(){return ze(Qn)}function Wt(e){return ze(Wr)}const Ei=/#/g,va=/&/g,ba=/\//g,xa=/=/g,wa=/\?/g,Ri=/\+/g,Sa=/%5B/g,Ea=/%5D/g,Ci=/%5E/g,Ra=/%60/g,ki=/%7B/g,Ca=/%7C/g,Ai=/%7D/g,ka=/%20/g;function Gr(e){return e==null?"":encodeURI(""+e).replace(Ca,"|").replace(Sa,"[").replace(Ea,"]")}function Aa(e){return Gr(e).replace(ki,"{").replace(Ai,"}").replace(Ci,"^")}function Er(e){return Gr(e).replace(Ri,"%2B").replace(ka,"+").replace(Ei,"%23").replace(va,"%26").replace(Ra,"`").replace(ki,"{").replace(Ai,"}").replace(Ci,"^")}function Pa(e){return Er(e).replace(xa,"%3D")}function Ta(e){return Gr(e).replace(Ei,"%23").replace(wa,"%3F")}function Ma(e){return Ta(e).replace(ba,"%2F")}function jn(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const $a=/\/$/,Oa=e=>e.replace($a,"");function fr(e,t,n="/"){let r,s={},o="",i="";const l=t.indexOf("#");let c=t.indexOf("?");return c=l>=0&&c>l?-1:c,c>=0&&(r=t.slice(0,c),o=t.slice(c,l>0?l:t.length),s=e(o.slice(1))),l>=0&&(r=r||t.slice(0,l),i=t.slice(l,t.length)),r=La(r??t,n),{fullPath:r+o+i,path:r,query:s,hash:jn(i)}}function ja(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Hs(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function Na(e,t,n){const r=t.matched.length-1,s=n.matched.length-1;return r>-1&&r===s&&Bt(t.matched[r],n.matched[s])&&Pi(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Bt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Pi(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!Ia(e[n],t[n]))return!1;return!0}function Ia(e,t){return Je(e)?Us(e,t):Je(t)?Us(t,e):(e&&e.valueOf())===(t&&t.valueOf())}function Us(e,t){return Je(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function La(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),s=r[r.length-1];(s===".."||s===".")&&r.push("");let o=n.length-1,i,l;for(i=0;i1&&o--;else break;return n.slice(0,o).join("/")+"/"+r.slice(i).join("/")}const vt={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};function Da(e){if(!e)if(It){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),Oa(e)}const Fa=/^[^#]+#/;function Ha(e,t){return e.replace(Fa,"#")+t}function Ua(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const Jn=()=>({left:window.scrollX,top:window.scrollY});function qa(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),s=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!s)return;t=Ua(s,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function qs(e,t){return(history.state?history.state.position-t:-1)+e}const Rr=new Map;function Va(e,t){Rr.set(e,t)}function za(e){const t=Rr.get(e);return Rr.delete(e),t}function Ba(e){return typeof e=="string"||e&&typeof e=="object"}function Ti(e){return typeof e=="string"||typeof e=="symbol"}function Ka(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let r=0;rs&&Er(s)):[r&&Er(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function Wa(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=Je(r)?r.map(s=>s==null?null:""+s):r==null?r:""+r)}return t}function Yt(){let e=[];function t(r){return e.push(r),()=>{const s=e.indexOf(r);s>-1&&e.splice(s,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function xt(e,t,n,r,s,o=i=>i()){const i=r&&(r.enterCallbacks[s]=r.enterCallbacks[s]||[]);return()=>new Promise((l,c)=>{const f=p=>{p===!1?c(zt(4,{from:n,to:t})):p instanceof Error?c(p):Ba(p)?c(zt(2,{from:t,to:p})):(i&&r.enterCallbacks[s]===i&&typeof p=="function"&&i.push(p),l())},u=o(()=>e.call(r&&r.instances[s],t,n,f));let h=Promise.resolve(u);e.length<3&&(h=h.then(f)),h.catch(p=>c(p))})}function dr(e,t,n,r,s=o=>o()){const o=[];for(const i of e)for(const l in i.components){let c=i.components[l];if(!(t!=="beforeRouteEnter"&&!i.instances[l]))if(wi(c)){const f=(c.__vccOpts||c)[t];f&&o.push(xt(f,n,r,i,l,s))}else{let f=c();o.push(()=>f.then(u=>{if(!u)throw new Error(`Couldn't resolve component "${l}" at "${i.path}"`);const h=ma(u)?u.default:u;i.mods[l]=u,i.components[l]=h;const p=(h.__vccOpts||h)[t];return p&&xt(p,n,r,i,l,s)()}))}}return o}function Ga(e,t){const n=[],r=[],s=[],o=Math.max(t.matched.length,e.matched.length);for(let i=0;iBt(f,l))?r.push(l):n.push(l));const c=e.matched[i];c&&(t.matched.find(f=>Bt(f,c))||s.push(c))}return[n,r,s]}let Qa=()=>location.protocol+"//"+location.host;function Mi(e,t){const{pathname:n,search:r,hash:s}=t,o=e.indexOf("#");if(o>-1){let i=s.includes(e.slice(o))?e.slice(o).length:1,l=s.slice(i);return l[0]!=="/"&&(l="/"+l),Hs(l,"")}return Hs(n,e)+r+s}function Ja(e,t,n,r){let s=[],o=[],i=null;const l=({state:p})=>{const g=Mi(e,location),R=n.value,w=t.value;let I=0;if(p){if(n.value=g,t.value=p,i&&i===R){i=null;return}I=w?p.position-w.position:0}else r(g);s.forEach(O=>{O(n.value,R,{delta:I,type:"pop",direction:I?I>0?"forward":"back":""})})};function c(){i=n.value}function f(p){s.push(p);const g=()=>{const R=s.indexOf(p);R>-1&&s.splice(R,1)};return o.push(g),g}function u(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(Q({},p.state,{scroll:Jn()}),"")}}function h(){for(const p of o)p();o=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",u),document.removeEventListener("visibilitychange",u)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",u),document.addEventListener("visibilitychange",u),{pauseListeners:c,listen:f,destroy:h}}function zs(e,t,n,r=!1,s=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:s?Jn():null}}function Ya(e){const{history:t,location:n}=window,r={value:Mi(e,n)},s={value:t.state};s.value||o(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function o(c,f,u){const h=e.indexOf("#"),p=h>-1?(n.host&&document.querySelector("base")?e:e.slice(h))+c:Qa()+e+c;try{t[u?"replaceState":"pushState"](f,"",p),s.value=f}catch(g){console.error(g),n[u?"replace":"assign"](p)}}function i(c,f){o(c,Q({},t.state,zs(s.value.back,c,s.value.forward,!0),f,{position:s.value.position}),!0),r.value=c}function l(c,f){const u=Q({},s.value,t.state,{forward:c,scroll:Jn()});o(u.current,u,!0),o(c,Q({},zs(r.value,c,null),{position:u.position+1},f),!1),r.value=c}return{location:r,state:s,push:l,replace:i}}function Xa(e){e=Da(e);const t=Ya(e),n=Ja(e,t.state,t.location,t.replace);function r(o,i=!0){i||n.pauseListeners(),history.go(o)}const s=Q({location:"",base:e,go:r,createHref:Ha.bind(null,e)},t,n);return Object.defineProperty(s,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(s,"state",{enumerable:!0,get:()=>t.state.value}),s}const Za={type:0,value:""},eu=/[a-zA-Z0-9_]/;function tu(e){if(!e)return[[]];if(e==="/")return[[Za]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(g){throw new Error(`ERR (${n})/"${f}": ${g}`)}let n=0,r=n;const s=[];let o;function i(){o&&s.push(o),o=[]}let l=0,c,f="",u="";function h(){f&&(n===0?o.push({type:0,value:f}):n===1||n===2||n===3?(o.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${f}) must be alone in its segment. eg: '/:ids+.`),o.push({type:1,value:f,regexp:u,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),f="")}function p(){f+=c}for(;lt.length?t.length===1&&t[0]===80?1:-1:0}function $i(e,t){let n=0;const r=e.score,s=t.score;for(;n0&&t[t.length-1]<0}const iu={strict:!1,end:!0,sensitive:!1};function lu(e,t,n){const r=su(tu(e.path),n),s=Q(r,{record:e,parent:t,children:[],alias:[]});return t&&!s.record.aliasOf==!t.record.aliasOf&&t.children.push(s),s}function cu(e,t){const n=[],r=new Map;t=Ds(iu,t);function s(h){return r.get(h)}function o(h,p,g){const R=!g,w=Gs(h);w.aliasOf=g&&g.record;const I=Ds(t,h),O=[w];if("alias"in h){const $=typeof h.alias=="string"?[h.alias]:h.alias;for(const G of $)O.push(Gs(Q({},w,{components:g?g.record.components:w.components,path:G,aliasOf:g?g.record:w})))}let k,M;for(const $ of O){const{path:G}=$;if(p&&G[0]!=="/"){const me=p.record.path,se=me[me.length-1]==="/"?"":"/";$.path=p.record.path+(G&&se+G)}if(k=lu($,p,I),g?g.alias.push(k):(M=M||k,M!==k&&M.alias.push(k),R&&h.name&&!Qs(k)&&i(h.name)),Oi(k)&&c(k),w.children){const me=w.children;for(let se=0;se{i(M)}:an}function i(h){if(Ti(h)){const p=r.get(h);p&&(r.delete(h),n.splice(n.indexOf(p),1),p.children.forEach(i),p.alias.forEach(i))}else{const p=n.indexOf(h);p>-1&&(n.splice(p,1),h.record.name&&r.delete(h.record.name),h.children.forEach(i),h.alias.forEach(i))}}function l(){return n}function c(h){const p=fu(h,n);n.splice(p,0,h),h.record.name&&!Qs(h)&&r.set(h.record.name,h)}function f(h,p){let g,R={},w,I;if("name"in h&&h.name){if(g=r.get(h.name),!g)throw zt(1,{location:h});I=g.record.name,R=Q(Ws(p.params,g.keys.filter(M=>!M.optional).concat(g.parent?g.parent.keys.filter(M=>M.optional):[]).map(M=>M.name)),h.params&&Ws(h.params,g.keys.map(M=>M.name))),w=g.stringify(R)}else if(h.path!=null)w=h.path,g=n.find(M=>M.re.test(w)),g&&(R=g.parse(w),I=g.record.name,g.keys.forEach(M=>{M.optional&&!R[M.name]&&delete R[M.name]}));else{if(g=p.name?r.get(p.name):n.find(M=>M.re.test(p.path)),!g)throw zt(1,{location:h,currentLocation:p});I=g.record.name,R=Q({},p.params,h.params),w=g.stringify(R)}const O=[];let k=g;for(;k;)O.unshift(k.record),k=k.parent;return{name:I,path:w,params:R,matched:O,meta:uu(O)}}e.forEach(h=>o(h));function u(){n.length=0,r.clear()}return{addRoute:o,resolve:f,removeRoute:i,clearRoutes:u,getRoutes:l,getRecordMatcher:s}}function Ws(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Gs(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:au(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function au(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function Qs(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function uu(e){return e.reduce((t,n)=>Q(t,n.meta),{})}function fu(e,t){let n=0,r=t.length;for(;n!==r;){const o=n+r>>1;$i(e,t[o])<0?r=o:n=o+1}const s=du(e);return s&&(r=t.lastIndexOf(s,r-1)),r}function du(e){let t=e;for(;t=t.parent;)if(Oi(t)&&$i(e,t)===0)return t}function Oi({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Js(e){const t=ze(Qn),n=ze(Wr),r=ce(()=>{const c=X(e.to);return t.resolve(c)}),s=ce(()=>{const{matched:c}=r.value,{length:f}=c,u=c[f-1],h=n.matched;if(!u||!h.length)return-1;const p=h.findIndex(Bt.bind(null,u));if(p>-1)return p;const g=Ys(c[f-2]);return f>1&&Ys(u)===g&&h[h.length-1].path!==g?h.findIndex(Bt.bind(null,c[f-2])):p}),o=ce(()=>s.value>-1&&gu(n.params,r.value.params)),i=ce(()=>s.value>-1&&s.value===n.matched.length-1&&Pi(n.params,r.value.params));function l(c={}){if(pu(c)){const f=t[X(e.replace)?"replace":"push"](X(e.to)).catch(an);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>f),f}return Promise.resolve()}return{route:r,href:ce(()=>r.value.href),isActive:o,isExactActive:i,navigate:l}}function hu(e){return e.length===1?e[0]:e}const Qr=lt({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:Js,setup(e,{slots:t}){const n=qn(Js(e)),{options:r}=ze(Qn),s=ce(()=>({[Xs(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Xs(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const o=t.default&&hu(t.default(n));return e.custom?o:mn("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:s.value},o)}}});function pu(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function gu(e,t){for(const n in t){const r=t[n],s=e[n];if(typeof r=="string"){if(r!==s)return!1}else if(!Je(s)||s.length!==r.length||r.some((o,i)=>o.valueOf()!==s[i].valueOf()))return!1}return!0}function Ys(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Xs=(e,t,n)=>e??t??n,mu=lt({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=ze(Sr),s=ce(()=>e.route||r.value),o=ze(Fs,0),i=ce(()=>{let f=X(o);const{matched:u}=s.value;let h;for(;(h=u[f])&&!h.components;)f++;return f}),l=ce(()=>s.value.matched[i.value]);En(Fs,ce(()=>i.value+1)),En(ya,l),En(Sr,s);const c=Ie();return sn(()=>[c.value,l.value,e.name],([f,u,h],[p,g,R])=>{u&&(u.instances[h]=f,g&&g!==u&&f&&f===p&&(u.leaveGuards.size||(u.leaveGuards=g.leaveGuards),u.updateGuards.size||(u.updateGuards=g.updateGuards))),f&&u&&(!g||!Bt(u,g)||!p)&&(u.enterCallbacks[h]||[]).forEach(w=>w(f))},{flush:"post"}),()=>{const f=s.value,u=e.name,h=l.value,p=h&&h.components[u];if(!p)return Zs(n.default,{Component:p,route:f});const g=h.props[u],R=g?g===!0?f.params:typeof g=="function"?g(f):g:null,I=mn(p,Q({},R,t,{onVnodeUnmounted:O=>{O.component.isUnmounted&&(h.instances[u]=null)},ref:c}));return Zs(n.default,{Component:I,route:f})||I}}});function Zs(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Cr=mu;function yu(e){const t=cu(e.routes,e),n=e.parseQuery||Ka,r=e.stringifyQuery||Vs,s=e.history,o=Yt(),i=Yt(),l=Yt(),c=El(vt);let f=vt;It&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const u=ur.bind(null,y=>""+y),h=ur.bind(null,Ma),p=ur.bind(null,jn);function g(y,T){let A,j;return Ti(y)?(A=t.getRecordMatcher(y),j=T):j=y,t.addRoute(j,A)}function R(y){const T=t.getRecordMatcher(y);T&&t.removeRoute(T)}function w(){return t.getRoutes().map(y=>y.record)}function I(y){return!!t.getRecordMatcher(y)}function O(y,T){if(T=Q({},T||c.value),typeof y=="string"){const m=fr(n,y,T.path),v=t.resolve({path:m.path},T),b=s.createHref(m.fullPath);return Q(m,v,{params:p(v.params),redirectedFrom:void 0,href:b})}let A;if(y.path!=null)A=Q({},y,{path:fr(n,y.path,T.path).path});else{const m=Q({},y.params);for(const v in m)m[v]==null&&delete m[v];A=Q({},y,{params:h(m)}),T.params=h(T.params)}const j=t.resolve(A,T),B=y.hash||"";j.params=u(p(j.params));const a=ja(r,Q({},y,{hash:Aa(B),path:j.path})),d=s.createHref(a);return Q({fullPath:a,hash:B,query:r===Vs?Wa(y.query):y.query||{}},j,{redirectedFrom:void 0,href:d})}function k(y){return typeof y=="string"?fr(n,y,c.value.path):Q({},y)}function M(y,T){if(f!==y)return zt(8,{from:T,to:y})}function $(y){return se(y)}function G(y){return $(Q(k(y),{replace:!0}))}function me(y,T){const A=y.matched[y.matched.length-1];if(A&&A.redirect){const{redirect:j}=A;let B=typeof j=="function"?j(y,T):j;return typeof B=="string"&&(B=B.includes("?")||B.includes("#")?B=k(B):{path:B},B.params={}),Q({query:y.query,hash:y.hash,params:B.path!=null?{}:y.params},B)}}function se(y,T){const A=f=O(y),j=c.value,B=y.state,a=y.force,d=y.replace===!0,m=me(A,j);if(m)return se(Q(k(m),{state:typeof m=="object"?Q({},B,m.state):B,force:a,replace:d}),T||A);const v=A;v.redirectedFrom=T;let b;return!a&&Na(r,j,A)&&(b=zt(16,{to:v,from:j}),Le(j,j,!0,!1)),(b?Promise.resolve(b):Oe(v,j)).catch(_=>at(_)?at(_,2)?_:ee(_):z(_,v,j)).then(_=>{if(_){if(at(_,2))return se(Q({replace:d},k(_.to),{state:typeof _.to=="object"?Q({},B,_.to.state):B,force:a}),T||v)}else _=Ye(v,j,!0,d,B);return qe(v,j,_),_})}function He(y,T){const A=M(y,T);return A?Promise.reject(A):Promise.resolve()}function Ue(y){const T=oe.values().next().value;return T&&typeof T.runWithContext=="function"?T.runWithContext(y):y()}function Oe(y,T){let A;const[j,B,a]=Ga(y,T);A=dr(j.reverse(),"beforeRouteLeave",y,T);for(const m of j)m.leaveGuards.forEach(v=>{A.push(xt(v,y,T))});const d=He.bind(null,y,T);return A.push(d),ve(A).then(()=>{A=[];for(const m of o.list())A.push(xt(m,y,T));return A.push(d),ve(A)}).then(()=>{A=dr(B,"beforeRouteUpdate",y,T);for(const m of B)m.updateGuards.forEach(v=>{A.push(xt(v,y,T))});return A.push(d),ve(A)}).then(()=>{A=[];for(const m of a)if(m.beforeEnter)if(Je(m.beforeEnter))for(const v of m.beforeEnter)A.push(xt(v,y,T));else A.push(xt(m.beforeEnter,y,T));return A.push(d),ve(A)}).then(()=>(y.matched.forEach(m=>m.enterCallbacks={}),A=dr(a,"beforeRouteEnter",y,T,Ue),A.push(d),ve(A))).then(()=>{A=[];for(const m of i.list())A.push(xt(m,y,T));return A.push(d),ve(A)}).catch(m=>at(m,8)?m:Promise.reject(m))}function qe(y,T,A){l.list().forEach(j=>Ue(()=>j(y,T,A)))}function Ye(y,T,A,j,B){const a=M(y,T);if(a)return a;const d=T===vt,m=It?history.state:{};A&&(j||d?s.replace(y.fullPath,Q({scroll:d&&m&&m.scroll},B)):s.push(y.fullPath,B)),c.value=y,Le(y,T,A,d),ee()}let je;function St(){je||(je=s.listen((y,T,A)=>{if(!Pe.listening)return;const j=O(y),B=me(j,Pe.currentRoute.value);if(B){se(Q(B,{replace:!0,force:!0}),j).catch(an);return}f=j;const a=c.value;It&&Va(qs(a.fullPath,A.delta),Jn()),Oe(j,a).catch(d=>at(d,12)?d:at(d,2)?(se(Q(k(d.to),{force:!0}),j).then(m=>{at(m,20)&&!A.delta&&A.type==="pop"&&s.go(-1,!1)}).catch(an),Promise.reject()):(A.delta&&s.go(-A.delta,!1),z(d,j,a))).then(d=>{d=d||Ye(j,a,!1),d&&(A.delta&&!at(d,8)?s.go(-A.delta,!1):A.type==="pop"&&at(d,20)&&s.go(-1,!1)),qe(j,a,d)}).catch(an)}))}let Ae=Yt(),he=Yt(),K;function z(y,T,A){ee(y);const j=he.list();return j.length?j.forEach(B=>B(y,T,A)):console.error(y),Promise.reject(y)}function ye(){return K&&c.value!==vt?Promise.resolve():new Promise((y,T)=>{Ae.add([y,T])})}function ee(y){return K||(K=!y,St(),Ae.list().forEach(([T,A])=>y?A(y):T()),Ae.reset()),y}function Le(y,T,A,j){const{scrollBehavior:B}=e;if(!It||!B)return Promise.resolve();const a=!A&&za(qs(y.fullPath,0))||(j||!A)&&history.state&&history.state.scroll||null;return Fo().then(()=>B(y,T,a)).then(d=>d&&qa(d)).catch(d=>z(d,y,T))}const _e=y=>s.go(y);let ue;const oe=new Set,Pe={currentRoute:c,listening:!0,addRoute:g,removeRoute:R,clearRoutes:t.clearRoutes,hasRoute:I,getRoutes:w,resolve:O,options:e,push:$,replace:G,go:_e,back:()=>_e(-1),forward:()=>_e(1),beforeEach:o.add,beforeResolve:i.add,afterEach:l.add,onError:he.add,isReady:ye,install(y){y.component("RouterLink",Qr),y.component("RouterView",Cr),y.config.globalProperties.$router=Pe,Object.defineProperty(y.config.globalProperties,"$route",{enumerable:!0,get:()=>X(c)}),It&&!ue&&c.value===vt&&(ue=!0,$(s.location).catch(j=>{}));const T={};for(const j in vt)Object.defineProperty(T,j,{get:()=>c.value[j],enumerable:!0});y.provide(Qn,Pe),y.provide(Wr,No(T)),y.provide(Sr,c);const A=y.unmount;oe.add(y),y.unmount=function(){oe.delete(y),oe.size<1&&(f=vt,je&&je(),je=null,c.value=vt,ue=!1,K=!1),A()}}};function ve(y){return y.reduce((T,A)=>T.then(()=>Ue(A)),Promise.resolve())}return Pe}const eo=e=>e==="";const _u=(...e)=>e.filter((t,n,r)=>!!t&&t.trim()!==""&&r.indexOf(t)===n).join(" ").trim();const to=e=>e.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();const vu=e=>e.replace(/^([A-Z])|[\s-_]+(\w)/g,(t,n,r)=>r?r.toUpperCase():n.toLowerCase());const bu=e=>{const t=vu(e);return t.charAt(0).toUpperCase()+t.slice(1)};var $t={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":2,"stroke-linecap":"round","stroke-linejoin":"round"};const xu=Symbol("lucide-icons");function wu(){return ze(xu,{})}const Su=({name:e,iconNode:t,absoluteStrokeWidth:n,"absolute-stroke-width":r,strokeWidth:s,"stroke-width":o,size:i,color:l,...c},{slots:f})=>{const{size:u,color:h,strokeWidth:p=2,absoluteStrokeWidth:g=!1,class:R=""}=wu(),w=ce(()=>{const I=eo(n)||eo(r)||n===!0||r===!0||g===!0,O=s||o||p||$t["stroke-width"];return I?Number(O)*24/Number(i??u??$t.width):O});return mn("svg",{...$t,...c,width:i??u??$t.width,height:i??u??$t.height,stroke:l??h??$t.stroke,"stroke-width":w.value,class:_u("lucide",R,...e?[`lucide-${to(bu(e))}-icon`,`lucide-${to(e)}`]:["lucide-icon"])},[...t.map(I=>mn(...I)),...f.default?[f.default()]:[]])};const q=(e,t)=>(n,{slots:r,attrs:s})=>mn(Su,{...s,...n,iconNode:t,name:e},r.default?{default:r.default}:void 0);const Eu=[["rect",{width:"20",height:"5",x:"2",y:"3",rx:"1",key:"1wp1u1"}],["path",{d:"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8",key:"1s80jp"}],["path",{d:"M10 12h4",key:"a56b0p"}]],Ru=q("archive",Eu);const Cu=[["path",{d:"M12 5v14",key:"s699le"}],["path",{d:"m19 12-7 7-7-7",key:"1idqje"}]],ku=q("arrow-down",Cu);const Au=[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]],Pu=q("arrow-left",Au);const Tu=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],Mu=q("arrow-right",Tu);const $u=[["path",{d:"M7 7h10v10",key:"1tivn9"}],["path",{d:"M7 17 17 7",key:"1vkiza"}]],Ou=q("arrow-up-right",$u);const ju=[["path",{d:"m5 12 7-7 7 7",key:"hav0vg"}],["path",{d:"M12 19V5",key:"x0mq9r"}]],Nu=q("arrow-up",ju);const Iu=[["rect",{width:"20",height:"16",x:"2",y:"4",rx:"2",key:"18n3k1"}],["circle",{cx:"8",cy:"10",r:"2",key:"1xl4ub"}],["path",{d:"M8 12h8",key:"1wcyev"}],["circle",{cx:"16",cy:"10",r:"2",key:"r14t7q"}],["path",{d:"m6 20 .7-2.9A1.4 1.4 0 0 1 8.1 16h7.8a1.4 1.4 0 0 1 1.4 1l.7 3",key:"l01ucn"}]],Lu=q("cassette-tape",Iu);const Du=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Fu=q("check",Du);const Hu=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],Uu=q("chevron-down",Hu);const qu=[["path",{d:"m15 18-6-6 6-6",key:"1wnfg3"}]],Vu=q("chevron-left",qu);const zu=[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]],ji=q("chevron-right",zu);const Bu=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],Ni=q("circle-alert",Bu);const Ku=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}]],Wu=q("circle",Ku);const Gu=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M6 12c0-1.7.7-3.2 1.8-4.2",key:"oqkarx"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}],["path",{d:"M18 12c0 1.7-.7 3.2-1.8 4.2",key:"1eah9h"}]],Qu=q("disc-3",Gu);const Ju=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["circle",{cx:"12",cy:"12",r:"2",key:"1c9p78"}]],Yu=q("disc",Ju);const Xu=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],Zu=q("image",Xu);const ef=[["path",{d:"m16 6 4 14",key:"ji33uf"}],["path",{d:"M12 6v14",key:"1n7gus"}],["path",{d:"M8 8v12",key:"1gg7y9"}],["path",{d:"M4 4v16",key:"6qkkli"}]],tf=q("library",ef);const nf=[["path",{d:"M3 5h.01",key:"18ugdj"}],["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 19h.01",key:"noohij"}],["path",{d:"M8 5h13",key:"1pao27"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 19h13",key:"m83p4d"}]],rf=q("list",nf);const sf=[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]],of=q("log-out",sf);const lf=[["path",{d:"m11 7.601-5.994 8.19a1 1 0 0 0 .1 1.298l.817.818a1 1 0 0 0 1.314.087L15.09 12",key:"80a601"}],["path",{d:"M16.5 21.174C15.5 20.5 14.372 20 13 20c-2.058 0-3.928 2.356-6 2-2.072-.356-2.775-3.369-1.5-4.5",key:"j0ngtp"}],["circle",{cx:"16",cy:"7",r:"5",key:"d08jfb"}]],cf=q("mic-vocal",lf);const af=[["path",{d:"M5 12h14",key:"1ays0h"}]],uf=q("minus",af);const ff=[["path",{d:"M12 22a1 1 0 0 1 0-20 10 9 0 0 1 10 9 5 5 0 0 1-5 5h-2.25a1.75 1.75 0 0 0-1.4 2.8l.3.4a1.75 1.75 0 0 1-1.4 2.8z",key:"e79jfc"}],["circle",{cx:"13.5",cy:"6.5",r:".5",fill:"currentColor",key:"1okk4w"}],["circle",{cx:"17.5",cy:"10.5",r:".5",fill:"currentColor",key:"f64h9f"}],["circle",{cx:"6.5",cy:"12.5",r:".5",fill:"currentColor",key:"qy21gx"}],["circle",{cx:"8.5",cy:"7.5",r:".5",fill:"currentColor",key:"fotxhn"}]],df=q("palette",ff);const hf=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m16 15-3-3 3-3",key:"14y99z"}]],pf=q("panel-left-close",hf);const gf=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m14 9 3 3-3 3",key:"8010ee"}]],mf=q("panel-left-open",gf);const yf=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],_f=q("plus",yf);const vf=[["path",{d:"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",key:"w46dr5"}]],bf=q("puzzle",vf);const xf=[["path",{d:"m13.5 8.5-5 5",key:"1cs55j"}],["path",{d:"m8.5 8.5 5 5",key:"a8mexj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]],wf=q("search-x",xf);const Sf=[["path",{d:"m21 21-4.34-4.34",key:"14j7rj"}],["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}]],Ef=q("search",Sf);const Rf=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],Cf=q("settings",Rf);const kf=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]],Af=q("shield-check",kf);const Pf=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}]],Tf=q("square",Pf);const Mf=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],Jr=q("sun",Mf);const $f=[["path",{d:"M13.172 2a2 2 0 0 1 1.414.586l6.71 6.71a2.4 2.4 0 0 1 0 3.408l-4.592 4.592a2.4 2.4 0 0 1-3.408 0l-6.71-6.71A2 2 0 0 1 6 9.172V3a1 1 0 0 1 1-1z",key:"16rjxf"}],["path",{d:"M2 7v6.172a2 2 0 0 0 .586 1.414l6.71 6.71a2.4 2.4 0 0 0 3.191.193",key:"178nd4"}],["circle",{cx:"10.5",cy:"6.5",r:".5",fill:"currentColor",key:"12ikhr"}]],Of=q("tags",$f);const jf=[["path",{d:"M10 11v6",key:"nco0om"}],["path",{d:"M14 11v6",key:"outv1u"}],["path",{d:"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6",key:"miytrc"}],["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2",key:"e791ji"}]],Nf=q("trash-2",jf);const If=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]],Lf=q("user-minus",If);const Df=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["line",{x1:"19",x2:"19",y1:"8",y2:"14",key:"1bvyxn"}],["line",{x1:"22",x2:"16",y1:"11",y2:"11",key:"1shjgl"}]],Ff=q("user-plus",Df);const Hf=[["path",{d:"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2",key:"975kel"}],["circle",{cx:"12",cy:"7",r:"4",key:"17ys0d"}]],Uf=q("user",Hf);const qf=[["path",{d:"M18 21a8 8 0 0 0-16 0",key:"3ypg7q"}],["circle",{cx:"10",cy:"8",r:"5",key:"o932ke"}],["path",{d:"M22 20c0-3.37-2-6.5-4-8a5 5 0 0 0-.45-8.3",key:"10s06x"}]],Vf=q("users-round",qf);const zf=[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]],Bf=q("users",zf);const Kf=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],Wf=q("x",Kf),Gf=Ie({});function Qf(e,t={}){const n=[];for(const[s,o]of Object.entries(t)){const i=s.replace(/^:/,"");if(i==="")continue;const l=String(o);n.push([`:${i.charAt(0).toUpperCase()}${i.slice(1)}`,l.charAt(0).toUpperCase()+l.slice(1)]),n.push([`:${i.toUpperCase()}`,l.toUpperCase()]),n.push([`:${i}`,l])}n.sort((s,o)=>o[0].length-s[0].length);let r=e;for(const[s,o]of n)r=r.split(s).join(o);return r}function we(e,t={}){const r=Gf.value[e]?.other;return r===void 0?e:Qf(r,t)}const no={archive:Ru,"arrow-down":ku,"arrow-left":Pu,"arrow-right":Mu,"arrow-up":Nu,"arrow-up-right":Ou,"cassette-tape":Lu,check:Fu,"chevron-down":Uu,"chevron-left":Vu,"chevron-right":ji,circle:Wu,"circle-alert":Ni,disc:Yu,"disc-3":Qu,image:Zu,library:tf,list:rf,"log-out":of,"mic-vocal":cf,minus:uf,palette:df,"panel-left-close":pf,"panel-left-open":mf,plus:_f,puzzle:bf,search:Ef,"search-x":wf,settings:Cf,"shield-check":Af,sun:Jr,tags:Of,"trash-2":Nf,user:Uf,"user-minus":Lf,"user-plus":Ff,users:Bf,"users-round":Vf,x:Wf},Jf={"icon-archive":"archive","icon-circle":"circle","icon-list-ul":"list","icon-tags":"tags","icon-user":"user","icon-search":"search","icon-cog":"settings","icon-users":"users"},ro=Tf;function Ii(e){if(!e)return ro;const t=e.trim();return no[t]??no[Jf[t]??""]??ro}const Yf=/\{[^{}]+\}/g,Xf=()=>typeof process=="object"&&Number.parseInt(process?.versions?.node?.substring(0,2))>=18&&process.versions.undici;function Zf(){return Math.random().toString(36).slice(2,11)}function ed(e){let{baseUrl:t="",Request:n=globalThis.Request,fetch:r=globalThis.fetch,querySerializer:s,bodySerializer:o,pathSerializer:i,headers:l,requestInitExt:c=void 0,...f}={...e};c=Xf()?c:void 0,t=io(t);const u=[];async function h(p,g){const{baseUrl:R,fetch:w=r,Request:I=n,headers:O,params:k={},parseAs:M="json",querySerializer:$,bodySerializer:G=o??nd,pathSerializer:me,body:se,middleware:He=[],...Ue}=g||{};let Oe=t;R&&(Oe=io(R)??t);let qe=typeof s=="function"?s:so(s);$&&(qe=typeof $=="function"?$:so({...typeof s=="object"?s:{},...$}));const Ye=me||i||td,je=se===void 0?void 0:G(se,oo(l,O,k.header)),St=oo(je===void 0||je instanceof FormData?{}:{"Content-Type":"application/json"},l,O,k.header),Ae=[...u,...He],he={redirect:"follow",...f,...Ue,body:je,headers:St};let K,z,ye=new I(rd(p,{baseUrl:Oe,params:k,querySerializer:qe,pathSerializer:Ye}),he),ee;for(const ue in Ue)ue in ye||(ye[ue]=Ue[ue]);if(Ae.length){K=Zf(),z=Object.freeze({baseUrl:Oe,fetch:w,parseAs:M,querySerializer:qe,bodySerializer:G,pathSerializer:Ye});for(const ue of Ae)if(ue&&typeof ue=="object"&&typeof ue.onRequest=="function"){const oe=await ue.onRequest({request:ye,schemaPath:p,params:k,options:z,id:K});if(oe)if(oe instanceof I)ye=oe;else if(oe instanceof Response){ee=oe;break}else throw new Error("onRequest: must return new Request() or Response() when modifying the request")}}if(!ee){try{ee=await w(ye,c)}catch(ue){let oe=ue;if(Ae.length)for(let Pe=Ae.length-1;Pe>=0;Pe--){const ve=Ae[Pe];if(ve&&typeof ve=="object"&&typeof ve.onError=="function"){const y=await ve.onError({request:ye,error:oe,schemaPath:p,params:k,options:z,id:K});if(y){if(y instanceof Response){oe=void 0,ee=y;break}if(y instanceof Error){oe=y;continue}throw new Error("onError: must return new Response() or instance of Error")}}}if(oe)throw oe}if(Ae.length)for(let ue=Ae.length-1;ue>=0;ue--){const oe=Ae[ue];if(oe&&typeof oe=="object"&&typeof oe.onResponse=="function"){const Pe=await oe.onResponse({request:ye,response:ee,schemaPath:p,params:k,options:z,id:K});if(Pe){if(!(Pe instanceof Response))throw new Error("onResponse: must return new Response() when modifying the response");ee=Pe}}}}const Le=ee.headers.get("Content-Length");if(ee.status===204||ye.method==="HEAD"||Le==="0"&&!ee.headers.get("Transfer-Encoding")?.includes("chunked"))return ee.ok?{data:void 0,response:ee}:{error:void 0,response:ee};if(ee.ok)return{data:await(async()=>{if(M==="stream")return ee.body;if(M==="json"&&!Le){const oe=await ee.text();return oe?JSON.parse(oe):void 0}return await ee[M]()})(),response:ee};let _e=await ee.text();try{_e=JSON.parse(_e)}catch{}return{error:_e,response:ee}}return{request(p,g,R){return h(g,{...R,method:p.toUpperCase()})},GET(p,g){return h(p,{...g,method:"GET"})},PUT(p,g){return h(p,{...g,method:"PUT"})},POST(p,g){return h(p,{...g,method:"POST"})},DELETE(p,g){return h(p,{...g,method:"DELETE"})},OPTIONS(p,g){return h(p,{...g,method:"OPTIONS"})},HEAD(p,g){return h(p,{...g,method:"HEAD"})},PATCH(p,g){return h(p,{...g,method:"PATCH"})},TRACE(p,g){return h(p,{...g,method:"TRACE"})},use(...p){for(const g of p)if(g){if(typeof g!="object"||!("onRequest"in g||"onResponse"in g||"onError"in g))throw new Error("Middleware must be an object with one of `onRequest()`, `onResponse() or `onError()`");u.push(g)}},eject(...p){for(const g of p){const R=u.indexOf(g);R!==-1&&u.splice(R,1)}}}}function Yn(e,t,n){if(t==null)return"";if(typeof t=="object")throw new Error("Deeply-nested arrays/objects aren’t supported. Provide your own `querySerializer()` to handle these.");return`${e}=${n?.allowReserved===!0?t:encodeURIComponent(t)}`}function Li(e,t,n){if(!t||typeof t!="object")return"";const r=[],s={simple:",",label:".",matrix:";"}[n.style]||"&";if(n.style!=="deepObject"&&n.explode===!1){for(const l in t)r.push(l,n.allowReserved===!0?t[l]:encodeURIComponent(t[l]));const i=r.join(",");switch(n.style){case"form":return`${e}=${i}`;case"label":return`.${i}`;case"matrix":return`;${e}=${i}`;default:return i}}for(const i in t){const l=n.style==="deepObject"?`${e}[${i}]`:i;r.push(Yn(l,t[i],n))}const o=r.join(s);return n.style==="label"||n.style==="matrix"?`${s}${o}`:o}function Di(e,t,n){if(!Array.isArray(t))return"";if(n.explode===!1){const o={form:",",spaceDelimited:"%20",pipeDelimited:"|"}[n.style]||",",i=(n.allowReserved===!0?t:t.map(l=>encodeURIComponent(l))).join(o);switch(n.style){case"simple":return i;case"label":return`.${i}`;case"matrix":return`;${e}=${i}`;default:return`${e}=${i}`}}const r={simple:",",label:".",matrix:";"}[n.style]||"&",s=[];for(const o of t)n.style==="simple"||n.style==="label"?s.push(n.allowReserved===!0?o:encodeURIComponent(o)):s.push(Yn(e,o,n));return n.style==="label"||n.style==="matrix"?`${r}${s.join(r)}`:s.join(r)}function so(e){return function(n){const r=[];if(n&&typeof n=="object")for(const s in n){const o=n[s];if(o!=null){if(Array.isArray(o)){if(o.length===0)continue;r.push(Di(s,o,{style:"form",explode:!0,...e?.array,allowReserved:e?.allowReserved||!1}));continue}if(typeof o=="object"){r.push(Li(s,o,{style:"deepObject",explode:!0,...e?.object,allowReserved:e?.allowReserved||!1}));continue}r.push(Yn(s,o,e))}}return r.join("&")}}function td(e,t){let n=e;for(const r of e.match(Yf)??[]){let s=r.substring(1,r.length-1),o=!1,i="simple";if(s.endsWith("*")&&(o=!0,s=s.substring(0,s.length-1)),s.startsWith(".")?(i="label",s=s.substring(1)):s.startsWith(";")&&(i="matrix",s=s.substring(1)),!t||t[s]===void 0||t[s]===null)continue;const l=t[s];if(Array.isArray(l)){n=n.replace(r,Di(s,l,{style:i,explode:o}));continue}if(typeof l=="object"){n=n.replace(r,Li(s,l,{style:i,explode:o}));continue}if(i==="matrix"){n=n.replace(r,`;${Yn(s,l)}`);continue}n=n.replace(r,i==="label"?`.${encodeURIComponent(l)}`:encodeURIComponent(l))}return n}function nd(e,t){return e instanceof FormData?e:t&&(t.get instanceof Function?t.get("Content-Type")??t.get("content-type"):t["Content-Type"]??t["content-type"])==="application/x-www-form-urlencoded"?new URLSearchParams(e).toString():JSON.stringify(e)}function rd(e,t){let n=`${t.baseUrl}${e}`;t.params?.path&&(n=t.pathSerializer(n,t.params.path));let r=t.querySerializer(t.params.query??{});return r.startsWith("?")&&(r=r.substring(1)),r&&(n+=`?${r}`),n}function oo(...e){const t=new Headers;for(const n of e){if(!n||typeof n!="object")continue;const r=n instanceof Headers?n.entries():Object.entries(n);for(const[s,o]of r)if(o===null)t.delete(s);else if(Array.isArray(o))for(const i of o)t.append(s,i);else o!==void 0&&t.set(s,o)}return t}function io(e){return e.endsWith("/")?e.substring(0,e.length-1):e}const lo="/backend",sd="__SUMMER_ADMIN_BASE__";function od(e=document){const t=e.querySelector('meta[name="summer-admin-base"]')?.content.trim()??"";if(t===""||t===sd||!t.startsWith("/"))return lo;const n=t.replace(/\/+$/,"");return n===""?lo:n}const co=od(),Fi={base:co,api:`${co}/api/v1`},id="XMLHttpRequest";let Hi=null;function ld(e){Hi=e}function cd(e){return new URL(e.url,"http://local").pathname.endsWith("/auth/login")}const ad={onRequest({request:e}){return e.headers.set("X-Requested-With",id),e},onResponse({request:e,response:t}){return t.status===401&&!cd(e)&&Hi?.(),t}},Kt=ed({baseUrl:Fi.api,credentials:"same-origin",fetch:e=>globalThis.fetch(e)});Kt.use(ad);const ud=/^[A-Za-z0-9_-]+$/;function Yr(e){const t=e.split(".");if(t.length!==3||!t.every(o=>ud.test(o)))return null;const[n,r,s]=t;return{vendor:n,plugin:r,controller:s}}function kr(e){const t=Yr(e);return t?`/${t.vendor}/${t.plugin}/${t.controller}`:null}function fd(e){return`${e.vendor}.${e.plugin}.${e.controller}`}function Ui(e){const t=e.replace(/^\/+|\/+$/g,"").split("/");if(t.length<3)return null;const n=t.slice(0,3).join(".");return Yr(n)?n:null}function ao(e){const t=Yr(e);return t?`${t.vendor}.${t.plugin}`:null}const Ar=Ie([]);async function qi(){const{data:e,response:t}=await Kt.GET("/navigation");return Ar.value=t.ok&&e?e.data:[],Ar.value}const Xr=ce(()=>Ar.value.filter(e=>e.sideMenu.length>0).map((e,t)=>({entry:e,index:t})).sort((e,t)=>e.entry.order-t.entry.order||e.index-t.index).map(({entry:e})=>e));function Vi(e){for(const t of e.sideMenu){const n=kr(t.controller);if(n)return n}return kr(e.controller)}function Zr(e,t){const n=`${e}.${t}`;return Xr.value.find(r=>ao(r.controller)===n||r.sideMenu.some(s=>ao(s.controller)===n))??null}function dd(){for(const e of Xr.value){const t=Vi(e);if(t)return t}return null}const hd=["aria-label"],pd={class:"mb-3.5 flex size-10 items-center justify-center rounded-inner bg-accent-soft",title:"SummerCMS"},gd=lt({__name:"PluginRail",setup(e){const t=Wt(),n=ce(()=>Zr(String(t.params.vendor??""),String(t.params.plugin??""))),r=ce(()=>Xr.value.map(s=>({entry:s,to:Vi(s)??"/",icon:Ii(s.icon),current:n.value?.code===s.code})));return(s,o)=>(V(),le("nav",{"aria-label":X(we)("backend::lang.nav.plugins"),class:"flex w-rail shrink-0 flex-col items-center gap-1.5 border-r border-side-border bg-side pt-3.5 pb-3"},[H("span",pd,[ge(X(Jr),{size:22,class:"text-accent","aria-hidden":"true"})]),(V(!0),le(fe,null,kt(r.value,i=>(V(),Qe(X(Qr),{key:i.entry.code,to:i.to,"aria-current":i.current?"page":void 0,class:wt([i.current?"bg-accent-soft font-bold text-accent":"text-side-text hover:bg-side-hover hover:text-white","flex w-[68px] flex-col items-center gap-1 rounded-inner px-1.5 py-2 text-center text-[11px] leading-[1.2] tracking-[-0.01em] no-underline"])},{default:zn(()=>[(V(),Qe(Yo(i.icon),{size:20,"aria-hidden":"true"})),H("span",null,de(i.entry.label),1)]),_:2},1032,["to","aria-current","class"]))),128))],8,hd))}}),md=["aria-label"],yd={class:"mb-3.5 flex h-10 items-center px-2"},_d={class:"text-[16px] font-bold"},vd=lt({__name:"SectionPanel",props:{entry:{}},setup(e){const t=e,n=Wt(),r=ce(()=>Ui(n.path)),s=ce(()=>t.entry.sideMenu.flatMap(o=>{const i=kr(o.controller);return i?[{item:o,to:i,icon:Ii(o.icon),current:r.value===o.controller}]:[]}));return(o,i)=>(V(),le("aside",{"aria-label":X(we)("backend::lang.nav.sections"),class:"flex w-panel shrink-0 flex-col gap-0.5 border-r border-border bg-surface px-3 py-3.5"},[H("div",yd,[H("span",_d,de(e.entry.label),1)]),(V(!0),le(fe,null,kt(s.value,l=>(V(),Qe(X(Qr),{key:l.item.code,to:l.to,"aria-current":l.current?"page":void 0,class:wt([l.current?"bg-sel font-semibold text-text":"font-medium text-muted hover:bg-hover hover:text-text","flex h-nav items-center gap-3 rounded-control px-3 no-underline"])},{default:zn(()=>[(V(),Qe(Yo(l.icon),{size:18,"aria-hidden":"true"})),H("span",null,de(l.item.label),1)]),_:2},1032,["to","aria-current","class"]))),128))],8,md))}}),Nn=Ie(null),zi=Ie(null),en=Cn(Nn);async function bd(e,t){const{data:n,response:r}=await Kt.POST("/auth/login",{body:{login:e,password:t}});return!r.ok||!n?!1:(zi.value=typeof n.data.expires_in=="number"?n.data.expires_in:null,!0)}async function Bi(){const{data:e,response:t}=await Kt.GET("/auth/me");return Nn.value=t.ok&&e?e.data:null,Nn.value}function xd(){Nn.value=null,zi.value=null}const wd={class:"flex min-h-screen bg-bg text-text"},Sd={class:"flex min-w-0 flex-1 flex-col"},Ed={class:"flex h-header shrink-0 items-center justify-between border-b border-border bg-surface pr-6 pl-8"},Rd=["aria-label"],Cd={class:"font-semibold","aria-current":"page"},kd={key:0,class:"flex h-input items-center gap-2.5 rounded-inner px-2"},Ad={class:"flex size-[34px] items-center justify-center rounded-full bg-accent text-[13px] font-bold text-on-accent","aria-hidden":"true"},Pd={class:"flex flex-col leading-tight"},Td={class:"font-semibold"},Md={key:0,class:"text-[12px] text-muted"},$d={class:"min-w-0 flex-1 px-8 py-7"},Od=lt({__name:"AppShell",setup(e){const t=Wt(),n=ce(()=>Zr(String(t.params.vendor??""),String(t.params.plugin??""))),r=ce(()=>{const i=Ui(t.path);return n.value?.sideMenu.find(l=>l.controller===i)??null}),s=ce(()=>{const i=en.value;if(!i)return"";const l=`${i.first_name} ${i.last_name}`.trim();return l===""?i.login:l}),o=ce(()=>s.value.split(/\s+/).filter(Boolean).slice(0,2).map(i=>i.charAt(0).toUpperCase()).join(""));return(i,l)=>(V(),le("div",wd,[ge(gd),n.value?(V(),Qe(vd,{key:0,entry:n.value},null,8,["entry"])):jt("",!0),H("div",Sd,[H("header",Ed,[H("nav",{"aria-label":X(we)("backend::lang.nav.breadcrumbs"),class:"flex items-center gap-2"},[n.value?(V(),le(fe,{key:0},[H("span",{class:wt(r.value?"text-muted":"font-semibold")},de(n.value.label),3),r.value?(V(),le(fe,{key:0},[ge(X(ji),{size:14,class:"text-muted","aria-hidden":"true"}),H("span",Cd,de(r.value.label),1)],64)):jt("",!0)],64)):jt("",!0)],8,Rd),X(en)?(V(),le("div",kd,[H("span",Ad,de(o.value),1),H("span",Pd,[H("span",Td,de(s.value),1),X(en).role?(V(),le("span",Md,de(X(en).role.name),1)):jt("",!0)])])):jt("",!0)]),H("main",$d,[Zl(i.$slots,"default")])])]))}}),jd=lt({__name:"App",setup(e){const t=Wt(),n=ce(()=>t.meta.shell===!0);return(r,s)=>n.value?(V(),Qe(Od,{key:0},{default:zn(()=>[ge(X(Cr))]),_:1})):(V(),Qe(X(Cr),{key:1}))}}),Nd={class:"flex min-h-screen items-center justify-center px-4",style:{background:"radial-gradient(ellipse at 50% 35%, #2b3a5c 0%, #1d2740 60%)"}},Id={class:"flex w-full max-w-[400px] flex-col gap-6"},Ld={class:"flex items-center justify-center gap-3"},Dd={class:"flex size-[34px] items-center justify-center rounded-full bg-accent-soft"},Fd={class:"text-[22px] font-bold tracking-[-0.02em]"},Hd={class:"flex flex-col gap-1.5"},Ud={class:"font-semibold"},qd={class:"flex flex-col gap-1.5"},Vd={class:"font-semibold"},zd=["aria-invalid"],Bd={key:0,role:"alert",class:"flex items-center gap-2.5 rounded-control bg-[#fdf0f0] px-3.5 py-3 text-[#c62828]"},Kd=["disabled"],Wd=lt({__name:"LoginView",setup(e){const t=Wt(),n=_a(),r=Ie(""),s=Ie(""),o=Ie(!1),i=Ie(!1);async function l(){if(!i.value){i.value=!0,o.value=!1;try{if(!await bd(r.value.trim(),s.value)||!await Bi()){o.value=!0;return}s.value="",await qi(),await n.replace(Ki(t.query.redirect)??"/")}finally{i.value=!1}}}return(c,f)=>(V(),le("main",Nd,[H("div",Id,[H("div",Ld,[H("span",Dd,[ge(X(Jr),{size:20,class:"text-accent","aria-hidden":"true"})]),f[2]||(f[2]=H("span",{class:"text-[18px] font-bold text-white"},[_i("Summer"),H("span",{class:"text-accent"},"CMS")],-1))]),H("form",{class:"flex flex-col gap-[18px] rounded-card bg-white p-8 text-[#141b2d] shadow-login",novalidate:"",onSubmit:ua(l,["prevent"])},[H("h1",Fd,de(X(we)("backend::lang.auth.title")),1),H("label",Hd,[H("span",Ud,de(X(we)("backend::lang.auth.login")),1),cs(H("input",{"onUpdate:modelValue":f[0]||(f[0]=u=>r.value=u),name:"login",type:"text",autocomplete:"username",required:"",class:"h-input rounded-control border border-[#d2d8e2] bg-white px-3.5"},null,512),[[Is,r.value]])]),H("label",qd,[H("span",Vd,de(X(we)("backend::lang.auth.password")),1),cs(H("input",{"onUpdate:modelValue":f[1]||(f[1]=u=>s.value=u),name:"password",type:"password",autocomplete:"current-password",required:"","aria-invalid":o.value?"true":void 0,class:wt([o.value?"border-[#c62828]":"border-[#d2d8e2]","h-input rounded-control border bg-white px-3.5"])},null,10,zd),[[Is,s.value]])]),o.value?(V(),le("div",Bd,[ge(X(Ni),{size:18,"aria-hidden":"true"}),H("span",null,de(X(we)("backend::lang.auth.invalid")),1)])):jt("",!0),H("button",{type:"submit",disabled:i.value,class:"h-input rounded-control bg-[#22304d] font-semibold text-white disabled:opacity-60"},de(X(we)("backend::lang.auth.submit")),9,Kd)],32)])]))}}),Gd={class:"overflow-x-auto"},Qd={class:"w-full min-w-[640px] border-collapse text-left"},Jd={class:"h-row-head border-y border-border bg-subtle"},Yd=["aria-busy"],Xd={key:1},Zd=["colspan"],eh=lt({__name:"DataTable",props:{columns:{},rows:{},loading:{type:Boolean},emptyText:{}},setup(e){function t(s,o){return n(s[o.key])}function n(s){if(s==null||s==="")return"—";if(Array.isArray(s)){const o=s.map(n).filter(i=>i!=="—");return o.length===0?"—":o.join(", ")}return typeof s=="boolean"?we(s?"backend::lang.list.column_switch_true":"backend::lang.list.column_switch_false"):typeof s=="object"?"—":String(s)}function r(s,o){const i=s.id;return typeof i=="number"||typeof i=="string"?String(i):`row-${o}`}return(s,o)=>(V(),le("div",Gd,[H("table",Qd,[H("thead",null,[H("tr",Jd,[(V(!0),le(fe,null,kt(e.columns,i=>(V(),le("th",{key:i.key,scope:"col",class:"px-3.5 text-[12px] font-semibold text-muted first:pl-5 last:pr-5"},de(i.label),1))),128))])]),H("tbody",{"aria-busy":e.loading?"true":void 0},[e.loading?(V(),le(fe,{key:0},kt(8,i=>H("tr",{key:`skeleton-${i}`,class:"h-row border-b border-border"},[(V(!0),le(fe,null,kt(e.columns,l=>(V(),le("td",{key:l.key,class:"px-3.5 first:pl-5 last:pr-5"},[...o[0]||(o[0]=[H("span",{class:"block h-3 w-3/5 rounded-[6px] bg-skel"},null,-1)])]))),128))])),64)):e.rows.length===0?(V(),le("tr",Xd,[H("td",{colspan:Math.max(e.columns.length,1),class:"px-5 py-20 text-center text-muted"},de(e.emptyText??X(we)("backend::lang.list.no_records")),9,Zd)])):(V(!0),le(fe,{key:2},kt(e.rows,(i,l)=>(V(),le("tr",{key:r(i,l),class:"h-row border-b border-border"},[(V(!0),le(fe,null,kt(e.columns,(c,f)=>(V(),le("td",{key:c.key,class:wt([f===0?"font-semibold":"text-muted","px-3.5 first:pl-5 last:pr-5"])},de(t(i,c)),3))),128))]))),128))],8,Yd)])]))}}),th={class:"flex flex-col gap-5"},nh={class:"text-[26px] font-bold tracking-[-0.02em]"},rh={class:"overflow-hidden rounded-card border border-border bg-surface shadow-card"},sh={key:0,role:"alert",class:"px-5 py-4 text-danger"},oh={class:"border-t border-border px-5 py-3.5 text-[13px] text-muted"},ih=lt({__name:"ListView",setup(e){const t=Wt(),n=ce(()=>({vendor:String(t.params.vendor??""),plugin:String(t.params.plugin??""),controller:String(t.params.controller??"")})),r=Ie(null),s=Ie([]),o=Ie(null),i=Ie(!0),l=Ie(!1),c=ce(()=>{if(r.value?.title)return r.value.title;const p=fd(n.value);return Zr(n.value.vendor,n.value.plugin)?.sideMenu.find(R=>R.controller===p)?.label??p}),f=ce(()=>{const p=o.value;if(!p||p.total===0)return we("backend::lang.list.no_results");const g=(p.page-1)*p.per_page+1,R=Math.min(p.page*p.per_page,p.total);return we("backend::lang.list.pagination_range",{from:g,to:R,total:p.total})});let u=0;async function h(){const p=++u;i.value=!0,l.value=!1;const g={path:n.value},[R,w]=await Promise.all([Kt.GET("/{vendor}/{plugin}/{controller}/schema/list",{params:g}),Kt.GET("/{vendor}/{plugin}/{controller}",{params:g})]);p===u&&(r.value=R.data?.data??null,s.value=w.data?.data??[],o.value=w.data?.meta??null,l.value=!R.data||!w.data,i.value=!1)}return sn(n,h,{immediate:!0,deep:!0}),(p,g)=>(V(),le("section",th,[H("header",null,[H("h1",nh,de(c.value),1)]),H("div",rh,[l.value&&!i.value?(V(),le("p",sh,de(X(we)("backend::lang.list.load_failed")),1)):(V(),Qe(eh,{key:1,columns:r.value?.columns??[],rows:s.value,loading:i.value,"empty-text":r.value?.noRecordsMessage},null,8,["columns","rows","loading","empty-text"])),H("footer",oh,de(i.value?X(we)("backend::lang.list.loading"):f.value),1)])]))}}),lh={class:"flex flex-col items-center gap-2 py-20 text-center"},ch={class:"text-[17px] font-bold"},uo=lt({__name:"NotFoundView",props:{home:{type:Boolean}},setup(e){return(t,n)=>(V(),le("section",lh,[H("h1",ch,de(e.home?X(we)("backend::lang.nav.empty"):X(we)("backend::lang.page.not_found")),1)]))}});function Ki(e){return typeof e!="string"||e.length===0||!e.startsWith("/")||e.startsWith("//")||e.startsWith("/\\")?null:e}function ah(e=Xa(Fi.base)){const t=yu({history:e,routes:[{path:"/login",name:"login",component:Wd,meta:{public:!0}},{path:"/",name:"home",component:uo,props:{home:!0},meta:{shell:!0},beforeEnter:()=>dd()??!0},{path:"/:vendor/:plugin/:controller",name:"list",component:ih,meta:{shell:!0}},{path:"/:pathMatch(.*)*",name:"not-found",component:uo,meta:{shell:!0}}]});return t.beforeEach(n=>{const r=en.value!==null;return n.meta.public?r&&n.name==="login"?Ki(n.query.redirect)??"/":!0:r?!0:{name:"login",query:{redirect:n.fullPath}}}),t}async function uh(){await Bi().catch(()=>null)&&await qi().catch(()=>[]);const t=ah();ld(()=>{xd();const r=t.currentRoute.value;r.name!=="login"&&t.push({name:"login",query:{redirect:r.fullPath}})});const n=ha(jd);n.use(t),await t.isReady(),n.mount("#app")}uh(); diff --git a/boardwalk/dist/index.html b/boardwalk/dist/index.html new file mode 100644 index 0000000..9ea91a2 --- /dev/null +++ b/boardwalk/dist/index.html @@ -0,0 +1,15 @@ + + + + + + + + SummerCMS + + + + +

+ + diff --git a/bouncer/jwt.go b/bouncer/jwt.go index 30e014b..3c38508 100644 --- a/bouncer/jwt.go +++ b/bouncer/jwt.go @@ -87,13 +87,16 @@ func NewJWTGuard(secret string, users UserProvider, bl BlacklistStore, cookieNam return &jwtGuard{secret: secret, users: users, bl: bl, cookieNames: cookieNames} } -// NewBackendJWTGuard is bearer-only and requires AudienceBackend. -// write may replace the PHP-shaped 401 body; nil keeps write401. -func NewBackendJWTGuard(secret string, users UserProvider, bl BlacklistStore, write func(http.ResponseWriter, error)) Guard { +// NewBackendJWTGuard requires AudienceBackend. write may replace the +// PHP-shaped 401 body; nil keeps write401. With no cookieNames it is +// Bearer-only; otherwise each cookie is tried, in order, after the +// Authorization header, so a Bearer token still wins when both are sent. +func NewBackendJWTGuard(secret string, users UserProvider, bl BlacklistStore, write func(http.ResponseWriter, error), cookieNames ...string) Guard { return &jwtGuard{ secret: secret, users: users, bl: bl, + cookieNames: cookieNames, audience: AudienceBackend, requireAudience: true, writeFn: write, diff --git a/cabana/admin_openapi.go b/cabana/admin_openapi.go index 5516a0d..108dfa8 100644 --- a/cabana/admin_openapi.go +++ b/cabana/admin_openapi.go @@ -1,9 +1,19 @@ package cabana -// Admin API annotations. swag reads these with the handler package so -// docs/openapi.json lists every D-09 route. The functions are not mounted; -// service.mount in http.go is the runtime route table, and -// TestPhase09PermissionMatrix fails if the two lists diverge. +// @title SummerCMS Admin API +// @version 1 +// @description Framework admin API consumed by the embedded admin SPA. Every path is relative to {backend.uri}/api/v1 (for example /backend/api/v1). The SPA authenticates with the HttpOnly summer_admin cookie set by a login that sends X-Requested-With: XMLHttpRequest, and sends that header on every request; CLI clients and tests send the BackendBearer Authorization header instead. +// @BasePath / +// @securityDefinitions.apikey BackendBearer +// @in header +// @name Authorization +// @description Backend admin bearer token. Send "Bearer {access_token}". + +// Admin API annotations. scripts/check-admin-openapi.sh reads them with swag +// to produce admin/openapi/admin.json, the document the SPA's TypeScript types +// are generated from (D-15). The functions are not mounted; service.mount in +// http.go is the runtime route table, and TestPhase09PermissionMatrix plus +// TestPhase09ContractInventory fail if the two lists diverge. // ErrorBody is one D-10 error object. type ErrorBody struct { @@ -32,41 +42,84 @@ type SuccessEnvelope struct { Meta SuccessMeta `json:"meta"` } -// AdminLoginData is the admin login payload. +// AdminLoginData is the admin login and refresh payload. Bearer transport +// carries access_token; cookie transport (X-Requested-With: XMLHttpRequest) +// carries token_type "cookie" and expires_in, never the token. type AdminLoginData struct { - AccessToken string `json:"access_token"` + AccessToken string `json:"access_token,omitempty"` TokenType string `json:"token_type"` + ExpiresIn int `json:"expires_in,omitempty"` } -// AdminLoginEnvelope is the admin login success body. -type AdminLoginEnvelope struct { - Data AdminLoginData `json:"data"` - Meta SuccessMeta `json:"meta"` +// Envelope is the typed D-10 success envelope. +type Envelope[T any] struct { + Data T `json:"data"` + Meta SuccessMeta `json:"meta"` } -// AdminLogin documents POST /_admin/api/v1/auth/login. +// ListEnvelope is the typed D-10 paginated envelope (Phase 9 D-11 meta). +type ListEnvelope[T any] struct { + Data T `json:"data"` + Meta ListMeta `json:"meta"` +} + +// AdminRecord is one admin record: a string-keyed map read through its +// list or form schema (D-16). +type AdminRecord map[string]any + +// AdminLoginRequest is the admin login body. Either login or email +// identifies the backend user. +type AdminLoginRequest struct { + Login string `json:"login,omitempty"` + Email string `json:"email,omitempty"` + Password string `json:"password"` +} + +// AdminRoleSummary is the role attached to an admin profile. +type AdminRoleSummary struct { + ID uint `json:"id"` + Code string `json:"code"` + Name string `json:"name"` +} + +// AdminProfile is the GET /auth/me payload. +type AdminProfile struct { + ID uint `json:"id"` + Login string `json:"login"` + Email string `json:"email"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + IsSuperuser bool `json:"is_superuser"` + Role *AdminRoleSummary `json:"role,omitempty"` +} + +// AdminLogin documents POST /auth/login. // // @Summary Admin login // @Tags admin // @Accept json // @Produce json -// @Success 200 {object} AdminLoginEnvelope +// @Param body body AdminLoginRequest true "Credentials" +// @Param X-Requested-With header string false "XMLHttpRequest selects cookie transport" +// @Success 200 {object} Envelope[AdminLoginData] // @Failure 401 {object} ErrorEnvelope -// @Router /_admin/api/v1/auth/login [post] +// @Router /auth/login [post] func AdminLogin() {} -// AdminRefresh documents POST /_admin/api/v1/auth/refresh. +// AdminRefresh documents POST /auth/refresh. // // @Summary Refresh an admin token // @Tags admin // @Accept json // @Produce json -// @Success 200 {object} AdminLoginEnvelope +// @Param X-Requested-With header string false "XMLHttpRequest; required unless a Bearer token is sent" +// @Success 200 {object} Envelope[AdminLoginData] +// @Failure 403 {object} ErrorEnvelope // @Failure 401 {object} ErrorEnvelope -// @Router /_admin/api/v1/auth/refresh [post] +// @Router /auth/refresh [post] func AdminRefresh() {} -// AdminLogout documents POST /_admin/api/v1/auth/logout. +// AdminLogout documents POST /auth/logout. // // @Summary Admin logout // @Tags admin @@ -74,33 +127,33 @@ func AdminRefresh() {} // @Security BackendBearer // @Success 200 {object} SuccessEnvelope // @Failure 401 {object} ErrorEnvelope -// @Router /_admin/api/v1/auth/logout [post] +// @Router /auth/logout [post] func AdminLogout() {} -// AdminMe documents GET /_admin/api/v1/auth/me. +// AdminMe documents GET /auth/me. // // @Summary Current admin // @Tags admin // @Produce json // @Security BackendBearer -// @Success 200 {object} SuccessEnvelope +// @Success 200 {object} Envelope[AdminProfile] // @Failure 401 {object} ErrorEnvelope -// @Router /_admin/api/v1/auth/me [get] +// @Router /auth/me [get] func AdminMe() {} -// AdminNavigation documents GET /_admin/api/v1/navigation. +// AdminNavigation documents GET /navigation. // // @Summary Admin navigation // @Tags admin // @Produce json // @Security BackendBearer -// @Success 200 {object} SuccessEnvelope +// @Success 200 {object} Envelope[[]NavigationEntry] // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope -// @Router /_admin/api/v1/navigation [get] +// @Router /navigation [get] func AdminNavigation() {} -// AdminSettingsList documents GET /_admin/api/v1/settings. +// AdminSettingsList documents GET /settings. // // @Summary List admin settings // @Tags admin @@ -109,10 +162,10 @@ func AdminNavigation() {} // @Success 200 {object} SuccessEnvelope // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope -// @Router /_admin/api/v1/settings [get] +// @Router /settings [get] func AdminSettingsList() {} -// AdminSettingsSchema documents GET /_admin/api/v1/settings/{code}/schema. +// AdminSettingsSchema documents GET /settings/{code}/schema. // // @Summary Admin settings schema // @Tags admin @@ -123,10 +176,10 @@ func AdminSettingsList() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 404 {object} ErrorEnvelope -// @Router /_admin/api/v1/settings/{code}/schema [get] +// @Router /settings/{code}/schema [get] func AdminSettingsSchema() {} -// AdminSettingsGet documents GET /_admin/api/v1/settings/{code}. +// AdminSettingsGet documents GET /settings/{code}. // // @Summary Read admin settings // @Tags admin @@ -137,10 +190,10 @@ func AdminSettingsSchema() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 404 {object} ErrorEnvelope -// @Router /_admin/api/v1/settings/{code} [get] +// @Router /settings/{code} [get] func AdminSettingsGet() {} -// AdminSettingsPut documents PUT /_admin/api/v1/settings/{code}. +// AdminSettingsPut documents PUT /settings/{code}. // // @Summary Update admin settings // @Tags admin @@ -152,7 +205,7 @@ func AdminSettingsGet() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 422 {object} ErrorEnvelope -// @Router /_admin/api/v1/settings/{code} [put] +// @Router /settings/{code} [put] func AdminSettingsPut() {} // AdminListSchema documents the list schema route. @@ -164,11 +217,11 @@ func AdminSettingsPut() {} // @Param vendor path string true "Vendor" // @Param plugin path string true "Plugin" // @Param controller path string true "Controller" -// @Success 200 {object} SuccessEnvelope +// @Success 200 {object} Envelope[ListSchema] // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 404 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller}/schema/list [get] +// @Router /{vendor}/{plugin}/{controller}/schema/list [get] func AdminListSchema() {} // AdminFormSchema documents the form schema route. @@ -184,7 +237,7 @@ func AdminListSchema() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 404 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller}/schema/form [get] +// @Router /{vendor}/{plugin}/{controller}/schema/form [get] func AdminFormSchema() {} // AdminRelationSchema documents the relation schema route. @@ -201,7 +254,7 @@ func AdminFormSchema() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 404 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller}/schema/relation/{name} [get] +// @Router /{vendor}/{plugin}/{controller}/schema/relation/{name} [get] func AdminRelationSchema() {} // AdminList documents the record list route. @@ -213,11 +266,16 @@ func AdminRelationSchema() {} // @Param vendor path string true "Vendor" // @Param plugin path string true "Plugin" // @Param controller path string true "Controller" -// @Success 200 {object} SuccessEnvelope +// @Param search query string false "Search term" +// @Param sort query string false "Sort column" +// @Param dir query string false "Sort direction (asc or desc)" +// @Param page query integer false "Page" +// @Param per_page query integer false "Records per page" +// @Success 200 {object} ListEnvelope[[]AdminRecord] // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 422 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller} [get] +// @Router /{vendor}/{plugin}/{controller} [get] func AdminList() {} // AdminCreate documents the record create route. @@ -234,7 +292,7 @@ func AdminList() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 422 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller} [post] +// @Router /{vendor}/{plugin}/{controller} [post] func AdminCreate() {} // AdminBulkDelete documents the bulk delete route. @@ -251,7 +309,7 @@ func AdminCreate() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 422 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller}/bulk-delete [post] +// @Router /{vendor}/{plugin}/{controller}/bulk-delete [post] func AdminBulkDelete() {} // AdminShow documents the record show route. @@ -268,7 +326,7 @@ func AdminBulkDelete() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 404 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller}/{id} [get] +// @Router /{vendor}/{plugin}/{controller}/{id} [get] func AdminShow() {} // AdminUpdate documents the record update route. @@ -286,7 +344,7 @@ func AdminShow() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 422 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller}/{id} [put] +// @Router /{vendor}/{plugin}/{controller}/{id} [put] func AdminUpdate() {} // AdminDelete documents the record delete route. @@ -303,7 +361,7 @@ func AdminUpdate() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 404 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller}/{id} [delete] +// @Router /{vendor}/{plugin}/{controller}/{id} [delete] func AdminDelete() {} // AdminRelationLinked documents the linked-relation route. @@ -320,7 +378,7 @@ func AdminDelete() {} // @Success 200 {object} SuccessEnvelope // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}/relations/{name} [get] +// @Router /{vendor}/{plugin}/{controller}/{id}/relations/{name} [get] func AdminRelationLinked() {} // AdminRelationCandidates documents the relation candidate route. @@ -337,7 +395,7 @@ func AdminRelationLinked() {} // @Success 200 {object} SuccessEnvelope // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}/relations/{name}/candidates [get] +// @Router /{vendor}/{plugin}/{controller}/{id}/relations/{name}/candidates [get] func AdminRelationCandidates() {} // AdminRelationLink documents the relation link route. @@ -356,7 +414,7 @@ func AdminRelationCandidates() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 422 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}/relations/{name}/link [post] +// @Router /{vendor}/{plugin}/{controller}/{id}/relations/{name}/link [post] func AdminRelationLink() {} // AdminRelationUnlink documents the relation unlink route. @@ -375,5 +433,5 @@ func AdminRelationLink() {} // @Failure 401 {object} ErrorEnvelope // @Failure 403 {object} ErrorEnvelope // @Failure 422 {object} ErrorEnvelope -// @Router /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}/relations/{name}/unlink [post] +// @Router /{vendor}/{plugin}/{controller}/{id}/relations/{name}/unlink [post] func AdminRelationUnlink() {} diff --git a/cabana/admin_paths_test.go b/cabana/admin_paths_test.go new file mode 100644 index 0000000..e5e7da6 --- /dev/null +++ b/cabana/admin_paths_test.go @@ -0,0 +1,7 @@ +package cabana + +// adminAPI composes a full admin API path under the default prefix, so tests +// follow the backend.uri scheme (D-03) instead of hardcoding it. +func adminAPI(rel string) string { + return DefaultAdminPrefix + adminAPIVersion + rel +} diff --git a/cabana/auth.go b/cabana/auth.go index ac39d7d..2a0e4df 100644 --- a/cabana/auth.go +++ b/cabana/auth.go @@ -172,12 +172,39 @@ func (s *service) login(w http.ResponseWriter, r *http.Request) { return } s.logAuth(r, "success", user.ID) + if isAjax(r) { + // Cookie transport (D-19): the SPA never sees the token. + s.writeSessionCookie(w, token) + WriteData(w, http.StatusOK, cookieLoginData(s.ttl), map[string]any{}) + return + } WriteData(w, http.StatusOK, map[string]string{ "access_token": token, "token_type": "bearer", }, map[string]any{}) } +// cookieLoginData is the login/refresh body under cookie transport: no token, +// only its type and the access lifetime in seconds. +func cookieLoginData(ttl time.Duration) AdminLoginData { + return AdminLoginData{TokenType: "cookie", ExpiresIn: int(ttl / time.Second)} +} + +// writeSessionCookie sets the admin JWT cookie scoped to the admin prefix. +// Max-Age is the refresh window, because refresh accepts an expired access +// token until iat plus refresh_ttl. +func (s *service) writeSessionCookie(w http.ResponseWriter, token string) { + http.SetCookie(w, &http.Cookie{ + Name: AdminCookieName, + Value: token, + Path: s.adminPrefix(), + MaxAge: int(s.refreshTTL / time.Second), + HttpOnly: true, + Secure: true, + SameSite: http.SameSiteStrictMode, + }) +} + func (s *service) refresh(w http.ResponseWriter, r *http.Request) { raw := bearerToken(r) if raw == "" { @@ -247,23 +274,19 @@ func (s *service) me(w http.ResponseWriter, r *http.Request) { WriteData(w, http.StatusOK, profileOf(user), map[string]any{}) } -func profileOf(user BackendUser) map[string]any { - data := map[string]any{ - "id": user.ID, - "login": user.Login, - "email": user.Email, - "first_name": user.FirstName, - "last_name": user.LastName, - "is_superuser": user.IsSuperuser, +func profileOf(user BackendUser) AdminProfile { + profile := AdminProfile{ + ID: user.ID, + Login: user.Login, + Email: user.Email, + FirstName: user.FirstName, + LastName: user.LastName, + IsSuperuser: user.IsSuperuser, } if user.Role.ID != 0 { - data["role"] = map[string]any{ - "id": user.Role.ID, - "code": user.Role.Code, - "name": user.Role.Name, - } + profile.Role = &AdminRoleSummary{ID: user.Role.ID, Code: user.Role.Code, Name: user.Role.Name} } - return data + return profile } func bearerToken(r *http.Request) string { @@ -402,15 +425,18 @@ func adminLoginWindow(app *backpack.App) (int, int) { return maxAttempts, decayMinutes } -func adminIssuer(app *backpack.App) string { +// adminIssuer is app.url plus the admin API login path. JWT verification does +// not check iss, so tokens minted under an earlier prefix stay valid until +// they expire. +func adminIssuer(app *backpack.App, prefix string) string { base := "" if app != nil && app.Config != nil { base = strings.TrimRight(strings.TrimSpace(app.Config.String("app.url")), "/") } - if base == "" { - return "/_admin/api/v1/auth/login" + if prefix == "" { + prefix = DefaultAdminPrefix } - return base + "/_admin/api/v1/auth/login" + return base + prefix + adminAPIVersion + "/auth/login" } // dummyPasswordHash keeps a missing-user login on the bcrypt path. diff --git a/cabana/auth_test.go b/cabana/auth_test.go index 69ad6b6..043c12b 100644 --- a/cabana/auth_test.go +++ b/cabana/auth_test.go @@ -42,7 +42,7 @@ func TestAdminAuthLifecycle(t *testing.T) { gdb := adminGorm(t) h := adminHandler(t, gdb, nil) user := insertAdmin(t, gdb, "life", "Life@Example.Test", adminTestPassword, true, false) - login := postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{ + login := postJSON(t, h, adminAPI("/auth/login"), map[string]string{ "login": "life", "password": adminTestPassword, }) @@ -63,7 +63,7 @@ func TestAdminAuthLifecycle(t *testing.T) { if !stamped.Valid { t.Fatal("successful login did not stamp last_login") } - byEmail := postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{ + byEmail := postJSON(t, h, adminAPI("/auth/login"), map[string]string{ "email": "life@example.test", "password": adminTestPassword, }) @@ -71,12 +71,12 @@ func TestAdminAuthLifecycle(t *testing.T) { t.Fatalf("email login status=%d body=%s", byEmail.Code, byEmail.Body.String()) } emailToken := accessToken(t, byEmail.Body.Bytes()) - me := getAuth(t, h, "/_admin/api/v1/auth/me", emailToken) + me := getAuth(t, h, adminAPI("/auth/me"), emailToken) if me.Code != http.StatusOK { t.Fatalf("me status=%d body=%s", me.Code, me.Body.String()) } assertSafeProfile(t, me.Body.Bytes(), user) - refreshed := postAuth(t, h, http.MethodPost, "/_admin/api/v1/auth/refresh", emailToken, nil) + refreshed := postAuth(t, h, http.MethodPost, adminAPI("/auth/refresh"), emailToken, nil) if refreshed.Code != http.StatusOK { t.Fatalf("refresh status=%d body=%s", refreshed.Code, refreshed.Body.String()) } @@ -87,7 +87,7 @@ func TestAdminAuthLifecycle(t *testing.T) { if jwtAudience(t, next) != "backend" { t.Fatal("refreshed token lost the backend audience") } - oldMe := getAuth(t, h, "/_admin/api/v1/auth/me", emailToken) + oldMe := getAuth(t, h, adminAPI("/auth/me"), emailToken) if oldMe.Code != http.StatusUnauthorized { t.Fatalf("previous token after refresh status=%d body=%s", oldMe.Code, oldMe.Body.String()) } @@ -98,14 +98,14 @@ func TestAdminAuthLifecycle(t *testing.T) { if blacklisted != 1 { t.Fatalf("previous jti blacklist rows=%d", blacklisted) } - out := postAuth(t, h, http.MethodPost, "/_admin/api/v1/auth/logout", next, nil) + out := postAuth(t, h, http.MethodPost, adminAPI("/auth/logout"), next, nil) if out.Code != http.StatusOK { t.Fatalf("logout status=%d body=%s", out.Code, out.Body.String()) } if strings.Contains(out.Body.String(), next) { t.Fatal("logout body contains the token") } - after := getAuth(t, h, "/_admin/api/v1/auth/me", next) + after := getAuth(t, h, adminAPI("/auth/me"), next) if after.Code != http.StatusUnauthorized { t.Fatalf("me after logout status=%d", after.Code) } @@ -113,7 +113,7 @@ func TestAdminAuthLifecycle(t *testing.T) { if err := gdb.Model(&cabana.BackendUser{}).Where("id = ?", user.ID).Update("tokens_valid_after", cutoff).Error; err != nil { t.Fatal(err) } - fresh := accessToken(t, postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{ + fresh := accessToken(t, postJSON(t, h, adminAPI("/auth/login"), map[string]string{ "login": "life", "password": adminTestPassword, }).Body.Bytes()) // Login mints after the cutoff, so this token is current. Move the cutoff @@ -121,7 +121,7 @@ func TestAdminAuthLifecycle(t *testing.T) { if err := gdb.Model(&cabana.BackendUser{}).Where("id = ?", user.ID).Update("tokens_valid_after", time.Now().Add(time.Hour)).Error; err != nil { t.Fatal(err) } - stale := getAuth(t, h, "/_admin/api/v1/auth/me", fresh) + stale := getAuth(t, h, adminAPI("/auth/me"), fresh) if stale.Code != http.StatusUnauthorized { t.Fatalf("stale principal status=%d body=%s", stale.Code, stale.Body.String()) } @@ -131,9 +131,9 @@ func TestAdminInactive(t *testing.T) { gdb := adminGorm(t) h := adminHandler(t, gdb, nil) insertAdmin(t, gdb, "inactive", "inactive@example.test", adminTestPassword, false, false) - unknown := postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{"login": "nobody", "password": adminTestPassword}) - wrong := postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{"login": "inactive", "password": "wrong-password"}) - right := postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{"login": "inactive", "password": adminTestPassword}) + unknown := postJSON(t, h, adminAPI("/auth/login"), map[string]string{"login": "nobody", "password": adminTestPassword}) + wrong := postJSON(t, h, adminAPI("/auth/login"), map[string]string{"login": "inactive", "password": "wrong-password"}) + right := postJSON(t, h, adminAPI("/auth/login"), map[string]string{"login": "inactive", "password": adminTestPassword}) assertSameOpaque(t, unknown, wrong, right) var stamped sql.NullTime if err := gdb.Raw(`SELECT last_login FROM backend_users WHERE login = 'inactive'`).Scan(&stamped).Error; err != nil { @@ -148,8 +148,8 @@ func TestAdminDeleted(t *testing.T) { gdb := adminGorm(t) h := adminHandler(t, gdb, nil) insertAdmin(t, gdb, "deleted", "deleted@example.test", adminTestPassword, true, true) - unknown := postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{"login": "nobody-else", "password": adminTestPassword}) - deleted := postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{"login": "deleted", "password": adminTestPassword}) + unknown := postJSON(t, h, adminAPI("/auth/login"), map[string]string{"login": "nobody-else", "password": adminTestPassword}) + deleted := postJSON(t, h, adminAPI("/auth/login"), map[string]string{"login": "deleted", "password": adminTestPassword}) assertSameOpaque(t, unknown, deleted) if strings.Contains(strings.ToLower(deleted.Body.String()), "delet") { t.Fatalf("deleted login disclosed the account: %s", deleted.Body.String()) @@ -160,14 +160,14 @@ func TestAdminBlacklist(t *testing.T) { gdb := adminGorm(t) h := adminHandler(t, gdb, nil) insertAdmin(t, gdb, "revoke", "revoke@example.test", adminTestPassword, true, false) - token := accessToken(t, postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{ + token := accessToken(t, postJSON(t, h, adminAPI("/auth/login"), map[string]string{ "login": "revoke", "password": adminTestPassword, }).Body.Bytes()) - out := postAuth(t, h, http.MethodPost, "/_admin/api/v1/auth/logout", token, nil) + out := postAuth(t, h, http.MethodPost, adminAPI("/auth/logout"), token, nil) if out.Code != http.StatusOK { t.Fatalf("logout status=%d body=%s", out.Code, out.Body.String()) } - again := postAuth(t, h, http.MethodPost, "/_admin/api/v1/auth/refresh", token, nil) + again := postAuth(t, h, http.MethodPost, adminAPI("/auth/refresh"), token, nil) if again.Code != http.StatusUnauthorized { t.Fatalf("refresh after logout status=%d body=%s", again.Code, again.Body.String()) } @@ -192,7 +192,7 @@ func TestAdminLoginThrottle(t *testing.T) { }) var last *httptest.ResponseRecorder for i := 0; i < 3; i++ { - last = postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{ + last = postJSON(t, h, adminAPI("/auth/login"), map[string]string{ "login": "throttle-user", "password": adminTestPassword, }) } @@ -217,16 +217,16 @@ func TestAdminAuthLogging(t *testing.T) { slog.SetDefault(slog.New(slog.NewJSONHandler(&buf, nil))) t.Cleanup(func() { slog.SetDefault(prev) }) - ok := postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{"login": "logged", "password": adminTestPassword}) + ok := postJSON(t, h, adminAPI("/auth/login"), map[string]string{"login": "logged", "password": adminTestPassword}) token := accessToken(t, ok.Body.Bytes()) assertLog(t, &buf, "success", user.ID, adminTestPassword, token) buf.Reset() - postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{"login": "logged", "password": "not-the-password"}) + postJSON(t, h, adminAPI("/auth/login"), map[string]string{"login": "logged", "password": "not-the-password"}) assertLog(t, &buf, "failed", user.ID, "not-the-password", "") buf.Reset() - postJSON(t, h, "/_admin/api/v1/auth/login", map[string]string{"login": "missing-logged", "password": "not-the-password"}) + postJSON(t, h, adminAPI("/auth/login"), map[string]string{"login": "missing-logged", "password": "not-the-password"}) failedUnknown := buf.String() if !strings.Contains(failedUnknown, `"outcome":"failed"`) { t.Fatalf("unknown login log = %s", failedUnknown) @@ -236,7 +236,7 @@ func TestAdminAuthLogging(t *testing.T) { } buf.Reset() - denied := getAuth(t, h, "/_admin/api/v1/acme/demo/widgets", token) + denied := getAuth(t, h, adminAPI("/acme/demo/widgets"), token) if denied.Code != http.StatusForbidden { t.Fatalf("denied status=%d body=%s", denied.Code, denied.Body.String()) } @@ -551,3 +551,9 @@ func jwtClaims(t *testing.T, token string) map[string]any { func itoa(id uint) string { return strconv.FormatUint(uint64(id), 10) } + +// adminAPI mirrors the internal helper in admin_paths_test.go for this +// external test package: a full admin API path under the default prefix. +func adminAPI(rel string) string { + return cabana.DefaultAdminPrefix + "/api/v1" + rel +} diff --git a/cabana/bulk_test.go b/cabana/bulk_test.go index 6db4a61..60e399e 100644 --- a/cabana/bulk_test.go +++ b/cabana/bulk_test.go @@ -18,7 +18,7 @@ import ( func TestBulkDeleteEmpty(t *testing.T) { cap := &captureRouter{} (&service{}).mount(cap) - key := "POST /_admin/api/v1/{vendor}/{plugin}/{controller}/bulk-delete" + key := "POST " + adminAPI("/{vendor}/{plugin}/{controller}/bulk-delete") mw, ok := cap.middleware[key] if !ok || !containsString(mw, "backend") { t.Fatalf("missing %s in %v", key, cap.routes) diff --git a/cabana/commands_test.go b/cabana/commands_test.go index e7b5cb7..dea5406 100644 --- a/cabana/commands_test.go +++ b/cabana/commands_test.go @@ -107,7 +107,7 @@ func TestAdminResetPasswordCommand(t *testing.T) { t.Fatal(err) } guard := bouncer.NewBackendJWTGuard(adminTestSecret, cabana.BackendUsers{DB: gdb}, nil, nil) - req := httptest.NewRequest(http.MethodGet, "/_admin/api/v1/auth/me", nil) + req := httptest.NewRequest(http.MethodGet, adminAPI("/auth/me"), nil) req.Header.Set("Authorization", "Bearer "+token) if _, err := guard.Authenticate(req); err != nil { t.Fatalf("token before reset: %v", err) diff --git a/cabana/crud_lifecycle_test.go b/cabana/crud_lifecycle_test.go index 7fedf49..90dd477 100644 --- a/cabana/crud_lifecycle_test.go +++ b/cabana/crud_lifecycle_test.go @@ -104,10 +104,10 @@ func TestCRUDRecordRoutes(t *testing.T) { cap := &captureRouter{} (&service{}).mount(cap) for _, want := range []string{ - "POST /_admin/api/v1/{vendor}/{plugin}/{controller}", - "GET /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}", - "PUT /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}", - "DELETE /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}", + "POST " + adminAPI("/{vendor}/{plugin}/{controller}"), + "GET " + adminAPI("/{vendor}/{plugin}/{controller}/{id}"), + "PUT " + adminAPI("/{vendor}/{plugin}/{controller}/{id}"), + "DELETE " + adminAPI("/{vendor}/{plugin}/{controller}/{id}"), } { mw, ok := cap.middleware[want] if !ok { diff --git a/cabana/csrf.go b/cabana/csrf.go new file mode 100644 index 0000000..f751085 --- /dev/null +++ b/cabana/csrf.go @@ -0,0 +1,45 @@ +package cabana + +import ( + "net/http" + "strings" +) + +const ( + // requestedWithHeader is the custom header the admin SPA sends on every + // request. A cross-site form or navigation cannot set it, and a + // cross-origin fetch that sets it needs a CORS preflight the admin API + // never answers (D-19). + requestedWithHeader = "X-Requested-With" + requestedWithAjax = "XMLHttpRequest" +) + +// requireAjax refuses a state-changing admin request that is not +// Bearer-authenticated and does not carry X-Requested-With: XMLHttpRequest. +// It runs before the wrapped handler, so a refused request is never decoded, +// never looks up a controller and never reaches the database. The response +// uses the fixed D-10 code forbidden. +func requireAjax(next http.HandlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if !csrfSafe(r) { + WriteError(w, http.StatusForbidden, "forbidden", msgForbidden) + return + } + next(w, r) + } +} + +func csrfSafe(r *http.Request) bool { + switch r.Method { + case http.MethodGet, http.MethodHead, http.MethodOptions: + return true + } + if bearerToken(r) != "" { + return true + } + return isAjax(r) +} + +func isAjax(r *http.Request) bool { + return strings.TrimSpace(r.Header.Get(requestedWithHeader)) == requestedWithAjax +} diff --git a/cabana/http.go b/cabana/http.go index e319d97..c5044eb 100644 --- a/cabana/http.go +++ b/cabana/http.go @@ -13,6 +13,7 @@ import ( "time" "git.golem15.com/golem15/summercms/backpack" + "git.golem15.com/golem15/summercms/boardwalk" "git.golem15.com/golem15/summercms/bouncer" "git.golem15.com/golem15/summercms/pact" "git.golem15.com/golem15/summercms/party" @@ -20,10 +21,12 @@ import ( "gorm.io/gorm" ) -// Routes is the raw admin API mounted by surf.BuildRouter. +// Routes is the raw admin API and SPA mounted by surf.BuildRouter. Prefix is +// the normalized backend.uri every admin route lives under. type Routes struct { Middleware pact.Middleware Mount func(r pact.Router) + Prefix string } type service struct { @@ -38,6 +41,21 @@ type service struct { loginDecay int issuer string bl bouncer.BlacklistStore + prefix string + spa http.Handler +} + +// adminPrefix returns the mount path; a zero service uses the default. +func (s *service) adminPrefix() string { + if s == nil || s.prefix == "" { + return DefaultAdminPrefix + } + return s.prefix +} + +// apiBase is the admin API root: the prefix plus /api/v1 (D-03). +func (s *service) apiBase() string { + return s.adminPrefix() + adminAPIVersion } // Activate compiles admin controllers and, when any exist, requires @@ -54,6 +72,10 @@ func Activate(app *backpack.App, plugins []party.Plugin) (*Routes, error) { if err != nil { return nil, err } + prefix, err := AdminPrefix(app) + if err != nil { + return nil, err + } reg, err := compileRegistry(items) if err != nil { return nil, err @@ -72,7 +94,7 @@ func Activate(app *backpack.App, plugins []party.Plugin) (*Routes, error) { } } bl := adminBlacklist(app) - guard := bouncer.NewBackendJWTGuard(secret, lazyBackendUsers{app: app, reg: reg}, bl, writeUnauthenticated) + guard := bouncer.NewBackendJWTGuard(secret, lazyBackendUsers{app: app, reg: reg}, bl, writeUnauthenticated, AdminCookieName) if _, err := guards.Middleware("backend"); err != nil { if err := guards.Register("summercms.cabana", "backend", guard); err != nil { return nil, err @@ -93,10 +115,31 @@ func Activate(app *backpack.App, plugins []party.Plugin) (*Routes, error) { bcryptCost: adminBcryptCost(app), loginMax: loginMax, loginDecay: loginDecay, - issuer: adminIssuer(app), + issuer: adminIssuer(app, prefix), bl: bl, + prefix: prefix, } - return &Routes{Middleware: mw, Mount: svc.mount}, nil + spa, err := boardwalk.Handler(prefix, http.HandlerFunc(writeNotFound)) + if err != nil { + return nil, fmt.Errorf("cabana: admin SPA: %w", err) + } + svc.spa = spa + return &Routes{Middleware: mw, Mount: svc.mount, Prefix: prefix}, nil +} + +func writeNotFound(w http.ResponseWriter, _ *http.Request) { + WriteError(w, http.StatusNotFound, "not_found", msgNotFound) +} + +// serveSPA answers GET {prefix} and GET {prefix}/{path...} from the embedded +// build. API paths that no route matched fall through to it and receive the +// D-10 not_found envelope, never index.html. +func (s *service) serveSPA(w http.ResponseWriter, r *http.Request) { + if s == nil || s.spa == nil { + writeNotFound(w, r) + return + } + s.spa.ServeHTTP(w, r) } func writeUnauthenticated(w http.ResponseWriter, _ error) { @@ -121,12 +164,15 @@ func (p lazyBackendUsers) FindByID(ctx context.Context, id uint) (*bouncer.Princ func (s *service) mount(r pact.Router) { throttle := fmt.Sprintf("throttle:%d,%d", s.loginMax, s.loginDecay) - r.GroupRaw("/_admin/api/v1/auth", nil, func(g pact.Router) { + api := s.apiBase() + r.GroupRaw(api+"/auth", nil, func(g pact.Router) { + // Login is exempt from the CSRF header: without it the response is a + // Bearer body and no cookie is set, so a cross-site post gains nothing. g.Post("/login", s.login, throttle) - g.Post("/refresh", s.refresh) + g.Post("/refresh", requireAjax(s.refresh)) }) - r.GroupRaw("/_admin/api/v1", []string{"backend"}, func(g pact.Router) { - g.Post("/auth/logout", s.logout) + r.GroupRaw(api, []string{"backend"}, func(g pact.Router) { + g.Post("/auth/logout", requireAjax(s.logout)) g.Get("/auth/me", s.me) g.Get("/navigation", s.navigation) g.Get("/settings", s.settingsList) @@ -134,7 +180,7 @@ func (s *service) mount(r pact.Router) { constrainSetting(g) g.Get("/settings/{code}", s.settingsGet) constrainSetting(g) - g.Put("/settings/{code}", s.settingsPut) + g.Put("/settings/{code}", requireAjax(s.settingsPut)) constrainSetting(g) g.Get("/{vendor}/{plugin}/{controller}/schema/list", s.listSchema) constrainController(g) @@ -144,25 +190,31 @@ func (s *service) mount(r pact.Router) { constrainRelation(g) g.Get("/{vendor}/{plugin}/{controller}", s.list) constrainController(g) - g.Post("/{vendor}/{plugin}/{controller}", s.create) + g.Post("/{vendor}/{plugin}/{controller}", requireAjax(s.create)) constrainController(g) - g.Post("/{vendor}/{plugin}/{controller}/bulk-delete", s.bulkDelete) + g.Post("/{vendor}/{plugin}/{controller}/bulk-delete", requireAjax(s.bulkDelete)) constrainController(g) g.Get("/{vendor}/{plugin}/{controller}/{id}", s.show) constrainController(g) - g.Put("/{vendor}/{plugin}/{controller}/{id}", s.update) + g.Put("/{vendor}/{plugin}/{controller}/{id}", requireAjax(s.update)) constrainController(g) - g.Delete("/{vendor}/{plugin}/{controller}/{id}", s.deleteRecord) + g.Delete("/{vendor}/{plugin}/{controller}/{id}", requireAjax(s.deleteRecord)) constrainController(g) g.Get("/{vendor}/{plugin}/{controller}/{id}/relations/{name}", s.relationLinked) constrainRelation(g) g.Get("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/candidates", s.relationCandidates) constrainRelation(g) - g.Post("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/link", s.relationLink) + g.Post("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/link", requireAjax(s.relationLink)) constrainRelation(g) - g.Post("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/unlink", s.relationUnlink) + g.Post("/{vendor}/{plugin}/{controller}/{id}/relations/{name}/unlink", requireAjax(s.relationUnlink)) constrainRelation(g) }) + // The SPA shell: public, no guard. ServeMux prefers every API pattern + // above over the {path...} wildcard. + r.GroupRaw(s.adminPrefix(), nil, func(g pact.Router) { + g.Get("", s.serveSPA) + g.Get("/{path...}", s.serveSPA) + }) } func constrainController(g pact.Router) { diff --git a/cabana/phase09_contract_test.go b/cabana/phase09_contract_test.go index 3eef44a..dd565b5 100644 --- a/cabana/phase09_contract_test.go +++ b/cabana/phase09_contract_test.go @@ -9,14 +9,15 @@ import ( "testing" ) -// TestPhase09ContractInventory fails when the committed OpenAPI document -// drops a D-09 route or a protected route's 401 response. +// TestPhase09ContractInventory fails when the committed framework admin +// OpenAPI document (admin/openapi/admin.json, D-15) drops an admin API route +// or a protected route's 401 response. Paths are prefix-relative (D-03). func TestPhase09ContractInventory(t *testing.T) { _, file, _, ok := runtime.Caller(0) if !ok { t.Fatal("caller") } - specPath := filepath.Clean(filepath.Join(filepath.Dir(file), "..", "..", "fonoteka.go", "docs", "openapi.json")) + specPath := filepath.Clean(filepath.Join(filepath.Dir(file), "..", "admin", "openapi", "admin.json")) raw, err := os.ReadFile(specPath) if err != nil { t.Fatalf("read %s: %v", specPath, err) @@ -37,11 +38,16 @@ func TestPhase09ContractInventory(t *testing.T) { t.Fatal("openapi is missing the BackendBearer scheme") } public := map[string]bool{ - "POST /_admin/api/v1/auth/login": true, - "POST /_admin/api/v1/auth/refresh": true, + "POST /auth/login": true, + "POST /auth/refresh": true, } seen := map[string]bool{} + apiRoutes := 0 for _, route := range phase09Routes { + if route.spa { + continue + } + apiRoutes++ method, path, ok := splitRoute(route.key) if !ok { t.Fatalf("bad route key %s", route.key) @@ -76,8 +82,11 @@ func TestPhase09ContractInventory(t *testing.T) { t.Fatalf("%s has no 401 response", key) } } - if len(seen) != len(phase09Routes) { - t.Fatalf("contract routes=%d want %d", len(seen), len(phase09Routes)) + if len(seen) != apiRoutes { + t.Fatalf("contract routes=%d want %d", len(seen), apiRoutes) + } + if len(spec.Paths) != len(pathsOf(phase09Routes)) { + t.Fatalf("openapi lists %d paths, the mounted API has %d", len(spec.Paths), len(pathsOf(phase09Routes))) } } @@ -89,3 +98,20 @@ func splitRoute(key string) (method, path string, ok bool) { } return "", "", false } + +func pathsOf(routes []struct { + key string + public bool + spa bool +}) map[string]bool { + out := map[string]bool{} + for _, route := range routes { + if route.spa { + continue + } + if _, path, ok := splitRoute(route.key); ok { + out[path] = true + } + } + return out +} diff --git a/cabana/prefix.go b/cabana/prefix.go new file mode 100644 index 0000000..29d0c53 --- /dev/null +++ b/cabana/prefix.go @@ -0,0 +1,49 @@ +package cabana + +import ( + "fmt" + "regexp" + "strings" + + "git.golem15.com/golem15/summercms/backpack" +) + +// DefaultAdminPrefix is the admin mount path when backend.uri is unset. +// It matches WinterCMS's backendUri default. +const DefaultAdminPrefix = "/backend" + +// AdminCookieName carries the admin JWT for the embedded SPA (D-19). +const AdminCookieName = "summer_admin" + +// adminAPIVersion is appended to the prefix for every admin API route. +const adminAPIVersion = "/api/v1" + +var adminPrefixPattern = regexp.MustCompile(`^(/[a-z0-9][a-z0-9_-]*)+$`) + +// AdminPrefix reads backend.uri and returns the normalized admin mount path. +// Spaces are trimmed, a leading slash is added and trailing slashes are +// removed; an empty value falls back to DefaultAdminPrefix. Every segment +// must be lowercase letters, digits, '-' or '_' and start with a letter or +// digit, so "/" alone, uppercase, spaces and dot segments are rejected. +func AdminPrefix(app *backpack.App) (string, error) { + raw := "" + if app != nil && app.Config != nil { + raw = app.Config.String("backend.uri") + } + return normalizeAdminPrefix(raw) +} + +func normalizeAdminPrefix(raw string) (string, error) { + value := strings.TrimSpace(raw) + if value == "" { + return DefaultAdminPrefix, nil + } + if !strings.HasPrefix(value, "/") { + value = "/" + value + } + value = strings.TrimRight(value, "/") + if value == "" || !adminPrefixPattern.MatchString(value) { + return "", fmt.Errorf("cabana: backend.uri %q is invalid: use one or more lowercase path segments such as /backend (set SUMMER_BACKEND__URI)", raw) + } + return value, nil +} diff --git a/cabana/security_coverage_test.go b/cabana/security_coverage_test.go index ae01dcc..4edbe64 100644 --- a/cabana/security_coverage_test.go +++ b/cabana/security_coverage_test.go @@ -12,35 +12,49 @@ import ( "git.golem15.com/golem15/summercms/pact" ) -// phase09Routes is the D-09 admin surface mounted by service.mount. -// A handler added outside this set, or a protected handler missing the -// backend guard, fails TestPhase09PermissionMatrix. +// phase09Routes is the admin surface mounted by service.mount. API keys are +// method plus the path relative to {backend.uri}/api/v1 (D-03); spa entries +// are the public SPA shell routes relative to {backend.uri} and are not part +// of the OpenAPI inventory. A handler added outside this set, or a protected +// handler missing the backend guard, fails TestPhase09PermissionMatrix. var phase09Routes = []struct { key string public bool + spa bool }{ - {"POST /_admin/api/v1/auth/login", true}, - {"POST /_admin/api/v1/auth/refresh", true}, - {"POST /_admin/api/v1/auth/logout", false}, - {"GET /_admin/api/v1/auth/me", false}, - {"GET /_admin/api/v1/navigation", false}, - {"GET /_admin/api/v1/settings", false}, - {"GET /_admin/api/v1/settings/{code}/schema", false}, - {"GET /_admin/api/v1/settings/{code}", false}, - {"PUT /_admin/api/v1/settings/{code}", false}, - {"GET /_admin/api/v1/{vendor}/{plugin}/{controller}/schema/list", false}, - {"GET /_admin/api/v1/{vendor}/{plugin}/{controller}/schema/form", false}, - {"GET /_admin/api/v1/{vendor}/{plugin}/{controller}/schema/relation/{name}", false}, - {"GET /_admin/api/v1/{vendor}/{plugin}/{controller}", false}, - {"POST /_admin/api/v1/{vendor}/{plugin}/{controller}", false}, - {"POST /_admin/api/v1/{vendor}/{plugin}/{controller}/bulk-delete", false}, - {"GET /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}", false}, - {"PUT /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}", false}, - {"DELETE /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}", false}, - {"GET /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}/relations/{name}", false}, - {"GET /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}/relations/{name}/candidates", false}, - {"POST /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}/relations/{name}/link", false}, - {"POST /_admin/api/v1/{vendor}/{plugin}/{controller}/{id}/relations/{name}/unlink", false}, + {"POST /auth/login", true, false}, + {"POST /auth/refresh", true, false}, + {"POST /auth/logout", false, false}, + {"GET /auth/me", false, false}, + {"GET /navigation", false, false}, + {"GET /settings", false, false}, + {"GET /settings/{code}/schema", false, false}, + {"GET /settings/{code}", false, false}, + {"PUT /settings/{code}", false, false}, + {"GET /{vendor}/{plugin}/{controller}/schema/list", false, false}, + {"GET /{vendor}/{plugin}/{controller}/schema/form", false, false}, + {"GET /{vendor}/{plugin}/{controller}/schema/relation/{name}", false, false}, + {"GET /{vendor}/{plugin}/{controller}", false, false}, + {"POST /{vendor}/{plugin}/{controller}", false, false}, + {"POST /{vendor}/{plugin}/{controller}/bulk-delete", false, false}, + {"GET /{vendor}/{plugin}/{controller}/{id}", false, false}, + {"PUT /{vendor}/{plugin}/{controller}/{id}", false, false}, + {"DELETE /{vendor}/{plugin}/{controller}/{id}", false, false}, + {"GET /{vendor}/{plugin}/{controller}/{id}/relations/{name}", false, false}, + {"GET /{vendor}/{plugin}/{controller}/{id}/relations/{name}/candidates", false, false}, + {"POST /{vendor}/{plugin}/{controller}/{id}/relations/{name}/link", false, false}, + {"POST /{vendor}/{plugin}/{controller}/{id}/relations/{name}/unlink", false, false}, + {"GET ", true, true}, + {"GET /{path...}", true, true}, +} + +// mountedKey is the full mounted route key for an inventory entry. +func mountedKey(key string, spa bool) string { + method, rel, _ := strings.Cut(key, " ") + if spa { + return method + " " + DefaultAdminPrefix + rel + } + return method + " " + adminAPI(rel) } func TestPhase09PermissionMatrix(t *testing.T) { @@ -57,9 +71,10 @@ func TestPhase09PermissionMatrix(t *testing.T) { t.Fatalf("mounted %d admin routes, want %d: %#v", len(got), len(phase09Routes), router.routes) } for _, route := range phase09Routes { - mw, ok := got[route.key] + key := mountedKey(route.key, route.spa) + mw, ok := got[key] if !ok { - t.Fatalf("missing mounted route %s", route.key) + t.Fatalf("missing mounted route %s in %v", key, router.routes) } hasBackend := false for _, name := range mw { @@ -257,7 +272,7 @@ func phase09DeniedService() *service { } func phase09Request(principal *bouncer.Principal) *http.Request { - req := httptest.NewRequest(http.MethodPost, "/_admin/api/v1/acme/demo/widgets/1/relations/editors/link", strings.NewReader(`{}`)) + req := httptest.NewRequest(http.MethodPost, adminAPI("/acme/demo/widgets/1/relations/editors/link"), strings.NewReader(`{}`)) req.SetPathValue("vendor", "acme") req.SetPathValue("plugin", "demo") req.SetPathValue("controller", "widgets") diff --git a/cabana/security_test.go b/cabana/security_test.go index 37236fd..519aa2c 100644 --- a/cabana/security_test.go +++ b/cabana/security_test.go @@ -77,7 +77,7 @@ func TestSecretRedaction(t *testing.T) { } func controllerRequest(principal *bouncer.Principal) *http.Request { - req := httptest.NewRequest(http.MethodGet, "/_admin/api/v1/acme/demo/widgets", nil) + req := httptest.NewRequest(http.MethodGet, adminAPI("/acme/demo/widgets"), nil) req.SetPathValue("vendor", "acme") req.SetPathValue("plugin", "demo") req.SetPathValue("controller", "widgets") diff --git a/go.mod b/go.mod index 96da973..8d753b7 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,9 @@ module git.golem15.com/golem15/summercms go 1.27.0 +// The admin SPA's npm tree may ship .go files; keep ./... out of it. +ignore ./admin/node_modules + require ( github.com/disintegration/imaging v1.6.2 github.com/fsnotify/fsnotify v1.10.1 diff --git a/internal/tools/swagger2openapi/main.go b/internal/tools/swagger2openapi/main.go new file mode 100644 index 0000000..db0c3c9 --- /dev/null +++ b/internal/tools/swagger2openapi/main.go @@ -0,0 +1,380 @@ +// Command swagger2openapi converts swag v1's Swagger 2.0 JSON to OpenAPI 3.0 +// so openapi-typescript 7.x can consume it. swag v1 has no OpenAPI 3 emitter +// (v2 is RC and rejected by STACK.md). It is a copy of the app repository's +// converter plus a rewrite of cabana's opaque JSON types into unions, used by +// scripts/check-admin-openapi.sh to build admin/openapi/admin.json (D-15). +package main + +import ( + "encoding/json" + "fmt" + "os" +) + +func main() { + if len(os.Args) != 2 { + fmt.Fprintf(os.Stderr, "usage: swagger2openapi \n") + os.Exit(2) + } + raw, err := os.ReadFile(os.Args[1]) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + var doc map[string]any + if err := json.Unmarshal(raw, &doc); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + out := swagger2openapi(doc) + enc, err := json.MarshalIndent(out, "", " ") + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + enc = append(enc, '\n') + if _, err := os.Stdout.Write(enc); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +func swagger2openapi(doc map[string]any) map[string]any { + out := map[string]any{ + "openapi": "3.0.3", + } + if info, ok := doc["info"]; ok { + out["info"] = info + } + if tags, ok := doc["tags"]; ok { + out["tags"] = tags + } + if servers := convertServers(doc); len(servers) > 0 { + out["servers"] = servers + } + if paths, ok := doc["paths"].(map[string]any); ok { + out["paths"] = convertPaths(paths) + } + components := map[string]any{} + if defs, ok := doc["definitions"].(map[string]any); ok { + rewriteOpaque(defs) + components["schemas"] = defs + } + if sec, ok := doc["securityDefinitions"].(map[string]any); ok { + components["securitySchemes"] = convertSecurity(sec) + } + if len(components) > 0 { + out["components"] = components + } + if sec, ok := doc["security"]; ok { + out["security"] = sec + } + return rewriteRefs(out).(map[string]any) +} + +func convertServers(doc map[string]any) []any { + host, _ := doc["host"].(string) + base, _ := doc["basePath"].(string) + schemes, _ := doc["schemes"].([]any) + if host == "" && (base == "" || base == "/") && len(schemes) == 0 { + return nil + } + if len(schemes) == 0 { + schemes = []any{"https"} + } + if base == "" { + base = "/" + } + out := make([]any, 0, len(schemes)) + for _, s := range schemes { + scheme, _ := s.(string) + url := scheme + "://" + host + if host == "" { + url = base + } else if base != "/" { + url += base + } + out = append(out, map[string]any{"url": url}) + } + return out +} + +func convertPaths(paths map[string]any) map[string]any { + out := make(map[string]any, len(paths)) + for path, raw := range paths { + item, ok := raw.(map[string]any) + if !ok { + out[path] = raw + continue + } + converted := make(map[string]any, len(item)) + var produces []string + if p, ok := item["produces"].([]any); ok { + produces = stringList(p) + } + var consumes []string + if c, ok := item["consumes"].([]any); ok { + consumes = stringList(c) + } + for k, v := range item { + switch k { + case "produces", "consumes": + continue + case "get", "put", "post", "delete", "options", "head", "patch", "trace": + op, ok := v.(map[string]any) + if !ok { + converted[k] = v + continue + } + converted[k] = convertOperation(op, produces, consumes) + default: + converted[k] = v + } + } + out[path] = converted + } + return out +} + +func convertOperation(op map[string]any, parentProduces, parentConsumes []string) map[string]any { + out := make(map[string]any, len(op)) + produces := parentProduces + if p, ok := op["produces"].([]any); ok { + produces = stringList(p) + } + if len(produces) == 0 { + produces = []string{"application/json"} + } + consumes := parentConsumes + if c, ok := op["consumes"].([]any); ok { + consumes = stringList(c) + } + if len(consumes) == 0 { + consumes = []string{"application/json"} + } + for k, v := range op { + switch k { + case "produces", "consumes": + continue + case "parameters": + params, body := splitParameters(v, consumes) + if len(params) > 0 { + out["parameters"] = params + } + if body != nil { + out["requestBody"] = body + } + case "responses": + res, ok := v.(map[string]any) + if !ok { + out[k] = v + continue + } + out[k] = convertResponses(res, produces) + default: + out[k] = v + } + } + return out +} + +func splitParameters(v any, consumes []string) (params []any, body map[string]any) { + list, ok := v.([]any) + if !ok { + return nil, nil + } + for _, item := range list { + p, ok := item.(map[string]any) + if !ok { + params = append(params, item) + continue + } + if in, _ := p["in"].(string); in == "body" { + content := map[string]any{} + for _, ct := range consumes { + entry := map[string]any{} + if schema, ok := p["schema"]; ok { + entry["schema"] = schema + } + content[ct] = entry + } + body = map[string]any{"content": content} + if req, ok := p["required"]; ok { + body["required"] = req + } + if desc, ok := p["description"]; ok { + body["description"] = desc + } + continue + } + params = append(params, convertParameter(p)) + } + return params, body +} + +var paramSchemaKeys = map[string]struct{}{ + "type": {}, "format": {}, "items": {}, "enum": {}, "default": {}, + "minimum": {}, "maximum": {}, "minLength": {}, "maxLength": {}, + "pattern": {}, "uniqueItems": {}, "multipleOf": {}, + "exclusiveMinimum": {}, "exclusiveMaximum": {}, + "additionalProperties": {}, "properties": {}, +} + +func convertParameter(p map[string]any) map[string]any { + out := make(map[string]any, len(p)) + schema := map[string]any{} + for k, v := range p { + if _, ok := paramSchemaKeys[k]; ok { + schema[k] = v + continue + } + out[k] = v + } + if len(schema) > 0 { + out["schema"] = schema + } + return out +} + +func convertResponses(res map[string]any, produces []string) map[string]any { + out := make(map[string]any, len(res)) + for code, raw := range res { + r, ok := raw.(map[string]any) + if !ok { + out[code] = raw + continue + } + converted := make(map[string]any, len(r)) + var schema any + for k, v := range r { + if k == "schema" { + schema = v + continue + } + converted[k] = v + } + if schema != nil { + content := map[string]any{} + for _, ct := range produces { + content[ct] = map[string]any{"schema": schema} + } + converted["content"] = content + } + out[code] = converted + } + return out +} + +func convertSecurity(sec map[string]any) map[string]any { + out := make(map[string]any, len(sec)) + for name, raw := range sec { + s, ok := raw.(map[string]any) + if !ok { + out[name] = raw + continue + } + copied := make(map[string]any, len(s)) + for k, v := range s { + copied[k] = v + } + if t, _ := copied["type"].(string); t == "oauth2" { + flows := map[string]any{} + flow, _ := copied["flow"].(string) + delete(copied, "flow") + flowObj := map[string]any{} + if u, ok := copied["authorizationUrl"]; ok { + flowObj["authorizationUrl"] = u + delete(copied, "authorizationUrl") + } + if u, ok := copied["tokenUrl"]; ok { + flowObj["tokenUrl"] = u + delete(copied, "tokenUrl") + } + if sc, ok := copied["scopes"]; ok { + flowObj["scopes"] = sc + delete(copied, "scopes") + } + switch flow { + case "implicit": + flows["implicit"] = flowObj + case "password": + flows["password"] = flowObj + case "application": + flows["clientCredentials"] = flowObj + case "accessCode": + flows["authorizationCode"] = flowObj + } + copied["flows"] = flows + } + out[name] = copied + } + return out +} + +func rewriteRefs(v any) any { + switch t := v.(type) { + case map[string]any: + out := make(map[string]any, len(t)) + for k, val := range t { + if k == "$ref" { + if s, ok := val.(string); ok { + const from = "#/definitions/" + const to = "#/components/schemas/" + if len(s) >= len(from) && s[:len(from)] == from { + out[k] = to + s[len(from):] + continue + } + } + } + out[k] = rewriteRefs(val) + } + return out + case []any: + out := make([]any, len(t)) + for i, val := range t { + out[i] = rewriteRefs(val) + } + return out + default: + return v + } +} + +func stringList(in []any) []string { + out := make([]string, 0, len(in)) + for _, v := range in { + s, ok := v.(string) + if ok && s != "" { + out = append(out, s) + } + } + return out +} + +// opaqueUnions replaces definitions that swag can only see as an empty object +// because their Go type marshals itself. cabana.jsonScalar is a string, +// number, boolean or null; cabana.fieldContext is a string or string list. +var opaqueUnions = map[string]map[string]any{ + "cabana.jsonScalar": { + "nullable": true, + "oneOf": []any{ + map[string]any{"type": "string"}, + map[string]any{"type": "number"}, + map[string]any{"type": "boolean"}, + }, + }, + "cabana.fieldContext": { + "oneOf": []any{ + map[string]any{"type": "string"}, + map[string]any{"type": "array", "items": map[string]any{"type": "string"}}, + }, + }, +} + +func rewriteOpaque(defs map[string]any) { + for name, union := range opaqueUnions { + if _, ok := defs[name]; ok { + defs[name] = union + } + } +} diff --git a/scripts/check-admin-openapi.sh b/scripts/check-admin-openapi.sh new file mode 100755 index 0000000..77a52ee --- /dev/null +++ b/scripts/check-admin-openapi.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +# Generate the framework admin OpenAPI document and the admin SPA's TypeScript +# types from the swag annotations in cabana (D-15): +# swag v1.16.6 (Swagger 2.0) -> internal/tools/swagger2openapi (OpenAPI 3.0) +# -> openapi-typescript (admin devDependency) -> admin/src/api/schema.d.ts +# Without arguments the outputs replace admin/openapi/admin.json and +# admin/src/api/schema.d.ts. With --check nothing is written and the script +# exits non-zero when either committed file differs from a fresh generation. +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +cd "$ROOT" + +CHECK=0 +case "${1:-}" in + "") ;; + --check) CHECK=1 ;; + *) + echo "usage: scripts/check-admin-openapi.sh [--check]" >&2 + exit 2 + ;; +esac + +if [[ ! -d admin/node_modules ]]; then + npm --prefix admin ci +fi + +TMP="$(mktemp -d)" +trap 'rm -rf "$TMP"' EXIT + +go run github.com/swaggo/swag/cmd/swag@v1.16.6 init \ + --dir cabana \ + --generalInfo admin_openapi.go \ + --output "$TMP" \ + --outputTypes json \ + --requiredByDefault \ + --quiet + +if [[ ! -s "$TMP/swagger.json" ]]; then + echo "check-admin-openapi: swag did not generate swagger.json" >&2 + exit 1 +fi + +go run ./internal/tools/swagger2openapi "$TMP/swagger.json" > "$TMP/admin.json" +admin/node_modules/.bin/openapi-typescript "$TMP/admin.json" -o "$TMP/schema.d.ts" + +if [[ "$CHECK" -eq 1 ]]; then + status=0 + diff -u admin/openapi/admin.json "$TMP/admin.json" || status=1 + diff -u admin/src/api/schema.d.ts "$TMP/schema.d.ts" || status=1 + if [[ "$status" -ne 0 ]]; then + echo "check-admin-openapi: committed admin OpenAPI output is stale; run scripts/check-admin-openapi.sh" >&2 + fi + exit "$status" +fi + +mkdir -p admin/openapi admin/src/api +cp "$TMP/admin.json" admin/openapi/admin.json +cp "$TMP/schema.d.ts" admin/src/api/schema.d.ts +echo "check-admin-openapi: wrote admin/openapi/admin.json and admin/src/api/schema.d.ts"