update bauhaus privacy policy and blog styling

This commit is contained in:
jwinterm
2026-02-06 13:10:15 -05:00
parent 1705497ca6
commit 375e7e2868
9 changed files with 313 additions and 93 deletions
+12 -2
View File
@@ -6,14 +6,13 @@
## Nice to Have ## Nice to Have
- [ ] **Blog** - Consider adding blog/articles section (MDX, Contentlayer, or headless CMS)
- [ ] **Rate limiting** - Turnstile handles bots; add rate limiting only if abuse observed - [ ] **Rate limiting** - Turnstile handles bots; add rate limiting only if abuse observed
- [ ] Manual screen reader testing (NVDA, VoiceOver) - [ ] Manual screen reader testing (NVDA, VoiceOver)
- [ ] Further canvas performance optimization - [ ] Further canvas performance optimization
- [ ] **Blog migration** - Move to MDX/Contentlayer when post count grows
## Future Projects ## Future Projects
- [ ] Puzzle game (mobile app with web demo)
- [ ] Decision making app (mobile app with web demo) - [ ] Decision making app (mobile app with web demo)
--- ---
@@ -62,6 +61,17 @@ packages/
## Completed ## Completed
### Products & Blog (February 2026)
- [x] **Products section** - Landing page + 4 product pages (Webshops, Custom Websites, Smirk Wallet, Bauhaus Echo)
- [x] **Bauhaus Echo** - Full product page with game modes, features, app store links, privacy policy
- [x] **Smirk Wallet** - Full product page with features, supported currencies, community links
- [x] **Blog infrastructure** - Blog listing with draft system, individual post pages
- [x] **Blog posts** - Website Relaunch (published), Smirk Wallet v0.1.6 (published), Bauhaus Echo Launch (draft)
- [x] **Mobile bottom navigation** - Fixed nav bar for mobile with 5 items (Home, Products, Services, Blog, About)
- [x] **Header updates** - Desktop nav now includes Products and Blog links
- [x] **Portfolio bento grid** - Added Smirk Wallet card (1x2 tall)
- [x] **Footer/About** - Replaced Reddit with Discord, added jwinterm.com link
### Lighthouse Scores (January 2026) ### Lighthouse Scores (January 2026)
| Page | Performance | Accessibility | SEO | Best Practices | | Page | Performance | Accessibility | SEO | Best Practices |
+1
View File
@@ -28,6 +28,7 @@
"devDependencies": { "devDependencies": {
"@axe-core/playwright": "^4.11.0", "@axe-core/playwright": "^4.11.0",
"@playwright/test": "^1.57.0", "@playwright/test": "^1.57.0",
"@tailwindcss/typography": "^0.5.19",
"@types/node": "^20.0.0", "@types/node": "^20.0.0",
"@types/react": "^18.0.0", "@types/react": "^18.0.0",
"@types/react-dom": "^18.0.0", "@types/react-dom": "^18.0.0",
@@ -13,56 +13,59 @@ export default function BauhausEchoLaunchPost() {
return ( return (
<main className="relative min-h-screen flex flex-col items-center bg-background text-foreground"> <main className="relative min-h-screen flex flex-col items-center bg-background text-foreground">
<Header /> <Header />
<article id="main-content" className="z-10 w-full max-w-3xl mx-auto py-20 px-4 pb-24 md:pb-20"> <article id="main-content" className="z-10 w-full max-w-4xl mx-auto py-20 px-4 pb-24 md:pb-20">
<Link href="/blog" className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-block"> <Link href="/blog" className="text-sm text-muted-foreground hover:text-emerald-600 dark:hover:text-emerald-400 mb-8 inline-flex items-center gap-2 transition-colors">
← Back to Blog ← Back to Blog
</Link> </Link>
<header className="mb-12"> <div className="glass-card mt-6">
<time className="text-sm text-muted-foreground">February 6, 2026</time> <header className="mb-8 pb-6 border-b border-border">
<h1 className="text-3xl md:text-4xl font-bold mt-2">Bauhaus Echo is Live</h1> <time className="text-sm text-muted-foreground">February 6, 2026</time>
</header> <h1 className="text-3xl md:text-4xl font-bold mt-2">Bauhaus Echo is Live</h1>
<p className="text-muted-foreground mt-3">A visual memory puzzle inspired by Bauhaus design</p>
</header>
<div className="prose dark:prose-invert max-w-none"> <div className="prose dark:prose-invert max-w-none">
<p> <p>
Bauhaus Echo is now available on Google Play and the App Store. It is a visual memory game Bauhaus Echo is now available on Google Play and the App Store. It is a visual memory game
where you memorize tile arrangements, watch them shuffle, and reconstruct the original pattern. where you memorize tile arrangements, watch them shuffle, and reconstruct the original pattern.
</p> </p>
<h2>The Concept</h2> <h2>The Concept</h2>
<p> <p>
The game shows you a grid of colorful geometric tiles inspired by Bauhaus design. You get a The game shows you a grid of colorful geometric tiles inspired by Bauhaus design. You get a
few seconds to memorize their positions. Then the tiles spin, shrink, and scatter to the few seconds to memorize their positions. Then the tiles spin, shrink, and scatter to the
bottom of the screen. Your job is to drag them back to where they belong. bottom of the screen. Your job is to drag them back to where they belong.
</p> </p>
<h2>Four Game Modes</h2> <h2>Four Game Modes</h2>
<ul> <ul>
<li><strong>Classic</strong> - The core experience. Memorize and reconstruct.</li> <li><strong>Classic</strong> — The core experience. Memorize and reconstruct.</li>
<li><strong>Speed</strong> - Tiles appear one at a time. Place each before the next drops.</li> <li><strong>Speed</strong> — Tiles appear one at a time. Place each before the next drops.</li>
<li><strong>Endless</strong> - Speed mode that loops forever. See how long you last.</li> <li><strong>Endless</strong> — Speed mode that loops forever. See how long you last.</li>
<li><strong>Memory</strong> - Traditional card-matching pairs.</li> <li><strong>Memory</strong> — Traditional card-matching pairs.</li>
</ul> </ul>
<h2>Tech Stack</h2> <h2>Tech Stack</h2>
<p> <p>
Built with libGDX, a cross-platform Java game framework. The same codebase runs on Android, Built with libGDX, a cross-platform Java game framework. The same codebase runs on Android,
iOS (via RoboVM), desktop, and web (via GWT). The tile assets are packed into a TextureAtlas iOS (via RoboVM), desktop, and web (via GWT). The tile assets are packed into a TextureAtlas
for efficient rendering. for efficient rendering.
</p> </p>
<h2>Download</h2> <h2>Download</h2>
<p> <p>
Get it on{" "} Get it on{" "}
<a href="https://play.google.com/store/apps/details?id=com.suchsoftware.bauhausecho" target="_blank" rel="noopener noreferrer"> <a href="https://play.google.com/store/apps/details?id=com.suchsoftware.bauhausecho" target="_blank" rel="noopener noreferrer">
Google Play Google Play
</a>{" "} </a>{" "}
or the{" "} or the{" "}
<a href="https://apps.apple.com/app/bauhaus-echo" target="_blank" rel="noopener noreferrer"> <a href="https://apps.apple.com/app/bauhaus-echo" target="_blank" rel="noopener noreferrer">
App Store App Store
</a> </a>
. Free with ads, or pay once to remove them. . Free with ads, or pay once to remove them.
</p> </p>
</div>
</div> </div>
</article> </article>
<MobileNav /> <MobileNav />
@@ -13,17 +13,19 @@ export default function SmirkWalletReleasePost() {
return ( return (
<main className="relative min-h-screen flex flex-col items-center bg-background text-foreground"> <main className="relative min-h-screen flex flex-col items-center bg-background text-foreground">
<Header /> <Header />
<article id="main-content" className="z-10 w-full max-w-3xl mx-auto py-20 px-4 pb-24 md:pb-20"> <article id="main-content" className="z-10 w-full max-w-4xl mx-auto py-20 px-4 pb-24 md:pb-20">
<Link href="/blog" className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-block"> <Link href="/blog" className="text-sm text-muted-foreground hover:text-emerald-600 dark:hover:text-emerald-400 mb-8 inline-flex items-center gap-2 transition-colors">
← Back to Blog ← Back to Blog
</Link> </Link>
<header className="mb-12"> <div className="glass-card mt-6">
<time className="text-sm text-muted-foreground">February 6, 2026</time> <header className="mb-8 pb-6 border-b border-border">
<h1 className="text-3xl md:text-4xl font-bold mt-2">Smirk Wallet v0.1.6</h1> <time className="text-sm text-muted-foreground">February 6, 2026</time>
</header> <h1 className="text-3xl md:text-4xl font-bold mt-2">Smirk Wallet v0.1.6</h1>
<p className="text-muted-foreground mt-3">Non-custodial social tipping for Telegram and Discord</p>
</header>
<div className="prose dark:prose-invert max-w-none"> <div className="prose dark:prose-invert max-w-none">
<p> <p>
Smirk Wallet is a non-custodial browser extension that lets you tip people cryptocurrency Smirk Wallet is a non-custodial browser extension that lets you tip people cryptocurrency
by their Telegram or Discord username. We have shipped six releases and the extension is by their Telegram or Discord username. We have shipped six releases and the extension is
@@ -107,6 +109,7 @@ export default function SmirkWalletReleasePost() {
. .
</p> </p>
</div> </div>
</div>
</article> </article>
<MobileNav /> <MobileNav />
</main> </main>
@@ -13,17 +13,19 @@ export default function WebsiteRelaunchPost() {
return ( return (
<main className="relative min-h-screen flex flex-col items-center bg-background text-foreground"> <main className="relative min-h-screen flex flex-col items-center bg-background text-foreground">
<Header /> <Header />
<article id="main-content" className="z-10 w-full max-w-3xl mx-auto py-20 px-4 pb-24 md:pb-20"> <article id="main-content" className="z-10 w-full max-w-4xl mx-auto py-20 px-4 pb-24 md:pb-20">
<Link href="/blog" className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-block"> <Link href="/blog" className="text-sm text-muted-foreground hover:text-emerald-600 dark:hover:text-emerald-400 mb-8 inline-flex items-center gap-2 transition-colors">
← Back to Blog ← Back to Blog
</Link> </Link>
<header className="mb-12"> <div className="glass-card mt-6">
<time className="text-sm text-muted-foreground">February 6, 2026</time> <header className="mb-8 pb-6 border-b border-border">
<h1 className="text-3xl md:text-4xl font-bold mt-2">Website Relaunch</h1> <time className="text-sm text-muted-foreground">February 6, 2026</time>
</header> <h1 className="text-3xl md:text-4xl font-bold mt-2">Website Relaunch</h1>
<p className="text-muted-foreground mt-3">New design, new infrastructure, same focus on quality</p>
</header>
<div className="prose dark:prose-invert max-w-none"> <div className="prose dark:prose-invert max-w-none">
<p> <p>
We rebuilt such.software. New design, new infrastructure, same focus on performance and accessibility. We rebuilt such.software. New design, new infrastructure, same focus on performance and accessibility.
</p> </p>
@@ -42,10 +44,10 @@ export default function WebsiteRelaunchPost() {
<h2>Procedural Graphics</h2> <h2>Procedural Graphics</h2>
<p> <p>
The homepage features two custom procedural animations: NebulaField and DataGrid. Both are The site features two custom procedural animations: NebulaField and DataGrid. Both are
SVG-based, theme-aware, and respect prefers-reduced-motion. NebulaField renders animated SVG-based, theme-aware, and respect prefers-reduced-motion. NebulaField renders animated
data streams flowing toward a central icon using quadratic Bezier curves. DataGrid draws data streams flowing toward a central icon using quadratic Bezier curves on the homepage.
a pulsing grid with traveling data packets. DataGrid draws a pulsing grid with traveling data packets on the Services page.
</p> </p>
<h2>Accessibility</h2> <h2>Accessibility</h2>
@@ -69,6 +71,7 @@ export default function WebsiteRelaunchPost() {
covers our partnership model and consulting work. Mobile users get a bottom navigation bar. covers our partnership model and consulting work. Mobile users get a bottom navigation bar.
</p> </p>
</div> </div>
</div>
</article> </article>
<MobileNav /> <MobileNav />
</main> </main>
+68
View File
@@ -99,6 +99,74 @@
.glass-card:hover { .glass-card:hover {
border-color: hsl(var(--primary) / 0.3); border-color: hsl(var(--primary) / 0.3);
} }
/* Typography customization for blog posts */
.prose {
--tw-prose-body: hsl(var(--foreground));
--tw-prose-headings: hsl(var(--foreground));
--tw-prose-lead: hsl(var(--muted-foreground));
--tw-prose-links: hsl(var(--primary));
--tw-prose-bold: hsl(var(--foreground));
--tw-prose-counters: hsl(var(--muted-foreground));
--tw-prose-bullets: hsl(var(--muted-foreground));
--tw-prose-hr: hsl(var(--border));
--tw-prose-quotes: hsl(var(--foreground));
--tw-prose-quote-borders: hsl(var(--border));
--tw-prose-captions: hsl(var(--muted-foreground));
--tw-prose-code: hsl(var(--foreground));
--tw-prose-pre-code: hsl(var(--foreground));
--tw-prose-pre-bg: hsl(var(--muted));
--tw-prose-th-borders: hsl(var(--border));
--tw-prose-td-borders: hsl(var(--border));
}
.prose h2 {
@apply text-xl font-semibold mt-10 mb-4 pb-2 border-b border-border;
}
.prose h3 {
@apply text-lg font-medium mt-6 mb-3;
}
.prose p {
@apply leading-relaxed mb-4;
}
.prose ul {
@apply my-4 ml-4 space-y-2;
}
.prose li {
@apply leading-relaxed;
}
.prose a {
@apply text-emerald-600 dark:text-emerald-400 underline underline-offset-2 hover:text-emerald-700 dark:hover:text-emerald-300 transition-colors;
}
.prose strong {
@apply font-semibold;
}
.prose hr {
@apply my-8 border-border;
}
.prose table {
@apply w-full my-6 text-sm;
}
.prose thead th {
@apply text-left font-semibold p-3 bg-muted/50 border-b border-border;
}
.prose tbody td {
@apply p-3 border-b border-border;
}
.prose tbody tr:hover {
@apply bg-muted/30;
}
} }
/* Respect users who prefer reduced motion */ /* Respect users who prefer reduced motion */
@@ -5,7 +5,7 @@ import type { Metadata } from "next";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Privacy Policy | Bauhaus Echo | Such Software", title: "Privacy Policy | Bauhaus Echo | Such Software",
description: "Privacy policy for Bauhaus Echo mobile game.", description: "Privacy policy for Bauhaus Echo mobile game. GDPR and CPRA compliant.",
alternates: { canonical: "/products/bauhaus-echo/privacy" }, alternates: { canonical: "/products/bauhaus-echo/privacy" },
}; };
@@ -13,20 +13,46 @@ export default function BauhausEchoPrivacyPage() {
return ( return (
<main className="relative min-h-screen flex flex-col items-center bg-background text-foreground"> <main className="relative min-h-screen flex flex-col items-center bg-background text-foreground">
<Header /> <Header />
<div id="main-content" className="z-10 w-full max-w-3xl mx-auto py-20 px-4 pb-24 md:pb-20"> <div id="main-content" className="z-10 w-full max-w-4xl mx-auto py-20 px-4 pb-24 md:pb-20">
<Link href="/products/bauhaus-echo" className="text-sm text-muted-foreground hover:text-foreground mb-8 inline-block"> <Link href="/products/bauhaus-echo" className="text-sm text-muted-foreground hover:text-emerald-600 dark:hover:text-emerald-400 mb-8 inline-flex items-center gap-2 transition-colors">
← Back to Bauhaus Echo ← Back to Bauhaus Echo
</Link> </Link>
<h1 className="text-3xl md:text-4xl font-bold mb-4">Privacy Policy for Bauhaus Echo</h1> <div className="glass-card mt-6">
<p className="text-muted-foreground mb-8">Last Updated: January 31, 2026</p> <header className="mb-8 pb-6 border-b border-border">
<h1 className="text-3xl md:text-4xl font-bold">Privacy Policy for Bauhaus Echo</h1>
<p className="text-muted-foreground mt-2">Last Updated: February 6, 2026</p>
</header>
<div className="prose dark:prose-invert max-w-none"> <div className="prose dark:prose-invert max-w-none">
<p> <p>
<strong>Such Software LLC</strong> (&quot;we,&quot; &quot;us,&quot; or &quot;our&quot;) operates the Bauhaus Echo mobile <strong>Such Software LLC</strong> (&quot;we,&quot; &quot;us,&quot; or &quot;our&quot;) operates the Bauhaus Echo mobile
application (the &quot;App&quot;). This page informs you of our policies regarding the collection, application (the &quot;App&quot;). This page informs you of our policies regarding the collection,
use, and disclosure of personal data when you use our App. use, and disclosure of personal data when you use our App.
</p>
<hr />
<h2>Your Privacy Choices (GDPR/CPRA)</h2>
<p>
<strong>We respect your privacy.</strong> When you first open the App, you may see a consent
dialog depending on your location:
</p> </p>
<ul>
<li><strong>EU/UK Users (GDPR):</strong> You will be asked to consent before we show personalized ads. You can accept, decline, or manage your preferences.</li>
<li><strong>California/US Users (CPRA):</strong> You will have the option to opt out of the sale or sharing of your personal information.</li>
</ul>
<p><strong>Your choices:</strong></p>
<ul>
<li>If you <strong>decline</strong> consent, we will show non-personalized ads instead</li>
<li>If you <strong>accept</strong>, ads may be personalized based on your interests</li>
<li>You can <strong>change your choice</strong> at any time in the App settings</li>
</ul>
<p>
<strong>Premium Users:</strong> If you purchase &quot;Remove Ads,&quot; no advertising data is collected and no consent is required.
</p>
<hr />
<h2>Information We Collect</h2> <h2>Information We Collect</h2>
@@ -54,22 +80,13 @@ export default function BauhausEchoPrivacyPage() {
</p> </p>
<h3>In-App Purchases</h3> <h3>In-App Purchases</h3>
<p> <p>If you purchase the &quot;Remove Ads&quot; upgrade, your transaction is processed by:</p>
If you purchase the &quot;Remove Ads&quot; upgrade, your transaction is processed by Google Play (Android)
or the Apple App Store (iOS). We do not have access to your payment information. We only receive
confirmation of your purchase status.
</p>
<h3>High Scores &amp; Leaderboards</h3>
<p>If you submit scores to our online leaderboards, we collect:</p>
<ul> <ul>
<li>Your chosen display name (anonymous by default)</li> <li><strong>Google Play</strong> (Android) — <a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Google Play Privacy Policy</a></li>
<li>Your game scores and statistics</li> <li><strong>Apple App Store</strong> (iOS) — <a href="https://www.apple.com/legal/privacy/" target="_blank" rel="noopener noreferrer">Apple Privacy Policy</a></li>
<li>A randomly generated anonymous player ID</li>
</ul> </ul>
<p> <p>
We do <strong>not</strong> require or collect your real name, email, or any other personal We do not have access to your payment information. We only receive confirmation of your purchase status.
information to use leaderboards.
</p> </p>
<h3>Locally Stored Data</h3> <h3>Locally Stored Data</h3>
@@ -81,6 +98,8 @@ export default function BauhausEchoPrivacyPage() {
</ul> </ul>
<p>This data is not transmitted to our servers unless you use the online leaderboard feature.</p> <p>This data is not transmitted to our servers unless you use the online leaderboard feature.</p>
<hr />
<h2>How We Use Your Information</h2> <h2>How We Use Your Information</h2>
<p>We use collected data to:</p> <p>We use collected data to:</p>
<ul> <ul>
@@ -90,13 +109,64 @@ export default function BauhausEchoPrivacyPage() {
<li>Improve the App experience</li> <li>Improve the App experience</li>
</ul> </ul>
<hr />
<h2>Third-Party Services</h2> <h2>Third-Party Services</h2>
<p>The App uses the following third-party services that may collect information:</p> <p>The App uses the following third-party services that may collect information:</p>
<div className="overflow-x-auto">
<table>
<thead>
<tr>
<th>Service</th>
<th>Purpose</th>
<th>Privacy Policy</th>
</tr>
</thead>
<tbody>
<tr>
<td>Google AdMob</td>
<td>Advertising</td>
<td><a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Link</a></td>
</tr>
<tr>
<td>Google UMP SDK</td>
<td>Consent management</td>
<td><a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Link</a></td>
</tr>
<tr>
<td>Google Play Services</td>
<td>Android platform, billing</td>
<td><a href="https://policies.google.com/privacy" target="_blank" rel="noopener noreferrer">Link</a></td>
</tr>
<tr>
<td>Apple StoreKit</td>
<td>iOS platform, billing</td>
<td><a href="https://www.apple.com/legal/privacy/" target="_blank" rel="noopener noreferrer">Link</a></td>
</tr>
</tbody>
</table>
</div>
<h3>Google AdMob Data Collection</h3>
<p>When ads are shown, Google AdMob may collect:</p>
<ul> <ul>
<li><strong>Google AdMob</strong> — Advertising</li> <li>Device advertising identifier</li>
<li><strong>Google Play Services</strong> — Android platform and billing</li> <li>IP address (for approximate location)</li>
<li><strong>Apple StoreKit</strong> — iOS platform and billing</li> <li>Device information (model, OS version)</li>
<li>App usage information</li>
</ul> </ul>
<p>This data is used to:</p>
<ul>
<li>Show relevant advertisements</li>
<li>Measure ad performance</li>
<li>Prevent fraud</li>
</ul>
<p>
If you decline consent (EU/UK) or opt out (US), AdMob will show non-personalized ads and limit data collection.
</p>
<hr />
<h2>Children&apos;s Privacy</h2> <h2>Children&apos;s Privacy</h2>
<p> <p>
@@ -105,6 +175,8 @@ export default function BauhausEchoPrivacyPage() {
contact us immediately. contact us immediately.
</p> </p>
<hr />
<h2>Data Retention</h2> <h2>Data Retention</h2>
<ul> <ul>
<li><strong>Advertising data</strong> is managed by Google per their retention policies</li> <li><strong>Advertising data</strong> is managed by Google per their retention policies</li>
@@ -112,33 +184,71 @@ export default function BauhausEchoPrivacyPage() {
<li><strong>Local data</strong> is stored on your device until you uninstall the App</li> <li><strong>Local data</strong> is stored on your device until you uninstall the App</li>
</ul> </ul>
<hr />
<h2>Your Rights</h2> <h2>Your Rights</h2>
<p>You may:</p> <p>You may:</p>
<ul> <ul>
<li><strong>Control your consent</strong> via the in-app consent dialog (shown on first launch)</li>
<li><strong>Change your privacy choices</strong> at any time via App settings (if available in your region)</li>
<li> <li>
<strong>Opt out of personalized ads</strong> via your device settings (Android: Settings → Google → Ads; <strong>Opt out of personalized ads</strong> via your device settings:
iOS: Settings → Privacy → Tracking) <ul>
<li>Android: Settings → Google → Ads → Opt out of Ads Personalization</li>
<li>iOS: Settings → Privacy → Tracking → Disable tracking for Bauhaus Echo</li>
</ul>
</li> </li>
<li><strong>Request deletion</strong> of your leaderboard data by contacting us</li> <li><strong>Request deletion</strong> of your leaderboard data by contacting us</li>
<li><strong>Remove local data</strong> by uninstalling the App</li> <li><strong>Remove local data</strong> by uninstalling the App</li>
</ul> </ul>
<h3>For EU/UK Residents (GDPR)</h3>
<p>You have the right to:</p>
<ul>
<li>Access your personal data</li>
<li>Rectify inaccurate data</li>
<li>Request deletion of your data</li>
<li>Object to processing</li>
<li>Data portability</li>
</ul>
<p>To exercise these rights, contact us at the email below.</p>
<h3>For California Residents (CPRA)</h3>
<p>You have the right to:</p>
<ul>
<li>Know what personal information is collected</li>
<li>Delete your personal information</li>
<li>Opt out of the sale or sharing of personal information</li>
<li>Non-discrimination for exercising your rights</li>
</ul>
<p>To opt out, use the consent dialog shown in the App or contact us.</p>
<hr />
<h2>Changes to This Policy</h2> <h2>Changes to This Policy</h2>
<p> <p>
We may update this Privacy Policy from time to time. We will notify you of any changes by We may update this Privacy Policy from time to time. We will notify you of any changes by
posting the new Privacy Policy on this page and updating the &quot;Last Updated&quot; date. posting the new Privacy Policy on this page and updating the &quot;Last Updated&quot; date.
</p> </p>
<hr />
<h2>Contact Us</h2> <h2>Contact Us</h2>
<p>If you have any questions about this Privacy Policy, please contact us:</p> <p>If you have any questions about this Privacy Policy, please contact us:</p>
<p> <p>
<strong>Such Software LLC</strong><br /> <strong>Such Software LLC</strong><br />
Email: apps@such.software<br /> Email: apps@such.software<br />
Website: https://such.software Website:{" "}
<a href="https://bauhaus.such.software" target="_blank" rel="noopener noreferrer">
https://bauhaus.such.software
</a>
</p> </p>
<h2>Consent</h2> <hr />
<p>By using Bauhaus Echo, you consent to this Privacy Policy.</p>
<h2>Consent</h2>
<p>By using Bauhaus Echo, you consent to this Privacy Policy.</p>
</div>
</div> </div>
</div> </div>
<MobileNav /> <MobileNav />
+1 -1
View File
@@ -78,6 +78,6 @@ const config: Config = {
}, },
}, },
}, },
plugins: [require("tailwindcss-animate")], plugins: [require("tailwindcss-animate"), require("@tailwindcss/typography")],
}; };
export default config; export default config;
+22
View File
@@ -70,6 +70,9 @@ importers:
'@playwright/test': '@playwright/test':
specifier: ^1.57.0 specifier: ^1.57.0
version: 1.57.0 version: 1.57.0
'@tailwindcss/typography':
specifier: ^0.5.19
version: 0.5.19(tailwindcss@3.4.19)
'@types/node': '@types/node':
specifier: ^20.0.0 specifier: ^20.0.0
version: 20.19.30 version: 20.19.30
@@ -512,6 +515,11 @@ packages:
'@swc/helpers@0.5.15': '@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
'@tailwindcss/typography@0.5.19':
resolution: {integrity: sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==}
peerDependencies:
tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1'
'@tybys/wasm-util@0.10.1': '@tybys/wasm-util@0.10.1':
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
@@ -1823,6 +1831,10 @@ packages:
peerDependencies: peerDependencies:
postcss: ^8.2.14 postcss: ^8.2.14
postcss-selector-parser@6.0.10:
resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
engines: {node: '>=4'}
postcss-selector-parser@6.1.2: postcss-selector-parser@6.1.2:
resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
engines: {node: '>=4'} engines: {node: '>=4'}
@@ -2557,6 +2569,11 @@ snapshots:
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
'@tailwindcss/typography@0.5.19(tailwindcss@3.4.19)':
dependencies:
postcss-selector-parser: 6.0.10
tailwindcss: 3.4.19
'@tybys/wasm-util@0.10.1': '@tybys/wasm-util@0.10.1':
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
@@ -4061,6 +4078,11 @@ snapshots:
postcss: 8.5.6 postcss: 8.5.6
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
postcss-selector-parser@6.0.10:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
postcss-selector-parser@6.1.2: postcss-selector-parser@6.1.2:
dependencies: dependencies:
cssesc: 3.0.0 cssesc: 3.0.0