remove community

This commit is contained in:
wass08
2026-03-13 09:07:46 +01:00
parent 3eeba322a8
commit f2501be2bf
693 changed files with 8264 additions and 35562 deletions
+3
View File
@@ -0,0 +1,3 @@
export function GET() {
return Response.json({ status: 'ok', app: 'editor', timestamp: new Date().toISOString() })
}
+147 -40
View File
@@ -5,9 +5,15 @@
@custom-variant dark (&:is(.dark *));
@theme {
--font-sans: var(--font-barlow), var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
--font-mono: var(--font-geist-mono), ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
--font-barlow: var(--font-barlow), var(--font-geist-sans), ui-sans-serif, system-ui, sans-serif;
--font-sans:
var(--font-barlow), var(--font-geist-sans), ui-sans-serif, system-ui,
sans-serif;
--font-mono:
var(--font-geist-mono), ui-monospace, SFMono-Regular, Menlo, Monaco,
Consolas, monospace;
--font-barlow:
var(--font-barlow), var(--font-geist-sans), ui-sans-serif, system-ui,
sans-serif;
}
@theme inline {
@@ -98,7 +104,9 @@
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.269 0 0);
--muted-foreground: oklch(0.708 0 0);
--accent: oklch(0.235 0 0); /* slightly lighter than background (0.205) but darker than previous (0.269) */
--accent: oklch(
0.235 0 0
); /* slightly lighter than background (0.205) but darker than previous (0.269) */
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.704 0.191 22.216);
--border: oklch(1 0 0 / 10%);
@@ -167,90 +175,189 @@
.pascal-loader-1 {
width: 45px;
aspect-ratio: 1;
--c:no-repeat linear-gradient(currentColor 0 0);
--c: no-repeat linear-gradient(currentColor 0 0);
background: var(--c), var(--c), var(--c);
animation:
animation:
pascal-l1-1 1s infinite,
pascal-l1-2 1s infinite;
}
@keyframes pascal-l1-1 {
0%,100% {background-size:20% 100%}
33%,66% {background-size:20% 20%}
0%,
100% {
background-size: 20% 100%;
}
33%,
66% {
background-size: 20% 20%;
}
}
@keyframes pascal-l1-2 {
0%,33% {background-position: 0 0,50% 50%,100% 100%}
66%,100% {background-position: 100% 0,50% 50%,0 100%}
0%,
33% {
background-position:
0 0,
50% 50%,
100% 100%;
}
66%,
100% {
background-position:
100% 0,
50% 50%,
0 100%;
}
}
.pascal-loader-2 {
width: 45px;
aspect-ratio: .75;
aspect-ratio: 0.75;
--c: no-repeat linear-gradient(currentColor 0 0);
background:
var(--c) 0% 50%,
var(--c) 50% 50%,
background:
var(--c) 0% 50%,
var(--c) 50% 50%,
var(--c) 100% 50%;
background-size: 20% 50%;
animation: pascal-l2 1s infinite linear;
}
@keyframes pascal-l2 {
20% {background-position: 0% 0% ,50% 50% ,100% 50% }
40% {background-position: 0% 100%,50% 0% ,100% 50% }
60% {background-position: 0% 50% ,50% 100%,100% 0% }
80% {background-position: 0% 50% ,50% 50% ,100% 100%}
20% {
background-position:
0% 0%,
50% 50%,
100% 50%;
}
40% {
background-position:
0% 100%,
50% 0%,
100% 50%;
}
60% {
background-position:
0% 50%,
50% 100%,
100% 0%;
}
80% {
background-position:
0% 50%,
50% 50%,
100% 100%;
}
}
.pascal-loader-3 {
width: 45px;
aspect-ratio: .75;
--c:no-repeat linear-gradient(currentColor 0 0);
background:
var(--c) 0% 100%,
var(--c) 50% 100%,
aspect-ratio: 0.75;
--c: no-repeat linear-gradient(currentColor 0 0);
background:
var(--c) 0% 100%,
var(--c) 50% 100%,
var(--c) 100% 100%;
background-size: 20% 65%;
animation: pascal-l3 1s infinite linear;
}
@keyframes pascal-l3 {
16.67% {background-position: 0% 0% ,50% 100%,100% 100%}
33.33% {background-position: 0% 0% ,50% 0% ,100% 100%}
50% {background-position: 0% 0% ,50% 0% ,100% 0% }
66.67% {background-position: 0% 100%,50% 0% ,100% 0% }
83.33% {background-position: 0% 100%,50% 100%,100% 0% }
16.67% {
background-position:
0% 0%,
50% 100%,
100% 100%;
}
33.33% {
background-position:
0% 0%,
50% 0%,
100% 100%;
}
50% {
background-position:
0% 0%,
50% 0%,
100% 0%;
}
66.67% {
background-position:
0% 100%,
50% 0%,
100% 0%;
}
83.33% {
background-position:
0% 100%,
50% 100%,
100% 0%;
}
}
.pascal-loader-4 {
width: 45px;
aspect-ratio: 1;
--c:no-repeat linear-gradient(currentColor 0 0);
--c: no-repeat linear-gradient(currentColor 0 0);
background: var(--c), var(--c), var(--c);
animation:
animation:
pascal-l4-1 1s infinite,
pascal-l4-2 1s infinite;
}
@keyframes pascal-l4-1 {
0%,100% {background-size:20% 100%}
33%,66% {background-size:20% 40%}
0%,
100% {
background-size: 20% 100%;
}
33%,
66% {
background-size: 20% 40%;
}
}
@keyframes pascal-l4-2 {
0%,33% {background-position: 0 0,50% 100%,100% 100%}
66%,100% {background-position: 100% 0,0 100%,50% 100%}
0%,
33% {
background-position:
0 0,
50% 100%,
100% 100%;
}
66%,
100% {
background-position:
100% 0,
0 100%,
50% 100%;
}
}
.pascal-loader-5 {
width: 45px;
aspect-ratio: 1;
--c:no-repeat linear-gradient(currentColor 0 0);
--c: no-repeat linear-gradient(currentColor 0 0);
background: var(--c), var(--c), var(--c);
animation:
animation:
pascal-l5-1 1s infinite,
pascal-l5-2 1s infinite;
}
@keyframes pascal-l5-1 {
0%,100% {background-size:20% 100%}
33%,66% {background-size:20% 40%}
0%,
100% {
background-size: 20% 100%;
}
33%,
66% {
background-size: 20% 40%;
}
}
@keyframes pascal-l5-2 {
0%,33% {background-position: 0 0 ,50% 100%,100% 0}
66%,100% {background-position: 0 100%,50% 0 ,100% 100%}
0%,
33% {
background-position:
0 0,
50% 100%,
100% 0;
}
66%,
100% {
background-position:
0 100%,
50% 0,
100% 100%;
}
}
+6 -8
View File
@@ -1,7 +1,7 @@
import type { Metadata } from 'next'
import Script from 'next/script'
import localFont from 'next/font/local'
import { Barlow } from 'next/font/google'
import localFont from 'next/font/local'
import Script from 'next/script'
import './globals.css'
const geistSans = localFont({
@@ -31,26 +31,24 @@ export default function RootLayout({
children: React.ReactNode
}>) {
return (
<html lang="en" className={`${geistSans.variable} ${geistMono.variable} ${barlow.variable}`}>
<html className={`${geistSans.variable} ${geistMono.variable} ${barlow.variable}`} lang="en">
<head>
{process.env.NODE_ENV === 'development' && (
<>
<Script
src="//unpkg.com/react-scan/dist/auto.global.js"
crossOrigin="anonymous"
src="//unpkg.com/react-scan/dist/auto.global.js"
strategy="beforeInteractive"
/>
<Script
src="//unpkg.com/react-grab/dist/index.global.js"
crossOrigin="anonymous"
src="//unpkg.com/react-grab/dist/index.global.js"
strategy="beforeInteractive"
/>
</>
)}
</head>
<body className="font-sans">
{children}
</body>
<body className="font-sans">{children}</body>
</html>
)
}
+2
View File
@@ -1,3 +1,5 @@
'use client'
import { Editor } from '@pascal-app/editor'
export default function Home() {
+65 -65
View File
@@ -9,100 +9,101 @@ export const metadata: Metadata = {
export default function PrivacyPage() {
return (
<div className="min-h-screen bg-background">
<header className="border-b border-border bg-background/95 backdrop-blur sticky top-0 z-10">
<header className="sticky top-0 z-10 border-border border-b bg-background/95 backdrop-blur">
<div className="container mx-auto px-6 py-4">
<nav className="flex items-center gap-4 text-sm">
<Link
href="/"
className="text-muted-foreground transition-colors hover:text-foreground"
href="/"
>
Home
</Link>
<span className="text-muted-foreground">/</span>
<Link
href="/terms"
className="text-muted-foreground transition-colors hover:text-foreground"
href="/terms"
>
Terms of Service
</Link>
<span className="text-muted-foreground">|</span>
<span className="text-foreground font-medium">Privacy Policy</span>
<span className="font-medium text-foreground">Privacy Policy</span>
</nav>
</div>
</header>
<main className="container mx-auto max-w-3xl px-6 py-12">
<article className="prose prose-neutral dark:prose-invert max-w-none">
<h1 className="text-3xl font-bold mb-2">Privacy Policy</h1>
<p className="text-muted-foreground text-sm mb-8">
Effective Date: February 20, 2026
</p>
<h1 className="mb-2 font-bold text-3xl">Privacy Policy</h1>
<p className="mb-8 text-muted-foreground text-sm">Effective Date: February 20, 2026</p>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">1. Introduction</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">1. Introduction</h2>
<p className="text-foreground/90 leading-relaxed">
Pascal Group Inc. (&quot;we,&quot; &quot;us,&quot; or &quot;our&quot;) operates the Pascal Editor and
Platform at pascal.app. This Privacy Policy explains how we collect, use, and
protect your information when you use our services.
Pascal Group Inc. (&quot;we,&quot; &quot;us,&quot; or &quot;our&quot;) operates the
Pascal Editor and Platform at pascal.app. This Privacy Policy explains how we collect,
use, and protect your information when you use our services.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">2. Information We Collect</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">2. Information We Collect</h2>
<h3 className="text-lg font-medium mt-4">Account Information</h3>
<h3 className="mt-4 font-medium text-lg">Account Information</h3>
<p className="text-foreground/90 leading-relaxed">
When you create an account, we collect:
</p>
<ul className="list-disc pl-6 space-y-2 text-foreground/90">
<ul className="list-disc space-y-2 pl-6 text-foreground/90">
<li>Email address</li>
<li>Name</li>
<li>Profile picture/avatar</li>
<li>OAuth provider data (from Google when you sign in with Google)</li>
</ul>
<h3 className="text-lg font-medium mt-4">Project Data</h3>
<h3 className="mt-4 font-medium text-lg">Project Data</h3>
<p className="text-foreground/90 leading-relaxed">
When you use the Platform, we store your projects, including 3D building designs,
floor plans, and associated metadata.
</p>
<h3 className="text-lg font-medium mt-4">Usage Analytics</h3>
<h3 className="mt-4 font-medium text-lg">Usage Analytics</h3>
<p className="text-foreground/90 leading-relaxed">
We use Vercel Analytics and Speed Insights to collect anonymized usage data,
including page views, performance metrics, and general usage patterns. This helps
us improve the Platform.
We use Vercel Analytics and Speed Insights to collect anonymized usage data, including
page views, performance metrics, and general usage patterns. This helps us improve the
Platform.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">3. How We Use Your Information</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">3. How We Use Your Information</h2>
<p className="text-foreground/90 leading-relaxed">We use your information to:</p>
<ul className="list-disc pl-6 space-y-2 text-foreground/90">
<ul className="list-disc space-y-2 pl-6 text-foreground/90">
<li>Provide and maintain your account</li>
<li>Store and sync your projects across devices</li>
<li>Improve our services based on usage patterns</li>
<li>Send optional email notifications about new features and updates (you can opt out in settings)</li>
<li>
Send optional email notifications about new features and updates (you can opt out in
settings)
</li>
<li>Respond to support requests</li>
<li>Ensure platform security and prevent abuse</li>
</ul>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">4. Data Storage</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">4. Data Storage</h2>
<p className="text-foreground/90 leading-relaxed">
Your data is stored using Supabase (PostgreSQL database) on secure cloud
infrastructure. We implement appropriate technical and organizational measures
to protect your data.
infrastructure. We implement appropriate technical and organizational measures to
protect your data.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">5. Third-Party Services</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">5. Third-Party Services</h2>
<p className="text-foreground/90 leading-relaxed">
We use the following third-party services to operate the Platform:
</p>
<ul className="list-disc pl-6 space-y-2 text-foreground/90">
<ul className="list-disc space-y-2 pl-6 text-foreground/90">
<li>
<strong>Google</strong> - OAuth authentication for sign-in
</li>
@@ -113,44 +114,44 @@ export default function PrivacyPage() {
<strong>Supabase</strong> - Database hosting and authentication infrastructure
</li>
</ul>
<p className="text-foreground/90 leading-relaxed mt-4">
Each of these services has their own privacy policies governing their handling
of your data.
<p className="mt-4 text-foreground/90 leading-relaxed">
Each of these services has their own privacy policies governing their handling of your
data.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">6. Cookies</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">6. Cookies</h2>
<p className="text-foreground/90 leading-relaxed">
We use minimal cookies necessary for the Platform to function:
</p>
<ul className="list-disc pl-6 space-y-2 text-foreground/90">
<ul className="list-disc space-y-2 pl-6 text-foreground/90">
<li>
<strong>Session cookies</strong> - Essential for authentication and keeping you
signed in
</li>
<li>
<strong>Analytics cookies</strong> - Used by Vercel Analytics to collect
anonymized usage data
<strong>Analytics cookies</strong> - Used by Vercel Analytics to collect anonymized
usage data
</li>
</ul>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">7. Your Rights</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">7. Your Rights</h2>
<p className="text-foreground/90 leading-relaxed">You have the right to:</p>
<ul className="list-disc pl-6 space-y-2 text-foreground/90">
<ul className="list-disc space-y-2 pl-6 text-foreground/90">
<li>Access the personal data we hold about you</li>
<li>Request correction of inaccurate data</li>
<li>Request deletion of your data</li>
<li>Export your project data</li>
<li>Opt out of marketing communications</li>
</ul>
<p className="text-foreground/90 leading-relaxed mt-4">
<p className="mt-4 text-foreground/90 leading-relaxed">
To exercise any of these rights, please contact us at{' '}
<a
href="mailto:support@pascal.app"
className="text-foreground underline hover:text-foreground/80"
href="mailto:support@pascal.app"
>
support@pascal.app
</a>
@@ -158,42 +159,41 @@ export default function PrivacyPage() {
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">8. Data Retention</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">8. Data Retention</h2>
<p className="text-foreground/90 leading-relaxed">
We retain your data for as long as your account is active. If you delete your
account, we will delete your personal data and project data within 30 days,
except where we are required by law to retain certain information.
We retain your data for as long as your account is active. If you delete your account,
we will delete your personal data and project data within 30 days, except where we are
required by law to retain certain information.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">9. Children&apos;s Privacy</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">9. Children&apos;s Privacy</h2>
<p className="text-foreground/90 leading-relaxed">
The Platform is not intended for children under 13. We do not knowingly collect
personal information from children under 13. If you believe we have collected
such information, please contact us immediately.
personal information from children under 13. If you believe we have collected such
information, please contact us immediately.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">10. Changes to This Policy</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">10. Changes to This Policy</h2>
<p className="text-foreground/90 leading-relaxed">
We may update this Privacy Policy from time to time. We will notify you of
material changes by posting the updated policy on the Platform. Your continued
use of the Platform after changes are posted constitutes your acceptance of the
revised policy.
We may update this Privacy Policy from time to time. We will notify you of material
changes by posting the updated policy on the Platform. Your continued use of the
Platform after changes are posted constitutes your acceptance of the revised policy.
</p>
</section>
<section className="space-y-4">
<h2 className="text-xl font-semibold">11. Contact Us</h2>
<h2 className="font-semibold text-xl">11. Contact Us</h2>
<p className="text-foreground/90 leading-relaxed">
If you have questions about this Privacy Policy or how we handle your data,
please contact us at{' '}
If you have questions about this Privacy Policy or how we handle your data, please
contact us at{' '}
<a
href="mailto:support@pascal.app"
className="text-foreground underline hover:text-foreground/80"
href="mailto:support@pascal.app"
>
support@pascal.app
</a>
+71 -68
View File
@@ -9,21 +9,21 @@ export const metadata: Metadata = {
export default function TermsPage() {
return (
<div className="min-h-screen bg-background">
<header className="border-b border-border bg-background/95 backdrop-blur sticky top-0 z-10">
<header className="sticky top-0 z-10 border-border border-b bg-background/95 backdrop-blur">
<div className="container mx-auto px-6 py-4">
<nav className="flex items-center gap-4 text-sm">
<Link
href="/"
className="text-muted-foreground transition-colors hover:text-foreground"
href="/"
>
Home
</Link>
<span className="text-muted-foreground">/</span>
<span className="text-foreground font-medium">Terms of Service</span>
<span className="font-medium text-foreground">Terms of Service</span>
<span className="text-muted-foreground">|</span>
<Link
href="/privacy"
className="text-muted-foreground transition-colors hover:text-foreground"
href="/privacy"
>
Privacy Policy
</Link>
@@ -33,26 +33,25 @@ export default function TermsPage() {
<main className="container mx-auto max-w-3xl px-6 py-12">
<article className="prose prose-neutral dark:prose-invert max-w-none">
<h1 className="text-3xl font-bold mb-2">Terms of Service</h1>
<p className="text-muted-foreground text-sm mb-8">
Effective Date: February 20, 2026
</p>
<h1 className="mb-2 font-bold text-3xl">Terms of Service</h1>
<p className="mb-8 text-muted-foreground text-sm">Effective Date: February 20, 2026</p>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">1. Introduction</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">1. Introduction</h2>
<p className="text-foreground/90 leading-relaxed">
Welcome to Pascal Editor (&quot;Editor&quot;) and the Pascal platform at pascal.app
(&quot;Platform&quot;), operated by Pascal Group Inc. (&quot;we,&quot; &quot;us,&quot; or &quot;our&quot;).
By accessing or using our services, you agree to these Terms of Service.
(&quot;Platform&quot;), operated by Pascal Group Inc. (&quot;we,&quot; &quot;us,&quot;
or &quot;our&quot;). By accessing or using our services, you agree to these Terms of
Service.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">2. The Editor and Platform</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">2. The Editor and Platform</h2>
<p className="text-foreground/90 leading-relaxed">
The Pascal Editor is open-source software released under the MIT License.
You may use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Editor software in accordance with the MIT License terms.
The Pascal Editor is open-source software released under the MIT License. You may use,
copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Editor
software in accordance with the MIT License terms.
</p>
<p className="text-foreground/90 leading-relaxed">
The Pascal platform (pascal.app) and its associated services, including user accounts,
@@ -61,22 +60,26 @@ export default function TermsPage() {
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">3. Accounts and Authentication</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">3. Accounts and Authentication</h2>
<p className="text-foreground/90 leading-relaxed">
To use certain features of the Platform, you must create an account. We use
Google OAuth and magic link email authentication through Supabase. You are
responsible for maintaining the security of your account credentials and for
all activities that occur under your account.
To use certain features of the Platform, you must create an account. We use Google
OAuth and magic link email authentication through Supabase. You are responsible for
maintaining the security of your account credentials and for all activities that occur
under your account.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">4. Acceptable Use</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">4. Acceptable Use</h2>
<p className="text-foreground/90 leading-relaxed">You agree not to:</p>
<ul className="list-disc pl-6 space-y-2 text-foreground/90">
<li>Use the Platform for any unlawful purpose or in violation of any applicable laws</li>
<li>Upload, share, or distribute content that infringes intellectual property rights</li>
<ul className="list-disc space-y-2 pl-6 text-foreground/90">
<li>
Use the Platform for any unlawful purpose or in violation of any applicable laws
</li>
<li>
Upload, share, or distribute content that infringes intellectual property rights
</li>
<li>Attempt to gain unauthorized access to the Platform or its systems</li>
<li>Interfere with or disrupt the Platform&apos;s infrastructure</li>
<li>Upload malicious code, viruses, or harmful content</li>
@@ -85,39 +88,39 @@ export default function TermsPage() {
</ul>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">5. Your Content and Intellectual Property</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">5. Your Content and Intellectual Property</h2>
<p className="text-foreground/90 leading-relaxed">
You retain full ownership of all content, projects, and data you create or upload
to the Platform (&quot;Your Content&quot;). By using the Platform, you grant us a limited
license to store, display, and transmit Your Content solely to provide our services
to you.
You retain full ownership of all content, projects, and data you create or upload to
the Platform (&quot;Your Content&quot;). By using the Platform, you grant us a limited
license to store, display, and transmit Your Content solely to provide our services to
you.
</p>
<p className="text-foreground/90 leading-relaxed">
We do not claim any ownership rights over Your Content. You may export or delete
Your Content at any time.
We do not claim any ownership rights over Your Content. You may export or delete Your
Content at any time.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">6. Platform Ownership</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">6. Platform Ownership</h2>
<p className="text-foreground/90 leading-relaxed">
The Platform, including its design, features, and proprietary code, is owned by
Pascal Group Inc. and protected by intellectual property laws. While the Editor
source code is open-source under the MIT License, the Platform services, branding,
and infrastructure remain our proprietary property.
The Platform, including its design, features, and proprietary code, is owned by Pascal
Group Inc. and protected by intellectual property laws. While the Editor source code
is open-source under the MIT License, the Platform services, branding, and
infrastructure remain our proprietary property.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">7. Account Termination</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">7. Account Termination</h2>
<p className="text-foreground/90 leading-relaxed">
We reserve the right to suspend or terminate your account if you violate these
Terms or engage in conduct that we determine is harmful to the Platform or other
users. You may also delete your account at any time by contacting us at{' '}
We reserve the right to suspend or terminate your account if you violate these Terms
or engage in conduct that we determine is harmful to the Platform or other users. You
may also delete your account at any time by contacting us at{' '}
<a
href="mailto:support@pascal.app"
className="text-foreground underline hover:text-foreground/80"
href="mailto:support@pascal.app"
>
support@pascal.app
</a>
@@ -125,45 +128,45 @@ export default function TermsPage() {
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">8. Disclaimer of Warranties</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">8. Disclaimer of Warranties</h2>
<p className="text-foreground/90 leading-relaxed">
THE PLATFORM IS PROVIDED &quot;AS IS&quot; AND &quot;AS AVAILABLE&quot; WITHOUT WARRANTIES OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO IMPLIED WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
THE PLATFORM IS PROVIDED &quot;AS IS&quot; AND &quot;AS AVAILABLE&quot; WITHOUT
WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
NON-INFRINGEMENT.
</p>
<p className="text-foreground/90 leading-relaxed">
We do not warrant that the Platform will be uninterrupted, error-free, or free
of harmful components.
We do not warrant that the Platform will be uninterrupted, error-free, or free of
harmful components.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">9. Limitation of Liability</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">9. Limitation of Liability</h2>
<p className="text-foreground/90 leading-relaxed">
TO THE MAXIMUM EXTENT PERMITTED BY LAW, PASCAL GROUP INC. SHALL NOT BE LIABLE
FOR ANY INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES,
INCLUDING LOSS OF DATA, PROFITS, OR GOODWILL, ARISING FROM YOUR USE OF THE
PLATFORM.
TO THE MAXIMUM EXTENT PERMITTED BY LAW, PASCAL GROUP INC. SHALL NOT BE LIABLE FOR ANY
INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, OR PUNITIVE DAMAGES, INCLUDING LOSS OF
DATA, PROFITS, OR GOODWILL, ARISING FROM YOUR USE OF THE PLATFORM.
</p>
</section>
<section className="space-y-4 mb-8">
<h2 className="text-xl font-semibold">10. Changes to Terms</h2>
<section className="mb-8 space-y-4">
<h2 className="font-semibold text-xl">10. Changes to Terms</h2>
<p className="text-foreground/90 leading-relaxed">
We may update these Terms from time to time. We will notify you of material
changes by posting the updated Terms on the Platform. Your continued use of the
Platform after changes are posted constitutes your acceptance of the revised Terms.
We may update these Terms from time to time. We will notify you of material changes by
posting the updated Terms on the Platform. Your continued use of the Platform after
changes are posted constitutes your acceptance of the revised Terms.
</p>
</section>
<section className="space-y-4">
<h2 className="text-xl font-semibold">11. Contact Us</h2>
<h2 className="font-semibold text-xl">11. Contact Us</h2>
<p className="text-foreground/90 leading-relaxed">
If you have questions about these Terms, please contact us at{' '}
<a
href="mailto:support@pascal.app"
className="text-foreground underline hover:text-foreground/80"
href="mailto:support@pascal.app"
>
support@pascal.app
</a>
-50
View File
@@ -1,50 +0,0 @@
export async function register() {
// Only run on the server
if (process.env.NEXT_RUNTIME === 'nodejs') {
const { createClient } = await import('@supabase/supabase-js')
const url = process.env.NEXT_PUBLIC_SUPABASE_URL
const key = process.env.SUPABASE_SERVICE_ROLE_KEY
if (!url || !key) return
const supabase = createClient(url, key)
const { data: buckets } = await supabase.storage.listBuckets()
const bucketNames = new Set(buckets?.map((b) => b.name))
if (!bucketNames.has('avatars')) {
await supabase.storage.createBucket('avatars', {
public: true,
fileSizeLimit: 5 * 1024 * 1024, // 5MB
allowedMimeTypes: ['image/png', 'image/jpeg', 'image/webp', 'image/gif'],
})
console.log('Created "avatars" storage bucket')
}
if (!bucketNames.has('project-thumbnails')) {
await supabase.storage.createBucket('project-thumbnails', {
public: true,
fileSizeLimit: 10 * 1024 * 1024, // 10MB (matches uploadProjectThumbnail validation)
allowedMimeTypes: ['image/png'],
})
console.log('Created "project-thumbnails" storage bucket')
}
if (!bucketNames.has('project-assets')) {
await supabase.storage.createBucket('project-assets', {
public: true,
fileSizeLimit: 500 * 1024 * 1024, // 500MB for GLB/GLTF scans
})
console.log('Created "project-assets" storage bucket')
}
if (!bucketNames.has('preset-thumbnails')) {
await supabase.storage.createBucket('preset-thumbnails', {
public: true,
fileSizeLimit: 5 * 1024 * 1024, // 5MB
allowedMimeTypes: ['image/png', 'image/jpeg', 'image/webp'],
})
console.log('Created "preset-thumbnails" storage bucket')
}
}
}
+1 -2
View File
@@ -6,8 +6,7 @@ export function cn(...inputs: ClassValue[]) {
}
export const isDevelopment =
process.env.NODE_ENV === 'development' ||
process.env.NEXT_PUBLIC_VERCEL_ENV === 'development'
process.env.NODE_ENV === 'development' || process.env.NEXT_PUBLIC_VERCEL_ENV === 'development'
export const isProduction =
process.env.NODE_ENV === 'production' || process.env.NEXT_PUBLIC_VERCEL_ENV === 'production'
+11
View File
@@ -1,7 +1,18 @@
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
typescript: {
ignoreBuildErrors: true,
},
transpilePackages: ['three', '@pascal-app/viewer', '@pascal-app/core', '@pascal-app/editor'],
turbopack: {
resolveAlias: {
react: './node_modules/react',
three: './node_modules/three',
'@react-three/fiber': './node_modules/@react-three/fiber',
'@react-three/drei': './node_modules/@react-three/drei',
},
},
experimental: {
serverActions: {
bodySizeLimit: '100mb',
+6 -4
View File
@@ -1,11 +1,11 @@
{
"name": "web",
"name": "editor",
"version": "0.1.0",
"type": "module",
"private": true,
"scripts": {
"dev": "set -a && . ../../.env 2>/dev/null; set +a; next dev",
"build": "next build",
"dev": "dotenv -e ./.env.local --override -- next dev --port 3002",
"build": "dotenv -e ./.env.local --override -- next build",
"start": "next start",
"lint": "biome lint",
"check-types": "next typegen && tsc --noEmit"
@@ -17,6 +17,8 @@
"@pascal-app/viewer": "*",
"@react-three/drei": "^10.7.7",
"@react-three/fiber": "^9.5.0",
"clsx": "^2.1.1",
"tailwind-merge": "^3.5.0",
"@tailwindcss/postcss": "^4.2.1",
"next": "16.1.6",
"postcss": "^8.5.6",
@@ -26,7 +28,7 @@
"three": "^0.183.1"
},
"devDependencies": {
"@repo/typescript-config": "*",
"@pascal/typescript-config": "*",
"@types/howler": "^2.2.12",
"@types/node": "^22.19.12",
"@types/react": "19.2.2",
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,5 +1,5 @@
{
"extends": "@repo/typescript-config/nextjs.json",
"extends": "@pascal/typescript-config/nextjs.json",
"compilerOptions": {
"plugins": [
{