Skip to content

Conversation

@ulrikandersen
Copy link
Contributor

@ulrikandersen ulrikandersen commented Jan 5, 2026

Description

Three new features:

  1. New diff sidebar showing changes to an OpenAPI specification (Diff sidebar #607, Add scroll-to-change navigation from diff sidebar #634)
  2. "Has changes" indicator in spec drop down (Add has-changes indicator for specs in PR branches #633)
  3. Loading indicator for project refresh (feat: add loading indicator when refreshing projects #640)

Motivation and Context

Screenshots (if appropriate):

Skærmbillede 2026-01-05 kl  10 37 31 Skærmbillede 2026-01-05 kl  10 37 58

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)

oscarlund121 and others added 16 commits December 8, 2025 09:01
Add diff sidebar

Shows changes to OpenAPI spec between two branches using the oasdiff tool.

---------

Co-authored-by: Ulrik Andersen <[email protected]>
* Add scroll-to-change navigation from diff sidebar

Clicking on a change in the diff sidebar now scrolls to that operation
in the documentation viewer. Supports all three visualizers:
- SwaggerUI: DOM-based scrolling with operation expansion
- Stoplight: Hash-based navigation
- Redocly: Hash set on iframe

Also removes unused DiffDialog component.

* refactor: remove unused hasChanges property from Selector items

* fix: prevent SwaggerUI panel from closing when clicking sidebar item

Check is-open class on the block element itself rather than a child
.opblock element, since SwaggerUI applies the class directly to the
operations-{tag}-{operationId} element.

* refactor: simplify scrollToSwaggerOperation with Array.find
Show a visual indicator (orange dot with tooltip) on specs that have
been modified in the current PR. Only specs whose filenames appear in
the PR's changed files list will display the indicator.

- Fetch changed files from PR via GraphQL
- Add changedFiles to GitHubRepositoryRef type
- Only set diffURL on specs in changedFiles
- Display subtle orange dot with "Has changes" tooltip
Move level labels above path for better visual hierarchy and increase
color saturation for better visibility.
The Selector component was updated to display an orange dot for specs
with changes, but TrailingToolbarItem and MobileToolbar weren't passing
the hasChanges property when mapping specifications.
…ocly (#637)

oasdiff provides method+path but not operationId. This change allows
scroll-to-change to work by deriving the operation ID from method and
path for SwaggerUI, and by searching for matching links in the Redocly
iframe.
Bumps [next](https://github.com/vercel/next.js) from 16.0.7 to 16.0.10.
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](vercel/next.js@v16.0.7...v16.0.10)

---
updated-dependencies:
- dependency-name: next
  dependency-version: 16.0.10
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Previously only listened to visibilitychange which fires on tab switch
but not when alt-tabbing back from another application. Now also
listens to window focus event.
Show a subtle spinner in the sidebar header when projects and versions
are being refreshed, with a tooltip explaining the action.
The encrypted URLs for remote specs contain random IVs, causing
different ciphertext on each refresh. This triggered unnecessary
state updates and re-renders, resetting the documentation viewer's
scroll position.

Add urlHash field computed from underlying remote config, and compare
projects by fingerprint (urlHash for remote specs, URL for others).
Bumps the react group with 2 updates: [react](https://github.com/facebook/react/tree/HEAD/packages/react) and [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom).


Updates `react` from 19.2.0 to 19.2.3
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.3/packages/react)

Updates `react-dom` from 19.2.0 to 19.2.3
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.3/packages/react-dom)

---
updated-dependencies:
- dependency-name: react
  dependency-version: 19.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: react-dom
  dependency-version: 19.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <[email protected]>
Bumps the everything-else group with 17 updates:

| Package | From | To |
| --- | --- | --- |
| [@mui/icons-material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-icons-material) | `7.3.5` | `7.3.6` |
| [@mui/material](https://github.com/mui/material-ui/tree/HEAD/packages/mui-material) | `7.3.5` | `7.3.6` |
| [@octokit/webhooks](https://github.com/octokit/webhooks.js) | `14.1.3` | `14.2.0` |
| [next](https://github.com/vercel/next.js) | `16.0.10` | `16.1.1` |
| [npm](https://github.com/npm/cli) | `11.6.4` | `11.7.0` |
| [swr](https://github.com/vercel/swr) | `2.3.7` | `2.3.8` |
| [zod](https://github.com/colinhacks/zod) | `4.1.13` | `4.3.4` |
| [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) | `4.1.17` | `4.1.18` |
| [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) | `24.10.1` | `25.0.3` |
| [@types/pg](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/pg) | `8.15.6` | `8.16.0` |
| [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) | `8.48.0` | `8.51.0` |
| [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) | `8.48.0` | `8.51.0` |
| [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) | `8.48.0` | `8.51.0` |
| [eslint](https://github.com/eslint/eslint) | `9.39.1` | `9.39.2` |
| [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) | `16.0.6` | `16.1.1` |
| [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) | `4.1.17` | `4.1.18` |
| [ts-jest](https://github.com/kulshekhar/ts-jest) | `29.4.5` | `29.4.6` |


Updates `@mui/icons-material` from 7.3.5 to 7.3.6
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v7.3.6/packages/mui-icons-material)

Updates `@mui/material` from 7.3.5 to 7.3.6
- [Release notes](https://github.com/mui/material-ui/releases)
- [Changelog](https://github.com/mui/material-ui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mui/material-ui/commits/v7.3.6/packages/mui-material)

Updates `@octokit/webhooks` from 14.1.3 to 14.2.0
- [Release notes](https://github.com/octokit/webhooks.js/releases)
- [Commits](octokit/webhooks.js@v14.1.3...v14.2.0)

Updates `next` from 16.0.10 to 16.1.1
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](vercel/next.js@v16.0.10...v16.1.1)

Updates `npm` from 11.6.4 to 11.7.0
- [Release notes](https://github.com/npm/cli/releases)
- [Changelog](https://github.com/npm/cli/blob/latest/CHANGELOG.md)
- [Commits](npm/cli@v11.6.4...v11.7.0)

Updates `swr` from 2.3.7 to 2.3.8
- [Release notes](https://github.com/vercel/swr/releases)
- [Commits](vercel/swr@v2.3.7...v2.3.8)

Updates `zod` from 4.1.13 to 4.3.4
- [Release notes](https://github.com/colinhacks/zod/releases)
- [Commits](colinhacks/zod@v4.1.13...v4.3.4)

Updates `@tailwindcss/postcss` from 4.1.17 to 4.1.18
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.18/packages/@tailwindcss-postcss)

Updates `@types/node` from 24.10.1 to 25.0.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@types/pg` from 8.15.6 to 8.16.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/pg)

Updates `@typescript-eslint/eslint-plugin` from 8.48.0 to 8.51.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.51.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.48.0 to 8.51.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.51.0/packages/parser)

Updates `typescript-eslint` from 8.48.0 to 8.51.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.51.0/packages/typescript-eslint)

Updates `eslint` from 9.39.1 to 9.39.2
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](eslint/eslint@v9.39.1...v9.39.2)

Updates `eslint-config-next` from 16.0.6 to 16.1.1
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.1/packages/eslint-config-next)

Updates `tailwindcss` from 4.1.17 to 4.1.18
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.18/packages/tailwindcss)

Updates `ts-jest` from 29.4.5 to 29.4.6
- [Release notes](https://github.com/kulshekhar/ts-jest/releases)
- [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md)
- [Commits](kulshekhar/ts-jest@v29.4.5...v29.4.6)

---
updated-dependencies:
- dependency-name: "@mui/icons-material"
  dependency-version: 7.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: everything-else
- dependency-name: "@mui/material"
  dependency-version: 7.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: everything-else
- dependency-name: "@octokit/webhooks"
  dependency-version: 14.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: everything-else
- dependency-name: next
  dependency-version: 16.1.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: everything-else
- dependency-name: npm
  dependency-version: 11.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: everything-else
- dependency-name: swr
  dependency-version: 2.3.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: everything-else
- dependency-name: zod
  dependency-version: 4.3.4
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: everything-else
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.1.18
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: everything-else
- dependency-name: "@types/node"
  dependency-version: 25.0.3
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: everything-else
- dependency-name: "@types/pg"
  dependency-version: 8.16.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: everything-else
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.51.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: everything-else
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.51.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: everything-else
- dependency-name: typescript-eslint
  dependency-version: 8.51.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: everything-else
- dependency-name: eslint
  dependency-version: 9.39.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: everything-else
- dependency-name: eslint-config-next
  dependency-version: 16.1.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: everything-else
- dependency-name: tailwindcss
  dependency-version: 4.1.18
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: everything-else
- dependency-name: ts-jest
  dependency-version: 29.4.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: everything-else
...

Signed-off-by: dependabot[bot] <[email protected]>
…45c185b5

Bump the react group with 2 updates
…ng-else-9c4dcef4e3

Bump the everything-else group with 17 updates
…t-refresh

Hotfix/preserve scroll on project refresh
@ulrikandersen ulrikandersen requested a review from simonbs as a code owner January 5, 2026 09:47
Copilot AI review requested due to automatic review settings January 5, 2026 09:47
@github-actions
Copy link

github-actions bot commented Jan 5, 2026

⚠️ It looks like .env.example has changed. Remember to update the Setting Environment Variables article accordingly.

@ulrikandersen ulrikandersen changed the title Release Deploy to production Jan 5, 2026
@ulrikandersen ulrikandersen changed the title Deploy to production Deploy to production 🚀 Jan 5, 2026
Copy link
Contributor

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

This PR introduces three main features to enhance the documentation experience: a diff sidebar for viewing OpenAPI specification changes, a "has changes" indicator in the specification dropdown, and a loading indicator for project refresh operations.

Key Changes

  • New diff sidebar with integration of the oasdiff CLI tool to compute and display specification changes
  • Enhanced GitHub API integration to fetch PR metadata and changed files for change detection
  • Project refresh improvements with fingerprinting to avoid unnecessary re-renders and window focus event handling

Reviewed changes

Copilot reviewed 46 out of 47 changed files in this pull request and generated 10 comments.

Show a summary per file
File Description
src/features/sidebar/view/internal/tertiary/RightContainer.tsx New right-side drawer component for the diff sidebar with responsive mobile/desktop variants
src/features/sidebar/view/internal/sidebar/Header.tsx Loading indicator with animated spinner and checkmark for project refresh feedback
src/features/sidebar/view/internal/diffbar/* Complete diff sidebar implementation including list components, diff data fetching, and level-based styling
src/features/sidebar/view/SecondarySplitHeader.tsx Toggle button for diff sidebar with keyboard shortcut (Cmd+K) and availability detection
src/features/diff/data/OasDiffCalculator.ts Core diff calculation logic using oasdiff CLI with URL validation for security
src/features/projects/data/GitHubRepositoryDataSource.ts PR data fetching via GraphQL to identify changed files across repositories
src/features/projects/data/GitHubProjectDataSource.ts URL hash generation for remote specs and diff URL construction for changed files
src/features/projects/view/ProjectsContextProvider.tsx Fingerprinting logic to prevent unnecessary state updates and window focus listener
src/features/projects/domain/* Extended domain models with diff-related fields (diffURL, diffBaseBranch, etc.)
src/common/github/* New compareCommitsWithBasehead method for finding merge base commits
src/app/api/diff/[owner]/[repository]/[...path]/route.ts API endpoint for calculating diffs between specification versions
Dockerfile Integration of oasdiff CLI tool installation
package.json Dependency updates (Next.js 16.1.1, React 19.2.3, various MUI and tooling updates)
__test__/diff/OasDiffCalculator.test.ts Comprehensive tests for URL validation and diff calculation

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

simonbs
simonbs previously approved these changes Jan 5, 2026
Rename project configuration filename in .env.example
@simonbs simonbs merged commit 9f3108f into main Jan 6, 2026
9 checks passed
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.

4 participants