Repository navigation
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 #374
- feat(ui): gear and person pages title their notes card Notes, and an archived item says so in its hero by @aleskiontherun in #375
- feat(icons): dive sites get their own icon, a map pin holding the brand's bubbles by @aleskiontherun in #377
- feat(ui): dive cards and heroes share a title, chips and line; training dives carry the course icon by @aleskiontherun in #379
- feat(ui): bold hero titles, every dive site in Location, and dive cards that follow a site's edits by @aleskiontherun in #380
- feat(pickers): every picker reads the lookup, and the dive form puts the trip's and course's people first by @aleskiontherun in #381
- feat(dives): the dive center joins the Location card with its city, province and country by @aleskiontherun in #383
- feat(people): people on a dive can be dragged into order by @aleskiontherun in #384
- feat(trips): a trip's dives are grouped into a card per part by @aleskiontherun in #385
- feat(dives): the new dive form fills from picks and marks what it filled in by @aleskiontherun in #390
- feat(species): call the life list Marine Life by @aleskiontherun in #397
- feat(trips): the trip page lists its candidate dives muted, with Add to trip, on scroll by @aleskiontherun in #400
- feat(checkin): put date of birth and phone under the diver's name, marked by icons by @aleskiontherun in #401
- feat(dives): a paperclip marks a dive with a recording, on its card and hero by @aleskiontherun in #402
- feat(dives): the volume dropdown leads with the diver's recently used volumes by @aleskiontherun in #403
- feat(ui): list pages and the dashboard open on the hero layout, their actions on its top row by @aleskiontherun in #404
- feat(sites): search a dive site's location in its own dialog, opened beside the Location field by @aleskiontherun in #405
- feat(header): priority+ nav with a More menu, and an account menu that holds only the account by @aleskiontherun in #406
- feat(header): the dashboard becomes Home, first in the bar; Import and Admin join the account menu by @aleskiontherun in #407
- feat(dives): the species picker reads the suggestions and says why a row is first by @aleskiontherun in #409
- feat(admin): the species catalog page, with hide, replace and re-fetch by @aleskiontherun in #410
- feat(dive-form): a file's stated figure replaces one an earlier file derived by @aleskiontherun in #411
- feat(ui): phone spacing at 10px around cards and 12px inside them, page-size headings, and the dive form under the shared hero by @aleskiontherun in #413
- feat(ui): list pages carry their actions on the title's line and their description behind an info icon, and the site hero drops sea level and its rating by @aleskiontherun in #414
- feat(home): the home hero maps the diver's trip places and carries the logbook's figures by @aleskiontherun in #415
- feat(home): chart cards keep the scope switch on the title's line, stats at the dive cards' size, and descriptions gone or under the chart by @aleskiontherun in #416
Fixes
- fix(dives): the charts fit a phone, and the NDL label clears the depth axis by @aleskiontherun in #288
- fix(pwa): Firefox on iOS gets the icon and name, and home-screen tiles go white on coral by @aleskiontherun in #294
- fix(settings): the Check-in section lives at /settings/checkin by @aleskiontherun in #296
- fix(app): pages under the auth-gate layouts opt out of instant validation by @aleskiontherun in #297
- fix(dives): call the form's cylinder section Tanks throughout by @aleskiontherun in #320
- fix(ui): return focus to a dialog's opener when it closes by @aleskiontherun in #329
- fix(dives): the new-dive back link names every page it is opened from by @aleskiontherun in #348
- fix(header): keep the header controls' gaps on small screens by @aleskiontherun in #350
- fix(dives): a later file fills the form's cylinders only where the api would pair them the same way by @aleskiontherun in #352
- fix(dives): a dive card's profile draws without a glow, so its fill fades without bands by @aleskiontherun in #354
- fix(header): tighten the gaps between the header's controls by @aleskiontherun in #356
- fix(dives): dive and trip cards keep one height at every width by @aleskiontherun in #357
- fix(dives): adding a dive site leaves the site field by @aleskiontherun in #360
- fix(settings): the profile picture is drawn as wide as the check-in portrait by @aleskiontherun in #362
- fix(trips): the trip hero dates its trip as the trip card does by @aleskiontherun in #366
- fix(dialog): keep a dialog still while the phone keyboard opens by @aleskiontherun in #371
- fix(dives): start each new-dive form fresh from the last dive by @aleskiontherun in #395
- fix(deps): update source-map-js to 1.2.2 for CVE-2026-93749 by @aleskiontherun in #399
Other changes
- docs: a trip is a sequence of parts, each with its own place and dates by @aleskiontherun in #278
- refactor(support): the contact page becomes /support by @aleskiontherun in #289
- docs(decisions): the dashboard entry stops denying the Species Seen tile by @aleskiontherun in #315
- chore(deps): update dependency @types/node to v24.19.0 by @renovate[bot] in #276
- chore(deps): update dependency prettier to v3.9.9 by @renovate[bot] in #277
- chore(deps): update vitest monorepo to v5.0.2 - autoclosed by @renovate[bot] in #279
- chore(deps): update dependency eslint to v10.11.0 by @renovate[bot] in #280
- chore(deps): update dependency @next/bundle-analyzer to v16.3.6 by @renovate[bot] in #304
- chore(deps): update dependency @typescript-eslint/parser to v8.70.1 - autoclosed by @renovate[bot] in #305
- chore(deps): update dependency sharp to v0.35.5 by @renovate[bot] in #308
- chore(deps): update nextjs monorepo to v16.3.6 by @renovate[bot] in #309
- chore(deps): update dependency lucide-react to v1.48.0 by @renovate[bot] in #312
- chore(deps): update docker/build-push-action action to v7.4.0 by @renovate[bot] in #316
- chore(deps): update docker/setup-buildx-action action to v4.4.1 by @renovate[bot] in #317
- chore(deps): update dependency maplibre-gl to v6.11.2 by @renovate[bot] in #318
- chore(deps): update dependency react-hook-form to v7.89.0 by @renovate[bot] in #319
- docs(privacy): §4.4 names the trip and dive lists that draw a map by @aleskiontherun in #342
- ci: install Chromium without apt, run the unit suite without coverage by @aleskiontherun in #343
- ci: shard the unit suite across two jobs by @aleskiontherun in #346
- chore(import): the import notes know value_derived, and a truncated list is not a prefix by @aleskiontherun in #364
- docs(ui): the combobox debounce comment names the lookup endpoints by @aleskiontherun in #382
- chore(deps): update dependency @next/bundle-analyzer to v16.3.8 by @renovate[bot] in #386
- chore(deps): update dependency react-day-picker to v10.0.2 by @renovate[bot] in #387
- chore(deps): update dependency @types/node to v24.19.1 by @renovate[bot] in #388
- chore(deps): update vitest monorepo to v5.0.3 by @renovate[bot] in #391
- chore(deps): update nextjs monorepo to v16.3.8 by @renovate[bot] in #389
- chore(deps): update dependency jsdom to v30.1.2 by @renovate[bot] in #311
- chore(deps): update dependency @typescript-eslint/parser to v8.71.0 by @renovate[bot] in #392
- chore(deps): update dependency eslint to v10.12.0 by @renovate[bot] in #393
- chore(deps): update dependency lucide-react to v1.52.0 by @renovate[bot] in #394
- perf(checkin): shrink pictures to print size before the sheet prints by @aleskiontherun in #396
- chore(deps): update dependency maplibre-gl to v6.13.0 by @renovate[bot] in #398
- docs(privacy): the export leaves this copy's sign-in address and username behind, and the page's list says so by @aleskiontherun in #412
- chore(release): v0.4.0 by @opendiving-release-bot[bot] in #417
Full Changelog: v0.3.0...v0.4.0