diff --git a/index.html b/index.html index bf07f30..8dd728e 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,9 @@ - + + + wildcat-dashboard-ui diff --git a/opt/wildcat/__dev_openapi.json b/opt/wildcat/__dev_openapi.json index 61326d5..2a4920e 100644 --- a/opt/wildcat/__dev_openapi.json +++ b/opt/wildcat/__dev_openapi.json @@ -1,7 +1,7 @@ { "openapi": "3.0.3", "info": { - "title": "wildcat", + "title": "bcr-wdc-quote-service", "description": "", "license": { "name": "" @@ -10,11 +10,11 @@ }, "paths": { "/v1/admin/credit/quote/{id}": { - "get": { + "post": { "tags": [ "crate::credit::admin" ], - "operationId": "admin_lookup_quote", + "operationId": "resolve_quote", "parameters": [ { "name": "id", @@ -26,27 +26,27 @@ } } ], - "responses": { - "200": { - "description": "Succesful response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/InfoReply" - } + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ResolveRequest" } } }, - "404": { - "description": "Quote id not found" + "required": true + }, + "responses": { + "200": { + "description": "Succesful response" } } }, - "post": { + "get": { "tags": [ "crate::credit::admin" ], - "operationId": "resolve_quote", + "operationId": "admin_lookup_quote", "parameters": [ { "name": "id", @@ -54,23 +54,24 @@ "description": "The quote id", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], - "requestBody": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ResolveRequest" + "responses": { + "200": { + "description": "Succesful response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InfoReply" + } } } }, - "required": true - }, - "responses": { - "200": { - "description": "Succesful response" + "404": { + "description": "Quote id not found" } } } @@ -189,7 +190,8 @@ "description": "The quote id", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -223,7 +225,8 @@ "description": "The quote id", "required": true, "schema": { - "type": "string" + "type": "string", + "format": "uuid" } } ], @@ -256,27 +259,23 @@ "Id": { "type": "string", "format": "uuid", - "description": "Manually added - should be replaced with generated one" + "description": "Manually added - should be replaced with generated one." }, - "BlindSignatureDleq": { + "P2PKWitness": { "type": "string", - "description": "Manually added - should be replaced with generated one" + "description": "Manually added - should be replaced with generated one." }, - "Witness": { + "HTLCWitness": { "type": "string", - "description": "Manually added - should be replaced with generated one" - }, - "TStamp": { - "type": "integer", - "format": "int64", - "description": "Manually added - should be replaced with generated one", - "minimum": 0 + "description": "Manually added - should be replaced with generated one." }, "Resolve": { - "type": "integer", - "format": "int64", - "description": "Manually added - should be replaced with generated one", - "minimum": 0 + "type": "string", + "description": "Manually added - should be replaced with generated one." + }, + "IdentityPublicData": { + "type": "string", + "description": "Manually added - should be replaced with generated one." }, "Amount": { "type": "integer", @@ -284,6 +283,44 @@ "description": "Amount can be any unit", "minimum": 0 }, + "BillInfo": { + "type": "object", + "description": "--------------------------- Enquire mint quote", + "required": [ + "id", + "drawee", + "drawer", + "payee", + "holder", + "sum", + "maturity_date" + ], + "properties": { + "drawee": { + "$ref": "#/components/schemas/IdentityPublicData" + }, + "drawer": { + "$ref": "#/components/schemas/IdentityPublicData" + }, + "holder": { + "$ref": "#/components/schemas/IdentityPublicData" + }, + "id": { + "type": "string" + }, + "maturity_date": { + "type": "string" + }, + "payee": { + "$ref": "#/components/schemas/IdentityPublicData" + }, + "sum": { + "type": "integer", + "format": "int64", + "minimum": 0 + } + } + }, "BlindSignature": { "type": "object", "description": "Blind Signature (also called `promise`)", @@ -313,6 +350,24 @@ } } }, + "BlindSignatureDleq": { + "type": "object", + "description": "Blinded Signature on Dleq\n\nDefined in [NUT12](https://github.com/cashubtc/nuts/blob/main/12.md)", + "required": [ + "e", + "s" + ], + "properties": { + "e": { + "type": "string", + "description": "e" + }, + "s": { + "type": "string", + "description": "s" + } + } + }, "BlindedMessage": { "type": "object", "description": "Blinded Message (also called `output`)", @@ -358,22 +413,22 @@ "type": "object", "description": "--------------------------- Enquire mint quote", "required": [ - "bill", - "node", + "content", + "signature", "outputs" ], "properties": { - "bill": { - "type": "string" - }, - "node": { - "type": "string" + "content": { + "$ref": "#/components/schemas/BillInfo" }, "outputs": { "type": "array", "items": { "$ref": "#/components/schemas/BlindedMessage" } + }, + "signature": { + "type": "string" } } }, @@ -384,17 +439,13 @@ "required": [ "id", "bill", - "endorser", "submitted", "suggested_expiration", "status" ], "properties": { "bill": { - "type": "string" - }, - "endorser": { - "type": "string" + "$ref": "#/components/schemas/BillInfo" }, "id": { "type": "string", @@ -421,17 +472,13 @@ "required": [ "id", "bill", - "endorser", "ttl", "signatures", "status" ], "properties": { "bill": { - "type": "string" - }, - "endorser": { - "type": "string" + "$ref": "#/components/schemas/BillInfo" }, "id": { "type": "string", @@ -460,15 +507,11 @@ "required": [ "id", "bill", - "endorser", "status" ], "properties": { "bill": { - "type": "string" - }, - "endorser": { - "type": "string" + "$ref": "#/components/schemas/BillInfo" }, "id": { "type": "string", @@ -487,16 +530,12 @@ "required": [ "id", "bill", - "endorser", "signatures", "status" ], "properties": { "bill": { - "type": "string" - }, - "endorser": { - "type": "string" + "$ref": "#/components/schemas/BillInfo" }, "id": { "type": "string", @@ -521,16 +560,12 @@ "required": [ "id", "bill", - "endorser", "tstamp", "status" ], "properties": { "bill": { - "type": "string" - }, - "endorser": { - "type": "string" + "$ref": "#/components/schemas/BillInfo" }, "id": { "type": "string", @@ -543,7 +578,8 @@ ] }, "tstamp": { - "$ref": "#/components/schemas/TStamp" + "type": "string", + "format": "date-time" } } } @@ -686,7 +722,8 @@ ], "properties": { "expiration_date": { - "$ref": "#/components/schemas/TStamp" + "type": "string", + "format": "date-time" }, "signatures": { "type": "array", @@ -737,7 +774,8 @@ ] }, "tstamp": { - "$ref": "#/components/schemas/TStamp" + "type": "string", + "format": "date-time" } } } @@ -746,6 +784,17 @@ "discriminator": { "propertyName": "status" } + }, + "Witness": { + "oneOf": [ + { + "$ref": "#/components/schemas/P2PKWitness" + }, + { + "$ref": "#/components/schemas/HTLCWitness" + } + ], + "description": "Witness" } } } diff --git a/opt/wildcat/openapi.json b/opt/wildcat/openapi.json index 4bf9bf3..151e407 100644 --- a/opt/wildcat/openapi.json +++ b/opt/wildcat/openapi.json @@ -1 +1 @@ -{"openapi":"3.0.3","info":{"title":"wildcat","description":"","license":{"name":""},"version":"0.1.0"},"paths":{"/v1/admin/credit/quote/:id":{"get":{"tags":["crate::credit::admin"],"operationId":"lookup_quote","parameters":[{"name":"id","in":"path","description":"The quote id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Succesful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfoReply"}}}},"404":{"description":"Quote id not found"}}},"post":{"tags":["crate::credit::admin"],"operationId":"resolve_quote","parameters":[{"name":"id","in":"path","description":"The quote id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveRequest"}}},"required":true},"responses":{"200":{"description":"Succesful response"}}}},"/v1/admin/credit/quote/accepted":{"get":{"tags":["crate::credit::admin"],"operationId":"list_accepted_quotes","parameters":[{"name":"since","in":"query","description":"only accepted quotes younger than `since`","required":false,"schema":{"type":"string","format":"date-time","nullable":true}}],"responses":{"200":{"description":"Succesful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListReply"}}}}}}},"/v1/admin/credit/quote/pending":{"get":{"tags":["crate::credit::admin"],"summary":"--------------------------- List quotes","operationId":"list_pending_quotes","parameters":[{"name":"since","in":"query","description":"only quote requests younger than `since`","required":false,"schema":{"type":"string","format":"date-time","nullable":true}}],"responses":{"200":{"description":"Succesful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListReply"}}}}}}},"/v1/credit/mint/quote":{"post":{"tags":["crate::credit::web"],"summary":"--------------------------- Enquire mint quote","operationId":"enquire_quote","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnquireRequest"}}},"required":true},"responses":{"200":{"description":"Quote request admitted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnquireReply"}}}},"404":{"description":"Quote request not accepted"}}}},"/v1/credit/mint/quote/:id":{"get":{"tags":["crate::credit::web"],"operationId":"lookup_quote","parameters":[{"name":"id","in":"path","description":"The quote id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Succesful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusReply"}}}},"404":{"description":"Quote id not found"}}}},"/v1/credit/quote/:id":{"post":{"tags":["crate::credit::web"],"operationId":"resolve_offer","parameters":[{"name":"id","in":"path","description":"The quote id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resolve"}}},"required":true},"responses":{"200":{"description":"Succesful response"},"404":{"description":"Quote not found"},"409":{"description":"Quote already resolved"}}}}},"components":{"schemas":{"Amount":{"type":"integer","format":"int64","description":"Amount can be any unit","minimum":0},"BlindSignature":{"type":"object","description":"Blind Signature (also called `promise`)","required":["amount","id","C_"],"properties":{"C_":{"type":"string","description":"Blinded signature (C_)\n\nThe blinded signature on the secret message `B_` of [BlindedMessage]."},"amount":{"$ref":"#/components/schemas/Amount"},"dleq":{"allOf":[{"$ref":"#/components/schemas/BlindSignatureDleq"}],"nullable":true},"id":{"$ref":"#/components/schemas/Id"}}},"BlindedMessage":{"type":"object","description":"Blinded Message (also called `output`)","required":["amount","id","B_"],"properties":{"B_":{"type":"string","description":"Blinded secret message (B_)\n\nThe blinded secret message generated by the sender."},"amount":{"$ref":"#/components/schemas/Amount"},"id":{"$ref":"#/components/schemas/Id"},"witness":{"allOf":[{"$ref":"#/components/schemas/Witness"}],"nullable":true}}},"EnquireReply":{"type":"object","required":["id"],"properties":{"id":{"type":"string","format":"uuid"}}},"EnquireRequest":{"type":"object","description":"--------------------------- Enquire mint quote","required":["bill","node","outputs"],"properties":{"bill":{"type":"string"},"node":{"type":"string"},"outputs":{"type":"array","items":{"$ref":"#/components/schemas/BlindedMessage"}}}},"InfoReply":{"oneOf":[{"type":"object","required":["id","bill","endorser","submitted","suggested_expiration","status"],"properties":{"bill":{"type":"string"},"endorser":{"type":"string"},"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending"]},"submitted":{"type":"string","format":"date-time"},"suggested_expiration":{"type":"string","format":"date-time"}}},{"type":"object","required":["id","bill","endorser","ttl","signatures","status"],"properties":{"bill":{"type":"string"},"endorser":{"type":"string"},"id":{"type":"string","format":"uuid"},"signatures":{"type":"array","items":{"$ref":"#/components/schemas/BlindSignature"}},"status":{"type":"string","enum":["offered"]},"ttl":{"type":"string","format":"date-time"}}},{"type":"object","required":["id","bill","endorser","status"],"properties":{"bill":{"type":"string"},"endorser":{"type":"string"},"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["denied"]}}},{"type":"object","required":["id","bill","endorser","signatures","status"],"properties":{"bill":{"type":"string"},"endorser":{"type":"string"},"id":{"type":"string","format":"uuid"},"signatures":{"type":"array","items":{"$ref":"#/components/schemas/BlindSignature"}},"status":{"type":"string","enum":["accepted"]}}},{"type":"object","required":["id","bill","endorser","tstamp","status"],"properties":{"bill":{"type":"string"},"endorser":{"type":"string"},"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["rejected"]},"tstamp":{"$ref":"#/components/schemas/TStamp"}}}],"description":"--------------------------- Quote info request","discriminator":{"propertyName":"status"}},"ListReply":{"type":"object","description":"--------------------------- List quotes","required":["quotes"],"properties":{"quotes":{"type":"array","items":{"type":"string","format":"uuid"}}}},"ResolveOffer":{"oneOf":[{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["reject"]}}},{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["accept"]}}}],"description":"--------------------------- Resolve quote"},"ResolveRequest":{"oneOf":[{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["deny"]}}},{"type":"object","required":["discount","action"],"properties":{"action":{"type":"string","enum":["offer"]},"discount":{"type":"string"},"ttl":{"type":"string","format":"date-time","nullable":true}}}],"description":"--------------------------- Resolve quote request","discriminator":{"propertyName":"action"}},"StatusReply":{"oneOf":[{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["pending"]}}},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["denied"]}}},{"type":"object","required":["signatures","expiration_date","status"],"properties":{"expiration_date":{"$ref":"#/components/schemas/TStamp"},"signatures":{"type":"array","items":{"$ref":"#/components/schemas/BlindSignature"}},"status":{"type":"string","enum":["offered"]}}},{"type":"object","required":["signatures","status"],"properties":{"signatures":{"type":"array","items":{"$ref":"#/components/schemas/BlindSignature"}},"status":{"type":"string","enum":["accepted"]}}},{"type":"object","required":["tstamp","status"],"properties":{"status":{"type":"string","enum":["rejected"]},"tstamp":{"$ref":"#/components/schemas/TStamp"}}}],"description":"--------------------------- Look up quote","discriminator":{"propertyName":"status"}}}}} \ No newline at end of file +{"openapi":"3.0.3","info":{"title":"bcr-wdc-quote-service","description":"","license":{"name":""},"version":"0.1.0"},"paths":{"/v1/admin/credit/quote/:id":{"post":{"tags":["crate::credit::admin"],"operationId":"resolve_quote","parameters":[{"name":"id","in":"path","description":"The quote id","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolveRequest"}}},"required":true},"responses":{"200":{"description":"Succesful response"}}}},"/v1/admin/credit/quote/accepted":{"get":{"tags":["crate::credit::admin"],"operationId":"list_accepted_quotes","parameters":[{"name":"since","in":"query","description":"only accepted quotes younger than `since`","required":false,"schema":{"type":"string","format":"date-time","nullable":true}}],"responses":{"200":{"description":"Succesful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListReply"}}}}}}},"/v1/admin/credit/quote/pending":{"get":{"tags":["crate::credit::admin"],"summary":"--------------------------- List quotes","operationId":"list_pending_quotes","parameters":[{"name":"since","in":"query","description":"only quote requests younger than `since`","required":false,"schema":{"type":"string","format":"date-time","nullable":true}}],"responses":{"200":{"description":"Succesful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListReply"}}}}}}},"/v1/admin/credit/quote/{id}":{"get":{"tags":["crate::credit::admin"],"operationId":"lookup_quote","parameters":[{"name":"id","in":"path","description":"The quote id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Succesful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InfoReply"}}}},"404":{"description":"Quote id not found"}}}},"/v1/credit/mint/quote":{"post":{"tags":["crate::credit::web"],"summary":"--------------------------- Enquire mint quote","operationId":"enquire_quote","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnquireRequest"}}},"required":true},"responses":{"200":{"description":"Quote request admitted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnquireReply"}}}},"404":{"description":"Quote request not accepted"}}}},"/v1/credit/mint/quote/{id}":{"get":{"tags":["crate::credit::web"],"operationId":"lookup_quote","parameters":[{"name":"id","in":"path","description":"The quote id","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Succesful response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusReply"}}}},"404":{"description":"Quote id not found"}}}},"/v1/credit/quote/{id}":{"post":{"tags":["crate::credit::web"],"operationId":"resolve_offer","parameters":[{"name":"id","in":"path","description":"The quote id","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Resolve"}}},"required":true},"responses":{"200":{"description":"Succesful response"},"404":{"description":"Quote not found"},"409":{"description":"Quote already resolved"}}}}},"components":{"schemas":{"Amount":{"type":"integer","format":"int64","description":"Amount can be any unit","minimum":0},"BillInfo":{"type":"object","description":"--------------------------- Enquire mint quote","required":["id","drawee","drawer","payee","holder","sum","maturity_date"],"properties":{"drawee":{"$ref":"#/components/schemas/IdentityPublicData"},"drawer":{"$ref":"#/components/schemas/IdentityPublicData"},"holder":{"$ref":"#/components/schemas/IdentityPublicData"},"id":{"type":"string"},"maturity_date":{"type":"string"},"payee":{"$ref":"#/components/schemas/IdentityPublicData"},"sum":{"type":"integer","format":"int64","minimum":0}}},"BlindSignature":{"type":"object","description":"Blind Signature (also called `promise`)","required":["amount","id","C_"],"properties":{"C_":{"type":"string","description":"Blinded signature (C_)\n\nThe blinded signature on the secret message `B_` of [BlindedMessage]."},"amount":{"$ref":"#/components/schemas/Amount"},"dleq":{"allOf":[{"$ref":"#/components/schemas/BlindSignatureDleq"}],"nullable":true},"id":{"$ref":"#/components/schemas/Id"}}},"BlindSignatureDleq":{"type":"object","description":"Blinded Signature on Dleq\n\nDefined in [NUT12](https://github.com/cashubtc/nuts/blob/main/12.md)","required":["e","s"],"properties":{"e":{"type":"string","description":"e"},"s":{"type":"string","description":"s"}}},"BlindedMessage":{"type":"object","description":"Blinded Message (also called `output`)","required":["amount","id","B_"],"properties":{"B_":{"type":"string","description":"Blinded secret message (B_)\n\nThe blinded secret message generated by the sender."},"amount":{"$ref":"#/components/schemas/Amount"},"id":{"$ref":"#/components/schemas/Id"},"witness":{"allOf":[{"$ref":"#/components/schemas/Witness"}],"nullable":true}}},"EnquireReply":{"type":"object","required":["id"],"properties":{"id":{"type":"string","format":"uuid"}}},"EnquireRequest":{"type":"object","description":"--------------------------- Enquire mint quote","required":["content","signature","outputs"],"properties":{"content":{"$ref":"#/components/schemas/BillInfo"},"outputs":{"type":"array","items":{"$ref":"#/components/schemas/BlindedMessage"}},"signature":{"type":"string"}}},"InfoReply":{"oneOf":[{"type":"object","required":["id","bill","submitted","suggested_expiration","status"],"properties":{"bill":{"$ref":"#/components/schemas/BillInfo"},"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["pending"]},"submitted":{"type":"string","format":"date-time"},"suggested_expiration":{"type":"string","format":"date-time"}}},{"type":"object","required":["id","bill","ttl","signatures","status"],"properties":{"bill":{"$ref":"#/components/schemas/BillInfo"},"id":{"type":"string","format":"uuid"},"signatures":{"type":"array","items":{"$ref":"#/components/schemas/BlindSignature"}},"status":{"type":"string","enum":["offered"]},"ttl":{"type":"string","format":"date-time"}}},{"type":"object","required":["id","bill","status"],"properties":{"bill":{"$ref":"#/components/schemas/BillInfo"},"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["denied"]}}},{"type":"object","required":["id","bill","signatures","status"],"properties":{"bill":{"$ref":"#/components/schemas/BillInfo"},"id":{"type":"string","format":"uuid"},"signatures":{"type":"array","items":{"$ref":"#/components/schemas/BlindSignature"}},"status":{"type":"string","enum":["accepted"]}}},{"type":"object","required":["id","bill","tstamp","status"],"properties":{"bill":{"$ref":"#/components/schemas/BillInfo"},"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["rejected"]},"tstamp":{"type":"string","format":"date-time"}}}],"description":"--------------------------- Quote info request","discriminator":{"propertyName":"status"}},"ListReply":{"type":"object","description":"--------------------------- List quotes","required":["quotes"],"properties":{"quotes":{"type":"array","items":{"type":"string","format":"uuid"}}}},"ResolveOffer":{"oneOf":[{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["reject"]}}},{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["accept"]}}}],"description":"--------------------------- Resolve quote"},"ResolveRequest":{"oneOf":[{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["deny"]}}},{"type":"object","required":["discount","action"],"properties":{"action":{"type":"string","enum":["offer"]},"discount":{"type":"string"},"ttl":{"type":"string","format":"date-time","nullable":true}}}],"description":"--------------------------- Resolve quote request","discriminator":{"propertyName":"action"}},"StatusReply":{"oneOf":[{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["pending"]}}},{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["denied"]}}},{"type":"object","required":["signatures","expiration_date","status"],"properties":{"expiration_date":{"type":"string","format":"date-time"},"signatures":{"type":"array","items":{"$ref":"#/components/schemas/BlindSignature"}},"status":{"type":"string","enum":["offered"]}}},{"type":"object","required":["signatures","status"],"properties":{"signatures":{"type":"array","items":{"$ref":"#/components/schemas/BlindSignature"}},"status":{"type":"string","enum":["accepted"]}}},{"type":"object","required":["tstamp","status"],"properties":{"status":{"type":"string","enum":["rejected"]},"tstamp":{"type":"string","format":"date-time"}}}],"description":"--------------------------- Look up quote","discriminator":{"propertyName":"status"}},"Witness":{"oneOf":[{"$ref":"#/components/schemas/P2PKWitness"},{"$ref":"#/components/schemas/HTLCWitness"}],"description":"Witness"}}}} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c9d2d87..eca99ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "wildcat-dashboard-ui", "version": "0.0.1", "dependencies": { - "@hey-api/client-fetch": "^0.8.1", + "@hey-api/client-fetch": "^0.8.3", "@radix-ui/react-checkbox": "^1.1.4", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-hover-card": "^1.1.6", @@ -23,43 +23,43 @@ "@radix-ui/react-tabs": "^1.1.3", "@radix-ui/react-toggle": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", - "@tailwindcss/vite": "^4.0.8", - "@tanstack/react-query": "^5.66.9", + "@tailwindcss/vite": "^4.0.9", + "@tanstack/react-query": "^5.67.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "eslint-plugin-react": "^7.37.4", - "lucide-react": "^0.475.0", + "lucide-react": "^0.477.0", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "^7.2.0", "recharts": "^2.15.1", "tailwind-merge": "^3.0.2", - "tailwindcss": "^4.0.8", + "tailwindcss": "^4.0.9", "tailwindcss-animate": "^1.0.7", "vaul": "^1.1.2" }, "devDependencies": { "@eslint/js": "^9.21.0", - "@hey-api/openapi-ts": "^0.64.5", + "@hey-api/openapi-ts": "^0.64.10", "@mswjs/data": "^0.16.2", "@testing-library/jest-dom": "^6.6.3", - "@types/node": "^22.13.5", + "@types/node": "^22.13.9", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", - "@vitest/coverage-v8": "^3.0.6", + "@vitest/coverage-v8": "^3.0.7", "eslint": "^9.21.0", - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-react-hooks": "^5.1.0", + "eslint-config-prettier": "^10.0.2", + "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", - "globals": "^15.14.0", + "globals": "^16.0.0", "jsdom": "^26.0.0", - "msw": "^2.7.1", - "prettier": "^3.5.2", + "msw": "^2.7.3", + "prettier": "^3.5.3", "typescript": "~5.7.3", - "typescript-eslint": "^8.24.1", - "vite": "^6.1.1", - "vitest": "^3.0.6" + "typescript-eslint": "^8.26.0", + "vite": "^6.2.0", + "vitest": "^3.0.7" } }, "node_modules/@adobe/css-tools": { @@ -540,8 +540,266 @@ "node": ">=18" } }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", "cpu": [ "x64" ], @@ -554,6 +812,134 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.1", "license": "MIT", @@ -714,9 +1100,9 @@ "license": "MIT" }, "node_modules/@hey-api/client-fetch": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@hey-api/client-fetch/-/client-fetch-0.8.1.tgz", - "integrity": "sha512-AaVNVLBl7N9Fun7QDnb00YDubAFjB9ICi5U6kmzcJSnnQTQGRMsuBBRupQV5ERdMMFt71zjSDym7Z+gLVe8m3A==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/@hey-api/client-fetch/-/client-fetch-0.8.3.tgz", + "integrity": "sha512-EBVa8wwUMyBSeQ32PtCz6u5bFQZIMAufvwCT1ZtpjqT3caJQEza4NokbGU50q1ZVrMsM5Ot6GuDNJOF3TMo26Q==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/hey-api" @@ -741,9 +1127,9 @@ } }, "node_modules/@hey-api/openapi-ts": { - "version": "0.64.5", - "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.5.tgz", - "integrity": "sha512-Vl6QQbkb+TXPG/ihobCPj/13KFJPfnjTVljno+T18L2ywL8cRHDFYqi5356ktBixBuwK2cSJvKzxYR6TIMq+AA==", + "version": "0.64.10", + "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.64.10.tgz", + "integrity": "sha512-mTTD4DtOt68OmrZ6VXM4+sCma+JxhqDjiqdaUCpLIS8yWNWAmgBCRS5LE3i8AS8HUN1dsCetTGFAIUT2rElDVg==", "dev": true, "license": "MIT", "dependencies": { @@ -756,7 +1142,7 @@ "openapi-ts": "bin/index.cjs" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=22.11.0" + "node": "^18.18.0 || ^20.9.0 || >=22.10.0" }, "funding": { "url": "https://github.com/sponsors/hey-api" @@ -1079,6 +1465,8 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -1091,6 +1479,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -1099,6 +1489,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -2042,42 +2434,42 @@ ] }, "node_modules/@tailwindcss/node": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.8.tgz", - "integrity": "sha512-FKArQpbrbwv08TNT0k7ejYXpF+R8knZFAatNc0acOxbgeqLzwb86r+P3LGOjIeI3Idqe9CVkZrh4GlsJLJKkkw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.9.tgz", + "integrity": "sha512-tOJvdI7XfJbARYhxX+0RArAhmuDcczTC46DGCEziqxzzbIaPnfYaIyRT31n4u8lROrsO7Q6u/K9bmQHL2uL1bQ==", "license": "MIT", "dependencies": { "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", - "tailwindcss": "4.0.8" + "tailwindcss": "4.0.9" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.8.tgz", - "integrity": "sha512-KfMcuAu/Iw+DcV1e8twrFyr2yN8/ZDC/odIGta4wuuJOGkrkHZbvJvRNIbQNhGh7erZTYV6Ie0IeD6WC9Y8Hcw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.9.tgz", + "integrity": "sha512-eLizHmXFqHswJONwfqi/WZjtmWZpIalpvMlNhTM99/bkHtUs6IqgI1XQ0/W5eO2HiRQcIlXUogI2ycvKhVLNcA==", "license": "MIT", "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.0.8", - "@tailwindcss/oxide-darwin-arm64": "4.0.8", - "@tailwindcss/oxide-darwin-x64": "4.0.8", - "@tailwindcss/oxide-freebsd-x64": "4.0.8", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.8", - "@tailwindcss/oxide-linux-arm64-gnu": "4.0.8", - "@tailwindcss/oxide-linux-arm64-musl": "4.0.8", - "@tailwindcss/oxide-linux-x64-gnu": "4.0.8", - "@tailwindcss/oxide-linux-x64-musl": "4.0.8", - "@tailwindcss/oxide-win32-arm64-msvc": "4.0.8", - "@tailwindcss/oxide-win32-x64-msvc": "4.0.8" + "@tailwindcss/oxide-android-arm64": "4.0.9", + "@tailwindcss/oxide-darwin-arm64": "4.0.9", + "@tailwindcss/oxide-darwin-x64": "4.0.9", + "@tailwindcss/oxide-freebsd-x64": "4.0.9", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.9", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.9", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.9", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.9", + "@tailwindcss/oxide-linux-x64-musl": "4.0.9", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.9", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.9" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.8.tgz", - "integrity": "sha512-We7K79+Sm4mwJHk26Yzu/GAj7C7myemm7PeXvpgMxyxO70SSFSL3uCcqFbz9JA5M5UPkrl7N9fkBe/Y0iazqpA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.9.tgz", + "integrity": "sha512-YBgy6+2flE/8dbtrdotVInhMVIxnHJPbAwa7U1gX4l2ThUIaPUp18LjB9wEH8wAGMBZUb//SzLtdXXNBHPUl6Q==", "cpu": [ "arm64" ], @@ -2091,9 +2483,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.8.tgz", - "integrity": "sha512-Lv9Isi2EwkCTG1sRHNDi0uRNN1UGFdEThUAGFrydRmQZnraGLMjN8gahzg2FFnOizDl7LB2TykLUuiw833DSNg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.9.tgz", + "integrity": "sha512-pWdl4J2dIHXALgy2jVkwKBmtEb73kqIfMpYmcgESr7oPQ+lbcQ4+tlPeVXaSAmang+vglAfFpXQCOvs/aGSqlw==", "cpu": [ "arm64" ], @@ -2107,9 +2499,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.8.tgz", - "integrity": "sha512-fWfywfYIlSWtKoqWTjukTHLWV3ARaBRjXCC2Eo0l6KVpaqGY4c2y8snUjp1xpxUtpqwMvCvFWFaleMoz1Vhzlw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.9.tgz", + "integrity": "sha512-4Dq3lKp0/C7vrRSkNPtBGVebEyWt9QPPlQctxJ0H3MDyiQYvzVYf8jKow7h5QkWNe8hbatEqljMj/Y0M+ERYJg==", "cpu": [ "x64" ], @@ -2123,9 +2515,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.8.tgz", - "integrity": "sha512-SO+dyvjJV9G94bnmq2288Ke0BIdvrbSbvtPLaQdqjqHR83v5L2fWADyFO+1oecHo9Owsk8MxcXh1agGVPIKIqw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.9.tgz", + "integrity": "sha512-k7U1RwRODta8x0uealtVt3RoWAWqA+D5FAOsvVGpYoI6ObgmnzqWW6pnVwz70tL8UZ/QXjeMyiICXyjzB6OGtQ==", "cpu": [ "x64" ], @@ -2139,9 +2531,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.8.tgz", - "integrity": "sha512-ZSHggWiEblQNV69V0qUK5vuAtHP+I+S2eGrKGJ5lPgwgJeAd6GjLsVBN+Mqn2SPVfYM3BOpS9jX/zVg9RWQVDQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.9.tgz", + "integrity": "sha512-NDDjVweHz2zo4j+oS8y3KwKL5wGCZoXGA9ruJM982uVJLdsF8/1AeKvUwKRlMBpxHt1EdWJSAh8a0Mfhl28GlQ==", "cpu": [ "arm" ], @@ -2155,9 +2547,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.8.tgz", - "integrity": "sha512-xWpr6M0OZLDNsr7+bQz+3X7zcnDJZJ1N9gtBWCtfhkEtDjjxYEp+Lr5L5nc/yXlL4MyCHnn0uonGVXy3fhxaVA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.9.tgz", + "integrity": "sha512-jk90UZ0jzJl3Dy1BhuFfRZ2KP9wVKMXPjmCtY4U6fF2LvrjP5gWFJj5VHzfzHonJexjrGe1lMzgtjriuZkxagg==", "cpu": [ "arm64" ], @@ -2171,9 +2563,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.8.tgz", - "integrity": "sha512-5tz2IL7LN58ssGEq7h/staD7pu/izF/KeMWdlJ86WDe2Ah46LF3ET6ZGKTr5eZMrnEA0M9cVFuSPprKRHNgjeg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.9.tgz", + "integrity": "sha512-3eMjyTC6HBxh9nRgOHzrc96PYh1/jWOwHZ3Kk0JN0Kl25BJ80Lj9HEvvwVDNTgPg154LdICwuFLuhfgH9DULmg==", "cpu": [ "arm64" ], @@ -2187,9 +2579,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.8.tgz", - "integrity": "sha512-KSzMkhyrxAQyY2o194NKVKU9j/c+NFSoMvnHWFaNHKi3P1lb+Vq1UC19tLHrmxSkKapcMMu69D7+G1+FVGNDXQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.9.tgz", + "integrity": "sha512-v0D8WqI/c3WpWH1kq/HP0J899ATLdGZmENa2/emmNjubT0sWtEke9W9+wXeEoACuGAhF9i3PO5MeyditpDCiWQ==", "cpu": [ "x64" ], @@ -2203,9 +2595,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.8.tgz", - "integrity": "sha512-yFYKG5UtHTRimjtqxUWXBgI4Tc6NJe3USjRIVdlTczpLRxq/SFwgzGl5JbatCxgSRDPBFwRrNPxq+ukfQFGdrw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.9.tgz", + "integrity": "sha512-Kvp0TCkfeXyeehqLJr7otsc4hd/BUPfcIGrQiwsTVCfaMfjQZCG7DjI+9/QqPZha8YapLA9UoIcUILRYO7NE1Q==", "cpu": [ "x64" ], @@ -2219,9 +2611,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.8.tgz", - "integrity": "sha512-tndGujmCSba85cRCnQzXgpA2jx5gXimyspsUYae5jlPyLRG0RjXbDshFKOheVXU4TLflo7FSG8EHCBJ0EHTKdQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.9.tgz", + "integrity": "sha512-m3+60T/7YvWekajNq/eexjhV8z10rswcz4BC9bioJ7YaN+7K8W2AmLmG0B79H14m6UHE571qB0XsPus4n0QVgQ==", "cpu": [ "arm64" ], @@ -2235,9 +2627,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.8.tgz", - "integrity": "sha512-T77jroAc0p4EHVVgTUiNeFn6Nj3jtD3IeNId2X+0k+N1XxfNipy81BEkYErpKLiOkNhpNFjPee8/ZVas29b2OQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.9.tgz", + "integrity": "sha512-dpc05mSlqkwVNOUjGu/ZXd5U1XNch1kHFJ4/cHkZFvaW1RzbHmRt24gvM8/HC6IirMxNarzVw4IXVtvrOoZtxA==", "cpu": [ "x64" ], @@ -2251,24 +2643,24 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.8.tgz", - "integrity": "sha512-+SAq44yLzYlzyrb7QTcFCdU8Xa7FOA0jp+Xby7fPMUie+MY9HhJysM7Vp+vL8qIp8ceQJfLD+FjgJuJ4lL6nyg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.9.tgz", + "integrity": "sha512-BIKJO+hwdIsN7V6I7SziMZIVHWWMsV/uCQKYEbeiGRDRld+TkqyRRl9+dQ0MCXbhcVr+D9T/qX2E84kT7V281g==", "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.0.8", - "@tailwindcss/oxide": "4.0.8", + "@tailwindcss/node": "4.0.9", + "@tailwindcss/oxide": "4.0.9", "lightningcss": "^1.29.1", - "tailwindcss": "4.0.8" + "tailwindcss": "4.0.9" }, "peerDependencies": { "vite": "^5.2.0 || ^6" } }, "node_modules/@tanstack/query-core": { - "version": "5.66.4", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.66.4.tgz", - "integrity": "sha512-skM/gzNX4shPkqmdTCSoHtJAPMTtmIJNS0hE+xwTTUVYwezArCT34NMermABmBVUg5Ls5aiUXEDXfqwR1oVkcA==", + "version": "5.67.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.67.1.tgz", + "integrity": "sha512-AkFmuukVejyqVIjEQoFhLb3q+xHl7JG8G9cANWTMe3s8iKzD9j1VBSYXgCjy6vm6xM8cUCR9zP2yqWxY9pTWOA==", "license": "MIT", "funding": { "type": "github", @@ -2276,12 +2668,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.66.9", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.66.9.tgz", - "integrity": "sha512-NRI02PHJsP5y2gAuWKP+awamTIBFBSKMnO6UVzi03GTclmHHHInH5UzVgzi5tpu4+FmGfsdT7Umqegobtsp23A==", + "version": "5.67.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.67.1.tgz", + "integrity": "sha512-fH5u4JLwB6A+wLFdi8wWBWAYoJV5deYif2OveJ26ktAWjU499uvVFS1wPWnyEyq5LvZX1MZInvv9QRaIZANRaQ==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.66.4" + "@tanstack/query-core": "5.67.1" }, "funding": { "type": "github", @@ -2457,9 +2849,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz", - "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", + "version": "22.13.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.9.tgz", + "integrity": "sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -2511,15 +2903,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.24.1", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.0.tgz", + "integrity": "sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/type-utils": "8.24.1", - "@typescript-eslint/utils": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/scope-manager": "8.26.0", + "@typescript-eslint/type-utils": "8.26.0", + "@typescript-eslint/utils": "8.26.0", + "@typescript-eslint/visitor-keys": "8.26.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2535,18 +2929,20 @@ "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.24.1", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.0.tgz", + "integrity": "sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/scope-manager": "8.26.0", + "@typescript-eslint/types": "8.26.0", + "@typescript-eslint/typescript-estree": "8.26.0", + "@typescript-eslint/visitor-keys": "8.26.0", "debug": "^4.3.4" }, "engines": { @@ -2558,16 +2954,18 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.24.1", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.0.tgz", + "integrity": "sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1" + "@typescript-eslint/types": "8.26.0", + "@typescript-eslint/visitor-keys": "8.26.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2578,12 +2976,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.24.1", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.0.tgz", + "integrity": "sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/utils": "8.24.1", + "@typescript-eslint/typescript-estree": "8.26.0", + "@typescript-eslint/utils": "8.26.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -2596,11 +2996,13 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.24.1", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.0.tgz", + "integrity": "sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==", "dev": true, "license": "MIT", "engines": { @@ -2612,12 +3014,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.24.1", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.0.tgz", + "integrity": "sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/types": "8.26.0", + "@typescript-eslint/visitor-keys": "8.26.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2633,11 +3037,13 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { @@ -2646,6 +3052,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "license": "ISC", "dependencies": { @@ -2660,6 +3068,8 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "license": "ISC", "bin": { @@ -2670,14 +3080,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.24.1", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1" + "@typescript-eslint/scope-manager": "8.26.0", + "@typescript-eslint/types": "8.26.0", + "@typescript-eslint/typescript-estree": "8.26.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2688,15 +3100,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.24.1", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.0.tgz", + "integrity": "sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/types": "8.26.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2726,9 +3140,9 @@ } }, "node_modules/@vitest/coverage-v8": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.6.tgz", - "integrity": "sha512-JRTlR8Bw+4BcmVTICa7tJsxqphAktakiLsAmibVLAWbu1lauFddY/tXeM6sAyl1cgkPuXtpnUgaCPhTdz1Qapg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.7.tgz", + "integrity": "sha512-Av8WgBJLTrfLOer0uy3CxjlVuWK4CzcLBndW1Nm2vI+3hZ2ozHututkfc7Blu1u6waeQ7J8gzPK/AsBRnWA5mQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2749,8 +3163,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.0.6", - "vitest": "3.0.6" + "@vitest/browser": "3.0.7", + "vitest": "3.0.7" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -2759,14 +3173,14 @@ } }, "node_modules/@vitest/expect": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.6.tgz", - "integrity": "sha512-zBduHf/ja7/QRX4HdP1DSq5XrPgdN+jzLOwaTq/0qZjYfgETNFCKf9nOAp2j3hmom3oTbczuUzrzg9Hafh7hNg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.7.tgz", + "integrity": "sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.6", - "@vitest/utils": "3.0.6", + "@vitest/spy": "3.0.7", + "@vitest/utils": "3.0.7", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, @@ -2775,13 +3189,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.6.tgz", - "integrity": "sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.7.tgz", + "integrity": "sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.6", + "@vitest/spy": "3.0.7", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -2802,9 +3216,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.6.tgz", - "integrity": "sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.7.tgz", + "integrity": "sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==", "dev": true, "license": "MIT", "dependencies": { @@ -2815,13 +3229,13 @@ } }, "node_modules/@vitest/runner": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.6.tgz", - "integrity": "sha512-JopP4m/jGoaG1+CBqubV/5VMbi7L+NQCJTu1J1Pf6YaUbk7bZtaq5CX7p+8sY64Sjn1UQ1XJparHfcvTTdu9cA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.7.tgz", + "integrity": "sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.0.6", + "@vitest/utils": "3.0.7", "pathe": "^2.0.3" }, "funding": { @@ -2829,13 +3243,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.6.tgz", - "integrity": "sha512-qKSmxNQwT60kNwwJHMVwavvZsMGXWmngD023OHSgn873pV0lylK7dwBTfYP7e4URy5NiBCHHiQGA9DHkYkqRqg==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.7.tgz", + "integrity": "sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.6", + "@vitest/pretty-format": "3.0.7", "magic-string": "^0.30.17", "pathe": "^2.0.3" }, @@ -2844,9 +3258,9 @@ } }, "node_modules/@vitest/spy": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.6.tgz", - "integrity": "sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.7.tgz", + "integrity": "sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==", "dev": true, "license": "MIT", "dependencies": { @@ -2857,13 +3271,13 @@ } }, "node_modules/@vitest/utils": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.6.tgz", - "integrity": "sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.7.tgz", + "integrity": "sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.6", + "@vitest/pretty-format": "3.0.7", "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, @@ -3185,6 +3599,8 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -4257,7 +4673,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.2", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -4267,31 +4685,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" } }, "node_modules/escalade": { @@ -4372,9 +4790,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz", - "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.2.tgz", + "integrity": "sha512-1105/17ZIMjmCOJOPNfVdbXafLCLj3hPmkmB7dLgt7XsQ/zkxSuDerE/xgO3RxoHysR1N1whmquY0lSn2O0VLg==", "dev": true, "license": "MIT", "bin": { @@ -4417,7 +4835,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.1.0", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, "license": "MIT", "engines": { @@ -4553,6 +4973,8 @@ }, "node_modules/fast-glob": { "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { @@ -4568,6 +4990,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -4588,7 +5012,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.19.0", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -4607,6 +5033,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -4726,6 +5154,20 @@ "dev": true, "license": "ISC" }, + "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/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -4922,7 +5364,9 @@ } }, "node_modules/globals": { - "version": "15.15.0", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.0.0.tgz", + "integrity": "sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==", "dev": true, "license": "MIT", "engines": { @@ -4968,6 +5412,8 @@ }, "node_modules/graphemer": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, @@ -5434,6 +5880,8 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", "engines": { @@ -6110,9 +6558,9 @@ } }, "node_modules/lucide-react": { - "version": "0.475.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.475.0.tgz", - "integrity": "sha512-NJzvVu1HwFVeZ+Gwq2q00KygM1aBhy/ZrhY9FsAgJtpB+E4R7uxRk9M2iKvHa6/vNxZydIB59htha4c2vvwvVg==", + "version": "0.477.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.477.0.tgz", + "integrity": "sha512-yCf7aYxerFZAbd8jHJxjwe1j7jEMPptjnaOqdYeirFnEy85cNR3/L+o0I875CYFYya+eEVzZSbNuRk8BZPDpVw==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -6192,6 +6640,8 @@ }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { @@ -6200,6 +6650,8 @@ }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -6338,9 +6790,9 @@ "license": "MIT" }, "node_modules/msw": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.1.tgz", - "integrity": "sha512-TVT65uoWt9LE4lMTLBdClHBQVwvZv5ofac1YyE119nCrNyXf4ktdeVnWH9Fyt94Ifmiedhw6Npp4DSuVRSuRpw==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.3.tgz", + "integrity": "sha512-+mycXv8l2fEAjFZ5sjrtjJDmm2ceKGjrNbBr1durRg6VkU9fNUE/gsmQ51hWbHqs+l35W1iM+ZsmOD9Fd6lspw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -6394,6 +6846,8 @@ }, "node_modules/nanoid": { "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", @@ -6744,6 +7198,8 @@ }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { @@ -6785,7 +7241,9 @@ } }, "node_modules/postcss": { - "version": "8.5.2", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "funding": [ { "type": "opencollective", @@ -6818,9 +7276,9 @@ } }, "node_modules/prettier": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz", - "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, "license": "MIT", "bin": { @@ -6873,6 +7331,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -7214,7 +7674,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -7267,6 +7729,8 @@ }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -7841,9 +8305,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.8.tgz", - "integrity": "sha512-Me7N5CKR+D2A1xdWA5t5+kjjT7bwnxZOE6/yDI/ixJdJokszsn2n++mdU5yJwrsTpqFX2B9ZNMBJDwcqk9C9lw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.9.tgz", + "integrity": "sha512-12laZu+fv1ONDRoNR9ipTOpUD7RN9essRVkX36sjxuRUInpN7hIiHN4lBd/SIFjbISvnXzp8h/hXzmU8SQQYhw==", "license": "MIT" }, "node_modules/tailwindcss-animate": { @@ -8012,6 +8476,8 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8049,6 +8515,8 @@ }, "node_modules/ts-api-utils": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", "dev": true, "license": "MIT", "engines": { @@ -8180,13 +8648,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.24.1", + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.26.0.tgz", + "integrity": "sha512-PtVz9nAnuNJuAVeUFvwztjuUgSnJInODAUx47VDwWPXzd5vismPOtPtt83tzNXyOjVQbPRp786D6WFW/M2koIA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.24.1", - "@typescript-eslint/parser": "8.24.1", - "@typescript-eslint/utils": "8.24.1" + "@typescript-eslint/eslint-plugin": "8.26.0", + "@typescript-eslint/parser": "8.26.0", + "@typescript-eslint/utils": "8.26.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8197,7 +8667,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "typescript": ">=4.8.4 <5.9.0" } }, "node_modules/ufo": { @@ -8394,11 +8864,13 @@ } }, "node_modules/vite": { - "version": "6.1.1", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.0.tgz", + "integrity": "sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==", "license": "MIT", "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.5.2", + "esbuild": "^0.25.0", + "postcss": "^8.5.3", "rollup": "^4.30.1" }, "bin": { @@ -8463,9 +8935,9 @@ } }, "node_modules/vite-node": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.6.tgz", - "integrity": "sha512-s51RzrTkXKJrhNbUzQRsarjmAae7VmMPAsRT7lppVpIg6mK3zGthP9Hgz0YQQKuNcF+Ii7DfYk3Fxz40jRmePw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.7.tgz", + "integrity": "sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==", "dev": true, "license": "MIT", "dependencies": { @@ -8486,19 +8958,19 @@ } }, "node_modules/vitest": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.6.tgz", - "integrity": "sha512-/iL1Sc5VeDZKPDe58oGK4HUFLhw6b5XdY1MYawjuSaDA4sEfYlY9HnS6aCEG26fX+MgUi7MwlduTBHHAI/OvMA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.7.tgz", + "integrity": "sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "3.0.6", - "@vitest/mocker": "3.0.6", - "@vitest/pretty-format": "^3.0.6", - "@vitest/runner": "3.0.6", - "@vitest/snapshot": "3.0.6", - "@vitest/spy": "3.0.6", - "@vitest/utils": "3.0.6", + "@vitest/expect": "3.0.7", + "@vitest/mocker": "3.0.7", + "@vitest/pretty-format": "^3.0.7", + "@vitest/runner": "3.0.7", + "@vitest/snapshot": "3.0.7", + "@vitest/spy": "3.0.7", + "@vitest/utils": "3.0.7", "chai": "^5.2.0", "debug": "^4.4.0", "expect-type": "^1.1.0", @@ -8510,7 +8982,7 @@ "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.6", + "vite-node": "3.0.7", "why-is-node-running": "^2.3.0" }, "bin": { @@ -8526,8 +8998,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.6", - "@vitest/ui": "3.0.6", + "@vitest/browser": "3.0.7", + "@vitest/ui": "3.0.7", "happy-dom": "*", "jsdom": "*" }, diff --git a/package.json b/package.json index 772be04..d6b24de 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "openapi-ts": "openapi-ts" }, "dependencies": { - "@hey-api/client-fetch": "^0.8.1", + "@hey-api/client-fetch": "^0.8.3", "@radix-ui/react-checkbox": "^1.1.4", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-hover-card": "^1.1.6", @@ -31,43 +31,43 @@ "@radix-ui/react-tabs": "^1.1.3", "@radix-ui/react-toggle": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", - "@tailwindcss/vite": "^4.0.8", - "@tanstack/react-query": "^5.66.9", + "@tailwindcss/vite": "^4.0.9", + "@tanstack/react-query": "^5.67.1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "eslint-plugin-react": "^7.37.4", - "lucide-react": "^0.475.0", + "lucide-react": "^0.477.0", "react": "^19.0.0", "react-dom": "^19.0.0", "react-router": "^7.2.0", "recharts": "^2.15.1", "tailwind-merge": "^3.0.2", - "tailwindcss": "^4.0.8", + "tailwindcss": "^4.0.9", "tailwindcss-animate": "^1.0.7", "vaul": "^1.1.2" }, "devDependencies": { "@eslint/js": "^9.21.0", - "@hey-api/openapi-ts": "^0.64.5", + "@hey-api/openapi-ts": "^0.64.10", "@mswjs/data": "^0.16.2", "@testing-library/jest-dom": "^6.6.3", - "@types/node": "^22.13.5", + "@types/node": "^22.13.9", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", "@vitejs/plugin-react": "^4.3.4", - "@vitest/coverage-v8": "^3.0.6", + "@vitest/coverage-v8": "^3.0.7", "eslint": "^9.21.0", - "eslint-config-prettier": "^10.0.1", - "eslint-plugin-react-hooks": "^5.1.0", + "eslint-config-prettier": "^10.0.2", + "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.19", - "globals": "^15.14.0", + "globals": "^16.0.0", "jsdom": "^26.0.0", - "msw": "^2.7.1", - "prettier": "^3.5.2", + "msw": "^2.7.3", + "prettier": "^3.5.3", "typescript": "~5.7.3", - "typescript-eslint": "^8.24.1", - "vite": "^6.1.1", - "vitest": "^3.0.6" + "typescript-eslint": "^8.26.0", + "vite": "^6.2.0", + "vitest": "^3.0.7" }, "msw": { "workerDirectory": [ diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..d26c204 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/bitcredit-192x192.png b/public/bitcredit-192x192.png new file mode 100644 index 0000000..3a5ad49 Binary files /dev/null and b/public/bitcredit-192x192.png differ diff --git a/public/bitcredit-512x512.png b/public/bitcredit-512x512.png new file mode 100644 index 0000000..091539a Binary files /dev/null and b/public/bitcredit-512x512.png differ diff --git a/public/favicon-96x96.png b/public/favicon-96x96.png new file mode 100644 index 0000000..097d377 Binary files /dev/null and b/public/favicon-96x96.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..4d0a016 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..e4ab394 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/public/mockServiceWorker.js b/public/mockServiceWorker.js index 7f2f4b7..34057e8 100644 --- a/public/mockServiceWorker.js +++ b/public/mockServiceWorker.js @@ -8,7 +8,7 @@ * - Please do NOT serve this file on production. */ -const PACKAGE_VERSION = '2.7.1' +const PACKAGE_VERSION = '2.7.3' const INTEGRITY_CHECKSUM = '00729d72e3b82faf54ca8b9621dbb96f' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() diff --git a/public/vite.svg b/public/vite.svg deleted file mode 100644 index e7b8dfb..0000000 --- a/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/components/Breadcrumbs.tsx b/src/components/Breadcrumbs.tsx index 97308d9..5d71799 100644 --- a/src/components/Breadcrumbs.tsx +++ b/src/components/Breadcrumbs.tsx @@ -22,14 +22,12 @@ export function Breadcrumbs({ parents, children }: PropsWithChildren<{ parents?: {parents && ( <> {parents.map((it, index) => ( - <> - - - {it} - +
+ + <>{it} - +
))} )} diff --git a/src/generated/client/types.gen.ts b/src/generated/client/types.gen.ts index 19c19ab..3d50f03 100644 --- a/src/generated/client/types.gen.ts +++ b/src/generated/client/types.gen.ts @@ -1,35 +1,48 @@ // This file is auto-generated by @hey-api/openapi-ts /** - * Manually added - should be replaced with generated one + * Manually added - should be replaced with generated one. */ export type Id = string; /** - * Manually added - should be replaced with generated one + * Manually added - should be replaced with generated one. */ -export type BlindSignatureDleq = string; +export type P2PkWitness = string; /** - * Manually added - should be replaced with generated one + * Manually added - should be replaced with generated one. */ -export type Witness = string; +export type HtlcWitness = string; /** - * Manually added - should be replaced with generated one + * Manually added - should be replaced with generated one. */ -export type TStamp = number; +export type Resolve = string; /** - * Manually added - should be replaced with generated one + * Manually added - should be replaced with generated one. */ -export type Resolve = number; +export type IdentityPublicData = string; /** * Amount can be any unit */ export type Amount = number; +/** + * --------------------------- Enquire mint quote + */ +export type BillInfo = { + drawee: IdentityPublicData; + drawer: IdentityPublicData; + holder: IdentityPublicData; + id: string; + maturity_date: string; + payee: IdentityPublicData; + sum: number; +}; + /** * Blind Signature (also called `promise`) */ @@ -45,6 +58,22 @@ export type BlindSignature = { id: Id; }; +/** + * Blinded Signature on Dleq + * + * Defined in [NUT12](https://github.com/cashubtc/nuts/blob/main/12.md) + */ +export type BlindSignatureDleq = { + /** + * e + */ + e: string; + /** + * s + */ + s: string; +}; + /** * Blinded Message (also called `output`) */ @@ -68,45 +97,40 @@ export type EnquireReply = { * --------------------------- Enquire mint quote */ export type EnquireRequest = { - bill: string; - node: string; + content: BillInfo; outputs: Array; + signature: string; }; /** * --------------------------- Quote info request */ export type InfoReply = { - bill: string; - endorser: string; + bill: BillInfo; id: string; status: 'pending'; submitted: string; suggested_expiration: string; } | { - bill: string; - endorser: string; + bill: BillInfo; id: string; signatures: Array; status: 'offered'; ttl: string; } | { - bill: string; - endorser: string; + bill: BillInfo; id: string; status: 'denied'; } | { - bill: string; - endorser: string; + bill: BillInfo; id: string; signatures: Array; status: 'accepted'; } | { - bill: string; - endorser: string; + bill: BillInfo; id: string; status: 'rejected'; - tstamp: TStamp; + tstamp: string; }; /** @@ -144,7 +168,7 @@ export type StatusReply = { } | { status: 'denied'; } | { - expiration_date: TStamp; + expiration_date: string; signatures: Array; status: 'offered'; } | { @@ -152,9 +176,14 @@ export type StatusReply = { status: 'accepted'; } | { status: 'rejected'; - tstamp: TStamp; + tstamp: string; }; +/** + * Witness + */ +export type Witness = P2PkWitness | HtlcWitness; + export type AdminLookupQuoteData = { body?: never; path: { diff --git a/src/mocks/db.ts b/src/mocks/db.ts index c4a9583..564ad9c 100644 --- a/src/mocks/db.ts +++ b/src/mocks/db.ts @@ -9,8 +9,15 @@ export const db = factory({ }, quotes: { id: primaryKey(String), - bill: nullable(String), - endorser: nullable(String), + bill: { + id: nullable(String), + drawee: nullable(String), + drawer: nullable(String), + holder: nullable(String), + payee: nullable(String), + sum: Number, + maturity_date: String, + }, status: nullable(String), submitted: nullable(String), // pending suggested_expiration: nullable(String), // pending @@ -30,6 +37,11 @@ db.info.create({ db.quotes.create({ id: "63777d15-ce53-4cca-94bf-7726c7930aab", status: "pending", + bill: { + id: "5bd3f9b8-85bd-488e-a7ca-2b35bd343e7c", + sum: 42, + maturity_date: "2025-01-01", + }, }) db.quotes.create({ diff --git a/src/mocks/handlers.ts b/src/mocks/handlers.ts index c6770eb..0cf4dae 100644 --- a/src/mocks/handlers.ts +++ b/src/mocks/handlers.ts @@ -1,5 +1,17 @@ -import { fetchAdminLookupQuote, fetchAdminQuotePending } from "./handlers/admin_quotes" +import { + fetchAdminLookupQuote, + fetchAdminQuoteAccepted, + fetchAdminQuotePending, + updateAdminQuote, +} from "./handlers/admin_quotes" import { fetchBalances } from "./handlers/balances" import { fetchInfo } from "./handlers/info" -export const handlers = [fetchInfo, fetchBalances, fetchAdminQuotePending, fetchAdminLookupQuote] +export const handlers = [ + fetchInfo, + fetchBalances, + fetchAdminQuotePending, + fetchAdminQuoteAccepted, + fetchAdminLookupQuote, + updateAdminQuote, +] diff --git a/src/mocks/handlers/admin_quotes.ts b/src/mocks/handlers/admin_quotes.ts index d1b237b..298f10f 100644 --- a/src/mocks/handlers/admin_quotes.ts +++ b/src/mocks/handlers/admin_quotes.ts @@ -1,7 +1,13 @@ import { http, delay, HttpResponse, StrictResponse } from "msw" import { API_URL } from "@/constants/api" -import { ADMIN_QUOTE_BY_ID, ADMIN_QUOTE_PENDING } from "@/constants/endpoints" -import { AdminLookupQuoteResponse, InfoReply, ListPendingQuotesResponse } from "@/generated/client" +import { ADMIN_QUOTE_BY_ID, ADMIN_QUOTE_PENDING, ADMIN_QUOTE_ACCEPTED } from "@/constants/endpoints" +import { + AdminLookupQuoteResponse, + InfoReply, + ListAcceptedQuotesResponse, + ListPendingQuotesResponse, + ResolveRequest, +} from "@/generated/client" import { db } from "../db" export const fetchAdminQuotePending = http.get( @@ -17,6 +23,19 @@ export const fetchAdminQuotePending = http.get( + `${API_URL}${ADMIN_QUOTE_ACCEPTED}`, + async () => { + await delay(1_000) + + const data = db.quotes.getAll().filter((it) => it.status === "accepted") + + return HttpResponse.json({ + quotes: data.map((it) => it.id), + }) + }, +) + export const fetchAdminLookupQuote = http.get( `${API_URL}${ADMIN_QUOTE_BY_ID}`, async ({ params }) => { @@ -25,7 +44,6 @@ export const fetchAdminLookupQuote = http.get it.id === id) - if (data.length === 0) { return HttpResponse.json(null, { status: 404 }) as unknown as StrictResponse } @@ -33,3 +51,35 @@ export const fetchAdminLookupQuote = http.get( + `${API_URL}${ADMIN_QUOTE_BY_ID}`, + async ({ params, request }) => { + const { id } = params + const body = await request.json() + + await delay(1_000) + + const data = db.quotes.getAll().filter((it) => it.id === id) + if (data.length === 0) { + return HttpResponse.json(null, { status: 404 }) as unknown as StrictResponse + } + + const quote = data[0] + + if (body.action === "deny") { + quote.status = "denied" + } + if (body.action === "offer") { + quote.status = "offered" + quote.ttl = body.ttl ?? null + } + + const updated = db.quotes.update({ + where: { id: { equals: quote.id } }, + data: quote, + }) + + return HttpResponse.json(updated as InfoReply) + }, +) diff --git a/src/pages/quotes/QuotePage.tsx b/src/pages/quotes/QuotePage.tsx index a455bfb..420ac71 100644 --- a/src/pages/quotes/QuotePage.tsx +++ b/src/pages/quotes/QuotePage.tsx @@ -1,11 +1,18 @@ import { Breadcrumbs } from "@/components/Breadcrumbs" import { PageTitle } from "@/components/PageTitle" +import { Badge } from "@/components/ui/badge" +import { Button } from "@/components/ui/button" import { Skeleton } from "@/components/ui/skeleton" import { Table, TableBody, TableCell, TableRow } from "@/components/ui/table" import { InfoReply } from "@/generated/client" -import { adminLookupQuoteOptions } from "@/generated/client/@tanstack/react-query.gen" +import { + adminLookupQuoteOptions, + adminLookupQuoteQueryKey, + resolveQuoteMutation, +} from "@/generated/client/@tanstack/react-query.gen" import useLocalStorage from "@/hooks/use-local-storage" -import { useSuspenseQuery } from "@tanstack/react-query" +import { useMutation, useQueryClient, useSuspenseQuery } from "@tanstack/react-query" +import { LoaderIcon } from "lucide-react" import { Suspense } from "react" import { Link, useParams } from "react-router" @@ -17,11 +24,91 @@ function Loader() { ) } -function Quote({ value }: { value: InfoReply }) { +function QuoteActions({ value, isFetching }: { value: InfoReply; isFetching: boolean }) { + const queryClient = useQueryClient() + + const denyQuote = useMutation({ + ...resolveQuoteMutation(), + onError: (error) => { + console.log(error) + }, + onSuccess: () => { + void queryClient.invalidateQueries({ + queryKey: adminLookupQuoteQueryKey({ + path: { + id: value.id, + }, + }), + }) + }, + }) + const offerQuote = useMutation({ + ...resolveQuoteMutation(), + onError: (error) => { + console.log(error) + }, + onSuccess: () => { + void queryClient.invalidateQueries({ + queryKey: adminLookupQuoteQueryKey({ + path: { + id: value.id, + }, + }), + }) + }, + }) + + const onDenyQuote = () => { + denyQuote.mutate({ + path: { + id: value.id, + }, + body: { + action: "deny", + }, + }) + } + + const onOfferQuote = () => { + offerQuote.mutate({ + path: { + id: value.id, + }, + body: { + action: "offer", + discount: "1", + ttl: "1", + }, + }) + } + + return ( + <> +
+ + +
+ + ) +} + +function Quote({ value, isFetching }: { value: InfoReply; isFetching: boolean }) { return ( <>
- +
id: @@ -29,18 +116,20 @@ function Quote({ value }: { value: InfoReply }) { status: - {value.status} - - - endorser: - {value.endorser || "(empty)"} + + + {value.status} + + bill: - {value.bill || "(empty)"} + {value.bill ?
{JSON.stringify(value.bill, null, 2)}
: "(empty)"}
+ +
) @@ -71,7 +160,7 @@ function DevSection({ id }: { id: InfoReply["id"] }) { } function PageBody({ id }: { id: InfoReply["id"] }) { - const { data } = useSuspenseQuery({ + const { data, isFetching } = useSuspenseQuery({ ...adminLookupQuoteOptions({ path: { id, @@ -81,7 +170,10 @@ function PageBody({ id }: { id: InfoReply["id"] }) { return ( <> - +
+ {isFetching && } +
+ ) } diff --git a/src/pages/quotes/QuotesPage.tsx b/src/pages/quotes/QuotesPage.tsx index 8519a54..7d273ff 100644 --- a/src/pages/quotes/QuotesPage.tsx +++ b/src/pages/quotes/QuotesPage.tsx @@ -3,10 +3,10 @@ import { H3 } from "@/components/Headings" import { PageTitle } from "@/components/PageTitle" import { Button } from "@/components/ui/button" import { Skeleton } from "@/components/ui/skeleton" -import { listPendingQuotesOptions } from "@/generated/client/@tanstack/react-query.gen" +import { listAcceptedQuotesOptions, listPendingQuotesOptions } from "@/generated/client/@tanstack/react-query.gen" import useLocalStorage from "@/hooks/use-local-storage" import { useSuspenseQuery } from "@tanstack/react-query" -import { ViewIcon } from "lucide-react" +import { LoaderIcon } from "lucide-react" import { Suspense } from "react" import { Link, useNavigate } from "react-router" @@ -18,41 +18,87 @@ function Loader() { ) } -function QuoteListPendingRaw() { - const { data } = useSuspenseQuery({ - ...listPendingQuotesOptions({}), +function QuoteListPending() { + const navigate = useNavigate() + + const { data, isFetching } = useSuspenseQuery({ + ...listPendingQuotesOptions(), }) return ( <> -
-        {JSON.stringify(data, null, 2)}
-      
+

+ + Pending + {isFetching && } + +

+ +
+ {data.quotes.map((it, index) => { + return ( +
+ {isFetching ? ( + <>{it} + ) : ( + <> + {it} + + )} + + +
+ ) + })} +
) } -function QuoteListPending() { +function QuoteListAccepted() { const navigate = useNavigate() - const { data } = useSuspenseQuery({ - ...listPendingQuotesOptions({}), + const { data, isFetching } = useSuspenseQuery({ + ...listAcceptedQuotesOptions(), }) return ( <> +

+ + Accepted + {isFetching && } + +

+
{data.quotes.map((it, index) => { return (
- {it} + {isFetching ? ( + <>{it} + ) : ( + <> + {it} + + )} +
) @@ -65,15 +111,36 @@ function QuoteListPending() { function DevSection() { const [devMode] = useLocalStorage("devMode", false) - return <>{devMode && } + const { data: quotesPending } = useSuspenseQuery({ + ...listPendingQuotesOptions({}), + }) + + const { data: quotesAccepted } = useSuspenseQuery({ + ...listAcceptedQuotesOptions({}), + }) + + return ( + <> + {devMode && ( + <> +
+            {JSON.stringify(quotesPending, null, 2)}
+          
+
+            {JSON.stringify(quotesAccepted, null, 2)}
+          
+ + )} + + ) } function PageBody() { return ( <> -

Pending

}> + )