New plugin at public/plugins/bookmarks/ — bookmark lists stored as
cards tagged #bookmarks with a JSON body. Board cards render as
coloured tiles (70% card colour + surface) with a centred link icon,
title, and date/bucket metadata; no body preview.
Clicking opens a full-screen overlay with:
- Named columns (click header to rename, right-click for
rename + delete), + button to add columns
- Bookmark items: favicon (stored as data: URI via server-side
fetch-meta) + title with ellipsis. Click opens URL in new tab.
- Right-click item → rename or delete
- Positional drag-and-drop between and within columns — accent
drop-indicator line shows the insertion point
- Full-width slider sets relative column width, persisted per card
- Horizontal wheel-to-scroll on the column container
Adding a bookmark reads the clipboard; if it contains a URL, the
backend fetches <title> + favicon (as base64 data: URI, ≤32 KB) so
the card is fully self-contained. Non-URL clipboard → manual entry
dialog. Also accepts card:123 links — rendered with a card icon in
the linked card's colour; click opens the linked card's detail view
or, if it's another bookmark list, switches the overlay to it.
Multiple bookmark lists supported: header button always shows a
picker (even with one list) with a "new list" option. New lists
inherit the active bucket. Overlay title is click-to-rename.
Tests: plugin registration, header button injection, board card
decoration, overlay open/close + column + item rendering, fetch-meta
API shape, card-link icon rendering, column-width persistence.
Also fixes the flaky undo due_date test — replaced a fixed sleep
with waitForStateCard polling so the undo PATCH has time to settle.
Bumps to 1.9.23.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
64 lines
1.8 KiB
JavaScript
64 lines
1.8 KiB
JavaScript
// ── hyprcrd Test Index ──
|
|
//
|
|
// Loads all test suites via dynamic imports with a shared cache-busting
|
|
// query string. This ensures edits to any test file are picked up without
|
|
// requiring a hard refresh — each module URL becomes unique per page load.
|
|
|
|
const V = '?v=' + Date.now();
|
|
|
|
const FILES = [
|
|
'./shell.test.js',
|
|
'./settings.test.js',
|
|
'./board.test.js',
|
|
'./toolbar.test.js',
|
|
'./buckets.test.js',
|
|
'./bucket-context.test.js',
|
|
'./super-buckets.test.js',
|
|
'./context-menu.test.js',
|
|
'./card-interactions.test.js',
|
|
'./card-join.test.js',
|
|
'./board-find-replace.test.js',
|
|
'./filtering.test.js',
|
|
'./sorting.test.js',
|
|
'./state-functions.test.js',
|
|
'./favorites.test.js',
|
|
'./search.test.js',
|
|
'./search-logic.test.js',
|
|
'./calendar.test.js',
|
|
'./calendar-popup.test.js',
|
|
'./rrule.test.js',
|
|
'./datepicker.test.js',
|
|
'./gallery.test.js',
|
|
'./help.test.js',
|
|
'./multiselect.test.js',
|
|
'./detail.test.js',
|
|
'./detail-interactions.test.js',
|
|
'./editor.test.js',
|
|
'./editor-features.test.js',
|
|
'./editor-save.test.js',
|
|
'./editor-toolbar.test.js',
|
|
'./line-numbers.test.js',
|
|
'./canvas.test.js',
|
|
'./tim.test.js',
|
|
'./snippets.test.js',
|
|
'./image-fullscreen.test.js',
|
|
'./markdown.test.js',
|
|
'./markdown-edge.test.js',
|
|
'./undo.test.js',
|
|
'./api.test.js',
|
|
'./api-edge.test.js',
|
|
'./export.test.js',
|
|
'./relay.test.js',
|
|
'./notifications.test.js',
|
|
'./quick-capture.test.js',
|
|
'./asset-picker.test.js',
|
|
'./terminal.test.js',
|
|
'./theme.test.js',
|
|
'./chat.test.js',
|
|
'./shopping.test.js',
|
|
'./bookmarks.test.js',
|
|
];
|
|
|
|
// Await all imports so the runner can start in a deterministic state.
|
|
await Promise.all(FILES.map(f => import(f + V)));
|