slideshow

This commit is contained in:
th committed 2026-04-11 01:22:52 +02:00
1 parent 988a5410f7
commit 262b853c5b
18 files changed
+1305 -30

No files matched your search

+23 -9
View File
@@ -162,15 +162,29 @@ hyprcrd plugin system
│ │ ├── loader.js conditionally imports tests.js on ?test or Ctrl+Shift+T
│ │ ├── Test files import from '../../js/modules/...' (NOT '../modules/...')
│ │ └── Both static AND dynamic imports use that path — sed both when moving files
│ └── email/ (~1300 lines, biggest)
│ ├── Backend: ImapClient.php (pure-PHP IMAP4) + backend.php (table + routes)
│ ├── Schema: email_accounts table, passwords AES-256-CBC with vault key
│ ├── Routes: /api/email/{accounts, accounts/{id}, accounts/{id}/test, messages, message/{accId}/{uid}}
│ ├── Settings tab: registered via hyprcrd.settings.registerTab({id:'email', label:'mail'})
│ │ └── onShow rebuilds form on first show, refreshes accounts list every show
│ ├── Welcome view: shown when accounts.length === 0, "configure accounts" → openTab('email')
│ ├── Header button "mail" injected via JS into #main-header right group, before #add-btn
│ └── Card extraction: POST /api/cards with #email tag, calls window._reloadAll()
│ ├── email/ (~1300 lines, biggest)
│ │ ├── Backend: ImapClient.php (pure-PHP IMAP4) + backend.php (table + routes)
│ │ ├── Schema: email_accounts table, passwords AES-256-CBC with vault key
│ │ ├── Routes: /api/email/{accounts, accounts/{id}, accounts/{id}/test, messages, message/{accId}/{uid}}
│ │ ├── Settings tab: registered via hyprcrd.settings.registerTab({id:'email', label:'mail'})
│ │ │ └── onShow rebuilds form on first show, refreshes accounts list every show
│ │ ├── Welcome view: shown when accounts.length === 0, "configure accounts" → openTab('email')
│ │ ├── Header button "mail" injected via JS into #main-header right group, before #add-btn
│ │ └── Card extraction: POST /api/cards with #email tag, calls window._reloadAll()
│ └── slideshow/ (~500 lines)
│ ├── No backend — data stored as ```slide-image fenced block in card body
│ ├── Slideshow = parent card (start slide) + children (in position order)
│ ├── Text slides: normal markdown rendered fullscreen via hyprcrd.markdown.render
│ ├── Image slides: fenced block with `src:` + `x,y,w,h -> target` lines (coords in %)
│ │ └── Targets: card:<id>, slide:next, slide:prev, slide:first, slide:<index>
│ ├── Viewer: fullscreen overlay, ArrowLeft/Right + Esc, HUD with counter
│ │ ├── Image slides use object-fit:contain; hotspots positioned relative to img box
│ │ ├── Arrow keys always work as fallback, even when hotspots are present
│ │ └── 'h' key toggles debug-hotspots class to visualize rects during presentation
│ ├── Hotspot editor: drag on image to create rect, picker assigns target, dbl-click rect to re-pick
│ ├── Group-bar button: mutation-observed injection; reads parent id from #group-bar[data-group-id]
│ │ └── Requires board.js renderGroupBar to write bar.dataset.groupId — small core patch
│ └── Toolbar button "slideHotspots" injected into #md-toolbar, detects existing block at cursor
│
├── Gotchas / lessons learned
│ ├── statusHeight vs scrollHeight — textarea.scrollHeight includes padding, mind it