@import "tailwindcss";
@plugin "@tailwindcss/typography";
@theme {
--color-sacred-gold: #D4AF37;
--color-sacred-gold-light: #F4E7A5;
--color-parchment: #F9F4E8;
--color-pali-text: #2C1810;
--font-sarabun: "Sarabun", "Noto Serif Thai", "Noto Sans Thai Looped", sans-serif;
}
:root {
font-family: var(--font-sarabun);
line-height: 1.7;
font-weight: 400;
color: var(--color-pali-text);
background-color: var(--color-parchment);
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
body {
margin: 0;
display: flex;
min-width: 320px;
min-height: 100vh;
/* Safe area padding for PWA notch/status bar (iOS black-translucent) */
padding-top: env(safe-area-inset-top);
padding-bottom: env(safe-area-inset-bottom);
padding-left: env(safe-area-inset-left);
padding-right: env(safe-area-inset-right);
/* Default bg matches dark theme — seamless PWA splash/status bar */
background-color: #1a1a2e;
}
#root {
width: 100%;
}
/* ── Search Highlight ──────────────────────────────────────────── */
mark.search-highlight {
background-color: #c8860a;
color: #fff;
border-radius: 2px;
padding: 0 2px;
font-weight: inherit;
animation: highlight-fade 3s ease-out 0.5s forwards;
}
@keyframes highlight-fade {
0% { background-color: #c8860a; color: #fff; }
60% { background-color: #c8860a55; color: inherit; }
100% { background-color: transparent; color: inherit; }
}
/* ── Thai/Pali Typography ──────────────────────────────────────── */
/* Font-kerning and Thai OpenType features for the body reading text */
.reader-content p,
.content-body p {
/* !important overrides Tailwind typography plugin defaults and any inherited text-center */
text-align: justify !important;
text-align-last: left !important;
text-justify: auto !important;
text-indent: 2em;
margin-bottom: 0.6rem !important;
line-height: 1.75 !important;
word-break: normal;
line-break: loose;
overflow-wrap: anywhere;
font-kerning: normal;
font-feature-settings: "kern" 1, "liga" 1, "clig" 1;
orphans: 2;
widows: 2;
}
.reader-content p.numbered-line,
.content-body p.numbered-line {
padding-left: 2.8em;
text-indent: -2.8em;
text-align: left !important;
text-justify: none;
}
/* Structured/tabular lines (e.g. Abhidhamma Patthana) — kept as standalone rows */
.reader-content p.structured-line,
.content-body p.structured-line {
text-align: left !important;
text-indent: 0;
text-justify: none;
margin-bottom: 0.1rem !important;
}
/* Numbered-list paragraphs (๑)/(๒)/(๓) — cancel text-indent so all items align left */
.reader-content p.numbered-list,
.content-body p.numbered-list {
text-indent: 0 !important;
}
/* Continuation / repetition lines starting with "..." — no paragraph indent */
.reader-content p.continuation-line,
.content-body p.continuation-line {
text-indent: 0 !important;
}
/* All inline reference superscripts — same colour, same cursor for future click-to-expand */
sup.footnote-ref,
sup.abbrev-ref {
font-size: 0.7em;
color: #f59e0b;
opacity: 0.8;
vertical-align: super;
cursor: pointer;
letter-spacing: 0.03em;
transition: opacity 0.15s;
}
sup.footnote-ref:hover,
sup.abbrev-ref:hover {
opacity: 1;
text-decoration: underline;
}
/* Standalone fallback block — remove gaps so it reads like part of the paragraph above */
.reader-content p.footnote-ref {
display: inline; /* collapses to inline flow — no block gap */
font-size: 0.72em;
opacity: 0.55;
margin: 0;
padding: 0;
text-indent: 0;
}
/* Wrap each footnote-ref in a block-level container so "display:inline" still works inside prose */
.reader-content p.footnote-ref::before {
content: " "; /* space before the marker */
}
/* Paragraph immediately before a footnote-ref: kill its bottom margin */
.reader-content p:has(+ p.footnote-ref) {
margin-bottom: 0 !important;
}
/* Paragraph immediately after a footnote-ref: normal top gap resumes */
.reader-content p.footnote-ref + p {
margin-top: 0;
}
/* Remove gap when
is at the start of a
(edge case) */ .reader-content p:first-child { margin-top: 0; } /* Custom Utilities */ .text-pali { font-family: var(--font-sarabun); font-size: 1.125rem; line-height: 1.8; } .sacred-border { border-image: linear-gradient(to bottom, #D4AF37, #F4E7A5, #D4AF37) 1; } /* ── Theme Backgrounds with Textures ────────────────────────── */ .theme-light-bg { background-color: #f8f6f0; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.45' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.012'/%3E%3C/svg%3E"); } .theme-classic-bg { background-color: #f5edd8; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.45' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.015'/%3E%3C/svg%3E"); } .theme-dark-bg { background-color: #1a1a2e; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.45' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.018'/%3E%3C/svg%3E"); } .glass-panel { background: rgba(255, 255, 255, 0.03); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37); } .glass-panel-light { background: rgba(255, 255, 255, 0.6); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); border: 1px solid rgba(200, 134, 10, 0.1); } /* ── Inline Content Headings ── smaller than body text, highlight makes it stand out */ .content-heading { color: #c8860a; font-weight: 700; font-size: 0.85em; margin: 1.2em 0 0.6em 0; padding: 0.4em 0.75em; background: rgba(200, 134, 10, 0.08); border-left: 3px solid rgba(200, 134, 10, 0.5); border-radius: 0 0.375rem 0.375rem 0; line-height: 1.4; text-align: left; } /* Remove extra margin when following another heading */ .content-heading + .content-heading { margin-top: -0.3em; } /* Italic footnote styling */ .content-body i { opacity: 0.75; font-style: italic; } /* Underline reference styling */ .content-body u { text-decoration: none; border-bottom: 1px dotted rgba(200, 134, 10, 0.3); } /* ── First Page Top Section ────────────────────────────────────── */ .first-page-top { text-align: center; } .first-page-top .content-heading { text-align: center; background: transparent; border: none; padding: 0; margin: 0.2em 0; font-weight: 400; font-size: 1em; color: inherit; line-height: inherit; border-radius: 0; }