@singi-labs/sifa-sdk 0.19.88 → 0.19.90

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 (58) hide show
  1. package/dist/{follow-profile-CcMgQDsh.d.ts → follow-profile-CVcA2w1v.d.ts} +1 -1
  2. package/dist/{follow-profile-D3zDoDll.d.cts → follow-profile-CgLLLQtJ.d.cts} +1 -1
  3. package/dist/{index-LxGL5I-J.d.ts → index-BEAuoL6l.d.ts} +1 -1
  4. package/dist/{index-C2n-GjH2.d.cts → index-DU0pYHch.d.cts} +1 -1
  5. package/dist/index.cjs +19 -1
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.d.cts +9 -9
  8. package/dist/index.d.ts +9 -9
  9. package/dist/index.js +6 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/jsonld/index.d.cts +2 -2
  12. package/dist/jsonld/index.d.ts +2 -2
  13. package/dist/{network-map-k2QxGpGf.d.ts → network-map-Bx5ohCEV.d.ts} +4 -4
  14. package/dist/{network-map-CFZx_xXE.d.cts → network-map-D39CQj9J.d.cts} +4 -4
  15. package/dist/{profile-summary-CwJD0-wo.d.cts → profile-summary-D56VII1x.d.cts} +1 -1
  16. package/dist/{profile-summary-2pFtukEK.d.ts → profile-summary-DPNTzeDv.d.ts} +1 -1
  17. package/dist/query/fetchers/index.d.cts +8 -8
  18. package/dist/query/fetchers/index.d.ts +8 -8
  19. package/dist/query/hooks/index.d.cts +6 -6
  20. package/dist/query/hooks/index.d.ts +6 -6
  21. package/dist/query/index.d.cts +11 -11
  22. package/dist/query/index.d.ts +11 -11
  23. package/dist/resume/export-contact.js +57 -0
  24. package/dist/resume/export-contact.js.map +1 -0
  25. package/dist/resume/funder-cv.js +3 -2
  26. package/dist/resume/funder-cv.js.map +1 -1
  27. package/dist/resume/index.cjs +63 -3
  28. package/dist/resume/index.cjs.map +1 -1
  29. package/dist/resume/index.d.cts +90 -5
  30. package/dist/resume/index.d.ts +90 -5
  31. package/dist/resume/index.js +12 -0
  32. package/dist/resume/index.js.map +1 -1
  33. package/dist/resume/json-resume.js +8 -1
  34. package/dist/resume/json-resume.js.map +1 -1
  35. package/dist/schemas/index.cjs.map +1 -1
  36. package/dist/schemas/index.d.cts +2 -2
  37. package/dist/schemas/index.d.ts +2 -2
  38. package/dist/taxonomy/index.js +6 -2
  39. package/dist/taxonomy/index.js.map +1 -1
  40. package/dist/taxonomy/verification-providers.js +19 -1
  41. package/dist/taxonomy/verification-providers.js.map +1 -1
  42. package/dist/tokens/colors.js +6 -1
  43. package/dist/tokens/colors.js.map +1 -1
  44. package/dist/tokens/index.cjs +5 -0
  45. package/dist/tokens/index.cjs.map +1 -1
  46. package/dist/tokens/index.d.cts +17 -1
  47. package/dist/tokens/index.d.ts +17 -1
  48. package/dist/tokens/index.js +3 -2
  49. package/dist/tokens/index.js.map +1 -1
  50. package/dist/{types-CICITVJa.d.ts → types-BqxbmLY6.d.ts} +2 -2
  51. package/dist/{types-DkrZo5eF.d.cts → types-Dd7UMXIz.d.cts} +2 -2
  52. package/dist/{use-user-settings-Azxf51V9.d.cts → use-user-settings-CBH1CeDP.d.cts} +4 -4
  53. package/dist/{use-user-settings-DQNz9PYA.d.ts → use-user-settings-CFhaGcAq.d.ts} +4 -4
  54. package/dist/{user-settings-BDZ9i-Pk.d.cts → user-settings-ChPm0BFN.d.cts} +4 -4
  55. package/dist/{user-settings-DvqRXhdC.d.ts → user-settings-D1zKOWa2.d.ts} +4 -4
  56. package/dist/{verification-providers-BPdY3KyH.d.cts → verification-providers-DeyGqaoC.d.cts} +24 -4
  57. package/dist/{verification-providers-BPdY3KyH.d.ts → verification-providers-DeyGqaoC.d.ts} +24 -4
  58. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/taxonomy/index.ts"],"sourcesContent":["export { CONTINENTS, getContinent, type ContinentCode } from './continents.js';\nexport { COUNTRIES } from './countries.js';\nexport {\n EQF_LEVEL_LABELS,\n EQF_LEVEL_OPTIONS,\n getEducationLevelDisplay,\n getEqfLevelLabel,\n readEqfLevel,\n suggestEqfLevelFromDegree,\n type EqfLevel,\n type EqfLevelOption,\n} from './eqf-level.js';\nexport {\n COMPANY_OPTIONAL_EMPLOYMENT_TYPES,\n EMPLOYMENT_TYPE_GROUPS,\n EMPLOYMENT_TYPE_LABELS,\n ON_BEHALF_OF_EMPLOYMENT_TYPES,\n getEmploymentTypeLabel,\n isCompanyRequired,\n isOnBehalfOfApplicable,\n type EmploymentTypeGroup,\n type EmploymentTypeOption,\n} from './employment-type.js';\nexport {\n INDUSTRY_OPTIONS,\n INDUSTRY_LABELS,\n findIndustry,\n getIndustryLabel,\n getIndustryLabelKey,\n type IndustryOption,\n} from './industry-taxonomy.js';\nexport {\n OPEN_TO_OPTIONS,\n OPEN_TO_TOKENS,\n OPEN_TO_TOKEN_TO_VALUE,\n OPEN_TO_VALUE_TO_TOKEN,\n OPEN_TO_TOKEN_LABELS,\n OPEN_TO_GROUP_LABELS,\n OPEN_TO_LEGACY_VALUE_ALIASES,\n getOpenToLabelKey,\n normalizeOpenTo,\n openToTokenToValue,\n openToValueToToken,\n type OpenToGroup,\n type OpenToOption,\n} from './open-to.js';\nexport {\n SEARCH_FILTER_DEFS,\n type SearchFilterControl,\n type SearchFilterDef,\n type SearchFilterOptionSource,\n} from './search-filter-defs.js';\nexport {\n WORKPLACE_TYPE_LABELS,\n WORKPLACE_TYPE_OPTIONS,\n WORKPLACE_TYPE_LEGACY_ALIASES,\n getWorkplaceTypeLabel,\n normalizeWorkplaceTypes,\n type WorkplaceTypeOption,\n} from './workplace-type.js';\nexport {\n PLATFORM_LABELS,\n PLATFORM_OPTIONS,\n getFaviconUrl,\n getPlatformLabel,\n isKnownPlatform,\n normalizePlatformId,\n type PlatformId,\n} from './platforms.js';\nexport {\n CATEGORY_LABELS,\n normalizeSkillCategory,\n CATEGORY_ORDER,\n SKILL_CATEGORIES,\n type SkillCategory,\n} from './skill-categories.js';\nexport {\n dedupeSkills,\n groupSkillsByCategory,\n groupSkillsBySubCategory,\n type MergedProfileSkill,\n} from './skill-grouping.js';\nexport {\n groupSkillsForDisplay,\n type SkillDisplayGroups,\n type SkillDisplayGroupsOptions,\n} from './skill-display-groups.js';\nexport {\n APP_CATEGORIES,\n APP_CATEGORY_IDS,\n getAppCategoryIcon,\n isAppCategory,\n type AppCategoryId,\n} from './app-categories.js';\nexport {\n APP_CATEGORY_MAP,\n categoryForApp,\n isKnownAppId,\n type KnownAppId,\n} from './app-category-map.js';\nexport {\n ACTIVITY_TIERS,\n getActivityTaxonomyVersion,\n getActivityTier,\n getLexiconEntry,\n getTierMeta,\n type ActivityTaxonomy,\n type ActivityTier,\n type LexiconEntry,\n type TierMeta,\n} from './activity-tiers.js';\nexport { isRelationalActivity } from './relational.js';\nexport {\n PRESENTATION_ROLE_LABELS,\n PRESENTATION_ROLE_OPTIONS,\n getPresentationRoleLabel,\n type PresentationRoleOption,\n} from './presentation-role.js';\nexport {\n PUBLICATION_TYPE_LABELS,\n PUBLICATION_TYPE_OPTIONS,\n getPublicationTypeLabel,\n type PublicationTypeOption,\n} from './publication-type.js';\nexport {\n PRESENTATION_LINK_TYPE_LABELS,\n PRESENTATION_LINK_TYPE_OPTIONS,\n getPresentationLinkTypeLabel,\n type PresentationLinkTypeOption,\n} from './presentation-link-type.js';\nexport {\n CALENDAR_EVENT_MODE_LABELS,\n CALENDAR_EVENT_STATUS_LABELS,\n getCalendarEventModeLabel,\n getCalendarEventStatusLabel,\n} from './calendar-event.js';\nexport {\n INVOLVEMENT_KIND_HEADINGS,\n INVOLVEMENT_KIND_LABELS,\n INVOLVEMENT_KIND_OPTIONS,\n getInvolvementKindHeading,\n getInvolvementKindLabel,\n type InvolvementKindOption,\n} from './involvement-kind.js';\nexport {\n COURSE_ROLE_OPTIONS,\n COURSE_ROLE_LABELS,\n COURSE_ROLE_TAKEN,\n COURSE_ROLE_TAUGHT,\n COURSE_ROLE_TEACHING_ASSISTANT,\n getCourseRoleLabel,\n isTeachingCourse,\n splitCoursesByRole,\n type CourseRoleOption,\n} from './course-role.js';\nexport {\n ARTIFACT_LINK_KIND_LABELS,\n ARTIFACT_LINK_KIND_OPTIONS,\n getArtifactLinkKindLabel,\n type ArtifactLinkKindOption,\n} from './artifact-link-kind.js';\nexport {\n VERIFICATION_PROVIDERS,\n getVerificationProvider,\n isKnownVerificationProvider,\n resolveVerifierProvider,\n buildVerifierListMembers,\n primaryVerification,\n type AccountVerification,\n type VerifierListItem,\n type VerificationProvider,\n type VerificationProviderId,\n type VerificationSource,\n} from './verification-providers.js';\nexport {\n INVESTMENT_ROLE_OPTIONS,\n INVESTMENT_ROLE_LABELS,\n INVESTMENT_STAGE_OPTIONS,\n INVESTMENT_STAGE_LABELS,\n INVESTMENT_STATUS_OPTIONS,\n INVESTMENT_STATUS_LABELS,\n getInvestmentRoleLabel,\n getInvestmentStageLabel,\n getInvestmentStatusLabel,\n type InvestmentOption,\n} from './investment.js';\n"],"mappings":";AAAA,SAAS,YAAY,oBAAwC;AAC7D,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AACP,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;","names":[]}
1
+ {"version":3,"sources":["../../src/taxonomy/index.ts"],"sourcesContent":["export { CONTINENTS, getContinent, type ContinentCode } from './continents.js';\nexport { COUNTRIES } from './countries.js';\nexport {\n EQF_LEVEL_LABELS,\n EQF_LEVEL_OPTIONS,\n getEducationLevelDisplay,\n getEqfLevelLabel,\n readEqfLevel,\n suggestEqfLevelFromDegree,\n type EqfLevel,\n type EqfLevelOption,\n} from './eqf-level.js';\nexport {\n COMPANY_OPTIONAL_EMPLOYMENT_TYPES,\n EMPLOYMENT_TYPE_GROUPS,\n EMPLOYMENT_TYPE_LABELS,\n ON_BEHALF_OF_EMPLOYMENT_TYPES,\n getEmploymentTypeLabel,\n isCompanyRequired,\n isOnBehalfOfApplicable,\n type EmploymentTypeGroup,\n type EmploymentTypeOption,\n} from './employment-type.js';\nexport {\n INDUSTRY_OPTIONS,\n INDUSTRY_LABELS,\n findIndustry,\n getIndustryLabel,\n getIndustryLabelKey,\n type IndustryOption,\n} from './industry-taxonomy.js';\nexport {\n OPEN_TO_OPTIONS,\n OPEN_TO_TOKENS,\n OPEN_TO_TOKEN_TO_VALUE,\n OPEN_TO_VALUE_TO_TOKEN,\n OPEN_TO_TOKEN_LABELS,\n OPEN_TO_GROUP_LABELS,\n OPEN_TO_LEGACY_VALUE_ALIASES,\n getOpenToLabelKey,\n normalizeOpenTo,\n openToTokenToValue,\n openToValueToToken,\n type OpenToGroup,\n type OpenToOption,\n} from './open-to.js';\nexport {\n SEARCH_FILTER_DEFS,\n type SearchFilterControl,\n type SearchFilterDef,\n type SearchFilterOptionSource,\n} from './search-filter-defs.js';\nexport {\n WORKPLACE_TYPE_LABELS,\n WORKPLACE_TYPE_OPTIONS,\n WORKPLACE_TYPE_LEGACY_ALIASES,\n getWorkplaceTypeLabel,\n normalizeWorkplaceTypes,\n type WorkplaceTypeOption,\n} from './workplace-type.js';\nexport {\n PLATFORM_LABELS,\n PLATFORM_OPTIONS,\n getFaviconUrl,\n getPlatformLabel,\n isKnownPlatform,\n normalizePlatformId,\n type PlatformId,\n} from './platforms.js';\nexport {\n CATEGORY_LABELS,\n normalizeSkillCategory,\n CATEGORY_ORDER,\n SKILL_CATEGORIES,\n type SkillCategory,\n} from './skill-categories.js';\nexport {\n dedupeSkills,\n groupSkillsByCategory,\n groupSkillsBySubCategory,\n type MergedProfileSkill,\n} from './skill-grouping.js';\nexport {\n groupSkillsForDisplay,\n type SkillDisplayGroups,\n type SkillDisplayGroupsOptions,\n} from './skill-display-groups.js';\nexport {\n APP_CATEGORIES,\n APP_CATEGORY_IDS,\n getAppCategoryIcon,\n isAppCategory,\n type AppCategoryId,\n} from './app-categories.js';\nexport {\n APP_CATEGORY_MAP,\n categoryForApp,\n isKnownAppId,\n type KnownAppId,\n} from './app-category-map.js';\nexport {\n ACTIVITY_TIERS,\n getActivityTaxonomyVersion,\n getActivityTier,\n getLexiconEntry,\n getTierMeta,\n type ActivityTaxonomy,\n type ActivityTier,\n type LexiconEntry,\n type TierMeta,\n} from './activity-tiers.js';\nexport { isRelationalActivity } from './relational.js';\nexport {\n PRESENTATION_ROLE_LABELS,\n PRESENTATION_ROLE_OPTIONS,\n getPresentationRoleLabel,\n type PresentationRoleOption,\n} from './presentation-role.js';\nexport {\n PUBLICATION_TYPE_LABELS,\n PUBLICATION_TYPE_OPTIONS,\n getPublicationTypeLabel,\n type PublicationTypeOption,\n} from './publication-type.js';\nexport {\n PRESENTATION_LINK_TYPE_LABELS,\n PRESENTATION_LINK_TYPE_OPTIONS,\n getPresentationLinkTypeLabel,\n type PresentationLinkTypeOption,\n} from './presentation-link-type.js';\nexport {\n CALENDAR_EVENT_MODE_LABELS,\n CALENDAR_EVENT_STATUS_LABELS,\n getCalendarEventModeLabel,\n getCalendarEventStatusLabel,\n} from './calendar-event.js';\nexport {\n INVOLVEMENT_KIND_HEADINGS,\n INVOLVEMENT_KIND_LABELS,\n INVOLVEMENT_KIND_OPTIONS,\n getInvolvementKindHeading,\n getInvolvementKindLabel,\n type InvolvementKindOption,\n} from './involvement-kind.js';\nexport {\n COURSE_ROLE_OPTIONS,\n COURSE_ROLE_LABELS,\n COURSE_ROLE_TAKEN,\n COURSE_ROLE_TAUGHT,\n COURSE_ROLE_TEACHING_ASSISTANT,\n getCourseRoleLabel,\n isTeachingCourse,\n splitCoursesByRole,\n type CourseRoleOption,\n} from './course-role.js';\nexport {\n ARTIFACT_LINK_KIND_LABELS,\n ARTIFACT_LINK_KIND_OPTIONS,\n getArtifactLinkKindLabel,\n type ArtifactLinkKindOption,\n} from './artifact-link-kind.js';\nexport {\n VERIFICATION_PROVIDERS,\n getVerificationProvider,\n isKnownVerificationProvider,\n resolveVerifierProvider,\n buildVerifierListMembers,\n primaryVerification,\n resolveVerificationBadges,\n verificationLabel,\n type AccountVerification,\n type VerifierListItem,\n type VerificationProvider,\n type VerificationProviderId,\n type VerificationSource,\n} from './verification-providers.js';\nexport {\n INVESTMENT_ROLE_OPTIONS,\n INVESTMENT_ROLE_LABELS,\n INVESTMENT_STAGE_OPTIONS,\n INVESTMENT_STAGE_LABELS,\n INVESTMENT_STATUS_OPTIONS,\n INVESTMENT_STATUS_LABELS,\n getInvestmentRoleLabel,\n getInvestmentStageLabel,\n getInvestmentStatusLabel,\n type InvestmentOption,\n} from './investment.js';\n"],"mappings":";AAAA,SAAS,YAAY,oBAAwC;AAC7D,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,OAIK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;AACP,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;","names":[]}
@@ -79,12 +79,30 @@ function primaryVerification(verifications) {
79
79
  }
80
80
  return best;
81
81
  }
82
+ var MAX_LABEL_LENGTH = 64;
83
+ function verificationLabel(v) {
84
+ const name = v.issuerName?.trim();
85
+ if (name) {
86
+ const chars = [...name];
87
+ return chars.length > MAX_LABEL_LENGTH ? `${chars.slice(0, MAX_LABEL_LENGTH - 1).join("")}\u2026` : name;
88
+ }
89
+ return getVerificationProvider(v.provider)?.label ?? v.provider;
90
+ }
91
+ function resolveVerificationBadges(input) {
92
+ const badges = input.verificationBadges;
93
+ if (badges && badges.length === 0) return [];
94
+ const known = (badges ?? []).filter((b) => isKnownVerificationProvider(b.provider));
95
+ if (known.length > 0) return known;
96
+ return input.blueskyVerified ? [{ provider: "bluesky", verifiedAt: input.blueskyVerifiedAt ?? null }] : [];
97
+ }
82
98
  export {
83
99
  VERIFICATION_PROVIDERS,
84
100
  buildVerifierListMembers,
85
101
  getVerificationProvider,
86
102
  isKnownVerificationProvider,
87
103
  primaryVerification,
88
- resolveVerifierProvider
104
+ resolveVerificationBadges,
105
+ resolveVerifierProvider,
106
+ verificationLabel
89
107
  };
90
108
  //# sourceMappingURL=verification-providers.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/taxonomy/verification-providers.ts"],"sourcesContent":["/**\n * Verification providers -- the trust roots Sifa recognizes for AT Protocol\n * `app.bsky.graph.verification` records.\n *\n * Framing (see decisions/2026-07-13-third-party-verification-providers.md, D4):\n * a verification checkmark is ONE low-tier trust layer, not Sifa's headline.\n * Most of what it certifies is \"this account is who they claim to be\" -- useful,\n * and worth carrying because it's an already-recognized network signal, but low\n * value on its own. It sits among Sifa's other trust signals and never becomes a\n * score or a gate. This registry only decides which issuers Sifa displays and\n * with what provenance.\n *\n * Data-only: badge colors and icons are consumer concerns (React DOM on web,\n * React Native on mobile), same split as {@link PLATFORM_LABELS}. Consumers map\n * a provider id to a token/color.\n */\n\nexport type VerificationProviderId = 'bluesky' | 'mu';\n\n/** How Sifa learns about a provider's verifications. */\nexport type VerificationSource = 'bluesky-api' | 'firehose';\n\nexport interface VerificationProvider {\n id: VerificationProviderId;\n /** Human label for the badge popover, e.g. \"Bluesky\", \"mu (Eurosky)\". */\n label: string;\n /**\n * Primary-display priority (D1): when an account holds verifications from\n * multiple providers, the lowest number wins the single inline badge and the\n * rest move into the popover. Must be unique across providers.\n */\n priority: number;\n /**\n * - `bluesky-api`: sourced from Bluesky's public-API `verifiedStatus`. Bluesky\n * maintains its own trusted-verifier set, so Sifa keeps no local DID list.\n * - `firehose`: sourced from the Jetstream, gated on {@link verifierDids}.\n */\n source: VerificationSource;\n /**\n * Trust-root DIDs for firehose-sourced providers. A verification record counts\n * if its ISSUER DID is a root or a member of {@link verifierListUri}. Empty for\n * `bluesky-api` providers (Bluesky's AppView owns that decision). DIDs, not\n * handles: a handle takeover must never confer verifier status.\n */\n verifierDids: readonly string[];\n /**\n * AT-URI of the `app.bsky.graph.list` where the provider publishes its\n * trusted verifiers. Consumers load its members at runtime and pass them to\n * {@link resolveVerifierProvider}, so a verifier the provider adds counts on\n * Sifa without a release. The list owner must be in {@link verifierDids}.\n */\n verifierListUri?: string;\n /**\n * Verifiers last confirmed by hand, used ONLY when the caller supplies no\n * list members (list not loaded yet, or a consumer that does not load it).\n * Keeps such callers working; once members are supplied, the list wins.\n */\n fallbackVerifierDids?: readonly string[];\n}\n\n/**\n * A verification held by an account, as surfaced to the UI. `issuerDid` is\n * present for firehose-sourced providers and absent for `bluesky-api`.\n */\nexport interface AccountVerification {\n provider: VerificationProviderId;\n verifiedAt?: string | null;\n issuerDid?: string | null;\n /** Display name of the issuer (firehose providers), when the API knows it. */\n issuerName?: string | null;\n}\n\n/**\n * mu / Eurosky trust root (see https://hello.mu.social/verification).\n * eurosky.social coordinates the trusted-verifier program and publishes the\n * verifier set as {@link MU_VERIFIER_LIST_URI}; the individual verifiers are\n * read from that list at runtime, not maintained here.\n */\nconst MU_ROOT_DID = 'did:plc:ooensn4mr5mhznzypvxelfa3'; // eurosky.social\n\n/** \"Trusted verifiers on mu\", owned by {@link MU_ROOT_DID}. */\nconst MU_VERIFIER_LIST_URI = `at://${MU_ROOT_DID}/app.bsky.graph.list/3mogaw2g4an23`;\n\n/** Snapshot of the mu verifiers confirmed by hand before the list was used. */\nconst MU_FALLBACK_VERIFIER_DIDS = [\n 'did:plc:durcipmx2rwgzzagbiumobs5', // france-atmosphe.re\n 'did:plc:zsf5p7rqilz2qvyd7ezmxrfj', // belgium-atmosphe.re\n 'did:plc:hd564mpf6bekrwzyhvujs54b', // medsky.network\n 'did:plc:u5zp7npt5kpueado77kuihyz', // npmx.dev\n 'did:plc:6tndl5lqrzjrx7ahjom2gjbq', // stewardshiplab.org\n 'did:plc:vnycpb2e4lh4tc7oyr3n2jvh', // newsmastfoundation.org\n 'did:plc:dsiqe4pszk5ldbjk66fyryjv', // cpesr.fr\n] as const;\n\nexport const VERIFICATION_PROVIDERS: Record<VerificationProviderId, VerificationProvider> = {\n bluesky: {\n id: 'bluesky',\n label: 'Bluesky',\n priority: 0,\n source: 'bluesky-api',\n verifierDids: [],\n },\n mu: {\n id: 'mu',\n label: 'mu (Eurosky)',\n priority: 1,\n source: 'firehose',\n verifierDids: [MU_ROOT_DID],\n verifierListUri: MU_VERIFIER_LIST_URI,\n fallbackVerifierDids: MU_FALLBACK_VERIFIER_DIDS,\n },\n};\n\nexport function isKnownVerificationProvider(id: string): id is VerificationProviderId {\n // Object.hasOwn, not `in`: `in` also matches inherited Object.prototype keys\n // ('toString', 'constructor', ...), which would wrongly narrow those strings\n // and make getVerificationProvider return a prototype function.\n return Object.hasOwn(VERIFICATION_PROVIDERS, id);\n}\n\nexport function getVerificationProvider(id: string): VerificationProvider | undefined {\n return isKnownVerificationProvider(id) ? VERIFICATION_PROVIDERS[id] : undefined;\n}\n\n/**\n * The firehose issuer gate: given the DID that authored an\n * `app.bsky.graph.verification` record, return the provider it verifies for, or\n * `null` if the issuer is not a recognized firehose verifier. A DID counts if it\n * is a provider's trust root, or if `listMembers` (built with\n * {@link buildVerifierListMembers}) maps it to a firehose provider. Without\n * `listMembers`, each provider's `fallbackVerifierDids` apply instead.\n * API-sourced providers (Bluesky) are never matched here -- their verifications\n * do not enter through the firehose, so a self-issued record cannot resolve to\n * them.\n */\nexport function resolveVerifierProvider(\n issuerDid: string,\n listMembers?: ReadonlyMap<string, VerificationProviderId>,\n): VerificationProviderId | null {\n for (const provider of Object.values(VERIFICATION_PROVIDERS)) {\n if (provider.source !== 'firehose') continue;\n if (provider.verifierDids.includes(issuerDid)) return provider.id;\n if (!listMembers && provider.fallbackVerifierDids?.includes(issuerDid)) return provider.id;\n }\n const fromList = listMembers?.get(issuerDid);\n if (fromList && getVerificationProvider(fromList)?.source === 'firehose') return fromList;\n return null;\n}\n\n/** One `app.bsky.graph.listitem` record value, plus the repo it was read from. */\nexport interface VerifierListItem {\n /** DID of the repo the listitem record was read from. */\n repoDid: string;\n list: unknown;\n subject: unknown;\n}\n\n/**\n * Build the `listMembers` map for {@link resolveVerifierProvider} from raw\n * listitem records. An item counts only if it belongs to a firehose provider's\n * {@link VerificationProvider.verifierListUri}, was read from that list owner's\n * repo, and that owner is one of the provider's trust roots. Anything else\n * (a list item someone else wrote, another list, a malformed subject) is dropped.\n */\nexport function buildVerifierListMembers(\n items: readonly VerifierListItem[],\n): Map<string, VerificationProviderId> {\n const members = new Map<string, VerificationProviderId>();\n for (const provider of Object.values(VERIFICATION_PROVIDERS)) {\n if (provider.source !== 'firehose' || !provider.verifierListUri) continue;\n const owner = provider.verifierListUri.split('/')[2];\n if (!owner || !provider.verifierDids.includes(owner)) continue;\n for (const item of items) {\n if (item.repoDid !== owner || item.list !== provider.verifierListUri) continue;\n if (typeof item.subject !== 'string' || !/^did:[a-z]+:[A-Za-z0-9._:%-]+$/.test(item.subject))\n continue;\n if (!members.has(item.subject)) members.set(item.subject, provider.id);\n }\n }\n return members;\n}\n\n/**\n * D1 primary-provider selection: from all verifications an account holds, pick\n * the one whose provider has the highest priority (lowest `priority` number) for\n * the single inline badge. The rest belong in the popover. Verifications from\n * unknown providers are ignored. Returns `null` when nothing is displayable.\n */\nexport function primaryVerification(\n verifications: readonly AccountVerification[],\n): AccountVerification | null {\n let best: AccountVerification | null = null;\n let bestPriority = Number.POSITIVE_INFINITY;\n for (const verification of verifications) {\n const provider = getVerificationProvider(verification.provider);\n if (!provider) continue;\n if (provider.priority < bestPriority) {\n best = verification;\n bestPriority = provider.priority;\n }\n }\n return best;\n}\n"],"mappings":";AA8EA,IAAM,cAAc;AAGpB,IAAM,uBAAuB,QAAQ,WAAW;AAGhD,IAAM,4BAA4B;AAAA,EAChC;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEO,IAAM,yBAA+E;AAAA,EAC1F,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc,CAAC;AAAA,EACjB;AAAA,EACA,IAAI;AAAA,IACF,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW;AAAA,IAC1B,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,EACxB;AACF;AAEO,SAAS,4BAA4B,IAA0C;AAIpF,SAAO,OAAO,OAAO,wBAAwB,EAAE;AACjD;AAEO,SAAS,wBAAwB,IAA8C;AACpF,SAAO,4BAA4B,EAAE,IAAI,uBAAuB,EAAE,IAAI;AACxE;AAaO,SAAS,wBACd,WACA,aAC+B;AAC/B,aAAW,YAAY,OAAO,OAAO,sBAAsB,GAAG;AAC5D,QAAI,SAAS,WAAW,WAAY;AACpC,QAAI,SAAS,aAAa,SAAS,SAAS,EAAG,QAAO,SAAS;AAC/D,QAAI,CAAC,eAAe,SAAS,sBAAsB,SAAS,SAAS,EAAG,QAAO,SAAS;AAAA,EAC1F;AACA,QAAM,WAAW,aAAa,IAAI,SAAS;AAC3C,MAAI,YAAY,wBAAwB,QAAQ,GAAG,WAAW,WAAY,QAAO;AACjF,SAAO;AACT;AAiBO,SAAS,yBACd,OACqC;AACrC,QAAM,UAAU,oBAAI,IAAoC;AACxD,aAAW,YAAY,OAAO,OAAO,sBAAsB,GAAG;AAC5D,QAAI,SAAS,WAAW,cAAc,CAAC,SAAS,gBAAiB;AACjE,UAAM,QAAQ,SAAS,gBAAgB,MAAM,GAAG,EAAE,CAAC;AACnD,QAAI,CAAC,SAAS,CAAC,SAAS,aAAa,SAAS,KAAK,EAAG;AACtD,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,YAAY,SAAS,KAAK,SAAS,SAAS,gBAAiB;AACtE,UAAI,OAAO,KAAK,YAAY,YAAY,CAAC,iCAAiC,KAAK,KAAK,OAAO;AACzF;AACF,UAAI,CAAC,QAAQ,IAAI,KAAK,OAAO,EAAG,SAAQ,IAAI,KAAK,SAAS,SAAS,EAAE;AAAA,IACvE;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,oBACd,eAC4B;AAC5B,MAAI,OAAmC;AACvC,MAAI,eAAe,OAAO;AAC1B,aAAW,gBAAgB,eAAe;AACxC,UAAM,WAAW,wBAAwB,aAAa,QAAQ;AAC9D,QAAI,CAAC,SAAU;AACf,QAAI,SAAS,WAAW,cAAc;AACpC,aAAO;AACP,qBAAe,SAAS;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/taxonomy/verification-providers.ts"],"sourcesContent":["/**\n * Verification providers -- the trust roots Sifa recognizes for AT Protocol\n * `app.bsky.graph.verification` records.\n *\n * Framing (see decisions/2026-07-13-third-party-verification-providers.md, D4):\n * a verification checkmark is ONE low-tier trust layer, not Sifa's headline.\n * Most of what it certifies is \"this account is who they claim to be\" -- useful,\n * and worth carrying because it's an already-recognized network signal, but low\n * value on its own. It sits among Sifa's other trust signals and never becomes a\n * score or a gate. This registry only decides which issuers Sifa displays and\n * with what provenance.\n *\n * Data-only: badge colors live in the `/tokens` entry point\n * (`verificationColors`, keyed by provider id); icons and components are\n * consumer concerns (React DOM on web, React Native on mobile).\n */\n\nexport type VerificationProviderId = 'bluesky' | 'mu';\n\n/** How Sifa learns about a provider's verifications. */\nexport type VerificationSource = 'bluesky-api' | 'firehose';\n\nexport interface VerificationProvider {\n id: VerificationProviderId;\n /** Human label for the badge popover, e.g. \"Bluesky\", \"mu (Eurosky)\". */\n label: string;\n /**\n * Primary-display priority (D1): when an account holds verifications from\n * multiple providers, the lowest number wins the single inline badge and the\n * rest move into the popover. Must be unique across providers.\n */\n priority: number;\n /**\n * - `bluesky-api`: sourced from Bluesky's public-API `verifiedStatus`. Bluesky\n * maintains its own trusted-verifier set, so Sifa keeps no local DID list.\n * - `firehose`: sourced from the Jetstream, gated on {@link verifierDids}.\n */\n source: VerificationSource;\n /**\n * Trust-root DIDs for firehose-sourced providers. A verification record counts\n * if its ISSUER DID is a root or a member of {@link verifierListUri}. Empty for\n * `bluesky-api` providers (Bluesky's AppView owns that decision). DIDs, not\n * handles: a handle takeover must never confer verifier status.\n */\n verifierDids: readonly string[];\n /**\n * AT-URI of the `app.bsky.graph.list` where the provider publishes its\n * trusted verifiers. Consumers load its members at runtime and pass them to\n * {@link resolveVerifierProvider}, so a verifier the provider adds counts on\n * Sifa without a release. The list owner must be in {@link verifierDids}.\n */\n verifierListUri?: string;\n /**\n * Verifiers last confirmed by hand, used ONLY when the caller supplies no\n * list members (list not loaded yet, or a consumer that does not load it).\n * Keeps such callers working; once members are supplied, the list wins.\n */\n fallbackVerifierDids?: readonly string[];\n}\n\n/**\n * A verification held by an account, as surfaced to the UI. `issuerDid` is\n * present for firehose-sourced providers and absent for `bluesky-api`.\n */\nexport interface AccountVerification {\n provider: VerificationProviderId;\n verifiedAt?: string | null;\n issuerDid?: string | null;\n /** Display name of the issuer (firehose providers), when the API knows it. */\n issuerName?: string | null;\n}\n\n/**\n * mu / Eurosky trust root (see https://hello.mu.social/verification).\n * eurosky.social coordinates the trusted-verifier program and publishes the\n * verifier set as {@link MU_VERIFIER_LIST_URI}; the individual verifiers are\n * read from that list at runtime, not maintained here.\n */\nconst MU_ROOT_DID = 'did:plc:ooensn4mr5mhznzypvxelfa3'; // eurosky.social\n\n/** \"Trusted verifiers on mu\", owned by {@link MU_ROOT_DID}. */\nconst MU_VERIFIER_LIST_URI = `at://${MU_ROOT_DID}/app.bsky.graph.list/3mogaw2g4an23`;\n\n/** Snapshot of the mu verifiers confirmed by hand before the list was used. */\nconst MU_FALLBACK_VERIFIER_DIDS = [\n 'did:plc:durcipmx2rwgzzagbiumobs5', // france-atmosphe.re\n 'did:plc:zsf5p7rqilz2qvyd7ezmxrfj', // belgium-atmosphe.re\n 'did:plc:hd564mpf6bekrwzyhvujs54b', // medsky.network\n 'did:plc:u5zp7npt5kpueado77kuihyz', // npmx.dev\n 'did:plc:6tndl5lqrzjrx7ahjom2gjbq', // stewardshiplab.org\n 'did:plc:vnycpb2e4lh4tc7oyr3n2jvh', // newsmastfoundation.org\n 'did:plc:dsiqe4pszk5ldbjk66fyryjv', // cpesr.fr\n] as const;\n\nexport const VERIFICATION_PROVIDERS: Record<VerificationProviderId, VerificationProvider> = {\n bluesky: {\n id: 'bluesky',\n label: 'Bluesky',\n priority: 0,\n source: 'bluesky-api',\n verifierDids: [],\n },\n mu: {\n id: 'mu',\n label: 'mu (Eurosky)',\n priority: 1,\n source: 'firehose',\n verifierDids: [MU_ROOT_DID],\n verifierListUri: MU_VERIFIER_LIST_URI,\n fallbackVerifierDids: MU_FALLBACK_VERIFIER_DIDS,\n },\n};\n\nexport function isKnownVerificationProvider(id: string): id is VerificationProviderId {\n // Object.hasOwn, not `in`: `in` also matches inherited Object.prototype keys\n // ('toString', 'constructor', ...), which would wrongly narrow those strings\n // and make getVerificationProvider return a prototype function.\n return Object.hasOwn(VERIFICATION_PROVIDERS, id);\n}\n\nexport function getVerificationProvider(id: string): VerificationProvider | undefined {\n return isKnownVerificationProvider(id) ? VERIFICATION_PROVIDERS[id] : undefined;\n}\n\n/**\n * The firehose issuer gate: given the DID that authored an\n * `app.bsky.graph.verification` record, return the provider it verifies for, or\n * `null` if the issuer is not a recognized firehose verifier. A DID counts if it\n * is a provider's trust root, or if `listMembers` (built with\n * {@link buildVerifierListMembers}) maps it to a firehose provider. Without\n * `listMembers`, each provider's `fallbackVerifierDids` apply instead.\n * API-sourced providers (Bluesky) are never matched here -- their verifications\n * do not enter through the firehose, so a self-issued record cannot resolve to\n * them.\n */\nexport function resolveVerifierProvider(\n issuerDid: string,\n listMembers?: ReadonlyMap<string, VerificationProviderId>,\n): VerificationProviderId | null {\n for (const provider of Object.values(VERIFICATION_PROVIDERS)) {\n if (provider.source !== 'firehose') continue;\n if (provider.verifierDids.includes(issuerDid)) return provider.id;\n if (!listMembers && provider.fallbackVerifierDids?.includes(issuerDid)) return provider.id;\n }\n const fromList = listMembers?.get(issuerDid);\n if (fromList && getVerificationProvider(fromList)?.source === 'firehose') return fromList;\n return null;\n}\n\n/** One `app.bsky.graph.listitem` record value, plus the repo it was read from. */\nexport interface VerifierListItem {\n /** DID of the repo the listitem record was read from. */\n repoDid: string;\n list: unknown;\n subject: unknown;\n}\n\n/**\n * Build the `listMembers` map for {@link resolveVerifierProvider} from raw\n * listitem records. An item counts only if it belongs to a firehose provider's\n * {@link VerificationProvider.verifierListUri}, was read from that list owner's\n * repo, and that owner is one of the provider's trust roots. Anything else\n * (a list item someone else wrote, another list, a malformed subject) is dropped.\n */\nexport function buildVerifierListMembers(\n items: readonly VerifierListItem[],\n): Map<string, VerificationProviderId> {\n const members = new Map<string, VerificationProviderId>();\n for (const provider of Object.values(VERIFICATION_PROVIDERS)) {\n if (provider.source !== 'firehose' || !provider.verifierListUri) continue;\n const owner = provider.verifierListUri.split('/')[2];\n if (!owner || !provider.verifierDids.includes(owner)) continue;\n for (const item of items) {\n if (item.repoDid !== owner || item.list !== provider.verifierListUri) continue;\n if (typeof item.subject !== 'string' || !/^did:[a-z]+:[A-Za-z0-9._:%-]+$/.test(item.subject))\n continue;\n if (!members.has(item.subject)) members.set(item.subject, provider.id);\n }\n }\n return members;\n}\n\n/**\n * D1 primary-provider selection: from all verifications an account holds, pick\n * the one whose provider has the highest priority (lowest `priority` number) for\n * the single inline badge. The rest belong in the popover. Verifications from\n * unknown providers are ignored. Returns `null` when nothing is displayable.\n */\nexport function primaryVerification(\n verifications: readonly AccountVerification[],\n): AccountVerification | null {\n let best: AccountVerification | null = null;\n let bestPriority = Number.POSITIVE_INFINITY;\n for (const verification of verifications) {\n const provider = getVerificationProvider(verification.provider);\n if (!provider) continue;\n if (provider.priority < bestPriority) {\n best = verification;\n bestPriority = provider.priority;\n }\n }\n return best;\n}\n\n/** Longest verifier name a label shows (Bluesky's displayName limit in graphemes). */\nconst MAX_LABEL_LENGTH = 64;\n\n/**\n * Label for one verification: the verifier's own display name (`issuerName`,\n * sent by the API for firehose providers such as mu, where each verifier is\n * shown by name), otherwise the provider label. Long names are shortened with\n * an ellipsis. A provider this SDK version does not know falls back to its raw\n * id ({@link resolveVerificationBadges} already drops those).\n */\nexport function verificationLabel(v: Pick<AccountVerification, 'provider' | 'issuerName'>): string {\n const name = v.issuerName?.trim();\n if (name) {\n const chars = [...name];\n return chars.length > MAX_LABEL_LENGTH\n ? `${chars.slice(0, MAX_LABEL_LENGTH - 1).join('')}…`\n : name;\n }\n return getVerificationProvider(v.provider)?.label ?? v.provider;\n}\n\n/**\n * The verifications a badge should render, as a new array. Keeps the API's\n * `verificationBadges` from providers this SDK knows; an empty array means\n * \"none\", even with the legacy flag. When the array is absent, or holds only\n * unknown providers, builds a Bluesky entry from the legacy `blueskyVerified`\n * flag (payloads that predate `verificationBadges`).\n */\nexport function resolveVerificationBadges(input: {\n verificationBadges?: readonly AccountVerification[] | null;\n blueskyVerified?: boolean;\n blueskyVerifiedAt?: string | null;\n}): AccountVerification[] {\n const badges = input.verificationBadges;\n if (badges && badges.length === 0) return [];\n const known = (badges ?? []).filter((b) => isKnownVerificationProvider(b.provider));\n if (known.length > 0) return known;\n return input.blueskyVerified\n ? [{ provider: 'bluesky', verifiedAt: input.blueskyVerifiedAt ?? null }]\n : [];\n}\n"],"mappings":";AA8EA,IAAM,cAAc;AAGpB,IAAM,uBAAuB,QAAQ,WAAW;AAGhD,IAAM,4BAA4B;AAAA,EAChC;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AACF;AAEO,IAAM,yBAA+E;AAAA,EAC1F,SAAS;AAAA,IACP,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc,CAAC;AAAA,EACjB;AAAA,EACA,IAAI;AAAA,IACF,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc,CAAC,WAAW;AAAA,IAC1B,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,EACxB;AACF;AAEO,SAAS,4BAA4B,IAA0C;AAIpF,SAAO,OAAO,OAAO,wBAAwB,EAAE;AACjD;AAEO,SAAS,wBAAwB,IAA8C;AACpF,SAAO,4BAA4B,EAAE,IAAI,uBAAuB,EAAE,IAAI;AACxE;AAaO,SAAS,wBACd,WACA,aAC+B;AAC/B,aAAW,YAAY,OAAO,OAAO,sBAAsB,GAAG;AAC5D,QAAI,SAAS,WAAW,WAAY;AACpC,QAAI,SAAS,aAAa,SAAS,SAAS,EAAG,QAAO,SAAS;AAC/D,QAAI,CAAC,eAAe,SAAS,sBAAsB,SAAS,SAAS,EAAG,QAAO,SAAS;AAAA,EAC1F;AACA,QAAM,WAAW,aAAa,IAAI,SAAS;AAC3C,MAAI,YAAY,wBAAwB,QAAQ,GAAG,WAAW,WAAY,QAAO;AACjF,SAAO;AACT;AAiBO,SAAS,yBACd,OACqC;AACrC,QAAM,UAAU,oBAAI,IAAoC;AACxD,aAAW,YAAY,OAAO,OAAO,sBAAsB,GAAG;AAC5D,QAAI,SAAS,WAAW,cAAc,CAAC,SAAS,gBAAiB;AACjE,UAAM,QAAQ,SAAS,gBAAgB,MAAM,GAAG,EAAE,CAAC;AACnD,QAAI,CAAC,SAAS,CAAC,SAAS,aAAa,SAAS,KAAK,EAAG;AACtD,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,YAAY,SAAS,KAAK,SAAS,SAAS,gBAAiB;AACtE,UAAI,OAAO,KAAK,YAAY,YAAY,CAAC,iCAAiC,KAAK,KAAK,OAAO;AACzF;AACF,UAAI,CAAC,QAAQ,IAAI,KAAK,OAAO,EAAG,SAAQ,IAAI,KAAK,SAAS,SAAS,EAAE;AAAA,IACvE;AAAA,EACF;AACA,SAAO;AACT;AAQO,SAAS,oBACd,eAC4B;AAC5B,MAAI,OAAmC;AACvC,MAAI,eAAe,OAAO;AAC1B,aAAW,gBAAgB,eAAe;AACxC,UAAM,WAAW,wBAAwB,aAAa,QAAQ;AAC9D,QAAI,CAAC,SAAU;AACf,QAAI,SAAS,WAAW,cAAc;AACpC,aAAO;AACP,qBAAe,SAAS;AAAA,IAC1B;AAAA,EACF;AACA,SAAO;AACT;AAGA,IAAM,mBAAmB;AASlB,SAAS,kBAAkB,GAAiE;AACjG,QAAM,OAAO,EAAE,YAAY,KAAK;AAChC,MAAI,MAAM;AACR,UAAM,QAAQ,CAAC,GAAG,IAAI;AACtB,WAAO,MAAM,SAAS,mBAClB,GAAG,MAAM,MAAM,GAAG,mBAAmB,CAAC,EAAE,KAAK,EAAE,CAAC,WAChD;AAAA,EACN;AACA,SAAO,wBAAwB,EAAE,QAAQ,GAAG,SAAS,EAAE;AACzD;AASO,SAAS,0BAA0B,OAIhB;AACxB,QAAM,SAAS,MAAM;AACrB,MAAI,UAAU,OAAO,WAAW,EAAG,QAAO,CAAC;AAC3C,QAAM,SAAS,UAAU,CAAC,GAAG,OAAO,CAAC,MAAM,4BAA4B,EAAE,QAAQ,CAAC;AAClF,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,SAAO,MAAM,kBACT,CAAC,EAAE,UAAU,WAAW,YAAY,MAAM,qBAAqB,KAAK,CAAC,IACrE,CAAC;AACP;","names":[]}
@@ -5,7 +5,12 @@ var colors = {
5
5
  /** Flexoki Purple -- secondary accent, shared across Singi Labs products. */
6
6
  secondary: "#8B7EC8"
7
7
  };
8
+ var verificationColors = {
9
+ bluesky: { light: "#0F73FF", dark: "#0F73FF" },
10
+ mu: { light: "#DB4AA6", dark: "#E98FD0" }
11
+ };
8
12
  export {
9
- colors
13
+ colors,
14
+ verificationColors
10
15
  };
11
16
  //# sourceMappingURL=colors.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tokens/colors.ts"],"sourcesContent":["/**\n * Sifa brand colors -- accent values from the Singi Labs design system.\n *\n * Source of truth: `Singi Labs/brand/design-system.md` §Colors. Sifa uses a\n * distinct Flexoki accent from sibling Singi Labs products (Barazo, Singi\n * Labs itself); Flexoki Purple is the shared secondary accent across the\n * product family.\n *\n * NOTE: Neutral scales (background, surface, border, text) are not encoded\n * here. They come from Radix Colors (12-step scales with automatic\n * light/dark mode) and resolve at runtime via CSS variables in\n * `sifa-web`'s `globals.css`. Encoding them as TS constants would\n * misrepresent how they're consumed.\n */\n\nexport const colors = {\n /** Flexoki Blue -- Sifa's primary accent. */\n primary: '#4385BE',\n /** Flexoki Purple -- secondary accent, shared across Singi Labs products. */\n secondary: '#8B7EC8',\n} as const;\n\nexport type Colors = typeof colors;\n"],"mappings":";AAeO,IAAM,SAAS;AAAA;AAAA,EAEpB,SAAS;AAAA;AAAA,EAET,WAAW;AACb;","names":[]}
1
+ {"version":3,"sources":["../../src/tokens/colors.ts"],"sourcesContent":["import type { VerificationProviderId } from '../taxonomy/verification-providers.js';\n\n/**\n * Sifa brand colors -- accent values from the Singi Labs design system.\n *\n * Source of truth: `Singi Labs/brand/design-system.md` §Colors. Sifa uses a\n * distinct Flexoki accent from sibling Singi Labs products (Barazo, Singi\n * Labs itself); Flexoki Purple is the shared secondary accent across the\n * product family.\n *\n * NOTE: Neutral scales (background, surface, border, text) are not encoded\n * here. They come from Radix Colors (12-step scales with automatic\n * light/dark mode) and resolve at runtime via CSS variables in\n * `sifa-web`'s `globals.css`. Encoding them as TS constants would\n * misrepresent how they're consumed.\n */\n\nexport const colors = {\n /** Flexoki Blue -- Sifa's primary accent. */\n primary: '#4385BE',\n /** Flexoki Purple -- secondary accent, shared across Singi Labs products. */\n secondary: '#8B7EC8',\n} as const;\n\nexport type Colors = typeof colors;\n\n/**\n * Verification checkmark colors per provider, for light and dark themes. Keys\n * match the SDK's verification provider ids. Bluesky keeps its brand blue in\n * both themes; mu's brand pink is lightened for dark backgrounds.\n */\nexport const verificationColors = {\n bluesky: { light: '#0F73FF', dark: '#0F73FF' },\n mu: { light: '#DB4AA6', dark: '#E98FD0' },\n} as const satisfies Record<VerificationProviderId, { light: string; dark: string }>;\n\nexport type VerificationColors = typeof verificationColors;\n"],"mappings":";AAiBO,IAAM,SAAS;AAAA;AAAA,EAEpB,SAAS;AAAA;AAAA,EAET,WAAW;AACb;AASO,IAAM,qBAAqB;AAAA,EAChC,SAAS,EAAE,OAAO,WAAW,MAAM,UAAU;AAAA,EAC7C,IAAI,EAAE,OAAO,WAAW,MAAM,UAAU;AAC1C;","names":[]}
@@ -7,6 +7,10 @@ var colors = {
7
7
  /** Flexoki Purple -- secondary accent, shared across Singi Labs products. */
8
8
  secondary: "#8B7EC8"
9
9
  };
10
+ var verificationColors = {
11
+ bluesky: { light: "#0F73FF", dark: "#0F73FF" },
12
+ mu: { light: "#DB4AA6", dark: "#E98FD0" }
13
+ };
10
14
 
11
15
  // src/tokens/typography.ts
12
16
  var SYSTEM_SANS_FALLBACK = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif";
@@ -43,5 +47,6 @@ exports.fontFallbackStacks = fontFallbackStacks;
43
47
  exports.fonts = fonts;
44
48
  exports.iconSet = iconSet;
45
49
  exports.iconWeights = iconWeights;
50
+ exports.verificationColors = verificationColors;
46
51
  //# sourceMappingURL=index.cjs.map
47
52
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tokens/colors.ts","../../src/tokens/typography.ts","../../src/tokens/icons.ts"],"names":[],"mappings":";;;AAeO,IAAM,MAAA,GAAS;AAAA;AAAA,EAEpB,OAAA,EAAS,SAAA;AAAA;AAAA,EAET,SAAA,EAAW;AACb;;;ACRA,IAAM,oBAAA,GAAuB,mEAAA;AAC7B,IAAM,oBAAA,GAAuB,0DAAA;AAK7B,IAAM,oBAAA,GACJ,+FAAA;AAMF,IAAM,mBAAA,GACJ,uQAAA;AAKK,IAAM,KAAA,GAAQ;AAAA;AAAA,EAEnB,IAAA,EAAM,mBAAA;AAAA;AAAA,EAEN,OAAA,EAAS,eAAA;AAAA;AAAA,EAET,IAAA,EAAM;AACR;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,IAAI,KAAA,CAAM,IAAI,MAAM,oBAAoB,CAAA,EAAA,EAAK,mBAAmB,CAAA,EAAA,EAAK,oBAAoB,CAAA,CAAA;AAAA,EAC/F,OAAA,EAAS,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,IAAA,EAAO,MAAM,IAAI,CAAA,GAAA,EAAM,oBAAoB,CAAA,EAAA,EAAK,mBAAmB,CAAA,uBAAA,CAAA;AAAA,EAC7F,IAAA,EAAM,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,MAAM,oBAAoB,CAAA;AAChD;;;ACjCO,IAAM,OAAA,GAAU;AAEhB,IAAM,WAAA,GAAc;AAAA;AAAA,EAEzB,QAAA,EAAU,SAAA;AAAA;AAAA,EAEV,WAAA,EAAa,MAAA;AAAA;AAAA,EAEb,UAAA,EAAY;AACd","file":"index.cjs","sourcesContent":["/**\n * Sifa brand colors -- accent values from the Singi Labs design system.\n *\n * Source of truth: `Singi Labs/brand/design-system.md` §Colors. Sifa uses a\n * distinct Flexoki accent from sibling Singi Labs products (Barazo, Singi\n * Labs itself); Flexoki Purple is the shared secondary accent across the\n * product family.\n *\n * NOTE: Neutral scales (background, surface, border, text) are not encoded\n * here. They come from Radix Colors (12-step scales with automatic\n * light/dark mode) and resolve at runtime via CSS variables in\n * `sifa-web`'s `globals.css`. Encoding them as TS constants would\n * misrepresent how they're consumed.\n */\n\nexport const colors = {\n /** Flexoki Blue -- Sifa's primary accent. */\n primary: '#4385BE',\n /** Flexoki Purple -- secondary accent, shared across Singi Labs products. */\n secondary: '#8B7EC8',\n} as const;\n\nexport type Colors = typeof colors;\n","/**\n * Sifa typography tokens -- font families and fallback stacks.\n *\n * Source of truth: `Singi Labs/brand/design-system.md` §Typography. Three\n * families, with explicit fallback chains so consumers can paste straight\n * into a CSS `font-family` declaration or a React Native style.\n *\n * Self-hosted fonts (Sifa-web ships `iA Writer Quattro` + `Space Grotesk`\n * WOFF2 files; sifa-app will need to bundle equivalents). The SDK only\n * encodes the names + fallbacks; consumers handle font loading.\n */\n\nconst SYSTEM_SANS_FALLBACK = \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\";\nconst SYSTEM_MONO_FALLBACK = 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace';\n\n// Noto Sans subsets layered after the brand fonts to cover scripts the\n// brand fonts don't ship. Consumers wire @font-face with `unicode-range`\n// so browsers fetch a file only when a glyph in that range is rendered.\nconst INTL_SCRIPT_FALLBACK =\n \"'Noto Sans', 'Noto Sans Arabic', 'Noto Sans Devanagari', 'Noto Sans Thai', 'Noto Sans Hebrew'\";\n\n// OS-installed CJK fonts. Sifa intentionally does not ship CJK web fonts:\n// every CJK user already has an OS-level CJK font and vendoring them\n// would add 14+ MB. Listed JP-first, then SC, TC, KR, with Noto Sans CJK\n// per-script as the Linux fallback.\nconst CJK_SYSTEM_FALLBACK =\n \"'Hiragino Kaku Gothic ProN', 'Hiragino Sans', 'Yu Gothic UI', 'Meiryo', 'Noto Sans CJK JP', \" +\n \"'PingFang SC', 'Microsoft YaHei', 'Noto Sans CJK SC', \" +\n \"'PingFang TC', 'Microsoft JhengHei', 'Noto Sans CJK TC', \" +\n \"'Apple SD Gothic Neo', 'Malgun Gothic', 'Noto Sans CJK KR'\";\n\nexport const fonts = {\n /** Body text -- iA Writer Quattro (self-hosted, OFL-licensed). */\n sans: 'iA Writer Quattro',\n /** Headings (h1-h3) -- Space Grotesk Bold (self-hosted). Single weight (700). */\n display: 'Space Grotesk',\n /** Code / monospace -- Source Code Pro (loaded via `next/font` in Next.js consumers). */\n mono: 'Source Code Pro',\n} as const;\n\nexport const fontFallbackStacks = {\n sans: `'${fonts.sans}', ${INTL_SCRIPT_FALLBACK}, ${CJK_SYSTEM_FALLBACK}, ${SYSTEM_SANS_FALLBACK}`,\n display: `'${fonts.display}', '${fonts.sans}', ${INTL_SCRIPT_FALLBACK}, ${CJK_SYSTEM_FALLBACK}, system-ui, sans-serif`,\n mono: `'${fonts.mono}', ${SYSTEM_MONO_FALLBACK}`,\n} as const;\n\nexport type Fonts = typeof fonts;\nexport type FontFallbackStacks = typeof fontFallbackStacks;\n","/**\n * Sifa icon-set conventions.\n *\n * Source of truth: `Singi Labs/brand/design-system.md` §Icons. Phosphor\n * Icons is the only icon library used across Singi Labs products; mixing\n * icon families within a product is forbidden by convention.\n *\n * The weight conventions are guidance for consumers, not enforced. Encoded\n * here so tooling (e.g., a future \"design lint\" check) can reference them.\n */\n\nexport const iconSet = 'phosphor' as const;\n\nexport const iconWeights = {\n /** UI chrome -- buttons, nav, default state. */\n uiChrome: 'regular',\n /** Interactive / active states -- selected items, primary buttons. */\n interactive: 'bold',\n /** Decorative / illustration -- empty states, hero sections. */\n decorative: 'duotone',\n} as const;\n\nexport type IconSet = typeof iconSet;\nexport type IconWeights = typeof iconWeights;\n"]}
1
+ {"version":3,"sources":["../../src/tokens/colors.ts","../../src/tokens/typography.ts","../../src/tokens/icons.ts"],"names":[],"mappings":";;;AAiBO,IAAM,MAAA,GAAS;AAAA;AAAA,EAEpB,OAAA,EAAS,SAAA;AAAA;AAAA,EAET,SAAA,EAAW;AACb;AASO,IAAM,kBAAA,GAAqB;AAAA,EAChC,OAAA,EAAS,EAAE,KAAA,EAAO,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,EAC7C,EAAA,EAAI,EAAE,KAAA,EAAO,SAAA,EAAW,MAAM,SAAA;AAChC;;;ACtBA,IAAM,oBAAA,GAAuB,mEAAA;AAC7B,IAAM,oBAAA,GAAuB,0DAAA;AAK7B,IAAM,oBAAA,GACJ,+FAAA;AAMF,IAAM,mBAAA,GACJ,uQAAA;AAKK,IAAM,KAAA,GAAQ;AAAA;AAAA,EAEnB,IAAA,EAAM,mBAAA;AAAA;AAAA,EAEN,OAAA,EAAS,eAAA;AAAA;AAAA,EAET,IAAA,EAAM;AACR;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,IAAI,KAAA,CAAM,IAAI,MAAM,oBAAoB,CAAA,EAAA,EAAK,mBAAmB,CAAA,EAAA,EAAK,oBAAoB,CAAA,CAAA;AAAA,EAC/F,OAAA,EAAS,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,IAAA,EAAO,MAAM,IAAI,CAAA,GAAA,EAAM,oBAAoB,CAAA,EAAA,EAAK,mBAAmB,CAAA,uBAAA,CAAA;AAAA,EAC7F,IAAA,EAAM,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,MAAM,oBAAoB,CAAA;AAChD;;;ACjCO,IAAM,OAAA,GAAU;AAEhB,IAAM,WAAA,GAAc;AAAA;AAAA,EAEzB,QAAA,EAAU,SAAA;AAAA;AAAA,EAEV,WAAA,EAAa,MAAA;AAAA;AAAA,EAEb,UAAA,EAAY;AACd","file":"index.cjs","sourcesContent":["import type { VerificationProviderId } from '../taxonomy/verification-providers.js';\n\n/**\n * Sifa brand colors -- accent values from the Singi Labs design system.\n *\n * Source of truth: `Singi Labs/brand/design-system.md` §Colors. Sifa uses a\n * distinct Flexoki accent from sibling Singi Labs products (Barazo, Singi\n * Labs itself); Flexoki Purple is the shared secondary accent across the\n * product family.\n *\n * NOTE: Neutral scales (background, surface, border, text) are not encoded\n * here. They come from Radix Colors (12-step scales with automatic\n * light/dark mode) and resolve at runtime via CSS variables in\n * `sifa-web`'s `globals.css`. Encoding them as TS constants would\n * misrepresent how they're consumed.\n */\n\nexport const colors = {\n /** Flexoki Blue -- Sifa's primary accent. */\n primary: '#4385BE',\n /** Flexoki Purple -- secondary accent, shared across Singi Labs products. */\n secondary: '#8B7EC8',\n} as const;\n\nexport type Colors = typeof colors;\n\n/**\n * Verification checkmark colors per provider, for light and dark themes. Keys\n * match the SDK's verification provider ids. Bluesky keeps its brand blue in\n * both themes; mu's brand pink is lightened for dark backgrounds.\n */\nexport const verificationColors = {\n bluesky: { light: '#0F73FF', dark: '#0F73FF' },\n mu: { light: '#DB4AA6', dark: '#E98FD0' },\n} as const satisfies Record<VerificationProviderId, { light: string; dark: string }>;\n\nexport type VerificationColors = typeof verificationColors;\n","/**\n * Sifa typography tokens -- font families and fallback stacks.\n *\n * Source of truth: `Singi Labs/brand/design-system.md` §Typography. Three\n * families, with explicit fallback chains so consumers can paste straight\n * into a CSS `font-family` declaration or a React Native style.\n *\n * Self-hosted fonts (Sifa-web ships `iA Writer Quattro` + `Space Grotesk`\n * WOFF2 files; sifa-app will need to bundle equivalents). The SDK only\n * encodes the names + fallbacks; consumers handle font loading.\n */\n\nconst SYSTEM_SANS_FALLBACK = \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\";\nconst SYSTEM_MONO_FALLBACK = 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace';\n\n// Noto Sans subsets layered after the brand fonts to cover scripts the\n// brand fonts don't ship. Consumers wire @font-face with `unicode-range`\n// so browsers fetch a file only when a glyph in that range is rendered.\nconst INTL_SCRIPT_FALLBACK =\n \"'Noto Sans', 'Noto Sans Arabic', 'Noto Sans Devanagari', 'Noto Sans Thai', 'Noto Sans Hebrew'\";\n\n// OS-installed CJK fonts. Sifa intentionally does not ship CJK web fonts:\n// every CJK user already has an OS-level CJK font and vendoring them\n// would add 14+ MB. Listed JP-first, then SC, TC, KR, with Noto Sans CJK\n// per-script as the Linux fallback.\nconst CJK_SYSTEM_FALLBACK =\n \"'Hiragino Kaku Gothic ProN', 'Hiragino Sans', 'Yu Gothic UI', 'Meiryo', 'Noto Sans CJK JP', \" +\n \"'PingFang SC', 'Microsoft YaHei', 'Noto Sans CJK SC', \" +\n \"'PingFang TC', 'Microsoft JhengHei', 'Noto Sans CJK TC', \" +\n \"'Apple SD Gothic Neo', 'Malgun Gothic', 'Noto Sans CJK KR'\";\n\nexport const fonts = {\n /** Body text -- iA Writer Quattro (self-hosted, OFL-licensed). */\n sans: 'iA Writer Quattro',\n /** Headings (h1-h3) -- Space Grotesk Bold (self-hosted). Single weight (700). */\n display: 'Space Grotesk',\n /** Code / monospace -- Source Code Pro (loaded via `next/font` in Next.js consumers). */\n mono: 'Source Code Pro',\n} as const;\n\nexport const fontFallbackStacks = {\n sans: `'${fonts.sans}', ${INTL_SCRIPT_FALLBACK}, ${CJK_SYSTEM_FALLBACK}, ${SYSTEM_SANS_FALLBACK}`,\n display: `'${fonts.display}', '${fonts.sans}', ${INTL_SCRIPT_FALLBACK}, ${CJK_SYSTEM_FALLBACK}, system-ui, sans-serif`,\n mono: `'${fonts.mono}', ${SYSTEM_MONO_FALLBACK}`,\n} as const;\n\nexport type Fonts = typeof fonts;\nexport type FontFallbackStacks = typeof fontFallbackStacks;\n","/**\n * Sifa icon-set conventions.\n *\n * Source of truth: `Singi Labs/brand/design-system.md` §Icons. Phosphor\n * Icons is the only icon library used across Singi Labs products; mixing\n * icon families within a product is forbidden by convention.\n *\n * The weight conventions are guidance for consumers, not enforced. Encoded\n * here so tooling (e.g., a future \"design lint\" check) can reference them.\n */\n\nexport const iconSet = 'phosphor' as const;\n\nexport const iconWeights = {\n /** UI chrome -- buttons, nav, default state. */\n uiChrome: 'regular',\n /** Interactive / active states -- selected items, primary buttons. */\n interactive: 'bold',\n /** Decorative / illustration -- empty states, hero sections. */\n decorative: 'duotone',\n} as const;\n\nexport type IconSet = typeof iconSet;\nexport type IconWeights = typeof iconWeights;\n"]}
@@ -19,6 +19,22 @@ declare const colors: {
19
19
  readonly secondary: "#8B7EC8";
20
20
  };
21
21
  type Colors = typeof colors;
22
+ /**
23
+ * Verification checkmark colors per provider, for light and dark themes. Keys
24
+ * match the SDK's verification provider ids. Bluesky keeps its brand blue in
25
+ * both themes; mu's brand pink is lightened for dark backgrounds.
26
+ */
27
+ declare const verificationColors: {
28
+ readonly bluesky: {
29
+ readonly light: "#0F73FF";
30
+ readonly dark: "#0F73FF";
31
+ };
32
+ readonly mu: {
33
+ readonly light: "#DB4AA6";
34
+ readonly dark: "#E98FD0";
35
+ };
36
+ };
37
+ type VerificationColors = typeof verificationColors;
22
38
 
23
39
  /**
24
40
  * Sifa typography tokens -- font families and fallback stacks.
@@ -69,4 +85,4 @@ declare const iconWeights: {
69
85
  type IconSet = typeof iconSet;
70
86
  type IconWeights = typeof iconWeights;
71
87
 
72
- export { type Colors, type FontFallbackStacks, type Fonts, type IconSet, type IconWeights, colors, fontFallbackStacks, fonts, iconSet, iconWeights };
88
+ export { type Colors, type FontFallbackStacks, type Fonts, type IconSet, type IconWeights, type VerificationColors, colors, fontFallbackStacks, fonts, iconSet, iconWeights, verificationColors };
@@ -19,6 +19,22 @@ declare const colors: {
19
19
  readonly secondary: "#8B7EC8";
20
20
  };
21
21
  type Colors = typeof colors;
22
+ /**
23
+ * Verification checkmark colors per provider, for light and dark themes. Keys
24
+ * match the SDK's verification provider ids. Bluesky keeps its brand blue in
25
+ * both themes; mu's brand pink is lightened for dark backgrounds.
26
+ */
27
+ declare const verificationColors: {
28
+ readonly bluesky: {
29
+ readonly light: "#0F73FF";
30
+ readonly dark: "#0F73FF";
31
+ };
32
+ readonly mu: {
33
+ readonly light: "#DB4AA6";
34
+ readonly dark: "#E98FD0";
35
+ };
36
+ };
37
+ type VerificationColors = typeof verificationColors;
22
38
 
23
39
  /**
24
40
  * Sifa typography tokens -- font families and fallback stacks.
@@ -69,4 +85,4 @@ declare const iconWeights: {
69
85
  type IconSet = typeof iconSet;
70
86
  type IconWeights = typeof iconWeights;
71
87
 
72
- export { type Colors, type FontFallbackStacks, type Fonts, type IconSet, type IconWeights, colors, fontFallbackStacks, fonts, iconSet, iconWeights };
88
+ export { type Colors, type FontFallbackStacks, type Fonts, type IconSet, type IconWeights, type VerificationColors, colors, fontFallbackStacks, fonts, iconSet, iconWeights, verificationColors };
@@ -1,5 +1,5 @@
1
1
  // src/tokens/index.ts
2
- import { colors } from "./colors.js";
2
+ import { colors, verificationColors } from "./colors.js";
3
3
  import { fonts, fontFallbackStacks } from "./typography.js";
4
4
  import { iconSet, iconWeights } from "./icons.js";
5
5
  export {
@@ -7,6 +7,7 @@ export {
7
7
  fontFallbackStacks,
8
8
  fonts,
9
9
  iconSet,
10
- iconWeights
10
+ iconWeights,
11
+ verificationColors
11
12
  };
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/tokens/index.ts"],"sourcesContent":["/**\n * `@singi-labs/sifa-sdk/tokens` -- Sifa brand design tokens.\n *\n * Encoded from `Singi Labs/brand/design-system.md`. Optional for third\n * parties; primary consumers are `sifa-web` (Tailwind config + font CSS)\n * and the planned `sifa-app` (React Native style objects).\n *\n * Decision (2026-05-14, reaffirmed 2026-05-16): TS constants only. No CSS\n * variable strings, no Style Dictionary output. Consumers translate to\n * their own format.\n */\n\nexport { colors, type Colors } from './colors.js';\nexport { fonts, fontFallbackStacks, type Fonts, type FontFallbackStacks } from './typography.js';\nexport { iconSet, iconWeights, type IconSet, type IconWeights } from './icons.js';\n"],"mappings":";AAYA,SAAS,cAA2B;AACpC,SAAS,OAAO,0BAA+D;AAC/E,SAAS,SAAS,mBAAmD;","names":[]}
1
+ {"version":3,"sources":["../../src/tokens/index.ts"],"sourcesContent":["/**\n * `@singi-labs/sifa-sdk/tokens` -- Sifa brand design tokens.\n *\n * Encoded from `Singi Labs/brand/design-system.md`. Optional for third\n * parties; primary consumers are `sifa-web` (Tailwind config + font CSS)\n * and the planned `sifa-app` (React Native style objects).\n *\n * Decision (2026-05-14, reaffirmed 2026-05-16): TS constants only. No CSS\n * variable strings, no Style Dictionary output. Consumers translate to\n * their own format.\n */\n\nexport { colors, verificationColors, type Colors, type VerificationColors } from './colors.js';\nexport { fonts, fontFallbackStacks, type Fonts, type FontFallbackStacks } from './typography.js';\nexport { iconSet, iconWeights, type IconSet, type IconWeights } from './icons.js';\n"],"mappings":";AAYA,SAAS,QAAQ,0BAAgE;AACjF,SAAS,OAAO,0BAA+D;AAC/E,SAAS,SAAS,mBAAmD;","names":[]}
@@ -1,5 +1,5 @@
1
- import { z as PresentationLinkView, b as PdsProviderInfo, X as SkillSuggestion } from './index-LxGL5I-J.js';
2
- import { a as AccountVerification } from './verification-providers-BPdY3KyH.js';
1
+ import { z as PresentationLinkView, b as PdsProviderInfo, X as SkillSuggestion } from './index-BEAuoL6l.js';
2
+ import { a as AccountVerification } from './verification-providers-DeyGqaoC.js';
3
3
  import { z } from 'zod';
4
4
 
5
5
  /**
@@ -1,5 +1,5 @@
1
- import { z as PresentationLinkView, b as PdsProviderInfo, X as SkillSuggestion } from './index-C2n-GjH2.cjs';
2
- import { a as AccountVerification } from './verification-providers-BPdY3KyH.cjs';
1
+ import { z as PresentationLinkView, b as PdsProviderInfo, X as SkillSuggestion } from './index-DU0pYHch.cjs';
2
+ import { a as AccountVerification } from './verification-providers-DeyGqaoC.cjs';
3
3
  import { z } from 'zod';
4
4
 
5
5
  /**
@@ -1,12 +1,12 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { a0 as SifaApiConfig, a1 as ApiFetchOptions, a3 as WriteResult, o as ProfileView, a2 as CreateResult, a5 as FilterOptions, S as SearchFilters, a8 as SearchResponse, a9 as SkillSearchResult, ai as CompanySearchFilters, aj as CompanySearchResponse, u as RepoDeleteResult, x as RepoInventory } from './types-DkrZo5eF.cjs';
3
+ import { a0 as SifaApiConfig, a1 as ApiFetchOptions, a3 as WriteResult, o as ProfileView, a2 as CreateResult, a5 as FilterOptions, S as SearchFilters, a8 as SearchResponse, a9 as SkillSearchResult, ai as CompanySearchFilters, aj as CompanySearchResponse, u as RepoDeleteResult, x as RepoInventory } from './types-Dd7UMXIz.cjs';
4
4
  import * as _tanstack_react_query from '@tanstack/react-query';
5
5
  import { UseQueryOptions, UseMutationOptions, UseInfiniteQueryOptions, InfiniteData } from '@tanstack/react-query';
6
- import { c as Profile, d as ProfilePosition, W as SkillRef, p as ExternalAccount, X as SkillSuggestion, s as OrgFloorVerdict } from './index-C2n-GjH2.cjs';
7
- import { s as sifaQueryKeys, aI as RefreshPdsResult, b5 as UpdateProfileOverrideInput, b6 as UpdateProfileSelfInput, b7 as UploadAvatarResult, b8 as UploadPronunciationAudioResult, as as PrimarySection, a_ as SubCategoryBulkResult, ax as ProfileLocationInput, p as ExternalAccountInput, n as CreateExternalAccountResult, bc as VerifyExternalAccountResult, E as EndorsementInput, l as ConfirmationInput, m as ConfirmationSubjectInput, a2 as GivenConfirmation, ar as PendingConfirmationsPage, ad as InboxCounts, o as DismissUnlinkedPositionInput, b3 as UnlinkedPositionsResult, at as ProfileCompleteness, aQ as RpgClaimableResponse, aU as RpgStatusResponse, aH as RefreshOrcidPublicationsResult, B as BulkHideProfileItemInput, ac as HideProfileItemInput, a7 as HiddenActivityItem, ab as HideActivityItemInput, b1 as UnhideActivityItemInput, f as ActivityPreferences, aY as SiteActivityPresetResponse, b4 as UpdateActivityPreferencesInput, aZ as StatsResponse, i as AppRegistryEntry, a8 as HiddenApp, b as AccountSummary, q as FeaturedProfile, aX as SimilarProfile, P as FetchSuggestionsOptions, b0 as SuggestionsResponse, V as FollowUserResult, x as FetchFollowListOptions, S as FollowListPage, $ as FollowingResponse, z as FetchFollowingFeedOptions, Z as FollowingFeedResponse, _ as FollowingFeedVersion, y as FetchFollowProfilePageOptions, U as FollowProfilePageResponse, F as FeatureAllowlistResponse, h as AdminReviewQueues, t as FetchActivityFeedOptions, c as ActivityFeedResponse, g as ActivityTeaserResponse, a6 as HeatmapResponse, af as MyGithubPullRequestsResponse, A as AccountCheckResult, aG as ReactionStatus, aF as ReactionResult, aE as ReactionError, aP as RoadmapVotesResponse, j as CastRoadmapVoteResult, D as DeleteAccountResult, aK as ResetProfileResult, bd as WipePreview, aJ as RepoDeleteInput, ah as OrgClaimResult, an as OrgProfileUpdateResult, ai as OrgDomainChallengeResult, aj as OrgDomainVerifyResult, ak as OrgNotificationEmailAddResult, al as OrgNotificationEmailRemoveResult, b9 as UserSettings } from './user-settings-BDZ9i-Pk.cjs';
6
+ import { c as Profile, d as ProfilePosition, W as SkillRef, p as ExternalAccount, X as SkillSuggestion, s as OrgFloorVerdict } from './index-DU0pYHch.cjs';
7
+ import { s as sifaQueryKeys, aI as RefreshPdsResult, b5 as UpdateProfileOverrideInput, b6 as UpdateProfileSelfInput, b7 as UploadAvatarResult, b8 as UploadPronunciationAudioResult, as as PrimarySection, a_ as SubCategoryBulkResult, ax as ProfileLocationInput, p as ExternalAccountInput, n as CreateExternalAccountResult, bc as VerifyExternalAccountResult, E as EndorsementInput, l as ConfirmationInput, m as ConfirmationSubjectInput, a2 as GivenConfirmation, ar as PendingConfirmationsPage, ad as InboxCounts, o as DismissUnlinkedPositionInput, b3 as UnlinkedPositionsResult, at as ProfileCompleteness, aQ as RpgClaimableResponse, aU as RpgStatusResponse, aH as RefreshOrcidPublicationsResult, B as BulkHideProfileItemInput, ac as HideProfileItemInput, a7 as HiddenActivityItem, ab as HideActivityItemInput, b1 as UnhideActivityItemInput, f as ActivityPreferences, aY as SiteActivityPresetResponse, b4 as UpdateActivityPreferencesInput, aZ as StatsResponse, i as AppRegistryEntry, a8 as HiddenApp, b as AccountSummary, q as FeaturedProfile, aX as SimilarProfile, P as FetchSuggestionsOptions, b0 as SuggestionsResponse, V as FollowUserResult, x as FetchFollowListOptions, S as FollowListPage, $ as FollowingResponse, z as FetchFollowingFeedOptions, Z as FollowingFeedResponse, _ as FollowingFeedVersion, y as FetchFollowProfilePageOptions, U as FollowProfilePageResponse, F as FeatureAllowlistResponse, h as AdminReviewQueues, t as FetchActivityFeedOptions, c as ActivityFeedResponse, g as ActivityTeaserResponse, a6 as HeatmapResponse, af as MyGithubPullRequestsResponse, A as AccountCheckResult, aG as ReactionStatus, aF as ReactionResult, aE as ReactionError, aP as RoadmapVotesResponse, j as CastRoadmapVoteResult, D as DeleteAccountResult, aK as ResetProfileResult, bd as WipePreview, aJ as RepoDeleteInput, ah as OrgClaimResult, an as OrgProfileUpdateResult, ai as OrgDomainChallengeResult, aj as OrgDomainVerifyResult, ak as OrgNotificationEmailAddResult, al as OrgNotificationEmailRemoveResult, b9 as UserSettings } from './user-settings-ChPm0BFN.cjs';
8
8
  import { z } from 'zod';
9
- import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, n as EntitySelectResponse, l as EntitySelectRequest, r as FeatureFlag } from './follow-profile-D3zDoDll.cjs';
9
+ import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, n as EntitySelectResponse, l as EntitySelectRequest, r as FeatureFlag } from './follow-profile-CgLLLQtJ.cjs';
10
10
  import { O as OrgClaimRequestInput, a as OrgProfileUpdateRequestInput, b as OrgDomainChallengeRequestInput, c as OrgDomainVerifyRequestInput, d as OrgNotificationEmailRequestInput } from './org-settings-C73Sin5E.cjs';
11
11
 
12
12
  interface SifaProviderProps {
@@ -1,12 +1,12 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
- import { a0 as SifaApiConfig, a1 as ApiFetchOptions, a3 as WriteResult, o as ProfileView, a2 as CreateResult, a5 as FilterOptions, S as SearchFilters, a8 as SearchResponse, a9 as SkillSearchResult, ai as CompanySearchFilters, aj as CompanySearchResponse, u as RepoDeleteResult, x as RepoInventory } from './types-CICITVJa.js';
3
+ import { a0 as SifaApiConfig, a1 as ApiFetchOptions, a3 as WriteResult, o as ProfileView, a2 as CreateResult, a5 as FilterOptions, S as SearchFilters, a8 as SearchResponse, a9 as SkillSearchResult, ai as CompanySearchFilters, aj as CompanySearchResponse, u as RepoDeleteResult, x as RepoInventory } from './types-BqxbmLY6.js';
4
4
  import * as _tanstack_react_query from '@tanstack/react-query';
5
5
  import { UseQueryOptions, UseMutationOptions, UseInfiniteQueryOptions, InfiniteData } from '@tanstack/react-query';
6
- import { c as Profile, d as ProfilePosition, W as SkillRef, p as ExternalAccount, X as SkillSuggestion, s as OrgFloorVerdict } from './index-LxGL5I-J.js';
7
- import { s as sifaQueryKeys, aI as RefreshPdsResult, b5 as UpdateProfileOverrideInput, b6 as UpdateProfileSelfInput, b7 as UploadAvatarResult, b8 as UploadPronunciationAudioResult, as as PrimarySection, a_ as SubCategoryBulkResult, ax as ProfileLocationInput, p as ExternalAccountInput, n as CreateExternalAccountResult, bc as VerifyExternalAccountResult, E as EndorsementInput, l as ConfirmationInput, m as ConfirmationSubjectInput, a2 as GivenConfirmation, ar as PendingConfirmationsPage, ad as InboxCounts, o as DismissUnlinkedPositionInput, b3 as UnlinkedPositionsResult, at as ProfileCompleteness, aQ as RpgClaimableResponse, aU as RpgStatusResponse, aH as RefreshOrcidPublicationsResult, B as BulkHideProfileItemInput, ac as HideProfileItemInput, a7 as HiddenActivityItem, ab as HideActivityItemInput, b1 as UnhideActivityItemInput, f as ActivityPreferences, aY as SiteActivityPresetResponse, b4 as UpdateActivityPreferencesInput, aZ as StatsResponse, i as AppRegistryEntry, a8 as HiddenApp, b as AccountSummary, q as FeaturedProfile, aX as SimilarProfile, P as FetchSuggestionsOptions, b0 as SuggestionsResponse, V as FollowUserResult, x as FetchFollowListOptions, S as FollowListPage, $ as FollowingResponse, z as FetchFollowingFeedOptions, Z as FollowingFeedResponse, _ as FollowingFeedVersion, y as FetchFollowProfilePageOptions, U as FollowProfilePageResponse, F as FeatureAllowlistResponse, h as AdminReviewQueues, t as FetchActivityFeedOptions, c as ActivityFeedResponse, g as ActivityTeaserResponse, a6 as HeatmapResponse, af as MyGithubPullRequestsResponse, A as AccountCheckResult, aG as ReactionStatus, aF as ReactionResult, aE as ReactionError, aP as RoadmapVotesResponse, j as CastRoadmapVoteResult, D as DeleteAccountResult, aK as ResetProfileResult, bd as WipePreview, aJ as RepoDeleteInput, ah as OrgClaimResult, an as OrgProfileUpdateResult, ai as OrgDomainChallengeResult, aj as OrgDomainVerifyResult, ak as OrgNotificationEmailAddResult, al as OrgNotificationEmailRemoveResult, b9 as UserSettings } from './user-settings-DvqRXhdC.js';
6
+ import { c as Profile, d as ProfilePosition, W as SkillRef, p as ExternalAccount, X as SkillSuggestion, s as OrgFloorVerdict } from './index-BEAuoL6l.js';
7
+ import { s as sifaQueryKeys, aI as RefreshPdsResult, b5 as UpdateProfileOverrideInput, b6 as UpdateProfileSelfInput, b7 as UploadAvatarResult, b8 as UploadPronunciationAudioResult, as as PrimarySection, a_ as SubCategoryBulkResult, ax as ProfileLocationInput, p as ExternalAccountInput, n as CreateExternalAccountResult, bc as VerifyExternalAccountResult, E as EndorsementInput, l as ConfirmationInput, m as ConfirmationSubjectInput, a2 as GivenConfirmation, ar as PendingConfirmationsPage, ad as InboxCounts, o as DismissUnlinkedPositionInput, b3 as UnlinkedPositionsResult, at as ProfileCompleteness, aQ as RpgClaimableResponse, aU as RpgStatusResponse, aH as RefreshOrcidPublicationsResult, B as BulkHideProfileItemInput, ac as HideProfileItemInput, a7 as HiddenActivityItem, ab as HideActivityItemInput, b1 as UnhideActivityItemInput, f as ActivityPreferences, aY as SiteActivityPresetResponse, b4 as UpdateActivityPreferencesInput, aZ as StatsResponse, i as AppRegistryEntry, a8 as HiddenApp, b as AccountSummary, q as FeaturedProfile, aX as SimilarProfile, P as FetchSuggestionsOptions, b0 as SuggestionsResponse, V as FollowUserResult, x as FetchFollowListOptions, S as FollowListPage, $ as FollowingResponse, z as FetchFollowingFeedOptions, Z as FollowingFeedResponse, _ as FollowingFeedVersion, y as FetchFollowProfilePageOptions, U as FollowProfilePageResponse, F as FeatureAllowlistResponse, h as AdminReviewQueues, t as FetchActivityFeedOptions, c as ActivityFeedResponse, g as ActivityTeaserResponse, a6 as HeatmapResponse, af as MyGithubPullRequestsResponse, A as AccountCheckResult, aG as ReactionStatus, aF as ReactionResult, aE as ReactionError, aP as RoadmapVotesResponse, j as CastRoadmapVoteResult, D as DeleteAccountResult, aK as ResetProfileResult, bd as WipePreview, aJ as RepoDeleteInput, ah as OrgClaimResult, an as OrgProfileUpdateResult, ai as OrgDomainChallengeResult, aj as OrgDomainVerifyResult, ak as OrgNotificationEmailAddResult, al as OrgNotificationEmailRemoveResult, b9 as UserSettings } from './user-settings-D1zKOWa2.js';
8
8
  import { z } from 'zod';
9
- import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, n as EntitySelectResponse, l as EntitySelectRequest, r as FeatureFlag } from './follow-profile-CcMgQDsh.js';
9
+ import { i as EntitySearchResponse, E as EntitySearchResult, c as EntityMintDomainResponse, g as EntityResolveDomainResponse, n as EntitySelectResponse, l as EntitySelectRequest, r as FeatureFlag } from './follow-profile-CVcA2w1v.js';
10
10
  import { O as OrgClaimRequestInput, h as OrgProfileUpdateRequestInput, b as OrgDomainChallengeRequestInput, d as OrgDomainVerifyRequestInput, f as OrgNotificationEmailRequestInput } from './org-settings-BShvhyFp.js';
11
11
 
12
12
  interface SifaProviderProps {
@@ -1,7 +1,7 @@
1
- import { a3 as WriteResult, a0 as SifaApiConfig, a1 as ApiFetchOptions, a2 as CreateResult, K as SiteActivityPreset, b as ActivityLabel, u as RepoDeleteResult, x as RepoInventory } from './types-DkrZo5eF.cjs';
2
- import { p as ExternalAccount, y as PositionViewerConfirmation } from './index-C2n-GjH2.cjs';
3
- import { a as AccountVerification } from './verification-providers-BPdY3KyH.cjs';
4
- import { s as FollowProfileItem, p as FeatureAllowlistEntry, r as FeatureFlag } from './follow-profile-D3zDoDll.cjs';
1
+ import { a3 as WriteResult, a0 as SifaApiConfig, a1 as ApiFetchOptions, a2 as CreateResult, K as SiteActivityPreset, b as ActivityLabel, u as RepoDeleteResult, x as RepoInventory } from './types-Dd7UMXIz.cjs';
2
+ import { p as ExternalAccount, y as PositionViewerConfirmation } from './index-DU0pYHch.cjs';
3
+ import { a as AccountVerification } from './verification-providers-DeyGqaoC.cjs';
4
+ import { s as FollowProfileItem, p as FeatureAllowlistEntry, r as FeatureFlag } from './follow-profile-CgLLLQtJ.cjs';
5
5
  import { z } from 'zod';
6
6
  import { d as OrgNotificationEmailRequestInput, b as OrgDomainChallengeRequestInput, O as OrgClaimRequestInput, a as OrgProfileUpdateRequestInput, c as OrgDomainVerifyRequestInput } from './org-settings-C73Sin5E.cjs';
7
7
 
@@ -1,7 +1,7 @@
1
- import { a3 as WriteResult, a0 as SifaApiConfig, a1 as ApiFetchOptions, a2 as CreateResult, K as SiteActivityPreset, b as ActivityLabel, u as RepoDeleteResult, x as RepoInventory } from './types-CICITVJa.js';
2
- import { p as ExternalAccount, y as PositionViewerConfirmation } from './index-LxGL5I-J.js';
3
- import { a as AccountVerification } from './verification-providers-BPdY3KyH.js';
4
- import { s as FollowProfileItem, p as FeatureAllowlistEntry, r as FeatureFlag } from './follow-profile-CcMgQDsh.js';
1
+ import { a3 as WriteResult, a0 as SifaApiConfig, a1 as ApiFetchOptions, a2 as CreateResult, K as SiteActivityPreset, b as ActivityLabel, u as RepoDeleteResult, x as RepoInventory } from './types-BqxbmLY6.js';
2
+ import { p as ExternalAccount, y as PositionViewerConfirmation } from './index-BEAuoL6l.js';
3
+ import { a as AccountVerification } from './verification-providers-DeyGqaoC.js';
4
+ import { s as FollowProfileItem, p as FeatureAllowlistEntry, r as FeatureFlag } from './follow-profile-CVcA2w1v.js';
5
5
  import { z } from 'zod';
6
6
  import { f as OrgNotificationEmailRequestInput, b as OrgDomainChallengeRequestInput, O as OrgClaimRequestInput, h as OrgProfileUpdateRequestInput, d as OrgDomainVerifyRequestInput } from './org-settings-BShvhyFp.js';
7
7
 
@@ -96,9 +96,9 @@ declare const selfLabelsSchema: z.ZodObject<{
96
96
  * score or a gate. This registry only decides which issuers Sifa displays and
97
97
  * with what provenance.
98
98
  *
99
- * Data-only: badge colors and icons are consumer concerns (React DOM on web,
100
- * React Native on mobile), same split as {@link PLATFORM_LABELS}. Consumers map
101
- * a provider id to a token/color.
99
+ * Data-only: badge colors live in the `/tokens` entry point
100
+ * (`verificationColors`, keyed by provider id); icons and components are
101
+ * consumer concerns (React DOM on web, React Native on mobile).
102
102
  */
103
103
  type VerificationProviderId = 'bluesky' | 'mu';
104
104
  /** How Sifa learns about a provider's verifications. */
@@ -188,5 +188,25 @@ declare function buildVerifierListMembers(items: readonly VerifierListItem[]): M
188
188
  * unknown providers are ignored. Returns `null` when nothing is displayable.
189
189
  */
190
190
  declare function primaryVerification(verifications: readonly AccountVerification[]): AccountVerification | null;
191
+ /**
192
+ * Label for one verification: the verifier's own display name (`issuerName`,
193
+ * sent by the API for firehose providers such as mu, where each verifier is
194
+ * shown by name), otherwise the provider label. Long names are shortened with
195
+ * an ellipsis. A provider this SDK version does not know falls back to its raw
196
+ * id ({@link resolveVerificationBadges} already drops those).
197
+ */
198
+ declare function verificationLabel(v: Pick<AccountVerification, 'provider' | 'issuerName'>): string;
199
+ /**
200
+ * The verifications a badge should render, as a new array. Keeps the API's
201
+ * `verificationBadges` from providers this SDK knows; an empty array means
202
+ * "none", even with the legacy flag. When the array is absent, or holds only
203
+ * unknown providers, builds a Bluesky entry from the legacy `blueskyVerified`
204
+ * flag (payloads that predate `verificationBadges`).
205
+ */
206
+ declare function resolveVerificationBadges(input: {
207
+ verificationBadges?: readonly AccountVerification[] | null;
208
+ blueskyVerified?: boolean;
209
+ blueskyVerifiedAt?: string | null;
210
+ }): AccountVerification[];
191
211
 
192
- export { type AgentRef as A, VERIFICATION_PROVIDERS as V, type AccountVerification as a, type VerificationProvider as b, type VerificationProviderId as c, type VerificationSource as d, type VerifierListItem as e, agentRefSchema as f, atUriSchema as g, buildVerifierListMembers as h, cidSchema as i, datetimeSchema as j, didSchema as k, externalRecordRefSchema as l, getVerificationProvider as m, isKnownVerificationProvider as n, languageTagSchema as o, maxGraphemes as p, partialDateSchema as q, primaryVerification as r, resolveVerifierProvider as s, selfLabelsSchema as t, skillRefSchema as u, strongRefSchema as v, uriSchema as w };
212
+ export { type AgentRef as A, VERIFICATION_PROVIDERS as V, type AccountVerification as a, type VerificationProvider as b, type VerificationProviderId as c, type VerificationSource as d, type VerifierListItem as e, agentRefSchema as f, atUriSchema as g, buildVerifierListMembers as h, cidSchema as i, datetimeSchema as j, didSchema as k, externalRecordRefSchema as l, getVerificationProvider as m, isKnownVerificationProvider as n, languageTagSchema as o, maxGraphemes as p, partialDateSchema as q, primaryVerification as r, resolveVerificationBadges as s, resolveVerifierProvider as t, selfLabelsSchema as u, skillRefSchema as v, strongRefSchema as w, uriSchema as x, verificationLabel as y };
@@ -96,9 +96,9 @@ declare const selfLabelsSchema: z.ZodObject<{
96
96
  * score or a gate. This registry only decides which issuers Sifa displays and
97
97
  * with what provenance.
98
98
  *
99
- * Data-only: badge colors and icons are consumer concerns (React DOM on web,
100
- * React Native on mobile), same split as {@link PLATFORM_LABELS}. Consumers map
101
- * a provider id to a token/color.
99
+ * Data-only: badge colors live in the `/tokens` entry point
100
+ * (`verificationColors`, keyed by provider id); icons and components are
101
+ * consumer concerns (React DOM on web, React Native on mobile).
102
102
  */
103
103
  type VerificationProviderId = 'bluesky' | 'mu';
104
104
  /** How Sifa learns about a provider's verifications. */
@@ -188,5 +188,25 @@ declare function buildVerifierListMembers(items: readonly VerifierListItem[]): M
188
188
  * unknown providers are ignored. Returns `null` when nothing is displayable.
189
189
  */
190
190
  declare function primaryVerification(verifications: readonly AccountVerification[]): AccountVerification | null;
191
+ /**
192
+ * Label for one verification: the verifier's own display name (`issuerName`,
193
+ * sent by the API for firehose providers such as mu, where each verifier is
194
+ * shown by name), otherwise the provider label. Long names are shortened with
195
+ * an ellipsis. A provider this SDK version does not know falls back to its raw
196
+ * id ({@link resolveVerificationBadges} already drops those).
197
+ */
198
+ declare function verificationLabel(v: Pick<AccountVerification, 'provider' | 'issuerName'>): string;
199
+ /**
200
+ * The verifications a badge should render, as a new array. Keeps the API's
201
+ * `verificationBadges` from providers this SDK knows; an empty array means
202
+ * "none", even with the legacy flag. When the array is absent, or holds only
203
+ * unknown providers, builds a Bluesky entry from the legacy `blueskyVerified`
204
+ * flag (payloads that predate `verificationBadges`).
205
+ */
206
+ declare function resolveVerificationBadges(input: {
207
+ verificationBadges?: readonly AccountVerification[] | null;
208
+ blueskyVerified?: boolean;
209
+ blueskyVerifiedAt?: string | null;
210
+ }): AccountVerification[];
191
211
 
192
- export { type AgentRef as A, VERIFICATION_PROVIDERS as V, type AccountVerification as a, type VerificationProvider as b, type VerificationProviderId as c, type VerificationSource as d, type VerifierListItem as e, agentRefSchema as f, atUriSchema as g, buildVerifierListMembers as h, cidSchema as i, datetimeSchema as j, didSchema as k, externalRecordRefSchema as l, getVerificationProvider as m, isKnownVerificationProvider as n, languageTagSchema as o, maxGraphemes as p, partialDateSchema as q, primaryVerification as r, resolveVerifierProvider as s, selfLabelsSchema as t, skillRefSchema as u, strongRefSchema as v, uriSchema as w };
212
+ export { type AgentRef as A, VERIFICATION_PROVIDERS as V, type AccountVerification as a, type VerificationProvider as b, type VerificationProviderId as c, type VerificationSource as d, type VerifierListItem as e, agentRefSchema as f, atUriSchema as g, buildVerifierListMembers as h, cidSchema as i, datetimeSchema as j, didSchema as k, externalRecordRefSchema as l, getVerificationProvider as m, isKnownVerificationProvider as n, languageTagSchema as o, maxGraphemes as p, partialDateSchema as q, primaryVerification as r, resolveVerificationBadges as s, resolveVerifierProvider as t, selfLabelsSchema as u, skillRefSchema as v, strongRefSchema as w, uriSchema as x, verificationLabel as y };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@singi-labs/sifa-sdk",
3
- "version": "0.19.88",
3
+ "version": "0.19.90",
4
4
  "description": "Sifa SDK — public client library for the Sifa AppView on AT Protocol. Shared by sifa-web and sifa-app.",
5
5
  "license": "MIT",
6
6
  "type": "module",