Files
kandev/apps/web/app/globals.css
T
2026-02-20 18:30:33 +00:00

1138 lines
28 KiB
CSS

@import "tailwindcss";
@import "tw-animate-css";
@import "shadcn/tailwind.css";
@import "@kandev/theme/fonts.css";
@import "dockview-react/dist/styles/dockview.css";
@import "./dockview-theme.css";
@source "../components/**/*.{js,ts,jsx,tsx}";
@source "../../packages/ui/src/**/*.{js,ts,jsx,tsx}";
@custom-variant dark (&:is(.dark *));
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-sans);
--font-mono: var(--font-geist-mono);
--color-sidebar-ring: var(--sidebar-ring);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar: var(--sidebar);
--color-chart-5: var(--chart-5);
--color-chart-4: var(--chart-4);
--color-chart-3: var(--chart-3);
--color-chart-2: var(--chart-2);
--color-chart-1: var(--chart-1);
--color-ring: var(--ring);
--color-input: var(--input);
--color-border: var(--border);
--color-destructive: var(--destructive);
--color-accent-foreground: var(--accent-foreground);
--color-accent: var(--accent);
--color-muted-foreground: var(--muted-foreground);
--color-muted: var(--muted);
--color-secondary-foreground: var(--secondary-foreground);
--color-secondary: var(--secondary);
--color-primary-foreground: var(--primary-foreground);
--color-primary: var(--primary);
--color-popover-foreground: var(--popover-foreground);
--color-popover: var(--popover);
--color-card-foreground: var(--card-foreground);
--color-card: var(--card);
--radius-sm: var(--radius);
--radius-md: var(--radius);
--radius-lg: var(--radius);
--radius-xl: var(--radius);
--radius-2xl: var(--radius);
--radius-3xl: var(--radius);
--radius-4xl: var(--radius);
}
:root {
--font-geist-sans: "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
--font-sans: "Figtree", "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
--font-geist-mono:
"Geist Mono", ui-monospace, "SFMono-Regular", Menlo, Monaco, Consolas, "Liberation Mono",
"Courier New", monospace;
--background: oklch(1 0 0);
--foreground: oklch(0.145 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0.145 0 0);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0 0);
--primary: oklch(0.51 0.23 277);
--primary-foreground: oklch(0.96 0.02 272);
--secondary: oklch(0.967 0.001 286.375);
--secondary-foreground: oklch(0.21 0.006 285.885);
--muted: oklch(0.97 0 0);
--muted-foreground: oklch(0.556 0 0);
--accent: oklch(0.68 0.18 276);
--accent-foreground: oklch(0.98 0 0);
--destructive: oklch(0.58 0.22 27);
--border: oklch(0.922 0 0);
--input: oklch(0.922 0 0);
--ring: oklch(0.708 0 0);
--chart-1: oklch(0.79 0.1 275);
--chart-2: oklch(0.68 0.16 277);
--chart-3: oklch(0.59 0.2 277);
--chart-4: oklch(0.51 0.23 277);
--chart-5: oklch(0.46 0.21 277);
--radius: 0.375rem;
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.145 0 0);
--sidebar-primary: oklch(0.51 0.23 277);
--sidebar-primary-foreground: oklch(0.96 0.02 272);
--sidebar-accent: oklch(0.97 0 0);
--sidebar-accent-foreground: oklch(0.205 0 0);
--sidebar-border: oklch(0.922 0 0);
--scrollbar-thumb: oklch(0.78 0 0);
--scrollbar-thumb-hover: oklch(0.66 0 0);
--scrollbar-track: var(--background);
--sidebar-ring: oklch(0.708 0 0);
/* Git diff colors - centralized for easy maintenance */
--git-addition: 16 185 129; /* emerald-500 */
--git-deletion: 244 63 94; /* rose-500 */
}
.dark {
/* Grey scale: #181818 bg → #1F1F1F card → #2a2a2a borders → #333 hover */
--background: #181818;
--foreground: #d4d4d4;
--card: #1F1F1F;
--card-foreground: #d4d4d4;
--popover: #222222;
--popover-foreground: #d4d4d4;
--primary: oklch(0.59 0.2 277);
--primary-foreground: oklch(0.96 0.02 272);
--secondary: #2a2a2a;
--secondary-foreground: #d4d4d4;
--muted: #2a2a2a;
--muted-foreground: #888888;
--accent: oklch(0.62 0.18 276);
--accent-foreground: #d4d4d4;
--destructive: oklch(0.704 0.191 22.216);
--border: #2a2a2a;
--input: #2a2a2a;
--ring: #555555;
--chart-1: oklch(0.79 0.1 275);
--chart-2: oklch(0.68 0.16 277);
--chart-3: oklch(0.59 0.2 277);
--chart-4: oklch(0.51 0.23 277);
--chart-5: oklch(0.46 0.21 277);
--sidebar: #171717;
--sidebar-foreground: #d4d4d4;
--sidebar-primary: oklch(0.68 0.16 277);
--sidebar-primary-foreground: oklch(0.96 0.02 272);
--sidebar-accent: #2a2a2a;
--sidebar-accent-foreground: #d4d4d4;
--sidebar-border: #262626;
--scrollbar-thumb: rgba(100, 100, 100, 0.5);
--scrollbar-thumb-hover: rgba(130, 130, 130, 0.6);
--scrollbar-track: var(--background);
--sidebar-ring: #555555;
/* Git diff colors - same as light mode for consistency */
--git-addition: 16 185 129; /* emerald-500 */
--git-deletion: 244 63 94; /* rose-500 */
}
@layer base {
* {
@apply border-border outline-ring/50;
scrollbar-width: thin;
scrollbar-color: var(--scrollbar-thumb) transparent;
}
body {
@apply bg-background text-foreground;
}
}
*::-webkit-scrollbar {
width: 10px;
height: 10px;
}
*::-webkit-scrollbar-track {
background: var(--scrollbar-track);
border-radius: 999px;
}
*::-webkit-scrollbar-thumb {
background: var(--scrollbar-thumb);
border-radius: 999px;
border: 2px solid transparent;
background-clip: padding-box;
}
*::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-thumb-hover);
background-clip: padding-box;
}
/* xterm.js scrollbar styling */
.xterm .xterm-scrollable-element > .scrollbar {
width: 10px !important;
right: 0 !important;
background: transparent !important;
}
.xterm .xterm-scrollable-element > .scrollbar > .slider {
background: var(--scrollbar-thumb) !important;
border-radius: 999px !important;
width: 6px !important;
left: 2px !important;
}
.xterm .xterm-scrollable-element > .scrollbar:hover > .slider {
background: var(--scrollbar-thumb-hover) !important;
}
@layer utilities {
.overflow-wrap-anywhere {
overflow-wrap: anywhere;
}
.kanban-task-pulse {
animation: kanban-task-pulse 5s ease-in-out infinite;
}
.scrollbar-hide {
-ms-overflow-style: none;
scrollbar-width: none;
}
.scrollbar-hide::-webkit-scrollbar {
display: none;
}
/* Thin scrollbar for menus */
.scrollbar-thin {
scrollbar-width: thin;
scrollbar-color: var(--scrollbar-thumb) transparent;
}
.scrollbar-thin::-webkit-scrollbar {
width: 8px;
}
.scrollbar-thin::-webkit-scrollbar-track {
background: transparent !important;
}
.scrollbar-thin::-webkit-scrollbar-thumb {
background: var(--scrollbar-thumb);
border-radius: 4px;
}
.scrollbar-thin::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-thumb-hover);
}
/* Safe area padding for iPhone notch and home indicator */
.pb-safe {
padding-bottom: env(safe-area-inset-bottom, 0px);
}
.pt-safe {
padding-top: env(safe-area-inset-top, 0px);
}
.pl-safe {
padding-left: env(safe-area-inset-left, 0px);
}
.pr-safe {
padding-right: env(safe-area-inset-right, 0px);
}
/* Safe area height for spacer elements */
.h-safe {
height: env(safe-area-inset-bottom, 0px);
}
}
/* Grid Spinner - 3x3 cube animation */
@keyframes spinner-grid {
0%,
70%,
100% {
transform: scale3d(0.5, 0.5, 1);
}
35% {
transform: scale3d(0, 0, 1);
}
}
.spinner-grid {
display: inline-grid;
grid-template-columns: repeat(3, 1fr);
gap: 0.15em;
width: 1em;
height: 1em;
}
.spinner-grid-cube {
width: 100%;
height: 100%;
background-color: currentColor;
animation: spinner-grid 1.3s ease-in-out infinite;
}
.spinner-grid-cube:nth-child(1) {
animation-delay: 0.2s;
}
.spinner-grid-cube:nth-child(2) {
animation-delay: 0.3s;
}
.spinner-grid-cube:nth-child(3) {
animation-delay: 0.4s;
}
.spinner-grid-cube:nth-child(4) {
animation-delay: 0.1s;
}
.spinner-grid-cube:nth-child(5) {
animation-delay: 0.2s;
}
.spinner-grid-cube:nth-child(6) {
animation-delay: 0.3s;
}
.spinner-grid-cube:nth-child(7) {
animation-delay: 0s;
}
.spinner-grid-cube:nth-child(8) {
animation-delay: 0.1s;
}
.spinner-grid-cube:nth-child(9) {
animation-delay: 0.2s;
}
@keyframes kanban-task-pulse {
0%,
100% {
box-shadow: 0 0 0 0 rgba(79, 70, 229, 0.12);
}
50% {
box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.22);
}
}
@keyframes border-flash-glow {
0%,
100% {
box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--primary) 20%, transparent);
}
50% {
box-shadow: inset 0 0 0 1px color-mix(in oklab, var(--primary) 60%, transparent);
}
}
@keyframes shimmer {
0% {
transform: translateX(-100%);
}
100% {
transform: translateX(100%);
}
}
@keyframes shimmer-vertical {
0% {
transform: translateY(-100%);
}
100% {
transform: translateY(100%);
}
}
.animate-shimmer {
animation: shimmer 1.5s ease-in-out infinite;
}
.animate-shimmer-vertical {
animation: shimmer-vertical 1.5s ease-in-out infinite;
}
@keyframes chat-input-running {
0%,
100% {
border-color: color-mix(in oklab, var(--primary) 40%, var(--border));
box-shadow:
0 0 6px 1px color-mix(in oklab, var(--primary) 12%, transparent),
0 0 15px 3px color-mix(in oklab, var(--primary) 6%, transparent);
}
50% {
border-color: color-mix(in oklab, var(--primary) 70%, var(--border));
box-shadow:
0 0 20px 4px color-mix(in oklab, var(--primary) 20%, transparent),
0 0 50px 8px color-mix(in oklab, var(--primary) 10%, transparent);
}
}
.chat-input-running {
animation: chat-input-running 3s ease-in-out infinite;
}
@layer components {
.border-flash-animation {
position: relative;
}
.border-flash-animation::after {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
pointer-events: none;
z-index: 10;
animation: border-flash-glow 3s ease-in-out infinite;
}
}
.cm-tooltip {
border: 1px solid var(--border) !important;
background: var(--popover, oklch(0.205 0 0)) !important;
color: var(--popover-foreground, oklch(0.985 0 0)) !important;
border-radius: calc(var(--radius) + 2px);
box-shadow: 0 12px 32px rgba(0, 0, 0, 0.25);
padding: 8px;
}
.cm-tooltip-autocomplete {
padding: 0;
background: var(--popover, oklch(0.205 0 0)) !important;
}
.cm-tooltip-autocomplete ul {
list-style: none;
margin: 0;
padding: 12px;
max-height: 240px;
overflow: auto;
}
.cm-tooltip-autocomplete li {
display: flex;
align-items: center;
gap: 8px;
padding: 10px 12px;
border-radius: 6px;
cursor: pointer;
font-size: 0.875rem;
color: var(--popover-foreground, oklch(0.985 0 0));
}
.cm-tooltip-autocomplete li[aria-selected="true"] {
background: color-mix(in oklab, var(--primary) 20%, var(--popover)) !important;
color: var(--primary-foreground) !important;
border-radius: 0;
}
.cm-tooltip-autocomplete li[aria-selected="true"]:first-child {
border-top-left-radius: 6px;
border-top-right-radius: 6px;
}
.cm-tooltip-autocomplete li[aria-selected="true"]:last-child {
border-bottom-left-radius: 6px;
border-bottom-right-radius: 6px;
}
.cm-completionLabel {
font-weight: 500;
}
.cm-completionDetail {
margin-left: auto;
font-size: 0.875rem;
color: var(--muted-foreground) !important;
}
.cm-completionMatchedText {
text-decoration: none;
color: var(--primary) !important;
}
.cm-tooltip-autocomplete li[aria-selected="true"] .cm-completionMatchedText {
color: var(--primary-foreground);
}
.cm-completionIcon {
opacity: 0.65;
}
.cm-completionIcon {
width: 14px;
height: 14px;
display: inline-block;
margin-right: 6px;
color: var(--muted-foreground);
background-color: currentColor;
mask-size: contain;
mask-repeat: no-repeat;
mask-position: center;
-webkit-mask-size: contain;
-webkit-mask-repeat: no-repeat;
-webkit-mask-position: center;
}
.cm-completionIcon-slash {
mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M7 9a2 2 0 1 1 2 -2v10a2 2 0 1 1 -2 -2h10a2 2 0 1 1 -2 2v-10a2 2 0 1 1 2 2h-10'/></svg>");
-webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M7 9a2 2 0 1 1 2 -2v10a2 2 0 1 1 -2 -2h10a2 2 0 1 1 -2 2v-10a2 2 0 1 1 2 2h-10'/></svg>");
}
.cm-completionIcon-mention {
mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M8 12a4 4 0 1 0 8 0a4 4 0 1 0 -8 0'/><path d='M16 12v1.5a2.5 2.5 0 0 0 5 0v-1.5a9 9 0 1 0 -5.5 8.28'/></svg>");
-webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M8 12a4 4 0 1 0 8 0a4 4 0 1 0 -8 0'/><path d='M16 12v1.5a2.5 2.5 0 0 0 5 0v-1.5a9 9 0 1 0 -5.5 8.28'/></svg>");
}
.cm-completionIcon-prompt {
display: none !important;
width: 0 !important;
margin-right: 0 !important;
background: none !important;
}
.cm-tooltip-autocomplete li[aria-selected="true"] .cm-completionIcon {
color: var(--primary-foreground);
}
.task-chat-editor .cm-placeholder {
color: var(--muted-foreground) !important;
}
.task-chat-editor .cm-editor {
background: transparent !important;
box-shadow: none !important;
outline: none !important;
}
.task-chat-editor .cm-editor.cm-focused {
outline: none !important;
}
.task-chat-editor .cm-scroller,
.task-chat-editor .cm-content,
.task-chat-editor .cm-line,
.task-chat-editor .cm-line span {
background: transparent !important;
background-color: transparent !important;
color: var(--foreground) !important;
}
.task-chat-editor .cm-cursor {
border-left-color: var(--foreground);
}
.task-chat-editor .cm-selectionBackground {
background: color-mix(in oklab, var(--primary) 25%, var(--background)) !important;
}
.task-chat-editor .cm-content ::selection {
background: color-mix(in oklab, var(--primary) 30%, var(--background));
}
/* Legacy Milkdown styles removed - plan editor now uses TipTap */
/* TipTap editor styles */
.tiptap p.is-editor-empty:first-child::before {
content: attr(data-placeholder);
float: left;
color: var(--muted-foreground);
pointer-events: none;
height: 0;
}
.tiptap p {
margin: 0;
}
/* Inline code */
.tiptap code {
background-color: var(--muted);
border-radius: 0.25rem;
padding: 0.125rem 0.25rem;
font-size: 0.75rem;
font-family: var(--font-mono, ui-monospace, monospace);
}
/* Code blocks */
.tiptap pre {
background-color: color-mix(in oklch, var(--card) 80%, black 20%);
border: 1px solid var(--border);
border-radius: 0.375rem;
padding: 0.5rem 0.75rem;
margin: 0.25rem 0;
overflow-x: auto;
position: relative;
}
.tiptap pre code {
background: none;
padding: 0;
border-radius: 0;
font-size: 0.75rem;
line-height: 1.4;
font-family: var(--font-mono, ui-monospace, monospace);
}
/* Language selector on code blocks */
.tiptap pre .code-block-language {
position: absolute;
top: 0.25rem;
right: 0.25rem;
font-size: 0.625rem;
font-family: var(--font-sans, ui-sans-serif, sans-serif);
color: var(--muted-foreground);
background: var(--muted);
border: 1px solid var(--border);
border-radius: 0.25rem;
padding: 0.0625rem 0.25rem;
cursor: pointer;
outline: none;
opacity: 0;
transition: opacity 0.15s;
}
.tiptap pre:hover .code-block-language,
.tiptap pre:focus-within .code-block-language {
opacity: 1;
}
/* Lowlight / highlight.js syntax colors */
.tiptap pre code .hljs-comment,
.tiptap pre code .hljs-quote {
color: var(--muted-foreground);
font-style: italic;
}
.tiptap pre code .hljs-keyword,
.tiptap pre code .hljs-selector-tag,
.tiptap pre code .hljs-built_in {
color: oklch(0.65 0.2 300);
}
.tiptap pre code .hljs-string,
.tiptap pre code .hljs-attr,
.tiptap pre code .hljs-addition {
color: oklch(0.7 0.15 150);
}
.tiptap pre code .hljs-number,
.tiptap pre code .hljs-literal {
color: oklch(0.7 0.15 60);
}
.tiptap pre code .hljs-title,
.tiptap pre code .hljs-section,
.tiptap pre code .hljs-type {
color: oklch(0.75 0.15 80);
}
.tiptap pre code .hljs-name,
.tiptap pre code .hljs-tag {
color: oklch(0.65 0.2 20);
}
.tiptap pre code .hljs-variable,
.tiptap pre code .hljs-template-variable {
color: oklch(0.65 0.2 20);
}
.tiptap pre code .hljs-regexp,
.tiptap pre code .hljs-link {
color: oklch(0.7 0.15 30);
}
.tiptap pre code .hljs-symbol,
.tiptap pre code .hljs-bullet {
color: oklch(0.65 0.2 330);
}
.tiptap pre code .hljs-meta {
color: var(--muted-foreground);
}
.tiptap pre code .hljs-deletion {
color: oklch(0.65 0.2 20);
}
.tiptap pre code .hljs-emphasis {
font-style: italic;
}
.tiptap pre code .hljs-strong {
font-weight: bold;
}
/* Monaco Editor - Comment decorations */
.monaco-comment-line {
background-color: rgba(99, 102, 241, 0.12) !important;
}
/* Lines-decoration lane for commented lines — clickable bar */
.monaco-comment-bar {
cursor: pointer !important;
background-color: rgba(99, 102, 241, 0.12) !important;
border-left: 3px solid rgba(99, 102, 241, 0.6) !important;
}
.monaco-comment-bar:hover {
background-color: rgba(99, 102, 241, 0.25) !important;
}
/* Chat bubble icon on the bar (first line of a comment only) */
.monaco-comment-bar-icon {
cursor: pointer !important;
position: relative !important;
background-color: rgba(99, 102, 241, 0.12) !important;
border-left: 3px solid rgba(99, 102, 241, 0.6) !important;
}
.monaco-comment-bar-icon:hover {
background-color: rgba(99, 102, 241, 0.25) !important;
}
.monaco-comment-bar-icon::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 12px;
height: 12px;
background: rgba(99, 102, 241, 0.9);
mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'/></svg>");
-webkit-mask-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><path d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'/></svg>");
mask-size: contain;
-webkit-mask-size: contain;
}
/* Line number bg tint for commented lines */
.monaco-comment-line-number {
background-color: rgba(99, 102, 241, 0.12) !important;
}
/* TipTap Plan Editor Styles */
.tiptap-plan-wrapper {
height: 100%;
overflow: auto;
border-radius: 0;
}
.tiptap-plan-wrapper:not(.dark) {
background: #ffffff;
}
.tiptap-plan-wrapper .tiptap {
height: 100%;
padding: 0.75rem;
outline: none;
cursor: text;
}
.tiptap-plan-wrapper .tiptap:focus {
outline: none;
}
/* Base text styling */
.tiptap-plan-wrapper .tiptap,
.tiptap-plan-wrapper .tiptap *:not(.mermaid-container):not(.mermaid-container *) {
font-size: 0.75rem !important;
line-height: 1.625;
color: var(--foreground);
}
/* Headings */
.tiptap-plan-wrapper .tiptap h1,
.tiptap-plan-wrapper .tiptap h2,
.tiptap-plan-wrapper .tiptap h3,
.tiptap-plan-wrapper .tiptap h4 {
font-weight: 700 !important;
color: var(--foreground) !important;
margin-top: 0.5rem !important;
margin-bottom: 0.25rem !important;
line-height: 1.3 !important;
}
.tiptap-plan-wrapper .tiptap h1:not(.mermaid-container):not(.mermaid-container *) {
font-size: 1.125rem !important;
}
.tiptap-plan-wrapper .tiptap h2:not(.mermaid-container):not(.mermaid-container *) {
font-size: 0.9375rem !important;
}
.tiptap-plan-wrapper .tiptap h3:not(.mermaid-container):not(.mermaid-container *) {
font-size: 0.8125rem !important;
}
/* Paragraphs */
.tiptap-plan-wrapper .tiptap p {
margin-top: 0.5rem !important;
margin-bottom: 0.5rem !important;
line-height: 1.625 !important;
font-size: 0.75rem !important;
}
/* Lists */
.tiptap-plan-wrapper .tiptap ul {
list-style-type: disc !important;
padding-left: 1.25rem !important;
margin-top: 0.375rem !important;
margin-bottom: 0.375rem !important;
}
.tiptap-plan-wrapper .tiptap ol {
list-style-type: decimal !important;
padding-left: 1.25rem !important;
margin-top: 0.375rem !important;
margin-bottom: 0.375rem !important;
}
.tiptap-plan-wrapper .tiptap li {
margin-top: 0.125rem !important;
margin-bottom: 0.125rem !important;
}
/* Task lists */
.tiptap-plan-wrapper .tiptap ul[data-type="taskList"] {
list-style: none !important;
padding-left: 0 !important;
}
.tiptap-plan-wrapper .tiptap ul[data-type="taskList"] li {
display: flex;
align-items: flex-start;
gap: 0.5rem;
}
.tiptap-plan-wrapper .tiptap ul[data-type="taskList"] li label {
margin-top: 0.125rem;
}
/* Inline code */
.tiptap-plan-wrapper .tiptap code {
background: rgb(59 130 246 / 0.2) !important;
color: rgb(96 165 250) !important;
padding: 0.125rem 0.375rem !important;
border-radius: 0.25rem !important;
font-size: 0.675rem !important;
font-family: var(--font-mono) !important;
}
/* Code blocks */
.tiptap-plan-wrapper .tiptap pre {
background: var(--background) !important;
padding: 0.5rem 0.75rem !important;
border-radius: 0.375rem !important;
overflow-x: auto !important;
margin-top: 0.5rem !important;
margin-bottom: 0.5rem !important;
}
.tiptap-plan-wrapper:not(.dark) .tiptap pre {
background: #f5f5f5 !important;
}
.tiptap-plan-wrapper .tiptap pre code {
background: transparent !important;
color: #d4d4d4 !important;
padding: 0 !important;
font-size: 0.625rem !important;
font-family: var(--font-mono) !important;
}
.tiptap-plan-wrapper:not(.dark) .tiptap pre code {
color: #1e1e1e !important;
}
/* Blockquote */
.tiptap-plan-wrapper .tiptap blockquote {
border-left: 3px solid var(--primary) !important;
padding-left: 0.75rem !important;
margin-left: 0 !important;
margin-top: 0.5rem !important;
margin-bottom: 0.5rem !important;
color: var(--muted-foreground) !important;
font-style: italic !important;
}
/* Links */
.tiptap-plan-wrapper .tiptap a {
color: var(--primary) !important;
text-decoration: underline !important;
text-underline-offset: 2px !important;
}
/* Horizontal rule */
.tiptap-plan-wrapper .tiptap hr {
border: none !important;
border-top: 1px solid var(--border) !important;
margin: 1rem 0 !important;
}
/* Tables */
.tiptap-plan-wrapper .tiptap table {
border-collapse: collapse;
width: 100%;
margin: 0.5rem 0;
}
.tiptap-plan-wrapper .tiptap th,
.tiptap-plan-wrapper .tiptap td {
border: 1px solid var(--border);
padding: 0.25rem 0.5rem;
font-size: 0.75rem;
}
.tiptap-plan-wrapper .tiptap th {
background: var(--muted);
font-weight: 600;
}
/* Highlight marks */
.tiptap-plan-wrapper mark {
background-color: rgba(255, 212, 0, 0.3);
border-radius: 2px;
padding: 1px 0;
}
/* Comment highlights — inline mark spans (like Highlight extension) */
.tiptap-plan-wrapper .comment-highlight {
background-color: color-mix(in oklch, var(--accent) 70%, transparent);
border-radius: 3px;
border-bottom: 2px solid color-mix(in oklch, var(--accent-foreground) 25%, transparent);
cursor: pointer;
transition: background-color 0.15s ease;
padding: 2px 1px;
box-decoration-break: clone;
-webkit-box-decoration-break: clone;
}
.tiptap-plan-wrapper .comment-highlight:hover {
background-color: color-mix(in oklch, var(--accent) 90%, transparent);
}
/* Comment badge — single widget decoration at end of mark range */
.tiptap-plan-wrapper .comment-badge {
position: relative;
display: inline-block;
width: 0;
height: 0;
overflow: visible;
vertical-align: top;
}
.tiptap-plan-wrapper .comment-badge svg {
position: absolute;
top: -6px;
left: 2px;
width: 11px;
height: 11px;
color: rgba(99, 102, 241, 0.8);
cursor: pointer;
transition: color 0.15s ease;
pointer-events: auto;
}
.tiptap-plan-wrapper .comment-badge:hover svg {
color: rgba(99, 102, 241, 1);
}
/* Drag handle */
.plan-drag-handle {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
margin-left: 4px;
border-radius: 4px;
color: var(--muted-foreground);
opacity: 0;
cursor: grab;
transition:
opacity 0.15s,
background-color 0.15s;
}
.plan-drag-handle:hover {
background-color: var(--muted);
opacity: 1 !important;
}
.tiptap-plan-wrapper:hover .plan-drag-handle {
opacity: 0.5;
}
.plan-drag-handle:active {
cursor: grabbing;
}
/* Mermaid diagram styles */
.tiptap-plan-wrapper .mermaid-container {
margin: 0.75rem 0 !important;
padding: 0.5rem !important;
overflow-x: auto !important;
}
.tiptap-plan-wrapper .mermaid-container svg {
max-width: 100% !important;
height: auto !important;
}
.tiptap-plan-wrapper .mermaid-error {
color: #ef4444 !important;
font-size: 0.75rem !important;
padding: 0.5rem !important;
white-space: pre-wrap !important;
}
/* Placeholder for empty plan editor */
.tiptap-plan-wrapper .tiptap p.is-editor-empty:first-child::before {
content: attr(data-placeholder);
float: left;
color: var(--muted-foreground);
opacity: 0.5;
pointer-events: none;
height: 0;
font-size: 0.75rem;
}
/* Monaco Editor - Diff gutter indicators (colors from --git-addition / --git-deletion CSS vars) */
.monaco-diff-added-gutter {
width: 3px !important;
margin-left: 3px;
background-color: rgb(var(--git-addition)) !important;
}
.monaco-diff-modified-gutter {
width: 3px !important;
margin-left: 3px;
background-color: rgb(var(--git-addition)) !important;
}
.monaco-diff-deleted-gutter {
width: 0 !important;
margin-left: 2px;
border-left: 4px solid rgb(var(--git-deletion)) !important;
}
/* Monaco Editor - Gutter comment hint ("+" hover on decoration lane) */
.monaco-gutter-comment-hint {
cursor: pointer !important;
position: relative !important;
}
.monaco-gutter-comment-hint::after {
content: "+";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: flex;
align-items: center;
justify-content: center;
width: 14px;
height: 14px;
font-size: 11px;
font-weight: 700;
line-height: 1;
color: #fff;
border-radius: 3px;
background-color: rgb(99 102 241); /* indigo-500 */
}
/* Monaco Editor - Gutter line selection highlight */
.monaco-gutter-selected-line {
background-color: rgb(139 92 246 / 0.15) !important;
}
.monaco-gutter-selected-deco {
background-color: rgb(139 92 246 / 0.15) !important;
}
/* Monaco Editor - Peek view / references widget overrides */
.monaco-editor .peekview-widget .head {
box-sizing: border-box;
}
.monaco-editor .peekview-widget .head .peekview-title .filename {
font-size: 12px;
font-weight: 500;
}
.monaco-editor .peekview-widget .head .peekview-title .dirname {
font-size: 11px;
}
/* Match references list font size to editor font size (12px) */
.monaco-editor .reference-zone-widget .ref-tree .monaco-list-row {
font-size: 12px !important;
height: 20px !important;
line-height: 20px !important;
}
.monaco-editor .reference-zone-widget .ref-tree .reference-file {
font-size: 12px !important;
height: 22px !important;
line-height: 22px !important;
}
.monaco-editor .reference-zone-widget .ref-tree .monaco-tl-contents {
padding-left: 4px;
}
.monaco-editor .reference-zone-widget .ref-tree .reference-file .count {
font-size: 10px;
line-height: 14px;
padding: 0 5px;
border-radius: 8px;
}
/* Pipeline node rotating border for running tasks */
@property --border-angle {
syntax: "<angle>";
initial-value: 0deg;
inherits: false;
}
@keyframes node-border-rotate {
to {
--border-angle: 360deg;
}
}
.node-border-running {
position: relative;
}
.node-border-running::after {
content: "";
position: absolute;
inset: -1px;
border-radius: inherit;
padding: 1.5px;
background: conic-gradient(
from var(--border-angle),
hsl(var(--muted-foreground) / 0.4) 0%,
transparent 12%,
transparent 38%,
hsl(var(--muted-foreground) / 0.4) 50%,
transparent 62%,
transparent 88%,
hsl(var(--muted-foreground) / 0.4) 100%
);
-webkit-mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
mask:
linear-gradient(#fff 0 0) content-box,
linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
animation: node-border-rotate 3s linear infinite;
pointer-events: none;
}
.debug {
border: 1px solid red !important;
}