Commit graph

57 commits

Author SHA1 Message Date
Johannes Millan
8005b4ec52 feat(supersync): retry transient web fetch failures and surface them as warnings
Adds a 2-retry / 1s+2s backoff loop to the browser/Electron SuperSync
request path, mirroring the existing native retry. A new typed
NetworkUnavailableSPError replaces the previous string-shape contract
between provider and wrapper: the provider throws the typed error from
both web-retry exhaustion and native-failure handler, and the wrapper
matches via instanceof to show a transient WARNING snackbar
(F.SYNC.S.NETWORK_ERROR) without flipping into a hard ERROR state.

Drops the wrapper-side regex classifier (and its defensive
^HTTP\s+\d{3}\b filter), the now-unused isTransientNetworkError alias,
and dedupes the predicate call inside the web-retry catch. The single
remaining call site for the broad regex (operation-log-upload) now
imports isRetryableUploadError directly under its honest name.

Tests cover the 1s/2s cadence, retry-then-success, retry-exhaustion via
the typed error, and negative paths (AbortError, HTTP-status 5xx,
AuthFailSPError must NOT retry). The error class is added to the
cross-module identity safety net.
2026-05-13 11:20:02 +02:00
Johannes Millan
debdedacc0 fix(electron): support today filter in local REST API 2026-05-12 16:33:59 +02:00
Johannes Millan
a59aa39931 feat(tasks): add notes panel shortcut 2026-05-12 12:48:45 +02:00
Johannes Millan
50f79d8e18 Merge branch 'feat/issue-7540-84a0bf'
* feat/issue-7540-84a0bf:
  fix(schedule): indicate tasks beyond available time
2026-05-11 14:34:24 +02:00
Johannes Millan
b15c22db35 fix(schedule): indicate tasks beyond available time 2026-05-11 14:30:55 +02:00
Johannes Millan
cf7f78faa9 fix(focus-mode): improve countdown badge and escape close 2026-05-11 10:09:15 +02:00
agncr
541bc1b0fd
feat(calendar): add per-provider include/exclude regex filters for iCal events (#7528)
* feat(calendar): add per-provider include/exclude regex filters for iCal events

* fix(calendar): mask filterIncludeRegex and filterExcludeRegex in privacy export

Regex filter patterns can contain user-specific title fragments (e.g.
ClientName|Project Alpha) and must be treated as PII.

* fix(calendar): apply regex filters to initial cached calendar emission

Cached events emitted via defer() bypassed regex filters because
provider config was not yet available. The initial emission now reads
selectCalendarProviders first so filterIncludeRegex/filterExcludeRegex
are applied consistently from the start.

* fix(calendar): reconcile banner queue when provider regex filters change

Events queued in _currentlyShownBanners$ were not re-evaluated when a
provider's filterIncludeRegex or filterExcludeRegex changed, so excluded
events could linger until dismissed. The new reconcileBannersOnProviderChange
effect filters the queue against the updated config on every provider change.

* fix(calendar): store raw fetch data in cache before applying regex filters

Regex-excluded events were permanently lost from the cache because
saveToRealLs was called after the filter pass. If a user loosens or
removes a regex while offline, the fallback cache could not restore
those events until the next successful fetch.

The cache now stores unfiltered source data; regex and task/skip/hidden
filters are applied only for the downstream emission.

* fix(calendar): resolve regex filter config per-event in initial cached emission

The defer() path derived one provider config from entry.items[0]?.calProviderId
and applied it to every item in the cache entry. Mixed-provider entries
would apply provider A's regex to provider B's events.

Config is now resolved inside the filter callback via calEv.calProviderId,
matching how _groupCachedEventsByProvider() already handles per-item grouping.

Regression test added with a mixed-provider cached entry verifying that
each event is filtered against its own provider's config.

* fix(calendar): apply full view-level filters to initial cached emission

The defer() path only applied regex filters, so task-imported, skipped,
and hidden events could briefly reappear on startup until the first fetch
completed. Now reads all four filter sources in a single combineLatest
snapshot and applies the same ID-based checks as the live fetch path.

Regression test added for all three ID-based filter types.

* fix(calendar): reapply regex filters from cache

* fix(calendar): hide stale cached provider events

* fix(calendar): filter manual iCal search

* fix(calendar): refresh agenda filters

---------

Co-authored-by: agncr <a.gencer@thalia.de>
Co-authored-by: agncr <agncr@users.noreply.github.com>
Co-authored-by: johannesjo <johannes.millan@gmail.com>
2026-05-11 00:12:01 +02:00
Het Savani
be4107bb37
feat(task-repeat): add repeat after completion option (#7524)
* feat(task-repeat): add repeat after completion option

* fix(task-repeat): address review feedback for wait-for-completion

* fix(task-repeat): align wait-for-completion recurrence behavior

* fix(task-repeat): restore completion-based recurrence anchoring

* fix(task-repeat): stabilize latest-instance checks and clean up docs

* fix(task-repeat): avoid errors when no repeat occurrence is due

* fix(task-repeat): align first occurrence identity

* fix(task-repeat): handle legacy and archived completion

* fix(task-repeat): probe wait gate after any completion

* docs(task-repeat): clarify wait completion blockers

---------

Co-authored-by: johannesjo <johannes.millan@gmail.com>
2026-05-10 23:28:22 +02:00
Johannes Millan
882203ecb9 feat(theme): add background image blur slider 2026-05-09 18:37:11 +02:00
Johannes Millan
773dd033b7 fix(theme): clarify background tint setting visibility 2026-05-09 18:02:16 +02:00
David Vornholt
913426155a
feat(schedule): add week view scaling (#7530)
* fix(ui): improve task selector and focus notes controls

* feat(schedule): add week view scaling
2026-05-09 15:11:46 +02:00
cpa-27
1d1b49d337
fix(docs): Add documentation for time estimate short syntax (#7454)
* fix(docs): Update new task placeholder to include time estimate short syntax example

* fix(docs): Update wiki entry to reference time estimate short syntax tags
- Updates new task placeholder to reflect changes made in b09aa6e
- Adds list item explaining time estimate short syntax
- Adds reference to wiki short syntax page
2026-05-02 13:57:55 +02:00
Nicholas Dias
7a51d4b06e
feat: allow dev override for local REST API (#7440) 2026-05-01 16:54:26 +02:00
Florian Bachmann
6c1a0b54f9
Caldav subtask import (#7409)
* fix(electron): disable webSecurity in dev mode to suppress CORS preflights

* feat(CalDAV): Option to import sub-tasks along with parent

* test(CalDAV): Adds specs for option to import subtasks along with parent

* doc(CalDAV): Adds notion on automatic sub-task import

* feat(CalDAV): Handles grandchildren and ignores subtasks of archived tasks.

* fix(setup): removes policy violating code

* fix(caldav):_resolve N+1 issue

* test(caldav):_adds more tests

* fix(electron):_fix task-widget mock in electron test
2026-05-01 13:07:03 +02:00
Het Savani
baaafbab44
feat:Add a keyboard shortcut to collapse/expand groups (#7370)
* feat:Add a keyboard shortcut to collapse/expand groups

* fix(collapsible): scope group behavior to isGroup and address review feedback

* fix(collapsible): scope group behavior, fix a11y focus, clean CSS, and update docs

* feat(work-view): apply isGroup to Overdue/Later/Done/Recurring sections

Aligns implementation with the wiki keyboard-shortcuts docs added in this
PR — those sections are described as participating in the expand/collapse-all
group shortcuts but were missing the [isGroup]="true" input.

* feat(tasks): ArrowLeft on top-level task collapses parent group

When a top-level task (no parent) is focused and the existing arrow
handling would otherwise call focusPrevious, hand off to the closest
ancestor collapsible group instead: collapse it and move focus to the
group header. Makes the new group shortcuts reachable from the normal
task-driven keyboard flow rather than requiring a Tab to the header.

Sub-tasks and selected-task hide-detail behavior are unchanged.

* feat(collapsible): ArrowUp/Down on group header focuses adjacent task

When a group header is focused, ArrowDown moves focus into the next
<task> element in document order (the first task of the group when
expanded; the next group's first task when collapsed). ArrowUp moves
focus to the previous task. Pairs with the ArrowLeft hand-off so the
group shortcut and task navigation form a single continuous keyboard
flow.

* feat(tasks): ArrowUp/Down on group-edge task focuses the header

ArrowUp on the first task of a group focuses the current group's
header; ArrowDown on the last task focuses the next group's header.
Routed through new handleArrowUp/handleArrowDown methods so other
focusPrevious/focusNext callsites (move-to-backlog, etc.) keep their
existing semantics.

* refactor(util): extract findAdjacentFocusable for arrow nav

Three places had near-identical DOM-walking logic for "find the next/prev
focusable element across tasks and group headers". Consolidates them
into a single utility with 9 unit tests, plus a shared GROUP_NAV_SELECTOR
constant exported from collapsible.component.

Behavior change: ArrowUp/Down on a group header now considers other
collapsed group headers as next-focusable (previously walked only across
<task> elements). For an all-collapsed list, ArrowDown on a header now
moves to the next header instead of skipping to a far-away task.

* refactor: trim findAdjacentFocusable + tighten collapsible API surface

Multi-agent review consensus:
- Drop the compareDocumentPosition fallback in findAdjacentFocusable.
  Both real callers pass an element matching the selector; the fallback
  branch only existed to satisfy a synthetic test. Util shrinks to ~10
  lines of obvious code.
- Re-privatize setAllGroupExpanded and expandIfCollapsed — neither is
  called from outside CollapsibleComponent.
- Scope focusHeader's selector to ':scope > .collapsible-header' so a
  nested collapsible projected through ng-content can't steal focus.

---------

Co-authored-by: Johannes Millan <johannes.millan@gmail.com>
2026-04-27 14:38:44 +02:00
Spyros Seimenis
fede2c6ada
feat(gitea): add label-based include and exclude filters (#7359)
* feat(gitea): add label-based include and exclude filters

Adds two optional config fields to the Gitea issue provider. filterLabels
is a comma-separated allowlist forwarded to the issues endpoint as the
`labels` query param (AND-matched server-side). excludeLabels is a
comma-separated denylist applied client-side, since Gitea/Forgejo's
issues endpoint has no negation syntax. Scoped labels (scope/name) work
with both.

This lets users point multiple Gitea integrations at the same repository
and route disjoint subsets of issues into different Super Productivity
projects, e.g. one project filtering `project/foo` and another excluding
it.

Filters apply only to ingestion (search suggestions and auto-import of
open issues). Already-imported tasks keep refreshing regardless of label
changes, matching how the existing `scope` filter behaves.

* docs(gitea): document label include/exclude filtering

Update the issue-integration comparison page with the new label
allowlist and denylist filters, including scoped-label support.

* feat(gitea): enforce filterLabels AND match client-side

Gitea's two issue endpoints (`/repos/{o}/{r}/issues` and
`/repos/issues/search`) parse the `labels=` query param into different
internal fields and produce different semantics (AND vs OR), so the
same `filterLabels` config behaved differently on auto-import vs
manual search. The AND on the auto-import path is also a Gitea bug
(go-gitea/gitea#33509) that may flip to OR upstream at any time.

Apply AND-matching on the client (mirroring how `excludeLabels`
already filters client-side) so behavior is consistent across both
endpoints and independent of server version. The `labels=` query is
still sent as a coarse pre-filter (always a superset of the right
answer regardless of server semantics). Forgejo inherits the same
endpoints from Gitea, so the same fix covers it.
2026-04-26 19:10:18 +02:00
Johannes Millan
b3dfeaaf18 fix(api): reject inherited fields when creating subtask via REST
POST /tasks with parentId silently dropped any supplied projectId/tagIds
(the reducer forces tagIds=[] and projectId=parent.projectId), so callers
got 201 with values different from what they sent. Reject the request
with 400 UNSUPPORTED_FIELD instead, symmetric with how subTaskIds and
parentId-on-PATCH are handled.
2026-04-25 22:36:14 +02:00
Johannes Millan
ce98b0d0fe fix(api): support subtask creation via local REST API
POST /tasks now accepts `parentId` and creates a subtask via
TaskService.addSubTaskTo (inheriting the parent's projectId). Invalid
parent references return 404 PARENT_NOT_FOUND; nested parents return
400 INVALID_PARENT. `subTaskIds` on POST and `parentId`/`subTaskIds`
on PATCH are now rejected with 400 UNSUPPORTED_FIELD instead of being
silently dropped.

Fixes #7346
2026-04-24 17:40:28 +02:00
Corey Newton
0fad98fe43
docs/wiki content v0.9 (#7116)
* docs: update link from README to Wiki

* docs: refactor from README to Wiki

* docs: refactor README to Wiki
2026-04-09 19:36:23 +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
Onur Neşvat
959004ee18
feat(electron): add Local REST API for desktop automation (#6981)
* feat(electron): add Local REST API for desktop automation

Add a local HTTP server (port 3876) that allows external scripts and
tools to interact with a running Super Productivity desktop app.

Features:
- Task CRUD operations (create, read, update, delete)
- Task control (start, stop, set current)
- Task archive/restore operations
- Query filters for tasks (by title, project, tag, done status)
- Read-only project and tag listing

The API is disabled by default and can be enabled in Settings > Misc.
Only accepts connections from localhost (127.0.0.1) for security.

* fix: resolve lint errors for local REST API

* fix: use lazy injection for LocalRestApiHandlerService

Fixes StartupService tests by using Injector.get() instead of direct
injection, preventing LocalRestApiHandlerService from being instantiated
when StartupService tests don't have NgRx providers.

* fix: resolve markdown lint errors in API docs

* fix: add security warning to Local REST API hint
2026-03-28 13:35:04 +01:00
Johannes Millan
03572c3f2c
Feat/start of next day (#6565)
* feat: add label to heatmap for repeat task

* style(e2e): fix prettier formatting in planner spec

* fix(focus-mode): clear stale _isResumingBreak flag when isPauseTrackingDuringBreak is enabled (#6534)

When both isSyncSessionWithTracking and isPauseTrackingDuringBreak are
enabled, pausing and resuming a break left _isResumingBreak stale,
causing the next manual tracking start to dispatch clearResumingBreakFlag
instead of skipBreak. Refactor syncSessionResumeToTracking$ to explicitly
dispatch clearResumingBreakFlag in this case.

* refactor(sync): unify JWT expiry to 365 days for all auth methods

Replace separate JWT_EXPIRY_MAGIC_LINK (365d) and JWT_EXPIRY_PASSKEY (7d)
constants with a single JWT_EXPIRY (365d). The auth method only matters
during login — once a JWT is issued, it represents a verified session
regardless of how the user authenticated.

* feat(start-of-next-day): respect startOfNextDayDiff offset in today view

Thread startOfNextDayDiffMs through AppState, selectors, meta-reducers,
and task component so that "today" membership correctly accounts for the
user's configured day-start offset. When startOfNextDay=4 (4 AM), at
2:30 AM the app now correctly treats the previous calendar day as "today".

- Add isTodayWithOffset utility for offset-aware date comparison
- Store startOfNextDayDiffMs in AppState alongside todayStr
- Update all selectors (work-context, planner, task, overdue) to use offset
- Update meta-reducers with defensive fallbacks for state access
- Fix task component computed signals (isOverdue, isScheduledToday, etc.)
- Add 48 new tests covering offset boundary conditions

* style(planner): remove unused eslint-disable directive

* fix(start-of-next-day): use offset-aware date in ensureTasksDueTodayInTodayTag effect

Replace raw getDbDateStr() and getDateRangeForDay(Date.now()) with
store-derived todayStr and offset-adjusted range in task-due.effects.ts.
Without this, the effect would use the wrong day between midnight and
the configured startOfNextDay hour.

Also add selectOverdueTasks offset boundary tests.

* refactor(start-of-next-day): use DateService for offset-aware today checks

Add DateService.isToday() method that encapsulates the startOfNextDayDiff
offset logic, replacing scattered isToday()/getDbDateStr() calls across
effects, services, and components.

- Add isToday(date) to DateService for DRY offset-aware checks
- Fix task-repeat-cfg.effects.ts: 6 isToday/getDbDateStr calls
- Fix task-repeat-cfg.service.ts: isToday call
- Fix task-context-menu-inner.component.ts: 6 isToday/getDbDateStr calls
- Fix task-related-model.effects.ts: getDbDateStr call
- Fix work-context.service.ts: getDbDateStr call
- Remove duplicate planTaskForDay handler from tag.reducer.ts
  (already handled by planner-shared meta-reducer with offset)

* refactor(start-of-next-day): migrate remaining isToday() calls to offset-aware DateService

Replace 6 call sites still using the non-offset isToday()/isYesterday()
with DateService methods that respect startOfNextDayDiff. Also adds
isYesterday() to DateService and uses isTodayWithOffset in legacy backup
migration. Behavior is identical at offset=0 (default).

* fix(start-of-next-day): fix offset bugs, sync regression, and code quality issues

- Fix wrong config path in legacy backup migration (misc.startOfNextDay)
- Restore sync readiness check (filter+first instead of take(1))
- Restore SYNC_AFTER_ENABLE in setInitialSyncDone conditions
- Use offset-aware dates in addAllDueToday/addAllDueTomorrow
- Make isSameDay offset-aware and pass offset through planner selectors
- Fix TagSettingsPageComponent selector from 'project-settings' to 'tag-settings'
- Hide settings link for virtual TODAY tag
- Revert direct ru.json edits (only en.json should be edited)
- Add standalone:true and use takeUntilDestroyed in settings components
- Restore Math.max(duration,1) for zero-duration overlap detection
- Remove dead code, stale CSS, and commented-out HTML
- Add input validation clamping in DateService.setStartOfNextDayDiff

* fix(start-of-next-day): fix offset bugs in overdue detection, planner display, and LWW sync

- Fix isOverdue ignoring offset for dueWithTime tasks in task.component
- Remove duplicate moveBeforeTask handler from tag.reducer (handled by meta-reducer)
- Add skip(1) and hydration guard to setTodayStr$ effect to prevent race condition
- Move side effects from map() to tap() in global-config.effects
- Fix isSameDay double-offset bug in planner.selectors for scheduled tasks/events
- Replace unsafe `as any` casts with proper PlannerState types
- Use safe optional chaining for todayStr access in meta-reducers
- Refactor handlePlanTaskForDay to use helper functions with hasChanges optimization
- Extend syncTodayTagTaskIds in LWW meta-reducer to handle dueWithTime changes
- Fix absolute import path in global-config.effects
- Add @deprecated to isToday() in favor of offset-aware alternatives

* fix(config): migrate task dueDays when startOfNextDay offset changes

When the "start of next day" offset changes and causes todayStr to shift,
existing tasks with dueDay matching the old todayStr are now migrated to
the new todayStr so they remain classified as "today" tasks.

* refactor(config): use switchMap and document archive task exclusion

Replace mergeMap with switchMap in setStartOfNextDayDiffOnChange
effect to better communicate intent (only latest emission matters).
Add comment clarifying archived tasks are intentionally excluded
from dueDay migration.

* test(sync): add LWW tests for dueWithTime → TODAY_TAG sync

Cover the dueWithTime path in syncTodayTagTaskIds that was added
but had no test coverage. Tests verify TODAY_TAG membership updates
when dueWithTime changes via LWW sync.
2026-02-21 12:47:19 +01:00
Corey Newton
c2b18683d8
docs/wiki content v0.7 (#6568)
* docs(wiki): add new Quickstart to help with using Sync

There is a slew of notes that try to explain or show this so a
Quickstart can help bring everything into one place.

* docs(wiki): combine "First Steps" into single note with relevant links

* docs(wiki): update index notes

* docs(wiki): fix remaining broken external links

* docs(wiki): add core developer How-To guides to orient first-time devs

The majority of the documentation is currently spread across several
files ins "docs/" and READMEs. Over time these can be consolidated into
the wiki while retaining the common CONTRIBUTING.md as a valid entry
point.

* docs(wiki): add basic guides for plugins and issue integration

As with the core development docs, there is too much to add here right
now. These notes will serve as a simple entry to other resources.

* docs(wiki): add basic reference note for theming

* docs(wiki): add basic Translation guide

* docs(wiki): rename Theming and linting to clean up headings

* docs(wiki): add heading lint exception for GH-specific nav pages; rework sidebar and index pages

Sidebar should be a quick-access for the more common topics grouped
thematically with the X.00 notes simply enumerating all the notes where
appropriate.
2026-02-20 21:13:38 +01:00
Corey Newton
3b587f1cdc docs(wiki): lint headings and lists 2026-02-16 16:23:32 +01:00
Corey Newton
d4b615abde docs(wiki): clarify differences between iCal and CalDAV
Some discussion and research has confirmed a few things. More field
reports needed to help extend How-To guides
2026-02-16 16:23:32 +01:00
Corey Newton
d37fc40718 docs(wiki): add note for configuring sync backends
As with 2.08, I expect this will need to be checked more frequently
until SuperSync's protocol replaces the blob-based format.
2026-02-16 16:23:32 +01:00
Corey Newton
81def26af2 docs(wiki): add guide on choosing a backend
I tried to include as much up-to-date guidance as possible but given the
dynamic nature of SuperSync at the moment this note will require some
updates as the new sync backend is rolled out to non-SuperSync
integrations.
2026-02-16 16:23:32 +01:00
Corey Newton
dc33035fee docs(wiki): update "new tasks" and "task integration notes" 2026-02-16 16:23:32 +01:00
Corey Newton
8c82683c14 docs(wiki): update original notes on data backups 2026-02-16 16:23:32 +01:00
Corey Newton
24f73db4f7 docs(wiki): populate task management how-to guides 2026-02-16 16:23:32 +01:00
Corey Newton
eda03fa801 docs(wiki): fix external link formatting 2026-02-16 16:23:32 +01:00
Johannes Millan
a335589dc6 refactor(sync): reduce vector clock DoS cap from 100 to 50 entries 2026-02-12 16:27:55 +01:00
Johannes Millan
4d22a64955
Feat/plugin UI kit (#6362)
* fix(e2e): stabilize undo task delete sync test

Two flakiness sources fixed:
- Click on task element could activate title inline editor, causing
  Backspace to edit text instead of triggering delete. Now clicks the
  drag handle which calls focusSelf() without entering edit mode.
- Replaced deleteTask helper with inline sequence to avoid wasting
  2s of the 5s undo snackbar window on dialog-detection timeout.

* refactor: address code review findings from 2026-02-03

- Extract getBreakCycle helper to replace error-prone `cycle - 1 || 1`
  pattern at 3 call sites
- Add clarifying comment on intentionally broad 'timed out' match
- Reduce Pomodoro E2E test from 9 to 5 sessions (sufficient coverage)
- Remove dead _isTransientNetworkError wrapper from DropboxApi
- Extract stubWindowConfirm helper in task reducer tests

* fix(sync): prevent Formly from clearing provider config on show (#6345)

resetOnHide: true caused Formly to reset field values when provider
fieldGroups transitioned from hidden to visible, discarding user input
if sync was enabled before selecting a provider.

* fix(tasks): fix huge space between emoji and text in tag/project menus

Use matMenuItemIcon attribute on emoji spans so they project into the
icon slot of mat-menu-item instead of the text slot. Update emoji icon
sizing to 24x24px to match mat-icon and add overflow: hidden.

Closes #5977

* fix(tasks): guard against undefined task entities in selectors and archive (#6359)

Prevent TypeError crashes (reading 'dueWithTime', 'dueDay', 'issueProviderId') caused
by orphaned IDs in NgRx state. Fix archive merge to deduplicate IDs, filter orphans,
and use correct entity precedence (young over old). Add defensive null guards to
selectors and archive/task service methods.

* fix(tasks): guard against undefined task in mainListTasksInProject$ (#6360)

* fix(tasks): detect and sanitize orphaned task IDs to prevent startup crashes (#6359, #6360)

Orphaned task IDs (entries in task.ids without matching entities) caused
TypeError on app startup. Fix addresses three layers: validation now
flags orphaned IDs instead of silently skipping them, loadAllData
sanitizes IDs on load as a safety net, and data repair no longer crashes
when encountering orphaned IDs it's trying to fix.

* fix(sync): prevent recurring task duplication across clients

Remove SuperSync special-case that bypassed initial sync wait, causing
repeatable task effects to fire before sync completed. Add post-sync
cleanup effect that detects and removes stale duplicate repeat instances
when multiple active instances exist for the same repeat config.

* fix(sync): restore WebDAV provider compatibility warning text

* feat(sync): mark WebDAV and LocalFile sync options as experimental

* feat(plugins): add UI Kit with inject-first CSS strategy for iframe plugins

Introduce a lightweight CSS reset (UI Kit) that auto-styles basic HTML
elements in plugin iframes to match the host app theme. Injected after
<head> so plugin styles always win by source order.

UI Kit provides: element resets (body, headings, buttons, inputs, tables,
links, code, lists, hr), .btn-primary/.btn-outline button variants, and
.card/.card-clickable components.

All bundled plugins updated to use UI Kit classes, removing redundant
custom CSS (-542 lines net). Pico CSS removed from automations plugin.
sync-md converted from hardcoded colors to host theme variables.

* feat(plugins): extract shared CSS utilities into UI Kit

Move .text-muted, .text-primary, .page-fade and @keyframes fadeIn from
plugin CSS into the UI Kit so all iframe plugins get them automatically.
Add box-shadow focus ring to input:focus for better accessibility.
Remove per-plugin focus overrides now covered by the UI Kit.
2026-02-04 18:18:22 +01:00
Corey Newton
343fc47d1d docs(wiki): lint style 2026-02-04 14:45:00 +01:00
Corey Newton
5f1dd7ef7f docs(wiki): normalize tables and rework ToC 2026-02-04 14:45:00 +01:00
Corey Newton
ff674fc6c9 docs(wiki): substantial addition of integrations (issue and sync)
Much of these notes will need additional validation prior to v1.0 as I have not yet used supersync and many of the other services.
2026-02-04 14:45:00 +01:00
Corey Newton
8557ce3595 docs(wiki): enhance User Data documentation with backup and import/export details 2026-02-04 14:45:00 +01:00
Corey Newton
daa5cea0f6 docs(wiki): add new notes for Quick History and Worklog 2026-02-04 14:45:00 +01:00
Corey Newton
1bb1b6839e docs(wiki): add Task Archiving section and update references across multiple documents 2026-02-04 14:45:00 +01:00
Corey Newton
f8c4e76c8e docs(wiki): add Metrics 2026-02-04 14:45:00 +01:00
Corey Newton
fd9ee3e421 docs(wiki): add Reflection 2026-02-04 14:45:00 +01:00
Corey Newton
4a8a04ecc3 docs(wiki): add Reminders and Idle Time 2026-02-04 14:45:00 +01:00
Corey Newton
1b52eb8a6b docs(wiki): add Timers and Focus Mode 2026-02-04 14:45:00 +01:00
Corey Newton
73739df285 docs(wiki): add How Time Is Logged section 2026-02-04 14:45:00 +01:00
Corey Newton
9faa3e4bb4 docs(wiki): add Repeating Tasks section and update references across multiple documents 2026-02-04 14:45:00 +01:00
Corey Newton
19a78f42fb docs(wiki): added Scheduled Tasks; updated references in multiple sections 2026-02-04 14:45:00 +01:00
Corey Newton
9a0f1a6000 docs(wiki): add Subtasks section and references in Task Attributes 2026-02-04 14:45:00 +01:00
Corey Newton
86d0242e81 docs(wiki): add Task Notes 2026-02-04 14:45:00 +01:00
Corey Newton
1f8b2504fe docs(wiki): add note about Task Attributes 2026-02-04 14:45:00 +01:00
Corey Newton
cfe8095a82 docs(wiki): create note regarding Time Estimates 2026-02-04 14:45:00 +01:00