You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
631 lines
15 KiB
631 lines
15 KiB
@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)); |
|
} |
|
|
|
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; |
|
} |
|
|
|
.scrollbar-hide { |
|
-ms-overflow-style: none; /* Internet Explorer 10+ */ |
|
scrollbar-width: none; /* Firefox */ |
|
} |
|
.scrollbar-hide::-webkit-scrollbar { |
|
display: none; /* Safari and Chrome */ |
|
} |
|
|
|
@media (hover: hover) and (pointer: fine) { |
|
.clickable:hover { |
|
background-color: hsl(var(--muted) / 0.3); |
|
} |
|
} |
|
|
|
@keyframes shimmer { |
|
0% { |
|
background-position: 400% 0; |
|
} |
|
100% { |
|
background-position: 0% 0; |
|
} |
|
} |
|
|
|
.animate-shimmer { |
|
animation: shimmer 3s ease-in-out infinite; |
|
} |
|
|
|
:root { |
|
/* Moss / forest (approx. #2f6f4f, #3f8a63, #1f4d38) */ |
|
--surface-background: 95 10% 97%; |
|
--content-canvas: 92 9% 96%; |
|
--background: 90 8% 99%; |
|
--foreground: 155 25% 12%; |
|
--card: 90 12% 99%; |
|
--card-foreground: 155 25% 12%; |
|
--popover: 0 0% 100%; |
|
--popover-foreground: 155 25% 12%; |
|
--primary: 152 41% 31%; |
|
--primary-hover: 154 37% 39%; |
|
--primary-active: 155 42% 21%; |
|
--primary-foreground: 0 0% 98%; |
|
--secondary: 95 12% 94%; |
|
--secondary-foreground: 155 22% 18%; |
|
--muted: 95 10% 93%; |
|
--muted-foreground: 150 8% 38%; |
|
--accent: 95 14% 92%; |
|
--accent-foreground: 155 22% 18%; |
|
--destructive: 0 84.2% 60.2%; |
|
--destructive-foreground: 0 0% 98%; |
|
--border: 130 16% 86%; |
|
--input: 130 12% 90%; |
|
--ring: 152 41% 31%; |
|
--sidebar-top: 95 14% 95%; |
|
--sidebar-bottom: 100 16% 92%; |
|
--sidebar-border: 130 18% 82%; |
|
--brand-wordmark: 155 32% 22%; |
|
--prose-link: 152 38% 28%; |
|
--highlight: 152 45% 36%; |
|
--chart-1: 12 76% 61%; |
|
--chart-2: 173 58% 39%; |
|
--chart-3: 197 37% 24%; |
|
--chart-4: 43 74% 66%; |
|
--chart-5: 27 87% 67%; |
|
--radius: 0.5rem; |
|
} |
|
.dark { |
|
--surface-background: 152 22% 9%; |
|
--content-canvas: 150 20% 8%; |
|
--background: 150 18% 10%; |
|
--foreground: 100 12% 96%; |
|
--card: 150 16% 12%; |
|
--card-foreground: 100 10% 95%; |
|
--popover: 150 18% 10%; |
|
--popover-foreground: 100 12% 96%; |
|
--primary: 152 41% 38%; |
|
--primary-hover: 154 37% 46%; |
|
--primary-active: 155 42% 28%; |
|
--primary-foreground: 0 0% 98%; |
|
--secondary: 150 14% 16%; |
|
--secondary-foreground: 100 10% 95%; |
|
--muted: 150 12% 16%; |
|
--muted-foreground: 140 8% 72%; |
|
--accent: 150 14% 18%; |
|
--accent-foreground: 100 10% 95%; |
|
--destructive: 0 62.8% 30.6%; |
|
--destructive-foreground: 0 0% 98%; |
|
--border: 150 12% 22%; |
|
--input: 150 12% 18%; |
|
--ring: 152 41% 42%; |
|
--sidebar-top: 152 24% 12%; |
|
--sidebar-bottom: 154 22% 7%; |
|
--sidebar-border: 150 14% 20%; |
|
--brand-wordmark: 145 28% 91%; |
|
--prose-link: 145 35% 72%; |
|
--highlight: 150 40% 48%; |
|
--chart-1: 220 70% 50%; |
|
--chart-2: 160 60% 45%; |
|
--chart-3: 30 80% 55%; |
|
--chart-4: 280 65% 60%; |
|
--chart-5: 340 75% 55%; |
|
} |
|
|
|
:where(.prose) a { |
|
color: hsl(var(--prose-link)); |
|
text-underline-offset: 2px; |
|
} |
|
|
|
:where(.prose) a:hover { |
|
color: hsl(var(--primary)); |
|
} |
|
|
|
.dark input[type='datetime-local']::-webkit-calendar-picker-indicator { |
|
filter: invert(1) brightness(1.5); |
|
} |
|
|
|
/* Focus indicators for accessibility */ |
|
*:focus-visible { |
|
outline: 2px solid hsl(var(--ring)); |
|
outline-offset: 2px; |
|
border-radius: 2px; |
|
} |
|
|
|
/* Ensure proper contrast for interactive elements */ |
|
button:not(:disabled), |
|
a, |
|
[role="button"] { |
|
transition: opacity 0.2s; |
|
} |
|
|
|
button:disabled, |
|
[aria-disabled="true"] { |
|
opacity: 0.5; |
|
cursor: not-allowed; |
|
} |
|
} |
|
|
|
@layer components { |
|
/** |
|
* Playfair for page/modal chrome titles only (not nav labels or article body). |
|
* Use with optional utilities: truncate, leading-tight, pl-3, etc. |
|
*/ |
|
.app-chrome-title { |
|
@apply font-display text-lg font-semibold; |
|
} |
|
|
|
.imwald-sidebar { |
|
position: relative; |
|
isolation: isolate; |
|
background: linear-gradient( |
|
180deg, |
|
hsl(var(--sidebar-top)) 0%, |
|
hsl(var(--sidebar-bottom)) 100% |
|
); |
|
border-right: 1px solid hsl(var(--sidebar-border)); |
|
} |
|
|
|
.imwald-sidebar__atmosphere { |
|
position: absolute; |
|
inset: 0; |
|
z-index: 0; |
|
pointer-events: none; |
|
overflow: hidden; |
|
} |
|
|
|
.imwald-sidebar__atmosphere::after { |
|
content: ''; |
|
position: absolute; |
|
left: -32%; |
|
right: -32%; |
|
top: -32%; |
|
bottom: -32%; |
|
background-image: url(/brand-atmosphere-light.png); |
|
background-size: cover; |
|
background-position: center; |
|
opacity: 0.055; |
|
filter: blur(42px) saturate(1.05); |
|
} |
|
|
|
.dark .imwald-sidebar__atmosphere::after { |
|
background-image: url(/brand-atmosphere-dark.png); |
|
opacity: 0.075; |
|
filter: blur(42px) saturate(1.08) brightness(0.9); |
|
} |
|
|
|
.imwald-titlebar-fog { |
|
position: relative; |
|
} |
|
|
|
.imwald-titlebar-fog::before { |
|
content: ''; |
|
position: absolute; |
|
inset: 0; |
|
pointer-events: none; |
|
z-index: 0; |
|
background: radial-gradient( |
|
ellipse 100% 85% at 50% -35%, |
|
hsl(var(--primary) / 0.08), |
|
transparent 52% |
|
); |
|
} |
|
|
|
.dark .imwald-titlebar-fog::before { |
|
background: radial-gradient( |
|
ellipse 100% 85% at 50% -35%, |
|
hsl(var(--primary) / 0.11), |
|
transparent 52% |
|
); |
|
} |
|
|
|
.imwald-titlebar-fog > * { |
|
position: relative; |
|
z-index: 1; |
|
} |
|
} |
|
|
|
/* Font Size Adjustments */ |
|
.font-size-small { |
|
font-size: 87.5% !important; /* 14px base */ |
|
} |
|
|
|
.font-size-medium { |
|
font-size: 100% !important; /* 16px base */ |
|
} |
|
|
|
.font-size-large { |
|
font-size: 112.5% !important; /* 18px base */ |
|
} |
|
|
|
/* Apply font size to content areas */ |
|
.font-size-small .prose, |
|
.font-size-medium .prose, |
|
.font-size-large .prose { |
|
font-size: var(--content-font-size, 1rem); |
|
} |
|
|
|
/* AsciiDoc Table of Contents Styling */ |
|
#toc { |
|
@apply bg-muted/30 rounded-lg p-3 sm:p-4 mb-4 sm:mb-6; |
|
} |
|
|
|
#toc h2 { |
|
@apply text-lg font-semibold mb-3 text-foreground border-b border-border pb-2; |
|
} |
|
|
|
#toc ul { |
|
@apply space-y-1; |
|
} |
|
|
|
#toc li { |
|
@apply list-none; |
|
} |
|
|
|
#toc a { |
|
@apply text-sm text-muted-foreground hover:text-foreground transition-colors duration-200 block py-1 px-2 rounded hover:bg-primary/10 hover:border-l-2 hover:border-primary hover:pl-3; |
|
} |
|
|
|
#toc .sectlevel1 a { |
|
@apply font-medium text-foreground; |
|
} |
|
|
|
#toc .sectlevel2 a { |
|
@apply ml-4; |
|
} |
|
|
|
#toc .sectlevel3 a { |
|
@apply ml-8; |
|
} |
|
|
|
#toc .sectlevel4 a { |
|
@apply ml-12; |
|
} |
|
|
|
#toc .sectlevel5 a { |
|
@apply ml-16; |
|
} |
|
|
|
#toc .sectlevel6 a { |
|
@apply ml-20; |
|
} |
|
|
|
/* Hide the raw AsciiDoc ToC text when styled ToC is present */ |
|
.asciidoc-toc-raw { |
|
display: none; |
|
} |
|
|
|
/* AsciiDoc Section Headers Styling */ |
|
.asciidoc-content h1, |
|
.asciidoc-content h2, |
|
.asciidoc-content h3, |
|
.asciidoc-content h4, |
|
.asciidoc-content h5, |
|
.asciidoc-content h6 { |
|
@apply scroll-mt-24; /* Add padding when scrolling to headers - increased for better visibility */ |
|
scroll-behavior: smooth; |
|
position: relative; |
|
} |
|
|
|
/* ToC return button styling */ |
|
.asciidoc-content h1 .toc-return-btn, |
|
.asciidoc-content h2 .toc-return-btn, |
|
.asciidoc-content h3 .toc-return-btn, |
|
.asciidoc-content h4 .toc-return-btn, |
|
.asciidoc-content h5 .toc-return-btn, |
|
.asciidoc-content h6 .toc-return-btn { |
|
@apply absolute right-0 top-1/2 -translate-y-1/2 opacity-0 transition-all duration-200 text-muted-foreground hover:text-foreground cursor-pointer; |
|
font-size: 0.75rem; |
|
line-height: 1; |
|
padding: 0.25rem 0.5rem; |
|
border-radius: 0.375rem; |
|
background: hsl(var(--background) / 0.9); |
|
backdrop-filter: blur(8px); |
|
border: 1px solid hsl(var(--border)); |
|
white-space: nowrap; |
|
z-index: 10; |
|
box-shadow: 0 1px 3px hsl(var(--foreground) / 0.1); |
|
} |
|
|
|
.asciidoc-content h1:hover .toc-return-btn, |
|
.asciidoc-content h2:hover .toc-return-btn, |
|
.asciidoc-content h3:hover .toc-return-btn, |
|
.asciidoc-content h4:hover .toc-return-btn, |
|
.asciidoc-content h5:hover .toc-return-btn, |
|
.asciidoc-content h6:hover .toc-return-btn { |
|
@apply opacity-100; |
|
transform: translateY(-50%) scale(1.05); |
|
background: hsl(var(--primary) / 0.1); |
|
border-color: hsl(var(--primary) / 0.3); |
|
} |
|
|
|
/* Show button on mobile when header is tapped */ |
|
@media (hover: none) { |
|
.asciidoc-content h1:active .toc-return-btn, |
|
.asciidoc-content h2:active .toc-return-btn, |
|
.asciidoc-content h3:active .toc-return-btn, |
|
.asciidoc-content h4:active .toc-return-btn, |
|
.asciidoc-content h5:active .toc-return-btn, |
|
.asciidoc-content h6:active .toc-return-btn { |
|
@apply opacity-100; |
|
} |
|
} |
|
|
|
/* AsciiDoc Footnotes Styling */ |
|
.asciidoc-content .footnote { |
|
@apply text-xs text-muted-foreground; |
|
margin-bottom: 0.5rem; /* Add some spacing between footnotes */ |
|
} |
|
|
|
.asciidoc-content .footnote a { |
|
@apply text-primary hover:underline; |
|
} |
|
|
|
.asciidoc-content .footnote-backref { |
|
@apply ml-1 text-primary hover:underline; |
|
} |
|
|
|
.asciidoc-content .footnoteref { |
|
@apply text-primary hover:underline; |
|
vertical-align: super; |
|
font-size: 0.75em; |
|
text-decoration: none; |
|
font-weight: 500; |
|
} |
|
|
|
/* Add scroll padding to footnote anchors and content elements */ |
|
.asciidoc-content [id^="footnote-"], |
|
.asciidoc-content [id*="footnote"], |
|
.asciidoc-content [id*="_footnote"], |
|
.asciidoc-content [id*="_ref"], |
|
.asciidoc-content p, |
|
.asciidoc-content li { |
|
scroll-margin-top: 8rem; /* Scroll padding for footnote anchors and content */ |
|
} |
|
|
|
/* Also add scroll padding to any element that might be a footnote target */ |
|
.asciidoc-content *[id] { |
|
scroll-margin-top: 8rem; |
|
} |
|
|
|
.asciidoc-content .footnoteref:hover { |
|
@apply underline; |
|
} |
|
|
|
.asciidoc-content .footnotes { |
|
@apply mt-8 pt-4 border-t border-border; |
|
scroll-margin-top: 4rem; /* Ensure footnotes section doesn't scroll out of view */ |
|
} |
|
|
|
.asciidoc-content .footnotes ol { |
|
@apply space-y-3; /* Increased spacing between footnote entries */ |
|
} |
|
|
|
.asciidoc-content .footnotes li { |
|
@apply text-sm text-muted-foreground; |
|
display: block; /* Ensure each footnote is on its own line */ |
|
margin-bottom: 0.75rem; /* Additional spacing for better readability */ |
|
} |
|
|
|
.asciidoc-content .footnotes li p { |
|
@apply mb-2; |
|
margin-top: 0; /* Remove top margin for cleaner look */ |
|
} |
|
|
|
.asciidoc-content h1 { |
|
@apply text-xl sm:text-2xl font-bold mt-6 sm:mt-8 mb-3 sm:mb-4 text-foreground hover:bg-primary/5 hover:px-2 hover:py-1 hover:rounded transition-all duration-200; |
|
} |
|
|
|
.asciidoc-content h2 { |
|
@apply text-lg sm:text-xl font-semibold mt-5 sm:mt-6 mb-2 sm:mb-3 text-foreground hover:bg-primary/5 hover:px-2 hover:py-1 hover:rounded transition-all duration-200; |
|
} |
|
|
|
.asciidoc-content h3 { |
|
@apply text-base sm:text-lg font-medium mt-4 sm:mt-5 mb-2 text-foreground hover:bg-primary/5 hover:px-2 hover:py-1 hover:rounded transition-all duration-200; |
|
} |
|
|
|
.asciidoc-content h4 { |
|
@apply text-sm sm:text-base font-medium mt-3 sm:mt-4 mb-2 text-foreground hover:bg-primary/5 hover:px-2 hover:py-1 hover:rounded transition-all duration-200; |
|
} |
|
|
|
.asciidoc-content h5 { |
|
@apply text-xs sm:text-sm font-medium mt-3 mb-2 text-foreground hover:bg-primary/5 hover:px-2 hover:py-1 hover:rounded transition-all duration-200; |
|
} |
|
|
|
.asciidoc-content h6 { |
|
@apply text-xs font-medium mt-3 mb-2 text-foreground hover:bg-primary/5 hover:px-2 hover:py-1 hover:rounded transition-all duration-200; |
|
} |
|
|
|
@keyframes progressFill { |
|
0% { |
|
width: 0%; |
|
} |
|
100% { |
|
width: 100%; |
|
} |
|
} |
|
|
|
@keyframes shake { |
|
0%, |
|
100% { |
|
transform: translate(0, 0) rotate(0deg); |
|
} |
|
10% { |
|
transform: translate(-1px, -1px) rotate(-1deg); |
|
} |
|
20% { |
|
transform: translate(1px, -1px) rotate(1deg); |
|
} |
|
30% { |
|
transform: translate(-1px, 1px) rotate(-1deg); |
|
} |
|
40% { |
|
transform: translate(1px, 1px) rotate(1deg); |
|
} |
|
50% { |
|
transform: translate(-1px, -1px) rotate(-1deg); |
|
} |
|
60% { |
|
transform: translate(1px, -1px) rotate(1deg); |
|
} |
|
70% { |
|
transform: translate(-1px, 1px) rotate(-1deg); |
|
} |
|
80% { |
|
transform: translate(1px, 1px) rotate(1deg); |
|
} |
|
90% { |
|
transform: translate(-1px, -1px) rotate(-1deg); |
|
} |
|
} |
|
|
|
/* Greentext styling - 4chan style */ |
|
.greentext { |
|
color: #4a7c3a; /* Deeper, darker green for better readability in light mode */ |
|
display: block; |
|
margin: 0.25rem 0; |
|
font-family: inherit; |
|
} |
|
|
|
.dark .greentext { |
|
color: #8fbc8f; /* Lighter green for dark mode */ |
|
} |
|
|
|
/* Ensure greentext lines appear on their own line even if markdown processes them */ |
|
.markdown-content .greentext, |
|
.prose .greentext { |
|
display: block; |
|
margin: 0.25rem 0; |
|
} |
|
|
|
/* Lightbox (yet-another-react-lightbox) caption title: wrap on narrow screens instead of truncating */ |
|
.yarl__slide_title { |
|
white-space: normal !important; |
|
overflow: visible !important; |
|
text-overflow: unset !important; |
|
word-wrap: break-word; |
|
} |
|
|
|
/* Lightbox: responsive on narrow screens so images are not cut off */ |
|
.yarl__portal { |
|
inset: 0; |
|
width: 100%; |
|
height: 100%; |
|
} |
|
@supports (height: 100dvh) { |
|
.yarl__portal { |
|
height: 100dvh; |
|
} |
|
} |
|
.yarl__container { |
|
height: 100%; |
|
min-height: 0; |
|
width: 100%; |
|
} |
|
.yarl__carousel { |
|
min-height: 0; |
|
} |
|
.yarl__slide { |
|
min-height: 0; |
|
min-width: 0; |
|
display: flex; |
|
align-items: center; |
|
justify-content: center; |
|
} |
|
.yarl__slide_image { |
|
max-height: 100% !important; |
|
max-width: 100% !important; |
|
width: auto !important; |
|
height: auto !important; |
|
object-fit: contain !important; |
|
} |
|
/* Ensure slide wrapper allows image to shrink and fit viewport on narrow screens */ |
|
.yarl__slide_wrapper { |
|
min-height: 0; |
|
flex: 1; |
|
display: flex !important; |
|
align-items: center; |
|
justify-content: center; |
|
width: 100%; |
|
max-width: 100%; |
|
} |
|
.yarl__slide_wrapper .yarl__slide_image { |
|
max-height: 100% !important; |
|
max-width: 100% !important; |
|
} |
|
/* Radix UI modal dialogs (e.g. NoteDrawer Sheet) set pointer-events:none on document.body |
|
to block background interaction. Override this for the lightbox portal so it remains |
|
fully interactive when opened from inside a Radix modal. */ |
|
.yarl__portal { |
|
pointer-events: auto; |
|
} |
|
|
|
/* Bitcoin Connect (Alby) payment UI: web component on document.body while a Sheet/Dialog may |
|
still be tearing down; same pointer-events issue as the lightbox when nested under Radix. */ |
|
bc-modal { |
|
pointer-events: auto; |
|
} |
|
@media (max-width: 768px) { |
|
.yarl__slide_captions_container { |
|
padding: 12px; |
|
} |
|
.yarl__toolbar { |
|
padding: 8px; |
|
} |
|
.yarl__navigation_prev, |
|
.yarl__navigation_next { |
|
padding: 12px 8px; |
|
} |
|
}
|
|
|