@benev/tact 0.3.0-5 → 0.4.0-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -55
- package/package.json +20 -21
- package/s/demo/main.bundle.ts +19 -67
- package/s/demo/main.css +4 -3
- package/s/demo/presets.ts +54 -0
- package/s/gamepad/gamepad-app/element.ts +25 -15
- package/s/gamepad/gamepad-app/style.css.ts +5 -1
- package/s/gamepad/index.html.ts +1 -1
- package/s/gamepad/main.css +10 -1
- package/s/index.html.ts +13 -6
- package/s/lib/index.ts +29 -0
- package/s/lib/input/controller.ts +72 -0
- package/s/lib/input/data/endian.ts +3 -0
- package/s/lib/input/data/intent/decode.ts +26 -0
- package/s/lib/input/data/intent/encode.ts +25 -0
- package/s/lib/input/data/intent/sizes.ts +6 -0
- package/s/lib/input/data/intent/types.ts +6 -0
- package/s/lib/input/data/parcel/decode.ts +32 -0
- package/s/lib/input/data/parcel/encode.ts +30 -0
- package/s/lib/input/data/parcel/sizes.ts +5 -0
- package/s/lib/input/data/parcel/types.ts +8 -0
- package/s/lib/input/data/test.ts +23 -0
- package/s/lib/input/decoder.ts +46 -0
- package/s/lib/input/evaluate/context.ts +16 -0
- package/s/lib/input/evaluate/evaluate.ts +229 -0
- package/s/lib/input/expression.ts +44 -0
- package/s/lib/input/investigate/hash-bindings.ts +22 -0
- package/s/lib/input/investigate/investigate.ts +35 -0
- package/s/lib/input/investigate/is-compatible.ts +8 -0
- package/s/lib/input/investigate/is-expression.ts +13 -0
- package/s/lib/input/investigate/make-input.ts +7 -0
- package/s/lib/input/sources/gamepad.ts +49 -0
- package/s/lib/input/sources/keyboard.ts +46 -0
- package/s/lib/input/sources/plain.ts +9 -0
- package/s/lib/input/sources/pointer.ts +38 -0
- package/s/lib/input/sources/sources.ts +24 -0
- package/s/lib/input/sources/stick.ts +32 -0
- package/s/lib/input/test.ts +194 -0
- package/s/lib/input/testing/quickbind.ts +21 -0
- package/s/lib/input/types.ts +48 -0
- package/s/lib/input/utils/clock.ts +14 -0
- package/s/lib/input/utils/mouse-button.ts +5 -0
- package/s/lib/input/utils/sampler.ts +28 -0
- package/s/lib/test.ts +6 -0
- package/s/lib/ui/deck/auto-gamepads.ts +29 -0
- package/s/lib/ui/deck/collector.ts +52 -0
- package/s/lib/ui/deck/controls/controls.ts +76 -0
- package/s/lib/ui/deck/controls/internal/assignments.ts +24 -0
- package/s/lib/ui/deck/controls/internal/data.ts +51 -0
- package/s/lib/ui/deck/controls/internal/fns.ts +38 -0
- package/s/lib/ui/deck/controls/internal/profiles.ts +83 -0
- package/s/lib/ui/deck/controls/types.ts +23 -0
- package/s/lib/ui/deck/hub.ts +108 -0
- package/s/lib/ui/deck/setup/deck.ts +31 -0
- package/s/lib/ui/deck/setup/tact.ts +86 -0
- package/s/lib/ui/deck/setup/types.ts +12 -0
- package/s/lib/ui/deck/types.ts +26 -0
- package/s/lib/ui/deck/utils/first-preset.ts +9 -0
- package/s/lib/ui/icons/akar/LICENSE +23 -0
- package/s/lib/ui/icons/akar/backspace.svg.ts +4 -0
- package/s/lib/ui/icons/akar/circle-plus.svg.ts +4 -0
- package/s/lib/ui/icons/akar/copy.svg.ts +4 -0
- package/s/lib/ui/icons/akar/cross.svg.ts +4 -0
- package/s/lib/ui/icons/akar/devices.svg.ts +4 -0
- package/s/lib/ui/icons/akar/drag-vertical-fill.svg.ts +4 -0
- package/s/lib/ui/icons/akar/game-controller.svg.ts +4 -0
- package/s/lib/ui/icons/akar/key-cap.svg.ts +4 -0
- package/s/lib/ui/icons/akar/people-group.svg.ts +4 -0
- package/s/lib/ui/icons/akar/person-add.svg.ts +4 -0
- package/s/lib/ui/icons/akar/settings-horizontal.svg.ts +4 -0
- package/s/lib/ui/icons/akar/trash-can.svg.ts +4 -0
- package/s/lib/ui/icons/akar/x-small.svg.ts +4 -0
- package/s/lib/ui/views/controllers/style.css.ts +158 -0
- package/s/lib/ui/views/controllers/subviews/controller.ts +53 -0
- package/s/lib/ui/views/controllers/subviews/dropcard.ts +31 -0
- package/s/lib/ui/views/controllers/subviews/player.ts +38 -0
- package/s/lib/ui/views/controllers/view.ts +72 -0
- package/s/lib/ui/views/customize/parts/capture-gamepad-chord.ts +59 -0
- package/s/lib/ui/views/customize/parts/capture-key-chord.ts +70 -0
- package/s/lib/ui/views/customize/parts/capture-pointer-chord.ts +55 -0
- package/s/lib/ui/views/customize/parts/render-bindings.ts +67 -0
- package/s/lib/ui/views/customize/style.css.ts +144 -0
- package/s/lib/ui/views/customize/subviews/expression.ts +88 -0
- package/s/lib/ui/views/customize/subviews/recorder.ts +76 -0
- package/s/lib/ui/views/customize/view.ts +104 -0
- package/s/lib/ui/views/deck/style.css.ts +69 -0
- package/s/lib/ui/views/deck/types.ts +15 -0
- package/s/lib/ui/views/deck/view.ts +49 -0
- package/s/lib/ui/views/profile-select/view.ts +44 -0
- package/s/lib/ui/views/theme.css.ts +115 -0
- package/s/lib/ui/views/visualizer/style.css.ts +23 -0
- package/s/lib/ui/views/visualizer/view.ts +16 -0
- package/s/lib/ui/views/visualizer/visualizer.ts +17 -0
- package/s/lib/utils/ellipsis.ts +7 -0
- package/s/lib/utils/hueify.ts +5 -0
- package/x/demo/main.bundle.js +16 -52
- package/x/demo/main.bundle.js.map +1 -1
- package/x/demo/main.bundle.min.js +766 -93
- package/x/demo/main.bundle.min.js.map +4 -4
- package/x/demo/main.css +4 -3
- package/x/demo/presets.d.ts +30 -0
- package/x/demo/presets.js +51 -0
- package/x/demo/presets.js.map +1 -0
- package/x/gamepad/gamepad-app/element.js +21 -14
- package/x/gamepad/gamepad-app/element.js.map +1 -1
- package/x/gamepad/gamepad-app/style.css.js +5 -1
- package/x/gamepad/gamepad-app/style.css.js.map +1 -1
- package/x/gamepad/index.html +4 -4
- package/x/gamepad/index.html.js +1 -1
- package/x/gamepad/main.bundle.min.js +25 -21
- package/x/gamepad/main.bundle.min.js.map +4 -4
- package/x/gamepad/main.css +10 -1
- package/x/index.html +16 -9
- package/x/index.html.js +13 -6
- package/x/index.html.js.map +1 -1
- package/x/lib/index.d.ts +26 -0
- package/x/lib/index.js +27 -0
- package/x/lib/index.js.map +1 -0
- package/x/lib/input/controller.d.ts +15 -0
- package/x/lib/input/controller.js +55 -0
- package/x/lib/input/controller.js.map +1 -0
- package/x/lib/input/data/endian.d.ts +1 -0
- package/x/lib/input/data/endian.js +2 -0
- package/x/lib/input/data/endian.js.map +1 -0
- package/x/lib/input/data/intent/decode.d.ts +5 -0
- package/x/lib/input/data/intent/decode.js +18 -0
- package/x/lib/input/data/intent/decode.js.map +1 -0
- package/x/lib/input/data/intent/encode.d.ts +2 -0
- package/x/lib/input/data/intent/encode.js +18 -0
- package/x/lib/input/data/intent/encode.js.map +1 -0
- package/x/lib/input/data/intent/sizes.d.ts +4 -0
- package/x/lib/input/data/intent/sizes.js +5 -0
- package/x/lib/input/data/intent/sizes.js.map +1 -0
- package/x/lib/input/data/intent/types.d.ts +4 -0
- package/x/lib/input/data/intent/types.js.map +1 -0
- package/x/lib/input/data/parcel/decode.d.ts +2 -0
- package/x/lib/input/data/parcel/decode.js +22 -0
- package/x/lib/input/data/parcel/decode.js.map +1 -0
- package/x/lib/input/data/parcel/encode.d.ts +2 -0
- package/x/lib/input/data/parcel/encode.js +19 -0
- package/x/lib/input/data/parcel/encode.js.map +1 -0
- package/x/lib/input/data/parcel/sizes.d.ts +3 -0
- package/x/lib/input/data/parcel/sizes.js +4 -0
- package/x/lib/input/data/parcel/sizes.js.map +1 -0
- package/x/lib/input/data/parcel/types.d.ts +5 -0
- package/x/lib/input/data/parcel/types.js.map +1 -0
- package/x/lib/input/data/test.d.ts +6 -0
- package/x/lib/input/data/test.js +19 -0
- package/x/lib/input/data/test.js.map +1 -0
- package/x/lib/input/decoder.d.ts +7 -0
- package/x/lib/input/decoder.js +33 -0
- package/x/lib/input/decoder.js.map +1 -0
- package/x/lib/input/evaluate/context.d.ts +15 -0
- package/x/lib/input/evaluate/context.js +11 -0
- package/x/lib/input/evaluate/context.js.map +1 -0
- package/x/lib/input/evaluate/evaluate.d.ts +3 -0
- package/x/lib/input/evaluate/evaluate.js +175 -0
- package/x/lib/input/evaluate/evaluate.js.map +1 -0
- package/x/lib/input/expression.d.ts +1 -0
- package/x/lib/input/expression.js +2 -0
- package/x/lib/input/expression.js.map +1 -0
- package/x/lib/input/investigate/hash-bindings.d.ts +2 -0
- package/x/lib/input/investigate/hash-bindings.js +17 -0
- package/x/lib/input/investigate/hash-bindings.js.map +1 -0
- package/x/lib/input/investigate/investigate.d.ts +8 -0
- package/x/lib/input/investigate/investigate.js +28 -0
- package/x/lib/input/investigate/investigate.js.map +1 -0
- package/x/lib/input/investigate/is-compatible.d.ts +2 -0
- package/x/lib/input/investigate/is-compatible.js +5 -0
- package/x/lib/input/investigate/is-compatible.js.map +1 -0
- package/x/lib/input/investigate/is-expression.d.ts +3 -0
- package/x/lib/input/investigate/is-expression.js +13 -0
- package/x/lib/input/investigate/is-expression.js.map +1 -0
- package/x/lib/input/investigate/make-input.d.ts +2 -0
- package/x/lib/input/investigate/make-input.js +4 -0
- package/x/lib/input/investigate/make-input.js.map +1 -0
- package/x/lib/input/sources/gamepad.d.ts +9 -0
- package/x/lib/input/sources/gamepad.js +39 -0
- package/x/lib/input/sources/gamepad.js.map +1 -0
- package/x/lib/input/sources/keyboard.d.ts +5 -0
- package/x/lib/input/sources/keyboard.js +36 -0
- package/x/lib/input/sources/keyboard.js.map +1 -0
- package/x/lib/input/sources/plain.d.ts +5 -0
- package/x/lib/input/sources/plain.js +6 -0
- package/x/lib/input/sources/plain.js.map +1 -0
- package/x/lib/input/sources/pointer.d.ts +7 -0
- package/x/lib/input/sources/pointer.js +33 -0
- package/x/lib/input/sources/pointer.js.map +1 -0
- package/x/lib/input/sources/sources.d.ts +7 -0
- package/x/lib/input/sources/sources.js +15 -0
- package/x/lib/input/sources/sources.js.map +1 -0
- package/x/lib/input/sources/stick.d.ts +10 -0
- package/x/lib/input/sources/stick.js +25 -0
- package/x/lib/input/sources/stick.js.map +1 -0
- package/x/lib/input/test.d.ts +18 -0
- package/x/lib/input/test.js +143 -0
- package/x/lib/input/test.js.map +1 -0
- package/x/lib/input/testing/quickbind.d.ts +12 -0
- package/x/lib/input/testing/quickbind.js +13 -0
- package/x/lib/input/testing/quickbind.js.map +1 -0
- package/x/lib/input/types.d.ts +32 -0
- package/x/lib/input/types.js +2 -0
- package/x/lib/input/types.js.map +1 -0
- package/x/lib/input/utils/clock.d.ts +7 -0
- package/x/lib/input/utils/clock.js +14 -0
- package/x/lib/input/utils/clock.js.map +1 -0
- package/x/lib/input/utils/evergreen.js.map +1 -0
- package/x/lib/input/utils/is-down.js.map +1 -0
- package/x/lib/input/utils/mouse-button.d.ts +1 -0
- package/x/lib/input/utils/mouse-button.js +4 -0
- package/x/lib/input/utils/mouse-button.js.map +1 -0
- package/x/lib/input/utils/pad/on-pad.js.map +1 -0
- package/x/lib/input/utils/pad/pad.js.map +1 -0
- package/x/lib/input/utils/sampler.d.ts +7 -0
- package/x/lib/input/utils/sampler.js +23 -0
- package/x/lib/input/utils/sampler.js.map +1 -0
- package/x/lib/input/utils/split-axis.js.map +1 -0
- package/x/lib/test.d.ts +1 -0
- package/x/lib/test.js +4 -0
- package/x/lib/test.js.map +1 -0
- package/x/lib/ui/deck/auto-gamepads.d.ts +4 -0
- package/x/lib/ui/deck/auto-gamepads.js +19 -0
- package/x/lib/ui/deck/auto-gamepads.js.map +1 -0
- package/x/lib/ui/deck/collector.d.ts +13 -0
- package/x/lib/ui/deck/collector.js +35 -0
- package/x/lib/ui/deck/collector.js.map +1 -0
- package/x/lib/ui/deck/controls/controls.d.ts +19 -0
- package/x/lib/ui/deck/controls/controls.js +56 -0
- package/x/lib/ui/deck/controls/controls.js.map +1 -0
- package/x/lib/ui/deck/controls/internal/assignments.d.ts +9 -0
- package/x/lib/ui/deck/controls/internal/assignments.js +16 -0
- package/x/lib/ui/deck/controls/internal/assignments.js.map +1 -0
- package/x/lib/ui/deck/controls/internal/data.d.ts +29 -0
- package/x/lib/ui/deck/controls/internal/data.js +29 -0
- package/x/lib/ui/deck/controls/internal/data.js.map +1 -0
- package/x/lib/ui/deck/controls/internal/fns.d.ts +6 -0
- package/x/lib/ui/deck/controls/internal/fns.js +19 -0
- package/x/lib/ui/deck/controls/internal/fns.js.map +1 -0
- package/x/lib/ui/deck/controls/internal/profiles.d.ts +18 -0
- package/x/lib/ui/deck/controls/internal/profiles.js +59 -0
- package/x/lib/ui/deck/controls/internal/profiles.js.map +1 -0
- package/x/lib/ui/deck/controls/types.d.ts +17 -0
- package/x/lib/ui/deck/controls/types.js +2 -0
- package/x/lib/ui/deck/controls/types.js.map +1 -0
- package/x/lib/ui/deck/hub.d.ts +21 -0
- package/x/lib/ui/deck/hub.js +85 -0
- package/x/lib/ui/deck/hub.js.map +1 -0
- package/x/lib/ui/deck/setup/deck.d.ts +3 -0
- package/x/lib/ui/deck/setup/deck.js +20 -0
- package/x/lib/ui/deck/setup/deck.js.map +1 -0
- package/x/lib/ui/deck/setup/tact.d.ts +17 -0
- package/x/lib/ui/deck/setup/tact.js +67 -0
- package/x/lib/ui/deck/setup/tact.js.map +1 -0
- package/x/lib/ui/deck/setup/types.d.ts +9 -0
- package/x/lib/ui/deck/setup/types.js +2 -0
- package/x/lib/ui/deck/setup/types.js.map +1 -0
- package/x/lib/ui/deck/types.d.ts +18 -0
- package/x/lib/ui/deck/types.js +3 -0
- package/x/lib/ui/deck/types.js.map +1 -0
- package/x/lib/ui/deck/utils/first-preset.d.ts +6 -0
- package/x/lib/ui/deck/utils/first-preset.js +5 -0
- package/x/lib/ui/deck/utils/first-preset.js.map +1 -0
- package/x/lib/ui/icons/akar/backspace.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/backspace.svg.js +3 -0
- package/x/lib/ui/icons/akar/backspace.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/circle-plus.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/circle-plus.svg.js +3 -0
- package/x/lib/ui/icons/akar/circle-plus.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/copy.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/copy.svg.js +3 -0
- package/x/lib/ui/icons/akar/copy.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/cross.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/cross.svg.js +3 -0
- package/x/lib/ui/icons/akar/cross.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/devices.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/devices.svg.js +3 -0
- package/x/lib/ui/icons/akar/devices.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/drag-vertical-fill.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/drag-vertical-fill.svg.js +3 -0
- package/x/lib/ui/icons/akar/drag-vertical-fill.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/game-controller.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/game-controller.svg.js +3 -0
- package/x/lib/ui/icons/akar/game-controller.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/key-cap.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/key-cap.svg.js +3 -0
- package/x/lib/ui/icons/akar/key-cap.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/people-group.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/people-group.svg.js +3 -0
- package/x/lib/ui/icons/akar/people-group.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/person-add.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/person-add.svg.js +3 -0
- package/x/lib/ui/icons/akar/person-add.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/settings-horizontal.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/settings-horizontal.svg.js +3 -0
- package/x/lib/ui/icons/akar/settings-horizontal.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/trash-can.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/trash-can.svg.js +3 -0
- package/x/lib/ui/icons/akar/trash-can.svg.js.map +1 -0
- package/x/lib/ui/icons/akar/x-small.svg.d.ts +2 -0
- package/x/lib/ui/icons/akar/x-small.svg.js +3 -0
- package/x/lib/ui/icons/akar/x-small.svg.js.map +1 -0
- package/x/lib/ui/views/controllers/style.css.js +157 -0
- package/x/lib/ui/views/controllers/style.css.js.map +1 -0
- package/x/lib/ui/views/controllers/subviews/controller.d.ts +3 -0
- package/x/lib/ui/views/controllers/subviews/controller.js +45 -0
- package/x/lib/ui/views/controllers/subviews/controller.js.map +1 -0
- package/x/lib/ui/views/controllers/subviews/dropcard.d.ts +9 -0
- package/x/lib/ui/views/controllers/subviews/dropcard.js +20 -0
- package/x/lib/ui/views/controllers/subviews/dropcard.js.map +1 -0
- package/x/lib/ui/views/controllers/subviews/player.d.ts +2 -0
- package/x/lib/ui/views/controllers/subviews/player.js +32 -0
- package/x/lib/ui/views/controllers/subviews/player.js.map +1 -0
- package/x/lib/ui/views/controllers/view.d.ts +2 -0
- package/x/lib/ui/views/controllers/view.js +64 -0
- package/x/lib/ui/views/controllers/view.js.map +1 -0
- package/x/lib/ui/views/customize/parts/capture-gamepad-chord.d.ts +2 -0
- package/x/lib/ui/views/customize/parts/capture-gamepad-chord.js +46 -0
- package/x/lib/ui/views/customize/parts/capture-gamepad-chord.js.map +1 -0
- package/x/lib/ui/views/customize/parts/capture-key-chord.d.ts +2 -0
- package/x/lib/ui/views/customize/parts/capture-key-chord.js +58 -0
- package/x/lib/ui/views/customize/parts/capture-key-chord.js.map +1 -0
- package/x/lib/ui/views/customize/parts/capture-pointer-chord.d.ts +2 -0
- package/x/lib/ui/views/customize/parts/capture-pointer-chord.js +42 -0
- package/x/lib/ui/views/customize/parts/capture-pointer-chord.js.map +1 -0
- package/x/lib/ui/views/customize/parts/render-bindings.d.ts +3 -0
- package/x/lib/ui/views/customize/parts/render-bindings.js +32 -0
- package/x/lib/ui/views/customize/parts/render-bindings.js.map +1 -0
- package/x/lib/ui/views/customize/style.css.js +143 -0
- package/x/lib/ui/views/customize/style.css.js.map +1 -0
- package/x/lib/ui/views/customize/subviews/expression.d.ts +2 -0
- package/x/lib/ui/views/customize/subviews/expression.js +75 -0
- package/x/lib/ui/views/customize/subviews/expression.js.map +1 -0
- package/x/lib/ui/views/customize/subviews/recorder.d.ts +3 -0
- package/x/lib/ui/views/customize/subviews/recorder.js +60 -0
- package/x/lib/ui/views/customize/subviews/recorder.js.map +1 -0
- package/x/lib/ui/views/customize/view.d.ts +6 -0
- package/x/lib/ui/views/customize/view.js +82 -0
- package/x/lib/ui/views/customize/view.js.map +1 -0
- package/x/lib/ui/views/deck/style.css.d.ts +2 -0
- package/x/lib/ui/views/deck/style.css.js +68 -0
- package/x/lib/ui/views/deck/style.css.js.map +1 -0
- package/x/lib/ui/views/deck/types.d.ts +14 -0
- package/x/lib/ui/views/deck/types.js +2 -0
- package/x/lib/ui/views/deck/types.js.map +1 -0
- package/x/lib/ui/views/deck/view.d.ts +2 -0
- package/x/lib/ui/views/deck/view.js +41 -0
- package/x/lib/ui/views/deck/view.js.map +1 -0
- package/x/lib/ui/views/profile-select/view.d.ts +4 -0
- package/x/lib/ui/views/profile-select/view.js +34 -0
- package/x/lib/ui/views/profile-select/view.js.map +1 -0
- package/x/lib/ui/views/theme.css.d.ts +2 -0
- package/x/lib/ui/views/theme.css.js +113 -0
- package/x/lib/ui/views/theme.css.js.map +1 -0
- package/x/lib/ui/views/visualizer/style.css.d.ts +2 -0
- package/x/lib/ui/views/visualizer/style.css.js +22 -0
- package/x/lib/ui/views/visualizer/style.css.js.map +1 -0
- package/x/lib/ui/views/visualizer/view.d.ts +2 -0
- package/x/lib/ui/views/visualizer/view.js +11 -0
- package/x/lib/ui/views/visualizer/view.js.map +1 -0
- package/x/lib/ui/views/visualizer/visualizer.d.ts +5 -0
- package/x/lib/ui/views/visualizer/visualizer.js +13 -0
- package/x/lib/ui/views/visualizer/visualizer.js.map +1 -0
- package/x/lib/utils/ellipsis.d.ts +1 -0
- package/x/lib/utils/ellipsis.js +6 -0
- package/x/lib/utils/ellipsis.js.map +1 -0
- package/x/lib/utils/hueify.d.ts +1 -0
- package/x/lib/utils/hueify.js +4 -0
- package/x/lib/utils/hueify.js.map +1 -0
- package/x/lib/utils/make-id.js.map +1 -0
- package/s/_archive/README.md +0 -435
- package/s/_archive/core/bindings/action.ts +0 -30
- package/s/_archive/core/bindings/parts/defaults.ts +0 -32
- package/s/_archive/core/bindings/parts/is-pressed.ts +0 -5
- package/s/_archive/core/bindings/parts/lens-algo.ts +0 -84
- package/s/_archive/core/bindings/parts/lookup-proxies.ts +0 -17
- package/s/_archive/core/bindings/resolver.ts +0 -103
- package/s/_archive/core/bindings/sample-map.ts +0 -25
- package/s/_archive/core/bindings/types.ts +0 -60
- package/s/_archive/core/core.test.ts +0 -155
- package/s/_archive/core/devices/auto-gamepads.ts +0 -8
- package/s/_archive/core/devices/device.ts +0 -12
- package/s/_archive/core/devices/infra/group.ts +0 -24
- package/s/_archive/core/devices/infra/sampler.ts +0 -22
- package/s/_archive/core/devices/standard/gamepad.ts +0 -83
- package/s/_archive/core/devices/standard/index.ts +0 -8
- package/s/_archive/core/devices/standard/keyboard.ts +0 -31
- package/s/_archive/core/devices/standard/pointer.ts +0 -97
- package/s/_archive/core/devices/standard/primary.ts +0 -20
- package/s/_archive/core/devices/standard/stick.ts +0 -27
- package/s/_archive/core/devices/standard/vpad.ts +0 -25
- package/s/_archive/core/devices/types.ts +0 -3
- package/s/_archive/core/hub/hub.ts +0 -118
- package/s/_archive/core/hub/meta-bindings.ts +0 -23
- package/s/_archive/core/hub/parts/connected.ts +0 -15
- package/s/_archive/core/hub/port.ts +0 -26
- package/s/_archive/core/hub/types.ts +0 -13
- package/s/_archive/core/index.ts +0 -19
- package/s/_archive/core/testing/testing.ts +0 -57
- package/s/_archive/deck/deck.ts +0 -69
- package/s/_archive/deck/index.ts +0 -13
- package/s/_archive/deck/parts/catalog.ts +0 -58
- package/s/_archive/deck/parts/db.ts +0 -65
- package/s/_archive/deck/parts/device-skins/device-icons.ts +0 -38
- package/s/_archive/deck/parts/device-skins/device-skin.ts +0 -29
- package/s/_archive/deck/parts/local-storage-kv.ts +0 -8
- package/s/_archive/deck/parts/merge-bindings.ts +0 -21
- package/s/_archive/deck/parts/overlay-visibility.ts +0 -49
- package/s/_archive/deck/views/bindings/style.css.ts +0 -6
- package/s/_archive/deck/views/bindings/view.ts +0 -95
- package/s/_archive/deck/views/overlay/style.css.ts +0 -110
- package/s/_archive/deck/views/overlay/view.ts +0 -46
- package/s/_archive/demo/game/game.ts +0 -85
- package/s/_archive/demo/game/parts/agent.ts +0 -10
- package/s/_archive/demo/game/parts/game-bindings.ts +0 -20
- package/s/_archive/demo/game/parts/logic.ts +0 -24
- package/s/_archive/demo/game/parts/player.ts +0 -32
- package/s/_archive/demo/game/parts/renderer.ts +0 -112
- package/s/_archive/demo/game/parts/state.ts +0 -23
- package/s/_archive/demo/game/parts/virtual-device.ts +0 -13
- package/s/_archive/demo/main.bundle.ts +0 -10
- package/s/_archive/demo/main.css +0 -85
- package/s/_archive/demo/ui/theater/styles.css.ts +0 -57
- package/s/_archive/demo/ui/theater/view.ts +0 -55
- package/s/_archive/demo/ui/theater/virtual/style.css.ts +0 -43
- package/s/_archive/demo/ui/theater/virtual/view.ts +0 -29
- package/s/_archive/demo/ui/utils/loader.ts +0 -5
- package/s/_archive/index.html.ts +0 -61
- package/s/_archive/index.ts +0 -8
- package/s/_archive/nubs/index.ts +0 -5
- package/s/_archive/nubs/lookpad/styles.ts +0 -21
- package/s/_archive/nubs/lookpad/view.ts +0 -39
- package/s/_archive/nubs/stick/style.css.ts +0 -70
- package/s/_archive/nubs/stick/view.ts +0 -108
- package/s/_archive/nubs/vpad/styles.css.ts +0 -134
- package/s/_archive/nubs/vpad/utils/gamepad-inputs.ts +0 -42
- package/s/_archive/nubs/vpad/utils/prevent-default-touch-shenanigans.ts +0 -12
- package/s/_archive/nubs/vpad/utils/touch-tracking.ts +0 -75
- package/s/_archive/nubs/vpad/view.ts +0 -141
- package/s/_archive/tests.test.ts +0 -6
- package/s/_archive/utils/circular-clamp.ts +0 -14
- package/s/_archive/utils/dispensers.ts +0 -20
- package/s/_archive/utils/gamepads.ts +0 -41
- package/s/_archive/utils/quick-math.ts +0 -13
- package/s/core/atom/defaults.ts +0 -32
- package/s/core/atom/lens-algo.ts +0 -84
- package/s/core/atom/types.ts +0 -44
- package/s/core/bindings/normalize.ts +0 -27
- package/s/core/bindings/shape.ts +0 -15
- package/s/core/bindings/table.ts +0 -22
- package/s/core/intent/bucket.ts +0 -28
- package/s/core/intent/consts.ts +0 -4
- package/s/core/intent/decode.ts +0 -23
- package/s/core/intent/encode.ts +0 -20
- package/s/core/intent/merge.ts +0 -15
- package/s/core/parts/action.ts +0 -36
- package/s/core/parts/sample-map.ts +0 -24
- package/s/core/resolvers/actions.ts +0 -30
- package/s/core/resolvers/intents.ts +0 -106
- package/s/core/types.ts +0 -40
- package/s/deck/controller.ts +0 -35
- package/s/deck/deck.ts +0 -92
- package/s/deck/parts/profiles.ts +0 -39
- package/s/deck/parts/runtime.ts +0 -11
- package/s/deck/parts/settings.ts +0 -30
- package/s/deck/port.ts +0 -35
- package/s/deck/types.ts +0 -16
- package/s/demo/demo-app/element.ts +0 -17
- package/s/demo/demo-app/style.css.ts +0 -10
- package/s/device/devices.ts +0 -24
- package/s/device/gamepad.ts +0 -42
- package/s/device/keyboard.ts +0 -33
- package/s/device/pointer.ts +0 -89
- package/s/device/sampler.ts +0 -25
- package/s/device/stick.ts +0 -24
- package/s/index-ui.ts +0 -3
- package/s/index.ts +0 -31
- package/s/test.ts +0 -339
- package/s/ui/views/desk/style.css.ts +0 -70
- package/s/ui/views/desk/view.ts +0 -122
- package/s/utils/circular-clamp.ts +0 -14
- package/s/utils/do-async.ts +0 -5
- package/s/utils/evergreen.ts +0 -10
- package/s/utils/freeze-clone.ts +0 -7
- package/s/utils/identifier.ts +0 -30
- package/s/utils/insert.ts +0 -6
- package/s/utils/remap.ts +0 -7
- package/s/utils/shift-limit.ts +0 -9
- package/s/utils/sort-by-key.ts +0 -7
- package/s/utils/split-axis.ts +0 -15
- package/s/utils/tmax.ts +0 -7
- package/s/utils/tmin.ts +0 -7
- package/x/_archive/demo/main.css +0 -85
- package/x/core/atom/defaults.d.ts +0 -3
- package/x/core/atom/defaults.js +0 -26
- package/x/core/atom/defaults.js.map +0 -1
- package/x/core/atom/lens-algo.d.ts +0 -2
- package/x/core/atom/lens-algo.js +0 -54
- package/x/core/atom/lens-algo.js.map +0 -1
- package/x/core/atom/types.d.ts +0 -27
- package/x/core/atom/types.js.map +0 -1
- package/x/core/bindings/normalize.d.ts +0 -2
- package/x/core/bindings/normalize.js +0 -17
- package/x/core/bindings/normalize.js.map +0 -1
- package/x/core/bindings/shape.d.ts +0 -2
- package/x/core/bindings/shape.js +0 -10
- package/x/core/bindings/shape.js.map +0 -1
- package/x/core/bindings/table.d.ts +0 -2
- package/x/core/bindings/table.js +0 -15
- package/x/core/bindings/table.js.map +0 -1
- package/x/core/intent/bucket.d.ts +0 -7
- package/x/core/intent/bucket.js +0 -21
- package/x/core/intent/bucket.js.map +0 -1
- package/x/core/intent/consts.d.ts +0 -2
- package/x/core/intent/consts.js +0 -3
- package/x/core/intent/consts.js.map +0 -1
- package/x/core/intent/decode.d.ts +0 -3
- package/x/core/intent/decode.js +0 -18
- package/x/core/intent/decode.js.map +0 -1
- package/x/core/intent/encode.d.ts +0 -3
- package/x/core/intent/encode.js +0 -15
- package/x/core/intent/encode.js.map +0 -1
- package/x/core/intent/merge.d.ts +0 -3
- package/x/core/intent/merge.js +0 -10
- package/x/core/intent/merge.js.map +0 -1
- package/x/core/parts/action.d.ts +0 -14
- package/x/core/parts/action.js +0 -30
- package/x/core/parts/action.js.map +0 -1
- package/x/core/parts/sample-map.d.ts +0 -6
- package/x/core/parts/sample-map.js +0 -21
- package/x/core/parts/sample-map.js.map +0 -1
- package/x/core/resolvers/actions.d.ts +0 -2
- package/x/core/resolvers/actions.js +0 -23
- package/x/core/resolvers/actions.js.map +0 -1
- package/x/core/resolvers/intents.d.ts +0 -2
- package/x/core/resolvers/intents.js +0 -89
- package/x/core/resolvers/intents.js.map +0 -1
- package/x/core/types.d.ts +0 -43
- package/x/core/types.js +0 -2
- package/x/core/types.js.map +0 -1
- package/x/deck/controller.d.ts +0 -11
- package/x/deck/controller.js +0 -28
- package/x/deck/controller.js.map +0 -1
- package/x/deck/deck.d.ts +0 -31
- package/x/deck/deck.js +0 -68
- package/x/deck/deck.js.map +0 -1
- package/x/deck/parts/profiles.d.ts +0 -12
- package/x/deck/parts/profiles.js +0 -31
- package/x/deck/parts/profiles.js.map +0 -1
- package/x/deck/parts/runtime.d.ts +0 -8
- package/x/deck/parts/runtime.js +0 -7
- package/x/deck/parts/runtime.js.map +0 -1
- package/x/deck/parts/settings.d.ts +0 -11
- package/x/deck/parts/settings.js +0 -26
- package/x/deck/parts/settings.js.map +0 -1
- package/x/deck/port.d.ts +0 -10
- package/x/deck/port.js +0 -24
- package/x/deck/port.js.map +0 -1
- package/x/deck/types.d.ts +0 -11
- package/x/deck/types.js.map +0 -1
- package/x/demo/demo-app/element.d.ts +0 -3
- package/x/demo/demo-app/element.js +0 -13
- package/x/demo/demo-app/element.js.map +0 -1
- package/x/demo/demo-app/style.css.js +0 -9
- package/x/demo/demo-app/style.css.js.map +0 -1
- package/x/device/devices.d.ts +0 -7
- package/x/device/devices.js +0 -17
- package/x/device/devices.js.map +0 -1
- package/x/device/gamepad.d.ts +0 -9
- package/x/device/gamepad.js +0 -37
- package/x/device/gamepad.js.map +0 -1
- package/x/device/keyboard.d.ts +0 -6
- package/x/device/keyboard.js +0 -30
- package/x/device/keyboard.js.map +0 -1
- package/x/device/pad/on-pad.js.map +0 -1
- package/x/device/pad/pad.js.map +0 -1
- package/x/device/pointer.d.ts +0 -12
- package/x/device/pointer.js +0 -73
- package/x/device/pointer.js.map +0 -1
- package/x/device/sampler.d.ts +0 -9
- package/x/device/sampler.js +0 -19
- package/x/device/sampler.js.map +0 -1
- package/x/device/stick.d.ts +0 -14
- package/x/device/stick.js +0 -22
- package/x/device/stick.js.map +0 -1
- package/x/index-ui.d.ts +0 -1
- package/x/index-ui.js +0 -2
- package/x/index-ui.js.map +0 -1
- package/x/index.d.ts +0 -27
- package/x/index.js +0 -28
- package/x/index.js.map +0 -1
- package/x/test.d.ts +0 -9
- package/x/test.js +0 -307
- package/x/test.js.map +0 -1
- package/x/ui/views/desk/style.css.js +0 -69
- package/x/ui/views/desk/style.css.js.map +0 -1
- package/x/ui/views/desk/view.d.ts +0 -7
- package/x/ui/views/desk/view.js +0 -102
- package/x/ui/views/desk/view.js.map +0 -1
- package/x/utils/circular-clamp.d.ts +0 -2
- package/x/utils/circular-clamp.js +0 -8
- package/x/utils/circular-clamp.js.map +0 -1
- package/x/utils/do-async.d.ts +0 -1
- package/x/utils/do-async.js +0 -4
- package/x/utils/do-async.js.map +0 -1
- package/x/utils/evergreen.js.map +0 -1
- package/x/utils/freeze-clone.d.ts +0 -1
- package/x/utils/freeze-clone.js +0 -5
- package/x/utils/freeze-clone.js.map +0 -1
- package/x/utils/identifier.d.ts +0 -6
- package/x/utils/identifier.js +0 -25
- package/x/utils/identifier.js.map +0 -1
- package/x/utils/insert.d.ts +0 -1
- package/x/utils/insert.js +0 -5
- package/x/utils/insert.js.map +0 -1
- package/x/utils/is-down.js.map +0 -1
- package/x/utils/make-id.js.map +0 -1
- package/x/utils/remap.d.ts +0 -1
- package/x/utils/remap.js +0 -6
- package/x/utils/remap.js.map +0 -1
- package/x/utils/shift-limit.d.ts +0 -2
- package/x/utils/shift-limit.js +0 -7
- package/x/utils/shift-limit.js.map +0 -1
- package/x/utils/sort-by-key.d.ts +0 -1
- package/x/utils/sort-by-key.js +0 -6
- package/x/utils/sort-by-key.js.map +0 -1
- package/x/utils/split-axis.js.map +0 -1
- package/x/utils/tmax.d.ts +0 -1
- package/x/utils/tmax.js +0 -6
- package/x/utils/tmax.js.map +0 -1
- package/x/utils/tmin.d.ts +0 -1
- package/x/utils/tmin.js +0 -6
- package/x/utils/tmin.js.map +0 -1
- /package/s/{_archive → lib/input}/utils/evergreen.ts +0 -0
- /package/s/{utils → lib/input/utils}/is-down.ts +0 -0
- /package/s/{device → lib/input/utils}/pad/on-pad.ts +0 -0
- /package/s/{device → lib/input/utils}/pad/pad.ts +0 -0
- /package/s/{_archive → lib/input}/utils/split-axis.ts +0 -0
- /package/s/{utils → lib/utils}/make-id.ts +0 -0
- /package/x/{core/atom → lib/input/data/intent}/types.js +0 -0
- /package/x/{deck → lib/input/data/parcel}/types.js +0 -0
- /package/x/{utils → lib/input/utils}/evergreen.d.ts +0 -0
- /package/x/{utils → lib/input/utils}/evergreen.js +0 -0
- /package/x/{utils → lib/input/utils}/is-down.d.ts +0 -0
- /package/x/{utils → lib/input/utils}/is-down.js +0 -0
- /package/x/{device → lib/input/utils}/pad/on-pad.d.ts +0 -0
- /package/x/{device → lib/input/utils}/pad/on-pad.js +0 -0
- /package/x/{device → lib/input/utils}/pad/pad.d.ts +0 -0
- /package/x/{device → lib/input/utils}/pad/pad.js +0 -0
- /package/x/{utils → lib/input/utils}/split-axis.d.ts +0 -0
- /package/x/{utils → lib/input/utils}/split-axis.js +0 -0
- /package/x/{demo/demo-app → lib/ui/views/controllers}/style.css.d.ts +0 -0
- /package/x/{ui/views/desk → lib/ui/views/customize}/style.css.d.ts +0 -0
- /package/x/{utils → lib/utils}/make-id.d.ts +0 -0
- /package/x/{utils → lib/utils}/make-id.js +0 -0
package/README.md
CHANGED
|
@@ -1,93 +1,136 @@
|
|
|
1
1
|
|
|
2
2
|
# 🎮 @benev/tact
|
|
3
|
-
> *from keypress to couch co-op
|
|
3
|
+
> *from keypress to couch co-op.*
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
npm install @benev/tact
|
|
7
|
-
```
|
|
5
|
+
**tact is a user-input toolkit for web games.**
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
customizable keybindings, multiple-gamepad couch co-op, ready-made configurator ui, efficient networking, mobile virtual thumbsticks.
|
|
7
|
+
🌐 👉 ***https://tact.benev.gg/*** 👈 *try now*
|
|
11
8
|
|
|
9
|
+
🖱 keyboards, mice, gamepads.
|
|
10
|
+
🧩 expressive bindings json dsl.
|
|
11
|
+
🎨 bindings are user-customizable.
|
|
12
|
+
🫂 multiplayer and splitscreen capable.
|
|
13
|
+
🧬 binary for efficient workers and networking.
|
|
14
|
+
🎸 ready-to-rock drop-in user-interface.
|
|
12
15
|
|
|
16
|
+

|
|
13
17
|
|
|
14
|
-
|
|
18
|
+

|
|
15
19
|
|
|
16
|
-
## 🎮 tact basics
|
|
17
20
|
|
|
18
|
-
```ts
|
|
19
|
-
import {
|
|
20
|
-
Devices, KeyboardDevice, PointerDevice,
|
|
21
|
-
makeIntentsResolver, makeActionsResolver,
|
|
22
|
-
} from "@benev/tact"
|
|
23
|
-
```
|
|
24
21
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
22
|
+
<br/>
|
|
23
|
+
|
|
24
|
+
## 🎮 let's play.
|
|
25
|
+
|
|
26
|
+
- 🍏 **install tact.**
|
|
27
|
+
```sh
|
|
28
|
+
npm install @benev/tact@next
|
|
31
29
|
```
|
|
32
|
-
|
|
30
|
+
- 🍏 **establish your app's standard bindings.**
|
|
33
31
|
```ts
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
import {asBindings} from "@benev/tact"
|
|
33
|
+
|
|
34
|
+
const bindings = asBindings({
|
|
35
|
+
jump: "Space",
|
|
36
|
+
forward: "KeyW",
|
|
37
|
+
look: ["accumulate", "pointer.x"],
|
|
38
|
+
})
|
|
38
39
|
```
|
|
39
|
-
|
|
40
|
+
- 💡 *bindings is a tiny json dsl. see [expression.ts](./s/lib/input/expression.ts).*
|
|
41
|
+
- 🍏 **let's have two presets available to the user. one for gamepads.**
|
|
40
42
|
```ts
|
|
41
|
-
|
|
42
|
-
|
|
43
|
+
import {asPresets} from "@benev/tact"
|
|
44
|
+
|
|
45
|
+
const presets = asPresets<typeof bindings>({
|
|
46
|
+
standard: {label: "⌨️standard", bindings},
|
|
47
|
+
gamepad: {label: "🎮gamer", bindings: {
|
|
48
|
+
jump: "gamepad.1",
|
|
49
|
+
forward: ["remap", 0, -1, 0, 1, "gamepad.axis.2"],
|
|
50
|
+
look: ["*", ["dt"], "gamepad.axis.3", 100],
|
|
51
|
+
}},
|
|
52
|
+
})
|
|
43
53
|
```
|
|
44
|
-
|
|
54
|
+
- 🍏 **now we can setup tact and register the html elements.**
|
|
45
55
|
```ts
|
|
46
|
-
import {
|
|
56
|
+
import {setupTact} from "@benev/tact"
|
|
47
57
|
|
|
48
|
-
|
|
58
|
+
const tact = await setupTact({presets, maxPlayers: 4})
|
|
59
|
+
tact.mouseKeyboard()
|
|
60
|
+
tact.gamepads("gamepad")
|
|
61
|
+
tact.registerElements()
|
|
62
|
+
```
|
|
63
|
+
- 🍏 **simply put the `<tact-deck>` in your html page.**
|
|
64
|
+
```html
|
|
65
|
+
<tact-deck></tact-deck>
|
|
66
|
+
```
|
|
67
|
+
- 💡 *you also have each panel, `<tact-controllers>` and `<tact-customize>`.*
|
|
68
|
+
- 🍏 **color the whole ui with css.**
|
|
69
|
+
```html
|
|
70
|
+
<style>
|
|
71
|
+
html {
|
|
72
|
+
--tact-prime: aqua;
|
|
73
|
+
--tact-bg: black;
|
|
74
|
+
}
|
|
75
|
+
</style>
|
|
76
|
+
```
|
|
49
77
|
|
|
50
|
-
// 🧙♂️ samples get resolved into compact intent tuples, good for networking.
|
|
51
|
-
const intents = resolveIntents(Date.now(), devices.samples())
|
|
52
78
|
|
|
53
|
-
// 🧙♂️ actions are your ergonomic accessors for values.
|
|
54
|
-
const actions = resolveActions(intents)
|
|
55
79
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
})
|
|
60
|
-
```
|
|
80
|
+
<br/>
|
|
81
|
+
|
|
82
|
+
## 🎮 encoding, decoding, and your game logic.
|
|
61
83
|
|
|
62
|
-
|
|
84
|
+
- 🍏 **make a collector.**
|
|
85
|
+
```ts
|
|
86
|
+
import {Collector} from "@benev/tact"
|
|
63
87
|
|
|
64
|
-
|
|
88
|
+
const collector = new Collector(bindings)
|
|
89
|
+
```
|
|
90
|
+
- 🍏 **now it's time for the real action!**
|
|
65
91
|
```ts
|
|
66
|
-
|
|
92
|
+
setInterval(() => {
|
|
93
|
+
const buffer = tact.deck.hub.encodeAll()
|
|
94
|
+
for (const {playerId, inputs} of collector.decodeAll(buffer)) {
|
|
95
|
+
|
|
96
|
+
// your game logic can read these handy input values.
|
|
97
|
+
inputs.jump.value // values are numbers 0 to 1.
|
|
98
|
+
inputs.jump.was // previous value (to detect up/down).
|
|
99
|
+
inputs.jump.sum // sum of values reported since last frame.
|
|
100
|
+
|
|
101
|
+
inputs.forward.value
|
|
102
|
+
inputs.look.value
|
|
103
|
+
}
|
|
104
|
+
}, 16.67)
|
|
105
|
+
```
|
|
106
|
+
💡 *you could stream the buffers across the network to a remote collector.*
|
|
67
107
|
|
|
68
|
-
const intents = [[1, 0.7853981633974483]]
|
|
69
108
|
|
|
70
|
-
console.log(JSON.stringify(intents).length)
|
|
71
|
-
// 22 — yikes
|
|
72
109
|
|
|
73
|
-
|
|
110
|
+
<br/>
|
|
74
111
|
|
|
75
|
-
|
|
76
|
-
// 6 — noice
|
|
112
|
+
## 🎮 get down to brass tacks.
|
|
77
113
|
|
|
78
|
-
|
|
79
|
-
```
|
|
80
|
-
1. **you can normalize bindings**
|
|
114
|
+
- 🍏 **use the core facilities directly,** without the ui or multiplayer.
|
|
81
115
|
```ts
|
|
82
|
-
import {
|
|
116
|
+
import {Controller, InputDecoder, KeyboardSource, PointerSource, Sources} from "@benev/tact"
|
|
117
|
+
|
|
118
|
+
const controller = new Controller({
|
|
119
|
+
bindings,
|
|
120
|
+
source: new Sources(new KeyboardSource(), new PointerSource()),
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
const decoder = new InputDecoder(bindings)
|
|
83
124
|
|
|
84
|
-
|
|
125
|
+
// call this in your gameloop:
|
|
126
|
+
const inputs = decoder.decode(controller.encode())
|
|
85
127
|
```
|
|
86
|
-
this clones your app bindings and cherry-picks any compatible user bindings. useful when loading from localStorage, so changes to your schema don’t break things.
|
|
87
128
|
|
|
88
129
|
|
|
89
130
|
|
|
90
131
|
<br/><br/>
|
|
91
132
|
|
|
133
|
+
---
|
|
134
|
+
|
|
92
135
|
👼 *https://benev.gg/*
|
|
93
136
|
|
package/package.json
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@benev/tact",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "🎮
|
|
3
|
+
"version": "0.4.0-1",
|
|
4
|
+
"description": "🎮 from keypress to couch co-op",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Chase Moskal <chasemoskal@gmail.com>",
|
|
7
7
|
"type": "module",
|
|
8
|
-
"main": "./x/index.js",
|
|
8
|
+
"main": "./x/lib/index.js",
|
|
9
9
|
"sideEffects": false,
|
|
10
10
|
"exports": {
|
|
11
|
-
".": "./x/index.js"
|
|
12
|
-
"./ui": "./x/index-ui.js"
|
|
11
|
+
".": "./x/lib/index.js"
|
|
13
12
|
},
|
|
14
13
|
"files": [
|
|
15
14
|
"x",
|
|
@@ -17,29 +16,33 @@
|
|
|
17
16
|
],
|
|
18
17
|
"scripts": {
|
|
19
18
|
"build": "octo-s 'rm -rf x' 'tsc' 'scute -v'",
|
|
20
|
-
"dev": "octo 'scute -vw' 'tsc -w' 'node --watch x/test.js' 'hottie x --port=8081'",
|
|
21
|
-
"test": "node x/test.js",
|
|
19
|
+
"dev": "octo 'scute -vw' 'tsc -w' 'node --watch x/lib/test.js' 'hottie x --port=8081'",
|
|
20
|
+
"test": "node x/lib/test.js",
|
|
22
21
|
"count": "find s -path '*/_archive' -prune -o -name '*.ts' -exec wc -l {} +"
|
|
23
22
|
},
|
|
24
23
|
"peerDependencies": {
|
|
25
|
-
"@e280/sly": "^0.4.
|
|
26
|
-
"@e280/strata": "^0.5.
|
|
24
|
+
"@e280/sly": "^0.4.9",
|
|
25
|
+
"@e280/strata": "^0.5.6",
|
|
27
26
|
"lit": "^3.3.3"
|
|
28
27
|
},
|
|
29
28
|
"dependencies": {
|
|
30
|
-
"@benev/math": "
|
|
31
|
-
"@e280/kv": "^0.2.
|
|
32
|
-
"@e280/
|
|
29
|
+
"@benev/math": "0.4.0-9",
|
|
30
|
+
"@e280/kv": "^0.2.4",
|
|
31
|
+
"@e280/shiny": "^0.1.1",
|
|
32
|
+
"@e280/stz": "^0.4.14"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@e280/hottie": "^0.1.
|
|
36
|
-
"@e280/octo": "^0.1.
|
|
37
|
-
"@e280/science": "^0.1.
|
|
38
|
-
"@e280/scute": "^0.5.
|
|
35
|
+
"@e280/hottie": "^0.1.7",
|
|
36
|
+
"@e280/octo": "^0.1.7",
|
|
37
|
+
"@e280/science": "^0.1.14",
|
|
38
|
+
"@e280/scute": "^0.5.4",
|
|
39
39
|
"http-server": "^14.1.1",
|
|
40
40
|
"npm-run-all": "^4.1.5",
|
|
41
41
|
"typescript": "^7.0.2"
|
|
42
42
|
},
|
|
43
|
+
"allowScripts": {
|
|
44
|
+
"esbuild@0.28.2": true
|
|
45
|
+
},
|
|
43
46
|
"repository": {
|
|
44
47
|
"type": "git",
|
|
45
48
|
"url": "git+https://github.com/benev-gg/tact.git"
|
|
@@ -53,9 +56,5 @@
|
|
|
53
56
|
"keybinds",
|
|
54
57
|
"keybindings",
|
|
55
58
|
"gamepad"
|
|
56
|
-
]
|
|
57
|
-
"allowScripts": {
|
|
58
|
-
"classic-level@3.0.0": true,
|
|
59
|
-
"esbuild@0.28.2": true
|
|
60
|
-
}
|
|
59
|
+
]
|
|
61
60
|
}
|
package/s/demo/main.bundle.ts
CHANGED
|
@@ -1,71 +1,23 @@
|
|
|
1
1
|
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const bindings = asBindings({
|
|
17
|
-
play: {
|
|
18
|
-
action: ["or", "Space", "pointer.button.left", "gamepad.button.1"],
|
|
19
|
-
up: ["or", "KeyW", "gamepad.axis.2.pos"],
|
|
20
|
-
down: ["or", "KeyS", "gamepad.axis.2.neg"],
|
|
21
|
-
left: ["or", "KeyA", "gamepad.axis.1.pos"],
|
|
22
|
-
right: ["or", "KeyD", "gamepad.axis.1.neg"],
|
|
23
|
-
},
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
const store = new LocalStore<DeckState>("tactDeck")
|
|
27
|
-
|
|
28
|
-
const deck = new Deck({
|
|
29
|
-
store,
|
|
30
|
-
stockProfiles: {
|
|
31
|
-
standard: {label: "📜standard", bindings},
|
|
32
|
-
micro: {label: "🦠micro", bindings: asBindings<typeof bindings>({
|
|
33
|
-
play: {
|
|
34
|
-
action: ["or", "Space", "pointer.button.left", "gamepad.button.1"],
|
|
35
|
-
up: ["or", "KeyW", "gamepad.axis.2.pos"],
|
|
36
|
-
down: ["or", "KeyS", "gamepad.axis.2.neg"],
|
|
37
|
-
left: ["or", "KeyA", "gamepad.axis.1.pos"],
|
|
38
|
-
right: ["or", "KeyD", "gamepad.axis.1.neg"],
|
|
39
|
-
},
|
|
40
|
-
})},
|
|
41
|
-
},
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
await deck.load()
|
|
45
|
-
store.onStorageEvent(() => deck.load())
|
|
46
|
-
|
|
47
|
-
const port = deck.createPort()
|
|
48
|
-
const controller = deck.createController("primary", "standard", new Devices(
|
|
49
|
-
new KeyboardDevice(),
|
|
50
|
-
new PointerDevice(),
|
|
51
|
-
))
|
|
52
|
-
|
|
53
|
-
port.plug(controller)
|
|
54
|
-
|
|
55
|
-
const labels = new Map<Controller, Content>()
|
|
56
|
-
.set(controller, "⌨️🖱keyboard+mouse")
|
|
57
|
-
|
|
58
|
-
onPad(pad => {
|
|
59
|
-
const handle = `(${pad.gamepad.index + 1}) ${pad.gamepad.id}`
|
|
60
|
-
const controller = deck.createController(handle, "standard", new GamepadDevice(pad))
|
|
61
|
-
labels.set(controller, `🎮${handle}`)
|
|
62
|
-
port.plug(controller)
|
|
63
|
-
return () => deck.deleteController(controller)
|
|
2
|
+
import {dom} from "@e280/sly"
|
|
3
|
+
import {cycle, nap} from "@e280/stz"
|
|
4
|
+
import {presets} from "./presets.js"
|
|
5
|
+
import {setupTact} from "../lib/ui/deck/setup/tact.js"
|
|
6
|
+
|
|
7
|
+
const tact = await setupTact({presets, maxPlayers: 4})
|
|
8
|
+
tact.mouseKeyboard()
|
|
9
|
+
tact.gamepads("gamer")
|
|
10
|
+
tact.registerElements()
|
|
11
|
+
|
|
12
|
+
cycle(async() => {
|
|
13
|
+
const data = tact.deck.hub.encodeAll()
|
|
14
|
+
tact.visualizer.update(data)
|
|
15
|
+
await nap(1000 / 60)
|
|
64
16
|
})
|
|
65
17
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
18
|
+
{
|
|
19
|
+
const input = dom<HTMLInputElement>('input[type="color"]')
|
|
20
|
+
input.value = "#ffbb00"
|
|
21
|
+
input.oninput = () => document.body.style.setProperty("--tact-prime", input.value)
|
|
22
|
+
}
|
|
71
23
|
|
package/s/demo/main.css
CHANGED
|
@@ -59,17 +59,18 @@
|
|
|
59
59
|
align-items: center;
|
|
60
60
|
|
|
61
61
|
gap: 1em;
|
|
62
|
-
padding:
|
|
62
|
+
padding: 0.5em;
|
|
63
|
+
padding-bottom: 8em;
|
|
63
64
|
|
|
64
65
|
> * {
|
|
65
|
-
width: 100
|
|
66
|
-
max-width: 42em;
|
|
66
|
+
width: min(100%, 50em);
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
> header {
|
|
70
70
|
padding: 0 2em;
|
|
71
71
|
h1 small { font-size: 0.6em; font-weight: normal; }
|
|
72
72
|
* + * { margin-top: 0.5em; }
|
|
73
|
+
label { padding-left: 1em; }
|
|
73
74
|
}
|
|
74
75
|
|
|
75
76
|
> section {
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
|
|
2
|
+
import {asBindings} from "../lib/input/types.js"
|
|
3
|
+
import {asPresets} from "../lib/ui/deck/types.js"
|
|
4
|
+
|
|
5
|
+
export const bindings = asBindings({
|
|
6
|
+
looking: {
|
|
7
|
+
horizontal: ["accumulate", "pointer.x"],
|
|
8
|
+
vertical: ["accumulate", "pointer.y"],
|
|
9
|
+
},
|
|
10
|
+
moving: {
|
|
11
|
+
forward: "KeyW",
|
|
12
|
+
backward: "KeyS",
|
|
13
|
+
leftward: "KeyA",
|
|
14
|
+
rightward: "KeyD",
|
|
15
|
+
},
|
|
16
|
+
interactions: {
|
|
17
|
+
use: "KeyE",
|
|
18
|
+
},
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
export const presets = asPresets<typeof bindings>({
|
|
22
|
+
standard: {label: "⌨️standard", bindings},
|
|
23
|
+
gamer: {label: "🎮gamer", bindings: {
|
|
24
|
+
looking: {
|
|
25
|
+
horizontal: ["*", ["dt"], "gamepad.axis.3", 100],
|
|
26
|
+
vertical: ["*", ["dt"], "gamepad.axis.4", 100],
|
|
27
|
+
},
|
|
28
|
+
moving: {
|
|
29
|
+
forward: ["remap", 0, -1, 0, 1, "gamepad.axis.2"],
|
|
30
|
+
backward: ["remap", 0, 1, 0, 1, "gamepad.axis.2"],
|
|
31
|
+
leftward: ["remap", 0, -1, 0, 1, "gamepad.axis.1"],
|
|
32
|
+
rightward: ["remap", 0, 1, 0, 1, "gamepad.axis.1"],
|
|
33
|
+
},
|
|
34
|
+
interactions: {
|
|
35
|
+
use: "gamepad.1",
|
|
36
|
+
},
|
|
37
|
+
}},
|
|
38
|
+
micro: {label: "🦠micro", bindings: {
|
|
39
|
+
looking: {
|
|
40
|
+
horizontal: ["*", ["dt"], ["+", "gamepad.1", ["-", "gamepad.4"]], 100],
|
|
41
|
+
vertical: ["*", ["dt"], ["+", "gamepad.2", ["-", "gamepad.3"]], 100],
|
|
42
|
+
},
|
|
43
|
+
moving: {
|
|
44
|
+
forward: ["remap", 0, -1, 0, 1, "gamepad.axis.2"],
|
|
45
|
+
backward: ["remap", 0, 1, 0, 1, "gamepad.axis.2"],
|
|
46
|
+
leftward: ["remap", 0, -1, 0, 1, "gamepad.axis.1"],
|
|
47
|
+
rightward: ["remap", 0, 1, 0, 1, "gamepad.axis.1"],
|
|
48
|
+
},
|
|
49
|
+
interactions: {
|
|
50
|
+
use: ["*", "gamepad.5", "gamepad.6"],
|
|
51
|
+
},
|
|
52
|
+
}},
|
|
53
|
+
})
|
|
54
|
+
|
|
@@ -5,55 +5,65 @@ import {RMap, RSet} from "@e280/strata"
|
|
|
5
5
|
import {shadowElement, useCss, useMount, useOnce} from "@e280/sly"
|
|
6
6
|
|
|
7
7
|
import styleCss from "./style.css.js"
|
|
8
|
-
|
|
9
|
-
import {
|
|
8
|
+
|
|
9
|
+
import {onPad} from "../../lib/input/utils/pad/on-pad.js"
|
|
10
|
+
import {GamepadSource} from "../../lib/input/sources/gamepad.js"
|
|
10
11
|
|
|
11
12
|
export const GamepadApp = shadowElement(() => {
|
|
12
13
|
useCss(styleCss)
|
|
13
14
|
|
|
14
15
|
const connected = useOnce(() => new RSet<{
|
|
15
|
-
|
|
16
|
+
source: GamepadSource
|
|
16
17
|
samples: RMap<string, number>
|
|
17
18
|
}>())
|
|
18
19
|
|
|
19
20
|
useMount(() => onPad(pad => {
|
|
20
|
-
const
|
|
21
|
-
const connectee = {
|
|
21
|
+
const source = new GamepadSource(pad)
|
|
22
|
+
const connectee = {source, samples: new RMap<string, number>()}
|
|
23
|
+
const stop = source.onSample(sample => connectee.samples.set(sample.code, sample.value))
|
|
22
24
|
connected.add(connectee)
|
|
23
|
-
return () =>
|
|
25
|
+
return () => {
|
|
26
|
+
stop()
|
|
27
|
+
connected.delete(connectee)
|
|
28
|
+
}
|
|
24
29
|
}))
|
|
25
30
|
|
|
26
31
|
useMount(() => cycle(async() => {
|
|
27
|
-
for (const conn of connected)
|
|
28
|
-
|
|
29
|
-
conn.samples.set(code, value)
|
|
30
|
-
}
|
|
32
|
+
for (const conn of connected)
|
|
33
|
+
conn.source.poll()
|
|
31
34
|
await nap(1000 / 60)
|
|
32
35
|
}))
|
|
33
36
|
|
|
34
37
|
const renderSample = ([code, value]: [string, number]) => html`
|
|
35
|
-
<li style="${`--percent: ${value * 100}%;`}">
|
|
38
|
+
<li ?data-neg="${value < 0}" style="${`--percent: ${Math.abs(value) * 100}%;`}">
|
|
36
39
|
<span>${code}</span>
|
|
37
40
|
<span>${value.toFixed(3)}</span>
|
|
38
41
|
</li>
|
|
39
42
|
`
|
|
40
43
|
|
|
44
|
+
const sortSamples = (a: [string, number], b: [string, number]) =>
|
|
45
|
+
a[0].localeCompare(b[0])
|
|
46
|
+
|
|
41
47
|
return html`
|
|
42
48
|
<div class=plate>
|
|
43
|
-
${connected.size > 0 ? [...connected].map(({samples,
|
|
49
|
+
${connected.size > 0 ? [...connected].map(({samples, source: {gamepad}}) => html`
|
|
44
50
|
<div class=device>
|
|
45
51
|
<h2>🎮 ${gamepad.id}</h2>
|
|
46
52
|
<div class=stats>
|
|
47
53
|
<span>index ${gamepad.index}</span>
|
|
48
54
|
<span>connected ${gamepad.connected ? "yes" : "no"}</span>
|
|
49
|
-
<span>mapping ${gamepad.mapping}</span>
|
|
55
|
+
<span>mapping "${gamepad.mapping}"</span>
|
|
50
56
|
<span>vibrationActuator ${gamepad.vibrationActuator ? "yes" : "no"}</span>
|
|
51
57
|
</div>
|
|
52
58
|
<ul>
|
|
53
|
-
${[...samples]
|
|
59
|
+
${[...samples]
|
|
60
|
+
.sort(sortSamples)
|
|
61
|
+
.filter(([code]) => !code.startsWith("gamepad.axis")).map(renderSample)}
|
|
54
62
|
</ul>
|
|
55
63
|
<ul>
|
|
56
|
-
${[...samples]
|
|
64
|
+
${[...samples]
|
|
65
|
+
.sort(sortSamples)
|
|
66
|
+
.filter(([code]) => code.startsWith("gamepad.axis")).map(renderSample)}
|
|
57
67
|
</ul>
|
|
58
68
|
</div>
|
|
59
69
|
`) : html`
|
|
@@ -57,10 +57,14 @@ export default css`
|
|
|
57
57
|
display: block;
|
|
58
58
|
content: "";
|
|
59
59
|
inset: 0;
|
|
60
|
-
background: #
|
|
60
|
+
background: #08f4;
|
|
61
61
|
width: var(--percent);
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
+
&[data-neg]::before {
|
|
65
|
+
background: #f004;
|
|
66
|
+
}
|
|
67
|
+
|
|
64
68
|
> span {
|
|
65
69
|
position: relative;
|
|
66
70
|
z-index: 2;
|
package/s/gamepad/index.html.ts
CHANGED
|
@@ -15,7 +15,7 @@ export default template(import.meta.url, async orb => html`
|
|
|
15
15
|
<meta charset="utf-8"/>
|
|
16
16
|
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
|
17
17
|
<meta name="darkreader-lock"/>
|
|
18
|
-
<style>@layer base{html{background:#
|
|
18
|
+
<style>@layer base{html{background:#111}}</style>
|
|
19
19
|
|
|
20
20
|
<link rel="icon" href="${dataSvgEmoji("🎮")}"/>
|
|
21
21
|
<link rel="stylesheet" href="${orb.hashurl("main.css")}"/>
|
package/s/gamepad/main.css
CHANGED
package/s/index.html.ts
CHANGED
|
@@ -15,7 +15,7 @@ export default template(import.meta.url, async orb => html`
|
|
|
15
15
|
<meta charset="utf-8"/>
|
|
16
16
|
<meta name="viewport" content="width=device-width,initial-scale=1"/>
|
|
17
17
|
<meta name="darkreader-lock"/>
|
|
18
|
-
<style>@layer base{html{background:#
|
|
18
|
+
<style>@layer base{html{background:#111}}</style>
|
|
19
19
|
|
|
20
20
|
<link rel="icon" href="${dataSvgEmoji("🎮")}"/>
|
|
21
21
|
<link rel="stylesheet" href="${orb.hashurl("demo/main.css")}"/>
|
|
@@ -37,17 +37,24 @@ export default template(import.meta.url, async orb => html`
|
|
|
37
37
|
</h1>
|
|
38
38
|
<div>
|
|
39
39
|
<blockquote>"from keypress to couch co-op"</blockquote>
|
|
40
|
-
<p>
|
|
41
|
-
<a href="./gamepad/">gamepad visualizer</a
|
|
40
|
+
<p class=links>
|
|
41
|
+
<a href="./gamepad/">gamepad visualizer</a>
|
|
42
|
+
—
|
|
43
|
+
<a href="https://github.com/benev-gg/tact">github</a>
|
|
44
|
+
—
|
|
45
|
+
<a href="https://benev.gg/">benev.gg</a>
|
|
42
46
|
</p>
|
|
43
47
|
<p>
|
|
44
|
-
<
|
|
45
|
-
|
|
48
|
+
<label>
|
|
49
|
+
<span>➣ choose your color:</span>
|
|
50
|
+
<input type="color"/>
|
|
51
|
+
</label>
|
|
46
52
|
</p>
|
|
47
53
|
</div>
|
|
48
54
|
</header>
|
|
49
55
|
|
|
50
|
-
<
|
|
56
|
+
<tact-deck></tact-deck>
|
|
57
|
+
<tact-visualizer></tact-visualizer>
|
|
51
58
|
</body>
|
|
52
59
|
</html>
|
|
53
60
|
`)
|
package/s/lib/index.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
|
|
2
|
+
export * from "./input/investigate/is-compatible.js"
|
|
3
|
+
export * from "./input/sources/gamepad.js"
|
|
4
|
+
export * from "./input/sources/keyboard.js"
|
|
5
|
+
export * from "./input/sources/plain.js"
|
|
6
|
+
export * from "./input/sources/pointer.js"
|
|
7
|
+
export * from "./input/sources/sources.js"
|
|
8
|
+
export * from "./input/sources/stick.js"
|
|
9
|
+
export * from "./input/utils/pad/on-pad.js"
|
|
10
|
+
export * from "./input/utils/pad/pad.js"
|
|
11
|
+
export * from "./input/utils/is-down.js"
|
|
12
|
+
export * from "./input/controller.js"
|
|
13
|
+
export * from "./input/decoder.js"
|
|
14
|
+
export * from "./input/expression.js"
|
|
15
|
+
export * from "./input/types.js"
|
|
16
|
+
|
|
17
|
+
export * from "./ui/deck/controls/controls.js"
|
|
18
|
+
export * from "./ui/deck/controls/types.js"
|
|
19
|
+
export * from "./ui/deck/setup/deck.js"
|
|
20
|
+
export * from "./ui/deck/setup/tact.js"
|
|
21
|
+
export * from "./ui/deck/auto-gamepads.js"
|
|
22
|
+
export * from "./ui/deck/collector.js"
|
|
23
|
+
export * from "./ui/deck/hub.js"
|
|
24
|
+
export * from "./ui/deck/types.js"
|
|
25
|
+
export * from "./ui/views/customize/view.js"
|
|
26
|
+
export * from "./ui/views/deck/view.js"
|
|
27
|
+
export * from "./ui/views/controllers/view.js"
|
|
28
|
+
export * from "./ui/views/visualizer/view.js"
|
|
29
|
+
|