Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
468 commits
Select commit Hold shift + click to select a range
9d76667
chore: bump @shotstack/schemas to ^1.3.5
dazzatronus Dec 30, 2025
8eace21
feat: replace inline type definitions with exported types from shotst…
dazzatronus Dec 30, 2025
a0eaf65
refactor: simplify asset configuration and remove redundant properties
dazzatronus Dec 30, 2025
dfd9937
fix: consolidate Work Sans fonts and correct font resolution priority
dazzatronus Dec 30, 2025
a65da94
fix: update toolbar button tooltips from Tab to backtick and fix mode…
dazzatronus Dec 30, 2025
c095387
fix: clear selection when deleting selected clip
dazzatronus Dec 30, 2025
4838a77
feat: replace bold button with font weight dropdown selector
dazzatronus Dec 30, 2025
57102e1
feat: consolidate style controls into tabbed StylePanel composite
dazzatronus Dec 30, 2025
4e84114
chore: bump version to 2.0.0-beta.5
dazzatronus Dec 30, 2025
9618b76
style: format code and add eslint directives
dazzatronus Dec 30, 2025
c448c7d
fix: correct playback time unit conversions across players
dazzatronus Dec 31, 2025
fbf6c0d
test: add regression tests for player time unit consistency
dazzatronus Dec 31, 2025
95c7006
fix: remove millisecond conversion from keyframe timing values
dazzatronus Dec 31, 2025
7bb3d88
fix: wait for video readyState before rendering and guard against uni…
dazzatronus Dec 31, 2025
f4004c1
fix: prevent SVG icons from intercepting pointer events on toolbar bu…
dazzatronus Dec 31, 2025
e445bc9
fix: reconfigure all end-length clips after timing resolution instead…
dazzatronus Dec 31, 2025
e63f3bf
fix: handle missing background opacity with default value
dazzatronus Dec 31, 2025
0c46882
fix: add string-to-number coercion workaround for Zod schema parsing …
dazzatronus Dec 31, 2025
c716a94
chore: bump version to 2.0.0-beta.6
dazzatronus Dec 31, 2025
641767b
fix: add CORS bypass parameter to image and video asset URLs
dazzatronus Dec 31, 2025
74ffa31
chore: bump version to 2.0.0-beta.7
dazzatronus Dec 31, 2025
edd8817
chore: fix linting errors
dazzatronus Jan 1, 2026
2067e26
chore: bump version to 2.0.0-beta.8 and update @shotstack/schemas to …
dazzatronus Jan 1, 2026
e15fac7
fix: remove coerceStringNumbers workaround
dazzatronus Jan 2, 2026
c50fde7
chore: bump version to 2.0.0-beta.9
dazzatronus Jan 2, 2026
eb7d9ad
removed coerceStringNumbers it converted ANY string that looked like …
Umarnadeem7222 Jan 2, 2026
3030b77
Merge branch '2.0.0' of https://github.com/shotstack/shotstack-studio…
dazzatronus Jan 2, 2026
c744436
chore: bump version to 2.0.0-beta.10
dazzatronus Jan 2, 2026
bb3699f
feat: restore 8-point resize handles with refined styling
dazzatronus Jan 5, 2026
cafc6fc
feat: added svg support for sdk (#56)
Kratos2k7 Jan 6, 2026
30c43af
refactor: edit class refactor and font fixes (#57)
dazzatronus Jan 6, 2026
e15f9ab
Feat/text asset conversion (#58)
dazzatronus Jan 6, 2026
80684d5
Refactor font-picker.ts for improved readability and update font-pick…
dazzatronus Jan 6, 2026
86d0f7b
test: update font hash and add getDocument mock
dazzatronus Jan 6, 2026
02f08cd
chore: bump version to 2.0.0-beta.11
dazzatronus Jan 6, 2026
7ba5abd
chore: disable vite build output directory clearing
dazzatronus Jan 6, 2026
e6df420
chore: bump shotstack-canvas to 1.9.0 and version to 2.0.0-beta.12
dazzatronus Jan 6, 2026
d88b085
feat: improve font resolution by storing and matching normalized font…
dazzatronus Jan 6, 2026
524d753
chore: bump version to 2.0.0-beta.13
dazzatronus Jan 7, 2026
92a879a
Merge branch '2.0.0' of https://github.com/shotstack/shotstack-studio…
dazzatronus Jan 7, 2026
3e90f61
feat: support merge field resolution in SVG assets and expose merge f…
dazzatronus Jan 7, 2026
b01588f
test: update mock and fix pixi asset loader parameter name
dazzatronus Jan 7, 2026
15b171c
chore: bump dependencies and version to 2.0.0-beta.14
dazzatronus Jan 7, 2026
acb9280
Resolution and aspect ratio plus memory leak fixes (#60)
dazzatronus Jan 8, 2026
f1b0aa1
chore: bump version to 2.0.0-beta.16 and update @shotstack/schemas to…
dazzatronus Jan 8, 2026
a0658c2
refactor: invert clip existence check and add maxPixels resolution li…
dazzatronus Jan 8, 2026
828edc1
Merge branch '2.0.0' of https://github.com/shotstack/shotstack-studio…
dazzatronus Jan 8, 2026
f3977c3
refactor: replace for loop with forEach in keyframe builder test
dazzatronus Jan 9, 2026
8383bd9
refactor: consolidate timing mutations through document source of truth
dazzatronus Jan 9, 2026
cedf0b6
chore: remove dark and minimal theme files
dazzatronus Jan 9, 2026
cf287fe
feat: sync clip toolbar state on edit changes and use timing intent f…
dazzatronus Jan 9, 2026
b2bf8b4
test: add ClipToolbar regression test suite for timing and lifecycle
dazzatronus Jan 9, 2026
8ae0499
style: add flexbox styling to volume icon wrapper for SVG visibility
dazzatronus Jan 9, 2026
1f9fe1b
feat: add editable volume and slider value inputs with keyboard short…
dazzatronus Jan 9, 2026
3f05243
test: wrap timing values with sec() conversion and fix env var access…
dazzatronus Jan 9, 2026
f6afcca
refactor: remove redundant comments and clarify documentation
dazzatronus Jan 10, 2026
a5924e3
chore: bump version to 2.0.0-beta.17
dazzatronus Jan 10, 2026
4d348df
chore: format CSS transitions and object literals
dazzatronus Jan 10, 2026
d6b4bdf
feat: add roundDimensions utility and integrate into selection handles
dazzatronus Jan 10, 2026
fdc407e
chore: bump version to 2.0.0-beta.18
dazzatronus Jan 10, 2026
27c1452
fix: add throttling for slider updates and fix render race conditions
dazzatronus Jan 13, 2026
04398a0
fix: use getPlaybackTime() helper and pass clip duration to renderFrame
dazzatronus Jan 13, 2026
4b329ea
refactor: remove command pattern for clip selection
dazzatronus Jan 13, 2026
a86a8f2
feat: add proper dimension handling for SVG and rich text edge resize
dazzatronus Jan 13, 2026
0f1cdd4
fix: add validation for empty tracks and simplify document sync logic
dazzatronus Jan 13, 2026
54b2239
fix: remove duplicate selectClip call from timeline
dazzatronus Jan 13, 2026
5d65dd5
feat: preserve original track indices for accurate clip moves during …
dazzatronus Jan 13, 2026
fd11d26
fix: add cache invalidation for clip and track mutations
dazzatronus Jan 13, 2026
be50622
fix: replace luma attachment map with pure timing-based lookup
dazzatronus Jan 14, 2026
1188903
refactor: remove redundant comments from timeline components
dazzatronus Jan 14, 2026
2a54bb0
fix: ensure track exists and reorder clips correctly on same-track move
dazzatronus Jan 14, 2026
b0f78bb
refactor: invert early returns to reduce nesting in luma timing logic
dazzatronus Jan 14, 2026
f3e1da7
refactor: remove TimelineEntity base class and simplify component inh…
dazzatronus Jan 14, 2026
e82cefd
refactor: move clip visual state computation to interaction controller
dazzatronus Jan 14, 2026
624eb2e
fix: remove unused dragging class manipulation during clip drag opera…
dazzatronus Jan 14, 2026
b2e97e8
feat: cache clip element and track positions during resize operations
dazzatronus Jan 14, 2026
c81f902
test: add comprehensive interaction controller unit tests
dazzatronus Jan 14, 2026
1b16d23
fix: remove deprecated speed property from animation conversion
dazzatronus Jan 14, 2026
7b6213c
fix: prevent deletion of the last track and enforce minimum track req…
dazzatronus Jan 14, 2026
aa37a56
feat: prevent duplicate luma mask attachment and handle existing masks
dazzatronus Jan 14, 2026
8be632a
feat: extract interaction calculations to pure functions module
dazzatronus Jan 14, 2026
4a85e5a
refactor: extract feedback UI logic to stateless module
dazzatronus Jan 14, 2026
37195ca
refactor: extract interaction state machine to dedicated module
dazzatronus Jan 14, 2026
78aaca4
feat: implement lifecycle interface for timeline interaction controller
dazzatronus Jan 14, 2026
1baa828
style: format test file for consistency
dazzatronus Jan 14, 2026
3956f3c
feat: extract drag behavior determination logic into testable function
dazzatronus Jan 14, 2026
f933791
refactor: extract drop action determination into pure function
dazzatronus Jan 14, 2026
b04139f
refactor: eliminate type guard functions and pass state explicitly
dazzatronus Jan 14, 2026
19a8115
fix: prevent division by zero and add null safety checks in timeline …
dazzatronus Jan 14, 2026
ce32469
refactor: flatten timeline component directory structure
dazzatronus Jan 14, 2026
27125a7
feat: add skew transform support and refactor animation builders
dazzatronus Jan 14, 2026
3c38cd6
fix: include opacity in clip keyframe detection
dazzatronus Jan 14, 2026
6f406cb
chore: bump @shotstack/schemas to 1.4.8
dazzatronus Jan 14, 2026
b895b57
refactor: extract alias resolution logic into separate functions
dazzatronus Jan 14, 2026
e93e9dc
fix: reject duplicate aliases with detailed error message
dazzatronus Jan 14, 2026
5548e16
fix: correct carousel offset calculation logic
dazzatronus Jan 15, 2026
76ae945
fix: replace missing context early returns with errors in commands
dazzatronus Jan 15, 2026
a075b06
fix: improve error handling and cleanup in AddClipCommand
dazzatronus Jan 15, 2026
99c99ca
fix: improve command error handling and resource cleanup
dazzatronus Jan 15, 2026
fd3ea64
fix: add optional chaining to skew setter to prevent null reference
dazzatronus Jan 15, 2026
d1657be
test: allow empty text strings in text asset validation
dazzatronus Jan 15, 2026
d0435aa
refactor: reduce nesting in collectResolutions by inverting early con…
dazzatronus Jan 15, 2026
a14bb3b
style: fix linting directives and formatting in edit-commands test
dazzatronus Jan 15, 2026
6629e67
refactor: consolidate text-to-rich-text conversion logic into Shotsta…
dazzatronus Jan 15, 2026
ccdab44
docs: remove verbose comments and improve JSDoc clarity
dazzatronus Jan 15, 2026
08efe80
feat: refactor clip deletion to use track-based API with improved val…
dazzatronus Jan 15, 2026
a80d86d
feat: implement clip reconciliation with stable IDs and unified resol…
dazzatronus Jan 15, 2026
806acc2
refactor: document-first commands with player reconciler
dazzatronus Jan 15, 2026
0a97382
feat: migrate merge field bindings to document as source of truth
dazzatronus Jan 15, 2026
a1eef07
refactor: migrate merge field bindings to document source of truth
dazzatronus Jan 15, 2026
989ecdf
fix: skip URL validation for non-URL-based asset types in merge field…
dazzatronus Jan 15, 2026
9563dd7
feat: refactor merge field updates to use document-first flow with au…
dazzatronus Jan 15, 2026
f3c8101
fix: remove redundant asset reload when updating merge field values
dazzatronus Jan 16, 2026
5b0823f
feat: add live update API for drag/resize/rotate operations without undo
dazzatronus Jan 16, 2026
5d024b2
refactor: defer luma timing resolution to single batch call
dazzatronus Jan 16, 2026
eb8f61c
feat: add single-clip resolution optimization with O(1) resolveClip m…
dazzatronus Jan 16, 2026
fc7a3b7
style: reformat conditional and simplify dimension initialization
dazzatronus Jan 16, 2026
a79143e
refactor: migrate Inspector from Pixi-based canvas overlay to HTML-ba…
dazzatronus Jan 16, 2026
5445dec
refactor: switch to document-first updates with per-frame clip resolu…
dazzatronus Jan 16, 2026
18f2683
fix: add recursion guards and event listener cleanup to prevent stack…
dazzatronus Jan 16, 2026
5b67d67
fix: improve PIXI canvas initialization, thumbnail rendering performa…
dazzatronus Jan 16, 2026
be23786
perf: cache element references to avoid querySelector calls in render…
dazzatronus Jan 16, 2026
529106c
perf: cache DOM elements to avoid innerHTML recreation every frame
dazzatronus Jan 16, 2026
0afbd2f
perf: skip redundant updates in timeline components with reference eq…
dazzatronus Jan 16, 2026
4dd458f
refactor: replace getPlayerClip with getResolvedClip and getClipId
dazzatronus Jan 16, 2026
08f5e67
refactor: destructure properties and simplify comments
dazzatronus Jan 16, 2026
f4a93a4
refactor: clean up unused imports, simplify control flow, and improve…
dazzatronus Jan 16, 2026
953d99b
refactor: remove unused memory stats and deprecated toolbar methods
dazzatronus Jan 16, 2026
3e37e2e
refactor: eliminate manual tracking of end-length clips and clips array
dazzatronus Jan 16, 2026
39afc1e
refactor: extract output settings management to dedicated class
dazzatronus Jan 16, 2026
500c696
refactor: extract selection and clipboard logic into SelectionManager
dazzatronus Jan 16, 2026
2d74d28
feat: extract player factory and move viewport container to Canvas
dazzatronus Jan 16, 2026
1fb1d28
style: format function signatures and chain method calls
dazzatronus Jan 16, 2026
15b4f83
refactor: extract command history management into dedicated method
dazzatronus Jan 16, 2026
3d42d85
feat: add commands for output settings (format, resolution, aspect ra…
dazzatronus Jan 16, 2026
c07a58d
feat: implement CommandResult pattern with sequential command queueing
dazzatronus Jan 16, 2026
79a62fc
chore: remove unused code and types from edit session
dazzatronus Jan 16, 2026
e724d7f
feat: add EditSchema type and remove unnecessary null checks
dazzatronus Jan 23, 2026
eede1ff
fix: unify time units to seconds throughout codebase
dazzatronus Jan 23, 2026
c03e26d
feat: add branded type safety for milliseconds and seconds throughout…
dazzatronus Jan 23, 2026
7dc2f01
refactor: move template import to top-level and simplify type casting
dazzatronus Jan 23, 2026
2c82e30
feat: use Seconds type for time values throughout timeline
dazzatronus Jan 23, 2026
801f094
refactor: consolidate texture and renderable garbage collection flags…
dazzatronus Jan 23, 2026
38e34e5
chore: upgrade pixi.js to 8.15.0
dazzatronus Jan 23, 2026
33fc3dd
fix: remove unused `ms` import and convert elapsed time to seconds in…
dazzatronus Jan 23, 2026
b6538c0
refactor: remove context interfaces and simplify dependency injection
dazzatronus Jan 23, 2026
f53abac
feat: use ms() helper for elapsed time in edit playback tests
dazzatronus Jan 23, 2026
ed9eebb
chore: upgrade shotstack-canvas and refactor control flow
dazzatronus Jan 23, 2026
6b18312
chore: bump version to 2.0.0-beta.19
dazzatronus Jan 23, 2026
96c24f3
feat: integrate alignment guides into canvas component
dazzatronus Jan 23, 2026
9aec12d
refactor: migrate alias resolution to TimingManager and update timing…
dazzatronus Jan 23, 2026
d5c049d
refactor: rename EditConfig to UnresolvedEdit for semantic clarity
dazzatronus Jan 23, 2026
5c9923b
refactor: improve type safety and documentation for edit events and s…
dazzatronus Jan 23, 2026
a73bb71
fix: move track container sync to after player disposal in reconciler
dazzatronus Jan 23, 2026
803baa8
test: add regression tests for alias reference resolution
dazzatronus Jan 23, 2026
5e9f89d
style: remove unnecessary comments and consolidate multi-line JSDoc
dazzatronus Jan 23, 2026
e407615
refactor: Remove unused draw() methods and cache resolved edit state
dazzatronus Jan 26, 2026
db0a80b
feat: add clip ID to resolved clips and handle clip restore events
dazzatronus Jan 26, 2026
e5a2ab8
feat: remove TimingIntent from MoveClipCommand and add alias referenc…
dazzatronus Jan 26, 2026
98c091f
refactor: simplify merge field resolution and player reconciliation
dazzatronus Jan 27, 2026
5ebd3c5
refactor: use dynamic property discovery instead of hardcoded clip pr…
dazzatronus Jan 27, 2026
887d351
feat: add AI asset players with aurora animations
dazzatronus Jan 27, 2026
de163fd
chore: bump @shotstack/schemas to 1.5.3 and version to 2.0.0-beta.20
dazzatronus Jan 27, 2026
eb34cef
refactor: rename UnresolvedEdit back to EditConfig for clarity
dazzatronus Jan 28, 2026
915ec9f
chore: bump version to 2.0.0-beta.21
dazzatronus Jan 28, 2026
cd085de
chore: bump version to 2.0.0-beta.22 and add entryRoot config
dazzatronus Jan 28, 2026
ba8b606
refactor: simplify internal SDK exports and remove unused external de…
dazzatronus Jan 28, 2026
66c1794
fix: normalize z-index hierarchy across UI layers
dazzatronus Jan 28, 2026
193fc7b
chore: bump version to 2.0.0-beta.23
dazzatronus Jan 28, 2026
6e559f2
feat: refactor luma mask initialization to use PlayerLoaded event
dazzatronus Jan 29, 2026
877922f
feat: implement clip ID-based luma-content relationship tracking
dazzatronus Jan 29, 2026
df14e47
refactor: migrate luma operations to compound commands for atomicity
dazzatronus Jan 29, 2026
cb20b6f
chore: bump version to 2.0.0-beta.24
dazzatronus Jan 29, 2026
25bf7c5
chore: updated google fonts
dazzatronus Jan 29, 2026
fb6aef3
build: exclude pixi.js from rollup bundling
dazzatronus Jan 29, 2026
b35ff5e
chore: bump version to 2.0.0-beta.25
dazzatronus Jan 29, 2026
1cd5a36
feat: enhance AI asset handling with asset numbers and prompts in ove…
dazzatronus Jan 30, 2026
62de222
chore: update google fonts
dazzatronus Jan 30, 2026
6a2fa8e
chore: bump version to 2.0.0-beta.26
dazzatronus Jan 30, 2026
9bb1049
fix: use duck typing instead of instanceof to avoid module resolution…
dazzatronus Feb 2, 2026
956eaae
refactor: replace throttle with two-phase drag pattern for command ba…
dazzatronus Feb 2, 2026
002db24
feat: add enable toggle for background color picker
dazzatronus Feb 2, 2026
8cef92e
refactor: implement explicit drag state management and two-phase patt…
dazzatronus Feb 3, 2026
3b3eb15
chore: remove debug console logs from background color picker and too…
dazzatronus Feb 3, 2026
a8789c8
test: add type assertions to fix TypeScript strict mode issues
dazzatronus Feb 3, 2026
1a5ab9e
feat: add SVG editing toolbar with fill color and corner radius controls
dazzatronus Feb 3, 2026
3730645
fix: adjust clip mask offset to account for centered border strokes
dazzatronus Feb 3, 2026
7d9e912
feat: add type safety to RichTextPlayer constructor parameters
dazzatronus Feb 3, 2026
31058bb
refactor: improve type safety with proper typing and reduce type asse…
dazzatronus Feb 3, 2026
1c9ae28
chore: bump version and update shotstack schemas dependency
dazzatronus Feb 3, 2026
ba7e72e
feat: extract SVG utilities to shared module with rect-only validation
dazzatronus Feb 5, 2026
b683934
refactor: replace jest-mock type import with jest.fn return type
dazzatronus Feb 5, 2026
e8ea7ad
chore: bump version to 2.0.0-beta.29
dazzatronus Feb 5, 2026
678b5a0
feat: add draggable toolbar positioning with reset capability
dazzatronus Feb 9, 2026
47bfa83
chore: bump version to 2.0.0-beta.30
dazzatronus Feb 9, 2026
72e4769
fix: rotate drag handle from vertical to horizontal orientation
dazzatronus Feb 9, 2026
2838005
feat: extend media toolbar to support AI-generated asset types
dazzatronus Feb 9, 2026
8596013
feat: add handleOrientation option to toolbar drag handle for vertica…
dazzatronus Feb 9, 2026
682ba5e
chore: bump version to 2.0.0-beta.31
dazzatronus Feb 9, 2026
3ebf6a3
feat: add text-to-image toolbar with prompt editing and generation co…
dazzatronus Feb 9, 2026
300e893
feat: implement two-phase slider drag with single undo entry
dazzatronus Feb 10, 2026
bf92810
feat: add dimension label display during clip resize operations
dazzatronus Feb 10, 2026
1d7e362
feat: add clip-level controls (opacity, scale, transition, effect) to…
dazzatronus Feb 10, 2026
f5ace47
chore: bump version to 2.0.0-beta.32
dazzatronus Feb 10, 2026
34bc225
test: add comprehensive regression tests for UI components and drag i…
dazzatronus Feb 11, 2026
bb6395c
fix: improve custom font matching by binary name metadata
dazzatronus Feb 11, 2026
cc7e15a
chore: bump version to 2.0.0-beta.33
dazzatronus Feb 11, 2026
af04038
feat: add font registration and capability caching for RichTextPlayer
dazzatronus Feb 11, 2026
da275cc
chore: bump version to 2.0.0-beta.34 and update shotstack-canvas to 1…
dazzatronus Feb 11, 2026
e1cfe1e
docs: mark internal methods with @internal JSDoc annotations
dazzatronus Feb 12, 2026
826d11e
refactor: restructure package test suite into contract-based checks
dazzatronus Feb 12, 2026
04e76a7
feat: add internal build script and ./internal export map
dazzatronus Feb 12, 2026
153179b
refactor: remove internal UI components and simplify public API
dazzatronus Feb 12, 2026
e541a4a
chore: upgrade Node.js to 22 and update release workflow
dazzatronus Feb 12, 2026
0ada36d
docs: clarify SDK features and API with template-driven editing patterns
dazzatronus Feb 12, 2026
615390b
refactor: simplify Timeline API by removing feature toggles and options
dazzatronus Feb 12, 2026
8545035
feat: encapsulate internal events and deprecate Timeline constructor …
dazzatronus Feb 12, 2026
21f343d
chore: bump version to 2.0.0-beta.35
dazzatronus Feb 12, 2026
7c2e2c5
chore: bump version to 2.0.0-beta.36 and update dependencies. add val…
dazzatronus Feb 12, 2026
058abf2
refactor: remove schema export and build configuration
dazzatronus Feb 12, 2026
d073ac1
fix: add error resilience and type coercion for merge field operations
dazzatronus Feb 13, 2026
eaa1bb0
feat: invalidate timeline cache on ClipUpdated and TimelineUpdated ev…
dazzatronus Feb 13, 2026
a7576d0
feat: add merge field binding to clip timing controls
dazzatronus Feb 14, 2026
b877f42
test: add regression tests for merge field bind/clear callbacks
dazzatronus Feb 14, 2026
792f551
chore: bump version to 2.0.0-beta.37
dazzatronus Feb 14, 2026
6a674a1
feat: add resolution preset support with rollback handling
dazzatronus Feb 14, 2026
9f3be88
feat: auto-create intermediate objects in setNestedValue for deep pro…
dazzatronus Feb 16, 2026
a457d5f
chore: bump version to 2.0.0-beta.39
dazzatronus Feb 16, 2026
6a7d954
refactor: remove transcription feature and simplify caption player
dazzatronus Feb 16, 2026
fec3fa2
chore: remove unused fast-deep-equal dependency
dazzatronus Feb 16, 2026
a8d312e
chore: remove duplicate opentype dependency
dazzatronus Feb 16, 2026
3454cf0
chore: upgrade @shotstack/schemas to 1.7.0
dazzatronus Feb 16, 2026
6d4e1f3
chore: bump version to 2.0.0-rc.1
dazzatronus Feb 16, 2026
fcaf7f0
chore: remove @jest/globals dependency and imports
dazzatronus Feb 16, 2026
93e36be
test: use mockReturnValue instead of jest.fn callback
dazzatronus Feb 16, 2026
e492987
refactor: replace instanceof checks with structural type checking for…
dazzatronus Feb 16, 2026
7b55363
feat: use duck typing for merge field detection instead of instanceof…
dazzatronus Feb 16, 2026
ecab012
fix: restore merge field default value when toggling dynamic source off
dazzatronus Feb 16, 2026
0874dee
feat: add TextToSpeechToolbar with voice selection and audio controls
dazzatronus Feb 17, 2026
6a07347
chore: bump version to 2.0.0-rc.3
dazzatronus Feb 17, 2026
1f3dadf
refactor: improve type safety and code clarity in UI components and t…
dazzatronus Feb 17, 2026
110ed49
Merge remote-tracking branch 'github/main' into 2.0.0
dazzatronus Feb 17, 2026
06888bf
chore: release version 2.0.0
dazzatronus Feb 17, 2026
9d7a221
feat: add version 2.0.0 with timeline rebuild, AI assets, and UI tool…
dazzatronus Feb 17, 2026
0d8bec7
docs: remove splitClip functionality from API
dazzatronus Feb 17, 2026
a4a6dc4
refactor: remove unused luma masking and toolbar event infrastructure
dazzatronus Feb 17, 2026
b022c9b
fix: correct Seconds type annotations and parameter naming
dazzatronus Feb 17, 2026
741a0e8
chore: update version to 2.0.0-rc.4 and add contributor
dazzatronus Feb 17, 2026
d7c8db7
feat: introduce lumaWrapper container for luma mask isolation
dazzatronus Feb 17, 2026
904a109
chore: bump version to 2.0.0-rc.5
dazzatronus Feb 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Google Fonts API Key
# Get your key from: https://developers.google.com/fonts/docs/developer_api
GOOGLE_FONTS_API_KEY=
2 changes: 1 addition & 1 deletion .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"project": ["./tsconfig.json", "./tsconfig.test.json"]
},
"plugins": ["@typescript-eslint"],
"ignorePatterns": ["**/*.d.ts", "*.js", "**/*.js"],
"ignorePatterns": ["**/*.d.ts", "*.js", "**/*.js", "scripts/**"],
"overrides": [
{
"files": ["src/**/*.ts"],
Expand Down
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,8 @@ dist-ssr
# AI
.taskmaster/
.claude/
.cursor/
.cursor/

# Internal Shotstack files
shotstack.html
src/shotstack-main.ts
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v20
22
133 changes: 133 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,139 @@

All notable changes to this project will be documented in this file.

## [2.0.0] - 2026-02-17

### Added

**Timeline**

- **HTML/CSS timeline rebuild** - Replaced the 1.x timeline with a fully rewritten HTML/CSS implementation
- Asset type icons with variable track heights based on content type
- Playhead ghost hover preview
- Home/End key navigation (replaces meta+arrow keys)
- **Copy-paste** - Duplicate clips on the timeline using standard keyboard shortcuts
- **Collision detection** - Automatic clip pushing during drag operations to prevent overlapping
- **Thumbnail rendering** - Video and image thumbnails displayed directly on timeline clips
- **Soundtrack support** - Integrated audio player for soundtrack assets on the timeline
- **Graceful error handling** - Visual error indicators on clips that fail to load
- **Seconds-based timing** - Unified all time values to a branded `Seconds` type throughout the timeline

**UI Toolbars**

- **Rich text toolbar** - Full formatting toolbar with font picker, text shadow, padding, background color, animation presets, and strikethrough
- **Media toolbar** - Editing controls for video and image clips including audio, fade effects, zoom/slide transitions, and effects
- **SVG toolbar** - Fill color, corner radius, and clip-level controls (opacity, scale, transition, effect)
- **Canvas toolbar** - Resolution, FPS, and background color controls in a vertical layout on the right edge
- **Asset toolbar** - Quick text and media insertion controls on the canvas
- **Text-to-Speech toolbar** - Voice selection and audio generation controls
- **Text-to-image toolbar** - Prompt editing and AI image generation controls
- **Draggable toolbars** - All toolbars support drag repositioning with reset capability
- **Extensible toolbar buttons** - Registry system for adding custom toolbar buttons

**AI-Powered Assets**

- **AI asset players** - Aurora loading animations for text-to-image and text-to-speech assets during generation
- **AI asset overlays** - Asset number badges and prompt preview overlays on AI-generated content

**Merge Fields**

- **Merge field system** - Template variable substitution across Edit properties
- Redesigned merge field popup with scroll architecture

**Font System**

- **Font Picker** - Virtual scrolling font selector with recent fonts tracking
- **Font color picker** - Color and highlight controls with gradient presets
- **Font weight selector** - Dropdown with full weight range, replacing the simple bold toggle
- **OpenType integration** - Font family name extraction using `opentype.js` for accurate metadata
- **CDN font hosting** - Migrated default font assets to CDN with expanded weight and style variants

**Rotation, Resize & Alignment**

- **Rotation** - Full rotation support for canvas objects with snapping to fixed angles
- **8-point resize handles** - Corner and edge resize with proper dimension handling for SVG and rich text assets
- **Alignment guides** - Drag snapping to alignment guides integrated into the canvas
- **Dimension labels** - Live dimension display during resize operations
- **Drag time tooltips** - Time position display during clip drag and resize on the timeline

**Luma Mask**

- **Luma mask system** - Attach luma masks to clips using Alt+drag with automatic asset type transformation

**Output & Resolution**

- **Output configuration commands** - Commands for setting format, resolution, aspect ratio, and destinations
- **Resolution presets** - Predefined resolution options with rollback handling
- **Multi-provider destinations** - Output schema supports multiple render destinations

**Canvas & Rendering**

- **Responsive canvas zoom** - Automatic zoom scaling to fit the container
- **Alpha channel support** - Correct rendering for WebM VP9 transparent videos

**Clip Management**

- **Clip reconciliation** - Unidirectional data flow with unified resolution for predictable clip tracking across undo/redo
- **Clip timing controls** - Asset/clip mode toggle for timing configuration
- **Smart loadEdit** - Structural diffing with unified event dispatch when reloading an edit
- **Drag-to-create track** - Drop zone indicators for creating new tracks during clip drag
- **Alias resolution** - Clip reference system using aliases
- **Caption rendering** - Subtitle player with VTT/SRT parser for caption assets

**Keyframes & Animations**

- **Layered animation composition** - Effects and transitions composed as independent animation layers
- **Skew transform** - New skew property for clip transforms with animation builder support
- **Smooth easing** - New easing curve for improved carousel and slide transitions

**SDK Architecture**

- **EditDocument** - Pure data layer for edit configuration management, separating data from rendering
- **Composite UI components** - Reusable panels for effects, transitions, spacing, and style controls
- **SVG asset support** - Full SVG asset rendering, editing, and shared SVG utilities
- **Keyboard arrow positioning** - Arrow keys move selected clips on the canvas

### Changed

- Migrated to `@shotstack/schemas` as canonical type source
- Upgraded `@shotstack/shotstack-canvas` from ^1.6.5 to ^1.9.6
- Upgraded `pixi.js` from ^8.5.2 to ^8.15.0
- Upgraded `zod` from ^3.23.8 to ^4.0.0
- Requires Node.js 22 (previously unconstrained)
- Timeline API simplified — feature toggles and constructor options removed
- Default preview framerate updated to 25fps
- Switched to light theme as default

### Fixed

- Corrected playback time unit conversions across all player types
- Fixed memory leaks from event listener accumulation and recursive handlers
- Resolved race conditions in render updates during clip selection changes
- Fixed audio stuttering caused by excessive video sync checks (now rate-limited)
- Added cache invalidation for clip and track mutations
- Corrected track layer calculation and z-index sorting for multi-track compositions
- Performance and rendering improvements
- Fixed crop scaling logic to use max ratio consistently
- Deferred audio volume keyframe initialization until timing is resolved
- Fixed left-edge clip resize to correctly adjust start position and duration
- Added track existence validation before clip reorder on same-track moves
- Corrected carousel offset calculation logic
- Normalized z-index hierarchy across UI layers
- Improved `.mov` video error messaging
- Included opacity in clip keyframe detection
- Prevented toolbar container duplication on remount
- Fixed SVG icons intercepting pointer events on toolbar buttons
- Fixed clip mask offset to account for centered border strokes

### Removed

- `./schema` package export — schemas now provided by the `@shotstack/schemas` package
- `TimelineOptions` — Timeline constructor options removed in favour of simplified API
- `fast-deep-equal` dependency — replaced by internal structural diffing
- Schema build configuration (`vite.config.schema.ts`)
- Internal UI component exports from the public API surface
- `.webm` browser support check

## [1.10.1] - 2025-11-27

### Changed
Expand Down
3 changes: 2 additions & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/assets/images/typescript.svg" />
<link rel="stylesheet" href="/src/styles/main.css" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Shotstack Canvas</title>
<title>Shotstack Studio</title>
</head>
<body>
<div data-shotstack-studio class="c-shotstack-studio"></div>
Expand Down
18 changes: 17 additions & 1 deletion jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,23 @@ export default {
extensionsToTreatAsEsm: [".ts"],
moduleNameMapper: {
"^(\\.{1,2}/.*)\\.js$": "$1",
"^@shotstack/shotstack-studio/schema$": "<rootDir>/dist/schema/index.cjs"
"\\.css\\?inline$": "<rootDir>/tests/__mocks__/css-inline.js",
"^@shotstack/shotstack-studio/schema$": "<rootDir>/dist/schema/index.cjs",
"^@core/(.*)$": "<rootDir>/src/core/$1",
"^@canvas/(.*)$": "<rootDir>/src/components/canvas/$1",
"^@timeline/(.*)$": "<rootDir>/src/components/timeline/$1",
"^@shared/(.*)$": "<rootDir>/src/core/shared/$1",
"^@schemas$": "<rootDir>/src/core/schemas/index.ts",
"^@schemas/(.*)$": "<rootDir>/src/core/schemas/$1",
"^@timing/(.*)$": "<rootDir>/src/core/timing/$1",
"^@layouts/(.*)$": "<rootDir>/src/core/layouts/$1",
"^@animations/(.*)$": "<rootDir>/src/core/animations/$1",
"^@events/(.*)$": "<rootDir>/src/core/events/$1",
"^@inputs/(.*)$": "<rootDir>/src/core/inputs/$1",
"^@loaders/(.*)$": "<rootDir>/src/core/loaders/$1",
"^@export/(.*)$": "<rootDir>/src/core/export/$1",
"^@styles/(.*)$": "<rootDir>/src/styles/$1",
"^@templates/(.*)$": "<rootDir>/src/templates/$1"
},
testPathIgnorePatterns: ["/node_modules/", "/dist/"],
transform: {
Expand Down
45 changes: 28 additions & 17 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
"author": "Shotstack <support@shotstack.io>",
"contributors": [
"cpuccino",
"dazzatron"
"dazzatron",
"kratos2k7"
],
"version": "1.10.1",
"version": "2.0.0-rc.5",
"description": "A video editing library for creating and editing videos with Shotstack",
"type": "module",
"main": "dist/shotstack-studio.umd.js",
Expand All @@ -18,17 +19,18 @@
"require": "./dist/shotstack-studio.umd.js",
"default": "./dist/shotstack-studio.es.js"
},
"./schema": {
"types": "./dist/schema/index.d.ts",
"import": "./dist/schema/index.mjs",
"require": "./dist/schema/index.cjs",
"default": "./dist/schema/index.mjs"
"./internal": {
"types": "./dist/internal.d.ts",
"import": "./dist/internal.es.js",
"require": "./dist/internal.umd.js",
"default": "./dist/internal.es.js"
}
},
"files": [
"dist/shotstack-studio.umd.js",
"dist/shotstack-studio.es.js",
"dist/schema/**",
"dist/internal.umd.js",
"dist/internal.es.js",
"dist/**/*.d.ts"
],
"keywords": [
Expand All @@ -38,30 +40,37 @@
"ffmpeg"
],
"license": "PolyForm Shield License 1.0.0",
"engines": {
"node": ">=22 <23"
},
"repository": {
"type": "git",
"url": "https://github.com/shotstack/shotstack-studio-sdk"
},
"scripts": {
"dev": "vite",
"dev:shotstack": "vite --open /shotstack.html",
"start": "npm run build && vite preview",
"build": "npm run build:main && npm run build:schema",
"build": "npm run build:main && npm run build:internal",
"build:main": "vite build",
"build:schema": "vite build --config vite.config.schema.ts",
"test": "npm run build && jest",
"build:internal": "node scripts/build-internal.mjs",
"test": "jest",
"test:watch": "jest --watch",
"test:package": "node test-package.js",
"typecheck": "tsc --noEmit && tsc --project tsconfig.test.json --noEmit",
"lint": "eslint --ignore-path .gitignore .",
"lint:fix": "eslint --ignore-path .gitignore --fix .",
"format": "prettier --ignore-path .gitignore --write .",
"prepublishOnly": "npm run build && npm run test && npm run test:package"
"verify:ci": "npm run lint && npm run typecheck && npm run test && npm run build && npm run test:package",
"release:check": "npm run verify:ci && npm pack --dry-run --json",
"prepublishOnly": "npm run release:check",
"generate:fonts": "npx tsx scripts/fetch-google-fonts.ts"
},
"devDependencies": {
"@jest/globals": "^30.2.0",
"@types/howler": "^2.2.12",
"@types/jest": "^30.0.0",
"@types/node": "^22.9.0",
"@types/opentype.js": "^1.3.8",
"@typescript-eslint/eslint-plugin": "^7.18.0",
"@typescript-eslint/parser": "^7.18.0",
"eslint": "^8.57.1",
Expand All @@ -70,19 +79,21 @@
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-import": "^2.31.0",
"jest": "^30.2.0",
"jest-environment-jsdom": "^30.2.0",
"prettier": "^3.6.2",
"ts-jest": "^29.4.5",
"typescript": "^5.6.2",
"vite": "^5.4.10",
"vite-plugin-dts": "^4.5.4"
},
"dependencies": {
"@shotstack/shotstack-canvas": "^1.6.5",
"fast-deep-equal": "^3.1.3",
"@shotstack/schemas": "1.7.0",
"@shotstack/shotstack-canvas": "^1.9.6",
"howler": "^2.2.4",
"mediabunny": "^1.11.2",
"opentype.js": "^1.3.4",
"pixi-filters": "^6.0.5",
"pixi.js": "^8.5.2",
"zod": "^3.23.8"
"pixi.js": "^8.15.0",
"zod": "^4.0.0"
}
}
Binary file added public/assets/fonts/Montserrat.ttf
Binary file not shown.
Binary file added public/assets/fonts/OpenSans.ttf
Binary file not shown.
Binary file added public/assets/fonts/WorkSans.ttf
Binary file not shown.
Loading