@domandigital/craft 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -159,6 +159,90 @@ interface ContrastCheck {
159
159
  /** Measure one text-on-background pair against both models. */
160
160
  declare function checkPair(text: string, background: string): ContrastCheck;
161
161
 
162
+ /**
163
+ * Contrast against a CSS gradient: the case automated tools do not score.
164
+ *
165
+ * axe-core and Lighthouse mark text on a gradient "incomplete", and it never
166
+ * reaches the result, so a page can report no contrast violations while its
167
+ * body copy fails AA. This was first found on two client sites (4.14:1 to
168
+ * 4.44:1, reported clean by every tool in CI). This walks the gradient's
169
+ * stops, composites each over what sits beneath, and scores the text against
170
+ * the worst one: the backdrop the text has to clear everywhere.
171
+ *
172
+ * WCAG 2.2 defines no method for gradient or translucent backdrops, so the
173
+ * worst point is this package's own rule, not a conformance claim.
174
+ *
175
+ * Folded in from dd-drift-guards (guards/contrast-math.mjs) on 3 October 2026,
176
+ * on craft's own colour parsing and contrast models, with one fix: the guard
177
+ * scored the stops only. The worst point can sit between two stops, wherever
178
+ * the backdrop's luminance comes closest to the text's: mid-grey text on a
179
+ * black-to-white gradient clears 4.5:1 against both ends and about 1:1 in the
180
+ * middle. So each segment is sampled, interpolated as browsers paint legacy
181
+ * colours (sRGB, premultiplied alpha). Pure.
182
+ */
183
+ /** Samples per segment between two stops: under 1/255 of a channel apart for any pair. */
184
+ declare const SAMPLES_PER_SEGMENT = 256;
185
+ /**
186
+ * The colour stops of a CSS gradient, in order, as written. Splits on
187
+ * top-level commas only, so `rgba(1, 2, 3, 0.4)` survives, and drops the
188
+ * direction or shape argument (`to bottom`, `135deg`, `circle at top`).
189
+ * Throws on a stop it cannot read: a skipped stop could be the worst one.
190
+ */
191
+ declare function gradientStops(gradient: string): string[];
192
+ interface GradientContrast {
193
+ text: string;
194
+ gradient: string;
195
+ beneath: string;
196
+ /** Every stop composited over `beneath`, as hex. */
197
+ stops: string[];
198
+ /** The point of the gradient, stop or between stops, the text contrasts least with. */
199
+ worst: string;
200
+ /** WCAG 2.x ratio against the worst point. */
201
+ wcag: number;
202
+ /** APCA Lc against the worst point, signed. */
203
+ lc: number;
204
+ passesAA: boolean;
205
+ passesAALarge: boolean;
206
+ note: string;
207
+ }
208
+ /**
209
+ * Text on a gradient that sits on `beneath` (an opaque colour; default white).
210
+ * The text colour must be opaque: a translucent text colour depends on the
211
+ * backdrop at each pixel, which is a rendered measurement, not this one.
212
+ */
213
+ declare function gradientContrast(text: string, gradient: string, beneath?: string): GradientContrast;
214
+
215
+ /**
216
+ * The photo-review gate: reads the report `halide review --json` wrote and
217
+ * fails a build whose photography is under the bar.
218
+ *
219
+ * It takes the report's text, not a path, and never runs halide. A check that
220
+ * spawns a binary cannot run where the binary is absent (a CI image, a fresh
221
+ * clone), turns a fast check slow, and depends on a tool version nobody
222
+ * pinned. The pipeline writes the report; the build reads it and hands it here.
223
+ *
224
+ * Folded in from dd-drift-guards (guards/photo-review.mjs) on 3 October 2026,
225
+ * unchanged in what it passes and fails. Pure.
226
+ */
227
+ interface PhotoReviewOptions {
228
+ /** Lowest acceptable score, overall and per image. Default 0.7. */
229
+ minScore?: number;
230
+ /**
231
+ * When false, no report is a pass: for a site with no photography at all.
232
+ * Default true, because a missing report on a site that has photos is the
233
+ * review not having run.
234
+ */
235
+ required?: boolean;
236
+ }
237
+ interface PhotoReviewResult {
238
+ ok: boolean;
239
+ failures: string[];
240
+ /** One line per thing checked, passed or not. */
241
+ report: string[];
242
+ }
243
+ /** `text` is the report's contents, or null when there is no report. */
244
+ declare function checkPhotoReview(text: string | null, options?: PhotoReviewOptions): PhotoReviewResult;
245
+
162
246
  /**
163
247
  * Semantic tokens derived from a small set of anchors, with a contrast report.
164
248
  *
@@ -925,6 +1009,13 @@ interface Snapshot {
925
1009
  * claim, not its menu or its calls to action.
926
1010
  */
927
1011
  firstScreenText?: string[];
1012
+ /**
1013
+ * Whether this is a site's home page, set by whoever knows: `craft
1014
+ * calibrate` from its labels, and `craft null build` and `null import`,
1015
+ * which ask for a home page. Absent, the URL decides (`HOME_URL`), and a
1016
+ * local file such as `pages/01.html` never reads as one.
1017
+ */
1018
+ home?: boolean;
928
1019
  /** Set when a version 1 snapshot was read and upgraded in memory. */
929
1020
  migratedFrom?: 1;
930
1021
  /** The design-system measures trawl has collected since v7, kept so it can switch to this. */
@@ -1600,6 +1691,159 @@ interface LexicalFeatures {
1600
1691
  declare const LEXICAL_FEATURES: readonly (keyof LexicalFeatures)[];
1601
1692
  declare function lexicalOf(text: string, brief?: string): LexicalFeatures;
1602
1693
 
1694
+ /**
1695
+ * Register features: the measures a writer steers by when choosing a register.
1696
+ *
1697
+ * The shape and lexical features ask whether copy reads as generated. These
1698
+ * ask something simpler: how long are the sentences, how often does the
1699
+ * writer say "you", contract a verb or use the passive. Plain writing, a
1700
+ * customer email and a literary paragraph differ on exactly these.
1701
+ *
1702
+ * Pure and zero-dependency, like `shape.ts`, whose sentence splitter and word
1703
+ * counter they share. The calibration readers call the same function, so a
1704
+ * published band describes the measure that ships.
1705
+ *
1706
+ * `passiveShare` is a heuristic: a form of "be" (optionally one adverb) then a
1707
+ * participle, with common adjectival participles ("tired", "interested")
1708
+ * excluded. It misses "get" passives and catches some predicative adjectives.
1709
+ * It is measured, not assumed, before anything relies on it.
1710
+ */
1711
+ interface RegisterFeatures {
1712
+ /** Words per sentence. */
1713
+ meanSentenceWords: number;
1714
+ /** Contracted forms per 100 words: you'll, it's, don't, we're. */
1715
+ contractionsPer100: number;
1716
+ /** you, your, yours, yourself, yourselves per 100 words. */
1717
+ youPer100: number;
1718
+ /** I, me, my, mine, we, us, our, ours per 100 words. */
1719
+ firstPersonPer100: number;
1720
+ /** Share of sentences with a passive construction. */
1721
+ passiveShare: number;
1722
+ /** Letters per word. */
1723
+ meanWordLength: number;
1724
+ }
1725
+ declare const REGISTER_FEATURES: readonly (keyof RegisterFeatures)[];
1726
+ declare function registerOf(text: string): RegisterFeatures;
1727
+
1728
+ /**
1729
+ * Register briefs: how to write in a chosen register, read before drafting.
1730
+ *
1731
+ * `COPY.md` says what every piece of house copy avoids. A register says what a
1732
+ * draft reaches for: plain for a form or a policy, persuasive for a landing
1733
+ * page, warm for a customer email, literary for a premium brand. The brief is
1734
+ * read before drafting and `craft copy` runs afterwards, the order `COPY.md`
1735
+ * sets for its own writing directives.
1736
+ *
1737
+ * Directives are positive ("do this"), never a list of phrases to avoid:
1738
+ * naming a phrase puts it in the writer's head. Each one names its source, and
1739
+ * a directive with no public authority behind it says "house judgement".
1740
+ *
1741
+ * Nothing here measures or grades. `REGISTERS.md` carries the generated text
1742
+ * of this file, bound by a test.
1743
+ */
1744
+ type RegisterId = "plain" | "persuasive" | "warm" | "literary";
1745
+ interface RegisterSource {
1746
+ name: string;
1747
+ url?: string;
1748
+ /** What this register takes from it, and anything it does not. */
1749
+ note: string;
1750
+ }
1751
+ interface Directive {
1752
+ text: string;
1753
+ /** Short source key: a `RegisterSource.name`, `COPY.md`, or "house judgement". */
1754
+ from: string;
1755
+ }
1756
+ interface Register {
1757
+ id: RegisterId;
1758
+ name: string;
1759
+ useFor: string;
1760
+ directives: Directive[];
1761
+ example: {
1762
+ before: string;
1763
+ after: string;
1764
+ why: string;
1765
+ };
1766
+ sources: RegisterSource[];
1767
+ }
1768
+ declare const REGISTERS: readonly Register[];
1769
+ declare const REGISTER_IDS: readonly RegisterId[];
1770
+ declare function getRegister(id: string): Register | undefined;
1771
+ /** The brief as plain text, for reading before a draft or pasting into a prompt. */
1772
+ declare function registerBrief(id: RegisterId): string;
1773
+ /** The generated block of REGISTERS.md. */
1774
+ declare function registersDoc(): string;
1775
+
1776
+ /**
1777
+ * `craft register check`: where a draft sits against the human baselines.
1778
+ *
1779
+ * A single short passage cannot be placed: at blurb length the registers
1780
+ * overlap too much (calibration/copy-shape/report-registers.md). Averaged over
1781
+ * five paragraphs, every register pair separates on several features. So the
1782
+ * check reads documents only, measures each blurb-sized paragraph with the
1783
+ * same functions the baselines used, averages them, and compares the average
1784
+ * with the document-level bands in `profile.ts`.
1785
+ *
1786
+ * It reports, never grades: which features fall outside the chosen
1787
+ * register's usual range, and which baseline the draft reads closest to.
1788
+ * `COPY.md` "Style is not evidence" applies: no score, no verdict.
1789
+ */
1790
+
1791
+ interface Band {
1792
+ p10: number;
1793
+ p50: number;
1794
+ p90: number;
1795
+ sd: number;
1796
+ /** Baseline registers this feature separates this one from, at document level. */
1797
+ separates: string[];
1798
+ }
1799
+ /** Baseline register -> feature -> band. */
1800
+ type RegisterProfile = Readonly<Record<string, Readonly<Record<string, Band>>>>;
1801
+ /** Which baseline each brief is compared with, and what that baseline is not. */
1802
+ declare const REGISTER_BASELINE: Readonly<Record<RegisterId, {
1803
+ baseline: string;
1804
+ note: string;
1805
+ }>>;
1806
+ declare const MIN_PARAGRAPHS = 5;
1807
+ /**
1808
+ * Features that measure what a text is about, not how it is written. Enron is
1809
+ * dense with deal names and figures because of its subject, not its register,
1810
+ * so these stay in the separation report but out of the check: a warm email
1811
+ * about a kitchen refit should not be told it names too few people.
1812
+ */
1813
+ declare const CONTENT_FEATURES: ReadonlySet<string>;
1814
+ interface Outside {
1815
+ feature: string;
1816
+ value: number;
1817
+ band: [number, number];
1818
+ direction: "higher" | "lower";
1819
+ sentence: string;
1820
+ }
1821
+ interface RegisterCheck {
1822
+ register: RegisterId;
1823
+ baseline: string;
1824
+ /** Blurb-sized paragraphs measured. */
1825
+ paragraphs: number;
1826
+ /** False under MIN_PARAGRAPHS: nothing is compared. */
1827
+ measured: boolean;
1828
+ means: Record<string, number>;
1829
+ outside: Outside[];
1830
+ /** Standardised distance to each baseline's median, closest first. */
1831
+ nearest: {
1832
+ register: string;
1833
+ distance: number;
1834
+ }[];
1835
+ note: string;
1836
+ summary: string;
1837
+ }
1838
+ declare const featureLabel: (f: string) => string;
1839
+ /** Paragraphs as the baselines read them: blank lines split, headings dropped. */
1840
+ declare function documentParagraphs(text: string): string[];
1841
+ declare function checkRegister(text: string, id: RegisterId, profile: RegisterProfile): RegisterCheck;
1842
+
1843
+ declare const PROFILE_PARAGRAPHS = 5;
1844
+ declare const PROFILE_MEASURED = "2026-09-30";
1845
+ declare const PROFILE: RegisterProfile;
1846
+
1603
1847
  /**
1604
1848
  * Specificity tells: a page that could belong to anyone.
1605
1849
  *
@@ -2993,6 +3237,8 @@ interface LabelSummary {
2993
3237
  }
2994
3238
  interface TellRate {
2995
3239
  tell: string;
3240
+ /** The catalogue generation it belongs to; null for a tell the catalogue no longer holds. */
3241
+ generation: number | null;
2996
3242
  hits: Record<Label, number>;
2997
3243
  /** Hits on `ai` and `ai-looking` pages over all hits. */
2998
3244
  precision: number;
@@ -3098,4 +3344,4 @@ declare function characterReport(input: CharacterInputs, copyTells?: Set<string>
3098
3344
 
3099
3345
  declare function retrofitPlan(report: CharacterReport, direction?: ArtDirection | null): string;
3100
3346
 
3101
- export { ACCENT_SCALE, ACCENT_SHARED, AI_PHRASES, AI_SOURCE_TYPES, AI_VIOLET, AI_WORDS, type AccentFork, type AccentForkOptions, type Action, type ActionPosition, type Area, type ArtDirection, BASELINE_VERSION, BUZZWORDS, type Baseline, type BaselineEntry, CATALOGUE, CATALOGUE_VERSION, CHOICE_KEYS, COMPONENT_ROLES, CONSIDERATION, CONVENTION, CUSTOMER_KINDS, type Calibration, type CandidateKind, type CharacterInputs, type CharacterReport, type CheckOptions, type CheckReport, type CheckRestraintInput, type ChoiceKey, type Claim, type ClaimsReport, type CompetitorComparison, type ComponentPair, type ComponentTypicality, type Consideration, type ContrastCheck, type ContrastReport, type CopySide, type CopyTell, type CraftConfig, type CraftTokensInput, type CraftTokensResult, type CustomerKind, DEFAULT_IGNORE, DENSITIES, DENSITY_NAMES, DIRECTION_VERSION, DIRECTION_VERSIONS, DISTANCE_WEIGHTS, DURATION_MS, DURATION_S, type DensityCssOptions, type DensityName, type DirectionChoice, type DirectionComparison, type DirectionMatch, type DirectionProblem, type DirectionReport, type DirectionSource, type DirectionSummary, type DurationName, EASE, EASE_TUPLE, EDGE_STEP, ESTATE_VERSION, EXIT_RATIO, type EaseName, type EmitCssOptions, type EstateMatch, type EstatePair, type EstateRegister, type EstateSite, FINGERPRINT_VERSION, FLAGGED_TARGET, FUNCTION_WORDS, type Fact, type FactComparison, type FactKind, type Finding, type Fingerprint, type FingerprintDistance, type FingerprintSection, type FluidSpaceOptions, type FluidTypeOptions, type FluidTypeResult, type FontClass, GROUND_SCALE, GROUND_SHARED, type Gamut, type Generation, HIERARCHY_FIELDS, HOME_FILE, HOME_URL, HOUSE, HOUSE_BUDGET, HOUSE_LOCKED, HOUSE_TYPE, HUMAN_TYPICAL_TARGET, type HarvestCandidate, type HarvestOptions, type Hit, type HouseRule, type HouseTier, IMAGERY_TELLS, type ImageProvenance, type ImageRole, JSON_SCHEMA_VERSION, type JobContext, type JobMap, type JobPart, LABELS, LEXICAL_FEATURES, LICENCES, LIGHTNESS_CURVE, type Label, type LabelSummary, type LexicalFeatures, type LicenceEntry, type LicenceSubject, MIN_DECIDED, MIN_RUNS, MOOD, type MeasuredPage, type MotionDecision, type MotionKind, type MultiClient, NEGATIVE_REASSURANCE, NULL_VERSION, type NullModel, type NullRun, type Oklch, type OklchToHexOptions, PAGE_TYPES, PILL_LIMIT, PLAINER_WORDS, PREFERENCE, PROMO_BADGE, PROOF_NAMES, PROPOSED, PROVENANCE_SCAN_BYTES, type PageCopy, type PageHierarchy, type PageResult, type PageType, type PaletteColour, type Proposal, type ProposeInput, RAMP_STEPS, READABLE_SNAPSHOT_VERSIONS, REFLEX_FONTS_1, REFLEX_FONTS_2, RENDERED_PATHS, RENDERED_TELLS, REVEAL_LIMIT, REVIEW_PHRASES, type Ramp, type RampFromAnchorsOptions, type RampOptions, type RampStep, type ReasonInput, type RenderedTell, type ResearchInput, type RestraintBudget, type RestraintReport, type RestraintSeverity, type RestraintViolation, type Rgb, type RgbaImage, SCALE, SECTION_ROLES, SHADCN_LIMIT, SHADCN_PRIMITIVES, SHARED_PART, SIBLING_AT, SNAPSHOT_VERSION, SOURCE_KINDS, SPACE_STEPS, SPECIFICITY_COPY_TELLS, SPECIFICITY_RENDERED_TELLS, SPRING, STANDING_CLAIM, STOCK_AVATAR_HOSTS, STOCK_FIGURES, STOCK_PHOTO_HOSTS, STOCK_PHRASES, STUDY_WORDS, type SarifOptions, type SarifTell, type SectionGeometry, type SectionKind, type SectionRhythmOptions, type SectionRole, type SemanticInput, type SemanticResult, type Severity, type SeverityLevel, type SeverityOverride, type ShapeFeatures, type ShouldAnimateInput, type SignalResult, type Snapshot, type SnapshotColour, type SnapshotControl, type SnapshotEffects, type SnapshotFont, type SnapshotGradient, type SnapshotHeading, type SnapshotImage, type SnapshotMotion, type SnapshotPatch, type SnapshotSection, type SnapshotVisual, type SourceFile, type SourceKind, type SourceTell, type SpaceStep, type Specific, type SpecificKind, type Specificity, type StudyWord, type Surface, TELL_HEAVY, TRADE_NOUNS, TYPE_STEPS, TYPICAL_AT, type TailwindPreset, type TargetCheck, type Tell, type TellException, type TellRate, type Tricolon, type TypeStep, type Typicality, type UnmeasuredPage, VAGUE_WORDS, type ValidateContext, type Verdict, accentFork, addSite, apcaContrast, applyBaseline, applyHouseGate, applySeverity, auditSnapshot, briefTerms, calibrate, catalogueTable, characterReport, checkCopy, checkOrder, checkPair, checkReason, checkRestraint, choicesOf, clauseDepth, closestComponents, compareCompetitor, compareDirections, compareFacts, compareToDeclared, compareToEstate, componentDistance, componentShared, componentTypicalities, componentTypicality, componentsOf, contentWords, countWords, craftTokens, createBaseline, cv, deltaEOk, deltaEOkHex, densityCss, densityTokens, designTells, emitCss, emptyEstate, estateComponentPairs, estatePairs, exitDuration, extractHtml, faceLicence, findClaims, findColours, findingKey, fingerprint, fingerprintDistance, fluidClamp, fluidSpace, fluidType, fontClass, formatCalibration, formatClaims, formatComparison, formatCompetitor, formatDirectionMatches, formatHex, formatReport, globToRegExp, groundName, harvest, hedgeCount, hedgedClose, hexToOklch, holdHouseBlocks, houseRule, hueName, hueSwatch, ignoreMatcher, inP3Gamut, inSrgbGamut, initDirection, isAiViolet, isBlurb, isCategoryLabel, isCream, isFlagged, jobWords, layoutDistance, lexicalOf, licencesJson, makeSnapshot, motionTokens, namedSources, nearest, nominalisations, normaliseFamily, nullPrompt, oklchToHex, oklchToRgb, pageCopy, paletteFromPixels, paragraphUniformity, parseBaseline, parseColour, parseCraftConfig, parseHex, participialClauses, phrasalCoordinations, propose, protectedFacts, ramp, rampFromAnchors, readSnapshot, renderedOrder, researchPrompt, retrofitPlan, runTell, scanProvenance, scanSource, sectionRhythm, semantic, sentencesOf, severityExceptions, shapeMoves, shapeName, shapeOf, words as shapeWords, sharedParts, shouldAnimate, siblingLine, skeleton, skeletonRepeat, specificity, specifics, splitSentences, stackedConditional, stockAvatarSource, stockSource, summariseDirection, tailwindV3Preset, tailwindV4Theme, tellById, toGamut, toJson, toSarif, tradeOf, tricolons, typeFeatureTokens, typicality, unprovenClaims, validateDirection, validateHierarchy, validateJob, visibleText, visualMeasures, vocabulary, vocabularyCounts, wcagContrast, wordListsJson };
3347
+ export { ACCENT_SCALE, ACCENT_SHARED, AI_PHRASES, AI_SOURCE_TYPES, AI_VIOLET, AI_WORDS, type AccentFork, type AccentForkOptions, type Action, type ActionPosition, type Area, type ArtDirection, BASELINE_VERSION, BUZZWORDS, type Band, type Baseline, type BaselineEntry, CATALOGUE, CATALOGUE_VERSION, CHOICE_KEYS, COMPONENT_ROLES, CONSIDERATION, CONTENT_FEATURES, CONVENTION, CUSTOMER_KINDS, type Calibration, type CandidateKind, type CharacterInputs, type CharacterReport, type CheckOptions, type CheckReport, type CheckRestraintInput, type ChoiceKey, type Claim, type ClaimsReport, type CompetitorComparison, type ComponentPair, type ComponentTypicality, type Consideration, type ContrastCheck, type ContrastReport, type CopySide, type CopyTell, type CraftConfig, type CraftTokensInput, type CraftTokensResult, type CustomerKind, DEFAULT_IGNORE, DENSITIES, DENSITY_NAMES, DIRECTION_VERSION, DIRECTION_VERSIONS, DISTANCE_WEIGHTS, DURATION_MS, DURATION_S, type DensityCssOptions, type DensityName, type DirectionChoice, type DirectionComparison, type DirectionMatch, type DirectionProblem, type DirectionReport, type DirectionSource, type DirectionSummary, type DurationName, EASE, EASE_TUPLE, EDGE_STEP, ESTATE_VERSION, EXIT_RATIO, type EaseName, type EmitCssOptions, type EstateMatch, type EstatePair, type EstateRegister, type EstateSite, FINGERPRINT_VERSION, FLAGGED_TARGET, FUNCTION_WORDS, type Fact, type FactComparison, type FactKind, type Finding, type Fingerprint, type FingerprintDistance, type FingerprintSection, type FluidSpaceOptions, type FluidTypeOptions, type FluidTypeResult, type FontClass, GROUND_SCALE, GROUND_SHARED, type Gamut, type Generation, type GradientContrast, HIERARCHY_FIELDS, HOME_FILE, HOME_URL, HOUSE, HOUSE_BUDGET, HOUSE_LOCKED, HOUSE_TYPE, HUMAN_TYPICAL_TARGET, type HarvestCandidate, type HarvestOptions, type Hit, type HouseRule, type HouseTier, IMAGERY_TELLS, type ImageProvenance, type ImageRole, JSON_SCHEMA_VERSION, type JobContext, type JobMap, type JobPart, LABELS, LEXICAL_FEATURES, LICENCES, LIGHTNESS_CURVE, type Label, type LabelSummary, type LexicalFeatures, type LicenceEntry, type LicenceSubject, MIN_DECIDED, MIN_PARAGRAPHS, MIN_RUNS, MOOD, type MeasuredPage, type MotionDecision, type MotionKind, type MultiClient, NEGATIVE_REASSURANCE, NULL_VERSION, type NullModel, type NullRun, type Oklch, type OklchToHexOptions, PAGE_TYPES, PILL_LIMIT, PLAINER_WORDS, PREFERENCE, PROFILE, PROFILE_MEASURED, PROFILE_PARAGRAPHS, PROMO_BADGE, PROOF_NAMES, PROPOSED, PROVENANCE_SCAN_BYTES, type PageCopy, type PageHierarchy, type PageResult, type PageType, type PaletteColour, type PhotoReviewOptions, type PhotoReviewResult, type Proposal, type ProposeInput, RAMP_STEPS, READABLE_SNAPSHOT_VERSIONS, REFLEX_FONTS_1, REFLEX_FONTS_2, REGISTERS, REGISTER_BASELINE, REGISTER_FEATURES, REGISTER_IDS, RENDERED_PATHS, RENDERED_TELLS, REVEAL_LIMIT, REVIEW_PHRASES, type Ramp, type RampFromAnchorsOptions, type RampOptions, type RampStep, type ReasonInput, type Register, type RegisterCheck, type RegisterFeatures, type RegisterId, type RegisterProfile, type RenderedTell, type ResearchInput, type RestraintBudget, type RestraintReport, type RestraintSeverity, type RestraintViolation, type Rgb, type RgbaImage, SAMPLES_PER_SEGMENT, SCALE, SECTION_ROLES, SHADCN_LIMIT, SHADCN_PRIMITIVES, SHARED_PART, SIBLING_AT, SNAPSHOT_VERSION, SOURCE_KINDS, SPACE_STEPS, SPECIFICITY_COPY_TELLS, SPECIFICITY_RENDERED_TELLS, SPRING, STANDING_CLAIM, STOCK_AVATAR_HOSTS, STOCK_FIGURES, STOCK_PHOTO_HOSTS, STOCK_PHRASES, STUDY_WORDS, type SarifOptions, type SarifTell, type SectionGeometry, type SectionKind, type SectionRhythmOptions, type SectionRole, type SemanticInput, type SemanticResult, type Severity, type SeverityLevel, type SeverityOverride, type ShapeFeatures, type ShouldAnimateInput, type SignalResult, type Snapshot, type SnapshotColour, type SnapshotControl, type SnapshotEffects, type SnapshotFont, type SnapshotGradient, type SnapshotHeading, type SnapshotImage, type SnapshotMotion, type SnapshotPatch, type SnapshotSection, type SnapshotVisual, type SourceFile, type SourceKind, type SourceTell, type SpaceStep, type Specific, type SpecificKind, type Specificity, type StudyWord, type Surface, TELL_HEAVY, TRADE_NOUNS, TYPE_STEPS, TYPICAL_AT, type TailwindPreset, type TargetCheck, type Tell, type TellException, type TellRate, type Tricolon, type TypeStep, type Typicality, type UnmeasuredPage, VAGUE_WORDS, type ValidateContext, type Verdict, accentFork, addSite, apcaContrast, applyBaseline, applyHouseGate, applySeverity, auditSnapshot, briefTerms, calibrate, catalogueTable, characterReport, checkCopy, checkOrder, checkPair, checkPhotoReview, checkReason, checkRegister, checkRestraint, choicesOf, clauseDepth, closestComponents, compareCompetitor, compareDirections, compareFacts, compareToDeclared, compareToEstate, componentDistance, componentShared, componentTypicalities, componentTypicality, componentsOf, contentWords, countWords, craftTokens, createBaseline, cv, deltaEOk, deltaEOkHex, densityCss, densityTokens, designTells, documentParagraphs, emitCss, emptyEstate, estateComponentPairs, estatePairs, exitDuration, extractHtml, faceLicence, featureLabel, findClaims, findColours, findingKey, fingerprint, fingerprintDistance, fluidClamp, fluidSpace, fluidType, fontClass, formatCalibration, formatClaims, formatComparison, formatCompetitor, formatDirectionMatches, formatHex, formatReport, getRegister, globToRegExp, gradientContrast, gradientStops, groundName, harvest, hedgeCount, hedgedClose, hexToOklch, holdHouseBlocks, houseRule, hueName, hueSwatch, ignoreMatcher, inP3Gamut, inSrgbGamut, initDirection, isAiViolet, isBlurb, isCategoryLabel, isCream, isFlagged, jobWords, layoutDistance, lexicalOf, licencesJson, makeSnapshot, motionTokens, namedSources, nearest, nominalisations, normaliseFamily, nullPrompt, oklchToHex, oklchToRgb, pageCopy, paletteFromPixels, paragraphUniformity, parseBaseline, parseColour, parseCraftConfig, parseHex, participialClauses, phrasalCoordinations, propose, protectedFacts, ramp, rampFromAnchors, readSnapshot, registerBrief, registerOf, registersDoc, renderedOrder, researchPrompt, retrofitPlan, runTell, scanProvenance, scanSource, sectionRhythm, semantic, sentencesOf, severityExceptions, shapeMoves, shapeName, shapeOf, words as shapeWords, sharedParts, shouldAnimate, siblingLine, skeleton, skeletonRepeat, specificity, specifics, splitSentences, stackedConditional, stockAvatarSource, stockSource, summariseDirection, tailwindV3Preset, tailwindV4Theme, tellById, toGamut, toJson, toSarif, tradeOf, tricolons, typeFeatureTokens, typicality, unprovenClaims, validateDirection, validateHierarchy, validateJob, visibleText, visualMeasures, vocabulary, vocabularyCounts, wcagContrast, wordListsJson };
package/dist/index.d.ts CHANGED
@@ -159,6 +159,90 @@ interface ContrastCheck {
159
159
  /** Measure one text-on-background pair against both models. */
160
160
  declare function checkPair(text: string, background: string): ContrastCheck;
161
161
 
162
+ /**
163
+ * Contrast against a CSS gradient: the case automated tools do not score.
164
+ *
165
+ * axe-core and Lighthouse mark text on a gradient "incomplete", and it never
166
+ * reaches the result, so a page can report no contrast violations while its
167
+ * body copy fails AA. This was first found on two client sites (4.14:1 to
168
+ * 4.44:1, reported clean by every tool in CI). This walks the gradient's
169
+ * stops, composites each over what sits beneath, and scores the text against
170
+ * the worst one: the backdrop the text has to clear everywhere.
171
+ *
172
+ * WCAG 2.2 defines no method for gradient or translucent backdrops, so the
173
+ * worst point is this package's own rule, not a conformance claim.
174
+ *
175
+ * Folded in from dd-drift-guards (guards/contrast-math.mjs) on 3 October 2026,
176
+ * on craft's own colour parsing and contrast models, with one fix: the guard
177
+ * scored the stops only. The worst point can sit between two stops, wherever
178
+ * the backdrop's luminance comes closest to the text's: mid-grey text on a
179
+ * black-to-white gradient clears 4.5:1 against both ends and about 1:1 in the
180
+ * middle. So each segment is sampled, interpolated as browsers paint legacy
181
+ * colours (sRGB, premultiplied alpha). Pure.
182
+ */
183
+ /** Samples per segment between two stops: under 1/255 of a channel apart for any pair. */
184
+ declare const SAMPLES_PER_SEGMENT = 256;
185
+ /**
186
+ * The colour stops of a CSS gradient, in order, as written. Splits on
187
+ * top-level commas only, so `rgba(1, 2, 3, 0.4)` survives, and drops the
188
+ * direction or shape argument (`to bottom`, `135deg`, `circle at top`).
189
+ * Throws on a stop it cannot read: a skipped stop could be the worst one.
190
+ */
191
+ declare function gradientStops(gradient: string): string[];
192
+ interface GradientContrast {
193
+ text: string;
194
+ gradient: string;
195
+ beneath: string;
196
+ /** Every stop composited over `beneath`, as hex. */
197
+ stops: string[];
198
+ /** The point of the gradient, stop or between stops, the text contrasts least with. */
199
+ worst: string;
200
+ /** WCAG 2.x ratio against the worst point. */
201
+ wcag: number;
202
+ /** APCA Lc against the worst point, signed. */
203
+ lc: number;
204
+ passesAA: boolean;
205
+ passesAALarge: boolean;
206
+ note: string;
207
+ }
208
+ /**
209
+ * Text on a gradient that sits on `beneath` (an opaque colour; default white).
210
+ * The text colour must be opaque: a translucent text colour depends on the
211
+ * backdrop at each pixel, which is a rendered measurement, not this one.
212
+ */
213
+ declare function gradientContrast(text: string, gradient: string, beneath?: string): GradientContrast;
214
+
215
+ /**
216
+ * The photo-review gate: reads the report `halide review --json` wrote and
217
+ * fails a build whose photography is under the bar.
218
+ *
219
+ * It takes the report's text, not a path, and never runs halide. A check that
220
+ * spawns a binary cannot run where the binary is absent (a CI image, a fresh
221
+ * clone), turns a fast check slow, and depends on a tool version nobody
222
+ * pinned. The pipeline writes the report; the build reads it and hands it here.
223
+ *
224
+ * Folded in from dd-drift-guards (guards/photo-review.mjs) on 3 October 2026,
225
+ * unchanged in what it passes and fails. Pure.
226
+ */
227
+ interface PhotoReviewOptions {
228
+ /** Lowest acceptable score, overall and per image. Default 0.7. */
229
+ minScore?: number;
230
+ /**
231
+ * When false, no report is a pass: for a site with no photography at all.
232
+ * Default true, because a missing report on a site that has photos is the
233
+ * review not having run.
234
+ */
235
+ required?: boolean;
236
+ }
237
+ interface PhotoReviewResult {
238
+ ok: boolean;
239
+ failures: string[];
240
+ /** One line per thing checked, passed or not. */
241
+ report: string[];
242
+ }
243
+ /** `text` is the report's contents, or null when there is no report. */
244
+ declare function checkPhotoReview(text: string | null, options?: PhotoReviewOptions): PhotoReviewResult;
245
+
162
246
  /**
163
247
  * Semantic tokens derived from a small set of anchors, with a contrast report.
164
248
  *
@@ -925,6 +1009,13 @@ interface Snapshot {
925
1009
  * claim, not its menu or its calls to action.
926
1010
  */
927
1011
  firstScreenText?: string[];
1012
+ /**
1013
+ * Whether this is a site's home page, set by whoever knows: `craft
1014
+ * calibrate` from its labels, and `craft null build` and `null import`,
1015
+ * which ask for a home page. Absent, the URL decides (`HOME_URL`), and a
1016
+ * local file such as `pages/01.html` never reads as one.
1017
+ */
1018
+ home?: boolean;
928
1019
  /** Set when a version 1 snapshot was read and upgraded in memory. */
929
1020
  migratedFrom?: 1;
930
1021
  /** The design-system measures trawl has collected since v7, kept so it can switch to this. */
@@ -1600,6 +1691,159 @@ interface LexicalFeatures {
1600
1691
  declare const LEXICAL_FEATURES: readonly (keyof LexicalFeatures)[];
1601
1692
  declare function lexicalOf(text: string, brief?: string): LexicalFeatures;
1602
1693
 
1694
+ /**
1695
+ * Register features: the measures a writer steers by when choosing a register.
1696
+ *
1697
+ * The shape and lexical features ask whether copy reads as generated. These
1698
+ * ask something simpler: how long are the sentences, how often does the
1699
+ * writer say "you", contract a verb or use the passive. Plain writing, a
1700
+ * customer email and a literary paragraph differ on exactly these.
1701
+ *
1702
+ * Pure and zero-dependency, like `shape.ts`, whose sentence splitter and word
1703
+ * counter they share. The calibration readers call the same function, so a
1704
+ * published band describes the measure that ships.
1705
+ *
1706
+ * `passiveShare` is a heuristic: a form of "be" (optionally one adverb) then a
1707
+ * participle, with common adjectival participles ("tired", "interested")
1708
+ * excluded. It misses "get" passives and catches some predicative adjectives.
1709
+ * It is measured, not assumed, before anything relies on it.
1710
+ */
1711
+ interface RegisterFeatures {
1712
+ /** Words per sentence. */
1713
+ meanSentenceWords: number;
1714
+ /** Contracted forms per 100 words: you'll, it's, don't, we're. */
1715
+ contractionsPer100: number;
1716
+ /** you, your, yours, yourself, yourselves per 100 words. */
1717
+ youPer100: number;
1718
+ /** I, me, my, mine, we, us, our, ours per 100 words. */
1719
+ firstPersonPer100: number;
1720
+ /** Share of sentences with a passive construction. */
1721
+ passiveShare: number;
1722
+ /** Letters per word. */
1723
+ meanWordLength: number;
1724
+ }
1725
+ declare const REGISTER_FEATURES: readonly (keyof RegisterFeatures)[];
1726
+ declare function registerOf(text: string): RegisterFeatures;
1727
+
1728
+ /**
1729
+ * Register briefs: how to write in a chosen register, read before drafting.
1730
+ *
1731
+ * `COPY.md` says what every piece of house copy avoids. A register says what a
1732
+ * draft reaches for: plain for a form or a policy, persuasive for a landing
1733
+ * page, warm for a customer email, literary for a premium brand. The brief is
1734
+ * read before drafting and `craft copy` runs afterwards, the order `COPY.md`
1735
+ * sets for its own writing directives.
1736
+ *
1737
+ * Directives are positive ("do this"), never a list of phrases to avoid:
1738
+ * naming a phrase puts it in the writer's head. Each one names its source, and
1739
+ * a directive with no public authority behind it says "house judgement".
1740
+ *
1741
+ * Nothing here measures or grades. `REGISTERS.md` carries the generated text
1742
+ * of this file, bound by a test.
1743
+ */
1744
+ type RegisterId = "plain" | "persuasive" | "warm" | "literary";
1745
+ interface RegisterSource {
1746
+ name: string;
1747
+ url?: string;
1748
+ /** What this register takes from it, and anything it does not. */
1749
+ note: string;
1750
+ }
1751
+ interface Directive {
1752
+ text: string;
1753
+ /** Short source key: a `RegisterSource.name`, `COPY.md`, or "house judgement". */
1754
+ from: string;
1755
+ }
1756
+ interface Register {
1757
+ id: RegisterId;
1758
+ name: string;
1759
+ useFor: string;
1760
+ directives: Directive[];
1761
+ example: {
1762
+ before: string;
1763
+ after: string;
1764
+ why: string;
1765
+ };
1766
+ sources: RegisterSource[];
1767
+ }
1768
+ declare const REGISTERS: readonly Register[];
1769
+ declare const REGISTER_IDS: readonly RegisterId[];
1770
+ declare function getRegister(id: string): Register | undefined;
1771
+ /** The brief as plain text, for reading before a draft or pasting into a prompt. */
1772
+ declare function registerBrief(id: RegisterId): string;
1773
+ /** The generated block of REGISTERS.md. */
1774
+ declare function registersDoc(): string;
1775
+
1776
+ /**
1777
+ * `craft register check`: where a draft sits against the human baselines.
1778
+ *
1779
+ * A single short passage cannot be placed: at blurb length the registers
1780
+ * overlap too much (calibration/copy-shape/report-registers.md). Averaged over
1781
+ * five paragraphs, every register pair separates on several features. So the
1782
+ * check reads documents only, measures each blurb-sized paragraph with the
1783
+ * same functions the baselines used, averages them, and compares the average
1784
+ * with the document-level bands in `profile.ts`.
1785
+ *
1786
+ * It reports, never grades: which features fall outside the chosen
1787
+ * register's usual range, and which baseline the draft reads closest to.
1788
+ * `COPY.md` "Style is not evidence" applies: no score, no verdict.
1789
+ */
1790
+
1791
+ interface Band {
1792
+ p10: number;
1793
+ p50: number;
1794
+ p90: number;
1795
+ sd: number;
1796
+ /** Baseline registers this feature separates this one from, at document level. */
1797
+ separates: string[];
1798
+ }
1799
+ /** Baseline register -> feature -> band. */
1800
+ type RegisterProfile = Readonly<Record<string, Readonly<Record<string, Band>>>>;
1801
+ /** Which baseline each brief is compared with, and what that baseline is not. */
1802
+ declare const REGISTER_BASELINE: Readonly<Record<RegisterId, {
1803
+ baseline: string;
1804
+ note: string;
1805
+ }>>;
1806
+ declare const MIN_PARAGRAPHS = 5;
1807
+ /**
1808
+ * Features that measure what a text is about, not how it is written. Enron is
1809
+ * dense with deal names and figures because of its subject, not its register,
1810
+ * so these stay in the separation report but out of the check: a warm email
1811
+ * about a kitchen refit should not be told it names too few people.
1812
+ */
1813
+ declare const CONTENT_FEATURES: ReadonlySet<string>;
1814
+ interface Outside {
1815
+ feature: string;
1816
+ value: number;
1817
+ band: [number, number];
1818
+ direction: "higher" | "lower";
1819
+ sentence: string;
1820
+ }
1821
+ interface RegisterCheck {
1822
+ register: RegisterId;
1823
+ baseline: string;
1824
+ /** Blurb-sized paragraphs measured. */
1825
+ paragraphs: number;
1826
+ /** False under MIN_PARAGRAPHS: nothing is compared. */
1827
+ measured: boolean;
1828
+ means: Record<string, number>;
1829
+ outside: Outside[];
1830
+ /** Standardised distance to each baseline's median, closest first. */
1831
+ nearest: {
1832
+ register: string;
1833
+ distance: number;
1834
+ }[];
1835
+ note: string;
1836
+ summary: string;
1837
+ }
1838
+ declare const featureLabel: (f: string) => string;
1839
+ /** Paragraphs as the baselines read them: blank lines split, headings dropped. */
1840
+ declare function documentParagraphs(text: string): string[];
1841
+ declare function checkRegister(text: string, id: RegisterId, profile: RegisterProfile): RegisterCheck;
1842
+
1843
+ declare const PROFILE_PARAGRAPHS = 5;
1844
+ declare const PROFILE_MEASURED = "2026-09-30";
1845
+ declare const PROFILE: RegisterProfile;
1846
+
1603
1847
  /**
1604
1848
  * Specificity tells: a page that could belong to anyone.
1605
1849
  *
@@ -2993,6 +3237,8 @@ interface LabelSummary {
2993
3237
  }
2994
3238
  interface TellRate {
2995
3239
  tell: string;
3240
+ /** The catalogue generation it belongs to; null for a tell the catalogue no longer holds. */
3241
+ generation: number | null;
2996
3242
  hits: Record<Label, number>;
2997
3243
  /** Hits on `ai` and `ai-looking` pages over all hits. */
2998
3244
  precision: number;
@@ -3098,4 +3344,4 @@ declare function characterReport(input: CharacterInputs, copyTells?: Set<string>
3098
3344
 
3099
3345
  declare function retrofitPlan(report: CharacterReport, direction?: ArtDirection | null): string;
3100
3346
 
3101
- export { ACCENT_SCALE, ACCENT_SHARED, AI_PHRASES, AI_SOURCE_TYPES, AI_VIOLET, AI_WORDS, type AccentFork, type AccentForkOptions, type Action, type ActionPosition, type Area, type ArtDirection, BASELINE_VERSION, BUZZWORDS, type Baseline, type BaselineEntry, CATALOGUE, CATALOGUE_VERSION, CHOICE_KEYS, COMPONENT_ROLES, CONSIDERATION, CONVENTION, CUSTOMER_KINDS, type Calibration, type CandidateKind, type CharacterInputs, type CharacterReport, type CheckOptions, type CheckReport, type CheckRestraintInput, type ChoiceKey, type Claim, type ClaimsReport, type CompetitorComparison, type ComponentPair, type ComponentTypicality, type Consideration, type ContrastCheck, type ContrastReport, type CopySide, type CopyTell, type CraftConfig, type CraftTokensInput, type CraftTokensResult, type CustomerKind, DEFAULT_IGNORE, DENSITIES, DENSITY_NAMES, DIRECTION_VERSION, DIRECTION_VERSIONS, DISTANCE_WEIGHTS, DURATION_MS, DURATION_S, type DensityCssOptions, type DensityName, type DirectionChoice, type DirectionComparison, type DirectionMatch, type DirectionProblem, type DirectionReport, type DirectionSource, type DirectionSummary, type DurationName, EASE, EASE_TUPLE, EDGE_STEP, ESTATE_VERSION, EXIT_RATIO, type EaseName, type EmitCssOptions, type EstateMatch, type EstatePair, type EstateRegister, type EstateSite, FINGERPRINT_VERSION, FLAGGED_TARGET, FUNCTION_WORDS, type Fact, type FactComparison, type FactKind, type Finding, type Fingerprint, type FingerprintDistance, type FingerprintSection, type FluidSpaceOptions, type FluidTypeOptions, type FluidTypeResult, type FontClass, GROUND_SCALE, GROUND_SHARED, type Gamut, type Generation, HIERARCHY_FIELDS, HOME_FILE, HOME_URL, HOUSE, HOUSE_BUDGET, HOUSE_LOCKED, HOUSE_TYPE, HUMAN_TYPICAL_TARGET, type HarvestCandidate, type HarvestOptions, type Hit, type HouseRule, type HouseTier, IMAGERY_TELLS, type ImageProvenance, type ImageRole, JSON_SCHEMA_VERSION, type JobContext, type JobMap, type JobPart, LABELS, LEXICAL_FEATURES, LICENCES, LIGHTNESS_CURVE, type Label, type LabelSummary, type LexicalFeatures, type LicenceEntry, type LicenceSubject, MIN_DECIDED, MIN_RUNS, MOOD, type MeasuredPage, type MotionDecision, type MotionKind, type MultiClient, NEGATIVE_REASSURANCE, NULL_VERSION, type NullModel, type NullRun, type Oklch, type OklchToHexOptions, PAGE_TYPES, PILL_LIMIT, PLAINER_WORDS, PREFERENCE, PROMO_BADGE, PROOF_NAMES, PROPOSED, PROVENANCE_SCAN_BYTES, type PageCopy, type PageHierarchy, type PageResult, type PageType, type PaletteColour, type Proposal, type ProposeInput, RAMP_STEPS, READABLE_SNAPSHOT_VERSIONS, REFLEX_FONTS_1, REFLEX_FONTS_2, RENDERED_PATHS, RENDERED_TELLS, REVEAL_LIMIT, REVIEW_PHRASES, type Ramp, type RampFromAnchorsOptions, type RampOptions, type RampStep, type ReasonInput, type RenderedTell, type ResearchInput, type RestraintBudget, type RestraintReport, type RestraintSeverity, type RestraintViolation, type Rgb, type RgbaImage, SCALE, SECTION_ROLES, SHADCN_LIMIT, SHADCN_PRIMITIVES, SHARED_PART, SIBLING_AT, SNAPSHOT_VERSION, SOURCE_KINDS, SPACE_STEPS, SPECIFICITY_COPY_TELLS, SPECIFICITY_RENDERED_TELLS, SPRING, STANDING_CLAIM, STOCK_AVATAR_HOSTS, STOCK_FIGURES, STOCK_PHOTO_HOSTS, STOCK_PHRASES, STUDY_WORDS, type SarifOptions, type SarifTell, type SectionGeometry, type SectionKind, type SectionRhythmOptions, type SectionRole, type SemanticInput, type SemanticResult, type Severity, type SeverityLevel, type SeverityOverride, type ShapeFeatures, type ShouldAnimateInput, type SignalResult, type Snapshot, type SnapshotColour, type SnapshotControl, type SnapshotEffects, type SnapshotFont, type SnapshotGradient, type SnapshotHeading, type SnapshotImage, type SnapshotMotion, type SnapshotPatch, type SnapshotSection, type SnapshotVisual, type SourceFile, type SourceKind, type SourceTell, type SpaceStep, type Specific, type SpecificKind, type Specificity, type StudyWord, type Surface, TELL_HEAVY, TRADE_NOUNS, TYPE_STEPS, TYPICAL_AT, type TailwindPreset, type TargetCheck, type Tell, type TellException, type TellRate, type Tricolon, type TypeStep, type Typicality, type UnmeasuredPage, VAGUE_WORDS, type ValidateContext, type Verdict, accentFork, addSite, apcaContrast, applyBaseline, applyHouseGate, applySeverity, auditSnapshot, briefTerms, calibrate, catalogueTable, characterReport, checkCopy, checkOrder, checkPair, checkReason, checkRestraint, choicesOf, clauseDepth, closestComponents, compareCompetitor, compareDirections, compareFacts, compareToDeclared, compareToEstate, componentDistance, componentShared, componentTypicalities, componentTypicality, componentsOf, contentWords, countWords, craftTokens, createBaseline, cv, deltaEOk, deltaEOkHex, densityCss, densityTokens, designTells, emitCss, emptyEstate, estateComponentPairs, estatePairs, exitDuration, extractHtml, faceLicence, findClaims, findColours, findingKey, fingerprint, fingerprintDistance, fluidClamp, fluidSpace, fluidType, fontClass, formatCalibration, formatClaims, formatComparison, formatCompetitor, formatDirectionMatches, formatHex, formatReport, globToRegExp, groundName, harvest, hedgeCount, hedgedClose, hexToOklch, holdHouseBlocks, houseRule, hueName, hueSwatch, ignoreMatcher, inP3Gamut, inSrgbGamut, initDirection, isAiViolet, isBlurb, isCategoryLabel, isCream, isFlagged, jobWords, layoutDistance, lexicalOf, licencesJson, makeSnapshot, motionTokens, namedSources, nearest, nominalisations, normaliseFamily, nullPrompt, oklchToHex, oklchToRgb, pageCopy, paletteFromPixels, paragraphUniformity, parseBaseline, parseColour, parseCraftConfig, parseHex, participialClauses, phrasalCoordinations, propose, protectedFacts, ramp, rampFromAnchors, readSnapshot, renderedOrder, researchPrompt, retrofitPlan, runTell, scanProvenance, scanSource, sectionRhythm, semantic, sentencesOf, severityExceptions, shapeMoves, shapeName, shapeOf, words as shapeWords, sharedParts, shouldAnimate, siblingLine, skeleton, skeletonRepeat, specificity, specifics, splitSentences, stackedConditional, stockAvatarSource, stockSource, summariseDirection, tailwindV3Preset, tailwindV4Theme, tellById, toGamut, toJson, toSarif, tradeOf, tricolons, typeFeatureTokens, typicality, unprovenClaims, validateDirection, validateHierarchy, validateJob, visibleText, visualMeasures, vocabulary, vocabularyCounts, wcagContrast, wordListsJson };
3347
+ export { ACCENT_SCALE, ACCENT_SHARED, AI_PHRASES, AI_SOURCE_TYPES, AI_VIOLET, AI_WORDS, type AccentFork, type AccentForkOptions, type Action, type ActionPosition, type Area, type ArtDirection, BASELINE_VERSION, BUZZWORDS, type Band, type Baseline, type BaselineEntry, CATALOGUE, CATALOGUE_VERSION, CHOICE_KEYS, COMPONENT_ROLES, CONSIDERATION, CONTENT_FEATURES, CONVENTION, CUSTOMER_KINDS, type Calibration, type CandidateKind, type CharacterInputs, type CharacterReport, type CheckOptions, type CheckReport, type CheckRestraintInput, type ChoiceKey, type Claim, type ClaimsReport, type CompetitorComparison, type ComponentPair, type ComponentTypicality, type Consideration, type ContrastCheck, type ContrastReport, type CopySide, type CopyTell, type CraftConfig, type CraftTokensInput, type CraftTokensResult, type CustomerKind, DEFAULT_IGNORE, DENSITIES, DENSITY_NAMES, DIRECTION_VERSION, DIRECTION_VERSIONS, DISTANCE_WEIGHTS, DURATION_MS, DURATION_S, type DensityCssOptions, type DensityName, type DirectionChoice, type DirectionComparison, type DirectionMatch, type DirectionProblem, type DirectionReport, type DirectionSource, type DirectionSummary, type DurationName, EASE, EASE_TUPLE, EDGE_STEP, ESTATE_VERSION, EXIT_RATIO, type EaseName, type EmitCssOptions, type EstateMatch, type EstatePair, type EstateRegister, type EstateSite, FINGERPRINT_VERSION, FLAGGED_TARGET, FUNCTION_WORDS, type Fact, type FactComparison, type FactKind, type Finding, type Fingerprint, type FingerprintDistance, type FingerprintSection, type FluidSpaceOptions, type FluidTypeOptions, type FluidTypeResult, type FontClass, GROUND_SCALE, GROUND_SHARED, type Gamut, type Generation, type GradientContrast, HIERARCHY_FIELDS, HOME_FILE, HOME_URL, HOUSE, HOUSE_BUDGET, HOUSE_LOCKED, HOUSE_TYPE, HUMAN_TYPICAL_TARGET, type HarvestCandidate, type HarvestOptions, type Hit, type HouseRule, type HouseTier, IMAGERY_TELLS, type ImageProvenance, type ImageRole, JSON_SCHEMA_VERSION, type JobContext, type JobMap, type JobPart, LABELS, LEXICAL_FEATURES, LICENCES, LIGHTNESS_CURVE, type Label, type LabelSummary, type LexicalFeatures, type LicenceEntry, type LicenceSubject, MIN_DECIDED, MIN_PARAGRAPHS, MIN_RUNS, MOOD, type MeasuredPage, type MotionDecision, type MotionKind, type MultiClient, NEGATIVE_REASSURANCE, NULL_VERSION, type NullModel, type NullRun, type Oklch, type OklchToHexOptions, PAGE_TYPES, PILL_LIMIT, PLAINER_WORDS, PREFERENCE, PROFILE, PROFILE_MEASURED, PROFILE_PARAGRAPHS, PROMO_BADGE, PROOF_NAMES, PROPOSED, PROVENANCE_SCAN_BYTES, type PageCopy, type PageHierarchy, type PageResult, type PageType, type PaletteColour, type PhotoReviewOptions, type PhotoReviewResult, type Proposal, type ProposeInput, RAMP_STEPS, READABLE_SNAPSHOT_VERSIONS, REFLEX_FONTS_1, REFLEX_FONTS_2, REGISTERS, REGISTER_BASELINE, REGISTER_FEATURES, REGISTER_IDS, RENDERED_PATHS, RENDERED_TELLS, REVEAL_LIMIT, REVIEW_PHRASES, type Ramp, type RampFromAnchorsOptions, type RampOptions, type RampStep, type ReasonInput, type Register, type RegisterCheck, type RegisterFeatures, type RegisterId, type RegisterProfile, type RenderedTell, type ResearchInput, type RestraintBudget, type RestraintReport, type RestraintSeverity, type RestraintViolation, type Rgb, type RgbaImage, SAMPLES_PER_SEGMENT, SCALE, SECTION_ROLES, SHADCN_LIMIT, SHADCN_PRIMITIVES, SHARED_PART, SIBLING_AT, SNAPSHOT_VERSION, SOURCE_KINDS, SPACE_STEPS, SPECIFICITY_COPY_TELLS, SPECIFICITY_RENDERED_TELLS, SPRING, STANDING_CLAIM, STOCK_AVATAR_HOSTS, STOCK_FIGURES, STOCK_PHOTO_HOSTS, STOCK_PHRASES, STUDY_WORDS, type SarifOptions, type SarifTell, type SectionGeometry, type SectionKind, type SectionRhythmOptions, type SectionRole, type SemanticInput, type SemanticResult, type Severity, type SeverityLevel, type SeverityOverride, type ShapeFeatures, type ShouldAnimateInput, type SignalResult, type Snapshot, type SnapshotColour, type SnapshotControl, type SnapshotEffects, type SnapshotFont, type SnapshotGradient, type SnapshotHeading, type SnapshotImage, type SnapshotMotion, type SnapshotPatch, type SnapshotSection, type SnapshotVisual, type SourceFile, type SourceKind, type SourceTell, type SpaceStep, type Specific, type SpecificKind, type Specificity, type StudyWord, type Surface, TELL_HEAVY, TRADE_NOUNS, TYPE_STEPS, TYPICAL_AT, type TailwindPreset, type TargetCheck, type Tell, type TellException, type TellRate, type Tricolon, type TypeStep, type Typicality, type UnmeasuredPage, VAGUE_WORDS, type ValidateContext, type Verdict, accentFork, addSite, apcaContrast, applyBaseline, applyHouseGate, applySeverity, auditSnapshot, briefTerms, calibrate, catalogueTable, characterReport, checkCopy, checkOrder, checkPair, checkPhotoReview, checkReason, checkRegister, checkRestraint, choicesOf, clauseDepth, closestComponents, compareCompetitor, compareDirections, compareFacts, compareToDeclared, compareToEstate, componentDistance, componentShared, componentTypicalities, componentTypicality, componentsOf, contentWords, countWords, craftTokens, createBaseline, cv, deltaEOk, deltaEOkHex, densityCss, densityTokens, designTells, documentParagraphs, emitCss, emptyEstate, estateComponentPairs, estatePairs, exitDuration, extractHtml, faceLicence, featureLabel, findClaims, findColours, findingKey, fingerprint, fingerprintDistance, fluidClamp, fluidSpace, fluidType, fontClass, formatCalibration, formatClaims, formatComparison, formatCompetitor, formatDirectionMatches, formatHex, formatReport, getRegister, globToRegExp, gradientContrast, gradientStops, groundName, harvest, hedgeCount, hedgedClose, hexToOklch, holdHouseBlocks, houseRule, hueName, hueSwatch, ignoreMatcher, inP3Gamut, inSrgbGamut, initDirection, isAiViolet, isBlurb, isCategoryLabel, isCream, isFlagged, jobWords, layoutDistance, lexicalOf, licencesJson, makeSnapshot, motionTokens, namedSources, nearest, nominalisations, normaliseFamily, nullPrompt, oklchToHex, oklchToRgb, pageCopy, paletteFromPixels, paragraphUniformity, parseBaseline, parseColour, parseCraftConfig, parseHex, participialClauses, phrasalCoordinations, propose, protectedFacts, ramp, rampFromAnchors, readSnapshot, registerBrief, registerOf, registersDoc, renderedOrder, researchPrompt, retrofitPlan, runTell, scanProvenance, scanSource, sectionRhythm, semantic, sentencesOf, severityExceptions, shapeMoves, shapeName, shapeOf, words as shapeWords, sharedParts, shouldAnimate, siblingLine, skeleton, skeletonRepeat, specificity, specifics, splitSentences, stackedConditional, stockAvatarSource, stockSource, summariseDirection, tailwindV3Preset, tailwindV4Theme, tellById, toGamut, toJson, toSarif, tradeOf, tricolons, typeFeatureTokens, typicality, unprovenClaims, validateDirection, validateHierarchy, validateJob, visibleText, visualMeasures, vocabulary, vocabularyCounts, wcagContrast, wordListsJson };