@tailwind base; @tailwind components; @tailwind utilities; .form-label { @apply block text-sm text-soft mb-1; } .form-input { @apply w-full bg-deep border border-nova-500/30 rounded-lg px-4 py-2 text-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-accent; } .form-textarea { @apply w-full bg-deep border border-nova-500/30 rounded-lg px-4 py-2 text-white resize-none focus:outline-none focus:ring-2 focus:ring-accent; } .form-file { @apply w-full text-sm text-soft file:bg-panel file:border-0 file:px-4 file:py-2 file:rounded-lg file:text-white hover:file:bg-nova-600/40; } .btn-primary { @apply bg-accent text-deep px-6 py-2 rounded-lg font-medium hover:brightness-110 transition; } .btn-secondary { @apply bg-nova-500/30 text-white px-5 py-2 rounded-lg hover:bg-nova-500/50 transition; } @layer components { /* Ensure plain inputs, textareas and selects match the dark form styles so we don't end up with white backgrounds + white text. */ input, input[type="text"], input[type="email"], input[type="password"], textarea, select { @apply bg-deep text-white border border-nova-500/30 rounded-lg px-4 py-2 placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-accent; } /* Keep file inputs styled separately (file controls use .form-file class). This prevents the native file button from inheriting the same padding. */ input[type="file"] { @apply bg-transparent text-soft p-0; } .auth-card { max-width: 720px; margin-left: auto; margin-right: auto; } .auth-card h1 { font-size: 1.25rem; line-height: 1.2; } .auth-card p { color: rgba(203,213,225,0.9); } } @layer base { *,:before,:after { box-sizing: border-box; border: 0 solid transparent; } h1, h2, h3, h4, h5, h6 { color: #ffffff; margin-top: 1rem; margin-bottom: 0.5rem; } h1 { font-size: 2.25rem; line-height: 1.05; font-weight: 800; letter-spacing: -0.02em; } h2 { font-size: 1.5rem; line-height: 1.15; font-weight: 700; letter-spacing: -0.01em; } h3 { font-size: 1.125rem; line-height: 1.2; font-weight: 600; } h4 { font-size: 1rem; line-height: 1.25; font-weight: 600; } h5 { font-size: 0.95rem; line-height: 1.25; font-weight: 600; } h6 { font-size: 0.85rem; line-height: 1.3; font-weight: 600; text-transform: uppercase; opacity: 0.85; } .prose h1 { font-size: 2.25rem; } .prose h2 { font-size: 1.5rem; } .prose h3 { font-size: 1.125rem; } .prose h4, .prose h5, .prose h6 { font-weight: 600; } [x-cloak] { display: none !important; } } @layer utilities { .nova-card-enter { opacity: 0; transform: translateY(10px) scale(0.995); } .nova-card-enter.nova-card-enter-active { transition: transform 380ms cubic-bezier(.2,.9,.2,1), opacity 380ms ease-out; opacity: 1; transform: none; } .nova-scrollbar { scrollbar-width: thin; scrollbar-color: rgba(255,255,255,0.14) transparent; } .nova-scrollbar::-webkit-scrollbar { width: 4px; height: 4px; } .nova-scrollbar::-webkit-scrollbar-track { background: transparent; } .nova-scrollbar::-webkit-scrollbar-thumb { background-color: rgba(255,255,255,0.14); border-radius: 999px; } .nova-scrollbar::-webkit-scrollbar-thumb:hover { background-color: rgba(255,255,255,0.28); } .nova-scrollbar::-webkit-scrollbar-corner { background: transparent; } .nova-scrollbar-message { scrollbar-width: thin; scrollbar-color: rgba(56, 189, 248, 0.55) rgba(255,255,255,0.03); } .nova-scrollbar-message::-webkit-scrollbar { width: 10px; height: 10px; } .nova-scrollbar-message::-webkit-scrollbar-track { border-radius: 999px; background: linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01)), rgba(7, 11, 18, 0.72); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.03); } .nova-scrollbar-message::-webkit-scrollbar-thumb { border: 2px solid rgba(7, 11, 18, 0.72); border-radius: 999px; background: linear-gradient(180deg, rgba(125, 211, 252, 0.9), rgba(14, 165, 233, 0.78) 55%, rgba(217, 70, 239, 0.68)); box-shadow: 0 0 0 1px rgba(125, 211, 252, 0.18), 0 6px 18px rgba(14, 165, 233, 0.22); } .nova-scrollbar-message::-webkit-scrollbar-thumb:hover { background: linear-gradient(180deg, rgba(186, 230, 253, 0.98), rgba(56, 189, 248, 0.9) 50%, rgba(232, 121, 249, 0.78)); box-shadow: 0 0 0 1px rgba(186, 230, 253, 0.24), 0 10px 24px rgba(56, 189, 248, 0.28); } .nova-scrollbar-message::-webkit-scrollbar-corner { background: transparent; } .messages-page, .messages-page * { scrollbar-width: thin; scrollbar-color: rgba(56, 189, 248, 0.55) rgba(255,255,255,0.03); } .messages-page::-webkit-scrollbar, .messages-page *::-webkit-scrollbar { width: 10px; height: 10px; } .messages-page::-webkit-scrollbar-track, .messages-page *::-webkit-scrollbar-track { border-radius: 999px; background: linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01)), rgba(7, 11, 18, 0.72); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.03); } .messages-page::-webkit-scrollbar-thumb, .messages-page *::-webkit-scrollbar-thumb { border: 2px solid rgba(7, 11, 18, 0.72); border-radius: 999px; background: linear-gradient(180deg, rgba(125, 211, 252, 0.9), rgba(14, 165, 233, 0.78) 55%, rgba(217, 70, 239, 0.68)); box-shadow: 0 0 0 1px rgba(125, 211, 252, 0.18), 0 6px 18px rgba(14, 165, 233, 0.22); } .messages-page::-webkit-scrollbar-thumb:hover, .messages-page *::-webkit-scrollbar-thumb:hover { background: linear-gradient(180deg, rgba(186, 230, 253, 0.98), rgba(56, 189, 248, 0.9) 50%, rgba(232, 121, 249, 0.78)); box-shadow: 0 0 0 1px rgba(186, 230, 253, 0.24), 0 10px 24px rgba(56, 189, 248, 0.28); } .messages-page::-webkit-scrollbar-corner, .messages-page *::-webkit-scrollbar-corner { background: transparent; } /* Gallery page helpers */ .nb-hero-fade { background: linear-gradient(180deg, rgba(17,24,39,0) 0%, rgba(7,10,15,0.9) 60%, rgba(7,10,15,1) 100%); } .nb-hero-gradient { background: linear-gradient(135deg, rgba(224,122,33,0.08) 0%, rgba(15,23,36,0) 50%, rgba(21,36,58,0.4) 100%); animation: nb-hero-shimmer 8s ease-in-out infinite alternate; } .gallery-rank-tab { -webkit-tap-highlight-color: transparent; } .gallery-rank-tab .nb-tab-indicator { transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1), background-color 200ms ease; } .nb-scrollbar-none { -ms-overflow-style: none; scrollbar-width: none; } .nb-scrollbar-none::-webkit-scrollbar { display: none; } [data-react-masonry-gallery] { animation: nb-gallery-fade-in 300ms ease-out both; } .nb-filter-choice { display: inline-flex; cursor: pointer; } .nb-filter-choice--block { display: flex; width: 100%; } .nb-filter-choice-label { display: inline-flex; align-items: center; padding: 0.375rem 0.875rem; border-radius: 9999px; border: 1px solid rgba(255,255,255,0.1); background: rgba(255,255,255,0.05); color: rgba(214,224,238,0.8); font-size: 0.8125rem; font-weight: 500; transition: background 150ms ease, color 150ms ease, border-color 150ms ease; white-space: nowrap; } .nb-filter-choice--block .nb-filter-choice-label { border-radius: 0.6rem; width: 100%; } .nb-filter-choice input:checked ~ .nb-filter-choice-label { background: #E07A21; border-color: #E07A21; color: #fff; box-shadow: 0 1px 8px rgba(224,122,33,0.35); } .nb-filter-choice input:focus-visible ~ .nb-filter-choice-label { outline: 2px solid rgba(224,122,33,0.6); outline-offset: 2px; } .nb-filter-input { appearance: none; background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1); border-radius: 0.5rem; color: rgba(255,255,255,0.85); font-size: 0.8125rem; padding: 0.425rem 0.75rem; transition: border-color 150ms ease; color-scheme: dark; } .nb-filter-input:focus { outline: none; border-color: rgba(224,122,33,0.6); box-shadow: 0 0 0 3px rgba(224,122,33,0.15); } @keyframes nb-hero-shimmer { 0% { opacity: 0.6; } 100% { opacity: 1; } } @keyframes nb-gallery-fade-in { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } } } /* ─── TipTap rich text editor ─── */ .tiptap { outline: none; } .tiptap p.is-editor-empty:first-child::before { content: attr(data-placeholder); float: left; color: theme('colors.zinc.600'); pointer-events: none; height: 0; } .tiptap img { max-width: 100%; height: auto; border-radius: 0.75rem; } .tiptap pre { position: relative; background: theme('colors.white / 4%'); border: 1px solid theme('colors.white / 6%'); border-radius: 0.75rem; padding: 0.75rem 1rem; overflow-x: auto; } .tiptap pre code { display: block; background: none; border: none; padding: 0; font-size: 0.8125rem; color: theme('colors.zinc.300'); } .tiptap .hljs { color: theme('colors.zinc.200'); background: transparent; } .tiptap .hljs-comment, .tiptap .hljs-quote { color: theme('colors.zinc.500'); font-style: italic; } .tiptap .hljs-keyword, .tiptap .hljs-selector-tag, .tiptap .hljs-subst { color: theme('colors.fuchsia.300'); font-weight: 600; } .tiptap .hljs-string, .tiptap .hljs-attr, .tiptap .hljs-template-tag, .tiptap .hljs-template-variable { color: theme('colors.sky.300'); } .tiptap .hljs-title, .tiptap .hljs-section, .tiptap .hljs-name, .tiptap .hljs-selector-id, .tiptap .hljs-selector-class { color: theme('colors.blue.300'); font-weight: 600; } .tiptap .hljs-number, .tiptap .hljs-literal, .tiptap .hljs-symbol, .tiptap .hljs-bullet { color: theme('colors.amber.300'); } .tiptap .hljs-built_in, .tiptap .hljs-type, .tiptap .hljs-class { color: theme('colors.rose.300'); } .tiptap .hljs-variable, .tiptap .hljs-property, .tiptap .hljs-params, .tiptap .hljs-operator { color: theme('colors.zinc.200'); } .tiptap .hljs-meta, .tiptap .hljs-doctag { color: theme('colors.zinc.400'); } .tiptap blockquote { border-left: 3px solid theme('colors.sky.500 / 40%'); padding-left: 1rem; margin-left: 0; color: theme('colors.zinc.400'); font-style: italic; } .tiptap hr { border: none; border-top: 1px solid theme('colors.white / 10%'); margin: 1.5rem 0; } .tiptap ul { list-style-type: disc; padding-left: 1.5rem; } .tiptap ol { list-style-type: decimal; padding-left: 1.5rem; } .tiptap li { margin-bottom: 0.25rem; } .tiptap a { color: theme('colors.sky.300'); text-decoration: underline; text-underline-offset: 2px; } .tiptap a:hover { color: theme('colors.sky.200'); } .story-prose pre { position: relative; overflow: hidden; border-color: rgba(51, 65, 85, 0.95) !important; background: linear-gradient(180deg, rgba(15, 23, 42, 0.98) 0, rgba(15, 23, 42, 0.98) 3rem, rgba(2, 6, 23, 0.98) 3rem, rgba(2, 6, 23, 0.98) 100%) !important; box-shadow: 0 26px 75px rgba(2, 6, 23, 0.5), inset 0 1px 0 rgba(56, 189, 248, 0.08); padding: 4rem 1.5rem 1.5rem !important; } .story-prose pre[data-language]::before { content: attr(data-language); position: absolute; z-index: 2; top: 0.7rem; left: 1.25rem; border: 1px solid rgba(56, 189, 248, 0.22); border-radius: 999px; background: rgba(15, 23, 42, 0.92); padding: 0.18rem 0.55rem; font-size: 0.7rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: rgb(125 211 252); } .story-prose pre::after { content: ''; position: absolute; inset: 3rem 0 auto 0; height: 1px; background: linear-gradient(90deg, rgba(56, 189, 248, 0), rgba(56, 189, 248, 0.28), rgba(56, 189, 248, 0)); } .story-code-copy-button { position: absolute; z-index: 2; top: 0.7rem; right: 1.25rem; border: 1px solid rgba(148, 163, 184, 0.32); border-radius: 999px; background: rgba(15, 23, 42, 0.9); padding: 0.35rem 0.78rem; font-size: 0.72rem; font-weight: 700; letter-spacing: 0.04em; color: rgb(241 245 249); display: inline-flex; align-items: center; gap: 0.4rem; transition: background-color 120ms ease, border-color 120ms ease, color 120ms ease, transform 120ms ease, box-shadow 120ms ease; } .story-code-copy-button:hover { background: rgb(14 165 233); border-color: rgb(56 189 248); color: rgb(2 6 23); box-shadow: 0 10px 24px rgba(14, 165, 233, 0.22); } .story-code-copy-button:active { transform: translateY(1px); } .story-code-copy-icon { display: inline-flex; align-items: center; justify-content: center; width: 1rem; height: 1rem; font-size: 0.9rem; line-height: 1; transform-origin: center; } .story-code-copy-label { line-height: 1; } .story-code-copy-button[data-copied='true'] { background: rgb(14 116 144); border-color: rgb(34 211 238); color: white; box-shadow: 0 12px 28px rgba(14, 116, 144, 0.22); } .story-code-copy-button[data-copied='false'] { background: rgb(153 27 27); border-color: rgb(248 113 113); color: white; } .story-code-copy-button[data-copied='true'] .story-code-copy-icon { animation: story-code-copy-check 320ms cubic-bezier(.2,.9,.25,1.2); } .story-code-copy-button[data-copied='true'] .story-code-copy-label { animation: story-code-copy-label 220ms ease-out; } @keyframes story-code-copy-check { 0% { opacity: 0; transform: scale(0.4) rotate(-24deg); } 55% { opacity: 1; transform: scale(1.2) rotate(6deg); } 100% { opacity: 1; transform: scale(1) rotate(0deg); } } @keyframes story-code-copy-label { 0% { opacity: 0.15; transform: translateX(-3px); } 100% { opacity: 1; transform: translateX(0); } } .story-prose pre code.hljs, .story-prose pre code[class*='language-'] { display: block; overflow-x: auto; background: transparent; padding: 0; } .story-prose .hljs { color: rgb(226 232 240); background: transparent; font-size: 0.94rem; line-height: 1.9; } .story-prose .hljs-comment, .story-prose .hljs-quote { color: rgb(100 116 139); font-style: italic; } .story-prose .hljs-keyword, .story-prose .hljs-selector-tag, .story-prose .hljs-subst { color: rgb(125 211 252); font-weight: 600; } .story-prose .hljs-string, .story-prose .hljs-attr, .story-prose .hljs-template-tag, .story-prose .hljs-template-variable { color: rgb(134 239 172); } .story-prose .hljs-title, .story-prose .hljs-section, .story-prose .hljs-name, .story-prose .hljs-selector-id, .story-prose .hljs-selector-class { color: rgb(196 181 253); font-weight: 600; } .story-prose .hljs-number, .story-prose .hljs-literal, .story-prose .hljs-symbol, .story-prose .hljs-bullet { color: rgb(251 191 36); } .story-prose .hljs-built_in, .story-prose .hljs-type, .story-prose .hljs-class { color: rgb(244 114 182); } .story-prose .hljs-variable, .story-prose .hljs-property, .story-prose .hljs-params, .story-prose .hljs-operator { color: rgb(15 23 42); } .story-prose .hljs-meta, .story-prose .hljs-doctag { color: rgb(71 85 105); } /* ─── @mention pills ─── */ .tiptap .mention, .mention { background: theme('colors.sky.500 / 15%'); color: theme('colors.sky.300'); border-radius: 0.375rem; padding: 0.125rem 0.375rem; font-weight: 500; font-size: 0.875rem; text-decoration: none; cursor: pointer; white-space: nowrap; } .tiptap .mention:hover { background: theme('colors.sky.500 / 25%'); color: theme('colors.sky.200'); } /* ─── Tippy.js mention dropdown theme ─── */ .tippy-box[data-theme~='mention'] { background: transparent; border: none; padding: 0; box-shadow: none; } .tippy-box[data-theme~='mention'] .tippy-content { padding: 0; }