punkyard_obsidian-lindar/docs/features.md
pun kyard cedbe790cd
feat(#62): render task checkboxes as calendar bars + task creation modal (#63)
Co-authored-by: nmn <punkyard@users.noreply.github.com>
2026-07-04 03:45:11 +02:00

6.3 KiB

Features

Target experience

  • one row per month
  • horizontal scrolling across the full yearly grid
  • weekday headers aligned with each date column
  • sticky month labels on the left
  • a clean, elegant layout that feels at home in Obsidian
  • fast event creation directly from the calendar
  • beautiful, highly visible multi-day event bars

Calendar layout

  • Yearly horizontal linear calendar with one row per month
  • Dates arranged horizontally across each month row
  • Weekday headers repeating across the top and aligned to date positions
  • Sticky year header and sticky month column
  • 96vh layout for an immersive full-page view
  • Horizontal scrolling for the grid
  • Today highlight so the current date stands out immediately
  • Light and dark theme support using Obsidian theme variables
  • Customizable motto shown in the view
  • Year navigation to move backward and forward across years

Event creation

  • Click a date cell to open a popup and create an event
  • Click-drag across cells to create a multi-day selection
  • Start and end dates editable in the popup
  • Free-text event type with lightweight suggestions like appointment, call, meal, or meeting
  • Participants list captured directly in the popup, one per line
  • Native OS color picker when available, with a curated palette fallback
  • Single-day and multi-day events rendered directly on the grid
  • Cross-week, cross-month, and cross-row continuity for longer events
  • Multiple events per day displayed cleanly without turning the grid into soup
  • Edit and delete existing events from the same popup

Storage model

  • Events stored as Markdown notes inside the vault
  • one event note per event, using YAML frontmatter metadata
  • event notes remain searchable, linkable, and portable
  • configurable events folder path in plugin settings

Example event note shape:

---
uid: abc123
event: true
allDay: true
title: Birthday party
start: 2026-04-20
end: 2026-04-22
color: "#e74c3c"
type: appointment
participants:
    - "[[Alice]]"
    - "[[Bob]]"
---
Optional notes about the event...

Event frontmatter

  • uid: stable internal event id
  • event: true or lindar-event: true: explicit marker for Lindar event notes
  • allDay: true: current storage mode for yearly bar rendering
  • title: visible label in the calendar
  • start: start date in YYYY-MM-DD (also accepts legacy date)
  • end: inclusive end date in YYYY-MM-DD (also accepts legacy endDate)
  • color: event bar color
  • type: optional category name matching a category defined in settings
  • participants: optional YAML list — each participant auto-wrapped as [[wikilink]] on save, brackets stripped for clean display in modal
  • note body: optional description/details

type stays intentionally free-form. Use values like:

  • appointment
  • call
  • meal
  • meeting
  • travel
  • deadline

...or any label matching your own workflow.

Existing older event notes without event, type, or participants remain compatible.

Categories

Categories let you label events by type and auto-assign a default color.

When you pick a category in the event creation modal, the Color picker auto-fills with that category's color. You can still override the color per-event — the category color is a default, not a constraint.

Categories are managed in Settings → Community plugins → Lindar, after the horizontal divider:

  • Add — click + Add category, enter a name, pick a color.
  • Reorder — ↑ and ↓ buttons per row.
  • Enable/disable — toggle off hides the category from the modal's type dropdown.
  • Delete — trash icon. Irreversible.

All changes save immediately.

See docs/options.md for the full seed list and UI reference.

Task bars

Task checkboxes from any vault note can appear as bordered outline bars in the calendar.

Line format

- [ ] Title  #tag 📅 YYYY-MM-DD `#hex`

How it works

  1. Lindar scans every .md file for unchecked task lines (- [ ]).
  2. Lines must contain the configured task tag (default #lindar) and at least one Tasks-plugin-compatible emoji date.
  3. Date priority: 📅|📆|🗓 (due) → ⏳|⌛ (scheduled) → 🛫 (start).
  4. Optional `#hexcode` at end of line sets the bar color (default #4f46e5).
  5. Multiple tasks on the same day stack into separate lanes.

Example

- [ ] Buy groceries #lindar 📅 2026-07-03 `#e11d48`
- [ ] Call dentist #lindar ⏳ 2026-07-05
- [ ] Plan trip #lindar 🛫 2026-08-01 `#0891b2`

Interaction

  • Click a task bar → opens the source note with the cursor placed on that task line.
  • Vault changes (create/modify/delete) trigger a debounced re-scan (2 s).

Settings

Setting Default Description
Task tag #lindar Tag filter for task lines

Task creation

Lindar provides two ways to create a task line directly in any note:

  • Type / at line start → EditorSuggest popup "Lindar: Create task" → select to open the task modal
  • Command Palette: Lindar: Create task at cursor

Modal fields

Field Detail
Title Text input, required
START Optional date + time picker (--:-- = no time)
DUE Optional date + time picker (--:-- = no time)
Color Native OS color picker
Tag Auto-applied from settings (default #lindar), not shown

Output format

- [ ] Title 🛫 YYYY-MM-DD HH:mm 📅 YYYY-MM-DD HH:mm `#hex` #tag
  • Time, start, due, and color omitted when unset.
  • Tag always appended from settings.
  • Inserted on the current line if empty, or the next empty line; appended at EOF if none found.

Line format reference

See the Task bars section above for the full syntax reference.

Compatibility notes

  • Older event notes continue loading even if they only have legacy fields.
  • event: false is treated as a deliberate opt-out and will not be loaded.
  • participants can be stored as a YAML list; empty values are ignored.
  • date/endDate legacy fields still read as fallbacks if start/end are absent.

Technical direction

  • TypeScript
  • esbuild
  • npm
  • Obsidian Plugin API
  • modular source structure under src/
  • pure Obsidian/DOM UI approach rather than a heavy web framework