From 8db3bead13441a5882d8689dfc6a9f09c82375d9 Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Wed, 25 Mar 2026 16:47:22 +0100 Subject: feat: masks, properties refactor, shaders, storage migrations, and more --- apps/web/src/app/blog/[slug]/page.tsx | 2 +- apps/web/src/app/blog/page.tsx | 2 +- apps/web/src/app/globals.css | 438 ++--- apps/web/src/app/layout.tsx | 19 +- apps/web/src/app/privacy/page.tsx | 121 +- apps/web/src/app/projects/page.tsx | 20 +- apps/web/src/app/projects/store.ts | 2 +- apps/web/src/app/terms/page.tsx | 100 +- apps/web/src/components/editable-timecode.tsx | 26 +- .../editor/dialogs/project-info-dialog.tsx | 2 +- .../components/editor/dialogs/shortcuts-dialog.tsx | 2 +- .../editor/dialogs/storage-persistence-dialog.tsx | 41 + apps/web/src/components/editor/editor-header.tsx | 7 +- apps/web/src/components/editor/export-button.tsx | 63 +- apps/web/src/components/editor/mobile-gate.tsx | 6 +- .../editor/panels/assets/drag-overlay.tsx | 2 +- .../editor/panels/assets/draggable-item.tsx | 17 +- .../src/components/editor/panels/assets/tabbar.tsx | 15 +- .../editor/panels/assets/views/assets.tsx | 153 +- .../editor/panels/assets/views/base-panel.tsx | 57 + .../editor/panels/assets/views/base-view.tsx | 52 - .../editor/panels/assets/views/captions.tsx | 141 +- .../editor/panels/assets/views/effects.tsx | 15 +- .../editor/panels/assets/views/settings-legacy.tsx | 332 ---- .../editor/panels/assets/views/settings.tsx | 168 -- .../panels/assets/views/settings/background.tsx | 227 +++ .../editor/panels/assets/views/settings/index.tsx | 369 ++++ .../editor/panels/assets/views/sounds.tsx | 2 +- .../editor/panels/assets/views/stickers.tsx | 538 +++--- .../components/editor/panels/assets/views/text.tsx | 12 +- .../editor/panels/preview/context-menu.tsx | 39 +- .../editor/panels/preview/guide-overlay.tsx | 32 + .../editor/panels/preview/guide-popover.tsx | 100 ++ .../editor/panels/preview/handle-primitives.tsx | 332 ++++ .../src/components/editor/panels/preview/index.tsx | 266 ++- .../editor/panels/preview/layout-guide-overlay.tsx | 27 - .../editor/panels/preview/mask-handles.tsx | 238 +++ .../panels/preview/preview-interaction-overlay.tsx | 109 +- .../editor/panels/preview/preview-viewport.tsx | 576 +++++++ .../editor/panels/preview/snap-guides.tsx | 30 +- .../editor/panels/preview/text-edit-overlay.tsx | 149 +- .../components/editor/panels/preview/toolbar.tsx | 169 +- .../editor/panels/preview/transform-handles.tsx | 273 +-- .../editor/panels/properties/audio-properties.tsx | 3 - .../panels/properties/clip-effects-properties.tsx | 215 --- .../properties/components/keyframe-toggle.tsx | 32 + .../properties/components/property-param-field.tsx | 194 +++ .../panels/properties/effect-param-field.tsx | 152 -- .../editor/panels/properties/effect-properties.tsx | 58 - .../hooks/use-keyframed-color-property.ts | 4 +- .../hooks/use-keyframed-number-property.ts | 26 +- .../hooks/use-keyframed-param-property.ts | 148 ++ .../hooks/use-keyframed-vector-property.ts | 190 ++ .../components/editor/panels/properties/index.tsx | 141 +- .../editor/panels/properties/keyframe-toggle.tsx | 32 - .../editor/panels/properties/registry.tsx | 303 ++++ .../editor/panels/properties/section.tsx | 262 --- .../editor/panels/properties/sections/blending.tsx | 222 --- .../editor/panels/properties/sections/index.tsx | 2 - .../panels/properties/sections/transform.tsx | 382 ---- .../panels/properties/stores/properties-store.ts | 18 + .../editor/panels/properties/tabs/audio-tab.tsx | 109 ++ .../editor/panels/properties/tabs/blending-tab.tsx | 230 +++ .../editor/panels/properties/tabs/effects-tab.tsx | 309 ++++ .../editor/panels/properties/tabs/graphic-tab.tsx | 238 +++ .../editor/panels/properties/tabs/masks-tab.tsx | 660 +++++++ .../editor/panels/properties/tabs/speed-tab.tsx | 137 ++ .../editor/panels/properties/tabs/text-tab.tsx | 762 ++++++++ .../panels/properties/tabs/transform-tab.tsx | 424 +++++ .../editor/panels/properties/text-properties.tsx | 732 -------- .../editor/panels/properties/video-properties.tsx | 25 - .../editor/panels/timeline/audio-waveform.tsx | 281 ++- .../editor/panels/timeline/bookmarks.tsx | 27 +- .../editor/panels/timeline/drag-line.tsx | 5 +- .../components/editor/panels/timeline/index.tsx | 885 ++++++---- .../editor/panels/timeline/snap-indicator.tsx | 10 +- .../editor/panels/timeline/timeline-element.tsx | 472 ++--- .../editor/panels/timeline/timeline-playhead.tsx | 38 +- .../editor/panels/timeline/timeline-ruler.tsx | 26 +- .../editor/panels/timeline/timeline-tick.tsx | 4 +- .../editor/panels/timeline/timeline-toolbar.tsx | 16 +- .../editor/panels/timeline/timeline-track.tsx | 62 +- apps/web/src/components/editor/selection-box.tsx | 50 - .../src/components/providers/editor-provider.tsx | 27 +- apps/web/src/components/section.tsx | 257 +++ apps/web/src/components/ui/button.tsx | 2 +- apps/web/src/components/ui/color-picker.tsx | 13 +- apps/web/src/components/ui/context-menu.tsx | 14 +- apps/web/src/components/ui/dialog.tsx | 16 +- apps/web/src/components/ui/dropdown-menu.tsx | 23 +- apps/web/src/components/ui/font-picker.tsx | 107 +- apps/web/src/components/ui/input-with-back.tsx | 85 - apps/web/src/components/ui/input.tsx | 7 +- apps/web/src/components/ui/number-field.tsx | 223 ++- apps/web/src/components/ui/popover.tsx | 20 +- apps/web/src/components/ui/select.tsx | 16 +- apps/web/src/components/ui/sheet.tsx | 17 +- apps/web/src/components/ui/sonner.tsx | 2 +- apps/web/src/components/ui/tabs.tsx | 92 +- apps/web/src/components/ui/tooltip.tsx | 4 +- .../src/components/ui/use-overlay-open-change.ts | 78 + apps/web/src/constants/editor-constants.ts | 14 + apps/web/src/constants/export-constants.ts | 2 +- apps/web/src/constants/font-constants.ts | 2 - apps/web/src/constants/guide-constants.ts | 4 + apps/web/src/constants/language-constants.ts | 3 + apps/web/src/constants/mask-constants.ts | 4 + apps/web/src/constants/project-constants.ts | 10 +- apps/web/src/constants/retime-constants.ts | 30 + apps/web/src/constants/sticker-constants.ts | 4 +- apps/web/src/constants/text-constants.ts | 42 - apps/web/src/constants/timeline-constants.ts | 85 + apps/web/src/constants/timeline-constants.tsx | 102 -- apps/web/src/constants/transcription-constants.ts | 4 +- apps/web/src/core/index.ts | 7 +- apps/web/src/core/managers/audio-manager.ts | 352 +++- apps/web/src/core/managers/media-manager.ts | 73 +- apps/web/src/core/managers/playback-manager.ts | 15 +- apps/web/src/core/managers/project-manager.ts | 49 +- apps/web/src/core/managers/renderer-manager.ts | 60 +- apps/web/src/core/managers/scenes-manager.ts | 6 +- apps/web/src/core/managers/selection-manager.ts | 9 +- apps/web/src/core/managers/timeline-manager.ts | 155 +- apps/web/src/data/colors/syntax-ui.tsx | 2 - apps/web/src/hooks/actions/use-editor-actions.ts | 89 +- .../timeline/element/use-element-interaction.ts | 83 +- .../hooks/timeline/element/use-element-resize.ts | 231 ++- .../timeline/element/use-element-selection.ts | 35 +- .../hooks/timeline/element/use-keyframe-drag.ts | 18 +- .../timeline/element/use-keyframe-selection.ts | 2 +- apps/web/src/hooks/timeline/use-bookmark-drag.ts | 2 +- .../hooks/timeline/use-initial-scroll-bottom.ts | 42 + apps/web/src/hooks/timeline/use-selection-box.ts | 255 --- .../hooks/timeline/use-snap-indicator-position.ts | 14 +- .../src/hooks/timeline/use-timeline-drag-drop.ts | 233 ++- .../src/hooks/timeline/use-timeline-playhead.ts | 186 +- apps/web/src/hooks/timeline/use-timeline-zoom.ts | 28 +- apps/web/src/hooks/use-container-size.ts | 24 +- apps/web/src/hooks/use-editor.ts | 63 +- apps/web/src/hooks/use-effect-preview.ts | 47 - apps/web/src/hooks/use-element-preview.ts | 38 + apps/web/src/hooks/use-file-upload.ts | 12 +- apps/web/src/hooks/use-font-atlas.ts | 53 + apps/web/src/hooks/use-keybindings.ts | 163 +- apps/web/src/hooks/use-mask-handles.ts | 258 +++ apps/web/src/hooks/use-menu-preview.ts | 26 + apps/web/src/hooks/use-paste-media.ts | 87 +- apps/web/src/hooks/use-preview-interaction.ts | 349 ++-- apps/web/src/hooks/use-resize-observer.ts | 26 + apps/web/src/hooks/use-reveal-item.ts | 36 - apps/web/src/hooks/use-storage-persistence.ts | 45 + apps/web/src/hooks/use-transform-handles.ts | 457 +++-- apps/web/src/lib/actions/definitions.ts | 27 +- apps/web/src/lib/actions/keybinding.ts | 79 + apps/web/src/lib/actions/registry.ts | 27 +- apps/web/src/lib/actions/types.ts | 2 + .../__tests__/transform-keyframes.test.ts | 313 ---- apps/web/src/lib/animation/color-channel.ts | 2 +- apps/web/src/lib/animation/effect-param-channel.ts | 55 +- .../web/src/lib/animation/graphic-param-channel.ts | 79 + apps/web/src/lib/animation/index.ts | 32 +- apps/web/src/lib/animation/interpolation.ts | 71 +- apps/web/src/lib/animation/keyframe-query.ts | 17 +- apps/web/src/lib/animation/keyframes.ts | 231 ++- apps/web/src/lib/animation/number-channel.ts | 2 +- apps/web/src/lib/animation/property-groups.ts | 39 + apps/web/src/lib/animation/property-registry.ts | 93 +- apps/web/src/lib/animation/resolve.ts | 69 +- apps/web/src/lib/animation/target-resolver.ts | 279 +++ apps/web/src/lib/animation/types.ts | 119 ++ apps/web/src/lib/animation/vector-channel.ts | 72 + apps/web/src/lib/blog/query.ts | 2 +- apps/web/src/lib/blog/types.ts | 92 + apps/web/src/lib/cancel-interaction.ts | 24 + .../__tests__/keyframe-aware-commands.test.ts | 433 ----- apps/web/src/lib/commands/index.ts | 1 - apps/web/src/lib/commands/media/add-media-asset.ts | 34 +- .../src/lib/commands/media/remove-media-asset.ts | 34 +- .../commands/project/update-project-settings.ts | 2 +- apps/web/src/lib/commands/scene/create-scene.ts | 2 +- apps/web/src/lib/commands/scene/delete-scene.ts | 2 +- apps/web/src/lib/commands/scene/move-bookmark.ts | 2 +- apps/web/src/lib/commands/scene/remove-bookmark.ts | 2 +- apps/web/src/lib/commands/scene/rename-scene.ts | 2 +- apps/web/src/lib/commands/scene/toggle-bookmark.ts | 2 +- apps/web/src/lib/commands/scene/update-bookmark.ts | 2 +- .../src/lib/commands/timeline/clipboard/paste.ts | 2 +- .../commands/timeline/element/delete-elements.ts | 2 +- .../timeline/element/duplicate-elements.ts | 2 +- .../timeline/element/effects/add-effect.ts | 2 +- .../timeline/element/effects/remove-effect.ts | 2 +- .../timeline/element/effects/reorder-effect.ts | 2 +- .../timeline/element/effects/toggle-effect.ts | 2 +- .../element/effects/update-effect-params.ts | 22 +- .../web/src/lib/commands/timeline/element/index.ts | 2 + .../commands/timeline/element/insert-element.ts | 20 +- .../keyframes/remove-effect-param-keyframe.ts | 2 +- .../timeline/element/keyframes/remove-keyframe.ts | 45 +- .../timeline/element/keyframes/retime-keyframe.ts | 20 +- .../keyframes/upsert-effect-param-keyframe.ts | 2 +- .../timeline/element/keyframes/upsert-keyframe.ts | 30 +- .../lib/commands/timeline/element/masks/index.ts | 2 + .../commands/timeline/element/masks/remove-mask.ts | 64 + .../timeline/element/masks/toggle-mask-inverted.ts | 75 + .../lib/commands/timeline/element/move-elements.ts | 2 +- .../lib/commands/timeline/element/retime/index.ts | 1 + .../element/retime/update-element-retime.ts | 114 ++ .../commands/timeline/element/split-elements.ts | 107 +- .../timeline/element/toggle-elements-muted.ts | 2 +- .../timeline/element/toggle-elements-visibility.ts | 2 +- .../timeline/element/update-element-duration.ts | 2 +- .../timeline/element/update-element-start-time.ts | 2 +- .../timeline/element/update-element-trim.ts | 25 +- .../commands/timeline/element/update-element.ts | 2 +- .../src/lib/commands/timeline/track/add-track.ts | 2 +- .../lib/commands/timeline/track/remove-track.ts | 2 +- .../commands/timeline/track/toggle-track-mute.ts | 2 +- .../timeline/track/toggle-track-visibility.ts | 2 +- .../src/lib/commands/timeline/tracks-snapshot.ts | 2 +- apps/web/src/lib/drag-data.ts | 2 +- .../web/src/lib/effects/definitions/blur.frag.glsl | 10 +- apps/web/src/lib/effects/definitions/blur.ts | 109 +- apps/web/src/lib/effects/definitions/index.ts | 6 +- apps/web/src/lib/effects/index.ts | 45 +- apps/web/src/lib/effects/registry.ts | 33 +- apps/web/src/lib/effects/types.ts | 42 + apps/web/src/lib/export.ts | 33 +- apps/web/src/lib/fonts/google-fonts.ts | 26 +- apps/web/src/lib/fonts/types.ts | 24 + apps/web/src/lib/graphics/definitions/ellipse.ts | 73 + apps/web/src/lib/graphics/definitions/index.ts | 29 + apps/web/src/lib/graphics/definitions/polygon.ts | 211 +++ apps/web/src/lib/graphics/definitions/rectangle.ts | 85 + apps/web/src/lib/graphics/definitions/shared.ts | 16 + apps/web/src/lib/graphics/definitions/star.ts | 109 ++ apps/web/src/lib/graphics/index.ts | 125 ++ apps/web/src/lib/graphics/registry.ts | 10 + apps/web/src/lib/graphics/stroke.ts | 102 ++ apps/web/src/lib/graphics/types.ts | 23 + apps/web/src/lib/guides/definitions/custom.tsx | 24 + apps/web/src/lib/guides/definitions/grid.tsx | 125 ++ apps/web/src/lib/guides/definitions/platforms.tsx | 65 + .../src/lib/guides/definitions/tiktok-layout.tsx | 335 ++++ apps/web/src/lib/guides/index.ts | 13 + apps/web/src/lib/guides/registry.tsx | 28 + apps/web/src/lib/guides/types.ts | 20 + apps/web/src/lib/iconify-api.ts | 241 --- apps/web/src/lib/masks/__tests__/snap.test.ts | 235 +++ apps/web/src/lib/masks/definitions/box-like.ts | 270 +++ apps/web/src/lib/masks/definitions/ellipse.ts | 72 + apps/web/src/lib/masks/definitions/index.ts | 39 + apps/web/src/lib/masks/definitions/rectangle.ts | 94 + apps/web/src/lib/masks/definitions/split.ts | 347 ++++ apps/web/src/lib/masks/geometry.ts | 112 ++ apps/web/src/lib/masks/handle-positions.ts | 382 ++++ apps/web/src/lib/masks/index.ts | 18 + apps/web/src/lib/masks/param-update.ts | 59 + apps/web/src/lib/masks/registry.ts | 70 + .../src/lib/masks/shaders/jfa-distance.frag.glsl | 36 + apps/web/src/lib/masks/snap.ts | 335 ++++ apps/web/src/lib/masks/types.ts | 115 ++ apps/web/src/lib/masks/utils.ts | 64 + apps/web/src/lib/media/audio-mastering.ts | 103 ++ apps/web/src/lib/media/audio.ts | 249 ++- apps/web/src/lib/media/media-utils.ts | 2 +- apps/web/src/lib/media/mediabunny.ts | 132 +- apps/web/src/lib/media/processing.ts | 90 +- apps/web/src/lib/media/types.ts | 9 + apps/web/src/lib/media/upload-toast.ts | 51 + apps/web/src/lib/params.ts | 50 + apps/web/src/lib/preview/element-bounds.ts | 259 +-- apps/web/src/lib/preview/hit-test.ts | 54 +- apps/web/src/lib/preview/preview-coords.ts | 99 +- apps/web/src/lib/preview/preview-snap.ts | 293 +++- apps/web/src/lib/project/types.ts | 53 + apps/web/src/lib/registry.ts | 40 + apps/web/src/lib/rendering.ts | 28 + apps/web/src/lib/retime/__tests__/resolve.test.ts | 61 + apps/web/src/lib/retime/__tests__/split.test.ts | 31 + apps/web/src/lib/retime/audio-stretch.ts | 182 ++ apps/web/src/lib/retime/index.ts | 4 + apps/web/src/lib/retime/presets.ts | 12 + apps/web/src/lib/retime/resolve.ts | 48 + apps/web/src/lib/retime/split.ts | 34 + apps/web/src/lib/scenes.ts | 2 +- apps/web/src/lib/selection/constants.ts | 1 + apps/web/src/lib/selection/context.tsx | 52 + apps/web/src/lib/selection/hit-testing.ts | 50 + apps/web/src/lib/selection/hooks/use-box-select.ts | 170 ++ .../src/lib/selection/hooks/use-selection-scope.ts | 28 + apps/web/src/lib/selection/index.ts | 4 + apps/web/src/lib/selection/scope.ts | 29 + apps/web/src/lib/selection/selectable-item.tsx | 107 ++ apps/web/src/lib/selection/selectable-surface.tsx | 288 ++++ apps/web/src/lib/selection/selection-box.tsx | 50 + apps/web/src/lib/selection/state.ts | 165 ++ apps/web/src/lib/selection/types.ts | 39 + apps/web/src/lib/shaders/jfa-init.frag.glsl | 25 + apps/web/src/lib/shaders/jfa-step.frag.glsl | 60 + apps/web/src/lib/sounds/types.ts | 39 + .../src/lib/stickers/__tests__/sticker-id.test.ts | 14 +- apps/web/src/lib/stickers/index.ts | 230 ++- .../src/lib/stickers/providers/countries-data.ts | 1819 ++++++++++++++++++++ apps/web/src/lib/stickers/providers/emoji.ts | 119 -- apps/web/src/lib/stickers/providers/flags.ts | 97 +- apps/web/src/lib/stickers/providers/icons.ts | 122 -- apps/web/src/lib/stickers/providers/index.ts | 14 +- apps/web/src/lib/stickers/providers/logos.ts | 31 + apps/web/src/lib/stickers/providers/shapes.ts | 160 +- apps/web/src/lib/stickers/registry.ts | 33 +- apps/web/src/lib/stickers/resolver.ts | 8 +- apps/web/src/lib/stickers/types.ts | 79 +- apps/web/src/lib/text/layout.ts | 29 +- apps/web/src/lib/text/measure-element.ts | 132 ++ apps/web/src/lib/time.ts | 6 +- apps/web/src/lib/timeline/audio-constants.ts | 2 + apps/web/src/lib/timeline/audio-state.ts | 100 ++ apps/web/src/lib/timeline/bookmarks.ts | 2 +- apps/web/src/lib/timeline/defaults.ts | 77 + apps/web/src/lib/timeline/drag.ts | 42 + apps/web/src/lib/timeline/drop-utils.ts | 4 +- apps/web/src/lib/timeline/element-utils.ts | 241 +-- apps/web/src/lib/timeline/index.ts | 4 +- apps/web/src/lib/timeline/ripple-utils.ts | 2 +- apps/web/src/lib/timeline/selection-hit-testing.ts | 133 ++ apps/web/src/lib/timeline/snap-utils.ts | 2 +- apps/web/src/lib/timeline/track-element-update.ts | 2 +- apps/web/src/lib/timeline/track-utils.ts | 29 +- apps/web/src/lib/timeline/types.ts | 304 ++++ apps/web/src/lib/transcription/caption.ts | 2 +- apps/web/src/lib/transcription/types.ts | 47 + apps/web/src/services/renderer/effect-preview.ts | 335 ++-- apps/web/src/services/renderer/mask-feather.ts | 54 + .../renderer/nodes/blur-background-node.ts | 149 ++ .../renderer/nodes/composite-effect-node.ts | 77 - .../services/renderer/nodes/effect-layer-node.ts | 29 +- .../src/services/renderer/nodes/graphic-node.ts | 92 + apps/web/src/services/renderer/nodes/image-node.ts | 4 +- .../src/services/renderer/nodes/sticker-node.ts | 20 +- apps/web/src/services/renderer/nodes/text-node.ts | 187 +- apps/web/src/services/renderer/nodes/video-node.ts | 1 + .../web/src/services/renderer/nodes/visual-node.ts | 225 ++- apps/web/src/services/renderer/scene-builder.ts | 122 +- apps/web/src/services/renderer/scene-exporter.ts | 2 +- .../src/services/renderer/webgl-effect-renderer.ts | 73 - apps/web/src/services/renderer/webgl-utils.ts | 298 ---- apps/web/src/services/renderer/webgl/jfa.ts | 194 +++ .../src/services/renderer/webgl/webgl-context.ts | 49 + .../renderer/webgl/webgl-effect-renderer.ts | 35 + .../web/src/services/renderer/webgl/webgl-utils.ts | 298 ++++ .../migrations/__tests__/v15-to-v16.test.ts | 93 + .../migrations/__tests__/v16-to-v17.test.ts | 132 ++ .../migrations/__tests__/v18-to-v19.test.ts | 63 + apps/web/src/services/storage/migrations/index.ts | 22 +- .../storage/migrations/transformers/index.ts | 1 + .../storage/migrations/transformers/v0-to-v1.ts | 13 +- .../storage/migrations/transformers/v1-to-v2.ts | 144 +- .../storage/migrations/transformers/v10-to-v11.ts | 113 ++ .../storage/migrations/transformers/v11-to-v12.ts | 196 +++ .../storage/migrations/transformers/v12-to-v13.ts | 102 ++ .../storage/migrations/transformers/v13-to-v14.ts | 106 ++ .../storage/migrations/transformers/v14-to-v15.ts | 67 + .../storage/migrations/transformers/v15-to-v16.ts | 60 + .../storage/migrations/transformers/v16-to-v17.ts | 107 ++ .../storage/migrations/transformers/v17-to-v18.ts | 105 ++ .../storage/migrations/transformers/v18-to-v19.ts | 46 + .../storage/migrations/transformers/v2-to-v3.ts | 37 +- .../storage/migrations/transformers/v9-to-v10.ts | 21 + .../src/services/storage/migrations/v10-to-v11.ts | 16 + .../src/services/storage/migrations/v11-to-v12.ts | 16 + .../src/services/storage/migrations/v12-to-v13.ts | 16 + .../src/services/storage/migrations/v13-to-v14.ts | 16 + .../src/services/storage/migrations/v14-to-v15.ts | 16 + .../src/services/storage/migrations/v15-to-v16.ts | 16 + .../src/services/storage/migrations/v16-to-v17.ts | 16 + .../src/services/storage/migrations/v17-to-v18.ts | 16 + .../src/services/storage/migrations/v18-to-v19.ts | 16 + .../src/services/storage/migrations/v9-to-v10.ts | 16 + apps/web/src/services/storage/quota.ts | 145 ++ apps/web/src/services/storage/service.ts | 52 +- apps/web/src/services/storage/types.ts | 7 +- apps/web/src/services/transcription/service.ts | 2 +- apps/web/src/services/transcription/worker.ts | 2 +- apps/web/src/stores/editor-store.ts | 2 +- apps/web/src/stores/keybindings-store.ts | 158 +- .../web/src/stores/keybindings/migrations/index.ts | 4 +- .../src/stores/keybindings/migrations/v2-to-v3.ts | 2 +- .../src/stores/keybindings/migrations/v3-to-v4.ts | 4 +- .../src/stores/keybindings/migrations/v4-to-v5.ts | 2 +- .../src/stores/keybindings/migrations/v5-to-v6.ts | 17 + apps/web/src/stores/preview-store.ts | 72 +- apps/web/src/stores/sounds-store.ts | 2 +- apps/web/src/stores/stickers-store.ts | 181 +- apps/web/src/stores/timeline-store.ts | 2 +- apps/web/src/types/animation.ts | 97 -- apps/web/src/types/assets.ts | 9 - apps/web/src/types/blog.ts | 92 - apps/web/src/types/drag.ts | 34 - apps/web/src/types/editor.ts | 1 - apps/web/src/types/effects.ts | 69 - apps/web/src/types/export.ts | 31 - apps/web/src/types/fonts.ts | 24 - apps/web/src/types/keybinding.ts | 79 - apps/web/src/types/language.ts | 4 - apps/web/src/types/project.ts | 51 - apps/web/src/types/rendering.ts | 27 - apps/web/src/types/sounds.ts | 39 - apps/web/src/types/soundtouchjs.d.ts | 14 + apps/web/src/types/stickers.ts | 54 - apps/web/src/types/time.ts | 1 - apps/web/src/types/timeline.ts | 246 --- apps/web/src/types/transcription.ts | 47 - apps/web/src/utils/browser.ts | 14 + apps/web/src/utils/math.ts | 45 + 414 files changed, 26954 insertions(+), 10528 deletions(-) create mode 100644 apps/web/src/components/editor/dialogs/storage-persistence-dialog.tsx create mode 100644 apps/web/src/components/editor/panels/assets/views/base-panel.tsx delete mode 100644 apps/web/src/components/editor/panels/assets/views/base-view.tsx delete mode 100644 apps/web/src/components/editor/panels/assets/views/settings-legacy.tsx delete mode 100644 apps/web/src/components/editor/panels/assets/views/settings.tsx create mode 100644 apps/web/src/components/editor/panels/assets/views/settings/background.tsx create mode 100644 apps/web/src/components/editor/panels/assets/views/settings/index.tsx create mode 100644 apps/web/src/components/editor/panels/preview/guide-overlay.tsx create mode 100644 apps/web/src/components/editor/panels/preview/guide-popover.tsx create mode 100644 apps/web/src/components/editor/panels/preview/handle-primitives.tsx delete mode 100644 apps/web/src/components/editor/panels/preview/layout-guide-overlay.tsx create mode 100644 apps/web/src/components/editor/panels/preview/mask-handles.tsx create mode 100644 apps/web/src/components/editor/panels/preview/preview-viewport.tsx delete mode 100644 apps/web/src/components/editor/panels/properties/audio-properties.tsx delete mode 100644 apps/web/src/components/editor/panels/properties/clip-effects-properties.tsx create mode 100644 apps/web/src/components/editor/panels/properties/components/keyframe-toggle.tsx create mode 100644 apps/web/src/components/editor/panels/properties/components/property-param-field.tsx delete mode 100644 apps/web/src/components/editor/panels/properties/effect-param-field.tsx delete mode 100644 apps/web/src/components/editor/panels/properties/effect-properties.tsx create mode 100644 apps/web/src/components/editor/panels/properties/hooks/use-keyframed-param-property.ts create mode 100644 apps/web/src/components/editor/panels/properties/hooks/use-keyframed-vector-property.ts delete mode 100644 apps/web/src/components/editor/panels/properties/keyframe-toggle.tsx create mode 100644 apps/web/src/components/editor/panels/properties/registry.tsx delete mode 100644 apps/web/src/components/editor/panels/properties/section.tsx delete mode 100644 apps/web/src/components/editor/panels/properties/sections/blending.tsx delete mode 100644 apps/web/src/components/editor/panels/properties/sections/index.tsx delete mode 100644 apps/web/src/components/editor/panels/properties/sections/transform.tsx create mode 100644 apps/web/src/components/editor/panels/properties/stores/properties-store.ts create mode 100644 apps/web/src/components/editor/panels/properties/tabs/audio-tab.tsx create mode 100644 apps/web/src/components/editor/panels/properties/tabs/blending-tab.tsx create mode 100644 apps/web/src/components/editor/panels/properties/tabs/effects-tab.tsx create mode 100644 apps/web/src/components/editor/panels/properties/tabs/graphic-tab.tsx create mode 100644 apps/web/src/components/editor/panels/properties/tabs/masks-tab.tsx create mode 100644 apps/web/src/components/editor/panels/properties/tabs/speed-tab.tsx create mode 100644 apps/web/src/components/editor/panels/properties/tabs/text-tab.tsx create mode 100644 apps/web/src/components/editor/panels/properties/tabs/transform-tab.tsx delete mode 100644 apps/web/src/components/editor/panels/properties/text-properties.tsx delete mode 100644 apps/web/src/components/editor/panels/properties/video-properties.tsx delete mode 100644 apps/web/src/components/editor/selection-box.tsx create mode 100644 apps/web/src/components/section.tsx delete mode 100644 apps/web/src/components/ui/input-with-back.tsx create mode 100644 apps/web/src/components/ui/use-overlay-open-change.ts create mode 100644 apps/web/src/constants/guide-constants.ts create mode 100644 apps/web/src/constants/mask-constants.ts create mode 100644 apps/web/src/constants/retime-constants.ts create mode 100644 apps/web/src/constants/timeline-constants.ts delete mode 100644 apps/web/src/constants/timeline-constants.tsx create mode 100644 apps/web/src/hooks/timeline/use-initial-scroll-bottom.ts delete mode 100644 apps/web/src/hooks/timeline/use-selection-box.ts delete mode 100644 apps/web/src/hooks/use-effect-preview.ts create mode 100644 apps/web/src/hooks/use-element-preview.ts create mode 100644 apps/web/src/hooks/use-font-atlas.ts create mode 100644 apps/web/src/hooks/use-mask-handles.ts create mode 100644 apps/web/src/hooks/use-menu-preview.ts create mode 100644 apps/web/src/hooks/use-resize-observer.ts delete mode 100644 apps/web/src/hooks/use-reveal-item.ts create mode 100644 apps/web/src/hooks/use-storage-persistence.ts create mode 100644 apps/web/src/lib/actions/keybinding.ts delete mode 100644 apps/web/src/lib/animation/__tests__/transform-keyframes.test.ts create mode 100644 apps/web/src/lib/animation/graphic-param-channel.ts create mode 100644 apps/web/src/lib/animation/property-groups.ts create mode 100644 apps/web/src/lib/animation/target-resolver.ts create mode 100644 apps/web/src/lib/animation/types.ts create mode 100644 apps/web/src/lib/animation/vector-channel.ts create mode 100644 apps/web/src/lib/blog/types.ts create mode 100644 apps/web/src/lib/cancel-interaction.ts delete mode 100644 apps/web/src/lib/commands/__tests__/keyframe-aware-commands.test.ts create mode 100644 apps/web/src/lib/commands/timeline/element/masks/index.ts create mode 100644 apps/web/src/lib/commands/timeline/element/masks/remove-mask.ts create mode 100644 apps/web/src/lib/commands/timeline/element/masks/toggle-mask-inverted.ts create mode 100644 apps/web/src/lib/commands/timeline/element/retime/index.ts create mode 100644 apps/web/src/lib/commands/timeline/element/retime/update-element-retime.ts create mode 100644 apps/web/src/lib/effects/types.ts create mode 100644 apps/web/src/lib/fonts/types.ts create mode 100644 apps/web/src/lib/graphics/definitions/ellipse.ts create mode 100644 apps/web/src/lib/graphics/definitions/index.ts create mode 100644 apps/web/src/lib/graphics/definitions/polygon.ts create mode 100644 apps/web/src/lib/graphics/definitions/rectangle.ts create mode 100644 apps/web/src/lib/graphics/definitions/shared.ts create mode 100644 apps/web/src/lib/graphics/definitions/star.ts create mode 100644 apps/web/src/lib/graphics/index.ts create mode 100644 apps/web/src/lib/graphics/registry.ts create mode 100644 apps/web/src/lib/graphics/stroke.ts create mode 100644 apps/web/src/lib/graphics/types.ts create mode 100644 apps/web/src/lib/guides/definitions/custom.tsx create mode 100644 apps/web/src/lib/guides/definitions/grid.tsx create mode 100644 apps/web/src/lib/guides/definitions/platforms.tsx create mode 100644 apps/web/src/lib/guides/definitions/tiktok-layout.tsx create mode 100644 apps/web/src/lib/guides/index.ts create mode 100644 apps/web/src/lib/guides/registry.tsx create mode 100644 apps/web/src/lib/guides/types.ts delete mode 100644 apps/web/src/lib/iconify-api.ts create mode 100644 apps/web/src/lib/masks/__tests__/snap.test.ts create mode 100644 apps/web/src/lib/masks/definitions/box-like.ts create mode 100644 apps/web/src/lib/masks/definitions/ellipse.ts create mode 100644 apps/web/src/lib/masks/definitions/index.ts create mode 100644 apps/web/src/lib/masks/definitions/rectangle.ts create mode 100644 apps/web/src/lib/masks/definitions/split.ts create mode 100644 apps/web/src/lib/masks/geometry.ts create mode 100644 apps/web/src/lib/masks/handle-positions.ts create mode 100644 apps/web/src/lib/masks/index.ts create mode 100644 apps/web/src/lib/masks/param-update.ts create mode 100644 apps/web/src/lib/masks/registry.ts create mode 100644 apps/web/src/lib/masks/shaders/jfa-distance.frag.glsl create mode 100644 apps/web/src/lib/masks/snap.ts create mode 100644 apps/web/src/lib/masks/types.ts create mode 100644 apps/web/src/lib/masks/utils.ts create mode 100644 apps/web/src/lib/media/audio-mastering.ts create mode 100644 apps/web/src/lib/media/types.ts create mode 100644 apps/web/src/lib/media/upload-toast.ts create mode 100644 apps/web/src/lib/params.ts create mode 100644 apps/web/src/lib/project/types.ts create mode 100644 apps/web/src/lib/registry.ts create mode 100644 apps/web/src/lib/rendering.ts create mode 100644 apps/web/src/lib/retime/__tests__/resolve.test.ts create mode 100644 apps/web/src/lib/retime/__tests__/split.test.ts create mode 100644 apps/web/src/lib/retime/audio-stretch.ts create mode 100644 apps/web/src/lib/retime/index.ts create mode 100644 apps/web/src/lib/retime/presets.ts create mode 100644 apps/web/src/lib/retime/resolve.ts create mode 100644 apps/web/src/lib/retime/split.ts create mode 100644 apps/web/src/lib/selection/constants.ts create mode 100644 apps/web/src/lib/selection/context.tsx create mode 100644 apps/web/src/lib/selection/hit-testing.ts create mode 100644 apps/web/src/lib/selection/hooks/use-box-select.ts create mode 100644 apps/web/src/lib/selection/hooks/use-selection-scope.ts create mode 100644 apps/web/src/lib/selection/index.ts create mode 100644 apps/web/src/lib/selection/scope.ts create mode 100644 apps/web/src/lib/selection/selectable-item.tsx create mode 100644 apps/web/src/lib/selection/selectable-surface.tsx create mode 100644 apps/web/src/lib/selection/selection-box.tsx create mode 100644 apps/web/src/lib/selection/state.ts create mode 100644 apps/web/src/lib/selection/types.ts create mode 100644 apps/web/src/lib/shaders/jfa-init.frag.glsl create mode 100644 apps/web/src/lib/shaders/jfa-step.frag.glsl create mode 100644 apps/web/src/lib/sounds/types.ts create mode 100644 apps/web/src/lib/stickers/providers/countries-data.ts delete mode 100644 apps/web/src/lib/stickers/providers/emoji.ts delete mode 100644 apps/web/src/lib/stickers/providers/icons.ts create mode 100644 apps/web/src/lib/stickers/providers/logos.ts create mode 100644 apps/web/src/lib/text/measure-element.ts create mode 100644 apps/web/src/lib/timeline/audio-constants.ts create mode 100644 apps/web/src/lib/timeline/audio-state.ts create mode 100644 apps/web/src/lib/timeline/defaults.ts create mode 100644 apps/web/src/lib/timeline/drag.ts create mode 100644 apps/web/src/lib/timeline/selection-hit-testing.ts create mode 100644 apps/web/src/lib/timeline/types.ts create mode 100644 apps/web/src/lib/transcription/types.ts create mode 100644 apps/web/src/services/renderer/mask-feather.ts create mode 100644 apps/web/src/services/renderer/nodes/blur-background-node.ts delete mode 100644 apps/web/src/services/renderer/nodes/composite-effect-node.ts create mode 100644 apps/web/src/services/renderer/nodes/graphic-node.ts delete mode 100644 apps/web/src/services/renderer/webgl-effect-renderer.ts delete mode 100644 apps/web/src/services/renderer/webgl-utils.ts create mode 100644 apps/web/src/services/renderer/webgl/jfa.ts create mode 100644 apps/web/src/services/renderer/webgl/webgl-context.ts create mode 100644 apps/web/src/services/renderer/webgl/webgl-effect-renderer.ts create mode 100644 apps/web/src/services/renderer/webgl/webgl-utils.ts create mode 100644 apps/web/src/services/storage/migrations/__tests__/v15-to-v16.test.ts create mode 100644 apps/web/src/services/storage/migrations/__tests__/v16-to-v17.test.ts create mode 100644 apps/web/src/services/storage/migrations/__tests__/v18-to-v19.test.ts create mode 100644 apps/web/src/services/storage/migrations/transformers/v10-to-v11.ts create mode 100644 apps/web/src/services/storage/migrations/transformers/v11-to-v12.ts create mode 100644 apps/web/src/services/storage/migrations/transformers/v12-to-v13.ts create mode 100644 apps/web/src/services/storage/migrations/transformers/v13-to-v14.ts create mode 100644 apps/web/src/services/storage/migrations/transformers/v14-to-v15.ts create mode 100644 apps/web/src/services/storage/migrations/transformers/v15-to-v16.ts create mode 100644 apps/web/src/services/storage/migrations/transformers/v16-to-v17.ts create mode 100644 apps/web/src/services/storage/migrations/transformers/v17-to-v18.ts create mode 100644 apps/web/src/services/storage/migrations/transformers/v18-to-v19.ts create mode 100644 apps/web/src/services/storage/migrations/transformers/v9-to-v10.ts create mode 100644 apps/web/src/services/storage/migrations/v10-to-v11.ts create mode 100644 apps/web/src/services/storage/migrations/v11-to-v12.ts create mode 100644 apps/web/src/services/storage/migrations/v12-to-v13.ts create mode 100644 apps/web/src/services/storage/migrations/v13-to-v14.ts create mode 100644 apps/web/src/services/storage/migrations/v14-to-v15.ts create mode 100644 apps/web/src/services/storage/migrations/v15-to-v16.ts create mode 100644 apps/web/src/services/storage/migrations/v16-to-v17.ts create mode 100644 apps/web/src/services/storage/migrations/v17-to-v18.ts create mode 100644 apps/web/src/services/storage/migrations/v18-to-v19.ts create mode 100644 apps/web/src/services/storage/migrations/v9-to-v10.ts create mode 100644 apps/web/src/services/storage/quota.ts create mode 100644 apps/web/src/stores/keybindings/migrations/v5-to-v6.ts delete mode 100644 apps/web/src/types/animation.ts delete mode 100644 apps/web/src/types/assets.ts delete mode 100644 apps/web/src/types/blog.ts delete mode 100644 apps/web/src/types/drag.ts delete mode 100644 apps/web/src/types/editor.ts delete mode 100644 apps/web/src/types/effects.ts delete mode 100644 apps/web/src/types/export.ts delete mode 100644 apps/web/src/types/fonts.ts delete mode 100644 apps/web/src/types/keybinding.ts delete mode 100644 apps/web/src/types/language.ts delete mode 100644 apps/web/src/types/project.ts delete mode 100644 apps/web/src/types/rendering.ts delete mode 100644 apps/web/src/types/sounds.ts create mode 100644 apps/web/src/types/soundtouchjs.d.ts delete mode 100644 apps/web/src/types/stickers.ts delete mode 100644 apps/web/src/types/time.ts delete mode 100644 apps/web/src/types/timeline.ts delete mode 100644 apps/web/src/types/transcription.ts (limited to 'apps/web/src') diff --git a/apps/web/src/app/blog/[slug]/page.tsx b/apps/web/src/app/blog/[slug]/page.tsx index e1afc3a8..90afd919 100644 --- a/apps/web/src/app/blog/[slug]/page.tsx +++ b/apps/web/src/app/blog/[slug]/page.tsx @@ -5,7 +5,7 @@ import { BasePage } from "@/app/base-page"; import Prose from "@/components/ui/prose"; import { Separator } from "@/components/ui/separator"; import { getPosts, getSinglePost, processHtmlContent } from "@/lib/blog/query"; -import type { Author, Post } from "@/types/blog"; +import type { Author, Post } from "@/lib/blog/types"; type PageProps = { params: Promise<{ slug: string }>; diff --git a/apps/web/src/app/blog/page.tsx b/apps/web/src/app/blog/page.tsx index 257a8f23..df0b195d 100644 --- a/apps/web/src/app/blog/page.tsx +++ b/apps/web/src/app/blog/page.tsx @@ -3,7 +3,7 @@ import Link from "next/link"; import { BasePage } from "@/app/base-page"; import { Separator } from "@/components/ui/separator"; import { getPosts } from "@/lib/blog/query"; -import type { Post } from "@/types/blog"; +import type { Post } from "@/lib/blog/types"; export const metadata: Metadata = { title: "Blog - OpenCut", diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css index 6d3e984f..21219427 100644 --- a/apps/web/src/app/globals.css +++ b/apps/web/src/app/globals.css @@ -8,111 +8,111 @@ @plugin "tailwindcss-animate"; :root { - --background: hsl(0, 0%, 100%); - --foreground: hsl(0 0% 11%); - --card: hsl(0, 0%, 100%); - --card-foreground: hsl(0 0% 11%); - --popover: hsl(0, 0%, 100%); - --popover-hover: hsl(0, 0%, 96%); - --popover-foreground: hsl(0 0% 2%); - --primary: #009dff; - --primary-foreground: hsl(0, 0%, 100%); - --secondary: hsl(204, 100%, 97%); - --secondary-border: hsl(204, 100%, 94%); - --secondary-foreground: hsl(200, 98%, 39%); - --muted: hsl(0 0% 85.1%); - --muted-foreground: hsl(0 0% 50%); - --accent: hsl(0, 0%, 96%); - --accent-foreground: hsl(0 0% 2%); - --destructive: hsl(0, 83%, 50%); - --destructive-foreground: hsl(0, 0%, 100%); - --constructive: hsl(141, 71%, 48%); - --constructive-foreground: hsl(0, 0%, 100%); - --border: hsl(0 0% 91%); - --input: hsl(0, 0%, 100%); - --ring: hsl(0, 0%, 55%); - --chart-1: hsl(220 70% 50%); - --chart-2: hsl(160 60% 45%); - --chart-3: hsl(30 80% 55%); - --chart-4: hsl(280 65% 60%); - --chart-5: hsl(340 75% 55%); - --sidebar-background: hsl(0 0% 96.1%); - --sidebar-foreground: hsl(0 0% 2%); - --sidebar-primary: hsl(0 0% 2%); - --sidebar-primary-foreground: hsl(0 0% 91%); - --sidebar-accent: hsl(0 0% 85.1%); - --sidebar-accent-foreground: hsl(0 0% 2%); - --sidebar-border: hsl(0 0% 85.1%); - --sidebar-ring: hsl(0 0% 16.9%); - --sidebar: hsl(0 0% 98%); + --background: hsl(0, 0%, 100%); + --foreground: hsl(0 0% 11%); + --card: hsl(0, 0%, 100%); + --card-foreground: hsl(0 0% 11%); + --popover: hsl(0, 0%, 100%); + --popover-hover: hsl(0, 0%, 96%); + --popover-foreground: hsl(0 0% 2%); + --primary: hsl(200, 90%, 52%); + --primary-foreground: hsl(0, 0%, 100%); + --secondary: hsl(204, 100%, 97%); + --secondary-border: hsl(204, 100%, 94%); + --secondary-foreground: hsl(200, 98%, 39%); + --muted: hsl(0 0% 85.1%); + --muted-foreground: hsl(0 0% 50%); + --accent: hsl(0, 0%, 96%); + --accent-foreground: hsl(0 0% 2%); + --destructive: hsl(0, 83%, 50%); + --destructive-foreground: hsl(0, 0%, 100%); + --constructive: hsl(141, 71%, 48%); + --constructive-foreground: hsl(0, 0%, 100%); + --border: hsl(0 0% 91%); + --input: hsl(0, 0%, 100%); + --ring: hsl(0, 0%, 55%); + --chart-1: hsl(220 70% 50%); + --chart-2: hsl(160 60% 45%); + --chart-3: hsl(30 80% 55%); + --chart-4: hsl(280 65% 60%); + --chart-5: hsl(340 75% 55%); + --sidebar-background: hsl(0 0% 96.1%); + --sidebar-foreground: hsl(0 0% 2%); + --sidebar-primary: hsl(0 0% 2%); + --sidebar-primary-foreground: hsl(0 0% 91%); + --sidebar-accent: hsl(0 0% 85.1%); + --sidebar-accent-foreground: hsl(0 0% 2%); + --sidebar-border: hsl(0 0% 85.1%); + --sidebar-ring: hsl(0 0% 16.9%); + --sidebar: hsl(0 0% 98%); } .panel { - --background: hsl(216 13% 98%); - --foreground: hsl(0 0% 13%); - --card: hsl(0, 0%, 98%); - --card-foreground: hsl(0 0% 13%); - --primary-foreground: hsl(0, 0%, 98%); - --secondary: hsl(204, 100%, 95%); - --secondary-border: hsl(204, 100%, 92%); - --secondary-foreground: hsl(200, 98%, 37%); - --muted: hsl(0 0% 83.1%); - --muted-foreground: hsl(0 0% 48%); - --accent: hsl(0, 0%, 93%); - --accent-foreground: hsl(0 0% 5%); - --destructive-foreground: hsl(0, 0%, 98%); - --constructive-foreground: hsl(0, 0%, 98%); - --border: hsl(0 0% 89%); - --input: hsl(0 0% 93%); - --ring: hsl(0, 0%, 53%); + --background: hsl(210, 20%, 98%); + --foreground: hsl(0 0% 13%); + --card: hsl(0, 0%, 98%); + --card-foreground: hsl(0 0% 13%); + --primary-foreground: hsl(0, 0%, 98%); + --secondary: hsl(204, 100%, 95%); + --secondary-border: hsl(204, 100%, 92%); + --secondary-foreground: hsl(200, 98%, 37%); + --muted: hsl(0 0% 83.1%); + --muted-foreground: hsl(0 0% 48%); + --accent: hsl(0, 0%, 93%); + --accent-foreground: hsl(0 0% 5%); + --destructive-foreground: hsl(0, 0%, 98%); + --constructive-foreground: hsl(0, 0%, 98%); + --border: hsl(0 0% 87%); + --input: hsl(0 0% 93%); + --ring: hsl(0, 0%, 53%); } .dark { - --background: hsl(0, 0%, 5%); - --foreground: hsl(0 0% 87%); - --card: hsl(0, 0%, 5%); - --card-foreground: hsl(0 0% 87%); - --popover: hsl(0, 0%, 5%); - --popover-hover: hsl(0, 0%, 22%); - --popover-foreground: hsl(0 0% 95%); - --secondary: hsl(204, 100%, 12%); - --secondary-border: hsl(204, 100%, 15%); - --secondary-foreground: hsl(200, 98%, 61%); - --muted: hsl(0 0% 20%); - --accent: hsl(0, 0%, 14%); - --accent-foreground: hsl(0 0% 95%); - --border: hsl(0 0% 16%); - --input: hsl(0 0% 5%); - --ring: hsl(0, 0%, 50%); - --sidebar-background: hsl(0 0% 8%); - --sidebar-foreground: hsl(0 0% 95%); - --sidebar-primary: hsl(0 0% 95%); - --sidebar-primary-foreground: hsl(0 0% 15%); - --sidebar-accent: hsl(0 0% 20%); - --sidebar-accent-foreground: hsl(0 0% 95%); - --sidebar-border: hsl(0 0% 20%); - --sidebar-ring: hsl(0 0% 83.1%); - --sidebar: hsl(0 0% 6%); + --background: hsl(0, 0%, 5%); + --foreground: hsl(0 0% 87%); + --card: hsl(0, 0%, 5%); + --card-foreground: hsl(0 0% 87%); + --popover: hsl(0, 0%, 5%); + --popover-hover: hsl(0, 0%, 13%); + --popover-foreground: hsl(0 0% 95%); + --secondary: hsl(204, 100%, 12%); + --secondary-border: hsl(204, 100%, 15%); + --secondary-foreground: hsl(200, 98%, 61%); + --muted: hsl(0 0% 20%); + --accent: hsl(0, 0%, 14%); + --accent-foreground: hsl(0 0% 95%); + --border: hsl(0 0% 16%); + --input: hsl(0 0% 5%); + --ring: hsl(0, 0%, 50%); + --sidebar-background: hsl(0 0% 8%); + --sidebar-foreground: hsl(0 0% 95%); + --sidebar-primary: hsl(0 0% 95%); + --sidebar-primary-foreground: hsl(0 0% 15%); + --sidebar-accent: hsl(0 0% 20%); + --sidebar-accent-foreground: hsl(0 0% 95%); + --sidebar-border: hsl(0 0% 20%); + --sidebar-ring: hsl(0 0% 83.1%); + --sidebar: hsl(0 0% 6%); } .dark .panel { - --background: hsl(0 0% 10%); - --foreground: hsl(0 0% 85%); - --card: hsl(0, 0%, 10%); - --card-foreground: hsl(0 0% 85%); - --secondary: hsl(204, 67%, 9%); - --secondary-border: hsl(204, 100%, 14%); - --secondary-foreground: hsl(200, 98%, 63%); - --muted: hsl(0 0% 22%); - --accent: hsl(0, 0%, 15%); - --accent-foreground: hsl(0 0% 93%); - --border: hsl(0 0% 18%); - --input: hsl(0 0% 22%); - --ring: hsl(0, 0%, 52%); + --background: hsl(0 0% 10%); + --foreground: hsl(0 0% 85%); + --card: hsl(0, 0%, 10%); + --card-foreground: hsl(0 0% 85%); + --secondary: hsl(204, 67%, 9%); + --secondary-border: hsl(204, 100%, 14%); + --secondary-foreground: hsl(200, 98%, 63%); + --muted: hsl(0 0% 22%); + --accent: hsl(0, 0%, 15%); + --accent-foreground: hsl(0 0% 93%); + --border: hsl(0 0% 18%); + --input: hsl(0 0% 22%); + --ring: hsl(0, 0%, 52%); } @layer base { - /* + /* The default border color has changed to `currentcolor` in Tailwind CSS v4, so we've added these compatibility styles to make sure everything still looks the same as it did with Tailwind CSS v3. @@ -120,165 +120,165 @@ If we ever want to remove these styles, we need to add an explicit border color utility to any element that depends on these defaults. */ - *, - ::after, - ::before, - ::backdrop, - ::file-selector-button { - border-color: var(--color-gray-200, currentcolor); - } - /* Other default base styles */ - * { - @apply border-border; - } - body { - @apply bg-background text-foreground; - /* Prevent back/forward swipe */ - overscroll-behavior-x: contain; - } - ::selection { - @apply bg-primary/35 selection:text-primary-foreground; - } + *, + ::after, + ::before, + ::backdrop, + ::file-selector-button { + border-color: var(--color-gray-200, currentcolor); + } + /* Other default base styles */ + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + /* Prevent back/forward swipe */ + overscroll-behavior-x: contain; + } + ::selection { + @apply bg-primary/35 selection:text-primary-foreground; + } } @theme inline { - /* Responsive breakpoints */ - --breakpoint-xs: 30rem; + /* Responsive breakpoints */ + --breakpoint-xs: 30rem; - /* Typography */ - --font-sans: var(--font-inter), sans-serif; + /* Typography */ + --font-sans: var(--font-inter), sans-serif; - /* Font sizes */ - --text-xs: 0.72rem; - --text-sm: 0.79rem; - --text-base: 0.92rem; - --text-base--line-height: calc(1.5 / 0.95); - --text-xs--line-height: calc(1 / 0.8); + /* Font sizes */ + --text-xs: 0.72rem; + --text-sm: 0.79rem; + --text-base: 0.92rem; + --text-base--line-height: calc(1.5 / 0.95); + --text-xs--line-height: calc(1 / 0.8); - /* Border radius */ - --radius-lg: 0.82rem; - --radius-md: 0.65rem; - --radius-sm: 0.35rem; + /* Border radius */ + --radius-lg: 0.82rem; + --radius-md: 0.65rem; + --radius-sm: 0.35rem; - /* Palette mapped to root design tokens */ - --color-background: var(--background); - --color-foreground: var(--foreground); + /* Palette mapped to root design tokens */ + --color-background: var(--background); + --color-foreground: var(--foreground); - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); - --color-popover-hover: var(--popover-hover); - --color-popover-foreground: var(--popover-foreground); + --color-popover: var(--popover); + --color-popover-hover: var(--popover-hover); + --color-popover-foreground: var(--popover-foreground); - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-border: var(--secondary-border); - --color-secondary-foreground: var(--secondary-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-border: var(--secondary-border); + --color-secondary-foreground: var(--secondary-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--accent); - --color-accent-foreground: var(--accent-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); - --color-destructive: var(--destructive); - --color-destructive-foreground: var(--destructive-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); - --color-constructive: var(--constructive); - --color-constructive-foreground: var(--constructive-foreground); + --color-constructive: var(--constructive); + --color-constructive-foreground: var(--constructive-foreground); - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); - /* Chart colors */ - --color-chart-1: var(--chart-1); - --color-chart-2: var(--chart-2); - --color-chart-3: var(--chart-3); - --color-chart-4: var(--chart-4); - --color-chart-5: var(--chart-5); + /* Chart colors */ + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); - /* Sidebar */ - --color-sidebar: var(--sidebar-background); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-ring: var(--sidebar-ring); + /* Sidebar */ + --color-sidebar: var(--sidebar-background); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); - /* Animations */ - --animate-accordion-down: accordion-down 0.2s ease-out; - --animate-accordion-up: accordion-up 0.2s ease-out; + /* Animations */ + --animate-accordion-down: accordion-down 0.2s ease-out; + --animate-accordion-up: accordion-up 0.2s ease-out; - @keyframes accordion-down { - from { - height: 0; - } - to { - height: var(--radix-accordion-content-height); - } - } + @keyframes accordion-down { + from { + height: 0; + } + to { + height: var(--radix-accordion-content-height); + } + } - @keyframes accordion-up { - from { - height: var(--radix-accordion-content-height); - } - to { - height: 0; - } - } + @keyframes accordion-up { + from { + height: var(--radix-accordion-content-height); + } + to { + height: 0; + } + } } @utility scrollbar-hidden { - -ms-overflow-style: none; - scrollbar-width: none; - &::-webkit-scrollbar { - display: none; - } + -ms-overflow-style: none; + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } } @utility scrollbar-x-hidden { - -ms-overflow-style: none; - scrollbar-width: none; - &::-webkit-scrollbar:horizontal { - display: none; - } + -ms-overflow-style: none; + scrollbar-width: none; + &::-webkit-scrollbar:horizontal { + display: none; + } } @utility scrollbar-y-hidden { - -ms-overflow-style: none; - scrollbar-width: none; - &::-webkit-scrollbar:vertical { - display: none; - } + -ms-overflow-style: none; + scrollbar-width: none; + &::-webkit-scrollbar:vertical { + display: none; + } } @utility scrollbar-thin { - &::-webkit-scrollbar { - width: 6px; - height: 8px; - } - &::-webkit-scrollbar-track { - background: transparent; - } - &::-webkit-scrollbar-thumb { - background: var(--border); - border-radius: 4px; - } - &::-webkit-scrollbar-thumb:hover { - background: var(--muted-foreground); - } + &::-webkit-scrollbar { + width: 7px; + height: 7px; + } + &::-webkit-scrollbar-track { + background: transparent; + } + &::-webkit-scrollbar-thumb { + background: var(--border); + border-radius: 4px; + } + &::-webkit-scrollbar-thumb:hover { + background: var(--muted-foreground); + } } @layer base { - * { - @apply border-border outline-ring/50; - } - body { - @apply bg-background text-foreground; - } + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } } diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index c2608bd9..f8e6040f 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -29,11 +29,20 @@ export default function RootLayout({ {process.env.NODE_ENV === "development" && ( -