From 3335f13392b1aa1ddadd51bd6827a466f074877c Mon Sep 17 00:00:00 2001 From: imharrisonking Date: Thu, 26 Feb 2026 16:53:40 +0000 Subject: [PATCH 01/10] Add size prop to Crosshair component - Add optional size prop with 'sm', 'md', 'lg' options - Default behavior unchanged (20x21px with -10.5px offset) - Use cva (class-variance-authority) for variant handling - Dynamically calculate viewBox and paths based on size config Sizes: - sm: 14x15px, offset -7.5px - md: 28x29px, offset -15px - lg: 36x37px, offset -19px --- .../web/src/components/layout/Crosshair.tsx | 62 ++++++++++++++----- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/packages/web/src/components/layout/Crosshair.tsx b/packages/web/src/components/layout/Crosshair.tsx index eba4358..3fc9564 100644 --- a/packages/web/src/components/layout/Crosshair.tsx +++ b/packages/web/src/components/layout/Crosshair.tsx @@ -1,44 +1,78 @@ +import { cva, type VariantProps } from "class-variance-authority"; import type React from "react"; import { cn } from "@/lib/utils"; -interface CrosshairProps { +const crosshairVariants = cva( + "absolute text-ds-azure dark:text-ds-teal pointer-events-none z-20", + { + variants: { + size: { + sm: "", + md: "", + lg: "", + }, + }, + }, +); + +interface CrosshairProps extends VariantProps { position: "top-left" | "top-right" | "bottom-left" | "bottom-right"; className?: string; } +/** + * Size configurations for the crosshair component + * Each size defines dimensions and position offset + */ +const SIZE_CONFIGS = { + sm: { width: 14, height: 15, offset: -7.5 }, + md: { width: 28, height: 29, offset: -15 }, + lg: { width: 36, height: 37, offset: -19 }, +}; + /** * Crosshair marker for section corners * A crosshair SVG that marks corners of containers with relative positioning */ export const Crosshair: React.FC = ({ position, + size, className, }) => { + // Use size config if provided, otherwise use default dimensions + const config = size + ? SIZE_CONFIGS[size] + : { width: 20, height: 21, offset: -10.5 }; + const positionStyles: Record = { - "top-left": { top: "-11px", left: "-10.5px" }, - "top-right": { top: "-11px", right: "-10.5px" }, - "bottom-left": { bottom: "-11px", left: "-10.5px" }, - "bottom-right": { bottom: "-11px", right: "-10.5px" }, + "top-left": { top: `${config.offset}px`, left: `${config.offset}px` }, + "top-right": { top: `${config.offset}px`, right: `${config.offset}px` }, + "bottom-left": { bottom: `${config.offset}px`, left: `${config.offset}px` }, + "bottom-right": { + bottom: `${config.offset}px`, + right: `${config.offset}px`, + }, }; + // Calculate center point for the viewBox + const centerX = config.width / 2; + const centerY = config.height / 2; + return ( Corner crosshair - - + + ); }; From ca5a1780d54545beab7d48be5525232c10a561cf Mon Sep 17 00:00:00 2001 From: imharrisonking Date: Thu, 26 Feb 2026 16:54:17 +0000 Subject: [PATCH 02/10] Mark issue #39 as COMPLETE --- specs/progress.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/specs/progress.txt b/specs/progress.txt index e69de29..9bed158 100644 --- a/specs/progress.txt +++ b/specs/progress.txt @@ -0,0 +1,4 @@ +[CURRENT_ISSUE] 39 +[CURRENT_BRANCH] 39-add-size-prop-to-crosshair-component +[STARTED] 2026-02-26T17:00:00+00:00 +COMPLETE From 8f060ae4bca49e695bcb1c8dbd4093c2eccc7c74 Mon Sep 17 00:00:00 2001 From: imharrisonking Date: Thu, 26 Feb 2026 17:02:28 +0000 Subject: [PATCH 03/10] PR #45 ready for manual merge --- specs/progress.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/progress.txt b/specs/progress.txt index 9bed158..40ce9d4 100644 --- a/specs/progress.txt +++ b/specs/progress.txt @@ -1,4 +1,4 @@ [CURRENT_ISSUE] 39 [CURRENT_BRANCH] 39-add-size-prop-to-crosshair-component [STARTED] 2026-02-26T17:00:00+00:00 -COMPLETE +PR_READY From a1fbc1a6366ae5bae2cf31faba9fbfb59378eccd Mon Sep 17 00:00:00 2001 From: imharrisonking Date: Thu, 26 Feb 2026 17:08:54 +0000 Subject: [PATCH 04/10] chore: retry deployment (SST lock was transient) From 218ad232f4bc47109734ed2658352dc84391d19f Mon Sep 17 00:00:00 2001 From: imharrisonking Date: Thu, 26 Feb 2026 17:13:12 +0000 Subject: [PATCH 05/10] Mark issue #39 as FAILED (SST lock requires manual intervention) --- specs/progress.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specs/progress.txt b/specs/progress.txt index 40ce9d4..3138a4a 100644 --- a/specs/progress.txt +++ b/specs/progress.txt @@ -1,4 +1,4 @@ [CURRENT_ISSUE] 39 [CURRENT_BRANCH] 39-add-size-prop-to-crosshair-component [STARTED] 2026-02-26T17:00:00+00:00 -PR_READY +FAILED From 40eba262e6b48f91da5df0a0c358836488d8675c Mon Sep 17 00:00:00 2001 From: imharrisonking Date: Thu, 26 Feb 2026 17:35:12 +0000 Subject: [PATCH 06/10] fix(ci): handle SST lock errors and filter issues with open PRs - Add pre-deploy SST unlock to clear stale locks from cancelled runs - Add post-deploy unlock with if: always() for cleanup on failure/cancel - Filter afk.sh issues to exclude those with open PRs waiting for review - Prevents CI lock errors when rapid commits trigger workflow cancellations --- .github/workflows/pr-preview-deploy.yml | 11 +++++++++++ specs/afk.sh | 25 ++++++++++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pr-preview-deploy.yml b/.github/workflows/pr-preview-deploy.yml index f811157..03d57bf 100644 --- a/.github/workflows/pr-preview-deploy.yml +++ b/.github/workflows/pr-preview-deploy.yml @@ -127,6 +127,11 @@ jobs: role-to-assume: arn:aws:iam::${{ vars.AWS_ACCOUNT_DEV }}:role/structa-dev-GitHubActionsDeploy aws-region: ${{ env.AWS_REGION }} + - name: Clear any stale SST lock + run: npx sst unlock --stage ${{ env.STAGE_NAME }} + env: + AWS_PROFILE: '' + - name: Deploy with SST run: npx sst deploy --stage ${{ env.STAGE_NAME }} env: @@ -134,6 +139,12 @@ jobs: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} CLOUDFLARE_DEFAULT_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_DEFAULT_ACCOUNT_ID }} + - name: Unlock SST on cancellation/failure + if: always() + run: npx sst unlock --stage ${{ env.STAGE_NAME }} + env: + AWS_PROFILE: '' + - name: Get preview URLs id: get_urls run: | diff --git a/specs/afk.sh b/specs/afk.sh index 56bc463..b888ebb 100755 --- a/specs/afk.sh +++ b/specs/afk.sh @@ -19,10 +19,24 @@ for ((i=1; i<=$1; i++)); do echo "=========================================" # Get fresh GitHub issues JSON each iteration (state may have changed) - ISSUES=$(gh issue list --state open --json number,title,body,comments) + # Filter out issues that already have open PRs (waiting for manual review) + # PRs can reference issues via: branch name (e.g., "39-..."), or PR body ("fixes #39", "closes #39") + gh pr list --state open --json headRefName,body > /tmp/pr_data.json + gh issue list --state open --json number,title,body,comments > /tmp/issues_raw.json + + # Filter issues and write to a file (avoids shell variable issues with JSON) + jq ' + [.[] | select( + (.number | tostring) as $num | + ($pr_data[0] | map( + (.headRefName | contains($num)) or + (.body | test("#\($num)"; "i")) + ) | any | not) + )] + ' --slurpfile pr_data /tmp/pr_data.json /tmp/issues_raw.json > /tmp/issues.json - # Check if there are any open issues - ISSUE_COUNT=$(echo "$ISSUES" | jq 'length') + # Check if there are any open issues (read count from file) + ISSUE_COUNT=$(jq 'length' /tmp/issues.json) if [ "$ISSUE_COUNT" -eq 0 ]; then echo "" echo "No open issues found. All work complete!" @@ -35,8 +49,9 @@ for ((i=1; i<=$1; i++)); do fi # Run OpenCode with build agent - # Pass issues JSON and prompt instructions - opencode run --agent build "Here are the open issues: $ISSUES + # Pass issues JSON file path and prompt instructions + opencode run --agent build "Here are the open issues (from /tmp/issues.json): +$(cat /tmp/issues.json) Follow the instructions in specs/prompt.md for task breakdown, selection, and execution." From 486e66e505099903fadfe570fa6ddbf1bd4514aa Mon Sep 17 00:00:00 2001 From: imharrisonking Date: Sat, 7 Mar 2026 21:00:20 +0000 Subject: [PATCH 07/10] fix(ci): add Cloudflare credentials to SST unlock steps Both sst unlock steps were missing CLOUDFLARE_API_TOKEN and CLOUDFLARE_DEFAULT_ACCOUNT_ID environment variables, causing the unlock command to fail with 'Cloudflare API not initialized' error. This fix ensures unlock can properly authenticate with Cloudflare to clear stale locks before/after deployment. --- .github/workflows/pr-preview-deploy.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/pr-preview-deploy.yml b/.github/workflows/pr-preview-deploy.yml index 03d57bf..4d20ca5 100644 --- a/.github/workflows/pr-preview-deploy.yml +++ b/.github/workflows/pr-preview-deploy.yml @@ -131,6 +131,8 @@ jobs: run: npx sst unlock --stage ${{ env.STAGE_NAME }} env: AWS_PROFILE: '' + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_DEFAULT_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_DEFAULT_ACCOUNT_ID }} - name: Deploy with SST run: npx sst deploy --stage ${{ env.STAGE_NAME }} @@ -144,6 +146,8 @@ jobs: run: npx sst unlock --stage ${{ env.STAGE_NAME }} env: AWS_PROFILE: '' + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }} + CLOUDFLARE_DEFAULT_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_DEFAULT_ACCOUNT_ID }} - name: Get preview URLs id: get_urls From 0858a588d262fe7f410c91e6f3825124bf0924c4 Mon Sep 17 00:00:00 2001 From: imharrisonking Date: Sat, 7 Mar 2026 21:11:28 +0000 Subject: [PATCH 08/10] fix(deps): remove platform-specific lightningcss-darwin-arm64 dependency The lightningcss-darwin-arm64 package was incorrectly added as a top-level devDependency, causing npm ci to fail on Linux CI runners with EBADPLATFORM error. This package is a platform-specific native binary that should only exist as an optionalDependency of lightningcss itself. npm will automatically install the correct platform-specific version based on the current OS and architecture. Changes: - Removed lightningcss-darwin-arm64 from devDependencies - Regenerated package-lock.json to properly mark platform-specific packages as optional This ensures the build works on: - macOS ARM64 (Apple Silicon) - macOS x64 (Intel Macs) - Linux x64 (CI runners) - Any other supported platforms --- package-lock.json | 323 ++++++++++++++++++++++++++++++++++++---------- package.json | 1 - 2 files changed, 257 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index ef66220..a8933ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,6 @@ "@tsconfig/node22": "^22", "@types/node": "^25.0.3", "husky": "^9.1.7", - "lightningcss-darwin-arm64": "^1.31.1", "lint-staged": "^15.5.2", "shadcn": "^3.8.5", "typescript": "^5.8.3", @@ -4269,7 +4268,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -4279,7 +4278,7 @@ "version": "5.1.21", "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.21.tgz", "integrity": "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@inquirer/core": "^10.3.2", @@ -4301,7 +4300,7 @@ "version": "10.3.2", "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@inquirer/ansi": "^1.0.2", @@ -4329,7 +4328,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -4339,7 +4338,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -4355,14 +4354,14 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -4372,7 +4371,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -4387,7 +4386,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -4400,7 +4399,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -4415,7 +4414,7 @@ "version": "1.0.15", "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -4425,7 +4424,7 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -4573,7 +4572,7 @@ "version": "0.41.3", "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.41.3.tgz", "integrity": "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@open-draft/deferred-promise": "^2.2.0", @@ -4645,7 +4644,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4662,7 +4660,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4679,7 +4676,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4696,7 +4692,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4713,7 +4708,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4730,7 +4724,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4747,7 +4740,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4764,7 +4756,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4902,14 +4893,14 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@open-draft/logger": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-node-process": "^1.2.0", @@ -4920,7 +4911,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@openauthjs/openauth": { @@ -5909,7 +5900,7 @@ "version": "1.58.2", "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "playwright": "1.58.2" @@ -11771,7 +11762,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.6.tgz", "integrity": "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@types/trusted-types": { @@ -13116,7 +13107,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "dev": true, + "devOptional": true, "license": "ISC", "engines": { "node": ">= 12" @@ -13133,7 +13124,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", @@ -13148,7 +13139,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -13158,7 +13149,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -13174,14 +13165,14 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/cliui/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -13191,7 +13182,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -13206,7 +13197,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -13219,7 +13210,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -15324,7 +15315,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, + "devOptional": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -15552,7 +15543,7 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.13.1.tgz", "integrity": "sha512-gGgrVCoDKlIZ8fIqXBBb0pPKqDgki0Z/FSKNiQzSGj2uEYHr1tq5wmBegGwJx6QB5S5cM0khSBpi/JFHMCvsmQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" @@ -15904,7 +15895,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/hono": { @@ -16470,7 +16461,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/is-number": { @@ -16922,6 +16913,26 @@ "lightningcss-win32-x64-msvc": "1.31.1" } }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lightningcss-darwin-arm64": { "version": "1.31.1", "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", @@ -16929,8 +16940,8 @@ "cpu": [ "arm64" ], - "devOptional": true, "license": "MPL-2.0", + "optional": true, "os": [ "darwin" ], @@ -16942,6 +16953,186 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -18412,7 +18603,7 @@ "version": "2.12.10", "resolved": "https://registry.npmjs.org/msw/-/msw-2.12.10.tgz", "integrity": "sha512-G3VUymSE0/iegFnuipujpwyTM2GuZAKXNeerUSrG2+Eg391wW63xFs5ixWsK9MWzr1AGoSkYGmyAzNgbR3+urw==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -18457,7 +18648,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -18471,7 +18662,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, + "devOptional": true, "license": "ISC", "engines": { "node": "^18.17.0 || >=20.5.0" @@ -19260,7 +19451,7 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/oxc-minify": { @@ -19564,7 +19755,7 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/pathe": { @@ -19762,7 +19953,7 @@ "version": "1.58.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "dependencies": { "playwright-core": "1.58.2" @@ -19781,7 +19972,7 @@ "version": "1.58.2", "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", - "dev": true, + "devOptional": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -21630,7 +21821,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -21738,7 +21929,7 @@ "version": "0.10.1", "resolved": "https://registry.npmjs.org/rettime/-/rettime-0.10.1.tgz", "integrity": "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/reusify": { @@ -22908,7 +23099,7 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/string-argv": { @@ -23215,7 +23406,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=20" @@ -23556,7 +23747,7 @@ "version": "7.0.25", "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.25.tgz", "integrity": "sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "tldts-core": "^7.0.25" @@ -23569,7 +23760,7 @@ "version": "7.0.25", "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.25.tgz", "integrity": "sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/to-regex-range": { @@ -23597,7 +23788,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "tldts": "^7.0.5" @@ -23745,7 +23936,7 @@ "version": "5.4.4", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", "integrity": "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==", - "dev": true, + "devOptional": true, "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -23976,7 +24167,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/until-async/-/until-async-3.0.2.tgz", "integrity": "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/kettanaito" @@ -24803,7 +24994,7 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, + "devOptional": true, "license": "ISC", "engines": { "node": ">=10" @@ -24834,7 +25025,7 @@ "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", @@ -24853,7 +25044,7 @@ "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, + "devOptional": true, "license": "ISC", "engines": { "node": ">=12" @@ -24863,7 +25054,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -24873,14 +25064,14 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/yargs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -24890,7 +25081,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -24905,7 +25096,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -24943,7 +25134,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" diff --git a/package.json b/package.json index 0343fd9..4b5bc25 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,6 @@ "@tsconfig/node22": "^22", "@types/node": "^25.0.3", "husky": "^9.1.7", - "lightningcss-darwin-arm64": "^1.31.1", "lint-staged": "^15.5.2", "shadcn": "^3.8.5", "typescript": "^5.8.3", From b9a5462d4a0a321bb85e61828248518a77ad4287 Mon Sep 17 00:00:00 2001 From: imharrisonking Date: Sat, 7 Mar 2026 21:26:25 +0000 Subject: [PATCH 09/10] fix(deps): force @noble/ciphers@2.1.1 via overrides The build was failing with: "managedNonce" is not exported by "@noble/ciphers/esm/utils.js" Root cause: Two versions of @noble/ciphers were installed: - v1.3.0 (from eciesjs) - does NOT export managedNonce - v2.1.1 (from better-auth) - DOES export managedNonce The bundler was resolving to v1.3.0 at the root level, causing the import error when building. Fix: Added @noble/ciphers to overrides in package.json to force v2.1.1 across all packages, ensuring the managedNonce export is always available. --- package-lock.json | 21 ++++----------------- package.json | 3 ++- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8933ef..7a31a53 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4766,13 +4766,12 @@ } }, "node_modules/@noble/ciphers": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", - "integrity": "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==", - "dev": true, + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.1.1.tgz", + "integrity": "sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==", "license": "MIT", "engines": { - "node": "^14.21.3 || >=16" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -12482,18 +12481,6 @@ } } }, - "node_modules/better-auth/node_modules/@noble/ciphers": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.1.1.tgz", - "integrity": "sha512-bysYuiVfhxNJuldNXlFEitTVdNnYUc+XNJZd7Qm2a5j1vZHgY+fazadNFWFaMK/2vye0JVlxV3gHmC0WDfAOQw==", - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/better-auth/node_modules/@noble/hashes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.0.1.tgz", diff --git a/package.json b/package.json index 4b5bc25..6760c83 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,8 @@ }, "overrides": { "react": "19.2.0", - "react-dom": "19.2.0" + "react-dom": "19.2.0", + "@noble/ciphers": "^2.1.1" }, "lint-staged": { "packages/core/**/*.{ts,tsx,js,jsx}": [ From 449a2c6a6496542f9eb7ce0fbb42674a0aa43fd9 Mon Sep 17 00:00:00 2001 From: imharrisonking Date: Sat, 7 Mar 2026 21:37:35 +0000 Subject: [PATCH 10/10] fix(types): resolve TypeScript errors after merge with production After merging with production, several type mismatches appeared: 1. OTPType - better-auth now supports 'change-email' OTP type - Updated OTPType in packages/backend/src/auth/email.tsx - Updated VerifyEmailProps in notifications/emails/VerifyEmail.tsx - Updated FormattedType class in notifications/utils/text.tsx - Added handling for change-email in sendVerificationOTP 2. Button component - restore isLoading, icon, isError props - Production's Button didn't have these props that were on the feature branch - Restored isLoading and icon from original feature branch - Added isError prop to support new onboarding component from production - All components using these props now type-check correctly --- packages/backend/src/auth/email.tsx | 10 +- packages/notifications/emails/VerifyEmail.tsx | 2 +- packages/notifications/utils/text.tsx | 8 +- packages/web/src/components/ui/button.tsx | 138 ++++++++++++------ 4 files changed, 114 insertions(+), 44 deletions(-) diff --git a/packages/backend/src/auth/email.tsx b/packages/backend/src/auth/email.tsx index 85b4741..baab4ff 100644 --- a/packages/backend/src/auth/email.tsx +++ b/packages/backend/src/auth/email.tsx @@ -10,7 +10,7 @@ import { VerifyEmail } from "../../../notifications/emails/VerifyEmail"; const ses = new SESv2Client(); -type OTPType = "sign-in" | "email-verification" | "forget-password"; +type OTPType = "sign-in" | "email-verification" | "forget-password" | "change-email"; type SendOTPProps = { email: string; otp: string; @@ -67,6 +67,14 @@ export async function sendVerificationOTP({ email, otp, type }: SendOTPProps) { }, ); subject = `${otp} - Structa Sign-up Verification`; + } else if (type === "change-email") { + emailHTML = await render( + VerifyEmail({ type: type, validationCode: otp, location }), + { + pretty: true, + }, + ); + subject = `${otp} - Structa Email Change Verification`; } else if (type === "forget-password") { throw new Error(`Unsupported OTP type: ${type}`); } else { diff --git a/packages/notifications/emails/VerifyEmail.tsx b/packages/notifications/emails/VerifyEmail.tsx index 6370c05..f8c9da8 100644 --- a/packages/notifications/emails/VerifyEmail.tsx +++ b/packages/notifications/emails/VerifyEmail.tsx @@ -14,7 +14,7 @@ import { import { FormattedType } from '../utils/text'; interface VerifyEmailProps { - type: 'sign-in' | 'email-verification' | 'forget-password'; + type: 'sign-in' | 'email-verification' | 'forget-password' | 'change-email'; validationCode: string; location?: { city: string; country: string } | null; } diff --git a/packages/notifications/utils/text.tsx b/packages/notifications/utils/text.tsx index 83f4cf3..240890a 100644 --- a/packages/notifications/utils/text.tsx +++ b/packages/notifications/utils/text.tsx @@ -1,7 +1,7 @@ export class FormattedType { public type; - constructor(type: "sign-in" | "email-verification" | "forget-password") { + constructor(type: "sign-in" | "email-verification" | "forget-password" | "change-email") { this.type = type; } @@ -13,6 +13,8 @@ export class FormattedType { return "sign up"; case "forget-password": return "reset your password"; + case "change-email": + return "change your email"; default: return "access your account"; } @@ -26,6 +28,8 @@ export class FormattedType { return "sign-up"; case "forget-password": return "forget password"; + case "change-email": + return "change-email"; default: return "access account"; } @@ -39,6 +43,8 @@ export class FormattedType { return "Sign-Up"; case "forget-password": return "Forget Password"; + case "change-email": + return "Change-Email"; default: return "Access Account"; } diff --git a/packages/web/src/components/ui/button.tsx b/packages/web/src/components/ui/button.tsx index d214605..81884ab 100644 --- a/packages/web/src/components/ui/button.tsx +++ b/packages/web/src/components/ui/button.tsx @@ -1,57 +1,113 @@ import { Slot } from "@radix-ui/react-slot"; import { cva, type VariantProps } from "class-variance-authority"; import * as React from "react"; +import { TwoBodyLoaderIcon } from "@/components/ui/loader"; import { cn } from "@/lib/utils"; const buttonVariants = cva( - "inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-none text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", - { - variants: { - variant: { - default: - "bg-primary text-primary-foreground shadow hover:bg-primary/90", - destructive: - "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", - outline: - "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", - secondary: - "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", - ghost: "hover:bg-sidebar-accent hover:text-primary dark:hover:bg-primary/5", - link: "text-primary underline-offset-4 hover:underline", - }, - size: { - default: "h-9 px-4 py-2", - sm: "h-8 rounded-md px-3 text-xs", - lg: "h-10 rounded-md px-8", - icon: "h-6 w-6 rounded-md p-1", - }, - }, - defaultVariants: { - variant: "default", - size: "default", - }, - }, + "group inline-flex items-center justify-center gap-1.5 whitespace-nowrap rounded-none font-medium hover:cursor-pointer ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:size-4 [&_svg]:shrink-0 transition-colors duration-300 ease-in-out", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-foreground", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + remove: + "border border-input bg-background text-text-secondary hover:bg-muted hover:text-text active:bg-muted", + outline: + "bg-background border border-input hover:bg-foreground hover:text-primary-foreground", + secondary: + "bg-secondary text-foreground hover:bg-foreground hover:text-primary-foreground", + ghost: + "hover:bg-ds-powder/40 hover:text-primary dark:hover:bg-primary/20 dark:hover:text-ds-powder", + ghostPrimary: + "text-primary hover:bg-ds-powder/40 hover:text-accent dark:hover:bg-primary/20 dark:hover:text-ds-powder", + link: "text-primary hover:text-primary transition-colors duration-200", + }, + size: { + default: "h-9 px-4 py-2 text-sm sm:text-base", + xs: "h-6 px-2 text-xs [&_svg]:size-3 [&_svg]:shrink-0", + sm: "h-7 px-3 text-sm gap-1", + lg: "h-9 px-4 text-sm sm:h-10 sm:px-7 sm:text-base gap-2", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, ); export interface ButtonProps - extends - React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean; + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; + isLoading?: boolean; + isError?: boolean; + icon?: React.ReactNode; } const Button = React.forwardRef( - ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : "button"; - return ( - - ); - }, + ( + { + className, + variant, + size, + asChild = false, + isLoading = false, + isError = false, + icon, + children, + ...props + }, + ref, + ) => { + const Comp = asChild ? Slot : "button"; + + // When using asChild, don't pass button-specific props like disabled + const componentProps = asChild + ? { + className: cn( + buttonVariants({ variant, size, className }), + isError && "bg-destructive text-destructive-foreground", + ), + } + : { + className: cn( + buttonVariants({ variant, size, className }), + isError && "bg-destructive text-destructive-foreground", + ), + ref, + disabled: isLoading || props.disabled, + ...props, + }; + + return ( + + {isLoading ? ( + <> + + +
{children}
+ + ) : variant === "link" ? ( + <> + {icon} + + {children} + + + ) : ( + <> + {icon} + {children} + + )} +
+ ); + }, ); Button.displayName = "Button";