Files
hyprcrd/public/plugins/tests/tests.js
T
thandClaude Opus 4.6 82b2ebc15f bookmarks: column-based bookmark manager plugin
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>
2026-04-16 12:33:18 +02:00

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)));