@tailwind base; @tailwind components; @tailwind utilities; @layer base { * { @apply border-border; text-rendering: optimizeLegibility; -webkit-tap-highlight-color: transparent; } html { @apply font-sans antialiased; --bc-color-brand: hsl(var(--primary)); --bc-color-brand-dark: hsl(var(--primary)); --bc-brand-mix: 100%; --bc-color-brand-button-text: hsl(var(--primary-foreground)); --bc-color-brand-button-text-dark: hsl(var(--primary-foreground)); } @media (min-width: 769px) { html, body, #root { height: 100%; } } /* Mobile: lock document scroll; feeds and note panels scroll inside .page-scroll-y regions. */ @media (max-width: 768px) { html, body { height: 100%; overflow: hidden; } #root { height: 100%; min-height: 0; overflow: hidden; } } input, textarea, button { -webkit-appearance: none; -moz-appearance: none; appearance: none; } body { @apply bg-background text-foreground; -webkit-overflow-scrolling: touch; text-size-adjust: 100%; -webkit-text-size-adjust: 100%; user-select: none; } /* Allow text selection in note content */ [data-note-content], .note-content, article, .markdown-content, .prose { user-select: text; -webkit-user-select: text; -moz-user-select: text; -ms-user-select: text; } .clickable { cursor: pointer; transition: background-color 0.2s ease; &:active { background-color: hsl(var(--muted) / 0.3); } } .tiptap p.is-editor-empty:first-child::before { color: hsl(var(--muted-foreground)); content: attr(data-placeholder); float: left; height: 0; pointer-events: none; } /* * TipTap / ProseMirror composer: without a color-emoji font in the stack (common on Linux + Firefox), * Unicode emoji pick a text-font glyph (thin/outline). Preview and published notes often look “correct” * because markdown/prose or system fonts resolve emoji differently. Append emoji-capable families last. */ .tiptap .ProseMirror { font-family: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji', 'Noto Emoji', sans-serif; } @media (max-width: 768px) { /* Mobile composer: fill the editor slot and scroll inside the bordered surface. */ .tiptap.flex-col { display: flex; flex-direction: column; flex: 1 1 0%; height: 100%; min-height: 0; } .tiptap.flex-col .ProseMirror { flex: 1 1 0%; height: 100%; min-height: 0; max-height: 100%; overflow-y: auto; overscroll-behavior-y: contain; -webkit-overflow-scrolling: touch; overflow-wrap: anywhere; } } .scrollbar-hide { -ms-overflow-style: none; /* Internet Explorer 10+ */ scrollbar-width: none; /* Firefox */ } .scrollbar-hide::-webkit-scrollbar { display: none; /* Safari and Chrome */ } /* * Primary/secondary pages, popovers, selects: visible vertical scrollbar (not overlay-only). * Pair with Tailwind overflow-y-scroll on the same element. */ .page-scroll-y, .popover-scroll-y { scrollbar-gutter: stable; scrollbar-width: thin; } .page-scroll-y::-webkit-scrollbar, .popover-scroll-y::-webkit-scrollbar { width: 10px; } .page-scroll-y::-webkit-scrollbar-thumb, .popover-scroll-y::-webkit-scrollbar-thumb { border-radius: 9999px; background-color: hsl(var(--muted-foreground) / 0.35); } .page-scroll-y::-webkit-scrollbar-thumb:hover, .popover-scroll-y::-webkit-scrollbar-thumb:hover { background-color: hsl(var(--muted-foreground) / 0.5); } .page-scroll-y::-webkit-scrollbar-track, .popover-scroll-y::-webkit-scrollbar-track { border-radius: 9999px; background-color: hsl(var(--muted) / 0.45); } /* Narrow viewports: stronger scroll affordance (feed + note panels use inner scroll). */ @media (max-width: 768px) { .page-scroll-y { -webkit-overflow-scrolling: touch; scrollbar-width: auto; } .page-scroll-y::-webkit-scrollbar { width: 12px; } .page-scroll-y::-webkit-scrollbar-thumb { background-color: hsl(var(--muted-foreground) / 0.55); } .page-scroll-y::-webkit-scrollbar-thumb:hover { background-color: hsl(var(--muted-foreground) / 0.7); } } /* * Radix Select injects a sibling