Skip to content

feat(auth): add password visibility toggle#3752

Merged
PierreBrisorgueil merged 2 commits intomasterfrom
feat/password-visibility-toggle
Mar 21, 2026
Merged

feat(auth): add password visibility toggle#3752
PierreBrisorgueil merged 2 commits intomasterfrom
feat/password-visibility-toggle

Conversation

@PierreBrisorgueil
Copy link
Copy Markdown
Collaborator

@PierreBrisorgueil PierreBrisorgueil commented Mar 21, 2026

Summary

  • Add eye icon toggle on password fields in signin, signup, and reset views
  • Uses Vuetify append-inner-icon with mdi-eye / mdi-eye-off

Closes #336

Test plan

  • Verify eye icon appears on signin password field
  • Verify eye icon appears on signup password field
  • Verify eye icon appears on reset password field
  • Verify clicking toggles between text/password type

Summary by CodeRabbit

  • New Features

    • Password visibility toggle added to sign-in, sign-up, and password reset forms — click the eye icon to show/hide password text for easier verification.
  • Tests

    • Added unit tests verifying the password visibility toggle initializes hidden and correctly toggles on/off.

Copilot AI review requested due to automatic review settings March 21, 2026 14:18
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 21, 2026

Walkthrough

Added a password visibility toggle to three auth views (reset, signin, signup) via a new showPassword data property; updated password fields to switch type and appended icon based on that state. Corresponding unit tests were added to assert the toggle behavior.

Changes

Cohort / File(s) Summary
Auth view changes
src/modules/auth/views/reset.view.vue, src/modules/auth/views/signin.view.vue, src/modules/auth/views/signup.view.vue
Added showPassword: false to component data(). Password inputs now use :type="showPassword ? 'text' : 'password'", include a conditional append-inner icon (eye / eye-slash), and toggle showPassword on @click:append-inner.
Unit tests
src/modules/auth/tests/auth.reset.view.unit.tests.js, src/modules/auth/tests/auth.signin.view.unit.tests.js, src/modules/auth/tests/auth.signup.view.unit.tests.js
New tests added to verify showPassword initializes to false and toggles false → true → false on interaction.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (3 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description is incomplete. It lacks key sections from the template: detailed motivation, scope (modules/cross-module impact/risk level), and validation checklist results. Complete the PR description with template sections including: Why section explaining the motivation, Scope section identifying risk level and modules impacted, and Validation section with completed checklist items and manual test results.
Linked Issues check ⚠️ Warning The PR adds password visibility toggle functionality, but the linked issue #336 is a Vuetify dependency bump (2.2.15 to 2.2.17). The password toggle feature is unrelated to the dependency upgrade objective. Either replace the linked issue with the actual feature request for password visibility toggle, or move password toggle implementation to a separate PR addressing the correct issue.
Out of Scope Changes check ⚠️ Warning The PR changes three auth view files and adds unit tests, all focused on password visibility toggle implementation. However, this feature work is out of scope for the linked Vuetify dependency bump issue #336. Create a new issue tracking the password visibility toggle feature request and link this PR to it instead of issue #336, which is a dependency maintenance task.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The PR title 'feat(auth): add password visibility toggle' accurately describes the primary change of adding eye icon toggles to password fields.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/password-visibility-toggle

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds a password visibility toggle to the auth module’s password inputs (signin, signup, reset) using Vuetify text-field appended icons and a local showPassword state.

Changes:

  • Add showPassword state to each auth view.
  • Toggle <v-text-field> type between password and text based on showPassword.
  • Add an appended icon and click handler to toggle visibility.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 6 comments.

File Description
src/modules/auth/views/signup.view.vue Adds password visibility toggle UI/state to the signup password field.
src/modules/auth/views/signin.view.vue Adds password visibility toggle UI/state to the signin password field.
src/modules/auth/views/reset.view.vue Adds password visibility toggle UI/state to the reset password field.

Comment thread src/modules/auth/views/signin.view.vue
Comment thread src/modules/auth/views/reset.view.vue Outdated
Comment thread src/modules/auth/views/reset.view.vue
Comment thread src/modules/auth/views/signup.view.vue Outdated
Comment thread src/modules/auth/views/signup.view.vue
Comment thread src/modules/auth/views/signin.view.vue Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/modules/auth/views/reset.view.vue`:
- Line 60: Add unit tests for the showPassword behavior in the Reset component:
create tests that mount the reset.view.vue component, assert the initial
reactive property showPassword is false, simulate clicking the visibility toggle
element (the icon/button that flips showPassword) and assert showPassword
toggles, and verify the password input element's type prop changes between
"password" and "text" after each toggle; use the component's public template
selectors (the password input and the visibility toggle) and the showPassword
property to locate and assert state changes.

In `@src/modules/auth/views/signin.view.vue`:
- Line 120: Add unit tests for the SignInView component's password visibility
toggle to mirror the coverage gap in reset.view.vue: locate the showPassword
data property in SignInView (signin.view.vue) and add tests that assert
showPassword defaults to false, clicking the password-visibility toggle flips
showPassword, and the password input type changes between "password" and "text".
Implement these tests using the same selectors/assertions you use in ResetView
and factor the assertions into a shared test utility or a parameterized test
that runs the same behavior checks for SignInView, ResetView and RegisterView to
avoid duplication.

In `@src/modules/auth/views/signup.view.vue`:
- Line 177: The password toggle state "showPassword" is duplicated across auth
views; extract it into a shared composable (e.g., usePasswordToggle) that
returns a reactive showPassword ref and a togglePassword method, then replace
local showPassword wiring in SignupView (and the other auth views) to import and
use usePasswordToggle; ensure the composable exports the same symbol names
(showPassword, togglePassword) so existing template bindings and any tests
continue to work.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 66585316-0043-4cf4-bde5-6a77ce355989

📥 Commits

Reviewing files that changed from the base of the PR and between 025534a and ae18ff2.

📒 Files selected for processing (3)
  • src/modules/auth/views/reset.view.vue
  • src/modules/auth/views/signin.view.vue
  • src/modules/auth/views/signup.view.vue

Comment thread src/modules/auth/views/reset.view.vue
Comment thread src/modules/auth/views/signin.view.vue
Comment thread src/modules/auth/views/signup.view.vue
Switch append-inner-icon from mdi-eye/mdi-eye-off to fa-solid fa-eye/fa-solid fa-eye-slash
to match the project's FontAwesome icon set. Add password visibility toggle tests for all
three auth views (signin, reset, signup).
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/modules/auth/tests/auth.signin.view.unit.tests.js`:
- Around line 131-140: The test currently mutates wrapper.vm.showPassword
directly which makes the "toggles showPassword when clicking the append-inner
icon" name misleading; change it to simulate the real user action: use
mountView() to get the wrapper, locate the append-inner toggle element (e.g. the
icon or button used to toggle password visibility in the SignIn view, referenced
here as the append-inner toggle that flips wrapper.vm.showPassword), call the
DOM click trigger on that element (e.g. wrapper.find(<append-inner
selector>).trigger('click')) and await flushPromises()/wrapper.vm.$nextTick()
between assertions, then assert wrapper.vm.showPassword toggles true and false
accordingly instead of assigning it directly.

In `@src/modules/auth/tests/auth.signup.view.unit.tests.js`:
- Around line 144-153: The test "toggles showPassword when clicking the
append-inner icon" mutates wrapper.vm.showPassword directly instead of
exercising the click handler; update the test to simulate a real user click on
the append-inner icon (e.g., find the append-inner element via
wrapper.find('.v-input__icon--append-inner') or a data-testid and call
.trigger('click')) and then assert wrapper.vm.showPassword toggles, or if you
prefer keep the current implementation rename the spec to "showPassword toggles
correctly when mutated" to match the behavior; ensure you reference
wrapper.vm.showPassword and the append-inner selector you choose (e.g.,
'.v-input__icon--append-inner' or '[data-testid="append-inner"]') so the test
targets the correct element or is accurately named.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: c74e05b8-93b3-46a5-8c2f-884272008556

📥 Commits

Reviewing files that changed from the base of the PR and between ae18ff2 and d7724d0.

📒 Files selected for processing (6)
  • src/modules/auth/tests/auth.reset.view.unit.tests.js
  • src/modules/auth/tests/auth.signin.view.unit.tests.js
  • src/modules/auth/tests/auth.signup.view.unit.tests.js
  • src/modules/auth/views/reset.view.vue
  • src/modules/auth/views/signin.view.vue
  • src/modules/auth/views/signup.view.vue

Comment thread src/modules/auth/tests/auth.signin.view.unit.tests.js
Comment thread src/modules/auth/tests/auth.signup.view.unit.tests.js
@codecov
Copy link
Copy Markdown

codecov Bot commented Mar 21, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.19%. Comparing base (025534a) to head (d7724d0).
⚠️ Report is 1 commits behind head on master.

Additional details and impacted files
@@           Coverage Diff           @@
##           master    #3752   +/-   ##
=======================================
  Coverage   99.19%   99.19%           
=======================================
  Files          26       26           
  Lines         873      873           
  Branches      223      223           
=======================================
  Hits          866      866           
  Misses          7        7           

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

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@PierreBrisorgueil PierreBrisorgueil merged commit ea3b0a0 into master Mar 21, 2026
6 checks passed
PierreBrisorgueil pushed a commit that referenced this pull request Apr 1, 2026
# [1.5.0](v1.4.0...v1.5.0) (2026-04-01)

### Bug Fixes

* **analytics:** PostHog api_host bug + identify/group on login ([#3772](#3772)) ([534fdf3](534fdf3)), closes [#3753](#3753) [#3766](#3766) [#3769](#3769) [#3771](#3771)
* **auth,admin:** move mailer warning to admin page, fix verify-email routing, align invite button ([0d195c4](0d195c4))
* **auth:** add missing $route.query mock in verifyEmail tests ([b2732f6](b2732f6))
* **auth:** address CodeRabbit review feedback ([1d14b06](1d14b06))
* **auth:** address review feedback from pass 1 ([bd27d2f](bd27d2f))
* **auth:** address review feedback from pass 1 ([a87fdb1](a87fdb1))
* **auth:** address review feedback from pass 2 — prevent form flash on load ([a6afeca](a6afeca))
* **auth:** fix runtime deprecation warnings and add auth view unit tests ([1901dad](1901dad)), closes [#3592](#3592)
* **auth:** persist snackbar dismissal on implicit close ([5e464c3](5e464c3))
* **auth:** resolve lint errors and update test mocks for fetchServerConfig ([a642001](a642001))
* **billing:** add store unit tests and fix view import paths ([e370272](e370272))
* **billing:** address CodeRabbit review — guards, tests, JSDoc, price fallback ([f0f6657](f0f6657))
* **billing:** address CodeRabbit review feedback ([b195d2d](b195d2d))
* **billing:** address CodeRabbit review feedback ([8435d1c](8435d1c))
* **billing:** address CodeRabbit review feedback ([4187771](4187771))
* **billing:** address review — tier comparison, graceful failure, tests, naming ([7b00b91](7b00b91))
* **billing:** address review feedback — pricing card, fetch guard, router tests ([34cbda9](34cbda9))
* **billing:** address UI review findings ([b281a8a](b281a8a))
* **billing:** address UI review findings ([ead3eb0](ead3eb0))
* **billing:** address UI review findings ([b2d3897](b2d3897))
* **billing:** address UI review findings ([a756cd9](a756cd9))
* **billing:** align CASL guard subject with backend policy ([7e8287b](7e8287b))
* **billing:** align CASL guard subject with backend policy ([8e9b768](8e9b768))
* **billing:** correct plan field name, add enterprise badge, store cleanup ([#3733](#3733)) ([9b6e30d](9b6e30d)), closes [#3729](#3729) [#3730](#3730) [#3731](#3731) [#3732](#3732) [#3729](#3729) [#3730](#3730) [#3731](#3731) [#3732](#3732)
* **billing:** correct test URL assertions to match store checkout URLs ([cd64628](cd64628))
* **billing:** correct view import paths to match lowercase filenames ([e2646dd](e2646dd))
* **billing:** default free plan display + E2E security tests ([#3751](#3751)) ([025534a](025534a))
* **billing:** fix branch coverage and E2E auth guard test ([2864cf7](2864cf7))
* **billing:** fix branch coverage and harden E2E auth test ([7b91edb](7b91edb))
* **billing:** fix error-handling tests and restore CASL guard on /billing route ([bcb15a6](bcb15a6))
* **billing:** fix plan merge — match by planId/name and build price objects ([1c1c765](1c1c765))
* **billing:** gate fetchSubscription behind org check and add missing [@returns](https://github.com/returns) JSDoc ([9dd15a7](9dd15a7))
* **billing:** harden URL validation, test assertions, and error handling ([44d9cc2](44d9cc2))
* **billing:** include canceled query param in checkout cancel URL ([9e28636](9e28636))
* **billing:** propagate errors, add CASL route metadata, rename views ([39343ba](39343ba))
* **billing:** remove duplicate import in E2E test ([02576f5](02576f5))
* **billing:** rename views, fix test assertions, address review feedback ([cb72130](cb72130))
* **billing:** separate checkout error from fetch error in pricing view ([78db8b1](78db8b1))
* **billing:** update store cancel URL to include canceled query param ([ca5f1a3](ca5f1a3))
* **billing:** validate portal URL and catch fetchSubscription rejection ([7534b6c](7534b6c))
* **ci:** ensure coverage thresholds pass with all modules ([8e0c970](8e0c970)), closes [#3710](#3710)
* **ci:** remove ARC-specific conditionals from CI.yml ([#3806](#3806)) ([48747f3](48747f3)), closes [#3805](#3805)
* **config:** add missing api section to config.test.js ([#3679](#3679)) ([fff9ffc](fff9ffc)), closes [#3676](#3676)
* **config:** address review — use lodash-es, drop glob dep, add env warning ([1ec84fa](1ec84fa))
* **config:** address review feedback from pass 1 ([3336f09](3336f09))
* **config:** align app_title default between Dockerfile and hooks/build ([b08dbf3](b08dbf3))
* **config:** backward-compat fallback for sucessColor and improve warning ([1965557](1965557))
* **config:** fail fast when config is missing in production builds ([#3671](#3671)) ([c660ba4](c660ba4)), closes [#3669](#3669)
* **config:** generateConfig ignores module env-specific configs ([#3827](#3827)) ([1ffd80e](1ffd80e)), closes [#3826](#3826)
* **config:** remove [@desc](https://github.com/desc) tag from deepMerge JSDoc ([7c4b613](7c4b613))
* **config:** remove duplicate vuetify.theme block from app config merge ([5a583a7](5a583a7))
* **config:** remove unused imports and fix typo in generateConfig ([7b0c006](7b0c006))
* **config:** replace _.merge with deepMerge to fix array handling ([4e91025](4e91025)), closes [#3628](#3628)
* **config:** skip undefined values and guard against prototype pollution in deepMerge ([ffc574e](ffc574e))
* **config:** use pathToFileURL for cross-platform dynamic imports ([acad44e](acad44e))
* **core:** address review feedback from pass 1 ([0f6e3af](0f6e3af))
* **core:** make datatable generic via fetchAction prop ([e3a4926](e3a4926)), closes [#3596](#3596)
* **coverage:** exclude bootstrapper files with 0% coverage from collection ([4dfde5a](4dfde5a))
* **datatable:** increase per page select width to 100px ([#3779](#3779)) ([ff65d6f](ff65d6f)), closes [#3778](#3778)
* **docker:** add DEVKIT_NODE_api_port to docker-compose.test.yml ([#3815](#3815)) ([0f06402](0f06402)), closes [#3809](#3809)
* **docker:** make docker-compose.test.yml work for downstream projects ([#3790](#3790)) ([838aec1](838aec1)), closes [#3789](#3789)
* **docs:** add src/ prefix and use <env> placeholder in merge order table ([5af5d5b](5af5d5b))
* **docs:** mark global env override config files as optional ([7459d0f](7459d0f))
* **e2e:** read ports from project config instead of hardcoding ([#3777](#3777)) ([ec56d20](ec56d20)), closes [#3775](#3775)
* **header:** address review feedback from pass 1 ([b05d210](b05d210))
* **home,config:** address review feedback from pass 1 ([709ccbe](709ccbe))
* **home:** add JSDoc for tabs colorMode validator and tabStyle method ([a7fb5e3](a7fb5e3))
* **home:** add JSDoc to created() hook in home.team.view ([7548c15](7548c15))
* **home:** address CodeRabbit review feedback ([9990286](9990286))
* **home:** hero vertical centering, overlap prop, and Vuetify 4 typography migration ([4c26b25](4c26b25)), closes [#3587](#3587)
* **home:** pass colorMode to tabs component so forced text color applies to tab items ([50256d8](50256d8))
* **lodash:** use lodash-es imports for proper tree-shaking ([50570cf](50570cf))
* **nav:** fix organizations ghost item icon in sidenav ([bca4237](bca4237)), closes [#3706](#3706)
* **pull-request skill:** add consecutive_zero guard and re-check pending review checks ([18c70f8](18c70f8))
* **pull-request skill:** address review feedback — clarity and consistency ([2dd1ce2](2dd1ce2))
* **pull-request skill:** reply and resolve all threads including non-actionable ([ff776c8](ff776c8))
* **security:** harden auth views against XSS and weak validation ([#3735](#3735)) ([c3b844d](c3b844d))
* **seo-inject:** add JSON-LD structured data injection ([#3670](#3670)) ([5b36e5c](5b36e5c)), closes [#3664](#3664)
* **seo:** improve heading hierarchy and alt text for accessibility ([#3661](#3661)) ([918f9bd](918f9bd))
* **seo:** puppeteer prerender Docker support + minor plugin fixes ([#3673](#3673)) ([8ac241b](8ac241b))
* **seo:** skip runtime JSON-LD when seo-inject handles schema ([#3677](#3677)) ([#3680](#3680)) ([b0d90ac](b0d90ac))
* **skill:** add merge conflict check in pull-request convergence loop ([ef136ed](ef136ed)), closes [#3707](#3707)
* **skill:** address review feedback from pass 1 ([4020b82](4020b82))
* **skill:** handle CHANGES_REQUESTED, UNKNOWN mergeable, and standardize $PR usage ([13cb3cf](13cb3cf))
* **skill:** pull-request skill should ignore stack-level CodeRabbit comments for downstream projects ([97d2cb2](97d2cb2)), closes [#3604](#3604)
* **skills:** clarify feature Phase 0 completeness check ([#3773](#3773)) ([8ac6b1b](8ac6b1b))
* **skills:** match coderabbitai[bot] login in monitoring jq filter ([aae850f](aae850f))
* **update-stack:** add concrete gh issue create command and resolution guidance ([6092368](6092368))
* **update-stack:** add downstream-only new files rule to conflict table ([4a15e39](4a15e39))
* **update-stack:** address review feedback from pass 1 ([f7ed820](f7ed820))
* **update-stack:** address review feedback from pass 2 ([2bef8a3](2bef8a3))
* **update-stack:** clarify failure origin criteria in step 3bis ([a71515e](a71515e))

### Features

* add /frontend design skill + migrate Vuetify 3 patterns to V4 ([#3644](#3644)) ([2f2a8ff](2f2a8ff))
* **analytics:** add useFeatureFlag and usePostHog composables ([#3774](#3774)) ([2506a4f](2506a4f)), closes [#3771](#3771)
* **auth:** add email verification gate UI for org setup ([999aa60](999aa60))
* **auth:** add password visibility toggle ([#3752](#3752)) ([ea3b0a0](ea3b0a0)), closes [#336](#336)
* **auth:** display server-side auth status on signin/signup pages ([0f4276d](0f4276d))
* **billing:** add billing page with plan badge and subscription management ([e9a1fc5](e9a1fc5)), closes [#3715](#3715)
* **billing:** add BillingUsageBar component and enhance UpgradePrompt ([#3744](#3744)) ([0e9ca7f](0e9ca7f))
* **billing:** add checkout flow with auth/org guards and Stripe redirect ([ce17d67](ce17d67)), closes [#3714](#3714)
* **billing:** add checkout flow with auth/org guards and Stripe redirect ([f762d91](f762d91)), closes [#3714](#3714)
* **billing:** add feature gates — composable, upgrade prompt, router guard ([207c022](207c022)), closes [#3716](#3716)
* **billing:** add homepage pricing section ([a8ced6d](a8ced6d)), closes [#3717](#3717)
* **billing:** add pricing page with plan cards and billing toggle ([abb1d4a](abb1d4a)), closes [#3713](#3713)
* **billing:** add pricing page with plan cards and billing toggle ([0881a9f](0881a9f)), closes [#3713](#3713)
* **billing:** add useQuota composable for plan-based feature gating ([#3743](#3743)) ([85e2984](85e2984))
* **billing:** move pricing to dedicated page, update topnav ([eaab6f3](eaab6f3))
* **billing:** scaffold billing module with store, router, and views ([7b08b12](7b08b12)), closes [#3712](#3712)
* **ci:** skip setup-node and playwright install on self-hosted runner ([#3803](#3803)) ([104d4f8](104d4f8)), closes [#3802](#3802)
* **ci:** support configurable runner via RUNNER variable ([#3794](#3794)) ([1151d02](1151d02)), closes [#3792](#3792)
* **ci:** use APP_ENV variable for generateConfig in CI ([#3801](#3801)) ([e384c7c](e384c7c)), closes [#3795](#3795)
* **config:** migrate WAOS_VUE_* env prefix to DEVKIT_VUE_* ([7ad1a7f](7ad1a7f)), closes [#3614](#3614)
* **header:** add float scroll behavior and document all config options ([d1d4891](d1d4891))
* **home:** add dedicated 404 Not Found page ([#3655](#3655)) ([ac73739](ac73739))
* **home:** add FAQ accordion component with JSON-LD schema ([#3821](#3821)) ([444e62c](444e62c)), closes [#3819](#3819)
* **nav:** liquid glass sidenav with Apple-style inset mode ([#3737](#3737)) ([8203f2c](8203f2c))
* **pageHeader:** add tabs slot as alternative to icon + title ([#3781](#3781)) ([763d814](763d814)), closes [#3780](#3780)
* phase 2 organizations ([#3702](#3702)) ([71c6a5c](71c6a5c)), closes [#3674](#3674) [#3675](#3675) [#3684](#3684) [#3686](#3686) [#3681](#3681) [#3682](#3682) [#3683](#3683) [#3684](#3684) [#3685](#3685) [#3686](#3686) [#3675](#3675) [#3674](#3674)
* rename /frontend to /ui, add workflow rules ([#3704](#3704)) ([3d8259e](3d8259e))
* **sentry:** add Sentry error tracking and ErrorBoundary component ([#3788](#3788)) ([b5463d7](b5463d7)), closes [#3787](#3787)
* **seo-inject:** add noscript fallback, preconnect hints, and theme-color ([#3663](#3663)) ([261a3a8](261a3a8))
* **seo:** add pre-rendering of home page at build time ([#3660](#3660)) ([39d9414](39d9414))
* **seo:** add seo-static Vite plugin for robots.txt, sitemap.xml, manifest.json ([#3658](#3658)) ([0a50388](0a50388))
* **update-stack:** report upstream issues when verify fails on stack code ([71dbecc](71dbecc))
* **verify:** add coverage enforcement to verify skill ([#3776](#3776)) ([63301f9](63301f9))

### Performance Improvements

* **ci:** optimize GitHub Actions ([#3793](#3793)) ([e31287e](e31287e)), closes [#3791](#3791)
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.

2 participants