@everfur/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.
- package/CHANGELOG.md +74 -0
- package/LICENSE +21 -0
- package/README.md +161 -0
- package/animations/package.json +8 -0
- package/chat/package.json +8 -0
- package/client/package.json +8 -0
- package/core/package.json +8 -0
- package/dist/CameraPort-Cv31Pz7g.d.cts +29 -0
- package/dist/CameraPort-Cv31Pz7g.d.ts +29 -0
- package/dist/ChatController-CKdBvPj2.d.ts +146 -0
- package/dist/ChatController-CpUMvvZf.d.cts +146 -0
- package/dist/EverfurResult-D92-uL82.d.cts +240 -0
- package/dist/EverfurResult-D92-uL82.d.ts +240 -0
- package/dist/FilePort-BabWrv7I.d.cts +22 -0
- package/dist/FilePort-BabWrv7I.d.ts +22 -0
- package/dist/PhotoController-BItt5M7u.d.cts +43 -0
- package/dist/PhotoController-D8zMTdcW.d.ts +43 -0
- package/dist/TelemetryPort-BDNr00hu.d.cts +12 -0
- package/dist/TelemetryPort-BDNr00hu.d.ts +12 -0
- package/dist/animations/index.cjs +1997 -0
- package/dist/animations/index.d.cts +517 -0
- package/dist/animations/index.d.ts +517 -0
- package/dist/animations/index.js +1972 -0
- package/dist/cacheEpoch-DknKn3S0.d.cts +36 -0
- package/dist/cacheEpoch-DknKn3S0.d.ts +36 -0
- package/dist/chat/index.cjs +1170 -0
- package/dist/chat/index.d.cts +59 -0
- package/dist/chat/index.d.ts +59 -0
- package/dist/chat/index.js +1167 -0
- package/dist/client/index.cjs +2317 -0
- package/dist/client/index.d.cts +65 -0
- package/dist/client/index.d.ts +65 -0
- package/dist/client/index.js +2217 -0
- package/dist/config-BSjBdxrZ.d.cts +501 -0
- package/dist/config-CiJ0PVBB.d.ts +501 -0
- package/dist/core/index.cjs +3175 -0
- package/dist/core/index.d.cts +70 -0
- package/dist/core/index.d.ts +70 -0
- package/dist/core/index.js +3163 -0
- package/dist/identity-Brl-lDd6.d.cts +91 -0
- package/dist/identity-DK9zORrG.d.ts +91 -0
- package/dist/ids-CJ1S6adf.d.cts +46 -0
- package/dist/ids-CJ1S6adf.d.ts +46 -0
- package/dist/index.cjs +4488 -0
- package/dist/index.d.cts +156 -0
- package/dist/index.d.ts +156 -0
- package/dist/index.js +4464 -0
- package/dist/petsRepository-BEGb97M9.d.cts +326 -0
- package/dist/petsRepository-Bu18r2kK.d.ts +326 -0
- package/dist/photo/index.cjs +2189 -0
- package/dist/photo/index.d.cts +43 -0
- package/dist/photo/index.d.ts +43 -0
- package/dist/photo/index.js +2186 -0
- package/dist/projection-CeIUsbSk.d.cts +8 -0
- package/dist/projection-CeIUsbSk.d.ts +8 -0
- package/dist/records/index.cjs +2840 -0
- package/dist/records/index.d.cts +224 -0
- package/dist/records/index.d.ts +224 -0
- package/dist/records/index.js +2834 -0
- package/dist/requestFunnel-DuUH-kAe.d.cts +28 -0
- package/dist/requestFunnel-dio5OmR9.d.ts +28 -0
- package/dist/resolve-Dq_4_agU.d.cts +86 -0
- package/dist/resolve-Dq_4_agU.d.ts +86 -0
- package/dist/runtime-BgQnA594.d.cts +349 -0
- package/dist/runtime-CBA-LvdM.d.ts +349 -0
- package/dist/server/index.cjs +533 -0
- package/dist/server/index.d.cts +48 -0
- package/dist/server/index.d.ts +48 -0
- package/dist/server/index.js +530 -0
- package/dist/testing/index.cjs +825 -0
- package/dist/testing/index.d.cts +113 -0
- package/dist/testing/index.d.ts +113 -0
- package/dist/testing/index.js +822 -0
- package/dist/testing/rn/index.cjs +449 -0
- package/dist/testing/rn/index.d.cts +49 -0
- package/dist/testing/rn/index.d.ts +49 -0
- package/dist/testing/rn/index.js +444 -0
- package/dist/video/index.cjs +1941 -0
- package/dist/video/index.d.cts +66 -0
- package/dist/video/index.d.ts +66 -0
- package/dist/video/index.js +1938 -0
- package/package.json +311 -0
- package/photo/package.json +8 -0
- package/records/package.json +8 -0
- package/server/device-blocked.cjs +15 -0
- package/server/package.json +9 -0
- package/testing/package.json +8 -0
- package/testing/rn/package.json +8 -0
- package/video/package.json +8 -0
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { f as EverfurError, E as EverfurResult } from './EverfurResult-D92-uL82.cjs';
|
|
2
|
+
import { R as RequestFunnel } from './requestFunnel-DuUH-kAe.cjs';
|
|
3
|
+
import { A as AuthContext } from './identity-Brl-lDd6.cjs';
|
|
4
|
+
import { E as EntitlementDecision } from './resolve-Dq_4_agU.cjs';
|
|
5
|
+
import { P as PetRef } from './ids-CJ1S6adf.cjs';
|
|
6
|
+
|
|
7
|
+
/** Recursively freeze a plain object/array tree in place and return it (typed as the input). */
|
|
8
|
+
declare function deepFreeze<T>(value: T): T;
|
|
9
|
+
/** Foreground text tokens; the semantic text ramp over surfaces. */
|
|
10
|
+
interface EverfurTextColorTokens {
|
|
11
|
+
readonly primary: string;
|
|
12
|
+
readonly secondary: string;
|
|
13
|
+
readonly muted: string;
|
|
14
|
+
readonly placeholder: string;
|
|
15
|
+
/** Text drawn on the brand fill (a compiled default; resolve recomputes onPrimary/onAccent via WCAG). */
|
|
16
|
+
readonly onBrand: string;
|
|
17
|
+
readonly metaCool: string;
|
|
18
|
+
}
|
|
19
|
+
/** The Everfur color system: brand + surfaces + text ramp + semantic palette + component washes. */
|
|
20
|
+
interface EverfurColorTokens {
|
|
21
|
+
readonly brand: string;
|
|
22
|
+
readonly brandSoft: string;
|
|
23
|
+
readonly brandSofter: string;
|
|
24
|
+
readonly brandBorder: string;
|
|
25
|
+
readonly borderHairlineGreen: string;
|
|
26
|
+
readonly surface: string;
|
|
27
|
+
readonly surfaceCream: string;
|
|
28
|
+
readonly surfaceSubtle: string;
|
|
29
|
+
readonly background: string;
|
|
30
|
+
readonly borderRingCream: string;
|
|
31
|
+
readonly text: EverfurTextColorTokens;
|
|
32
|
+
/** The primary CTA fill (server-overridable via primary_color). Foreground is `onPrimary`. */
|
|
33
|
+
readonly primary: string;
|
|
34
|
+
/** WCAG-legible foreground for `primary` (computed by resolveTheme, never passed through). */
|
|
35
|
+
readonly onPrimary: string;
|
|
36
|
+
/** The user/CTA accent fill (server-overridable via accent_color). Foreground is `onAccent`. */
|
|
37
|
+
readonly accent: string;
|
|
38
|
+
/** WCAG-legible foreground for `accent` (computed by resolveTheme). */
|
|
39
|
+
readonly onAccent: string;
|
|
40
|
+
/** The 0.5px bubble edge (a lightened brand / success green for the default). */
|
|
41
|
+
readonly accentEdge: string;
|
|
42
|
+
readonly success: string;
|
|
43
|
+
readonly danger: string;
|
|
44
|
+
readonly errorRed: string;
|
|
45
|
+
readonly warningStrong: string;
|
|
46
|
+
readonly cautionAccent: string;
|
|
47
|
+
readonly riskConcern: string;
|
|
48
|
+
readonly badgeBgPositive: string;
|
|
49
|
+
readonly badgeBgCaution: string;
|
|
50
|
+
readonly badgeBgCritical: string;
|
|
51
|
+
readonly badgeBgNeutral: string;
|
|
52
|
+
/** user bubble = accent fill; assistant bubble = bare surface (the mobile/Flutter asymmetry). */
|
|
53
|
+
readonly bubbleUser: string;
|
|
54
|
+
readonly bubbleAssistant: string;
|
|
55
|
+
readonly skeleton: string;
|
|
56
|
+
readonly scanButtonPink: string;
|
|
57
|
+
readonly checkupCardLowRiskBg: string;
|
|
58
|
+
readonly checkupCardConcernBg: string;
|
|
59
|
+
}
|
|
60
|
+
/** Spacing scale (dp). */
|
|
61
|
+
interface EverfurSpaceTokens {
|
|
62
|
+
readonly xs: number;
|
|
63
|
+
readonly sm: number;
|
|
64
|
+
readonly md: number;
|
|
65
|
+
readonly lg: number;
|
|
66
|
+
readonly xl: number;
|
|
67
|
+
readonly xxl: number;
|
|
68
|
+
}
|
|
69
|
+
/** Corner-radius scale (dp); `pill` is an effectively-infinite radius. */
|
|
70
|
+
interface EverfurRadiusTokens {
|
|
71
|
+
readonly tile: number;
|
|
72
|
+
readonly xs: number;
|
|
73
|
+
readonly sm: number;
|
|
74
|
+
readonly md: number;
|
|
75
|
+
readonly lg: number;
|
|
76
|
+
readonly xl: number;
|
|
77
|
+
readonly pill: number;
|
|
78
|
+
}
|
|
79
|
+
interface EverfurTypeSizeTokens {
|
|
80
|
+
readonly nano: number;
|
|
81
|
+
readonly small: number;
|
|
82
|
+
readonly micro: number;
|
|
83
|
+
readonly tiny: number;
|
|
84
|
+
readonly caption: number;
|
|
85
|
+
readonly bodyTight: number;
|
|
86
|
+
readonly body: number;
|
|
87
|
+
readonly subtitle: number;
|
|
88
|
+
readonly heading: number;
|
|
89
|
+
readonly verdict: number;
|
|
90
|
+
}
|
|
91
|
+
/** Line-height multipliers (applied to a size to derive an absolute lineHeight). */
|
|
92
|
+
interface EverfurLineHeightTokens {
|
|
93
|
+
readonly tight: number;
|
|
94
|
+
readonly snug: number;
|
|
95
|
+
readonly normal: number;
|
|
96
|
+
readonly relaxed: number;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* RN-assignable font-weight literals. Typed as the exact string literals we ship (not bare `string`) so a
|
|
100
|
+
* consumer can spread a weight token straight into a `Text` style: React Native's `TextStyle['fontWeight']`
|
|
101
|
+
* accepts these, but rejects `string`. Kept framework-free (no react-native import) to hold the client layer's
|
|
102
|
+
* no-framework boundary - these three literals are a subset of RN's fontWeight union.
|
|
103
|
+
*/
|
|
104
|
+
type EverfurFontWeight = '400' | '500' | '700';
|
|
105
|
+
/** RN fontWeight tokens. */
|
|
106
|
+
interface EverfurWeightTokens {
|
|
107
|
+
readonly regular: EverfurFontWeight;
|
|
108
|
+
readonly medium: EverfurFontWeight;
|
|
109
|
+
readonly bold: EverfurFontWeight;
|
|
110
|
+
}
|
|
111
|
+
interface EverfurLetterSpacingTokens {
|
|
112
|
+
readonly eyebrow: number;
|
|
113
|
+
readonly monoWide: number;
|
|
114
|
+
readonly headerBrand: number;
|
|
115
|
+
readonly tight: number;
|
|
116
|
+
}
|
|
117
|
+
/** Typography tokens. `family`/`mono` default to the platform font; server font_family/font_url may override. */
|
|
118
|
+
interface EverfurTypeTokens {
|
|
119
|
+
readonly family: string;
|
|
120
|
+
readonly mono: string;
|
|
121
|
+
/** Optional remote font (server font_url); null unless a server override supplies an https URL. */
|
|
122
|
+
readonly fontUrl: string | null;
|
|
123
|
+
readonly size: EverfurTypeSizeTokens;
|
|
124
|
+
readonly lineHeight: EverfurLineHeightTokens;
|
|
125
|
+
readonly weight: EverfurWeightTokens;
|
|
126
|
+
readonly letterSpacing: EverfurLetterSpacingTokens;
|
|
127
|
+
}
|
|
128
|
+
interface EverfurSpringToken {
|
|
129
|
+
readonly damping: number;
|
|
130
|
+
readonly stiffness: number;
|
|
131
|
+
}
|
|
132
|
+
interface EverfurMotionDurationTokens {
|
|
133
|
+
readonly instant: number;
|
|
134
|
+
readonly fast: number;
|
|
135
|
+
readonly normal: number;
|
|
136
|
+
readonly slow: number;
|
|
137
|
+
}
|
|
138
|
+
/** Motion tokens. Under reduced-motion, resolveTheme collapses durations to 0 and stiffens the spring. */
|
|
139
|
+
interface EverfurMotionTokens {
|
|
140
|
+
readonly duration: EverfurMotionDurationTokens;
|
|
141
|
+
readonly spring: {
|
|
142
|
+
readonly gentle: EverfurSpringToken;
|
|
143
|
+
};
|
|
144
|
+
readonly easing: {
|
|
145
|
+
readonly standard: string;
|
|
146
|
+
};
|
|
147
|
+
/** true when the resolved theme has collapsed motion (AccessibilityInfo reduced-motion). */
|
|
148
|
+
readonly reducedMotion: boolean;
|
|
149
|
+
}
|
|
150
|
+
/** Non-visual identity + partner copy carried on the theme (server display_name/logo_url/placeholder overlay). */
|
|
151
|
+
interface EverfurThemeMeta {
|
|
152
|
+
readonly displayName: string;
|
|
153
|
+
readonly logoUrl: string | null;
|
|
154
|
+
/** Server-overridable composer placeholder (chat_placeholder/placeholder); null keeps Everfur's neutral default. */
|
|
155
|
+
readonly placeholder: string | null;
|
|
156
|
+
/** White-label switch (hide_powered_by): drop the "powered by everfur" attribution. Default false (shown). */
|
|
157
|
+
readonly hidePoweredBy: boolean;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The frozen, never-null theme the rn layer renders. Read a token as `theme.color.brand`,
|
|
161
|
+
* `theme.space.md`, `theme.type.size.body`, `theme.radius.lg`, `theme.motion.duration.fast`.
|
|
162
|
+
*/
|
|
163
|
+
interface EverfurTheme {
|
|
164
|
+
readonly brightness: 'light' | 'dark';
|
|
165
|
+
readonly meta: EverfurThemeMeta;
|
|
166
|
+
readonly color: EverfurColorTokens;
|
|
167
|
+
readonly space: EverfurSpaceTokens;
|
|
168
|
+
readonly radius: EverfurRadiusTokens;
|
|
169
|
+
readonly type: EverfurTypeTokens;
|
|
170
|
+
readonly motion: EverfurMotionTokens;
|
|
171
|
+
}
|
|
172
|
+
/** The compiled LIGHT default (deeply frozen). */
|
|
173
|
+
declare const EVERFUR_LIGHT: EverfurTheme;
|
|
174
|
+
/** The compiled DARK default (deeply frozen). */
|
|
175
|
+
declare const EVERFUR_DARK: EverfurTheme;
|
|
176
|
+
|
|
177
|
+
interface ClientBranding {
|
|
178
|
+
readonly displayName: string | null;
|
|
179
|
+
/** normalized (https-hardened downstream) logo URL */
|
|
180
|
+
readonly logoUrl: string | null;
|
|
181
|
+
/** normalized color string (#RRGGBB or rgba(...)) or null */
|
|
182
|
+
readonly primaryColor: string | null;
|
|
183
|
+
readonly accentColor: string | null;
|
|
184
|
+
readonly brightness: 'light' | 'dark' | null;
|
|
185
|
+
readonly fontFamily: string | null;
|
|
186
|
+
readonly fontUrl: string | null;
|
|
187
|
+
/** composer placeholder override (chat_placeholder/placeholder); null keeps the base. */
|
|
188
|
+
readonly placeholder: string | null;
|
|
189
|
+
/** white-label switch (hide_powered_by): hide the powered-by attribution. null = unset (keep the base). */
|
|
190
|
+
readonly hidePoweredBy: boolean | null;
|
|
191
|
+
}
|
|
192
|
+
/** true when every field is null (no config) - treated by callers as "absent". */
|
|
193
|
+
declare function isEmptyBranding(b: ClientBranding): boolean;
|
|
194
|
+
/**
|
|
195
|
+
* Parse an untrusted branding blob (from the entitlements render_hints, or the client `theme` prop) into a
|
|
196
|
+
* normalized `ClientBranding`. Accepts BOTH snake_case and camelCase keys. Returns null when the input is not
|
|
197
|
+
* an object OR when the result is empty (all fields null) - callers read null as "no config" (fail-closed to
|
|
198
|
+
* the compiled default). Never throws.
|
|
199
|
+
*/
|
|
200
|
+
declare function parseClientBranding(json: unknown): ClientBranding | null;
|
|
201
|
+
/**
|
|
202
|
+
* Parse a permissive color into a normalized string (`#RRGGBB` when opaque, else `rgba(r,g,b,a)`), or null.
|
|
203
|
+
* Accepts `#RGB`, `#RRGGBB`, `#AARRGGBB`, `0xAARRGGBB` (string), a 32-bit ARGB `int`, and `rgb()/rgba()`.
|
|
204
|
+
* An empty string, whitespace, or an unrecognized value yields null.
|
|
205
|
+
*/
|
|
206
|
+
declare function parseColor(value: unknown): string | null;
|
|
207
|
+
/**
|
|
208
|
+
* Return the more legible of near-black / white for `background` (WCAG 2.x contrast). Ported from Flutter
|
|
209
|
+
* `_readableOn`. Falls back to white for an unparseable background (never throws).
|
|
210
|
+
*/
|
|
211
|
+
declare function readableOn(background: string): string;
|
|
212
|
+
/**
|
|
213
|
+
* Return the URL only if it is an https URL with no embedded whitespace, else null (security invariant:
|
|
214
|
+
* https-only; rejects http:, javascript:, data:, etc.). Uses a protocol-locked regex rather than the URL
|
|
215
|
+
* constructor so it is portable + total on React Native (whose URL global is incomplete) and never throws.
|
|
216
|
+
*/
|
|
217
|
+
declare function hardenHttpsUrl(url: string | null): string | null;
|
|
218
|
+
/**
|
|
219
|
+
* Overlay `b` onto `base`, field by field: a non-null branding field WINS; a null field KEEPS the base. A
|
|
220
|
+
* valid brightness re-selects the matching compiled palette (light/dark); an invalid/absent brightness leaves
|
|
221
|
+
* the base palette untouched. Returns a NEW deeply-frozen theme; `base` and `b` are never mutated.
|
|
222
|
+
*
|
|
223
|
+
* NOTE: foreground legibility (onPrimary/onAccent) and URL hardening are applied by `resolveTheme`, the total
|
|
224
|
+
* entry point. Call this directly only when you will finalize the result yourself.
|
|
225
|
+
*/
|
|
226
|
+
declare function withServerBranding(base: EverfurTheme, b: ClientBranding | null): EverfurTheme;
|
|
227
|
+
/**
|
|
228
|
+
* Inputs to the total theme resolve. All optional; `resolveTheme(undefined)` yields the compiled Everfur
|
|
229
|
+
* default. Merge order (server wins): compiled default <- clientOverride (first-paint/offline fallback) <-
|
|
230
|
+
* branding (server render_hints).
|
|
231
|
+
*/
|
|
232
|
+
interface ResolveThemeInput {
|
|
233
|
+
/** Server-driven branding from the live entitlements render_hints (authoritative overlay). */
|
|
234
|
+
readonly branding?: ClientBranding | null;
|
|
235
|
+
/** The clamped client `theme` prop - a first-paint/offline fallback merged UNDER the server. */
|
|
236
|
+
readonly clientOverride?: ClientBranding | null;
|
|
237
|
+
/** The device color scheme (useColorScheme); selects the base palette when branding sets no brightness. */
|
|
238
|
+
readonly colorScheme?: 'light' | 'dark' | null;
|
|
239
|
+
/** AccessibilityInfo reduced-motion: collapses the motion tokens. */
|
|
240
|
+
readonly reducedMotion?: boolean;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Resolve the final, legible, deeply-frozen theme. Never throws, never returns null/transparent. Applies the
|
|
244
|
+
* client fallback UNDER the server overlay, recomputes onPrimary/onAccent via WCAG, hardens logo/font URLs to
|
|
245
|
+
* https-only, guarantees a non-empty displayName, and collapses motion under reduced-motion.
|
|
246
|
+
*/
|
|
247
|
+
declare function resolveTheme(input?: ResolveThemeInput): EverfurTheme;
|
|
248
|
+
|
|
249
|
+
/** The conditional-GET endpoint (SPEC-00 §5.3). Relative; the transport prefixes the resolved base URL. */
|
|
250
|
+
declare const ENTITLEMENTS_PATH = "/widget/v1/entitlements";
|
|
251
|
+
/**
|
|
252
|
+
* The settled outcome of one entitlement fetch. `updated` carries a fresh verdict + the cadence to re-poll on;
|
|
253
|
+
* `notModified` means the cached verdict still holds; `failed` carries a normalized error and means keep-last.
|
|
254
|
+
*/
|
|
255
|
+
type EntitlementResolution = {
|
|
256
|
+
readonly kind: 'updated';
|
|
257
|
+
readonly revision: number;
|
|
258
|
+
readonly region: string;
|
|
259
|
+
readonly ttlSeconds: number;
|
|
260
|
+
readonly decisions: readonly EntitlementDecision[];
|
|
261
|
+
/**
|
|
262
|
+
* Server-driven branding parsed from the SAME 200 body's render_hints (orthogonal to capabilities).
|
|
263
|
+
* null when absent or unparseable (fail-closed -> the compiled Everfur default theme). OPTIONAL so a
|
|
264
|
+
* hand-built resolution (tests / injected resolve) need not supply it.
|
|
265
|
+
*/
|
|
266
|
+
readonly branding?: ClientBranding | null;
|
|
267
|
+
} | {
|
|
268
|
+
readonly kind: 'notModified';
|
|
269
|
+
} | {
|
|
270
|
+
readonly kind: 'failed';
|
|
271
|
+
readonly error: EverfurError;
|
|
272
|
+
};
|
|
273
|
+
interface FetchEntitlementsArgs {
|
|
274
|
+
/** The revision we last stored; echoed as If-None-Match so an unchanged verdict returns 304. */
|
|
275
|
+
readonly cachedRevision?: number | null;
|
|
276
|
+
/** Optional region hint; forwarded as ?region. */
|
|
277
|
+
readonly region?: string;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Fetch the server-resolved entitlement verdict once. Never throws: a 304, a domain error, a network reject,
|
|
281
|
+
* and a malformed body all SETTLE to an EntitlementResolution. Fail-closed on every non-`updated` path.
|
|
282
|
+
*/
|
|
283
|
+
declare function fetchEntitlements(auth: AuthContext, args?: FetchEntitlementsArgs, funnel?: RequestFunnel): Promise<EntitlementResolution>;
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Server-declared bounds on `WidgetPetInput`, mirrored so a violation is refused before the wire rather
|
|
287
|
+
* than returning a 422 after the caller has already driven a registration flow. Every field is optional
|
|
288
|
+
* server-side: `POST` with an empty body registers a bare pet, which is all consent needs.
|
|
289
|
+
*/
|
|
290
|
+
declare const PET_NAME_MAX = 100;
|
|
291
|
+
declare const PET_SPECIES_MAX = 50;
|
|
292
|
+
declare const PET_BREED_MAX = 100;
|
|
293
|
+
declare const PET_AGE_YEARS_MAX = 50;
|
|
294
|
+
declare const PET_WEIGHT_KG_MAX = 500;
|
|
295
|
+
/** The optional profile fields. Omit all of them to register the pet without describing it. */
|
|
296
|
+
interface PetProfileInput {
|
|
297
|
+
readonly name?: string;
|
|
298
|
+
readonly species?: string;
|
|
299
|
+
readonly breed?: string;
|
|
300
|
+
readonly ageYears?: number;
|
|
301
|
+
readonly weightKg?: number;
|
|
302
|
+
}
|
|
303
|
+
/** The registered profile, as the server echoes it back. */
|
|
304
|
+
interface RegisteredPet {
|
|
305
|
+
readonly petRef: string;
|
|
306
|
+
readonly name: string | null;
|
|
307
|
+
readonly species: string | null;
|
|
308
|
+
readonly breed: string | null;
|
|
309
|
+
readonly ageYears: number | null;
|
|
310
|
+
readonly weightKg: number | null;
|
|
311
|
+
}
|
|
312
|
+
interface PetsRepository {
|
|
313
|
+
/**
|
|
314
|
+
* `POST /widget/v1/pets/{pet_ref}` - create or update the widget pet profile. Idempotent by construction:
|
|
315
|
+
* the route is an upsert, so calling it for an already-registered pet updates rather than duplicates.
|
|
316
|
+
*
|
|
317
|
+
* Settles: `ok(RegisteredPet)` on 201, `err(EverfurError)` otherwise. Never throws.
|
|
318
|
+
*/
|
|
319
|
+
registerPet(petRef: PetRef, profile?: PetProfileInput, opts?: {
|
|
320
|
+
signal?: AbortSignal;
|
|
321
|
+
}): Promise<EverfurResult<RegisteredPet>>;
|
|
322
|
+
}
|
|
323
|
+
/** Build the repository over a device AuthContext (personalized bearer XOR anonymous pk). */
|
|
324
|
+
declare function createPetsRepository(auth: AuthContext): PetsRepository;
|
|
325
|
+
|
|
326
|
+
export { deepFreeze as A, fetchEntitlements as B, type ClientBranding as C, hardenHttpsUrl as D, ENTITLEMENTS_PATH as E, type FetchEntitlementsArgs as F, isEmptyBranding as G, parseClientBranding as H, parseColor as I, readableOn as J, resolveTheme as K, withServerBranding as L, PET_AGE_YEARS_MAX as P, type RegisteredPet as R, EVERFUR_DARK as a, EVERFUR_LIGHT as b, type EntitlementResolution as c, type EverfurColorTokens as d, type EverfurFontWeight as e, type EverfurLetterSpacingTokens as f, type EverfurLineHeightTokens as g, type EverfurMotionDurationTokens as h, type EverfurMotionTokens as i, type EverfurRadiusTokens as j, type EverfurSpaceTokens as k, type EverfurSpringToken as l, type EverfurTextColorTokens as m, type EverfurTheme as n, type EverfurThemeMeta as o, type EverfurTypeSizeTokens as p, type EverfurTypeTokens as q, type EverfurWeightTokens as r, PET_BREED_MAX as s, PET_NAME_MAX as t, PET_SPECIES_MAX as u, PET_WEIGHT_KG_MAX as v, type PetProfileInput as w, type PetsRepository as x, type ResolveThemeInput as y, createPetsRepository as z };
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { f as EverfurError, E as EverfurResult } from './EverfurResult-D92-uL82.js';
|
|
2
|
+
import { R as RequestFunnel } from './requestFunnel-dio5OmR9.js';
|
|
3
|
+
import { A as AuthContext } from './identity-DK9zORrG.js';
|
|
4
|
+
import { E as EntitlementDecision } from './resolve-Dq_4_agU.js';
|
|
5
|
+
import { P as PetRef } from './ids-CJ1S6adf.js';
|
|
6
|
+
|
|
7
|
+
/** Recursively freeze a plain object/array tree in place and return it (typed as the input). */
|
|
8
|
+
declare function deepFreeze<T>(value: T): T;
|
|
9
|
+
/** Foreground text tokens; the semantic text ramp over surfaces. */
|
|
10
|
+
interface EverfurTextColorTokens {
|
|
11
|
+
readonly primary: string;
|
|
12
|
+
readonly secondary: string;
|
|
13
|
+
readonly muted: string;
|
|
14
|
+
readonly placeholder: string;
|
|
15
|
+
/** Text drawn on the brand fill (a compiled default; resolve recomputes onPrimary/onAccent via WCAG). */
|
|
16
|
+
readonly onBrand: string;
|
|
17
|
+
readonly metaCool: string;
|
|
18
|
+
}
|
|
19
|
+
/** The Everfur color system: brand + surfaces + text ramp + semantic palette + component washes. */
|
|
20
|
+
interface EverfurColorTokens {
|
|
21
|
+
readonly brand: string;
|
|
22
|
+
readonly brandSoft: string;
|
|
23
|
+
readonly brandSofter: string;
|
|
24
|
+
readonly brandBorder: string;
|
|
25
|
+
readonly borderHairlineGreen: string;
|
|
26
|
+
readonly surface: string;
|
|
27
|
+
readonly surfaceCream: string;
|
|
28
|
+
readonly surfaceSubtle: string;
|
|
29
|
+
readonly background: string;
|
|
30
|
+
readonly borderRingCream: string;
|
|
31
|
+
readonly text: EverfurTextColorTokens;
|
|
32
|
+
/** The primary CTA fill (server-overridable via primary_color). Foreground is `onPrimary`. */
|
|
33
|
+
readonly primary: string;
|
|
34
|
+
/** WCAG-legible foreground for `primary` (computed by resolveTheme, never passed through). */
|
|
35
|
+
readonly onPrimary: string;
|
|
36
|
+
/** The user/CTA accent fill (server-overridable via accent_color). Foreground is `onAccent`. */
|
|
37
|
+
readonly accent: string;
|
|
38
|
+
/** WCAG-legible foreground for `accent` (computed by resolveTheme). */
|
|
39
|
+
readonly onAccent: string;
|
|
40
|
+
/** The 0.5px bubble edge (a lightened brand / success green for the default). */
|
|
41
|
+
readonly accentEdge: string;
|
|
42
|
+
readonly success: string;
|
|
43
|
+
readonly danger: string;
|
|
44
|
+
readonly errorRed: string;
|
|
45
|
+
readonly warningStrong: string;
|
|
46
|
+
readonly cautionAccent: string;
|
|
47
|
+
readonly riskConcern: string;
|
|
48
|
+
readonly badgeBgPositive: string;
|
|
49
|
+
readonly badgeBgCaution: string;
|
|
50
|
+
readonly badgeBgCritical: string;
|
|
51
|
+
readonly badgeBgNeutral: string;
|
|
52
|
+
/** user bubble = accent fill; assistant bubble = bare surface (the mobile/Flutter asymmetry). */
|
|
53
|
+
readonly bubbleUser: string;
|
|
54
|
+
readonly bubbleAssistant: string;
|
|
55
|
+
readonly skeleton: string;
|
|
56
|
+
readonly scanButtonPink: string;
|
|
57
|
+
readonly checkupCardLowRiskBg: string;
|
|
58
|
+
readonly checkupCardConcernBg: string;
|
|
59
|
+
}
|
|
60
|
+
/** Spacing scale (dp). */
|
|
61
|
+
interface EverfurSpaceTokens {
|
|
62
|
+
readonly xs: number;
|
|
63
|
+
readonly sm: number;
|
|
64
|
+
readonly md: number;
|
|
65
|
+
readonly lg: number;
|
|
66
|
+
readonly xl: number;
|
|
67
|
+
readonly xxl: number;
|
|
68
|
+
}
|
|
69
|
+
/** Corner-radius scale (dp); `pill` is an effectively-infinite radius. */
|
|
70
|
+
interface EverfurRadiusTokens {
|
|
71
|
+
readonly tile: number;
|
|
72
|
+
readonly xs: number;
|
|
73
|
+
readonly sm: number;
|
|
74
|
+
readonly md: number;
|
|
75
|
+
readonly lg: number;
|
|
76
|
+
readonly xl: number;
|
|
77
|
+
readonly pill: number;
|
|
78
|
+
}
|
|
79
|
+
interface EverfurTypeSizeTokens {
|
|
80
|
+
readonly nano: number;
|
|
81
|
+
readonly small: number;
|
|
82
|
+
readonly micro: number;
|
|
83
|
+
readonly tiny: number;
|
|
84
|
+
readonly caption: number;
|
|
85
|
+
readonly bodyTight: number;
|
|
86
|
+
readonly body: number;
|
|
87
|
+
readonly subtitle: number;
|
|
88
|
+
readonly heading: number;
|
|
89
|
+
readonly verdict: number;
|
|
90
|
+
}
|
|
91
|
+
/** Line-height multipliers (applied to a size to derive an absolute lineHeight). */
|
|
92
|
+
interface EverfurLineHeightTokens {
|
|
93
|
+
readonly tight: number;
|
|
94
|
+
readonly snug: number;
|
|
95
|
+
readonly normal: number;
|
|
96
|
+
readonly relaxed: number;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* RN-assignable font-weight literals. Typed as the exact string literals we ship (not bare `string`) so a
|
|
100
|
+
* consumer can spread a weight token straight into a `Text` style: React Native's `TextStyle['fontWeight']`
|
|
101
|
+
* accepts these, but rejects `string`. Kept framework-free (no react-native import) to hold the client layer's
|
|
102
|
+
* no-framework boundary - these three literals are a subset of RN's fontWeight union.
|
|
103
|
+
*/
|
|
104
|
+
type EverfurFontWeight = '400' | '500' | '700';
|
|
105
|
+
/** RN fontWeight tokens. */
|
|
106
|
+
interface EverfurWeightTokens {
|
|
107
|
+
readonly regular: EverfurFontWeight;
|
|
108
|
+
readonly medium: EverfurFontWeight;
|
|
109
|
+
readonly bold: EverfurFontWeight;
|
|
110
|
+
}
|
|
111
|
+
interface EverfurLetterSpacingTokens {
|
|
112
|
+
readonly eyebrow: number;
|
|
113
|
+
readonly monoWide: number;
|
|
114
|
+
readonly headerBrand: number;
|
|
115
|
+
readonly tight: number;
|
|
116
|
+
}
|
|
117
|
+
/** Typography tokens. `family`/`mono` default to the platform font; server font_family/font_url may override. */
|
|
118
|
+
interface EverfurTypeTokens {
|
|
119
|
+
readonly family: string;
|
|
120
|
+
readonly mono: string;
|
|
121
|
+
/** Optional remote font (server font_url); null unless a server override supplies an https URL. */
|
|
122
|
+
readonly fontUrl: string | null;
|
|
123
|
+
readonly size: EverfurTypeSizeTokens;
|
|
124
|
+
readonly lineHeight: EverfurLineHeightTokens;
|
|
125
|
+
readonly weight: EverfurWeightTokens;
|
|
126
|
+
readonly letterSpacing: EverfurLetterSpacingTokens;
|
|
127
|
+
}
|
|
128
|
+
interface EverfurSpringToken {
|
|
129
|
+
readonly damping: number;
|
|
130
|
+
readonly stiffness: number;
|
|
131
|
+
}
|
|
132
|
+
interface EverfurMotionDurationTokens {
|
|
133
|
+
readonly instant: number;
|
|
134
|
+
readonly fast: number;
|
|
135
|
+
readonly normal: number;
|
|
136
|
+
readonly slow: number;
|
|
137
|
+
}
|
|
138
|
+
/** Motion tokens. Under reduced-motion, resolveTheme collapses durations to 0 and stiffens the spring. */
|
|
139
|
+
interface EverfurMotionTokens {
|
|
140
|
+
readonly duration: EverfurMotionDurationTokens;
|
|
141
|
+
readonly spring: {
|
|
142
|
+
readonly gentle: EverfurSpringToken;
|
|
143
|
+
};
|
|
144
|
+
readonly easing: {
|
|
145
|
+
readonly standard: string;
|
|
146
|
+
};
|
|
147
|
+
/** true when the resolved theme has collapsed motion (AccessibilityInfo reduced-motion). */
|
|
148
|
+
readonly reducedMotion: boolean;
|
|
149
|
+
}
|
|
150
|
+
/** Non-visual identity + partner copy carried on the theme (server display_name/logo_url/placeholder overlay). */
|
|
151
|
+
interface EverfurThemeMeta {
|
|
152
|
+
readonly displayName: string;
|
|
153
|
+
readonly logoUrl: string | null;
|
|
154
|
+
/** Server-overridable composer placeholder (chat_placeholder/placeholder); null keeps Everfur's neutral default. */
|
|
155
|
+
readonly placeholder: string | null;
|
|
156
|
+
/** White-label switch (hide_powered_by): drop the "powered by everfur" attribution. Default false (shown). */
|
|
157
|
+
readonly hidePoweredBy: boolean;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The frozen, never-null theme the rn layer renders. Read a token as `theme.color.brand`,
|
|
161
|
+
* `theme.space.md`, `theme.type.size.body`, `theme.radius.lg`, `theme.motion.duration.fast`.
|
|
162
|
+
*/
|
|
163
|
+
interface EverfurTheme {
|
|
164
|
+
readonly brightness: 'light' | 'dark';
|
|
165
|
+
readonly meta: EverfurThemeMeta;
|
|
166
|
+
readonly color: EverfurColorTokens;
|
|
167
|
+
readonly space: EverfurSpaceTokens;
|
|
168
|
+
readonly radius: EverfurRadiusTokens;
|
|
169
|
+
readonly type: EverfurTypeTokens;
|
|
170
|
+
readonly motion: EverfurMotionTokens;
|
|
171
|
+
}
|
|
172
|
+
/** The compiled LIGHT default (deeply frozen). */
|
|
173
|
+
declare const EVERFUR_LIGHT: EverfurTheme;
|
|
174
|
+
/** The compiled DARK default (deeply frozen). */
|
|
175
|
+
declare const EVERFUR_DARK: EverfurTheme;
|
|
176
|
+
|
|
177
|
+
interface ClientBranding {
|
|
178
|
+
readonly displayName: string | null;
|
|
179
|
+
/** normalized (https-hardened downstream) logo URL */
|
|
180
|
+
readonly logoUrl: string | null;
|
|
181
|
+
/** normalized color string (#RRGGBB or rgba(...)) or null */
|
|
182
|
+
readonly primaryColor: string | null;
|
|
183
|
+
readonly accentColor: string | null;
|
|
184
|
+
readonly brightness: 'light' | 'dark' | null;
|
|
185
|
+
readonly fontFamily: string | null;
|
|
186
|
+
readonly fontUrl: string | null;
|
|
187
|
+
/** composer placeholder override (chat_placeholder/placeholder); null keeps the base. */
|
|
188
|
+
readonly placeholder: string | null;
|
|
189
|
+
/** white-label switch (hide_powered_by): hide the powered-by attribution. null = unset (keep the base). */
|
|
190
|
+
readonly hidePoweredBy: boolean | null;
|
|
191
|
+
}
|
|
192
|
+
/** true when every field is null (no config) - treated by callers as "absent". */
|
|
193
|
+
declare function isEmptyBranding(b: ClientBranding): boolean;
|
|
194
|
+
/**
|
|
195
|
+
* Parse an untrusted branding blob (from the entitlements render_hints, or the client `theme` prop) into a
|
|
196
|
+
* normalized `ClientBranding`. Accepts BOTH snake_case and camelCase keys. Returns null when the input is not
|
|
197
|
+
* an object OR when the result is empty (all fields null) - callers read null as "no config" (fail-closed to
|
|
198
|
+
* the compiled default). Never throws.
|
|
199
|
+
*/
|
|
200
|
+
declare function parseClientBranding(json: unknown): ClientBranding | null;
|
|
201
|
+
/**
|
|
202
|
+
* Parse a permissive color into a normalized string (`#RRGGBB` when opaque, else `rgba(r,g,b,a)`), or null.
|
|
203
|
+
* Accepts `#RGB`, `#RRGGBB`, `#AARRGGBB`, `0xAARRGGBB` (string), a 32-bit ARGB `int`, and `rgb()/rgba()`.
|
|
204
|
+
* An empty string, whitespace, or an unrecognized value yields null.
|
|
205
|
+
*/
|
|
206
|
+
declare function parseColor(value: unknown): string | null;
|
|
207
|
+
/**
|
|
208
|
+
* Return the more legible of near-black / white for `background` (WCAG 2.x contrast). Ported from Flutter
|
|
209
|
+
* `_readableOn`. Falls back to white for an unparseable background (never throws).
|
|
210
|
+
*/
|
|
211
|
+
declare function readableOn(background: string): string;
|
|
212
|
+
/**
|
|
213
|
+
* Return the URL only if it is an https URL with no embedded whitespace, else null (security invariant:
|
|
214
|
+
* https-only; rejects http:, javascript:, data:, etc.). Uses a protocol-locked regex rather than the URL
|
|
215
|
+
* constructor so it is portable + total on React Native (whose URL global is incomplete) and never throws.
|
|
216
|
+
*/
|
|
217
|
+
declare function hardenHttpsUrl(url: string | null): string | null;
|
|
218
|
+
/**
|
|
219
|
+
* Overlay `b` onto `base`, field by field: a non-null branding field WINS; a null field KEEPS the base. A
|
|
220
|
+
* valid brightness re-selects the matching compiled palette (light/dark); an invalid/absent brightness leaves
|
|
221
|
+
* the base palette untouched. Returns a NEW deeply-frozen theme; `base` and `b` are never mutated.
|
|
222
|
+
*
|
|
223
|
+
* NOTE: foreground legibility (onPrimary/onAccent) and URL hardening are applied by `resolveTheme`, the total
|
|
224
|
+
* entry point. Call this directly only when you will finalize the result yourself.
|
|
225
|
+
*/
|
|
226
|
+
declare function withServerBranding(base: EverfurTheme, b: ClientBranding | null): EverfurTheme;
|
|
227
|
+
/**
|
|
228
|
+
* Inputs to the total theme resolve. All optional; `resolveTheme(undefined)` yields the compiled Everfur
|
|
229
|
+
* default. Merge order (server wins): compiled default <- clientOverride (first-paint/offline fallback) <-
|
|
230
|
+
* branding (server render_hints).
|
|
231
|
+
*/
|
|
232
|
+
interface ResolveThemeInput {
|
|
233
|
+
/** Server-driven branding from the live entitlements render_hints (authoritative overlay). */
|
|
234
|
+
readonly branding?: ClientBranding | null;
|
|
235
|
+
/** The clamped client `theme` prop - a first-paint/offline fallback merged UNDER the server. */
|
|
236
|
+
readonly clientOverride?: ClientBranding | null;
|
|
237
|
+
/** The device color scheme (useColorScheme); selects the base palette when branding sets no brightness. */
|
|
238
|
+
readonly colorScheme?: 'light' | 'dark' | null;
|
|
239
|
+
/** AccessibilityInfo reduced-motion: collapses the motion tokens. */
|
|
240
|
+
readonly reducedMotion?: boolean;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Resolve the final, legible, deeply-frozen theme. Never throws, never returns null/transparent. Applies the
|
|
244
|
+
* client fallback UNDER the server overlay, recomputes onPrimary/onAccent via WCAG, hardens logo/font URLs to
|
|
245
|
+
* https-only, guarantees a non-empty displayName, and collapses motion under reduced-motion.
|
|
246
|
+
*/
|
|
247
|
+
declare function resolveTheme(input?: ResolveThemeInput): EverfurTheme;
|
|
248
|
+
|
|
249
|
+
/** The conditional-GET endpoint (SPEC-00 §5.3). Relative; the transport prefixes the resolved base URL. */
|
|
250
|
+
declare const ENTITLEMENTS_PATH = "/widget/v1/entitlements";
|
|
251
|
+
/**
|
|
252
|
+
* The settled outcome of one entitlement fetch. `updated` carries a fresh verdict + the cadence to re-poll on;
|
|
253
|
+
* `notModified` means the cached verdict still holds; `failed` carries a normalized error and means keep-last.
|
|
254
|
+
*/
|
|
255
|
+
type EntitlementResolution = {
|
|
256
|
+
readonly kind: 'updated';
|
|
257
|
+
readonly revision: number;
|
|
258
|
+
readonly region: string;
|
|
259
|
+
readonly ttlSeconds: number;
|
|
260
|
+
readonly decisions: readonly EntitlementDecision[];
|
|
261
|
+
/**
|
|
262
|
+
* Server-driven branding parsed from the SAME 200 body's render_hints (orthogonal to capabilities).
|
|
263
|
+
* null when absent or unparseable (fail-closed -> the compiled Everfur default theme). OPTIONAL so a
|
|
264
|
+
* hand-built resolution (tests / injected resolve) need not supply it.
|
|
265
|
+
*/
|
|
266
|
+
readonly branding?: ClientBranding | null;
|
|
267
|
+
} | {
|
|
268
|
+
readonly kind: 'notModified';
|
|
269
|
+
} | {
|
|
270
|
+
readonly kind: 'failed';
|
|
271
|
+
readonly error: EverfurError;
|
|
272
|
+
};
|
|
273
|
+
interface FetchEntitlementsArgs {
|
|
274
|
+
/** The revision we last stored; echoed as If-None-Match so an unchanged verdict returns 304. */
|
|
275
|
+
readonly cachedRevision?: number | null;
|
|
276
|
+
/** Optional region hint; forwarded as ?region. */
|
|
277
|
+
readonly region?: string;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Fetch the server-resolved entitlement verdict once. Never throws: a 304, a domain error, a network reject,
|
|
281
|
+
* and a malformed body all SETTLE to an EntitlementResolution. Fail-closed on every non-`updated` path.
|
|
282
|
+
*/
|
|
283
|
+
declare function fetchEntitlements(auth: AuthContext, args?: FetchEntitlementsArgs, funnel?: RequestFunnel): Promise<EntitlementResolution>;
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Server-declared bounds on `WidgetPetInput`, mirrored so a violation is refused before the wire rather
|
|
287
|
+
* than returning a 422 after the caller has already driven a registration flow. Every field is optional
|
|
288
|
+
* server-side: `POST` with an empty body registers a bare pet, which is all consent needs.
|
|
289
|
+
*/
|
|
290
|
+
declare const PET_NAME_MAX = 100;
|
|
291
|
+
declare const PET_SPECIES_MAX = 50;
|
|
292
|
+
declare const PET_BREED_MAX = 100;
|
|
293
|
+
declare const PET_AGE_YEARS_MAX = 50;
|
|
294
|
+
declare const PET_WEIGHT_KG_MAX = 500;
|
|
295
|
+
/** The optional profile fields. Omit all of them to register the pet without describing it. */
|
|
296
|
+
interface PetProfileInput {
|
|
297
|
+
readonly name?: string;
|
|
298
|
+
readonly species?: string;
|
|
299
|
+
readonly breed?: string;
|
|
300
|
+
readonly ageYears?: number;
|
|
301
|
+
readonly weightKg?: number;
|
|
302
|
+
}
|
|
303
|
+
/** The registered profile, as the server echoes it back. */
|
|
304
|
+
interface RegisteredPet {
|
|
305
|
+
readonly petRef: string;
|
|
306
|
+
readonly name: string | null;
|
|
307
|
+
readonly species: string | null;
|
|
308
|
+
readonly breed: string | null;
|
|
309
|
+
readonly ageYears: number | null;
|
|
310
|
+
readonly weightKg: number | null;
|
|
311
|
+
}
|
|
312
|
+
interface PetsRepository {
|
|
313
|
+
/**
|
|
314
|
+
* `POST /widget/v1/pets/{pet_ref}` - create or update the widget pet profile. Idempotent by construction:
|
|
315
|
+
* the route is an upsert, so calling it for an already-registered pet updates rather than duplicates.
|
|
316
|
+
*
|
|
317
|
+
* Settles: `ok(RegisteredPet)` on 201, `err(EverfurError)` otherwise. Never throws.
|
|
318
|
+
*/
|
|
319
|
+
registerPet(petRef: PetRef, profile?: PetProfileInput, opts?: {
|
|
320
|
+
signal?: AbortSignal;
|
|
321
|
+
}): Promise<EverfurResult<RegisteredPet>>;
|
|
322
|
+
}
|
|
323
|
+
/** Build the repository over a device AuthContext (personalized bearer XOR anonymous pk). */
|
|
324
|
+
declare function createPetsRepository(auth: AuthContext): PetsRepository;
|
|
325
|
+
|
|
326
|
+
export { deepFreeze as A, fetchEntitlements as B, type ClientBranding as C, hardenHttpsUrl as D, ENTITLEMENTS_PATH as E, type FetchEntitlementsArgs as F, isEmptyBranding as G, parseClientBranding as H, parseColor as I, readableOn as J, resolveTheme as K, withServerBranding as L, PET_AGE_YEARS_MAX as P, type RegisteredPet as R, EVERFUR_DARK as a, EVERFUR_LIGHT as b, type EntitlementResolution as c, type EverfurColorTokens as d, type EverfurFontWeight as e, type EverfurLetterSpacingTokens as f, type EverfurLineHeightTokens as g, type EverfurMotionDurationTokens as h, type EverfurMotionTokens as i, type EverfurRadiusTokens as j, type EverfurSpaceTokens as k, type EverfurSpringToken as l, type EverfurTextColorTokens as m, type EverfurTheme as n, type EverfurThemeMeta as o, type EverfurTypeSizeTokens as p, type EverfurTypeTokens as q, type EverfurWeightTokens as r, PET_BREED_MAX as s, PET_NAME_MAX as t, PET_SPECIES_MAX as u, PET_WEIGHT_KG_MAX as v, type PetProfileInput as w, type PetsRepository as x, type ResolveThemeInput as y, createPetsRepository as z };
|