kyd-shared-badge 0.2.16 → 0.2.18

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kyd-shared-badge",
3
- "version": "0.2.16",
3
+ "version": "0.2.18",
4
4
  "private": false,
5
5
  "main": "./src/index.ts",
6
6
  "module": "./src/index.ts",
@@ -207,6 +207,76 @@ const SharedBadgeDisplay = ({ badgeData }: { badgeData: PublicBadgeData }) => {
207
207
  <div className={'prose prose-sm max-w-none space-y-4 mb-6'} style={{ color: 'var(--text-secondary)' }}>
208
208
  <p>{riskScore?.description || ''}</p>
209
209
  </div>
210
+ {(() => {
211
+ const ss = assessmentResult?.screening_sources;
212
+ const ofacMatches = ss?.ofac_screen?.matches && (ss.ofac_screen.matches.length > 0);
213
+ const cslDetails = ss?.csl_details && (Array.isArray(ss.csl_details) ? ss.csl_details.length > 0 : true);
214
+ const fbiMatches = ss?.fbi_matches && (ss.fbi_matches.length > 0);
215
+ if (!(ofacMatches || cslDetails || fbiMatches)) return null;
216
+ return (
217
+ <div className={'mb-8 rounded-lg border p-4'} style={{ borderColor: 'var(--icon-button-secondary)', backgroundColor: 'var(--content-card-background)' }}>
218
+ <h4 className={'text-lg font-semibold mb-3'} style={{ color: 'var(--text-main)' }}>3A. Sanctions Matches</h4>
219
+ {/* OFAC matches */}
220
+ {ofacMatches && (
221
+ <div className={'mb-4'}>
222
+ <h5 className={'font-semibold mb-2'} style={{ color: 'var(--text-main)' }}>OFAC API Matches</h5>
223
+ <div>
224
+ {ss!.ofac_screen!.matches!.map((m: any, i: number) => {
225
+ const s = m?.sanction || {};
226
+ const title = s.name || 'Unknown';
227
+ const programs = (s.programs && s.programs.length) ? ` — Programs: ${s.programs.join(', ')}` : '';
228
+ return (
229
+ <div key={i} style={{ display: 'grid', gridTemplateColumns: '12px 1fr', columnGap: 8, alignItems: 'start', marginBottom: 6 }}>
230
+ <div aria-hidden="true" style={{ width: 6, height: 6, borderRadius: '50%', marginTop: 6, backgroundColor: 'var(--text-secondary)' }} />
231
+ <div className={'text-sm'} style={{ color: 'var(--text-secondary)' }}>
232
+ <span className={'font-medium'} style={{ color: 'var(--text-main)' }}>{title}</span>
233
+ <span>{programs}</span>
234
+ {s.entityLink ? (
235
+ <>
236
+ {' '}— <a href={s.entityLink} target='_blank' rel='noopener noreferrer' className={'underline'} style={{ color: 'var(--icon-accent)' }}>Details</a>
237
+ </>
238
+ ) : null}
239
+ </div>
240
+ </div>
241
+ );
242
+ })}
243
+ </div>
244
+ <details className={'mt-2'}>
245
+ <summary className={'cursor-pointer text-sm font-semibold'} style={{ color: 'var(--text-main)' }}>View OFAC Raw JSON</summary>
246
+ <pre className={'mt-2 overflow-auto text-xs p-3 rounded'} style={{ background: 'rgba(0,0,0,0.04)', color: 'var(--text-main)' }}>{JSON.stringify(ss!.ofac_screen!.raw, null, 2)}</pre>
247
+ </details>
248
+ </div>
249
+ )}
250
+ {/* CSL details */}
251
+ {cslDetails && (
252
+ <div className={'mb-4'}>
253
+ <h5 className={'font-semibold mb-2'} style={{ color: 'var(--text-main)' }}>U.S. CSL Details</h5>
254
+ <details>
255
+ <summary className={'cursor-pointer text-sm font-semibold'} style={{ color: 'var(--text-main)' }}>View CSL Raw JSON</summary>
256
+ <pre className={'mt-2 overflow-auto text-xs p-3 rounded'} style={{ background: 'rgba(0,0,0,0.04)', color: 'var(--text-main)' }}>{JSON.stringify(ss!.csl_details, null, 2)}</pre>
257
+ </details>
258
+ </div>
259
+ )}
260
+ {/* FBI matches */}
261
+ {fbiMatches && (
262
+ <div className={'mb-2'}>
263
+ <h5 className={'font-semibold mb-2'} style={{ color: 'var(--text-main)' }}>FBI Wanted List Matches</h5>
264
+ <div>
265
+ {ss!.fbi_matches!.map((f: any, i: number) => (
266
+ <div key={i} style={{ display: 'grid', gridTemplateColumns: '12px 1fr', columnGap: 8, alignItems: 'start', marginBottom: 6 }}>
267
+ <div aria-hidden="true" style={{ width: 6, height: 6, borderRadius: '50%', marginTop: 6, backgroundColor: 'var(--text-secondary)' }} />
268
+ <div className={'text-sm'} style={{ color: 'var(--text-secondary)' }}>
269
+ <span className={'font-medium'} style={{ color: 'var(--text-main)' }}>{f.title || 'Match'}</span>
270
+ {f.url ? <> — <a href={f.url} target='_blank' rel='noopener noreferrer' className={'underline'} style={{ color: 'var(--icon-accent)' }}>Details</a></> : null}
271
+ </div>
272
+ </div>
273
+ ))}
274
+ </div>
275
+ </div>
276
+ )}
277
+ </div>
278
+ );
279
+ })()}
210
280
  <IpRiskAnalysisDisplay ipRiskAnalysis={screening_sources?.ip_risk_analysis} />
211
281
  </>
212
282
  )}
@@ -259,16 +329,6 @@ const SharedBadgeDisplay = ({ badgeData }: { badgeData: PublicBadgeData }) => {
259
329
  />
260
330
  );
261
331
  })()}
262
- {screening_sources.sanctions_sublists && screening_sources.sanctions_sublists.length > 0 && (
263
- <details className="mt-3">
264
- <summary className={'cursor-pointer text-sm font-semibold'} style={{ color: 'var(--text-main)' }}>View all screened sub-lists</summary>
265
- <ul className="mt-2 list-disc pl-5 text-sm" style={{ color: 'var(--text-secondary)' }}>
266
- {screening_sources.sanctions_sublists.map((name, idx) => (
267
- <li key={idx}>{name}</li>
268
- ))}
269
- </ul>
270
- </details>
271
- )}
272
332
  </div>
273
333
  <div>
274
334
  <h4 className={'text-xl font-bold mb-4'} style={{ color: 'var(--text-main)' }}>Country-specific Entity Affiliations</h4>
@@ -54,7 +54,7 @@ const SanctionsRow = ({
54
54
  style={{ color: 'var(--text-secondary)' }}
55
55
  aria-expanded={expanded}
56
56
  >
57
- <span style={{ display: 'inline-block', transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)', transition: 'transform 150ms ease' }}>▶</span>
57
+ <span style={{ display: 'inline-block', transform: expanded ? 'rotate(90deg)' : 'rotate(0deg)', transition: 'transform 150ms ease' }} className={'mr-1'}>▶</span>
58
58
  <span>View sub-lists</span>
59
59
  </button>
60
60
  )}
package/src/types.ts CHANGED
@@ -160,9 +160,12 @@ export interface AssessmentResult {
160
160
  checked?: boolean;
161
161
  sources?: string[];
162
162
  matches?: any[];
163
+ raw?: any;
163
164
  };
164
165
  sanctions_sources_detailed?: { issuingEntity: string; listName: string; matched?: boolean; sublists?: string[] }[];
165
166
  sanctions_sublists?: string[];
167
+ csl_details?: any;
168
+ fbi_matches?: any[];
166
169
  };
167
170
  optOutScreening?: boolean;
168
171
  clientMetadata?: ClientMetadata;