chore: install toolchain, wire lint, add local deploy path
Answers four questions and starts build step 1. Q22 — the scoped deploy user does not exist: aws iam get-user returns NoSuchEntity. Recorded in §7 as NOT PROVISIONED and swept so that no file describes it as existing. §10 records that user/pouya, the broadly- permissioned personal user that has been authenticating to this account, must never be used in CI; scripts/deploy-local.sh refuses to run as it. Q23 — the Gitea instance reports 1.27.2, well above the vars-context floor, so the first-step guard is belt-and-braces rather than load-bearing. What remains is not a fact but a dependency: the instance is jointly administered, so enabling Actions and registering a runner both need a second admin. Hence npm run deploy (scripts/deploy-local.sh), which performs exactly what the workflow performs — same guard, same three passes, same headers, same invalidation. Documented as the current path, not as a workaround. §10 gains the risk that follows: the deploy secret will live on jointly administered infrastructure, where an instance admin can reach repo secrets. That does not change the plan, but it makes the scoped IAM policy the actual control between a shared Gitea instance and an AWS account holding another business's client-database backups. Never widen it. Q27 — response time is two business days, in site.ts with a derived short form so the confirmation email cannot drift from the page. Q28 — OBA sections confirmed, stamped "for now"; membership renews yearly, tracked as R10. Build step 1: dependencies installed and package-lock.json created, closing the npm ci blocker. ESLint flat config and Prettier config added; npm run lint, check and build all pass. Prettier deliberately excludes *.md and tokens.css — reasons recorded in .prettierignore. npm audit reports 7 high-severity advisories, all requiring an Astro major upgrade. Not applied; escalated in AGENTS.md entry (s) as a decision. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012XquaEq4BgWMCwUqLEyNkF
This commit is contained in:
co-authored by
Claude Opus 5
parent
2b6176e4d7
commit
0d8b63380a
@@ -1,7 +1,10 @@
|
||||
import { defineCollection, z } from 'astro:content';
|
||||
import { PRACTICE_AREAS } from '../data/site';
|
||||
|
||||
const practiceSlugs = PRACTICE_AREAS.map((a) => a.slug) as [string, ...string[]];
|
||||
const practiceSlugs = PRACTICE_AREAS.map((a) => a.slug) as [
|
||||
string,
|
||||
...string[],
|
||||
];
|
||||
|
||||
/**
|
||||
* Insights. Content territories are set by the strategy brief §VII and
|
||||
|
||||
+51
-37
@@ -32,21 +32,20 @@ export const CREDENTIALS = {
|
||||
'Stitt Feld Handy — negotiation and ADR workshop series',
|
||||
],
|
||||
languages: ['English', 'Farsi'],
|
||||
/** The three bodies are [verified 2026-08-26]; **which** OBA sections is
|
||||
* [assumed] — §4 marks it so, the names come from the strategy brief and
|
||||
* Pouya has not confirmed them. NOT OCNI (lapsed) and NOT the Law Society —
|
||||
/** [verified 2026-08-26 — Pouya, AGENTS.md Q28] — and FOR NOW: OBA section
|
||||
* membership renews yearly, so this is a fact with a shelf life (AGENTS.md
|
||||
* R10). Re-confirm at renewal. 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)',
|
||||
// TODO(pouya): AGENTS.md Q28 — confirm the section list before publishing it.
|
||||
'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: 'Q.Med', label: 'ADRIC / ADRIO designation' },
|
||||
{ value: 'JD + ML', label: 'Law and engineering' },
|
||||
{ value: 'EN · FA', label: 'Bilingual practice' },
|
||||
] as const;
|
||||
@@ -64,16 +63,19 @@ export const ANALYTICS = {
|
||||
} as const;
|
||||
|
||||
export const CONTACT = {
|
||||
email: 'info@smlcompany.ca', // [verified 2026-08-26]
|
||||
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]
|
||||
phone: null as string | null, // [verified 2026-08-26]
|
||||
phoneFallback: 'By scheduled call',
|
||||
location: 'Toronto · Ontario · By appointment',
|
||||
/** TODO(pouya): AGENTS.md Q27 — is a one-business-day response time a
|
||||
* commitment you want published? It is not in the §4 register, and it is a
|
||||
* service level a reader can hold you to. Left null until confirmed. */
|
||||
responseTime: null as string | null,
|
||||
/** [verified 2026-08-26 — Pouya, AGENTS.md Q27]. A PUBLIC COMMITMENT: this
|
||||
* wording must match /contact/, the inquirer confirmation email, and any
|
||||
* bio. Change it here and sweep — never edit one copy. */
|
||||
responseTime: 'Inquiries are answered within two business days.',
|
||||
/** The same fact in sentence-fragment form, for the confirmation email and
|
||||
* any inline use. Derived, so the two cannot drift. */
|
||||
responseTimeShort: 'within two business days',
|
||||
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. */
|
||||
@@ -82,8 +84,8 @@ export const CONTACT = {
|
||||
|
||||
/** 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
|
||||
master: 'src/assets/pouya-lajevardi.jpg', // 1600x1600
|
||||
og: 'src/assets/og-portrait.jpg', // 1200x630, cropped high
|
||||
alt: 'Pouya Lajevardi',
|
||||
} as const;
|
||||
|
||||
@@ -102,25 +104,25 @@ export const FEES = {
|
||||
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. */
|
||||
* 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]
|
||||
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
|
||||
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]
|
||||
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: '15 to 30 days before', fee: '50% of the booked fee.' },
|
||||
{ window: 'Fewer than 15 days before', fee: '100% of the booked fee.' },
|
||||
],
|
||||
cancellationNotes: [
|
||||
@@ -135,33 +137,45 @@ export const FEES = {
|
||||
} 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' },
|
||||
{
|
||||
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: '/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' },
|
||||
{ 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: '/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' },
|
||||
{ href: '/legal/terms/', label: 'Terms' },
|
||||
] as const;
|
||||
|
||||
+191
-51
@@ -12,32 +12,46 @@
|
||||
@font-face {
|
||||
font-family: 'Instrument Serif';
|
||||
src: url('/fonts/instrument-serif-400.woff2') format('woff2');
|
||||
font-weight: 400; font-style: normal; font-display: swap;
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
unicode-range: U+0000-00FF, U+0100-017F, U+2000-206F, U+2190-21BB;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Instrument Serif';
|
||||
src: url('/fonts/instrument-serif-400-italic.woff2') format('woff2');
|
||||
font-weight: 400; font-style: italic; font-display: swap;
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
unicode-range: U+0000-00FF, U+0100-017F, U+2000-206F;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Geist';
|
||||
src: url('/fonts/geist-variable.woff2') format('woff2-variations');
|
||||
font-weight: 300 600; font-style: normal; font-display: swap;
|
||||
font-weight: 300 600;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
unicode-range: U+0000-00FF, U+0100-017F, U+2000-206F, U+2190-21BB;
|
||||
}
|
||||
@font-face {
|
||||
font-family: 'Geist Mono';
|
||||
src: url('/fonts/geist-mono-variable.woff2') format('woff2-variations');
|
||||
font-weight: 400 500; font-style: normal; font-display: swap;
|
||||
font-weight: 400 500;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
unicode-range: U+0000-00FF, U+2000-206F;
|
||||
}
|
||||
|
||||
/* --- Reset ---------------------------------------------------------------- */
|
||||
|
||||
*, *::before, *::after { box-sizing: border-box; }
|
||||
* { margin: 0; }
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
* {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
html {
|
||||
-webkit-text-size-adjust: 100%;
|
||||
@@ -59,15 +73,48 @@ body {
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
img, picture, video, canvas, svg { display: block; max-width: 100%; }
|
||||
img { height: auto; }
|
||||
input, button, textarea, select { font: inherit; color: inherit; }
|
||||
p, h1, h2, h3, h4, h5, h6 { overflow-wrap: break-word; }
|
||||
ul[role='list'], ol[role='list'] { list-style: none; padding: 0; }
|
||||
img,
|
||||
picture,
|
||||
video,
|
||||
canvas,
|
||||
svg {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
}
|
||||
img {
|
||||
height: auto;
|
||||
}
|
||||
input,
|
||||
button,
|
||||
textarea,
|
||||
select {
|
||||
font: inherit;
|
||||
color: inherit;
|
||||
}
|
||||
p,
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
ul[role='list'],
|
||||
ol[role='list'] {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* --- Type ----------------------------------------------------------------- */
|
||||
|
||||
h1, h2, h3, h4 { font-weight: var(--weight-normal); text-wrap: balance; }
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4 {
|
||||
font-weight: var(--weight-normal);
|
||||
text-wrap: balance;
|
||||
}
|
||||
|
||||
.display {
|
||||
font-family: var(--font-serif);
|
||||
@@ -76,7 +123,9 @@ h1, h2, h3, h4 { font-weight: var(--weight-normal); text-wrap: balance; }
|
||||
letter-spacing: var(--tracking-display);
|
||||
}
|
||||
/* The one flourish the design allows. One italic phrase per headline, max. */
|
||||
.display .it { font-style: italic; }
|
||||
.display .it {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.eyebrow {
|
||||
font-family: var(--font-mono);
|
||||
@@ -89,17 +138,26 @@ h1, h2, h3, h4 { font-weight: var(--weight-normal); text-wrap: balance; }
|
||||
/* An eyebrow is a label, never the page's heading element. */
|
||||
.eyebrow .dot {
|
||||
display: inline-block;
|
||||
inline-size: 6px; block-size: 6px;
|
||||
inline-size: 6px;
|
||||
block-size: 6px;
|
||||
border-radius: 50%;
|
||||
background: var(--accent);
|
||||
margin-inline-end: var(--space-3);
|
||||
vertical-align: 0.15em;
|
||||
}
|
||||
|
||||
p { max-inline-size: var(--width-prose); }
|
||||
p {
|
||||
max-inline-size: var(--width-prose);
|
||||
}
|
||||
|
||||
a { color: var(--link); text-decoration-thickness: 1px; text-underline-offset: 0.2em; }
|
||||
a:hover { color: var(--accent-hover); }
|
||||
a {
|
||||
color: var(--link);
|
||||
text-decoration-thickness: 1px;
|
||||
text-underline-offset: 0.2em;
|
||||
}
|
||||
a:hover {
|
||||
color: var(--accent-hover);
|
||||
}
|
||||
|
||||
/* --- Focus: visible, always. The previous build removed it globally. ------- */
|
||||
|
||||
@@ -108,7 +166,9 @@ a:hover { color: var(--accent-hover); }
|
||||
outline-offset: 3px;
|
||||
border-radius: var(--radius-sm);
|
||||
}
|
||||
:focus:not(:focus-visible) { outline: none; }
|
||||
:focus:not(:focus-visible) {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.skip-link {
|
||||
position: absolute;
|
||||
@@ -122,28 +182,63 @@ a:hover { color: var(--accent-hover); }
|
||||
transform: translateY(-200%);
|
||||
transition: transform var(--dur-fast) var(--ease);
|
||||
}
|
||||
.skip-link:focus { transform: translateY(0); }
|
||||
.skip-link:focus {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
::selection { background: var(--accent); color: var(--text-inverse); }
|
||||
::selection {
|
||||
background: var(--accent);
|
||||
color: var(--text-inverse);
|
||||
}
|
||||
|
||||
/* --- Layout --------------------------------------------------------------- */
|
||||
|
||||
.wrap { inline-size: 100%; max-inline-size: var(--width-content); margin-inline: auto; padding-inline: var(--gutter); }
|
||||
.wrap-wide { max-inline-size: var(--width-wide); }
|
||||
.prose { max-inline-size: var(--width-prose); }
|
||||
.section { padding-block: var(--section-y); }
|
||||
.section-alt { background: var(--bg-alt); }
|
||||
.section-inverse { background: var(--bg-inverse); color: var(--text-inverse); }
|
||||
.wrap {
|
||||
inline-size: 100%;
|
||||
max-inline-size: var(--width-content);
|
||||
margin-inline: auto;
|
||||
padding-inline: var(--gutter);
|
||||
}
|
||||
.wrap-wide {
|
||||
max-inline-size: var(--width-wide);
|
||||
}
|
||||
.prose {
|
||||
max-inline-size: var(--width-prose);
|
||||
}
|
||||
.section {
|
||||
padding-block: var(--section-y);
|
||||
}
|
||||
.section-alt {
|
||||
background: var(--bg-alt);
|
||||
}
|
||||
.section-inverse {
|
||||
background: var(--bg-inverse);
|
||||
color: var(--text-inverse);
|
||||
}
|
||||
.section-inverse .eyebrow,
|
||||
.section-inverse .text-meta { color: var(--text-inverse-2); }
|
||||
.section-inverse .text-meta {
|
||||
color: var(--text-inverse-2);
|
||||
}
|
||||
|
||||
hr { border: none; border-block-start: 1px solid var(--border); }
|
||||
.rule-gold { border: none; border-block-start: 1px solid var(--rule); }
|
||||
hr {
|
||||
border: none;
|
||||
border-block-start: 1px solid var(--border);
|
||||
}
|
||||
.rule-gold {
|
||||
border: none;
|
||||
border-block-start: 1px solid var(--rule);
|
||||
}
|
||||
|
||||
.visually-hidden {
|
||||
position: absolute; inline-size: 1px; block-size: 1px;
|
||||
padding: 0; margin: -1px; overflow: hidden;
|
||||
clip-path: inset(50%); white-space: nowrap; border: 0;
|
||||
position: absolute;
|
||||
inline-size: 1px;
|
||||
block-size: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip-path: inset(50%);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* --- Reveal ---------------------------------------------------------------
|
||||
@@ -152,41 +247,86 @@ hr { border: none; border-block-start: 1px solid var(--border); }
|
||||
If the observer never runs, every page reads normally. The previous build
|
||||
had this backwards and shipped a blank page to anything without JS. */
|
||||
|
||||
.js-reveal .reveal { opacity: 0; transform: translateY(20px); }
|
||||
.js-reveal .reveal {
|
||||
opacity: 0;
|
||||
transform: translateY(20px);
|
||||
}
|
||||
.js-reveal .reveal.is-in {
|
||||
opacity: 1; transform: none;
|
||||
transition: opacity var(--dur-reveal) var(--ease), transform var(--dur-reveal) var(--ease);
|
||||
opacity: 1;
|
||||
transform: none;
|
||||
transition:
|
||||
opacity var(--dur-reveal) var(--ease),
|
||||
transform var(--dur-reveal) var(--ease);
|
||||
}
|
||||
.js-reveal .reveal-stagger > * {
|
||||
opacity: 0;
|
||||
transform: translateY(16px);
|
||||
}
|
||||
.js-reveal .reveal-stagger > * { opacity: 0; transform: translateY(16px); }
|
||||
.js-reveal .reveal-stagger.is-in > * {
|
||||
opacity: 1; transform: none;
|
||||
transition: opacity var(--dur-reveal) var(--ease), transform var(--dur-reveal) var(--ease);
|
||||
opacity: 1;
|
||||
transform: none;
|
||||
transition:
|
||||
opacity var(--dur-reveal) var(--ease),
|
||||
transform var(--dur-reveal) var(--ease);
|
||||
}
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(1) {
|
||||
transition-delay: 0ms;
|
||||
}
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(2) {
|
||||
transition-delay: 70ms;
|
||||
}
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(3) {
|
||||
transition-delay: 140ms;
|
||||
}
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(4) {
|
||||
transition-delay: 210ms;
|
||||
}
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(5) {
|
||||
transition-delay: 280ms;
|
||||
}
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(6) {
|
||||
transition-delay: 350ms;
|
||||
}
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(1) { transition-delay: 0ms; }
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(2) { transition-delay: 70ms; }
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(3) { transition-delay: 140ms; }
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(4) { transition-delay: 210ms; }
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(5) { transition-delay: 280ms; }
|
||||
.js-reveal .reveal-stagger.is-in > *:nth-child(6) { transition-delay: 350ms; }
|
||||
/* Stagger caps at six children by design. */
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
html { scroll-behavior: auto; }
|
||||
*, *::before, *::after {
|
||||
html {
|
||||
scroll-behavior: auto;
|
||||
}
|
||||
*,
|
||||
*::before,
|
||||
*::after {
|
||||
animation-duration: 0.01ms !important;
|
||||
animation-iteration-count: 1 !important;
|
||||
transition-duration: 0.01ms !important;
|
||||
scroll-behavior: auto !important;
|
||||
}
|
||||
.js-reveal .reveal,
|
||||
.js-reveal .reveal-stagger > * { opacity: 1 !important; transform: none !important; }
|
||||
.js-reveal .reveal-stagger > * {
|
||||
opacity: 1 !important;
|
||||
transform: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* --- Print: the About page will be printed by people evaluating an appointment */
|
||||
|
||||
@media print {
|
||||
body { background: #fff; color: #000; font-size: 11pt; }
|
||||
.site-header, .site-footer, .skip-link, .no-print { display: none !important; }
|
||||
a[href^='http']::after { content: ' (' attr(href) ')'; font-size: 9pt; }
|
||||
.section { padding-block: var(--space-5); }
|
||||
body {
|
||||
background: #fff;
|
||||
color: #000;
|
||||
font-size: 11pt;
|
||||
}
|
||||
.site-header,
|
||||
.site-footer,
|
||||
.skip-link,
|
||||
.no-print {
|
||||
display: none !important;
|
||||
}
|
||||
a[href^='http']::after {
|
||||
content: ' (' attr(href) ')';
|
||||
font-size: 9pt;
|
||||
}
|
||||
.section {
|
||||
padding-block: var(--space-5);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user