@rafaelaugusto/jolt 0.1.0-beta.1 → 0.1.0-beta.3

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 (91) hide show
  1. package/README.md +115 -8
  2. package/dist/animate.d.ts +3 -1
  3. package/dist/animate.d.ts.map +1 -1
  4. package/dist/animate.js +83 -6
  5. package/dist/animate.js.map +1 -1
  6. package/dist/decay.d.ts +11 -0
  7. package/dist/decay.d.ts.map +1 -0
  8. package/dist/decay.js +22 -0
  9. package/dist/decay.js.map +1 -0
  10. package/dist/driver/android.d.ts +1 -1
  11. package/dist/driver/android.d.ts.map +1 -1
  12. package/dist/driver/android.js +95 -5
  13. package/dist/driver/android.js.map +1 -1
  14. package/dist/driver/index.d.ts +3 -1
  15. package/dist/driver/index.d.ts.map +1 -1
  16. package/dist/driver/index.js.map +1 -1
  17. package/dist/driver/ios.d.ts.map +1 -1
  18. package/dist/driver/ios.js +7 -0
  19. package/dist/driver/ios.js.map +1 -1
  20. package/dist/engine.d.ts +6 -3
  21. package/dist/engine.d.ts.map +1 -1
  22. package/dist/engine.js +21 -5
  23. package/dist/engine.js.map +1 -1
  24. package/dist/haptics.d.ts +18 -0
  25. package/dist/haptics.d.ts.map +1 -0
  26. package/dist/haptics.js +96 -0
  27. package/dist/haptics.js.map +1 -0
  28. package/dist/index.d.ts +14 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +7 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/loader.d.ts +19 -0
  33. package/dist/loader.d.ts.map +1 -0
  34. package/dist/loader.js +172 -0
  35. package/dist/loader.js.map +1 -0
  36. package/dist/particles.d.ts +39 -0
  37. package/dist/particles.d.ts.map +1 -0
  38. package/dist/particles.js +264 -0
  39. package/dist/particles.js.map +1 -0
  40. package/dist/properties.d.ts +1 -1
  41. package/dist/properties.d.ts.map +1 -1
  42. package/dist/properties.js +1 -1
  43. package/dist/properties.js.map +1 -1
  44. package/dist/reveal.d.ts +25 -0
  45. package/dist/reveal.d.ts.map +1 -0
  46. package/dist/reveal.js +293 -0
  47. package/dist/reveal.js.map +1 -0
  48. package/dist/shimmer.d.ts +12 -0
  49. package/dist/shimmer.d.ts.map +1 -0
  50. package/dist/shimmer.js +160 -0
  51. package/dist/shimmer.js.map +1 -0
  52. package/dist/symbol-effect.d.ts +23 -0
  53. package/dist/symbol-effect.d.ts.map +1 -0
  54. package/dist/symbol-effect.js +186 -0
  55. package/dist/symbol-effect.js.map +1 -0
  56. package/dist/text-layout.d.ts +22 -0
  57. package/dist/text-layout.d.ts.map +1 -0
  58. package/dist/text-layout.js +179 -0
  59. package/dist/text-layout.js.map +1 -0
  60. package/dist/text.d.ts +17 -0
  61. package/dist/text.d.ts.map +1 -0
  62. package/dist/text.js +264 -0
  63. package/dist/text.js.map +1 -0
  64. package/dist/track.d.ts.map +1 -1
  65. package/dist/track.js +25 -3
  66. package/dist/track.js.map +1 -1
  67. package/dist/transition.d.ts +5 -0
  68. package/dist/transition.d.ts.map +1 -1
  69. package/dist/transition.js.map +1 -1
  70. package/dist/types.d.ts +17 -0
  71. package/dist/types.d.ts.map +1 -1
  72. package/package.json +2 -1
  73. package/src/animate.ts +96 -4
  74. package/src/decay.ts +45 -0
  75. package/src/driver/android.ts +112 -6
  76. package/src/driver/index.ts +3 -1
  77. package/src/driver/ios.ts +11 -0
  78. package/src/engine.ts +22 -6
  79. package/src/haptics.ts +125 -0
  80. package/src/index.ts +18 -1
  81. package/src/loader.ts +201 -0
  82. package/src/particles.ts +323 -0
  83. package/src/properties.ts +1 -1
  84. package/src/reveal.ts +374 -0
  85. package/src/shimmer.ts +179 -0
  86. package/src/symbol-effect.ts +225 -0
  87. package/src/text-layout.ts +216 -0
  88. package/src/text.ts +296 -0
  89. package/src/track.ts +42 -3
  90. package/src/transition.ts +6 -0
  91. package/src/types.ts +16 -0
@@ -0,0 +1,186 @@
1
+ import { Image, ImageSource, isIOS } from '@nativescript/core';
2
+ import { toView } from './animate.js';
3
+ const running = new WeakMap();
4
+ const names = ['bounce', 'pulse', 'scale', 'variableColor'];
5
+ /**
6
+ * Plays an iOS 17+ SF Symbol effect on a NativeScript Image.
7
+ * Scale holds until stopped; replacements also update the Image's src.
8
+ *
9
+ * ```ts
10
+ * symbolEffect(icon, 'bounce')
11
+ * symbolEffect(icon, { replace: 'sys://heart.fill' })
12
+ * ```
13
+ */
14
+ export function symbolEffect(target, effect, options = {}) {
15
+ const view = toView(target);
16
+ if (!(view instanceof Image))
17
+ throw new TypeError('symbolEffect expects an Image.');
18
+ if (typeof effect === 'string'
19
+ ? !names.includes(effect)
20
+ : !effect ||
21
+ typeof effect.replace !== 'string' ||
22
+ !/^sys:\/\/[^\s/]+$/.test(effect.replace)) {
23
+ throw new TypeError('Expected a symbol effect name or { replace: "sys://name" }.');
24
+ }
25
+ const speed = options.speed ?? 1;
26
+ if (!Number.isFinite(speed) || speed <= 0)
27
+ throw new RangeError('Symbol effect speed must be a positive finite number.');
28
+ if (options.repeat !== undefined && typeof options.repeat !== 'boolean')
29
+ throw new TypeError('Symbol effect repeat must be a boolean.');
30
+ if (options.repeat && (typeof effect !== 'string' || effect === 'scale'))
31
+ throw new TypeError('Only bounce, pulse and variableColor can repeat.');
32
+ return new SymbolAnimation(view, effect, speed, options.repeat ?? false);
33
+ }
34
+ class SymbolAnimation {
35
+ view;
36
+ effect;
37
+ speed;
38
+ repeat;
39
+ finished;
40
+ resolve;
41
+ settled = false;
42
+ started = false;
43
+ changingSource = false;
44
+ waitingForLoad;
45
+ native;
46
+ nativeEffect;
47
+ replacement;
48
+ constructor(view, effect, speed, repeat) {
49
+ this.view = view;
50
+ this.effect = effect;
51
+ this.speed = speed;
52
+ this.repeat = repeat;
53
+ this.finished = new Promise((resolve) => (this.resolve = resolve));
54
+ this.waitingForLoad = !view.isLoaded;
55
+ running.get(view)?.stop();
56
+ running.set(view, this);
57
+ view.on('unloaded', this.stop);
58
+ view.on('srcChange', this.sourceChanged);
59
+ view.on('imageSourceChange', this.imageChanged);
60
+ view.on('loaded', this.loaded);
61
+ view.on('isLoadingChange', this.start);
62
+ this.start();
63
+ }
64
+ then(onfulfilled, onrejected) {
65
+ return this.finished.then(onfulfilled, onrejected);
66
+ }
67
+ stop = () => this.end(false, true);
68
+ sourceChanged = () => {
69
+ if (!this.changingSource)
70
+ this.stop();
71
+ };
72
+ imageChanged = () => {
73
+ if (this.changingSource)
74
+ return;
75
+ if (this.started)
76
+ this.stop();
77
+ else
78
+ this.start();
79
+ };
80
+ loaded = () => {
81
+ this.waitingForLoad = false;
82
+ this.start();
83
+ };
84
+ start = () => {
85
+ if (this.settled || this.started)
86
+ return;
87
+ if (!isIOS)
88
+ return this.end(false);
89
+ const { view, effect } = this;
90
+ // isLoaded becomes true before NativeScript resumes native property updates.
91
+ // Wait for the loaded event so intermediate image resets don't start playback.
92
+ if (this.waitingForLoad ||
93
+ !view.isLoaded ||
94
+ !view.nativeViewProtected ||
95
+ view.isLoading)
96
+ return;
97
+ this.started = true;
98
+ const native = (this.native = view.nativeViewProtected);
99
+ const reducedMotion = UIAccessibilityIsReduceMotionEnabled();
100
+ if (typeof effect !== 'string') {
101
+ // Resolve first so a symbol absent on this OS doesn't clear the current image.
102
+ if (!ImageSource.fromSystemImageSync(effect.replace.slice(6))?.ios)
103
+ return this.end(false);
104
+ const previous = native.image;
105
+ const loadMode = view.loadMode;
106
+ this.changingSource = true;
107
+ try {
108
+ // Let NativeScript update its source, tint, configuration and pending loads.
109
+ // Both assignments happen in this turn, before UIKit draws the next frame.
110
+ view.loadMode = 'sync';
111
+ view.src = effect.replace;
112
+ }
113
+ finally {
114
+ view.loadMode = loadMode;
115
+ this.changingSource = false;
116
+ }
117
+ // A source-change listener may have started another effect or changed the src.
118
+ if (this.settled)
119
+ return;
120
+ if (view.src !== effect.replace)
121
+ return this.end(false);
122
+ const image = native.image;
123
+ if (!image)
124
+ return this.end(false);
125
+ if (reducedMotion ||
126
+ !previous?.symbolImage ||
127
+ !native.respondsToSelector('setSymbolImage:withContentTransition:options:completion:'))
128
+ return this.end(true);
129
+ this.replacement = image;
130
+ native.image = previous;
131
+ native.setSymbolImageWithContentTransitionOptionsCompletion(image, NSSymbolReplaceContentTransition.transition(), this.options(), this.completed);
132
+ return;
133
+ }
134
+ if (reducedMotion ||
135
+ !native.image?.symbolImage ||
136
+ !native.respondsToSelector('addSymbolEffect:options:animated:completion:'))
137
+ return this.end(false);
138
+ const factories = {
139
+ bounce: NSSymbolBounceEffect,
140
+ pulse: NSSymbolPulseEffect,
141
+ scale: NSSymbolScaleEffect,
142
+ variableColor: NSSymbolVariableColorEffect,
143
+ };
144
+ this.nativeEffect = factories[effect].effect();
145
+ native.addSymbolEffectOptionsAnimatedCompletion(this.nativeEffect, this.options(), true, this.completed);
146
+ };
147
+ options() {
148
+ const options = this.repeat
149
+ ? NSSymbolEffectOptions.optionsWithRepeating()
150
+ : NSSymbolEffectOptions.optionsWithNonRepeating();
151
+ return options.optionsWithSpeed(this.speed);
152
+ }
153
+ completed = (context) => {
154
+ // Scale's entrance can complete while the effect is still holding its state.
155
+ if (context.finished && (this.effect === 'scale' || this.repeat))
156
+ return;
157
+ this.end(context.finished);
158
+ };
159
+ end(finished, remove = false) {
160
+ if (this.settled)
161
+ return;
162
+ this.settled = true;
163
+ const { view, native, nativeEffect, replacement } = this;
164
+ view.off('loaded', this.loaded);
165
+ view.off('isLoadingChange', this.start);
166
+ view.off('unloaded', this.stop);
167
+ view.off('srcChange', this.sourceChanged);
168
+ view.off('imageSourceChange', this.imageChanged);
169
+ if (running.get(view) === this)
170
+ running.delete(view);
171
+ if (remove && native) {
172
+ if (nativeEffect)
173
+ native.removeSymbolEffectOfType(nativeEffect);
174
+ // Content transitions have no removal API. Keep the destination icon.
175
+ if (replacement && native.image === replacement) {
176
+ native.image = null;
177
+ native.image = replacement;
178
+ }
179
+ }
180
+ this.native = undefined;
181
+ this.nativeEffect = undefined;
182
+ this.replacement = undefined;
183
+ this.resolve(finished);
184
+ }
185
+ }
186
+ //# sourceMappingURL=symbol-effect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-effect.js","sourceRoot":"","sources":["../src/symbol-effect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /** TextKit lays out the complete string before any glyphs are separated. */
2
+ type Insets = {
3
+ top: number;
4
+ left: number;
5
+ bottom: number;
6
+ right: number;
7
+ };
8
+ type NativeLabel = UILabel & {
9
+ padding?: Insets;
10
+ borderThickness?: Insets;
11
+ };
12
+ /** Ligatures and composed characters may share glyphs. Never draw a shared glyph twice. */
13
+ export declare function mergeGlyphRanges(ranges: readonly NSRange[]): NSRange[];
14
+ export declare function textLayer(native: NativeLabel, by: 'letter' | 'word'): {
15
+ text: string;
16
+ layer: undefined;
17
+ } | {
18
+ text: string;
19
+ layer: CALayer;
20
+ } | undefined;
21
+ export {};
22
+ //# sourceMappingURL=text-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-layout.d.ts","sourceRoot":"","sources":["../src/text-layout.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,KAAK,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAC1E,KAAK,WAAW,GAAG,OAAO,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAI3E,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,CAmBtE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,GAAG,MAAM;;;;;;cA2LnE"}
@@ -0,0 +1,179 @@
1
+ const MAX_PIECES = 256;
2
+ const MAX_PIXELS = 4_000_000;
3
+ /** Ligatures and composed characters may share glyphs. Never draw a shared glyph twice. */
4
+ export function mergeGlyphRanges(ranges) {
5
+ const merged = [];
6
+ for (const range of ranges) {
7
+ if (!range.length)
8
+ continue;
9
+ const previous = merged.at(-1);
10
+ if (previous &&
11
+ range.location < previous.location + previous.length &&
12
+ range.location + range.length > previous.location) {
13
+ const end = Math.max(previous.location + previous.length, range.location + range.length);
14
+ previous.location = Math.min(previous.location, range.location);
15
+ previous.length = end - previous.location;
16
+ }
17
+ else
18
+ merged.push({ location: range.location, length: range.length });
19
+ }
20
+ return merged;
21
+ }
22
+ export function textLayer(native, by) {
23
+ if (native.adjustsFontSizeToFitWidth)
24
+ return undefined;
25
+ const original = native.attributedText;
26
+ const text = original?.string ?? native.text ?? '';
27
+ if (!text.trim())
28
+ return { text, layer: undefined };
29
+ const string = NSString.stringWithString(text);
30
+ const full = { location: 0, length: string.length };
31
+ const attributed = original
32
+ ? NSMutableAttributedString.alloc().initWithAttributedString(original)
33
+ : NSMutableAttributedString.alloc().initWithString(text);
34
+ const paragraph = NSMutableParagraphStyle.new();
35
+ paragraph.alignment = native.textAlignment;
36
+ paragraph.lineBreakMode = native.lineBreakMode;
37
+ const defaults = [
38
+ [NSFontAttributeName, native.font],
39
+ [NSForegroundColorAttributeName, native.textColor],
40
+ [NSParagraphStyleAttributeName, paragraph],
41
+ ];
42
+ if (native.shadowColor) {
43
+ const shadow = NSShadow.new();
44
+ shadow.shadowColor = native.shadowColor;
45
+ shadow.shadowOffset = native.shadowOffset;
46
+ defaults.push([NSShadowAttributeName, shadow]);
47
+ }
48
+ for (const [key, value] of defaults) {
49
+ attributed.enumerateAttributeInRangeOptionsUsingBlock(key, full, 0, (attribute, range) => {
50
+ if (attribute == null && value != null)
51
+ attributed.addAttributeValueRange(key, value, range);
52
+ });
53
+ }
54
+ const inset = (side) => (native.padding?.[side] ?? 0) + (native.borderThickness?.[side] ?? 0);
55
+ const bounds = native.bounds;
56
+ const width = bounds.size.width - inset('left') - inset('right');
57
+ const height = bounds.size.height - inset('top') - inset('bottom');
58
+ if (width <= 0 || height <= 0)
59
+ return undefined;
60
+ const storage = NSTextStorage.alloc().initWithAttributedString(attributed);
61
+ const manager = NSLayoutManager.new();
62
+ manager.usesFontLeading = false;
63
+ const container = NSTextContainer.alloc().initWithSize(CGSizeMake(width, height));
64
+ container.lineFragmentPadding = 0;
65
+ container.maximumNumberOfLines = native.numberOfLines;
66
+ container.lineBreakMode = native.lineBreakMode;
67
+ manager.addTextContainer(container);
68
+ storage.addLayoutManager(manager);
69
+ manager.ensureLayoutForTextContainer(container);
70
+ const visible = manager.glyphRangeForTextContainer(container);
71
+ if (visible.length !== manager.numberOfGlyphs)
72
+ return undefined;
73
+ // A truncation token is not an independently addressable character. Keep the real label.
74
+ for (let glyph = 0; glyph < manager.numberOfGlyphs;) {
75
+ if (manager.truncatedGlyphRangeInLineFragmentForGlyphAtIndex(glyph).length)
76
+ return undefined;
77
+ const range = new interop.Reference();
78
+ manager.lineFragmentRectForGlyphAtIndexEffectiveRange(glyph, range);
79
+ const next = range.value.location + range.value.length;
80
+ if (next <= glyph)
81
+ return undefined;
82
+ glyph = next;
83
+ }
84
+ const characters = [];
85
+ string.enumerateSubstringsInRangeOptionsUsingBlock(full, by === 'letter' ? 2 : 3, (substring, range) => {
86
+ if (substring?.trim())
87
+ characters.push({ location: range.location, length: range.length });
88
+ });
89
+ if (by === 'word') {
90
+ // Attach spaces and punctuation to the surrounding word, preserving every visible mark.
91
+ characters.forEach((range, index) => {
92
+ const start = index === 0 ? 0 : range.location;
93
+ const end = characters[index + 1]?.location ?? full.length;
94
+ range.location = start;
95
+ range.length = end - start;
96
+ });
97
+ if (!characters.length)
98
+ characters.push(full);
99
+ }
100
+ const ranges = mergeGlyphRanges(characters.map((range) => manager.glyphRangeForCharacterRangeActualCharacterRange(range, null)));
101
+ if (ranges.length > MAX_PIECES)
102
+ return undefined;
103
+ const used = manager.usedRectForTextContainer(container);
104
+ const offsetX = bounds.origin.x + inset('left');
105
+ const offsetY = bounds.origin.y + inset('top') + (height - used.size.height) / 2 - used.origin.y;
106
+ const scale = native.window?.screen.scale ?? UIScreen.mainScreen.scale;
107
+ const padding = Math.max(4, native.font.pointSize * 0.1);
108
+ const pieces = ranges.map((range) => {
109
+ const glyph = manager.boundingRectForGlyphRangeInTextContainer(range, container);
110
+ return {
111
+ range,
112
+ rect: CGRectIntegral(CGRectMake(glyph.origin.x + offsetX - padding, glyph.origin.y + offsetY - padding, glyph.size.width + padding * 2, glyph.size.height + padding * 2)),
113
+ };
114
+ });
115
+ if (pieces.reduce((pixels, { rect }) => pixels + rect.size.width * rect.size.height * scale * scale, 0) > MAX_PIXELS)
116
+ return undefined;
117
+ const layer = CALayer.new();
118
+ layer.name = 'jolt:text';
119
+ layer.frame = bounds;
120
+ const transparent = UIColor.clearColor;
121
+ const noShadow = NSShadow.new();
122
+ noShadow.shadowColor = transparent;
123
+ const hidden = NSMutableAttributedString.alloc().initWithAttributedString(attributed);
124
+ for (const key of [
125
+ NSForegroundColorAttributeName,
126
+ NSBackgroundColorAttributeName,
127
+ NSUnderlineColorAttributeName,
128
+ NSStrikethroughColorAttributeName,
129
+ NSStrokeColorAttributeName,
130
+ ]) {
131
+ hidden.addAttributeValueRange(key, transparent, full);
132
+ }
133
+ hidden.addAttributeValueRange(NSShadowAttributeName, noShadow, full);
134
+ let attachments = false;
135
+ attributed.enumerateAttributeInRangeOptionsUsingBlock(NSAttachmentAttributeName, full, 0, (value) => {
136
+ if (value != null)
137
+ attachments = true;
138
+ });
139
+ if (attachments)
140
+ return undefined;
141
+ const shadowColor = native.shadowColor;
142
+ try {
143
+ native.shadowColor = null;
144
+ for (const { range, rect } of pieces) {
145
+ const fragment = NSMutableAttributedString.alloc().initWithAttributedString(hidden);
146
+ const characters = manager.characterRangeForGlyphRangeActualGlyphRange(range, null);
147
+ attributed.enumerateAttributesInRangeOptionsUsingBlock(characters, 0, (attributes, part) => fragment.setAttributesRange(attributes, part));
148
+ native.attributedText = fragment;
149
+ // UILabel draws its own glyphs, preserving its baseline rounding and fallback-font metrics.
150
+ // Other glyphs keep their shaping/advances but have transparent paint.
151
+ UIGraphicsBeginImageContextWithOptions(rect.size, false, scale);
152
+ let image;
153
+ try {
154
+ CGContextTranslateCTM(UIGraphicsGetCurrentContext(), -rect.origin.x, -rect.origin.y);
155
+ native.drawTextInRect(bounds);
156
+ image = UIGraphicsGetImageFromCurrentImageContext();
157
+ }
158
+ finally {
159
+ UIGraphicsEndImageContext();
160
+ }
161
+ if (!image?.CGImage)
162
+ return undefined;
163
+ const piece = CALayer.new();
164
+ piece.frame = CGRectMake(rect.origin.x - bounds.origin.x, rect.origin.y - bounds.origin.y, rect.size.width, rect.size.height);
165
+ piece.contents = image.CGImage;
166
+ piece.contentsScale = scale;
167
+ layer.addSublayer(piece);
168
+ }
169
+ }
170
+ finally {
171
+ if (original)
172
+ native.attributedText = original;
173
+ else
174
+ native.text = text;
175
+ native.shadowColor = shadowColor;
176
+ }
177
+ return { text, layer };
178
+ }
179
+ //# sourceMappingURL=text-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-layout.js","sourceRoot":"","sources":["../src/text-layout.ts"],"names":[],"mappings":"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"}
package/dist/text.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import type { Animation } from './engine.js';
2
+ import type { Target } from './types.js';
3
+ export interface TextOptions {
4
+ /** Composed letters (including emoji), or words. Defaults to 'letter'. */
5
+ by?: 'letter' | 'word';
6
+ /** Milliseconds per piece. Defaults to 400. */
7
+ duration?: number;
8
+ /** Milliseconds between pieces. Defaults to 35. */
9
+ stagger?: number;
10
+ /** Milliseconds before the first piece. Defaults to zero. */
11
+ delay?: number;
12
+ /** Initial vertical offset in DIPs. Defaults to 12. */
13
+ y?: number;
14
+ }
15
+ /** Reveals the text of an iOS Label without splitting its layout or accessibility element. */
16
+ export declare function animateText(target: Target, options?: TextOptions): Animation;
17
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAE5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,WAAW,WAAW;IAC1B,0EAA0E;IAC1E,EAAE,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;IACtB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,uDAAuD;IACvD,CAAC,CAAC,EAAE,MAAM,CAAA;CACX;AA8BD,8FAA8F;AAC9F,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,SAAS,CAmBhF"}