@domandigital/craft 0.23.1 → 0.24.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/CHANGELOG.md +17 -5
- package/CHARACTER.md +98 -97
- package/COPY.md +3 -2
- package/PRINCIPLES.md +5 -5
- package/README.md +8 -8
- package/REGISTERS.md +3 -3
- package/design-review.schema.json +1 -1
- package/dist/{audit-DESBVHQJ.js → audit-Q73WGKMS.js} +3 -3
- package/dist/audit.cjs +88 -23
- package/dist/audit.js +88 -23
- package/dist/{chunk-GA3AJN67.js → chunk-2CCL5CO7.js} +17 -15
- package/dist/{chunk-M5QSMIT6.js → chunk-4HPAMB52.js} +4 -4
- package/dist/{chunk-LRWKKJIW.js → chunk-6TOY3FAT.js} +5 -5
- package/dist/{chunk-GDDBCHQR.js → chunk-GJZ4Y5PT.js} +5 -5
- package/dist/{chunk-ZV3FPQPM.js → chunk-OA2MBUJJ.js} +1 -1
- package/dist/{chunk-V3GJSISR.js → chunk-OOT4QLO3.js} +14 -14
- package/dist/{chunk-7DPB5G4G.js → chunk-PXJKYMXF.js} +2 -2
- package/dist/{chunk-EHMEMSM2.js → chunk-R4KPE4G5.js} +72 -9
- package/dist/{cli-FCFRPPHZ.js → cli-766R2BUR.js} +5 -5
- package/dist/{cli-3PFEOEQI.js → cli-CE7ENNNG.js} +6 -6
- package/dist/{cli-SOH4QMMW.js → cli-DTJOOTNM.js} +3 -3
- package/dist/{cli-36YQA6BP.js → cli-EQJITFVE.js} +4 -4
- package/dist/{cli-RXXGSKD6.js → cli-SD2BJSGP.js} +6 -6
- package/dist/{cli-TP5ZMJOL.js → cli-TBBXUECM.js} +5 -5
- package/dist/{cli-YOSHHLIV.js → cli-TV2IJ5TV.js} +2 -3
- package/dist/{cli-7IBKMUMM.js → cli-U3SPFILJ.js} +9 -9
- package/dist/cli.js +3 -3
- package/dist/index.cjs +89 -25
- package/dist/index.d.cts +10 -10
- package/dist/index.d.ts +10 -10
- package/dist/index.js +89 -25
- package/dist/{viewports-cli-ET664I2Y.js → viewports-cli-SOOHAD5D.js} +3 -3
- package/package.json +1 -1
- package/word-lists.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1841,6 +1841,29 @@ var PARALLEL_PAIR = [
|
|
|
1841
1841
|
// a verbless list as a tagline: "Service account, match-day reminders, analytics."
|
|
1842
1842
|
/^[ \t]*(?:#{1,6}[ \t]+)?[A-Z][\w'’-]*(?:[ \t]+(?!(?:and|or)\b)[\w'’-]+){0,2}(?:,[ \t]+(?!(?:and|or)\b)[\w'’-]+(?:[ \t]+(?!(?:and|or)\b)[\w'’-]+){0,2}){2,3}\.[ \t]*$/m
|
|
1843
1843
|
];
|
|
1844
|
+
var CLAUSE_START = String.raw`(?<=^[ \t]*(?:[-*][ \t]+|#{1,6}[ \t]+)?|[;:,(—–][ \t]*|[.!?][ \t]+)`;
|
|
1845
|
+
var ABSOLUTE_NEGATION = new RegExp(
|
|
1846
|
+
`${CLAUSE_START}(?:never|nothing|nobody|no[ \\t]+one|no)(?:[ \\t]+[\\w'\u2019\xA3$\u20AC-]+){1,6}(?=[ \\t]*(?:[.,;:!?)"\u201D\u2014\u2013]|$))`,
|
|
1847
|
+
"im"
|
|
1848
|
+
);
|
|
1849
|
+
var FINITE = /^(?:is|are|was|were|am|be|been|being|has|have|had|do|does|did|can|could|will|would|shall|should|may|might|must|need|needs|gets|got|goes|went|comes|came|makes|means|matters|happens|stays|changes|works|takes|says|knows|seems|feels|looks|leaves|left|appears|uses|runs|shows|sends|holds|reads|writes|opens|stores|reaches|applies|isn['’]t|aren['’]t|wasn['’]t)$/i;
|
|
1850
|
+
var NO_IDIOM = /^(?:date|longer|later|sooner|matter|more|less|fewer|other|one|doubt|wonder|thanks|problem)$/i;
|
|
1851
|
+
var PARTICIPLE = /^[\w-]*(?:ed|en|wn|ld|lt|nt|pt|ne|id)$/i;
|
|
1852
|
+
function notAbsoluteFragment(block, match, index) {
|
|
1853
|
+
const [head, ...rest] = match.trim().split(/[ \t]+/);
|
|
1854
|
+
let words3 = rest;
|
|
1855
|
+
const lead = head.toLowerCase();
|
|
1856
|
+
if (lead === "no" && words3[0]?.toLowerCase() === "one") words3 = words3.slice(1);
|
|
1857
|
+
else if (lead === "no" && NO_IDIOM.test(words3[0] ?? "")) return true;
|
|
1858
|
+
if (words3.some((w) => FINITE.test(w) || /['’](?:s|re|ve|ll|d)$/i.test(w))) return true;
|
|
1859
|
+
if (lead === "never" && !PARTICIPLE.test(words3[0] ?? "")) return true;
|
|
1860
|
+
if (lead !== "no" && lead !== "never" && /^(?!else$|less$|across$)[a-z]+s$/i.test(words3[0] ?? "")) return true;
|
|
1861
|
+
const sentence = lineAround(block.text, index);
|
|
1862
|
+
const line = sentence.trim().replace(/^[-*]\s+/, "");
|
|
1863
|
+
if (NO_X_NO_Y.test(sentence) || NO_X_BADGE.test(line)) return true;
|
|
1864
|
+
if (NEGATIVE_REASSURANCE.some((p) => wordList([p]).test(match))) return true;
|
|
1865
|
+
return emptyState(block, match, index);
|
|
1866
|
+
}
|
|
1844
1867
|
var alreadyBlocked = (block, match, index) => {
|
|
1845
1868
|
const before = block.text.slice(0, index);
|
|
1846
1869
|
const start = Math.max(before.search(/[^.!?\n]*$/), 0);
|
|
@@ -1967,7 +1990,7 @@ var COPY_TELLS = [
|
|
|
1967
1990
|
fixtures: {
|
|
1968
1991
|
flag: [
|
|
1969
1992
|
f("content/home.md", "Your options, in plain English."),
|
|
1970
|
-
//
|
|
1993
|
+
// A reviewer's draft lines, Pastel 986559 #12 and #13 (the diagnosis taken, the wording not).
|
|
1971
1994
|
f("content/clinics.md", "Tell us what's happening and we'll say plainly what we would take on."),
|
|
1972
1995
|
f("content/pricing.md", "DD's payment terms, plainly stated."),
|
|
1973
1996
|
f("content/clinics.md", "We explain our findings in plain terms."),
|
|
@@ -2093,7 +2116,7 @@ var COPY_TELLS = [
|
|
|
2093
2116
|
fixtures: {
|
|
2094
2117
|
flag: [
|
|
2095
2118
|
// From the portal's seeded prospect follow-ups, 2026-10-19.
|
|
2096
|
-
f("emails/followup.md", "Alright Dave, it's
|
|
2119
|
+
f("emails/followup.md", "Alright Dave, it's Sam. No pressure, have a look when you get a min."),
|
|
2097
2120
|
f("emails/followup.md", "All good if you're not fussed mate, I'll leave it there."),
|
|
2098
2121
|
f("emails/followup.md", "Carlo, built the shop a proper site."),
|
|
2099
2122
|
f("content/contact.md", "No worries, we'll get you sorted."),
|
|
@@ -2106,11 +2129,11 @@ var COPY_TELLS = [
|
|
|
2106
2129
|
f("content/home.md", "Proper planning saves a second visit."),
|
|
2107
2130
|
f("content/certificates.md", "Download a sorted list of certificates, sorted by date."),
|
|
2108
2131
|
f("content/directions.md", "At the junction, take the right then left turn."),
|
|
2109
|
-
//
|
|
2132
|
+
// A barber client's own approved line, and "mate" as a noun.
|
|
2110
2133
|
f("content/home.md", "Every cut starts with a proper chat about what you actually want."),
|
|
2111
2134
|
f("content/home.md", "It feels like getting a cut from a mate who knows what he is doing."),
|
|
2112
2135
|
f("emails/quote.md", "Have a look at the quote and ring me if Thursday does not work."),
|
|
2113
|
-
f("content/contact.md", "Give us a ring on
|
|
2136
|
+
f("content/contact.md", "Give us a ring on 01632 960123. We take a look at the fault before quoting."),
|
|
2114
2137
|
f("content/home.md", "Built to last, and made for older houses.")
|
|
2115
2138
|
]
|
|
2116
2139
|
}
|
|
@@ -2122,14 +2145,14 @@ var COPY_TELLS = [
|
|
|
2122
2145
|
severity: "warn",
|
|
2123
2146
|
surface: "copy",
|
|
2124
2147
|
why: "'What this is and is not', 'we have not yet built', 'our experience so far is one practice', 'what we would and wouldn't take on': a model scopes a business by confessing its limits. It reads as small print, and it turns a buyer away before they make contact.",
|
|
2125
|
-
fix: "Scope by being precise about what is true, and leave the door open: 'Built and run by us for
|
|
2148
|
+
fix: "Scope by being precise about what is true, and leave the door open: 'Built and run by us for a children's therapy practice whose clinicians work across several sites.' Keep contractual facts (eligibility, who runs what) and say them as what the buyer gets.",
|
|
2126
2149
|
detect: phrases(CONFESSION, quoted),
|
|
2127
2150
|
fixtures: {
|
|
2128
2151
|
flag: [
|
|
2129
|
-
// Each one from the
|
|
2152
|
+
// Each one from the studio's own site, as a reviewer flagged it (Pastel 986559 #8, #12, #13).
|
|
2130
2153
|
f("content/clinics.md", "What this is and is not: a practice portal we built and run for one practice."),
|
|
2131
2154
|
f("content/clinics.md", "We have not yet built and run the digital systems of a practice with several clinicians."),
|
|
2132
|
-
f("content/home.md", "Including the client portal we run for
|
|
2155
|
+
f("content/home.md", "Including the client portal we run for a therapy practice. Our clinic experience so far is one practice."),
|
|
2133
2156
|
f("content/clinics.md", "Tell us what's happening and we'll say what we would and wouldn't take on."),
|
|
2134
2157
|
f("content/clinics.md", "We will say what carries over from this work and what we would need to learn first."),
|
|
2135
2158
|
f("content/clinics.md", "We will tell you where our experience applies directly and where it is close."),
|
|
@@ -2138,8 +2161,8 @@ var COPY_TELLS = [
|
|
|
2138
2161
|
f("content/mobile.md", "Mobile is our newest line, so we tell you what we have and haven't done.")
|
|
2139
2162
|
],
|
|
2140
2163
|
pass: [
|
|
2141
|
-
f("content/clinics.md", "Built and run by us for
|
|
2142
|
-
f("content/home.md", "The client portal we run for
|
|
2164
|
+
f("content/clinics.md", "Built and run by us for a therapy practice, a growing one whose clinicians work remotely."),
|
|
2165
|
+
f("content/home.md", "The client portal we run for a children's therapy practice."),
|
|
2143
2166
|
// Contractual facts, said as they are.
|
|
2144
2167
|
f("content/pricing.md", "Pay monthly is open to UK residents aged 18 and over, subject to status."),
|
|
2145
2168
|
f("content/pricing.md", "Your monthly payments do not buy the site; the buy-out price does."),
|
|
@@ -2379,6 +2402,46 @@ var COPY_TELLS = [
|
|
|
2379
2402
|
]
|
|
2380
2403
|
}
|
|
2381
2404
|
},
|
|
2405
|
+
{
|
|
2406
|
+
id: "absolute-negation",
|
|
2407
|
+
name: "Absolute negation fragment",
|
|
2408
|
+
generation: 2,
|
|
2409
|
+
severity: "warn",
|
|
2410
|
+
surface: "copy",
|
|
2411
|
+
why: "'never pre-ticked', 'no servers', 'nothing to buy or run': a verbless fragment that opens on never, nothing, nobody or 'no' + noun. Read aloud it sounds rigid, it promises an absolute the copy rarely means, and it defines the thing by what it is not.",
|
|
2412
|
+
fix: "Say what happens, as a sentence: 'A guardian ticks the consent box in the email.', 'Microsoft runs the servers.' Keep the absolute only where it is literally true and the reader needs it, and give it a subject and a verb.",
|
|
2413
|
+
detect: phrases([ABSOLUTE_NEGATION], quoted, allText, notAbsoluteFragment),
|
|
2414
|
+
fixtures: {
|
|
2415
|
+
flag: [
|
|
2416
|
+
// From a 92EL deck that passed the gate, October 2026.
|
|
2417
|
+
f("content/deck.md", "A guardian consents by email; never pre-ticked."),
|
|
2418
|
+
f("content/deck.md", "Pay per user per month; no servers."),
|
|
2419
|
+
f("content/deck.md", "Microsoft runs it, so there is less to manage: nothing to buy or run."),
|
|
2420
|
+
f("content/deck.md", "Players register on their phone. Nothing on-site to join."),
|
|
2421
|
+
f("content/deck.md", "Each player is checked against the list once, no duplicates."),
|
|
2422
|
+
f("app/slide.tsx", `export const note = "Nobody to chase for a form.";`)
|
|
2423
|
+
],
|
|
2424
|
+
pass: [
|
|
2425
|
+
f("content/report.md", "Players never open the lists."),
|
|
2426
|
+
f("content/report.md", "Nothing is copied by hand."),
|
|
2427
|
+
f("content/report.md", "It is not tested at national scale."),
|
|
2428
|
+
f("content/report.md", "Never share your password with anyone."),
|
|
2429
|
+
f("content/report.md", "No one knows the password but the club secretary."),
|
|
2430
|
+
// A Harvard citation with no date.
|
|
2431
|
+
f("content/report.md", "Children's data needs a lawful basis (ICO, no date)."),
|
|
2432
|
+
f("content/report.md", "- Information Commissioner's Office (ICO), no date. Children and the UK GDPR."),
|
|
2433
|
+
// A form answer option.
|
|
2434
|
+
f("content/form.md", "Is the player under 18?\n\n- Yes\n- No"),
|
|
2435
|
+
f("app/form.tsx", `export const options = ["Yes", "No"];`),
|
|
2436
|
+
f("content/form.md", "No, the player is 18 or over."),
|
|
2437
|
+
f("content/home.md", "We no longer post paper forms."),
|
|
2438
|
+
f("content/report.md", "If the check fails, nothing new appears in the list."),
|
|
2439
|
+
// The blocking tells report these.
|
|
2440
|
+
f("content/home.md", "We reply within a day. No obligation, no spam."),
|
|
2441
|
+
f("app/list.tsx", `export const empty = "No results found.";`)
|
|
2442
|
+
]
|
|
2443
|
+
}
|
|
2444
|
+
},
|
|
2382
2445
|
{
|
|
2383
2446
|
id: "where-x-meets-y",
|
|
2384
2447
|
name: "'Where X meets Y'",
|
|
@@ -3889,7 +3952,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
3889
3952
|
generation: 1,
|
|
3890
3953
|
severity: "warn",
|
|
3891
3954
|
surface: "source",
|
|
3892
|
-
why: "When every block fades up on scroll, the motion stops meaning anything and the page feels slow.
|
|
3955
|
+
why: "When every block fades up on scroll, the motion stops meaning anything and the page feels slow. One salon client's site had 70, the studio's own 40, a therapy practice's 27.",
|
|
3893
3956
|
fix: `Keep one gated signature moment per page (STANDARD section 7) and let the rest arrive still. The limit here is ${REVEAL_LIMIT} per scan.`,
|
|
3894
3957
|
detect: revealHits,
|
|
3895
3958
|
fixtures: {
|
|
@@ -3905,7 +3968,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
3905
3968
|
generation: 1,
|
|
3906
3969
|
severity: "warn",
|
|
3907
3970
|
surface: "source",
|
|
3908
|
-
why: "rounded-full on every button, badge and tag is the framework's friendliest default.
|
|
3971
|
+
why: "rounded-full on every button, badge and tag is the framework's friendliest default. One salon client's site had 162, the studio's own 125. A shape used everywhere is not a shape language.",
|
|
3909
3972
|
fix: `Choose the shape language on purpose (and record it), then use the pill only where it means something. The limit here is ${PILL_LIMIT} per scan.`,
|
|
3910
3973
|
detect: pillHits,
|
|
3911
3974
|
fixtures: {
|
|
@@ -3920,7 +3983,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
3920
3983
|
generation: 1,
|
|
3921
3984
|
severity: "warn",
|
|
3922
3985
|
surface: "source",
|
|
3923
|
-
why: "A generator exports the whole shadcn/ui kit whether the site uses it or not.
|
|
3986
|
+
why: "A generator exports the whole shadcn/ui kit whether the site uses it or not. One client's journal site ships a full set under its own book, vine and petal assets.",
|
|
3924
3987
|
fix: "Delete the primitives nothing imports. Restyle the ones that stay so they belong to this site.",
|
|
3925
3988
|
detect: shadcnHits,
|
|
3926
3989
|
fixtures: {
|
|
@@ -3978,7 +4041,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
3978
4041
|
f3("components/Hero.tsx", `<span className="font-serif italic">reimagined</span>`),
|
|
3979
4042
|
f3("app/globals.css", `.hero h1 { font-style: italic; }`)
|
|
3980
4043
|
],
|
|
3981
|
-
pass: [f3("components/Hero.tsx", `<h1 className="font-display text-6xl">Nails in
|
|
4044
|
+
pass: [f3("components/Hero.tsx", `<h1 className="font-display text-6xl">Nails in Kettering</h1>
|
|
3982
4045
|
<p><em>Walk-ins</em> welcome.</p>`)]
|
|
3983
4046
|
}
|
|
3984
4047
|
},
|
|
@@ -3994,11 +4057,11 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
3994
4057
|
fixtures: {
|
|
3995
4058
|
flag: [
|
|
3996
4059
|
f3("components/Hero.tsx", `<span className="inline-flex rounded-full border px-3 py-1 text-xs">Now booking</span>
|
|
3997
|
-
<h1>Nails in
|
|
4060
|
+
<h1>Nails in Kettering</h1>`),
|
|
3998
4061
|
f3("components/Hero.tsx", `<span className={cn("rounded-full px-3 text-xs", "bg-rose-500/10")}>New</span>
|
|
3999
4062
|
<h1>Nails</h1>`)
|
|
4000
4063
|
],
|
|
4001
|
-
pass: [f3("components/Hero.tsx", `<h1>Nails in
|
|
4064
|
+
pass: [f3("components/Hero.tsx", `<h1>Nails in Kettering</h1>
|
|
4002
4065
|
<span className="inline-flex rounded-full border px-3 py-1 text-xs">Tag</span>`)]
|
|
4003
4066
|
}
|
|
4004
4067
|
},
|
|
@@ -4013,7 +4076,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
4013
4076
|
detect: heroCtaPairHits,
|
|
4014
4077
|
fixtures: {
|
|
4015
4078
|
flag: [
|
|
4016
|
-
//
|
|
4079
|
+
// A reviewer's #5 and #36 (Pastel 986559): the studio's own hero and process close.
|
|
4017
4080
|
f3(
|
|
4018
4081
|
"src/components/Hero.astro",
|
|
4019
4082
|
`<section class="hero">
|
|
@@ -4022,20 +4085,20 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
4022
4085
|
<a href="/work" class="btn btn-ghost">See our work</a>
|
|
4023
4086
|
</section>`
|
|
4024
4087
|
),
|
|
4025
|
-
// The null build's hero, verbatim in shape (
|
|
4088
|
+
// The null build's hero, verbatim in shape (an electrician brief's null pages, in the private dd-craft-corpus).
|
|
4026
4089
|
f3(
|
|
4027
4090
|
"index.html",
|
|
4028
4091
|
`<nav><a class="btn" href="#contact">Quote</a></nav>
|
|
4029
4092
|
<section id="hero" class="hero">
|
|
4030
|
-
<h1>Electricians in
|
|
4093
|
+
<h1>Electricians in Reading</h1>
|
|
4031
4094
|
<a href="#contact" class="btn btn-primary">Book a Free Quote</a>
|
|
4032
|
-
<a href="tel:+
|
|
4095
|
+
<a href="tel:+441632960210" class="btn btn-outline">Call 01632 960 210</a>
|
|
4033
4096
|
</section>`
|
|
4034
4097
|
),
|
|
4035
4098
|
f3(
|
|
4036
4099
|
"app/page.tsx",
|
|
4037
4100
|
`<section className="relative py-24">
|
|
4038
|
-
<h1 className="text-5xl">Nails in
|
|
4101
|
+
<h1 className="text-5xl">Nails in Kettering</h1>
|
|
4039
4102
|
<div className="flex gap-4">
|
|
4040
4103
|
<Button asChild><a href="/book">Book now</a></Button>
|
|
4041
4104
|
<Button variant="outline">View treatments</Button>
|
|
@@ -4064,7 +4127,7 @@ const inter = Inter({ subsets: ["latin"] });`),
|
|
|
4064
4127
|
</header>`
|
|
4065
4128
|
),
|
|
4066
4129
|
f3("app/page.tsx", `<section className="py-24">
|
|
4067
|
-
<h1 className="text-5xl">Nails in
|
|
4130
|
+
<h1 className="text-5xl">Nails in Kettering</h1>
|
|
4068
4131
|
<a className="rounded bg-ink px-5 py-3" href="/book">Book now</a>
|
|
4069
4132
|
</section>
|
|
4070
4133
|
<section><a className="rounded bg-ink px-5 py-3" href="/prices">Prices</a></section>`)
|
|
@@ -5312,13 +5375,15 @@ var HOUSE = {
|
|
|
5312
5375
|
"stock-email-line": { tier: "review", label: "stock email line, start with the reason for writing and end with the next step" },
|
|
5313
5376
|
// New 2026-10-19 (founder): review first, like every new tell, until estate hits are read.
|
|
5314
5377
|
"matey-register": { tier: "review", label: "matey register, write plain and complete British English" },
|
|
5315
|
-
// New 2026-10-20 (founder, from
|
|
5378
|
+
// New 2026-10-20 (founder, from a reviewer's notes): review first, like every new tell.
|
|
5316
5379
|
"confession-line": { tier: "review", label: "confession line, scope the work by saying precisely what is true" },
|
|
5317
5380
|
// New 2026-10-23 (a 92EL report passed the gate with three): review, because a
|
|
5318
5381
|
// genuine disclaimer has the same shape. The gerund pair joined not-just-but.
|
|
5319
5382
|
// New 2026-10-23 (founder, from 92EL deliverables): review, since a short slide label is often fine.
|
|
5320
5383
|
"parallel-pair": { tier: "review", label: "verbless parallel pair, write the sentence it stands for" },
|
|
5321
5384
|
"trailing-contrast": { tier: "review", label: "trailing contrast. Say the positive claim, unless it is a disclaimer the reader needs" },
|
|
5385
|
+
// New 2026-10-26 (founder, from a 92EL deck): review first, like every new tell, until estate hits are read.
|
|
5386
|
+
"absolute-negation": { tier: "review", label: "absolute negation fragment. Say what happens, as a sentence with a subject and a verb" },
|
|
5322
5387
|
"ai-vocabulary": { tier: "review", label: "AI vocabulary" },
|
|
5323
5388
|
"stock-phrase": { tier: "review", label: "stock phrase" },
|
|
5324
5389
|
"hollow-imperative": { tier: "review", label: "hollow imperative" },
|
|
@@ -6551,7 +6616,7 @@ var IMAGERY_TELLS = [
|
|
|
6551
6616
|
];
|
|
6552
6617
|
|
|
6553
6618
|
// src/character/check.ts
|
|
6554
|
-
var CATALOGUE_VERSION = "2026.10.
|
|
6619
|
+
var CATALOGUE_VERSION = "2026.10.9";
|
|
6555
6620
|
var CATALOGUE = [
|
|
6556
6621
|
...[...SOURCE_TELLS, ...COPY_TELLS, ...RESEARCH_TELLS, ...DENSITY_TELLS].map((t) => RENDERED_PATHS[t.id] ? { ...t, rendered: RENDERED_PATHS[t.id] } : t),
|
|
6557
6622
|
...SPECIFICITY_COPY_TELLS,
|
|
@@ -7345,8 +7410,7 @@ var REGISTERS = [
|
|
|
7345
7410
|
note: "No public style authority exists for premium-brand prose. These directives are house judgement, to be revised as the estate grows."
|
|
7346
7411
|
},
|
|
7347
7412
|
{
|
|
7348
|
-
name: "Register separation, 2026-09-29",
|
|
7349
|
-
url: "calibration/copy-shape/report-registers.md",
|
|
7413
|
+
name: "Register separation, 2026-09-29 (report in the private craft corpus)",
|
|
7350
7414
|
note: "Literary prose (Gutenberg) carries about twice the comma density of the other human registers, the one feature that separated it from all four. Longer, jointed sentences are normal here."
|
|
7351
7415
|
}
|
|
7352
7416
|
]
|
|
@@ -16,13 +16,13 @@ import {
|
|
|
16
16
|
} from "./chunk-XSKLVEI6.js";
|
|
17
17
|
import {
|
|
18
18
|
loadPlaywright
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-OA2MBUJJ.js";
|
|
20
20
|
import "./chunk-JYNXGCYZ.js";
|
|
21
21
|
import {
|
|
22
22
|
toJson
|
|
23
23
|
} from "./chunk-QIEDBL4J.js";
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
24
|
+
import "./chunk-2CCL5CO7.js";
|
|
25
|
+
import "./chunk-R4KPE4G5.js";
|
|
26
26
|
import "./chunk-QYBAVU3P.js";
|
|
27
27
|
|
|
28
28
|
// src/phone/viewports-cli.ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@domandigital/craft",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.24.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "The Doman Digital house craft standard as numbers: OKLCh colour ramps that snap to existing anchors, derived semantic tokens with measured WCAG and APCA contrast, one shared motion vocabulary for CSS and JS, and a base stylesheet. Zero dependencies.",
|
|
6
6
|
"license": "Apache-2.0",
|
package/word-lists.json
CHANGED