Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
05f34d3
4.2.0-rc4
jamesmisson May 16, 2025
4dde9c9
4.2.0-rc4
jamesmisson May 16, 2025
6a30f4b
Add interactive configuration editor (#1411)
LlGC-mag Jun 4, 2025
1ac9c36
Add back the ? in embed url (#1440)
LlGC-jop Jun 4, 2025
e711472
Bump @eslint/js from 9.27.0 to 9.28.0 (#1444)
dependabot[bot] Jun 9, 2025
c843479
Merge remote-tracking branch 'upstream/release-4.2.0' into release-4.2.0
jamesmisson Jun 10, 2025
3ac556d
4.2.0
jamesmisson Jun 10, 2025
dc132c5
Merge branch 'release-4.2.0' into dev
jamesmisson Jun 10, 2025
f252551
Stylelint install and config (#1427)
LlGC-jop Jun 11, 2025
fec2545
Regenerate documentation.
demiankatz Jun 12, 2025
c79c95a
Add JS files for deployment to GitHub Pages.
demiankatz Jun 13, 2025
b098b1a
Merge branch 'main' into dev
demiankatz Jun 13, 2025
4291bce
Raise Node version to 20 in package.json and GitHub Actions. (#1448)
demiankatz Jun 13, 2025
e729c5f
Bump @google/model-viewer from 4.0.0 to 4.1.0 (#1452)
dependabot[bot] Jun 16, 2025
cf31503
Fix Open Button (#1450)
Saira-A Jun 16, 2025
3b0c13c
Remove redundant config options (#1451)
Saira-A Jun 16, 2025
b9a098c
Remove trimAttributionCount configuration option (#1456)
Saira-A Jun 20, 2025
8c37de8
Remove instructionsEnabled, optionsExplanatoryTextEnabled and seeAlso…
Saira-A Jun 23, 2025
8667524
removing shareFrameEnabled config option
404mike Jun 23, 2025
af7d97d
Merge pull request #1459 from UniversalViewer/removeShareFrameEnabled
LlGC-mij Jun 24, 2025
38ed127
Bump typedoc from 0.27.6 to 0.28.5 (#1458)
dependabot[bot] Jun 24, 2025
54ce630
Bump pbkdf2 from 3.1.2 to 3.1.3 (#1460)
dependabot[bot] Jun 24, 2025
91c50dd
remove pagingEnabled from config (#1461)
Saira-A Jun 25, 2025
fdb663d
remove currentViewDisabledPercentage(#1465)
Saira-A Jun 26, 2025
2577eaa
Introduce configuration documentation (#1419)
Saira-A Jun 30, 2025
083c9e6
Bump react-intersection-observer from 9.13.1 to 9.16.0 (#1468)
dependabot[bot] Jun 30, 2025
7acc78d
Upgrade iiif-metadata-component to v1.2.2. (#1471)
demiankatz Jun 30, 2025
3ee2eec
Update README.md (#1469)
mialondon Jul 1, 2025
03e798b
4.2.1
demiankatz Jul 1, 2025
61de2b4
Merge branch 'release-4.2' into dev
demiankatz Jul 1, 2025
82185ad
Returns iiif metadata component behavior to main application (#1463)
K8Sewell Jul 1, 2025
b951b26
Apply linting and formatting to scripts and tests (#1477)
demiankatz Jul 2, 2025
5f06234
Consolidate iiif-tree-component into UV (#1481)
jamesmisson Jul 3, 2025
2dbe8fe
Reincorporate iiif gallery component back into main application (#1472)
K8Sewell Jul 4, 2025
66896bf
Bump typescript from 5.8.2 to 5.8.3 (#1494)
dependabot[bot] Jul 7, 2025
9a19df4
fix broken hyperlink (#1493)
Saira-A Jul 7, 2025
bd427d9
Fix loading of audio/mpeg MIME type (fixes #964). (#1490)
demiankatz Jul 7, 2025
ac8db56
Remove prettier-check dependency. (#1491)
demiankatz Jul 7, 2025
44c19ec
Bump typescript-eslint from 8.32.1 to 8.36.0 (#1497)
dependabot[bot] Jul 14, 2025
4f98b0e
Simplify examples page (#1489)
Saira-A Jul 14, 2025
72013bd
Upgrade to Manifesto v4.2.22 and Manifold v2.1.2. (#1498)
demiankatz Jul 14, 2025
cd9151e
Architecture (manual) merge into dev (#1499)
LlGC-jop Jul 17, 2025
d55d4cf
JqueryPlugins, HTTPStatusCodes and KeyCodes rolled into uv (#1500)
Geoffsc Jul 17, 2025
68d0043
Bump on-headers and compression (#1504)
dependabot[bot] Jul 18, 2025
bb8c598
Bump @eslint/plugin-kit from 0.3.1 to 0.3.3 (#1506)
dependabot[bot] Jul 19, 2025
c85362f
Bump zustand from 5.0.3 to 5.0.6 (#1507)
dependabot[bot] Jul 21, 2025
c3d43f2
Fix examples page on mobile (#1509)
Saira-A Jul 23, 2025
97c0bf0
Correctly route PNG images to OpenSeadragon. (#1512)
demiankatz Jul 24, 2025
b0fca88
Bump webpack-cli from 5.1.4 to 6.0.1 (#1513)
dependabot[bot] Jul 28, 2025
284c0a2
Bump @eslint/plugin-kit from 0.3.3 to 0.3.4 (#1515)
dependabot[bot] Jul 29, 2025
923fe2a
Expose OpenSeadragon tile timeout option (#1514)
skairunner Jul 29, 2025
22ca249
Update assorted dependencies. (#1516)
demiankatz Jul 31, 2025
0aaa6cb
Bump copy-webpack-plugin from 12.0.2 to 13.0.0 (#1521)
dependabot[bot] Aug 5, 2025
3a3ed4e
Bump classnames from 2.3.2 to 2.5.1 (#1522)
dependabot[bot] Aug 11, 2025
3e34329
Improve PDF.js zoom functionality; add configurability (#1518)
demiankatz Aug 15, 2025
4eb49e3
Avoid disabling all downloads on high res disable (#1525)
sarangj Aug 16, 2025
c8bf580
remove unused html files (#1524)
Geoffsc Aug 18, 2025
d78679a
Rolling Edsilv/utils into the uv (#1505)
Geoffsc Aug 18, 2025
8eeee24
Bump actions/checkout from 4 to 5 (#1527)
dependabot[bot] Aug 18, 2025
343f897
Bump sha.js from 2.4.11 to 2.4.12 (#1531)
dependabot[bot] Aug 21, 2025
cd4c3f1
Bump cipher-base from 1.0.4 to 1.0.6 (#1532)
dependabot[bot] Aug 21, 2025
14133a2
Improve Inactive Tab Readability (#1533)
K8Sewell Aug 26, 2025
1803ee1
Fire IIIF.DOWNLOAD for openseadragon downloads (#1530)
sarangj Aug 26, 2025
bd51a2f
Restore missing title attribute for collapse button (addresses #1496)…
LlGC-jop Sep 4, 2025
8fc6410
Bump actions/setup-node from 4 to 5 (#1535)
dependabot[bot] Sep 8, 2025
efde6dc
Merged the latest changes from the UV 4 dev branch.
ra-anders Sep 16, 2025
f7c9ec2
Minor changes after merge.
ra-anders Sep 16, 2025
2ad05ac
Merge remote-tracking branch 'upstream/dev' into feature/21991-merge-…
ra-anders Sep 16, 2025
1ee3069
Commit from GitHub Actions (Lint and Prettify code)
github-actions[bot] Sep 16, 2025
4888de7
More fixes after merge.
ra-anders Sep 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/build-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,19 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
node: [ '18' ]
node: [ '20' ]

name: Node ${{ matrix.node }} build
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-${{ matrix.node }}-npm-${{ hashFiles('**/package-lock.lock') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Setup node
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: ${{ matrix.node }}

Expand Down
11 changes: 7 additions & 4 deletions .github/workflows/lint-and-prettify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,21 @@ jobs:

steps:
- name: Setup Node
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: '18'
node-version: "20"

- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5

- name: Install npm dependencies
run: npm install

- name: Lint code
run: npm run lint
run: npm run lint-code

- name: Lint styles
run: npm run lint-styles

- name: Prettify code
run: npm run prettify
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,17 @@ jobs:
runs-on: ubuntu-latest
name: Node build
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-${{ matrix.node }}-npm-${{ hashFiles('**/package-lock.lock') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Setup node
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: '18.x'
node-version: '20.x'
- run: npm ci
- run: npm run build

Expand All @@ -28,17 +28,17 @@ jobs:
runs-on: ubuntu-latest
name: Release
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-${{ matrix.node }}-npm-${{ hashFiles('**/package-lock.lock') }}
restore-keys: |
${{ runner.os }}-npm-
- name: Setup node
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: '18.x'
node-version: '20.x'

- name: Set tag
id: tagName
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ node_modules
src/extensions/*/lib/*.js
!src/extensions/*/lib/*.proxy.js
!src/extensions/*/config.js
!docs/assets/*.js

#################
## Misc
Expand Down
26 changes: 26 additions & 0 deletions .stylelintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"customSyntax": "postcss-less",
"extends": ["stylelint-config-standard-less"],
"plugins": ["stylelint-less"],
"rules": {
"block-no-empty": true,
"at-rule-no-unknown": null,
"color-no-invalid-hex": true,
"less/color-no-invalid-hex": null,
"rule-empty-line-before": null,
"selector-class-pattern": null,
"selector-id-pattern": null,
"declaration-empty-line-before": null,
"property-no-vendor-prefix": null,
"no-duplicate-selectors": null,
"no-descending-specificity": null,
"font-family-no-duplicate-names": null,
"font-family-no-missing-generic-family-keyword": null,
"selector-pseudo-element-no-unknown": null,
"selector-pseudo-class-no-unknown": null,
"declaration-block-no-duplicate-custom-properties": null,
"function-linear-gradient-no-nonstandard-direction": null,
"media-feature-name-no-unknown": null,
"media-feature-range-notation": "prefix"
}
}
5 changes: 5 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
},
"typescript.check.workspaceVersion": false,
"typescript.tsdk": "node_modules\\typescript\\lib",
"css.validate": false,
"less.validate": false,
"scss.validate": false,
"stylelint.customSyntax": "postcss-less",
"stylelint.validate": ["css", "less"],
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"prettier.requireConfig": true,
Expand Down
2 changes: 2 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ UV source code lives inside the `/src/` folder.

Here is a [diagram](https://docs.google.com/drawings/d/1i484Jd32FoLwtE5uvkBA6l5LV-DioSOZDIWD0WfhWl8/edit?usp=sharing) showing the overall architecture of the project.

For more in-depth information on the application structure please see the [manual](https://github.com/UniversalViewer/universalviewer/blob/dev/manual/index.md).

## Running the test suite

Before commiting your changes make sure tests are passing:
Expand Down
56 changes: 35 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@ A community-developed open source project on a mission<br/> to help you share yo
</a>
</p>
<p align="center"><a href="https://docs.google.com/forms/d/e/1FAIpQLSeHLD0kng5aXvGFsNN_tJGsZMTnp08Hv2F6kdGsJRb6bT0NWw/viewform" rel="nofollow"><strong>#</strong> Slack
</a> &nbsp;&nbsp;&nbsp;&nbsp;<a href="https://bsky.app/profile/universalviewer.io"> <strong>@</strong> Bluesky</a> &nbsp;&nbsp;&nbsp;&nbsp;<a href="https://x.com/universalviewer"> <strong>@</strong> X</a> &nbsp;&nbsp;&nbsp;&nbsp; <a href="https://glammr.us/@universalviewer"> <strong>@</strong> Mastodon </a>&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://github.com/UniversalViewer/universalviewer/wiki"> About </a> </p>
</a> &nbsp;&nbsp;&nbsp;&nbsp;<a href="https://bsky.app/profile/universalviewer.io"> <strong>@</strong> Bluesky</a> &nbsp;&nbsp;&nbsp;&nbsp;<a href="https://x.com/universalviewer"> <strong>@</strong> X</a> &nbsp;&nbsp;&nbsp;&nbsp; <a href="https://glammr.us/@universalviewer"> <strong>@</strong> Mastodon </a>&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://github.com/UniversalViewer/universalviewer/wiki"> History of the UV </a> </p>

# The Universal Viewer (UV) is a community-developed open source project. Our mission is to help you share your content with the world

The UV software can display images, 3D files and PDFs, play audio and video files, and more.

<br/>

Expand All @@ -33,11 +37,10 @@ A community-developed open source project on a mission<br/> to help you share yo

- [**Website**](#-website)
- [**Getting Started**](#-getting-started)
- [**Contributing**](#-contributing)
- [**Sponsors**](#-sponsors)
- [**License**](#-license)
- [**Contributing and Giving Feedback**](#-contributing-and-giving-feedback)
- [**Contributors and Sponsors**](#-contributors-and-sponsors)
- [**Accessibility Statement**](#-accessibility-statement)
- [**Feedback**](#-feedback)
- [**License**](#-license)

## 🌐 Website

Expand All @@ -52,37 +55,48 @@ See the [examples](https://github.com/UniversalViewer/universalviewer/wiki/UV-Ex

Read the technical [docs](https://docs.universalviewer.io/modules.html) to learn more about the code and available configuration options.

## 💻 Contributing
Read the [manual](https://github.com/UniversalViewer/universalviewer/blob/dev/manual/index.md) for information on using, configuring, and developing for the UV.

Read below to learn how to take part in improving the UV:
<a id="feedback"></a>
<a id="contributing"></a>
## 📣 Contributing and Giving Feedback

- Fork the repository and [run the examples from source](#-getting-started)
An active, collaborative community of testers, developers and institutional users has grown around the Universal Viewer. Read this [blog post about a recent 'community sprint'](https://blogs.bl.uk/digital-scholarship/2024/11/working-together-the-community-sprint-experience-.html) to find out more about how we're working together.

Talking to active contributors and sponsors is a great way to find out what the community is currently focusing on, and where help is needed:

- Join the discussion on [Slack](http://universalviewer.io/#contact)
- There is an [active Slack channel](https://docs.google.com/forms/d/e/1FAIpQLSeHLD0kng5aXvGFsNN_tJGsZMTnp08Hv2F6kdGsJRb6bT0NWw/viewform) and regular community calls.
- You can view discussions and post on our [Google Group](https://groups.google.com/forum/#!forum/universalviewer)
- Ask a question, request a new feature and file a bug with [GitHub issues](https://github.com/universalviewer/universalviewer/issues/new)
- Engage with the [UV Steering Group](https://github.com/UniversalViewer/universalviewer/wiki/Steering-Group) and [community team](https://github.com/UniversalViewer/universalviewer/blob/dev/COMMUNITY_TEAM.md)
- Get familiar with [Code of Conduct](https://github.com/UniversalViewer/universalviewer/blob/dev/CODE_OF_CONDUCT.md)
- Read our [guide to contributing](https://github.com/UniversalViewer/universalviewer/blob/dev/CONTRIBUTING.md)
- Read our [governance document](https://github.com/UniversalViewer/universalviewer/blob/dev/GOVERNANCE.md) to learn more about roles and responsibilities, support, membership, and the decision making process.

If you want to dive into code, you can learn how to take part in improving the UV:

- Fork the repository and [run the examples from source](#-getting-started)
- Find an [issue](https://github.com/UniversalViewer/universalviewer/issues) to work on and submit a pull request
- Help update our [Accessibility Statement](https://github.com/UniversalViewer/universalviewer/wiki/Accessibility-Statement-for-the-Universal-Viewer)
- Star the repository to show your support ⭐
- Could not find an issue? Look for bugs, typos, and missing features.

![Contributors](https://raw.githubusercontent.com/UniversalViewer/assets/master/contributors.jpg "Contributors")

<a href="https://github.com/UniversalViewer/universalviewer/graphs/contributors"><img src="https://opencollective.com/universalviewer/contributors.svg?width=890&button=false" /></a>
<a id="sponsors"></a>
## 🏅 Contributors and Sponsors

## 🏅 Sponsors
### Individual contributors
[![Individual contributors](https://opencollective.com/universalviewer/contributors.svg?width=890&button=false "Individual contributors")](https://github.com/UniversalViewer/universalviewer/graphs/contributors)

### Institutional contributors
[Become a sponsor](https://opencollective.com/universalviewer#sponsor) and join our [Steering Group](https://github.com/UniversalViewer/universalviewer/wiki/Steering-Group) to help guide how our sponsorship funds are allocated.

## 📖 License

The Universal Viewer is released under the [MIT license](https://github.com/UniversalViewer/universalviewer/blob/master/LICENSE.txt).
![Institutional contributors](https://raw.githubusercontent.com/UniversalViewer/assets/master/contributors.jpg "Institutional contributors")

## 📖 Accessibility Statement

Read our [Accessibility Statement](https://github.com/UniversalViewer/universalviewer/wiki/Accessibility-Statement-for-the-Universal-Viewer)

## 📣 Feedback

Read below how to engage with the UV [community](https://github.com/UniversalViewer/universalviewer/blob/dev/COMMUNITY_TEAM.md):
## 📖 License

- Join the discussion on [Slack](http://universalviewer.io/#contact).
- Ask a question, request a new feature and file a bug with [GitHub issues](https://github.com/universalviewer/universalviewer/issues/new).
- Star the repository to show your support ⭐
The Universal Viewer is released under the [MIT license](https://github.com/UniversalViewer/universalviewer/blob/master/LICENSE.txt).
56 changes: 36 additions & 20 deletions __tests__/configuration_options.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,46 @@
describe('Configuration options', () => {
describe('thumb cache invalidation', () => {
describe("Configuration options", () => {
describe("thumb cache invalidation", () => {
beforeEach(async () => {
await page.goto('http://localhost:4444/');
await page.waitForSelector('#thumb0');
await page.goto("http://localhost:4444/");
await page.waitForSelector("#thumb0");
});
it.skip('when set to false does not provide timestamp', async () => {
await page.evaluate(() => uv.set(
{ config: { modules: { contentLeftPanel: { options: { thumbsCacheInvalidation: { enabled: false }}}}}}
));
await page.waitForSelector('#thumb0');
const imageSrc = await page.$eval('#thumb0 img', e => e.src);
expect(imageSrc).toEqual(
it.skip("when set to false does not provide timestamp", async () => {
await page.evaluate(() =>
uv.set({
config: {
modules: {
contentLeftPanel: {
options: { thumbsCacheInvalidation: { enabled: false } },
},
},
},
})
);
await page.waitForSelector("#thumb0");
const imageSrc = await page.$eval("#thumb0 img", (e) => e.src);
expect(imageSrc).toEqual(
expect.stringMatching(
'https://dlcs.io/iiif-img/wellcome/1/ff2085d5-a9c7-412e-9dbe-dda87712228d/full/90,/0/default.jpg'
"https://dlcs.io/iiif-img/wellcome/1/ff2085d5-a9c7-412e-9dbe-dda87712228d/full/90,/0/default.jpg"
)
);
});
it.skip('has a configurable parameter type', async () => {
await page.evaluate(() => uv.set(
{ config: { modules: { contentLeftPanel: { options: { thumbsCacheInvalidation: { paramType: '#' }}}}}}
));
await page.waitForSelector('#thumb0');
const imageSrc = await page.$eval('#thumb0 img', e => e.src);
expect(imageSrc).toEqual(
it.skip("has a configurable parameter type", async () => {
await page.evaluate(() =>
uv.set({
config: {
modules: {
contentLeftPanel: {
options: { thumbsCacheInvalidation: { paramType: "#" } },
},
},
},
})
);
await page.waitForSelector("#thumb0");
const imageSrc = await page.$eval("#thumb0 img", (e) => e.src);
expect(imageSrc).toEqual(
expect.stringContaining(
'https://dlcs.io/iiif-img/wellcome/1/ff2085d5-a9c7-412e-9dbe-dda87712228d/full/90,/0/default.jpg#t='
"https://dlcs.io/iiif-img/wellcome/1/ff2085d5-a9c7-412e-9dbe-dda87712228d/full/90,/0/default.jpg#t="
)
);
});
Expand Down
Loading
Loading