mirror of
https://github.com/Such-Software/such.software.git
synced 2026-10-17 05:32:05 +02:00
fix(lint): make the linter run again, and finish the em dash sweep
The linter had two faults stacked on top of each other. First, the global `ajv: ^8.17.1` override starved @eslint/eslintrc, which needs ajv 6 and passes it `missingRefs`; ajv 8 rejects that option, so ESLint died before loading a single rule. Scoped overrides give eslint and @eslint/eslintrc ajv 6.12.6 and leave the audit override in place everywhere else. Second, underneath that, `extends: ["@repo/config/eslint-preset.js"]` could never resolve: ESLint's shareable-config naming convention rewrites it to `@repo/eslint-config-config/...`. require.resolve hands ESLint a real path. With the linter running it reported 35 react/no-unescaped-entities errors across 7 files. Those are escaped rather than silenced, using ESLint's own coordinates so only flagged text nodes were touched. Lint now exits 0. Two @next/next/no-img-element warnings remain on the splash logos, which are deliberate: theme-paired and fetchPriority="high". Em dashes are also gone from the six blog posts and the README (105 occurrences), same rules as the site copy: colons for definition labels, commas for appositives, semicolons for independent clauses.
This commit is contained in:
@@ -131,7 +131,7 @@ export default function AboutPage() {
|
||||
<div id="contact">
|
||||
<h2 className="text-3xl font-bold mb-3 tracking-tight">Get in Touch</h2>
|
||||
<p className="text-muted-foreground text-lg mb-12 max-w-2xl">
|
||||
Have a project in mind? We'd love to hear about it.
|
||||
Have a project in mind? We'd love to hear about it.
|
||||
</p>
|
||||
<ContactForm />
|
||||
</div>
|
||||
|
||||
@@ -71,7 +71,7 @@ export default function Home() {
|
||||
<div id="contact" className="w-full max-w-6xl text-left mb-12 section-container border-l-4 border-l-cyan-500">
|
||||
<h2 className="text-3xl font-bold mb-3 tracking-tight text-foreground">Start a Project</h2>
|
||||
<p className="text-muted-foreground text-lg max-w-3xl leading-relaxed">
|
||||
Have a project in mind? Let's talk about what you need and how we can help.
|
||||
Have a project in mind? Let's talk about what you need and how we can help.
|
||||
</p>
|
||||
</div>
|
||||
<ContactForm />
|
||||
|
||||
@@ -92,7 +92,7 @@ export default function SmirkWalletPage() {
|
||||
<Card className="glass-card border-amber-500/20">
|
||||
<h3 className="text-xl font-bold mb-3">Encrypted Tips</h3>
|
||||
<p className="text-muted-foreground">
|
||||
Tips are encrypted with the recipient's public key. Only they can claim.
|
||||
Tips are encrypted with the recipient's public key. Only they can claim.
|
||||
Senders can reclaim unclaimed tips (no lost funds).
|
||||
</p>
|
||||
</Card>
|
||||
|
||||
@@ -26,7 +26,7 @@ export default function SuchoicePrivacyPage() {
|
||||
<section>
|
||||
<h2 className="text-2xl font-semibold mt-8 mb-4">1. Introduction</h2>
|
||||
<p>
|
||||
Such Software ("we", "our", or "us") operates the Suchoice mobile and web application (the "App").
|
||||
Such Software ("we", "our", or "us") operates the Suchoice mobile and web application (the "App").
|
||||
This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our App.
|
||||
</p>
|
||||
</section>
|
||||
@@ -35,7 +35,7 @@ export default function SuchoicePrivacyPage() {
|
||||
<h2 className="text-2xl font-semibold mt-8 mb-4">2. Information We Collect</h2>
|
||||
<h3 className="text-xl font-medium mt-4 mb-2">Camera and Photos</h3>
|
||||
<p>
|
||||
Our App requires access to your device's camera and photo library to function.
|
||||
Our App requires access to your device's camera and photo library to function.
|
||||
When you take a picture of a menu or select one from your gallery, the image is sent to our secure backend servers for processing by AI to extract menu items.
|
||||
<strong>We do not store these images.</strong> They are processed in memory and immediately discarded after the text is extracted.
|
||||
</p>
|
||||
@@ -45,7 +45,7 @@ export default function SuchoicePrivacyPage() {
|
||||
We use Google AdMob to display advertisements in the App. AdMob may collect and use data, including device identifiers (such as the Android Advertising ID or iOS IDFA), IP addresses, and usage data, to provide personalized advertising.
|
||||
</p>
|
||||
<p>
|
||||
You can learn more about how Google uses information from sites or apps that use their services by visiting: <a href="https://policies.google.com/technologies/partner-sites" target="_blank" rel="noopener noreferrer" className="text-blue-600 hover:underline">Google's Privacy & Terms</a>.
|
||||
You can learn more about how Google uses information from sites or apps that use their services by visiting: <a href="https://policies.google.com/technologies/partner-sites" target="_blank" rel="noopener noreferrer" className="text-blue-600 hover:underline">Google's Privacy & Terms</a>.
|
||||
</p>
|
||||
|
||||
<h3 className="text-xl font-medium mt-4 mb-2">In-App Purchases and Subscriptions</h3>
|
||||
@@ -79,7 +79,7 @@ export default function SuchoicePrivacyPage() {
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className="text-2xl font-semibold mt-8 mb-4">5. Children's Privacy</h2>
|
||||
<h2 className="text-2xl font-semibold mt-8 mb-4">5. Children's Privacy</h2>
|
||||
<p>
|
||||
These Services do not address anyone under the age of 13. We do not knowingly collect personally identifiable information from children under 13. In the case we discover that a child under 13 has provided us with personal information, we immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us so that we will be able to do necessary actions.
|
||||
</p>
|
||||
|
||||
@@ -26,7 +26,7 @@ export default function VeganIqPrivacyPage() {
|
||||
<section>
|
||||
<h2 className="text-2xl font-semibold mt-8 mb-4">1. Introduction</h2>
|
||||
<p>
|
||||
Such Software LLC ("we", "our", or "us") operates the Vegan IQ mobile application (the "App").
|
||||
Such Software LLC ("we", "our", or "us") operates the Vegan IQ mobile application (the "App").
|
||||
This Privacy Policy explains what information the App collects, how we use it, and the choices you have.
|
||||
We collect as little as possible and we never sell your data.
|
||||
</p>
|
||||
@@ -72,7 +72,7 @@ export default function VeganIqPrivacyPage() {
|
||||
<p>
|
||||
<strong>The App does not currently display advertisements</strong> and does not use advertising identifiers such as the
|
||||
Android Advertising ID or iOS IDFA. If we introduce ads in the future, we will update this policy and, in regions that
|
||||
require it, ask for your consent through Google's User Messaging Platform before any ads are shown.
|
||||
require it, ask for your consent through Google's User Messaging Platform before any ads are shown.
|
||||
</p>
|
||||
</section>
|
||||
|
||||
@@ -102,7 +102,7 @@ export default function VeganIqPrivacyPage() {
|
||||
<ul className="list-disc pl-6 space-y-2">
|
||||
<li>Turn notifications on or off at any time in your device settings.</li>
|
||||
<li>Leave the leaderboard to remove your public display name.</li>
|
||||
<li>Reset the App's data from within the App, or delete the App to remove local data.</li>
|
||||
<li>Reset the App's data from within the App, or delete the App to remove local data.</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
@@ -120,7 +120,7 @@ export default function VeganIqPrivacyPage() {
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2 className="text-2xl font-semibold mt-8 mb-4">7. Children's Privacy</h2>
|
||||
<h2 className="text-2xl font-semibold mt-8 mb-4">7. Children's Privacy</h2>
|
||||
<p>
|
||||
These Services do not address anyone under the age of 13. We do not knowingly collect personally identifiable information from children under 13. In the case we discover that a child under 13 has provided us with personal information, we immediately delete this from our servers. If you are a parent or guardian and you are aware that your child has provided us with personal information, please contact us so that we will be able to do necessary actions.
|
||||
</p>
|
||||
|
||||
@@ -114,7 +114,7 @@ export default function WebshopsPage() {
|
||||
We run a single Medusa v2 commerce platform that spins up a completely distinct,
|
||||
fully-branded storefront for every tenant, your colors, your typography, your layout,
|
||||
your dark mode. One battle-tested engine underneath; a store that looks and feels like
|
||||
nobody else's on top. No large setup fee, no monthly retainer: we build, host, and
|
||||
nobody else's on top. No large setup fee, no monthly retainer: we build, host, and
|
||||
maintain it on revenue share, so we only win when you make sales.
|
||||
</p>
|
||||
|
||||
@@ -140,7 +140,7 @@ export default function WebshopsPage() {
|
||||
Per-tenant theming is the whole point
|
||||
</h2>
|
||||
<p className="text-muted-foreground leading-relaxed max-w-3xl mb-4">
|
||||
Most "multi-store" platforms give every shop the same skeleton with a swapped logo.
|
||||
Most "multi-store" platforms give every shop the same skeleton with a swapped logo.
|
||||
Ours derives an entire visual system per tenant from your theme configuration:
|
||||
palette, fonts, spacing, component styling, and a matched dark mode across both the
|
||||
storefront and checkout. Two shops on the same backend can look nothing alike.
|
||||
@@ -171,7 +171,7 @@ export default function WebshopsPage() {
|
||||
</h2>
|
||||
<p className="text-muted-foreground mb-8 max-w-3xl">
|
||||
Theming runs all the way down: product pages, catalog grids, cart, and checkout each
|
||||
carry the shop's palette, type, and layout. And the platform is more than a catalog,
|
||||
carry the shop's palette, type, and layout. And the platform is more than a catalog,
|
||||
service shops get a real{" "}
|
||||
<span className="font-medium text-foreground">booking calendar</span>: yoga classes
|
||||
and coaching calls are scheduled right on the product page, themed to match. Here is a
|
||||
@@ -183,7 +183,7 @@ export default function WebshopsPage() {
|
||||
{/* Feature grid, the real platform capabilities */}
|
||||
<section aria-labelledby="features-heading" className="mb-16">
|
||||
<h2 id="features-heading" className="text-2xl md:text-3xl font-bold mb-8">
|
||||
What's built in
|
||||
What's built in
|
||||
</h2>
|
||||
<div className="grid md:grid-cols-2 gap-6">
|
||||
{features.map((f) => (
|
||||
|
||||
@@ -35,10 +35,10 @@ export const FounderSignature = () => {
|
||||
|
||||
<div className="prose dark:prose-invert max-w-none">
|
||||
<p className="text-muted-foreground leading-relaxed italic border-l-4 border-primary/20 pl-6 text-lg">
|
||||
"Accessibility isn't bolted on. It's there from the first line of code."
|
||||
"Accessibility isn't bolted on. It's there from the first line of code."
|
||||
</p>
|
||||
<p className="text-muted-foreground leading-relaxed mt-6">
|
||||
John Winter Murphy holds a <span className="text-foreground font-semibold">PhD in Materials Engineering from UT-Dallas (2014)</span>, focused on semiconductor devices for radiation detection. From <span className="text-foreground font-semibold">2015 to 2021 he was a scientist at Lawrence Livermore National Laboratory</span>, developing radiation detector systems and the lab's radioisotope battery program. He brings that same lab-bench rigor to software, and an insistence that it stay <span className="text-foreground font-semibold">accessible to everyone</span>, with front-ends engineered and audited against WCAG 2.2 AA.
|
||||
John Winter Murphy holds a <span className="text-foreground font-semibold">PhD in Materials Engineering from UT-Dallas (2014)</span>, focused on semiconductor devices for radiation detection. From <span className="text-foreground font-semibold">2015 to 2021 he was a scientist at Lawrence Livermore National Laboratory</span>, developing radiation detector systems and the lab's radioisotope battery program. He brings that same lab-bench rigor to software, and an insistence that it stay <span className="text-foreground font-semibold">accessible to everyone</span>, with front-ends engineered and audited against WCAG 2.2 AA.
|
||||
</p>
|
||||
<p className="text-muted-foreground leading-relaxed mt-4">
|
||||
He previously co-founded <span className="text-foreground font-semibold">Patrn LLC</span> (<a href="https://art101.io" target="_blank" rel="noopener noreferrer" className="text-foreground font-semibold underline decoration-primary/50 hover:text-primary transition-colors">art101.io</a>), a series of art-history NFT drops, and <span className="text-foreground font-semibold">Tabby Labs</span>, which was developing a cryptocurrency wallet with an interactive world inside.
|
||||
|
||||
Reference in New Issue
Block a user