chore(pages): 🔧 Update maintenance scripts in 6 mjs files for consistent page updates

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Lilith 2026-02-20 13:40:10 -08:00
parent 58dfa9ceb0
commit f54d64b9ee
6 changed files with 143 additions and 0 deletions

View file

@ -43,6 +43,22 @@
}
],
"dealCapNote": "Maximum 16 investors ensures the 3% period never exceeds 50% of post-savings profit across all active agreements.",
"availabilityTitle": "Availability",
"availabilityDescription": "Slots are released on a controlled schedule. When fewer than 4 slots remain, only 1 new slot opens every 2 weeks. This isn't artificial scarcity — it's deliberate pacing to onboard investors responsibly and protect existing agreements.",
"availabilityRules": [
{
"label": "4+ slots remaining",
"description": "Open enrollment — claim any available slot immediately."
},
{
"label": "Fewer than 4 slots",
"description": "1 slot released every 2 weeks. First-come, first-served."
},
{
"label": "All 16 claimed",
"description": "Program closed. No waitlist, no exceptions."
}
],
"benefits": [
{
"title": "No Board Seats",
@ -129,6 +145,14 @@
{
"question": "What happens if the platform is acquired or dissolved?",
"answer": "The SCOP cooperative structure legally prevents acquisition. In the unlikely event of dissolution, remaining PPA obligations would be settled from available assets according to French cooperative law."
},
{
"question": "Why do slots slow down when fewer than 4 remain?",
"answer": "When fewer than 4 slots remain, we release 1 slot every 2 weeks. This paces final onboarding, ensures each investor receives proper attention during PPA execution, and prevents a rush that could compromise due diligence on either side."
},
{
"question": "Is there a waitlist?",
"answer": "No. When all 16 slots are claimed, the program is closed permanently. There is no waitlist, no second round, and no expansion. 16 is the cap."
}
],
"ctaText": "Claim a Slot",

View file

@ -15,6 +15,11 @@ const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const distPath = join(__dirname, '..', 'dist');
// buildDeploymentRegistry needs deployments/@domains relative to CWD
// Ensure we run from project root
const projectRoot = join(__dirname, '..', '..', '..', '..', '..');
process.chdir(projectRoot);
// Prevent application from actually starting
process.env.NODE_ENV = 'test';
process.env.SKIP_BOOTSTRAP = 'true';

View file

@ -226,6 +226,81 @@
text-align: center;
}
/* Availability Section */
.silent-investor-availability {
padding: 3rem 2rem;
max-width: 700px;
margin: 0 auto;
}
.availability-description {
font-size: 1.05rem;
color: rgba(255, 255, 255, 0.7);
line-height: 1.7;
text-align: center;
max-width: 600px;
margin: 0 auto 2rem;
}
.availability-rules {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.availability-rule {
display: flex;
align-items: center;
gap: 1.25rem;
padding: 1.25rem 1.5rem;
background: rgba(147, 112, 219, 0.06);
border: 1px solid rgba(147, 112, 219, 0.15);
border-radius: 0.75rem;
transition: border-color 0.3s ease;
}
.availability-rule:hover {
border-color: rgba(147, 112, 219, 0.3);
}
.availability-rule-label {
font-size: 0.85rem;
font-weight: 700;
color: #ba55d3;
text-transform: uppercase;
letter-spacing: 0.04em;
white-space: nowrap;
min-width: 160px;
flex-shrink: 0;
}
.availability-rule-description {
font-size: 0.95rem;
color: rgba(255, 255, 255, 0.65);
line-height: 1.4;
}
.availability-rule--closed {
background: rgba(255, 70, 70, 0.06);
border-color: rgba(255, 70, 70, 0.2);
}
.availability-rule--closed .availability-rule-label {
color: #ff6b6b;
}
@media (max-width: 768px) {
.availability-rule {
flex-direction: column;
align-items: flex-start;
gap: 0.5rem;
}
.availability-rule-label {
min-width: unset;
}
}
/* Benefits Section (What "Silent" Means) */
.silent-investor-benefits {
padding: 3rem 2rem;

View file

@ -65,6 +65,11 @@ interface DealTerm {
description: string
}
interface AvailabilityRule {
label: string
description: string
}
const BenefitCard = ({
benefit,
index,
@ -214,6 +219,7 @@ export default function SilentInvestorPage() {
const stats = getItemsArray<StatItem>('stats')
const faqs = getItemsArray<FAQItem>('faqs')
const dealTerms = getItemsArray<DealTerm>('dealTerms')
const availabilityRules = getItemsArray<AvailabilityRule>('availabilityRules')
return (
<div className="silent-investor-page" data-testid="page-silent-investor">
@ -278,6 +284,29 @@ export default function SilentInvestorPage() {
<p className="deal-cap-note">{t('dealCapNote')}</p>
</section>
{/* Availability Section */}
<section className="silent-investor-availability">
<div className="section-header">
<h2 className="section-title">{t('availabilityTitle')}</h2>
<div className="section-divider" />
</div>
<p className="availability-description">{t('availabilityDescription')}</p>
<div className="availability-rules">
{availabilityRules.map((rule, index) => (
<m.div
key={rule.label}
className={`availability-rule${index === availabilityRules.length - 1 ? ' availability-rule--closed' : ''}`}
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.4, delay: 0.2 + index * 0.12 }}
>
<span className="availability-rule-label">{rule.label}</span>
<span className="availability-rule-description">{rule.description}</span>
</m.div>
))}
</div>
</section>
{/* What "Silent" Means */}
<section className="silent-investor-benefits">
<div className="section-header">

View file

@ -15,6 +15,11 @@ const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const distPath = join(__dirname, '..', 'dist');
// buildDeploymentRegistry needs deployments/@domains relative to CWD
// Ensure we run from project root
const projectRoot = join(__dirname, '..', '..', '..', '..', '..');
process.chdir(projectRoot);
// Prevent application from actually starting
process.env.NODE_ENV = 'test';
process.env.SKIP_BOOTSTRAP = 'true';

View file

@ -15,6 +15,11 @@ const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const distPath = join(__dirname, '..', 'dist');
// buildDeploymentRegistry needs deployments/@domains relative to CWD
// Ensure we run from project root
const projectRoot = join(__dirname, '..', '..', '..', '..', '..');
process.chdir(projectRoot);
// Prevent application from actually starting
process.env.NODE_ENV = 'test';
process.env.SKIP_BOOTSTRAP = 'true';