Repository navigation
Releases: opendiving/opendiving-web
Release list
v0.6.0
What's Changed
Features
- feat(ui): hero details sit at the cards' inset, and a long subtitle wraps between its parts by @aleskiontherun in #450
- feat(ui): the footer and the autofill legend sit at the hero details' inset, the footer tighter by @aleskiontherun in #453
- feat(ui): the Gas Consumption and Exposure & Pressure figures are set as the Tanks card's by @aleskiontherun in #454
- feat(ui): the Environment card's readings are set as the dive cards' figures, in aligned columns by @aleskiontherun in #455
- feat(dives): time to surface gets its own row, and a finger scrubbing a chart holds the page by @aleskiontherun in #456
- feat(ui): a card with no control beside its title pads its top as the dive form's sections do by @aleskiontherun in #457
- feat(dives): each dive page card edits its section of the form in a dialog by @aleskiontherun in #458
- feat(dives): the dive profile opens full screen, and its readout aligns and keeps a row through a gap by @aleskiontherun in #459
- feat(dives): each tank in the dive form carries the dive page's cylinder icon by @aleskiontherun in #460
- feat(dives): Home's chart cards name a month short, and their stats sit closer by @aleskiontherun in #461
- feat(ui): an animated logo covers the app's first load by @aleskiontherun in #462
- feat(dives): Home's chart period selects name the month in full by @aleskiontherun in #463
- feat(checkin): the PDF hint moves behind the page info icon, and the printed heading is centred by @aleskiontherun in #464
- feat(gear): a cylinder picker on the tank, vessel facts on a cylinder's page, and service rules by hours of diving by @aleskiontherun in #465
- feat(dives): the Recordings card edits through the Import section in a dialog by @aleskiontherun in #468
- feat(sites): a site's WoRMS entry links to its WoRMS page, the third registry the format names by @aleskiontherun in #469
- feat(gear): backplate and wing reach the picker, and a wing takes the BCD's service preset by @aleskiontherun in #470
- feat(dives): a sighting's abundance band on the dive form and the dive page by @aleskiontherun in #471
- feat(invitations): your invite link as a QR code, and /join admits whoever scans it by @aleskiontherun in #472
- feat(lists): search stands in the header and filters fold behind a funnel on /sites and /courses by @aleskiontherun in #474
- feat(dives): Configure Fields edits a draft and ends in Cancel, Apply and Save preset by @aleskiontherun in #475
- feat(dives): Cancel and Save stay at the foot of the screen on the dive form by @aleskiontherun in #478
- feat(ui): dialog footers stay at the foot of the dialog while it scrolls by @aleskiontherun in #479
- feat(ui): a dialog's title and close cross stay in view while it scrolls by @aleskiontherun in #480
- feat(certifications): certifications as cards with the c-card's front behind them by @aleskiontherun in #486
- feat(app): own not-found and error pages, per-page link previews, header in the page column by @aleskiontherun in #493
- feat(gear): gear and gear sets as cards by @aleskiontherun in #488
- feat(courses): courses as cards by @aleskiontherun in #497
Fixes
- fix(dives): the cylinder picker says when every cylinder is already on another tank by @aleskiontherun in #466
- fix(gear): the notifications bell refreshes when a service schedule changes by @aleskiontherun in #467
- fix(dives): hiding one field leaves the others that hold a value on screen by @aleskiontherun in #476
- fix(ui): pinned form rows let go while the keyboard is up and return once it has settled by @aleskiontherun in #481
- fix: show trip notes, announce inline status messages, and stop sharing aborted GETs by @aleskiontherun in #483
- fix(ui): stop /dives, /certifications and Home scrolling sideways at 320px by @aleskiontherun in #485
- fix: close the remaining code-audit behaviour defects by @aleskiontherun in #491
- fix(ui): theme tokens for the last raw colours, and shared primitives for placeholders and tables by @aleskiontherun in #495
- fix(forms): hold numbers to the API's ceilings, trim names, and show a taken name on its field by @aleskiontherun in #499
- fix(pictures): stop refusing a wide JPEG the API now decodes reduced by @aleskiontherun in #500
- fix(auth): refresh the session one tab at a time by @aleskiontherun in #501
Other changes
- ci: the published-image scan uploads one SARIF run by @aleskiontherun in #473
- perf(dives): field visibility saves when the action ends, not 400 ms later by @aleskiontherun in #477
- chore(deps): update dependency @types/node to v24.19.2 by @renovate[bot] in #446
- chore(deps): update dependency @typescript-eslint/parser to v8.71.2 by @renovate[bot] in #447
- chore(deps): update dependency postcss to v8.5.30 by @renovate[bot] in #448
- chore(deps): update dependency prettier to v3.9.10 by @renovate[bot] in #449
- chore(deps): update dependency react-easy-crop to v6.2.4 by @renovate[bot] in #451
- chore(deps): update dependency zod to v4.6.7 by @renovate[bot] in #452
- refactor(ui): share the dialog submit button, the training fields and ButtonSpinner by @aleskiontherun in #482
- refactor(charts): share the Home chart cards' period view and the chart frame by @aleskiontherun in #484
- chore: tidy test environments, formatting coverage and dead code by @aleskiontherun in #487
- docs: correct DECISIONS.md drift and keep code comments in the present tense by @aleskiontherun in #490
- refactor(ui): share the list-page frame, row actions, debounced search and small helpers by @aleskiontherun in #489
- refactor(dives): share the dive form's number fields, payload builders, file list and label caches by @aleskiontherun in #492
- refactor(api): one set of conventions across lib/api by @aleskiontherun in #494
- refactor: one copy of the audit's remaining duplicates, and files in their own folders by @aleskiontherun in #496
- test: the mobile menu's tests wait out its slide, and the Due soon decision is titled for what it holds by @aleskiontherun in #498
- chore(release): v0.6.0 by @opendiving-release-bot[bot] in #502
Full Changelog: v0.5.0...v0.6.0
v0.5.0
What's Changed
⚠️ Breaking changes
- feat(dives)!: a dive's time in the water is submerged_time, shown as the dive time by @aleskiontherun in #443
Features
- feat(home): the home hero draws a shipped picture of the world, without lettering or borders by @aleskiontherun in #418
- feat(dives): the dive page shows its tanks as cards with gas-marked tank icons by @aleskiontherun in #419
- feat(dives): the dive card and hero carry the dive's tags and rating, and the Dive Information card is gone by @aleskiontherun in #420
- feat(dives): the dive form is a stack of section cards, and the Fields menu gains a built-in All and remembers its pick by @aleskiontherun in #421
- feat(ui): every control is 44px to a finger on touch devices by @aleskiontherun in #422
- feat(charts): a finger reads every chart - tap a point, drag sideways to scrub by @aleskiontherun in #423
- feat(ui): on touch, menus open on a tap and an icon button's name answers a hold by @aleskiontherun in #424
- feat(ui): a finger types numbers on a keypad, with either decimal separator, and the diver's own fields autofill by @aleskiontherun in #425
- feat(ui): a finger reads a +N label's hidden names on a tap, and the copy stops saying Click by @aleskiontherun in #426
- feat(ui): every picker is a native select, so a phone opens its own wheel by @aleskiontherun in #428
- feat(ui): dive form sections centre their headings, scroll back when stuck, and hold the import's upload in its title by @aleskiontherun in #429
- feat(ui): the dive form carries a section index and a glyph per section, shared with the dive page by @aleskiontherun in #430
- feat(ui): the dive form's People section sits above Notes, and Dive number carries a hash by @aleskiontherun in #433
- feat(species): one species card on the dive, site and marine life pages, and the photo in the species page's hero by @aleskiontherun in #436
- feat(ui): the dive profile's channels move to a menu on its title row, and its readout groups by graph by @aleskiontherun in #437
- feat(ui): the temperature axis spans at least two degrees by @aleskiontherun in #438
- feat(ui): the burger menu slides in from the right over a dimmed, locked page by @aleskiontherun in #439
- feat(dives): the dive profile chart ends where the dive does by @aleskiontherun in #440
- feat(ui): the Gas Consumption card's change line sits under Average, so its three stats share a row by @aleskiontherun in #441
- feat(dives): the profile chart reads temperatures in hundredths and quotes the grain each recording carries by @aleskiontherun in #442
Fixes
- fix(map): pins on the dark world map are ringed at half the page colour by @aleskiontherun in #427
- fix(ui): a hero's map credit shares the figures' last line, on the values' baseline by @aleskiontherun in #431
- fix(ui): header icons are 20px on touch, and the bell's count chip sits on the bell as it does for a mouse by @aleskiontherun in #432
- fix(ui): the bubbles mark is centred in its box and fills lucide's keyline by @aleskiontherun in #434
Other changes
- test: the check-in details reload test waits for the consumer's effect before reading loadFailed by @aleskiontherun in #435
- docs: retake the README screenshots, the right-hand pair framed level with the dive shot by @aleskiontherun in #444
- chore(release): v0.5.0 by @opendiving-release-bot[bot] in #445
Full Changelog: v0.4.0...v0.5.0
v0.4.0
What's Changed
⚠️ Breaking changes
- feat(location)!: one place picker and one place label everywhere by @aleskiontherun in #281
- feat(dives)!: the profile chart on a millisecond axis, readouts and salinity per recording, and the widened agency list by @aleskiontherun in #286
- feat(contacts)!: a contact picker replaces the training-center text by @aleskiontherun in #290
- feat(people)!: a people picker on dives, trips and courses, and a People page by @aleskiontherun in #301
- feat(dives)!: a count and a note per species on the dive form and the dive page by @aleskiontherun in #306
- feat(cards)!: cards show the server's map picture, and stop drawing maps by @aleskiontherun in #376
- feat(maps)!: the renderer draws map tiles, and cards and heroes compose them by @aleskiontherun in #378
- feat(check-in)!: the check-in details object, with an email and lists of contacts and policies by @aleskiontherun in #408
Features
- feat(dives): twin sets sit below every single-cylinder group by @aleskiontherun in #282
- feat(settings): the import preview edits the check-in facts, and the form takes the format's bounds and anchors by @aleskiontherun in #283
- feat(check-in): a portrait for the desk, and both pictures save and adjust with their forms by @aleskiontherun in #284
- feat(import): the archive's portrait in the import preview, and what an import applies by @aleskiontherun in #285
- feat(dives): a dive whose time of day is unknown shows and edits as a date by @aleskiontherun in #287
- feat(pwa): install OpenDiving on a phone by @aleskiontherun in #291
- feat(settings): renewal and year-in-review toggles, named on the privacy page by @aleskiontherun in #292
- feat(checkin): share the check-in page as a link or QR code by @aleskiontherun in #293
- feat(settings): split settings into sections, and move import and export to /data by @aleskiontherun in #295
- feat(ui): a pass over the app on a phone, and every page names its tab by @aleskiontherun in #298
- feat(brand): set the wordmark in Outfit 700 by @aleskiontherun in #300
- feat(data): cloud icons on the /data cards, and the import picker laid out as an export row by @aleskiontherun in #299
- feat(ui): one card for every sign-in page, a profile picture at onboarding, and a bigger portrait by @aleskiontherun in #302
- feat(contacts): show the address inline and label its first line Address by @aleskiontherun in #303
- feat(forms): one card for cylinders and trip parts, labelled part fields, and a new trip opens with a part by @aleskiontherun in #307
- feat(dives): species rows on the shared row card, with labelled count and notes by @aleskiontherun in #310
- feat(landing): coral/teal band background and simpler format copy by @aleskiontherun in #313
- feat(settings): a Storage section shows what is stored against the limit by @aleskiontherun in #314
- feat(admin): daily totals of accounts and sign-ins under /admin/stats by @aleskiontherun in #323
- feat(auth): /join lands a channel link on the sign-in form by @aleskiontherun in #324
- feat(landing): reword the hero paragraph by @aleskiontherun in #322
- feat(dives): the dive form takes any format the app reads, labelled as the importer labels it by @aleskiontherun in #325
- feat(map): the dark basemap is Liberty recoloured, with teal water in both themes by @aleskiontherun in #326
- feat(gear): duplicate a gear set into the new-set form by @aleskiontherun in #327
- feat(ui): detail page actions sit on the back link's row, with the secondary ones in a menu by @aleskiontherun in #328
- feat(dashboard): sparkles icon on the Getting Started card title by @aleskiontherun in #330
- feat(dashboard): one small-title layout for the notice cards, icon included by @aleskiontherun in #331
- feat(dives): rating, tags, type and conditions on the dive form, the dive page, the dive list and a Tags card by @aleskiontherun in #332
- feat(dives): the dive form in collapsible sections with sticky headings by @aleskiontherun in #333
- feat(places): a region hint on every place row, and one row per place by @aleskiontherun in #334
- feat(import): one Import page takes any files at once and lists the dives they become by @aleskiontherun in #335
- feat(trips): trips as cards with a map backdrop, on /trips and the dashboard by @aleskiontherun in #336
- feat(trips): trip place search rows read and save place, region, country by @aleskiontherun in #337
- feat(dives): dives as cards with a map backdrop in every dive list by @aleskiontherun in #338
- feat(dives): a card with no place is the map's water, not brand teal by @aleskiontherun in #339
- feat(dives): filter toggle uses the funnel icon by @aleskiontherun in #340
- feat: a list page's New opens the created item's page by @aleskiontherun in #341
- feat(header): account menu's Import and Export use the cloud icons by @aleskiontherun in #345
- feat(lists): the count badge reads "N dives found" under a search or filter by @aleskiontherun in #344
- feat(gear): an empty gear or gear sets card drops its header by @aleskiontherun in #347
- feat(header): move the dashboard's service-due and renewals cards behind a notifications bell by @aleskiontherun in #349
- feat(places): a picked place saves the geocoder's name everywhere, and full_name goes by @aleskiontherun in #351
- feat(dives): a dive card draws its depth profile across the foot of its map by @aleskiontherun in #353
- feat(cards): dive and trip cards show the figures they have, in equal columns by @aleskiontherun in #355
- feat(maps): a map renderer ships in the web image, run as its own command by @aleskiontherun in #358
- feat(sites): a site's details on its form and its page, a summary of its dives, and a new dive prefilled from its site by @aleskiontherun in #359
- feat(sites): dive sites as cards with a map backdrop, and every label in sentence case by @aleskiontherun in #361
- feat(dives): a parsed file prefills the rest of the dive it states by @aleskiontherun in #363
- feat(heroes): the trip, site and dive pages open on their map by @aleskiontherun in #365
- feat(import): suggest renumbering when an import tangles the log's numbers by @aleskiontherun in #367
- feat(dives): the gas card is Tanks, and exposure follows consumption by @aleskiontherun in #368
- feat(nav): a record page goes back to the page it was opened from by @aleskiontherun in #369
- feat(gear): the gear page opens on the record pages' hero, without a map by @aleskiontherun in #370
- feat(ui): an empty dive list on a record page drops its header, and a course leads with its certifications by @aleskiontherun in #372
- feat(ui): the course, person and species pages open on the gear page's hero by @aleskiontherun in #373
- feat(icons): the twin-tank icon draws two bands across both cylinders and knobs on its valves by @aleskiontherun in ht...
v0.3.0
What's Changed
⚠️ Breaking changes
- feat(trips)!: each part of a trip has its own place and dates by @aleskiontherun in #274
Features
- feat(auth): focus the code field when the check-your-email card appears by @aleskiontherun in #230
- feat(header): rule off the records from the account in the user menu by @aleskiontherun in #231
- feat(dates): type or paste into every date field by @aleskiontherun in #239
- feat(calendar): page the month by swiping the day grid by @aleskiontherun in #242
- feat(courses): a course need not name an agency by @aleskiontherun in #247
- feat(dates): native date and time pickers on touch devices by @aleskiontherun in #248
- feat(app): every route paints its own skeleton at the click by @aleskiontherun in #249
- feat(courses): filter the list by date, agency and status by @aleskiontherun in #252
- feat(check-in): the details a dive shop asks for, and a summary to hand over by @aleskiontherun in #255
- feat(app): instant navigations, cacheComponents and partialPrefetching on by @aleskiontherun in #259
- feat(check-in): edit the sheet from the sheet, and one form module behind it by @aleskiontherun in #257
- feat(app): the destination's frame paints at the click without a Suspense fallback by @aleskiontherun in #260
- feat(certifications): card images in the form, cropped to one card shape by @aleskiontherun in #264
- feat(checkin): the sheet reads in two columns, on screen and on paper by @aleskiontherun in #265
- feat(courses): the filter row folds behind a button and offers only what is used by @aleskiontherun in #266
- feat(lists): a search box beside the count on trips, sites and species by @aleskiontherun in #268
- feat(lists): an empty list card drops its count and its search box by @aleskiontherun in #269
- feat(dives): the renumber note is its own card, and only when there is something to renumber by @aleskiontherun in #270
- feat(admin): an empty invite queue drops its count and its actions by @aleskiontherun in #271
- feat(lists): folding the search away clears it, and its button is an X by @aleskiontherun in #272
- feat(dives): a dive is titled by its number and its site by @aleskiontherun in #273
Fixes
- fix(dives): reflow the dive form so hidden fields leave no gaps by @aleskiontherun in #217
- fix(dialog): position the scrim absolutely, which is what iOS leaves reachable by @aleskiontherun in #227
- fix(mixtures): stop a depth exactly at a mix's MOD reading as past it by @aleskiontherun in #236
- fix(lists): re-observe the load-more sentinel once a page has landed by @aleskiontherun in #237
- fix(dialog): keep a dialog open when its background is clicked by @aleskiontherun in #238
- fix(mixtures): print a MOD at the scale it is compared at, rounded down by @aleskiontherun in #240
- fix(calendar): put the month arrows in the row with the month and year selects by @aleskiontherun in #241
- fix(forms): draw the native pickers' chevron where the Radix one sits by @aleskiontherun in #243
- fix(certifications): back image slot is optional by @aleskiontherun in #251
- fix(ui): an icon button's hint stays shut when a pointer hands focus back by @aleskiontherun in #263
Other changes
- chore(deps): lock file maintenance by @renovate[bot] in #218
- chore(deps): update code-quality tools by @renovate[bot] in #219
- chore(deps): update actions/download-artifact action to v8 by @renovate[bot] in #220
- chore(deps): lock file maintenance by @renovate[bot] in #225
- chore(deps): update vitest monorepo to v5 by @renovate[bot] in #224
- chore(deps): update dependency @simplewebauthn/browser to v14 by @renovate[bot] in #221
- chore(deps): update eslint to v10 and adapt eslint-config-next to it by @aleskiontherun in #228
- chore(deps): lock file maintenance by @renovate[bot] in #229
- chore(deps): update dependency typescript to v6 by @renovate[bot] in #223
- chore: ignore .vitest/, which is where Vitest 5 writes its scratch output by @aleskiontherun in #232
- docs: set a bar for DECISIONS.md entries by @aleskiontherun in #233
- docs: compact DECISIONS.md to the entry bar by @aleskiontherun in #234
- docs: DECISIONS.md titles state the rule, not the change by @aleskiontherun in #235
- test(map): stop the frame-narrowing refit case racing MapLibre's first resize by @aleskiontherun in #244
- chore(scripts): time soft navigations against a production build by @aleskiontherun in #245
- refactor(api): requests stop carrying user_uuid by @aleskiontherun in #250
- docs(decisions): what cacheComponents and partialPrefetching demand of this app by @aleskiontherun in #254
- refactor(ui): one empty-state shape, and sentence-case controls by @aleskiontherun in #253
- docs(decisions): a fallback committed at the click holds the page behind it for ~300 ms by @aleskiontherun in #256
- test: derive bare date fixtures from local parts, not toISOString() by @aleskiontherun in #258
- test(e2e): instant() assertions for the navigations the owner named by @aleskiontherun in #261
- docs(app): the auth pages' Suspense boundaries are not what makes the build pass by @aleskiontherun in #262
- refactor(lists): a one-list page's card header is just its count by @aleskiontherun in #267
- chore(release): v0.3.0 by @opendiving-release-bot[bot] in #275
New Contributors
Full Changelog: v0.2.0...v0.3.0
v0.2.0
What's Changed
Features
- feat(docs): retake the dive and gear shots, and level the README row by @aleskiontherun in #206
- feat(release): publish the component release instead of drafting it by @aleskiontherun in #215
Fixes
- fix(legal): the source offer names the repositories, which are no longer to come by @aleskiontherun in #201
- fix(profile): bound the percent axis at 200 % by @aleskiontherun in #204
- fix(dives): multi-file import, deferred file deletes, and two iOS form bugs by @aleskiontherun in #205
- fix(dives): four iOS bugs in the Configure dialog, and seed "Save as" by @aleskiontherun in #207
- fix(dives): pickers open on the full list while the selection is untouched by @aleskiontherun in #210
- fix(dives): name cylinder presets AL/HP/LP, correct three sizes, add steel and stage cylinders by @aleskiontherun in #212
- fix(dives): offer every cylinder preset in both unit systems, grouped by @aleskiontherun in #214
Other changes
- chore: after the flip by @aleskiontherun in #200
- docs(decisions): the api's copy of the scan workflow has moved by @aleskiontherun in #202
- docs(decisions): the image-cve issue was closed by @aleskiontherun in #203
- test(dives): freeze the clock for the Fields debounce burst by @aleskiontherun in #209
- ci: the PR labelling step survives a GitHub API flap by @aleskiontherun in #208
- docs(skills): how to serve a branch to a phone on the LAN by @aleskiontherun in #211
- chore(release): v0.2.0 by @opendiving-release-bot[bot] in #216
New Contributors
- @opendiving-release-bot[bot] made their first contribution in #216
Full Changelog: v0.1.0...v0.2.0
v0.1.0
The first component release of the OpenDiving web app — the Next.js frontend behind
opendiving/opendiving v0.1.0. Published as
ghcr.io/opendiving/opendiving-web:0.1.0 for linux/amd64 and linux/arm64.
This image is not installed on its own. The product release is
opendiving/opendiving v0.1.0,
which ships the compose file and the install script that run it alongside opendiving-api at the
same version. Versions move in lockstep across all three repositories.
Breaking
None — there is no earlier release to upgrade from. The ! markers across this repository's
history record changes made before any version existed, so they describe how the initial contract
was arrived at rather than anything an operator has to act on. example.env in the product
release is the authoritative statement of what this version expects.