@decentrys/ui-sdk 0.1.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.
Files changed (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/dist/browser/decentrys-ui.js +1733 -0
  4. package/dist/browser/decentrys-ui.mjs +1681 -0
  5. package/dist/browser/react-dom-global.d.ts +6 -0
  6. package/dist/browser/react-dom-global.d.ts.map +1 -0
  7. package/dist/browser/react-dom-global.js +18 -0
  8. package/dist/browser/react-dom-global.js.map +1 -0
  9. package/dist/browser/react-global.d.ts +25 -0
  10. package/dist/browser/react-global.d.ts.map +1 -0
  11. package/dist/browser/react-global.js +39 -0
  12. package/dist/browser/react-global.js.map +1 -0
  13. package/dist/browser/react-jsx-runtime.d.ts +17 -0
  14. package/dist/browser/react-jsx-runtime.d.ts.map +1 -0
  15. package/dist/browser/react-jsx-runtime.js +27 -0
  16. package/dist/browser/react-jsx-runtime.js.map +1 -0
  17. package/dist/components/AddressRiskBadge.d.ts +39 -0
  18. package/dist/components/AddressRiskBadge.d.ts.map +1 -0
  19. package/dist/components/AddressRiskBadge.js +26 -0
  20. package/dist/components/AddressRiskBadge.js.map +1 -0
  21. package/dist/components/ApprovalWarning.d.ts +29 -0
  22. package/dist/components/ApprovalWarning.d.ts.map +1 -0
  23. package/dist/components/ApprovalWarning.js +18 -0
  24. package/dist/components/ApprovalWarning.js.map +1 -0
  25. package/dist/components/ContractFacts.d.ts +27 -0
  26. package/dist/components/ContractFacts.d.ts.map +1 -0
  27. package/dist/components/ContractFacts.js +15 -0
  28. package/dist/components/ContractFacts.js.map +1 -0
  29. package/dist/components/RiskDetailsModal.d.ts +35 -0
  30. package/dist/components/RiskDetailsModal.d.ts.map +1 -0
  31. package/dist/components/RiskDetailsModal.js +74 -0
  32. package/dist/components/RiskDetailsModal.js.map +1 -0
  33. package/dist/components/ThreatSignalList.d.ts +28 -0
  34. package/dist/components/ThreatSignalList.d.ts.map +1 -0
  35. package/dist/components/ThreatSignalList.js +28 -0
  36. package/dist/components/ThreatSignalList.js.map +1 -0
  37. package/dist/components/TokenSecurityPanel.d.ts +28 -0
  38. package/dist/components/TokenSecurityPanel.d.ts.map +1 -0
  39. package/dist/components/TokenSecurityPanel.js +26 -0
  40. package/dist/components/TokenSecurityPanel.js.map +1 -0
  41. package/dist/components/TransactionRiskBanner.d.ts +36 -0
  42. package/dist/components/TransactionRiskBanner.d.ts.map +1 -0
  43. package/dist/components/TransactionRiskBanner.js +20 -0
  44. package/dist/components/TransactionRiskBanner.js.map +1 -0
  45. package/dist/context.d.ts +51 -0
  46. package/dist/context.d.ts.map +1 -0
  47. package/dist/context.js +47 -0
  48. package/dist/context.js.map +1 -0
  49. package/dist/copy.d.ts +72 -0
  50. package/dist/copy.d.ts.map +1 -0
  51. package/dist/copy.js +77 -0
  52. package/dist/copy.js.map +1 -0
  53. package/dist/index.d.ts +57 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +107 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/presentation.d.ts +316 -0
  58. package/dist/presentation.d.ts.map +1 -0
  59. package/dist/presentation.js +533 -0
  60. package/dist/presentation.js.map +1 -0
  61. package/dist/primitives.d.ts +139 -0
  62. package/dist/primitives.d.ts.map +1 -0
  63. package/dist/primitives.js +150 -0
  64. package/dist/primitives.js.map +1 -0
  65. package/dist/styles.d.ts +15 -0
  66. package/dist/styles.d.ts.map +1 -0
  67. package/dist/styles.js +285 -0
  68. package/dist/styles.js.map +1 -0
  69. package/dist/theme.d.ts +52 -0
  70. package/dist/theme.d.ts.map +1 -0
  71. package/dist/theme.js +90 -0
  72. package/dist/theme.js.map +1 -0
  73. package/package.json +70 -0
  74. package/src/browser/react-dom-global.ts +20 -0
  75. package/src/browser/react-global.ts +42 -0
  76. package/src/browser/react-jsx-runtime.ts +23 -0
  77. package/src/components/AddressRiskBadge.tsx +94 -0
  78. package/src/components/ApprovalWarning.tsx +144 -0
  79. package/src/components/ContractFacts.tsx +119 -0
  80. package/src/components/RiskDetailsModal.tsx +229 -0
  81. package/src/components/ThreatSignalList.tsx +76 -0
  82. package/src/components/TokenSecurityPanel.tsx +168 -0
  83. package/src/components/TransactionRiskBanner.tsx +123 -0
  84. package/src/context.tsx +89 -0
  85. package/src/copy.test.ts +214 -0
  86. package/src/copy.ts +151 -0
  87. package/src/index.ts +84 -0
  88. package/src/presentation.test.ts +521 -0
  89. package/src/presentation.ts +846 -0
  90. package/src/primitives.tsx +384 -0
  91. package/src/styles.ts +281 -0
  92. package/src/theme.test.ts +105 -0
  93. package/src/theme.ts +117 -0
@@ -0,0 +1,316 @@
1
+ /**
2
+ * Where the risk model becomes words a person reads.
3
+ *
4
+ * This file is pure. It takes an `Assessment` and returns descriptions —
5
+ * labels, tones, statements, aria strings — and renders nothing. That split is
6
+ * deliberate: the rule
7
+ *
8
+ * Unknown is neutral. Risk requires evidence. Malicious requires stronger
9
+ * evidence. Users should be shown why.
10
+ *
11
+ * is broken in *presentation*, not in markup. A component that paints
12
+ * "deployed 3 days ago" the same amber as "attributed to a drainer family" has
13
+ * defeated the entire model while passing every classifier test. So the
14
+ * decisions that could do that live here, in functions a test can call
15
+ * directly, rather than being spread across seven components where they can
16
+ * only be checked by eye.
17
+ *
18
+ * Four load-bearing choices:
19
+ *
20
+ * - **Kinds have their own tone families.** `fact`, `capability` and
21
+ * `unknown` are not points on the risk scale. They cannot be rendered in a
22
+ * severity colour because they are never handed one.
23
+ * - **`HistoryPresentation.tone` is the literal type `'neutral'` and
24
+ * `isWarning` is the literal type `false`.** Limited history being drawn as
25
+ * a warning is not a bug this codebase can have; it does not compile.
26
+ * - **A signal that did not raise the level is toned `inactive`.** A stale or
27
+ * low-confidence signal is still shown — hiding an observation is its own
28
+ * failure — but it is not shown in the colour of one that counted.
29
+ * - **Anything above zero hops says so in a sentence**, not just a badge,
30
+ * because a hop is an inference about a counterparty and a badge reading
31
+ * "2" does not tell anyone that.
32
+ */
33
+ import { MIN_RAISING_CONFIDENCE, type Assessment, type CapabilitySeverity, type Evidence, type HistoryStatus, type ObservedFact, type PolicyAction, type RiskComponents, type RiskLevel, type SignalStatus, type TechnicalCapability, type ThreatSeverity, type ThreatSignal, type UnknownField } from '@decentrys/protect';
34
+ import type { Tone } from './theme';
35
+ import type { UiCopy } from './copy';
36
+ /**
37
+ * The labels already published to customers on the marketing site.
38
+ *
39
+ * They are copied rather than invented so that a user who read the pricing
40
+ * page and a user looking at a wallet see the same seven words. Overridable
41
+ * per component for translation; the meanings come from the model itself.
42
+ */
43
+ export declare const RISK_LEVEL_LABEL: Record<RiskLevel, string>;
44
+ export declare function levelRank(level: RiskLevel): number;
45
+ export interface LevelPresentation {
46
+ level: RiskLevel;
47
+ label: string;
48
+ /** The model's own words for what this level is allowed to mean. */
49
+ meaning: string;
50
+ tone: Tone;
51
+ glyph: string;
52
+ /**
53
+ * True from ELEVATED_RISK upward — the levels the classifier can only reach
54
+ * with threat-signal evidence. Drives whether a banner interrupts a screen
55
+ * reader, which nothing below that threshold has earned.
56
+ */
57
+ evidenceBacked: boolean;
58
+ /** Only KNOWN_MALICIOUS. The one output that accuses a third party. */
59
+ accusatory: boolean;
60
+ liveRegionRole: 'status' | 'alert';
61
+ ariaLabel: string;
62
+ }
63
+ export declare function levelPresentation(level: RiskLevel, options?: {
64
+ labels?: Partial<Record<RiskLevel, string>>;
65
+ }): LevelPresentation;
66
+ export type EvidenceKind = 'fact' | 'capability' | 'signal' | 'unknown';
67
+ export interface KindPresentation {
68
+ kind: EvidenceKind;
69
+ /** Rendered as text on every row. Meaning never rests on colour alone. */
70
+ label: string;
71
+ /** A distinct *shape* per kind, legible without colour vision. */
72
+ glyph: string;
73
+ tone: Tone;
74
+ /** A second non-colour carrier: each kind has its own left-rule style. */
75
+ rule: 'solid' | 'dashed' | 'dotted';
76
+ ruleWidth: string;
77
+ }
78
+ export declare function kindPresentation(kind: EvidenceKind, copy: UiCopy): KindPresentation;
79
+ export interface FactPresentation {
80
+ kind: 'fact';
81
+ statement: string;
82
+ source: string;
83
+ observedAt: string;
84
+ /** Always the fact tone. A fact has no severity to render. */
85
+ tone: 'fact';
86
+ }
87
+ export declare function factPresentation(fact: ObservedFact): FactPresentation;
88
+ export interface CapabilityPresentation {
89
+ kind: 'capability';
90
+ statement: string;
91
+ severity: CapabilitySeverity;
92
+ severityLabel: string;
93
+ grantedBy?: string;
94
+ /**
95
+ * Always the capability tone, at every severity.
96
+ *
97
+ * A significant capability is emphasised with weight, not recoloured into
98
+ * the threat palette. "The owner can mint additional supply" is a true
99
+ * statement about code; painting it the same red as an analyst-verified
100
+ * drainer match tells a user the two are the same kind of thing.
101
+ */
102
+ tone: 'capability';
103
+ emphasis: 'normal' | 'strong';
104
+ }
105
+ export declare function capabilityPresentation(capability: TechnicalCapability): CapabilityPresentation;
106
+ /**
107
+ * Re-exported from the classifier rather than redeclared.
108
+ *
109
+ * This is the floor the model itself uses to decide whether a signal raised
110
+ * the level. A second copy here that drifted would show a signal as "did not
111
+ * count" while it was in fact counting.
112
+ */
113
+ export { MIN_RAISING_CONFIDENCE };
114
+ export interface SignalPresentation {
115
+ kind: 'signal';
116
+ explanation: string;
117
+ severity: ThreatSeverity;
118
+ severityLabel: string;
119
+ /**
120
+ * The severity tone only while the signal is actually counting. A stale or
121
+ * low-confidence signal is toned `inactive`, because showing it in critical
122
+ * red would tell a user something contributed to the assessment when the
123
+ * classifier explicitly excluded it.
124
+ */
125
+ tone: Tone;
126
+ status: SignalStatus;
127
+ statusLabel: string;
128
+ active: boolean;
129
+ raising: boolean;
130
+ /** Present whenever `raising` is false. Never left to inference. */
131
+ inertStatement?: string;
132
+ hops: number;
133
+ hopLabel: string;
134
+ hopStatement: string;
135
+ /** Any hop above zero is an inference about a counterparty. */
136
+ indirect: boolean;
137
+ confidence: number;
138
+ confidenceLabel: string;
139
+ analystConfirmed: boolean;
140
+ attribution: string;
141
+ evidenceCount: number;
142
+ ariaLabel: string;
143
+ }
144
+ export declare function signalPresentation(signal: ThreatSignal, copy: UiCopy, options?: {
145
+ subjectNoun?: string;
146
+ }): SignalPresentation;
147
+ export interface HopPresentation {
148
+ hops: number;
149
+ label: string;
150
+ statement: string;
151
+ indirect: boolean;
152
+ }
153
+ /**
154
+ * Hop distance, in a sentence.
155
+ *
156
+ * Zero hops is an observation about the subject. Everything else is an
157
+ * observation about somebody the subject transacted with, and the further out
158
+ * it goes the weaker the inference — a badge reading "3" communicates none of
159
+ * that, so the wording carries it instead.
160
+ */
161
+ export declare function hopPresentation(hops: number, subjectNoun?: string): HopPresentation;
162
+ export interface EvidencePresentation {
163
+ id: string;
164
+ type: string;
165
+ source: string;
166
+ observedAt: string;
167
+ confidenceLabel: string;
168
+ analystConfirmed: boolean;
169
+ attribution: string;
170
+ reference?: string;
171
+ }
172
+ export declare function evidencePresentation(evidence: Evidence, copy: UiCopy): EvidencePresentation;
173
+ export interface UnknownPresentation {
174
+ kind: 'unknown';
175
+ field: string;
176
+ statement: string;
177
+ reasonLabel: string;
178
+ /** Always the unknown tone. Unknown is neutral; it is not a finding. */
179
+ tone: 'unknown';
180
+ }
181
+ export declare function unknownPresentation(unknown: UnknownField): UnknownPresentation;
182
+ /**
183
+ * Note the literal types on `tone` and `isWarning`.
184
+ *
185
+ * `historyStatus: 'LIMITED'` is the correct, expected state for anything
186
+ * recently deployed, and the single most likely place for this product to
187
+ * betray its own rule. Typing the fields as literals means a future component
188
+ * cannot render history as a warning by mistake — the attempt does not
189
+ * typecheck, which is a stronger guarantee than a comment asking nicely.
190
+ */
191
+ export interface HistoryPresentation {
192
+ status: HistoryStatus;
193
+ label: string;
194
+ statement: string;
195
+ tone: 'neutral';
196
+ isWarning: false;
197
+ }
198
+ export declare function historyPresentation(status: HistoryStatus): HistoryPresentation;
199
+ export interface ComponentRow {
200
+ key: keyof RiskComponents;
201
+ label: string;
202
+ value: number;
203
+ /** True for `historyConfidence`, which is coverage rather than danger. */
204
+ isCoverage: boolean;
205
+ caveat?: string;
206
+ }
207
+ export declare function componentRows(components: RiskComponents, copy: UiCopy): ComponentRow[];
208
+ export interface AssessmentSections {
209
+ facts: ObservedFact[];
210
+ capabilities: TechnicalCapability[];
211
+ /** Signals the classifier counted. */
212
+ activeSignals: ThreatSignal[];
213
+ /** Stale, resolved, withdrawn or below the confidence floor. Still shown. */
214
+ inertSignals: ThreatSignal[];
215
+ unknowns: UnknownField[];
216
+ /** True when nothing at all came back — never rendered as a blank panel. */
217
+ isEmpty: boolean;
218
+ /** Present exactly when `isEmpty`. Says what the emptiness means. */
219
+ emptyStatement?: string;
220
+ summary: string;
221
+ }
222
+ /**
223
+ * Split an assessment into what gets rendered where.
224
+ *
225
+ * Facts and capabilities never enter the signal list and signals never enter
226
+ * the fact list; the separation is structural rather than a convention each
227
+ * component is trusted to follow. Coverage signals have already been demoted
228
+ * to facts by `normalizeEvidence` on the wire boundary, so anything arriving
229
+ * in `threatSignals` here genuinely claims to be one.
230
+ */
231
+ export declare function assessmentSections(assessment: Assessment, copy: UiCopy): AssessmentSections;
232
+ export interface AvailabilityPresentation {
233
+ unavailable: boolean;
234
+ /** Present when unavailable. Says nothing was checked, and implies nothing. */
235
+ statement?: string;
236
+ /**
237
+ * Never a severity tone.
238
+ *
239
+ * Decentrys being unreachable is a fact about Decentrys, not a finding about
240
+ * the user's transaction. Rendering our own outage in red teaches people
241
+ * that red means nothing.
242
+ */
243
+ tone: 'neutral';
244
+ }
245
+ export declare function availabilityPresentation(assessment: Assessment): AvailabilityPresentation;
246
+ export interface DecisionPresentation {
247
+ action: PolicyAction;
248
+ label: string;
249
+ statement: string;
250
+ reason: string;
251
+ /**
252
+ * These components never disable a host application's controls.
253
+ *
254
+ * Typed as the literal `false` so no component can be written that reads
255
+ * this field and switches a button off. Policy is the integrator's, and it
256
+ * is theirs to enforce in their own UI.
257
+ */
258
+ blocksUi: false;
259
+ }
260
+ export declare function decisionPresentation(decision: {
261
+ action: PolicyAction;
262
+ reason: string;
263
+ }): DecisionPresentation;
264
+ export interface ApprovalDetails {
265
+ token: string;
266
+ symbol?: string;
267
+ decimals?: number;
268
+ spender: string;
269
+ /** A name the integrator already has for the spender, if any. */
270
+ spenderLabel?: string;
271
+ /** Base units, or the literal string `unlimited`. */
272
+ amount?: string;
273
+ }
274
+ export interface ApprovalPresentation {
275
+ unlimited: boolean;
276
+ amountKnown: boolean;
277
+ amountLabel: string;
278
+ scopeLabel: string;
279
+ statement: string;
280
+ spenderName: string;
281
+ assetName: string;
282
+ /**
283
+ * The capability tone, never a threat tone.
284
+ *
285
+ * An unlimited allowance is a *scope*, and describing it accurately is the
286
+ * whole job: "unlimited approval requested" is useful, "scam detected" is
287
+ * both unsupported and the thing that trains people to click through.
288
+ */
289
+ tone: 'capability';
290
+ emphasis: 'normal' | 'strong';
291
+ }
292
+ export declare function approvalPresentation(details: ApprovalDetails): ApprovalPresentation;
293
+ /** ERC-20 approvals commonly use a sentinel near uint256 max to mean "no cap". */
294
+ export declare function isUnlimitedAllowance(amount: string): boolean;
295
+ /** `0.5` becomes `50%`. Never rounded away to "high" or "low". */
296
+ export declare function formatConfidence(confidence: number): string;
297
+ /**
298
+ * A fixed UTC rendering rather than a locale one.
299
+ *
300
+ * Locale formatting differs between a browser, an extension service worker and
301
+ * a React Native runtime, and an integrator wanting their own format has the
302
+ * raw ISO string on the model. Predictable beats pretty here.
303
+ */
304
+ export declare function formatTimestamp(iso: string): string;
305
+ export declare function shortenAddress(address: string, lead?: number, tail?: number): string;
306
+ /**
307
+ * Base units to a human amount, in integer arithmetic.
308
+ *
309
+ * Token balances routinely exceed what a double can hold exactly, and a
310
+ * rounding artefact in an allowance figure is a number a user would act on.
311
+ * With no decimals supplied the raw base units are returned unscaled; the
312
+ * caller is responsible for saying so, and `approvalPresentation` does.
313
+ */
314
+ export declare function formatTokenAmount(amount: string, decimals?: number): string;
315
+ export declare function plural(count: number, singular: string, pluralForm?: string): string;
316
+ //# sourceMappingURL=presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../src/presentation.ts"],"names":[],"mappings":"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"}