Compare commits

...

6 commits
v0.6.0 ... main

Author SHA1 Message Date
Emberleif
99e4918b90 Update versions.json 2026-06-16 11:24:28 -05:00
Emberleif
fdefeae8d4 Manifest Change
0.7.1 fix
2026-06-16 11:22:47 -05:00
Emberleif
3ed7063cf8 0.7.1
Bug fixes for persistent help files
2026-06-16 11:02:11 -05:00
Emberleif
d4d8a0aa34 Release 0.7.0
Add onboarding and changelog notes, improve guide content, update release docs, refine help access, and ship 0.7.0 assets.
2026-06-15 15:01:37 -05:00
Emberleif
c2b42f7d24 Release 0.7.0
Add onboarding and changelog notes, improve guide content, update release docs, refine help access, and ship 0.7.0 assets.
2026-06-15 14:59:11 -05:00
Emberleif
392b2df8a7 0.6.1
updated stuff for Obsidian
2026-06-12 17:30:37 -05:00
9 changed files with 1602 additions and 165 deletions

71
CHANGELOG.md Normal file
View file

@ -0,0 +1,71 @@
# Chronoboard Changelog
## 0.7.0
### Added
- Managed vault notes for:
- `Getting Started With Chronoboard`
- `Chronoboard - Changelog`
- Command palette actions for opening the guide and changelog
- Toolbar help button for opening the Chronoboard guide
- Time entry note template support
- Better onboarding guidance around status frontmatter and task setup
### Improved
- Time entry notes can be renamed safely and reopened through Chronoboard entry IDs and aliases
- Totals sorting control now supports multiple sort modes through a compact icon trigger
- Documentation and onboarding flow for first install and plugin updates
- Header totals presentation in Chronoboard summary and week views
### Fixed
- Time entry note creation no longer duplicates conflicting frontmatter keys from templates
- Deleted time entry notes now correctly show `Create time entry note` instead of `Open time entry note`
- Template note resolution now supports normal Obsidian-style paths with or without `.md`
### Clarified Interactions
- Double click a time block to remove it
- Hold and drag a time block to move it
- Use `Ctrl+Z` or `Cmd+Z` to undo block creation or removal
- Removing a task from the left rail does not remove existing tracked time from the board
### Release visuals
![Daily totals sort header](assets/releases/0.7.0/daily-total-sort-header.png)
![Week day totals header](assets/releases/0.7.0/week-day-totals-header.png)
![Command palette actions](assets/releases/0.7.0/command-palette-actions.png)
## 0.6.2
### Added
- Managed vault notes for:
- `Getting Started With Chronoboard`
- `Chronoboard - Changelog`
- Command palette actions for opening the guide and changelog
- Toolbar help button for opening the Chronoboard guide
- Time entry note template support
### Improved
- Time entry notes can be renamed safely and reopened through Chronoboard entry IDs and aliases
- Totals sorting control now supports multiple sort modes through a compact icon trigger
- Documentation and onboarding flow for first install and plugin updates
### Fixed
- Time entry note creation no longer duplicates conflicting frontmatter keys from templates
- Deleted time entry notes now correctly show `Create time entry note` instead of `Open time entry note`
- Template note resolution now supports normal Obsidian-style paths with or without `.md`
### Clarified Interactions
- Double click a time block to remove it
- Hold and drag a time block to move it
- Use `Ctrl+Z` or `Cmd+Z` to undo block creation or removal
- Removing a task from the left rail does not remove existing tracked time from the board

169
README.md
View file

@ -1,8 +1,124 @@
# Chronoboard # Chronoboard
Chronoboard is an Obsidian community plugin for visual, note-native time tracking. Chronoboard is an Obsidian community plugin for visual, task-native time tracking.
It turns Markdown notes into draggable timeboard entries across day, week, and month views while writing all data back into frontmatter. It works well with TaskNotes-style task notes, but it is not limited to Jira workflows or any specific vault structure. It turns Markdown tasks into draggable time blocks across day, week, and month views while writing time data back into frontmatter. Chronoboard works well with TaskNotes-style task notes, but it is not tied to Jira, TaskNotes, or any specific vault structure.
## What Chronoboard Does
- Builds a left-side task pool from a folder in your vault
- Lets you click and drag time blocks onto a day or week board
- Stores time entries directly in task frontmatter
- Supports dedicated time entry notes for individual blocks
- Tracks scoped totals for day, week, and month
- Keeps the data portable because the source of truth remains Markdown
## Core Workflow
1. Configure a task folder and a metadata property such as `Status`.
2. Make sure the task files you want to use actually contain that frontmatter property so they can appear in the Chronoboard task pool.
3. Add tasks into the Chronoboard side rail.
4. Select a task and drag on the board to create time.
5. Move or resize blocks directly on the board.
6. Use right-click actions for color, subtitles, block notes, precise edits, and time entry notes.
## Views
- `Day`: horizontal time planning for a single day
- `Week`: vertical multi-day planning with per-day totals
- `Month`: high-level overview of tracked time across the month
- `Stats`: summary-oriented view for totals and reporting
## Interaction Model
### Time blocks
- Click and drag to create a time block
- Hold and drag to move a time block
- Drag the handles to resize a time block
- Double click a time block to remove it
- Use `Ctrl+Z` or `Cmd+Z` to undo time block add or remove actions
### Right click on a time block
- `Open task note`
- `Change color`
- `Edit task subtitle`
- `Edit task block text`
- `Create time entry note` or `Open time entry note`
- `Precise Edit Time`
- `Remove time block`
### Right click on a task in the side panels
- `Open task note`
- `Change color`
- `Edit task subtitle`
- `Remove Task`
Removing a task from the left task rail does not remove existing time blocks from the board. It only removes that task from the currently selected pool.
## Commands
Chronoboard adds the following commands to the Obsidian command palette:
- `Open Chronoboard`
- `Add task to Chronoboard`
- `Open manual time entry`
- `Open selected Chronoboard task`
- `Open Chronoboard guide`
- `Open Chronoboard changelog`
- `Add TaskNotes fields to current task`
## Managed Vault Notes
Chronoboard can create and maintain helper notes inside your vault:
- `Getting Started With Chronoboard`
- `Chronoboard - Changelog`
On first install, the guide note opens automatically. On plugin updates, the changelog note opens automatically.
## Frontmatter
Chronoboard reads and writes these properties when present:
```yaml
title: "Example Task"
Status: "In Progress"
timeboardColor: "#7c5cff"
timeboardSubtitle: "Project subtitle"
timeEntries:
- startTime: "2026-06-12T09:00:00"
endTime: "2026-06-12T11:00:00"
label: "Worked on API review"
```
If you enable dedicated time entry notes, Chronoboard can also write:
```yaml
aliases:
- chrono-1234567890-abcd12
Links: "[[Example Task]]"
ChronoboardEntryId: chrono-1234567890-abcd12
ChronoboardParent: "[[Example Task]]"
ChronoboardStart: 2026-06-12T09:00
ChronoboardEnd: 2026-06-12T11:00
```
## Settings
- `Folder`
- `Time entry notes folder`
- `Time entry note template`
- `Always include tasks`
- `Metadata property`
- `Excluded values`
- `Hide weekends in week and month views`
- `Visible start hour`
- `Visible end hour`
- `Highlight color`
- `Force dark text on colored cards`
## Screenshots ## Screenshots
@ -18,52 +134,15 @@ It turns Markdown notes into draggable timeboard entries across day, week, and m
![Chronoboard month view](assets/chronoboard-month.png) ![Chronoboard month view](assets/chronoboard-month.png)
## Features ## Release Files
- Day, week, month, and statistics views GitHub releases should include:
- Click and drag time entry creation
- Resize and move time blocks directly on the board
- Right-click actions for editing, recoloring, opening notes, and removing blocks
- Scoped totals for day, week, and month
- Support for always-included static notes such as meetings
- Frontmatter-based data with no separate database
## How it works
Chronoboard reads notes from a configured folder, filters them using a metadata property, and lets you place time visually on a board. Time entries are written back into each note's YAML frontmatter, so your data stays portable and queryable.
## Frontmatter
Chronoboard reads and writes these properties when present:
```yaml
title: "Example Task"
Status: "In Progress"
active: true
timeboardColor: "#7c5cff"
timeboardSubtitle: "Project subtitle"
timeEntries:
- startTime: "2026-06-12T09:00:00"
endTime: "2026-06-12T11:00:00"
label: "Worked on API review"
```
`timeEntries` is the only required structure for tracking time. Everything else is configurable or optional.
## Settings
- `Folder`: source folder for notes that appear in the add-task picker
- `Metadata property`: property used to filter notes out of the picker
- `Excluded values`: values that hide notes from the picker
- `Always include notes`: static notes that always appear in the task pool
- `Visible start hour` and `Visible end hour`
- `Hide weekends in week view`
- `Highlight color`
- `Force dark text on colored cards`
## Release files
- `manifest.json` - `manifest.json`
- `main.js` - `main.js`
- `styles.css` - `styles.css`
- `versions.json` - `versions.json`
## Changelog
See [CHANGELOG.md](CHANGELOG.md) for release notes.

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

1236
main.js

File diff suppressed because it is too large Load diff

View file

@ -1,9 +1,9 @@
{ {
"id": "chronoboard", "id": "chronoboard",
"name": "Chronoboard", "name": "Chronoboard",
"version": "0.6.0", "version": "0.7.1",
"minAppVersion": "1.5.0", "minAppVersion": "1.5.0",
"description": "A Gantt-style timeboard for project-based time tracking across notes.", "description": "A Gantt-style timeboard for project-based time tracking across tasks.",
"author": "Emberleif", "author": "Emberleif",
"isDesktopOnly": false "isDesktopOnly": false
} }

View file

@ -419,11 +419,37 @@
white-space: nowrap; white-space: nowrap;
} }
.chronoboard-day-total.is-light,
.chronoboard-mobile-day-total.is-light {
color: #d1b443;
}
.chronoboard-day-total.is-medium,
.chronoboard-mobile-day-total.is-medium {
color: #5d9dff;
}
.chronoboard-day-total.is-strong,
.chronoboard-mobile-day-total.is-strong {
color: #52d273;
}
.chronoboard-week-hours { .chronoboard-week-hours {
overflow: hidden; overflow-y: auto;
overflow-x: hidden;
border-right: 1px solid var(--background-modifier-border); border-right: 1px solid var(--background-modifier-border);
border-bottom: 1px solid var(--background-modifier-border); border-bottom: 1px solid var(--background-modifier-border);
height: calc(var(--chronoboard-grid-bottom, 0px) + 1px); min-height: 0;
height: 100%;
overscroll-behavior: contain;
scrollbar-width: none;
-ms-overflow-style: none;
}
.chronoboard-week-hours::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
} }
.chronoboard-hour-marker-vertical { .chronoboard-hour-marker-vertical {
@ -442,10 +468,15 @@
.chronoboard-week-grid { .chronoboard-week-grid {
display: grid; display: grid;
grid-template-columns: repeat(7, minmax(0, 1fr)); grid-template-columns: repeat(7, minmax(0, 1fr));
overflow: visible; overflow-y: auto;
overflow-x: hidden;
border-top: 1px solid var(--background-modifier-border-hover); border-top: 1px solid var(--background-modifier-border-hover);
border-left: 1px solid var(--background-modifier-border); border-left: 1px solid var(--background-modifier-border);
border-bottom: 1px solid var(--background-modifier-border); border-bottom: 1px solid var(--background-modifier-border);
min-height: 0;
height: 100%;
align-content: start;
overscroll-behavior: contain;
} }
.chronoboard-week-day-column { .chronoboard-week-day-column {
@ -484,13 +515,26 @@
} }
.chronoboard-day-hours-head { .chronoboard-day-hours-head {
display: grid; overflow-x: auto;
grid-template-columns: repeat(var(--chronoboard-hour-count, 1), var(--chronoboard-day-hour-width, 84px)); overflow-y: hidden;
align-items: stretch;
overflow: hidden;
border-bottom: 1px solid var(--background-modifier-border); border-bottom: 1px solid var(--background-modifier-border);
background: var(--background-secondary); background: var(--background-secondary);
border-left: 1px solid var(--background-modifier-border); border-left: 1px solid var(--background-modifier-border);
scrollbar-width: none;
-ms-overflow-style: none;
}
.chronoboard-day-hours-head::-webkit-scrollbar {
width: 0;
height: 0;
display: none;
}
.chronoboard-day-hours-track {
display: grid;
grid-template-columns: repeat(var(--chronoboard-hour-count, 1), var(--chronoboard-day-hour-width, 84px));
align-items: stretch;
min-width: 100%;
} }
.chronoboard-hour-marker-horizontal { .chronoboard-hour-marker-horizontal {
@ -523,6 +567,10 @@
padding-bottom: 0; padding-bottom: 0;
} }
.chronoboard-day-grid-content {
min-width: 100%;
}
.chronoboard-day-task-card { .chronoboard-day-task-card {
padding: 10px 12px; padding: 10px 12px;
margin: 0 8px 8px 8px; margin: 0 8px 8px 8px;
@ -538,7 +586,7 @@
position: relative; position: relative;
height: 88px; height: 88px;
margin: 0; margin: 0;
min-width: 100%; width: 100%;
border-left: 1px solid var(--background-modifier-border); border-left: 1px solid var(--background-modifier-border);
background: background:
repeating-linear-gradient( repeating-linear-gradient(
@ -557,6 +605,11 @@
margin-top: 16px; margin-top: 16px;
} }
.chronoboard-modal-textarea {
min-height: 140px;
resize: vertical;
}
.chronoboard-color-picker-wrap { .chronoboard-color-picker-wrap {
margin-top: 8px; margin-top: 8px;
} }
@ -684,6 +737,30 @@
cursor: pointer; cursor: pointer;
} }
.chronoboard-summary-head-meta {
display: flex;
align-items: center;
gap: 8px;
}
.chronoboard-summary-sort-trigger {
display: inline-flex;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
color: var(--text-muted);
cursor: pointer;
border-radius: 4px;
}
.chronoboard-summary-sort-trigger:hover,
.chronoboard-summary-sort-trigger:focus-visible {
color: var(--text-normal);
background: transparent;
outline: none;
}
.chronoboard-summary-head-total { .chronoboard-summary-head-total {
font-size: var(--font-ui-small); font-size: var(--font-ui-small);
font-weight: 700; font-weight: 700;
@ -747,6 +824,55 @@
border-radius: 999px; border-radius: 999px;
} }
.chronoboard-settings-section {
margin: 0 0 28px 0;
}
.chronoboard-settings-section-title {
margin: 0 0 14px 0;
font-size: var(--font-ui-medium);
font-weight: 700;
line-height: 1.3;
}
.chronoboard-settings-section-description {
margin: 0 0 14px 0;
color: var(--text-muted);
font-size: var(--font-ui-smaller);
line-height: 1.45;
}
.chronoboard-settings-section .setting-item {
border: 0;
margin: 0 0 12px 0;
padding: 14px 16px;
border-radius: 12px;
background: var(--background-primary-alt);
box-shadow: none;
}
.chronoboard-settings-section .setting-item:last-child {
margin-bottom: 0;
}
.chronoboard-settings-section .setting-item-info {
align-self: flex-start;
padding-right: 16px;
}
.chronoboard-settings-section .setting-item-name {
font-size: var(--font-ui-normal);
font-weight: 600;
}
.chronoboard-settings-section .setting-item-description {
margin-top: 4px;
}
.chronoboard-settings-section .setting-item-control {
align-self: center;
}
.chronoboard-month-layout { .chronoboard-month-layout {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -1109,6 +1235,27 @@
color: var(--text-error); color: var(--text-error);
} }
.chronoboard-menu-remove-item-with-divider {
margin-top: 6px;
padding-top: 10px;
position: relative;
}
.chronoboard-menu-remove-item-with-divider::before {
content: "";
position: absolute;
left: -8px;
right: -8px;
top: 0;
border-top: 1px solid var(--background-modifier-border);
pointer-events: none;
}
.chronoboard-settings-hour-input {
width: 56px;
text-align: center;
}
.chronoboard-summary-hours { .chronoboard-summary-hours {
font-size: 24px; font-size: 24px;
font-weight: 700; font-weight: 700;
@ -1140,6 +1287,12 @@
} }
@media (max-width: 1200px) { @media (max-width: 1200px) {
.chronoboard-layout {
grid-template-columns: 180px minmax(0, 1fr) 180px;
}
}
@media (max-width: 900px) {
.chronoboard-layout { .chronoboard-layout {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
@ -1149,3 +1302,115 @@
border-top: 1px solid var(--background-modifier-border); border-top: 1px solid var(--background-modifier-border);
} }
} }
.chronoboard-toolbar.is-mobile {
align-items: flex-start;
flex-direction: column;
}
.chronoboard-toolbar.is-mobile .chronoboard-toolbar-group {
width: 100%;
}
.chronoboard-mobile-layout {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 12px;
display: grid;
gap: 12px;
}
.chronoboard-mobile-panel {
border: 1px solid var(--background-modifier-border);
border-radius: 12px;
background: var(--background-primary);
}
.chronoboard-mobile-notice {
border: 1px solid var(--background-modifier-border);
border-radius: 10px;
background: var(--background-secondary);
color: var(--text-muted);
font-size: var(--font-ui-smaller);
padding: 10px 12px;
}
.chronoboard-mobile-task-list,
.chronoboard-mobile-summary-list {
padding: 10px;
display: grid;
gap: 10px;
}
.chronoboard-mobile-task-card,
.chronoboard-mobile-add-slot {
min-height: 72px;
}
.chronoboard-mobile-agenda {
padding: 10px;
display: grid;
gap: 12px;
}
.chronoboard-mobile-day-section {
border: 1px solid var(--background-modifier-border);
border-radius: 10px;
background: var(--background-primary-alt);
overflow: hidden;
}
.chronoboard-mobile-day-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: 10px 12px;
border-bottom: 1px solid var(--background-modifier-border);
background: var(--background-secondary);
}
.chronoboard-mobile-day-head-left {
min-width: 0;
}
.chronoboard-mobile-day-name {
font-size: var(--font-ui-medium);
font-weight: 600;
}
.chronoboard-mobile-day-date {
color: var(--text-muted);
font-size: var(--font-ui-smaller);
margin-top: 2px;
}
.chronoboard-mobile-day-total {
font-size: var(--font-ui-small);
font-weight: 700;
white-space: nowrap;
}
.chronoboard-mobile-entry-list {
padding: 10px;
display: grid;
gap: 10px;
}
.chronoboard-mobile-entry-card {
border: 1px solid var(--background-modifier-border);
border-radius: 10px;
padding: 10px 12px;
}
.chronoboard-mobile-entry-top {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 8px;
}
.chronoboard-mobile-empty {
margin: 10px;
}

View file

@ -2,5 +2,9 @@
"0.0.1": "1.5.0", "0.0.1": "1.5.0",
"0.5.0": "1.5.0", "0.5.0": "1.5.0",
"0.5.1": "1.5.0", "0.5.1": "1.5.0",
"0.6.0": "1.5.0" "0.6.0": "1.5.0",
"0.6.1": "1.5.0",
"0.6.2": "1.5.0",
"0.7.0": "1.5.0",
"0.7.1": "1.5.0",
} }