build(deps): bump the npm-all group across 1 directory with 11 updates - #67
Closed
dependabot[bot] wants to merge 247 commits into
Closed
dependabot[bot] wants to merge 247 commits into
dependabot[bot] wants to merge 247 commits into
Conversation
- getMeta() now returns deadLinks, pageContent and healthScores instead of silently dropping them. This fixes data loss on every save and makes the dead-link badge/indicators and daily-check cache actually work. - pushSyncSnapshot() trims non-portable meta (pageContent up to 50KB each, device-specific deadLinks) to stay within the chrome.storage.sync quota. - pullSyncSnapshot() merges portable meta over local state and preserves local pageContent/deadLinks instead of overwriting them. - options.js JSON import sent the parsed object to restore-from-code (expects a string); added a restore-from-file handler that calls restoreFromPayload. - removeBookmarkMeta() also clears deadLinks/pageContent/healthScores. - Removed dead findDuplicates() call in computeHealth; fixed deadLinks doc.
Fix meta persistence, sync quota/merge, and broken JSON import
Repurpose this repository from the Booki Chrome bookmark extension into "Booki Dock", a macOS-dock-style launcher for Windows, inspired by Docky (a macOS Dock replacement). The Booki brand — the capybara logo and tan palette — is preserved; the previous extension remains in git history. Docky's code is Swift + private macOS APIs and cannot run on Windows, so this is a ground-up rebuild on a modern, low-resource stack: Tauri 2 + Rust with the system WebView2 (no bundled Chromium) and a vanilla HTML/CSS/JS frontend. Highlights: - Frameless glassmorphism dock with magnify-on-hover that overflows the bar (tiles rise above the capsule like macOS), configurable zoom intensity. - Launcher + switcher: click launches a pinned app, or focuses its window if it's already running. Real Windows app icons via the Win32 shell. - Drag programs/folders from the desktop to pin them; pointer drag-to-reorder; separators; per-tile custom icon override. - Auto-hide (slide + reveal on edge hover), anchor to any screen edge, system tray, running-app indicators. - Live settings window: theme, accent, icon size, spacing, translucency, zoom, labels, indicators, always-on-top, auto-hide — applied to the dock instantly. - Native Win32 integration via windows-rs (app-icon extraction, window enumeration/focus) behind cfg(windows) with no-op stubs elsewhere. - Config persisted atomically as JSON under %APPDATA%\Booki. Packaging: - Branded NSIS/MSI installer (capybara icon and sidebar art), MIT licensed. - GitHub Actions build on windows-latest produces the .exe/.msi artifacts. Validated with `cargo check` against x86_64-pc-windows-msvc and `vite build`; the UI was verified in a browser preview.
…ails - Tray icon: left click toggles the dock, double click opens settings. - Dock: friendly empty-state hint (capybara + "drag apps here") when nothing is pinned; Escape closes the context menu; window reframe is debounced to avoid resize thrashing on rapid changes. - Settings: new "About" card showing the app version (app_version command), a "Reset appearance" button (reset_config keeps pinned items), per-app icon thumbnails in the pinned list, and Escape closes the settings window. - Backend: app_version and reset_config commands; window close capability.
Adds .github/workflows/release.yml using tauri-action to build the Windows app and attach the NSIS (.exe) and MSI installers to a GitHub Release, so users can download Booki Dock directly without a login or hunting through CI artifacts. Triggered by pushing a `v*` tag or via workflow_dispatch. README install steps now point to the Releases page.
Tag pushes are restricted in this environment and workflow_dispatch needs the workflow on the default branch, so temporarily trigger the release workflow on pushes to the dev branch. tauri-action creates the GitHub Release (tag v0.1.0) and uploads the .exe/.msi via the API, making the installer downloadable from the Releases page without merging first.
…gging Bug fixes: - Dock no longer overlaps the taskbar: position_dock now uses the monitor's WORK AREA (win::work_area via GetMonitorInfoW) instead of the full screen. - Add connect-src (ipc:) to the CSP so the IPC bridge is never blocked — a likely cause of settings/commands not working in the packaged app. - Add tauri-plugin-log + global JS error handlers (window.onerror / unhandledrejection → frontend_log) writing to %APPDATA%\Booki logs, so real runtime errors are diagnosable on the user's machine. Windows 11 look & feel (vanilla + design system): - Native Acrylic on the dock and Mica/Acrylic on settings via window-vibrancy. - styles.css rewritten as a Fluent design system (Segoe UI Variable, tokens, depth, restrained translucency over the native material). - Settings use Fluent toggle switches; cleaner cards. UX: - Minimal dock chrome — removed the on-bar +/gear tiles. Add via drag-from- desktop or right-click (Añadir app… / Añadir carpeta…); settings via tray or right-click. Full-window drop overlay; folders/shortcuts pin and launch. Verified: cargo check (x86_64-pc-windows-msvc) and host build pass; the app boots cleanly under a real Tauri runtime on Linux (backend + logging confirmed; WebKitGTK web process can't render in this GPU-less CI, so frontend runtime is verified on Windows). Frontend redesign verified in a browser (no JS errors).
Settings window rebuilt in React (Vite + @vitejs/plugin-react): - Modern sidebar navigation with tabbed panels: Apariencia, Comportamiento, Apps ancladas, Atajos, Acerca de. Fluent switches, sliders, live apply. - Custom accent color picker (alongside presets). - Auto-hide delay slider; magnify animation style selector. - The dock stays vanilla JS (perf); settings shares the api.js bridge. New magnify animation (distinct from macOS): - Focused tile "pops" with a spring lift + accent glow; neighbours grow only gently (tighter falloff than the macOS ripple). Press feedback on tiles. - Configurable style: spring / smooth / off. Pointermove is rAF-throttled. New complements: - Global hotkey to toggle the dock (tauri-plugin-global-shortcut), captured in the Atajos tab and (re)registered via set_hotkey. - "Abrir ubicación" in the pin list / context menu (open_location → reveals the file in Explorer). - Config gains autoHideDelay, magnifyStyle, hotkey. Verified: cargo check (x86_64-pc-windows-msvc) and host build pass; React settings + dock render with no JS errors (browser preview).
…erial Behaviour: - Smart auto-hide by occlusion: a Windows watcher (GetForegroundWindow + GetWindowRect, ignoring the desktop) emits booki://occlusion; the dock hides when a window covers it and slides back smoothly on the desktop. Auto-hide is now a mode: off / smart / edge. - Magnify is gentler: default zoom 1.35 (was 1.8), slider 110–180%, smaller lift. - Badges: tiles show the open-window count (bubble if >1, dot if 1). Interaction (iOS-style): - Long-press a tile → edit mode: tiles jiggle, show a × to remove, and can be dragged to reorder. Tap outside / Esc exits; short tap launches. - Settings "Apps" list: drag handle to reorder (replaces the ▲▼ arrows). New complements: - Start with Windows (tauri-plugin-autostart) toggle. - Multi-monitor: choose which screen the dock lives on (list_monitors). - Mica/Acrylic material intensity slider (set_material). - Folder pins detected (kind "folder"); open their location. Config gains autoHideMode, monitor, materialStrength, autostart, language. Verified: cargo check (x86_64-pc-windows-msvc) + host build; React settings & dock render with no JS errors (browser preview). Deferred (next): folder "stack" flyout, i18n ES/EN selector, deeper visual pass.
The release tag/asset name never changed (always v0.1.0 / Booki_0.1.0_*), so each rebuild overwrote the same file on the same tag and GitHub's CDN kept serving the cached installer — it looked like it "wasn't updating". Bumping the version gives a new tag (v0.2.0), new asset names and fresh download URLs, and clearly reflects the Iteration 3 changes.
Repurpose the repo from the Booki bookmark extension into Booki Dock, a modern Windows dock. Brings the Tauri 2 + Rust app, React settings, smart auto-hide, installer pipeline and brand assets onto main.
The app can now check GitHub Releases for a newer signed version, download and install it (replacing the old install) and relaunch. User data in %APPDATA%\Booki (pinned apps + settings) is never touched by the update. - Plugins: tauri-plugin-updater + tauri-plugin-process (Rust) and the matching JS plugins. Updater configured in tauri.conf (endpoint = the repo's releases/latest/download/latest.json, public signing key embedded). - UI: dock shows an "Actualización disponible" pill on boot; Settings → Acerca de has a "Buscar actualizaciones" button with download progress and install. - Release workflow: passes the signing secrets and publishes a full (non-pre) release so the `latest` endpoint resolves. Non-breaking: signed updater artifacts (createUpdaterArtifacts) stay OFF so CI keeps building without a secret. To go live: add the TAURI_SIGNING_PRIVATE_KEY secret, set createUpdaterArtifacts:true, and make the repo/releases public so the app can download them. Verified: host cargo check + vite build pass (the Windows cross-check now needs the MSVC archiver, only present on the CI runner).
- Enable createUpdaterArtifacts so releases produce signed update artifacts
(latest.json + .sig). Both CI workflows now pass the TAURI_SIGNING_PRIVATE_KEY
secret so builds sign the updater.
- Tighten the capability allowlist to least-privilege: drop the broad
dialog:default and process:default; keep only dialog:allow-open,
process:allow-restart, updater:allow-check and updater:allow-download-and-install.
Security posture: no secrets in the repo (only ${{ secrets.* }} refs); the
private signing key never leaves the user's machine; updates are downloaded by
the Rust side over HTTPS from GitHub and verified against the embedded minisign
public key, so a tampered update is rejected. No telemetry or analytics; config
stays local in %APPDATA%\Booki.
Pinned folders now open a "stack" — a glass flyout above the tile showing the folder's contents (real icons + names) in a grid; clicking an item opens it. Reuses the list_dir backend command; the dock window grows to fit the flyout and restores on close (outside click / Esc). Verified in a browser preview (no JS errors).
Add src/i18n.js (ES/EN dictionary + t()/setLang). Wire all user-facing strings in the dock (context menus, empty state, update pill, stack) and the React settings (every tab, control, option). Language selector in Appearance; "system" follows the OS locale. Changes apply live to both windows via the existing config-changed event. Verified in a browser preview (EN + ES, no JS errors).
Subtle, additive refinements over the Fluent base: deeper layered dock shadow, gentle icon lift on hover, accent-tinted active sidebar item, accent-glow on primary buttons with a hover lift, tighter heading tracking. CSS-only; no structural or logic changes.
…gestions Dock window - Remove native Acrylic/Mica from the dock window. Vibrancy tints the whole window rectangle, but the dock window is sized larger than the visible bar (magnify headroom), so the material showed up as a gray box behind the dock that grew and shrank with the zoom, and clipped the contents. The bar's frosted material is now built entirely in CSS, so only the rounded bar is ever visible against the desktop; the window stays transparent. - set_material is a no-op; material strength now drives the bar's CSS alpha live from config. Smart auto-hide - Default auto-hide mode is now "smart". - Fix the infinite show/hide flapping: the occlusion watcher measured the live window rect, which shrinks to a notch when hidden, so it stopped being occluded, showed again, and looped. It now measures a stable home rect recorded only while the dock is shown. - Hidden state collapses to a clickable, accent-tinted notch; hover or click reveals the dock, and it reappears automatically on the desktop. Manual reveal is held until the pointer leaves. Settings window - Open non-transparent and centered with a larger default and min size so the content is never cropped on first paint; nudge the size once to defeat the WebView2 initial-layout race. Features - Suggest installed apps: scan the Start Menu for shortcuts (list_installed_apps) and offer a searchable, click-to-pin grid in Settings → Pinned apps. - More intuitive accent picker: large swatches with an active check, a custom colour chip, and a live hex readout.
The dev-branch release job had its tag pinned to a literal v0.2.0, so bumping the app version never produced a new tag/release and the updater kept seeing the same version. Derive the tag from package.json instead; combined with the existing prerelease:false this publishes a proper 'latest' release the updater endpoint can resolve.
…ols, live preview - Settings window uses native Mica with a floating acrylic sidebar and a content card layered on top; the active tab is a sliding pill. - Replace dropdowns with visual controls: segmented controls (theme, language, magnify animation, auto-hide), an edge picker (click a side of a mini screen), a monitor picker (boxes scaled to real geometry), and sliders with an accent fill and a value bubble. - Add a live mini-dock preview that reflects icon size, spacing, material, accent, edge and magnify instantly. - Accent color math (util-color.js): derive --accent-deep and a readable --accent-contrast from any accent, shared by the dock and settings. Also bumps to 0.2.2.
…ded corners - Restore native Acrylic on the dock window. The window is now sized exactly to the bar and the magnify is kept inside it, so the acrylic IS the visible dock (real tinted glass) with no gray box around it. DWM rounds the corners so it reads as a rounded dock, not a rectangle. - Contained magnify: tiles keep their layout slot and scale via CSS transform into the bar's edge-side padding, so nothing overflows the window and the bar never resizes on hover — the clipping is gone. Lower default zoom (1.35→1.25) and range (110–150%) so it isn't exaggerated. - Translucency now works: the slider drives the native acrylic tint live via set_material; removed the duplicate material control. - Auto-hide notch is clearly visible and pulses when hidden; click or hover to reveal. Smooth transforms/transitions on tiles and the notch. Bumps to 0.2.3.
…ate clash) The DWM rounded-corners call used our windows 0.58 bindings with the HWND from Tauri's windows 0.61, which don't share types — the build failed with a trait mismatch on DwmSetWindowAttribute. Call dwmapi directly via a small extern (HWND as isize) so there's no crate-version coupling, and drop the unused Win32_Graphics_Dwm feature. Acrylic + contained magnify unchanged. Bumps to 0.2.4.
…dering blank) - Default auto-hide is now "off" so the dock never disappears out of the box; smart/edge hiding stay opt-in. One-time migration forces existing configs (which defaulted to smart) back to visible so upgrading users get the dock back. - Settings window is no longer transparent — a transparent WebView2 window rendered blank/see-through on real Windows (clicking the update pill opened an empty window). It's opaque now with a soft tinted background behind the acrylic-style panels, so it always paints. Bumps to 0.2.5.
…dge pill - set_material now targets the dock window (was applying the acrylic to whichever window invoked it — the settings window — so the dock glass never changed live). - Folder stack flyout is positioned from the bar's real geometry instead of a hardcoded 86px offset, so it doesn't clip now that the dock window is tight. - Update pill is placed on the magnify-headroom side per edge (top/bottom/left/ right) so it no longer overlaps the icons. - Remove the unused `opacity` config field and a dead i18n key. Bumps to 0.2.6.
…ze animation
- Remove native Acrylic from the dock entirely. It painted the whole transparent
window as a rectangle ("box"/double-dock) and forced a tight window that
clipped tooltips. The dock window is transparent and SPACIOUS again, so the
magnified icons and the name tooltip overflow OUTSIDE the bar with no visible
box. The bar's tinted glass is done in CSS (no real desktop blur is possible in
a transparent overlay region — this is the closest without the box).
- Symmetric bar padding so the dock reads at a normal height (no more tall look).
- Auto-hide minimize now slides AND fades into the notch; notch stays the
reveal affordance. (Auto-hide is opt-in: Settings → Behavior → Auto-hide.)
- Startup cleans any leftover config temp file; updates replace program files
while the config in %APPDATA%\Booki is preserved (pins/settings kept).
Bumps to 0.2.7.
…rtcut icons - Auto-hide defaults to "smart" again (now stable): visible on the desktop, slides + fades to the notch when a window covers the dock, reappears when the desktop is clear. One-time migration moves existing installs to smart. - The notch is restyled as an iPhone-style home-indicator pill: calm/neutral by default, grows on hover, and turns the accent color + pulses when there's a notification (e.g. an update available). Click or hover expands the dock. - Pinned .lnk shortcuts now show the TARGET app's icon (resolved via IShellLink) instead of the shell icon with the shortcut-arrow overlay badge. Bumps to 0.2.8.
…box) - The dock window now carries native Mica (falls back to Acrylic on Win10) with DWM-rounded corners and follows the system light/dark. The bar's CSS surface is transparent so the Mica window IS the dock — one surface, no "double dock". - Window is sized exactly to the bar; magnify scales from each tile's center and stays inside the bar's padding (contained, no clipping, normal height). - App names now use the native OS tooltip (title attribute) so they appear outside the bar with no clipping, the Windows way. - Reveal from the notch waits for the window to grow before sliding in, so the bar no longer appears "cut" mid-animation. Bumps to 0.2.9.
…nt details - Magnify is OFF by default now (a subtle hover highlight is the Windows-native feel); a one-time migration disables it for existing installs too. Still toggleable in Settings → Behavior. - New built-in icon library: pick an icon per pinned app from a curated Fluent/ Lucide set in three styles (Badge / Line / Tint), plus upload your own image or reset to the real app icon. Library icons follow the accent live (stored as a compact "lib:<name>:<style>" token, rendered to an SVG data URI). - Fluent touches: antialiased Segoe UI Variable, accent keyboard focus ring. Bumps to 0.3.0.
Preparation for gating CI on `cargo fmt --check` and `cargo clippy -D warnings`. Almost all of this is mechanical rustfmt output. The non-mechanical parts: - stub.rs gets a module-level allow(dead_code). Its functions exist to mirror the windows_impl surface one-for-one so `win::foo` resolves on both platforms; being uncalled in a Linux build is the design, not an oversight. - The non-Windows re-export block in win/mod.rs is allow(unused_imports) for the same reason. - clipboard_feature_active is cfg(windows): its only callers are inside the Windows-only clipboard watcher. - reset_config builds Config with struct update syntax instead of assigning fields after Default::default() (clippy::field_reassign_with_default).
CI previously proved only that the app compiles. Every bug found in the last
audit — a widget that threw on every poll, artwork clipped by its own card,
a vertical bar whose tiles were all different heights — would have passed it.
Tests (tests/, node:test + Playwright):
Serves dist/ and injects a fake window.__TAURI__ bridge, so the real layout and
event wiring run. The assertions are the invariants that were violated:
every tile the same height horizontally and the same width vertically, the bar
thickness unchanged by pinning any widget, and widget artwork fitting inside
the card that clips it at icon sizes 30/48/64. Plus boot, magnify, flyouts,
menus, the notch on all four edges, and every Settings tab — asserting no JS
error anywhere, including on a machine reporting no battery.
Three of these fail right now. They describe bugs that exist in this commit and
are fixed in the next one; the failures are the point.
Lint (eslint.config.js): bug-catching rules only, no style opinions. It already
found three pieces of dead code, including a `manualReveal` flag assigned in
six places and read in none.
Localization (scripts/check-i18n.mjs): verifies every language defines the same
keys and that no literal t("…") references a missing one. pt/fr/de are each
missing the same 81 keys today, so those are recorded in a baseline — CI fails
on any *new* gap while the existing ones are translated, then the baseline goes.
CI: a fast Linux job (lint, i18n, build, tests, clippy, fmt) now gates the slow
Windows build. Both jobs pin the same Node version the release uses, and pushes
no longer duplicate every pull request's run.
Three defects the new smoke tests reproduce; all three now pass. Battery widget threw on every poll on a machine with no battery. `battery` is a ring widget, so widgetTile deliberately omits `.w-value` and `.w-bar` — but the "no battery present" branch called setText(), which assumed both exist. A desktop PC reports battery < 0, so this threw a TypeError every 2.4s forever, froze the card on its placeholder and filled the log with roughly 1500 errors an hour. setText now writes into the ring when there is one. Ring gauges and preview icons were clipped at the default icon size. They were sized as a fraction of --size (0.78 and 0.74) while the space inside the card is --size minus its padding and border. The ring therefore only fitted when --size was 63px or more; at the default 48 it overflowed by 3.4px and was sliced top and bottom by the card's overflow:hidden, and at the 30px floor fitDock() can reach it was 46% too big. Both now derive from --w-art, the space that actually exists, so they fit at every size including compact mode. Vertical rail: every widget was a different height. The tiles were height:auto, so each one grew to its own content — 48.5px for a preview card, 60.25 for the clock, 62.2 for a ring, 77 for media. That is the reported "the dock grows vertically and the widgets are misaligned". Widgets are now exactly --size tall, the same as an app icon, and the card width tracks --size instead of a 46px floor that app icons did not share (below which widgets used to stick out of the column). Making them fit meant dropping the text lines in vertical mode, which measurement justified rather than taste: the rail is icon-width and shrinks to 39px, while "04:49 AM" needs 64px of the 33px available and "↑ 1 KB/s" needs 57px. No font size closes that, so the old layout rendered "04:…", "UPTI…", "BATT…". Rings keep their number — two digits do fit — everything else shows its icon, and the full reading stays in the tooltip. Horizontal docks are untouched. Also: logMessage(level, message) was called with one argument in the two paths that report a failed delete or move, so the level became the text and the error itself was discarded; a cancelled file drag leaked a window pointermove listener because only pointerup cleaned up; and two DOM lookups that can legitimately miss are guarded.
Four changes, all measured against the audit rather than guessed at. Cache the config in memory (config.rs). load() read and parsed config.json on every call and is called from 39 places, including watcher loops that tick every 80ms and 300ms and four times per set_dock_frame — which the dock issues on every reframe. With an auto-hide taskbar that was roughly twelve full read+parse cycles a second, forever. This is safe because save() is the only writer of that file: import and profile-apply write elsewhere and then call it. Two details this needed. save() caches what it actually persists, not its argument: the two differ, since it normalizes notch_mode, forces multi_notch_enabled off and restores the one-way progress flags from disk, so caching the input would let the cache drift from the file. And import_config and profile_apply both rely on load() re-reading to apply migrations and heal groups, so they now invalidate first — otherwise an import would come back unhealed. The cache also stops the seven settings migrations re-running on every read, and stops them retrying seven writes forever from an 80ms loop when the disk is read-only. Merge the two cursor watchers (lib.rs). The dock and notch ran byte-identical threads differing only in which window and which rect list they read, which doubled the timer wakeups — and the two are complementary anyway, since the notch is visible exactly when the dock is not. One thread now serves both and sleeps for whichever wants the shortest interval. Let the work-area watcher idle. Its 80ms cadence exists to catch an auto-hiding taskbar sliding in and out without rcWork changing, but it ran whenever the taskbar was auto-hide even if taskbar_follow was off — nothing to react to, 12.5 wakeups a second regardless. It now checks the setting first, and skips the monitor and work-area queries entirely while a fullscreen app has both windows blacked out. Only re-assert the notch's topmost while it is on screen. The dock half already checked visibility; the notch half did not, so a hidden notch still cost four SetWindowPos calls every three seconds, waking DWM for a window nobody sees. Verified: cargo clippy -D warnings and fmt clean, the 12 smoke tests still pass. The merged watcher is inside cfg(windows) so a Linux clippy run does not compile it — I type-checked it against the stub by temporarily dropping the cfg, which left only window.hwnd() unresolved (Windows-only, and copied verbatim from the code it replaces). Final proof is the Windows CI job.
clip_write_disk does DPAPI encryption plus a file write, and all nine call sites invoked it while still holding the CLIP_HISTORY guard. save_config is a synchronous command, so it runs on the UI thread and takes that same lock — a slow disk could therefore freeze the whole dock, and the 4-second clipboard badge poll took the lock too. Every site now mutates under the guard, clones a snapshot, drops the guard, and writes outside it. clip_remember had two exits inside the locked region and is restructured around a (should_write, snapshot) pair so both paths leave the lock before any I/O. The rule is documented on clip_write_disk itself so the pattern does not creep back.
foreground_app_name opened a process handle and never closed it on any path: the `?` on QueryFullProcessImageNameW returned early, and there was no CloseHandle after the success path either. The foreground watcher calls this routinely, so the process bled one handle per call. It now closes the handle before propagating the result, matching process_image_path in the same file. clipboard_get_text guarded with `if p.is_null() || size == 0` and returned without unlocking. When the lock succeeded but the block was empty that leaked a GlobalLock count on the clipboard memory. The two cases are now separate: a failed lock returns directly, an empty block unlocks first. Deliberately NOT changed here: the three CoInitializeEx calls with no matching CoUninitialize. Pairing them is riskier than it looks — these run on reused tokio workers, so uninitializing could pull the apartment out from under a later call — and the cost today is a per-thread refcount that never matters over a desktop app's lifetime. It deserves its own pass with the STA/MTA question, not a drive-by fix. Both changes are in windows_impl.rs, which is entirely cfg(windows): a Linux clippy run compiles the stub instead, so unlike the rest of this phase they are verified by review against the existing correct patterns in the same file, and by the Windows CI build. Not by a local compile.
Hovering the bar emitted two set_hit_rects calls per frame — 42 over a 21-step
sweep, and on a 144Hz screen that is ~144 backend round trips a second for as
long as the cursor rests there, each preceded by a forced layout read of every
tile. It is now 4 per sweep regardless of how many frames it takes.
Three causes, found by tracing the actual call sites rather than guessing:
1. reportHitRectsLive walked every tile with getBoundingClientRect() inside the
magnify rAF — a forced layout immediately after writing those tiles'
transforms. It now derives the region from the bar's cached resting rect plus
the most the wave can add (scale about the rail, a 5px lift, base*0.22 of
neighbour push). That is a superset of the real union and, unlike the union,
it does not change as the wave travels, so the existing signature check
collapses the gesture into one call.
2. magnify() called classList.add("mag-live") every frame. Re-adding a class
that is already present still queues a mutation record, which woke the
document observer, which scheduled a *second*, full hit-rect report. The two
paths computed different regions, so each invalidated the other's dedupe and
neither ever short-circuited. The add is now guarded.
3. That observer also treated any class change as meaningful, including the
.focus ring hopping between tiles during the wave. Tile-local class and style
churn is the magnify effect itself; magnify already schedules its own report.
Mutations anywhere else still count.
Adds tests/dock-perf.test.mjs, which asserts ceilings rather than exact
numbers: an idle dock with every widget pinned stays under 30 backend calls in
five seconds, and a pointer sweep must emit a small constant number of hit-rect
reports, not one per frame. The second test failed at 122 before this change.
…o everyone Clock: the poll loop ticks at 1Hz so the rollover feels immediate, but the card only shows hours and minutes — 59 of every 60 ticks reformatted the same two strings with Intl and wrote them straight back into the DOM. The cadence stays; the work is skipped when the displayed minute has not changed. The cache is cleared in cacheWidgetEls rather than where the tile is built. That distinction matters and cost a test failure: tickClocks paints through the cached element map, which does not yet contain a tile being constructed, so resetting there marked the minute as painted while the new card was still on its placeholder — and the next tick then short-circuited, leaving the clock stuck on "…" forever. Clearing it where the map itself is rebuilt is the correct hook. Changelog: changelog-data.js is ~107KB covering 97 releases and the modal shows five, but it was a static import, so every user carried the whole history in the Settings bundle on every launch. Loading it when the modal opens cuts that chunk from 168KB to 85KB. Also documents, rather than half-fixes, the notch's 4Hz hit-rect timer. Gating it on real visibility needs a shown/hidden event from Rust that does not exist yet; the visibilityState check there cannot work because a window hidden with ShowWindow still reports "visible". The per-tick cost is one getBoundingClientRect, and the report already dedupes by signature, so no IPC.
The notch/auto-hide/fullscreen subsystem was re-fixed more than twenty times between 0.44 and 0.67, and every fix touched the same six files. The reason was never that the individual bugs were hard: the answer to "should the dock be visible right now" lived in nine mutable flags and ~130 references in dock.js, and reveal(), tryTuck() and onOcclusionSignal() each consulted a different subset of them in a different order. Adding a case to one meant remembering the others, so every fix was locally right and globally inconsistent. src/dock/visibility-policy.js now answers that question, and only it does. It is pure — no DOM, no Tauri, no timers — so the whole decision is a truth table in tests/visibility-policy.test.mjs rather than something you can only observe by driving a real window. The design that made it small: the old code conflated two independent concerns. What we want (mode, occlusion, fullscreen, a manual swipe, a notch summon) is policy. Whether we may act right now (pointer on the bar, drag in flight, menu open) is a gate. Separating them yields one rule — showing is always allowed, hiding waits until the user is done — which already existed as a comment in dock.js but was enforced by hand at each call site. decideVisible returns true, false, or null. The null is load-bearing, not a fallback: in click-trigger mode a tucked dock must not pop back out when the desktop clears, only when the notch is clicked. Both directions of that have shipped as bugs. Wiring is deliberately conservative. dock.js builds one visibilityState() snapshot that all three decision points read, and the guards for "something else owns visibility right now" (a live position preview, a fullscreen blackout, a file drag mid-flight) are kept as explicit early returns rather than folded into the policy, so this commit changes structure and not behaviour. Verified by 11 policy unit tests, 5 new smoke tests that push real occlusion and fullscreen signals through the listener path the app actually uses and assert the resulting transitions, and the 14 existing tests. 30 passing.
settings.jsx was 3623 lines with the search matcher and the pinned-tree helpers
buried in the middle, so neither could be tested without React and a browser.
Both are pure; moving them out gives 11 unit tests that run in plain Node and
cover behaviour that previously had none:
- settings/search.js — the option index and matcher behind the search box.
Tested for accent- and case-insensitivity (the dock ships in five languages),
the result cap, and empty/gibberish queries.
- settings/pin-model.js — locating a widget that may sit on the bar or nested
inside a group, and editing its style without mutating the caller's tree.
Tested for both nesting levels and for leaving siblings alone.
Also drops key={tab} from the panel wrapper. It was not doing what it looked
like: the panels are already conditionally rendered, so switching tabs unmounts
one and mounts the other regardless. All the key added was remounting the
wrapper and the save-status line with it, discarding the "saved" indicator
mid-flight.
Not done, deliberately: memoizing `set` and the panels. It only pays off if the
panels are memoized too, and nothing measured says Settings is slow — unlike the
magnify path, which had a reproducible 144-calls-per-second symptom. Optimizing
it now would be speculative.
The widget layer needed nothing from the dock: the formatters are pure, the painters write to the element they are handed, and the card markup is a string. Only the parts that genuinely depend on dock state — wiring a tile to the context menu, the poll loop, the note editor — stay behind. That makes eight rules testable without a browser for the first time. Two of them had shipped wrong: every marquee ran at one fixed duration no matter how long the title was, so long tracks raced across the card, and the clock had no notion of "nothing changed" and reformatted itself sixty times a minute. Reduced motion now reads as a live signal instead of a value captured at boot. Turning the accessibility setting on used to do nothing to anything the dock animates in JS until Booki was restarted, which is the one place a user who needs that setting is least likely to look. Also collapses the duplicate widget catalog: dock.js kept its own list of the same eleven widgets in a different order from the shared one.
Both windows are transparent stages that span far more than they paint, and both have to tell Rust which rectangles are actually clickable. They had each grown their own byte-identical helpers for measuring an element, deciding whether a point falls inside it, and deduping a set of rects — the arrangement where a fix lands in one window and quietly misses the other. The half-open edge rule now has a test: adjacent tiles must not both claim the seam between them, or a click that lands between two icons goes to whichever happens to be tested first.
Five things get placed beside the dock — the context menu, the popovers, the note editor, the update pill, the group flyout — and each carried its own copy of the same arithmetic: sit on the outward side of whatever edge the dock is anchored to, line up with a point along the bar, stay inside the window. The copies had drifted. Only the context menu clamped both axes, which is why a long menu opened near a corner was sliced at the window edge while the same situation was fine for a popover. A box taller than the window could come out at a negative coordinate. Both are covered now. Also disconnects the ResizeObserver a popover installs on itself. It was left watching the node after the popover closed, which keeps that node and its whole subtree alive — and the dock opens one for every trash prompt and every step of the coach.
Durations were twelve hand-typed values — 0.12s appeared 49 times, 0.14s 34, 0.18s 31 — so "slow the interface down a touch" meant editing 190 declarations, and the near-duplicates sitting next to each other (0.14s, 0.15s, 0.16s) were accidents rather than decisions. Five steps now, chosen by how much of the screen moves. Entrances become transitions. A keyframe cannot be interrupted: reopen a menu while it is still opening and it restarts from zero instead of redirecting from where it actually is, and the exit transition could not override it at all. It also fixes a snap nobody had traced: the undo toast's keyframe ended on `transform: none`, which threw away the toast's own translate(-50%) centring for the length of the animation and put it back at the end. Reduced motion now reaches the two largest movements Booki makes. Both are written in JS — magnify as an inline transform per frame, the notch travelling between edges via setPosition — so the global CSS override never touched either, and the setting did nothing where it mattered most. Magnify keeps a small scale on the tile under the pointer: that is not ornament, it is how you know what you are about to click. And 62 rules for markup that no longer exists come out, including a whole settings overflow menu and the theme-preset row.
Portuguese, French and German were each missing the same 90 keys, and t() falls back to English in silence — so those users saw the entire clipboard panel, the whole widget store and the backup flow in a language they had not chosen, with no indication anything was wrong. All three are at parity now, so the ratchet the check ran against is deleted and the rule is simply that every language defines every key. Three strings could not be translated at all because they were written into the markup and the component in Spanish: the drop hint, the update tooltip, and the names of the accent swatches. A German user dragging a file onto the bar was told "Suelta para anclar a Booki". The pages also declared a fixed language — two said Spanish, one said English — and nothing ever updated it, so a screen reader announced every string in the wrong language for four of the five locales. ensureLang now routes through setLang instead of assigning the language itself, which is exactly how the attribute stayed wrong in Settings, where ensureLang is the only call made. And the dock can be operated without a mouse. Every tile is a real button and Tab walked them correctly, but launching was wired only to pointerdown, so Enter and Space did nothing: you could tab across the whole bar without being able to open a single thing. The menu key reaches the right-click actions, the live widgets announce their updates, and the group flyout no longer claims to be a menu while containing a text field.
Drops window-vibrancy, which has been declared but unused since the materials moved to CSS, and trims crate-type to rlib: staticlib and cdylib come from Tauri's mobile template and were built, then thrown away, on every release of a desktop-only app. The README announced 0.59 while the app shipped 0.67, and AGENTS.md still described the copy as English/Spanish when there are five languages. Also fixes three changelog entries that named an icon the renderer does not know; it prints anything unrecognised as text, so those sections have been showing the literal word "sparkle".
The job had never once run green. Clippy has to compile the crate, and on Linux that pulls in Tauri's GTK and WebKit stack, so it died in gio-sys before reaching a single lint. The failure was invisible from a dev machine, where those packages are already installed — which is where clippy was being verified. A gate that cannot compile is not a gate.
Iterating a map only to discard the key, and a comparator that reverses a sort by hand where sort_by_key expresses it directly. Both are exactly what clippy suggested. Neither is reported by the toolchain in this dev container, which is several releases behind the `stable` the runner resolves. That gap is the reason the job is the authority and a local run is not.
The looping text is a song title or a clipboard entry — content Booki did not author — and the loop needs two copies of it, so it was escaped by hand and interpolated into innerHTML. Escaping worked, but it is the kind of thing that only has to be forgotten once, and CodeQL was right to flag the construction rather than trust a hand-rolled sanitizer. Setting textContent on real elements means the value is never parsed as markup at all: there is nothing left to escape, and nothing for a later edit to get wrong. Verified with a clipboard entry containing an img/onerror payload — it renders as visible text, creates no element, and the marquee still measures and scrolls exactly as before.
CodeQL flagged js/path-injection in the harness, and it was right. The guard read `p.startsWith(DIST)` — a prefix test on a string, not on a path. It caught `../../etc/passwd`, but a sibling directory named `dist-anything` passed it cleanly, because its path really does start with those letters. Now the path is resolved, percent-decoding is done before resolution rather than left to chance, and containment is compared against `DIST + separator`. The check also runs before touching the filesystem, so a rejected path is never stat'd. Nothing here was reachable by an attacker: the server listens on localhost, on a random port, only while `npm test` runs, and serves a build directory. But a containment check that does not check containment is worth fixing where it is written rather than where it happens to be harmless — and it is the kind of shape that gets copied somewhere it does matter. Pinned with a test covering the sibling-prefix case and both encoded forms.
0.68.0 — stability, design and architecture overhaul
Bumps the npm-all group with 11 updates in the / directory: | Package | From | To | | --- | --- | --- | | [@fluentui/react-components](https://github.com/microsoft/fluentui) | `9.74.3` | `9.74.7` | | [@fluentui/react-icons](https://github.com/microsoft/fluentui-system-icons) | `2.0.333` | `2.0.339` | | [@tauri-apps/plugin-updater](https://github.com/tauri-apps/plugins-workspace) | `2.10.1` | `2.11.0` | | [react](https://github.com/react/react/tree/HEAD/packages/react) | `19.2.7` | `19.2.8` | | [react-dom](https://github.com/react/react/tree/HEAD/packages/react-dom) | `19.2.7` | `19.2.8` | | [@tauri-apps/cli](https://github.com/tauri-apps/tauri) | `2.11.3` | `2.11.4` | | [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/tree/HEAD/packages/plugin-react) | `5.2.0` | `6.1.1` | | [eslint](https://github.com/eslint/eslint) | `9.39.5` | `10.9.1` | | [globals](https://github.com/sindresorhus/globals) | `17.7.0` | `17.12.0` | | [playwright](https://github.com/microsoft/playwright) | `1.62.0` | `1.62.1` | | [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) | `7.3.6` | `8.2.2` | Updates `@fluentui/react-components` from 9.74.3 to 9.74.7 - [Release notes](https://github.com/microsoft/fluentui/releases) - [Commits](https://github.com/microsoft/fluentui/commits) Updates `@fluentui/react-icons` from 2.0.333 to 2.0.339 - [Changelog](https://github.com/microsoft/fluentui-system-icons/blob/main/docs/releases.md) - [Commits](https://github.com/microsoft/fluentui-system-icons/commits) Updates `@tauri-apps/plugin-updater` from 2.10.1 to 2.11.0 - [Release notes](https://github.com/tauri-apps/plugins-workspace/releases) - [Commits](tauri-apps/plugins-workspace@updater-v2.10.1...updater-v2.11.0) Updates `react` from 19.2.7 to 19.2.8 - [Release notes](https://github.com/react/react/releases) - [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md) - [Commits](https://github.com/react/react/commits/v19.2.8/packages/react) Updates `react-dom` from 19.2.7 to 19.2.8 - [Release notes](https://github.com/react/react/releases) - [Changelog](https://github.com/react/react/blob/main/CHANGELOG.md) - [Commits](https://github.com/react/react/commits/v19.2.8/packages/react-dom) Updates `@tauri-apps/cli` from 2.11.3 to 2.11.4 - [Release notes](https://github.com/tauri-apps/tauri/releases) - [Commits](https://github.com/tauri-apps/tauri/compare/@tauri-apps/cli-v2.11.3...@tauri-apps/cli-v2.11.4) Updates `@vitejs/plugin-react` from 5.2.0 to 6.1.1 - [Release notes](https://github.com/vitejs/vite-plugin-react/releases) - [Changelog](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite-plugin-react/commits/plugin-react@6.1.1/packages/plugin-react) Updates `eslint` from 9.39.5 to 10.9.1 - [Release notes](https://github.com/eslint/eslint/releases) - [Commits](eslint/eslint@v9.39.5...v10.9.1) Updates `globals` from 17.7.0 to 17.12.0 - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](sindresorhus/globals@v17.7.0...v17.12.0) Updates `playwright` from 1.62.0 to 1.62.1 - [Release notes](https://github.com/microsoft/playwright/releases) - [Commits](microsoft/playwright@v1.62.0...v1.62.1) Updates `vite` from 7.3.6 to 8.2.2 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v8.2.2/packages/vite) --- updated-dependencies: - dependency-name: "@fluentui/react-components" dependency-version: 9.74.7 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: npm-all - dependency-name: "@fluentui/react-icons" dependency-version: 2.0.339 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: npm-all - dependency-name: "@tauri-apps/plugin-updater" dependency-version: 2.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: npm-all - dependency-name: react dependency-version: 19.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: npm-all - dependency-name: react-dom dependency-version: 19.2.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: npm-all - dependency-name: "@tauri-apps/cli" dependency-version: 2.11.4 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-all - dependency-name: "@vitejs/plugin-react" dependency-version: 6.1.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: npm-all - dependency-name: eslint dependency-version: 10.9.1 dependency-type: direct:development update-type: version-update:semver-major dependency-group: npm-all - dependency-name: globals dependency-version: 17.12.0 dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm-all - dependency-name: playwright dependency-version: 1.62.1 dependency-type: direct:development update-type: version-update:semver-patch dependency-group: npm-all - dependency-name: vite dependency-version: 8.2.2 dependency-type: direct:development update-type: version-update:semver-major dependency-group: npm-all ... Signed-off-by: dependabot[bot] <support@github.com>
Author
|
This pull request was built based on a group rule. Closing it will not ignore any of these versions in future pull requests. To ignore these dependencies, configure ignore rules in dependabot.yml |
dependabot
Bot
deleted the
dependabot/npm_and_yarn/npm-all-c3b0996404
branch
September 26, 2026 16:20
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps the npm-all group with 11 updates in the / directory:
9.74.39.74.72.0.3332.0.3392.10.12.11.019.2.719.2.819.2.719.2.82.11.32.11.45.2.06.1.19.39.510.9.117.7.017.12.01.62.01.62.17.3.68.2.2Updates
@fluentui/react-componentsfrom 9.74.3 to 9.74.7Commits
Updates
@fluentui/react-iconsfrom 2.0.333 to 2.0.339Commits
Updates
@tauri-apps/plugin-updaterfrom 2.10.1 to 2.11.0Release notes
Sourced from @tauri-apps/plugin-updater's releases.
... (truncated)
Commits
6aa2854publish new versions (#3509)9d6d032chore(deps): update h2 to 0.4.19 (#3556)98f8787ci: fix typo in workflow permissions1a7b12cci: add explicit token permissions2f4c85cchore(deps): bump serde_with (#3490)c546de0chore(deps): update dependency rollup to v4.62.5 (#3520)db9c599fix(android): missingconsumer-rules.pro(#3531)9c93437chore(deps): update dependency typescript-eslint to v8.66.0 (#3391)685610afix(fs): default permissions (#3507)f8053e6docs: cargo features (#3527)Updates
reactfrom 19.2.7 to 19.2.8Release notes
Sourced from react's releases.
Commits
1dd4ecb[FlightReply] Performance improvements when decoding (#37087)b0d2fdb[19.2.x] Update required references to GitHub repo (#36753)Updates
react-domfrom 19.2.7 to 19.2.8Release notes
Sourced from react-dom's releases.
Commits
1dd4ecb[FlightReply] Performance improvements when decoding (#37087)b0d2fdb[19.2.x] Update required references to GitHub repo (#36753)Updates
@tauri-apps/clifrom 2.11.3 to 2.11.4Release notes
Sourced from @tauri-apps/cli's releases.
Commits
8909f22apply version updates (#15598)67ffa19fix(bundler): make .desktop and .DirIcon relative symlinks (#15596)c5c8b2bdocs(readme): desktop platforms -> operating systems, closes #1558980d437ffix(#15580): bump memmap2 (#15587)469ecc8test: regenerate stale macOS acl snapshot for has_app_acl (#15576)5be0cb8fix(ci): change strip to debuginfo for cloudflare worker (#15574)4bbd497chore(deps): bump cloudflare worker versions (#15573)5712549chore(deps): update dependency rollup to v4.62.0 (#15551)c8faedfci: test on node 20,22 instead of node 18,203641e26refactor: simplify menu code (#15559)Updates
@vitejs/plugin-reactfrom 5.2.0 to 6.1.1Release notes
Sourced from @vitejs/plugin-react's releases.
... (truncated)
Changelog
Sourced from @vitejs/plugin-react's changelog.
... (truncated)
Commits
04cac50release: plugin-react@6.1.1 (#1440)82d35abfix(react): respect environment sourcemap option whenbuilder.sharedPlugins...397e847fix(react): make logging diagnostics an opt-in for React Compiler (#1431)61006e6fix(deps): update all non-major dependencies (#1433)e2a649cchore: usedeps.neverBundleinstead ofexternalin tsdown config (#1430)fb2d6f3fix(deps): update all non-major dependencies (#1427)39b3173release: plugin-react@6.1.0 (#1428)f1340b0feat(react): add native React Compiler support (#1419)9ab698efix(deps): update all non-major dependencies (#1375)68c0cb8release: plugin-react@6.0.5 (#1362)Updates
eslintfrom 9.39.5 to 10.9.1Release notes
Sourced from eslint's releases.
... (truncated)
Commits
5c8c24110.9.1a7f3b7dBuild: changelog update for 10.9.11e641c9fix: no-loss-of-precision false positive with trailing decimal point (#21251)ad74a8ddocs: add deprecation steps for EOL package versions (#21248)3c3ae53chore: update ecosystem plugins (#21249)c27bc9210.9.0fa831d9Build: changelog update for 10.9.0899dbf1chore: update github/codeql-action action to v4.37.7 (#21243)08de88efeat: handle underflow in no-loss-of-precision (#21218)9ef407adocs: use eslint.config.* wherever config file names are listed (#21216)Updates
globalsfrom 17.7.0 to 17.12.0Release notes
Sourced from globals's releases.
Commits
98008c317.12.050a2119Update globals (2026-09-01) (#353)779a11aAdd__webpack_layer__global (#351)8c5992717.11.061eafbfAddreact-nativeglobals (#337)7bed4af17.10.0f468407AddGM_cookieto Greasemonkey globals (#349)8e7b93517.9.05a958edUpdate globals (2026-08-01) (#348)36c765917.8.0Updates
playwrightfrom 1.62.0 to 1.62.1Release notes
Sourced from playwright's releases.
Commits
26a9e47cherry-pick(#42043): docs: release notes for v1.62 Python, Java, and .NET (#4...0a81d5dcherry-pick(#42040): docs(release-notes): mention the isolated headless clipb...8376826cherry-pick(#42034): fix(aria): keep icon-only clickable elements in ai snaps...66c5cc9chore: mark v1.62.1 (#42020)9672bc3cherry-pick(#42009): fix(types): support branded primitives in evaluate argum...4325804cherry-pick(#41988): fix(aria): preserve names from collapsed text contributors9632f8echerry-pick(#42005): fix(tsconfig): do not throw when "extends"/"references" ...Updates
vitefrom 7.3.6 to 8.2.2Release notes
Sourced from vite's releases.
... (truncated)
Changelog
Sourced from vite's changelog.
... (truncated)
Commits
de1111arelease: v8.2.2cb77e2atest(ssr): add destructing assignment case for moduleRunnerTransform (#23308)9db0b61fix(ssr): rewrite computed key of destructing parameter (#23307)8413052fix: respectresolve.preserveSymlinkswhen resolving root (fix #23197) (#23...05a003efix(config): resolve sourcemap paths against sourcemap location (#23239)495d9fffeat(deps): widen@vitejs/devtoolspeer range to v0.5.0 (#23302)1d9fa39refactor: use JSON import attributes instead of readFileSync in constants (#2...2804636fix(css): don't pass empty targets to lightningcss (#23295)599b44btest(module-runner): simplify server-hmr tests (#23300)4a261f2test(module-runner): add TLA circular import case (#23299)Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore <dependency name> major versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)@dependabot ignore <dependency name> minor versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)@dependabot ignore <dependency name>will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)@dependabot unignore <dependency name>will remove all of the ignore conditions of the specified dependency@dependabot unignore <dependency name> <ignore condition>will remove the ignore condition of the specified dependency and ignore conditions