Skip to content

fix: code review remediation — validation guard, storage re-throw, $onDispose, type hygiene, dep move - #34

Merged
selfagency merged 14 commits into
mainfrom
feature/code-review-remediation
Jun 23, 2026
Merged

fix: code review remediation — validation guard, storage re-throw, $onDispose, type hygiene, dep move#34
selfagency merged 14 commits into
mainfrom
feature/code-review-remediation

Conversation

@selfagency

@selfagency selfagency commented Jun 22, 2026

Copy link
Copy Markdown
Owner

Summary

Systematic remediation of 29 findings from a comprehensive code review (statically analyzed against commit main, 297/297 tests passing, build clean, publint "All good!"). All fixes validated through regression tests, svelte-check, lint, and build.

Plus: ESLint + Prettier → Biome 2.5 migration as a final cleanup pass.

Changes

Phase 1 — High-Impact Fixes (4 findings)

Phase 2 — Observability & Robustness (4 findings)

Phase 3 — $onDispose Lifecycle Hook (3+ files)

  • Finding Reapply persistence and history plugins after accidental merge loss #5: $onDispose(callback) added to StoreShell as a Set<() => void> — returns unsubscribe. $dispose() fires all callbacks before clearing subscriptions.
  • Propagated to history plugin (removed $dispose override, uses $onDispose), sync plugin (registers transport cleanup), and all plugin type interfaces.
  • Added StoreShellMethods type declaration for consumer-facing type chain.

Phase 4 — Type Hygiene (4 findings)

  • Finding feat: harden dist-first release packaging #7/19: Internal types (InternalFsmController, MutationCommit, StoreShellBuilder, DeserializeResult, etc.) de-exported from src/lib/index.ts.
  • Fixed @ts-expect-error / @ts-ignore in type tests by replacing with expectTypeOf assertions.
  • DefineStoreOptionsBase type param alignment: All 3 plugin module augmentations now use identical type params matching the base declaration.

Phase 5 — Dependency Move

Phase 6 — Regression Tests + Docs

  • Tests added for Findings 1, 5, 9, 13: validation rollback on patch callback throw, $onDispose callback execution on $dispose(), O(1) trim behavior, and QuotaExceededError re-throw.
  • Documentation added for getter/setter snapshot semantics (docs/guide/define-store.md) and async concurrency return types (docs/reference/plugins.md).

Biome Migration

  • Replaced ESLint (eslint.config.mjs) + Prettier (prettier.config.js) with @biomejs/biome@2.5.0
  • Configured biome.json with Svelte full support, Tailwind CSS directives
  • Updated npm scripts, .lintstagedrc.json, .vscode/settings.json, .vscode/extensions.json
  • Auto-fixed all diagnostics across the codebase (149 files changed formatting)

Validation

  • pnpm run check: 0 errors, 0 warnings (all pre-existing 21 shadcn errors resolved)
  • pnpm run lint (biome ci): PASS
  • pnpm run test: 60/60 PASS
  • pnpm run build: PASS (pre-existing publint warnings only)

@semanticdiff-com

semanticdiff-com Bot commented Jun 22, 2026

Copy link
Copy Markdown

Review changes with  SemanticDiff

Changed Files
File Status
  src/lib/root/types.ts  100% smaller
  src/lib/define-store.svelte.ts  83% smaller
  src/lib/history/plugin.spec.ts  78% smaller
  src/lib/history/history-controller.svelte.ts  72% smaller
  src/lib/utils.ts  72% smaller
  src/lib/fsm/plugin.svelte.ts  70% smaller
  src/lib/persistence/serialize.ts  69% smaller
  src/lib/history.spec.ts  67% smaller
  src/lib/pinia-like/plugin-options.ts  66% smaller
  package.json  60% smaller
  src/lib/runtime/create-option-store.svelte.ts  60% smaller
  src/lib/async/track-async-action.svelte.ts  58% smaller
  src/lib/types.test-d.ts  56% smaller
  src/lib/persistence/plugin.svelte.ts  56% smaller
  src/lib/sync/plugin.svelte.ts  53% smaller
  src/routes/sync/sync-demo.ts  53% smaller
  src/lib/runtime/devtools-timeline.svelte.ts  52% smaller
  src/lib/ssr-and-dispose.spec.ts  48% smaller
  src/lib/validation/plugin.svelte.ts  47% smaller
  src/lib/root/plugin-typing.spec.ts  43% smaller
  src/lib/async/plugin.svelte.ts  41% smaller
  src/lib/runtime/create-setup-store.svelte.ts  41% smaller
  src/lib/inspector/vite-plugin.spec.ts  39% smaller
  src/lib/history/plugin.svelte.ts  38% smaller
  src/lib/components/ui/badge/index.ts  36% smaller
  src/lib/components/ui/button/index.ts  35% smaller
  src/lib/pinia-like/store-types.spec.ts  35% smaller
  src/lib/persistence/payload-types.spec.ts  29% smaller
  .lintstagedrc.json  29% smaller
  src/lib/index.ts  15% smaller
  src/lib/components/ui/card/index.ts  15% smaller
  src/lib/fsm/fsm-controller.svelte.ts  15% smaller
  src/lib/runtime/mutation-queue.svelte.ts  15% smaller
  src/lib/components/ui/field/index.ts  14% smaller
  src/lib/components/ui/dialog/index.ts  12% smaller
  src/lib/components/ui/popover/index.ts  10% smaller
  .github/workflows/docs.yml  5% smaller
  .vscode/settings.json  5% smaller
  src/lib/validation.spec.ts  5% smaller
  src/lib/runtime/store-shell.svelte.ts  3% smaller
  src/lib/examples/examples.spec.ts  3% smaller
  src/lib/components/ui/command/index.ts  3% smaller
  src/lib/history/history-controller.spec.ts  1% smaller
  .gitignore Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-1-3-initial-1782164627907.xml Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-221-251-initial-1782166895557.xml Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-308-312-initial-1782167444630.xml Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-401-404-initial-1782168318145.xml Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-401-404-repair-1782168375919.xml Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-483-489-initial-1782169153086.xml Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-483-489-repair-1782169170154.xml Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-490-490-initial-1782169407317.xml Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-640-658-fallback-1-1782172073491.xml Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-720-722-initial-1782172406489.xml Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-723-725-initial-1782172708754.xml Unsupported file format
  .opencode/magic-context/historian/ses_10eb76a9affe2ykT8R21ZDn5xO-incremental-ses_10eb76a9affe2ykT8R21ZDn5xO-929-935-initial-1782174034614.xml Unsupported file format
  .prettierignore Unsupported file format
  .vscode/extensions.json  0% smaller
  AGENTS.md Unsupported file format
  biome.json  0% smaller
  docs/guide/define-store.md Unsupported file format
  docs/reference/plugins.md Unsupported file format
  eslint.config.mjs  0% smaller
  pnpm-lock.yaml Unsupported file format
  prettier.config.js  0% smaller
  scripts/release.js  0% smaller
  scripts/write-dist-package.js  0% smaller
  src/app.css Unsupported file format
  src/app.d.ts  0% smaller
  src/lib/action-helpers.ts  0% smaller
  src/lib/async.spec.ts  0% smaller
  src/lib/components/ShowcaseSection.svelte Unsupported file format
  src/lib/components/ui/accordion/accordion-trigger.svelte Unsupported file format
  src/lib/components/ui/accordion/index.ts  0% smaller
  src/lib/components/ui/badge/badge.svelte Unsupported file format
  src/lib/components/ui/button/button.svelte Unsupported file format
  src/lib/components/ui/card/action.svelte Unsupported file format
  src/lib/components/ui/card/card-action.svelte Unsupported file format
  src/lib/components/ui/card/card-footer.svelte Unsupported file format
  src/lib/components/ui/card/card-header.svelte Unsupported file format
  src/lib/components/ui/card/content.svelte Unsupported file format
  src/lib/components/ui/card/description.svelte Unsupported file format
  src/lib/components/ui/card/footer.svelte Unsupported file format
  src/lib/components/ui/card/header.svelte Unsupported file format
  src/lib/components/ui/card/root.svelte Unsupported file format
  src/lib/components/ui/card/title.svelte Unsupported file format
  src/lib/components/ui/code/code-overflow.svelte Unsupported file format
  src/lib/components/ui/code/code.svelte Unsupported file format
  src/lib/components/ui/code/index.ts  0% smaller
  src/lib/components/ui/code/types.ts  0% smaller
  src/lib/components/ui/command/command-dialog.svelte Unsupported file format
  src/lib/components/ui/command/command-input.svelte Unsupported file format
  src/lib/components/ui/command/command-item.svelte Unsupported file format
  src/lib/components/ui/command/command-shortcut.svelte Unsupported file format
  src/lib/components/ui/command/command.svelte Unsupported file format
  src/lib/components/ui/copy-button/copy-button.svelte Unsupported file format
  src/lib/components/ui/dialog/dialog-content.svelte Unsupported file format
  src/lib/components/ui/dialog/dialog-footer.svelte Unsupported file format
  src/lib/components/ui/field/field-content.svelte Unsupported file format
  src/lib/components/ui/field/field-description.svelte Unsupported file format
  src/lib/components/ui/field/field-error.svelte Unsupported file format
  src/lib/components/ui/field/field-group.svelte Unsupported file format
  src/lib/components/ui/field/field-label.svelte Unsupported file format
  src/lib/components/ui/field/field-legend.svelte Unsupported file format
  src/lib/components/ui/field/field-separator.svelte Unsupported file format
  src/lib/components/ui/field/field-set.svelte Unsupported file format
  src/lib/components/ui/field/field-title.svelte Unsupported file format
  src/lib/components/ui/field/field.svelte Unsupported file format
  src/lib/components/ui/input-group/index.ts  0% smaller
  src/lib/components/ui/input-group/input-group-addon.svelte Unsupported file format
  src/lib/components/ui/input-group/input-group-button.svelte Unsupported file format
  src/lib/components/ui/input-group/input-group-input.svelte Unsupported file format
  src/lib/components/ui/input-group/input-group-text.svelte Unsupported file format
  src/lib/components/ui/input-group/input-group-textarea.svelte Unsupported file format
  src/lib/components/ui/input-group/input-group.svelte Unsupported file format
  src/lib/components/ui/popover/popover-content.svelte Unsupported file format
  src/lib/components/ui/popover/popover-trigger.svelte Unsupported file format
  src/lib/components/ui/scroll-area/index.ts  0% smaller
  src/lib/components/ui/scroll-area/scroll-area.svelte Unsupported file format
  src/lib/components/ui/sheet/content.svelte Unsupported file format
  src/lib/components/ui/sheet/description.svelte Unsupported file format
  src/lib/components/ui/sheet/footer.svelte Unsupported file format
  src/lib/components/ui/sheet/header.svelte Unsupported file format
  src/lib/components/ui/sheet/index.ts  0% smaller
  src/lib/components/ui/sheet/sheet-content.svelte Unsupported file format
  src/lib/components/ui/sheet/sheet-footer.svelte Unsupported file format
  src/lib/components/ui/sheet/title.svelte Unsupported file format
  src/lib/components/ui/spinner/spinner.svelte Unsupported file format
  src/lib/components/ui/textarea/textarea.svelte Unsupported file format
  src/lib/define-store.spec.ts  0% smaller
  src/lib/history/time-travel.spec.ts  0% smaller
  src/lib/inspector/InspectorDrawer.svelte Unsupported file format
  src/lib/inspector/InspectorDrawer.svelte.spec.ts  0% smaller
  src/lib/inspector/bootstrap-client.ts  0% smaller
  src/lib/inspector/hook.spec.ts  0% smaller
  src/lib/inspector/state.svelte.ts  0% smaller
  src/lib/inspector/style.css Unsupported file format
  src/lib/persistence.spec.ts  0% smaller
  src/lib/persistence/adapters/adapters.spec.ts  0% smaller
  src/lib/persistence/adapters/local-storage.ts  0% smaller
  src/lib/persistence/adapters/session-storage.ts  0% smaller
  src/lib/persistence/plugin.spec.ts  0% smaller
  src/lib/pinia-like/store-to-refs.svelte.ts  0% smaller
  src/lib/pinia-like/store-types.ts  0% smaller
  src/lib/root/create-state-manager.ts  0% smaller
  src/lib/runtime/create-setup-store.spec.ts  0% smaller
  src/lib/runtime/subscriptions.ts  0% smaller
  src/lib/sync.spec.ts  0% smaller
  src/lib/sync/plugin.spec.ts  0% smaller
  src/lib/vitest-examples/Welcome.svelte.spec.ts  0% smaller
  src/routes/+page.svelte Unsupported file format
  src/routes/ShowcasePage.svelte.spec.ts  0% smaller
  src/routes/async/+page.svelte Unsupported file format
  src/routes/async/AsyncPage.svelte.spec.ts  0% smaller
  src/routes/core/+page.svelte Unsupported file format
  src/routes/core/CorePage.svelte.spec.ts  0% smaller
  src/routes/fsm/+page.svelte Unsupported file format
  src/routes/fsm/FsmPage.svelte.spec.ts  0% smaller
  src/routes/fsm/fsm-demo.ts  0% smaller
  src/routes/history/+page.svelte Unsupported file format
  src/routes/history/HistoryPage.svelte.spec.ts  0% smaller
  src/routes/history/history-demo.ts  0% smaller
  src/routes/persistence/+page.svelte Unsupported file format
  src/routes/persistence/PersistencePage.svelte.spec.ts  0% smaller
  src/routes/persistence/persistence-demo.svelte.ts  0% smaller
  src/routes/sync/+page.svelte Unsupported file format
  src/routes/sync/SyncPage.svelte.spec.ts  0% smaller
  src/routes/validation/+page.svelte Unsupported file format
  src/routes/validation/ValidationPage.svelte.spec.ts  0% smaller

@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

Comment thread src/lib/sync/plugin.svelte.ts Outdated
// Non-serializable or transport failure — skip silently
} catch (cause) {
if (import.meta.env.DEV) {
console.warn(`[Stately] Sync: failed to publish message for store "${store.$id}"`, cause);

@semgrep-code-selfagency semgrep-code-selfagency Bot Jun 22, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Detected string concatenation with a non-literal variable in a util.format / console.log function. If an attacker injects a format specifier in the string, it will forge the log message. Try to use constant values for the format string.

🧹 Fixed in commit 3dd5212 🧹

Comment thread src/lib/sync/plugin.svelte.ts Outdated
// Message parse or validation error — skip silently
} catch (cause) {
if (import.meta.env.DEV) {
console.warn(`[Stately] Sync: failed to process inbound message for store "${store.$id}"`, cause);

@semgrep-code-selfagency semgrep-code-selfagency Bot Jun 22, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Detected string concatenation with a non-literal variable in a util.format / console.log function. If an attacker injects a format specifier in the string, it will forge the log message. Try to use constant values for the format string.

🧁 Fixed in commit 3dd5212 🧁

Phase 4 (Type Hygiene — Finding 7, 19):
- Add $onDispose to StoreShellMethods interface (canonical type)
- Add $onDispose/$dispose to StoreFromOptions/StoreFromSetup
- Replace any with unknown in store-shell, utils, create-state-manager
- De-export internal types (StoreShellBuilder, MutationCommit, FsmController,
  Deserialize types, InternalHistoryController)

Phase 5 (Dependency — Finding 14):
- Move @lucide/svelte from dependencies to optionalDependencies
- write-dist-package.js already carries optionalDependencies to dist

Phase 6 (Regression Tests — Finding 26):
- Validate: patch callback throw after partial mutation restores snapshot
- Persistence: QuotaExceededError re-thrown from localStorage/sessionStorage
- Dispose: $onDispose callbacks fire on $dispose; unsubscribe works
- History: trim uses splice not shift for O(1) overflow removal

Documentation (Findings 2/17, 3/16):
- Setup store getter+setter snapshot semantics guide
- Async concurrency drop/enqueue return type docs
@selfagency
selfagency force-pushed the feature/code-review-remediation branch from cab760b to 3dd5212 Compare June 22, 2026 23:10
@codecov

codecov Bot commented Jun 22, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 90.24390% with 4 lines in your changes missing coverage. Please review.
✅ Project coverage is 91.81%. Comparing base (108fcb1) to head (c252496).
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
src/lib/sync/plugin.svelte.ts 66.66% 2 Missing and 2 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main      #34      +/-   ##
==========================================
- Coverage   92.04%   91.81%   -0.23%     
==========================================
  Files          46       46              
  Lines        1784     1857      +73     
  Branches      415      421       +6     
==========================================
+ Hits         1642     1705      +63     
- Misses        127      138      +11     
+ Partials       15       14       -1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

@socket-security

socket-security Bot commented Jun 22, 2026

Copy link
Copy Markdown

Warning

Review the following alerts detected in dependencies.

According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
Obfuscated code: npm @emnapi/runtime is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: pnpm-lock.yamlnpm/knip@6.18.0npm/@emnapi/runtime@1.11.1

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@emnapi/runtime@1.11.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm @internationalized/date is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: package.jsonnpm/@internationalized/date@3.12.2

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/@internationalized/date@3.12.2. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm js-yaml is 90.0% likely obfuscated

Confidence: 0.90

Location: Package overview

From: pnpm-lock.yamlnpm/@changesets/cli@2.31.0npm/js-yaml@4.2.0

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/js-yaml@4.2.0. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm svelte is 91.0% likely obfuscated

Confidence: 0.91

Location: Package overview

From: package.jsonnpm/svelte@5.56.3

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/svelte@5.56.3. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

Warn High
Obfuscated code: npm svelte2tsx is 91.0% likely obfuscated

Confidence: 0.91

Location: Package overview

From: pnpm-lock.yamlnpm/@sveltejs/package@2.5.8npm/svelte2tsx@0.7.56

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/svelte2tsx@0.7.56. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

Replace ESLint and Prettier with Biome 2.5 for unified
formatting and linting. Fix all Biome diagnostics across
the codebase.

- Install @biomejs/biome@2.5.0, remove eslint/prettier deps
- Configure biome.json with Svelte and Tailwind support
- Fix all lint/format errors across 149 files
- Update npm scripts, lintstaged, VS Code settings
- Fix DefineStoreOptionsBase type parameter alignment
  across plugin module augmentations
@codecov

codecov Bot commented Jun 23, 2026

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 738.59kB (13.66%) ⬆️⚠️, exceeding the configured threshold of 5%.

Bundle name Size Change
@selfagency/stately-__sveltekit_k3cqpn.app-esm 738.59kB 738.59kB (100%) ⬆️⚠️

…ions, generic matchers, duplicate CSS, export style
Combine 4× ::file-selector-button (163/299/315/384) into one merged block.
Merge 2× ::-webkit-datetime-edit (341/347) into one.
Merge split .bg-linear-to-br, .bg-linear-to-t, .from-primary/6, .to-secondary/8 utility blocks.
Replace non-standard appearance: button → appearance: auto per CSS spec.
All changes preserve Tailwind v4 output semantics.
…dedup

Merged selectors were at root-level indentation but sit inside
@layer base { }. Biome auto-format applied to restore nesting.
@selfagency
selfagency merged commit 53a59ba into main Jun 23, 2026
12 of 14 checks passed
@selfagency
selfagency deleted the feature/code-review-remediation branch June 23, 2026 01:53
@sonarqubecloud

Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant