summaryrefslogtreecommitdiff
path: root/apps/web/app/globals.css
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-07 01:42:57 -0800
committerFuwn <[email protected]>2026-02-07 01:42:57 -0800
commit5c5b1993edd890a80870ee05607ac5f088191d4e (patch)
treea721b76bcd49ba10826c53efc87302c7a689512f /apps/web/app/globals.css
downloadasa.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.css222
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);
+}