/* ================================================ BASES VIEWS - TaskNotes Integration Styles ================================================ */ /* ================================================ CUSTOM NEW TASK BUTTON Toggle between native and TaskNotes "New" button ================================================ */ /* Hide TaskNotes button by default */ .tn-bases-new-task-btn { display: none; } /* When a TaskNotes view is active: show our button, hide native */ .tasknotes-view-active .tn-bases-new-task-btn { display: flex; } .tn-bases-new-task-btn > button.text-icon-button { align-items: center; background: transparent; border: none; box-shadow: none; color: var(--text-muted); cursor: var(--cursor-link, pointer); display: flex; font: inherit; font-size: var(--font-ui-small, 13px); gap: var(--size-4-1); height: auto; margin: var(--size-2-1); padding: var(--size-4-1); } .tn-bases-new-task-btn > button.text-icon-button:hover { background: var(--background-modifier-hover); color: var(--text-normal); } .tn-bases-new-task-btn > button.text-icon-button:focus-visible { outline: 2px solid var(--background-modifier-border-focus); outline-offset: 2px; } .tasknotes-view-active .bases-toolbar-new-item-menu { display: none; } /* Obsidian Bases adds bottom padding to its scroll container. Full-height TaskNotes custom views need to occupy that space so they can align with the pane edge. */ .tasknotes-view-active .bases-view { padding-bottom: 0; } /* Notes in side panes inherit Obsidian's readable-line padding. Let TaskNotes Base embeds reclaim that padding so the cards line up with directly opened Bases views. */ .mod-left-split .markdown-preview-view .internal-embed.bases-embed.tasknotes-view-active, .mod-right-split .markdown-preview-view .internal-embed.bases-embed.tasknotes-view-active { margin-inline: calc(-1 * var(--file-margins, var(--size-4-5))); max-width: calc(100% + var(--file-margins, var(--size-4-5)) + var(--file-margins, var(--size-4-5))); width: calc(100% + var(--file-margins, var(--size-4-5)) + var(--file-margins, var(--size-4-5))); } /* Bases TaskNotes List View Container */ .tn-bases-tasknotes-list { display: flex; flex-direction: column; gap: var(--tn-spacing-xs); width: 100%; padding: var(--tn-spacing-sm); } /* Task Group Section (matches TaskListView structure) */ .tn-bases-tasknotes-list .task-section.task-group { margin-bottom: var(--tn-spacing-md); } /* Group Header */ .tn-bases-tasknotes-list .task-group-header { display: flex; align-items: center; gap: var(--tn-spacing-xs); justify-content: flex-start; padding: var(--tn-spacing-xs) var(--tn-spacing-md) var(--tn-spacing-xs) var(--tn-spacing-sm); margin-bottom: var(--tn-spacing-sm); border-bottom: 1px solid var(--tn-border-color); position: relative; font-size: var(--tn-font-size-lg); font-weight: var(--tn-font-weight-medium); color: var(--tn-text-normal); letter-spacing: 0.01em; line-height: 1.4; cursor: var(--cursor-link, pointer); } /* Count element within group headers */ .tn-bases-tasknotes-list .task-group-header .agenda-view__item-count { margin-left: auto; margin-right: 0; } .tn-tasknotesTaskList .tn-search-container { display: flex; align-items: center; gap: var(--tn-spacing-sm); min-width: 0; } .tn-tasknotesTaskList .tn-search-box { flex: 1; min-width: 0; } /* Toggle button for groups */ .tn-bases-tasknotes-list .task-group-toggle { appearance: none; display: flex; align-items: center; justify-content: center; width: 20px; height: 20px; min-width: 20px; min-height: 20px; margin: 0; padding: 0; flex-shrink: 0; border: 0; border-radius: var(--tn-radius-sm); box-shadow: none; background: transparent; color: var(--tn-text-muted); font-size: 14px; line-height: 1; cursor: var(--cursor-link, pointer); } .tn-bases-tasknotes-list .task-group-toggle:hover, .tn-bases-tasknotes-list .task-group-toggle:focus-visible { background: var(--background-modifier-hover); color: var(--tn-text-normal); } /* Default expanded state - chevron pointing down */ .tn-bases-tasknotes-list .task-group .task-group-toggle svg { color: var(--tn-text-normal); transition: transform 0.2s ease; transform: rotate(90deg); } /* Collapsed state - chevron pointing right */ .tn-bases-tasknotes-list .task-group.is-collapsed .task-group-toggle svg { transform: rotate(0deg); } /* Hide task cards when collapsed */ .tn-bases-tasknotes-list .task-group.is-collapsed .task-cards { display: none; } /* Sub-group header styling */ .tn-tasknotesTaskList .task-group[data-level="sub"] { padding-left: 16px; /* Subtle indentation */ margin-bottom: var(--tn-spacing-sm); } .tn-tasknotesTaskList .task-group[data-level="sub"] .task-group-header { font-size: 0.95em; font-weight: 500; /* Less bold than primary */ color: var(--tn-text-muted); padding: var(--tn-spacing-xs) var(--tn-spacing-sm); } .tn-tasknotesTaskList .task-group[data-level="sub"] .task-group-toggle { opacity: 0.8; /* Slightly more subtle chevron */ } .tn-tasknotesTaskList .task-group[data-level="sub"] .task-group-toggle svg { width: 14px; height: 14px; } /* Task cards container */ .tn-bases-tasknotes-list .tasks-container.task-cards { display: flex; flex-direction: column; gap: var(--tn-spacing-xs); padding-left: var(--tn-spacing-md); } body.is-mobile .tn-tasknotesTaskList .tn-bases-items-container, body.is-mobile .tn-bases-tasknotes-list { padding-bottom: calc(128px + env(safe-area-inset-bottom, 0px)); scroll-padding-bottom: calc(128px + env(safe-area-inset-bottom, 0px)); } /* Sidebar and popout note embeds already have a constrained note scroller. Let that parent own vertical scrolling so Task List embeds do not reserve empty viewport-height space inside the note. */ .mod-left-split .internal-embed .tn-tasknotesTaskList, .mod-left-split .markdown-embed .tn-tasknotesTaskList, .mod-right-split .internal-embed .tn-tasknotesTaskList, .mod-right-split .markdown-embed .tn-tasknotesTaskList, body.is-popout-window .internal-embed .tn-tasknotesTaskList, body.is-popout-window .markdown-embed .tn-tasknotesTaskList { height: auto; } .mod-left-split .internal-embed .tn-tasknotesTaskList .tn-bases-items-container, .mod-left-split .markdown-embed .tn-tasknotesTaskList .tn-bases-items-container, .mod-right-split .internal-embed .tn-tasknotesTaskList .tn-bases-items-container, .mod-right-split .markdown-embed .tn-tasknotesTaskList .tn-bases-items-container, body.is-popout-window .internal-embed .tn-tasknotesTaskList .tn-bases-items-container, body.is-popout-window .markdown-embed .tn-tasknotesTaskList .tn-bases-items-container { flex: 0 1 auto; max-height: none; overflow-y: visible; } /* Reset indentation for task cards after a primary group header */ .tn-tasknotesTaskList .task-group[data-level="primary"] ~ .task-card { margin-left: 0; } /* Indent task cards under subgroups to align chevrons with subgroup header chevron. This rule comes after the primary reset so it wins for cards following a subgroup. */ .tn-tasknotesTaskList .task-group[data-level="sub"] ~ .task-card { margin-left: 16px; } /* Empty state */ .tn-bases-empty { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: var(--tn-spacing-xl); text-align: center; color: var(--tn-text-muted); background: var(--tn-bg-secondary); border: 1px solid var(--tn-border-color); border-radius: var(--tn-radius-md); margin: var(--tn-spacing-lg) 0; } /* Kanban Board Styles */ .tn-bases-kanban-board { display: flex; gap: var(--tn-spacing-md); overflow-x: auto; padding: var(--tn-spacing-sm); min-height: 400px; } .tn-bases-kanban-column { flex: 0 0 280px; min-width: 280px; display: flex; flex-direction: column; background: var(--tn-bg-secondary); border: 1px solid var(--tn-border-color); border-radius: var(--tn-radius-md); overflow: hidden; } .tn-bases-kanban-column-header { padding: var(--tn-spacing-md); background: var(--tn-bg-primary); border-bottom: 1px solid var(--tn-border-color); font-weight: var(--tn-font-weight-medium); color: var(--tn-text-normal); display: flex; align-items: center; justify-content: space-between; } .tn-bases-kanban-column-name { font-size: var(--tn-font-size-md); } .tn-bases-kanban-column-count { font-size: var(--tn-font-size-sm); color: var(--tn-text-muted); background: var(--tn-bg-secondary); padding: 2px 8px; border-radius: var(--tn-radius-sm); } .tn-bases-kanban-tasks { flex: 1; padding: var(--tn-spacing-sm); display: flex; flex-direction: column; gap: var(--tn-spacing-xs); overflow-y: auto; } /* Drag and drop styles */ .tn-bases-kanban-tasks.drag-over { background: var(--tn-interactive-hover); border: 2px dashed var(--tn-interactive-accent); border-radius: var(--tn-radius-sm); } /* Bases Calendar List View - minimalist styling */ .fc-event-default-list { padding: var(--tn-spacing-xs) var(--tn-spacing-sm); margin: var(--tn-spacing-xs) 0; background: transparent; border: none; border-radius: var(--tn-radius-sm); } #bases-calendar .fc-refreshCalendars-button.tasknotes-calendar-refresh-button--icon { display: inline-flex; align-items: center; justify-content: center; min-width: 32px; } #bases-calendar .fc-refreshCalendars-button.tasknotes-calendar-refresh-button--icon .svg-icon { width: 16px; height: 16px; } /* Style FullCalendar list view structure */ #bases-calendar .fc-list { background: transparent; } #bases-calendar .fc-list-table { background: transparent; } #bases-calendar .fc-list-event { background: transparent; border: none; } #bases-calendar .fc-list-event:hover { background: var(--tn-interactive-hover); } #bases-calendar .fc-list-event.fc-list-task-card:hover, #bases-calendar .fc-list-event.fc-list-task-card:hover > td { background: transparent; background-color: transparent; } #bases-calendar .fc-list-day-cushion { background: transparent; padding: var(--tn-spacing-sm) var(--tn-spacing-xs); border-bottom: 1px solid var(--tn-divider-color); font-weight: var(--tn-font-weight-medium); } #bases-calendar .fc-list-day { background: transparent; } /* Today highlight in list/agenda view */ #bases-calendar .fc-list-day.fc-day-today .fc-list-day-cushion { color: var(--interactive-accent); font-weight: 600; border-bottom-color: var(--interactive-accent); } .hide-today-highlight #bases-calendar .fc-list-day.fc-day-today .fc-list-day-cushion { color: var(--text-normal); font-weight: var(--tn-font-weight-medium); border-bottom-color: var(--tn-divider-color); } /* Override FullCalendar's bright white border color in dark mode */ .theme-dark #bases-calendar.fc-theme-standard { --fc-border-color: var(--background-modifier-border); } /* Responsive design for Bases views */ @media (max-width: 768px) { .tn-bases-kanban-board { gap: var(--tn-spacing-sm); } .tn-bases-kanban-column { flex: 0 0 min(76vw, 260px); min-width: min(76vw, 260px); } } @media (max-width: 480px) { .tn-bases-tasknotes-list .task-group-header { font-size: var(--tn-font-size-md); padding: var(--tn-spacing-sm) 0 var(--tn-spacing-xs); } .tn-bases-kanban-column { flex: 0 0 min(82vw, 240px); min-width: min(82vw, 240px); } } body.is-mobile .tn-bases-kanban-board { align-items: flex-start; min-height: auto; scroll-snap-type: x proximity; padding-bottom: calc(112px + env(safe-area-inset-bottom, 0px)); } body.is-mobile .tn-bases-kanban-column { scroll-snap-align: start; } /* ================================================ SWIMLANE KANBAN LAYOUT ================================================ */ /* Board with swimlanes - use CSS Grid instead of flexbox */ .kanban-view__board--swimlanes { display: flex; flex-direction: column; gap: var(--tn-spacing-sm); overflow: auto; padding: var(--tn-spacing-sm); min-height: 400px; } /* Each swimlane row */ .kanban-view__swimlane-row { display: grid; flex: 0 0 auto; /* First column is the swimlane label with fixed width, rest are kanban columns */ grid-template-columns: var(--kanban-swimlane-label-width, 120px); grid-auto-columns: var(--kanban-column-width, 280px); grid-auto-flow: column; gap: 0; background: transparent; border: 1px solid var(--tn-border-color); border-radius: var(--tn-radius-sm); min-width: max-content; overflow: hidden; } .kanban-view__swimlane-row:not(.kanban-view__swimlane-row--header) { max-height: var(--kanban-swimlane-max-height, 600px); } /* Last row gets bottom border */ .kanban-view__swimlane-row:last-child { border-bottom: 1px solid var(--tn-border-color); } /* Header row styling */ .kanban-view__swimlane-row--header { position: sticky; top: 0; z-index: 10; background: var(--tn-bg-secondary); font-weight: var(--tn-font-weight-semibold); } /* Swimlane label cell (leftmost column) */ .kanban-view__swimlane-label { background: color-mix(in srgb, var(--tn-bg-secondary) 86%, var(--tn-bg-primary)); padding: var(--tn-spacing-md); display: flex; flex-direction: column; gap: var(--tn-spacing-xs); align-items: flex-start; justify-content: flex-start; border-right: 1px solid var(--tn-border-color); position: sticky; left: 0; z-index: 5; min-height: 72px; overflow: hidden; } /* Swimlane title */ .kanban-view__swimlane-title { font-weight: var(--tn-font-weight-medium); color: var(--tn-text-normal); font-size: var(--tn-font-size-md); display: flex; align-items: center; gap: 4px; max-width: 100%; overflow: hidden; text-overflow: ellipsis; } /* Swimlane task count */ .kanban-view__swimlane-count { font-size: var(--tn-font-size-sm); color: var(--tn-text-muted); background: var(--tn-bg-primary); border: 1px solid color-mix(in srgb, var(--tn-border-color) 72%, transparent); padding: 2px 6px; border-radius: var(--tn-radius-sm); } /* Column header cell in header row */ .kanban-view__column-header-cell { background: var(--tn-bg-secondary); padding: var(--tn-spacing-sm) var(--tn-spacing-md); display: flex; align-items: center; justify-content: flex-start; text-align: left; cursor: grab; user-select: none; transition: background-color var(--tn-transition-fast), box-shadow var(--tn-transition-fast), opacity var(--tn-transition-fast), transform var(--tn-transition-fast); gap: var(--tn-spacing-xs); min-height: 40px; border-right: 1px solid var(--tn-border-color); } .kanban-view__column-header-cell:active { cursor: grabbing; } .kanban-view__column-header-cell--dragging { opacity: 0.5; box-shadow: var(--tn-shadow-medium); } @media (pointer: coarse) { .kanban-view__column-header-cell--dragging { pointer-events: none; } } .kanban-view__column-header-cell .kanban-view__column-title { font-size: var(--tn-font-size-md); font-weight: var(--tn-font-weight-semibold); color: var(--tn-text-normal); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .kanban-view__column-header-cell--unknown-status { background: var(--tn-bg-primary); color: var(--tn-text-muted); } /* Individual swimlane column cells (data cells) */ .kanban-view__swimlane-column { background: color-mix(in srgb, var(--tn-bg-primary) 92%, var(--tn-bg-secondary)); padding: var(--tn-spacing-sm); min-height: 112px; max-height: var(--kanban-swimlane-max-height, 600px); display: flex; flex-direction: column; border-right: 1px solid var(--tn-border-color); overflow: hidden; } .kanban-view__swimlane-column.kanban-view__column--unknown-status { border-left: 1px dashed var(--tn-text-faint); background: var(--tn-bg-secondary); } /* Tasks container within each cell */ .kanban-view__swimlane-column .kanban-view__tasks-container { display: flex; flex-direction: column; gap: var(--tn-spacing-xs); flex: 1; overflow-y: auto; min-height: 0; } /* Drag over state for swimlane cells */ .kanban-view__swimlane-column--dragover { background: var(--tn-interactive-hover); outline: 2px dashed var(--tn-interactive-accent); outline-offset: -2px; } /* Responsive adjustments for swimlanes */ @media (max-width: 1200px) { .kanban-view__swimlane-row > :first-child { width: 150px; min-width: 150px; } .kanban-view__swimlane-label { padding: var(--tn-spacing-sm); } } @media (max-width: 768px) { .kanban-view__swimlane-row > :first-child { width: 120px; min-width: 120px; } .kanban-view__swimlane-title { font-size: var(--tn-font-size-sm); } .kanban-view__column-header-cell .kanban-view__column-title { font-size: var(--tn-font-size-sm); } }