Commit graph

111 commits

Author SHA1 Message Date
Lane Sawyer
c437dfc35a
chore(ui): removes dead utilities and op-log leftovers [#8260 - Tier A] (#8892)
* chore(ui): removes dead utilities and op-log leftovers [#8260 - Tier A]

* update readme and remove-unused-log-imports.ts

* restore benchmark test and make runnable
2026-07-11 13:05:34 +02:00
Johannes Millan
2bc3641cfa 18.14.0 2026-07-10 17:23:35 +02:00
Johannes Millan
5c9c0c2131 18.13.1 2026-07-02 16:41:38 +02:00
Johannes Millan
78e546ff6a 18.13.0 2026-07-02 15:25:39 +02:00
Johannes Millan
db6b17d25b 18.12.1 2026-06-22 13:37:54 +02:00
Johannes Millan
350536e7ed 18.12.0 2026-06-20 17:17:50 +02:00
Johannes Millan
2cf67cee71 18.11.0 2026-06-18 13:37:47 +02:00
Johannes Millan
5d2abbf847 18.10.0 2026-06-12 13:11:09 +02:00
johannesjo
1f24d5572d 18.9.1 2026-06-05 22:45:35 +02:00
Johannes Millan
920071f5ce 18.9.0 2026-06-05 20:30:11 +02:00
Johannes Millan
24725c9360 18.8.0 2026-05-30 01:19:30 +02:00
Johannes Millan
2580ea6eb1
perf(plugins): skip no-op doc-mode saves + rename to doc-mode (#7825)
* perf(plugins): skip no-op doc-mode saves via lastSeenDocBytes equality

Closes #7815.

flushSave and flushSaveSync now compute the would-be-written raw bytes
first and short-circuit when they equal lastSeenDocBytes — a typed-then-
reverted cycle inside the 30s throttle window no longer produces a
postMessage round-trip, an IDB transaction, or an op-log entry.

The baseline is intentionally NOT updated on a skip: it already equals
these bytes, so the self-echo invariant for PERSISTED_DATA_CHANGED
(#7752) is preserved.

Drive-by: added the isDocCorrupt guard to flushSave for symmetry with
flushSaveSync / scheduleSave. The schedule gate normally prevents
flushSave from firing on a corrupt doc, but corruption can be set
between schedule and fire (e.g. a remote-update reload turning up an
unparseable blob), so the explicit guard is cheaper than reasoning
about that invariant.

Persistence rename: saveContextDoc → persistContextDocRaw. The caller
now owns serialisation (via serializeContextDoc) so the byte-compare
can run before the persist dispatch. Three persistence.spec.ts tests
replace the dropped saveContextDoc test: exact-raw write, encoder
determinism (the premise the byte-compare relies on), and
write-idempotence (which proves the skip loses no information).

* refactor(plugins): apply doc-mode no-op-save review findings (#7815)

Multi-review follow-ups for #7815:

- Tighten serializeContextDoc determinism test: previously asserted
  equality between a doc and its `{...doc}` spread, which preserves V8
  insertion order — the test would pass even against a future encoder
  that randomised iteration over Map-backed nodes (the real failure
  mode for the byte-compare). Now asserts repeated-call determinism on
  the same input directly, plus type+non-empty shape so a future return-
  type change (e.g. Uint8Array) breaks here, not in the editor.

- Document the sync/async stamp asymmetry in flushSaveSync: it stamps
  lastSeenDocBytes BEFORE the void dispatch, whereas flushSave stamps
  AFTER `await`. Both are correct (the sync path is fire-and-forget and
  the iframe can be torn down mid-call, so a post-dispatch stamp would
  silently drop on teardown) but the divergence wasn't called out in
  the inline comments.

* refactor(plugins): rename document-mode to doc-mode

Renames the bundled plugin's id (`document-mode` → `doc-mode`), display
name (`Document Mode (Alpha)` → `Doc Mode (Alpha)`), package name,
directory, and asset path. No migration: the plugin has never been
published, so there is no on-disk user data to preserve.

Touched everywhere the id was hardcoded:
- Plugin manifest, package.json, build/deploy/test scripts, log prefixes
- Host BUNDLED_PLUGIN_PATHS entry (src/app/plugins/plugin.service.ts)
- Host comments and test fixtures (plugin-hooks, plugin-persistence-key,
  plugin-persistence.model, conflict-resolution.service.spec)
- E2E spec filenames + PLUGIN_ID constant + label assertions
- build-all.js plugin orchestrator
- build/release-notes.md user-facing entry

Test pass: 88/88 plugin specs, 8/8 plugin-hooks, 132/132
conflict-resolution, 15/15 plugin-persistence-key.util.
Bundle redeployed to src/assets/bundled-plugins/doc-mode (gitignored).

The old `src/assets/bundled-plugins/document-mode/` dir is gitignored and
left on disk after this commit; the host loader no longer references it,
so it's inert. Remove with `rm -rf src/assets/bundled-plugins/document-mode`.

* refactor(plugins): apply doc-mode rename review findings

Multi-review follow-ups for the rename in 3443bcacd0:

- editor.ts:1920: missed runtime log string ('Document mode:' →
  'doc-mode:') — leaked into the dev console with inconsistent brand
  because the rename sweep matched on the kebab `document-mode` or the
  PascalCase `Document Mode`, not the bare-space `Document mode`.
- editor.ts + background.ts header JSDoc: `Document-Mode editor` /
  `Document-Mode background script` → `Doc-Mode …`. Cosmetic but the
  only remaining branded references in the source.
- scripts/build.js: esbuild iife `globalName: 'DocumentModePlugin'` →
  `'DocModePlugin'`. Internal global, no consumers, but worth keeping
  consistent with the new id.
- src/app/plugins/plugin.service.ts: add a header comment to
  BUNDLED_PLUGIN_PATHS noting that pluginIds become entityId prefixes in
  IDB / op-log / sync wire and must be treated as permanent for any
  plugin that has ever shipped. Records the rule we relied on being
  absent for this rename.

DOM-document references (`installDocumentDragHandlers`,
`Document-status banner`, `Document-level pointer handlers`) left
unchanged — those refer to the browser document object, not the brand.
Historical plan docs in `docs/plans/2026-05-2[123]-*.md` also left
unchanged per the rename commit's intent.
2026-05-27 17:30:38 +02:00
Johannes Millan
4212ed4b0d 18.7.0 2026-05-23 12:53:32 +02:00
johannesjo
605e5f6d52 18.6.0 2026-05-16 14:26:17 +02:00
Johannes Millan
ddc01ab6cf build(electron): exclude uuidv7 and guard against future asar regressions
uuidv7 is imported only from src/app/util/uuid-v7.ts; the Angular
bundler inlines it (verified via chunk-65AEYVPY.js.map source
attribution). Adding it to the three electron-builder configs drops
another ~80 KB from the asar.

Extend tools/verify-electron-requires.js to also flag bare require()
targets in electron/ that match a `\!**/<pkg>/**` exclusion in
electron-builder.yaml. Without this, adding `require('@noble/ciphers')`
or similar in electron/main.ts would pass dev (which resolves against
on-disk node_modules) and only crash with MODULE_NOT_FOUND on packaged
releases. The script is already invoked from .github/workflows/
electron-smoke.yml, so the new check runs in CI automatically.

Manual verification covers 14 cases (8 excluded, 6 allowed) including
@noble/ciphers, @noble/hashes, scoped-vs-bare resolution, and Node
built-ins.
2026-05-13 21:22:59 +02:00
Johannes Millan
95b0d8e2f7 build(electron): exclude dev/mobile deps from asar to shrink installer
Adds 10 file patterns to the three electron-builder configs that prune
node_modules entries which are never required from electron/ at runtime:

- Capacitor + capawesome + capacitor-plugin-safe-area (mobile shim)
- sharp + @img native binaries (only used by tools/generate-*-icon.js)
- @lmdb (Nx cache) and @rollup (build tool) pulled in transitively
- @material-symbols (already compiled into the Angular CSS bundle)
- @noble/ciphers and hash-wasm (inlined into the Angular bundle by the
  bundler; the WASM payloads are base64-embedded)

Verified inlining via chunk-H6URPRRJ.js.map source attribution and by
locating distinctive WASM/AES fingerprints inside the Angular chunks.
2026-05-13 21:15:40 +02:00
Johannes Millan
90abae0c3b fix(linux): align wrapper wm class with desktop entry 2026-05-09 18:11:40 +02:00
Johannes Millan
297aeb30ab fix(electron): harden Snap+Wayland argv wrapper after multi-review
Address findings from code-reviewer + debugger-assistant +
refactor-specialist multi-review on 8e1c47ebc2:

- afterPack: read wrapper source before rename; on writeFile failure,
  roll the rename back so a broken intermediate state can't ship a
  package with no launcher. Strengthen idempotency check to require a
  shebang at binPath (both files alone no longer counts as "installed").
- wrapper: gate the X11 injection on \$SNAP_NAME = "superproductivity",
  not just \$SNAP set. An xdg-open from a sibling snap (e.g. Firefox)
  leaks \$SNAP into the child env, which previously would have silently
  forced XWayland on .deb/.rpm users. Derive BIN_DIR from \$SNAP
  directly when we are our snap, avoiding fragile \$0 resolution
  through snapd's wrapper chain. Stop argv scanning at -- so positional
  args that resemble --ozone-platform aren't misread as a user override.
- app-control: point app.relaunch() execPath at the sibling shell
  wrapper instead of the default process.execPath (which is the renamed
  ELF and would bypass the flag injection on a relaunched Snap+Wayland
  instance).
- Move build/snap-wrapper.sh -> build/linux/snap-wrapper.sh to match
  the existing build/linux/ layout convention.
- Update research doc §18 to reflect the tightened predicate and the
  relaunch fix.
2026-04-21 15:03:42 +02:00
Johannes Millan
7f503c9bf0 fix(electron): inject ozone-platform=x11 via argv wrapper for Snap+Wayland
Field reports on issue #7270 (v18.2.4 / v18.2.5) show that
app.commandLine.appendSwitch('ozone-platform','x11') is not equivalent
to the CLI flag on Snap+Wayland: Chromium's Ozone init dlopens
libEGL/libgbm on the core22 Mesa path before the switch is honored and
segfaults under host-vs-snap Mesa ABI drift, while the same flag on
argv consistently works.

Install an afterPack hook that renames the Electron binary and drops a
shell wrapper at the original name. The wrapper injects the flag into
argv only when \$SNAP is set AND the session is Wayland — non-Snap
targets (AppImage, .deb, .rpm) and X11 sessions pass through untouched.
Matches the mechanism used by snapcrafters/signal-desktop and
snapcrafters/mattermost-desktop.

See docs/research/snap-wayland-gpu-fix-research.md §18 for the full
evidence trail, drawbacks, validation plan, and removal conditions.
2026-04-21 15:03:42 +02:00
Corey Newton
972acd358c
docs/wiki content v0.8 (#7068)
* docs(wiki): refactor download page

Rework and improve download page in preparation for README updates.

* chore(ci): simplify the initial release text

Centralizing all links to one place will make maintenance of docs
easier.

* chore(docs): Update meta docs and templates

Aligning issue templates and other docs to support the use of the wiki
and to encourage additions from others.

* chore(docs): align README with new download page
2026-04-01 12:40:28 +02:00
Johannes Millan
602f1f2a71 fix: point changelog link in release notes to GitHub releases. Fixes #6890
CHANGELOG.md was removed from the repo in favor of git-based release
notes, but the release notes template still linked to it, causing a 404.
2026-03-20 21:36:30 +01:00
Johannes Millan
d401e6169e feat(tasks): add deadlines feature with reminders and planner integration
Add deadline support for tasks with date-only and time-specific deadlines.

Core:
- Add deadlineDay, deadlineWithTime, deadlineRemindAt fields to task model
- Add NgRx actions (setDeadline, removeDeadline, clearDeadlineReminder)
- Add meta-reducer with mutual exclusivity and input validation
- Register deadline actions in ActionType enum and op-log codes

UI:
- Create deadline dialog with calendar, time input, and reminder options
- Add deadline badge to task list row with overdue warning color
- Add deadline item to task detail panel with flag icon
- Add deadline options to task context menu
- Show deadlines in scheduled list page

Reminders:
- Add deadline reminder effects and selectors
- Show reminder dialog with grouped deadline/schedule sections
- Handle deadline reminder clearing on dismiss, done, add-to-today
- Cancel Android native deadline notifications on delete/archive

Planner:
- Show deadline tasks in planner day view and overdue section
- Create dedicated planner-deadline-task component
- Optimize deadline grouping with O(N) single-pass selector

Other:
- Add deadline-today banner effect for unplanned deadline tasks
- Add translation keys for all deadline UI strings
- Add E2E tests for deadline reminder flows
- Add unit tests for deadline reducer and overdue utility
- Extract shared isDeadlineOverdue utility function
- Guard app-state selectors against undefined during teardown
2026-03-15 18:48:00 +01:00
Johannes Millan
e1e86e7833 docs: update release notes 2026-03-14 13:04:43 +01:00
Johannes Millan
2b99c41efb fix: remove white borders from macOS icon (#6323)
Remove the flatten-with-white-background step from the icon generator.
macOS .icns natively supports PNG with alpha, so the flatten was
unnecessarily filling transparent areas outside the squircle mask
with white, causing visible borders in the Dock and Finder.
2026-02-10 14:41:16 +01:00
Johannes Millan
8b645c33ea fix(icons): resolve macOS icon black edge artifacts
Split Sharp pipeline into two stages to fix edge pixel blending.
When chained directly, dest-in composite and flatten don't properly
preserve alpha channel data, causing edges to retain the original
icon color instead of blending with the white background.

Fixes #6323
2026-02-05 11:56:59 +01:00
Johannes Millan
4eb06b3db6 fix(build): use Apple continuous-corner bezier curves for mac icon squircle
Replace simple SVG rounded rect (circular arcs) with Apple's actual
continuous-corner shape reverse-engineered from UIBezierPath. This
produces the correct squircle with smooth curvature transitions.
2026-02-02 17:15:13 +01:00
Johannes Millan
cc5940a257 chore(build): add mac icon generator and update icon assets 2026-02-02 17:15:13 +01:00
johannesjo
d917472a3b fix: mac os icon 2026-01-29 19:48:44 +01:00
johannesjo
6fbda9d25f fix(mac): regenerate icon without alpha channel to fix MAS white circle
The Mac App Store renders transparent icons differently than DMG distribution,
causing a white circle around the app icon. Regenerated icon-mac.icns from
sq2160x2160.png without alpha channel (hasAlpha: no, samplesPerPixel: 3).
2026-01-29 18:07:41 +01:00
Johannes Millan
9b7b01d24a fix(ci): update references for repo migration to super-productivity org
- Add permissions: contents: write to build.yml and manual-build.yml
  to fix GitHub release creation after org migration
- Update AUR PKGBUILD download URL to new org
- Update release notes changelog link
- Update GitHub project example hints in translation files
2026-01-10 12:56:27 +01:00
Johannes Millan
bb6637d5be build: fix mas build 2 remove entitlements not needed anymore 2025-11-15 10:29:57 +01:00
Johannes Millan
5023261df5 build: fix mac store mas build 1 2025-11-15 10:26:55 +01:00
Johannes Millan
c2d93354d4 fix: mac mas build 2025-11-13 18:23:50 +01:00
johannesjo
73ea2bcae3 build: attempt to fix mas 27 2025-11-10 15:40:02 +01:00
johannesjo
e4373b52da build: attempt to fix mas 26 2025-11-10 15:21:35 +01:00
johannesjo
2be589b903 build: attempt to fix mas 21 2025-11-10 14:28:38 +01:00
johannesjo
5c6b1ffc73 Revert "build: attempt to fix mas build by loginhelper stuff"
This reverts commit bb7ddea7ed.
2025-11-09 19:42:30 +01:00
johannesjo
bb7ddea7ed build: attempt to fix mas build by loginhelper stuff 2025-11-09 18:59:55 +01:00
johannesjo
63b021d942 build: make mas build work and fix guide 2025-11-09 16:35:09 +01:00
Johannes Millan
a8ade7f476 build: fix mac build 2025-10-13 17:15:06 +02:00
Aria Moradi
9e59910f43
AUR: include checksums 2025-09-01 23:06:05 +03:30
Johannes Millan
8ee4344a79 fix(release): update GitHub release notes configuration
Remove non-existent release_notes parameter from GitHub Actions workflow
and update build/release-notes.md with proper installation instructions
2025-07-12 18:11:59 +02:00
José Miguel Sarasola
4f6cc1643f AUR: Use package version on download deb to avoid caching issues
Proposed by Dominiquini on the AUR comments section
2025-06-09 08:38:35 +02:00
Johannes Millan
d2e5ef7958 build: update meta text 2025-01-17 16:57:36 +01:00
José Miguel Sarasola
9b32f513f2 Update Arch Linux PKGBUILD_template for new artifacts changes
New packaging seems to change a couple of things:

1. Package version is no longer included on the filename of the release
artifact
2. Looks like the directory inside the package new includes spaces on
the target install dir
2024-11-15 12:05:32 +01:00
Johannes Millan
3e4415cbc8 build: fix artifact name 2 2024-10-20 17:47:40 +02:00
Johannes Millan
2f9f3a6722 build: fix artifact name 2024-10-20 16:05:06 +02:00
Johannes Millan
2d73b12fc6 build: adjust binary file names to allow dynamic download link 2024-10-20 14:04:49 +02:00
johannesjo
4150020783 build: try to fix mas build 1 2024-09-23 11:03:56 +02:00
johannesjo
dd93bbf1d7 build: test build target to universal for mas build 2024-09-22 18:29:29 +02:00