@fairyhunter13/opentui-core 0.1.114 → 0.1.115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/3d/SpriteResourceManager.d.ts +74 -0
- package/3d/SpriteUtils.d.ts +13 -0
- package/3d/TextureUtils.d.ts +24 -0
- package/3d/ThreeRenderable.d.ts +40 -0
- package/3d/WGPURenderer.d.ts +61 -0
- package/3d/animation/ExplodingSpriteEffect.d.ts +71 -0
- package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +76 -0
- package/3d/animation/SpriteAnimator.d.ts +124 -0
- package/3d/animation/SpriteParticleGenerator.d.ts +62 -0
- package/3d/canvas.d.ts +44 -0
- package/3d/index.d.ts +12 -0
- package/3d/physics/PlanckPhysicsAdapter.d.ts +19 -0
- package/3d/physics/RapierPhysicsAdapter.d.ts +19 -0
- package/3d/physics/physics-interface.d.ts +27 -0
- package/3d.d.ts +2 -0
- package/3d.js +34041 -0
- package/3d.js.map +155 -0
- package/LICENSE +21 -0
- package/NativeSpanFeed.d.ts +41 -0
- package/Renderable.d.ts +334 -0
- package/animation/Timeline.d.ts +126 -0
- package/ansi.d.ts +13 -0
- package/buffer.d.ts +111 -0
- package/console.d.ts +144 -0
- package/edit-buffer.d.ts +98 -0
- package/editor-view.d.ts +73 -0
- package/index-j4m38kjn.js +411 -0
- package/index-j4m38kjn.js.map +10 -0
- package/index-tse8gzh0.js +20614 -0
- package/index-tse8gzh0.js.map +67 -0
- package/index-vv2jcd4r.js +12299 -0
- package/index-vv2jcd4r.js.map +42 -0
- package/index.d.ts +23 -0
- package/index.js +478 -0
- package/index.js.map +9 -0
- package/lib/KeyHandler.d.ts +61 -0
- package/lib/RGBA.d.ts +25 -0
- package/lib/ascii.font.d.ts +508 -0
- package/lib/border.d.ts +51 -0
- package/lib/bunfs.d.ts +7 -0
- package/lib/clipboard.d.ts +17 -0
- package/lib/clock.d.ts +15 -0
- package/lib/data-paths.d.ts +26 -0
- package/lib/debounce.d.ts +42 -0
- package/lib/detect-links.d.ts +6 -0
- package/lib/env.d.ts +42 -0
- package/lib/extmarks-history.d.ts +17 -0
- package/lib/extmarks.d.ts +89 -0
- package/lib/hast-styled-text.d.ts +17 -0
- package/lib/index.d.ts +21 -0
- package/lib/keymapping.d.ts +25 -0
- package/lib/objects-in-viewport.d.ts +24 -0
- package/lib/output.capture.d.ts +24 -0
- package/lib/parse.keypress-kitty.d.ts +2 -0
- package/lib/parse.keypress.d.ts +26 -0
- package/lib/parse.mouse.d.ts +30 -0
- package/lib/paste.d.ts +7 -0
- package/lib/queue.d.ts +15 -0
- package/lib/renderable.validations.d.ts +12 -0
- package/lib/scroll-acceleration.d.ts +43 -0
- package/lib/selection.d.ts +63 -0
- package/lib/singleton.d.ts +7 -0
- package/lib/stdin-parser.d.ts +87 -0
- package/lib/styled-text.d.ts +63 -0
- package/lib/terminal-capability-detection.d.ts +30 -0
- package/lib/terminal-palette.d.ts +50 -0
- package/lib/tree-sitter/assets/update.d.ts +11 -0
- package/lib/tree-sitter/client.d.ts +47 -0
- package/lib/tree-sitter/default-parsers.d.ts +2 -0
- package/lib/tree-sitter/download-utils.d.ts +21 -0
- package/lib/tree-sitter/index.d.ts +8 -0
- package/lib/tree-sitter/parser.worker.d.ts +1 -0
- package/lib/tree-sitter/parsers-config.d.ts +53 -0
- package/lib/tree-sitter/resolve-ft.d.ts +5 -0
- package/lib/tree-sitter/types.d.ts +82 -0
- package/lib/tree-sitter-styled-text.d.ts +14 -0
- package/lib/validate-dir-name.d.ts +1 -0
- package/lib/yoga.options.d.ts +32 -0
- package/package.json +50 -62
- package/parser.worker.js +899 -0
- package/parser.worker.js.map +12 -0
- package/plugins/core-slot.d.ts +72 -0
- package/plugins/registry.d.ts +42 -0
- package/plugins/types.d.ts +34 -0
- package/post/effects.d.ts +147 -0
- package/post/filters.d.ts +65 -0
- package/post/matrices.d.ts +20 -0
- package/renderables/ASCIIFont.d.ts +52 -0
- package/renderables/Box.d.ts +81 -0
- package/renderables/Code.d.ts +78 -0
- package/renderables/Diff.d.ts +142 -0
- package/renderables/EditBufferRenderable.d.ts +237 -0
- package/renderables/FrameBuffer.d.ts +16 -0
- package/renderables/Input.d.ts +67 -0
- package/renderables/LineNumberRenderable.d.ts +78 -0
- package/renderables/Markdown.d.ts +185 -0
- package/renderables/ScrollBar.d.ts +77 -0
- package/renderables/ScrollBox.d.ts +124 -0
- package/renderables/Select.d.ts +115 -0
- package/renderables/Slider.d.ts +47 -0
- package/renderables/TabSelect.d.ts +96 -0
- package/renderables/Text.d.ts +36 -0
- package/renderables/TextBufferRenderable.d.ts +105 -0
- package/renderables/TextNode.d.ts +91 -0
- package/renderables/TextTable.d.ts +140 -0
- package/renderables/Textarea.d.ts +63 -0
- package/renderables/TimeToFirstDraw.d.ts +24 -0
- package/renderables/__tests__/renderable-test-utils.d.ts +12 -0
- package/renderables/composition/VRenderable.d.ts +16 -0
- package/renderables/composition/constructs.d.ts +35 -0
- package/renderables/composition/vnode.d.ts +46 -0
- package/renderables/index.d.ts +23 -0
- package/renderables/markdown-parser.d.ts +10 -0
- package/renderer.d.ts +419 -0
- package/runtime-plugin-support.d.ts +3 -0
- package/runtime-plugin-support.js +29 -0
- package/runtime-plugin-support.js.map +10 -0
- package/runtime-plugin.d.ts +16 -0
- package/runtime-plugin.js +16 -0
- package/runtime-plugin.js.map +9 -0
- package/syntax-style.d.ts +54 -0
- package/testing/manual-clock.d.ts +17 -0
- package/testing/mock-keys.d.ts +81 -0
- package/testing/mock-mouse.d.ts +38 -0
- package/testing/mock-tree-sitter-client.d.ts +23 -0
- package/testing/spy.d.ts +7 -0
- package/testing/test-recorder.d.ts +61 -0
- package/testing/test-renderer.d.ts +23 -0
- package/testing.d.ts +6 -0
- package/testing.js +697 -0
- package/testing.js.map +15 -0
- package/text-buffer-view.d.ts +42 -0
- package/text-buffer.d.ts +67 -0
- package/types.d.ts +139 -0
- package/utils.d.ts +14 -0
- package/zig-structs.d.ts +155 -0
- package/zig.d.ts +353 -0
- package/dev/keypress-debug-renderer.ts +0 -148
- package/dev/keypress-debug.ts +0 -43
- package/dev/print-env-vars.ts +0 -32
- package/dev/test-tmux-graphics-334.sh +0 -68
- package/dev/thai-debug-test.ts +0 -68
- package/docs/development.md +0 -144
- package/scripts/build.ts +0 -400
- package/scripts/publish.ts +0 -60
- package/src/3d/SpriteResourceManager.ts +0 -286
- package/src/3d/SpriteUtils.ts +0 -70
- package/src/3d/TextureUtils.ts +0 -196
- package/src/3d/ThreeRenderable.ts +0 -197
- package/src/3d/WGPURenderer.ts +0 -294
- package/src/3d/animation/ExplodingSpriteEffect.ts +0 -513
- package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +0 -429
- package/src/3d/animation/SpriteAnimator.ts +0 -633
- package/src/3d/animation/SpriteParticleGenerator.ts +0 -435
- package/src/3d/canvas.ts +0 -464
- package/src/3d/index.ts +0 -12
- package/src/3d/physics/PlanckPhysicsAdapter.ts +0 -72
- package/src/3d/physics/RapierPhysicsAdapter.ts +0 -66
- package/src/3d/physics/physics-interface.ts +0 -31
- package/src/3d/shaders/supersampling.wgsl +0 -201
- package/src/3d.ts +0 -3
- package/src/NativeSpanFeed.ts +0 -300
- package/src/Renderable.ts +0 -1704
- package/src/__snapshots__/buffer.test.ts.snap +0 -28
- package/src/animation/Timeline.test.ts +0 -2709
- package/src/animation/Timeline.ts +0 -598
- package/src/ansi.ts +0 -18
- package/src/benchmark/attenuation-benchmark.ts +0 -81
- package/src/benchmark/colormatrix-benchmark.ts +0 -128
- package/src/benchmark/gain-benchmark.ts +0 -80
- package/src/benchmark/latest-all-bench-run.json +0 -707
- package/src/benchmark/latest-async-bench-run.json +0 -336
- package/src/benchmark/latest-default-bench-run.json +0 -657
- package/src/benchmark/latest-large-bench-run.json +0 -707
- package/src/benchmark/latest-quick-bench-run.json +0 -207
- package/src/benchmark/markdown-benchmark.ts +0 -1796
- package/src/benchmark/native-span-feed-async-benchmark.ts +0 -355
- package/src/benchmark/native-span-feed-benchmark.md +0 -56
- package/src/benchmark/native-span-feed-benchmark.ts +0 -596
- package/src/benchmark/native-span-feed-compare.ts +0 -280
- package/src/benchmark/renderer-benchmark.ts +0 -754
- package/src/benchmark/text-table-benchmark.ts +0 -948
- package/src/buffer.test.ts +0 -291
- package/src/buffer.ts +0 -554
- package/src/console.test.ts +0 -612
- package/src/console.ts +0 -1254
- package/src/edit-buffer.test.ts +0 -1769
- package/src/edit-buffer.ts +0 -411
- package/src/editor-view.test.ts +0 -1032
- package/src/editor-view.ts +0 -284
- package/src/examples/ascii-font-selection-demo.ts +0 -245
- package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
- package/src/examples/assets/concrete.png +0 -0
- package/src/examples/assets/crate.png +0 -0
- package/src/examples/assets/crate_emissive.png +0 -0
- package/src/examples/assets/forrest_background.png +0 -0
- package/src/examples/assets/hast-example.json +0 -1018
- package/src/examples/assets/heart.png +0 -0
- package/src/examples/assets/main_char_heavy_attack.png +0 -0
- package/src/examples/assets/main_char_idle.png +0 -0
- package/src/examples/assets/main_char_jump_end.png +0 -0
- package/src/examples/assets/main_char_jump_landing.png +0 -0
- package/src/examples/assets/main_char_jump_start.png +0 -0
- package/src/examples/assets/main_char_run_loop.png +0 -0
- package/src/examples/assets/roughness_map.jpg +0 -0
- package/src/examples/build.ts +0 -115
- package/src/examples/code-demo.ts +0 -924
- package/src/examples/console-demo.ts +0 -358
- package/src/examples/core-plugin-slots-demo.ts +0 -759
- package/src/examples/diff-demo.ts +0 -701
- package/src/examples/draggable-three-demo.ts +0 -259
- package/src/examples/editor-demo.ts +0 -322
- package/src/examples/extmarks-demo.ts +0 -196
- package/src/examples/focus-restore-demo.ts +0 -310
- package/src/examples/fonts.ts +0 -245
- package/src/examples/fractal-shader-demo.ts +0 -268
- package/src/examples/framebuffer-demo.ts +0 -674
- package/src/examples/full-unicode-demo.ts +0 -241
- package/src/examples/golden-star-demo.ts +0 -933
- package/src/examples/grayscale-buffer-demo.ts +0 -249
- package/src/examples/hast-syntax-highlighting-demo.ts +0 -129
- package/src/examples/index.ts +0 -926
- package/src/examples/input-demo.ts +0 -377
- package/src/examples/input-select-layout-demo.ts +0 -425
- package/src/examples/install.sh +0 -143
- package/src/examples/keypress-debug-demo.ts +0 -452
- package/src/examples/lib/HexList.ts +0 -122
- package/src/examples/lib/PaletteGrid.ts +0 -125
- package/src/examples/lib/standalone-keys.ts +0 -25
- package/src/examples/lib/tab-controller.ts +0 -243
- package/src/examples/lights-phong-demo.ts +0 -290
- package/src/examples/link-demo.ts +0 -220
- package/src/examples/live-state-demo.ts +0 -480
- package/src/examples/markdown-demo.ts +0 -725
- package/src/examples/mouse-interaction-demo.ts +0 -428
- package/src/examples/nested-zindex-demo.ts +0 -357
- package/src/examples/opacity-example.ts +0 -235
- package/src/examples/opentui-demo.ts +0 -1057
- package/src/examples/physx-planck-2d-demo.ts +0 -623
- package/src/examples/physx-rapier-2d-demo.ts +0 -655
- package/src/examples/relative-positioning-demo.ts +0 -323
- package/src/examples/scroll-example.ts +0 -214
- package/src/examples/scrollbox-mouse-test.ts +0 -112
- package/src/examples/scrollbox-overlay-hit-test.ts +0 -206
- package/src/examples/select-demo.ts +0 -237
- package/src/examples/shader-cube-demo.ts +0 -1015
- package/src/examples/simple-layout-example.ts +0 -591
- package/src/examples/slider-demo.ts +0 -617
- package/src/examples/split-mode-demo.ts +0 -453
- package/src/examples/sprite-animation-demo.ts +0 -443
- package/src/examples/sprite-particle-generator-demo.ts +0 -486
- package/src/examples/static-sprite-demo.ts +0 -193
- package/src/examples/sticky-scroll-example.ts +0 -308
- package/src/examples/styled-text-demo.ts +0 -282
- package/src/examples/tab-select-demo.ts +0 -219
- package/src/examples/terminal-title.ts +0 -29
- package/src/examples/terminal.ts +0 -305
- package/src/examples/text-node-demo.ts +0 -416
- package/src/examples/text-selection-demo.ts +0 -377
- package/src/examples/text-table-demo.ts +0 -503
- package/src/examples/text-truncation-demo.ts +0 -481
- package/src/examples/text-wrap.ts +0 -757
- package/src/examples/texture-loading-demo.ts +0 -259
- package/src/examples/timeline-example.ts +0 -670
- package/src/examples/transparency-demo.ts +0 -400
- package/src/examples/vnode-composition-demo.ts +0 -404
- package/src/examples/wide-grapheme-overlay-demo.ts +0 -280
- package/src/index.ts +0 -24
- package/src/lib/KeyHandler.integration.test.ts +0 -292
- package/src/lib/KeyHandler.stopPropagation.test.ts +0 -289
- package/src/lib/KeyHandler.test.ts +0 -662
- package/src/lib/KeyHandler.ts +0 -222
- package/src/lib/RGBA.test.ts +0 -984
- package/src/lib/RGBA.ts +0 -204
- package/src/lib/ascii.font.ts +0 -330
- package/src/lib/border.test.ts +0 -83
- package/src/lib/border.ts +0 -170
- package/src/lib/bunfs.test.ts +0 -27
- package/src/lib/bunfs.ts +0 -18
- package/src/lib/clipboard.test.ts +0 -41
- package/src/lib/clipboard.ts +0 -47
- package/src/lib/clock.ts +0 -35
- package/src/lib/data-paths.test.ts +0 -133
- package/src/lib/data-paths.ts +0 -109
- package/src/lib/debounce.ts +0 -106
- package/src/lib/detect-links.test.ts +0 -98
- package/src/lib/detect-links.ts +0 -56
- package/src/lib/env.test.ts +0 -228
- package/src/lib/env.ts +0 -209
- package/src/lib/extmarks-history.ts +0 -51
- package/src/lib/extmarks-multiwidth.test.ts +0 -322
- package/src/lib/extmarks.test.ts +0 -3457
- package/src/lib/extmarks.ts +0 -843
- package/src/lib/fonts/block.json +0 -405
- package/src/lib/fonts/grid.json +0 -265
- package/src/lib/fonts/huge.json +0 -741
- package/src/lib/fonts/pallet.json +0 -314
- package/src/lib/fonts/shade.json +0 -591
- package/src/lib/fonts/slick.json +0 -321
- package/src/lib/fonts/tiny.json +0 -69
- package/src/lib/hast-styled-text.ts +0 -59
- package/src/lib/index.ts +0 -21
- package/src/lib/keymapping.test.ts +0 -317
- package/src/lib/keymapping.ts +0 -115
- package/src/lib/objects-in-viewport.test.ts +0 -787
- package/src/lib/objects-in-viewport.ts +0 -153
- package/src/lib/output.capture.ts +0 -58
- package/src/lib/parse.keypress-kitty.protocol.test.ts +0 -340
- package/src/lib/parse.keypress-kitty.test.ts +0 -663
- package/src/lib/parse.keypress-kitty.ts +0 -439
- package/src/lib/parse.keypress.test.ts +0 -1849
- package/src/lib/parse.keypress.ts +0 -397
- package/src/lib/parse.mouse.test.ts +0 -552
- package/src/lib/parse.mouse.ts +0 -232
- package/src/lib/paste.ts +0 -16
- package/src/lib/queue.ts +0 -65
- package/src/lib/renderable.validations.test.ts +0 -87
- package/src/lib/renderable.validations.ts +0 -83
- package/src/lib/scroll-acceleration.ts +0 -98
- package/src/lib/selection.ts +0 -240
- package/src/lib/singleton.ts +0 -28
- package/src/lib/stdin-parser.test.ts +0 -2290
- package/src/lib/stdin-parser.ts +0 -1810
- package/src/lib/styled-text.ts +0 -178
- package/src/lib/terminal-capability-detection.test.ts +0 -202
- package/src/lib/terminal-capability-detection.ts +0 -79
- package/src/lib/terminal-palette.test.ts +0 -878
- package/src/lib/terminal-palette.ts +0 -383
- package/src/lib/tree-sitter/assets/README.md +0 -118
- package/src/lib/tree-sitter/assets/update.ts +0 -334
- package/src/lib/tree-sitter/assets.d.ts +0 -9
- package/src/lib/tree-sitter/cache.test.ts +0 -273
- package/src/lib/tree-sitter/client.test.ts +0 -1165
- package/src/lib/tree-sitter/client.ts +0 -607
- package/src/lib/tree-sitter/default-parsers.ts +0 -86
- package/src/lib/tree-sitter/download-utils.ts +0 -148
- package/src/lib/tree-sitter/index.ts +0 -28
- package/src/lib/tree-sitter/parser.worker.ts +0 -1042
- package/src/lib/tree-sitter/parsers-config.ts +0 -81
- package/src/lib/tree-sitter/resolve-ft.test.ts +0 -55
- package/src/lib/tree-sitter/resolve-ft.ts +0 -189
- package/src/lib/tree-sitter/types.ts +0 -82
- package/src/lib/tree-sitter-styled-text.test.ts +0 -1253
- package/src/lib/tree-sitter-styled-text.ts +0 -306
- package/src/lib/validate-dir-name.ts +0 -55
- package/src/lib/yoga.options.test.ts +0 -628
- package/src/lib/yoga.options.ts +0 -346
- package/src/plugins/core-slot.ts +0 -579
- package/src/plugins/registry.ts +0 -402
- package/src/plugins/types.ts +0 -46
- package/src/post/effects.ts +0 -930
- package/src/post/filters.ts +0 -489
- package/src/post/matrices.ts +0 -288
- package/src/renderables/ASCIIFont.ts +0 -219
- package/src/renderables/Box.test.ts +0 -205
- package/src/renderables/Box.ts +0 -326
- package/src/renderables/Code.test.ts +0 -2062
- package/src/renderables/Code.ts +0 -357
- package/src/renderables/Diff.regression.test.ts +0 -226
- package/src/renderables/Diff.test.ts +0 -3101
- package/src/renderables/Diff.ts +0 -1211
- package/src/renderables/EditBufferRenderable.test.ts +0 -288
- package/src/renderables/EditBufferRenderable.ts +0 -1166
- package/src/renderables/FrameBuffer.ts +0 -47
- package/src/renderables/Input.test.ts +0 -1228
- package/src/renderables/Input.ts +0 -247
- package/src/renderables/LineNumberRenderable.ts +0 -724
- package/src/renderables/Markdown.ts +0 -1393
- package/src/renderables/ScrollBar.ts +0 -422
- package/src/renderables/ScrollBox.ts +0 -883
- package/src/renderables/Select.test.ts +0 -1033
- package/src/renderables/Select.ts +0 -524
- package/src/renderables/Slider.test.ts +0 -456
- package/src/renderables/Slider.ts +0 -342
- package/src/renderables/TabSelect.test.ts +0 -197
- package/src/renderables/TabSelect.ts +0 -455
- package/src/renderables/Text.selection-buffer.test.ts +0 -123
- package/src/renderables/Text.test.ts +0 -2660
- package/src/renderables/Text.ts +0 -147
- package/src/renderables/TextBufferRenderable.ts +0 -518
- package/src/renderables/TextNode.test.ts +0 -1058
- package/src/renderables/TextNode.ts +0 -325
- package/src/renderables/TextTable.test.ts +0 -1421
- package/src/renderables/TextTable.ts +0 -1344
- package/src/renderables/Textarea.ts +0 -430
- package/src/renderables/TimeToFirstDraw.ts +0 -89
- package/src/renderables/__snapshots__/Code.test.ts.snap +0 -13
- package/src/renderables/__snapshots__/Diff.test.ts.snap +0 -785
- package/src/renderables/__snapshots__/Text.test.ts.snap +0 -421
- package/src/renderables/__snapshots__/TextTable.test.ts.snap +0 -215
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +0 -144
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +0 -816
- package/src/renderables/__tests__/LineNumberRenderable.test.ts +0 -1865
- package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +0 -85
- package/src/renderables/__tests__/Markdown.code-colors.test.ts +0 -242
- package/src/renderables/__tests__/Markdown.test.ts +0 -2518
- package/src/renderables/__tests__/MultiRenderable.selection.test.ts +0 -87
- package/src/renderables/__tests__/Textarea.buffer.test.ts +0 -682
- package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +0 -675
- package/src/renderables/__tests__/Textarea.editing.test.ts +0 -2041
- package/src/renderables/__tests__/Textarea.error-handling.test.ts +0 -35
- package/src/renderables/__tests__/Textarea.events.test.ts +0 -738
- package/src/renderables/__tests__/Textarea.highlights.test.ts +0 -590
- package/src/renderables/__tests__/Textarea.keybinding.test.ts +0 -3149
- package/src/renderables/__tests__/Textarea.paste.test.ts +0 -357
- package/src/renderables/__tests__/Textarea.rendering.test.ts +0 -1866
- package/src/renderables/__tests__/Textarea.scroll.test.ts +0 -733
- package/src/renderables/__tests__/Textarea.selection.test.ts +0 -1590
- package/src/renderables/__tests__/Textarea.stress.test.ts +0 -670
- package/src/renderables/__tests__/Textarea.undo-redo.test.ts +0 -383
- package/src/renderables/__tests__/Textarea.visual-lines.test.ts +0 -310
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +0 -221
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +0 -89
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +0 -457
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +0 -158
- package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +0 -387
- package/src/renderables/__tests__/markdown-parser.test.ts +0 -217
- package/src/renderables/__tests__/renderable-test-utils.ts +0 -60
- package/src/renderables/composition/README.md +0 -8
- package/src/renderables/composition/VRenderable.ts +0 -32
- package/src/renderables/composition/constructs.ts +0 -127
- package/src/renderables/composition/vnode.ts +0 -289
- package/src/renderables/index.ts +0 -23
- package/src/renderables/markdown-parser.ts +0 -66
- package/src/renderer.ts +0 -2681
- package/src/runtime-plugin-support.ts +0 -39
- package/src/runtime-plugin.ts +0 -615
- package/src/syntax-style.test.ts +0 -841
- package/src/syntax-style.ts +0 -257
- package/src/testing/README.md +0 -210
- package/src/testing/capture-spans.test.ts +0 -194
- package/src/testing/integration.test.ts +0 -276
- package/src/testing/manual-clock.ts +0 -117
- package/src/testing/mock-keys.test.ts +0 -1378
- package/src/testing/mock-keys.ts +0 -457
- package/src/testing/mock-mouse.test.ts +0 -218
- package/src/testing/mock-mouse.ts +0 -247
- package/src/testing/mock-tree-sitter-client.ts +0 -73
- package/src/testing/spy.ts +0 -13
- package/src/testing/test-recorder.test.ts +0 -415
- package/src/testing/test-recorder.ts +0 -145
- package/src/testing/test-renderer.ts +0 -132
- package/src/testing.ts +0 -7
- package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +0 -481
- package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +0 -19
- package/src/tests/__snapshots__/scrollbox.test.ts.snap +0 -29
- package/src/tests/absolute-positioning.snapshot.test.ts +0 -638
- package/src/tests/allocator-stats.test.ts +0 -38
- package/src/tests/destroy-during-render.test.ts +0 -200
- package/src/tests/destroy-on-exit.fixture.ts +0 -36
- package/src/tests/destroy-on-exit.test.ts +0 -41
- package/src/tests/hover-cursor.test.ts +0 -98
- package/src/tests/native-span-feed-async.test.ts +0 -173
- package/src/tests/native-span-feed-close.test.ts +0 -120
- package/src/tests/native-span-feed-coverage.test.ts +0 -227
- package/src/tests/native-span-feed-edge-cases.test.ts +0 -352
- package/src/tests/native-span-feed-use-after-free.test.ts +0 -45
- package/src/tests/opacity.test.ts +0 -123
- package/src/tests/renderable.snapshot.test.ts +0 -524
- package/src/tests/renderable.test.ts +0 -1281
- package/src/tests/renderer.clock.test.ts +0 -158
- package/src/tests/renderer.console-startup.test.ts +0 -185
- package/src/tests/renderer.control.test.ts +0 -425
- package/src/tests/renderer.core-slot-binding.test.ts +0 -952
- package/src/tests/renderer.cursor.test.ts +0 -26
- package/src/tests/renderer.destroy-during-render.test.ts +0 -147
- package/src/tests/renderer.focus-restore.test.ts +0 -257
- package/src/tests/renderer.focus.test.ts +0 -294
- package/src/tests/renderer.idle.test.ts +0 -219
- package/src/tests/renderer.input.test.ts +0 -2237
- package/src/tests/renderer.kitty-flags.test.ts +0 -195
- package/src/tests/renderer.mouse.test.ts +0 -1274
- package/src/tests/renderer.palette.test.ts +0 -629
- package/src/tests/renderer.selection.test.ts +0 -49
- package/src/tests/renderer.slot-registry.test.ts +0 -684
- package/src/tests/renderer.useMouse.test.ts +0 -47
- package/src/tests/runtime-plugin-node-modules-cycle.fixture.ts +0 -76
- package/src/tests/runtime-plugin-node-modules-mjs.fixture.ts +0 -43
- package/src/tests/runtime-plugin-node-modules-no-bare-rewrite.fixture.ts +0 -67
- package/src/tests/runtime-plugin-node-modules-package-type-cache.fixture.ts +0 -72
- package/src/tests/runtime-plugin-node-modules-runtime-specifier.fixture.ts +0 -44
- package/src/tests/runtime-plugin-node-modules-scoped-package-bare-rewrite.fixture.ts +0 -85
- package/src/tests/runtime-plugin-path-alias.fixture.ts +0 -43
- package/src/tests/runtime-plugin-resolve-roots.fixture.ts +0 -65
- package/src/tests/runtime-plugin-support.fixture.ts +0 -11
- package/src/tests/runtime-plugin-support.test.ts +0 -19
- package/src/tests/runtime-plugin-windows-file-url.fixture.ts +0 -30
- package/src/tests/runtime-plugin.fixture.ts +0 -40
- package/src/tests/runtime-plugin.test.ts +0 -354
- package/src/tests/scrollbox-culling-bug.test.ts +0 -114
- package/src/tests/scrollbox-hitgrid-resize.test.ts +0 -136
- package/src/tests/scrollbox-hitgrid.test.ts +0 -909
- package/src/tests/scrollbox.test.ts +0 -1530
- package/src/tests/wrap-resize-perf.test.ts +0 -276
- package/src/tests/yoga-setters.test.ts +0 -921
- package/src/text-buffer-view.test.ts +0 -705
- package/src/text-buffer-view.ts +0 -189
- package/src/text-buffer.test.ts +0 -347
- package/src/text-buffer.ts +0 -250
- package/src/types.ts +0 -161
- package/src/utils.ts +0 -88
- package/src/zig/ansi.zig +0 -268
- package/src/zig/bench/README.md +0 -50
- package/src/zig/bench/buffer-draw-text-buffer_bench.zig +0 -887
- package/src/zig/bench/edit-buffer_bench.zig +0 -476
- package/src/zig/bench/native-span-feed_bench.zig +0 -100
- package/src/zig/bench/rope-markers_bench.zig +0 -713
- package/src/zig/bench/rope_bench.zig +0 -514
- package/src/zig/bench/styled-text_bench.zig +0 -470
- package/src/zig/bench/text-buffer-coords_bench.zig +0 -362
- package/src/zig/bench/text-buffer-view_bench.zig +0 -459
- package/src/zig/bench/text-chunk-graphemes_bench.zig +0 -273
- package/src/zig/bench/utf8_bench.zig +0 -799
- package/src/zig/bench-utils.zig +0 -431
- package/src/zig/bench.zig +0 -217
- package/src/zig/buffer-methods.zig +0 -211
- package/src/zig/buffer.zig +0 -2281
- package/src/zig/build.zig +0 -289
- package/src/zig/build.zig.zon +0 -16
- package/src/zig/edit-buffer.zig +0 -825
- package/src/zig/editor-view.zig +0 -802
- package/src/zig/event-bus.zig +0 -13
- package/src/zig/event-emitter.zig +0 -65
- package/src/zig/file-logger.zig +0 -92
- package/src/zig/grapheme.zig +0 -599
- package/src/zig/lib.zig +0 -1854
- package/src/zig/link.zig +0 -333
- package/src/zig/logger.zig +0 -43
- package/src/zig/mem-registry.zig +0 -125
- package/src/zig/native-span-feed-bench-lib.zig +0 -7
- package/src/zig/native-span-feed.zig +0 -708
- package/src/zig/renderer.zig +0 -1393
- package/src/zig/rope.zig +0 -1220
- package/src/zig/syntax-style.zig +0 -161
- package/src/zig/terminal.zig +0 -987
- package/src/zig/test.zig +0 -72
- package/src/zig/tests/README.md +0 -18
- package/src/zig/tests/buffer-methods_test.zig +0 -1109
- package/src/zig/tests/buffer_test.zig +0 -2557
- package/src/zig/tests/edit-buffer-history_test.zig +0 -271
- package/src/zig/tests/edit-buffer_test.zig +0 -1689
- package/src/zig/tests/editor-view_test.zig +0 -3299
- package/src/zig/tests/event-emitter_test.zig +0 -249
- package/src/zig/tests/grapheme_test.zig +0 -1304
- package/src/zig/tests/link_test.zig +0 -190
- package/src/zig/tests/mem-registry_test.zig +0 -473
- package/src/zig/tests/memory_leak_regression_test.zig +0 -159
- package/src/zig/tests/native-span-feed_test.zig +0 -1264
- package/src/zig/tests/renderer_test.zig +0 -1017
- package/src/zig/tests/rope-nested_test.zig +0 -712
- package/src/zig/tests/rope_fuzz_test.zig +0 -238
- package/src/zig/tests/rope_test.zig +0 -2362
- package/src/zig/tests/segment-merge.test.zig +0 -148
- package/src/zig/tests/syntax-style_test.zig +0 -557
- package/src/zig/tests/terminal_test.zig +0 -754
- package/src/zig/tests/text-buffer-drawing_test.zig +0 -3237
- package/src/zig/tests/text-buffer-highlights_test.zig +0 -666
- package/src/zig/tests/text-buffer-iterators_test.zig +0 -776
- package/src/zig/tests/text-buffer-segment_test.zig +0 -320
- package/src/zig/tests/text-buffer-selection_test.zig +0 -1035
- package/src/zig/tests/text-buffer-selection_viewport_test.zig +0 -358
- package/src/zig/tests/text-buffer-view_test.zig +0 -3649
- package/src/zig/tests/text-buffer_test.zig +0 -2191
- package/src/zig/tests/unicode-width-map.zon +0 -3909
- package/src/zig/tests/utf8_no_zwj_test.zig +0 -260
- package/src/zig/tests/utf8_test.zig +0 -4057
- package/src/zig/tests/utf8_wcwidth_cursor_test.zig +0 -267
- package/src/zig/tests/utf8_wcwidth_test.zig +0 -357
- package/src/zig/tests/word-wrap-editing_test.zig +0 -498
- package/src/zig/tests/wrap-cache-perf_test.zig +0 -113
- package/src/zig/text-buffer-iterators.zig +0 -499
- package/src/zig/text-buffer-segment.zig +0 -404
- package/src/zig/text-buffer-view.zig +0 -1371
- package/src/zig/text-buffer.zig +0 -1180
- package/src/zig/utf8.zig +0 -1948
- package/src/zig/utils.zig +0 -9
- package/src/zig-structs.ts +0 -261
- package/src/zig.ts +0 -3884
- package/tsconfig.build.json +0 -24
- package/tsconfig.json +0 -27
- /package/{src/lib/tree-sitter/assets → assets}/javascript/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/javascript/tree-sitter-javascript.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/injections.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/tree-sitter-markdown.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/typescript/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/typescript/tree-sitter-typescript.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/zig/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/zig/tree-sitter-zig.wasm +0 -0
|
@@ -1,883 +0,0 @@
|
|
|
1
|
-
import { type KeyEvent } from "../lib/index.js"
|
|
2
|
-
import { getObjectsInViewport } from "../lib/objects-in-viewport.js"
|
|
3
|
-
import { LinearScrollAccel, MacOSScrollAccel, type ScrollAcceleration } from "../lib/scroll-acceleration.js"
|
|
4
|
-
import type { Renderable, RenderableOptions } from "../Renderable.js"
|
|
5
|
-
import type { MouseEvent } from "../renderer.js"
|
|
6
|
-
import type { RenderContext } from "../types.js"
|
|
7
|
-
import { BoxRenderable, type BoxOptions } from "./Box.js"
|
|
8
|
-
import type { VNode } from "./composition/vnode.js"
|
|
9
|
-
import { ScrollBarRenderable, type ScrollBarOptions, type ScrollUnit } from "./ScrollBar.js"
|
|
10
|
-
|
|
11
|
-
class ContentRenderable extends BoxRenderable {
|
|
12
|
-
private viewport: BoxRenderable
|
|
13
|
-
private _viewportCulling: boolean
|
|
14
|
-
|
|
15
|
-
constructor(
|
|
16
|
-
ctx: RenderContext,
|
|
17
|
-
viewport: BoxRenderable,
|
|
18
|
-
viewportCulling: boolean,
|
|
19
|
-
options: RenderableOptions<BoxRenderable>,
|
|
20
|
-
) {
|
|
21
|
-
super(ctx, options)
|
|
22
|
-
this.viewport = viewport
|
|
23
|
-
this._viewportCulling = viewportCulling
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
get viewportCulling(): boolean {
|
|
27
|
-
return this._viewportCulling
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
set viewportCulling(value: boolean) {
|
|
31
|
-
this._viewportCulling = value
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
protected override _getVisibleChildren(): number[] {
|
|
35
|
-
if (this._viewportCulling) {
|
|
36
|
-
return getObjectsInViewport(this.viewport, this.getChildrenSortedByPrimaryAxis(), this.primaryAxis, 0).map(
|
|
37
|
-
(child) => child.num,
|
|
38
|
-
)
|
|
39
|
-
}
|
|
40
|
-
return this.getChildrenSortedByPrimaryAxis().map((child) => child.num)
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export interface ScrollBoxOptions extends BoxOptions<ScrollBoxRenderable> {
|
|
45
|
-
rootOptions?: BoxOptions
|
|
46
|
-
wrapperOptions?: BoxOptions
|
|
47
|
-
viewportOptions?: BoxOptions
|
|
48
|
-
contentOptions?: BoxOptions
|
|
49
|
-
scrollbarOptions?: Omit<ScrollBarOptions, "orientation">
|
|
50
|
-
verticalScrollbarOptions?: Omit<ScrollBarOptions, "orientation">
|
|
51
|
-
horizontalScrollbarOptions?: Omit<ScrollBarOptions, "orientation">
|
|
52
|
-
stickyScroll?: boolean
|
|
53
|
-
stickyStart?: "bottom" | "top" | "left" | "right"
|
|
54
|
-
scrollX?: boolean
|
|
55
|
-
scrollY?: boolean
|
|
56
|
-
scrollAcceleration?: ScrollAcceleration
|
|
57
|
-
viewportCulling?: boolean
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const SCROLLBOX_PADDING_KEYS = [
|
|
61
|
-
"padding",
|
|
62
|
-
"paddingX",
|
|
63
|
-
"paddingY",
|
|
64
|
-
"paddingTop",
|
|
65
|
-
"paddingRight",
|
|
66
|
-
"paddingBottom",
|
|
67
|
-
"paddingLeft",
|
|
68
|
-
] as const
|
|
69
|
-
|
|
70
|
-
type ScrollBoxPaddingKey = (typeof SCROLLBOX_PADDING_KEYS)[number]
|
|
71
|
-
type ScrollBoxPaddingOptions = Pick<ScrollBoxOptions, ScrollBoxPaddingKey>
|
|
72
|
-
|
|
73
|
-
function pickScrollBoxPadding(options: Partial<ScrollBoxOptions> | undefined): Partial<ScrollBoxPaddingOptions> {
|
|
74
|
-
if (!options) return {}
|
|
75
|
-
|
|
76
|
-
const picked: Partial<ScrollBoxPaddingOptions> = {}
|
|
77
|
-
for (const key of SCROLLBOX_PADDING_KEYS) {
|
|
78
|
-
const value = options[key]
|
|
79
|
-
if (value !== undefined) {
|
|
80
|
-
picked[key] = value
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return picked
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function stripScrollBoxPadding<T extends object>(options: T): Omit<T, ScrollBoxPaddingKey> {
|
|
88
|
-
const sanitized = { ...options }
|
|
89
|
-
for (const key of SCROLLBOX_PADDING_KEYS) {
|
|
90
|
-
delete (sanitized as Partial<Record<ScrollBoxPaddingKey, unknown>>)[key]
|
|
91
|
-
}
|
|
92
|
-
return sanitized as Omit<T, ScrollBoxPaddingKey>
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export class ScrollBoxRenderable extends BoxRenderable {
|
|
96
|
-
static idCounter = 0
|
|
97
|
-
private internalId = 0
|
|
98
|
-
public readonly wrapper: BoxRenderable
|
|
99
|
-
public readonly viewport: BoxRenderable
|
|
100
|
-
public readonly content: ContentRenderable
|
|
101
|
-
public readonly horizontalScrollBar: ScrollBarRenderable
|
|
102
|
-
public readonly verticalScrollBar: ScrollBarRenderable
|
|
103
|
-
|
|
104
|
-
protected override _focusable: boolean = true
|
|
105
|
-
private selectionListener?: () => void
|
|
106
|
-
|
|
107
|
-
private autoScrollMouseX: number = 0
|
|
108
|
-
private autoScrollMouseY: number = 0
|
|
109
|
-
private readonly autoScrollThresholdVertical = 3
|
|
110
|
-
private readonly autoScrollThresholdHorizontal = 3
|
|
111
|
-
private readonly autoScrollSpeedSlow = 6
|
|
112
|
-
private readonly autoScrollSpeedMedium = 36
|
|
113
|
-
private readonly autoScrollSpeedFast = 72
|
|
114
|
-
private isAutoScrolling: boolean = false
|
|
115
|
-
private cachedAutoScrollSpeed: number = 3
|
|
116
|
-
private autoScrollAccumulatorX: number = 0
|
|
117
|
-
private autoScrollAccumulatorY: number = 0
|
|
118
|
-
|
|
119
|
-
private scrollAccumulatorX: number = 0
|
|
120
|
-
private scrollAccumulatorY: number = 0
|
|
121
|
-
|
|
122
|
-
private _stickyScroll: boolean
|
|
123
|
-
private _stickyScrollTop: boolean = false
|
|
124
|
-
private _stickyScrollBottom: boolean = false
|
|
125
|
-
private _stickyScrollLeft: boolean = false
|
|
126
|
-
private _stickyScrollRight: boolean = false
|
|
127
|
-
private _stickyStart?: "bottom" | "top" | "left" | "right"
|
|
128
|
-
private _hasManualScroll: boolean = false
|
|
129
|
-
private _isApplyingStickyScroll: boolean = false
|
|
130
|
-
private scrollAccel: ScrollAcceleration
|
|
131
|
-
|
|
132
|
-
get stickyScroll(): boolean {
|
|
133
|
-
return this._stickyScroll
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
set stickyScroll(value: boolean) {
|
|
137
|
-
this._stickyScroll = value
|
|
138
|
-
this.updateStickyState()
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
get stickyStart(): "bottom" | "top" | "left" | "right" | undefined {
|
|
142
|
-
return this._stickyStart
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
set stickyStart(value: "bottom" | "top" | "left" | "right" | undefined) {
|
|
146
|
-
this._stickyStart = value
|
|
147
|
-
this.updateStickyState()
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
get scrollTop(): number {
|
|
151
|
-
return this.verticalScrollBar.scrollPosition
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
set scrollTop(value: number) {
|
|
155
|
-
this.verticalScrollBar.scrollPosition = value
|
|
156
|
-
if (!this._isApplyingStickyScroll) {
|
|
157
|
-
// Only mark as manual scroll if:
|
|
158
|
-
// 1. We're not at a sticky position after scrolling (prevents programmatic scrolls to sticky edges from disabling sticky)
|
|
159
|
-
// 2. There's actually meaningful scrollable content (prevents accidental scrolls when content is smaller than viewport from disabling sticky)
|
|
160
|
-
// Use a small threshold (>1) to account for rounding/layout quirks
|
|
161
|
-
const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)
|
|
162
|
-
if (!this.isAtStickyPosition() && maxScrollTop > 1) {
|
|
163
|
-
this._hasManualScroll = true
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
this.updateStickyState()
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
get scrollLeft(): number {
|
|
170
|
-
return this.horizontalScrollBar.scrollPosition
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
set scrollLeft(value: number) {
|
|
174
|
-
this.horizontalScrollBar.scrollPosition = value
|
|
175
|
-
if (!this._isApplyingStickyScroll) {
|
|
176
|
-
// Only mark as manual scroll if:
|
|
177
|
-
// 1. We're not at a sticky position after scrolling (prevents programmatic scrolls to sticky edges from disabling sticky)
|
|
178
|
-
// 2. There's actually meaningful scrollable content (prevents accidental scrolls when content is smaller than viewport from disabling sticky)
|
|
179
|
-
// Use a small threshold (>1) to account for rounding/layout quirks
|
|
180
|
-
const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)
|
|
181
|
-
if (!this.isAtStickyPosition() && maxScrollLeft > 1) {
|
|
182
|
-
this._hasManualScroll = true
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
this.updateStickyState()
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
get scrollWidth(): number {
|
|
189
|
-
return this.horizontalScrollBar.scrollSize
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
get scrollHeight(): number {
|
|
193
|
-
return this.verticalScrollBar.scrollSize
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
private updateStickyState(): void {
|
|
197
|
-
if (!this._stickyScroll) return
|
|
198
|
-
|
|
199
|
-
const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)
|
|
200
|
-
const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)
|
|
201
|
-
|
|
202
|
-
if (this.scrollTop <= 0) {
|
|
203
|
-
this._stickyScrollTop = true
|
|
204
|
-
this._stickyScrollBottom = false
|
|
205
|
-
if (
|
|
206
|
-
!this._isApplyingStickyScroll &&
|
|
207
|
-
(this._stickyStart === "top" || (this._stickyStart === "bottom" && maxScrollTop === 0))
|
|
208
|
-
) {
|
|
209
|
-
this._hasManualScroll = false
|
|
210
|
-
}
|
|
211
|
-
} else if (this.scrollTop >= maxScrollTop) {
|
|
212
|
-
this._stickyScrollTop = false
|
|
213
|
-
this._stickyScrollBottom = true
|
|
214
|
-
if (!this._isApplyingStickyScroll && this._stickyStart === "bottom") {
|
|
215
|
-
this._hasManualScroll = false
|
|
216
|
-
}
|
|
217
|
-
} else {
|
|
218
|
-
this._stickyScrollTop = false
|
|
219
|
-
this._stickyScrollBottom = false
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
if (this.scrollLeft <= 0) {
|
|
223
|
-
this._stickyScrollLeft = true
|
|
224
|
-
this._stickyScrollRight = false
|
|
225
|
-
if (
|
|
226
|
-
!this._isApplyingStickyScroll &&
|
|
227
|
-
(this._stickyStart === "left" || (this._stickyStart === "right" && maxScrollLeft === 0))
|
|
228
|
-
) {
|
|
229
|
-
this._hasManualScroll = false
|
|
230
|
-
}
|
|
231
|
-
} else if (this.scrollLeft >= maxScrollLeft) {
|
|
232
|
-
this._stickyScrollLeft = false
|
|
233
|
-
this._stickyScrollRight = true
|
|
234
|
-
if (!this._isApplyingStickyScroll && this._stickyStart === "right") {
|
|
235
|
-
this._hasManualScroll = false
|
|
236
|
-
}
|
|
237
|
-
} else {
|
|
238
|
-
this._stickyScrollLeft = false
|
|
239
|
-
this._stickyScrollRight = false
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
private applyStickyStart(stickyStart: "bottom" | "top" | "left" | "right"): void {
|
|
244
|
-
const wasApplyingStickyScroll = this._isApplyingStickyScroll
|
|
245
|
-
this._isApplyingStickyScroll = true
|
|
246
|
-
try {
|
|
247
|
-
switch (stickyStart) {
|
|
248
|
-
case "top":
|
|
249
|
-
this._stickyScrollTop = true
|
|
250
|
-
this._stickyScrollBottom = false
|
|
251
|
-
this.verticalScrollBar.scrollPosition = 0
|
|
252
|
-
break
|
|
253
|
-
case "bottom":
|
|
254
|
-
this._stickyScrollTop = false
|
|
255
|
-
this._stickyScrollBottom = true
|
|
256
|
-
this.verticalScrollBar.scrollPosition = Math.max(0, this.scrollHeight - this.viewport.height)
|
|
257
|
-
break
|
|
258
|
-
case "left":
|
|
259
|
-
this._stickyScrollLeft = true
|
|
260
|
-
this._stickyScrollRight = false
|
|
261
|
-
this.horizontalScrollBar.scrollPosition = 0
|
|
262
|
-
break
|
|
263
|
-
case "right":
|
|
264
|
-
this._stickyScrollLeft = false
|
|
265
|
-
this._stickyScrollRight = true
|
|
266
|
-
this.horizontalScrollBar.scrollPosition = Math.max(0, this.scrollWidth - this.viewport.width)
|
|
267
|
-
break
|
|
268
|
-
}
|
|
269
|
-
} finally {
|
|
270
|
-
this._isApplyingStickyScroll = wasApplyingStickyScroll
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
constructor(ctx: RenderContext, options: ScrollBoxOptions) {
|
|
275
|
-
const {
|
|
276
|
-
wrapperOptions,
|
|
277
|
-
viewportOptions,
|
|
278
|
-
contentOptions,
|
|
279
|
-
rootOptions,
|
|
280
|
-
scrollbarOptions,
|
|
281
|
-
verticalScrollbarOptions,
|
|
282
|
-
horizontalScrollbarOptions,
|
|
283
|
-
stickyScroll = false,
|
|
284
|
-
stickyStart,
|
|
285
|
-
scrollX = false,
|
|
286
|
-
scrollY = true,
|
|
287
|
-
scrollAcceleration,
|
|
288
|
-
viewportCulling = true,
|
|
289
|
-
...rootBoxOptions
|
|
290
|
-
} = options
|
|
291
|
-
|
|
292
|
-
const forwardedContentPadding = {
|
|
293
|
-
...pickScrollBoxPadding(rootBoxOptions),
|
|
294
|
-
...pickScrollBoxPadding(rootOptions),
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
const sanitizedRootBoxOptions = stripScrollBoxPadding(rootBoxOptions)
|
|
298
|
-
const sanitizedRootOptions = rootOptions ? stripScrollBoxPadding(rootOptions) : undefined
|
|
299
|
-
const mergedContentOptions = {
|
|
300
|
-
...forwardedContentPadding,
|
|
301
|
-
...contentOptions,
|
|
302
|
-
}
|
|
303
|
-
|
|
304
|
-
// Root
|
|
305
|
-
super(ctx, {
|
|
306
|
-
flexDirection: "row",
|
|
307
|
-
alignItems: "stretch",
|
|
308
|
-
...(sanitizedRootBoxOptions as BoxOptions),
|
|
309
|
-
...(sanitizedRootOptions as BoxOptions),
|
|
310
|
-
})
|
|
311
|
-
|
|
312
|
-
this.internalId = ScrollBoxRenderable.idCounter++
|
|
313
|
-
this._stickyScroll = stickyScroll
|
|
314
|
-
this._stickyStart = stickyStart
|
|
315
|
-
this.scrollAccel = scrollAcceleration ?? new LinearScrollAccel()
|
|
316
|
-
|
|
317
|
-
this.wrapper = new BoxRenderable(ctx, {
|
|
318
|
-
flexDirection: "column",
|
|
319
|
-
flexGrow: 1,
|
|
320
|
-
...wrapperOptions,
|
|
321
|
-
id: `scroll-box-wrapper-${this.internalId}`,
|
|
322
|
-
})
|
|
323
|
-
super.add(this.wrapper)
|
|
324
|
-
|
|
325
|
-
this.viewport = new BoxRenderable(ctx, {
|
|
326
|
-
flexDirection: "column",
|
|
327
|
-
flexGrow: 1,
|
|
328
|
-
// NOTE: Overflow scroll makes the content size behave weird
|
|
329
|
-
// when the scrollbox is in a container with max-width/height
|
|
330
|
-
overflow: "hidden",
|
|
331
|
-
onSizeChange: () => {
|
|
332
|
-
this.recalculateBarProps()
|
|
333
|
-
},
|
|
334
|
-
...viewportOptions,
|
|
335
|
-
id: `scroll-box-viewport-${this.internalId}`,
|
|
336
|
-
})
|
|
337
|
-
this.wrapper.add(this.viewport)
|
|
338
|
-
|
|
339
|
-
this.content = new ContentRenderable(ctx, this.viewport, viewportCulling, {
|
|
340
|
-
alignSelf: "flex-start",
|
|
341
|
-
flexShrink: 0,
|
|
342
|
-
...(scrollX ? { minWidth: "100%" } : { minWidth: "100%", maxWidth: "100%" }),
|
|
343
|
-
...(scrollY ? { minHeight: "100%" } : { minHeight: "100%", maxHeight: "100%" }),
|
|
344
|
-
onSizeChange: () => {
|
|
345
|
-
this.recalculateBarProps()
|
|
346
|
-
},
|
|
347
|
-
...mergedContentOptions,
|
|
348
|
-
id: `scroll-box-content-${this.internalId}`,
|
|
349
|
-
})
|
|
350
|
-
this.viewport.add(this.content)
|
|
351
|
-
|
|
352
|
-
this.verticalScrollBar = new ScrollBarRenderable(ctx, {
|
|
353
|
-
...scrollbarOptions,
|
|
354
|
-
...verticalScrollbarOptions,
|
|
355
|
-
arrowOptions: {
|
|
356
|
-
...scrollbarOptions?.arrowOptions,
|
|
357
|
-
...verticalScrollbarOptions?.arrowOptions,
|
|
358
|
-
},
|
|
359
|
-
id: `scroll-box-vertical-scrollbar-${this.internalId}`,
|
|
360
|
-
orientation: "vertical",
|
|
361
|
-
onChange: (position) => {
|
|
362
|
-
this.content.translateY = -position
|
|
363
|
-
if (!this._isApplyingStickyScroll) {
|
|
364
|
-
// Only mark as manual scroll if we're not at a sticky position and there's meaningful scrollable content
|
|
365
|
-
const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)
|
|
366
|
-
if (!this.isAtStickyPosition() && maxScrollTop > 1) {
|
|
367
|
-
this._hasManualScroll = true
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
this.updateStickyState()
|
|
371
|
-
},
|
|
372
|
-
})
|
|
373
|
-
super.add(this.verticalScrollBar)
|
|
374
|
-
|
|
375
|
-
this.horizontalScrollBar = new ScrollBarRenderable(ctx, {
|
|
376
|
-
...scrollbarOptions,
|
|
377
|
-
...horizontalScrollbarOptions,
|
|
378
|
-
arrowOptions: {
|
|
379
|
-
...scrollbarOptions?.arrowOptions,
|
|
380
|
-
...horizontalScrollbarOptions?.arrowOptions,
|
|
381
|
-
},
|
|
382
|
-
id: `scroll-box-horizontal-scrollbar-${this.internalId}`,
|
|
383
|
-
orientation: "horizontal",
|
|
384
|
-
onChange: (position) => {
|
|
385
|
-
this.content.translateX = -position
|
|
386
|
-
if (!this._isApplyingStickyScroll) {
|
|
387
|
-
// Only mark as manual scroll if we're not at a sticky position and there's meaningful scrollable content
|
|
388
|
-
const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)
|
|
389
|
-
if (!this.isAtStickyPosition() && maxScrollLeft > 1) {
|
|
390
|
-
this._hasManualScroll = true
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
this.updateStickyState()
|
|
394
|
-
},
|
|
395
|
-
})
|
|
396
|
-
this.wrapper.add(this.horizontalScrollBar)
|
|
397
|
-
|
|
398
|
-
this.recalculateBarProps()
|
|
399
|
-
|
|
400
|
-
if (stickyStart && stickyScroll) {
|
|
401
|
-
this.applyStickyStart(stickyStart)
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
this.selectionListener = () => {
|
|
405
|
-
const selection = this._ctx.getSelection()
|
|
406
|
-
if (!selection || !selection.isDragging) {
|
|
407
|
-
this.stopAutoScroll()
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
this._ctx.on("selection", this.selectionListener)
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
protected override onUpdate(deltaTime: number): void {
|
|
414
|
-
this.handleAutoScroll(deltaTime)
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
public scrollBy(delta: number | { x: number; y: number }, unit: ScrollUnit = "absolute"): void {
|
|
418
|
-
if (typeof delta === "number") {
|
|
419
|
-
this.verticalScrollBar.scrollBy(delta, unit)
|
|
420
|
-
} else {
|
|
421
|
-
this.verticalScrollBar.scrollBy(delta.y, unit)
|
|
422
|
-
this.horizontalScrollBar.scrollBy(delta.x, unit)
|
|
423
|
-
}
|
|
424
|
-
// Note: scrollBy doesn't need to set _hasManualScroll here because the scrollbar
|
|
425
|
-
// change will trigger the scrollTop setter which handles it
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
public scrollChildIntoView(childId: string): void {
|
|
429
|
-
const child = this.content.findDescendantById(childId)
|
|
430
|
-
if (!child) return
|
|
431
|
-
|
|
432
|
-
const getNearestDelta = (
|
|
433
|
-
elementStart: number,
|
|
434
|
-
elementEnd: number,
|
|
435
|
-
viewportStart: number,
|
|
436
|
-
viewportEnd: number,
|
|
437
|
-
): number => {
|
|
438
|
-
const elementSize = elementEnd - elementStart
|
|
439
|
-
const viewportSize = viewportEnd - viewportStart
|
|
440
|
-
const elementStartOutside = elementStart < viewportStart
|
|
441
|
-
const elementEndOutside = elementEnd > viewportEnd
|
|
442
|
-
|
|
443
|
-
if (elementStartOutside && elementEndOutside) {
|
|
444
|
-
return 0
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
if ((elementStartOutside && elementSize < viewportSize) || (elementEndOutside && elementSize > viewportSize)) {
|
|
448
|
-
return elementStart - viewportStart
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
if ((elementStartOutside && elementSize > viewportSize) || (elementEndOutside && elementSize < viewportSize)) {
|
|
452
|
-
return elementEnd - viewportEnd
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
return 0
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
const childTop = child.y
|
|
459
|
-
const childBottom = child.y + child.height
|
|
460
|
-
const viewportTop = this.viewport.y
|
|
461
|
-
const viewportBottom = this.viewport.y + this.viewport.height
|
|
462
|
-
|
|
463
|
-
const dy = getNearestDelta(childTop, childBottom, viewportTop, viewportBottom)
|
|
464
|
-
|
|
465
|
-
const childLeft = child.x
|
|
466
|
-
const childRight = child.x + child.width
|
|
467
|
-
const viewportLeft = this.viewport.x
|
|
468
|
-
const viewportRight = this.viewport.x + this.viewport.width
|
|
469
|
-
|
|
470
|
-
const dx = getNearestDelta(childLeft, childRight, viewportLeft, viewportRight)
|
|
471
|
-
|
|
472
|
-
if (dx !== 0 || dy !== 0) {
|
|
473
|
-
this.scrollBy({ x: dx, y: dy })
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
public scrollTo(position: number | { x: number; y: number }): void {
|
|
478
|
-
if (typeof position === "number") {
|
|
479
|
-
this.scrollTop = position
|
|
480
|
-
} else {
|
|
481
|
-
this.scrollTop = position.y
|
|
482
|
-
this.scrollLeft = position.x
|
|
483
|
-
}
|
|
484
|
-
// Note: scrollTo doesn't need to set _hasManualScroll here because
|
|
485
|
-
// the scrollTop/scrollLeft setters handle it
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
private isAtStickyPosition(): boolean {
|
|
489
|
-
if (!this._stickyScroll || !this._stickyStart) {
|
|
490
|
-
return false
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)
|
|
494
|
-
const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)
|
|
495
|
-
|
|
496
|
-
switch (this._stickyStart) {
|
|
497
|
-
case "top":
|
|
498
|
-
return this.scrollTop === 0
|
|
499
|
-
case "bottom":
|
|
500
|
-
return this.scrollTop >= maxScrollTop
|
|
501
|
-
case "left":
|
|
502
|
-
return this.scrollLeft === 0
|
|
503
|
-
case "right":
|
|
504
|
-
return this.scrollLeft >= maxScrollLeft
|
|
505
|
-
default:
|
|
506
|
-
return false
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
public override add(obj: Renderable | VNode<any, any[]>, index?: number): number {
|
|
511
|
-
return this.content.add(obj, index)
|
|
512
|
-
}
|
|
513
|
-
|
|
514
|
-
public override insertBefore(obj: Renderable | VNode<any, any[]> | unknown, anchor?: Renderable | unknown): number {
|
|
515
|
-
return this.content.insertBefore(obj, anchor)
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
public override remove(id: string): void {
|
|
519
|
-
this.content.remove(id)
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
public override getChildren(): Renderable[] {
|
|
523
|
-
return this.content.getChildren()
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
protected override onMouseEvent(event: MouseEvent): void {
|
|
527
|
-
if (event.type === "scroll") {
|
|
528
|
-
let dir = event.scroll?.direction
|
|
529
|
-
if (event.modifiers.shift)
|
|
530
|
-
dir = dir === "up" ? "left" : dir === "down" ? "right" : dir === "right" ? "down" : "up"
|
|
531
|
-
|
|
532
|
-
const baseDelta = event.scroll?.delta ?? 0
|
|
533
|
-
const now = Date.now()
|
|
534
|
-
const multiplier = this.scrollAccel.tick(now)
|
|
535
|
-
const scrollAmount = baseDelta * multiplier
|
|
536
|
-
|
|
537
|
-
if (dir === "up") {
|
|
538
|
-
this.scrollAccumulatorY -= scrollAmount
|
|
539
|
-
const integerScroll = Math.trunc(this.scrollAccumulatorY)
|
|
540
|
-
if (integerScroll !== 0) {
|
|
541
|
-
this.scrollTop += integerScroll
|
|
542
|
-
this.scrollAccumulatorY -= integerScroll
|
|
543
|
-
}
|
|
544
|
-
} else if (dir === "down") {
|
|
545
|
-
this.scrollAccumulatorY += scrollAmount
|
|
546
|
-
const integerScroll = Math.trunc(this.scrollAccumulatorY)
|
|
547
|
-
if (integerScroll !== 0) {
|
|
548
|
-
this.scrollTop += integerScroll
|
|
549
|
-
this.scrollAccumulatorY -= integerScroll
|
|
550
|
-
}
|
|
551
|
-
} else if (dir === "left") {
|
|
552
|
-
this.scrollAccumulatorX -= scrollAmount
|
|
553
|
-
const integerScroll = Math.trunc(this.scrollAccumulatorX)
|
|
554
|
-
if (integerScroll !== 0) {
|
|
555
|
-
this.scrollLeft += integerScroll
|
|
556
|
-
this.scrollAccumulatorX -= integerScroll
|
|
557
|
-
}
|
|
558
|
-
} else if (dir === "right") {
|
|
559
|
-
this.scrollAccumulatorX += scrollAmount
|
|
560
|
-
const integerScroll = Math.trunc(this.scrollAccumulatorX)
|
|
561
|
-
if (integerScroll !== 0) {
|
|
562
|
-
this.scrollLeft += integerScroll
|
|
563
|
-
this.scrollAccumulatorX -= integerScroll
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
// Only mark as manual scroll if there's meaningful scrollable content
|
|
568
|
-
const maxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)
|
|
569
|
-
const maxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)
|
|
570
|
-
if (maxScrollTop > 1 || maxScrollLeft > 1) {
|
|
571
|
-
this._hasManualScroll = true
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
if (event.type === "drag" && event.isDragging) {
|
|
576
|
-
this.updateAutoScroll(event.x, event.y)
|
|
577
|
-
} else if (event.type === "up") {
|
|
578
|
-
this.stopAutoScroll()
|
|
579
|
-
}
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
public handleKeyPress(key: KeyEvent): boolean {
|
|
583
|
-
// Let scrollbars handle their own acceleration
|
|
584
|
-
if (this.verticalScrollBar.handleKeyPress(key)) {
|
|
585
|
-
this._hasManualScroll = true
|
|
586
|
-
this.scrollAccel.reset()
|
|
587
|
-
this.resetScrollAccumulators()
|
|
588
|
-
return true
|
|
589
|
-
}
|
|
590
|
-
if (this.horizontalScrollBar.handleKeyPress(key)) {
|
|
591
|
-
this._hasManualScroll = true
|
|
592
|
-
this.scrollAccel.reset()
|
|
593
|
-
this.resetScrollAccumulators()
|
|
594
|
-
return true
|
|
595
|
-
}
|
|
596
|
-
return false
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
private resetScrollAccumulators(): void {
|
|
600
|
-
this.scrollAccumulatorX = 0
|
|
601
|
-
this.scrollAccumulatorY = 0
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
public startAutoScroll(mouseX: number, mouseY: number): void {
|
|
605
|
-
this.stopAutoScroll()
|
|
606
|
-
this.autoScrollMouseX = mouseX
|
|
607
|
-
this.autoScrollMouseY = mouseY
|
|
608
|
-
this.cachedAutoScrollSpeed = this.getAutoScrollSpeed(mouseX, mouseY)
|
|
609
|
-
this.isAutoScrolling = true
|
|
610
|
-
|
|
611
|
-
if (!this.live) {
|
|
612
|
-
this.live = true
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
public updateAutoScroll(mouseX: number, mouseY: number): void {
|
|
617
|
-
this.autoScrollMouseX = mouseX
|
|
618
|
-
this.autoScrollMouseY = mouseY
|
|
619
|
-
|
|
620
|
-
// Cache the speed based on current mouse position
|
|
621
|
-
this.cachedAutoScrollSpeed = this.getAutoScrollSpeed(mouseX, mouseY)
|
|
622
|
-
|
|
623
|
-
const scrollX = this.getAutoScrollDirectionX(mouseX)
|
|
624
|
-
const scrollY = this.getAutoScrollDirectionY(mouseY)
|
|
625
|
-
|
|
626
|
-
if (scrollX === 0 && scrollY === 0) {
|
|
627
|
-
this.stopAutoScroll()
|
|
628
|
-
} else if (!this.isAutoScrolling) {
|
|
629
|
-
this.startAutoScroll(mouseX, mouseY)
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
|
|
633
|
-
public stopAutoScroll(): void {
|
|
634
|
-
const wasAutoScrolling = this.isAutoScrolling
|
|
635
|
-
this.isAutoScrolling = false
|
|
636
|
-
this.autoScrollAccumulatorX = 0
|
|
637
|
-
this.autoScrollAccumulatorY = 0
|
|
638
|
-
|
|
639
|
-
// Only turn off live if no other features need it
|
|
640
|
-
// For now, auto-scroll is the only feature using live, but this could be extended
|
|
641
|
-
if (wasAutoScrolling && !this.hasOtherLiveReasons()) {
|
|
642
|
-
this.live = false
|
|
643
|
-
}
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
private hasOtherLiveReasons(): boolean {
|
|
647
|
-
// Placeholder for future features that might need live mode
|
|
648
|
-
// For now, always return false since auto-scroll is the only user
|
|
649
|
-
return false
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
private handleAutoScroll(deltaTime: number): void {
|
|
653
|
-
if (!this.isAutoScrolling) return
|
|
654
|
-
|
|
655
|
-
const scrollX = this.getAutoScrollDirectionX(this.autoScrollMouseX)
|
|
656
|
-
const scrollY = this.getAutoScrollDirectionY(this.autoScrollMouseY)
|
|
657
|
-
const scrollAmount = this.cachedAutoScrollSpeed * (deltaTime / 1000)
|
|
658
|
-
|
|
659
|
-
let scrolled = false
|
|
660
|
-
|
|
661
|
-
if (scrollX !== 0) {
|
|
662
|
-
this.autoScrollAccumulatorX += scrollX * scrollAmount
|
|
663
|
-
const integerScrollX = Math.trunc(this.autoScrollAccumulatorX)
|
|
664
|
-
if (integerScrollX !== 0) {
|
|
665
|
-
this.scrollLeft += integerScrollX
|
|
666
|
-
this.autoScrollAccumulatorX -= integerScrollX
|
|
667
|
-
scrolled = true
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
if (scrollY !== 0) {
|
|
672
|
-
this.autoScrollAccumulatorY += scrollY * scrollAmount
|
|
673
|
-
const integerScrollY = Math.trunc(this.autoScrollAccumulatorY)
|
|
674
|
-
if (integerScrollY !== 0) {
|
|
675
|
-
this.scrollTop += integerScrollY
|
|
676
|
-
this.autoScrollAccumulatorY -= integerScrollY
|
|
677
|
-
scrolled = true
|
|
678
|
-
}
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
if (scrolled) {
|
|
682
|
-
this._ctx.requestSelectionUpdate()
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
if (scrollX === 0 && scrollY === 0) {
|
|
686
|
-
this.stopAutoScroll()
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
private getAutoScrollDirectionX(mouseX: number): number {
|
|
691
|
-
const relativeX = mouseX - this.x
|
|
692
|
-
const distToLeft = relativeX
|
|
693
|
-
const distToRight = this.width - relativeX
|
|
694
|
-
|
|
695
|
-
if (distToLeft <= this.autoScrollThresholdHorizontal) {
|
|
696
|
-
return this.scrollLeft > 0 ? -1 : 0
|
|
697
|
-
} else if (distToRight <= this.autoScrollThresholdHorizontal) {
|
|
698
|
-
const maxScrollLeft = this.scrollWidth - this.viewport.width
|
|
699
|
-
return this.scrollLeft < maxScrollLeft ? 1 : 0
|
|
700
|
-
}
|
|
701
|
-
return 0
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
private getAutoScrollDirectionY(mouseY: number): number {
|
|
705
|
-
const relativeY = mouseY - this.y
|
|
706
|
-
const distToTop = relativeY
|
|
707
|
-
const distToBottom = this.height - relativeY
|
|
708
|
-
|
|
709
|
-
if (distToTop <= this.autoScrollThresholdVertical) {
|
|
710
|
-
return this.scrollTop > 0 ? -1 : 0
|
|
711
|
-
} else if (distToBottom <= this.autoScrollThresholdVertical) {
|
|
712
|
-
const maxScrollTop = this.scrollHeight - this.viewport.height
|
|
713
|
-
return this.scrollTop < maxScrollTop ? 1 : 0
|
|
714
|
-
}
|
|
715
|
-
return 0
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
private getAutoScrollSpeed(mouseX: number, mouseY: number): number {
|
|
719
|
-
const relativeX = mouseX - this.x
|
|
720
|
-
const relativeY = mouseY - this.y
|
|
721
|
-
|
|
722
|
-
const distToLeft = relativeX
|
|
723
|
-
const distToRight = this.width - relativeX
|
|
724
|
-
const distToTop = relativeY
|
|
725
|
-
const distToBottom = this.height - relativeY
|
|
726
|
-
|
|
727
|
-
const minDistance = Math.min(distToLeft, distToRight, distToTop, distToBottom)
|
|
728
|
-
|
|
729
|
-
if (minDistance <= 1) {
|
|
730
|
-
return this.autoScrollSpeedFast
|
|
731
|
-
} else if (minDistance <= 2) {
|
|
732
|
-
return this.autoScrollSpeedMedium
|
|
733
|
-
} else {
|
|
734
|
-
return this.autoScrollSpeedSlow
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
|
|
738
|
-
private recalculateBarProps(): void {
|
|
739
|
-
// Wrap entire method to prevent scroll changes from being treated as manual
|
|
740
|
-
const wasApplyingStickyScroll = this._isApplyingStickyScroll
|
|
741
|
-
this._isApplyingStickyScroll = true
|
|
742
|
-
|
|
743
|
-
try {
|
|
744
|
-
this.verticalScrollBar.scrollSize = this.content.height
|
|
745
|
-
this.verticalScrollBar.viewportSize = this.viewport.height
|
|
746
|
-
this.horizontalScrollBar.scrollSize = this.content.width
|
|
747
|
-
this.horizontalScrollBar.viewportSize = this.viewport.width
|
|
748
|
-
|
|
749
|
-
if (this._stickyScroll) {
|
|
750
|
-
const newMaxScrollTop = Math.max(0, this.scrollHeight - this.viewport.height)
|
|
751
|
-
const newMaxScrollLeft = Math.max(0, this.scrollWidth - this.viewport.width)
|
|
752
|
-
|
|
753
|
-
if (this._stickyStart && !this._hasManualScroll) {
|
|
754
|
-
this.applyStickyStart(this._stickyStart)
|
|
755
|
-
} else {
|
|
756
|
-
if (this._stickyScrollTop) {
|
|
757
|
-
this.scrollTop = 0
|
|
758
|
-
} else if (this._stickyScrollBottom && newMaxScrollTop > 0) {
|
|
759
|
-
this.scrollTop = newMaxScrollTop
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
if (this._stickyScrollLeft) {
|
|
763
|
-
this.scrollLeft = 0
|
|
764
|
-
} else if (this._stickyScrollRight && newMaxScrollLeft > 0) {
|
|
765
|
-
this.scrollLeft = newMaxScrollLeft
|
|
766
|
-
}
|
|
767
|
-
}
|
|
768
|
-
}
|
|
769
|
-
} finally {
|
|
770
|
-
this._isApplyingStickyScroll = wasApplyingStickyScroll
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
// NOTE: This is obviously a workaround for something,
|
|
774
|
-
// which is that the bar props are recalculated when the viewport is resized,
|
|
775
|
-
// which intially happens onUpdate but is the viewport does not have the correct dimensions yet,
|
|
776
|
-
// then when it does, no update is triggered and when we do we are in the middle of a render,
|
|
777
|
-
// which just ignores the request. ¯\_(ツ)_/¯
|
|
778
|
-
// TODO: Fix this properly. How? Move yoga to native, get all changes for elements in one go
|
|
779
|
-
// and update all renderables in one go before rendering.
|
|
780
|
-
// OR: Move this logic to the viewport. IMHO the wrapper and viewport are overkill and not necessary.
|
|
781
|
-
// The Scrollbox can be the viewport, we are using translations on the content anyway.
|
|
782
|
-
process.nextTick(() => {
|
|
783
|
-
this.requestRender()
|
|
784
|
-
})
|
|
785
|
-
}
|
|
786
|
-
|
|
787
|
-
// Setters for reactive properties
|
|
788
|
-
public set padding(value: number | `${number}%` | null | undefined) {
|
|
789
|
-
this.content.padding = value
|
|
790
|
-
this.requestRender()
|
|
791
|
-
}
|
|
792
|
-
|
|
793
|
-
public set paddingX(value: number | `${number}%` | null | undefined) {
|
|
794
|
-
this.content.paddingX = value
|
|
795
|
-
this.requestRender()
|
|
796
|
-
}
|
|
797
|
-
|
|
798
|
-
public set paddingY(value: number | `${number}%` | null | undefined) {
|
|
799
|
-
this.content.paddingY = value
|
|
800
|
-
this.requestRender()
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
public set paddingTop(value: number | `${number}%` | null | undefined) {
|
|
804
|
-
this.content.paddingTop = value
|
|
805
|
-
this.requestRender()
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
public set paddingRight(value: number | `${number}%` | null | undefined) {
|
|
809
|
-
this.content.paddingRight = value
|
|
810
|
-
this.requestRender()
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
public override set paddingBottom(value: number | `${number}%` | null | undefined) {
|
|
814
|
-
this.content.paddingBottom = value
|
|
815
|
-
this.requestRender()
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
public override set paddingLeft(value: number | `${number}%` | null | undefined) {
|
|
819
|
-
this.content.paddingLeft = value
|
|
820
|
-
this.requestRender()
|
|
821
|
-
}
|
|
822
|
-
|
|
823
|
-
public set rootOptions(options: ScrollBoxOptions["rootOptions"]) {
|
|
824
|
-
Object.assign(this, options)
|
|
825
|
-
this.requestRender()
|
|
826
|
-
}
|
|
827
|
-
|
|
828
|
-
public set wrapperOptions(options: ScrollBoxOptions["wrapperOptions"]) {
|
|
829
|
-
Object.assign(this.wrapper, options)
|
|
830
|
-
this.requestRender()
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
public set viewportOptions(options: ScrollBoxOptions["viewportOptions"]) {
|
|
834
|
-
Object.assign(this.viewport, options)
|
|
835
|
-
this.requestRender()
|
|
836
|
-
}
|
|
837
|
-
|
|
838
|
-
public set contentOptions(options: ScrollBoxOptions["contentOptions"]) {
|
|
839
|
-
Object.assign(this.content, options)
|
|
840
|
-
this.requestRender()
|
|
841
|
-
}
|
|
842
|
-
|
|
843
|
-
public set scrollbarOptions(options: ScrollBoxOptions["scrollbarOptions"]) {
|
|
844
|
-
Object.assign(this.verticalScrollBar, options)
|
|
845
|
-
Object.assign(this.horizontalScrollBar, options)
|
|
846
|
-
this.requestRender()
|
|
847
|
-
}
|
|
848
|
-
|
|
849
|
-
public set verticalScrollbarOptions(options: ScrollBoxOptions["verticalScrollbarOptions"]) {
|
|
850
|
-
Object.assign(this.verticalScrollBar, options)
|
|
851
|
-
this.requestRender()
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
public set horizontalScrollbarOptions(options: ScrollBoxOptions["horizontalScrollbarOptions"]) {
|
|
855
|
-
Object.assign(this.horizontalScrollBar, options)
|
|
856
|
-
this.requestRender()
|
|
857
|
-
}
|
|
858
|
-
|
|
859
|
-
public get scrollAcceleration(): ScrollAcceleration {
|
|
860
|
-
return this.scrollAccel
|
|
861
|
-
}
|
|
862
|
-
|
|
863
|
-
public set scrollAcceleration(value: ScrollAcceleration) {
|
|
864
|
-
this.scrollAccel = value
|
|
865
|
-
}
|
|
866
|
-
|
|
867
|
-
get viewportCulling(): boolean {
|
|
868
|
-
return this.content.viewportCulling
|
|
869
|
-
}
|
|
870
|
-
|
|
871
|
-
set viewportCulling(value: boolean) {
|
|
872
|
-
this.content.viewportCulling = value
|
|
873
|
-
this.requestRender()
|
|
874
|
-
}
|
|
875
|
-
|
|
876
|
-
protected override destroySelf(): void {
|
|
877
|
-
if (this.selectionListener) {
|
|
878
|
-
this._ctx.off("selection", this.selectionListener)
|
|
879
|
-
this.selectionListener = undefined
|
|
880
|
-
}
|
|
881
|
-
super.destroySelf()
|
|
882
|
-
}
|
|
883
|
-
}
|