diff options
| author | Fuwn <[email protected]> | 2026-02-07 01:42:57 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-07 01:42:57 -0800 |
| commit | 5c5b1993edd890a80870ee05607ac5f088191d4e (patch) | |
| tree | a721b76bcd49ba10826c53efc87302c7a689512f /apps/web/app/globals.css | |
| download | asa.news-5c5b1993edd890a80870ee05607ac5f088191d4e.tar.xz asa.news-5c5b1993edd890a80870ee05607ac5f088191d4e.zip | |
feat: asa.news RSS reader with developer tier, REST API, and webhooks
Full-stack RSS reader SaaS: Supabase + Next.js + Go worker.
Includes three subscription tiers (free/pro/developer), API key auth,
read-only REST API, webhook push notifications, Stripe billing with
proration, and PWA support.
Diffstat (limited to 'apps/web/app/globals.css')
| -rw-r--r-- | apps/web/app/globals.css | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css new file mode 100644 index 0000000..c97ddb2 --- /dev/null +++ b/apps/web/app/globals.css @@ -0,0 +1,222 @@ +@import "tailwindcss"; + +@custom-variant dark (&:where(.dark, .dark *)); + +@theme { + --color-background-primary: #070707; + --color-background-secondary: #0f0f0f; + --color-background-tertiary: #1a1a1a; + --color-border: #363636; + --color-text-primary: #ffffff; + --color-text-secondary: #aaaaaa; + --color-text-tertiary: #808080; + --color-text-dim: #666666; + --color-status-operational: #d0d0d0; + --color-status-warning: #c08000; + --color-status-error: #c06060; + --color-status-unknown: #707070; + + --font-mono: "JetBrains Mono", Menlo, Monaco, "Courier New", monospace; + + --radius-sm: 0px; + --radius-md: 0px; + --radius-lg: 0px; + --radius-xl: 0px; + --radius-2xl: 0px; + --radius-3xl: 0px; + --radius-4xl: 0px; + --radius-full: 0px; +} + +:root { + --background: var(--color-background-primary); + --foreground: var(--color-text-primary); + --card: var(--color-background-secondary); + --card-foreground: var(--color-text-primary); + --popover: var(--color-background-secondary); + --popover-foreground: var(--color-text-primary); + --primary: var(--color-text-primary); + --primary-foreground: var(--color-background-primary); + --secondary: var(--color-background-tertiary); + --secondary-foreground: var(--color-text-primary); + --muted: var(--color-background-tertiary); + --muted-foreground: var(--color-text-secondary); + --accent: var(--color-background-tertiary); + --accent-foreground: var(--color-text-primary); + --destructive: var(--color-status-error); + --border: var(--color-border); + --input: var(--color-border); + --ring: var(--color-text-dim); + --radius: 0px; +} + +.light { + --color-background-primary: #ffffff; + --color-background-secondary: #f8f8f8; + --color-background-tertiary: #f0f0f0; + --color-border: #d0d0d0; + --color-text-primary: #000000; + --color-text-secondary: #555555; + --color-text-tertiary: #666666; + --color-text-dim: #767676; + --color-status-operational: #333333; + --color-status-warning: #8a6200; + --color-status-error: #c03030; + --color-status-unknown: #767676; + + --background: var(--color-background-primary); + --foreground: var(--color-text-primary); + --card: var(--color-background-secondary); + --card-foreground: var(--color-text-primary); + --popover: var(--color-background-secondary); + --popover-foreground: var(--color-text-primary); + --primary: var(--color-text-primary); + --primary-foreground: var(--color-background-primary); + --secondary: var(--color-background-tertiary); + --secondary-foreground: var(--color-text-primary); + --muted: var(--color-background-tertiary); + --muted-foreground: var(--color-text-secondary); + --accent: var(--color-background-tertiary); + --accent-foreground: var(--color-text-primary); + --destructive: var(--color-status-error); + --border: var(--color-border); + --input: var(--color-border); + --ring: var(--color-text-dim); +} + +* { + font-weight: 400 !important; +} + +*, +*::before, +*::after { + box-shadow: none !important; +} + +body { + font-family: var(--font-mono); + font-size: var(--base-font-size, 1rem); + line-height: 1.5; + background: var(--background); + color: var(--foreground); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.transition-colors { + transition-property: color, background-color, border-color; + transition-timing-function: ease; + transition-duration: 100ms; +} + +@keyframes pulse-status { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.7; } +} + +@keyframes skeleton-shimmer { + 0% { background-position: 200% 0; } + 100% { background-position: -200% 0; } +} + +.prose-reader a { + color: var(--color-text-primary); + text-decoration: underline; + text-decoration-color: var(--color-text-dim); + text-underline-offset: 2px; +} + +.prose-reader a:hover { + text-decoration-color: var(--color-text-primary); +} + +.prose-reader h1, +.prose-reader h2, +.prose-reader h3, +.prose-reader h4, +.prose-reader h5, +.prose-reader h6 { + color: var(--color-text-primary); + margin-top: 1.5em; + margin-bottom: 0.5em; +} + +.prose-reader p { + margin-bottom: 1em; +} + +.prose-reader img { + max-width: 100%; + height: auto; +} + +.prose-reader pre { + background: var(--color-background-tertiary); + border: 1px solid var(--color-border); + padding: 1em; + overflow-x: auto; + margin-bottom: 1em; +} + +.prose-reader code { + background: var(--color-background-tertiary); + padding: 0.15em 0.3em; +} + +.prose-reader pre code { + background: transparent; + padding: 0; +} + +.prose-reader blockquote { + border-left: 2px solid var(--color-border); + padding-left: 1em; + color: var(--color-text-secondary); + margin-bottom: 1em; +} + +.prose-reader ul, +.prose-reader ol { + padding-left: 1.5em; + margin-bottom: 1em; +} + +.prose-reader li { + margin-bottom: 0.25em; +} + +.prose-reader hr { + border: none; + border-top: 1px solid var(--color-border); + margin: 2em 0; +} + +.prose-reader table { + width: 100%; + border-collapse: collapse; + margin-bottom: 1em; +} + +.prose-reader th, +.prose-reader td { + border: 1px solid var(--color-border); + padding: 0.5em; + text-align: left; +} + +.prose-reader mark[data-highlight-color] { + background-color: rgba(234, 179, 8, 0.18); + color: var(--color-text-primary); + border-bottom: 1px solid rgba(234, 179, 8, 0.4); + cursor: pointer; +} + +.prose-reader mark[data-has-note] { + border-bottom-style: dashed; +} + +.light .prose-reader mark[data-highlight-color] { + background-color: rgba(234, 179, 8, 0.15); + border-bottom-color: rgba(234, 179, 8, 0.35); +} |