### Changes
- Adds a dismissible banner prompting paid org users to add a Tax ID to
their billing settings
- Only shown to users with billing read permissions on orgs with a paid
plan and no Tax ID set
- Dismissal is persisted per-org via localStorage; banner also
auto-hides when a Tax ID is added
### Testing
- Log in as a user with no billing permissions into a Free Plan Org with
no tax id: no banner is shown
- Log in as a user with billing permissions into a Free Plan Org with no
tax id: no banner is shown
- Log in as a user with billing permissions into a Paid Plan Org with no
tax id
- Assert banner appears at the top
- Head to `/org/_/billing` with a paid Org. Change your billing country
to a not support one (like Paraguay) and click save. Assert that the
banner disappears. Change it back to continue testing.
- Click dismiss: banner disappears and stays dismissed across
navigation/refresh
- Log in as a user with billing permissions into a different Paid Plan
Org with no tax id
- Add a Tax ID via billing settings, assert that the banner disappears
immediately
<img width="1911" height="50" alt="image"
src="https://github.com/user-attachments/assets/d6208d6d-0939-4ff6-9613-5c687e7c622e"
/>
## Context
PR mainly adds a change to allow users to dismiss an incident banner
Am also taking this time to consolidate `IncidentBanner` and
`MaintenanceBanner` into a single component `StatusPageBanner` so that
the logic for rendering either component is more clearer.
## Intended behaviour (should be covered by e2e tests)
- Incident banner shows if there are incidents with impact !== 'none'
- Incident banner still takes precedence over Maintanence banner (if
there's both incident + maintenence events)
- Dismissing the incident banner will subsequently show the maintenance
banner if the maintenance hasn't been dismissed before (just to make
sure that the user doesn't miss any comms)
- Incident banner will not be dismissible if there's an override (via
feature flag or env var)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Unified status page banner showing incident or maintenance
notifications, with dismissible banners that persist across sessions;
incident notices take precedence over maintenance.
* **Refactor**
* Replaced separate incident and maintenance banners with a single
consolidated StatusPageBanner component.
* **Tests**
* Added end-to-end tests covering banner visibility, precedence, and
dismissal behavior.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
## What kind of change does this PR introduce?
UI improvement
## What is the current behavior?
We show a non-dismissable, scary, _We are investigating a technical
issue_ banner to all users for very low priority things, like a
telecom-specific outage for users in Yemen. These `"impact": "none"`
events should not trigger the banner.
## What is the new behavior?
These `"impact": "none"` events no longer trigger the banner.
They _do_ still however show up in the support form and inform the AI
Assistant, so users can self-debug if relevant.
## To test
Override your `incident-status` response with the following:
```json
[{
"id": "79kw380212jb",
"name": "Regional network issues in Yemen",
"status": "identified",
"impact": "none",
"active_since": "2026-02-03T21:38:44Z"
}]
```
No banner should show. But the support form and AI Assistant should
still show their respective awareness of the Yemen outage.
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Enhanced incident notification system to improve accuracy and reduce
alert fatigue. Incident banners will now only display for incidents with
meaningful impact, filtering out inconsequential incidents from the
notification feed. This change provides users with clearer visibility
into issues that actually affect the platform.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
* Update support form status page button to use incident query + make maintenance banner dismissible
* Clean up
* Nit
* Attempt to fix tests
* Fix tests
* fix(studio): maintenance banner separate from incident banner
Right now, scheduled maintenance events also show up as incidents.
Created a separate banner for them so maintenance doesn't show up as an
incident.
Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
* Add a ClockSkewBanner on top of studio.
* Fix the color of the RestrictionBanner.
* Add an API endpoint which return the current UTC time on the server.
* Fix the glob pattern for docs in turbo.json.
* Force docs to build.
* Revert unneeded changes.
* Add feature flag for clock skew banner.
* Add a comment.
* Expand the org type with the new restriction fields.
* Add a badge to each org on the projects list if the org is over quota.
* Add a banner to each project belonging to an org which is over quota.
* Remove unneeded code.
* Add a restriction banner at the top of billing org tab.
* Correct the links to point to the correct page.
* Move the exceededLimits alert into the restriction component.
* Add an additional alert to the restriction component.
* chore: adjust copy on service restrictions
* Use gap instead of margin-right.
* Fix a bug in the ProjectList where the selectedOrg was used for all organizations.
* Small copy changes
* Small UI updates to restriction banner
* Hide links to documentation pages first
---------
Co-authored-by: Long Hoang <1732217+loong@users.noreply.github.com>
Co-authored-by: Joshen Lim <joshenlimek@gmail.com>
* Move all studio files from /studio to /apps/studio.
* Move studio specific prettier ignores.
* Fix the ui references from studio.
* Fix the css imports.
* Fix all package.json issues.
* Fix the prettier setup for the studio app.
* Add .turbo folder to prettierignore.
* Fix the github workflows.