Skip to content

build(deps): bump the npm-all group across 1 directory with 11 updates - #67

Closed
dependabot[bot] wants to merge 247 commits into
mainfrom
dependabot/npm_and_yarn/npm-all-c3b0996404
Closed

dependabot[bot] wants to merge 247 commits into
mainfrom
dependabot/npm_and_yarn/npm-all-c3b0996404

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Sep 6, 2026 •

Copy link
Copy Markdown

Bumps the npm-all group with 11 updates in the / directory:

Package From To
@fluentui/react-components 9.74.3 9.74.7
@fluentui/react-icons 2.0.333 2.0.339
@tauri-apps/plugin-updater 2.10.1 2.11.0
react 19.2.7 19.2.8
react-dom 19.2.7 19.2.8
@tauri-apps/cli 2.11.3 2.11.4
@vitejs/plugin-react 5.2.0 6.1.1
eslint 9.39.5 10.9.1
globals 17.7.0 17.12.0
playwright 1.62.0 1.62.1
vite 7.3.6 8.2.2

Updates @fluentui/react-components from 9.74.3 to 9.74.7

Commits

Updates @fluentui/react-icons from 2.0.333 to 2.0.339

Commits

Updates @tauri-apps/plugin-updater from 2.10.1 to 2.11.0

Release notes

Sourced from @​tauri-apps/plugin-updater's releases.

updater-js v2.11.0

[2.11.0]

  • f8053e65 (#3527 by @​Legend-Master) Documented Cargo feature flags in each plugin's crate-level documentation.
  • 622f02bf (#3516 by @​Legend-Master) On Windows, returns an error if failed to spawn the installer in install through ShellExecuteW
  • ab7489c9 (#3299 by @​Legend-Master) On Windows, add a new option restartAfterInstall/restart_after_install to install an update without the installer re-launching the app
  • 2371be83 (#3526 by @​Legend-Master) Added system-proxy (enabled by default) feature flag to control reqwest/system-proxy feature (Use Windows and macOS system proxy settings automatically)
npm warn publish npm auto-corrected some errors in your package.json when publishing.  Please run "npm pkg fix" to address these errors.
npm warn publish errors corrected:
npm warn publish "repository" was changed from a string to an object
npm warn publish "repository.url" was normalized to "git+https://github.com/tauri-apps/plugins-workspace.git"
npm notice
npm notice 📦  @tauri-apps/plugin-updater@2.11.0
npm notice Tarball Contents
npm notice 888B LICENSE.spdx
npm notice 3.2kB README.md
npm notice 3.2kB dist-js/index.cjs
npm notice 3.1kB dist-js/index.d.ts
npm notice 3.2kB dist-js/index.js
npm notice 659B package.json
npm notice Tarball Details
npm notice name: @tauri-apps/plugin-updater
npm notice version: 2.11.0
npm notice filename: tauri-apps-plugin-updater-2.11.0.tgz
npm notice package size: 3.9 kB
npm notice unpacked size: 14.3 kB
npm notice shasum: e9c012d8afe85ea28adb764ec5965c7bff5657d3
npm notice integrity: sha512-AE36XkOoSna24[...]Hu28LgrsBwIxQ==
npm notice total files: 6
npm notice
npm notice npm tokens that bypass 2FA are being restricted for account changes and direct publishing. Learn how to prepare: https://gh.io/npm-gat-bypass2fa-deprecation
npm notice Publishing to https://registry.npmjs.org/ with tag latest and public access
npm notice publish Signed provenance statement with source and build information from GitHub Actions
npm notice publish Provenance statement published to transparency log: https://search.sigstore.dev/?logIndex=2662660526
+ @tauri-apps/plugin-updater@2.11.0

updater v2.11.0

[2.11.0]

... (truncated)

Commits

Updates react from 19.2.7 to 19.2.8

Release notes

Sourced from react's releases.

19.2.8 (July 21st, 2026)

React Server Components

Commits

Updates react-dom from 19.2.7 to 19.2.8

Release notes

Sourced from react-dom's releases.

19.2.8 (July 21st, 2026)

React Server Components

Commits

Updates @tauri-apps/cli from 2.11.3 to 2.11.4

Release notes

Sourced from @​tauri-apps/cli's releases.

@​tauri-apps/cli v2.11.4

[2.11.4]

Bug Fixes

  • 67ffa192a (#15596 by @​FabianLars) Fixed an issue in the AppImage bundler that caused the /.desktop and .DirIcon files to be absolute symlinks instead of relative symlinks which caused problems with AppImage installers like AppManager.

Dependencies

  • Upgraded to tauri-cli@2.11.4
Commits

Updates @vitejs/plugin-react from 5.2.0 to 6.1.1

Release notes

Sourced from @​vitejs/plugin-react's releases.

plugin-react@6.1.1

Add compiler.logDiagnostics option

Recoverable React Compiler diagnostics are no longer logged by default. Set compiler.logDiagnostics to true to log them through Vite. Fatal diagnostics are always logged and fail the transform.

Respect environment sourcemap option for React Compiler transform when builder.sharedPlugins is enabled (#1439)

The React Compiler transform was using the top-level sourcemap option instead of the environment sourcemap option. This caused a problem when the experimental builder.sharedPlugins was enabled.

plugin-react@6.1.0

Add experimental native React Compiler support (#1419)

Add experimental native React Compiler support.

You can use it by installing oxc-transform-react and enabling it via the compiler option:

npm install -D oxc-transform-react
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [
react({ compiler: true })
]
})

plugin-react@6.0.5

Fixed the react compiler preset filter to be linear (#1353)

The improved filter in v6.0.3 was non-linear and caused a performance regression (#1349). The filter was changed to be linear to avoid that.

plugin-react@6.0.4

Fixed $RefreshSig$ is not defined error when running vite dev with NODE_ENV=production

When running vite dev with NODE_ENV=production, the app errored with $RefreshSig$ is not defined. This error is now fixed.

plugin-react@6.0.3

No release notes provided.

plugin-react@6.0.2

Allow all options in reactCompilerPreset (#1189)

This is a type only change. Only compilationMode and target options were available for reactCompilerPreset.

plugin-react@6.0.1

Expand @rolldown/plugin-babel peer dep range (#1146)

... (truncated)

Changelog

Sourced from @​vitejs/plugin-react's changelog.

6.1.1 (2026-08-28)

Add compiler.logDiagnostics option

Recoverable React Compiler diagnostics are no longer logged by default. Set compiler.logDiagnostics to true to log them through Vite. Fatal diagnostics are always logged and fail the transform.

Respect environment sourcemap option for React Compiler transform when builder.sharedPlugins is enabled (#1439)

The React Compiler transform was using the top-level sourcemap option instead of the environment sourcemap option. This caused a problem when the experimental builder.sharedPlugins was enabled.

6.1.0 (2026-08-19)

Add experimental native React Compiler support (#1419)

Add experimental native React Compiler support.

You can use it by installing oxc-transform-react and enabling it via the compiler option:

npm install -D oxc-transform-react
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [
react({ compiler: true })
]
})

6.0.5 (2026-07-30)

Fixed the react compiler preset filter to be linear (#1353)

The improved filter in v6.0.3 was non-linear and caused a performance regression (#1349). The filter was changed to be linear to avoid that.

6.0.4 (2026-07-22)

Fixed $RefreshSig$ is not defined error when running vite dev with NODE_ENV=production

When running vite dev with NODE_ENV=production, the app errored with $RefreshSig$ is not defined. This error is now fixed.

6.0.3 (2026-06-23)

Improve the react compiler preset filter to reduce false-positives (#1138)

Improved the filter in the react compiler babel preset to reduce the false-positives so that less modules are processed by the react compiler.

... (truncated)

Commits
  • 04cac50 release: plugin-react@6.1.1 (#1440)
  • 82d35ab fix(react): respect environment sourcemap option when builder.sharedPlugins...
  • 397e847 fix(react): make logging diagnostics an opt-in for React Compiler (#1431)
  • 61006e6 fix(deps): update all non-major dependencies (#1433)
  • e2a649c chore: use deps.neverBundle instead of external in tsdown config (#1430)
  • fb2d6f3 fix(deps): update all non-major dependencies (#1427)
  • 39b3173 release: plugin-react@6.1.0 (#1428)
  • f1340b0 feat(react): add native React Compiler support (#1419)
  • 9ab698e fix(deps): update all non-major dependencies (#1375)
  • 68c0cb8 release: plugin-react@6.0.5 (#1362)
  • Additional commits viewable in compare view

Updates eslint from 9.39.5 to 10.9.1

Release notes

Sourced from eslint's releases.

v10.9.1

Bug Fixes

  • 1e641c9 fix: no-loss-of-precision false positive with trailing decimal point (#21251) (Aleksandr Shoronov)

Documentation

  • ad74a8d docs: add deprecation steps for EOL package versions (#21248) (Francesco Trotta)

Chores

v10.9.0

Features

  • 08de88e feat: handle underflow in no-loss-of-precision (#21218) (Rithish S)
  • 55db479 feat: add checkConditionalExpressions to no-unmodified-loop-condition (#21175) (sethamus)

Bug Fixes

  • 2ba3025 fix: prevent unsafe no-var autofix with hoisted functions (#21213) (sethamus)
  • 8e69622 fix: Prevent no-var autofix when var is shadowed by catch parameter (#21204) (Yang Hyeonjong)
  • 684b579 fix: prefer-template invalid autofix creates a tagged template call (#21207) (김채영)

Documentation

  • 9ef407a docs: use eslint.config.* wherever config file names are listed (#21216) (Marry (Subin Yang))
  • 87f66f4 docs: Update README (GitHub Actions Bot)
  • 585ef37 docs: update architecture documentation (#21112) (Francesco Trotta)
  • f3993b0 docs: Update README (GitHub Actions Bot)
  • ffc87d6 docs: fix broken links in Further Reading sections (#21203) (Minsu)
  • 1a761e1 docs: update moved JSX specification links (#21198) (Imran Mustafa)
  • 4d00ca4 docs: update ESLint peer dependency to ^10.0.0 in shareable configs (#21202) (lumir)
  • 510d1a2 docs: Update README (GitHub Actions Bot)

Chores

  • 899dbf1 chore: update github/codeql-action action to v4.37.7 (#21243) (renovate[bot])
  • 9aa3873 chore: update ecosystem plugins (#21235) (ESLint Bot)
  • dc1e7a8 chore: update ecosystem plugins (#21208) (ESLint Bot)
  • f878d21 ci: bump pnpm/action-setup from 6.0.9 to 6.0.10 (#21200) (dependabot[bot])
  • 4891e50 ci: bump github/codeql-action from 4.37.4 to 4.37.6 (#21199) (dependabot[bot])

v10.8.1

Bug Fixes

  • 18eb0a7 fix: prevent ASI hazard in no-unused-labels autofix (#21173) (dongkyu lee)
  • 151ba3f fix: false positives in getter-return and accessor-pairs (#21163) (Grit)
  • 6898df9 fix: ignore meta-property names in id-denylist (#21166) (Pixel)
  • 4d7db66 fix: ignore meta-property names in id-match (#21167) (Pixel)
  • 677214e fix: handle ASI hazards in no-unused-vars removeVar suggestion (#20935) (kuldeep kumar)

Documentation

  • 7d0cbf8 docs: Update README (GitHub Actions Bot)
  • 0a05812 docs: add missing backticks to no-duplicate-imports.js (#21183) (Lee Daeun)
  • 678c90b docs: Update README (GitHub Actions Bot)
  • 8a10424 docs: Update README (GitHub Actions Bot)

... (truncated)

Commits

Updates globals from 17.7.0 to 17.12.0

Release notes

Sourced from globals's releases.

v17.12.0

  • Update globals (2026-09-01) (#353) 50a2119
  • Add __webpack_layer__ global (#351) 779a11a

sindresorhus/globals@v17.11.0...v17.12.0

v17.11.0

  • Add react-native globals (#337) 61eafbf

sindresorhus/globals@v17.10.0...v17.11.0

v17.10.0

  • Add GM_cookie to Greasemonkey globals (#349) f468407

sindresorhus/globals@v17.9.0...v17.10.0

v17.9.0

  • Update globals (2026-08-01) (#348) 5a958ed

sindresorhus/globals@v17.8.0...v17.9.0

v17.8.0

  • Update globals (2026-07-01) (#347) 7394811

sindresorhus/globals@v17.7.0...v17.8.0

Commits

Updates playwright from 1.62.0 to 1.62.1

Release notes

Sourced from playwright's releases.

v1.62.1

Bug Fixes

  • #41989 [Regression]: tsconfig "extends" bare specifier isn't resolved via node_modules walk-up like tsc (fatal since 1.62)
  • #41998 [Regression]: directory-form tsconfig project references ("path": "../pkg") fail to resolve (fatal since 1.62)
  • #41985 Accessibility snapshot drops button name when text is nested inside spans with aria-hidden SVG
  • #42000 [Regression]: page.evaluate() arg of a branded primitive type (string & { brand }) no longer type-checks since 1.62
  • #42013 [BUG]Image-type actionable elements are not presented in the snapshot.
Commits
  • 26a9e47 cherry-pick(#42043): docs: release notes for v1.62 Python, Java, and .NET (#4...
  • 0a81d5d cherry-pick(#42040): docs(release-notes): mention the isolated headless clipb...
  • 8376826 cherry-pick(#42034): fix(aria): keep icon-only clickable elements in ai snaps...
  • 66c5cc9 chore: mark v1.62.1 (#42020)
  • 9672bc3 cherry-pick(#42009): fix(types): support branded primitives in evaluate argum...
  • 4325804 cherry-pick(#41988): fix(aria): preserve names from collapsed text contributors
  • 9632f8e cherry-pick(#42005): fix(tsconfig): do not throw when "extends"/"references" ...
  • See full diff in compare view

Updates vite from 7.3.6 to 8.2.2

Release notes

Sourced from vite's releases.

plugin-legacy@8.2.2

Please refer to CHANGELOG.md for details.

v8.2.2

Please refer to CHANGELOG.md for details.

plugin-legacy@8.2.1

Please refer to CHANGELOG.md for details.

v8.2.1

Please refer to CHANGELOG.md for details.

create-vite@8.2.0

Please refer to CHANGELOG.md for details.

plugin-legacy@8.2.0

Please refer to CHANGELOG.md for details.

v8.2.0

Please refer to CHANGELOG.md for details.

v8.2.0-beta.0

Please refer to CHANGELOG.md for details.

v8.1.5

Please refer to CHANGELOG.md for details.

v8.1.4

Please refer to CHANGELOG.md for details.

v8.1.3

Please refer to CHANGELOG.md for details.

v8.1.2

Please refer to CHANGELOG.md for details.

v8.1.1

Please refer to CHANGELOG.md for details.

create-vite@8.1.0

Please refer to CHANGELOG.md for details.

plugin-legacy@8.1.0

Please refer to CHANGELOG.md for details.

v8.1.0

Please refer to CHANGELOG.md for details.

plugin-legacy@8.1.0-beta.0

Please refer to CHANGELOG.md for details.

... (truncated)

Changelog

Sourced from vite's changelog.

8.2.2 (2026-08-20)

Features

  • deps: widen @vitejs/devtools peer range to v0.5.0 (#23302) (495d9ff)

Bug Fixes

  • bundled-dev: handle lazy request error (#23291) (3ba026d)
  • bundled-dev: hot update through circular imports instead of reloading (#23259) (3dbddef)
  • config: resolve sourcemap paths against sourcemap location (#23239) (05a003e)
  • css: don't pass empty targets to lightningcss (#23295) (2804636)
  • define: fix match escaped dots to support $-prefixed define keys (#23249) (dcf88bd)
  • deps: update all non-major dependencies (#23217) (ba958bd)
  • deps: update rolldown-related dependencies (#23218) (83ecb2c)
  • module-runner: exclude completed modules from in-flight cycle detection (fix #22999) (#23009) (d9b10a9)
  • optimizer: close custom extension analysis bundles (#23207) (8fb7675)
  • reduce Windows 8.3-short-name detection false-positives (#23066) (02cffa9)
  • respect resolve.preserveSymlinks when resolving root (fix #23197) (#23198) (8413052)
  • ssr: rewrite computed key of destructing parameter (#23307) (9db0b61)
  • vite: update outdated upstream file links in license comments (#23285) (c0f2fc6)

Documentation

Miscellaneous Chores

Code Refactoring

  • use JSON import attributes instead of readFileSync in constants (#23258) (1d9fa39)
  • use named regex constants over inline literals (#22964) (5c1c6c6)

Tests

  • define: close rolldown bundler after generate (#23231) (b4d66fe)
  • module-runner: add TLA circular import case (#23299) (4a261f2)
  • module-runner: simplify server-hmr tests (#23300) (599b44b)
  • ssr: add destructing assignment case for moduleRunnerTransform (#23308) (cb77e2a)

Build System

  • use JSON import attributes instead of readFIleSync in rolldown configs (#23251) (d615bcd)

8.2.1 (2026-08-06)

Bug Fixes

  • build: make client chunkImportMap work with sharedPlugins: true (#23184) (15f0307)
  • bundled-dev: inject client script tag before chunk scripts (#23161) (eac0cc8)

... (truncated)

Commits
  • de1111a release: v8.2.2
  • cb77e2a test(ssr): add destructing assignment case for moduleRunnerTransform (#23308)
  • 9db0b61 fix(ssr): rewrite computed key of destructing parameter (#23307)
  • 8413052 fix: respect resolve.preserveSymlinks when resolving root (fix #23197) (#23...
  • 05a003e fix(config): resolve sourcemap paths against sourcemap location (#23239)
  • 495d9ff feat(deps): widen @vitejs/devtools peer range to v0.5.0 (#23302)
  • 1d9fa39 refactor: use JSON import attributes instead of readFileSync in constants (#2...
  • 2804636 fix(css): don't pass empty targets to lightningcss (#23295)
  • 599b44b test(module-runner): simplify server-hmr tests (#23300)
  • 4a261f2 test(module-runner): add TLA circular import case (#23299)
  • Additional commits viewable in compare view

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 rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore <dependency name> major version will 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 version will 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

punkable and others added 30 commits June 16, 2026 02:16
- 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.
claude and others added 22 commits July 25, 2026 04:45
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>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels Sep 6, 2026
@punkable punkable closed this Sep 26, 2026
@dependabot @github

dependabot Bot commented on behalf of github Sep 26, 2026

Copy link
Copy Markdown
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
dependabot Bot deleted the dependabot/npm_and_yarn/npm-all-c3b0996404 branch September 26, 2026 16:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants