/* ================================================================= TASKCARD COMPONENT - BEM NAMING CONVENTION & PROPER SCOPING ================================================================= */ /* All TaskCard styles are scoped under .tasknotes-plugin for proper isolation */ .tasknotes-plugin .task-card { /* Layout & Structure */ display: flex; flex-direction: column; gap: 0; position: relative; /* Spacing & Sizing - Refined spacing for better visual breathing room */ padding: var(--tn-spacing-md) var(--tn-spacing-lg); margin-bottom: 1px; /* Visual Styling - Subtle depth with minimal shadow */ background-color: transparent; border: none; border-radius: var(--tn-radius-xs); box-shadow: none; /* Interactions & Accessibility - Smooth transitions */ transition: all var(--tn-transition-fast); outline: none; } .tasknotes-plugin .task-card:hover { background-color: var(--background-modifier-hover); } .tasknotes-plugin .task-card.task-card--nested-interactive-hover { background-color: transparent; box-shadow: none; } .tasknotes-plugin .task-card:focus { background-color: var(--background-modifier-hover); outline: 2px solid var(--background-modifier-border-focus); outline-offset: -2px; } .tasknotes-plugin .task-card:focus:not(:focus-visible) { outline: none; } .tasknotes-plugin .task-card:last-child { margin-bottom: 0; } /* Remove border radius for cleaner list appearance */ .tasknotes-plugin .task-card:first-child, .tasknotes-plugin .task-card:last-child, .tasknotes-plugin .task-card:first-child:last-child { border-radius: 0; } /* ================================================================= TASKCARD ELEMENTS (BEM __element) ================================================================= */ .tasknotes-plugin .task-card__main-row { display: flex; align-items: center; gap: var(--tn-spacing-sm); width: 100%; position: relative; } .tasknotes-plugin .task-card__content { flex: 1; display: flex; flex-direction: column; gap: 4px; min-width: 0; } .tasknotes-plugin .task-card__title { font-size: var(--tn-font-size-lg); font-weight: 400; line-height: 1.4; color: var(--tn-text-normal); margin: 0; word-wrap: break-word; word-break: break-word; white-space: normal; transition: color var(--tn-transition-fast); display: flex; align-items: center; gap: var(--tn-spacing-sm); } .tasknotes-plugin .task-card__title-text { flex: 1; min-width: 0; } .tasknotes-plugin .task-card__metadata { font-size: var(--tn-font-size-md); color: var(--tn-text-muted); line-height: 1.3; margin: 0; font-weight: 400; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 0; } .tasknotes-plugin .task-card__metadata-item { display: flex; align-items: center; gap: var(--tn-spacing-xs); white-space: nowrap; } .tasknotes-plugin .task-card__metadata-property { display: inline-flex; align-items: center; gap: 4px; min-width: 0; max-width: 100%; } .tasknotes-plugin .task-card__metadata-value { display: inline-flex; align-items: center; gap: 4px; min-width: 0; max-width: 100%; overflow: hidden; white-space: nowrap; } .tasknotes-plugin .task-card__metadata-property .tag { display: inline-flex; align-items: center; flex: 0 0 auto; white-space: nowrap; } .tasknotes-plugin .task-card__metadata-pill { display: inline-flex; align-items: center; gap: var(--tn-spacing-xs); padding: 3px 8px; border-radius: var(--tn-radius-md); font-size: var(--tn-font-size-sm); line-height: 1.2; font-weight: 500; background: var(--background-secondary); color: var(--text-muted); border: 1px solid var(--background-modifier-border); transition: background var(--tn-transition-fast), border-color var(--tn-transition-fast); } .tasknotes-plugin .task-card__metadata-pill:hover { background: var(--background-modifier-hover); border-color: var(--background-modifier-border-hover); } .tasknotes-plugin .task-card__metadata-pill--blocked { background: color-mix(in srgb, var(--tn-color-error) 75%, var(--tn-bg-primary)); color: var(--tn-bg-primary); border-color: color-mix(in srgb, var(--tn-color-error) 85%, var(--tn-bg-primary)); padding-inline: var(--tn-spacing-md); } .tasknotes-plugin .task-card__metadata-pill--blocked:hover { background: var(--tn-color-error); color: var(--tn-bg-primary); border-color: var(--tn-color-error); } .tasknotes-plugin .task-card__metadata-pill--blocking { background: transparent; color: var(--tn-color-error); border-color: color-mix(in srgb, var(--tn-color-error) 70%, transparent); } .tasknotes-plugin .task-card__metadata-pill--google-calendar { background: transparent; color: #4285F4; border-color: color-mix(in srgb, #4285F4 70%, transparent); padding: 0 6px; } .tasknotes-plugin .task-card__metadata-pill--google-calendar svg { width: 12px; height: 12px; } /* Checklist progress metadata */ .tasknotes-plugin .task-card__metadata-property--checklistProgress { display: inline-flex; align-items: center; gap: 6px; } .tasknotes-plugin .task-card__progress { display: inline-flex; align-items: center; gap: 6px; } .tasknotes-plugin .task-card__progress-bar { width: 72px; height: 6px; background: color-mix(in srgb, var(--background-modifier-border) 70%, transparent); border-radius: 999px; overflow: hidden; flex-shrink: 0; } .tasknotes-plugin .task-card__progress-fill { display: block; height: 100%; width: 0; background: var(--interactive-accent); border-radius: inherit; transition: width var(--tn-transition-fast); } .tasknotes-plugin .task-card__progress-label { font-size: var(--tn-font-size-sm); font-variant-numeric: tabular-nums; color: var(--tn-text-muted); } .tasknotes-plugin .task-card__tag { background: var(--tn-bg-secondary); color: var(--tn-text-muted); padding: var(--tn-spacing-xs) var(--tn-spacing-sm); border-radius: var(--tn-radius-xs); font-size: var(--tn-font-size-sm); font-weight: 400; border: none; white-space: nowrap; } .tasknotes-plugin .task-card__due-date { color: var(--tn-color-success); font-size: var(--tn-font-size-sm); font-weight: 400; padding: var(--tn-spacing-xs) var(--tn-spacing-xs); border-radius: var(--tn-radius-xs); background: color-mix(in srgb, var(--tn-color-success) 15%, var(--tn-bg-primary)); } .tasknotes-plugin .task-card__due-date--overdue { color: var(--tn-color-error); background: color-mix(in srgb, var(--tn-color-error) 15%, var(--tn-bg-primary)); } .tasknotes-plugin .task-card__due-date--today { color: var(--tn-color-warning); background: color-mix(in srgb, var(--tn-color-warning) 15%, var(--tn-bg-primary)); } .tasknotes-plugin .task-card__priority-badge { display: none; /* Hide priority badges in favor of dots */ } /* Simplified info display - no progressive disclosure for Todoist style */ /* Drag handle indicator */ .tasknotes-plugin .task-card__drag-handle { position: absolute; left: 0; top: 50%; transform: translateY(-50%); width: 4px; height: 20px; background: repeating-linear-gradient( to bottom, var(--tn-text-faint) 0px, var(--tn-text-faint) 2px, transparent 2px, transparent 4px ); opacity: 0; transition: opacity var(--tn-transition-fast); border-radius: var(--tn-radius-xs); } .tasknotes-plugin .task-card[draggable="true"]:hover .task-card__drag-handle { opacity: 0.5; } .tasknotes-plugin .task-card[draggable="true"]:active .task-card__drag-handle { opacity: 0.8; } .tasknotes-plugin .task-card[draggable="true"] { cursor: grab; transition: all var(--tn-transition-fast); } .tasknotes-plugin .task-card[draggable="true"]:active, .tasknotes-plugin .task-card.task-card--dragging { cursor: grabbing; } .tasknotes-plugin .task-card [data-tn-no-drag="true"] { cursor: var(--cursor, pointer); } /* Container queries for adaptive layouts */ @container (max-width: 300px) { .tasknotes-plugin .task-card { padding: var(--tn-spacing-sm) var(--tn-spacing-md); } .tasknotes-plugin .task-card__quick-actions { gap: 2px; } .tasknotes-plugin .task-card__quick-action { width: 20px; height: 20px; } .tasknotes-plugin .task-card__metadata { gap: var(--tn-spacing-xs); } } .tasknotes-plugin .task-card__status-dot { display: inline-block; width: 18px; height: 18px; border-radius: 50%; flex-shrink: 0; border: 2px solid color-mix(in srgb, var(--tn-border-color) 80%, transparent); background-color: transparent; transition: all var(--tn-transition-fast); position: relative; box-shadow: none; } .tasknotes-plugin .task-card__status-dot:hover { background-color: color-mix(in srgb, var(--next-status-color, var(--tn-interactive-accent)) 30%, transparent); border-color: var(--next-status-color, var(--tn-interactive-accent)); } /* Completed status - filled circle with status color */ .tasknotes-plugin .task-card--completed > .task-card__main-row .task-card__status-dot { background-color: var(--current-status-color, var(--tn-color-success)); border-color: var(--current-status-color, var(--tn-color-success)); box-shadow: none; position: relative; } .tasknotes-plugin .task-card--completed > .task-card__main-row .task-card__status-dot:hover { background-color: color-mix(in srgb, var(--next-status-color, var(--tn-interactive-accent)) 50%, var(--current-status-color, var(--tn-color-success))); border-color: var(--next-status-color, var(--tn-interactive-accent)); } /* Completion animation - subtle pulse when task is completed */ @keyframes status-complete { 0% { transform: scale(1); box-shadow: 0 0 0 0 color-mix(in srgb, var(--current-status-color, var(--tn-color-success)) 40%, transparent); } 50% { transform: scale(1.2); box-shadow: 0 0 0 6px color-mix(in srgb, var(--current-status-color, var(--tn-color-success)) 0%, transparent); } 100% { transform: scale(1); box-shadow: none; } } .tasknotes-plugin .task-card--completed.task-card--just-completed > .task-card__main-row .task-card__status-dot { animation: status-complete 0.6s cubic-bezier(0.4, 0, 0.2, 1); } /* Status dot with icon mode - uses Lucide icons from theme */ .tasknotes-plugin .task-card__status-dot--icon { border: none; background-color: transparent; display: inline-flex; align-items: center; justify-content: center; } .tasknotes-plugin .task-card__status-dot--icon svg { width: 18px; height: 18px; color: var(--current-status-color, var(--tn-text-muted)); stroke-width: 2; } .tasknotes-plugin .task-card__status-dot--icon:hover svg { color: var(--next-status-color, var(--tn-interactive-accent)); } /* Completed state for icon mode */ .tasknotes-plugin .task-card--completed > .task-card__main-row .task-card__status-dot--icon { background-color: transparent; } .tasknotes-plugin .task-card--completed > .task-card__main-row .task-card__status-dot--icon svg { color: var(--current-status-color, var(--tn-color-success)); } .tasknotes-plugin .task-card--completed > .task-card__main-row .task-card__status-dot--icon:hover svg { color: var(--next-status-color, var(--tn-interactive-accent)); } /* ================================================================= BADGE AREA - Groups secondary indicators (recurring, reminder, project) ================================================================= */ .tasknotes-plugin .task-card__badges { display: flex; align-items: center; gap: var(--tn-spacing-xs); flex-shrink: 0; } /* Hide badges container when empty */ .tasknotes-plugin .task-card__badges:empty { display: none; } .tasknotes-plugin .task-card__recurring-indicator { width: 14px; height: 14px; color: var(--tn-text-muted); opacity: 0.7; display: none; /* Hidden by default, shown via modifier */ align-items: center; justify-content: center; transition: all var(--tn-transition-fast); border-radius: var(--tn-radius-sm); flex-shrink: 0; } .tasknotes-plugin .task-card__recurring-indicator:hover { opacity: 1; color: var(--interactive-accent); background: var(--background-modifier-hover); } .tasknotes-plugin .task-card__recurring-indicator svg { width: 14px; height: 14px; } /* Recurrence instance statistics pills */ .tasknotes-plugin .task-card__metadata-pill--completed-instances { color: var(--text-success); } .tasknotes-plugin .task-card__metadata-pill--skipped-instances { color: var(--text-muted); opacity: 0.7; } /* Reminder indicator */ .tasknotes-plugin .task-card__reminder-indicator { width: 14px; height: 14px; color: var(--tn-text-muted); opacity: 0.7; transition: all var(--tn-transition-fast); display: flex; align-items: center; justify-content: center; border-radius: var(--tn-radius-sm); flex-shrink: 0; } .tasknotes-plugin .task-card__reminder-indicator:hover { opacity: 1; color: var(--interactive-accent); background: var(--background-modifier-hover); } .tasknotes-plugin .task-card__reminder-indicator svg { width: 14px; height: 14px; } /* Project indicator */ .tasknotes-plugin .task-card__project-indicator { width: 14px; height: 14px; color: var(--tn-text-muted); opacity: 0.7; display: flex; align-items: center; justify-content: center; border-radius: var(--tn-radius-sm); transition: all var(--tn-transition-fast); flex-shrink: 0; } .tasknotes-plugin .task-card__project-indicator:hover { opacity: 1; color: var(--interactive-accent); background: var(--background-modifier-hover); } .tasknotes-plugin .task-card__project-indicator svg { width: 14px; height: 14px; } /* Chevron for expandable subtasks */ .tasknotes-plugin .task-card__chevron { width: 14px; height: 14px; color: var(--tn-text-muted); opacity: 0; display: flex; align-items: center; justify-content: center; border-radius: var(--tn-radius-sm); transition: all var(--tn-transition-fast); flex-shrink: 0; } .tasknotes-plugin .task-card__chevron:hover { opacity: 1; color: var(--interactive-accent); background: var(--background-modifier-hover); } /* In left mode, chevrons are always visible (like group chevrons) */ .tasknotes-plugin .task-card.task-card--chevron-left .task-card__chevron { opacity: 1; position: absolute; left: calc(-1 * var(--tn-spacing-lg) - 14px); top: 50%; transform: translateY(-50%); width: 18px; height: 18px; } .tasknotes-plugin .task-card:hover .task-card__chevron { opacity: 1; } .tasknotes-plugin .task-card__chevron svg { width: 14px; height: 14px; transition: transform var(--tn-transition-fast); } .tasknotes-plugin .task-card__chevron--expanded svg { transform: rotate(90deg); } /* Blocking toggle */ .tasknotes-plugin .task-card__blocking-toggle { width: 14px; height: 14px; color: var(--tn-text-muted); opacity: 0.8; display: flex; align-items: center; justify-content: center; transition: color var(--tn-transition-fast), background var(--tn-transition-fast), opacity var(--tn-transition-fast); border-radius: var(--tn-radius-sm); flex-shrink: 0; } .tasknotes-plugin .task-card__blocking-toggle:hover { opacity: 1; color: var(--interactive-accent); background: var(--background-modifier-hover); } .tasknotes-plugin .task-card__blocking-toggle svg { width: 14px; height: 14px; } .tasknotes-plugin .task-card__blocking-toggle--expanded { color: var(--interactive-accent); opacity: 1; } .tasknotes-plugin .task-card__blocking-toggle.is-hidden { display: none; } /* Left-position variant for subtask chevron */ .tasknotes-plugin .task-card.task-card--chevron-left { /* Reserve gutter for chevron plus spacing */ padding-left: calc(var(--tn-spacing-lg) + 20px); } /* Ensure nested cards in left mode also reserve chevron gutter */ .tasknotes-plugin .task-card__subtasks .task-card.task-card--chevron-left { padding-left: calc(var(--tn-spacing-md) + 20px); } .tasknotes-plugin .task-card__subtasks { margin-left: 24px; margin-top: 6px; border-left: 2px solid color-mix(in srgb, var(--tn-border-color) 40%, transparent); padding-left: 14px; position: relative; z-index: 1; } .tasknotes-plugin .task-card__subtasks::before { content: ''; position: absolute; left: -2px; top: 0; width: 2px; height: 100%; background: linear-gradient( to bottom, color-mix(in srgb, var(--tn-interactive-accent) 30%, transparent), transparent ); opacity: 0; transition: opacity var(--tn-transition-fast); } .tasknotes-plugin .task-card:hover .task-card__subtasks::before { opacity: 1; } .tasknotes-plugin .task-card__subtasks .task-card { margin-bottom: 3px; padding: var(--tn-spacing-sm) var(--tn-spacing-md); } .tasknotes-plugin .task-card__subtasks .task-card:last-child { margin-bottom: 0; } .tasknotes-plugin .task-card--subtask { background: color-mix(in srgb, var(--tn-bg-secondary) 25%, transparent); border-radius: var(--tn-radius-sm); backdrop-filter: blur(2px); } .tasknotes-plugin .task-card__blocking { margin-left: 24px; margin-top: 6px; border-left: 2px dashed color-mix(in srgb, var(--tn-color-error) 30%, transparent); padding-left: 14px; display: flex; flex-direction: column; gap: 4px; position: relative; z-index: 1; } .tasknotes-plugin .task-card__blocking::before { content: ''; position: absolute; left: -2px; top: 0; width: 2px; height: 100%; background: linear-gradient( to bottom, color-mix(in srgb, var(--tn-color-error) 30%, transparent), transparent ); opacity: 0; transition: opacity var(--tn-transition-fast); } .tasknotes-plugin .task-card:hover .task-card__blocking::before { opacity: 1; } .tasknotes-plugin .task-card--dependency { background: color-mix(in srgb, var(--tn-color-error) 4%, transparent); border-radius: var(--tn-radius-sm); border-left: 2px solid color-mix(in srgb, var(--tn-color-error) 20%, transparent); padding-left: calc(var(--tn-spacing-md) - 2px); } .tasknotes-plugin .task-card__blocking-loading, .tasknotes-plugin .task-card__blocking-empty { font-size: var(--tn-font-size-sm); color: var(--tn-text-muted); font-style: italic; } .tasknotes-plugin .task-card--subtask:hover { background: color-mix(in srgb, var(--tn-interactive-hover) 60%, var(--tn-bg-secondary)); } .tasknotes-plugin .task-card__subtasks-loading { margin-left: 20px; margin-top: 4px; padding: var(--tn-spacing-sm); color: var(--tn-text-muted); font-size: var(--tn-font-size-sm); font-style: italic; } .tasknotes-plugin .task-card__context-menu { width: 14px; height: 14px; color: var(--tn-text-faint); opacity: 0; transition: all var(--tn-transition-fast); display: flex; align-items: center; justify-content: center; border-radius: var(--tn-radius-sm); flex-shrink: 0; margin-left: auto; } .tasknotes-plugin .task-card__context-menu:hover { color: var(--tn-text-normal); background: var(--tn-interactive-hover); opacity: 1; } .tasknotes-plugin .task-card:hover .task-card__context-menu { opacity: 0.6; } .tasknotes-plugin .task-card__context-menu svg { width: 14px; height: 14px; } /* Quick actions removed for Todoist-style simplicity */ /* ===================================================================== HOVER CONTEXT MENU INTERACTIONS ===================================================================== */ /* Enhanced priority dot hover for context menu */ .tasknotes-plugin .task-card__priority-dot:hover { opacity: 0.8; } /* Hoverable date text elements */ .tasknotes-plugin .task-card__metadata-date { transition: all var(--tn-transition-fast); border-radius: var(--tn-radius-sm); padding: 3px 6px; margin: -3px -6px; position: relative; } .tasknotes-plugin .task-card__metadata-date:hover { background: var(--background-modifier-hover); color: var(--interactive-accent); } .tasknotes-plugin .task-card__metadata-date--due:hover { background: color-mix(in srgb, var(--tn-color-error) 12%, transparent); color: var(--tn-color-error); } .tasknotes-plugin .task-card__metadata-date--scheduled:hover { background: color-mix(in srgb, var(--tn-color-info) 12%, transparent); color: var(--tn-color-info); } /* Overdue due dates - use the hover background color for text */ .tasknotes-plugin .task-card__metadata-date--overdue { color: var(--tn-color-error); } /* Past scheduled dates - use the hover background color for text */ .tasknotes-plugin .task-card__metadata-date--past { color: var(--tn-color-info); } /* Project links */ .tasknotes-plugin .task-card__project-link { color: var(--interactive-accent); text-decoration: none; transition: all var(--tn-transition-fast); border-radius: var(--tn-radius-sm); padding: 2px 4px; margin: -2px -4px; display: inline-block; position: relative; z-index: 1; } .tasknotes-plugin .task-card__project-link:hover, .tasknotes-plugin .task-card__project-link:focus { background: var(--background-modifier-hover); color: var(--interactive-accent-hover); outline: none; box-shadow: 0 2px 4px color-mix(in srgb, var(--tn-shadow-color, black) 8%, transparent); } .tasknotes-plugin .task-card__project-link:focus { box-shadow: 0 0 0 2px color-mix(in srgb, var(--interactive-accent) 30%, transparent), 0 2px 4px color-mix(in srgb, var(--tn-shadow-color, black) 8%, transparent); } .tasknotes-plugin .task-card__project-link.internal-link { /* Ensure consistent styling with Obsidian's internal links */ color: var(--link-color); } .tasknotes-plugin .task-card__project-link.internal-link:hover, .tasknotes-plugin .task-card__project-link.internal-link:focus { color: var(--link-color-hover); } /* ================================================================= TASKCARD MODIFIERS (BEM --modifier) ================================================================= */ /* Completion State - Use theme colors */ .tasknotes-plugin .task-card--completed > .task-card__main-row { opacity: 0.6; } .tasknotes-plugin .task-card--completed > .task-card__main-row .task-card__title { text-decoration: line-through; color: var(--tn-text-muted); } /* Skipped State - Muted appearance for skipped recurring instances */ .tasknotes-plugin .task-card--skipped { opacity: 0.5; } .tasknotes-plugin .task-card--skipped > .task-card__main-row .task-card__title { text-decoration: line-through; color: var(--text-muted); } .tasknotes-plugin .task-card--skipped > .task-card__main-row .task-card__status-dot { background-color: rgba(128, 128, 128, 0.4); border-color: var(--text-faint); border-style: dashed; } /* Archived State */ .tasknotes-plugin .task-card--archived { opacity: 0.5; background-color: transparent; } /* Active Time Tracking */ .tasknotes-plugin .task-card--actively-tracked { position: relative; } .tasknotes-plugin .task-card--actively-tracked::before { content: ''; position: absolute; top: -2px; left: -2px; right: -2px; bottom: -2px; border: 2px solid var(--tn-color-info); border-radius: var(--tn-radius-xs); opacity: 0.6; animation: pulse-tracking 2s infinite; } @keyframes pulse-tracking { 0%, 100% { opacity: 0.6; } 50% { opacity: 0.3; } } /* Recurring Task */ .tasknotes-plugin .task-card--recurring .task-card__recurring-indicator { display: flex; } /* Skipped recurring instance styling */ .tasknotes-plugin .recurring-skipped, .tasknotes-plugin .task-card--recurring-skipped { opacity: 0.6; } .tasknotes-plugin .recurring-skipped .task-card__title, .tasknotes-plugin .task-card--recurring-skipped .task-card__title { text-decoration: line-through; color: var(--text-muted); } /* Priority indicators - Use user's priority settings */ .tasknotes-plugin .task-card__priority-dot { transition: all var(--tn-transition-fast); box-shadow: none; display: inline-block; width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; background-color: var(--priority-color, transparent); margin: 0 var(--tn-spacing-xs); } /* Dynamic priority colors using CSS variables set by PriorityManager */ /* Use child combinator (>) to prevent subtasks from inheriting parent priority styling */ .tasknotes-plugin .task-card[data-priority] > .task-card__main-row .task-card__priority-dot { background-color: var(--current-priority-color, var(--tn-text-muted)); } /* Fallback priority colors using existing system */ /* Use child combinator (>) to prevent subtasks from inheriting parent priority styling */ .tasknotes-plugin .task-card--priority-high > .task-card__main-row .task-card__priority-dot { background-color: var(--priority-high-color, var(--tn-color-error)); } .tasknotes-plugin .task-card--priority-medium > .task-card__main-row .task-card__priority-dot { background-color: var(--priority-medium-color, var(--tn-interactive-accent)); } .tasknotes-plugin .task-card--priority-normal > .task-card__main-row .task-card__priority-dot { background-color: var(--priority-normal-color, var(--tn-interactive-accent)); } .tasknotes-plugin .task-card--priority-low > .task-card__main-row .task-card__priority-dot { background-color: var(--priority-low-color, var(--tn-text-muted)); } /* Status colors - Use dynamic status colors from user settings */ /* Use child combinator (>) to prevent subtasks from inheriting parent status styling */ .tasknotes-plugin .task-card[data-status] > .task-card__main-row .task-card__status-dot { border-color: var(--current-status-color, var(--tn-border-color)); } /* Minimal animations - Use theme colors */ .tasknotes-plugin .task-card--updated { background-color: var(--tn-interactive-hover); transition: background-color var(--tn-transition-fast); } /* ================================================================= RESPONSIVE DESIGN ================================================================= */ /* Mobile & Touch Devices - Use theme colors */ @media (pointer: coarse) { .tasknotes-plugin .task-card { padding: 12px 16px; min-height: 44px; margin-bottom: 2px; } .tasknotes-plugin .task-card:active { background-color: var(--tn-interactive-hover); } /* Larger touch targets */ .tasknotes-plugin .task-card__context-menu { width: 24px; height: 24px; opacity: 1; } .tasknotes-plugin .task-card__context-menu svg { width: 16px; height: 16px; } /* Larger status dots for touch */ .tasknotes-plugin .task-card__status-dot { width: 18px; height: 18px; } } /* High density displays */ @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { .tasknotes-plugin .task-card { border-left-width: 1px; } .tasknotes-plugin .task-card::before { width: 1px; } } /* Reduced motion preferences */ @media (prefers-reduced-motion: reduce) { .tasknotes-plugin .task-card, .tasknotes-plugin .task-card *, .tasknotes-plugin .task-card::before, .tasknotes-plugin .task-card::after { animation-duration: 0.01ms; animation-iteration-count: 1; transition-duration: 0.01ms; scroll-behavior: auto; } .tasknotes-plugin .task-card--dragging { animation: none; } } /* Print styles */ @media print { .tasknotes-plugin .task-card { page-break-inside: avoid; background: white; box-shadow: none; border: 1px solid #cccccc; } .tasknotes-plugin .task-card__quick-actions, .tasknotes-plugin .task-card__context-menu, .tasknotes-plugin .task-card__enhanced-info { display: none; } } /* Compact mode for smaller screens - Todoist style */ @media (max-width: 768px) { .tasknotes-plugin .task-card { padding: 10px 14px; } .tasknotes-plugin .task-card__content { gap: 1px; } .tasknotes-plugin .task-card__title { font-size: 13px; } .tasknotes-plugin .task-card__metadata { font-size: 11px; } } /* ================================================================= TASKCARD DRAG AND DROP STATES ================================================================= */ .tasknotes-plugin .task-card[draggable="true"]:hover { cursor: grab; transform: translateY(-1px); box-shadow: 0 2px 8px color-mix(in srgb, var(--tn-shadow-color) 15%, transparent); } /* Suppress hover effects during active drag — the translateY(-1px) distorts getBoundingClientRect and fights with the gap/slot shift transforms, and the background-color highlight lingers on cards the cursor passes over. */ .tn-drag-active .tasknotes-plugin .task-card:hover { background-color: inherit; transform: none; box-shadow: none; } .tasknotes-plugin .task-card[draggable="true"]:active { cursor: grabbing; transform: scale(0.98) rotate(1deg); } /* Enhanced dragging state — keep visual feedback subtle so the transformed element doesn't overlap adjacent cards and steal hit-test events during drag-to-reorder. */ .tasknotes-plugin .task-card--dragging { opacity: 0.4; cursor: grabbing; z-index: 1000; box-shadow: 0 4px 16px color-mix(in srgb, var(--tn-shadow-color) 20%, transparent); transition: none; animation: none; } @keyframes drag-pulse { 0%, 100% { box-shadow: 0 8px 32px color-mix(in srgb, var(--tn-shadow-color) 30%, transparent), 0 0 0 1px color-mix(in srgb, var(--tn-interactive-accent) 50%, transparent); } 50% { box-shadow: 0 12px 40px color-mix(in srgb, var(--tn-shadow-color) 40%, transparent), 0 0 0 2px color-mix(in srgb, var(--tn-interactive-accent) 70%, transparent); } } /* Drag preview ghost */ .tasknotes-plugin .task-card--drag-ghost { opacity: 0.3; transform: scale(0.95); transition: all var(--tn-transition-fast); pointer-events: none; filter: blur(1px); } /* Drop zone feedback */ .tasknotes-plugin .task-card--drop-target { border: 2px dashed var(--tn-interactive-accent); background: color-mix(in srgb, var(--tn-interactive-accent) 5%, var(--tn-bg-primary)); transform: scale(1.02); transition: all var(--tn-transition-fast); } .tasknotes-plugin .task-card--drop-target::before { content: ''; position: absolute; inset: -2px; border-radius: var(--tn-radius-sm); background: linear-gradient( 45deg, transparent 25%, color-mix(in srgb, var(--tn-interactive-accent) 10%, transparent) 25%, color-mix(in srgb, var(--tn-interactive-accent) 10%, transparent) 50%, transparent 50%, transparent 75%, color-mix(in srgb, var(--tn-interactive-accent) 10%, transparent) 75% ); background-size: 8px 8px; animation: drop-zone-shimmer 1s linear infinite; z-index: -1; } @keyframes drop-zone-shimmer { 0% { background-position: 0 0; } 100% { background-position: 8px 8px; } } /* ================================================================= LAYOUT MODIFIERS - Inline Mode for Task Link Widgets ================================================================= */ /* Inline layout - single line, compact display for editor task links */ .tasknotes-plugin .task-card--layout-inline { /* Use inline display to respect line boundaries */ display: inline; /* Minimal padding - no indentation needed in inline mode */ padding: 2px 0; margin: 0; margin-bottom: 0; /* Visual style - transparent background */ background-color: transparent; border: none; border-radius: 0; /* Size constraints */ min-height: auto; /* Prevent text from breaking into multiple lines */ white-space: nowrap; /* Force inline behavior */ vertical-align: baseline; } .tasknotes-plugin .task-card--layout-inline:hover { background-color: transparent; } /* Disable drag cursor for inline tasks - they're not draggable */ .tasknotes-plugin .task-card--layout-inline[draggable="true"]:hover { cursor: default; transform: none; box-shadow: none; } .tasknotes-plugin .task-card--layout-inline[draggable="true"]:active { cursor: default; transform: none; } /* Remove chevron gutter padding in inline mode */ .tasknotes-plugin .task-card--layout-inline, .tasknotes-plugin .task-card--layout-inline.task-card--chevron-left { padding-left: 0; padding-right: 0; } /* Main row in inline mode - horizontal layout */ .tasknotes-plugin .task-card--layout-inline .task-card__main-row { display: inline; vertical-align: baseline; } /* Content in inline mode - horizontal, truncated */ .tasknotes-plugin .task-card--layout-inline .task-card__content { display: inline; vertical-align: baseline; } /* Title in inline mode - truncate with ellipsis */ .tasknotes-plugin .task-card--layout-inline .task-card__title { display: inline; font-size: inherit; /* Use editor's font size */ font-weight: 400; margin: 0; vertical-align: baseline; } /* Title text in inline mode - ensure ellipsis works */ .tasknotes-plugin .task-card--layout-inline .task-card__title-text { display: inline; vertical-align: baseline; } /* Metadata in inline mode - stays on same line, scrolls if needed */ .tasknotes-plugin .task-card--layout-inline .task-card__metadata { display: inline-block; font-size: var(--tn-font-size-sm); margin: 0; padding: 0; vertical-align: text-bottom; position: relative; top: -0.15em; white-space: nowrap; width: fit-content; max-width: 100%; overflow-x: auto; overflow-y: hidden; scrollbar-width: none; } /* Only apply spacing and min-width when metadata has content - prevents blank space when empty */ .tasknotes-plugin .task-card--layout-inline .task-card__metadata:not(:empty) { margin-left: 0.5em; min-width: min(30%, 300px); } .tasknotes-plugin .task-card--layout-inline .task-card__metadata:hover { scrollbar-width: thin; scrollbar-color: var(--background-modifier-border) transparent; } .tasknotes-plugin .task-card--layout-inline .task-card__metadata::-webkit-scrollbar { height: 0; } .tasknotes-plugin .task-card--layout-inline .task-card__metadata:hover::-webkit-scrollbar { height: 4px; } .tasknotes-plugin .task-card--layout-inline .task-card__metadata::-webkit-scrollbar-track { background: transparent; } .tasknotes-plugin .task-card--layout-inline .task-card__metadata::-webkit-scrollbar-thumb { background: var(--background-modifier-border); border-radius: 2px; } /* Wrapper for metadata items in inline mode */ .tasknotes-plugin .task-card--layout-inline .task-card__metadata > * { display: inline; vertical-align: baseline; } .tasknotes-plugin .task-card--layout-inline .task-card__metadata > *:last-child { margin-right: 0; } /* Smaller status dot in inline mode */ .tasknotes-plugin .task-card--layout-inline .task-card__status-dot { display: inline-block; width: 0.85em; height: 0.85em; margin-right: 0.25em; border-width: 1.5px; vertical-align: baseline; transform: translateY(0.1em); } /* Smaller priority dot in inline mode */ .tasknotes-plugin .task-card--layout-inline .task-card__priority-dot { display: inline-block; width: 0.6em; height: 0.6em; margin: 0 0.25em 0 0; border-width: 1.5px; vertical-align: baseline; transform: translateY(0.05em); } /* Compact indicators in inline mode */ .tasknotes-plugin .task-card--layout-inline .task-card__recurring-indicator, .tasknotes-plugin .task-card--layout-inline .task-card__reminder-indicator { display: inline-block; position: static; width: 0.85em; height: 0.85em; margin-right: 0.15em; vertical-align: baseline; } /* Compact context menu in inline mode */ .tasknotes-plugin .task-card--layout-inline .task-card__context-menu { display: inline-block; width: 0.9em; height: 0.9em; padding: 0; vertical-align: baseline; } /* Compact date displays in inline mode */ .tasknotes-plugin .task-card--layout-inline .task-card__metadata-date { display: inline; font-size: var(--tn-font-size-sm); padding: 0; margin: 0 0.75em 0 0; vertical-align: baseline; } /* Metadata property in inline mode */ .tasknotes-plugin .task-card--layout-inline .task-card__metadata-property { display: inline; font-size: var(--tn-font-size-sm); padding: 0; margin: 0 0.75em 0 0; vertical-align: baseline; } .tasknotes-plugin .task-card--layout-inline .task-card__metadata-property--checklistProgress { display: inline-flex; align-items: center; gap: 4px; } .tasknotes-plugin .task-card--layout-inline .task-card__progress { display: inline-flex; align-items: center; gap: 4px; } .tasknotes-plugin .task-card--layout-inline .task-card__progress-bar { width: 42px; height: 4px; } /* Metadata pills in inline mode */ .tasknotes-plugin .task-card--layout-inline .task-card__metadata-pill { display: inline; margin: 0 0.75em 0 0; vertical-align: baseline; } /* Metadata separators in inline mode */ .tasknotes-plugin .task-card--layout-inline .task-card__metadata-separator { display: inline; vertical-align: baseline; } /* SVG icons in inline mode - ensure they don't affect line height */ .tasknotes-plugin .task-card--layout-inline svg { display: inline-block; width: 0.85em; height: 0.85em; vertical-align: baseline; transform: translateY(0.1em); } /* Hide subtask-related elements in inline mode */ .tasknotes-plugin .task-card--layout-inline .task-card__subtasks, .tasknotes-plugin .task-card--layout-inline .task-card__blocking { display: none; } /* Ensure inline cards don't have bottom margin */ .tasknotes-plugin .task-card--layout-inline:last-child { margin-bottom: 0; } /* ================================================================= COMPACT LAYOUT (for future use) ================================================================= */ /* Compact layout - smaller padding but still vertical */ .tasknotes-plugin .task-card--layout-compact { padding: var(--tn-spacing-xs) var(--tn-spacing-sm); } .tasknotes-plugin .task-card--layout-compact .task-card__main-row { gap: var(--tn-spacing-xs); } .tasknotes-plugin .task-card--layout-compact .task-card__title { font-size: var(--tn-font-size-sm); } .tasknotes-plugin .task-card--layout-compact .task-card__metadata { font-size: var(--tn-font-size-xs); gap: var(--tn-spacing-xs); } .tasknotes-plugin .task-card--layout-compact .task-card__status-dot { width: 14px; height: 14px; } .tasknotes-plugin .task-card--layout-compact .task-card__priority-dot { width: 8px; height: 8px; margin: 0 var(--tn-spacing-xs); } .tasknotes-plugin .task-card--layout-compact .task-card__badges { gap: 2px; } .tasknotes-plugin .task-card--layout-compact .task-card__recurring-indicator, .tasknotes-plugin .task-card--layout-compact .task-card__reminder-indicator, .tasknotes-plugin .task-card--layout-compact .task-card__project-indicator, .tasknotes-plugin .task-card--layout-compact .task-card__chevron, .tasknotes-plugin .task-card--layout-compact .task-card__blocking-toggle { width: 12px; height: 12px; } .tasknotes-plugin .task-card--layout-compact .task-card__context-menu { width: 12px; height: 12px; } /* ================================================================= SELECTION MODE STYLES ================================================================= */ /* Selected task card styling */ .tasknotes-plugin .task-card--selected { background-color: color-mix(in srgb, var(--interactive-accent) 15%, transparent); border-radius: var(--tn-radius-sm); } .tasknotes-plugin .task-card--selected:hover { background-color: color-mix(in srgb, var(--interactive-accent) 20%, transparent); } /* Primary selected task (first selected) gets a border */ .tasknotes-plugin .task-card--selected-primary { box-shadow: inset 0 0 0 2px var(--interactive-accent); } /* Selection indicator floating badge */ .tasknotes-plugin .tn-selection-indicator { position: fixed; bottom: 20px; right: 20px; background-color: var(--interactive-accent); color: var(--text-on-accent); padding: 8px 16px; border-radius: var(--tn-radius-md); font-size: var(--tn-font-size-sm); font-weight: 500; box-shadow: 0 4px 12px color-mix(in srgb, var(--tn-shadow-color, black) 20%, transparent); z-index: 100; display: none; animation: tn-selection-indicator-appear 0.2s ease-out; transition: background-color var(--tn-transition-fast); } .tasknotes-plugin .tn-selection-indicator:hover { background-color: var(--interactive-accent-hover); } @keyframes tn-selection-indicator-appear { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } /* Kanban card wrapper selection state */ .tasknotes-plugin .kanban-view__card-wrapper--selected { background-color: color-mix(in srgb, var(--interactive-accent) 15%, transparent); border-radius: var(--tn-radius-sm); } /* Primary selected kanban card wrapper gets a border */ .tasknotes-plugin .kanban-view__card-wrapper--selected-primary { box-shadow: inset 0 0 0 2px var(--interactive-accent); }