chore: project scaffold, specs, and working record
Build and deploy / build-and-deploy (push) Failing after 5s
Build and deploy / build-and-deploy (push) Failing after 5s
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
/**
|
||||
* Site-wide constants.
|
||||
*
|
||||
* Anything marked TODO(pouya) is an unanswered question in AGENTS.md §9.
|
||||
* Do not guess a value to make the build pass — an unanswered question is
|
||||
* supposed to be visible. See CLAUDE.md.
|
||||
*/
|
||||
|
||||
export const SITE = {
|
||||
name: 'Pouya Lajevardi',
|
||||
tagline: 'Mediation · Arbitration · Toronto',
|
||||
url: 'https://adr.smlcompany.ca',
|
||||
locale: 'en_CA',
|
||||
entity: 'SML Company Ltd. · Ontario, Canada',
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* Verified credentials only — mirrors AGENTS.md §4.
|
||||
* Adding a line here without adding it there is a bug.
|
||||
*
|
||||
* D13: the site asserts the JD and makes NO licensure claim. Do not add
|
||||
* 'lawyer', 'called to the bar', 'licensed', or any post-nominal implying a
|
||||
* licence — and do not imply it either. See AGENTS.md §4 Forbidden.
|
||||
*/
|
||||
export const CREDENTIALS = {
|
||||
designations: ['Q.Med (ADRIC / ADRIO)'],
|
||||
inProgress: ['Q.Arb — commenced August 2026'], // [verified 2026-08-26]
|
||||
goal: 'C.Med-Arb (Chartered Mediator-Arbitrator)',
|
||||
education: ['JD, Bond University'],
|
||||
certifications: [
|
||||
'Kompass Arbitration Certificate Program',
|
||||
'Stitt Feld Handy — negotiation and ADR workshop series',
|
||||
],
|
||||
languages: ['English', 'Farsi'],
|
||||
/** [verified 2026-08-26]. NOT OCNI (lapsed) and NOT the Law Society —
|
||||
* listing the LSO implies licensure, which D13 bars. Do not add either. */
|
||||
memberships: [
|
||||
'ADR Institute of Canada (ADRIC)',
|
||||
'ADR Institute of Ontario (ADRIO)',
|
||||
'Ontario Bar Association — Construction & Infrastructure, ADR, and Civil Litigation sections',
|
||||
],
|
||||
} as const;
|
||||
|
||||
/** The three credential slots. Never matter counts — AGENTS.md §4. */
|
||||
export const CREDENTIAL_ROW = [
|
||||
{ value: 'Q.Med', label: 'ADRIC / ADRIO designation' },
|
||||
{ value: 'JD + ML', label: 'Law and engineering' },
|
||||
{ value: 'EN · FA', label: 'Bilingual practice' },
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* The Toronto boutique is NEVER named — AGENTS.md D16. Use this string.
|
||||
* Do not infer a name from an email domain or anywhere else.
|
||||
*/
|
||||
export const BOUTIQUE = 'a Toronto litigation and ADR boutique' as const;
|
||||
|
||||
/** Analytics: privacy-first and cookieless (D15). No GA4, no consent banner. */
|
||||
export const ANALYTICS = {
|
||||
provider: 'plausible' as 'plausible' | 'fathom' | null,
|
||||
domain: 'adr.smlcompany.ca',
|
||||
} as const;
|
||||
|
||||
export const CONTACT = {
|
||||
email: 'info@smlcompany.ca', // [verified 2026-08-26]
|
||||
/** No public phone by choice. Render 'By scheduled call' wherever a number
|
||||
* would go — do not leave the field visually empty. */
|
||||
phone: null as string | null, // [verified 2026-08-26]
|
||||
phoneFallback: 'By scheduled call',
|
||||
location: 'Toronto · Ontario · By appointment',
|
||||
responseTime: 'Inquiries are answered within one business day.',
|
||||
linkedin: 'https://www.linkedin.com/in/pouyalajevardi/', // [verified 2026-08-26]
|
||||
/** Booking parked 2026-08-26 (AGENTS.md R6). Build /contact/ with the intake
|
||||
* form and a reserved slot so an embed drops in later without a rebuild. */
|
||||
bookingUrl: null as string | null,
|
||||
} as const;
|
||||
|
||||
/** Portrait assets. Astro derives AVIF/WebP variants from the master at build. */
|
||||
export const PORTRAIT = {
|
||||
master: 'src/assets/pouya-lajevardi.jpg', // 1600x1600
|
||||
og: 'src/assets/og-portrait.jpg', // 1200x630, cropped high
|
||||
alt: 'Pouya Lajevardi',
|
||||
} as const;
|
||||
|
||||
/** Shown on /contact/ and with the booking embed. Do not reword casually. */
|
||||
export const NO_RETAINER_NOTICE =
|
||||
'Submitting this form does not create a retainer, does not appoint a neutral, ' +
|
||||
'and does not itself establish a mediator–party relationship.';
|
||||
|
||||
/**
|
||||
* Rate card — AGENTS.md D14, confirmed by Pouya 2026-08-26.
|
||||
* One rate for all mediation matters. All figures PLUS HST.
|
||||
* Full research and reasoning: docs/07-fees.md
|
||||
*/
|
||||
export const FEES = {
|
||||
currency: 'CAD',
|
||||
taxNote: 'All fees are plus HST.',
|
||||
mediation: {
|
||||
/** Prep is bundled AND stated on the page — [verified 2026-08-26].
|
||||
* Do not hide it: at these rates, saying preparation is included is the
|
||||
* point, not a detail. */
|
||||
halfDay: { amount: 2000, hours: 3.5, prepIncluded: 2 },
|
||||
fullDay: { amount: 4000, hours: 7, prepIncluded: 3 },
|
||||
additionalParty: 500, // each party beyond two
|
||||
overtimePerHour: 500, // [verified 2026-08-26]
|
||||
},
|
||||
arbitration: {
|
||||
perHour: 500,
|
||||
hearingDay: 4000,
|
||||
documentsOnlySimple: 6500, // flat
|
||||
documentsOnlyComplex: 9500, // flat
|
||||
// No tribunal-secretary rate — removed by Pouya 2026-08-26.
|
||||
},
|
||||
// ENE, settlement counsel, dispute-system design, pre-dispute technical advisory
|
||||
hourly: 500, // [verified 2026-08-26]
|
||||
cancellation: [
|
||||
{ window: 'More than 30 days before', fee: 'No fee. Disbursements only.' },
|
||||
{ window: '15 to 30 days before', fee: '50% of the booked fee.' },
|
||||
{ window: 'Fewer than 15 days before', fee: '100% of the booked fee.' },
|
||||
],
|
||||
cancellationNotes: [
|
||||
'Rescheduling at the time of cancellation, with a new date fixed, is not charged.',
|
||||
'The cancellation fee is waived if the reserved time is filled by another matter of equal or greater value.',
|
||||
],
|
||||
terms: [
|
||||
'Fees are shared equally between the parties unless they agree otherwise in writing.',
|
||||
'Accounts are payable on rendering. Interest accrues on overdue accounts at 5% per annum.',
|
||||
'Video and in-person sessions are charged at the same rate.',
|
||||
],
|
||||
} as const;
|
||||
|
||||
export const PRACTICE_AREAS = [
|
||||
{ slug: 'construction', name: 'Construction & Infrastructure', chip: 'Construction' },
|
||||
{ slug: 'technology', name: 'Technology, AI & Data', chip: 'Technology' },
|
||||
{ slug: 'energy', name: 'Energy, Grid & Regulatory', chip: 'Energy' },
|
||||
{ slug: 'insurance', name: 'Insurance, SABS & LAT', chip: 'Insurance' },
|
||||
{ slug: 'shareholder', name: 'Shareholder & Family Business', chip: 'Shareholder' },
|
||||
{ slug: 'cross-cultural', name: 'Cross-Border & Diaspora', chip: 'Cross-cultural' },
|
||||
] as const;
|
||||
|
||||
/** Seven items is the ceiling before a nav stops being scannable. */
|
||||
export const PRIMARY_NAV = [
|
||||
{ href: '/about/', label: 'About' },
|
||||
{ href: '/mediation/', label: 'Mediation' },
|
||||
{ href: '/arbitration/', label: 'Arbitration' },
|
||||
{ href: '/practice/', label: 'Practice', children: PRACTICE_AREAS },
|
||||
{ href: '/fees/', label: 'Fees' },
|
||||
{ href: '/insights/', label: 'Insights' },
|
||||
{ href: '/contact/', label: 'Contact' },
|
||||
] as const;
|
||||
|
||||
/** Linked contextually rather than from the primary nav. */
|
||||
export const SECONDARY_NAV = [
|
||||
{ href: '/process/', label: 'How I work' },
|
||||
{ href: '/med-arb/', label: 'Med-Arb' },
|
||||
{ href: '/for-parties/', label: 'For parties' },
|
||||
] as const;
|
||||
|
||||
export const LEGAL_NAV = [
|
||||
{ href: '/legal/privacy/', label: 'Privacy' },
|
||||
{ href: '/legal/terms/', label: 'Terms' },
|
||||
] as const;
|
||||
Reference in New Issue
Block a user