@glissade/core 0.11.0 → 0.12.0-pre.1

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.
@@ -0,0 +1,138 @@
1
+ import { r as Track, t as Key } from "./track.js";
2
+
3
+ //#region src/devWarning.d.ts
4
+ /** The configurable dev-warning channel (no DOM lib in core; console may not exist). */
5
+ type DevWarning = (message: string) => void;
6
+ declare function setDevWarning(fn: DevWarning): void;
7
+ /** Internal: emit through the configurable channel. */
8
+ declare function emitDevWarning(message: string): void;
9
+ //#endregion
10
+ //#region src/timeline.d.ts
11
+ type Json = null | boolean | number | string | Json[] | {
12
+ [k: string]: Json;
13
+ };
14
+ interface Marker {
15
+ t: number;
16
+ name: string;
17
+ data?: Json;
18
+ }
19
+ /**
20
+ * One concrete font face within a family — a (weight, style) variant at a URL.
21
+ * `weight`/`style` default to 400/'normal' (the CSS regular face). Lives on
22
+ * AssetRef.faces; a bare `{ kind: 'font', url }` is exactly the 400/normal face
23
+ * with no extra variants (so existing documents stay byte-identical, §3.6).
24
+ */
25
+ interface FontFaceRef {
26
+ url: string;
27
+ weight?: number | undefined;
28
+ style?: 'normal' | 'italic' | undefined;
29
+ }
30
+ interface AssetRef {
31
+ kind: 'font' | 'image' | 'audio' | 'video' | 'timeline';
32
+ url: string;
33
+ /**
34
+ * Font only (§3.6): the explicit face set for this family. When present, the
35
+ * loaders register EVERY face (not the single `url`); the family-level `url`
36
+ * is the implicit 400/normal face. Omitted = the bare single-face form.
37
+ */
38
+ faces?: FontFaceRef[] | undefined;
39
+ /**
40
+ * Font only (§3.6): the explicit fallback family chain, in order. The
41
+ * registry resolves `[family, ...fallback]` for glyph coverage. Omitted = no
42
+ * declared fallback (system fallback still applies in the rasterizer).
43
+ */
44
+ fallback?: string[] | undefined;
45
+ }
46
+ /**
47
+ * A gain envelope: keys of linear gain multipliers on the clip's local time
48
+ * axis. A full Track satisfies it structurally, but its target/type carry no
49
+ * meaning here — `{ keys: [...] }` is all a clip needs.
50
+ */
51
+ interface GainEnvelope {
52
+ keys: Key[];
53
+ }
54
+ /** Audio is timeline metadata, never a render product (§5.3). */
55
+ interface AudioClip {
56
+ asset: AssetRef;
57
+ /** timeline seconds (frame-quantized at export via sample-position arithmetic) */
58
+ at: number;
59
+ /** seconds within the source asset */
60
+ trim?: {
61
+ start: number;
62
+ end: number;
63
+ };
64
+ gain?: GainEnvelope;
65
+ playbackRate?: number;
66
+ }
67
+ interface ChildEntry {
68
+ timeline: Timeline;
69
+ /** Offset on the parent time axis. */
70
+ at: number;
71
+ /**
72
+ * 'add': flattened at compile time into the parent's track space.
73
+ * 'sync': opaque sub-timeline with its own clock (parent t maps through
74
+ * at/timeScale); never coalesced against parent tracks.
75
+ */
76
+ mode: 'add' | 'sync';
77
+ /** sync-mode only: child plays at this rate. */
78
+ timeScale?: number;
79
+ }
80
+ interface Timeline {
81
+ version: 1;
82
+ duration?: number;
83
+ /**
84
+ * Studio opt-in (§6.2 rule 4): the timeline duration is code-owned and
85
+ * read-only in the editor UNLESS this flag is set (via `editableDuration()`
86
+ * on the builder, or directly). Mirrors `track.editable` for tracks.
87
+ */
88
+ editableDuration?: boolean;
89
+ fps?: number;
90
+ posterTime?: number;
91
+ tracks: Track[];
92
+ labels?: Record<string, number>;
93
+ markers?: Marker[];
94
+ children?: ChildEntry[];
95
+ audio?: AudioClip[];
96
+ assets?: Record<string, AssetRef>;
97
+ }
98
+ interface TimelineInit {
99
+ tracks?: Track[];
100
+ duration?: number;
101
+ /** Studio opt-in: expose the duration to editor editing (§6.2 rule 4). */
102
+ editableDuration?: boolean;
103
+ fps?: number;
104
+ posterTime?: number;
105
+ labels?: Record<string, number>;
106
+ markers?: Marker[];
107
+ children?: ChildEntry[];
108
+ audio?: AudioClip[];
109
+ assets?: Record<string, AssetRef>;
110
+ }
111
+ declare class TimelineValidationError extends Error {
112
+ constructor(message: string);
113
+ }
114
+ interface CompiledTimeline {
115
+ duration: number;
116
+ labels: Record<string, number>;
117
+ markers: Marker[];
118
+ /** One track per target (§2.2), keys rebased to the root time axis. */
119
+ tracks: Map<string, Track>;
120
+ /** Audio clips rebased to the root time axis (§5.3); sync timeScale scales playbackRate. */
121
+ audio: AudioClip[];
122
+ }
123
+ /**
124
+ * Sample-indexed clip offset — the single A/V-sync source of truth (§5.3),
125
+ * `round(at * sampleRate)`. Both the CLI (FFmpeg) and the browser
126
+ * (OfflineAudioContext) mixers derive their delay from this, so A/V offsets
127
+ * agree across paths by construction rather than one rounding to milliseconds
128
+ * and the other to raw float seconds. Default rate is the canonical mix grid.
129
+ */
130
+ declare function audioOffsetSamples(at: number, sampleRate?: number): number;
131
+ /**
132
+ * Studio reader (§6.2 rule 4): is this timeline's duration opted into editor
133
+ * editing? Code-owned and read-only by default; `editableDuration()` flips it.
134
+ */
135
+ declare function isDurationEditable(doc: Timeline): boolean;
136
+ declare function compileTimeline(doc: Timeline): CompiledTimeline;
137
+ //#endregion
138
+ export { setDevWarning as _, FontFaceRef as a, Marker as c, TimelineValidationError as d, audioOffsetSamples as f, emitDevWarning as g, DevWarning as h, CompiledTimeline as i, Timeline as l, isDurationEditable as m, AudioClip as n, GainEnvelope as o, compileTimeline as p, ChildEntry as r, Json as s, AssetRef as t, TimelineInit as u };
@@ -0,0 +1,329 @@
1
+ //#region src/easing.d.ts
2
+ /**
3
+ * Easing registry + cubic bézier (DESIGN.md §2.2). All functions map [0,1]→ℝ
4
+ * with f(0)=0 and f(1)=1; back/elastic intentionally leave [0,1].
5
+ */
6
+ type EasingFn = (t: number) => number;
7
+ type EaseSpec = string | {
8
+ kind: 'cubicBezier';
9
+ pts: [number, number, number, number];
10
+ } | {
11
+ kind: 'spring';
12
+ stiffness: number;
13
+ damping: number;
14
+ mass: number;
15
+ };
16
+ declare const easings: Record<string, EasingFn>;
17
+ /**
18
+ * Analytic derivatives d(u) of every named ease (§B.6) — closed-form, used
19
+ * for reading velocity off in-flight curves at interruption time. Property-
20
+ * tested against central differences at interior points.
21
+ */
22
+ declare const easingDerivatives: Record<string, EasingFn>;
23
+ /** Default property-tween ease (Motion Canvas precedent). */
24
+ declare const DEFAULT_EASE = "easeInOutCubic";
25
+ /**
26
+ * CSS-style cubic bézier where x is time and y is progress. Newton's method
27
+ * with a bisection fallback for the flat-derivative regions.
28
+ */
29
+ declare function cubicBezier(p1x: number, p1y: number, p2x: number, p2y: number): EasingFn;
30
+ /** Analytic dy/dx of a cubic bézier ease: y'(s)/x'(s) at the solved parameter (§B.6). */
31
+ declare function cubicBezierDerivative(p1x: number, p1y: number, p2x: number, p2y: number): EasingFn;
32
+ declare class UnknownEasingError extends Error {
33
+ constructor(name: string);
34
+ }
35
+ declare function namedEasing(name: string): EasingFn;
36
+ //#endregion
37
+ //#region src/spring.d.ts
38
+ interface SpringConfig {
39
+ stiffness: number;
40
+ damping: number;
41
+ mass?: number;
42
+ }
43
+ interface SpringEase {
44
+ kind: 'spring';
45
+ stiffness: number;
46
+ damping: number;
47
+ mass: number;
48
+ }
49
+ /**
50
+ * Settle duration: the earliest time after which |x - 1| stays within
51
+ * settleTolerance. Closed-form via the decay envelope for the underdamped
52
+ * case; bisection on the monotone tail otherwise. Deterministic.
53
+ */
54
+ declare function duration(cfg: SpringConfig, opts?: {
55
+ settleTolerance?: number;
56
+ }): number;
57
+ /**
58
+ * Spring progress at local time t, affinely rescaled so value(duration) = 1
59
+ * exactly — the raw form only approaches 1, and an unscaled curve would snap
60
+ * at the key (§2.7 "endpoint continuity"). May exceed 1 (overshoot).
61
+ */
62
+ declare function value(cfg: SpringConfig, t: number, opts?: {
63
+ settleTolerance?: number;
64
+ }): number;
65
+ /**
66
+ * Velocity-matched retarget oscillator (v2 addendum §B.3): the same damped
67
+ * harmonic oscillator on an OFFSET in value units with nonzero initial
68
+ * velocity — y(0)=x0, y'(0)=v0, decaying to 0. No affine rescale (the target
69
+ * is exactly 0). Pure closed forms; seek-safe at any τ.
70
+ */
71
+ interface RetargetSpring {
72
+ value(tau: number): number;
73
+ velocity(tau: number): number;
74
+ /** Earliest τ after which |value| stays within tol (default 0.005·|x0|+1e-6 floor). */
75
+ settleTime(tol?: number): number;
76
+ }
77
+ declare function retarget(cfg: SpringConfig, x0: number, v0: number): RetargetSpring;
78
+ interface SpringFactory {
79
+ (cfg: SpringConfig): SpringEase;
80
+ duration: typeof duration;
81
+ value: typeof value;
82
+ retarget: typeof retarget;
83
+ }
84
+ declare const spring: SpringFactory;
85
+ /**
86
+ * Named spring feels (react-spring conventions, mass 1) — a vocabulary instead
87
+ * of hand-tuned stiffness/damping. Use `spring(springPresets.wobbly)` or
88
+ * `springTo(t, a, b, springPresets.gentle)`.
89
+ */
90
+ declare const springPresets: {
91
+ readonly default: {
92
+ readonly stiffness: 170;
93
+ readonly damping: 26;
94
+ };
95
+ readonly gentle: {
96
+ readonly stiffness: 120;
97
+ readonly damping: 14;
98
+ };
99
+ readonly wobbly: {
100
+ readonly stiffness: 180;
101
+ readonly damping: 12;
102
+ };
103
+ readonly stiff: {
104
+ readonly stiffness: 210;
105
+ readonly damping: 20;
106
+ };
107
+ readonly slow: {
108
+ readonly stiffness: 280;
109
+ readonly damping: 60;
110
+ };
111
+ readonly molasses: {
112
+ readonly stiffness: 280;
113
+ readonly damping: 120;
114
+ };
115
+ };
116
+ /**
117
+ * The spring as a normalized easing over a segment whose length must equal
118
+ * spring.duration(cfg) (validated at the document layer, §2.7).
119
+ */
120
+ declare function springEasing(cfg: SpringConfig): EasingFn;
121
+ /**
122
+ * Analytic d/dp of springEasing (§B.6): oscillator derivative × the affine
123
+ * rescale factor × duration (chain rule p → t = p·D). Flat past p=1,
124
+ * matching value()'s clamp (right-derivative convention).
125
+ */
126
+ declare function springEasingDerivative(cfg: SpringConfig): EasingFn;
127
+ //#endregion
128
+ //#region src/valueTypes.d.ts
129
+ /**
130
+ * Value-type registry with pluggable per-type interpolation (DESIGN.md §2.2).
131
+ * `extrapolates` declares whether a type's lerp accepts easedT outside [0,1]
132
+ * (spring overshoot); non-extrapolating types clamp.
133
+ */
134
+ type Vec2 = readonly [number, number];
135
+ /** One bezier contour in Lottie's vertex form: anchor points + RELATIVE in/out tangents. */
136
+ interface PathContour {
137
+ closed: boolean;
138
+ v: Vec2[];
139
+ in: Vec2[];
140
+ out: Vec2[];
141
+ }
142
+ /** The 'path' document value (§2.2): plain JSON, serializes with no new hooks. */
143
+ type PathValue = PathContour[];
144
+ /** Transition handoff policies (v2 addendum §A.4/§B.1); 'crossfade' reserved. */
145
+ type HandoffKind = 'cut' | 'decay' | 'spring' | 'blend-from-frozen';
146
+ interface ValueType<T> {
147
+ id: string;
148
+ lerp(a: T, b: T, t: number): T;
149
+ /** Accepts easedT outside [0,1] (spring overshoot)? Otherwise clamped. */
150
+ extrapolates: boolean;
151
+ equals(a: T, b: T): boolean;
152
+ /** Optional linear-space operators (offset decay + reserved additive blending, §B.6). */
153
+ add?(a: T, b: T): T;
154
+ sub?(a: T, b: T): T;
155
+ scale?(a: T, k: number): T;
156
+ /** Type-class handoff default (§B.1): spring for kinetic, cut for hold-only. */
157
+ defaultHandoff?: HandoffKind;
158
+ /** Document (de)serialization; default identity for JSON-native types (§2.2). */
159
+ serialize?(value: T): unknown;
160
+ deserialize?(raw: unknown): T;
161
+ }
162
+ type ValueTypeId = 'number' | 'vec2' | 'color' | 'string' | 'boolean' | (string & {});
163
+ declare function registerValueType<T>(vt: ValueType<T>): void;
164
+ declare class UnknownValueTypeError extends Error {
165
+ constructor(id: string);
166
+ }
167
+ declare function getValueType<T = unknown>(id: ValueTypeId): ValueType<T>;
168
+ declare const numberType: ValueType<number>;
169
+ declare const vec2Equals: (a: Vec2, b: Vec2) => boolean;
170
+ declare const vec2Type: ValueType<Vec2>;
171
+ /** vec2 swept along a circular arc: polar lerp of radius + shortest-path angle (§2.2). */
172
+ declare const vec2ArcType: ValueType<Vec2>;
173
+ declare const colorType: ValueType<string>;
174
+ declare const stringType: ValueType<string>;
175
+ declare const booleanType: ValueType<boolean>;
176
+ /**
177
+ * Path morphing (§2.2): pairwise lerp of anchors and tangents — exactly how
178
+ * lottie-web morphs, so imported animations are pixel-faithful. Mismatched
179
+ * topology snaps (hold a, then b at t ≥ 1) with a one-time dev warning; the
180
+ * de Casteljau normalization fallback for arbitrary native morphs is tracked
181
+ * future work. Lerp-only: offsets are not well-defined under mismatched
182
+ * topology, so no add/sub/scale — handoffs blend from the frozen value.
183
+ */
184
+ declare const pathType: ValueType<PathValue>;
185
+ /** A gradient color stop: `offset` 0..1 along the gradient, `color` a CSS string. */
186
+ interface ColorStop {
187
+ offset: number;
188
+ color: string;
189
+ }
190
+ /**
191
+ * How a gradient blends BETWEEN its stops: `linear` (the canvas-native ramp,
192
+ * the default — byte-identical to no mode), `smooth` (a smoothstep S-curve, no
193
+ * Mach-banding at stops), or `gaussian` (a soft gaussian shoulder — melts like
194
+ * a wide blur with 2-3 stops). `smooth`/`gaussian` densify + oklab-interpolate
195
+ * the stops at raster, so a soft-light fill reads as smooth as a blur, no filter.
196
+ */
197
+ type GradientInterpolation = 'linear' | 'smooth' | 'gaussian';
198
+ /** One mesh-gradient color point: `pos` in normalized [0,1]² fill space, `color`
199
+ * a CSS string. Both are ANIMATABLE (e.g. `track('node/fill.points.0.color', …)`
200
+ * drives aurora drift on one node). */
201
+ interface MeshPoint {
202
+ pos: [number, number];
203
+ color: string;
204
+ }
205
+ /**
206
+ * How a `mesh` Paint blends its scattered color points: `smooth` (Shepard
207
+ * inverse-distance weighting in OKLab — sharper points), `gaussian` (a pinned-
208
+ * sigma gaussian melt — a softer, blurrier aurora), or `oklab` (an alias for
209
+ * `smooth`; the blend space is always OKLab). NO triangulator — one shared
210
+ * deterministic kernel both backends run (§3 Paint).
211
+ */
212
+ type MeshInterpolation = 'smooth' | 'gaussian' | 'oklab';
213
+ /** A native mesh-gradient fill: N color points blended across the [0,1]² fill
214
+ * rectangle as ONE animatable fill (replaces the "N blurred blobs" aurora). */
215
+ interface MeshPaint {
216
+ kind: 'mesh';
217
+ points: MeshPoint[];
218
+ interpolation?: MeshInterpolation;
219
+ /** Optional baseline color (a zero-weight floor) so a sparse mesh doesn't smear
220
+ * one point across the whole rect; omit for a pure points-only blend. */
221
+ bg?: string;
222
+ }
223
+ /**
224
+ * A fill/stroke paint (§2.2 animatable document value): a solid color, a
225
+ * `linear`/`radial` gradient, or a `mesh` gradient. Geometry (`from`/`to`,
226
+ * `center`/`radius`, mesh `pos`) is in the shape's LOCAL space; omit gradient
227
+ * geometry to default to the filled path's bounds. Plain JSON — serializes with
228
+ * no hooks; animatable via `paintType`.
229
+ */
230
+ type Paint = {
231
+ kind: 'color';
232
+ color: string;
233
+ } | {
234
+ kind: 'linear';
235
+ stops: ColorStop[];
236
+ from?: [number, number];
237
+ to?: [number, number];
238
+ interpolation?: GradientInterpolation;
239
+ } | {
240
+ kind: 'radial';
241
+ stops: ColorStop[];
242
+ center?: [number, number];
243
+ radius?: number;
244
+ interpolation?: GradientInterpolation;
245
+ } | MeshPaint;
246
+ /**
247
+ * Gradient paint morphing (§2.2): a solid color lifts to a uniform gradient to
248
+ * meet the other side, then matched-kind/matched-stop-count gradients lerp their
249
+ * stops (offset + oklab color) and geometry pairwise; a mismatched kind or stop
250
+ * count snaps (hold a, then b at t ≥ 1) with a one-time dev warning. Lerp-only —
251
+ * no offsets under mismatch — so handoffs blend from the frozen value.
252
+ */
253
+ declare const paintType: ValueType<Paint>;
254
+ declare class ValueTypeInferenceError extends Error {
255
+ constructor(value: unknown);
256
+ }
257
+ /** Infer a registered type id from a sample value (builder + bake authoring surfaces). */
258
+ declare function inferValueType(value: unknown): ValueTypeId;
259
+ //#endregion
260
+ //#region src/track.d.ts
261
+ interface Key<T = unknown> {
262
+ t: number;
263
+ value: T;
264
+ /** Shape of the segment ARRIVING at this key (from the previous key). */
265
+ ease?: EaseSpec;
266
+ interp?: 'default' | 'hold';
267
+ /** Stable key id (studio-assigned); optional in code-authored documents. */
268
+ id?: string;
269
+ /** Builder-resolved implicit from-value; re-resolved on merge (§2.6, §6.2). */
270
+ derived?: boolean;
271
+ /** Reserved (§4.7): a v2 synthesized-transition leading key reads the live value. v1 accepts but ignores it. */
272
+ from?: 'live';
273
+ }
274
+ interface Track<T = unknown> {
275
+ /** Canonical path: '<nodeId>/<prop.path>', e.g. 'circle/position.x'. */
276
+ target: string;
277
+ type: ValueTypeId;
278
+ /** Sorted by t; enforced by validateTrack(). */
279
+ keys: Key<T>[];
280
+ /** Studio may own this track's keys via sidecar (§6.2). */
281
+ editable?: boolean;
282
+ /** Reserved (§2.2/§B.6): v2 additive blending. v1 accepts but ignores it (coalesce stays last-wins). */
283
+ additive?: boolean;
284
+ }
285
+ declare class TrackValidationError extends Error {
286
+ constructor(target: string, message: string);
287
+ }
288
+ declare function validateTrack(track: Track): void;
289
+ type KeyOpts<T> = Partial<Omit<Key<T>, 't' | 'value'>>;
290
+ declare function key<T>(t: number, value: T, easeOrOpts?: EaseSpec | KeyOpts<T>): Key<T>;
291
+ /**
292
+ * The settle-ON-the-beat helper: a spring key must sit at prev.t +
293
+ * spring.duration(cfg) (§2.7), so beat-anchored authoring otherwise means
294
+ * hand-computing the launch time. springTo returns the [launch, settle] key
295
+ * pair with the arithmetic done — spread it into a raw track():
296
+ * track('x/width', 'number', [...springTo(beats.start('drop'), 0, 320, cfg)])
297
+ */
298
+ declare function springTo<T>(endT: number, from: T, to: T, cfg: SpringConfig): [Key<T>, Key<T>];
299
+ /**
300
+ * Cascade a set of tracks by shifting each one's key times — the classic
301
+ * stagger for animating a list of nodes with a delay between them. `delay` is
302
+ * the per-index gap in seconds, or a function of the index for non-linear
303
+ * cascades. Pure: returns new tracks, leaving the inputs untouched.
304
+ *
305
+ * stagger(items.map((it, i) => track(`${it.id}/opacity`, 'number',
306
+ * [key(0, 0), key(0.3, 1, 'easeOutCubic')])), 0.08)
307
+ */
308
+ declare function stagger<T>(tracks: readonly Track<T>[], delay: number | ((index: number) => number)): Track<T>[];
309
+ declare function track<T>(target: string, type: ValueTypeId, keys: Key<T>[], opts?: {
310
+ editable?: boolean;
311
+ }): Track<T>;
312
+ declare function resolveEase(spec: EaseSpec | undefined): EasingFn;
313
+ /**
314
+ * Analytic d(u) for an ease spec (§B.6). Custom-registered eases without a
315
+ * derivative fall back to a symmetric difference with a one-time dev warning.
316
+ */
317
+ declare function resolveEaseDerivative(spec: EaseSpec | undefined): EasingFn;
318
+ /**
319
+ * Analytic track derivative at time t, in value-units per second of local
320
+ * track time (v2 addendum §B.3/§B.6 conventions, pinned):
321
+ * (a) at a key boundary, velocity is the RIGHT derivative;
322
+ * (b) hold segments and the clamped regions outside the keys have v = 0;
323
+ * (c) types without sub/scale operators return null (no kinetic velocity).
324
+ */
325
+ declare function velocityAt<T>(tr: Track<T>, t: number): T | null;
326
+ /** Pure sample of a track at time t (§2.4). */
327
+ declare function sampleTrack<T>(tr: Track<T>, t: number): T;
328
+ //#endregion
329
+ export { easingDerivatives as $, getValueType as A, RetargetSpring as B, UnknownValueTypeError as C, Vec2 as D, ValueTypeInferenceError as E, registerValueType as F, springEasingDerivative as G, SpringEase as H, stringType as I, EaseSpec as J, springPresets as K, vec2ArcType as L, numberType as M, paintType as N, booleanType as O, pathType as P, cubicBezierDerivative as Q, vec2Equals as R, PathValue as S, ValueTypeId as T, spring as U, SpringConfig as V, springEasing as W, UnknownEasingError as X, EasingFn as Y, cubicBezier as Z, MeshInterpolation as _, key as a, Paint as b, sampleTrack as c, track as d, easings as et, validateTrack as f, HandoffKind as g, GradientInterpolation as h, TrackValidationError as i, inferValueType as j, colorType as k, springTo as l, ColorStop as m, KeyOpts as n, resolveEase as o, velocityAt as p, DEFAULT_EASE as q, Track as r, resolveEaseDerivative as s, Key as t, namedEasing as tt, stagger as u, MeshPaint as v, ValueType as w, PathContour as x, MeshPoint as y, vec2Type as z };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@glissade/core",
3
- "version": "0.11.0",
3
+ "version": "0.12.0-pre.1",
4
4
  "description": "glissade core: signals, tracks, timeline document, evaluation, easing, springs, seeded RNG. Zero DOM/Node dependencies.",
5
5
  "license": "Apache-2.0",
6
6
  "engines": {
@@ -16,6 +16,14 @@
16
16
  "./studio-host": {
17
17
  "types": "./dist/studioHost.d.ts",
18
18
  "default": "./dist/studioHost.js"
19
+ },
20
+ "./clips": {
21
+ "types": "./dist/clips.d.ts",
22
+ "default": "./dist/clips.js"
23
+ },
24
+ "./font-ingest": {
25
+ "types": "./dist/font-ingest.d.ts",
26
+ "default": "./dist/font-ingest.js"
19
27
  }
20
28
  },
21
29
  "files": [
@@ -26,6 +34,9 @@
26
34
  "url": "git+https://github.com/tyevco/glissade.git",
27
35
  "directory": "packages/core"
28
36
  },
37
+ "optionalDependencies": {
38
+ "subset-font": "^2.5.0"
39
+ },
29
40
  "scripts": {
30
41
  "build": "tsdown",
31
42
  "typecheck": "tsc --noEmit"