@argus-design/protocol 2026.4.12
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.mts +468 -0
- package/dist/index.d.ts +468 -0
- package/dist/index.js +309 -0
- package/dist/index.mjs +265 -0
- package/package.json +26 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
type Result<T, E = ArgusError> = {
|
|
2
|
+
ok: true;
|
|
3
|
+
value: T;
|
|
4
|
+
} | {
|
|
5
|
+
ok: false;
|
|
6
|
+
error: E;
|
|
7
|
+
};
|
|
8
|
+
declare function ok<T>(value: T): Result<T, never>;
|
|
9
|
+
declare function err<E>(error: E): Result<never, E>;
|
|
10
|
+
interface ArgusError {
|
|
11
|
+
code: string;
|
|
12
|
+
message: string;
|
|
13
|
+
details?: Record<string, unknown>;
|
|
14
|
+
}
|
|
15
|
+
interface Box {
|
|
16
|
+
x: number;
|
|
17
|
+
y: number;
|
|
18
|
+
width: number;
|
|
19
|
+
height: number;
|
|
20
|
+
}
|
|
21
|
+
interface Spacing {
|
|
22
|
+
top: number;
|
|
23
|
+
right: number;
|
|
24
|
+
bottom: number;
|
|
25
|
+
left: number;
|
|
26
|
+
}
|
|
27
|
+
interface Point {
|
|
28
|
+
x: number;
|
|
29
|
+
y: number;
|
|
30
|
+
}
|
|
31
|
+
interface ElementSnapshot {
|
|
32
|
+
/** Unique CSS selector path for this element */
|
|
33
|
+
selector: string;
|
|
34
|
+
/** HTML tag name (lowercase) */
|
|
35
|
+
tagName: string;
|
|
36
|
+
/** Bounding box relative to viewport */
|
|
37
|
+
box: Box;
|
|
38
|
+
/** Computed margin values */
|
|
39
|
+
margin: Spacing;
|
|
40
|
+
/** Computed padding values */
|
|
41
|
+
padding: Spacing;
|
|
42
|
+
/** Visible text content (truncated to 200 chars) */
|
|
43
|
+
textContent: string;
|
|
44
|
+
/** Key computed styles */
|
|
45
|
+
computedStyles: ComputedStyleMap;
|
|
46
|
+
/** Accessibility properties */
|
|
47
|
+
accessibility: AccessibilityInfo;
|
|
48
|
+
/** Element attributes (filtered to meaningful ones) */
|
|
49
|
+
attributes: Record<string, string>;
|
|
50
|
+
/** Depth in DOM tree (0 = document.body) */
|
|
51
|
+
depth: number;
|
|
52
|
+
/** Number of direct children */
|
|
53
|
+
childCount: number;
|
|
54
|
+
/** Parent element selector (null for body) */
|
|
55
|
+
parentSelector: string | null;
|
|
56
|
+
/** Whether element is visible (not display:none, visibility:hidden, opacity:0) */
|
|
57
|
+
isVisible: boolean;
|
|
58
|
+
/** Whether element is interactive (button, link, input, etc.) */
|
|
59
|
+
isInteractive: boolean;
|
|
60
|
+
/** Z-index stacking context */
|
|
61
|
+
stackingContext: StackingContext | null;
|
|
62
|
+
}
|
|
63
|
+
interface ComputedStyleMap {
|
|
64
|
+
fontFamily: string;
|
|
65
|
+
fontSize: string;
|
|
66
|
+
fontWeight: string;
|
|
67
|
+
lineHeight: string;
|
|
68
|
+
letterSpacing: string;
|
|
69
|
+
textAlign: string;
|
|
70
|
+
textDecoration: string;
|
|
71
|
+
textTransform: string;
|
|
72
|
+
color: string;
|
|
73
|
+
backgroundColor: string;
|
|
74
|
+
borderColor: string;
|
|
75
|
+
opacity: string;
|
|
76
|
+
display: string;
|
|
77
|
+
position: string;
|
|
78
|
+
flexDirection: string;
|
|
79
|
+
flexWrap: string;
|
|
80
|
+
justifyContent: string;
|
|
81
|
+
alignItems: string;
|
|
82
|
+
gridTemplateColumns: string;
|
|
83
|
+
gridTemplateRows: string;
|
|
84
|
+
gap: string;
|
|
85
|
+
width: string;
|
|
86
|
+
height: string;
|
|
87
|
+
maxWidth: string;
|
|
88
|
+
minHeight: string;
|
|
89
|
+
borderRadius: string;
|
|
90
|
+
borderWidth: string;
|
|
91
|
+
borderStyle: string;
|
|
92
|
+
boxShadow: string;
|
|
93
|
+
overflow: string;
|
|
94
|
+
cursor: string;
|
|
95
|
+
transition: string;
|
|
96
|
+
transform: string;
|
|
97
|
+
customProperties: Record<string, string>;
|
|
98
|
+
}
|
|
99
|
+
interface AccessibilityInfo {
|
|
100
|
+
role: string | null;
|
|
101
|
+
ariaLabel: string | null;
|
|
102
|
+
ariaDescribedBy: string | null;
|
|
103
|
+
ariaHidden: boolean;
|
|
104
|
+
tabIndex: number | null;
|
|
105
|
+
hasAltText: boolean | null;
|
|
106
|
+
contrastRatio: number | null;
|
|
107
|
+
wcagLevel: "AAA" | "AA" | "fail" | null;
|
|
108
|
+
}
|
|
109
|
+
interface StackingContext {
|
|
110
|
+
zIndex: number;
|
|
111
|
+
isRoot: boolean;
|
|
112
|
+
reason: string;
|
|
113
|
+
}
|
|
114
|
+
interface PageSnapshot {
|
|
115
|
+
/** Page URL or identifier */
|
|
116
|
+
url: string;
|
|
117
|
+
/** Page title */
|
|
118
|
+
title: string;
|
|
119
|
+
/** Viewport dimensions */
|
|
120
|
+
viewport: {
|
|
121
|
+
width: number;
|
|
122
|
+
height: number;
|
|
123
|
+
};
|
|
124
|
+
/** Document language */
|
|
125
|
+
lang: string;
|
|
126
|
+
/** Timestamp of snapshot */
|
|
127
|
+
timestamp: number;
|
|
128
|
+
/** All inspected elements */
|
|
129
|
+
elements: ElementSnapshot[];
|
|
130
|
+
/** Page-level metadata */
|
|
131
|
+
meta: PageMeta;
|
|
132
|
+
/** Color palette extracted from the page */
|
|
133
|
+
colorPalette: ColorEntry[];
|
|
134
|
+
/** Typography scale found on the page */
|
|
135
|
+
typographyScale: TypographyEntry[];
|
|
136
|
+
/** Spacing values found on the page */
|
|
137
|
+
spacingValues: number[];
|
|
138
|
+
}
|
|
139
|
+
interface PageMeta {
|
|
140
|
+
/** Total number of DOM elements */
|
|
141
|
+
totalElements: number;
|
|
142
|
+
/** Number of visible elements */
|
|
143
|
+
visibleElements: number;
|
|
144
|
+
/** Number of interactive elements */
|
|
145
|
+
interactiveElements: number;
|
|
146
|
+
/** Number of images */
|
|
147
|
+
imageCount: number;
|
|
148
|
+
/** Number of links */
|
|
149
|
+
linkCount: number;
|
|
150
|
+
/** Number of headings (h1–h6) */
|
|
151
|
+
headingCount: number;
|
|
152
|
+
/** Whether page uses CSS Grid anywhere */
|
|
153
|
+
usesGrid: boolean;
|
|
154
|
+
/** Whether page uses Flexbox anywhere */
|
|
155
|
+
usesFlex: boolean;
|
|
156
|
+
/** Whether page uses CSS custom properties */
|
|
157
|
+
usesCustomProperties: boolean;
|
|
158
|
+
/** Document scroll height */
|
|
159
|
+
scrollHeight: number;
|
|
160
|
+
/** Number of distinct font families */
|
|
161
|
+
fontFamilyCount: number;
|
|
162
|
+
/** Number of distinct colors */
|
|
163
|
+
colorCount: number;
|
|
164
|
+
}
|
|
165
|
+
interface ColorEntry {
|
|
166
|
+
value: string;
|
|
167
|
+
count: number;
|
|
168
|
+
usage: "text" | "background" | "border" | "other";
|
|
169
|
+
}
|
|
170
|
+
interface TypographyEntry {
|
|
171
|
+
fontSize: string;
|
|
172
|
+
fontWeight: string;
|
|
173
|
+
fontFamily: string;
|
|
174
|
+
lineHeight: string;
|
|
175
|
+
count: number;
|
|
176
|
+
elements: string[];
|
|
177
|
+
}
|
|
178
|
+
type Severity = "error" | "warning" | "info" | "pass";
|
|
179
|
+
type RuleCategory = "spacing" | "typography" | "color" | "hierarchy" | "accessibility" | "consistency";
|
|
180
|
+
declare const RULE_CATEGORIES: RuleCategory[];
|
|
181
|
+
interface Finding {
|
|
182
|
+
/** Rule that produced this finding */
|
|
183
|
+
ruleId: string;
|
|
184
|
+
/** Severity level */
|
|
185
|
+
severity: Severity;
|
|
186
|
+
/** Category this finding belongs to */
|
|
187
|
+
category: RuleCategory;
|
|
188
|
+
/** CSS selector of the affected element(s) */
|
|
189
|
+
selector: string;
|
|
190
|
+
/** Human-readable description of the issue */
|
|
191
|
+
message: string;
|
|
192
|
+
/** What was actually measured */
|
|
193
|
+
measured: string | number;
|
|
194
|
+
/** What was expected or recommended */
|
|
195
|
+
expected: string | number;
|
|
196
|
+
/** Specific fix suggestion */
|
|
197
|
+
suggestion: string;
|
|
198
|
+
/** Score impact (0–100, how many points this costs) */
|
|
199
|
+
impact: number;
|
|
200
|
+
}
|
|
201
|
+
interface ScoringRule {
|
|
202
|
+
/** Unique rule identifier */
|
|
203
|
+
id: string;
|
|
204
|
+
/** Human-readable rule name */
|
|
205
|
+
name: string;
|
|
206
|
+
/** Which category this rule belongs to */
|
|
207
|
+
category: RuleCategory;
|
|
208
|
+
/** What this rule checks */
|
|
209
|
+
description: string;
|
|
210
|
+
/** Rule weight in category score (0–1, default 1) */
|
|
211
|
+
weight?: number;
|
|
212
|
+
/** Evaluate the rule against a page snapshot */
|
|
213
|
+
evaluate: (snapshot: PageSnapshot) => Finding[];
|
|
214
|
+
}
|
|
215
|
+
interface CategoryScore {
|
|
216
|
+
category: RuleCategory;
|
|
217
|
+
score: number;
|
|
218
|
+
maxScore: number;
|
|
219
|
+
findings: Finding[];
|
|
220
|
+
ruleCount: number;
|
|
221
|
+
passCount: number;
|
|
222
|
+
warningCount: number;
|
|
223
|
+
errorCount: number;
|
|
224
|
+
}
|
|
225
|
+
interface ScoreReport {
|
|
226
|
+
/** Aggregate score across all categories (0–100) */
|
|
227
|
+
totalScore: number;
|
|
228
|
+
/** Per-category breakdown */
|
|
229
|
+
categories: CategoryScore[];
|
|
230
|
+
/** All findings sorted by impact (highest first) */
|
|
231
|
+
findings: Finding[];
|
|
232
|
+
/** Total number of elements analyzed */
|
|
233
|
+
elementsAnalyzed: number;
|
|
234
|
+
/** Total number of rules evaluated */
|
|
235
|
+
rulesEvaluated: number;
|
|
236
|
+
/** Timestamp */
|
|
237
|
+
timestamp: number;
|
|
238
|
+
/** Time taken in milliseconds */
|
|
239
|
+
durationMs: number;
|
|
240
|
+
/** Page URL or identifier */
|
|
241
|
+
source: string;
|
|
242
|
+
}
|
|
243
|
+
interface Suggestion {
|
|
244
|
+
/** Finding that triggered this suggestion */
|
|
245
|
+
findingId: string;
|
|
246
|
+
/** Element to modify */
|
|
247
|
+
selector: string;
|
|
248
|
+
/** CSS property changes to apply */
|
|
249
|
+
changes: CSSChange[];
|
|
250
|
+
/** Expected score improvement */
|
|
251
|
+
expectedImprovement: number;
|
|
252
|
+
/** Priority (1 = highest) */
|
|
253
|
+
priority: number;
|
|
254
|
+
/** Human-readable rationale */
|
|
255
|
+
rationale: string;
|
|
256
|
+
}
|
|
257
|
+
interface CSSChange {
|
|
258
|
+
property: string;
|
|
259
|
+
currentValue: string;
|
|
260
|
+
suggestedValue: string;
|
|
261
|
+
}
|
|
262
|
+
interface DiffReport {
|
|
263
|
+
/** Before state summary */
|
|
264
|
+
before: {
|
|
265
|
+
url: string;
|
|
266
|
+
totalScore: number;
|
|
267
|
+
timestamp: number;
|
|
268
|
+
};
|
|
269
|
+
/** After state summary */
|
|
270
|
+
after: {
|
|
271
|
+
url: string;
|
|
272
|
+
totalScore: number;
|
|
273
|
+
timestamp: number;
|
|
274
|
+
};
|
|
275
|
+
/** Score delta (positive = improved) */
|
|
276
|
+
scoreDelta: number;
|
|
277
|
+
/** Per-category deltas */
|
|
278
|
+
categoryDeltas: {
|
|
279
|
+
category: RuleCategory;
|
|
280
|
+
delta: number;
|
|
281
|
+
}[];
|
|
282
|
+
/** Structural changes detected */
|
|
283
|
+
structuralChanges: StructuralChange[];
|
|
284
|
+
/** New issues introduced */
|
|
285
|
+
regressions: Finding[];
|
|
286
|
+
/** Issues fixed */
|
|
287
|
+
fixes: Finding[];
|
|
288
|
+
}
|
|
289
|
+
interface StructuralChange {
|
|
290
|
+
type: "added" | "removed" | "moved" | "resized" | "restyled";
|
|
291
|
+
selector: string;
|
|
292
|
+
description: string;
|
|
293
|
+
before?: Partial<ElementSnapshot>;
|
|
294
|
+
after?: Partial<ElementSnapshot>;
|
|
295
|
+
}
|
|
296
|
+
interface DesignProfile {
|
|
297
|
+
/** Profile name */
|
|
298
|
+
name: string;
|
|
299
|
+
/** When this profile was created */
|
|
300
|
+
createdAt: number;
|
|
301
|
+
/** When this profile was last updated */
|
|
302
|
+
updatedAt: number;
|
|
303
|
+
/** Total number of decisions that informed this profile */
|
|
304
|
+
decisionCount: number;
|
|
305
|
+
/** Learned preferences by category */
|
|
306
|
+
preferences: DesignPreference[];
|
|
307
|
+
/** Category weights (which categories matter most to this user) */
|
|
308
|
+
categoryWeights: Record<RuleCategory, number>;
|
|
309
|
+
/** Specific rule overrides */
|
|
310
|
+
ruleOverrides: RuleOverride[];
|
|
311
|
+
}
|
|
312
|
+
interface DesignPreference {
|
|
313
|
+
/** Which category this preference belongs to */
|
|
314
|
+
category: RuleCategory;
|
|
315
|
+
/** The preference rule in natural language */
|
|
316
|
+
rule: string;
|
|
317
|
+
/** How strong this preference is (0–1) */
|
|
318
|
+
weight: number;
|
|
319
|
+
/** How many times this was reinforced */
|
|
320
|
+
reinforcements: number;
|
|
321
|
+
/** Prefix for structured output */
|
|
322
|
+
prefix: "ALWAYS" | "NEVER" | "PREFER" | "AVOID";
|
|
323
|
+
}
|
|
324
|
+
interface RuleOverride {
|
|
325
|
+
ruleId: string;
|
|
326
|
+
action: "disable" | "promote" | "demote";
|
|
327
|
+
reason: string;
|
|
328
|
+
}
|
|
329
|
+
interface Decision {
|
|
330
|
+
/** What was the context */
|
|
331
|
+
context: "approve" | "reject" | "modify";
|
|
332
|
+
/** Which element was involved */
|
|
333
|
+
selector: string;
|
|
334
|
+
/** What CSS properties were involved */
|
|
335
|
+
properties: string[];
|
|
336
|
+
/** What values were approved/rejected */
|
|
337
|
+
values: Record<string, {
|
|
338
|
+
from: string;
|
|
339
|
+
to: string;
|
|
340
|
+
}>;
|
|
341
|
+
/** Timestamp */
|
|
342
|
+
timestamp: number;
|
|
343
|
+
}
|
|
344
|
+
interface AuditReport {
|
|
345
|
+
/** Full score report */
|
|
346
|
+
scoreReport: ScoreReport;
|
|
347
|
+
/** Accessibility-specific violations */
|
|
348
|
+
accessibilityViolations: AccessibilityViolation[];
|
|
349
|
+
/** Prioritized fix list (ordered by impact) */
|
|
350
|
+
prioritizedFixes: Suggestion[];
|
|
351
|
+
/** Summary statistics */
|
|
352
|
+
summary: AuditSummary;
|
|
353
|
+
}
|
|
354
|
+
interface AccessibilityViolation {
|
|
355
|
+
/** WCAG criterion (e.g., "1.4.3") */
|
|
356
|
+
criterion: string;
|
|
357
|
+
/** Level: A, AA, AAA */
|
|
358
|
+
level: "A" | "AA" | "AAA";
|
|
359
|
+
/** What's wrong */
|
|
360
|
+
description: string;
|
|
361
|
+
/** Affected elements */
|
|
362
|
+
selectors: string[];
|
|
363
|
+
/** How to fix */
|
|
364
|
+
fix: string;
|
|
365
|
+
}
|
|
366
|
+
interface AuditSummary {
|
|
367
|
+
totalScore: number;
|
|
368
|
+
grade: "A+" | "A" | "B+" | "B" | "C+" | "C" | "D" | "F";
|
|
369
|
+
topIssue: string;
|
|
370
|
+
quickWins: number;
|
|
371
|
+
criticalIssues: number;
|
|
372
|
+
}
|
|
373
|
+
interface MCPToolDefinition {
|
|
374
|
+
name: string;
|
|
375
|
+
description: string;
|
|
376
|
+
inputSchema: Record<string, unknown>;
|
|
377
|
+
}
|
|
378
|
+
declare const MCP_TOOLS: MCPToolDefinition[];
|
|
379
|
+
declare const ARGUS_VERSION = "2026.4.12";
|
|
380
|
+
declare const ARGUS_DIR = ".argus";
|
|
381
|
+
declare const DEFAULT_MCP_PORT = 18790;
|
|
382
|
+
declare const DEFAULT_GATEWAY_PORT = 18791;
|
|
383
|
+
declare const MAX_ELEMENTS = 1000;
|
|
384
|
+
declare const MAX_TEXT_LENGTH = 200;
|
|
385
|
+
declare const DEFAULT_THRESHOLD = 70;
|
|
386
|
+
/** Common spacing scale (8px grid) */
|
|
387
|
+
declare const SPACING_SCALE: number[];
|
|
388
|
+
/** Common typographic scale (major third — 1.25) */
|
|
389
|
+
declare const TYPE_SCALE_RATIOS: {
|
|
390
|
+
readonly minorSecond: 1.067;
|
|
391
|
+
readonly majorSecond: 1.125;
|
|
392
|
+
readonly minorThird: 1.2;
|
|
393
|
+
readonly majorThird: 1.25;
|
|
394
|
+
readonly perfectFourth: 1.333;
|
|
395
|
+
readonly augmentedFourth: 1.414;
|
|
396
|
+
readonly perfectFifth: 1.5;
|
|
397
|
+
readonly goldenRatio: 1.618;
|
|
398
|
+
};
|
|
399
|
+
/** WCAG 2.1 contrast ratio thresholds */
|
|
400
|
+
declare const CONTRAST_THRESHOLDS: {
|
|
401
|
+
readonly AALargeText: 3;
|
|
402
|
+
readonly AANormalText: 4.5;
|
|
403
|
+
readonly AAALargeText: 4.5;
|
|
404
|
+
readonly AAANormalText: 7;
|
|
405
|
+
};
|
|
406
|
+
/** Minimum touch target sizes (WCAG 2.5.8) */
|
|
407
|
+
declare const TOUCH_TARGETS: {
|
|
408
|
+
readonly minimum: 24;
|
|
409
|
+
readonly recommended: 44;
|
|
410
|
+
readonly comfortable: 48;
|
|
411
|
+
};
|
|
412
|
+
/** Score grade boundaries */
|
|
413
|
+
declare const GRADE_BOUNDARIES: {
|
|
414
|
+
readonly "A+": 95;
|
|
415
|
+
readonly A: 90;
|
|
416
|
+
readonly "B+": 85;
|
|
417
|
+
readonly B: 75;
|
|
418
|
+
readonly "C+": 65;
|
|
419
|
+
readonly C: 55;
|
|
420
|
+
readonly D: 40;
|
|
421
|
+
readonly F: 0;
|
|
422
|
+
};
|
|
423
|
+
declare function scoreToGrade(score: number): AuditSummary["grade"];
|
|
424
|
+
type DeepPartial<T> = {
|
|
425
|
+
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
|
|
426
|
+
};
|
|
427
|
+
type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> & {
|
|
428
|
+
[K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>;
|
|
429
|
+
}[Keys];
|
|
430
|
+
interface ArgusConfig {
|
|
431
|
+
/** Version of the config schema */
|
|
432
|
+
version: number;
|
|
433
|
+
/** MCP server configuration */
|
|
434
|
+
mcp: {
|
|
435
|
+
port: number;
|
|
436
|
+
bind: "loopback" | "all";
|
|
437
|
+
auth: {
|
|
438
|
+
mode: "none" | "token";
|
|
439
|
+
token?: string;
|
|
440
|
+
};
|
|
441
|
+
};
|
|
442
|
+
/** Gateway configuration */
|
|
443
|
+
gateway: {
|
|
444
|
+
port: number;
|
|
445
|
+
bind: "loopback" | "all";
|
|
446
|
+
};
|
|
447
|
+
/** Scoring configuration */
|
|
448
|
+
scoring: {
|
|
449
|
+
threshold: number;
|
|
450
|
+
enabledCategories: RuleCategory[];
|
|
451
|
+
customRulePaths: string[];
|
|
452
|
+
};
|
|
453
|
+
/** Memory configuration */
|
|
454
|
+
memory: {
|
|
455
|
+
profileName: string;
|
|
456
|
+
historyEnabled: boolean;
|
|
457
|
+
maxHistoryDays: number;
|
|
458
|
+
};
|
|
459
|
+
/** Inspector configuration */
|
|
460
|
+
inspector: {
|
|
461
|
+
maxElements: number;
|
|
462
|
+
includeHidden: boolean;
|
|
463
|
+
includeCustomProperties: boolean;
|
|
464
|
+
};
|
|
465
|
+
}
|
|
466
|
+
declare const DEFAULT_CONFIG: ArgusConfig;
|
|
467
|
+
|
|
468
|
+
export { ARGUS_DIR, ARGUS_VERSION, type AccessibilityInfo, type AccessibilityViolation, type ArgusConfig, type ArgusError, type AuditReport, type AuditSummary, type Box, CONTRAST_THRESHOLDS, type CSSChange, type CategoryScore, type ColorEntry, type ComputedStyleMap, DEFAULT_CONFIG, DEFAULT_GATEWAY_PORT, DEFAULT_MCP_PORT, DEFAULT_THRESHOLD, type Decision, type DeepPartial, type DesignPreference, type DesignProfile, type DiffReport, type ElementSnapshot, type Finding, GRADE_BOUNDARIES, MAX_ELEMENTS, MAX_TEXT_LENGTH, type MCPToolDefinition, MCP_TOOLS, type PageMeta, type PageSnapshot, type Point, RULE_CATEGORIES, type RequireAtLeastOne, type Result, type RuleCategory, type RuleOverride, SPACING_SCALE, type ScoreReport, type ScoringRule, type Severity, type Spacing, type StackingContext, type StructuralChange, type Suggestion, TOUCH_TARGETS, TYPE_SCALE_RATIOS, type TypographyEntry, err, ok, scoreToGrade };
|