Loading...
- Back
+ ← Tasks
+
+
+
+
+ ↑ {{ store.currentTask.parent_title || "Parent task" }}
+
+
+ {{ projectTitle }}
+
+
+ {{ milestoneName }}
+
+
+
{{ store.currentTask.title || "Untitled" }}
Updated {{ relativeTime(store.currentTask.updated_at) }}
@@ -172,6 +259,37 @@ function onTagClick(tag: string) {
@click="onBodyClick"
>
+
+
+
+
+
+ -
+
+
+ {{ sub.title || "Untitled" }}
+
+ {{ sub.due_date }}
+
+
+
+
Backlinks
@@ -222,7 +340,7 @@ function onTagClick(tag: string) {
.toolbar {
display: flex;
gap: 0.75rem;
- margin-bottom: 1rem;
+ margin-bottom: 0.75rem;
}
.btn-back,
.btn-edit {
@@ -261,6 +379,49 @@ function onTagClick(tag: string) {
opacity: 0.6;
cursor: default;
}
+
+/* Context breadcrumb */
+.context-bar {
+ display: flex;
+ align-items: center;
+ gap: 0.4rem;
+ flex-wrap: wrap;
+ margin-bottom: 0.6rem;
+}
+.ctx-crumb {
+ display: inline-flex;
+ align-items: center;
+ font-size: 0.8rem;
+ padding: 0.15rem 0.55rem;
+ border-radius: 999px;
+ white-space: nowrap;
+}
+.ctx-crumb-parent {
+ color: var(--color-text-muted);
+ background: var(--color-bg-secondary);
+ border: 1px solid var(--color-border);
+ text-decoration: none;
+}
+.ctx-crumb-parent:hover {
+ color: var(--color-primary);
+ border-color: var(--color-primary);
+}
+.ctx-crumb-project {
+ color: var(--color-primary);
+ background: color-mix(in srgb, var(--color-primary) 10%, transparent);
+ border: 1px solid color-mix(in srgb, var(--color-primary) 30%, transparent);
+ text-decoration: none;
+ font-weight: 500;
+}
+.ctx-crumb-project:hover {
+ background: color-mix(in srgb, var(--color-primary) 18%, transparent);
+}
+.ctx-crumb-milestone {
+ color: var(--color-text-secondary);
+ background: var(--color-bg-secondary);
+ border: 1px solid var(--color-border);
+}
+
.meta {
font-size: 0.85rem;
color: var(--color-text-muted);
@@ -286,6 +447,109 @@ function onTagClick(tag: string) {
margin-bottom: 1rem;
flex-wrap: wrap;
}
+
+/* Sub-tasks */
+.subtasks {
+ margin-top: 2rem;
+ border-top: 1px solid var(--color-border);
+ padding-top: 1rem;
+}
+.subtasks-header {
+ display: flex;
+ align-items: baseline;
+ gap: 0.6rem;
+ margin-bottom: 0.4rem;
+}
+.subtasks-title {
+ font-size: 1rem;
+ margin: 0;
+ font-weight: 600;
+}
+.subtasks-progress {
+ font-size: 0.8rem;
+ color: var(--color-text-muted);
+}
+.subtasks-pct {
+ color: var(--color-text-muted);
+}
+.subtasks-track {
+ height: 4px;
+ background: var(--color-bg-secondary);
+ border-radius: 2px;
+ margin-bottom: 0.75rem;
+ overflow: hidden;
+}
+.subtasks-fill {
+ height: 100%;
+ background: var(--color-status-done, #22c55e);
+ border-radius: 2px;
+ transition: width 0.3s ease;
+}
+.subtasks-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 0.2rem;
+}
+.subtask-row {
+ display: flex;
+ align-items: center;
+ gap: 0.5rem;
+ padding: 0.3rem 0.5rem;
+ border-radius: var(--radius-sm);
+}
+.subtask-row:hover {
+ background: var(--color-bg-secondary);
+}
+.sub-dot {
+ flex-shrink: 0;
+ width: 12px;
+ height: 12px;
+ border-radius: 50%;
+ border: none;
+ cursor: pointer;
+ padding: 0;
+ transition: transform 0.1s, opacity 0.1s;
+}
+.sub-dot:hover {
+ transform: scale(1.25);
+ opacity: 0.8;
+}
+.dot-todo {
+ background: transparent;
+ border: 2px solid var(--color-text-muted);
+}
+.dot-in-progress {
+ background: var(--color-status-in-progress, #3b82f6);
+}
+.dot-done {
+ background: var(--color-status-done, #22c55e);
+}
+.sub-title {
+ flex: 1;
+ font-size: 0.9rem;
+ color: var(--color-text);
+ text-decoration: none;
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.sub-title:hover {
+ color: var(--color-primary);
+}
+.sub-title.sub-done {
+ color: var(--color-text-muted);
+ text-decoration: line-through;
+}
+.sub-due {
+ font-size: 0.75rem;
+ color: var(--color-text-muted);
+ flex-shrink: 0;
+}
+
.backlinks {
margin-top: 2rem;
border-top: 1px solid var(--color-border);