mirror of
https://github.com/emberleif/Chronoboard.git
synced 2026-07-22 07:44:56 +00:00
Release 0.7.0
Add onboarding and changelog notes, improve guide content, update release docs, refine help access, and ship 0.7.0 assets.
This commit is contained in:
parent
392b2df8a7
commit
c2b42f7d24
7 changed files with 1718 additions and 166 deletions
71
CHANGELOG.md
Normal file
71
CHANGELOG.md
Normal 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
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
## 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
169
README.md
|
|
@ -1,8 +1,124 @@
|
|||
# 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
|
||||
|
||||
|
|
@ -18,52 +134,15 @@ It turns Markdown notes into draggable timeboard entries across day, week, and m
|
|||
|
||||

|
||||
|
||||
## Features
|
||||
## Release Files
|
||||
|
||||
- Day, week, month, and statistics views
|
||||
- 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
|
||||
GitHub releases should include:
|
||||
|
||||
- `manifest.json`
|
||||
- `main.js`
|
||||
- `styles.css`
|
||||
- `versions.json`
|
||||
|
||||
## Changelog
|
||||
|
||||
See [CHANGELOG.md](CHANGELOG.md) for release notes.
|
||||
|
|
|
|||
BIN
assets/releases/0.7.0/week-day-totals-header.png
Normal file
BIN
assets/releases/0.7.0/week-day-totals-header.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.7 KiB |
|
|
@ -1,9 +1,9 @@
|
|||
{
|
||||
"id": "chronoboard",
|
||||
"name": "Chronoboard",
|
||||
"version": "0.6.1",
|
||||
"version": "0.7.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",
|
||||
"isDesktopOnly": false
|
||||
}
|
||||
|
|
|
|||
275
styles.css
275
styles.css
|
|
@ -419,11 +419,37 @@
|
|||
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 {
|
||||
overflow: hidden;
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
border-right: 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 {
|
||||
|
|
@ -442,10 +468,15 @@
|
|||
.chronoboard-week-grid {
|
||||
display: grid;
|
||||
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-left: 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 {
|
||||
|
|
@ -484,13 +515,26 @@
|
|||
}
|
||||
|
||||
.chronoboard-day-hours-head {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(var(--chronoboard-hour-count, 1), var(--chronoboard-day-hour-width, 84px));
|
||||
align-items: stretch;
|
||||
overflow: hidden;
|
||||
overflow-x: auto;
|
||||
overflow-y: hidden;
|
||||
border-bottom: 1px solid var(--background-modifier-border);
|
||||
background: var(--background-secondary);
|
||||
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 {
|
||||
|
|
@ -523,6 +567,10 @@
|
|||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
.chronoboard-day-grid-content {
|
||||
min-width: 100%;
|
||||
}
|
||||
|
||||
.chronoboard-day-task-card {
|
||||
padding: 10px 12px;
|
||||
margin: 0 8px 8px 8px;
|
||||
|
|
@ -538,7 +586,7 @@
|
|||
position: relative;
|
||||
height: 88px;
|
||||
margin: 0;
|
||||
min-width: 100%;
|
||||
width: 100%;
|
||||
border-left: 1px solid var(--background-modifier-border);
|
||||
background:
|
||||
repeating-linear-gradient(
|
||||
|
|
@ -557,6 +605,11 @@
|
|||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.chronoboard-modal-textarea {
|
||||
min-height: 140px;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
.chronoboard-color-picker-wrap {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
|
@ -684,6 +737,30 @@
|
|||
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 {
|
||||
font-size: var(--font-ui-small);
|
||||
font-weight: 700;
|
||||
|
|
@ -747,6 +824,55 @@
|
|||
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 {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
|
@ -1109,6 +1235,27 @@
|
|||
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 {
|
||||
font-size: 24px;
|
||||
font-weight: 700;
|
||||
|
|
@ -1149,3 +1296,115 @@
|
|||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,5 +3,7 @@
|
|||
"0.5.0": "1.5.0",
|
||||
"0.5.1": "1.5.0",
|
||||
"0.6.0": "1.5.0",
|
||||
"0.6.1": "1.5.0"
|
||||
"0.6.1": "1.5.0",
|
||||
"0.6.2": "1.5.0",
|
||||
"0.7.0": "1.5.0"
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue