@felbrasil/dreamy 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +69 -2
- package/dist/api.d.ts +1 -0
- package/dist/api.js +2 -0
- package/dist/api.js.map +7 -0
- package/dist/chunks/chunk-72DMUKP3.js +1470 -0
- package/dist/chunks/chunk-72DMUKP3.js.map +7 -0
- package/dist/chunks/chunk-VZMBE5MV.js +5936 -0
- package/dist/chunks/chunk-VZMBE5MV.js.map +7 -0
- package/dist/chunks/chunk-ZU72KKME.js +8600 -0
- package/dist/chunks/chunk-ZU72KKME.js.map +7 -0
- package/dist/core.d.ts +1 -0
- package/dist/core.js +34 -0
- package/dist/core.js.map +7 -0
- package/dist/dreamy_evaluator.wasm +0 -0
- package/dist/evaluator.d.ts +1 -0
- package/dist/evaluator.js +52 -0
- package/dist/evaluator.js.map +7 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7280 -0
- package/dist/index.js.map +7 -0
- package/dist/styles.css +1 -0
- package/dist/types/api/src/commands/command.d.ts +7 -0
- package/dist/types/api/src/commands/decal-commands.d.ts +35 -0
- package/dist/types/api/src/commands/palette-commands.d.ts +14 -0
- package/dist/types/api/src/commands/rig-commands.d.ts +229 -0
- package/dist/types/api/src/commands/scene-commands.d.ts +64 -0
- package/dist/types/api/src/commands/sculpt-commands.d.ts +111 -0
- package/dist/types/api/src/commands/stamp-spec.d.ts +3 -0
- package/dist/types/api/src/commands/target.d.ts +8 -0
- package/dist/types/api/src/creation-api.d.ts +52 -0
- package/dist/types/api/src/events/creation-event.d.ts +7 -0
- package/dist/types/api/src/events/decal-events.d.ts +20 -0
- package/dist/types/api/src/events/event-of.d.ts +6 -0
- package/dist/types/api/src/events/palette-events.d.ts +8 -0
- package/dist/types/api/src/events/rig-events.d.ts +161 -0
- package/dist/types/api/src/events/scene-events.d.ts +34 -0
- package/dist/types/api/src/events/sculpt-events.d.ts +53 -0
- package/dist/types/api/src/id.d.ts +1 -0
- package/dist/types/api/src/index.d.ts +31 -0
- package/dist/types/api/src/model/creation.d.ts +22 -0
- package/dist/types/api/src/model/decal.d.ts +48 -0
- package/dist/types/api/src/model/look.d.ts +56 -0
- package/dist/types/api/src/model/math.d.ts +18 -0
- package/dist/types/api/src/model/palette.d.ts +11 -0
- package/dist/types/api/src/model/rig.d.ts +125 -0
- package/dist/types/api/src/model/scene-object.d.ts +22 -0
- package/dist/types/api/src/model/sculpt.d.ts +13 -0
- package/dist/types/api/src/model/stamp.d.ts +53 -0
- package/dist/types/api/src/model/wing.d.ts +35 -0
- package/dist/types/api/src/ports/basic-ports.d.ts +7 -0
- package/dist/types/api/src/ports/evaluator.d.ts +62 -0
- package/dist/types/api/src/ports/persistence.d.ts +89 -0
- package/dist/types/api/src/ports/viewport.d.ts +125 -0
- package/dist/types/core/src/apply/body-part-added.d.ts +2 -0
- package/dist/types/core/src/apply/body-part-removed.d.ts +2 -0
- package/dist/types/core/src/apply/bone-removed.d.ts +3 -0
- package/dist/types/core/src/apply/bone-renamed.d.ts +2 -0
- package/dist/types/core/src/apply/bone-reparented.d.ts +2 -0
- package/dist/types/core/src/apply/bone-sizes-set.d.ts +3 -0
- package/dist/types/core/src/apply/bone-tags-set.d.ts +2 -0
- package/dist/types/core/src/apply/bone-transforms-set.d.ts +6 -0
- package/dist/types/core/src/apply/bones-added.d.ts +2 -0
- package/dist/types/core/src/apply/creature-generated.d.ts +3 -0
- package/dist/types/core/src/apply/decal-removed.d.ts +2 -0
- package/dist/types/core/src/apply/decals-added.d.ts +2 -0
- package/dist/types/core/src/apply/design-deleted.d.ts +2 -0
- package/dist/types/core/src/apply/design-saved.d.ts +2 -0
- package/dist/types/core/src/apply/flat-wings-set.d.ts +2 -0
- package/dist/types/core/src/apply/object-renamed.d.ts +2 -0
- package/dist/types/core/src/apply/object-reparented.d.ts +2 -0
- package/dist/types/core/src/apply/object-transforms-set.d.ts +2 -0
- package/dist/types/core/src/apply/objects-deleted.d.ts +2 -0
- package/dist/types/core/src/apply/objects-duplicated.d.ts +3 -0
- package/dist/types/core/src/apply/palette-color-set.d.ts +2 -0
- package/dist/types/core/src/apply/palette-reset.d.ts +2 -0
- package/dist/types/core/src/apply/part-grafted.d.ts +3 -0
- package/dist/types/core/src/apply/part-slot-swapped.d.ts +3 -0
- package/dist/types/core/src/apply/pivot-set.d.ts +2 -0
- package/dist/types/core/src/apply/pose-preset-applied.d.ts +3 -0
- package/dist/types/core/src/apply/pose-reset.d.ts +3 -0
- package/dist/types/core/src/apply/premade-applied.d.ts +3 -0
- package/dist/types/core/src/apply/region-blend-set.d.ts +3 -0
- package/dist/types/core/src/apply/rig-created.d.ts +2 -0
- package/dist/types/core/src/apply/rig-mirror-set.d.ts +2 -0
- package/dist/types/core/src/apply/rig-mode-set.d.ts +2 -0
- package/dist/types/core/src/apply/sculpt-created.d.ts +2 -0
- package/dist/types/core/src/apply/sculpt-look-set.d.ts +3 -0
- package/dist/types/core/src/apply/smear-group-set.d.ts +2 -0
- package/dist/types/core/src/apply/stamp-placements-set.d.ts +2 -0
- package/dist/types/core/src/apply/stamp-props-set.d.ts +2 -0
- package/dist/types/core/src/apply/stamps-added.d.ts +2 -0
- package/dist/types/core/src/apply/stamps-removed.d.ts +2 -0
- package/dist/types/core/src/apply/symmetry-set-for-all.d.ts +2 -0
- package/dist/types/core/src/atoms/check/check.d.ts +7 -0
- package/dist/types/core/src/atoms/decal/decal-limits.d.ts +6 -0
- package/dist/types/core/src/atoms/decal/decal-problem.d.ts +4 -0
- package/dist/types/core/src/atoms/decal/design-problem.d.ts +4 -0
- package/dist/types/core/src/atoms/look/catalogs.d.ts +9 -0
- package/dist/types/core/src/atoms/look/default-look.d.ts +4 -0
- package/dist/types/core/src/atoms/look/look-problem.d.ts +7 -0
- package/dist/types/core/src/atoms/look/merge-look.d.ts +3 -0
- package/dist/types/core/src/atoms/math/mat4.d.ts +14 -0
- package/dist/types/core/src/atoms/math/quat.d.ts +18 -0
- package/dist/types/core/src/atoms/math/transform.d.ts +7 -0
- package/dist/types/core/src/atoms/math/vec3.d.ts +18 -0
- package/dist/types/core/src/atoms/palette/default-palette.d.ts +4 -0
- package/dist/types/core/src/atoms/palette/is-color-ref.d.ts +2 -0
- package/dist/types/core/src/atoms/palette/poc-color-ref.d.ts +6 -0
- package/dist/types/core/src/atoms/rig/bone-matrices.d.ts +8 -0
- package/dist/types/core/src/atoms/rig/bone-region.d.ts +8 -0
- package/dist/types/core/src/atoms/rig/bone-role.d.ts +11 -0
- package/dist/types/core/src/atoms/rig/bone-size.d.ts +7 -0
- package/dist/types/core/src/atoms/rig/compose-local.d.ts +6 -0
- package/dist/types/core/src/atoms/rig/find-rig.d.ts +11 -0
- package/dist/types/core/src/atoms/rig/mirror-partner.d.ts +3 -0
- package/dist/types/core/src/atoms/rig/mirror-sculpt.d.ts +9 -0
- package/dist/types/core/src/atoms/rig/mirror-transform.d.ts +9 -0
- package/dist/types/core/src/atoms/rig/partner-target.d.ts +3 -0
- package/dist/types/core/src/atoms/rig/pose-presets.d.ts +11 -0
- package/dist/types/core/src/atoms/rig/pose-rule.d.ts +48 -0
- package/dist/types/core/src/atoms/rig/pose-template-rules.d.ts +8 -0
- package/dist/types/core/src/atoms/rig/rebase-pose.d.ts +6 -0
- package/dist/types/core/src/atoms/rig/resize-bones.d.ts +12 -0
- package/dist/types/core/src/atoms/rig/rig-extent.d.ts +3 -0
- package/dist/types/core/src/atoms/rig/side-from-name.d.ts +7 -0
- package/dist/types/core/src/atoms/rig/size-frame.d.ts +18 -0
- package/dist/types/core/src/atoms/rig/with-slot-parts.d.ts +9 -0
- package/dist/types/core/src/atoms/scene/copy-with-new-ids.d.ts +7 -0
- package/dist/types/core/src/atoms/scene/object-tree.d.ts +8 -0
- package/dist/types/core/src/atoms/scene/place-in-order.d.ts +7 -0
- package/dist/types/core/src/atoms/scene/unique-name.d.ts +4 -0
- package/dist/types/core/src/atoms/scene/world-matrix.d.ts +4 -0
- package/dist/types/core/src/atoms/sculpt/all-sculpts.d.ts +3 -0
- package/dist/types/core/src/atoms/sculpt/is-wing-target.d.ts +3 -0
- package/dist/types/core/src/atoms/sculpt/target-sculpt.d.ts +10 -0
- package/dist/types/core/src/atoms/sculpt/update-target.d.ts +8 -0
- package/dist/types/core/src/atoms/stamp/apply-stamp-props.d.ts +11 -0
- package/dist/types/core/src/atoms/stamp/clamp-symmetry.d.ts +11 -0
- package/dist/types/core/src/atoms/stamp/clean-props.d.ts +3 -0
- package/dist/types/core/src/atoms/stamp/emptied-groups.d.ts +3 -0
- package/dist/types/core/src/atoms/stamp/move-locked-groups.d.ts +12 -0
- package/dist/types/core/src/atoms/stamp/normalize-base.d.ts +6 -0
- package/dist/types/core/src/atoms/stamp/resolve-stamp-props.d.ts +14 -0
- package/dist/types/core/src/atoms/stamp/smear.d.ts +15 -0
- package/dist/types/core/src/atoms/stamp/stamp-problem.d.ts +7 -0
- package/dist/types/core/src/atoms/wing/wing-problem.d.ts +6 -0
- package/dist/types/core/src/create-creation-api.d.ts +12 -0
- package/dist/types/core/src/decide.d.ts +4 -0
- package/dist/types/core/src/empty-creation.d.ts +2 -0
- package/dist/types/core/src/fold.d.ts +6 -0
- package/dist/types/core/src/index.d.ts +9 -0
- package/dist/types/core/src/molecules/add-body-part.d.ts +8 -0
- package/dist/types/core/src/molecules/add-bone.d.ts +8 -0
- package/dist/types/core/src/molecules/add-decals.d.ts +4 -0
- package/dist/types/core/src/molecules/add-stamps.d.ts +8 -0
- package/dist/types/core/src/molecules/apply-pose-preset.d.ts +4 -0
- package/dist/types/core/src/molecules/apply-premade.d.ts +9 -0
- package/dist/types/core/src/molecules/auto-tag-sides.d.ts +4 -0
- package/dist/types/core/src/molecules/create-rig.d.ts +4 -0
- package/dist/types/core/src/molecules/create-sculpt.d.ts +4 -0
- package/dist/types/core/src/molecules/delete-design.d.ts +4 -0
- package/dist/types/core/src/molecules/delete-objects.d.ts +4 -0
- package/dist/types/core/src/molecules/duplicate-objects.d.ts +6 -0
- package/dist/types/core/src/molecules/generate-creature.d.ts +7 -0
- package/dist/types/core/src/molecules/graft-part.d.ts +4 -0
- package/dist/types/core/src/molecules/mirror-objects.d.ts +7 -0
- package/dist/types/core/src/molecules/molecule.d.ts +17 -0
- package/dist/types/core/src/molecules/remove-body-part.d.ts +3 -0
- package/dist/types/core/src/molecules/remove-bone.d.ts +4 -0
- package/dist/types/core/src/molecules/remove-decal.d.ts +3 -0
- package/dist/types/core/src/molecules/remove-smear-group.d.ts +4 -0
- package/dist/types/core/src/molecules/remove-stamps.d.ts +4 -0
- package/dist/types/core/src/molecules/rename-bone.d.ts +3 -0
- package/dist/types/core/src/molecules/rename-object.d.ts +3 -0
- package/dist/types/core/src/molecules/reparent-bone.d.ts +4 -0
- package/dist/types/core/src/molecules/reparent-object.d.ts +4 -0
- package/dist/types/core/src/molecules/reset-palette.d.ts +3 -0
- package/dist/types/core/src/molecules/reset-pose.d.ts +3 -0
- package/dist/types/core/src/molecules/save-design.d.ts +4 -0
- package/dist/types/core/src/molecules/set-bone-sizes.d.ts +8 -0
- package/dist/types/core/src/molecules/set-bone-tags.d.ts +4 -0
- package/dist/types/core/src/molecules/set-bone-transforms.d.ts +7 -0
- package/dist/types/core/src/molecules/set-flat-wings.d.ts +4 -0
- package/dist/types/core/src/molecules/set-object-transforms.d.ts +3 -0
- package/dist/types/core/src/molecules/set-palette-color.d.ts +3 -0
- package/dist/types/core/src/molecules/set-pivot.d.ts +3 -0
- package/dist/types/core/src/molecules/set-region-blend.d.ts +4 -0
- package/dist/types/core/src/molecules/set-rig-mirror.d.ts +3 -0
- package/dist/types/core/src/molecules/set-rig-mode.d.ts +3 -0
- package/dist/types/core/src/molecules/set-sculpt-look.d.ts +7 -0
- package/dist/types/core/src/molecules/set-smear-group.d.ts +4 -0
- package/dist/types/core/src/molecules/set-stamp-placements.d.ts +4 -0
- package/dist/types/core/src/molecules/set-stamp-props.d.ts +3 -0
- package/dist/types/core/src/molecules/set-symmetry-for-all.d.ts +4 -0
- package/dist/types/core/src/molecules/swap-part-slot.d.ts +7 -0
- package/dist/types/core/src/premades/ant-bake.d.ts +2 -0
- package/dist/types/core/src/premades/bake-authoring.d.ts +35 -0
- package/dist/types/core/src/premades/bake-types.d.ts +65 -0
- package/dist/types/core/src/premades/baked-part-for.d.ts +11 -0
- package/dist/types/core/src/premades/bee-bake.d.ts +2 -0
- package/dist/types/core/src/premades/bird-bake.d.ts +2 -0
- package/dist/types/core/src/premades/body-stamps-for-bone.d.ts +14 -0
- package/dist/types/core/src/premades/bone-tree.d.ts +15 -0
- package/dist/types/core/src/premades/build-premade-rig.d.ts +23 -0
- package/dist/types/core/src/premades/build-template.d.ts +6 -0
- package/dist/types/core/src/premades/centipede-bake.d.ts +2 -0
- package/dist/types/core/src/premades/coat-stamps.d.ts +3 -0
- package/dist/types/core/src/premades/crab-bake.d.ts +2 -0
- package/dist/types/core/src/premades/dragon-bake.d.ts +2 -0
- package/dist/types/core/src/premades/face-decals.d.ts +17 -0
- package/dist/types/core/src/premades/fish-bake.d.ts +2 -0
- package/dist/types/core/src/premades/fit-part-slot.d.ts +21 -0
- package/dist/types/core/src/premades/generate-creature.d.ts +21 -0
- package/dist/types/core/src/premades/gorilla-bake.d.ts +2 -0
- package/dist/types/core/src/premades/graft-slot.d.ts +34 -0
- package/dist/types/core/src/premades/humanoid-bake.d.ts +2 -0
- package/dist/types/core/src/premades/insect6-bake.d.ts +2 -0
- package/dist/types/core/src/premades/jellyfish-bake.d.ts +2 -0
- package/dist/types/core/src/premades/lizard-bake.d.ts +2 -0
- package/dist/types/core/src/premades/make-baked-part.d.ts +9 -0
- package/dist/types/core/src/premades/make-body-part.d.ts +9 -0
- package/dist/types/core/src/premades/make-flat-part.d.ts +13 -0
- package/dist/types/core/src/premades/part-context.d.ts +20 -0
- package/dist/types/core/src/premades/part-kits.d.ts +36 -0
- package/dist/types/core/src/premades/part-slots.d.ts +17 -0
- package/dist/types/core/src/premades/part-stamp.d.ts +13 -0
- package/dist/types/core/src/premades/part-styles.d.ts +44 -0
- package/dist/types/core/src/premades/premade-fit.d.ts +18 -0
- package/dist/types/core/src/premades/premade-infos.d.ts +3 -0
- package/dist/types/core/src/premades/reseat-attachments.d.ts +31 -0
- package/dist/types/core/src/premades/rig-builder.d.ts +51 -0
- package/dist/types/core/src/premades/rodent-bake.d.ts +2 -0
- package/dist/types/core/src/premades/scorpion-bake.d.ts +2 -0
- package/dist/types/core/src/premades/shark-bake.d.ts +2 -0
- package/dist/types/core/src/premades/sitter-bake.d.ts +3 -0
- package/dist/types/core/src/premades/skeleton-bakes.d.ts +4 -0
- package/dist/types/core/src/premades/snake-bake.d.ts +2 -0
- package/dist/types/core/src/premades/spider-bake.d.ts +2 -0
- package/dist/types/core/src/premades/stamps-box.d.ts +9 -0
- package/dist/types/core/src/premades/style-for-bone.d.ts +7 -0
- package/dist/types/core/src/premades/swap-slot.d.ts +13 -0
- package/dist/types/core/src/premades/template-catalog.d.ts +20 -0
- package/dist/types/core/src/premades/template-color.d.ts +9 -0
- package/dist/types/core/src/premades/turtle-bake.d.ts +2 -0
- package/dist/types/core/src/premades/variants/aquatic-variants.d.ts +16 -0
- package/dist/types/core/src/premades/variants/coat-variants.d.ts +7 -0
- package/dist/types/core/src/premades/variants/ear-variants.d.ts +8 -0
- package/dist/types/core/src/premades/variants/fantasy-more-variants.d.ts +3 -0
- package/dist/types/core/src/premades/variants/fantasy-variants.d.ts +17 -0
- package/dist/types/core/src/premades/variants/head-variants.d.ts +9 -0
- package/dist/types/core/src/premades/variants/horn-variants.d.ts +7 -0
- package/dist/types/core/src/premades/variants/index.d.ts +10 -0
- package/dist/types/core/src/premades/variants/land-variants.d.ts +3 -0
- package/dist/types/core/src/premades/variants/leg-variants.d.ts +7 -0
- package/dist/types/core/src/premades/variants/part-variant.d.ts +14 -0
- package/dist/types/core/src/premades/variants/tail-variants.d.ts +6 -0
- package/dist/types/core/src/premades/variants/variant-authoring.d.ts +29 -0
- package/dist/types/core/src/premades/whale-bake.d.ts +2 -0
- package/dist/types/core/src/premades/wing-defaults.d.ts +4 -0
- package/dist/types/core/src/premades/wing-frame.d.ts +10 -0
- package/dist/types/core/src/premades/wolf-bake.d.ts +2 -0
- package/dist/types/core/src/premades/worm-bake.d.ts +2 -0
- package/dist/types/evaluator/src/abi.d.ts +64 -0
- package/dist/types/evaluator/src/chunks.d.ts +53 -0
- package/dist/types/evaluator/src/index.d.ts +11 -0
- package/dist/types/evaluator/src/prep/colors.d.ts +11 -0
- package/dist/types/evaluator/src/prep/mat3.d.ts +13 -0
- package/dist/types/evaluator/src/prep/pack.d.ts +23 -0
- package/dist/types/evaluator/src/prep/props.d.ts +16 -0
- package/dist/types/evaluator/src/prep/symmetry.d.ts +23 -0
- package/dist/types/evaluator/src/reference/core.d.ts +3 -0
- package/dist/types/evaluator/src/reference/mesher.d.ts +22 -0
- package/dist/types/evaluator/src/reference/skin.d.ts +8 -0
- package/dist/types/evaluator/src/session.d.ts +21 -0
- package/dist/types/evaluator/src/wasm/core.d.ts +9 -0
- package/dist/types/evaluator/src/worker/client.d.ts +28 -0
- package/dist/types/evaluator/src/worker/host.d.ts +8 -0
- package/dist/types/evaluator/src/worker/protocol.d.ts +39 -0
- package/dist/types/evaluator/src/worker/spawn.d.ts +6 -0
- package/dist/types/evaluator/src/worker/worker-inline.d.ts +1 -0
- package/dist/types/evaluator/src/worker/worker.d.ts +1 -0
- package/dist/types/module/src/index.d.ts +2 -0
- package/dist/types/module/src/ui/atoms/action-button.d.ts +10 -0
- package/dist/types/module/src/ui/atoms/badge.d.ts +9 -0
- package/dist/types/module/src/ui/atoms/checkbox.d.ts +6 -0
- package/dist/types/module/src/ui/atoms/color-input.d.ts +10 -0
- package/dist/types/module/src/ui/atoms/hex-chip.d.ts +5 -0
- package/dist/types/module/src/ui/atoms/icon-button.d.ts +14 -0
- package/dist/types/module/src/ui/atoms/icon.d.ts +8 -0
- package/dist/types/module/src/ui/atoms/kbd.d.ts +4 -0
- package/dist/types/module/src/ui/atoms/match-button.d.ts +10 -0
- package/dist/types/module/src/ui/atoms/number-input.d.ts +11 -0
- package/dist/types/module/src/ui/atoms/pill-button.d.ts +11 -0
- package/dist/types/module/src/ui/atoms/range-input.d.ts +17 -0
- package/dist/types/module/src/ui/atoms/select-input.d.ts +12 -0
- package/dist/types/module/src/ui/atoms/separator.d.ts +2 -0
- package/dist/types/module/src/ui/atoms/side-button.d.ts +13 -0
- package/dist/types/module/src/ui/atoms/swatch.d.ts +13 -0
- package/dist/types/module/src/ui/atoms/tool-button.d.ts +22 -0
- package/dist/types/module/src/ui/hooks/editor-actions.d.ts +50 -0
- package/dist/types/module/src/ui/hooks/editor-context.d.ts +37 -0
- package/dist/types/module/src/ui/hooks/use-compact.d.ts +2 -0
- package/dist/types/module/src/ui/hooks/use-editor-controller.d.ts +17 -0
- package/dist/types/module/src/ui/hooks/use-keyboard.d.ts +11 -0
- package/dist/types/module/src/ui/lib/catalog.d.ts +76 -0
- package/dist/types/module/src/ui/lib/colors.d.ts +15 -0
- package/dist/types/module/src/ui/lib/decals.d.ts +6 -0
- package/dist/types/module/src/ui/lib/design-geometry.d.ts +60 -0
- package/dist/types/module/src/ui/lib/math.d.ts +18 -0
- package/dist/types/module/src/ui/lib/placement.d.ts +8 -0
- package/dist/types/module/src/ui/lib/scene.d.ts +51 -0
- package/dist/types/module/src/ui/lib/symmetry.d.ts +5 -0
- package/dist/types/module/src/ui/lib/targets.d.ts +28 -0
- package/dist/types/module/src/ui/lib/view-state.d.ts +74 -0
- package/dist/types/module/src/ui/molecules/axis-pill.d.ts +7 -0
- package/dist/types/module/src/ui/molecules/color-field.d.ts +14 -0
- package/dist/types/module/src/ui/molecules/count-stepper.d.ts +9 -0
- package/dist/types/module/src/ui/molecules/floating-panel.d.ts +26 -0
- package/dist/types/module/src/ui/molecules/help-row.d.ts +8 -0
- package/dist/types/module/src/ui/molecules/inline-edit.d.ts +9 -0
- package/dist/types/module/src/ui/molecules/list-row.d.ts +25 -0
- package/dist/types/module/src/ui/molecules/modal.d.ts +11 -0
- package/dist/types/module/src/ui/molecules/mode-pill.d.ts +7 -0
- package/dist/types/module/src/ui/molecules/scroll-row.d.ts +10 -0
- package/dist/types/module/src/ui/molecules/slider-row.d.ts +16 -0
- package/dist/types/module/src/ui/molecules/swatch-row.d.ts +11 -0
- package/dist/types/module/src/ui/molecules/tab-bar.d.ts +9 -0
- package/dist/types/module/src/ui/molecules/toolbar-pill.d.ts +7 -0
- package/dist/types/module/src/ui/molecules/toolbar.d.ts +10 -0
- package/dist/types/module/src/ui/molecules/vec3-field.d.ts +10 -0
- package/dist/types/module/src/ui/organisms/bone-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/bone-size-sliders.d.ts +9 -0
- package/dist/types/module/src/ui/organisms/category-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/decal-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/decal-editor.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/fleck-style-tab.d.ts +7 -0
- package/dist/types/module/src/ui/organisms/git-sync-panel.d.ts +10 -0
- package/dist/types/module/src/ui/organisms/help-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/material-tab.d.ts +3 -0
- package/dist/types/module/src/ui/organisms/object-list-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/palette-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/parts-tab.d.ts +26 -0
- package/dist/types/module/src/ui/organisms/pattern-tab.d.ts +3 -0
- package/dist/types/module/src/ui/organisms/pose-tab.d.ts +8 -0
- package/dist/types/module/src/ui/organisms/premade-picker.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/properties-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/region-blends.d.ts +5 -0
- package/dist/types/module/src/ui/organisms/rendering-bar.d.ts +5 -0
- package/dist/types/module/src/ui/organisms/rig-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/scenes-modal.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/select-hint.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/shape-list-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/side-dock.d.ts +4 -0
- package/dist/types/module/src/ui/organisms/stamp-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/stamp-props-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/stamp-size-panel.d.ts +4 -0
- package/dist/types/module/src/ui/organisms/stats-badge.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/style-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/symmetry-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/toast.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/token-guide.d.ts +5 -0
- package/dist/types/module/src/ui/organisms/touch-mods.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/transform-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/transform-tab.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/utilities-bar.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/viewport-host.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/voxel-panel.d.ts +2 -0
- package/dist/types/module/src/ui/organisms/wing-tab.d.ts +10 -0
- package/dist/types/module/src/ui/pages/editor-page.d.ts +9 -0
- package/dist/types/module/src/ui/templates/editor-shell.d.ts +2 -0
- package/dist/types/studio/src/browser-files.d.ts +3 -0
- package/dist/types/studio/src/clock.d.ts +2 -0
- package/dist/types/studio/src/creation-file.d.ts +21 -0
- package/dist/types/studio/src/git-remote.d.ts +36 -0
- package/dist/types/studio/src/git-sync.d.ts +33 -0
- package/dist/types/studio/src/ids.d.ts +3 -0
- package/dist/types/studio/src/index.d.ts +15 -0
- package/dist/types/studio/src/indexed-db-library.d.ts +2 -0
- package/dist/types/studio/src/library-persistence.d.ts +29 -0
- package/dist/types/studio/src/library-sync.d.ts +29 -0
- package/dist/types/studio/src/preferences.d.ts +9 -0
- package/dist/types/studio/src/seed.d.ts +3 -0
- package/dist/types/studio/src/studio.d.ts +17 -0
- package/dist/types/viewport/src/create-viewport.d.ts +10 -0
- package/dist/types/viewport/src/decals/builtin-art.d.ts +19 -0
- package/dist/types/viewport/src/decals/builtin-docs.d.ts +7 -0
- package/dist/types/viewport/src/decals/decal-atlas.d.ts +37 -0
- package/dist/types/viewport/src/decals/decal-catalog.d.ts +17 -0
- package/dist/types/viewport/src/decals/decal-glsl.d.ts +2 -0
- package/dist/types/viewport/src/decals/decal-limits.d.ts +11 -0
- package/dist/types/viewport/src/decals/decal-uniforms.d.ts +40 -0
- package/dist/types/viewport/src/decals/design-raster.d.ts +8 -0
- package/dist/types/viewport/src/decals/interior-thumbs.d.ts +6 -0
- package/dist/types/viewport/src/index.d.ts +1 -0
- package/dist/types/viewport/src/interaction/bone-tool.d.ts +13 -0
- package/dist/types/viewport/src/interaction/bones-visible.d.ts +7 -0
- package/dist/types/viewport/src/interaction/cursor.d.ts +3 -0
- package/dist/types/viewport/src/interaction/decal-tool.d.ts +18 -0
- package/dist/types/viewport/src/interaction/esc-hold.d.ts +13 -0
- package/dist/types/viewport/src/interaction/ghost-geometry.d.ts +6 -0
- package/dist/types/viewport/src/interaction/gizmo.d.ts +34 -0
- package/dist/types/viewport/src/interaction/interaction-context.d.ts +41 -0
- package/dist/types/viewport/src/interaction/marquee.d.ts +8 -0
- package/dist/types/viewport/src/interaction/pivot-helper.d.ts +13 -0
- package/dist/types/viewport/src/interaction/select-tool.d.ts +30 -0
- package/dist/types/viewport/src/interaction/selection-boxes.d.ts +11 -0
- package/dist/types/viewport/src/interaction/stamp-tool.d.ts +41 -0
- package/dist/types/viewport/src/interaction/stamp-wires.d.ts +18 -0
- package/dist/types/viewport/src/interaction/surface-hit.d.ts +14 -0
- package/dist/types/viewport/src/materials/fleck-material.d.ts +69 -0
- package/dist/types/viewport/src/materials/global-uniforms.d.ts +15 -0
- package/dist/types/viewport/src/materials/skin.d.ts +18 -0
- package/dist/types/viewport/src/materials/wing-material.d.ts +21 -0
- package/dist/types/viewport/src/math/colors.d.ts +29 -0
- package/dist/types/viewport/src/math/convert.d.ts +15 -0
- package/dist/types/viewport/src/math/decal-pose.d.ts +7 -0
- package/dist/types/viewport/src/math/lod.d.ts +16 -0
- package/dist/types/viewport/src/math/picking.d.ts +32 -0
- package/dist/types/viewport/src/math/pixel-palette.d.ts +15 -0
- package/dist/types/viewport/src/math/screen.d.ts +26 -0
- package/dist/types/viewport/src/math/skeleton-math.d.ts +32 -0
- package/dist/types/viewport/src/math/smear.d.ts +20 -0
- package/dist/types/viewport/src/math/symmetry.d.ts +21 -0
- package/dist/types/viewport/src/objects/default-look.d.ts +3 -0
- package/dist/types/viewport/src/objects/mesh-driver.d.ts +26 -0
- package/dist/types/viewport/src/objects/mesh-key.d.ts +8 -0
- package/dist/types/viewport/src/objects/rig-view.d.ts +31 -0
- package/dist/types/viewport/src/objects/scene-views.d.ts +53 -0
- package/dist/types/viewport/src/objects/sculpt-view.d.ts +66 -0
- package/dist/types/viewport/src/objects/view-context.d.ts +19 -0
- package/dist/types/viewport/src/objects/wing-view.d.ts +27 -0
- package/dist/types/viewport/src/rig/bone-viz.d.ts +13 -0
- package/dist/types/viewport/src/scene/camera-motion.d.ts +10 -0
- package/dist/types/viewport/src/scene/camera-sun.d.ts +3 -0
- package/dist/types/viewport/src/scene/environment.d.ts +3 -0
- package/dist/types/viewport/src/scene/frame-camera.d.ts +10 -0
- package/dist/types/viewport/src/scene/play-mode.d.ts +9 -0
- package/dist/types/viewport/src/scene/render-pipeline.d.ts +26 -0
- package/dist/types/viewport/src/scene/render-settings.d.ts +18 -0
- package/dist/types/viewport/src/scene/resolve-frag.d.ts +3 -0
- package/dist/types/viewport/src/scene/stage.d.ts +38 -0
- package/dist/types/viewport/src/scene/stress-test.d.ts +6 -0
- package/dist/types/viewport/src/wings/wing-mesh.d.ts +19 -0
- package/dist/types/viewport/src/wings/wing-outlines.d.ts +32 -0
- package/dist/types/viewport/src/wings/wing-pattern.d.ts +7 -0
- package/dist/viewport.d.ts +1 -0
- package/dist/viewport.js +8 -0
- package/dist/viewport.js.map +7 -0
- package/package.json +74 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../module/src/ui/pages/editor-page.tsx", "../../module/src/ui/hooks/editor-context.ts", "../../module/src/ui/hooks/use-editor-controller.ts", "../../module/src/ui/lib/scene.ts", "../../module/src/ui/lib/view-state.ts", "../../module/src/ui/lib/catalog.ts", "../../module/src/ui/lib/math.ts", "../../module/src/ui/hooks/editor-actions.ts", "../../module/src/ui/hooks/use-compact.ts", "../../module/src/ui/hooks/use-keyboard.ts", "../../module/src/ui/molecules/floating-panel.tsx", "../../module/src/ui/atoms/icon.tsx", "../../module/src/ui/templates/editor-shell.tsx", "../../module/src/ui/organisms/bone-panel.tsx", "../../module/src/ui/atoms/icon-button.tsx", "../../module/src/ui/atoms/match-button.tsx", "../../module/src/ui/atoms/side-button.tsx", "../../module/src/ui/molecules/inline-edit.tsx", "../../module/src/ui/molecules/list-row.tsx", "../../module/src/ui/molecules/slider-row.tsx", "../../module/src/ui/atoms/range-input.tsx", "../../module/src/ui/organisms/bone-size-sliders.tsx", "../../module/src/ui/organisms/region-blends.tsx", "../../module/src/ui/atoms/separator.tsx", "../../module/src/ui/atoms/tool-button.tsx", "../../module/src/ui/molecules/toolbar.tsx", "../../module/src/ui/organisms/category-bar.tsx", "../../module/src/ui/organisms/decal-bar.tsx", "../../module/src/ui/atoms/color-input.tsx", "../../module/src/ui/lib/colors.ts", "../../module/src/ui/lib/decals.ts", "../../module/src/ui/molecules/scroll-row.tsx", "../../module/src/ui/atoms/swatch.tsx", "../../module/src/ui/molecules/swatch-row.tsx", "../../module/src/ui/organisms/decal-editor.tsx", "../../module/src/ui/atoms/action-button.tsx", "../../module/src/ui/atoms/select-input.tsx", "../../module/src/ui/lib/design-geometry.ts", "../../module/src/ui/atoms/kbd.tsx", "../../module/src/ui/molecules/help-row.tsx", "../../module/src/ui/organisms/help-panel.tsx", "../../module/src/ui/organisms/object-list-panel.tsx", "../../module/src/ui/organisms/palette-panel.tsx", "../../module/src/ui/organisms/premade-picker.tsx", "../../module/src/ui/atoms/checkbox.tsx", "../../module/src/ui/lib/placement.ts", "../../module/src/ui/molecules/modal.tsx", "../../module/src/ui/organisms/parts-tab.tsx", "../../module/src/ui/lib/targets.ts", "../../module/src/ui/molecules/tab-bar.tsx", "../../module/src/ui/molecules/color-field.tsx", "../../module/src/ui/organisms/fleck-style-tab.tsx", "../../module/src/ui/organisms/material-tab.tsx", "../../module/src/ui/organisms/pattern-tab.tsx", "../../module/src/ui/organisms/pose-tab.tsx", "../../module/src/ui/atoms/number-input.tsx", "../../module/src/ui/molecules/vec3-field.tsx", "../../module/src/ui/organisms/transform-tab.tsx", "../../module/src/ui/organisms/wing-tab.tsx", "../../module/src/ui/organisms/properties-panel.tsx", "../../module/src/ui/atoms/hex-chip.tsx", "../../module/src/ui/atoms/pill-button.tsx", "../../module/src/ui/molecules/toolbar-pill.tsx", "../../module/src/ui/organisms/rendering-bar.tsx", "../../module/src/ui/atoms/badge.tsx", "../../module/src/ui/organisms/rig-bar.tsx", "../../module/src/ui/organisms/scenes-modal.tsx", "../../module/src/ui/organisms/git-sync-panel.tsx", "../../module/src/ui/organisms/token-guide.tsx", "../../module/src/ui/organisms/select-hint.tsx", "../../module/src/ui/organisms/shape-list-panel.tsx", "../../module/src/ui/organisms/side-dock.tsx", "../../module/src/ui/molecules/mode-pill.tsx", "../../module/src/ui/organisms/stamp-bar.tsx", "../../module/src/ui/lib/symmetry.ts", "../../module/src/ui/molecules/axis-pill.tsx", "../../module/src/ui/molecules/count-stepper.tsx", "../../module/src/ui/organisms/stamp-props-panel.tsx", "../../module/src/ui/organisms/stamp-size-panel.tsx", "../../module/src/ui/organisms/stats-badge.tsx", "../../module/src/ui/organisms/style-bar.tsx", "../../module/src/ui/organisms/symmetry-bar.tsx", "../../module/src/ui/organisms/toast.tsx", "../../module/src/ui/organisms/touch-mods.tsx", "../../module/src/ui/organisms/transform-bar.tsx", "../../module/src/ui/organisms/utilities-bar.tsx", "../../module/src/ui/organisms/viewport-host.tsx", "../../module/src/ui/organisms/voxel-panel.tsx", "../../studio/src/studio.tsx", "../../studio/src/browser-files.ts", "../../studio/src/clock.ts", "../../studio/src/creation-file.ts", "../../studio/src/git-remote.ts", "../../studio/src/library-sync.ts", "../../studio/src/git-sync.ts", "../../studio/src/ids.ts", "../../studio/src/indexed-db-library.ts", "../../studio/src/library-persistence.ts", "../../studio/src/preferences.ts", "../../studio/src/seed.ts"],
|
|
4
|
+
"sourcesContent": ["\"use client\";\n\nimport \"../studio.css\";\nimport { useRef } from \"react\";\nimport { EditorContext } from \"../hooks/editor-context.js\";\nimport { useEditorController, type EditorControllerProps } from \"../hooks/use-editor-controller.js\";\nimport { useKeyboard } from \"../hooks/use-keyboard.js\";\nimport { PanelLayerContext } from \"../molecules/floating-panel.js\";\nimport { EditorShell } from \"../templates/editor-shell.js\";\n\n/**\n * One open creation in the studio. Logic comes from `api`; the 3D view is the injected `viewport`, mounted into\n * a host element; `persistence` backs the Scenes dialog and autosave; `preferences` holds per-browser view\n * settings. `onOpen` asks the host to switch to another library entry.\n */\nexport type EditorPageProps = EditorControllerProps;\n\nexport function EditorPage(props: EditorPageProps) {\n const editor = useEditorController(props);\n useKeyboard(editor);\n const layer = useRef({ top: 70 });\n return (\n <PanelLayerContext.Provider value={layer.current}>\n <EditorContext.Provider value={editor}>\n <EditorShell />\n </EditorContext.Provider>\n </PanelLayerContext.Provider>\n );\n}\n", "import type {\n Command,\n Creation,\n CreationApi,\n DecalCatalogEntry,\n DispatchResult,\n Id,\n LibrarySync,\n Persistence,\n ViewPreferences,\n Viewport,\n ViewportCallbacks,\n} from \"@dreamy/api\";\nimport { createContext, useContext } from \"react\";\nimport type { ViewState } from \"../lib/view-state.js\";\nimport type { EditorActions } from \"./editor-actions.js\";\n\n/** One open creation and its view state, shared by the page's organisms. Scoped to one page: not a global store. */\nexport type Editor = {\n readonly api: CreationApi;\n readonly viewport: Viewport;\n readonly persistence: Persistence;\n readonly sync: LibrarySync | undefined;\n readonly creationId: Id;\n readonly onOpen: (id: Id) => void;\n readonly creation: Creation;\n readonly view: ViewState;\n readonly compact: boolean;\n readonly stats: string;\n readonly toastMessage: { readonly text: string; readonly key: number } | undefined;\n /** Esc hold progress in sculpt mode, 0\u20131. */\n readonly escHold: number;\n readonly catalog: readonly (DecalCatalogEntry & { readonly category: string })[];\n readonly callbacks: ViewportCallbacks;\n readonly actions: EditorActions;\n update(change: (view: ViewState) => ViewState): void;\n /** Dispatches through the contract; a rejection shows the core's reason. True when accepted. */\n dispatch(command: Command): boolean;\n run(command: Command): DispatchResult;\n toast(message: string): void;\n setPrefs(patch: Partial<ViewPreferences>): void;\n /** Saves the open creation's log now (with a viewport thumbnail). */\n save(): Promise<void>;\n};\n\nexport const EditorContext = createContext<Editor | undefined>(undefined);\n\nexport function useEditor(): Editor {\n const editor = useContext(EditorContext);\n if (!editor) throw new Error(\"useEditor outside an EditorPage\");\n return editor;\n}\n", "import type {\n Command,\n Creation,\n CreationApi,\n DispatchResult,\n Id,\n LibrarySync,\n Persistence,\n PreferencesStore,\n ViewPreferences,\n Viewport,\n ViewportCallbacks,\n} from \"@dreamy/api\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { initialViewState, pruneView, selectCreated, type ViewState } from \"../lib/view-state.js\";\nimport { editorActions } from \"./editor-actions.js\";\nimport type { Editor } from \"./editor-context.js\";\nimport { useCompact } from \"./use-compact.js\";\n\nexport type EditorControllerProps = {\n readonly api: CreationApi;\n readonly viewport: Viewport;\n readonly persistence: Persistence;\n readonly preferences: PreferencesStore;\n readonly creationId: Id;\n readonly onOpen: (id: Id) => void;\n /** Git sync of the library, when the host offers it (Scenes dialog). */\n readonly sync?: LibrarySync;\n};\n\nconst AUTOSAVE_MS = 3000;\nconst ESC_HOLD_MS = 1000;\n\n/** The page's state: the folded creation, the view state, toasts, stats, autosave and the Esc hold. */\nexport function useEditorController(props: EditorControllerProps): Editor & { escDown(): void; escUp(cancelled?: boolean): void } {\n const { api, viewport, persistence, preferences, creationId, onOpen, sync } = props;\n const compact = useCompact();\n const [creation, setCreation] = useState<Creation>(() => api.creation());\n const [view, setView] = useState<ViewState>(() => initialViewState(preferences.load(), compact));\n const [toastMessage, setToastMessage] = useState<{ text: string; key: number } | undefined>(undefined);\n const [stats, setStats] = useState(\"\");\n const [escHold, setEscHold] = useState(0);\n\n const viewRef = useRef(view);\n viewRef.current = view;\n const saveTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const holdRef = useRef<{ start: number; timer: ReturnType<typeof setInterval>; done: boolean } | undefined>(undefined);\n const firstPrefs = useRef(true);\n\n useEffect(() => setCreation(api.creation()), [api]);\n\n const update = useCallback((change: (current: ViewState) => ViewState) => {\n setView((current) => {\n const next = change(current);\n viewRef.current = next;\n return next;\n });\n }, []);\n\n const toast = useCallback((text: string) => setToastMessage((current) => ({ text, key: (current?.key ?? 0) + 1 })), []);\n\n const save = useCallback(async () => {\n if (saveTimer.current) clearTimeout(saveTimer.current);\n saveTimer.current = undefined;\n try {\n await persistence.save(creationId, api.log(), viewport.thumbnail());\n } catch {\n toast(\"Could not save the creation\");\n }\n }, [api, creationId, persistence, toast, viewport]);\n\n const saveRef = useRef(save);\n saveRef.current = save;\n\n const scheduleSave = useCallback(() => {\n if (saveTimer.current) clearTimeout(saveTimer.current);\n saveTimer.current = setTimeout(() => void saveRef.current(), AUTOSAVE_MS);\n }, []);\n\n useEffect(\n () => () => {\n if (saveTimer.current) void saveRef.current();\n if (holdRef.current) clearInterval(holdRef.current.timer);\n },\n [],\n );\n\n const changed = useCallback(\n (before: Creation, after: Creation, command?: Command) => {\n setCreation(after);\n update((current) => pruneView(command ? selectCreated(current, before, after, command) : current, after));\n scheduleSave();\n },\n [scheduleSave, update],\n );\n\n const run = useCallback(\n (command: Command): DispatchResult => {\n const before = api.creation();\n const result = api.dispatch(command);\n if (!result.ok) {\n toast(result.reason);\n return result;\n }\n changed(before, result.creation, command);\n return result;\n },\n [api, changed, toast],\n );\n\n const dispatch = useCallback((command: Command) => run(command).ok, [run]);\n\n const undo = useCallback(() => {\n if (!api.canUndo()) return;\n const before = api.creation();\n api.undo();\n changed(before, api.creation());\n }, [api, changed]);\n\n const redo = useCallback(() => {\n if (!api.canRedo()) return;\n const before = api.creation();\n api.redo();\n changed(before, api.creation());\n }, [api, changed]);\n\n const setPrefs = useCallback((patch: Partial<ViewPreferences>) => update((current) => ({ ...current, prefs: { ...current.prefs, ...patch } })), [update]);\n\n useEffect(() => {\n if (firstPrefs.current) {\n firstPrefs.current = false;\n return;\n }\n preferences.save(view.prefs);\n }, [preferences, view.prefs]);\n\n const actions = useMemo(\n () => editorActions({ api, persistence, view: () => viewRef.current, update, dispatch, toast, undo, redo }),\n [api, persistence, update, dispatch, toast, undo, redo],\n );\n\n const callbacks = useMemo<ViewportCallbacks>(\n () => ({\n command: (command) => run(command),\n select: (selection) =>\n update((current) => ({\n ...current,\n selection:\n current.mode === \"sculpt\" && current.scope\n ? { ...selection, objectIds: [current.scope.objectId] }\n : selection,\n touchArea: false,\n })),\n focus: (objectId) => actions.focus(objectId),\n scopeOut: () => actions.scopeOut(),\n toast,\n stats: setStats,\n }),\n [actions, run, toast, update],\n );\n\n const escUp = useCallback(\n (cancelled = false) => {\n const hold = holdRef.current;\n if (!hold) return;\n holdRef.current = undefined;\n clearInterval(hold.timer);\n setEscHold(0);\n if (hold.done || cancelled || viewRef.current.mode !== \"sculpt\") return;\n actions.escapeTap();\n },\n [actions],\n );\n\n /** Esc in sculpt mode: hold for a second to leave, tap for the Select tool. */\n const escDown = useCallback(() => {\n if (viewRef.current.mode !== \"sculpt\" || viewRef.current.open.help) {\n actions.escapeStep();\n return;\n }\n if (holdRef.current) return;\n const start = Date.now();\n const timer = setInterval(() => {\n const hold = holdRef.current;\n if (!hold || hold.done) return;\n if (viewRef.current.mode !== \"sculpt\") {\n escUp(true);\n return;\n }\n const progress = Math.min(1, (Date.now() - hold.start) / ESC_HOLD_MS);\n setEscHold(progress);\n if (progress >= 1) {\n hold.done = true;\n clearInterval(hold.timer);\n setEscHold(0);\n actions.scopeOut();\n }\n }, 16);\n holdRef.current = { start, timer, done: false };\n }, [actions, escUp]);\n\n const catalog = useMemo(() => viewport.decalCatalog(creation), [viewport, creation]);\n\n return {\n api,\n viewport,\n persistence,\n sync,\n creationId,\n onOpen,\n creation,\n view,\n compact,\n stats,\n toastMessage,\n escHold,\n catalog,\n callbacks,\n actions,\n update,\n dispatch,\n run,\n toast,\n setPrefs,\n save,\n escDown,\n escUp,\n };\n}\n", "import type {\n BodyPart,\n Bone,\n Creation,\n Design,\n Id,\n RigObject,\n SceneObject,\n Sculpt,\n SculptTarget,\n SmearGroup,\n Stamp,\n Vec3,\n} from \"@dreamy/api\";\n\n/** Read-only lookups over a folded creation. No rule of the domain lives here. */\n\nexport function objectById(creation: Creation, id: Id | undefined): SceneObject | undefined {\n return id === undefined ? undefined : creation.objects.find((object) => object.id === id);\n}\n\nexport function rigById(creation: Creation, id: Id | undefined): RigObject | undefined {\n const object = objectById(creation, id);\n return object?.kind === \"rig\" ? object : undefined;\n}\n\n/** Objects under a parent (undefined: the scene root), in scene order. */\nexport function childrenOf(creation: Creation, parentId: Id | undefined): readonly SceneObject[] {\n return creation.objects.filter((object) => object.parentId === parentId);\n}\n\nexport function boneOf(rig: RigObject, boneId: Id | undefined): Bone | undefined {\n return boneId === undefined ? undefined : rig.rig.bones.find((bone) => bone.id === boneId);\n}\n\nexport function partOf(rig: RigObject, boneId: Id | undefined): BodyPart | undefined {\n return boneId === undefined ? undefined : rig.rig.parts.find((part) => part.boneId === boneId);\n}\n\n/** The sculpt a target names: a sculpt object, a rig's skinned body, or a bone's sculpt part. */\nexport function sculptOf(creation: Creation, target: SculptTarget | undefined): Sculpt | undefined {\n if (!target) return undefined;\n const object = objectById(creation, target.objectId);\n if (!object) return undefined;\n if (\"boneId\" in target) {\n if (object.kind !== \"rig\") return undefined;\n const part = partOf(object, target.boneId);\n return part?.kind === \"sculpt\" ? part.sculpt : undefined;\n }\n return object.kind === \"sculpt\" ? object.sculpt : object.rig.body;\n}\n\nexport function sameTarget(a: SculptTarget | undefined, b: SculptTarget | undefined): boolean {\n if (!a || !b) return a === b;\n const boneA = \"boneId\" in a ? a.boneId : undefined;\n const boneB = \"boneId\" in b ? b.boneId : undefined;\n return a.objectId === b.objectId && boneA === boneB;\n}\n\nexport function targetBone(target: SculptTarget | undefined): Id | undefined {\n return target && \"boneId\" in target ? target.boneId : undefined;\n}\n\n/** Every sculpt target an object owns: its own sculpt, a rig's body and its sculpt parts. */\nexport function sculptTargetsOf(object: SceneObject): readonly SculptTarget[] {\n if (object.kind === \"sculpt\") return [{ objectId: object.id }];\n const parts = object.rig.parts\n .filter((part) => part.kind === \"sculpt\")\n .map((part) => ({ objectId: object.id, boneId: part.boneId }));\n return object.rig.body ? [{ objectId: object.id }, ...parts] : parts;\n}\n\n/** Bones in tree order (depth first, children in list order), with their depth. */\nexport function boneTree(rig: RigObject): readonly { readonly bone: Bone; readonly depth: number }[] {\n const bones = rig.rig.bones;\n const ids = new Set(bones.map((bone) => bone.id));\n const out: { bone: Bone; depth: number }[] = [];\n const walk = (parentId: Id | undefined, depth: number) => {\n bones\n .filter((bone) => (parentId === undefined ? bone.parentId === undefined || !ids.has(bone.parentId) : bone.parentId === parentId))\n .forEach((bone) => {\n out.push({ bone, depth });\n walk(bone.id, depth + 1);\n });\n };\n walk(undefined, 0);\n return out;\n}\n\n/** Object ids of an object and everything under it. */\nexport function subtreeIds(creation: Creation, id: Id): readonly Id[] {\n const out: Id[] = [id];\n childrenOf(creation, id).forEach((child) => out.push(...subtreeIds(creation, child.id)));\n return out;\n}\n\nexport function groupOf(sculpt: Sculpt, stamp: Stamp | undefined): SmearGroup | undefined {\n const groupId = stamp?.smearGroupId;\n return groupId === undefined ? undefined : sculpt.smearGroups.find((group) => group.id === groupId);\n}\n\nexport function groupMembers(sculpt: Sculpt, groupId: Id): readonly Stamp[] {\n return sculpt.stamps.filter((stamp) => stamp.smearGroupId === groupId);\n}\n\nexport type StampRow =\n | { readonly kind: \"stamp\"; readonly stamp: Stamp; readonly index: number }\n | { readonly kind: \"group\"; readonly group: SmearGroup; readonly members: readonly { readonly stamp: Stamp; readonly index: number }[] };\n\n/** The shape list: loose stamps, and each smear group once where its first member sits. */\nexport function stampRows(sculpt: Sculpt): readonly StampRow[] {\n const rows: StampRow[] = [];\n const seen = new Set<Id>();\n sculpt.stamps.forEach((stamp, index) => {\n const group = groupOf(sculpt, stamp);\n if (!group) {\n rows.push({ kind: \"stamp\", stamp, index });\n return;\n }\n if (seen.has(group.id)) return;\n seen.add(group.id);\n const members = sculpt.stamps\n .map((member, memberIndex) => ({ stamp: member, index: memberIndex }))\n .filter((entry) => entry.stamp.smearGroupId === group.id);\n rows.push({ kind: \"group\", group, members });\n });\n return rows;\n}\n\n/** What one pick selects: a locked smear group selects all its stamps. */\nexport function pickStamp(sculpt: Sculpt, stampId: Id): readonly Id[] {\n const stamp = sculpt.stamps.find((entry) => entry.id === stampId);\n const group = groupOf(sculpt, stamp);\n if (group && !group.unlocked) return groupMembers(sculpt, group.id).map((member) => member.id);\n return stamp ? [stamp.id] : [];\n}\n\n/** The steps of the stamp stepper: locked groups count once. */\nexport function stampSteps(sculpt: Sculpt): readonly (readonly Id[])[] {\n const steps: Id[][] = [];\n const seen = new Set<Id>();\n sculpt.stamps.forEach((stamp) => {\n const group = groupOf(sculpt, stamp);\n if (group && !group.unlocked) {\n if (seen.has(group.id)) return;\n seen.add(group.id);\n }\n steps.push([...pickStamp(sculpt, stamp.id)]);\n });\n return steps;\n}\n\n/** The smear group a selection is exactly (all of its stamps and nothing else), if any. */\nexport function selectedGroup(sculpt: Sculpt, stampIds: readonly Id[]): SmearGroup | undefined {\n const first = sculpt.stamps.find((stamp) => stamp.id === stampIds[0]);\n const group = groupOf(sculpt, first);\n if (!group) return undefined;\n const members = groupMembers(sculpt, group.id).map((member) => member.id);\n return members.length === stampIds.length && members.every((id) => stampIds.includes(id)) ? group : undefined;\n}\n\n/** Axis-aligned box of a sculpt's stamps in its local space (stamp rotation and symmetry ignored). */\nexport function stampBounds(sculpt: Sculpt): { readonly center: Vec3; readonly halfSize: Vec3 } | undefined {\n if (sculpt.stamps.length === 0) return undefined;\n const min = { x: Infinity, y: Infinity, z: Infinity };\n const max = { x: -Infinity, y: -Infinity, z: -Infinity };\n sculpt.stamps.forEach((stamp) => {\n ([\"x\", \"y\", \"z\"] as const).forEach((axis) => {\n min[axis] = Math.min(min[axis], stamp.position[axis] - Math.abs(stamp.scale[axis]) / 2);\n max[axis] = Math.max(max[axis], stamp.position[axis] + Math.abs(stamp.scale[axis]) / 2);\n });\n });\n return {\n center: { x: (min.x + max.x) / 2, y: (min.y + max.y) / 2, z: (min.z + max.z) / 2 },\n halfSize: { x: (max.x - min.x) / 2, y: (max.y - min.y) / 2, z: (max.z - min.z) / 2 },\n };\n}\n\n/** Designs a set of sculpts places as decals. */\nexport function designsUsedBy(creation: Creation, sculpts: readonly Sculpt[]): readonly Design[] {\n const ids = new Set<Id>();\n sculpts.forEach((sculpt) =>\n sculpt.decals.forEach((decal) => {\n if (decal.art.kind === \"design\") ids.add(decal.art.designId);\n }),\n );\n return creation.designs.filter((design) => ids.has(design.id));\n}\n\nexport function sculptsOfObject(object: SceneObject): readonly Sculpt[] {\n if (object.kind === \"sculpt\") return [object.sculpt];\n const parts = object.rig.parts.flatMap((part) => (part.kind === \"sculpt\" ? [part.sculpt] : []));\n return object.rig.body ? [object.rig.body, ...parts] : parts;\n}\n", "import type {\n BoneTool,\n Command,\n Creation,\n DecalBrush,\n Id,\n SculptTarget,\n Selection,\n StampBrush,\n Tool,\n ViewPreferences,\n ViewSession,\n} from \"@dreamy/api\";\nimport { boneOf, objectById, pickStamp, rigById, sculptOf, targetBone } from \"./scene.js\";\n\nexport type Category = \"transform\" | \"shape\" | \"style\" | \"decal\" | \"symmetry\" | \"skeleton\" | \"rendering\" | \"utilities\";\n\n/** Panels that become bottom sheets in the compact layout (one shown at a time). */\nexport type SheetKey = \"properties\" | \"stampProps\" | \"palette\" | \"voxel\" | \"help\" | \"shapes\" | \"bones\" | \"objects\";\n\nexport type PropertiesTab = \"transform\" | \"style\" | \"material\" | \"pattern\" | \"wing\" | \"pose\" | \"parts\";\n\nexport type TransformTool = \"select\" | \"translate\" | \"rotate\" | \"scale\" | \"pivot\";\n\n/** Everything the studio shows besides the creation. View state: never stored in the creation. */\nexport type ViewState = {\n readonly mode: \"assembly\" | \"sculpt\";\n readonly scope?: SculptTarget;\n readonly selection: Selection;\n readonly category: Category;\n readonly tool: Tool;\n /** The Transform bar's tool, restored when the category comes back. */\n readonly transformTool: TransformTool;\n readonly space: \"world\" | \"local\";\n readonly brush: StampBrush;\n readonly decalBrush: DecalBrush;\n readonly decalCategory: string;\n readonly boneTool: BoneTool;\n /** The pivot tool's gizmo: move or turn the pivot. */\n readonly pivotGizmo: \"translate\" | \"rotate\";\n /** Rigs whose bones are hidden (the object list's eye toggle). */\n readonly hiddenBones: readonly Id[];\n readonly touchArea: boolean;\n readonly touchAdd: boolean;\n readonly play: boolean;\n readonly stressTest: boolean;\n readonly prefs: ViewPreferences;\n /** Floating panels the user opened. */\n readonly open: { readonly [Key in \"properties\" | \"stampProps\" | \"palette\" | \"voxel\" | \"help\"]: boolean };\n /** Left-stack lists shrunk to their icon. */\n readonly minimized: { readonly [Key in \"shapes\" | \"bones\" | \"objects\"]: boolean };\n /** Sheets in the order they were opened (newest last). */\n readonly sheetOrder: readonly SheetKey[];\n readonly propertiesTab: PropertiesTab;\n readonly editAllParts: boolean;\n readonly premadeOpen: boolean;\n readonly scenesOpen: boolean;\n /** The decal design editor: closed, a new design, or a design to edit. */\n readonly decalEditor: null | { readonly designId?: Id };\n /** Expanded rows of the object list. */\n readonly expanded: readonly Id[];\n};\n\nexport const EMPTY_SELECTION: Selection = { objectIds: [], stampIds: [] };\n\nexport const DEFAULT_BRUSH: StampBrush = {\n shape: \"cube\",\n mode: \"add\",\n size: 1.8,\n color: \"secondary\",\n smear: false,\n blend: 0.3,\n symmetry: { count: 1, axes: [] },\n};\n\nexport const DEFAULT_DECAL_BRUSH: DecalBrush = {\n size: 1,\n roll: 0,\n flip: false,\n tint: \"black\",\n eraser: false,\n depth: 1,\n};\n\nexport function initialViewState(prefs: ViewPreferences, compact: boolean): ViewState {\n return {\n mode: \"assembly\",\n selection: EMPTY_SELECTION,\n category: \"transform\",\n tool: \"select\",\n transformTool: \"select\",\n space: \"world\",\n brush: DEFAULT_BRUSH,\n decalBrush: DEFAULT_DECAL_BRUSH,\n decalCategory: \"eye\",\n boneTool: \"select\",\n pivotGizmo: \"translate\",\n hiddenBones: [],\n touchArea: false,\n touchAdd: false,\n play: false,\n stressTest: false,\n prefs,\n open: { properties: false, stampProps: false, palette: false, voxel: false, help: false },\n minimized: { shapes: false, bones: compact, objects: compact },\n sheetOrder: [],\n propertiesTab: \"transform\",\n editAllParts: false,\n premadeOpen: false,\n scenesOpen: false,\n decalEditor: null,\n expanded: [],\n };\n}\n\n/** What the viewport is sent with every change. */\nexport function viewSession(view: ViewState): ViewSession {\n return {\n mode: view.mode,\n ...(view.scope ? { scope: view.scope } : {}),\n selection: view.selection,\n tool: view.tool,\n space: view.space,\n brush: view.brush,\n decalBrush: view.decalBrush,\n boneTool: view.boneTool,\n pivotGizmo: view.pivotGizmo,\n hiddenBones: view.hiddenBones,\n showBones: view.category === \"skeleton\",\n touchArea: view.touchArea,\n touchAdd: view.touchAdd,\n prefs: view.prefs,\n play: view.play,\n stressTest: view.stressTest,\n };\n}\n\n/** Opens or closes a sheet panel, keeping the compact sheet order. */\nexport function withSheet(view: ViewState, key: SheetKey, open: boolean): ViewState {\n const rest = view.sheetOrder.filter((entry) => entry !== key);\n const sheetOrder = open ? [...rest, key] : rest;\n if (key === \"shapes\" || key === \"bones\" || key === \"objects\") {\n return { ...view, sheetOrder, minimized: { ...view.minimized, [key]: !open } };\n }\n return { ...view, sheetOrder, open: { ...view.open, [key]: open } };\n}\n\nexport function isSculptScopeSymmetric(view: ViewState): boolean {\n return view.mode === \"sculpt\" && !!view.scope && targetBone(view.scope) === undefined;\n}\n\n/** Which categories the bar shows: Symmetry only in a sculpt (not a body part), Rig Bones only in assembly. */\nexport function categoryVisible(view: ViewState, category: Category): boolean {\n if (category === \"symmetry\") return isSculptScopeSymmetric(view);\n if (category === \"skeleton\") return view.mode === \"assembly\";\n return true;\n}\n\nexport function selectCategory(view: ViewState, category: Category): ViewState {\n const next = { ...view, category };\n if (category === \"shape\") return { ...next, tool: \"stamp\" };\n if (category === \"decal\") return { ...next, tool: \"decal\" };\n if (category === \"transform\") return { ...next, tool: \"select\", transformTool: \"select\" };\n if (category === \"skeleton\") return { ...next, tool: \"bone\" };\n return next;\n}\n\nexport function setTransformTool(view: ViewState, tool: TransformTool): ViewState {\n return { ...view, category: \"transform\", tool, transformTool: tool };\n}\n\n/** Scopes into a sculpt target: sculpt mode, Select tool, the first stamp selected. */\nexport function enterScope(view: ViewState, creation: Creation, target: SculptTarget): ViewState {\n const sculpt = sculptOf(creation, target);\n const first = sculpt?.stamps[0];\n const boneId = targetBone(target);\n return {\n ...view,\n mode: \"sculpt\",\n scope: target,\n category: \"transform\",\n tool: \"select\",\n transformTool: \"select\",\n selection: {\n objectIds: [target.objectId],\n stampIds: sculpt && first ? [...pickStamp(sculpt, first.id)] : [],\n ...(boneId !== undefined ? { boneId } : {}),\n },\n };\n}\n\n/** Leaves sculpt mode. A body part returns to its rig with the bone selected and Rig Bones open. */\nexport function leaveScope(view: ViewState): ViewState {\n const scope = view.scope;\n const boneId = targetBone(scope);\n const { scope: _dropped, ...rest } = view;\n const left: ViewState = {\n ...rest,\n mode: \"assembly\",\n category: view.category === \"symmetry\" ? \"transform\" : view.category,\n selection: { objectIds: scope ? [scope.objectId] : view.selection.objectIds, stampIds: [] },\n open: { ...view.open, stampProps: false },\n };\n if (scope && boneId !== undefined) {\n return {\n ...selectCategory(left, \"skeleton\"),\n selection: { objectIds: [scope.objectId], stampIds: [], boneId },\n };\n }\n return left.tool === \"select\" ? left : selectCategory(left, \"transform\");\n}\n\n/** Drops ids that no longer exist; leaves a scope whose sculpt is gone. */\nexport function pruneView(view: ViewState, creation: Creation): ViewState {\n let next = view;\n if (next.scope && !sculptOf(creation, next.scope)) next = leaveScope(next);\n const objectIds = next.selection.objectIds.filter((id) => !!objectById(creation, id));\n const sculpt = sculptOf(creation, next.scope);\n const stampIds = sculpt ? next.selection.stampIds.filter((id) => sculpt.stamps.some((stamp) => stamp.id === id)) : [];\n const rig = rigById(creation, objectIds[0]);\n const boneId = rig && objectIds.length === 1 ? boneOf(rig, next.selection.boneId)?.id : undefined;\n const same =\n objectIds.length === next.selection.objectIds.length &&\n stampIds.length === next.selection.stampIds.length &&\n boneId === next.selection.boneId;\n if (same) return next;\n return { ...next, selection: { objectIds, stampIds, ...(boneId !== undefined ? { boneId } : {}) } };\n}\n\nconst CREATES_OBJECTS: ReadonlySet<Command[\"type\"]> = new Set([\"CreateSculpt\", \"DuplicateObjects\", \"ApplyPremade\", \"CreateRig\", \"GenerateCreature\"]);\n\n/** After an accepted command: select what it created (new root objects, new stamps in scope, a new bone). */\nexport function selectCreated(view: ViewState, before: Creation, after: Creation, command: Command): ViewState {\n if (CREATES_OBJECTS.has(command.type) && view.mode === \"assembly\") {\n const old = new Set(before.objects.map((object) => object.id));\n const added = after.objects.filter((object) => !old.has(object.id));\n const addedIds = new Set(added.map((object) => object.id));\n const roots = added.filter((object) => object.parentId === undefined || !addedIds.has(object.parentId));\n if (roots.length) return { ...view, selection: { objectIds: roots.map((object) => object.id), stampIds: [] } };\n }\n if (command.type === \"AddStamps\" && view.scope) {\n const old = new Set(sculptOf(before, view.scope)?.stamps.map((stamp) => stamp.id) ?? []);\n const sculpt = sculptOf(after, view.scope);\n const added = sculpt?.stamps.filter((stamp) => !old.has(stamp.id)) ?? [];\n if (sculpt && added[0]) {\n const ids = command.payload.smear ? added.map((stamp) => stamp.id) : [...pickStamp(sculpt, added[0].id)];\n return { ...view, selection: { ...view.selection, stampIds: ids } };\n }\n }\n if (command.type === \"AddBone\") {\n const rigBefore = rigById(before, command.payload.rigId);\n const rigAfter = rigById(after, command.payload.rigId);\n const old = new Set(rigBefore?.rig.bones.map((bone) => bone.id) ?? []);\n const added = rigAfter?.rig.bones.find((bone) => !old.has(bone.id));\n if (added) return { ...view, selection: { objectIds: [command.payload.rigId], stampIds: [], boneId: added.id } };\n }\n return view;\n}\n\n/** In the compact layout only the newest open sheet is drawn. */\nexport function sheetHidden(view: ViewState, compact: boolean, key: SheetKey): boolean {\n if (!compact) return false;\n const visible = view.sheetOrder.filter((entry) => sheetWanted(view, entry));\n const top = visible[visible.length - 1];\n return top !== undefined && top !== key;\n}\n\nfunction sheetWanted(view: ViewState, key: SheetKey): boolean {\n if (key === \"shapes\") return view.mode === \"sculpt\" && !view.minimized.shapes;\n if (key === \"bones\") return view.category === \"skeleton\" && !view.play && !view.minimized.bones;\n if (key === \"objects\") return view.mode === \"assembly\" && !view.play && !view.minimized.objects;\n return view.open[key];\n}\n\nexport function anySheetOpen(view: ViewState, compact: boolean): boolean {\n return compact && view.sheetOrder.some((entry) => sheetWanted(view, entry));\n}\n", "import type {\n BodyRegion,\n FleckShape,\n PatternKind,\n StampMode,\n StampShape,\n ViewPreferences,\n WingOutline,\n WingPatternStyle,\n} from \"@dreamy/api\";\n\n/** An icon: a Font Awesome solid icon name, a text glyph, or a 24 \u00D7 24 outline path. */\nexport type IconSpec =\n | { readonly fa: string; readonly rotate?: number }\n | { readonly glyph: string }\n | { readonly path: string };\n\nexport type StampShapeInfo = {\n readonly id: StampShape;\n readonly name: string;\n readonly bg: string;\n readonly icon: IconSpec;\n /** Smaller icon used in the shape list. */\n readonly listIcon: IconSpec;\n};\n\nexport const STAMP_SHAPES: readonly StampShapeInfo[] = [\n { id: \"cube\", name: \"Cube\", bg: \"#fef08a\", icon: { fa: \"cube\" }, listIcon: { fa: \"cube\" } },\n { id: \"sphere\", name: \"Sphere\", bg: \"#fde047\", icon: { fa: \"circle\" }, listIcon: { fa: \"circle\" } },\n { id: \"cylinder\", name: \"Cylinder\", bg: \"#facc15\", icon: { fa: \"database\" }, listIcon: { fa: \"database\" } },\n { id: \"torus\", name: \"Torus\", bg: \"#eab308\", icon: { fa: \"ring\" }, listIcon: { fa: \"ring\" } },\n { id: \"cone\", name: \"Cone\", bg: \"#fed7aa\", icon: { path: \"M12 3 L20 18 A8 3 0 0 1 4 18 Z\" }, listIcon: { fa: \"caret-up\" } },\n {\n id: \"pyramid\",\n name: \"Pyramid\",\n bg: \"#fdba74\",\n icon: { path: \"M12 3 L21 18 L12 22 L3 18 Z M12 3 V22\" },\n listIcon: { fa: \"mountain\" },\n },\n {\n id: \"prism\",\n name: \"Prism\",\n bg: \"#fcd34d\",\n icon: { path: \"M3 19 L9 8 L14 19 Z M9 8 L16 6 L21 17 L14 19\" },\n listIcon: { fa: \"play\", rotate: 270 },\n },\n {\n id: \"octahedron\",\n name: \"Octahedron\",\n bg: \"#fbbf24\",\n icon: { path: \"M12 2 L21 12 L12 22 L3 12 Z M3 12 H21\" },\n listIcon: { fa: \"gem\" },\n },\n {\n id: \"capsule\",\n name: \"Capsule\",\n bg: \"#fde68a\",\n icon: { path: \"M7 7 A5 5 0 0 1 17 7 V17 A5 5 0 0 1 7 17 Z\" },\n listIcon: { fa: \"capsules\" },\n },\n {\n id: \"dome\",\n name: \"Dome\",\n bg: \"#fef3c7\",\n icon: { path: \"M3 16 A9 9 0 0 1 21 16 Z M3 16 A9 3 0 0 0 21 16\" },\n listIcon: { fa: \"circle-half-stroke\" },\n },\n];\n\nexport function stampShapeInfo(shape: StampShape): StampShapeInfo {\n return STAMP_SHAPES.find((info) => info.id === shape) ?? (STAMP_SHAPES[0] as StampShapeInfo);\n}\n\nexport type ModeInfo = { readonly id: StampMode; readonly name: string; readonly color: string; readonly icon: IconSpec };\n\nexport const STAMP_MODES: readonly ModeInfo[] = [\n { id: \"add\", name: \"Add\", color: \"#22c55e\", icon: { glyph: \"+\" } },\n { id: \"subtract\", name: \"Subtract\", color: \"#ef4444\", icon: { glyph: \"\u2212\" } },\n { id: \"intersect\", name: \"Intersect\", color: \"#3b82f6\", icon: { fa: \"square\" } },\n { id: \"paint\", name: \"Paint\", color: \"#ec4899\", icon: { fa: \"paint-brush\" } },\n];\n\n/** The list badge shows \u2229 for intersect, as in the POC. */\nexport const MODE_BADGE: { readonly [Mode in StampMode]: IconSpec } = {\n add: { glyph: \"+\" },\n subtract: { glyph: \"\u2212\" },\n intersect: { glyph: \"\u2229\" },\n paint: { fa: \"paint-brush\" },\n};\n\nexport function modeInfo(mode: StampMode): ModeInfo {\n return STAMP_MODES.find((info) => info.id === mode) ?? (STAMP_MODES[0] as ModeInfo);\n}\n\nexport type FleckShapeInfo = { readonly id: FleckShape; readonly name: string; readonly icon: IconSpec };\n\nexport const FLECK_SHAPES: readonly FleckShapeInfo[] = [\n { id: \"pill\", name: \"Pill\", icon: { fa: \"pills\" } },\n { id: \"circle\", name: \"Circle\", icon: { fa: \"circle\" } },\n { id: \"square\", name: \"Square\", icon: { fa: \"square\" } },\n { id: \"diamond\", name: \"Diamond\", icon: { glyph: \"\u25C6\" } },\n { id: \"triangle\", name: \"Triangle\", icon: { glyph: \"\u25B2\" } },\n { id: \"hexagon\", name: \"Hexagon\", icon: { glyph: \"\u2B22\" } },\n { id: \"star\", name: \"Star\", icon: { glyph: \"\u2605\" } },\n { id: \"cross\", name: \"Cross\", icon: { glyph: \"\u271A\" } },\n { id: \"ring\", name: \"Ring\", icon: { glyph: \"\u25EF\" } },\n { id: \"streak\", name: \"Streak\", icon: { glyph: \"\u25AC\" } },\n { id: \"leaf\", name: \"Leaf\", icon: { fa: \"leaf\" } },\n { id: \"sand\", name: \"Sand\", icon: { fa: \"braille\" } },\n { id: \"gravel\", name: \"Gravel\", icon: { fa: \"cubes-stacked\" } },\n { id: \"cement\", name: \"Cement\", icon: { fa: \"road\" } },\n { id: \"grass\", name: \"Grass\", icon: { fa: \"seedling\" } },\n { id: \"terrazzo\", name: \"Terrazzo\", icon: { fa: \"shapes\" } },\n { id: \"scales\", name: \"Scales\", icon: { fa: \"water\" } },\n { id: \"plates\", name: \"Plates\", icon: { fa: \"square\" } },\n { id: \"none\", name: \"None\", icon: { fa: \"ban\" } },\n];\n\n/** The quick fleck buttons of the Fleck Style bar. */\nexport const QUICK_FLECKS: readonly { readonly id: FleckShape; readonly name: string; readonly fa: string }[] = [\n { id: \"pill\", name: \"Pill Flecks\", fa: \"pills\" },\n { id: \"circle\", name: \"Circle Flecks\", fa: \"circle\" },\n { id: \"square\", name: \"Square Flecks\", fa: \"square\" },\n { id: \"none\", name: \"No Flecks\", fa: \"ban\" },\n];\n\nexport const PATTERNS: readonly { readonly id: PatternKind; readonly name: string }[] = [\n { id: \"none\", name: \"None\" },\n { id: \"stripes\", name: \"Stripes\" },\n { id: \"tiger\", name: \"Tiger\" },\n { id: \"leopard\", name: \"Leopard (Rosettes)\" },\n { id: \"cow\", name: \"Cow (Patches)\" },\n { id: \"thunder\", name: \"Thunder (Lightning)\" },\n { id: \"dots\", name: \"Dots (Polka)\" },\n { id: \"scales\", name: \"Scales\" },\n { id: \"camouflage\", name: \"Camouflage\" },\n];\n\nexport const WING_OUTLINES: readonly { readonly id: WingOutline; readonly name: string }[] = [\n { id: \"monarch\", name: \"Monarch\" },\n { id: \"swallowtail\", name: \"Swallowtail\" },\n { id: \"morpho\", name: \"Morpho\" },\n { id: \"moth\", name: \"Moth\" },\n { id: \"dragonfly\", name: \"Dragonfly\" },\n { id: \"bee\", name: \"Bee\" },\n { id: \"fly\", name: \"Fly\" },\n { id: \"bat\", name: \"Bat (Dragon)\" },\n];\n\nexport const WING_STYLES: readonly { readonly id: WingPatternStyle; readonly name: string }[] = [\n { id: \"veins\", name: \"Veins\" },\n { id: \"dots\", name: \"Dots\" },\n { id: \"bands\", name: \"Bands\" },\n { id: \"eyespots\", name: \"Eyespots\" },\n { id: \"morpho\", name: \"Morpho edge\" },\n { id: \"speckled\", name: \"Speckled\" },\n { id: \"clear\", name: \"Clear\" },\n];\n\nexport const RENDER_RESOLUTIONS: readonly { readonly id: ViewPreferences[\"renderResolution\"]; readonly name: string }[] = [\n { id: \"32\", name: \"32 x 32\" },\n { id: \"64\", name: \"64 x 64\" },\n { id: \"128\", name: \"128 x 128\" },\n { id: \"256\", name: \"256 x 256\" },\n { id: \"hd\", name: \"HD\" },\n { id: \"fhd\", name: \"Full HD\" },\n { id: \"screen\", name: \"Screen\" },\n];\n\nexport const BODY_REGIONS: readonly { readonly id: BodyRegion; readonly name: string }[] = [\n { id: \"torso\", name: \"Torso Blend\" },\n { id: \"limb\", name: \"Limb Blend\" },\n { id: \"wing\", name: \"Wing Blend\" },\n { id: \"tail\", name: \"Tail Blend\" },\n { id: \"head\", name: \"Head Blend\" },\n];\n\n/** Decal picker categories: the built-ins, then the creation's designs. */\nexport const DECAL_CATEGORIES: readonly { readonly id: string; readonly name: string; readonly fa: string }[] = [\n { id: \"eye\", name: \"Eyes\", fa: \"eye\" },\n { id: \"mouth\", name: \"Mouths\", fa: \"grip-lines\" },\n { id: \"mark\", name: \"Marks\", fa: \"circle\" },\n { id: \"door\", name: \"Doors\", fa: \"door-closed\" },\n { id: \"emoji\", name: \"Emojis\", fa: \"icons\" },\n { id: \"interior\", name: \"Interiors\", fa: \"building\" },\n { id: \"custom\", name: \"My decals\", fa: \"pen-nib\" },\n];\n\n/** Brush and decal size range (the size panel, + / \u2212 keys). */\nexport const SIZE_MIN = 0.15;\nexport const SIZE_MAX = 4;\n\n/** Kaleidoscope copies per axis: the control's range (the core clamps further). */\nexport const SYMMETRY_MAX = 12;\n\nexport const MAX_BONES = 64;\n", "import type { Quaternion, Transform, Vec3 } from \"@dreamy/api\";\n\nexport const IDENTITY_QUATERNION: Quaternion = { x: 0, y: 0, z: 0, w: 1 };\nexport const ZERO: Vec3 = { x: 0, y: 0, z: 0 };\nexport const ONE: Vec3 = { x: 1, y: 1, z: 1 };\n\nexport function identityTransform(position: Vec3 = ZERO): Transform {\n return { position, rotation: IDENTITY_QUATERNION, scale: ONE };\n}\n\nconst DEG = Math.PI / 180;\n\n/** Euler angles in degrees (XYZ order, as the POC's Transform tab) to a quaternion. */\nexport function quaternionFromDegrees(angles: Vec3): Quaternion {\n const c1 = Math.cos((angles.x * DEG) / 2);\n const c2 = Math.cos((angles.y * DEG) / 2);\n const c3 = Math.cos((angles.z * DEG) / 2);\n const s1 = Math.sin((angles.x * DEG) / 2);\n const s2 = Math.sin((angles.y * DEG) / 2);\n const s3 = Math.sin((angles.z * DEG) / 2);\n return {\n x: s1 * c2 * c3 + c1 * s2 * s3,\n y: c1 * s2 * c3 - s1 * c2 * s3,\n z: c1 * c2 * s3 + s1 * s2 * c3,\n w: c1 * c2 * c3 - s1 * s2 * s3,\n };\n}\n\n/** A quaternion to Euler angles in degrees (XYZ order). */\nexport function degreesFromQuaternion(q: Quaternion): Vec3 {\n const m11 = 1 - 2 * (q.y * q.y + q.z * q.z);\n const m12 = 2 * (q.x * q.y - q.w * q.z);\n const m13 = 2 * (q.x * q.z + q.w * q.y);\n const m22 = 1 - 2 * (q.x * q.x + q.z * q.z);\n const m23 = 2 * (q.y * q.z - q.w * q.x);\n const m32 = 2 * (q.y * q.z + q.w * q.x);\n const m33 = 1 - 2 * (q.x * q.x + q.y * q.y);\n const y = Math.asin(Math.max(-1, Math.min(1, m13)));\n const locked = Math.abs(m13) >= 0.9999999;\n const x = locked ? Math.atan2(m32, m22) : Math.atan2(-m23, m33);\n const z = locked ? 0 : Math.atan2(-m12, m11);\n return { x: x / DEG, y: y / DEG, z: z / DEG };\n}\n\nexport function multiplyQuaternions(a: Quaternion, b: Quaternion): Quaternion {\n return {\n x: a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,\n y: a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,\n z: a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w,\n w: a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z,\n };\n}\n\nexport function invertQuaternion(q: Quaternion): Quaternion {\n return { x: -q.x, y: -q.y, z: -q.z, w: q.w };\n}\n\nexport function addVec(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x + b.x, y: a.y + b.y, z: a.z + b.z };\n}\n\nexport function subVec(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z };\n}\n\nexport function mulVec(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x * b.x, y: a.y * b.y, z: a.z * b.z };\n}\n\n/** Per-axis ratio new / old (1 where the old value is zero). */\nexport function ratioVec(next: Vec3, old: Vec3): Vec3 {\n const ratio = (n: number, o: number) => (Math.abs(o) > 1e-6 ? n / o : 1);\n return { x: ratio(next.x, old.x), y: ratio(next.y, old.y), z: ratio(next.z, old.z) };\n}\n\nexport function averageVec(points: readonly Vec3[]): Vec3 {\n if (points.length === 0) return ZERO;\n const sum = points.reduce(addVec, ZERO);\n return { x: sum.x / points.length, y: sum.y / points.length, z: sum.z / points.length };\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n", "import type { Command, Creation, CreationApi, Id, Persistence, StampMode, SymmetryAxis } from \"@dreamy/api\";\nimport { SIZE_MAX, SIZE_MIN, STAMP_MODES } from \"../lib/catalog.js\";\nimport { clamp } from \"../lib/math.js\";\nimport {\n designsUsedBy,\n objectById,\n partOf,\n rigById,\n sculptOf,\n sculptsOfObject,\n selectedGroup,\n subtreeIds,\n} from \"../lib/scene.js\";\nimport {\n EMPTY_SELECTION,\n enterScope,\n leaveScope,\n selectCategory,\n withSheet,\n type ViewState,\n} from \"../lib/view-state.js\";\n\n/** What the actions need from the page (read at call time, so they always see the latest state). */\nexport type EditorCore = {\n readonly api: CreationApi;\n readonly persistence: Persistence;\n view(): ViewState;\n update(change: (view: ViewState) => ViewState): void;\n dispatch(command: Command): boolean;\n toast(message: string): void;\n undo(): void;\n redo(): void;\n};\n\n/** Studio actions shared by the chrome and the keyboard. */\nexport type EditorActions = ReturnType<typeof editorActions>;\n\nconst MODE_ORDER: readonly StampMode[] = STAMP_MODES.map((mode) => mode.id);\n\nexport function editorActions(core: EditorCore) {\n const creation = (): Creation => core.api.creation();\n const hints = () => core.view().prefs.hints;\n\n const enter = (target: Parameters<typeof enterScope>[2]) => {\n core.update((view) => ({ ...enterScope(view, creation(), target), play: false }));\n core.toast(hints() ? \"Scoped In \u00B7 hold Esc to exit\" : \"Scoped In: Sculpt Mode Active\");\n };\n\n const actions = {\n undo: () => core.undo(),\n redo: () => core.redo(),\n\n /** Sculpt the selected bone's part, giving the bone one first if it has none. */\n sculptPart(boneId?: Id) {\n const view = core.view();\n const rig = rigById(creation(), view.selection.objectIds[0]);\n const bone = boneId ?? view.selection.boneId;\n if (!rig || bone === undefined) {\n core.toast(\"Select a bone first\");\n return;\n }\n if (!partOf(rig, bone) && !core.dispatch({ type: \"AddBodyPart\", payload: { rigId: rig.id, boneId: bone } })) return;\n const after = rigById(creation(), rig.id);\n const part = after && partOf(after, bone);\n if (!part) return;\n if (part.kind === \"wing\") {\n core.update((current) => ({\n ...withSheet(current, \"properties\", true),\n selection: { objectIds: [rig.id], stampIds: [], boneId: bone },\n propertiesTab: \"wing\",\n }));\n core.toast(\"Flat wings are edited in Properties \u00B7 Wing\");\n return;\n }\n enter({ objectId: rig.id, boneId: bone });\n },\n\n scopeIn() {\n const view = core.view();\n const ids = view.selection.objectIds;\n const id = ids[ids.length - 1];\n const object = objectById(creation(), id);\n if (!object) return;\n if (ids.length > 1) core.toast(\"Sculpting the last selected object\");\n if (object.kind === \"sculpt\") {\n enter({ objectId: object.id });\n return;\n }\n if (view.selection.boneId !== undefined) {\n actions.sculptPart(view.selection.boneId);\n return;\n }\n if (object.rig.body) {\n enter({ objectId: object.id });\n return;\n }\n core.toast(\"Pick a bone, then use Sculpt Part\");\n },\n\n scopeOut() {\n if (core.view().mode !== \"sculpt\") return;\n core.update(leaveScope);\n core.toast(\"Exited to Assembly Mode\");\n },\n\n deselect() {\n core.update((view) => {\n const left = view.mode === \"sculpt\" ? leaveScope(view) : view;\n return { ...left, selection: EMPTY_SELECTION, open: { ...left.open, properties: false, stampProps: false } };\n });\n },\n\n deleteSelection() {\n const view = core.view();\n const rig = rigById(creation(), view.selection.objectIds[0]);\n if (view.mode === \"assembly\" && view.category === \"skeleton\" && rig && view.selection.boneId !== undefined) {\n core.dispatch({ type: \"RemoveBone\", payload: { rigId: rig.id, boneId: view.selection.boneId } });\n return;\n }\n if (view.mode === \"sculpt\" && view.scope) {\n const sculpt = sculptOf(creation(), view.scope);\n if (!sculpt || view.selection.stampIds.length === 0) return;\n const group = selectedGroup(sculpt, view.selection.stampIds);\n const ok = group\n ? core.dispatch({ type: \"RemoveSmearGroup\", payload: { target: view.scope, groupId: group.id } })\n : core.dispatch({ type: \"RemoveStamps\", payload: { target: view.scope, stampIds: view.selection.stampIds } });\n if (ok) core.toast(group ? `${group.name} Deleted` : \"Shape Deleted\");\n return;\n }\n const ids = view.selection.objectIds;\n if (ids.length === 0) return;\n if (core.dispatch({ type: \"DeleteObjects\", payload: { objectIds: ids } })) {\n core.toast(ids.length > 1 ? `${ids.length} Objects Deleted` : \"Object Deleted\");\n }\n },\n\n deleteObject(id: Id) {\n if (core.dispatch({ type: \"DeleteObjects\", payload: { objectIds: [id] } })) core.toast(\"Object Deleted\");\n },\n\n duplicate() {\n const ids = core.view().selection.objectIds;\n if (ids.length === 0 || core.view().mode !== \"assembly\") return;\n core.dispatch({ type: \"DuplicateObjects\", payload: { objectIds: ids } });\n },\n\n mirror(axis: \"x\" | \"z\") {\n const ids = core.view().selection.objectIds;\n if (ids.length === 0) return;\n if (core.dispatch({ type: \"MirrorObjects\", payload: { objectIds: ids, axis } })) {\n core.toast(`Mirrored ${axis === \"x\" ? \"horizontally\" : \"vertically\"}`);\n }\n },\n\n setBrushMode(mode: StampMode) {\n core.update((view) => ({ ...view, brush: { ...view.brush, mode } }));\n core.toast(`${mode.toUpperCase()} Mode Active`);\n },\n\n /** E: Add \u2192 Subtract \u2192 Intersect \u2192 Paint (modes only exist inside a sculpt). */\n cycleMode() {\n const view = core.view();\n if (view.mode !== \"sculpt\") return;\n const next = MODE_ORDER[(MODE_ORDER.indexOf(view.brush.mode) + 1) % MODE_ORDER.length] ?? \"add\";\n actions.setBrushMode(next);\n },\n\n /** The size of whichever tool uses the size panel (stamp brush or decal). */\n setSize(size: number) {\n const value = Math.round(clamp(size, SIZE_MIN, SIZE_MAX) * 100) / 100;\n core.update((view) =>\n view.tool === \"decal\"\n ? { ...view, decalBrush: { ...view.decalBrush, size: value } }\n : { ...view, brush: { ...view.brush, size: value } },\n );\n },\n\n resize(direction: 1 | -1) {\n const view = core.view();\n const size = view.tool === \"decal\" ? view.decalBrush.size : view.brush.size;\n actions.setSize(size * (direction > 0 ? 1.2 : 1 / 1.2));\n },\n\n rollDecal(degrees: number) {\n const roll = (core.view().decalBrush.roll + degrees + 360) % 360;\n core.update((view) => ({ ...view, decalBrush: { ...view.decalBrush, roll } }));\n core.toast(`Roll ${roll}\u00B0`);\n },\n\n flipDecal() {\n core.update((view) => ({ ...view, decalBrush: { ...view.decalBrush, flip: !view.decalBrush.flip } }));\n },\n\n toggleBrushAxis(axes: readonly SymmetryAxis[]) {\n core.update((view) => ({ ...view, brush: { ...view.brush, symmetry: { ...view.brush.symmetry, axes } } }));\n },\n\n toggleHelp(force?: boolean) {\n core.update((view) => withSheet(view, \"help\", force ?? !view.open.help));\n },\n\n openProperties() {\n core.update((view) => withSheet(view, \"properties\", true));\n },\n\n /** Double-click in the view: select the object and open its Properties. */\n focus(id: Id) {\n core.update((view) =>\n view.mode === \"assembly\"\n ? withSheet({ ...view, selection: { objectIds: [id], stampIds: [] } }, \"properties\", true)\n : withSheet(view, \"properties\", true),\n );\n },\n\n togglePlay() {\n const playing = !core.view().play;\n core.update((view) => {\n const left = playing && view.mode === \"sculpt\" ? leaveScope(view) : view;\n return { ...left, play: playing, selection: playing ? EMPTY_SELECTION : left.selection };\n });\n core.toast(playing ? \"Play Mode: WASD + Space to roll and jump!\" : \"Edit Mode Restored\");\n },\n\n toggleStress() {\n const on = !core.view().stressTest;\n core.update((view) => {\n const left = view.mode === \"sculpt\" ? leaveScope(view) : view;\n return { ...left, stressTest: on, selection: EMPTY_SELECTION };\n });\n core.toast(on ? \"Stress Test Active\" : \"Stress Test Cleared: Returned to Edit Mode\");\n },\n\n toggleHints() {\n const hintsOn = !core.view().prefs.hints;\n core.update((view) => ({ ...view, prefs: { ...view.prefs, hints: hintsOn } }));\n core.toast(hintsOn ? \"Hints on\" : \"Hints off \u00B7 Help is still in Utilities\");\n },\n\n /** Esc outside sculpt mode: close Help, back to the Select tool, then deselect. */\n escapeStep() {\n const view = core.view();\n if (view.open.help) {\n actions.toggleHelp(false);\n return;\n }\n if (view.play) return;\n if (view.tool !== \"select\" || view.category !== \"transform\") {\n core.update((current) => selectCategory(current, \"transform\"));\n core.toast(\"Select tool\");\n return;\n }\n if (view.selection.objectIds.length) actions.deselect();\n },\n\n /** An Esc tap in sculpt mode (released before the hold completes). */\n escapeTap() {\n const view = core.view();\n if (view.tool !== \"select\" || view.category !== \"transform\") {\n core.update((current) => selectCategory(current, \"transform\"));\n if (hints()) core.toast(\"Select tool \u00B7 hold Esc to exit sculpt mode\");\n } else if (hints()) {\n core.toast(\"Hold Esc to exit sculpt mode\");\n }\n },\n\n /** Downloads one object (with its subtree), the palette and the designs it uses as JSON. */\n exportObject(id?: Id) {\n const current = creation();\n const object = objectById(current, id ?? core.view().selection.objectIds[0]);\n if (!object) {\n core.toast(\"Select an object or character first\");\n return;\n }\n const ids = new Set(subtreeIds(current, object.id));\n const objects = current.objects.filter((entry) => ids.has(entry.id));\n const doc = {\n format: \"dreamy-studio-object\",\n schemaVersion: current.schemaVersion,\n name: object.name,\n palette: current.palette,\n objects,\n designs: designsUsedBy(current, objects.flatMap(sculptsOfObject)),\n };\n core.persistence.downloadJson(object.name, doc).then(\n () => core.toast(`\"${object.name}\" exported`),\n () => core.toast(\"Could not export\"),\n );\n },\n };\n return actions;\n}\n", "import { useEffect, useState } from \"react\";\n\nconst COMPACT_QUERY = \"(max-width: 700px), (max-height: 500px) and (pointer: coarse)\";\n\nfunction wantsCompact(): boolean {\n if (typeof window === \"undefined\") return false;\n const forced = new URLSearchParams(window.location.search).get(\"ui\");\n if (forced === \"compact\") return true;\n if (forced === \"desktop\") return false;\n return typeof window.matchMedia === \"function\" ? window.matchMedia(COMPACT_QUERY).matches : false;\n}\n\n/** The phone layout: small screens, or `?ui=compact` (`?ui=desktop` forces the desktop layout). */\nexport function useCompact(): boolean {\n const [compact, setCompact] = useState(wantsCompact);\n useEffect(() => {\n if (typeof window.matchMedia !== \"function\") return;\n const query = window.matchMedia(COMPACT_QUERY);\n const change = () => setCompact(wantsCompact());\n query.addEventListener?.(\"change\", change);\n return () => query.removeEventListener?.(\"change\", change);\n }, []);\n return compact;\n}\n", "import { useEffect, useRef } from \"react\";\nimport type { Editor } from \"./editor-context.js\";\n\ntype KeyboardEditor = Editor & { escDown(): void; escUp(cancelled?: boolean): void };\n\nconst TYPING = new Set([\"INPUT\", \"TEXTAREA\", \"SELECT\"]);\n\n/**\n * The studio's UI-level shortcuts (the POC help panel): ? help, Esc steps / hold, Ctrl+Z / Y / D, Delete,\n * E cycle mode, + / \u2212 size, and , . F for the decal brush. Camera keys (WASD), Space and Q stay with the viewport.\n */\nexport function useKeyboard(editor: KeyboardEditor) {\n const ref = useRef(editor);\n ref.current = editor;\n\n useEffect(() => {\n const down = (event: KeyboardEvent) => {\n const current = ref.current;\n const { view, actions } = current;\n const target = event.target as HTMLElement | null;\n if (target && TYPING.has(target.tagName)) {\n if (event.key !== \"Escape\") return;\n target.blur?.();\n const type = (target as HTMLInputElement).type?.toLowerCase();\n if (type !== \"range\" && type !== \"color\" && type !== \"checkbox\") return;\n }\n if (view.decalEditor) return;\n if (view.scenesOpen || view.premadeOpen) {\n if (event.key === \"Escape\") current.update((state) => ({ ...state, scenesOpen: false, premadeOpen: false }));\n return;\n }\n if (event.key === \"?\") {\n actions.toggleHelp();\n return;\n }\n const mod = event.ctrlKey || event.metaKey;\n const sizing = (view.tool === \"stamp\" || view.tool === \"decal\") && !view.play;\n if (sizing && !mod && !event.altKey) {\n if (event.key === \"+\" || event.key === \"=\" || event.code === \"NumpadAdd\") {\n event.preventDefault();\n actions.resize(1);\n } else if (event.key === \"-\" || event.key === \"_\" || event.code === \"NumpadSubtract\") {\n event.preventDefault();\n actions.resize(-1);\n }\n }\n if (view.tool === \"decal\" && !mod) {\n if (event.code === \"Comma\") actions.rollDecal(-15);\n else if (event.code === \"Period\") actions.rollDecal(15);\n else if (event.code === \"KeyF\") actions.flipDecal();\n }\n if (event.code === \"KeyE\" && !mod) actions.cycleMode();\n if (mod && event.code === \"KeyZ\") {\n event.preventDefault();\n if (event.shiftKey) actions.redo();\n else actions.undo();\n }\n if (mod && event.code === \"KeyY\") {\n event.preventDefault();\n actions.redo();\n }\n if (mod && event.code === \"KeyD\") {\n event.preventDefault();\n actions.duplicate();\n }\n if (event.key === \"Escape\" && !event.repeat) current.escDown();\n if (event.code === \"Delete\" || event.code === \"Backspace\") actions.deleteSelection();\n };\n const up = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") ref.current.escUp();\n };\n const blur = () => ref.current.escUp(true);\n window.addEventListener(\"keydown\", down);\n window.addEventListener(\"keyup\", up);\n window.addEventListener(\"blur\", blur);\n return () => {\n window.removeEventListener(\"keydown\", down);\n window.removeEventListener(\"keyup\", up);\n window.removeEventListener(\"blur\", blur);\n };\n }, []);\n}\n", "import { createContext, useContext, useEffect, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { Icon } from \"../atoms/icon.js\";\n\nconst MARGIN = 6;\n\n/** The z-order counter shared by one studio's panels (a click raises a panel). */\nexport const PanelLayerContext = createContext<{ top: number }>({ top: 70 });\n\nexport type FloatingPanelProps = {\n readonly id: string;\n readonly title: ReactNode;\n readonly icon?: string | undefined;\n readonly className?: string | undefined;\n /** Header buttons before the close button. */\n readonly headerExtra?: ReactNode | undefined;\n /** Hidden by the compact layout (another sheet is on top). */\n readonly sheetHidden?: boolean | undefined;\n /** Dragging is off in the compact layout. */\n readonly draggable?: boolean | undefined;\n readonly headerClassName?: string | undefined;\n readonly style?: CSSProperties | undefined;\n readonly children: ReactNode;\n readonly onClose?: () => void;\n readonly onDragOver?: (event: React.DragEvent) => void;\n readonly onDragLeave?: (event: React.DragEvent) => void;\n readonly onDrop?: (event: React.DragEvent) => void;\n};\n\n/** A frosted panel that moves by its header, stays inside the window and comes to the front on click. */\nexport function FloatingPanel({\n id,\n title,\n icon,\n className,\n headerExtra,\n sheetHidden = false,\n draggable = true,\n headerClassName = \"sp-header\",\n style,\n children,\n onClose,\n onDragOver,\n onDragLeave,\n onDrop,\n}: FloatingPanelProps) {\n const layer = useContext(PanelLayerContext);\n const ref = useRef<HTMLDivElement>(null);\n const [z, setZ] = useState(() => layer.top);\n const [pos, setPos] = useState<{ left: number; top: number } | undefined>(undefined);\n const [dragging, setDragging] = useState(false);\n\n useEffect(() => {\n if (!pos) return;\n const clampToView = () => {\n const panel = ref.current;\n if (!panel) return;\n const width = panel.offsetWidth;\n const height = panel.offsetHeight;\n setPos((current) => (current ? clampPosition(current, width, height) : current));\n };\n window.addEventListener(\"resize\", clampToView);\n return () => window.removeEventListener(\"resize\", clampToView);\n }, [pos !== undefined]);\n\n const startDrag = (event: React.PointerEvent<HTMLDivElement>) => {\n if (event.button !== 0 || !draggable) return;\n for (let node = event.target as Element | null; node && node !== event.currentTarget; node = node.parentElement) {\n if (node.matches(\"button, input, select, textarea, .clickable\")) return;\n }\n const panel = ref.current;\n if (!panel) return;\n event.preventDefault();\n const rect = panel.getBoundingClientRect();\n const offsetX = event.clientX - rect.left;\n const offsetY = event.clientY - rect.top;\n const width = panel.offsetWidth || rect.width;\n const height = panel.offsetHeight || rect.height;\n setPos({ left: rect.left, top: rect.top });\n setDragging(true);\n const move = (moveEvent: PointerEvent) => {\n setPos(clampPosition({ left: moveEvent.clientX - offsetX, top: moveEvent.clientY - offsetY }, width, height));\n };\n const up = () => {\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n window.removeEventListener(\"pointercancel\", up);\n setDragging(false);\n };\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n window.addEventListener(\"pointercancel\", up);\n };\n\n const placed: CSSProperties = pos\n ? { position: \"fixed\", left: pos.left, top: pos.top, right: \"auto\", bottom: \"auto\", transform: \"none\", margin: 0 }\n : {};\n const classes = [className, sheetHidden ? \"sheet-hidden\" : undefined].filter(Boolean).join(\" \");\n\n return (\n <div\n ref={ref}\n id={id}\n className={classes || undefined}\n role=\"region\"\n aria-label={typeof title === \"string\" ? title : id}\n style={{ display: \"flex\", ...style, zIndex: z, ...placed }}\n onPointerDownCapture={() => setZ(++layer.top)}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n >\n <div\n className={headerClassName}\n style={{ cursor: draggable ? (dragging ? \"grabbing\" : \"grab\") : \"default\", touchAction: \"none\" }}\n onPointerDown={startDrag}\n >\n <span>\n {icon ? <Icon icon={icon} className=\"sp-title-icon\" /> : null}\n {title}\n </span>\n <span className=\"row-inline\">\n {headerExtra}\n {onClose ? (\n <button type=\"button\" className=\"clickable\" title=\"Close\" aria-label=\"Close\" onClick={onClose}>\n <Icon icon=\"times\" />\n </button>\n ) : null}\n </span>\n </div>\n {children}\n </div>\n );\n}\n\nfunction clampPosition(pos: { left: number; top: number }, width: number, height: number) {\n const maxLeft = Math.max(MARGIN, window.innerWidth - width - MARGIN);\n const maxTop = Math.max(MARGIN, window.innerHeight - height - MARGIN);\n return { left: Math.max(MARGIN, Math.min(pos.left, maxLeft)), top: Math.max(MARGIN, Math.min(pos.top, maxTop)) };\n}\n", "import type { IconSpec } from \"../lib/catalog.js\";\n\nexport type IconProps = {\n /** A Font Awesome solid icon name (\"cube\"), or a full spec. */\n readonly icon: string | IconSpec;\n readonly className?: string | undefined;\n};\n\n/** One icon: Font Awesome (loaded by the host page), a text glyph, or a 24 \u00D7 24 outline path. */\nexport function Icon({ icon, className }: IconProps) {\n const spec: IconSpec = typeof icon === \"string\" ? { fa: icon } : icon;\n if (\"glyph\" in spec) return <span className={className} aria-hidden=\"true\">{spec.glyph}</span>;\n if (\"path\" in spec) {\n return (\n <svg\n className={className}\n viewBox=\"0 0 24 24\"\n width=\"20\"\n height=\"20\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <path d={spec.path} />\n </svg>\n );\n }\n const rotate = spec.rotate ? ` fa-rotate-${spec.rotate}` : \"\";\n return <i className={`fas fa-${spec.fa}${rotate}${className ? ` ${className}` : \"\"}`} aria-hidden=\"true\" />;\n}\n", "import { useEffect, useRef, useState, type CSSProperties } from \"react\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { anySheetOpen, categoryVisible } from \"../lib/view-state.js\";\nimport { BonePanel } from \"../organisms/bone-panel.js\";\nimport { CategoryBar } from \"../organisms/category-bar.js\";\nimport { DecalBar } from \"../organisms/decal-bar.js\";\nimport { DecalEditor } from \"../organisms/decal-editor.js\";\nimport { HelpPanel } from \"../organisms/help-panel.js\";\nimport { ObjectListPanel } from \"../organisms/object-list-panel.js\";\nimport { PalettePanel } from \"../organisms/palette-panel.js\";\nimport { PremadePicker } from \"../organisms/premade-picker.js\";\nimport { PropertiesPanel } from \"../organisms/properties-panel.js\";\nimport { RenderingBar } from \"../organisms/rendering-bar.js\";\nimport { RigBar } from \"../organisms/rig-bar.js\";\nimport { ScenesModal } from \"../organisms/scenes-modal.js\";\nimport { SelectHint } from \"../organisms/select-hint.js\";\nimport { ShapeListPanel } from \"../organisms/shape-list-panel.js\";\nimport { SideDock } from \"../organisms/side-dock.js\";\nimport { StampBar } from \"../organisms/stamp-bar.js\";\nimport { StampPropsPanel } from \"../organisms/stamp-props-panel.js\";\nimport { StampSizePanel } from \"../organisms/stamp-size-panel.js\";\nimport { StatsBadge } from \"../organisms/stats-badge.js\";\nimport { StyleBar } from \"../organisms/style-bar.js\";\nimport { SymmetryBar } from \"../organisms/symmetry-bar.js\";\nimport { Toast } from \"../organisms/toast.js\";\nimport { TouchMods } from \"../organisms/touch-mods.js\";\nimport { TransformBar } from \"../organisms/transform-bar.js\";\nimport { UtilitiesBar } from \"../organisms/utilities-bar.js\";\nimport { ViewportHost } from \"../organisms/viewport-host.js\";\nimport { VoxelPanel } from \"../organisms/voxel-panel.js\";\n\nconst SUB_BARS = {\n transform: TransformBar,\n shape: StampBar,\n style: StyleBar,\n decal: DecalBar,\n symmetry: SymmetryBar,\n skeleton: RigBar,\n rendering: RenderingBar,\n utilities: UtilitiesBar,\n} as const;\n\n/** The studio layout: the view, the dock, the left stack, the bars, floating panels, dialogs and the toast. */\nexport function EditorShell() {\n const { view, compact } = useEditor();\n const bars = useRef<HTMLDivElement>(null);\n const [barsHeight, setBarsHeight] = useState(0);\n const sheetOpen = anySheetOpen(view, compact);\n\n useEffect(() => {\n const measure = () => {\n const element = bars.current;\n setBarsHeight(compact && element ? Math.max(0, Math.round(window.innerHeight - element.getBoundingClientRect().top)) : 0);\n };\n measure();\n window.addEventListener(\"resize\", measure);\n const Observer = typeof ResizeObserver === \"function\" ? ResizeObserver : undefined;\n const observer = Observer && bars.current ? new Observer(measure) : undefined;\n if (observer && bars.current) observer.observe(bars.current);\n return () => {\n window.removeEventListener(\"resize\", measure);\n observer?.disconnect();\n };\n }, [compact]);\n\n const category = categoryVisible(view, view.category) ? view.category : \"transform\";\n const SubBar = SUB_BARS[category];\n const classes = [\"dreamy-studio\", compact ? \"compact\" : undefined, view.prefs.hints ? undefined : \"hints-off\", sheetOpen ? \"sheet-open\" : undefined]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={classes} style={{ \"--bars-h\": `${barsHeight}px` } as CSSProperties}>\n <ViewportHost />\n <StatsBadge />\n <SideDock sheetOpen={sheetOpen} />\n <div id=\"left-stack\">\n <ShapeListPanel />\n <BonePanel />\n <ObjectListPanel />\n </div>\n <StampPropsPanel />\n <StampSizePanel sheetOpen={sheetOpen} />\n <div id=\"ui-layer\">\n <div className=\"toolbar-group\" ref={bars}>\n <CategoryBar />\n <SubBar />\n <TouchMods />\n <SelectHint />\n </div>\n </div>\n <PropertiesPanel />\n <PalettePanel />\n <VoxelPanel />\n <HelpPanel />\n <PremadePicker />\n <ScenesModal />\n <DecalEditor />\n <Toast />\n </div>\n );\n}\n", "import type { Id } from \"@dreamy/api\";\nimport { useState } from \"react\";\nimport { Icon } from \"../atoms/icon.js\";\nimport { IconButton } from \"../atoms/icon-button.js\";\nimport { MatchButton } from \"../atoms/match-button.js\";\nimport { SideButton } from \"../atoms/side-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { MAX_BONES } from \"../lib/catalog.js\";\nimport { boneOf, boneTree, partOf, rigById } from \"../lib/scene.js\";\nimport { sheetHidden, withSheet } from \"../lib/view-state.js\";\nimport { FloatingPanel } from \"../molecules/floating-panel.js\";\nimport { InlineEdit } from \"../molecules/inline-edit.js\";\nimport { ListRow } from \"../molecules/list-row.js\";\nimport { BoneSizeSliders } from \"./bone-size-sliders.js\";\nimport { RegionBlends } from \"./region-blends.js\";\n\n/** The selected rig's bone tree (Rig Bones): select, rename, drag to reparent, parts, region blends, tags. */\nexport function BonePanel() {\n const { view, update, creation, dispatch, actions, compact, toast } = useEditor();\n const [renaming, setRenaming] = useState<Id | undefined>(undefined);\n const [editingTags, setEditingTags] = useState(false);\n const [dragBone, setDragBone] = useState<Id | undefined>(undefined);\n const [dropOn, setDropOn] = useState<Id | null | undefined>(undefined);\n if (view.category !== \"skeleton\" || view.play || view.mode !== \"assembly\") return null;\n if (view.minimized.bones) {\n return <SideButton id=\"bone-toggle\" icon=\"bone\" tooltip=\"Bones\" onClick={() => update((current) => withSheet(current, \"bones\", true))} />;\n }\n const rig = view.selection.objectIds.length === 1 ? rigById(creation, view.selection.objectIds[0]) : undefined;\n const selectedBone = rig ? boneOf(rig, view.selection.boneId) : undefined;\n const selectBone = (boneId: Id) =>\n update((current) => ({ ...current, selection: { objectIds: current.selection.objectIds, stampIds: [], boneId } }));\n const drop = (parentId: Id | null) => {\n setDropOn(undefined);\n if (!rig || dragBone === undefined || dragBone === parentId) return;\n dispatch({ type: \"ReparentBone\", payload: { rigId: rig.id, boneId: dragBone, parentId } });\n setDragBone(undefined);\n };\n\n let body;\n if (!rig) {\n body = (\n <div className=\"bone-empty\">\n Pick a <b>premade skeleton</b> (wand), or choose <b>Add Bone</b> and click the ground to start a standalone rig.\n </div>\n );\n } else if (rig.rig.bones.length === 0) {\n body = (\n <div className=\"bone-empty\">\n No bones yet. Pick <b>Add Bone</b> and click.\n </div>\n );\n } else {\n body = (\n <>\n <ListRow\n icon=\"sitemap\"\n iconBg=\"#e2e8f0\"\n name={rig.name}\n dropTarget={dropOn === null}\n onDragOver={(event) => {\n event.preventDefault();\n setDropOn(null);\n }}\n onDragLeave={() => setDropOn(undefined)}\n onDrop={(event) => {\n event.preventDefault();\n drop(null);\n }}\n />\n {boneTree(rig).map(({ bone, depth }) => {\n const hasPart = !!partOf(rig, bone.id);\n return (\n <ListRow\n key={bone.id}\n icon=\"bone\"\n iconBg=\"#fed7aa\"\n indent={(depth + 1) * 14}\n selected={bone.id === view.selection.boneId}\n draggable={renaming !== bone.id}\n dropTarget={dropOn === bone.id}\n name={\n renaming === bone.id ? (\n <InlineEdit\n value={bone.name}\n label=\"Bone name\"\n onCommit={(name) => {\n setRenaming(undefined);\n dispatch({ type: \"RenameBone\", payload: { rigId: rig.id, boneId: bone.id, name } });\n }}\n onCancel={() => setRenaming(undefined)}\n />\n ) : (\n bone.name\n )\n }\n onClick={() => selectBone(bone.id)}\n onDoubleClick={() => setRenaming(bone.id)}\n onDragStart={(event) => {\n event.dataTransfer?.setData(\"text/plain\", bone.id);\n setDragBone(bone.id);\n }}\n onDragEnd={() => {\n setDragBone(undefined);\n setDropOn(undefined);\n }}\n onDragOver={(event) => {\n event.preventDefault();\n setDropOn(bone.id);\n }}\n onDragLeave={() => setDropOn(undefined)}\n onDrop={(event) => {\n event.preventDefault();\n drop(bone.id);\n }}\n >\n <IconButton\n icon=\"cube\"\n title={hasPart ? \"Edit body part\" : \"Add body part\"}\n onClick={() => {\n selectBone(bone.id);\n actions.sculptPart(bone.id);\n }}\n />\n {hasPart ? (\n <IconButton\n icon=\"eraser\"\n title=\"Remove body part\"\n variant=\"stamp-btn del\"\n onClick={() => {\n if (dispatch({ type: \"RemoveBodyPart\", payload: { rigId: rig.id, boneId: bone.id } })) toast(\"Body part removed\");\n }}\n />\n ) : null}\n <IconButton\n icon=\"trash-alt\"\n title=\"Delete bone\"\n variant=\"stamp-btn del\"\n onClick={() => dispatch({ type: \"RemoveBone\", payload: { rigId: rig.id, boneId: bone.id } })}\n />\n </ListRow>\n );\n })}\n </>\n );\n }\n\n return (\n <FloatingPanel\n id=\"bone-panel\"\n icon=\"bone\"\n title={\n <>\n Bones {rig ? <span className=\"sp-count\">({rig.rig.bones.length}/{MAX_BONES})</span> : null}\n </>\n }\n sheetHidden={sheetHidden(view, compact, \"bones\")}\n draggable={!compact}\n onClose={() => update((current) => withSheet(current, \"bones\", false))}\n >\n <div id=\"bone-tree\" role=\"tree\" aria-label=\"Bones\">\n {body}\n </div>\n {rig ? (\n <div id=\"bone-region-blends\" className=\"region-blends\">\n <div className=\"region-blends-title\">\n <Icon icon=\"layer-group\" className=\"sp-title-icon\" />\n Skeleton Blends\n </div>\n <RegionBlends rig={rig} />\n </div>\n ) : null}\n {rig && selectedBone ? (\n <div id=\"bone-info\">\n <div>\n <b>{selectedBone.name}</b> \u00B7 {selectedBone.tags.length ? selectedBone.tags.join(\", \") : \"no tags\"}\n </div>\n {editingTags ? (\n <InlineEdit\n value={selectedBone.tags.join(\", \")}\n label=\"Bone tags\"\n maxLength={400}\n onCommit={(text) => {\n setEditingTags(false);\n const tags = text.split(\",\").map((tag) => tag.trim()).filter(Boolean);\n dispatch({ type: \"SetBoneTags\", payload: { rigId: rig.id, boneId: selectedBone.id, tags } });\n }}\n onCancel={() => setEditingTags(false)}\n />\n ) : null}\n <div className=\"row-inline wrap\">\n <MatchButton title=\"Mirror pairs need side:L / side:R and a shared mirror:<key>\" onClick={() => setEditingTags(true)}>\n Tags\u2026\n </MatchButton>\n <MatchButton onClick={() => dispatch({ type: \"AutoTagSides\", payload: { rigId: rig.id } })}>Auto L/R</MatchButton>\n <MatchButton onClick={() => actions.sculptPart(selectedBone.id)}>Sculpt part</MatchButton>\n </div>\n <BoneSizeSliders rigId={rig.id} bone={selectedBone} />\n </div>\n ) : null}\n </FloatingPanel>\n );\n}\n", "import type { ReactNode } from \"react\";\nimport type { IconSpec } from \"../lib/catalog.js\";\nimport { Icon } from \"./icon.js\";\n\nexport type IconButtonProps = {\n readonly icon: string | IconSpec;\n readonly title: string;\n /** stamp-btn: list row button; de-btn: dialog button. */\n readonly variant?: \"stamp-btn\" | \"stamp-btn del\" | \"de-btn\" | \"de-btn sm\" | \"de-btn sm confirm\" | undefined;\n readonly active?: boolean | undefined;\n readonly disabled?: boolean | undefined;\n readonly children?: ReactNode | undefined;\n readonly onClick: () => void;\n};\n\n/** A small square / round icon-only button. Clicks never reach the row underneath. */\nexport function IconButton({ icon, title, variant = \"stamp-btn\", active = false, disabled, children, onClick }: IconButtonProps) {\n return (\n <button\n type=\"button\"\n className={`${variant}${active ? \" on\" : \"\"}`}\n title={title}\n aria-label={title}\n disabled={disabled}\n onClick={(event) => {\n event.stopPropagation();\n onClick();\n }}\n onDoubleClick={(event) => event.stopPropagation()}\n >\n <Icon icon={icon} />\n {children}\n </button>\n );\n}\n", "import type { ReactNode } from \"react\";\nimport { Icon } from \"./icon.js\";\n\nexport type MatchButtonProps = {\n readonly icon?: string | undefined;\n readonly title?: string | undefined;\n readonly active?: boolean | undefined;\n readonly children: ReactNode;\n readonly onClick: () => void;\n};\n\n/** The small outlined text button (Match, Inherit, Re-roll, presets). */\nexport function MatchButton({ icon, title, active = false, children, onClick }: MatchButtonProps) {\n return (\n <button type=\"button\" className={`match-btn${active ? \" active\" : \"\"}`} title={title} aria-pressed={active} onClick={onClick}>\n {icon ? <Icon icon={icon} /> : null}\n {icon ? \" \" : null}\n {children}\n </button>\n );\n}\n", "import type { ReactNode } from \"react\";\nimport { Icon } from \"./icon.js\";\n\nexport type SideButtonProps = {\n readonly icon: string;\n readonly tooltip: string;\n readonly id?: string | undefined;\n /** scope-in-btn / scope-out-btn give the yellow / green look. */\n readonly className?: string | undefined;\n readonly active?: boolean | undefined;\n readonly children?: ReactNode | undefined;\n readonly onClick: () => void;\n};\n\n/** The big round frosted button of the side dock and the left stack. */\nexport function SideButton({ icon, tooltip, id, className, active = false, children, onClick }: SideButtonProps) {\n const classes = [\"side-action-btn\", className, active ? \"active\" : undefined].filter(Boolean).join(\" \");\n return (\n <button type=\"button\" id={id} className={classes} style={{ display: \"flex\" }} aria-label={tooltip} onClick={onClick}>\n <Icon icon={icon} />\n <span className=\"tooltip\">{tooltip}</span>\n {children}\n </button>\n );\n}\n", "import { useEffect, useRef, useState } from \"react\";\n\nexport type InlineEditProps = {\n readonly value: string;\n readonly label: string;\n readonly maxLength?: number | undefined;\n readonly onCommit: (value: string) => void;\n readonly onCancel: () => void;\n};\n\n/** A text field that replaces a name while renaming: Enter or blur commits, Esc cancels. */\nexport function InlineEdit({ value, label, maxLength = 60, onCommit, onCancel }: InlineEditProps) {\n const [text, setText] = useState(value);\n const ref = useRef<HTMLInputElement>(null);\n const done = useRef(false);\n useEffect(() => {\n ref.current?.focus();\n ref.current?.select();\n }, []);\n const finish = (commit: boolean) => {\n if (done.current) return;\n done.current = true;\n const name = text.trim();\n if (commit && name && name !== value) onCommit(name);\n else onCancel();\n };\n return (\n <input\n ref={ref}\n className=\"inline-edit\"\n aria-label={label}\n maxLength={maxLength}\n value={text}\n onClick={(event) => event.stopPropagation()}\n onChange={(event) => setText(event.currentTarget.value)}\n onBlur={() => finish(true)}\n onKeyDown={(event) => {\n event.stopPropagation();\n if (event.key === \"Enter\") finish(true);\n if (event.key === \"Escape\") finish(false);\n }}\n />\n );\n}\n", "import type { DragEvent, ReactNode } from \"react\";\nimport type { IconSpec } from \"../lib/catalog.js\";\nimport { Icon } from \"../atoms/icon.js\";\n\nexport type ListRowProps = {\n readonly name: ReactNode;\n readonly icon: string | IconSpec;\n readonly iconBg?: string | undefined;\n readonly selected?: boolean | undefined;\n /** \"group\" (pink smear group) or \"member\" (indented). */\n readonly variant?: \"group\" | \"member\" | undefined;\n /** Left indent in pixels. */\n readonly indent?: number | undefined;\n readonly lead?: ReactNode | undefined;\n readonly children?: ReactNode | undefined;\n readonly dropTarget?: boolean | undefined;\n readonly draggable?: boolean | undefined;\n readonly onClick?: () => void;\n readonly onDoubleClick?: () => void;\n readonly onDragStart?: (event: DragEvent) => void;\n readonly onDragEnd?: () => void;\n readonly onDragOver?: (event: DragEvent) => void;\n readonly onDragLeave?: (event: DragEvent) => void;\n readonly onDrop?: (event: DragEvent) => void;\n};\n\n/** One row of the shape, bone and object lists. Buttons go in `children`. */\nexport function ListRow({\n name,\n icon,\n iconBg,\n selected = false,\n variant,\n indent,\n lead,\n children,\n dropTarget = false,\n draggable,\n onClick,\n onDoubleClick,\n onDragStart,\n onDragEnd,\n onDragOver,\n onDragLeave,\n onDrop,\n}: ListRowProps) {\n const classes = [\"stamp-row\", variant, selected ? \"selected\" : undefined, dropTarget ? \"drop-target\" : undefined]\n .filter(Boolean)\n .join(\" \");\n return (\n <div\n className={classes}\n role=\"treeitem\"\n aria-selected={selected}\n style={indent ? { marginLeft: indent } : undefined}\n draggable={draggable}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onDragStart={onDragStart}\n onDragEnd={onDragEnd}\n onDragOver={onDragOver}\n onDragLeave={onDragLeave}\n onDrop={onDrop}\n >\n {lead}\n <span className=\"stamp-ico\" style={iconBg ? { background: iconBg } : undefined}>\n <Icon icon={icon} />\n </span>\n <span className=\"stamp-name\">{name}</span>\n {children}\n </div>\n );\n}\n", "import { useState } from \"react\";\nimport { RangeInput } from \"../atoms/range-input.js\";\n\nexport type SliderRowProps = {\n readonly label: string;\n readonly value: number;\n readonly min: number;\n readonly max: number;\n readonly step?: number | undefined;\n readonly digits?: number | undefined;\n readonly suffix?: string | undefined;\n /** Greyed out and inert (fleck sliders while flecks are off). */\n readonly off?: boolean | undefined;\n /** Shows the value in blue (a per-shape override). */\n readonly own?: boolean | undefined;\n readonly onCommit: (value: number) => void;\n};\n\n/** Label, live value and a range input that commits on release. */\nexport function SliderRow({ label, value, min, max, step = 0.01, digits = 2, suffix = \"\", off = false, own = false, onCommit }: SliderRowProps) {\n const [draft, setDraft] = useState<number | undefined>(undefined);\n const shown = draft ?? value;\n return (\n <div className={`slider-group${off ? \" off\" : \"\"}`}>\n <label>\n {label}{\" \"}\n <span style={own ? { color: \"#2563eb\" } : undefined}>\n {digits === 0 ? Math.round(shown) : shown.toFixed(digits)}\n {suffix}\n </span>\n </label>\n <RangeInput\n label={label}\n value={value}\n min={min}\n max={max}\n step={step}\n disabled={off}\n onPreview={setDraft}\n onCommit={(next) => {\n setDraft(undefined);\n onCommit(next);\n }}\n />\n </div>\n );\n}\n", "import { useEffect, useRef, useState, type CSSProperties } from \"react\";\n\nexport type RangeInputProps = {\n readonly value: number;\n readonly min: number;\n readonly max: number;\n readonly step?: number | undefined;\n readonly id?: string | undefined;\n readonly label: string;\n readonly disabled?: boolean | undefined;\n readonly style?: CSSProperties | undefined;\n /** Every move while dragging (the value shown locally). */\n readonly onPreview?: (value: number) => void;\n /** Once, on release. */\n readonly onCommit: (value: number) => void;\n};\n\n/** A native range input that previews while dragging and commits one value on release. */\nexport function RangeInput({ value, min, max, step = 0.01, id, label, disabled, style, onPreview, onCommit }: RangeInputProps) {\n const ref = useRef<HTMLInputElement>(null);\n const [draft, setDraft] = useState<number | undefined>(undefined);\n const commitRef = useRef(onCommit);\n commitRef.current = onCommit;\n\n useEffect(() => {\n const input = ref.current;\n if (!input) return;\n const commit = () => {\n const next = Number(input.value);\n setDraft(undefined);\n if (Number.isFinite(next)) commitRef.current(next);\n };\n input.addEventListener(\"change\", commit);\n return () => input.removeEventListener(\"change\", commit);\n }, []);\n\n return (\n <input\n ref={ref}\n id={id}\n type=\"range\"\n aria-label={label}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n style={style}\n value={draft ?? value}\n onInput={(event) => {\n const next = Number(event.currentTarget.value);\n if (!Number.isFinite(next)) return;\n setDraft(next);\n onPreview?.(next);\n }}\n onChange={() => undefined}\n />\n );\n}\n", "import type { Bone, Id } from \"@dreamy/api\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { SliderRow } from \"../molecules/slider-row.js\";\n\nconst MAX = 2.5;\n\n/**\n * The selected bone's proportions: Length (its child joints move with it) and Thickness. A head starts at its made\n * size and can only grow; the core enforces that, the sliders only start there.\n */\nexport function BoneSizeSliders({ rigId, bone }: { readonly rigId: Id; readonly bone: Bone }) {\n const { dispatch } = useEditor();\n const head = bone.tags.includes(\"role:head\") || (!bone.tags.some((t) => t.startsWith(\"role:\")) && /Head/i.test(bone.name));\n const min = head ? 1 : 0.4;\n const size = bone.size ?? { length: 1, thickness: 1 };\n const set = (change: { length?: number; thickness?: number }) =>\n dispatch({ type: \"SetBoneSizes\", payload: { rigId, changes: [{ boneId: bone.id, ...change }] } });\n return (\n <div className=\"bone-size\">\n <SliderRow label=\"Length\" value={size.length} min={min} max={MAX} step={0.05} onCommit={(length) => set({ length })} />\n <SliderRow label=\"Thickness\" value={size.thickness} min={min} max={MAX} step={0.05} onCommit={(thickness) => set({ thickness })} />\n </div>\n );\n}\n", "import type { RigObject } from \"@dreamy/api\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { BODY_REGIONS } from \"../lib/catalog.js\";\nimport { SliderRow } from \"../molecules/slider-row.js\";\n\n/** The rig's per-region part blends (torso, limb, wing, tail, head). */\nexport function RegionBlends({ rig }: { readonly rig: RigObject }) {\n const { dispatch } = useEditor();\n return (\n <>\n {BODY_REGIONS.map((region) => (\n <SliderRow\n key={region.id}\n label={region.name}\n value={rig.rig.regionBlends[region.id]}\n min={0}\n max={0.5}\n step={0.01}\n onCommit={(blend) => dispatch({ type: \"SetRegionBlend\", payload: { rigId: rig.id, region: region.id, blend } })}\n />\n ))}\n </>\n );\n}\n", "/** The thin divider between toolbar sections. */\nexport function Separator() {\n return <div className=\"tb-sep\" role=\"separator\" />;\n}\n", "import type { CSSProperties, ReactNode } from \"react\";\nimport type { IconSpec } from \"../lib/catalog.js\";\nimport { Icon } from \"./icon.js\";\n\nexport type ToolButtonProps = {\n readonly icon?: string | IconSpec | undefined;\n /** Shown on hover, and the accessible name. */\n readonly tooltip: string;\n readonly active?: boolean | undefined;\n /** \"active-tool\" (default) or \"active-cat\" for the category bar. */\n readonly activeClass?: \"active-tool\" | \"active-cat\" | \"play-active\" | undefined;\n /** Resting background and icon color. They are CSS variables the stylesheet reads, never inline `background` /\n * `color`, so a state class (on, active) always wins over them. */\n readonly background?: string | undefined;\n readonly color?: string | undefined;\n readonly className?: string | undefined;\n readonly id?: string | undefined;\n readonly disabled?: boolean | undefined;\n readonly children?: ReactNode | undefined;\n readonly onClick?: () => void;\n readonly onDoubleClick?: () => void;\n};\n\n/** The POC's round tool button with its tooltip. */\nexport function ToolButton({\n icon,\n tooltip,\n active = false,\n activeClass = \"active-tool\",\n background,\n color,\n className,\n id,\n disabled,\n children,\n onClick,\n onDoubleClick,\n}: ToolButtonProps) {\n const style: CSSProperties & { \"--tool-bg\"?: string; \"--tool-fg\"?: string } = {};\n if (background) style[\"--tool-bg\"] = background;\n if (color) style[\"--tool-fg\"] = color;\n const classes = [\"tool-btn\", className, active ? activeClass : undefined].filter(Boolean).join(\" \");\n return (\n <button\n type=\"button\"\n id={id}\n className={classes}\n style={style}\n aria-label={tooltip}\n aria-pressed={active}\n disabled={disabled}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n >\n {icon !== undefined ? <Icon icon={icon} /> : null}\n {children}\n <span className=\"tooltip\">{tooltip}</span>\n </button>\n );\n}\n", "import type { ReactNode } from \"react\";\n\nexport type ToolbarProps = {\n readonly id: string;\n readonly label: string;\n /** Sub-toolbars sit under the category bar. */\n readonly sub?: boolean | undefined;\n readonly children: ReactNode;\n};\n\n/** A frosted toolbar row. */\nexport function Toolbar({ id, label, sub = false, children }: ToolbarProps) {\n return (\n <div id={id} className={sub ? \"toolbar sub-toolbar active\" : \"toolbar\"} role=\"toolbar\" aria-label={label}>\n {children}\n </div>\n );\n}\n", "import { Separator } from \"../atoms/separator.js\";\nimport { ToolButton } from \"../atoms/tool-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { categoryVisible, selectCategory, type Category } from \"../lib/view-state.js\";\nimport { Toolbar } from \"../molecules/toolbar.js\";\n\nconst CATEGORIES: readonly { readonly id: Category; readonly name: string; readonly icon: string; readonly className: string }[] = [\n { id: \"transform\", name: \"Transform\", icon: \"arrows-alt\", className: \"cat-transform\" },\n { id: \"shape\", name: \"Sculpt Stamps\", icon: \"cube\", className: \"cat-shape\" },\n { id: \"style\", name: \"Fleck Style\", icon: \"paint-brush\", className: \"cat-style\" },\n { id: \"decal\", name: \"Decals\", icon: \"face-smile\", className: \"cat-decal\" },\n { id: \"symmetry\", name: \"Symmetry\", icon: \"clone\", className: \"cat-symmetry\" },\n { id: \"skeleton\", name: \"Rig Bones\", icon: \"bone\", className: \"cat-skeleton\" },\n { id: \"rendering\", name: \"Rendering\", icon: \"camera\", className: \"cat-rendering\" },\n { id: \"utilities\", name: \"Utilities\", icon: \"toolbox\", className: \"cat-utils\" },\n];\n\n/** The main bar: Scenes (the file menu), category tiles, then undo / redo. */\nexport function CategoryBar() {\n const { view, update, actions } = useEditor();\n return (\n <Toolbar id=\"main-toolbar\" label=\"Categories\">\n <ToolButton\n id=\"btn-scenes\"\n icon=\"folder-open\"\n tooltip=\"Scenes\"\n background=\"#fff\"\n onClick={() => update((current) => ({ ...current, scenesOpen: true }))}\n />\n <Separator />\n {CATEGORIES.filter((category) => categoryVisible(view, category.id)).map((category) => (\n <ToolButton\n key={category.id}\n id={`cat-${category.id}`}\n className={category.className}\n icon={category.icon}\n tooltip={category.name}\n active={view.category === category.id}\n activeClass=\"active-cat\"\n onClick={() => update((current) => selectCategory(current, category.id))}\n />\n ))}\n <Separator />\n <ToolButton icon=\"undo\" tooltip=\"Undo (Ctrl+Z)\" background=\"#fff\" onClick={actions.undo} />\n <ToolButton icon=\"redo\" tooltip=\"Redo (Ctrl+Shift+Z)\" background=\"#fff\" onClick={actions.redo} />\n </Toolbar>\n );\n}\n", "import { useEffect } from \"react\";\nimport { ColorInput } from \"../atoms/color-input.js\";\nimport { RangeInput } from \"../atoms/range-input.js\";\nimport { Separator } from \"../atoms/separator.js\";\nimport { ToolButton } from \"../atoms/tool-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { DECAL_CATEGORIES } from \"../lib/catalog.js\";\nimport { COLOR_NAMES, isFixedColor, refHex } from \"../lib/colors.js\";\nimport { isInterior, sameArt, type CatalogEntry } from \"../lib/decals.js\";\nimport { ScrollRow } from \"../molecules/scroll-row.js\";\nimport { SwatchRow } from \"../molecules/swatch-row.js\";\nimport { Toolbar } from \"../molecules/toolbar.js\";\n\n/** Decals: category, art (from the viewport's catalog, with the creation's designs), tint, depth, flip, roll, eraser. */\nexport function DecalBar() {\n const { view, update, catalog, creation, dispatch, actions, toast } = useEditor();\n const brush = view.decalBrush;\n const entries = catalog.filter((entry) => entry.category === view.decalCategory);\n const chosen = catalog.find((entry) => sameArt(entry.art, brush.art));\n const tintable = !!chosen?.tintable;\n\n const choose = (entry: CatalogEntry | undefined) =>\n update((current) => {\n const { art: _art, ...rest } = current.decalBrush;\n return {\n ...current,\n decalBrush: entry ? { ...rest, art: entry.art, tint: entry.tint ?? rest.tint, eraser: false } : { ...rest, eraser: false },\n };\n });\n\n useEffect(() => {\n if (!brush.art && entries[0]) choose(entries[0]);\n }, [brush.art, entries[0]]);\n\n return (\n <Toolbar id=\"sub-decal\" label=\"Decals\" sub>\n <div id=\"decal-cat-buttons\" className=\"tb-section\">\n {DECAL_CATEGORIES.map((category) => (\n <ToolButton\n key={category.id}\n id={`decal-cat-${category.id}`}\n icon={category.fa}\n tooltip={category.name}\n background=\"#fff\"\n active={view.decalCategory === category.id}\n onClick={() => {\n update((current) => ({ ...current, decalCategory: category.id }));\n choose(catalog.find((entry) => entry.category === category.id));\n }}\n />\n ))}\n </div>\n <Separator />\n <ScrollRow label=\"Decal art\">\n {view.decalCategory === \"custom\" ? (\n <ToolButton\n icon=\"plus\"\n tooltip={`New decal (${creation.designs.length})`}\n background=\"#dcfce7\"\n onClick={() => update((current) => ({ ...current, decalEditor: {} }))}\n />\n ) : null}\n {entries.map((entry) => (\n <ToolButton\n key={entry.art.kind === \"design\" ? entry.art.designId : `${entry.art.category}/${entry.art.name}`}\n tooltip={entry.name}\n background=\"#f1f5f9\"\n active={sameArt(entry.art, brush.art)}\n onClick={() => choose(entry)}\n >\n <img className=\"decal-thumb\" src={entry.thumbnail} width={30} height={30} alt=\"\" />\n {entry.art.kind === \"design\" ? (\n <span\n className=\"decal-edit\"\n role=\"button\"\n aria-label={`Edit ${entry.name}`}\n title=\"Edit\"\n onClick={(event) => {\n event.stopPropagation();\n const designId = entry.art.kind === \"design\" ? entry.art.designId : undefined;\n if (designId) update((current) => ({ ...current, decalEditor: { designId } }));\n }}\n >\n <i className=\"fas fa-pen\" aria-hidden=\"true\" />\n </span>\n ) : null}\n </ToolButton>\n ))}\n </ScrollRow>\n <Separator />\n <div className=\"tb-section\">\n <ColorInput\n value={refHex(creation.palette, brush.tint)}\n label={`Edit ${COLOR_NAMES[brush.tint]} (tint)`}\n disabled={!tintable || isFixedColor(brush.tint)}\n onCommit={(color) => {\n if (!isFixedColor(brush.tint)) dispatch({ type: \"SetPaletteColor\", payload: { slot: brush.tint, color } });\n }}\n />\n <SwatchRow\n palette={creation.palette}\n active={tintable ? brush.tint : undefined}\n size={26}\n label=\"Decal tint\"\n onPick={(tint) => {\n if (!tintable) {\n toast(\"This decal is not tintable\");\n return;\n }\n update((current) => ({ ...current, decalBrush: { ...current.decalBrush, tint } }));\n }}\n />\n {isInterior(brush.art) ? (\n <label className=\"decal-depth\" title=\"Room depth (applies to the next interior)\">\n Depth\n <RangeInput\n label=\"Room depth\"\n value={brush.depth}\n min={0.5}\n max={2}\n step={0.05}\n onCommit={(depth) => update((current) => ({ ...current, decalBrush: { ...current.decalBrush, depth } }))}\n />\n </label>\n ) : null}\n <ToolButton id=\"decal-flip\" icon=\"left-right\" tooltip=\"Flip (F)\" background=\"#fff\" active={brush.flip} onClick={actions.flipDecal} />\n <ToolButton icon=\"rotate-left\" tooltip=\"Roll left ( , )\" background=\"#fff\" onClick={() => actions.rollDecal(-15)} />\n <ToolButton icon=\"rotate-right\" tooltip=\"Roll right ( . )\" background=\"#fff\" onClick={() => actions.rollDecal(15)} />\n <ToolButton\n id=\"decal-eraser\"\n icon=\"eraser\"\n tooltip=\"Eraser\"\n background=\"#fecaca\"\n active={brush.eraser}\n onClick={() => {\n const eraser = !brush.eraser;\n update((current) => ({ ...current, decalBrush: { ...current.decalBrush, eraser } }));\n toast(eraser ? \"Eraser: click a decal\" : \"Placing decals\");\n }}\n />\n </div>\n </Toolbar>\n );\n}\n", "import { useEffect, useRef, useState } from \"react\";\nimport { hexRgb } from \"../lib/colors.js\";\n\nexport type ColorInputProps = {\n readonly value: string;\n readonly label: string;\n readonly className?: string | undefined;\n readonly disabled?: boolean | undefined;\n /** Once, when the picker closes. */\n readonly onCommit: (rgb: number) => void;\n};\n\n/** A native color picker that shows the picked color locally and commits once. */\nexport function ColorInput({ value, label, className = \"slot-picker\", disabled, onCommit }: ColorInputProps) {\n const ref = useRef<HTMLInputElement>(null);\n const [draft, setDraft] = useState<string | undefined>(undefined);\n const commitRef = useRef(onCommit);\n commitRef.current = onCommit;\n\n useEffect(() => {\n const input = ref.current;\n if (!input) return;\n const commit = () => {\n setDraft(undefined);\n const rgb = hexRgb(input.value);\n if (rgb !== undefined) commitRef.current(rgb);\n };\n input.addEventListener(\"change\", commit);\n return () => input.removeEventListener(\"change\", commit);\n }, []);\n\n return (\n <input\n ref={ref}\n type=\"color\"\n className={className}\n aria-label={label}\n title={label}\n disabled={disabled}\n style={disabled ? { opacity: 0.35 } : undefined}\n value={draft ?? value}\n onInput={(event) => setDraft(event.currentTarget.value)}\n onChange={() => undefined}\n />\n );\n}\n", "import type { ColorRef, FixedColor, Palette, PaletteSlot, Rgb } from \"@dreamy/api\";\n\n/** The editable slots, in swatch order. */\nexport const PALETTE_SLOTS: readonly PaletteSlot[] = [\"primary\", \"secondary\", \"detail\", \"highlight\", \"eye\", \"pupil\", \"custom\"];\n\n/** The fixed colors, shown after the slots with a dark ring. */\nexport const FIXED_COLORS: readonly FixedColor[] = [\"tongue\", \"teeth\", \"black\"];\n\nexport const COLOR_REFS: readonly ColorRef[] = [...PALETTE_SLOTS, ...FIXED_COLORS];\n\n/** Display values of the fixed colors (the same ones the viewport draws). */\nconst FIXED_RGB: { readonly [Color in FixedColor]: Rgb } = { tongue: 0xf4768f, teeth: 0xfbfbfa, black: 0x111111 };\n\nexport const COLOR_NAMES: { readonly [Ref in ColorRef]: string } = {\n primary: \"Primary\",\n secondary: \"Secondary\",\n detail: \"Detail\",\n highlight: \"Highlight\",\n eye: \"Eye\",\n pupil: \"Pupil\",\n custom: \"Custom\",\n tongue: \"Fixed Tongue\",\n teeth: \"Fixed Teeth\",\n black: \"Fixed Black\",\n};\n\nexport function isFixedColor(ref: ColorRef): ref is FixedColor {\n return (FIXED_COLORS as readonly string[]).includes(ref);\n}\n\nexport function refRgb(palette: Palette, ref: ColorRef): Rgb {\n return isFixedColor(ref) ? FIXED_RGB[ref] : palette[ref];\n}\n\nexport function rgbHex(rgb: Rgb): string {\n return `#${(rgb & 0xffffff).toString(16).padStart(6, \"0\")}`;\n}\n\nexport function refHex(palette: Palette, ref: ColorRef): string {\n return rgbHex(refRgb(palette, ref));\n}\n\n/** \"#rrggbb\" from a color input; undefined when it is not one. */\nexport function hexRgb(hex: string): Rgb | undefined {\n const match = /^#?([0-9a-f]{6})$/i.exec(hex.trim());\n return match?.[1] ? parseInt(match[1], 16) : undefined;\n}\n", "import type { DecalArt, DecalCatalogEntry } from \"@dreamy/api\";\n\nexport type CatalogEntry = DecalCatalogEntry & { readonly category: string };\n\nexport function sameArt(a: DecalArt | undefined, b: DecalArt | undefined): boolean {\n if (!a || !b) return false;\n if (a.kind === \"design\" || b.kind === \"design\") return a.kind === b.kind && a.kind === \"design\" && b.kind === \"design\" && a.designId === b.designId;\n return a.category === b.category && a.name === b.name;\n}\n\nexport function isInterior(art: DecalArt | undefined): boolean {\n return art?.kind === \"builtin\" && art.category === \"interior\";\n}\n", "import { useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { Icon } from \"../atoms/icon.js\";\n\nexport type ScrollRowProps = {\n readonly label: string;\n readonly children: ReactNode;\n};\n\n/**\n * A long toolbar section that scrolls sideways: edge fades and chevrons when there is more, wheel scrolling,\n * and one shared tooltip (tooltips inside a scroller would be clipped).\n */\nexport function ScrollRow({ label, children }: ScrollRowProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [edges, setEdges] = useState({ left: false, right: false });\n const [tip, setTip] = useState<{ text: string; left: number; top: number; above: boolean } | undefined>(undefined);\n\n const update = useCallback(() => {\n const scroller = ref.current;\n if (!scroller) return;\n const max = scroller.scrollWidth - scroller.clientWidth;\n setEdges({ left: scroller.scrollLeft > 1, right: max > 1 && scroller.scrollLeft < max - 1 });\n }, []);\n\n useEffect(() => {\n update();\n window.addEventListener(\"resize\", update);\n return () => window.removeEventListener(\"resize\", update);\n }, [update, children]);\n\n const scrollBy = (direction: -1 | 1) => {\n const scroller = ref.current;\n if (!scroller) return;\n scroller.scrollBy?.({ left: Math.max(scroller.clientWidth * 0.8, 80) * direction, behavior: \"smooth\" });\n };\n\n const classes = [\"tb-scroll-wrap\", edges.left ? \"can-left\" : undefined, edges.right ? \"can-right\" : undefined].filter(Boolean).join(\" \");\n return (\n <div className={classes}>\n <button type=\"button\" className=\"tb-chev left\" aria-label=\"Scroll left\" onClick={() => scrollBy(-1)}>\n <Icon icon=\"chevron-left\" />\n </button>\n <div\n ref={ref}\n className=\"tb-scroll\"\n role=\"group\"\n aria-label={label}\n onScroll={update}\n onWheel={(event) => {\n const scroller = ref.current;\n if (!scroller || scroller.scrollWidth <= scroller.clientWidth) return;\n scroller.scrollLeft += event.deltaY || event.deltaX;\n update();\n }}\n onPointerOver={(event) => {\n const button = (event.target as Element).closest?.(\".tool-btn\");\n const text = button?.querySelector(\".tooltip\")?.textContent?.trim();\n if (!button || !text) return;\n const rect = button.getBoundingClientRect();\n const above = rect.bottom + 44 > window.innerHeight;\n setTip({ text, left: rect.left + rect.width / 2, top: above ? rect.top - 8 : rect.bottom + 8, above });\n }}\n onPointerLeave={() => setTip(undefined)}\n >\n {children}\n </div>\n <button type=\"button\" className=\"tb-chev right\" aria-label=\"Scroll right\" onClick={() => scrollBy(1)}>\n <Icon icon=\"chevron-right\" />\n </button>\n {tip ? (\n <div\n id=\"tb-tip\"\n className=\"show\"\n style={{ left: tip.left, top: tip.top, transform: tip.above ? \"translate(-50%, -100%)\" : \"translateX(-50%)\" }}\n >\n {tip.text}\n </div>\n ) : null}\n </div>\n );\n}\n", "import type { CSSProperties, ReactNode } from \"react\";\n\nexport type SwatchProps = {\n readonly color: string;\n readonly title: string;\n readonly fixed?: boolean | undefined;\n readonly active?: boolean | undefined;\n /** Fixed pixel size (rows); grids size swatches themselves. */\n readonly size?: number | undefined;\n readonly children?: ReactNode | undefined;\n readonly onClick: () => void;\n};\n\n/** One round palette swatch. */\nexport function Swatch({ color, title, fixed = false, active = false, size, children, onClick }: SwatchProps) {\n const style: CSSProperties = { background: color };\n if (size) Object.assign(style, { width: size, height: size, flexShrink: 0 });\n if (children) Object.assign(style, { display: \"flex\", alignItems: \"center\", justifyContent: \"center\" });\n const classes = [\"color-swatch\", fixed ? \"fixed\" : undefined, active ? \"brush-active\" : undefined].filter(Boolean).join(\" \");\n return (\n <button type=\"button\" className={classes} style={style} title={title} aria-label={title} aria-pressed={active} onClick={onClick}>\n {children}\n </button>\n );\n}\n", "import type { ColorRef, Palette } from \"@dreamy/api\";\nimport { Swatch } from \"../atoms/swatch.js\";\nimport { COLOR_NAMES, COLOR_REFS, isFixedColor, refHex } from \"../lib/colors.js\";\n\nexport type SwatchRowProps = {\n readonly palette: Palette;\n readonly active?: ColorRef | undefined;\n /** Fixed pixel size: a row (toolbars). Without it: a 10-column grid (panels). */\n readonly size?: number | undefined;\n readonly label: string;\n readonly onPick: (ref: ColorRef) => void;\n};\n\n/** One swatch per palette slot, then the fixed colors. */\nexport function SwatchRow({ palette, active, size, label, onPick }: SwatchRowProps) {\n return (\n <div className={size ? \"swatch-row\" : \"color-picker-grid\"} role=\"group\" aria-label={label}>\n {COLOR_REFS.map((ref) => (\n <Swatch\n key={ref}\n color={refHex(palette, ref)}\n title={COLOR_NAMES[ref]}\n fixed={isFixedColor(ref)}\n active={ref === active}\n {...(size ? { size } : {})}\n onClick={() => onPick(ref)}\n />\n ))}\n </div>\n );\n}\n", "import type { DesignPaint, DesignShape, Id } from \"@dreamy/api\";\nimport { useEffect, useRef, useState, type PointerEvent as ReactPointerEvent, type ReactNode } from \"react\";\nimport { ActionButton } from \"../atoms/action-button.js\";\nimport { Icon } from \"../atoms/icon.js\";\nimport { IconButton } from \"../atoms/icon-button.js\";\nimport { RangeInput } from \"../atoms/range-input.js\";\nimport { SelectInput } from \"../atoms/select-input.js\";\nimport { Swatch } from \"../atoms/swatch.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport {\n canTransform,\n DESIGN_SIZE,\n flattenShapes,\n GRID,\n loadDesignShapes,\n mapShapes,\n MAX_POINTS,\n paintColor,\n pathD,\n polygonPoints,\n shapeBounds,\n shapeD,\n shapesBounds,\n twinD,\n type Box,\n type EditorPath,\n type EditorShape,\n type Point,\n} from \"../lib/design-geometry.js\";\nimport { selectCategory } from \"../lib/view-state.js\";\nimport { SwatchRow } from \"../molecules/swatch-row.js\";\n\ntype DrawTool = \"line\" | \"polyline\" | \"polygon\" | \"rect\" | \"ellipse\" | \"star\" | \"ngon\";\ntype EditorTool = \"select\" | \"node\" | DrawTool;\n\ntype Draft =\n | { readonly tool: \"polyline\" | \"polygon\"; readonly points: readonly Point[] }\n | { readonly tool: Exclude<DrawTool, \"polyline\" | \"polygon\">; readonly a: Point; readonly b: Point; readonly shift: boolean };\n\ntype Drag =\n | { readonly type: \"move\" | \"rotate\"; readonly start: Point; readonly before: readonly EditorShape[]; readonly bounds: Box; readonly ids: ReadonlySet<string> }\n | { readonly type: \"scale\"; readonly handle: string; readonly start: Point; readonly before: readonly EditorShape[]; readonly bounds: Box; readonly ids: ReadonlySet<string> }\n | { readonly type: \"node\"; readonly before: readonly EditorShape[]; readonly node: NodeRef }\n | { readonly type: \"marquee\"; readonly start: Point; readonly additive: boolean }\n | { readonly type: \"draw\"; readonly before: readonly EditorShape[] };\n\ntype NodeRef = { readonly id: string; readonly path: number; readonly index: number };\n\ntype Style = { fill: DesignPaint; stroke: DesignPaint; width: number; cap: DesignShape[\"cap\"]; join: DesignShape[\"join\"] };\n\nconst MAX_SHAPES = 200;\nconst UNDO_MAX = 100;\n\nconst TOOLS: readonly { readonly id: EditorTool; readonly title: string; readonly svg: ReactNode; readonly key: string }[] = [\n { id: \"select\", title: \"Select / transform (V)\", key: \"KeyV\", svg: <path d=\"M6 3l12 8-5.5 1.5L9.5 18z\" /> },\n {\n id: \"node\",\n title: \"Edit nodes (N)\",\n key: \"KeyN\",\n svg: (\n <>\n <path d=\"M5 19C8 4 15 21 19 5\" />\n <rect x=\"2.5\" y=\"16.5\" width=\"5\" height=\"5\" />\n <rect x=\"16.5\" y=\"2.5\" width=\"5\" height=\"5\" />\n </>\n ),\n },\n { id: \"line\", title: \"Line (L)\", key: \"KeyL\", svg: <path d=\"M4 20L20 4\" /> },\n { id: \"polyline\", title: \"Polyline, open (P)\", key: \"KeyP\", svg: <path d=\"M3 18l6-10 5 7 7-11\" /> },\n { id: \"polygon\", title: \"Polygon, closed (G)\", key: \"KeyG\", svg: <path d=\"M12 3l9 7-3.5 10h-11L3 10z\" /> },\n { id: \"rect\", title: \"Rectangle (R)\", key: \"KeyR\", svg: <rect x=\"3.5\" y=\"6\" width=\"17\" height=\"12\" rx=\"1\" /> },\n { id: \"ellipse\", title: \"Ellipse (E)\", key: \"KeyE\", svg: <ellipse cx=\"12\" cy=\"12\" rx=\"9\" ry=\"6.5\" /> },\n { id: \"star\", title: \"Star (S)\", key: \"KeyS\", svg: <path d=\"M12 3l2.7 5.6 6.1.9-4.4 4.3 1 6.1L12 17l-5.4 2.9 1-6.1L3.2 9.5l6.1-.9z\" /> },\n { id: \"ngon\", title: \"Regular polygon (H)\", key: \"KeyH\", svg: <path d=\"M12 3l8 4.5v9L12 21l-8-4.5v-9z\" /> },\n];\n\nconst HINTS: { readonly [Tool in EditorTool]: string } = {\n select: \"Click to select \u00B7 drag empty space for an area \u00B7 Shift / Ctrl adds \u00B7 drag handles to scale / rotate\",\n node: \"Drag nodes \u00B7 double-click an edge to add one \u00B7 Delete removes the selected node\",\n line: \"Drag to draw a line\",\n polyline: \"Click points \u00B7 Enter, double-click or the check button finishes \u00B7 click the first point to close\",\n polygon: \"Click points \u00B7 Enter, double-click or the check button closes it\",\n rect: \"Drag a box \u00B7 Shift for a square\",\n ellipse: \"Drag a box \u00B7 Shift for a circle\",\n star: \"Drag from the center outward \u00B7 sides and point depth on the right\",\n ngon: \"Drag from the center outward \u00B7 set the number of sides on the right\",\n};\n\nconst CAPS = [\n { id: \"round\", name: \"Round\" },\n { id: \"butt\", name: \"Flat\" },\n { id: \"square\", name: \"Square\" },\n] as const;\n\nconst JOINS = [\n { id: \"round\", name: \"Round\" },\n { id: \"miter\", name: \"Sharp\" },\n { id: \"bevel\", name: \"Bevel\" },\n] as const;\n\n/** The decal design editor (modal): a small vector editor whose Save dispatches SaveDesign. */\nexport function DecalEditor() {\n const { view } = useEditor();\n if (!view.decalEditor) return null;\n return <DecalEditorDialog key={view.decalEditor.designId ?? \"new\"} designId={view.decalEditor.designId} />;\n}\n\nfunction DecalEditorDialog({ designId }: { readonly designId: Id | undefined }) {\n const { api, creation, update, dispatch, toast } = useEditor();\n const design = designId ? creation.designs.find((entry) => entry.id === designId) : undefined;\n const ids = useRef(1);\n const nextId = () => `sh${ids.current++}`;\n const [shapes, setShapes] = useState<readonly EditorShape[]>(() => (design ? loadDesignShapes(design.shapes, nextId) : []));\n const [undoStack, setUndo] = useState<readonly (readonly EditorShape[])[]>([]);\n const [redoStack, setRedo] = useState<readonly (readonly EditorShape[])[]>([]);\n const [selection, setSelection] = useState<ReadonlySet<string>>(new Set());\n const [node, setNode] = useState<NodeRef | undefined>(undefined);\n const [tool, setToolState] = useState<EditorTool>(\"select\");\n const [style, setStyle] = useState<Style>({ fill: \"black\", stroke: \"none\", width: 6, cap: \"round\", join: \"round\" });\n const [target, setTarget] = useState<\"fill\" | \"stroke\">(\"fill\");\n const [flags, setFlags] = useState({ smooth: false, mirror: false, snap: false, add: false });\n const [sides, setSides] = useState(5);\n const [ratio, setRatio] = useState(0.45);\n const [draft, setDraft] = useState<Draft | undefined>(undefined);\n const [marquee, setMarquee] = useState<{ start: Point; end: Point } | undefined>(undefined);\n const [cursor, setCursor] = useState<Point>([0, 0]);\n const [name, setName] = useState(design?.name ?? \"\");\n const [dirty, setDirty] = useState(false);\n const [confirm, setConfirm] = useState<\"close\" | \"delete\" | undefined>(undefined);\n const [widthBefore, setWidthBefore] = useState<readonly EditorShape[] | undefined>(undefined);\n const drag = useRef<Drag | undefined>(undefined);\n const svg = useRef<SVGSVGElement>(null);\n\n const selected = shapes.filter((shape) => selection.has(shape.id));\n const close = () => update((current) => ({ ...current, decalEditor: null }));\n const units = () => {\n const width = svg.current?.getBoundingClientRect().width ?? 0;\n return width > 0 ? DESIGN_SIZE / width : 1;\n };\n const snap = (value: number) => (flags.snap ? Math.round(value / GRID) * GRID : value);\n const snapPoint = (p: Point): Point => [snap(p[0]), snap(p[1])];\n const clampPoint = (p: Point): Point => [Math.max(-8, Math.min(DESIGN_SIZE + 8, p[0])), Math.max(-8, Math.min(DESIGN_SIZE + 8, p[1]))];\n\n const commit = (before: readonly EditorShape[], after: readonly EditorShape[]) => {\n if (JSON.stringify(before) === JSON.stringify(after)) {\n setShapes(after);\n return;\n }\n setUndo((stack) => [...stack.slice(-(UNDO_MAX - 1)), before]);\n setRedo([]);\n setShapes(after);\n setDirty(true);\n };\n\n const fixSelection = (next: readonly EditorShape[]) => {\n setSelection((current) => new Set([...current].filter((id) => next.some((shape) => shape.id === id))));\n setNode(undefined);\n };\n\n const undo = () => {\n const previous = undoStack[undoStack.length - 1];\n if (!previous) return;\n setUndo(undoStack.slice(0, -1));\n setRedo([...redoStack, shapes]);\n setShapes(previous);\n setDraft(undefined);\n setDirty(true);\n fixSelection(previous);\n };\n\n const redo = () => {\n const next = redoStack[redoStack.length - 1];\n if (!next) return;\n setRedo(redoStack.slice(0, -1));\n setUndo([...undoStack, shapes]);\n setShapes(next);\n setDirty(true);\n fixSelection(next);\n };\n\n const newShape = (paths: readonly EditorPath[], open: boolean): EditorShape => {\n const base = { id: nextId(), paths, width: style.width, cap: style.cap, join: style.join, rule: \"nonzero\" as const, mirror: flags.mirror };\n if (open) {\n const stroke = style.stroke !== \"none\" ? style.stroke : style.fill !== \"none\" ? style.fill : \"black\";\n return { ...base, fill: \"none\", stroke, width: Math.max(1, style.width) };\n }\n const fill = style.fill === \"none\" && style.stroke === \"none\" ? \"black\" : style.fill;\n return { ...base, fill, stroke: style.stroke };\n };\n\n const addShape = (shape: EditorShape, before: readonly EditorShape[]) => {\n if (before.length >= MAX_SHAPES) {\n toast(\"Too many shapes in this design\");\n return;\n }\n commit(before, [...before, shape]);\n setSelection(new Set([shape.id]));\n setNode(undefined);\n };\n\n const finishPoly = (closeIt: boolean) => {\n if (!draft || (draft.tool !== \"polyline\" && draft.tool !== \"polygon\")) return;\n setDraft(undefined);\n if (draft.points.length < (closeIt ? 3 : 2)) {\n toast(closeIt ? \"A polygon needs at least 3 points\" : \"Needs at least 2 points\");\n return;\n }\n const smooth = flags.smooth && draft.points.length >= 3;\n addShape(newShape([{ kind: \"poly\", points: draft.points, closed: closeIt, smooth }], !closeIt), shapes);\n };\n\n const setTool = (next: EditorTool) => {\n if (draft && \"points\" in draft && draft.points.length >= 2) finishPoly(draft.tool === \"polygon\");\n else setDraft(undefined);\n drag.current = undefined;\n setToolState(next);\n };\n\n const pointOf = (event: { clientX: number; clientY: number }): Point => {\n const rect = svg.current?.getBoundingClientRect();\n const scale = rect && rect.width > 0 ? DESIGN_SIZE / rect.width : 1;\n return [(event.clientX - (rect?.left ?? 0)) * scale, (event.clientY - (rect?.top ?? 0)) * scale];\n };\n\n const dragBox = (d: Extract<Draft, { a: Point }>) => {\n let dx = d.b[0] - d.a[0];\n let dy = d.b[1] - d.a[1];\n if (d.shift) {\n const m = Math.max(Math.abs(dx), Math.abs(dy));\n dx = (dx < 0 ? -1 : 1) * m;\n dy = (dy < 0 ? -1 : 1) * m;\n }\n return { x: Math.min(d.a[0], d.a[0] + dx), y: Math.min(d.a[1], d.a[1] + dy), w: Math.abs(dx), h: Math.abs(dy) };\n };\n\n const onPointerDown = (event: ReactPointerEvent<SVGSVGElement>) => {\n if (event.button !== 0) return;\n event.preventDefault();\n svg.current?.setPointerCapture?.(event.pointerId);\n const p = pointOf(event);\n const data = (event.target as SVGElement).dataset ?? {};\n const additive = event.shiftKey || event.ctrlKey || event.metaKey || flags.add;\n setCursor(p);\n\n if (tool === \"select\" || tool === \"node\") {\n if (data.h && tool === \"select\") {\n const movable = selected.filter(canTransform);\n const bounds = shapesBounds(movable);\n if (!bounds) return;\n const idSet = new Set(movable.map((shape) => shape.id));\n drag.current =\n data.h === \"rot\"\n ? { type: \"rotate\", start: p, before: shapes, bounds, ids: idSet }\n : { type: \"scale\", handle: data.h, start: p, before: shapes, bounds, ids: idSet };\n return;\n }\n if (data.n && tool === \"node\") {\n const [id, path, index] = data.n.split(\":\");\n if (!id) return;\n const ref = { id, path: Number(path), index: Number(index) };\n setNode(ref);\n drag.current = { type: \"node\", before: shapes, node: ref };\n return;\n }\n if (data.id) {\n const id = data.id;\n setNode(undefined);\n let next: ReadonlySet<string>;\n if (additive) {\n if (selection.has(id)) {\n const without = new Set(selection);\n without.delete(id);\n setSelection(without);\n return;\n }\n next = new Set([...selection, id]);\n } else next = selection.has(id) ? selection : new Set([id]);\n setSelection(next);\n if (tool === \"select\") {\n const movable = shapes.filter((shape) => next.has(shape.id) && canTransform(shape));\n const bounds = shapesBounds(movable);\n if (movable.length && bounds) drag.current = { type: \"move\", start: p, before: shapes, bounds, ids: new Set(movable.map((shape) => shape.id)) };\n else toast(\"Imported paths can't be moved or resized\");\n }\n return;\n }\n drag.current = { type: \"marquee\", start: p, additive };\n setMarquee({ start: p, end: p });\n return;\n }\n\n if (tool === \"polyline\" || tool === \"polygon\") {\n const current = draft && \"points\" in draft ? draft : { tool, points: [] as readonly Point[] };\n const first = current.points[0];\n if (first && current.points.length >= 3 && Math.hypot(p[0] - first[0], p[1] - first[1]) < 8 * units()) {\n finishPoly(true);\n return;\n }\n const q = clampPoint(snapPoint(p));\n const last = current.points[current.points.length - 1];\n if (last && Math.hypot(q[0] - last[0], q[1] - last[1]) < 2 * units()) return;\n if (current.points.length >= MAX_POINTS) {\n toast(`Max ${MAX_POINTS} points per shape`);\n finishPoly(tool === \"polygon\");\n return;\n }\n setDraft({ tool, points: [...current.points, q] });\n return;\n }\n const a = clampPoint(snapPoint(p));\n setDraft({ tool, a, b: a, shift: event.shiftKey });\n drag.current = { type: \"draw\", before: shapes };\n };\n\n const onPointerMove = (event: ReactPointerEvent<SVGSVGElement>) => {\n const p = pointOf(event);\n setCursor(p);\n const d = drag.current;\n if (!d) return;\n const ps = flags.snap ? snapPoint(p) : p;\n if (d.type === \"move\") {\n const dx = snap(d.bounds.x0 + p[0] - d.start[0]) - d.bounds.x0;\n const dy = snap(d.bounds.y0 + p[1] - d.start[1]) - d.bounds.y0;\n setShapes(mapShapes(d.before, d.ids, (q) => [q[0] + dx, q[1] + dy]));\n } else if (d.type === \"scale\") {\n const b = d.bounds;\n const h = d.handle;\n const hx = h.includes(\"w\") ? -1 : h.includes(\"e\") ? 1 : 0;\n const hy = h.includes(\"n\") ? -1 : h.includes(\"s\") ? 1 : 0;\n const ax = hx > 0 ? b.x0 : hx < 0 ? b.x1 : (b.x0 + b.x1) / 2;\n const ay = hy > 0 ? b.y0 : hy < 0 ? b.y1 : (b.y0 + b.y1) / 2;\n const ox = hx > 0 ? b.x1 : hx < 0 ? b.x0 : ax;\n const oy = hy > 0 ? b.y1 : hy < 0 ? b.y0 : ay;\n let sx = hx && Math.abs(ox - ax) > 1e-6 ? (ps[0] - ax) / (ox - ax) : 1;\n let sy = hy && Math.abs(oy - ay) > 1e-6 ? (ps[1] - ay) / (oy - ay) : 1;\n if (event.shiftKey && hx && hy) {\n const m = Math.max(Math.abs(sx), Math.abs(sy));\n sx = (sx < 0 ? -1 : 1) * m;\n sy = (sy < 0 ? -1 : 1) * m;\n }\n if (Math.abs(sx) < 0.02) sx = sx < 0 ? -0.02 : 0.02;\n if (Math.abs(sy) < 0.02) sy = sy < 0 ? -0.02 : 0.02;\n setShapes(mapShapes(d.before, d.ids, (q) => [ax + (q[0] - ax) * sx, ay + (q[1] - ay) * sy]));\n } else if (d.type === \"rotate\") {\n const cx = (d.bounds.x0 + d.bounds.x1) / 2;\n const cy = (d.bounds.y0 + d.bounds.y1) / 2;\n let angle = Math.atan2(p[1] - cy, p[0] - cx) - Math.atan2(d.start[1] - cy, d.start[0] - cx);\n if (event.shiftKey || flags.snap) angle = Math.round(angle / (Math.PI / 12)) * (Math.PI / 12);\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n setShapes(mapShapes(d.before, d.ids, (q) => [cx + (q[0] - cx) * c - (q[1] - cy) * s, cy + (q[0] - cx) * s + (q[1] - cy) * c]));\n } else if (d.type === \"node\") {\n const q = clampPoint(ps);\n setShapes(\n d.before.map((shape) =>\n shape.id !== d.node.id\n ? shape\n : {\n ...shape,\n paths: shape.paths.map((path, index) =>\n index !== d.node.path || path.kind === \"raw\"\n ? path\n : { ...path, points: path.points.map((point, at) => (at === d.node.index ? q : point)) },\n ),\n },\n ),\n );\n } else if (d.type === \"marquee\") {\n setMarquee({ start: d.start, end: p });\n } else if (d.type === \"draw\" && draft && \"a\" in draft) {\n setDraft({ ...draft, b: clampPoint(ps), shift: event.shiftKey });\n }\n };\n\n const onPointerUp = (event: ReactPointerEvent<SVGSVGElement>) => {\n const d = drag.current;\n drag.current = undefined;\n svg.current?.releasePointerCapture?.(event.pointerId);\n if (!d) return;\n if (d.type === \"marquee\") {\n const end = pointOf(event);\n setMarquee(undefined);\n const x0 = Math.min(d.start[0], end[0]);\n const x1 = Math.max(d.start[0], end[0]);\n const y0 = Math.min(d.start[1], end[1]);\n const y1 = Math.max(d.start[1], end[1]);\n if (Math.hypot(x1 - x0, y1 - y0) < 2 * units()) {\n if (!d.additive) {\n setSelection(new Set());\n setNode(undefined);\n }\n return;\n }\n const hit = shapes.filter((shape) => {\n const b = shapeBounds(shape);\n return b && !(b.x1 < x0 || b.x0 > x1 || b.y1 < y0 || b.y0 > y1);\n });\n setSelection(new Set([...(d.additive ? selection : []), ...hit.map((shape) => shape.id)]));\n setNode(undefined);\n return;\n }\n if (d.type === \"draw\") {\n finishDraw(d.before);\n return;\n }\n commit(d.before, shapes);\n };\n\n const finishDraw = (before: readonly EditorShape[]) => {\n const d = draft;\n setDraft(undefined);\n if (!d || !(\"a\" in d)) return;\n const { a, b } = d;\n if (d.tool === \"line\") {\n if (Math.hypot(b[0] - a[0], b[1] - a[1]) < 1.5) return;\n addShape(newShape([{ kind: \"poly\", points: [a, b], closed: false, smooth: false }], true), before);\n } else if (d.tool === \"rect\" || d.tool === \"ellipse\") {\n const { x, y, w, h } = dragBox(d);\n if (w < 1.5 || h < 1.5) return;\n const path: EditorPath =\n d.tool === \"rect\"\n ? { kind: \"poly\", points: [[x, y], [x + w, y], [x + w, y + h], [x, y + h]], closed: true, smooth: false }\n : { kind: \"ellipse\", points: [[x + w, y + h / 2], [x + w / 2, y + h], [x, y + h / 2], [x + w / 2, y]] };\n addShape(newShape([path], false), before);\n } else {\n const radius = Math.hypot(b[0] - a[0], b[1] - a[1]);\n if (radius < 2) return;\n addShape(newShape([{ kind: \"poly\", points: polygonPoints(d.tool, a, radius, sides, ratio), closed: true, smooth: false }], false), before);\n }\n };\n\n const onDoubleClick = (event: React.MouseEvent<SVGSVGElement>) => {\n if (draft && \"points\" in draft) {\n finishPoly(draft.tool === \"polygon\");\n return;\n }\n if (tool !== \"node\") return;\n const p = pointOf(event);\n let best: { id: string; path: number; index: number; q: Point } | undefined;\n let bestDistance = 8 * units();\n selected.forEach((shape) =>\n shape.paths.forEach((path, pathIndex) => {\n if (path.kind !== \"poly\" || path.points.length >= MAX_POINTS) return;\n const P = path.points;\n const segments = path.closed ? P.length : P.length - 1;\n for (let i = 0; i < segments; i++) {\n const a = P[i] as Point;\n const b = P[(i + 1) % P.length] as Point;\n const vx = b[0] - a[0];\n const vy = b[1] - a[1];\n const length = vx * vx + vy * vy || 1e-9;\n const t = Math.max(0, Math.min(1, ((p[0] - a[0]) * vx + (p[1] - a[1]) * vy) / length));\n const q: Point = [a[0] + vx * t, a[1] + vy * t];\n const distance = Math.hypot(p[0] - q[0], p[1] - q[1]);\n if (distance < bestDistance) {\n bestDistance = distance;\n best = { id: shape.id, path: pathIndex, index: i, q };\n }\n }\n }),\n );\n if (!best) return;\n const found = best;\n const next = shapes.map((shape) =>\n shape.id !== found.id\n ? shape\n : {\n ...shape,\n paths: shape.paths.map((path, index) =>\n index !== found.path || path.kind !== \"poly\"\n ? path\n : { ...path, points: [...path.points.slice(0, found.index + 1), snapPoint(found.q), ...path.points.slice(found.index + 1)] },\n ),\n },\n );\n commit(shapes, next);\n setNode({ id: found.id, path: found.path, index: found.index + 1 });\n };\n\n const deleteNode = () => {\n if (!node) return;\n const shape = shapes.find((entry) => entry.id === node.id);\n const path = shape?.paths[node.path];\n if (!shape || !path || path.kind !== \"poly\") {\n toast(\"Can't remove a node here\");\n return;\n }\n const min = path.closed ? 3 : 2;\n if (path.points.length <= min) {\n toast(`A shape needs at least ${min} nodes`);\n return;\n }\n commit(\n shapes,\n shapes.map((entry) =>\n entry.id !== shape.id\n ? entry\n : { ...entry, paths: entry.paths.map((p, index) => (index === node.path && p.kind === \"poly\" ? { ...p, points: p.points.filter((_, at) => at !== node.index) } : p)) },\n ),\n );\n setNode(undefined);\n };\n\n const act = (name: \"del\" | \"dup\" | \"flipx\" | \"flipy\" | \"front\" | \"back\" | \"up\" | \"down\" | \"combine\" | \"split\" | \"all\") => {\n if (name === \"all\") {\n setSelection(new Set(shapes.map((shape) => shape.id)));\n return;\n }\n if (!selected.length) {\n toast(\"Select a shape first\");\n return;\n }\n const isSelected = (shape: EditorShape) => selection.has(shape.id);\n if (name === \"del\") {\n if (tool === \"node\" && node) {\n deleteNode();\n return;\n }\n commit(shapes, shapes.filter((shape) => !isSelected(shape)));\n setSelection(new Set());\n setNode(undefined);\n } else if (name === \"dup\") {\n const copies = selected.map((shape) => ({\n ...shape,\n id: nextId(),\n paths: shape.paths.map((path) => (path.kind === \"raw\" ? path : { ...path, points: path.points.map((q) => [q[0] + 6, q[1] + 6] as const) })),\n }));\n commit(shapes, [...shapes, ...copies]);\n setSelection(new Set(copies.map((shape) => shape.id)));\n } else if (name === \"flipx\" || name === \"flipy\") {\n const movable = selected.filter(canTransform);\n const b = shapesBounds(movable);\n if (!b) return;\n const cx = (b.x0 + b.x1) / 2;\n const cy = (b.y0 + b.y1) / 2;\n commit(shapes, mapShapes(shapes, new Set(movable.map((shape) => shape.id)), (q) => (name === \"flipx\" ? [2 * cx - q[0], q[1]] : [q[0], 2 * cy - q[1]])));\n } else if (name === \"front\" || name === \"back\") {\n const picked = shapes.filter(isSelected);\n const rest = shapes.filter((shape) => !isSelected(shape));\n commit(shapes, name === \"front\" ? [...rest, ...picked] : [...picked, ...rest]);\n } else if (name === \"up\" || name === \"down\") {\n const next = [...shapes];\n if (name === \"up\") {\n for (let i = next.length - 2; i >= 0; i--) {\n const a = next[i] as EditorShape;\n const b = next[i + 1] as EditorShape;\n if (isSelected(a) && !isSelected(b)) [next[i], next[i + 1]] = [b, a];\n }\n } else {\n for (let i = 1; i < next.length; i++) {\n const a = next[i] as EditorShape;\n const b = next[i - 1] as EditorShape;\n if (isSelected(a) && !isSelected(b)) [next[i], next[i - 1]] = [b, a];\n }\n }\n commit(shapes, next);\n } else if (name === \"combine\") {\n if (selected.length < 2) {\n toast(\"Select two or more shapes to combine\");\n return;\n }\n const base = selected[0] as EditorShape;\n const combined: EditorShape = { ...base, paths: selected.flatMap((shape) => shape.paths), rule: \"evenodd\" };\n commit(shapes, shapes.flatMap((shape) => (shape.id === base.id ? [combined] : isSelected(shape) ? [] : [shape])));\n setSelection(new Set([base.id]));\n } else if (name === \"split\") {\n const kept: string[] = [];\n const next = shapes.flatMap((shape) => {\n if (!isSelected(shape) || shape.paths.length < 2) {\n if (isSelected(shape)) kept.push(shape.id);\n return [shape];\n }\n return shape.paths.map((path) => {\n const id = nextId();\n kept.push(id);\n return { ...shape, id, paths: [path] };\n });\n });\n commit(shapes, next);\n setSelection(new Set(kept));\n }\n };\n\n const nudge = (dx: number, dy: number) => {\n const movable = selected.filter(canTransform);\n if (!movable.length) return;\n commit(shapes, mapShapes(shapes, new Set(movable.map((shape) => shape.id)), (q) => [q[0] + dx, q[1] + dy]));\n };\n\n const setPaint = (paint: DesignPaint) => {\n setStyle((current) => ({ ...current, [target]: paint }));\n if (selected.length) commit(shapes, shapes.map((shape) => (selection.has(shape.id) ? { ...shape, [target]: paint } : shape)));\n };\n\n const setProp = <Key extends \"cap\" | \"join\">(key: Key, value: Style[Key]) => {\n setStyle((current) => ({ ...current, [key]: value }));\n if (selected.length) commit(shapes, shapes.map((shape) => (selection.has(shape.id) ? { ...shape, [key]: value } : shape)));\n };\n\n const toggle = (which: \"smooth\" | \"mirror\" | \"holes\" | \"snap\" | \"add\") => {\n if (which === \"snap\" || which === \"add\") {\n setFlags((current) => ({ ...current, [which]: !current[which] }));\n return;\n }\n if (which === \"smooth\") {\n const paths = selected.flatMap((shape) => shape.paths).filter((path) => path.kind === \"poly\" && path.points.length >= 3);\n const on = paths.length ? !paths.every((path) => path.kind === \"poly\" && path.smooth) : !flags.smooth;\n setFlags((current) => ({ ...current, smooth: on }));\n commit(\n shapes,\n shapes.map((shape) =>\n selection.has(shape.id)\n ? { ...shape, paths: shape.paths.map((path) => (path.kind === \"poly\" && path.points.length >= 3 ? { ...path, smooth: on } : path)) }\n : shape,\n ),\n );\n } else if (which === \"mirror\") {\n const mine = selected.filter(canTransform);\n const on = mine.length ? !mine.every((shape) => shape.mirror) : !flags.mirror;\n setFlags((current) => ({ ...current, mirror: on }));\n commit(shapes, shapes.map((shape) => (mine.some((entry) => entry.id === shape.id) ? { ...shape, mirror: on } : shape)));\n } else {\n if (!selected.length) {\n toast(\"Select a shape first\");\n return;\n }\n const on = !selected.every((shape) => shape.rule === \"evenodd\");\n commit(shapes, shapes.map((shape) => (selection.has(shape.id) ? { ...shape, rule: on ? \"evenodd\" : \"nonzero\" } : shape)));\n }\n };\n\n const save = (asNew: boolean) => {\n if (!shapes.some((shape) => shapeD(shape))) {\n toast(\"Draw something first\");\n return;\n }\n const designName = name.trim().slice(0, 40) || design?.name || `Decal ${creation.designs.length + 1}`;\n const before = new Set(creation.designs.map((entry) => entry.id));\n const replace = design && !asNew;\n const ok = dispatch({\n type: \"SaveDesign\",\n payload: { ...(replace ? { designId: design.id } : {}), name: designName, shapes: flattenShapes(shapes) },\n });\n if (!ok) return;\n toast(replace ? `\"${designName}\" updated` : `\"${designName}\" saved`);\n const created = replace ? undefined : api.creation().designs.find((entry) => !before.has(entry.id))?.id;\n update((current) =>\n created\n ? {\n ...selectCategory(current, \"decal\"),\n decalCategory: \"custom\",\n decalEditor: null,\n decalBrush: { ...current.decalBrush, art: { kind: \"design\", designId: created }, eraser: false },\n }\n : { ...current, decalEditor: null },\n );\n };\n\n const cancel = () => {\n if (dirty && confirm !== \"close\") {\n setConfirm(\"close\");\n toast(\"Discard your changes? Press Cancel again\");\n return;\n }\n close();\n };\n\n const removeDesign = () => {\n if (!design) return;\n if (confirm !== \"delete\") {\n setConfirm(\"delete\");\n return;\n }\n if (dispatch({ type: \"DeleteDesign\", payload: { designId: design.id } })) {\n toast(\"Design deleted\");\n update((current) => {\n const art = current.decalBrush.art;\n if (art?.kind !== \"design\" || art.designId !== design.id) return { ...current, decalEditor: null };\n const { art: _art, ...brush } = current.decalBrush;\n return { ...current, decalEditor: null, decalBrush: brush };\n });\n } else setConfirm(undefined);\n };\n\n const keyRef = useRef<(event: KeyboardEvent) => void>(() => undefined);\n keyRef.current = (event: KeyboardEvent) => {\n const tag = (event.target as HTMLElement | null)?.tagName;\n if (tag === \"SELECT\") return;\n const mod = event.ctrlKey || event.metaKey;\n const field = tag === \"INPUT\";\n if (event.code === \"Escape\") {\n if (event.repeat) return;\n event.preventDefault();\n if (draft) setDraft(undefined);\n else if (selection.size) {\n setSelection(new Set());\n setNode(undefined);\n } else if (tool !== \"select\") setTool(\"select\");\n else cancel();\n return;\n }\n if (mod && event.code === \"KeyZ\") {\n event.preventDefault();\n if (event.shiftKey) redo();\n else undo();\n return;\n }\n if (mod && event.code === \"KeyY\") {\n event.preventDefault();\n redo();\n return;\n }\n if (mod && event.code === \"KeyD\") {\n event.preventDefault();\n act(\"dup\");\n return;\n }\n if (mod && event.code === \"KeyA\") {\n event.preventDefault();\n act(\"all\");\n return;\n }\n if (mod) return;\n if (field) return;\n if (event.code === \"Enter\") {\n if (draft && \"points\" in draft) {\n event.preventDefault();\n finishPoly(draft.tool === \"polygon\");\n }\n return;\n }\n if (event.code === \"Delete\" || event.code === \"Backspace\") {\n event.preventDefault();\n if (draft && \"points\" in draft) {\n const points = draft.points.slice(0, -1);\n setDraft(points.length ? { ...draft, points } : undefined);\n } else if (tool === \"node\" && node) deleteNode();\n else if (selection.size) act(\"del\");\n return;\n }\n if (event.code.startsWith(\"Arrow\")) {\n event.preventDefault();\n const step = event.shiftKey ? GRID : 1;\n nudge(event.code === \"ArrowLeft\" ? -step : event.code === \"ArrowRight\" ? step : 0, event.code === \"ArrowUp\" ? -step : event.code === \"ArrowDown\" ? step : 0);\n return;\n }\n const hotkey = TOOLS.find((entry) => entry.key === event.code);\n if (hotkey && !event.altKey) {\n event.preventDefault();\n setTool(hotkey.id);\n }\n };\n\n useEffect(() => {\n const listener = (event: KeyboardEvent) => keyRef.current(event);\n window.addEventListener(\"keydown\", listener);\n return () => window.removeEventListener(\"keydown\", listener);\n }, []);\n\n if (designId && !design) return null;\n\n const u = units();\n const strokeOf = (shape: EditorShape) => (shape.stroke !== \"none\" && shape.width > 0 ? paintColor(creation.palette, shape.stroke) : \"none\");\n const art = shapes.flatMap((shape) => {\n const d = shapeD(shape);\n if (!d) return [];\n const attrs = {\n fill: paintColor(creation.palette, shape.fill),\n fillRule: shape.rule,\n stroke: strokeOf(shape),\n strokeWidth: shape.width,\n strokeLinecap: shape.cap,\n strokeLinejoin: shape.join,\n };\n const twin = twinD(shape);\n return [<path key={shape.id} d={d} {...attrs} />, ...(twin ? [<path key={`${shape.id}-twin`} d={twin} {...attrs} />] : [])];\n });\n const bounds = shapesBounds(selected);\n const handles: ReactNode[] = [];\n if (bounds && tool === \"select\") {\n const hs = 5.5 * u;\n const mx = (bounds.x0 + bounds.x1) / 2;\n const my = (bounds.y0 + bounds.y1) / 2;\n const ry = bounds.y0 - 18 * u;\n const spots: Record<string, Point> = {\n nw: [bounds.x0, bounds.y0],\n n: [mx, bounds.y0],\n ne: [bounds.x1, bounds.y0],\n e: [bounds.x1, my],\n se: [bounds.x1, bounds.y1],\n s: [mx, bounds.y1],\n sw: [bounds.x0, bounds.y1],\n w: [bounds.x0, my],\n };\n handles.push(<line key=\"stem\" x1={mx} y1={bounds.y0} x2={mx} y2={ry} className=\"de-selbox\" vectorEffect=\"non-scaling-stroke\" pointerEvents=\"none\" />);\n Object.entries(spots).forEach(([key, spot]) =>\n handles.push(\n <rect key={key} data-h={key} className={`de-handle h-${key}`} x={spot[0] - hs} y={spot[1] - hs} width={hs * 2} height={hs * 2} vectorEffect=\"non-scaling-stroke\" />,\n ),\n );\n handles.push(<circle key=\"rot\" data-h=\"rot\" className=\"de-handle h-rot\" cx={mx} cy={ry} r={hs * 1.1} vectorEffect=\"non-scaling-stroke\" />);\n }\n const nodes: ReactNode[] = [];\n if (tool === \"node\") {\n const r = 4.5 * u;\n selected.forEach((shape) =>\n shape.paths.forEach((path, pathIndex) => {\n if (path.kind === \"raw\") return;\n path.points.forEach((q, index) => {\n const on = node?.id === shape.id && node.path === pathIndex && node.index === index;\n nodes.push(\n <circle\n key={`${shape.id}:${pathIndex}:${index}`}\n data-n={`${shape.id}:${pathIndex}:${index}`}\n className={`de-node${on ? \" on\" : \"\"}`}\n cx={q[0]}\n cy={q[1]}\n r={on ? r * 1.3 : r}\n vectorEffect=\"non-scaling-stroke\"\n />,\n );\n });\n }),\n );\n }\n let preview: ReactNode = null;\n if (draft) {\n const props = { className: \"de-draft\", vectorEffect: \"non-scaling-stroke\" as const, pointerEvents: \"none\" as const };\n if (\"points\" in draft) {\n const live = draft.points.length ? clampPoint(flags.snap ? snapPoint(cursor) : cursor) : undefined;\n const all = live ? [...draft.points, live] : draft.points;\n preview = (\n <>\n {all.length > 1 ? (\n <path\n d={`M${all.map((q) => `${q[0]} ${q[1]}`).join(\"L\")}${draft.tool === \"polygon\" && draft.points.length >= 2 ? \"Z\" : \"\"}`}\n fill={draft.tool === \"polygon\" ? \"rgba(56,189,248,.15)\" : \"none\"}\n {...props}\n />\n ) : null}\n {draft.points.map((q, index) => (\n <circle key={index} cx={q[0]} cy={q[1]} r={(index === 0 ? 5 : 3) * u} className={`de-dot${index === 0 ? \" first\" : \"\"}`} pointerEvents=\"none\" />\n ))}\n </>\n );\n } else if (draft.tool === \"line\") {\n preview = <path d={`M${draft.a[0]} ${draft.a[1]}L${draft.b[0]} ${draft.b[1]}`} {...props} />;\n } else if (draft.tool === \"rect\" || draft.tool === \"ellipse\") {\n const box = dragBox(draft);\n preview =\n draft.tool === \"rect\" ? (\n <rect x={box.x} y={box.y} width={box.w} height={box.h} fill=\"rgba(56,189,248,.15)\" {...props} />\n ) : (\n <ellipse cx={box.x + box.w / 2} cy={box.y + box.h / 2} rx={box.w / 2} ry={box.h / 2} fill=\"rgba(56,189,248,.15)\" {...props} />\n );\n } else {\n const radius = Math.hypot(draft.b[0] - draft.a[0], draft.b[1] - draft.a[1]);\n if (radius > 0.5) {\n preview = (\n <path d={`M${polygonPoints(draft.tool, draft.a, radius, sides, ratio).map((q) => `${q[0]} ${q[1]}`).join(\"L\")}Z`} fill=\"rgba(56,189,248,.15)\" {...props} />\n );\n }\n }\n }\n const styleShown: Style = selected[0] ? { fill: selected[0].fill, stroke: selected[0].stroke, width: selected[0].width, cap: selected[0].cap, join: selected[0].join } : style;\n const chip = (paint: DesignPaint) =>\n paint === \"none\" ? (\n <span className=\"de-chip none\" />\n ) : (\n <span className=\"de-chip\" style={{ background: paint === \"light\" ? \"#fef08a\" : paint === \"shadow\" ? \"#1e293b\" : paintColor(creation.palette, paint) }} />\n );\n const smoothOn = (() => {\n const paths = selected.flatMap((shape) => shape.paths).filter((path) => path.kind === \"poly\" && path.points.length >= 3);\n return paths.length ? paths.every((path) => path.kind === \"poly\" && path.smooth) : flags.smooth;\n })();\n const mirrorOn = (() => {\n const mine = selected.filter(canTransform);\n return mine.length ? mine.every((shape) => shape.mirror) : flags.mirror;\n })();\n const anyMirror = flags.mirror || shapes.some((shape) => shape.mirror);\n const flat = flattenShapes(shapes);\n\n return (\n <div id=\"decal-editor\" role=\"dialog\" aria-label=\"Decal editor\" style={{ display: \"flex\" }} onPointerDown={(event) => event.stopPropagation()}>\n <div className=\"de-card\">\n <div className=\"de-head\">\n <span className=\"de-title\">\n <Icon icon=\"pen-nib\" /> <span id=\"de-title\">{design ? \"Edit decal\" : \"New decal\"}</span>\n </span>\n <input\n id=\"de-name\"\n type=\"text\"\n maxLength={40}\n placeholder=\"Name\"\n aria-label=\"Design name\"\n autoComplete=\"off\"\n spellCheck={false}\n value={name}\n onChange={(event) => {\n setName(event.currentTarget.value);\n setDirty(true);\n }}\n />\n <IconButton icon=\"rotate-left\" title=\"Undo (Ctrl+Z)\" variant=\"de-btn\" disabled={!undoStack.length} onClick={undo} />\n <IconButton icon=\"rotate-right\" title=\"Redo (Ctrl+Shift+Z)\" variant=\"de-btn\" disabled={!redoStack.length} onClick={redo} />\n <IconButton icon=\"times\" title=\"Close\" variant=\"de-btn\" onClick={cancel} />\n </div>\n\n <div className=\"de-body\">\n <div className=\"de-tools\">\n {TOOLS.map((entry, index) => (\n <span key={entry.id} style={{ display: \"contents\" }}>\n <button\n type=\"button\"\n className={`de-btn${tool === entry.id ? \" on\" : \"\"}`}\n title={entry.title}\n aria-label={entry.title}\n aria-pressed={tool === entry.id}\n onClick={() => setTool(entry.id)}\n >\n <svg viewBox=\"0 0 24 24\">{entry.svg}</svg>\n </button>\n {index === 1 ? <span className=\"de-sep\" /> : null}\n </span>\n ))}\n {draft && \"points\" in draft && draft.points.length >= 2 ? (\n <IconButton icon=\"check\" title=\"Finish shape (Enter)\" variant=\"de-btn\" onClick={() => finishPoly(draft.tool === \"polygon\")} />\n ) : null}\n </div>\n\n <div className=\"de-stage\">\n <svg\n id=\"de-svg\"\n ref={svg}\n viewBox=\"0 0 128 128\"\n xmlns=\"http://www.w3.org/2000/svg\"\n role=\"img\"\n aria-label=\"Design canvas\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onDoubleClick={onDoubleClick}\n onContextMenu={(event) => event.preventDefault()}\n >\n <defs>\n <pattern id=\"de-checker\" width=\"16\" height=\"16\" patternUnits=\"userSpaceOnUse\">\n <rect width=\"16\" height=\"16\" fill=\"#fff\" />\n <rect width=\"8\" height=\"8\" fill=\"#e5e7eb\" />\n <rect x=\"8\" y=\"8\" width=\"8\" height=\"8\" fill=\"#e5e7eb\" />\n </pattern>\n <pattern id=\"de-gridp\" width=\"4\" height=\"4\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M4 0H0V4\" fill=\"none\" stroke=\"#0ea5e9\" strokeOpacity=\".28\" strokeWidth=\".25\" />\n </pattern>\n <clipPath id=\"de-clip\">\n <rect x=\"3\" y=\"3\" width=\"122\" height=\"122\" />\n </clipPath>\n </defs>\n <rect width=\"128\" height=\"128\" fill=\"url(#de-checker)\" />\n {flags.snap ? <rect width=\"128\" height=\"128\" fill=\"url(#de-gridp)\" pointerEvents=\"none\" /> : null}\n <g clipPath=\"url(#de-clip)\" pointerEvents=\"none\">\n {art}\n </g>\n <rect x=\"3\" y=\"3\" width=\"122\" height=\"122\" fill=\"none\" stroke=\"#0ea5e9\" strokeWidth=\"1\" strokeDasharray=\"4 3\" vectorEffect=\"non-scaling-stroke\" pointerEvents=\"none\" />\n {anyMirror ? (\n <line x1=\"64\" y1=\"0\" x2=\"64\" y2=\"128\" stroke=\"#ec4899\" strokeWidth=\"1\" strokeDasharray=\"2 3\" vectorEffect=\"non-scaling-stroke\" pointerEvents=\"none\" />\n ) : null}\n <g>\n {tool === \"select\" || tool === \"node\"\n ? shapes.map((shape) => {\n const d = shapeD(shape);\n if (!d) return null;\n const filled = shape.fill !== \"none\" && shape.paths.some((path) => path.kind === \"ellipse\" || (path.kind === \"poly\" && path.closed) || path.kind === \"raw\");\n return (\n <path\n key={shape.id}\n data-id={shape.id}\n d={d}\n fill=\"transparent\"\n stroke=\"transparent\"\n strokeWidth={Math.max(shape.width, 10 * u)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n pointerEvents={filled ? \"all\" : \"stroke\"}\n />\n );\n })\n : null}\n </g>\n <g>\n {bounds && tool !== \"node\" ? (\n <rect\n x={bounds.x0 - 1.5 * u}\n y={bounds.y0 - 1.5 * u}\n width={bounds.x1 - bounds.x0 + 3 * u}\n height={bounds.y1 - bounds.y0 + 3 * u}\n className=\"de-selbox\"\n vectorEffect=\"non-scaling-stroke\"\n pointerEvents=\"none\"\n />\n ) : null}\n {handles}\n {tool === \"node\"\n ? selected.flatMap((shape) =>\n shape.paths.flatMap((path, index) =>\n (path.kind === \"poly\" && path.smooth) || path.kind === \"ellipse\"\n ? [\n <path\n key={`${shape.id}-ctrl-${index}`}\n d={pathD({ kind: \"poly\", points: path.points, closed: path.kind === \"ellipse\" || path.closed, smooth: false })}\n className=\"de-ctrl\"\n vectorEffect=\"non-scaling-stroke\"\n pointerEvents=\"none\"\n />,\n ]\n : [],\n ),\n )\n : null}\n {nodes}\n {preview}\n {marquee ? (\n <rect\n x={Math.min(marquee.start[0], marquee.end[0])}\n y={Math.min(marquee.start[1], marquee.end[1])}\n width={Math.abs(marquee.end[0] - marquee.start[0])}\n height={Math.abs(marquee.end[1] - marquee.start[1])}\n className=\"de-marquee\"\n vectorEffect=\"non-scaling-stroke\"\n pointerEvents=\"none\"\n />\n ) : null}\n </g>\n </svg>\n <div id=\"de-hint\">{HINTS[tool]}</div>\n </div>\n\n <div className=\"de-side\">\n <div className=\"de-sec\">\n <div className=\"de-row\">\n {([\"fill\", \"stroke\"] as const).map((key) => (\n <button key={key} type=\"button\" className={`de-target${target === key ? \" on\" : \"\"}`} aria-pressed={target === key} onClick={() => setTarget(key)}>\n {chip(styleShown[key])}\n {key === \"fill\" ? \"Fill\" : \"Stroke\"}\n </button>\n ))}\n <IconButton icon=\"ban\" title=\"No fill / stroke\" variant=\"de-btn sm\" onClick={() => setPaint(\"none\")} />\n <IconButton\n icon=\"sun\"\n title=\"Light modifier (brighten colors underneath)\"\n variant=\"de-btn sm\"\n active={styleShown[target] === \"light\"}\n onClick={() => setPaint(\"light\")}\n />\n <IconButton\n icon=\"moon\"\n title=\"Shadow modifier (darken colors underneath)\"\n variant=\"de-btn sm\"\n active={styleShown[target] === \"shadow\"}\n onClick={() => setPaint(\"shadow\")}\n />\n </div>\n <div className=\"de-swatches swatch-row\">\n <SwatchRow\n palette={creation.palette}\n active={(() => {\n const paint = styleShown[target];\n return paint === \"none\" || paint === \"light\" || paint === \"shadow\" ? undefined : paint;\n })()}\n size={26}\n label=\"Design colors\"\n onPick={setPaint}\n />\n <Swatch color=\"#fef08a\" title=\"Light modifier (brightens colors underneath)\" fixed size={26} onClick={() => setPaint(\"light\")}>\n <Icon icon=\"sun\" />\n </Swatch>\n <Swatch color=\"#1e293b\" title=\"Shadow modifier (darkens colors underneath)\" fixed size={26} onClick={() => setPaint(\"shadow\")}>\n <Icon icon=\"moon\" />\n </Swatch>\n </div>\n </div>\n\n <div className=\"de-sec\">\n <label className=\"de-lbl\">\n Stroke width <b>{styleShown.width.toFixed(1)}</b>\n </label>\n <RangeInput\n label=\"Stroke width\"\n value={styleShown.width}\n min={0}\n max={24}\n step={0.5}\n onPreview={(width) => {\n const before = widthBefore ?? shapes;\n if (!widthBefore) setWidthBefore(shapes);\n setStyle((current) => ({ ...current, width }));\n setShapes(before.map((shape) => (selection.has(shape.id) ? { ...shape, width } : shape)));\n }}\n onCommit={(width) => {\n const before = widthBefore ?? shapes;\n setWidthBefore(undefined);\n setStyle((current) => ({ ...current, width }));\n commit(before, before.map((shape) => (selection.has(shape.id) ? { ...shape, width } : shape)));\n }}\n />\n <div className=\"de-row\">\n <label className=\"de-lbl\">\n Cap\n <SelectInput label=\"Cap\" value={styleShown.cap} options={CAPS} onChange={(cap) => setProp(\"cap\", cap)} />\n </label>\n <label className=\"de-lbl\">\n Join\n <SelectInput label=\"Join\" value={styleShown.join} options={JOINS} onChange={(join) => setProp(\"join\", join)} />\n </label>\n </div>\n {tool === \"star\" || tool === \"ngon\" ? (\n <div className=\"de-row\">\n <label className=\"de-lbl\">\n Sides\n <input\n type=\"number\"\n aria-label=\"Sides\"\n min={3}\n max={12}\n step={1}\n value={sides}\n onChange={(event) => setSides(Math.max(3, Math.min(12, parseInt(event.currentTarget.value, 10) || 5)))}\n />\n </label>\n {tool === \"star\" ? (\n <label className=\"de-lbl\">\n Depth\n <RangeInput label=\"Star depth\" value={ratio} min={0.15} max={0.9} step={0.05} onCommit={setRatio} />\n </label>\n ) : null}\n </div>\n ) : null}\n </div>\n\n <div className=\"de-sec\">\n <div className=\"de-row wrap\">\n <IconButton icon=\"bezier-curve\" title=\"Smooth curve through the points\" variant=\"de-btn sm\" active={smoothOn} onClick={() => toggle(\"smooth\")} />\n <IconButton icon=\"arrows-left-right\" title=\"Mirror left / right around the center line\" variant=\"de-btn sm\" active={mirrorOn} onClick={() => toggle(\"mirror\")} />\n <IconButton\n icon=\"bullseye\"\n title=\"Holes: even-odd fill (rings, cut-outs)\"\n variant=\"de-btn sm\"\n active={selected.length > 0 && selected.every((shape) => shape.rule === \"evenodd\")}\n onClick={() => toggle(\"holes\")}\n />\n <IconButton icon=\"border-all\" title=\"Snap to grid\" variant=\"de-btn sm\" active={flags.snap} onClick={() => toggle(\"snap\")} />\n <IconButton icon=\"plus\" title=\"Add to selection (touch stand-in for Shift)\" variant=\"de-btn sm\" active={flags.add} onClick={() => toggle(\"add\")} />\n </div>\n <div className=\"de-row wrap\">\n <IconButton icon=\"clone\" title=\"Duplicate (Ctrl+D)\" variant=\"de-btn sm\" onClick={() => act(\"dup\")} />\n <IconButton icon=\"left-right\" title=\"Flip horizontally\" variant=\"de-btn sm\" onClick={() => act(\"flipx\")} />\n <IconButton icon=\"up-down\" title=\"Flip vertically\" variant=\"de-btn sm\" onClick={() => act(\"flipy\")} />\n <IconButton icon=\"object-group\" title=\"Combine into one shape\" variant=\"de-btn sm\" onClick={() => act(\"combine\")} />\n <IconButton icon=\"object-ungroup\" title=\"Split combined shapes\" variant=\"de-btn sm\" onClick={() => act(\"split\")} />\n <IconButton icon=\"trash-alt\" title=\"Delete (Del)\" variant=\"de-btn sm\" onClick={() => act(\"del\")} />\n </div>\n <div className=\"de-row wrap\">\n <IconButton icon=\"angles-up\" title=\"Bring to front\" variant=\"de-btn sm\" onClick={() => act(\"front\")} />\n <IconButton icon=\"angle-up\" title=\"Forward\" variant=\"de-btn sm\" onClick={() => act(\"up\")} />\n <IconButton icon=\"angle-down\" title=\"Backward\" variant=\"de-btn sm\" onClick={() => act(\"down\")} />\n <IconButton icon=\"angles-down\" title=\"Send to back\" variant=\"de-btn sm\" onClick={() => act(\"back\")} />\n <IconButton icon=\"vector-square\" title=\"Select all (Ctrl+A)\" variant=\"de-btn sm\" onClick={() => act(\"all\")} />\n </div>\n </div>\n\n <div className=\"de-sec de-pv\">\n <svg className=\"de-preview-svg\" viewBox=\"0 0 128 128\" role=\"img\" aria-label=\"Preview\">\n <defs>\n <clipPath id=\"de-pv-clip\">\n <rect x=\"3\" y=\"3\" width=\"122\" height=\"122\" />\n </clipPath>\n </defs>\n <g clipPath=\"url(#de-pv-clip)\">\n {flat.map((shape, index) => (\n <path\n key={index}\n d={shape.d}\n fill={paintColor(creation.palette, shape.fill)}\n fillRule={shape.rule}\n stroke={shape.stroke !== \"none\" && shape.width > 0 ? paintColor(creation.palette, shape.stroke) : \"none\"}\n strokeWidth={shape.width}\n strokeLinecap={shape.cap}\n strokeLinejoin={shape.join}\n />\n ))}\n </g>\n </svg>\n <div id=\"de-count\">\n {shapes.length} shape{shapes.length === 1 ? \"\" : \"s\"}\n {selected.length ? ` \u00B7 ${selected.length} selected` : \"\"}\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"de-foot\">\n {design ? (\n <ActionButton variant=\"de-act danger\" icon=\"trash-alt\" onClick={removeDesign}>\n {confirm === \"delete\" ? `Delete \"${design.name}\"?` : \"Delete design\"}\n </ActionButton>\n ) : null}\n <span style={{ flex: 1 }} />\n {design ? (\n <ActionButton variant=\"de-act\" onClick={() => save(true)}>\n Save as new\n </ActionButton>\n ) : null}\n <ActionButton variant=\"de-act\" onClick={cancel}>\n {confirm === \"close\" ? \"Discard changes\" : \"Cancel\"}\n </ActionButton>\n <ActionButton variant=\"de-act primary\" icon=\"check\" onClick={() => save(false)}>\n Save\n </ActionButton>\n </div>\n </div>\n </div>\n );\n}\n\n", "import type { ReactNode } from \"react\";\nimport { Icon } from \"./icon.js\";\n\nexport type ActionButtonProps = {\n /** sp-lock: pink panel action; sp-delete: red; de-act: dialog action. */\n readonly variant: \"sp-lock\" | \"sp-delete\" | \"de-act\" | \"de-act primary\" | \"de-act danger\";\n readonly icon?: string | undefined;\n readonly children: ReactNode;\n readonly onClick: () => void;\n};\n\n/** A wide labelled button in panels and dialogs. */\nexport function ActionButton({ variant, icon, children, onClick }: ActionButtonProps) {\n return (\n <button type=\"button\" className={variant} onClick={onClick}>\n {icon ? <Icon icon={icon} /> : null}\n {icon ? \" \" : null}\n {children}\n </button>\n );\n}\n", "export type SelectInputProps<Value extends string> = {\n readonly value: Value;\n readonly label: string;\n readonly options: readonly { readonly id: Value; readonly name: string }[];\n readonly className?: string | undefined;\n readonly onChange: (value: Value) => void;\n};\n\n/** A rounded select. */\nexport function SelectInput<Value extends string>({ value, label, options, className, onChange }: SelectInputProps<Value>) {\n return (\n <select\n className={`render-select${className ? ` ${className}` : \"\"}`}\n aria-label={label}\n value={value}\n onChange={(event) => {\n const next = options.find((option) => option.id === event.currentTarget.value);\n if (next) onChange(next.id);\n }}\n >\n {options.map((option) => (\n <option key={option.id} value={option.id}>\n {option.name}\n </option>\n ))}\n </select>\n );\n}\n", "import type { DesignPaint, DesignShape, Palette } from \"@dreamy/api\";\nimport { refHex } from \"./colors.js\";\n\n/**\n * The decal editor's working model. A design stores SVG `d` strings in a 128 \u00D7 128 space; the editor turns them\n * into editable paths (polylines, ellipses as 4 conjugate anchors, smooth Catmull-Rom curves) and back. Paths it\n * cannot read stay `raw`: shown and restyled, never reshaped. Mirror twins are regenerated from their source.\n */\n\nexport const DESIGN_SIZE = 128;\nexport const GRID = 4;\nexport const MAX_POINTS = 120;\nconst K = 0.5523;\n\nexport type Point = readonly [number, number];\n\nexport type EditorPath =\n | { readonly kind: \"poly\"; readonly points: readonly Point[]; readonly closed: boolean; readonly smooth: boolean }\n | { readonly kind: \"ellipse\"; readonly points: readonly Point[] }\n | { readonly kind: \"raw\"; readonly d: string };\n\nexport type EditorShape = {\n readonly id: string;\n readonly paths: readonly EditorPath[];\n readonly fill: DesignPaint;\n readonly stroke: DesignPaint;\n readonly width: number;\n readonly cap: DesignShape[\"cap\"];\n readonly join: DesignShape[\"join\"];\n readonly rule: DesignShape[\"rule\"];\n readonly mirror: boolean;\n};\n\nexport type Box = { readonly x0: number; readonly y0: number; readonly x1: number; readonly y1: number };\n\nconst r2 = (n: number) => Math.round(n * 100) / 100;\nconst pt = (q: Point) => `${r2(q[0])} ${r2(q[1])}`;\n\nexport function pathD(path: EditorPath): string {\n if (path.kind === \"raw\") return path.d;\n const P = path.points;\n const n = P.length;\n if (n < 2) return \"\";\n if (path.kind === \"ellipse\") {\n if (n !== 4) return \"\";\n const [p0, , p2] = P as [Point, Point, Point, Point];\n const cx = (p0[0] + p2[0]) / 2;\n const cy = (p0[1] + p2[1]) / 2;\n let d = `M${pt(p0)}`;\n for (let i = 0; i < 4; i++) {\n const a = P[i] as Point;\n const b = P[(i + 1) % 4] as Point;\n d += `C${pt([a[0] + K * (b[0] - cx), a[1] + K * (b[1] - cy)])} ${pt([b[0] + K * (a[0] - cx), b[1] + K * (a[1] - cy)])} ${pt(b)}`;\n }\n return `${d}Z`;\n }\n if (path.smooth && n >= 3) {\n const closed = path.closed;\n const at = (i: number) => (closed ? (P[((i % n) + n) % n] as Point) : (P[Math.max(0, Math.min(n - 1, i))] as Point));\n let d = `M${pt(P[0] as Point)}`;\n const segments = closed ? n : n - 1;\n for (let i = 0; i < segments; i++) {\n const p0 = at(i - 1);\n const p1 = at(i);\n const p2 = at(i + 1);\n const p3 = at(i + 2);\n d += `C${pt([p1[0] + (p2[0] - p0[0]) / 6, p1[1] + (p2[1] - p0[1]) / 6])} ${pt([p2[0] - (p3[0] - p1[0]) / 6, p2[1] - (p3[1] - p1[1]) / 6])} ${pt(p2)}`;\n }\n return d + (closed ? \"Z\" : \"\");\n }\n return `M${P.map(pt).join(\"L\")}${path.closed ? \"Z\" : \"\"}`;\n}\n\nexport function shapeD(shape: EditorShape): string {\n return shape.paths.map(pathD).filter(Boolean).join(\" \");\n}\n\nexport function mirrorPath(path: EditorPath): EditorPath | undefined {\n if (path.kind === \"raw\") return undefined;\n return { ...path, points: path.points.map((q) => [DESIGN_SIZE - q[0], q[1]] as const) };\n}\n\nexport function twinD(shape: EditorShape): string | undefined {\n if (!shape.mirror) return undefined;\n const ds = shape.paths.flatMap((path) => {\n const mirrored = mirrorPath(path);\n const d = mirrored ? pathD(mirrored) : \"\";\n return d ? [d] : [];\n });\n return ds.length ? ds.join(\" \") : undefined;\n}\n\nexport function canTransform(shape: EditorShape): boolean {\n return shape.paths.some((path) => path.kind !== \"raw\");\n}\n\nexport function pathBounds(path: EditorPath): Box | undefined {\n if (path.kind === \"raw\" || path.points.length === 0) return undefined;\n const P = path.points;\n if (path.kind === \"ellipse\" && P.length === 4) {\n const [p0, p1, p2] = P as [Point, Point, Point, Point];\n const cx = (p0[0] + p2[0]) / 2;\n const cy = (p0[1] + p2[1]) / 2;\n const ex = Math.hypot(p0[0] - cx, p1[0] - cx);\n const ey = Math.hypot(p0[1] - cy, p1[1] - cy);\n return { x0: cx - ex, y0: cy - ey, x1: cx + ex, y1: cy + ey };\n }\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n P.forEach((q) => {\n x0 = Math.min(x0, q[0]);\n x1 = Math.max(x1, q[0]);\n y0 = Math.min(y0, q[1]);\n y1 = Math.max(y1, q[1]);\n });\n return { x0, y0, x1, y1 };\n}\n\nexport function unionBox(a: Box | undefined, b: Box | undefined): Box | undefined {\n if (!a) return b;\n if (!b) return a;\n return { x0: Math.min(a.x0, b.x0), y0: Math.min(a.y0, b.y0), x1: Math.max(a.x1, b.x1), y1: Math.max(a.y1, b.y1) };\n}\n\nexport function shapeBounds(shape: EditorShape): Box | undefined {\n return shape.paths.reduce<Box | undefined>((box, path) => unionBox(box, pathBounds(path)), undefined);\n}\n\nexport function shapesBounds(shapes: readonly EditorShape[]): Box | undefined {\n return shapes.filter(canTransform).reduce<Box | undefined>((box, shape) => unionBox(box, shapeBounds(shape)), undefined);\n}\n\n/** Maps every point of the shapes (raw paths stay). */\nexport function mapShapes(shapes: readonly EditorShape[], ids: ReadonlySet<string>, f: (q: Point) => Point): readonly EditorShape[] {\n return shapes.map((shape) =>\n ids.has(shape.id)\n ? { ...shape, paths: shape.paths.map((path) => (path.kind === \"raw\" ? path : { ...path, points: path.points.map(f) })) }\n : shape,\n );\n}\n\n/** Star (alternating radius) or regular polygon points around a center. */\nexport function polygonPoints(tool: \"star\" | \"ngon\", center: Point, radius: number, sides: number, ratio: number): readonly Point[] {\n const n = Math.max(3, Math.min(12, Math.round(sides)));\n const count = tool === \"star\" ? n * 2 : n;\n const out: Point[] = [];\n for (let i = 0; i < count; i++) {\n const angle = -Math.PI / 2 + (i * 2 * Math.PI) / count;\n const r = tool === \"star\" && i % 2 ? radius * ratio : radius;\n out.push([center[0] + Math.cos(angle) * r, center[1] + Math.sin(angle) * r]);\n }\n return out;\n}\n\ntype Segment = { readonly cmd: \"L\" | \"C\"; readonly points: readonly Point[] };\n\n/** Reads `d` back into editable paths; anything but M / L / H / V / C / Z (absolute or relative) stays raw. */\nexport function parseD(d: string): readonly EditorPath[] {\n const raw: readonly EditorPath[] = [{ kind: \"raw\", d }];\n if (/[^MmLlHhVvCcZz0-9eE+\\-.,\\s]/.test(d)) return raw;\n const tokens: (string | number)[] = [];\n const re = /([MmLlHhVvCcZz])|(-?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?)/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(d))) tokens.push(match[1] ?? parseFloat(match[2] ?? \"0\"));\n const subpaths: { start: Point; segments: Segment[]; closed: boolean }[] = [];\n let current: { start: Point; segments: Segment[]; closed: boolean } | undefined;\n let x = 0;\n let y = 0;\n let cmd: string | undefined;\n let i = 0;\n const num = () => {\n const value = tokens[i];\n if (typeof value !== \"number\") throw new Error(\"number expected\");\n i++;\n return value;\n };\n try {\n while (i < tokens.length) {\n const token = tokens[i];\n if (typeof token === \"string\") {\n cmd = token;\n i++;\n } else if (cmd === \"M\") cmd = \"L\";\n else if (cmd === \"m\") cmd = \"l\";\n else if (!cmd || cmd === \"Z\" || cmd === \"z\") throw new Error(\"command expected\");\n const command = cmd as string;\n const rel = command === command.toLowerCase();\n const upper = command.toUpperCase();\n if (upper === \"Z\") {\n if (current) {\n current.closed = true;\n x = current.start[0];\n y = current.start[1];\n }\n current = undefined;\n continue;\n }\n if (upper === \"M\") {\n const a = num();\n const b = num();\n x = rel ? x + a : a;\n y = rel ? y + b : b;\n current = { start: [x, y], segments: [], closed: false };\n subpaths.push(current);\n continue;\n }\n if (!current) {\n current = { start: [x, y], segments: [], closed: false };\n subpaths.push(current);\n }\n if (upper === \"C\") {\n const ox = rel ? x : 0;\n const oy = rel ? y : 0;\n const c1: Point = [ox + num(), oy + num()];\n const c2: Point = [ox + num(), oy + num()];\n const end: Point = [ox + num(), oy + num()];\n current.segments.push({ cmd: \"C\", points: [c1, c2, end] });\n x = end[0];\n y = end[1];\n continue;\n }\n if (upper === \"L\") {\n const a = num();\n const b = num();\n x = rel ? x + a : a;\n y = rel ? y + b : b;\n } else if (upper === \"H\") {\n const a = num();\n x = rel ? x + a : a;\n } else if (upper === \"V\") {\n const a = num();\n y = rel ? y + a : a;\n }\n current.segments.push({ cmd: \"L\", points: [[x, y]] });\n }\n } catch {\n return raw;\n }\n const paths: EditorPath[] = [];\n for (const sub of subpaths) {\n const path = readSubpath(sub.start, sub.segments, sub.closed);\n if (!path) return raw;\n paths.push(path);\n }\n return paths.length ? paths : raw;\n}\n\nconst near = (a: Point, b: Point) => Math.hypot(a[0] - b[0], a[1] - b[1]) < 0.05;\n\nfunction readSubpath(start: Point, segments: readonly Segment[], closed: boolean): EditorPath | undefined {\n if (segments.length === 0) return undefined;\n const curves = segments.every((segment) => segment.cmd === \"C\");\n const lines = segments.every((segment) => segment.cmd === \"L\");\n const ends = segments.map((segment) => segment.points[segment.points.length - 1] as Point);\n if (lines) {\n const points = [start, ...ends];\n const last = points[points.length - 1] as Point;\n if (closed && points.length > 2 && near(points[0] as Point, last)) points.pop();\n return points.length >= 2 ? { kind: \"poly\", points, closed, smooth: false } : undefined;\n }\n if (!curves) return undefined;\n const anchors = [start, ...ends];\n if (closed && near(anchors[0] as Point, anchors[anchors.length - 1] as Point)) anchors.pop();\n if (closed && anchors.length === 4 && segments.length === 4) {\n const [p0, p1, p2] = anchors as [Point, Point, Point, Point];\n const cx = (p0[0] + p2[0]) / 2;\n const cy = (p0[1] + p2[1]) / 2;\n const c1 = segments[0]?.points[0] as Point;\n if (near(c1, [p0[0] + K * (p1[0] - cx), p0[1] + K * (p1[1] - cy)])) return { kind: \"ellipse\", points: anchors };\n }\n return anchors.length >= 2 ? { kind: \"poly\", points: anchors, closed, smooth: true } : undefined;\n}\n\n/** A design's shapes as editor shapes (twins fold back into a mirror flag on their source). */\nexport function loadDesignShapes(shapes: readonly DesignShape[], nextId: () => string): readonly EditorShape[] {\n const out: EditorShape[] = [];\n shapes.forEach((shape) => {\n if (shape.twin) {\n const source = out[out.length - 1];\n if (source && canTransform(source)) out[out.length - 1] = { ...source, mirror: true };\n return;\n }\n out.push({\n id: nextId(),\n paths: parseD(shape.d),\n fill: shape.fill,\n stroke: shape.stroke,\n width: shape.width,\n cap: shape.cap,\n join: shape.join,\n rule: shape.rule,\n mirror: false,\n });\n });\n return out;\n}\n\n/** What is saved: every shape, each mirrored one followed by its twin. */\nexport function flattenShapes(shapes: readonly EditorShape[]): readonly DesignShape[] {\n return shapes.flatMap((shape) => {\n const d = shapeD(shape);\n if (!d) return [];\n const base = { fill: shape.fill, stroke: shape.stroke, width: shape.width, cap: shape.cap, join: shape.join, rule: shape.rule };\n const twin = twinD(shape);\n return twin ? [{ ...base, d }, { ...base, d: twin, twin: true }] : [{ ...base, d }];\n });\n}\n\n/** CSS color of a design paint. */\nexport function paintColor(palette: Palette, paint: DesignPaint): string {\n if (paint === \"none\") return \"none\";\n if (paint === \"light\") return \"rgba(255, 255, 255, 0.42)\";\n if (paint === \"shadow\") return \"rgba(0, 0, 0, 0.38)\";\n return refHex(palette, paint);\n}\n", "import type { ReactNode } from \"react\";\n\nexport function Kbd({ children }: { readonly children: ReactNode }) {\n return <kbd>{children}</kbd>;\n}\n", "import type { ReactNode } from \"react\";\n\nexport function HelpSection({ children }: { readonly children: ReactNode }) {\n return <div className=\"help-section\">{children}</div>;\n}\n\nexport function HelpRow({ keys, children }: { readonly keys: ReactNode; readonly children: ReactNode }) {\n return (\n <div className=\"help-row\">\n <span className=\"help-keys\">{keys}</span>\n <span className=\"help-desc\">{children}</span>\n </div>\n );\n}\n", "import { Icon } from \"../atoms/icon.js\";\nimport { Kbd } from \"../atoms/kbd.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { sheetHidden, withSheet } from \"../lib/view-state.js\";\nimport { FloatingPanel } from \"../molecules/floating-panel.js\";\nimport { HelpRow, HelpSection } from \"../molecules/help-row.js\";\n\n/** The controls panel (? or the bottom-right button) and its button. */\nexport function HelpPanel() {\n const { view, update, actions, compact } = useEditor();\n return (\n <>\n <button\n type=\"button\"\n id=\"help-btn\"\n className={view.open.help ? \"active\" : undefined}\n title=\"Controls (?)\"\n aria-label=\"Controls\"\n onClick={() => actions.toggleHelp()}\n >\n <Icon icon=\"question\" />\n </button>\n {view.open.help ? (\n <FloatingPanel\n id=\"help-panel\"\n icon=\"keyboard\"\n title=\"Controls\"\n sheetHidden={sheetHidden(view, compact, \"help\")}\n draggable={!compact}\n onClose={() => update((current) => withSheet(current, \"help\", false))}\n >\n <div id=\"help-body\">\n <HelpSection>Camera</HelpSection>\n <HelpRow keys={<Kbd>Left-drag</Kbd>}>Orbit</HelpRow>\n <HelpRow keys={<Kbd>Right-drag</Kbd>}>Pan</HelpRow>\n <HelpRow keys={<Kbd>Wheel</Kbd>}>Zoom</HelpRow>\n <HelpRow\n keys={\n <>\n <Kbd>W</Kbd>\n <Kbd>A</Kbd>\n <Kbd>S</Kbd>\n <Kbd>D</Kbd> / <Kbd>Arrows</Kbd>\n </>\n }\n >\n Move around the scene\n </HelpRow>\n <HelpRow keys={<><Kbd>Double-click</Kbd> object</>}>Center the camera on it and open Properties</HelpRow>\n <HelpSection>Selecting</HelpSection>\n <HelpRow keys={<Kbd>Click</Kbd>}>Select an object (clicking empty space does nothing)</HelpRow>\n <HelpRow keys={<><Kbd>Double-click</Kbd> empty space</>}>Deselect</HelpRow>\n <HelpRow keys={<><Kbd>Ctrl</Kbd>/<Kbd>Cmd</Kbd> + <Kbd>Click</Kbd></>}>Add to / remove from the selection</HelpRow>\n <HelpRow keys={<><Kbd>Shift</Kbd> + <Kbd>Drag</Kbd></>}>Area select (objects, or shapes in sculpt mode)</HelpRow>\n <HelpRow keys={<Kbd>Esc</Kbd>}>Step back: close Help, cancel an area drag, switch to the Select tool, then deselect</HelpRow>\n <HelpRow keys={<>In sculpt mode: <Kbd>Esc</Kbd> tap / hold</>}>\n Tap = Select tool. Hold for 1 second = exit sculpt mode (also switches to Select)\n </HelpRow>\n <HelpRow keys={<><Kbd>Delete</Kbd> / <Kbd>Backspace</Kbd></>}>Delete the selection (object, shape, or bone)</HelpRow>\n <HelpSection>Shapes (stamp tool)</HelpSection>\n <HelpRow keys={<><Kbd>Click</Kbd> / <Kbd>Q</Kbd></>}>Stamp a shape (in assembly mode this places a new sculpt)</HelpRow>\n <HelpRow keys={<><Kbd>+</Kbd> / <Kbd>-</Kbd></>}>Make the stamp larger / smaller</HelpRow>\n <HelpRow keys={<Kbd>E</Kbd>}>Cycle Add, Subtract, Intersect, Paint</HelpRow>\n <HelpRow keys={<>Smear brush + <Kbd>Drag</Kbd></>}>Paint a stroke of shapes (sculpt mode)</HelpRow>\n <HelpSection>Decals</HelpSection>\n <HelpRow keys={<><Kbd>Click</Kbd> / <Kbd>Q</Kbd></>}>Place the decal (a click that orbits does not place)</HelpRow>\n <HelpRow keys={<><Kbd>,</Kbd> / <Kbd>.</Kbd></>}>Roll the decal -15\u00B0 / +15\u00B0</HelpRow>\n <HelpRow keys={<Kbd>F</Kbd>}>Flip the decal</HelpRow>\n <HelpSection>Editing</HelpSection>\n <HelpRow keys={<><Kbd>Ctrl</Kbd>/<Kbd>Cmd</Kbd> + <Kbd>Z</Kbd></>}>Undo</HelpRow>\n <HelpRow keys={<><Kbd>Ctrl</Kbd>/<Kbd>Cmd</Kbd> + <Kbd>Shift</Kbd> + <Kbd>Z</Kbd> or <Kbd>Ctrl</Kbd> + <Kbd>Y</Kbd></>}>Redo</HelpRow>\n <HelpRow keys={<><Kbd>Ctrl</Kbd>/<Kbd>Cmd</Kbd> + <Kbd>D</Kbd></>}>Duplicate the selected objects</HelpRow>\n <HelpRow keys=\"Scope In button\">\n Sculpt the selected object (<Kbd>Esc</Kbd> to leave)\n </HelpRow>\n <HelpRow keys=\"Object list: double-click / drag\">Rename / group objects</HelpRow>\n <HelpRow keys={<>Panel header + <Kbd>Drag</Kbd></>}>Move a panel</HelpRow>\n <HelpSection>Play mode</HelpSection>\n <HelpRow keys={<><Kbd>W</Kbd><Kbd>A</Kbd><Kbd>S</Kbd><Kbd>D</Kbd></>}>Roll the ball</HelpRow>\n <HelpRow keys={<Kbd>Space</Kbd>}>Jump</HelpRow>\n <HelpSection>Help</HelpSection>\n <HelpRow keys={<Kbd>?</Kbd>}>Show / hide this panel</HelpRow>\n <HelpRow keys=\"Utilities: Hints\">Show / hide hints and the bottom-right help button (Help stays in Utilities)</HelpRow>\n </div>\n </FloatingPanel>\n ) : null}\n </>\n );\n}\n", "import type { Id, SceneObject } from \"@dreamy/api\";\nimport { useState, type ReactNode } from \"react\";\nimport { Icon } from \"../atoms/icon.js\";\nimport { IconButton } from \"../atoms/icon-button.js\";\nimport { SideButton } from \"../atoms/side-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { boneTree, childrenOf, partOf } from \"../lib/scene.js\";\nimport { selectCategory, sheetHidden, withSheet } from \"../lib/view-state.js\";\nimport { FloatingPanel } from \"../molecules/floating-panel.js\";\nimport { InlineEdit } from \"../molecules/inline-edit.js\";\nimport { ListRow } from \"../molecules/list-row.js\";\n\n/** The object tree (assembly mode): select, rename, drag onto a row to group, onto the panel to ungroup. */\nexport function ObjectListPanel() {\n const { view, update, creation, dispatch, actions, compact, toast } = useEditor();\n const [renaming, setRenaming] = useState<Id | undefined>(undefined);\n const [dragging, setDragging] = useState<Id | undefined>(undefined);\n const [dropOn, setDropOn] = useState<Id | \"root\" | undefined>(undefined);\n if (view.mode !== \"assembly\" || view.play) return null;\n if (view.minimized.objects) {\n return <SideButton id=\"object-toggle\" icon=\"layer-group\" tooltip=\"Objects\" onClick={() => update((current) => withSheet(current, \"objects\", true))} />;\n }\n\n const toggle = (id: Id) =>\n update((current) => ({\n ...current,\n expanded: current.expanded.includes(id) ? current.expanded.filter((entry) => entry !== id) : [...current.expanded, id],\n }));\n const drop = (parentId: Id | null) => {\n setDropOn(undefined);\n const child = dragging;\n setDragging(undefined);\n if (child === undefined || child === parentId) return;\n const object = creation.objects.find((entry) => entry.id === child);\n if (!object || (object.parentId ?? null) === parentId) return;\n if (dispatch({ type: \"ReparentObject\", payload: { objectId: child, parentId } })) {\n const parent = creation.objects.find((entry) => entry.id === parentId);\n if (parent) update((current) => ({ ...current, expanded: [...current.expanded.filter((id) => id !== parent.id), parent.id] }));\n toast(parent ? `Grouped under ${parent.name}` : \"Removed from group\");\n }\n };\n\n const rows: ReactNode[] = [];\n const row = (object: SceneObject, depth: number) => {\n const kids = childrenOf(creation, object.id);\n const rig = object.kind === \"rig\" ? object : undefined;\n const expandable = !!rig || kids.length > 0;\n const open = view.expanded.includes(object.id);\n rows.push(\n <ListRow\n key={object.id}\n icon={rig ? \"bone\" : \"cube\"}\n iconBg={rig ? \"#fed7aa\" : \"#fef08a\"}\n indent={depth * 14}\n selected={view.selection.objectIds.includes(object.id)}\n draggable={renaming !== object.id}\n dropTarget={dropOn === object.id}\n lead={\n <span\n className=\"chev\"\n onClick={(event) => {\n event.stopPropagation();\n if (expandable) toggle(object.id);\n }}\n >\n {expandable ? <Icon icon={open ? \"chevron-down\" : \"chevron-right\"} /> : null}\n </span>\n }\n name={\n renaming === object.id ? (\n <InlineEdit\n value={object.name}\n label=\"Object name\"\n onCommit={(name) => {\n setRenaming(undefined);\n dispatch({ type: \"RenameObject\", payload: { objectId: object.id, name } });\n }}\n onCancel={() => setRenaming(undefined)}\n />\n ) : (\n <>\n {object.name}\n {rig ? <span className=\"muted\"> \u00B7 {rig.rig.bones.length}</span> : null}\n {kids.length ? <span className=\"muted\"> \u229E{kids.length}</span> : null}\n </>\n )\n }\n onClick={() => update((current) => ({ ...current, selection: { objectIds: [object.id], stampIds: [] } }))}\n onDoubleClick={() => setRenaming(object.id)}\n onDragStart={(event) => {\n event.dataTransfer?.setData(\"text/plain\", object.id);\n setDragging(object.id);\n }}\n onDragEnd={() => {\n setDragging(undefined);\n setDropOn(undefined);\n }}\n onDragOver={(event) => {\n if (dragging === undefined) return;\n event.preventDefault();\n event.stopPropagation();\n setDropOn(object.id);\n }}\n onDragLeave={() => setDropOn(undefined)}\n onDrop={(event) => {\n event.preventDefault();\n event.stopPropagation();\n drop(object.id);\n }}\n >\n {rig ? (\n <IconButton\n icon={view.hiddenBones.includes(rig.id) ? \"eye-slash\" : \"eye\"}\n title={view.hiddenBones.includes(rig.id) ? \"Show bones\" : \"Hide bones\"}\n onClick={() =>\n update((current) => ({\n ...current,\n hiddenBones: current.hiddenBones.includes(rig.id)\n ? current.hiddenBones.filter((id) => id !== rig.id)\n : [...current.hiddenBones, rig.id],\n }))\n }\n />\n ) : null}\n <IconButton icon=\"file-export\" title=\"Export object/character\" onClick={() => actions.exportObject(object.id)} />\n <IconButton icon=\"trash-alt\" title=\"Delete\" variant=\"stamp-btn del\" onClick={() => actions.deleteObject(object.id)} />\n </ListRow>,\n );\n if (!open) return;\n if (rig) {\n boneTree(rig).forEach(({ bone, depth: boneDepth }) => {\n rows.push(\n <ListRow\n key={`${rig.id}/${bone.id}`}\n variant=\"member\"\n icon=\"bone\"\n iconBg=\"#fed7aa\"\n indent={10 + depth * 14 + boneDepth * 12}\n selected={view.selection.objectIds[0] === rig.id && view.selection.boneId === bone.id}\n name={bone.name}\n onClick={() =>\n update((current) => ({\n ...selectCategory(current, \"skeleton\"),\n expanded: current.expanded.includes(rig.id) ? current.expanded : [...current.expanded, rig.id],\n selection: { objectIds: [rig.id], stampIds: [], boneId: bone.id },\n }))\n }\n >\n {partOf(rig, bone.id) ? <i className=\"fas fa-cube\" title=\"Has a body part\" style={{ color: \"#ca8a04\", fontSize: 11 }} /> : null}\n </ListRow>,\n );\n });\n }\n kids.forEach((kid) => row(kid, depth + 1));\n };\n childrenOf(creation, undefined).forEach((object) => row(object, 0));\n\n return (\n <FloatingPanel\n id=\"object-panel\"\n icon=\"layer-group\"\n className={dropOn === \"root\" ? \"drop-target\" : undefined}\n title={\n <>\n Objects <span className=\"sp-count\">({creation.objects.length})</span>\n </>\n }\n sheetHidden={sheetHidden(view, compact, \"objects\")}\n draggable={!compact}\n onClose={() => update((current) => withSheet(current, \"objects\", false))}\n onDragOver={(event) => {\n if (dragging === undefined) return;\n event.preventDefault();\n setDropOn(\"root\");\n }}\n onDragLeave={(event) => {\n if (!(event.currentTarget as Element).contains(event.relatedTarget as Node | null)) setDropOn(undefined);\n }}\n onDrop={(event) => {\n event.preventDefault();\n drop(null);\n }}\n >\n <div id=\"object-tree\" role=\"tree\" aria-label=\"Objects\">\n {rows}\n </div>\n </FloatingPanel>\n );\n}\n", "import { ActionButton } from \"../atoms/action-button.js\";\nimport { ColorInput } from \"../atoms/color-input.js\";\nimport { Icon } from \"../atoms/icon.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { COLOR_NAMES, FIXED_COLORS, PALETTE_SLOTS, refHex } from \"../lib/colors.js\";\nimport { sheetHidden, withSheet } from \"../lib/view-state.js\";\nimport { FloatingPanel } from \"../molecules/floating-panel.js\";\n\n/** The palette editor: seven editable slots and the three fixed colors. */\nexport function PalettePanel() {\n const { view, update, creation, dispatch, compact, toast } = useEditor();\n if (!view.open.palette) return null;\n return (\n <FloatingPanel\n id=\"palette-panel\"\n className=\"glass-panel\"\n icon=\"palette\"\n title=\"Color Palette\"\n sheetHidden={sheetHidden(view, compact, \"palette\")}\n draggable={!compact}\n onClose={() => update((current) => withSheet(current, \"palette\", false))}\n >\n <div className=\"sp-body\">\n <div id=\"palette-inputs\">\n {PALETTE_SLOTS.map((slot) => (\n <ColorInput\n key={slot}\n className=\"palette-input\"\n label={COLOR_NAMES[slot]}\n value={refHex(creation.palette, slot)}\n onCommit={(color) => dispatch({ type: \"SetPaletteColor\", payload: { slot, color } })}\n />\n ))}\n <div className=\"palette-fixed-label\">Fixed colors</div>\n {FIXED_COLORS.map((fixed) => (\n <div key={fixed} className=\"palette-fixed\" title={`${COLOR_NAMES[fixed]} (fixed)`} style={{ background: refHex(creation.palette, fixed) }}>\n <Icon icon=\"lock\" />\n </div>\n ))}\n </div>\n <ActionButton\n variant=\"sp-lock\"\n icon=\"undo\"\n onClick={() => {\n if (dispatch({ type: \"ResetPalette\", payload: {} })) toast(\"Palette Reset\");\n }}\n >\n Reset to default\n </ActionButton>\n </div>\n </FloatingPanel>\n );\n}\n", "import { useState } from \"react\";\nimport { ActionButton } from \"../atoms/action-button.js\";\nimport { Checkbox } from \"../atoms/checkbox.js\";\nimport { Icon } from \"../atoms/icon.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { identityTransform } from \"../lib/math.js\";\nimport { contentFit, spawnPoint } from \"../lib/placement.js\";\nimport { objectById } from \"../lib/scene.js\";\nimport { selectCategory } from \"../lib/view-state.js\";\nimport { Modal } from \"../molecules/modal.js\";\nimport { newSeed, THEME_OPTIONS, themeOf } from \"./parts-tab.js\";\nimport { SelectInput } from \"../atoms/select-input.js\";\nimport type { CreatureTheme } from \"@dreamy/api\";\n\nconst TILE_COLORS = [\"var(--cat-transform)\", \"var(--cat-shape)\", \"var(--cat-art)\", \"var(--cat-mode)\"];\n\n/** Premade skeletons (from the core): a new standalone rig, or applied to the selected object. */\nexport function PremadePicker() {\n const { api, view, update, creation, dispatch, toast, viewport } = useEditor();\n const premades = api.premades();\n const [pick, setPick] = useState(premades[0]?.id);\n const [withBody, setWithBody] = useState(true);\n const [theme, setTheme] = useState<CreatureTheme | \"none\">(\"none\");\n if (!view.premadeOpen) return null;\n const close = () => update((current) => ({ ...current, premadeOpen: false }));\n const chosen = premades.find((premade) => premade.id === pick) ?? premades[0];\n const selected = view.mode === \"assembly\" && view.selection.objectIds.length === 1 ? objectById(creation, view.selection.objectIds[0]) : undefined;\n\n const apply = (id: string, mode: \"new\" | \"selected\") => {\n const premade = premades.find((entry) => entry.id === id);\n if (!premade) return;\n const target =\n mode === \"selected\" && selected\n ? { kind: \"object\" as const, objectId: selected.id, fit: viewport.contentBounds(selected.id) ?? contentFit(selected) }\n : { kind: \"new\" as const, transform: identityTransform(spawnPoint(creation)) };\n if (!dispatch({ type: \"ApplyPremade\", payload: { templateId: premade.id, target, withBody } })) return;\n update((current) => ({ ...selectCategory(current, \"skeleton\"), premadeOpen: false }));\n toast(`${premade.name} ${target.kind === \"new\" ? \"rig created\" : \"skeleton applied\"} (${premade.boneCount} bones)`);\n };\n\n /** A new creature from the generator; its Parts tab re-rolls and locks its pieces. */\n const random = () => {\n const target = { kind: \"new\" as const, transform: identityTransform(spawnPoint(creation)) };\n if (!dispatch({ type: \"GenerateCreature\", payload: { target, seed: newSeed(), chimera: false, variety: 0.7, ...themeOf(theme) } })) return;\n update((current) => ({ ...selectCategory(current, \"skeleton\"), premadeOpen: false, propertiesTab: \"parts\" }));\n toast(\"Random creature created: re-roll its parts in Properties \u00B7 Parts\");\n };\n\n return (\n <Modal id=\"rig-modal\" label=\"Premade Skeletons\" cardClassName=\"rig-card\" onBackdrop={close}>\n <div className=\"sp-header\">\n <span>\n <Icon icon=\"wand-magic-sparkles\" className=\"sp-title-icon\" />\n Premade Skeletons\n </span>\n <button type=\"button\" className=\"clickable\" aria-label=\"Close\" onClick={close}>\n <Icon icon=\"times\" />\n </button>\n </div>\n <div className=\"sp-body\">\n <div id=\"rig-grid\">\n {premades.map((premade, index) => (\n <div\n key={premade.id}\n className={`rig-opt${premade.id === chosen?.id ? \" selected\" : \"\"}`}\n role=\"button\"\n aria-label={premade.name}\n aria-pressed={premade.id === chosen?.id}\n onClick={() => setPick(premade.id)}\n onDoubleClick={() => apply(premade.id, \"new\")}\n >\n <div className=\"tool-btn\" style={{ background: TILE_COLORS[index % TILE_COLORS.length] }}>\n {premade.icon}\n </div>\n <span>{premade.name}</span>\n </div>\n ))}\n </div>\n {chosen ? (\n <div id=\"rig-info\">\n <b>{chosen.name}</b> \u00B7 {chosen.boneCount} bones\n <br />\n {chosen.description}\n {selected?.kind === \"rig\" && selected.rig.bones.length ? (\n <>\n <br />\n <span style={{ color: \"#b91c1c\" }}>\"Apply to selected\" replaces the current rig (Ctrl+Z to undo).</span>\n </>\n ) : null}\n </div>\n ) : null}\n <label className=\"rig-body-row\">\n <Checkbox checked={withBody} label=\"Include sculpted body parts\" onChange={setWithBody} /> Include sculpted body parts\n </label>\n <label className=\"rig-body-row\">\n Random creature theme\n <SelectInput className=\"boxed\" label=\"Random creature theme\" value={theme} options={THEME_OPTIONS} onChange={setTheme} />\n </label>\n <div className=\"rig-actions\">\n {chosen ? (\n <ActionButton variant=\"sp-lock\" icon=\"plus\" onClick={() => apply(chosen.id, \"new\")}>\n New standalone rig\n </ActionButton>\n ) : null}\n <ActionButton variant=\"sp-lock\" icon=\"dice\" onClick={random}>\n Random creature\n </ActionButton>\n {chosen && selected ? (\n <ActionButton variant=\"sp-lock\" icon=\"bullseye\" onClick={() => apply(chosen.id, \"selected\")}>\n Apply to selected\n </ActionButton>\n ) : null}\n </div>\n </div>\n </Modal>\n );\n}\n", "export type CheckboxProps = {\n readonly checked: boolean;\n readonly label: string;\n readonly onChange: (checked: boolean) => void;\n};\n\nexport function Checkbox({ checked, label, onChange }: CheckboxProps) {\n return <input type=\"checkbox\" aria-label={label} checked={checked} onChange={(event) => onChange(event.currentTarget.checked)} />;\n}\n", "import type { Creation, SceneObject, Vec3 } from \"@dreamy/api\";\nimport { stampBounds } from \"./scene.js\";\n\n/** Where a new standalone rig goes: the origin, stepped along x past nearby root objects. */\nexport function spawnPoint(creation: Creation): Vec3 {\n const roots = creation.objects.filter((object) => object.parentId === undefined);\n let x = 0;\n for (let i = 0; i < 12 && roots.some((object) => Math.hypot(object.transform.position.x - x, object.transform.position.z) < 6); i++) x += 7;\n return { x, y: 0, z: 0 };\n}\n\n/** The template's default box (the POC's 2.2 units) for objects without content. */\nconst DEFAULT_HALF = { x: 1.1, y: 1.1, z: 1.1 };\n\n/** The content box a premade is fitted to, in the object's space (from its stamps). */\nexport function contentFit(object: SceneObject): { readonly center: Vec3; readonly halfSize: Vec3 } {\n const sculpt = object.kind === \"sculpt\" ? object.sculpt : object.rig.body;\n const bounds = sculpt ? stampBounds(sculpt) : undefined;\n if (!bounds) return { center: { x: 0, y: 0, z: 0 }, halfSize: DEFAULT_HALF };\n const floor = (value: number) => Math.max(value, 0.15);\n return { center: bounds.center, halfSize: { x: floor(bounds.halfSize.x), y: floor(bounds.halfSize.y), z: floor(bounds.halfSize.z) } };\n}\n", "import type { ReactNode } from \"react\";\n\nexport type ModalProps = {\n readonly id: string;\n readonly label: string;\n readonly cardClassName: string;\n readonly children: ReactNode;\n /** A click on the backdrop (outside the card). */\n readonly onBackdrop?: () => void;\n};\n\n/** A centered card over a blurred backdrop. */\nexport function Modal({ id, label, cardClassName, children, onBackdrop }: ModalProps) {\n return (\n <div\n id={id}\n role=\"dialog\"\n aria-label={label}\n style={{ display: \"flex\" }}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={(event) => {\n if (event.target === event.currentTarget) onBackdrop?.();\n }}\n >\n <div className={cardClassName}>{children}</div>\n </div>\n );\n}\n", "import type { CreatureRecipe, CreatureTheme, GraftSlot, PartSlot, RigObject } from \"@dreamy/api\";\nimport { useState } from \"react\";\nimport { ActionButton } from \"../atoms/action-button.js\";\nimport { Checkbox } from \"../atoms/checkbox.js\";\nimport { IconButton } from \"../atoms/icon-button.js\";\nimport { SelectInput } from \"../atoms/select-input.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { SliderRow } from \"../molecules/slider-row.js\";\n\nconst SLOT_NAMES: Record<PartSlot, string> = {\n head: \"Head\",\n ears: \"Ears\",\n horns: \"Horns\",\n tail: \"Tail\",\n wings: \"Wings\",\n legs: \"Legs\",\n arms: \"Arms\",\n antennae: \"Antennae\",\n fins: \"Fins\",\n tentacles: \"Tentacles\",\n coat: \"Coat\",\n};\n\n/** Slots a skeleton can gain (grafted chains) when it lacks them. */\nconst GRAFT_SLOTS: readonly GraftSlot[] = [\"wings\", \"horns\", \"tail\"];\nconst NONE = \"none\";\n\n/** What a generated creature can lock: its base skeleton, a slot, its proportions or its face art. */\ntype Lock = \"base\" | \"sizes\" | \"eyes\" | \"mouth\" | PartSlot;\n\n/** The generator's themes: a whole creature built from one made-up kind (natural: none). */\nexport const THEME_OPTIONS: readonly { readonly id: CreatureTheme | \"none\"; readonly name: string }[] = [\n { id: \"none\", name: \"Natural\" },\n { id: \"machine\", name: \"\uD83E\uDD16 Robot\" },\n { id: \"plant\", name: \"\uD83C\uDF3F Plant\" },\n { id: \"fungus\", name: \"\uD83C\uDF44 Mushroom\" },\n { id: \"mineral\", name: \"\uD83D\uDC8E Crystal & stone\" },\n { id: \"elemental\", name: \"\uD83D\uDD25 Elemental (fire, ice, storm, slime)\" },\n];\nexport const themeOf = (id: CreatureTheme | \"none\"): { theme?: CreatureTheme } => (id === \"none\" ? {} : { theme: id });\n\n/** A fresh seed for a roll. */\nexport const newSeed = (): number => Math.floor(Math.random() * 0x7fffffff);\n\n/** What a re-roll keeps from a recipe: everything in `locks`. */\nexport function keptOf(recipe: CreatureRecipe, locks: ReadonlySet<Lock>): Partial<Pick<CreatureRecipe, \"base\" | \"kits\" | \"sizes\" | \"eyes\" | \"mouth\">> {\n const kits = Object.fromEntries(Object.entries(recipe.kits).filter(([slot]) => locks.has(slot as PartSlot)));\n return {\n ...(locks.has(\"base\") ? { base: recipe.base } : {}),\n ...(Object.keys(kits).length ? { kits } : {}),\n ...(locks.has(\"sizes\") ? { sizes: recipe.sizes } : {}),\n ...(locks.has(\"eyes\") && recipe.eyes ? { eyes: recipe.eyes } : {}),\n ...(locks.has(\"mouth\") && recipe.mouth ? { mouth: recipe.mouth } : {}),\n };\n}\n\n/**\n * A premade rig's part slots: each can take the parts of another premade (of the same family, or any with Chimera),\n * fitted to this rig's bones, or a part variant (a tiger head, elephant ears). Picking the rig's own premade restores\n * its own parts. Wings, horns or a tail the skeleton\n * lacks can be grafted from a premade that has them. A generated rig also gets its generator: re-roll everything not\n * locked, or one slot, its proportions or its face.\n */\nexport function PartsTab({ rig }: { readonly rig: RigObject }) {\n const { api, dispatch } = useEditor();\n const recipe = rig.rig.recipe;\n const [chimera, setChimera] = useState(recipe?.chimera ?? false);\n const [variety, setVariety] = useState(recipe?.variety ?? 0.7);\n const [theme, setTheme] = useState<CreatureTheme | \"none\">(recipe?.theme ?? \"none\");\n const [locks, setLocks] = useState<ReadonlySet<Lock>>(new Set());\n const premades = api.premades();\n const variants = api.partVariants();\n const own = premades.find((p) => p.id === rig.rig.templateId);\n if (!own) return null;\n\n const regenerate = (keep: ReturnType<typeof keptOf>, as: CreatureTheme | \"none\" = theme) =>\n dispatch({ type: \"GenerateCreature\", payload: { target: { kind: \"rig\", rigId: rig.id }, seed: newSeed(), chimera, variety, ...themeOf(as), keep } });\n /** Re-rolls only `what`: the base skeleton stays, and everything else is kept. */\n const reroll = (what: Lock) => recipe && regenerate(keptOf(recipe, new Set(([\"base\", \"sizes\", \"eyes\", \"mouth\", ...own.slots, ...(Object.keys(recipe.kits) as PartSlot[])] as Lock[]).filter((l) => l !== what))));\n const lockButton = (what: Lock, name: string) => (\n <IconButton\n icon={locks.has(what) ? \"lock\" : \"lock-open\"}\n title={`${locks.has(what) ? \"Unlock\" : \"Lock\"} ${name}`}\n active={locks.has(what)}\n onClick={() => setLocks((current) => {\n const next = new Set(current);\n if (!next.delete(what)) next.add(what);\n return next;\n })}\n />\n );\n const generated = (what: Lock, name: string, lockable = true) =>\n recipe ? (\n <>\n <IconButton icon=\"dice\" title={`Re-roll ${name}`} onClick={() => reroll(what)} />\n {lockable ? lockButton(what, name) : null}\n </>\n ) : null;\n // premades that have the slot, then the slot's part variants (same family, or any with Chimera)\n const donorOptions = (slot: PartSlot, current: string | undefined) => {\n const options = [\n ...premades.filter((p) => p.id !== own.id && p.slots.includes(slot) && (chimera || p.family === own.family)),\n ...variants.filter((v) => v.slot === slot && (chimera || v.family === own.family)),\n ].map((p) => ({ id: p.id, name: `${p.icon} ${p.name}` }));\n // a chimera part stays listed after Chimera is turned off\n if (current !== undefined && !options.some((o) => o.id === current)) {\n const p = [...premades, ...variants].find((x) => x.id === current);\n if (p) options.push({ id: p.id, name: `${p.icon} ${p.name}` });\n }\n return options;\n };\n\n return (\n <>\n {recipe ? (\n <>\n <div className=\"prop-group\">\n <label>Base</label>\n <div className=\"row-inline\">\n <span className=\"grow\">{premades.find((p) => p.id === recipe.base)?.name ?? recipe.base}</span>\n {lockButton(\"base\", \"base skeleton\")}\n </div>\n </div>\n <SliderRow label=\"Variety\" value={variety} min={0} max={1} step={0.05} onCommit={setVariety} />\n <div className=\"prop-group\">\n <label>Theme</label>\n <SelectInput\n className=\"boxed grow\"\n label=\"Theme\"\n value={theme}\n options={THEME_OPTIONS}\n onChange={(next) => {\n // a new theme re-rolls the creature, keeping what's locked\n setTheme(next);\n regenerate(keptOf(recipe, locks), next);\n }}\n />\n </div>\n <ActionButton variant=\"sp-lock\" icon=\"dice\" onClick={() => regenerate(keptOf(recipe, locks))}>\n Re-roll creature\n </ActionButton>\n </>\n ) : null}\n {own.slots.map((slot) => {\n const current = rig.rig.slotKits?.[slot] ?? own.id;\n const options = [{ id: own.id, name: `${own.name} (own)` }, ...donorOptions(slot, current === own.id ? undefined : current)];\n return (\n <div className=\"prop-group\" key={slot}>\n <label>{SLOT_NAMES[slot]}</label>\n <div className=\"row-inline\">\n <SelectInput\n className=\"boxed grow\"\n label={SLOT_NAMES[slot]}\n value={current}\n options={options}\n onChange={(kit) => dispatch({ type: \"SwapPartSlot\", payload: { rigId: rig.id, slot, kit } })}\n />\n {generated(slot, SLOT_NAMES[slot].toLowerCase())}\n </div>\n </div>\n );\n })}\n {GRAFT_SLOTS.filter((slot) => !own.slots.includes(slot)).map((slot) => {\n const current = rig.rig.slotKits?.[slot];\n return (\n <div className=\"prop-group\" key={slot}>\n <label>Add {SLOT_NAMES[slot].toLowerCase()}</label>\n <div className=\"row-inline\">\n <SelectInput\n className=\"boxed grow\"\n label={`Add ${SLOT_NAMES[slot].toLowerCase()}`}\n value={current ?? NONE}\n options={[{ id: NONE, name: \"None\" }, ...donorOptions(slot, current)]}\n onChange={(kit) => dispatch({ type: \"GraftPart\", payload: { rigId: rig.id, slot, ...(kit !== NONE ? { kit } : {}) } })}\n />\n {generated(slot, SLOT_NAMES[slot].toLowerCase(), current !== undefined)}\n </div>\n </div>\n );\n })}\n {recipe ? (\n <>\n <div className=\"prop-group\">\n <label>Proportions</label>\n <div className=\"row-inline\">\n <span className=\"grow\">{Object.keys(recipe.sizes).length} groups</span>\n {generated(\"sizes\", \"proportions\")}\n </div>\n </div>\n <div className=\"prop-group\">\n <label>Eyes</label>\n <div className=\"row-inline\">\n <span className=\"grow\">{recipe.eyes ?? \"\u2014\"}</span>\n {generated(\"eyes\", \"eyes\")}\n </div>\n </div>\n <div className=\"prop-group\">\n <label>Mouth</label>\n <div className=\"row-inline\">\n <span className=\"grow\">{recipe.mouth ?? \"\u2014\"}</span>\n {generated(\"mouth\", \"mouth\")}\n </div>\n </div>\n </>\n ) : null}\n <label className=\"row-inline\">\n <Checkbox label=\"Chimera\" checked={chimera} onChange={setChimera} />\n Chimera: parts from any creature family\n </label>\n </>\n );\n}\n", "import type { Command, Creation, Id, SculptTarget, SmearGroup, Stamp, StampPropsPatch } from \"@dreamy/api\";\nimport { groupOf, objectById, partOf, rigById, sculptOf, sculptTargetsOf, selectedGroup } from \"./scene.js\";\nimport type { ViewState } from \"./view-state.js\";\n\n/** The selected bone's part, when Rig Bones is active with one rig and a bone selected. */\nexport function selectedBonePart(creation: Creation, view: ViewState) {\n if (view.mode !== \"assembly\" || view.category !== \"skeleton\" || view.selection.objectIds.length !== 1) return undefined;\n const rig = rigById(creation, view.selection.objectIds[0]);\n const part = rig && partOf(rig, view.selection.boneId);\n return rig && part ? { rig, part } : undefined;\n}\n\n/** What Properties' look tabs edit: the scoped sculpt, a bone's part (or all parts), or every selected object's sculpts. */\nexport function lookTargets(creation: Creation, view: ViewState): readonly SculptTarget[] {\n if (view.mode === \"sculpt\") return view.scope ? [view.scope] : [];\n const bonePart = selectedBonePart(creation, view);\n if (bonePart) {\n if (view.editAllParts) return sculptTargetsOf(bonePart.rig).filter((target) => \"boneId\" in target);\n return bonePart.part.kind === \"sculpt\" ? [{ objectId: bonePart.rig.id, boneId: bonePart.part.boneId }] : [];\n }\n return view.selection.objectIds.flatMap((id) => {\n const object = objectById(creation, id);\n return object ? sculptTargetsOf(object) : [];\n });\n}\n\n/** The flat wings the Wing tab edits: the selected bone's wing, or every wing with \"All parts\". */\nexport function wingTargets(creation: Creation, view: ViewState): { readonly rigId: Id; readonly boneIds: readonly Id[] } | undefined {\n const bonePart = selectedBonePart(creation, view);\n if (!bonePart) return undefined;\n const parts = view.editAllParts ? bonePart.rig.rig.parts : [bonePart.part];\n const boneIds = parts.filter((part) => part.kind === \"wing\").map((part) => part.boneId);\n return boneIds.length ? { rigId: bonePart.rig.id, boneIds } : undefined;\n}\n\n/** The settings owner of the selected shapes in sculpt mode: a whole smear group, or loose stamps. */\nexport type StampSettings =\n | { readonly kind: \"group\"; readonly target: SculptTarget; readonly group: SmearGroup; readonly stamps: readonly Stamp[] }\n | { readonly kind: \"stamps\"; readonly target: SculptTarget; readonly stamps: readonly Stamp[] };\n\nexport function stampSettings(creation: Creation, view: ViewState): StampSettings | undefined {\n if (view.mode !== \"sculpt\" || !view.scope) return undefined;\n const sculpt = sculptOf(creation, view.scope);\n if (!sculpt) return undefined;\n const stamps = sculpt.stamps.filter((stamp) => view.selection.stampIds.includes(stamp.id));\n if (!stamps.length) return undefined;\n const group = selectedGroup(sculpt, view.selection.stampIds) ?? (stamps.length === 1 ? groupOf(sculpt, stamps[0]) : undefined);\n return group ? { kind: \"group\", target: view.scope, group, stamps } : { kind: \"stamps\", target: view.scope, stamps };\n}\n\n/** The command that patches the selected shapes' settings (the group's when they are one group). */\nexport function stampPropsCommand(settings: StampSettings, props: StampPropsPatch): Command {\n return settings.kind === \"group\"\n ? { type: \"SetSmearGroup\", payload: { target: settings.target, groupId: settings.group.id, props } }\n : { type: \"SetStampProps\", payload: { target: settings.target, stampIds: settings.stamps.map((stamp) => stamp.id), props } };\n}\n", "export type TabBarProps<Tab extends string> = {\n readonly tabs: readonly { readonly id: Tab; readonly name: string }[];\n readonly active: Tab;\n readonly onSelect: (tab: Tab) => void;\n};\n\nexport function TabBar<Tab extends string>({ tabs, active, onSelect }: TabBarProps<Tab>) {\n return (\n <div className=\"tab-header\" role=\"tablist\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={tab.id === active}\n className={`tab-btn${tab.id === active ? \" active\" : \"\"}`}\n onClick={() => onSelect(tab.id)}\n >\n {tab.name}\n </button>\n ))}\n </div>\n );\n}\n", "import type { ColorRef, Palette, PaletteSlot, Rgb } from \"@dreamy/api\";\nimport type { ReactNode } from \"react\";\nimport { ColorInput } from \"../atoms/color-input.js\";\nimport { COLOR_NAMES, isFixedColor, refHex } from \"../lib/colors.js\";\nimport { SwatchRow } from \"./swatch-row.js\";\n\nexport type ColorFieldProps = {\n readonly label: string;\n readonly palette: Palette;\n readonly value: ColorRef;\n /** Next to the label (Match, Inherit). */\n readonly extra?: ReactNode | undefined;\n readonly onPick: (ref: ColorRef) => void;\n /** The picker edits the referenced slot (fixed colors cannot be edited). */\n readonly onEditSlot: (slot: PaletteSlot, color: Rgb) => void;\n};\n\n/** A labelled color choice: the slot picker plus the swatch grid. */\nexport function ColorField({ label, palette, value, extra, onPick, onEditSlot }: ColorFieldProps) {\n const hex = refHex(palette, value);\n return (\n <div className=\"prop-group\">\n <label>\n {label} <span title={COLOR_NAMES[value]}>{hex}</span> {extra}\n </label>\n <div className=\"color-field-row\">\n <ColorInput\n value={hex}\n label={`Edit ${COLOR_NAMES[value]}`}\n disabled={isFixedColor(value)}\n onCommit={(rgb) => {\n if (!isFixedColor(value)) onEditSlot(value, rgb);\n }}\n />\n <SwatchRow palette={palette} active={value} label={label} onPick={onPick} />\n </div>\n </div>\n );\n}\n", "import type { ColorRef, PaletteSlot, Rgb, SculptLook, SculptLookPatch, SculptTarget } from \"@dreamy/api\";\nimport { Icon } from \"../atoms/icon.js\";\nimport { MatchButton } from \"../atoms/match-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { FLECK_SHAPES } from \"../lib/catalog.js\";\nimport { rigById } from \"../lib/scene.js\";\nimport { stampPropsCommand, stampSettings } from \"../lib/targets.js\";\nimport { ColorField } from \"../molecules/color-field.js\";\nimport { SliderRow } from \"../molecules/slider-row.js\";\nimport { RegionBlends } from \"./region-blends.js\";\n\nexport type LookTabProps = {\n readonly look: SculptLook;\n readonly targets: readonly SculptTarget[];\n};\n\n/** Fleck type and sliders, the rig's region blends, fleck and foundation colors. */\nexport function FleckStyleTab({ look, targets }: LookTabProps) {\n const { view, creation, dispatch, toast } = useEditor();\n const set = (patch: SculptLookPatch) => dispatch({ type: \"SetSculptLook\", payload: { targets, look: patch } });\n const editSlot = (slot: PaletteSlot, color: Rgb) => dispatch({ type: \"SetPaletteColor\", payload: { slot, color } });\n const fleck = look.fleck;\n const off = fleck.shape === \"none\";\n const rigId = view.mode === \"sculpt\" ? view.scope?.objectId : view.selection.objectIds.length === 1 ? view.selection.objectIds[0] : undefined;\n const rig = rigById(creation, rigId);\n const shapes = stampSettings(creation, view);\n const owner = shapes?.kind === \"group\" ? shapes.group : shapes?.stamps[0];\n const fleckColor: ColorRef = owner?.color ?? look.color;\n const foundation: ColorRef = owner ? (owner.foundationColor ?? fleckColor) : look.foundationColor;\n\n const setColor = (color: ColorRef) => (shapes ? dispatch(stampPropsCommand(shapes, { color })) : set({ color }));\n const setFoundation = (foundationColor: ColorRef) =>\n shapes ? dispatch(stampPropsCommand(shapes, { foundationColor })) : set({ foundationColor });\n const match = () => {\n const ok = shapes ? dispatch(stampPropsCommand(shapes, { foundationColor: null })) : set({ foundationColor: look.color });\n if (ok) toast(\"Foundation Matched to Fleck Color\");\n };\n\n return (\n <>\n <div className=\"prop-group\">\n <label>Fleck Type</label>\n <div className=\"fleck-shape-grid\" id=\"fleck-shape-grid\">\n {FLECK_SHAPES.map((shape) => (\n <button\n key={shape.id}\n type=\"button\"\n id={`btn-fleck-${shape.id}`}\n className={`fleck-shape-btn${fleck.shape === shape.id ? \" active\" : \"\"}`}\n aria-pressed={fleck.shape === shape.id}\n onClick={() => set({ fleck: { shape: shape.id } })}\n >\n <Icon icon={shape.icon} /> {shape.name}\n </button>\n ))}\n </div>\n </div>\n <SliderRow label=\"Fleck Size\" value={fleck.size} min={0.2} max={3} step={0.1} digits={1} off={off} onCommit={(size) => set({ fleck: { size } })} />\n <SliderRow label=\"Variation (colour & size)\" value={fleck.variation} min={0} max={1} step={0.02} off={off} onCommit={(variation) => set({ fleck: { variation } })} />\n <SliderRow label=\"Coverage\" value={fleck.coverage} min={0.1} max={1} step={0.02} off={off} onCommit={(coverage) => set({ fleck: { coverage } })} />\n <SliderRow\n label=\"Foundation Shading (Darkness)\"\n value={fleck.foundationDarkness}\n min={0}\n max={0.6}\n step={0.02}\n off={off}\n onCommit={(foundationDarkness) => set({ fleck: { foundationDarkness } })}\n />\n <SliderRow label=\"Regularity (Grid Order)\" value={fleck.regularity} min={0} max={1} step={0.05} off={off} onCommit={(regularity) => set({ fleck: { regularity } })} />\n <SliderRow label=\"Fleck Movement (Boil)\" value={fleck.boil} min={0} max={3} step={0.1} digits={1} off={off} onCommit={(boil) => set({ fleck: { boil } })} />\n <SliderRow label=\"Smooth CSG Blend\" value={look.blend} min={0} max={0.8} step={0.05} onCommit={(blend) => set({ blend })} />\n {rig ? (\n <div id=\"inspector-skeleton-blends\" className=\"prop-group inspector-blends\">\n <label>\n <span>\n <Icon icon=\"layer-group\" className=\"sp-title-icon\" />\n Skeleton Region Blends\n </span>\n </label>\n <RegionBlends rig={rig} />\n </div>\n ) : null}\n <ColorField label=\"Fleck Color\" palette={creation.palette} value={fleckColor} onPick={setColor} onEditSlot={editSlot} />\n <ColorField\n label=\"Foundation Bed Color\"\n palette={creation.palette}\n value={foundation}\n extra={\n <MatchButton icon=\"magic\" onClick={match}>\n Match Fleck\n </MatchButton>\n }\n onPick={setFoundation}\n onEditSlot={editSlot}\n />\n </>\n );\n}\n", "import type { SculptLookPatch } from \"@dreamy/api\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { SliderRow } from \"../molecules/slider-row.js\";\nimport type { LookTabProps } from \"./fleck-style-tab.js\";\n\n/** Roughness, metalness, glow, fleck normal intensity and opacity. */\nexport function MaterialTab({ look, targets }: LookTabProps) {\n const { dispatch } = useEditor();\n const set = (patch: SculptLookPatch) => dispatch({ type: \"SetSculptLook\", payload: { targets, look: patch } });\n return (\n <>\n <SliderRow label=\"Roughness\" value={look.material.roughness} min={0} max={1} step={0.05} onCommit={(roughness) => set({ material: { roughness } })} />\n <SliderRow label=\"Metalness\" value={look.material.metalness} min={0} max={1} step={0.05} onCommit={(metalness) => set({ material: { metalness } })} />\n <SliderRow label=\"Glow\" value={look.material.glow} min={0} max={3} step={0.05} onCommit={(glow) => set({ material: { glow } })} />\n <SliderRow\n label=\"Normal Intensity\"\n value={look.fleck.normalStrength}\n min={0}\n max={3}\n step={0.05}\n onCommit={(normalStrength) => set({ fleck: { normalStrength } })}\n />\n <SliderRow label=\"Opacity\" value={look.material.opacity} min={0} max={1} step={0.05} onCommit={(opacity) => set({ material: { opacity } })} />\n </>\n );\n}\n", "import type { PaletteSlot, Rgb, SculptLookPatch } from \"@dreamy/api\";\nimport { SelectInput } from \"../atoms/select-input.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { PATTERNS } from \"../lib/catalog.js\";\nimport { ColorField } from \"../molecules/color-field.js\";\nimport { SliderRow } from \"../molecules/slider-row.js\";\nimport type { LookTabProps } from \"./fleck-style-tab.js\";\n\n/** Pattern type, scale, rotation, strength and its two palette colors. */\nexport function PatternTab({ look, targets }: LookTabProps) {\n const { creation, dispatch } = useEditor();\n const set = (patch: SculptLookPatch) => dispatch({ type: \"SetSculptLook\", payload: { targets, look: patch } });\n const editSlot = (slot: PaletteSlot, color: Rgb) => dispatch({ type: \"SetPaletteColor\", payload: { slot, color } });\n const pattern = look.pattern;\n return (\n <>\n <div className=\"prop-group\">\n <label>Pattern Type</label>\n <SelectInput className=\"boxed\" label=\"Pattern Type\" value={pattern.kind} options={PATTERNS} onChange={(kind) => set({ pattern: { kind } })} />\n </div>\n <SliderRow label=\"Pattern Scale\" value={pattern.scale} min={0.2} max={5} step={0.1} onCommit={(scale) => set({ pattern: { scale } })} />\n {([\"x\", \"y\", \"z\"] as const).map((axis) => (\n <SliderRow\n key={axis}\n label={`Rotation ${axis.toUpperCase()}`}\n value={pattern.rotation[axis]}\n min={0}\n max={360}\n step={5}\n digits={0}\n suffix=\"\u00B0\"\n onCommit={(degrees) => set({ pattern: { rotation: { ...pattern.rotation, [axis]: degrees } } })}\n />\n ))}\n <SliderRow label=\"Pattern Strength\" value={pattern.strength} min={0} max={1} step={0.05} onCommit={(strength) => set({ pattern: { strength } })} />\n <ColorField label=\"Pattern Color 1\" palette={creation.palette} value={pattern.color} onPick={(color) => set({ pattern: { color } })} onEditSlot={editSlot} />\n <ColorField label=\"Pattern Color 2\" palette={creation.palette} value={pattern.color2} onPick={(color2) => set({ pattern: { color2 } })} onEditSlot={editSlot} />\n </>\n );\n}\n", "import type { PosePreset, PosePresetId, RigObject } from \"@dreamy/api\";\nimport { SelectInput } from \"../atoms/select-input.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { SliderRow } from \"../molecules/slider-row.js\";\n\nconst NONE = \"none\";\n\n/**\n * A premade rig's pose presets: one pose, or two blended by a slider. Picking writes every bone's pose; posing\n * bones by hand keeps that pose as Custom, offered here once it exists.\n */\nexport function PoseTab({ rig }: { readonly rig: RigObject }) {\n const { api, dispatch } = useEditor();\n const info = api.premades().find((p) => p.id === rig.rig.templateId);\n const options: { id: PosePresetId; name: string }[] = [...(info?.poses ?? [])];\n if (rig.rig.customPose) options.push({ id: \"custom\", name: \"Custom\" });\n const preset: PosePreset = rig.rig.posePreset ?? { a: \"front\", t: 0 };\n const apply = (next: PosePreset) =>\n dispatch({ type: \"ApplyPosePreset\", payload: { rigId: rig.id, a: next.a, ...(next.b ? { b: next.b } : {}), t: next.t } });\n\n return (\n <>\n <div className=\"prop-group\">\n <label>Pose</label>\n <SelectInput className=\"boxed grow\" label=\"Pose\" value={preset.a} options={options} onChange={(a) => apply({ ...preset, a })} />\n </div>\n <div className=\"prop-group\">\n <label>Blend with</label>\n <SelectInput<PosePresetId | typeof NONE>\n className=\"boxed grow\"\n label=\"Second pose\"\n value={preset.b ?? NONE}\n options={[{ id: NONE, name: \"None\" }, ...options.filter((o) => o.id !== preset.a)]}\n onChange={(b) => apply(b === NONE ? { a: preset.a, t: 0 } : { a: preset.a, b, t: preset.b ? preset.t : 0.5 })}\n />\n </div>\n {preset.b ? (\n <SliderRow label=\"Blend\" value={preset.t} min={0} max={1} step={0.05} onCommit={(t) => apply({ ...preset, t })} />\n ) : null}\n <p className=\"muted\">Pose bones by hand in pose mode to keep a Custom pose.</p>\n </>\n );\n}\n", "import { useEffect, useState } from \"react\";\n\nexport type NumberInputProps = {\n readonly value: number;\n readonly label: string;\n readonly step?: number | undefined;\n readonly min?: number | undefined;\n readonly digits?: number | undefined;\n readonly className?: string | undefined;\n readonly onCommit: (value: number) => void;\n};\n\n/** A number field: typing is local, Enter or leaving the field commits. */\nexport function NumberInput({ value, label, step = 0.1, min, digits = 2, className, onCommit }: NumberInputProps) {\n const shown = Number.isInteger(step) && digits === 0 ? String(Math.round(value)) : value.toFixed(digits);\n const [text, setText] = useState(shown);\n useEffect(() => setText(shown), [shown]);\n const commit = () => {\n const next = Number(text);\n if (Number.isFinite(next) && text.trim() !== \"\") {\n if (next !== value) onCommit(next);\n } else setText(shown);\n };\n return (\n <input\n type=\"number\"\n className={className}\n aria-label={label}\n step={step}\n min={min}\n value={text}\n onChange={(event) => setText(event.currentTarget.value)}\n onBlur={commit}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") commit();\n }}\n />\n );\n}\n", "import type { Vec3 } from \"@dreamy/api\";\nimport { NumberInput } from \"../atoms/number-input.js\";\n\nexport type Vec3FieldProps = {\n readonly label: string;\n readonly value: Vec3;\n readonly step?: number | undefined;\n readonly digits?: number | undefined;\n readonly onCommit: (value: Vec3) => void;\n};\n\n/** Three number inputs (x, y, z); each commits the whole vector. */\nexport function Vec3Field({ label, value, step = 0.1, digits = 2, onCommit }: Vec3FieldProps) {\n return (\n <div className=\"prop-group\">\n <label>{label}</label>\n <div className=\"vector-inputs\">\n {([\"x\", \"y\", \"z\"] as const).map((axis) => (\n <NumberInput\n key={axis}\n label={`${label} ${axis.toUpperCase()}`}\n value={value[axis]}\n step={step}\n digits={digits}\n onCommit={(next) => onCommit({ ...value, [axis]: next })}\n />\n ))}\n </div>\n </div>\n );\n}\n", "import type { Transform } from \"@dreamy/api\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport {\n addVec,\n degreesFromQuaternion,\n invertQuaternion,\n mulVec,\n multiplyQuaternions,\n quaternionFromDegrees,\n ratioVec,\n subVec,\n} from \"../lib/math.js\";\nimport { objectById } from \"../lib/scene.js\";\nimport { Vec3Field } from \"../molecules/vec3-field.js\";\n\n/** Position, rotation (degrees) and scale of the selection; other selected objects follow the first one's change. */\nexport function TransformTab() {\n const { view, creation, dispatch } = useEditor();\n const ids = view.mode === \"sculpt\" && view.scope ? [view.scope.objectId] : view.selection.objectIds;\n const objects = ids.flatMap((id) => {\n const object = objectById(creation, id);\n return object ? [object] : [];\n });\n const primary = objects[0];\n if (!primary) return null;\n const current = primary.transform;\n\n const commit = (next: Transform) => {\n const move = subVec(next.position, current.position);\n const turn = multiplyQuaternions(next.rotation, invertQuaternion(current.rotation));\n const grow = ratioVec(next.scale, current.scale);\n const changes = objects.map((object, index) =>\n index === 0\n ? { objectId: object.id, transform: next }\n : {\n objectId: object.id,\n transform: {\n position: addVec(object.transform.position, move),\n rotation: multiplyQuaternions(turn, object.transform.rotation),\n scale: mulVec(object.transform.scale, grow),\n },\n },\n );\n dispatch({ type: \"SetObjectTransforms\", payload: { changes } });\n };\n\n return (\n <>\n <Vec3Field label=\"Position\" value={current.position} onCommit={(position) => commit({ ...current, position })} />\n <Vec3Field\n label=\"Rotation\"\n value={degreesFromQuaternion(current.rotation)}\n step={1}\n digits={0}\n onCommit={(degrees) => commit({ ...current, rotation: quaternionFromDegrees(degrees) })}\n />\n <Vec3Field label=\"Scale\" value={current.scale} onCommit={(scale) => commit({ ...current, scale })} />\n </>\n );\n}\n", "import type { ColorRef, FlatWing, Id, Material } from \"@dreamy/api\";\nimport { MatchButton } from \"../atoms/match-button.js\";\nimport { NumberInput } from \"../atoms/number-input.js\";\nimport { SelectInput } from \"../atoms/select-input.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { WING_OUTLINES, WING_STYLES } from \"../lib/catalog.js\";\nimport { refHex } from \"../lib/colors.js\";\nimport { SliderRow } from \"../molecules/slider-row.js\";\nimport { SwatchRow } from \"../molecules/swatch-row.js\";\n\nconst PARTS = [\n { id: \"fore\", name: \"Forewing\" },\n { id: \"hind\", name: \"Hindwing\" },\n] as const;\n\nconst COLORS: readonly { readonly key: \"base\" | \"base2\" | \"mark\" | \"ink\" | \"dot\"; readonly name: string }[] = [\n { key: \"base\", name: \"Base\" },\n { key: \"base2\", name: \"Base (outer)\" },\n { key: \"mark\", name: \"Markings\" },\n { key: \"ink\", name: \"Veins / border\" },\n { key: \"dot\", name: \"Spots\" },\n];\n\nexport type WingTabProps = {\n readonly wing: FlatWing;\n /** The (first) wing part's material. */\n readonly material: Material;\n readonly rigId: Id;\n readonly boneIds: readonly Id[];\n};\n\n/** Flat wing outline, size, pattern and colors; every edit goes to all listed wings. */\nexport function WingTab({ wing, material, rigId, boneIds }: WingTabProps) {\n const { creation, dispatch } = useEditor();\n const set = (patch: Partial<Omit<FlatWing, \"frame\">>) => dispatch({ type: \"SetFlatWings\", payload: { rigId, boneIds, wing: patch } });\n return (\n <>\n <div className=\"prop-group\">\n <label>Shape</label>\n <div className=\"row-inline\">\n <SelectInput className=\"boxed grow\" label=\"Wing outline\" value={wing.outline} options={WING_OUTLINES} onChange={(outline) => set({ outline })} />\n <SelectInput className=\"boxed\" label=\"Wing part\" value={wing.part} options={PARTS} onChange={(part) => set({ part })} />\n </div>\n </div>\n <SliderRow label=\"Span\" value={wing.span} min={0.4} max={1.6} step={0.02} onCommit={(span) => set({ span })} />\n <SliderRow label=\"Chord\" value={wing.chord} min={0.3} max={2} step={0.02} onCommit={(chord) => set({ chord })} />\n <SliderRow label=\"Tail (hindwing)\" value={wing.tail} min={0} max={1} step={0.02} onCommit={(tail) => set({ tail })} />\n <div className=\"prop-group\">\n <label>Pattern</label>\n <div className=\"row-inline\">\n <SelectInput className=\"boxed grow\" label=\"Wing pattern\" value={wing.style} options={WING_STYLES} onChange={(style) => set({ style })} />\n <NumberInput\n className=\"wing-seed\"\n label=\"Seed\"\n value={wing.seed}\n step={1}\n min={1}\n digits={0}\n onCommit={(seed) => set({ seed: Math.max(1, Math.round(seed)) })}\n />\n <MatchButton icon=\"dice\" title=\"New random pattern\" onClick={() => set({ seed: 1 + Math.floor(Math.random() * 99999) })}>\n Re-roll\n </MatchButton>\n </div>\n </div>\n <SliderRow label=\"Density\" value={wing.density} min={0} max={1} step={0.02} onCommit={(density) => set({ density })} />\n <SliderRow label=\"Spots\" value={wing.spots} min={0} max={1} step={0.02} onCommit={(spots) => set({ spots })} />\n <SliderRow label=\"Border\" value={wing.border} min={0} max={1} step={0.02} onCommit={(border) => set({ border })} />\n {COLORS.map((color) => (\n <div className=\"prop-group\" key={color.key}>\n <label>\n <span>\n <span className=\"wing-chip\" style={{ background: refHex(creation.palette, wing[color.key]) }} />\n {color.name}\n </span>\n </label>\n <SwatchRow\n palette={creation.palette}\n active={wing[color.key]}\n label={`Wing ${color.name}`}\n onPick={(ref: ColorRef) => set({ [color.key]: ref })}\n />\n </div>\n ))}\n <WingMaterial material={material} rigId={rigId} boneIds={boneIds} />\n </>\n );\n}\n\n/** A flat wing's material: the look command's material patch, which the core accepts for wing parts. */\nfunction WingMaterial({ material, rigId, boneIds }: { readonly material: Material; readonly rigId: Id; readonly boneIds: readonly Id[] }) {\n const { dispatch } = useEditor();\n const set = (patch: Partial<Material>) =>\n dispatch({ type: \"SetSculptLook\", payload: { targets: boneIds.map((boneId) => ({ objectId: rigId, boneId })), look: { material: patch } } });\n return (\n <div className=\"prop-group\">\n <label>Material</label>\n <SliderRow label=\"Roughness\" value={material.roughness} min={0} max={1} step={0.05} onCommit={(roughness) => set({ roughness })} />\n <SliderRow label=\"Metalness\" value={material.metalness} min={0} max={1} step={0.05} onCommit={(metalness) => set({ metalness })} />\n <SliderRow label=\"Glow\" value={material.glow} min={0} max={3} step={0.05} onCommit={(glow) => set({ glow })} />\n <SliderRow label=\"Opacity\" value={material.opacity} min={0} max={1} step={0.05} onCommit={(opacity) => set({ opacity })} />\n </div>\n );\n}", "import { MatchButton } from \"../atoms/match-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { partOf, rigById, sculptOf } from \"../lib/scene.js\";\nimport { lookTargets, selectedBonePart, wingTargets } from \"../lib/targets.js\";\nimport { sheetHidden, withSheet, type PropertiesTab } from \"../lib/view-state.js\";\nimport { FloatingPanel } from \"../molecules/floating-panel.js\";\nimport { TabBar } from \"../molecules/tab-bar.js\";\nimport { FleckStyleTab } from \"./fleck-style-tab.js\";\nimport { MaterialTab } from \"./material-tab.js\";\nimport { PatternTab } from \"./pattern-tab.js\";\nimport { PartsTab } from \"./parts-tab.js\";\nimport { PoseTab } from \"./pose-tab.js\";\nimport { TransformTab } from \"./transform-tab.js\";\nimport { WingTab } from \"./wing-tab.js\";\n\n/** Properties of the selection: Transform, Fleck Style, Material, Pattern, (flat wings) Wing and (premade rigs) Parts and Pose. */\nexport function PropertiesPanel() {\n const { view, update, creation, compact, actions } = useEditor();\n if (!view.open.properties || view.selection.objectIds.length === 0) return null;\n\n const bonePart = selectedBonePart(creation, view);\n const targets = lookTargets(creation, view);\n const look = sculptOf(creation, targets[0])?.look;\n const wings = wingTargets(creation, view);\n const wingRig = rigById(creation, wings?.rigId);\n const wingPart = wingRig && wings ? partOf(wingRig, wings.boneIds[0]) : undefined;\n // pose presets: one selected premade rig (in assembly, not a body part)\n const poseRig = !bonePart && view.selection.objectIds.length === 1 ? rigById(creation, view.selection.objectIds[0]) : undefined;\n const premadeRig = poseRig?.rig.templateId !== undefined ? poseRig : undefined;\n\n const tabs: { id: PropertiesTab; name: string }[] = [];\n if (!bonePart) tabs.push({ id: \"transform\", name: \"Transform\" });\n if (look) tabs.push({ id: \"style\", name: \"Fleck Style\" }, { id: \"material\", name: \"Material\" }, { id: \"pattern\", name: \"Pattern\" });\n if (wingPart?.kind === \"wing\") tabs.push({ id: \"wing\", name: \"Wing\" });\n if (premadeRig) tabs.push({ id: \"parts\", name: \"Parts\" }, { id: \"pose\", name: \"Pose\" });\n const tab = tabs.find((entry) => entry.id === view.propertiesTab)?.id ?? tabs[0]?.id;\n\n const count = view.selection.objectIds.length;\n const bone = bonePart ? bonePart.rig.rig.bones.find((entry) => entry.id === bonePart.part.boneId) : undefined;\n const title = bonePart\n ? view.editAllParts\n ? \"Properties \u00B7 all parts\"\n : `Properties \u00B7 ${bone?.name ?? \"part\"}`\n : view.mode === \"assembly\" && count > 1\n ? `Properties \u00B7 ${count} objects`\n : \"Properties\";\n\n return (\n <FloatingPanel\n id=\"inspector-modal\"\n icon=\"cube\"\n title={title}\n headerClassName=\"sp-header inspector-header\"\n sheetHidden={sheetHidden(view, compact, \"properties\")}\n draggable={!compact}\n headerExtra={\n <>\n {bonePart ? (\n <MatchButton active={view.editAllParts} onClick={() => update((current) => ({ ...current, editAllParts: !current.editAllParts }))}>\n All parts\n </MatchButton>\n ) : null}\n <MatchButton icon=\"file-export\" title=\"Export this object or character\" onClick={() => actions.exportObject()}>\n Export\n </MatchButton>\n </>\n }\n onClose={() => update((current) => withSheet(current, \"properties\", false))}\n >\n {tab ? <TabBar tabs={tabs} active={tab} onSelect={(propertiesTab) => update((current) => ({ ...current, propertiesTab }))} /> : null}\n <div className=\"tab-content active\" role=\"tabpanel\">\n {tab === \"transform\" ? <TransformTab /> : null}\n {tab === \"style\" && look ? <FleckStyleTab look={look} targets={targets} /> : null}\n {tab === \"material\" && look ? <MaterialTab look={look} targets={targets} /> : null}\n {tab === \"pattern\" && look ? <PatternTab look={look} targets={targets} /> : null}\n {tab === \"parts\" && premadeRig ? <PartsTab key={premadeRig.id} rig={premadeRig} /> : null}\n {tab === \"pose\" && premadeRig ? <PoseTab rig={premadeRig} /> : null}\n {tab === \"wing\" && wings && wingPart?.kind === \"wing\" ? <WingTab wing={wingPart.wing} material={wingPart.material} rigId={wings.rigId} boneIds={wings.boneIds} /> : null}\n </div>\n </FloatingPanel>\n );\n}\n", "import type { ReactNode } from \"react\";\n\n/** A small monospace value chip (\"#fbbf24\", a count). */\nexport function HexChip({ children }: { readonly children: ReactNode }) {\n return <span className=\"hex-chip\">{children}</span>;\n}\n", "import type { ReactNode } from \"react\";\n\nexport type PillButtonProps = {\n readonly title: string;\n readonly active?: boolean | undefined;\n readonly wide?: boolean | undefined;\n readonly disabled?: boolean | undefined;\n readonly children: ReactNode;\n readonly onClick: () => void;\n};\n\n/** A small round button inside a pill group (modes, axes, steppers). */\nexport function PillButton({ title, active = false, wide = false, disabled, children, onClick }: PillButtonProps) {\n const classes = [\"mode-pill-btn\", active ? \"active\" : undefined, wide ? \"wide\" : undefined].filter(Boolean).join(\" \");\n return (\n <button type=\"button\" className={classes} title={title} aria-label={title} aria-pressed={active} disabled={disabled} onClick={onClick}>\n {children}\n </button>\n );\n}\n", "import type { ReactNode } from \"react\";\n\n/** A labelled pill inside a toolbar (\"Blend\", \"Copies\", \"Mode\"). */\nexport function ToolbarPill({ label, children, title }: { readonly label: string; readonly title?: string; readonly children: ReactNode }) {\n return (\n <div className=\"sculpt-blend-pill\" title={title}>\n <span>{label}</span>\n {children}\n </div>\n );\n}\n", "import { HexChip } from \"../atoms/hex-chip.js\";\nimport { Icon } from \"../atoms/icon.js\";\nimport { PillButton } from \"../atoms/pill-button.js\";\nimport { RangeInput } from \"../atoms/range-input.js\";\nimport { SelectInput } from \"../atoms/select-input.js\";\nimport { Separator } from \"../atoms/separator.js\";\nimport { ToolButton } from \"../atoms/tool-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { RENDER_RESOLUTIONS } from \"../lib/catalog.js\";\nimport { Toolbar } from \"../molecules/toolbar.js\";\nimport { ToolbarPill } from \"../molecules/toolbar-pill.js\";\n\n/**\n * Rendering: normal / pixel art, render resolution, selected only, camera sun, fit to view (the selection, or\n * everything, contained in a centred square from the current angle) and decal line boost (view preferences).\n */\nexport function RenderingBar() {\n const { view, setPrefs, viewport, creation } = useEditor();\n const prefs = view.prefs;\n // fit the selection (or everything) in a centred square, from the current angle: what a square render shows\n const fit = () => {\n const ids = view.selection.objectIds.length ? view.selection.objectIds : creation.objects.filter((o) => o.parentId === undefined).map((o) => o.id);\n viewport.frame(ids, { aspect: 1 });\n };\n return (\n <Toolbar id=\"sub-rendering\" label=\"Rendering\" sub>\n <ToolbarPill label=\"Mode\">\n <div className=\"sculpt-mode-pill\" id=\"render-mode-pill\">\n <PillButton title=\"Normal\" wide active={prefs.renderMode === \"normal\"} onClick={() => setPrefs({ renderMode: \"normal\" })}>\n Normal\n </PillButton>\n <PillButton title=\"Pixel art\" wide active={prefs.renderMode === \"pixel\"} onClick={() => setPrefs({ renderMode: \"pixel\" })}>\n <Icon icon=\"border-all\" /> Pixel art\n </PillButton>\n </div>\n </ToolbarPill>\n <Separator />\n <ToolbarPill label=\"Resolution\">\n <SelectInput\n label=\"Render resolution\"\n value={prefs.renderResolution}\n options={RENDER_RESOLUTIONS}\n onChange={(renderResolution) => setPrefs({ renderResolution })}\n />\n </ToolbarPill>\n <Separator />\n <ToolButton\n id=\"btn-render-selected\"\n icon=\"object-ungroup\"\n tooltip=\"Selected only\"\n background=\"#fff\"\n active={prefs.renderSelectedOnly}\n activeClass=\"play-active\"\n onClick={() => setPrefs({ renderSelectedOnly: !prefs.renderSelectedOnly })}\n />\n <Separator />\n <ToolButton\n id=\"btn-cam-sun\"\n icon=\"sun\"\n tooltip=\"Camera Sun\"\n background=\"#fff\"\n active={prefs.cameraSun}\n activeClass=\"play-active\"\n onClick={() => setPrefs({ cameraSun: !prefs.cameraSun })}\n />\n <Separator />\n <ToolButton id=\"btn-fit-view\" icon=\"expand\" tooltip=\"Fit to view (square)\" background=\"#fff\" onClick={fit} />\n <Separator />\n <ToolbarPill label=\"Line Boost Dist\" title=\"Distance from which black lines on decals are drawn thicker (both modes)\">\n <RangeInput label=\"Line boost distance\" value={prefs.decalBoost} min={0} max={60} step={1} onCommit={(decalBoost) => setPrefs({ decalBoost })} />\n <HexChip>{prefs.decalBoost}</HexChip>\n </ToolbarPill>\n </Toolbar>\n );\n}\n", "import { Icon } from \"./icon.js\";\n\nexport type BadgeProps = {\n readonly icon: string;\n readonly label: string;\n readonly active?: boolean | undefined;\n readonly id?: string | undefined;\n readonly onClick: () => void;\n};\n\n/** A frosted pill toggle (Mirror, Area, Add); green while on. */\nexport function Badge({ icon, label, active = false, id, onClick }: BadgeProps) {\n return (\n <button\n type=\"button\"\n id={id}\n className={`mode-badge${active ? \" play-active\" : \"\"}`}\n aria-pressed={active}\n onClick={onClick}\n >\n <Icon icon={icon} /> {label}\n </button>\n );\n}\n", "import type { BoneTool } from \"@dreamy/api\";\nimport { Badge } from \"../atoms/badge.js\";\nimport { Separator } from \"../atoms/separator.js\";\nimport { ToolButton } from \"../atoms/tool-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { rigById } from \"../lib/scene.js\";\nimport { Toolbar } from \"../molecules/toolbar.js\";\n\nconst BONE_TOOLS: readonly { readonly id: BoneTool; readonly name: string; readonly icon: string; readonly bg: string }[] = [\n { id: \"select\", name: \"Select / Pose Bones\", icon: \"arrows-alt\", bg: \"#fff\" },\n { id: \"add\", name: \"Add Bone\", icon: \"bone\", bg: \"#fef3c7\" },\n { id: \"rotate\", name: \"Rotate Bone\", icon: \"sync-alt\", bg: \"#dbeafe\" },\n { id: \"translate\", name: \"Move Bone\", icon: \"arrows-alt-h\", bg: \"#dcfce7\" },\n { id: \"scale\", name: \"Scale Bone\", icon: \"expand-arrows-alt\", bg: \"#fee2e2\" },\n];\n\n/** Rig Bones: premades, rig / pose mode, bone tools, reset pose, sculpt part, mirror. */\nexport function RigBar() {\n const { view, update, creation, dispatch, actions, toast } = useEditor();\n const rig = view.selection.objectIds.length === 1 ? rigById(creation, view.selection.objectIds[0]) : undefined;\n const poseMode = rig?.rig.mode === \"pose\";\n return (\n <Toolbar id=\"sub-skeleton\" label=\"Rig Bones\" sub>\n <ToolButton\n id=\"btn-rig-premade\"\n className=\"cat-utils\"\n icon=\"wand-magic-sparkles\"\n tooltip=\"Premade Skeletons\"\n onClick={() => update((current) => ({ ...current, premadeOpen: true }))}\n />\n <ToolButton\n id=\"btn-rig-toggle\"\n icon={poseMode ? \"person-walking\" : \"screwdriver-wrench\"}\n tooltip={poseMode ? \"Pose Mode\" : \"Rig Mode\"}\n background=\"#fff\"\n active={poseMode}\n activeClass=\"play-active\"\n onClick={() => {\n if (!rig || rig.rig.bones.length === 0) {\n toast(\"Add a bone first\");\n return;\n }\n const mode = poseMode ? \"rig\" : \"pose\";\n if (dispatch({ type: \"SetRigMode\", payload: { rigId: rig.id, mode } })) {\n toast(mode === \"rig\" ? \"Rig Mode: editing the bind pose\" : \"Pose Mode: bind pose locked\");\n }\n }}\n />\n <Separator />\n {BONE_TOOLS.map((tool) => (\n <ToolButton\n key={tool.id}\n id={`bone-tool-${tool.id}`}\n icon={tool.icon}\n tooltip={tool.name}\n background={tool.bg}\n active={view.boneTool === tool.id}\n onClick={() => update((current) => ({ ...current, tool: \"bone\", boneTool: tool.id }))}\n />\n ))}\n <ToolButton\n id=\"bone-tool-reset\"\n icon=\"undo-alt\"\n tooltip=\"Reset Pose\"\n background=\"#fff\"\n onClick={() => {\n if (rig && dispatch({ type: \"ResetPose\", payload: { rigId: rig.id } })) toast(\"Pose Reset\");\n }}\n />\n <ToolButton icon=\"cubes\" tooltip=\"Sculpt Part (selected bone)\" background=\"#fde68a\" onClick={() => actions.sculptPart()} />\n <Badge\n id=\"btn-mirror\"\n icon=\"left-right\"\n label=\"Mirror\"\n active={!!rig?.rig.mirror}\n onClick={() => {\n if (!rig) {\n toast(\"Select a rig first\");\n return;\n }\n const mirror = !rig.rig.mirror;\n if (dispatch({ type: \"SetRigMirror\", payload: { rigId: rig.id, mirror } })) toast(mirror ? \"Mirror on\" : \"Mirror off\");\n }}\n />\n </Toolbar>\n );\n}\n", "import type { CreationLog, Id, LibraryEntry } from \"@dreamy/api\";\nimport { useEffect, useState } from \"react\";\nimport { ActionButton } from \"../atoms/action-button.js\";\nimport { Icon } from \"../atoms/icon.js\";\nimport { IconButton } from \"../atoms/icon-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { InlineEdit } from \"../molecules/inline-edit.js\";\nimport { Modal } from \"../molecules/modal.js\";\nimport { GitSyncPanel, useSyncStatus } from \"./git-sync-panel.js\";\n\nconst EMPTY_LOG: CreationLog = { format: \"dreamy-studio\", schemaVersion: 1, events: [] };\n\n/** Scenes: the library (open, rename, copy, export, delete), new scene, import and export. */\nexport function ScenesModal() {\n const { view, update, persistence, sync, creationId, onOpen, save, toast } = useEditor();\n const [entries, setEntries] = useState<readonly LibraryEntry[]>([]);\n const [renaming, setRenaming] = useState<Id | undefined>(undefined);\n const [confirmDelete, setConfirmDelete] = useState<Id | undefined>(undefined);\n const [name, setName] = useState(\"\");\n const [gitOpen, setGitOpen] = useState(false);\n const status = useSyncStatus(sync);\n const open = view.scenesOpen;\n\n const refresh = async () => {\n try {\n const list = await persistence.list();\n setEntries([...list].sort((a, b) => b.updatedAt - a.updatedAt));\n setName(list.find((entry) => entry.id === creationId)?.name ?? \"\");\n } catch {\n toast(\"Could not read the library\");\n }\n };\n\n useEffect(() => {\n if (!open) return;\n void save().then(refresh);\n }, [open]);\n\n // A sync may pull, copy or delete scenes\n useEffect(() => {\n if (open && status.state === \"idle\") void refresh();\n }, [open, status.state, status.lastSyncedAt]);\n\n if (!open) return null;\n const close = () => update((current) => ({ ...current, scenesOpen: false }));\n\n const switchTo = async (id: Id) => {\n if (id === creationId) {\n close();\n return;\n }\n await save();\n await persistence.open(id);\n close();\n onOpen(id);\n };\n\n const rename = async (id: Id, next: string) => {\n const trimmed = next.trim().slice(0, 60);\n if (!trimmed) return;\n await persistence.rename(id, trimmed);\n await refresh();\n };\n\n const run = (task: () => Promise<unknown>, failure: string) => {\n task().catch(() => toast(failure));\n };\n\n const newScene = async () => {\n await save();\n const list = await persistence.list();\n const id = await persistence.create(`Untitled scene ${list.length + 1}`, EMPTY_LOG);\n await persistence.open(id);\n close();\n onOpen(id);\n toast(\"New scene\");\n };\n\n const remove = async (id: Id) => {\n if (confirmDelete !== id) {\n setConfirmDelete(id);\n return;\n }\n setConfirmDelete(undefined);\n await persistence.remove(id);\n toast(\"Scene deleted\");\n if (id === creationId) {\n await newScene();\n return;\n }\n await refresh();\n };\n\n const formatDate = (time: number) => new Date(time).toLocaleString([], { dateStyle: \"medium\", timeStyle: \"short\" });\n\n return (\n <Modal id=\"scenes-modal\" label=\"Scenes\" cardClassName=\"scn-card\" onBackdrop={close}>\n <div className=\"de-head\">\n <span className=\"de-title\">\n <Icon icon=\"folder-open\" /> Scenes\n </span>\n <input\n id=\"scn-name\"\n type=\"text\"\n maxLength={60}\n placeholder=\"Scene name\"\n aria-label=\"Scene name\"\n autoComplete=\"off\"\n spellCheck={false}\n title=\"Name of the current scene (autosaved)\"\n value={name}\n onChange={(event) => setName(event.currentTarget.value)}\n onBlur={() => run(() => rename(creationId, name), \"Could not rename the scene\")}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") event.currentTarget.blur();\n }}\n />\n <IconButton icon=\"times\" title=\"Close\" variant=\"de-btn\" onClick={close} />\n </div>\n <div className=\"scn-bar\">\n <ActionButton variant=\"de-act primary\" icon=\"plus\" onClick={() => run(newScene, \"Could not create a scene\")}>\n New scene\n </ActionButton>\n <ActionButton\n variant=\"de-act\"\n icon=\"file-import\"\n onClick={() =>\n run(async () => {\n const id = await persistence.importFile();\n if (id === undefined) return;\n await switchTo(id);\n }, \"That file isn't a scene\")\n }\n >\n Import\n </ActionButton>\n <ActionButton\n variant=\"de-act\"\n icon=\"file-export\"\n onClick={() =>\n run(async () => {\n await save();\n await persistence.exportFile(creationId);\n }, \"Could not export the scene\")\n }\n >\n Export\n </ActionButton>\n {sync ? (\n <button\n type=\"button\"\n className={`de-act scn-git-toggle${gitOpen ? \" active\" : \"\"}${status.state === \"error\" ? \" error\" : \"\"}`}\n aria-expanded={gitOpen}\n title={status.state === \"off\" ? \"Save your scenes to a GitHub or GitLab repository\" : `Git: ${status.repo ?? \"\"}`}\n onClick={() => setGitOpen((current) => !current)}\n >\n <Icon icon={status.state === \"syncing\" ? \"sync-alt\" : \"code-branch\"} /> Git\n {status.state === \"off\" ? null : <span className={`scn-git-dot ${status.state}`} aria-hidden=\"true\" />}\n </button>\n ) : null}\n <span className=\"scn-note\">\n {status.state === \"off\"\n ? \"Your current scene saves automatically in this browser.\"\n : `Saves in this browser and syncs to ${status.repo ?? \"git\"}.`}\n </span>\n </div>\n {sync && gitOpen ? <GitSyncPanel sync={sync} status={status} toast={toast} /> : null}\n <div id=\"scn-list\">\n {entries.length === 0 ? <div className=\"scn-empty\">No saved scenes yet</div> : null}\n {entries.map((entry) => {\n const current = entry.id === creationId;\n return (\n <div key={entry.id} className={`scn-item${current ? \" current\" : \"\"}`}>\n <div\n className=\"scn-thumb\"\n role=\"button\"\n aria-label={`Open ${entry.name}`}\n style={entry.thumbnail ? { backgroundImage: `url(${entry.thumbnail})` } : undefined}\n onClick={() => run(() => switchTo(entry.id), \"Could not open that scene\")}\n >\n {entry.thumbnail ? null : <Icon icon=\"cube\" />}\n </div>\n <div className=\"scn-info\" onClick={() => run(() => switchTo(entry.id), \"Could not open that scene\")}>\n {renaming === entry.id ? (\n <InlineEdit\n value={entry.name}\n label=\"Scene name\"\n onCommit={(next) => {\n setRenaming(undefined);\n run(() => rename(entry.id, next), \"Could not rename the scene\");\n }}\n onCancel={() => setRenaming(undefined)}\n />\n ) : (\n <b>{entry.name}</b>\n )}\n <span>\n {current ? \"Current \u00B7 \" : \"\"}\n {formatDate(entry.updatedAt)}\n </span>\n </div>\n <div className=\"scn-acts\">\n <IconButton icon=\"pen\" title=\"Rename\" variant=\"de-btn sm\" onClick={() => setRenaming(entry.id)} />\n <IconButton\n icon=\"clone\"\n title=\"Save a copy\"\n variant=\"de-btn sm\"\n onClick={() =>\n run(async () => {\n if (current) await save();\n await persistence.duplicate(entry.id);\n toast(\"Copy saved\");\n await refresh();\n }, \"Could not copy the scene\")\n }\n />\n <IconButton\n icon=\"download\"\n title=\"Export .json\"\n variant=\"de-btn sm\"\n onClick={() =>\n run(async () => {\n if (current) await save();\n await persistence.exportFile(entry.id);\n }, \"Could not export the scene\")\n }\n />\n <IconButton\n icon=\"trash-alt\"\n title={confirmDelete === entry.id ? `Delete \"${entry.name}\"? Click again` : \"Delete\"}\n variant={confirmDelete === entry.id ? \"de-btn sm confirm\" : \"de-btn sm\"}\n onClick={() => run(() => remove(entry.id), \"Could not delete the scene\")}\n />\n </div>\n </div>\n );\n })}\n </div>\n </Modal>\n );\n}\n", "import type { GitProvider, LibrarySync, SyncStatus } from \"@dreamy/api\";\nimport { useEffect, useState } from \"react\";\nimport { ActionButton } from \"../atoms/action-button.js\";\nimport { Icon } from \"../atoms/icon.js\";\nimport { TokenGuide } from \"./token-guide.js\";\n\nconst PROVIDERS: readonly { readonly id: GitProvider; readonly name: string; readonly tokenHint: string; readonly tokenUrl: string }[] = [\n {\n id: \"github\",\n name: \"GitHub\",\n tokenHint: \"Classic token with the repo scope, or a fine-grained token with Contents: read and write on an existing repository.\",\n tokenUrl: \"https://github.com/settings/tokens/new?scopes=repo&description=Dreamy%20saves\",\n },\n {\n id: \"gitlab\",\n name: \"GitLab\",\n tokenHint: \"Personal or group access token with the api, read_repository and write_repository scopes.\",\n tokenUrl: \"https://gitlab.com/-/user_settings/personal_access_tokens\",\n },\n];\n\n/** The library's git status, kept current through the port. */\nexport function useSyncStatus(sync: LibrarySync | undefined): SyncStatus {\n const [status, setStatus] = useState<SyncStatus>(() => sync?.status() ?? { state: \"off\" });\n useEffect(() => {\n if (!sync) return;\n setStatus(sync.status());\n return sync.subscribe(setStatus);\n }, [sync]);\n return status;\n}\n\nexport type GitSyncPanelProps = {\n readonly sync: LibrarySync;\n readonly status: SyncStatus;\n readonly toast: (message: string) => void;\n};\n\n/** Scenes dialog section: connect the library to one GitHub / GitLab repository, sync now, disconnect. */\nexport function GitSyncPanel({ sync, status, toast }: GitSyncPanelProps) {\n const initial = sync.settings();\n const [provider, setProvider] = useState<GitProvider>(initial?.provider ?? \"github\");\n const [token, setToken] = useState(\"\");\n const [repo, setRepo] = useState(initial?.repo ?? \"dreamy-saves\");\n const [branch, setBranch] = useState(initial?.branch ?? \"main\");\n const [instanceUrl, setInstanceUrl] = useState(initial?.instanceUrl ?? \"https://gitlab.com\");\n const [groupPath, setGroupPath] = useState(initial?.groupPath ?? \"\");\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | undefined>(undefined);\n const [confirmOff, setConfirmOff] = useState(false);\n const [guide, setGuide] = useState(false);\n const info = PROVIDERS.find((p) => p.id === provider) ?? PROVIDERS[0]!;\n\n const task = async (work: () => Promise<unknown>, done: string) => {\n setBusy(true);\n setError(undefined);\n try {\n await work();\n toast(done);\n } catch (failure) {\n setError(failure instanceof Error ? failure.message : String(failure));\n } finally {\n setBusy(false);\n }\n };\n\n if (status.state !== \"off\") {\n const syncing = status.state === \"syncing\" || busy;\n const when = status.lastSyncedAt\n ? new Date(status.lastSyncedAt).toLocaleString([], { dateStyle: \"medium\", timeStyle: \"short\" })\n : \"not yet\";\n return (\n <div className=\"scn-git\" aria-label=\"Git sync\">\n <div className=\"scn-git-row\">\n <Icon icon=\"code-branch\" />\n <b>{status.repo}</b>\n <span>\n {status.branch} \u00B7 {status.provider === \"gitlab\" ? \"GitLab\" : \"GitHub\"}\n {status.user ? ` \u00B7 ${status.user}` : \"\"}\n </span>\n </div>\n <div className={`scn-git-status${status.state === \"error\" ? \" error\" : \"\"}`} role=\"status\">\n {syncing ? \"Syncing\u2026\" : `Last sync: ${when}${status.message ? ` \u00B7 ${status.message}` : \"\"}`}\n </div>\n <div className=\"scn-git-row\">\n <ActionButton\n variant=\"de-act primary\"\n icon=\"sync-alt\"\n onClick={() => {\n if (!syncing) void task(() => sync.syncNow(), \"Library synced\");\n }}\n >\n Sync now\n </ActionButton>\n <ActionButton\n variant=\"de-act danger\"\n icon=\"unlink\"\n onClick={() => {\n if (!confirmOff) {\n setConfirmOff(true);\n return;\n }\n setConfirmOff(false);\n void task(() => sync.disconnect(), \"Git disconnected\");\n }}\n >\n {confirmOff ? \"Disconnect? Click again\" : \"Disconnect\"}\n </ActionButton>\n </div>\n {error ? <div className=\"scn-git-status error\">{error}</div> : null}\n </div>\n );\n }\n\n const connect = () =>\n task(\n () =>\n sync.connect({\n provider,\n token: token.trim(),\n repo: repo.trim() || \"dreamy-saves\",\n branch: branch.trim() || \"main\",\n ...(provider === \"gitlab\" ? { instanceUrl: instanceUrl.trim() } : {}),\n ...(provider === \"gitlab\" && groupPath.trim() ? { groupPath: groupPath.trim() } : {}),\n }),\n \"Library connected to git\",\n );\n\n return (\n <form\n className=\"scn-git\"\n aria-label=\"Git sync\"\n onSubmit={(event) => {\n event.preventDefault();\n if (!busy && token.trim()) void connect();\n }}\n >\n <div className=\"scn-git-row\" role=\"group\" aria-label=\"Provider\">\n {PROVIDERS.map((p) => (\n <button\n key={p.id}\n type=\"button\"\n className={`scn-git-tab${p.id === provider ? \" active\" : \"\"}`}\n aria-pressed={p.id === provider}\n onClick={() => setProvider(p.id)}\n >\n {p.name}\n </button>\n ))}\n </div>\n <label className=\"scn-git-field\">\n <span>Access token</span>\n <input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={token}\n placeholder={provider === \"github\" ? \"github_pat_\u2026\" : \"glpat-\u2026\"}\n onChange={(event) => setToken(event.currentTarget.value)}\n />\n </label>\n <div className=\"scn-git-hint\">\n {info.tokenHint}{\" \"}\n <a href={info.tokenUrl} target=\"_blank\" rel=\"noreferrer\">\n Create one\n </a>\n . It stays in this browser.{\" \"}\n <button type=\"button\" className=\"tg-toggle\" aria-expanded={guide} onClick={() => setGuide((open) => !open)}>\n <Icon icon=\"question-circle\" /> {guide ? \"Hide token help\" : \"How do I get a token?\"}\n </button>\n </div>\n {guide ? <TokenGuide key={provider} provider={provider} /> : null}\n <div className=\"scn-git-row\">\n <label className=\"scn-git-field grow\">\n <span>Repository</span>\n <input type=\"text\" spellCheck={false} value={repo} onChange={(event) => setRepo(event.currentTarget.value)} />\n </label>\n <label className=\"scn-git-field\">\n <span>Branch</span>\n <input type=\"text\" spellCheck={false} value={branch} onChange={(event) => setBranch(event.currentTarget.value)} />\n </label>\n </div>\n {provider === \"gitlab\" ? (\n <div className=\"scn-git-row\">\n <label className=\"scn-git-field grow\">\n <span>Instance</span>\n <input type=\"url\" spellCheck={false} value={instanceUrl} onChange={(event) => setInstanceUrl(event.currentTarget.value)} />\n </label>\n <label className=\"scn-git-field grow\">\n <span>Group (optional)</span>\n <input type=\"text\" spellCheck={false} value={groupPath} onChange={(event) => setGroupPath(event.currentTarget.value)} />\n </label>\n </div>\n ) : null}\n <div className=\"scn-git-row\">\n <button type=\"submit\" className=\"de-act primary\" disabled={busy || !token.trim()}>\n <Icon icon=\"link\" /> {busy ? \"Connecting\u2026\" : \"Connect\"}\n </button>\n <span className=\"scn-note\">One repository holds every scene; it is created (private) when missing.</span>\n </div>\n {error ? <div className=\"scn-git-status error\">{error}</div> : null}\n </form>\n );\n}\n", "import type { GitProvider } from \"@dreamy/api\";\nimport { useState } from \"react\";\nimport { Icon } from \"../atoms/icon.js\";\n\ntype GuideTab = \"compare\" | \"github\" | \"gitlab\" | \"gitlab-group\";\n\nconst TABS: readonly { readonly id: GuideTab; readonly name: string }[] = [\n { id: \"compare\", name: \"Which should I use?\" },\n { id: \"github\", name: \"GitHub token\" },\n { id: \"gitlab\", name: \"GitLab token\" },\n { id: \"gitlab-group\", name: \"GitLab group token\" },\n];\n\nconst ROWS: readonly { readonly token: string; readonly security: string; readonly setup: string; readonly repo: string; readonly best: string }[] = [\n { token: \"GitHub classic\", security: \"Medium (all repos)\", setup: \"1 min\", repo: \"Created for you\", best: \"Quickest start on GitHub.\" },\n {\n token: \"GitHub fine-grained\",\n security: \"Highest (chosen repos)\",\n setup: \"2 min\",\n repo: \"Create it first\",\n best: \"Only the save repository is reachable.\",\n },\n { token: \"GitLab personal\", security: \"Medium (all projects)\", setup: \"1 min\", repo: \"Created for you\", best: \"Quickest start on GitLab.\" },\n { token: \"GitLab group\", security: \"Highest (one group)\", setup: \"3 min\", repo: \"Created for you\", best: \"Locked to one group; fill in Group.\" },\n];\n\nfunction External({ href, children }: { readonly href: string; readonly children: string }) {\n return (\n <a className=\"tg-link\" href={href} target=\"_blank\" rel=\"noreferrer\">\n {children} <Icon icon=\"external-link-alt\" />\n </a>\n );\n}\n\n/** How to create an access token for the save repository (after vite-react's token guide). */\nexport function TokenGuide({ provider }: { readonly provider: GitProvider }) {\n const [tab, setTab] = useState<GuideTab>(provider === \"github\" ? \"github\" : \"gitlab\");\n\n return (\n <div className=\"token-guide\" aria-label=\"Access token guide\">\n <div className=\"tg-tabs\" role=\"tablist\" aria-label=\"Token guide\">\n {TABS.map((t) => (\n <button\n key={t.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={t.id === tab}\n className={`tg-tab${t.id === tab ? \" active\" : \"\"}`}\n onClick={() => setTab(t.id)}\n >\n {t.name}\n </button>\n ))}\n </div>\n\n {tab === \"compare\" ? (\n <div role=\"tabpanel\" aria-label=\"Which should I use?\">\n <div className=\"tg-table-wrap\">\n <table className=\"tg-table\">\n <thead>\n <tr>\n <th>Token</th>\n <th>Security</th>\n <th>Setup</th>\n <th>Repository</th>\n <th>Best for</th>\n </tr>\n </thead>\n <tbody>\n {ROWS.map((row) => (\n <tr key={row.token}>\n <td>\n <b>{row.token}</b>\n </td>\n <td>{row.security}</td>\n <td>{row.setup}</td>\n <td>{row.repo}</td>\n <td>{row.best}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <p className=\"tg-note\">\n If your account holds nothing sensitive, a classic / personal token is the quickest. Otherwise use a\n fine-grained or group token: it can only reach the save repository, so your other repositories stay safe.\n </p>\n </div>\n ) : null}\n\n {tab === \"github\" ? (\n <div role=\"tabpanel\" aria-label=\"GitHub token\">\n <div className=\"tg-step\">\n <div className=\"tg-head\">\n <b>Classic token (ghp_\u2026)</b>\n <External href=\"https://github.com/settings/tokens/new?scopes=repo&description=Dreamy%20saves\">\n Open GitHub\n </External>\n </div>\n <ol>\n <li>\n Settings \u203A Developer settings \u203A Personal access tokens \u203A <b>Tokens (classic)</b>.\n </li>\n <li>\n <b>Generate new token (classic)</b>.\n </li>\n <li>\n Check the <code>repo</code> scope (full control of repositories).\n </li>\n <li>\n <b>Generate token</b> and paste the <code>ghp_\u2026</code> value here.\n </li>\n </ol>\n </div>\n <div className=\"tg-step\">\n <div className=\"tg-head\">\n <b>Fine-grained token (github_pat_\u2026)</b>\n <External href=\"https://github.com/settings/personal-access-tokens/new\">Open GitHub</External>\n </div>\n <ol>\n <li>\n <b>Tokens (fine-grained)</b> \u203A <b>Generate new token</b>.\n </li>\n <li>\n Repository access: <b>Only select repositories</b>, and pick your save repository.\n </li>\n <li>\n Repository permissions: <code>Contents: Read and write</code>.\n </li>\n </ol>\n <div className=\"tg-warn\">\n <b>Create the repository on GitHub first.</b> A fine-grained token can't create one through the API. If you\n point Dreamy at another repository later, edit the token and add that repository to its access.\n </div>\n </div>\n </div>\n ) : null}\n\n {tab === \"gitlab\" ? (\n <div role=\"tabpanel\" aria-label=\"GitLab token\">\n <div className=\"tg-step\">\n <div className=\"tg-head\">\n <b>Personal access token (glpat-\u2026)</b>\n <External href=\"https://gitlab.com/-/user_settings/personal_access_tokens\">Open GitLab</External>\n </div>\n <ol>\n <li>\n GitLab \u203A Preferences \u203A <b>Access tokens</b>.\n </li>\n <li>\n <b>Add new token</b>.\n </li>\n <li>\n Under <b>Select scopes</b>, check <code>api</code>, <code>read_repository</code> and{\" \"}\n <code>write_repository</code>.\n </li>\n <li>\n <b>Create personal access token</b> and paste the <code>glpat-\u2026</code> value here.\n </li>\n </ol>\n <p className=\"tg-note\">On a self-managed GitLab, open the same page on your instance and fill in Instance.</p>\n </div>\n </div>\n ) : null}\n\n {tab === \"gitlab-group\" ? (\n <div role=\"tabpanel\" aria-label=\"GitLab group token\">\n <div className=\"tg-step\">\n <div className=\"tg-head\">\n <b>Fine-grained token scoped to a group</b>\n <External href=\"https://gitlab.com/-/user_settings/personal_access_tokens\">Open GitLab</External>\n </div>\n <p className=\"tg-note\">\n Follow this exact checklist (the same as vite-react's), then write the group's path in Group. GitLab\n answers <code>insufficient_granular_scope</code> when one is missing.\n </p>\n <dl className=\"tg-perms\">\n <dt>1. Group and project access</dt>\n <dd>\n Your group, role <b>Developer</b> or higher (Guest and Reporter get 403 Forbidden on push).\n </dd>\n <dt>2. Group and project permissions</dt>\n <dd>Projects \u203A Project: Read, Update</dd>\n <dd>Repository \u203A Branch: Create, Read</dd>\n <dd>Repository \u203A Code: Download, Push, Read</dd>\n <dd>Repository \u203A Commit: Create, Read, Update</dd>\n <dd>Repository \u203A Repository: Create, Read, Update</dd>\n <dd>Repository \u203A Repository Tag: Create, Read</dd>\n <dd>Merge Request \u203A Merge Request: Approve, Create, Merge, Read, Subscribe, Update</dd>\n <dd>Project Features \u203A Release: Create, Read, Update</dd>\n <dt>3. User permissions</dt>\n <dd>System Access \u203A User: Read, Email: Read</dd>\n <dd>Projects \u203A Project: Create</dd>\n <dd>Groups \u203A Namespace: Read</dd>\n <dt>4. Global permissions</dt>\n <dd>System Access \u203A User: Read, Email: Read</dd>\n <dd>Groups \u203A Namespace: Update</dd>\n </dl>\n </div>\n </div>\n ) : null}\n </div>\n );\n}\n", "import { useEditor } from \"../hooks/editor-context.js\";\n\n/** The hint under the bars while the Select tool (or Rig Bones with a rig) is up. */\nexport function SelectHint() {\n const { view } = useEditor();\n const bones = view.category === \"skeleton\" && view.selection.objectIds.length > 0;\n const show = !view.play && ((view.tool === \"select\" && view.category === \"transform\") || bones);\n return (\n <div id=\"select-hint\" className={show ? \"show\" : undefined}>\n {bones ? (\n <>\n <b>Shift</b>/<b>Drag</b> pose or move \u00B7 <b>Ctrl/Cmd</b> add bone\n </>\n ) : (\n <>\n Drag to orbit \u00B7 <b>Shift</b> box-select \u00B7 <b>Ctrl/Cmd</b> pick one\n </>\n )}\n </div>\n );\n}\n", "import { IconButton } from \"../atoms/icon-button.js\";\nimport { Icon } from \"../atoms/icon.js\";\nimport { SideButton } from \"../atoms/side-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { MODE_BADGE, modeInfo, stampShapeInfo } from \"../lib/catalog.js\";\nimport { refHex } from \"../lib/colors.js\";\nimport { pickStamp, sculptOf, stampRows } from \"../lib/scene.js\";\nimport { sheetHidden, withSheet } from \"../lib/view-state.js\";\nimport { FloatingPanel } from \"../molecules/floating-panel.js\";\nimport { ListRow } from \"../molecules/list-row.js\";\nimport type { ColorRef, Id, StampMode } from \"@dreamy/api\";\n\n/** The shapes of the scoped sculpt: loose stamps and smear groups (lock, properties, delete). */\nexport function ShapeListPanel() {\n const { view, update, creation, dispatch, compact, toast } = useEditor();\n const scope = view.scope;\n const sculpt = view.mode === \"sculpt\" ? sculptOf(creation, scope) : undefined;\n if (!sculpt || !scope) return null;\n if (view.minimized.shapes) {\n return <SideButton id=\"stamp-list-toggle\" icon=\"list\" tooltip=\"Shapes\" onClick={() => update((current) => withSheet(current, \"shapes\", true))} />;\n }\n const look = sculpt.look;\n const selected = (ids: readonly Id[]) => ids.length > 0 && ids.every((id) => view.selection.stampIds.includes(id));\n const select = (stampIds: readonly Id[]) => update((current) => ({ ...current, selection: { ...current.selection, stampIds } }));\n const openProps = (stampIds: readonly Id[]) => update((current) => withSheet({ ...current, selection: { ...current.selection, stampIds } }, \"stampProps\", true));\n const badge = (mode: StampMode, color: ColorRef) => {\n const info = modeInfo(mode);\n return (\n <>\n <span className=\"stamp-mode\" style={{ background: info.color }} title={info.name}>\n <Icon icon={MODE_BADGE[mode]} />\n </span>\n <span className=\"stamp-dot\" style={{ background: refHex(creation.palette, color) }} />\n </>\n );\n };\n const removeStamp = (stampId: Id) => {\n if (dispatch({ type: \"RemoveStamps\", payload: { target: scope, stampIds: [stampId] } })) toast(\"Shape Deleted\");\n };\n\n return (\n <FloatingPanel\n id=\"stamp-panel\"\n icon=\"shapes\"\n title={\n <>\n Shapes <span className=\"sp-count\">({sculpt.stamps.length})</span>\n </>\n }\n sheetHidden={sheetHidden(view, compact, \"shapes\")}\n draggable={!compact}\n onClose={() => update((current) => withSheet(current, \"shapes\", false))}\n >\n <div id=\"stamp-list\" role=\"tree\" aria-label=\"Shapes\">\n {stampRows(sculpt).map((row) => {\n if (row.kind === \"stamp\") {\n const shape = stampShapeInfo(row.stamp.shape);\n return (\n <ListRow\n key={row.stamp.id}\n icon={shape.listIcon}\n name={`${shape.name} ${row.index + 1}`}\n selected={selected([row.stamp.id]) && view.selection.stampIds.length === 1}\n onClick={() => select(pickStamp(sculpt, row.stamp.id))}\n >\n {badge(row.stamp.mode, row.stamp.color ?? look.color)}\n <IconButton icon=\"sliders-h\" title=\"Properties\" onClick={() => openProps([row.stamp.id])} />\n <IconButton icon=\"trash-alt\" title=\"Delete\" variant=\"stamp-btn del\" onClick={() => removeStamp(row.stamp.id)} />\n </ListRow>\n );\n }\n const { group, members } = row;\n const ids = members.map((member) => member.stamp.id);\n return (\n <div key={group.id}>\n <ListRow\n variant=\"group\"\n icon=\"object-group\"\n iconBg=\"#fbcfe8\"\n name={\n <>\n {group.name} <span className=\"muted\">\u00D7{members.length}</span>\n </>\n }\n selected={members.some((member) => view.selection.stampIds.includes(member.stamp.id))}\n onClick={() => select(ids)}\n >\n {badge(group.mode, group.color)}\n <IconButton\n icon={group.unlocked ? \"lock-open\" : \"lock\"}\n title={group.unlocked ? \"Lock group\" : \"Unlock shapes\"}\n onClick={() => {\n if (dispatch({ type: \"SetSmearGroup\", payload: { target: scope, groupId: group.id, props: { unlocked: !group.unlocked } } })) {\n toast(group.unlocked ? `${group.name} locked` : `${group.name} unlocked: shapes can be moved individually`);\n }\n }}\n />\n <IconButton icon=\"sliders-h\" title=\"Group properties\" onClick={() => openProps(ids)} />\n <IconButton\n icon=\"trash-alt\"\n title=\"Delete group\"\n variant=\"stamp-btn del\"\n onClick={() => {\n if (dispatch({ type: \"RemoveSmearGroup\", payload: { target: scope, groupId: group.id } })) toast(`${group.name} Deleted`);\n }}\n />\n </ListRow>\n {group.unlocked\n ? members.map((member) => {\n const shape = stampShapeInfo(member.stamp.shape);\n return (\n <ListRow\n key={member.stamp.id}\n variant=\"member\"\n icon={shape.listIcon}\n name={`${shape.name} ${member.index + 1}`}\n selected={view.selection.stampIds.length === 1 && view.selection.stampIds[0] === member.stamp.id}\n onClick={() => select([member.stamp.id])}\n >\n <IconButton icon=\"trash-alt\" title=\"Delete shape\" variant=\"stamp-btn del\" onClick={() => removeStamp(member.stamp.id)} />\n </ListRow>\n );\n })\n : null}\n </div>\n );\n })}\n </div>\n </FloatingPanel>\n );\n}\n", "import { Kbd } from \"../atoms/kbd.js\";\nimport { SideButton } from \"../atoms/side-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { withSheet } from \"../lib/view-state.js\";\n\n/** The right dock: Properties, Scope In / Exit Sculpt Mode (with the hold-Esc hint) and Export. */\nexport function SideDock({ sheetOpen }: { readonly sheetOpen: boolean }) {\n const { view, update, actions, escHold } = useEditor();\n const selected = view.selection.objectIds.length > 0;\n if (sheetOpen) return null;\n return (\n <div id=\"side-dock\">\n {selected ? (\n <SideButton\n id=\"inspector-toggle\"\n icon=\"sliders-h\"\n tooltip=\"Properties\"\n onClick={() => update((current) => withSheet(current, \"properties\", !current.open.properties))}\n />\n ) : null}\n {selected && view.mode === \"assembly\" && !view.play ? (\n <SideButton id=\"context-scope-in-btn\" className=\"scope-in-btn\" icon=\"shapes\" tooltip=\"Scope In (Edit Sculpt)\" onClick={actions.scopeIn} />\n ) : null}\n {view.mode === \"sculpt\" ? (\n <SideButton id=\"scope-out-side-btn\" className=\"scope-out-btn\" icon=\"check\" tooltip=\"Exit Sculpt Mode\" onClick={actions.scopeOut}>\n <div className={`esc-hint${escHold > 0 ? \" holding\" : \"\"}`} id=\"esc-hint\">\n <span>\n Hold <Kbd>Esc</Kbd> to exit sculpt mode\n </span>\n <div className=\"esc-hint-bar\">\n <i style={{ width: `${escHold * 100}%` }} />\n </div>\n </div>\n </SideButton>\n ) : null}\n {selected ? <SideButton id=\"side-export-btn\" icon=\"file-export\" tooltip=\"Export\" onClick={() => actions.exportObject()} /> : null}\n </div>\n );\n}\n", "import type { StampMode } from \"@dreamy/api\";\nimport { Icon } from \"../atoms/icon.js\";\nimport { PillButton } from \"../atoms/pill-button.js\";\nimport { STAMP_MODES } from \"../lib/catalog.js\";\n\nexport type ModePillProps = {\n readonly value: StampMode;\n readonly onChange: (mode: StampMode) => void;\n};\n\n/** Add / Subtract / Intersect / Paint. */\nexport function ModePill({ value, onChange }: ModePillProps) {\n return (\n <div className=\"sculpt-mode-pill\" role=\"group\" aria-label=\"Mode\">\n {STAMP_MODES.map((mode) => (\n <PillButton key={mode.id} title={mode.name} active={mode.id === value} onClick={() => onChange(mode.id)}>\n <Icon icon={mode.icon} />\n </PillButton>\n ))}\n </div>\n );\n}\n", "import { Badge } from \"../atoms/badge.js\";\nimport { RangeInput } from \"../atoms/range-input.js\";\nimport { Separator } from \"../atoms/separator.js\";\nimport { ToolButton } from \"../atoms/tool-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { STAMP_SHAPES } from \"../lib/catalog.js\";\nimport { rigById, targetBone } from \"../lib/scene.js\";\nimport { ModePill } from \"../molecules/mode-pill.js\";\nimport { ScrollRow } from \"../molecules/scroll-row.js\";\nimport { Toolbar } from \"../molecules/toolbar.js\";\nimport { ToolbarPill } from \"../molecules/toolbar-pill.js\";\n\n/** Sculpt Stamps: the ten shapes; inside a sculpt also the smear brush, blend, CSG mode and part mirror. */\nexport function StampBar() {\n const { view, update, actions, toast, creation, dispatch } = useEditor();\n const sculpting = view.mode === \"sculpt\";\n const rig = targetBone(view.scope) !== undefined ? rigById(creation, view.scope?.objectId) : undefined;\n return (\n <Toolbar id=\"sub-shape\" label=\"Sculpt Stamps\" sub>\n <ScrollRow label=\"Stamp shapes\">\n {STAMP_SHAPES.map((shape) => (\n <ToolButton\n key={shape.id}\n id={`btn-shape-${shape.id}`}\n icon={shape.icon}\n tooltip={`${shape.name} Stamp`}\n background={shape.bg}\n active={view.brush.shape === shape.id && view.tool === \"stamp\"}\n onClick={() => {\n update((current) => ({ ...current, tool: \"stamp\", brush: { ...current.brush, shape: shape.id } }));\n toast(`${shape.name.toUpperCase()} Stamp Selected`);\n }}\n />\n ))}\n </ScrollRow>\n {sculpting ? (\n <>\n <div className=\"tb-section\">\n <Separator />\n <ToolButton\n id=\"btn-smear-mode\"\n icon=\"spray-can\"\n tooltip=\"Smear Brush\"\n background=\"#fef3c7\"\n active={view.brush.smear}\n onClick={() => {\n const smear = !view.brush.smear;\n update((current) => ({ ...current, brush: { ...current.brush, smear } }));\n toast(smear ? \"Smear Brush Enabled\" : \"Single Stamp Mode\");\n }}\n />\n </div>\n <div className=\"tb-section\">\n <Separator />\n <ToolbarPill label=\"Blend\">\n <RangeInput\n label=\"Brush blend\"\n value={view.brush.blend}\n min={0}\n max={0.8}\n step={0.05}\n onCommit={(blend) => update((current) => ({ ...current, brush: { ...current.brush, blend } }))}\n />\n </ToolbarPill>\n <ModePill value={view.brush.mode} onChange={actions.setBrushMode} />\n {rig ? (\n <Badge\n id=\"btn-mirror-sculpt\"\n icon=\"left-right\"\n label=\"Mirror\"\n active={rig.rig.mirror}\n onClick={() => dispatch({ type: \"SetRigMirror\", payload: { rigId: rig.id, mirror: !rig.rig.mirror } })}\n />\n ) : null}\n </div>\n </>\n ) : null}\n </Toolbar>\n );\n}\n", "import type { SymmetryAxis } from \"@dreamy/api\";\n\n/** The axes in x, y, z order with one toggled. */\nexport function toggleAxis(axes: readonly SymmetryAxis[], axis: SymmetryAxis): readonly SymmetryAxis[] {\n const next = axes.includes(axis) ? axes.filter((entry) => entry !== axis) : [...axes, axis];\n return ([\"x\", \"y\", \"z\"] as const).filter((entry) => next.includes(entry));\n}\n\n/** \"Off\" / \"Y (default)\" when no axis is chosen, blank once one is. */\nexport function symmetryHint(count: number, axes: readonly SymmetryAxis[]): string {\n if (axes.length) return \"\";\n return count > 1 ? \"Y (default)\" : \"Off\";\n}\n", "import type { SymmetryAxis } from \"@dreamy/api\";\nimport { PillButton } from \"../atoms/pill-button.js\";\n\nexport type AxisPillProps = {\n readonly axes: readonly SymmetryAxis[];\n readonly onToggle: (axis: SymmetryAxis) => void;\n};\n\n/** The X / Y / Z kaleidoscope axis toggles. */\nexport function AxisPill({ axes, onToggle }: AxisPillProps) {\n return (\n <div className=\"sculpt-mode-pill\" role=\"group\" aria-label=\"Axes\">\n {([\"x\", \"y\", \"z\"] as const).map((axis) => (\n <PillButton\n key={axis}\n title={`${axis.toUpperCase()} axis (N=2 mirrors, N>2 rotates)`}\n active={axes.includes(axis)}\n onClick={() => onToggle(axis)}\n >\n {axis.toUpperCase()}\n </PillButton>\n ))}\n </div>\n );\n}\n", "import { Icon } from \"../atoms/icon.js\";\nimport { PillButton } from \"../atoms/pill-button.js\";\n\nexport type CountStepperProps = {\n readonly label: string;\n readonly value: number;\n readonly min: number;\n readonly max: number;\n readonly onChange: (value: number) => void;\n};\n\n/** \u2212 n + */\nexport function CountStepper({ label, value, min, max, onChange }: CountStepperProps) {\n return (\n <>\n <PillButton title={`Fewer ${label}`} disabled={value <= min} onClick={() => onChange(Math.max(min, value - 1))}>\n <Icon icon=\"minus\" />\n </PillButton>\n <span className=\"hex-chip\" aria-label={label}>\n {value}\n </span>\n <PillButton title={`More ${label}`} disabled={value >= max} onClick={() => onChange(Math.min(max, value + 1))}>\n <Icon icon=\"plus\" />\n </PillButton>\n </>\n );\n}\n", "import type { PaletteSlot, Rgb } from \"@dreamy/api\";\nimport { ActionButton } from \"../atoms/action-button.js\";\nimport { Checkbox } from \"../atoms/checkbox.js\";\nimport { MatchButton } from \"../atoms/match-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { SYMMETRY_MAX, stampShapeInfo } from \"../lib/catalog.js\";\nimport { sculptOf } from \"../lib/scene.js\";\nimport { symmetryHint, toggleAxis } from \"../lib/symmetry.js\";\nimport { stampPropsCommand, stampSettings } from \"../lib/targets.js\";\nimport { sheetHidden, withSheet } from \"../lib/view-state.js\";\nimport { AxisPill } from \"../molecules/axis-pill.js\";\nimport { ColorField } from \"../molecules/color-field.js\";\nimport { CountStepper } from \"../molecules/count-stepper.js\";\nimport { FloatingPanel } from \"../molecules/floating-panel.js\";\nimport { ModePill } from \"../molecules/mode-pill.js\";\nimport { SliderRow } from \"../molecules/slider-row.js\";\n\n/** Settings of the selected shape or smear group: mode, colors, blend, kaleidoscope, lock, material overrides. */\nexport function StampPropsPanel() {\n const { view, update, creation, dispatch, actions, compact, toast } = useEditor();\n if (!view.open.stampProps) return null;\n const settings = stampSettings(creation, view);\n const sculpt = sculptOf(creation, view.scope);\n if (!settings || !sculpt) return null;\n const isGroup = settings.kind === \"group\";\n const groupSelected = isGroup && settings.stamps.length > 1;\n if (!isGroup && settings.stamps.length > 1) return null;\n const stamp = settings.stamps[0];\n if (!stamp) return null;\n const owner = isGroup ? settings.group : stamp;\n const look = sculpt.look;\n const index = sculpt.stamps.indexOf(stamp) + 1;\n const shapeName = stampShapeInfo(stamp.shape).name;\n const title = groupSelected\n ? `${settings.group.name} (${settings.stamps.length} shapes)`\n : isGroup\n ? `${settings.group.name} \u00B7 ${shapeName} ${index}`\n : `${shapeName} ${index}`;\n const set = (props: Parameters<typeof stampPropsCommand>[1]) => dispatch(stampPropsCommand(settings, props));\n const editSlot = (slot: PaletteSlot, color: Rgb) => dispatch({ type: \"SetPaletteColor\", payload: { slot, color } });\n const color = owner.color ?? look.color;\n const symmetry = owner.symmetry ?? { count: 1, axes: [] };\n const material = isGroup ? undefined : stamp.material;\n const channel = (key: \"roughness\" | \"metalness\" | \"glow\") => material?.[key];\n\n return (\n <FloatingPanel\n id=\"stamp-props\"\n title={title}\n sheetHidden={sheetHidden(view, compact, \"stampProps\")}\n draggable={!compact}\n style={view.minimized.shapes ? { left: 86 } : undefined}\n onClose={() => update((current) => withSheet(current, \"stampProps\", false))}\n >\n <div className=\"sp-body\">\n <label>Mode</label>\n <div style={{ alignSelf: \"flex-start\" }}>\n <ModePill value={owner.mode} onChange={(mode) => set({ mode })} />\n </div>\n <ColorField label=\"Color\" palette={creation.palette} value={color} onPick={(next) => set({ color: next })} onEditSlot={editSlot} />\n <ColorField\n label=\"Foundation\"\n palette={creation.palette}\n value={owner.foundationColor ?? color}\n extra={\n <MatchButton icon=\"magic\" onClick={() => set({ foundationColor: null })}>\n Match\n </MatchButton>\n }\n onPick={(foundationColor) => set({ foundationColor })}\n onEditSlot={editSlot}\n />\n <SliderRow label=\"Blend\" value={owner.blend ?? look.blend} min={0} max={0.8} step={0.05} onCommit={(blend) => set({ blend })} />\n <label>\n Kaleidoscope <span className=\"sym-hint\">{symmetryHint(symmetry.count, symmetry.axes) || symmetry.count}</span>\n </label>\n <div className=\"sym-row\">\n <CountStepper label=\"copies\" value={symmetry.count} min={1} max={SYMMETRY_MAX} onChange={(count) => set({ symmetry: { ...symmetry, count } })} />\n <AxisPill axes={symmetry.axes} onToggle={(axis) => set({ symmetry: { ...symmetry, axes: toggleAxis(symmetry.axes, axis) } })} />\n </div>\n <ActionButton\n variant=\"sp-lock\"\n icon=\"layer-group\"\n onClick={() => {\n if (dispatch({ type: \"SetSymmetryForAll\", payload: { target: settings.target, symmetry } })) toast(\"Symmetry applied to all shapes\");\n }}\n >\n Apply to all shapes\n </ActionButton>\n {isGroup ? (\n <div className=\"rig-actions\">\n <ActionButton\n variant=\"sp-lock\"\n icon={settings.group.unlocked ? \"lock\" : \"lock-open\"}\n onClick={() => dispatch({ type: \"SetSmearGroup\", payload: { target: settings.target, groupId: settings.group.id, props: { unlocked: !settings.group.unlocked } } })}\n >\n {settings.group.unlocked ? \"Lock group\" : \"Unlock shapes\"}\n </ActionButton>\n </div>\n ) : null}\n {!isGroup ? (\n <>\n <label>\n Material{\" \"}\n <MatchButton\n icon=\"rotate-left\"\n onClick={() => {\n if (set({ material: null })) toast(\"Shape material follows the object again\");\n }}\n >\n Inherit\n </MatchButton>\n </label>\n <SliderRow\n label=\"Roughness\"\n value={channel(\"roughness\") ?? look.material.roughness}\n own={channel(\"roughness\") !== undefined}\n min={0}\n max={1}\n step={0.05}\n onCommit={(roughness) => set({ material: { ...material, roughness } })}\n />\n <SliderRow\n label=\"Metalness\"\n value={channel(\"metalness\") ?? look.material.metalness}\n own={channel(\"metalness\") !== undefined}\n min={0}\n max={1}\n step={0.05}\n onCommit={(metalness) => set({ material: { ...material, metalness } })}\n />\n <SliderRow\n label=\"Glow\"\n value={channel(\"glow\") ?? look.material.glow}\n own={channel(\"glow\") !== undefined}\n min={0}\n max={3}\n step={0.05}\n onCommit={(glow) => set({ material: { ...material, glow } })}\n />\n <label style={{ alignItems: \"center\" }}>\n Flecks\n <Checkbox checked={material?.flecks ?? true} label=\"Flecks\" onChange={(flecks) => set({ material: { ...material, flecks } })} />\n </label>\n </>\n ) : null}\n <ActionButton variant=\"sp-delete\" icon=\"trash-alt\" onClick={actions.deleteSelection}>\n {groupSelected ? \"Delete group\" : \"Delete shape\"}\n </ActionButton>\n </div>\n </FloatingPanel>\n );\n}\n", "import { RangeInput } from \"../atoms/range-input.js\";\nimport { SideButton } from \"../atoms/side-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { SIZE_MAX, SIZE_MIN } from \"../lib/catalog.js\";\n\n/** The size of the stamp (or decal) brush: + / \u2212 buttons and a slider, while one of those tools is up. */\nexport function StampSizePanel({ sheetOpen }: { readonly sheetOpen: boolean }) {\n const { view, actions } = useEditor();\n if (sheetOpen || view.play || (view.tool !== \"stamp\" && view.tool !== \"decal\")) return null;\n const size = view.tool === \"decal\" ? view.decalBrush.size : view.brush.size;\n return (\n <div id=\"stamp-size-panel\">\n <SideButton id=\"stamp-size-up\" icon=\"plus\" tooltip=\"Larger (+)\" onClick={() => actions.resize(1)} />\n <RangeInput id=\"stamp-size-v\" label=\"Brush size\" value={size} min={SIZE_MIN} max={SIZE_MAX} step={0.05} onCommit={actions.setSize} />\n <SideButton id=\"stamp-size-down\" icon=\"minus\" tooltip=\"Smaller (-)\" onClick={() => actions.resize(-1)} />\n <span id=\"stamp-size-val\">{size.toFixed(2)}</span>\n </div>\n );\n}\n", "import { useEditor } from \"../hooks/editor-context.js\";\n\n/** FPS, triangles, mesh time and LOD counts from the viewport (Utilities: Stats). */\nexport function StatsBadge() {\n const { view, stats } = useEditor();\n if (!view.prefs.stats) return null;\n return (\n <div id=\"stats-display\" className=\"stats-display\">\n <div id=\"fps-badge\" style={{ fontFamily: \"monospace\" }}>\n {stats || \"FPS: -- | Tri: 0\"}\n </div>\n </div>\n );\n}\n", "import { ColorInput } from \"../atoms/color-input.js\";\nimport { HexChip } from \"../atoms/hex-chip.js\";\nimport { Separator } from \"../atoms/separator.js\";\nimport { ToolButton } from \"../atoms/tool-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { QUICK_FLECKS } from \"../lib/catalog.js\";\nimport { COLOR_NAMES, isFixedColor, refHex } from \"../lib/colors.js\";\nimport { lookTargets } from \"../lib/targets.js\";\nimport { SwatchRow } from \"../molecules/swatch-row.js\";\nimport { Toolbar } from \"../molecules/toolbar.js\";\n\n/** Fleck Style: the brush color (never the selection's) and quick fleck shapes for the selection. */\nexport function StyleBar() {\n const { view, update, creation, dispatch, toast } = useEditor();\n const brushColor = view.brush.color;\n const hex = refHex(creation.palette, brushColor);\n return (\n <Toolbar id=\"sub-style\" label=\"Fleck Style\" sub>\n <SwatchRow\n palette={creation.palette}\n active={brushColor}\n size={30}\n label=\"Brush color\"\n onPick={(color) => update((current) => ({ ...current, brush: { ...current.brush, color } }))}\n />\n <div className=\"brush-color-chip\">\n <ColorInput\n className=\"slot-picker sm\"\n value={hex}\n label={`Edit ${COLOR_NAMES[brushColor]}`}\n disabled={isFixedColor(brushColor)}\n onCommit={(color) => {\n if (!isFixedColor(brushColor)) dispatch({ type: \"SetPaletteColor\", payload: { slot: brushColor, color } });\n }}\n />\n <HexChip>{hex}</HexChip>\n </div>\n <Separator />\n {QUICK_FLECKS.map((fleck) => (\n <ToolButton\n key={fleck.id}\n icon={fleck.fa}\n tooltip={fleck.name}\n background=\"#fff\"\n onClick={() => {\n const targets = lookTargets(creation, view);\n if (!targets.length) {\n toast(\"Select an object first\");\n return;\n }\n dispatch({ type: \"SetSculptLook\", payload: { targets, look: { fleck: { shape: fleck.id } } } });\n }}\n />\n ))}\n </Toolbar>\n );\n}\n", "import { PillButton } from \"../atoms/pill-button.js\";\nimport { Separator } from \"../atoms/separator.js\";\nimport { ToolButton } from \"../atoms/tool-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { SYMMETRY_MAX } from \"../lib/catalog.js\";\nimport { averageVec, IDENTITY_QUATERNION, ZERO } from \"../lib/math.js\";\nimport { sculptOf } from \"../lib/scene.js\";\nimport { symmetryHint, toggleAxis } from \"../lib/symmetry.js\";\nimport { AxisPill } from \"../molecules/axis-pill.js\";\nimport { CountStepper } from \"../molecules/count-stepper.js\";\nimport { Toolbar } from \"../molecules/toolbar.js\";\nimport { ToolbarPill } from \"../molecules/toolbar-pill.js\";\n\n/** Symmetry: the kaleidoscope defaults new shapes inherit, and the sculpt's pivot. */\nexport function SymmetryBar() {\n const { view, update, creation, dispatch, toast } = useEditor();\n const symmetry = view.brush.symmetry;\n const setSymmetry = (next: typeof symmetry) => update((current) => ({ ...current, brush: { ...current.brush, symmetry: next } }));\n const scope = view.scope;\n const sculpt = sculptOf(creation, scope);\n return (\n <Toolbar id=\"sub-symmetry\" label=\"Symmetry\" sub>\n <ToolbarPill label=\"Copies\">\n <CountStepper label=\"copies\" value={symmetry.count} min={1} max={SYMMETRY_MAX} onChange={(count) => setSymmetry({ ...symmetry, count })} />\n </ToolbarPill>\n <Separator />\n <AxisPill axes={symmetry.axes} onToggle={(axis) => setSymmetry({ ...symmetry, axes: toggleAxis(symmetry.axes, axis) })} />\n <span className=\"sym-note\">{symmetryHint(symmetry.count, symmetry.axes)}</span>\n <Separator />\n <ToolButton\n id=\"btn-pivot-edit\"\n icon=\"bullseye\"\n tooltip=\"Edit Pivot\"\n background=\"#e9d5ff\"\n active={view.tool === \"pivot\"}\n onClick={() =>\n update((current) => {\n const tool = current.tool === \"pivot\" ? \"select\" : \"pivot\";\n return { ...current, tool, transformTool: tool };\n })\n }\n />\n <div className=\"sculpt-mode-pill\" id=\"pivot-gizmo-pill\" role=\"group\" aria-label=\"Pivot gizmo mode\" title=\"Pivot gizmo mode\">\n {([\"translate\", \"rotate\"] as const).map((mode) => (\n <PillButton\n key={mode}\n title={mode === \"translate\" ? \"Move the pivot\" : \"Turn the pivot\"}\n active={view.pivotGizmo === mode}\n onClick={() => update((current) => ({ ...current, pivotGizmo: mode }))}\n >\n <i className={`fas fa-${mode === \"translate\" ? \"arrows-alt\" : \"sync-alt\"}`} />\n </PillButton>\n ))}\n </div>\n <ToolButton\n icon=\"rotate-left\"\n tooltip=\"Reset Pivot\"\n background=\"#fff\"\n onClick={() => {\n if (scope && dispatch({ type: \"SetPivot\", payload: { target: scope, pivot: { position: ZERO, rotation: IDENTITY_QUATERNION } } })) {\n toast(\"Pivot Reset\");\n }\n }}\n />\n <ToolButton\n icon=\"crosshairs\"\n tooltip=\"Pivot to Selection\"\n background=\"#fff\"\n onClick={() => {\n const stamps = sculpt?.stamps.filter((stamp) => view.selection.stampIds.includes(stamp.id)) ?? [];\n if (!scope || !sculpt || !stamps.length) {\n toast(\"Select a shape first\");\n return;\n }\n dispatch({\n type: \"SetPivot\",\n payload: { target: scope, pivot: { position: averageVec(stamps.map((stamp) => stamp.position)), rotation: sculpt.pivot.rotation } },\n });\n }}\n />\n <span className=\"sym-note\">New shapes inherit these</span>\n </Toolbar>\n );\n}\n", "import { useEffect, useState } from \"react\";\nimport { useEditor } from \"../hooks/editor-context.js\";\n\nconst TOAST_MS = 2200;\n\n/** The single toast at the bottom (top in the compact layout). */\nexport function Toast() {\n const { toastMessage } = useEditor();\n const [shown, setShown] = useState(false);\n useEffect(() => {\n if (!toastMessage) return;\n setShown(true);\n const timer = setTimeout(() => setShown(false), TOAST_MS);\n return () => clearTimeout(timer);\n }, [toastMessage]);\n return (\n <div id=\"toast\" role=\"status\" aria-live=\"polite\" className={shown ? \"show\" : undefined}>\n {toastMessage?.text ?? \"\"}\n </div>\n );\n}\n", "import { Badge } from \"../atoms/badge.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\n\n/** Touch stand-ins for Shift (area select, one shot) and Ctrl (add to selection); drawn in the compact layout. */\nexport function TouchMods() {\n const { view, update } = useEditor();\n const show = view.tool === \"select\" && view.category === \"transform\" && !view.play;\n return (\n <div id=\"touch-mods\" className={show ? \"show\" : undefined}>\n <Badge id=\"btn-touch-area\" icon=\"vector-square\" label=\"Area\" active={view.touchArea} onClick={() => update((current) => ({ ...current, touchArea: !current.touchArea }))} />\n <Badge id=\"btn-touch-add\" icon=\"plus\" label=\"Add\" active={view.touchAdd} onClick={() => update((current) => ({ ...current, touchAdd: !current.touchAdd }))} />\n </div>\n );\n}\n", "import { Icon } from \"../atoms/icon.js\";\nimport { Separator } from \"../atoms/separator.js\";\nimport { ToolButton } from \"../atoms/tool-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { sculptOf, stampSteps } from \"../lib/scene.js\";\nimport { isSculptScopeSymmetric, setTransformTool, type TransformTool } from \"../lib/view-state.js\";\nimport { Toolbar } from \"../molecules/toolbar.js\";\n\nconst TOOLS: readonly { readonly id: TransformTool; readonly name: string; readonly icon: string; readonly bg: string }[] = [\n { id: \"select\", name: \"Select\", icon: \"mouse-pointer\", bg: \"#e0f2fe\" },\n { id: \"translate\", name: \"Move\", icon: \"up-down-left-right\", bg: \"#bae6fd\" },\n { id: \"rotate\", name: \"Rotate\", icon: \"sync-alt\", bg: \"#7dd3fc\" },\n { id: \"scale\", name: \"Scale\", icon: \"expand-arrows-alt\", bg: \"#38bdf8\" },\n { id: \"pivot\", name: \"Pivot\", icon: \"bullseye\", bg: \"#e9d5ff\" },\n];\n\n/** Transform: select / gizmo tools, world or local, the stamp stepper, mirror, duplicate, delete. */\nexport function TransformBar() {\n const { view, update, actions, creation, toast } = useEditor();\n const sculpt = view.mode === \"sculpt\" ? sculptOf(creation, view.scope) : undefined;\n const steps = sculpt ? stampSteps(sculpt) : [];\n const position = Math.max(0, steps.findIndex((step) => step.some((id) => view.selection.stampIds.includes(id))));\n const many = sculpt && view.selection.stampIds.length > 1 && !steps.some((step) => step.length === view.selection.stampIds.length && step.every((id) => view.selection.stampIds.includes(id)));\n const step = (delta: number) => {\n const next = steps[(position + delta + steps.length) % steps.length];\n if (next) update((current) => ({ ...current, selection: { ...current.selection, stampIds: next } }));\n };\n const isGroup = sculpt && (steps[position]?.length ?? 0) > 1;\n return (\n <Toolbar id=\"sub-transform\" label=\"Transform\" sub>\n {TOOLS.filter((tool) => tool.id !== \"pivot\" || isSculptScopeSymmetric(view)).map((tool) => (\n <ToolButton\n key={tool.id}\n id={`tool-${tool.id}`}\n icon={tool.icon}\n tooltip={tool.name}\n background={tool.bg}\n active={view.tool === tool.id}\n onClick={() => update((current) => setTransformTool(current, tool.id))}\n />\n ))}\n <Separator />\n <ToolButton\n id=\"tool-space-toggle\"\n icon={view.space === \"world\" ? \"globe\" : \"cube\"}\n tooltip=\"World / Local\"\n background=\"#f1f5f9\"\n onClick={() => {\n const space = view.space === \"world\" ? \"local\" : \"world\";\n update((current) => ({ ...current, space }));\n toast(`Gizmo Space: ${space.toUpperCase()}`);\n }}\n />\n {sculpt && steps.length ? (\n <div id=\"stamp-nav-stepper\" className=\"stamp-stepper\">\n <button type=\"button\" className=\"stepper-btn\" aria-label=\"Previous shape\" onClick={() => step(-1)}>\n <Icon icon=\"chevron-left\" />\n </button>\n <span id=\"stamp-counter-text\">\n {many ? `${view.selection.stampIds.length} selected` : `${isGroup ? \"Group\" : \"Stamp\"} ${position + 1}/${steps.length}`}\n </span>\n <button type=\"button\" className=\"stepper-btn\" aria-label=\"Next shape\" onClick={() => step(1)}>\n <Icon icon=\"chevron-right\" />\n </button>\n </div>\n ) : null}\n <Separator />\n <ToolButton icon=\"arrows-left-right\" tooltip=\"Mirror Horizontal\" background=\"#fff\" onClick={() => actions.mirror(\"x\")} />\n <ToolButton icon=\"arrows-up-down\" tooltip=\"Mirror Vertical\" background=\"#fff\" onClick={() => actions.mirror(\"z\")} />\n <ToolButton icon=\"clone\" tooltip=\"Duplicate\" background=\"#fff\" onClick={actions.duplicate} />\n <Separator />\n <ToolButton icon=\"trash-alt\" tooltip=\"Delete\" background=\"#fca5a5\" color=\"white\" onClick={actions.deleteSelection} />\n </Toolbar>\n );\n}\n", "import { Separator } from \"../atoms/separator.js\";\nimport { ToolButton } from \"../atoms/tool-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { withSheet } from \"../lib/view-state.js\";\nimport { Toolbar } from \"../molecules/toolbar.js\";\n\n/** Utilities: stress test, play mode, palette, voxel resolution, hints, help, stats. */\nexport function UtilitiesBar() {\n const { view, update, actions, setPrefs } = useEditor();\n return (\n <Toolbar id=\"sub-utilities\" label=\"Utilities\" sub>\n <ToolButton\n id=\"btn-stress-test\"\n icon={view.stressTest ? \"stop\" : \"bolt\"}\n tooltip={view.stressTest ? \"Stop Stress\" : \"Stress Test\"}\n {...(view.stressTest ? { background: \"#f97316\", color: \"#fff\" } : {})}\n onClick={actions.toggleStress}\n />\n <ToolButton\n id=\"btn-playmode\"\n icon={view.play ? \"stop\" : \"play\"}\n tooltip={view.play ? \"Edit Mode\" : \"Play Mode\"}\n active={view.play}\n activeClass=\"play-active\"\n onClick={actions.togglePlay}\n />\n <ToolButton id=\"btn-palette\" icon=\"palette\" tooltip=\"Palette\" active={view.open.palette} onClick={() => update((current) => withSheet(current, \"palette\", !current.open.palette))} />\n <ToolButton id=\"btn-voxel-res\" icon=\"cubes-stacked\" tooltip=\"Voxel Res\" active={view.open.voxel} onClick={() => update((current) => withSheet(current, \"voxel\", !current.open.voxel))} />\n <ToolButton id=\"btn-hints\" icon=\"lightbulb\" tooltip=\"Hints\" active={view.prefs.hints} activeClass=\"play-active\" onClick={actions.toggleHints} />\n <ToolButton id=\"btn-help\" icon=\"circle-question\" tooltip=\"Help\" active={view.open.help} onClick={() => actions.toggleHelp()} />\n <Separator />\n <ToolButton\n id=\"btn-stats-toggle\"\n icon=\"chart-line\"\n tooltip=\"Stats\"\n active={view.prefs.stats}\n activeClass=\"play-active\"\n onClick={() => setPrefs({ stats: !view.prefs.stats })}\n />\n </Toolbar>\n );\n}\n", "import { useEffect, useMemo, useRef } from \"react\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { viewSession } from \"../lib/view-state.js\";\n\n/** The host element the injected viewport draws into; sends it the creation and the session on every change. */\nexport function ViewportHost() {\n const { viewport, callbacks, creation, view } = useEditor();\n const host = useRef<HTMLDivElement>(null);\n const callbacksRef = useRef(callbacks);\n callbacksRef.current = callbacks;\n\n useEffect(() => {\n const element = host.current;\n if (!element) return;\n viewport.mount(element, {\n command: (command) => callbacksRef.current.command(command),\n select: (selection) => callbacksRef.current.select(selection),\n focus: (objectId) => callbacksRef.current.focus(objectId),\n scopeOut: () => callbacksRef.current.scopeOut(),\n toast: (message) => callbacksRef.current.toast(message),\n stats: (text) => callbacksRef.current.stats(text),\n });\n return () => viewport.dispose();\n }, [viewport]);\n\n const session = useMemo(\n () => viewSession(view),\n [\n view.mode,\n view.scope,\n view.selection,\n view.tool,\n view.space,\n view.brush,\n view.decalBrush,\n view.boneTool,\n view.category,\n view.touchArea,\n view.touchAdd,\n view.prefs,\n view.play,\n view.stressTest,\n ],\n );\n\n useEffect(() => {\n viewport.update(creation, session);\n }, [viewport, creation, session]);\n\n return <div id=\"canvas-container\" ref={host} />;\n}\n", "import { MatchButton } from \"../atoms/match-button.js\";\nimport { useEditor } from \"../hooks/editor-context.js\";\nimport { sheetHidden, withSheet } from \"../lib/view-state.js\";\nimport { FloatingPanel } from \"../molecules/floating-panel.js\";\nimport { SliderRow } from \"../molecules/slider-row.js\";\n\nconst PRESETS = [\n { value: 24, name: \"24 Low\" },\n { value: 36, name: \"36 Mid\" },\n { value: 48, name: \"48 High\" },\n { value: 64, name: \"64 Ultra\" },\n];\n\n/** The mesher's base voxel resolution (a view preference). */\nexport function VoxelPanel() {\n const { view, update, setPrefs, compact } = useEditor();\n if (!view.open.voxel) return null;\n return (\n <FloatingPanel\n id=\"voxel-panel\"\n className=\"glass-panel\"\n icon=\"cubes-stacked\"\n title=\"Voxel Resolution\"\n sheetHidden={sheetHidden(view, compact, \"voxel\")}\n draggable={!compact}\n onClose={() => update((current) => withSheet(current, \"voxel\", false))}\n >\n <div className=\"sp-body\">\n <SliderRow\n label=\"Base Resolution\"\n value={view.prefs.voxelResolution}\n min={16}\n max={64}\n step={2}\n digits={0}\n onCommit={(voxelResolution) => setPrefs({ voxelResolution })}\n />\n <div className=\"voxel-presets\">\n {PRESETS.map((preset) => (\n <MatchButton key={preset.value} active={view.prefs.voxelResolution === preset.value} onClick={() => setPrefs({ voxelResolution: preset.value })}>\n {preset.name}\n </MatchButton>\n ))}\n </div>\n <span className=\"panel-note\">\n Controls the grid density for sculpt objects. Higher values produce crisper surfaces and higher polygon counts.\n </span>\n </div>\n </FloatingPanel>\n );\n}\n", "\"use client\";\n\nimport type { CreationApi, CreationLog, Id, Persistence, PreferencesStore, Viewport } from \"@dreamy/api\";\nimport { createCreationApi } from \"@dreamy/core\";\nimport { createEvaluator } from \"@dreamy/evaluator\";\nimport { EditorPage } from \"@dreamy/module\";\nimport { createViewport } from \"@dreamy/viewport\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { browserFiles } from \"./browser-files.js\";\nimport { clock } from \"./clock.js\";\nimport { EMPTY_LOG } from \"./creation-file.js\";\nimport { connectRemote } from \"./git-remote.js\";\nimport { createGitSync, withSyncSchedule, type GitSync } from \"./git-sync.js\";\nimport { createIds } from \"./ids.js\";\nimport { createIndexedDbLibrary } from \"./indexed-db-library.js\";\nimport { createLibraryPersistence, type LibraryDatabase } from \"./library-persistence.js\";\nimport { createPreferencesStore, type KeyValueStorage } from \"./preferences.js\";\nimport { seedFirstSculpt } from \"./seed.js\";\n\ntype Session = { readonly id: Id; readonly api: CreationApi };\n\n/** How long the first pull may hold the studio before it opens the local library. */\nconst STARTUP_SYNC_MS = 6000;\n\nexport type DreamyStudioProps = {\n /** Where the library of creations lives. Default: this browser's IndexedDB (\"dreamy-studio\" database). */\n readonly database?: LibraryDatabase;\n /** Key-value storage for view preferences and git settings. Default: localStorage. */\n readonly storage?: KeyValueStorage;\n /** Offer git sync of the library (Scenes \u2192 Git). Default: true. */\n readonly gitSync?: boolean;\n /** Called once: the evaluator core is loaded, the creation is open and the studio has painted. */\n readonly onReady?: () => void;\n};\n\n/**\n * The Dreamy studio: core, module, evaluator, viewport, persistence, git sync, preferences, ids and clock.\n * It fills the page (fixed, full viewport); render one per page, client-side only.\n */\nexport function DreamyStudio({ database: injected, storage: injectedStorage, gitSync = true, onReady }: DreamyStudioProps) {\n const openId = useRef<Id | undefined>(undefined);\n const storage = useMemo(() => injectedStorage ?? safeLocalStorage(), [injectedStorage]);\n const { persistence, sync } = useMemo(() => {\n const database = injected ?? createIndexedDbLibrary();\n const newId = () => crypto.randomUUID();\n const now = () => clock.now();\n const gitSync = createGitSync({\n database,\n storage,\n connect: (settings) => connectRemote(settings, (url, init) => fetch(url, init)),\n newId,\n now,\n openId: () => openId.current,\n });\n const library = createLibraryPersistence({ database, files: browserFiles(), newId, now });\n return { persistence: withSyncSchedule(library, gitSync), sync: gitSync };\n }, [injected, storage]);\n const preferences = useMemo<PreferencesStore>(() => createPreferencesStore(storage), [storage]);\n const { viewport, coreReady } = useViewport();\n const [session, setSession] = useState<Session | undefined>(undefined);\n // StrictMode runs this effect twice: share one opening, or an empty library gets two seeded scenes\n const opening = useRef<Promise<Session> | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n opening.current ??= startupSync(sync).then(() => openSession(persistence, openId));\n void opening.current.then((next) => {\n if (!cancelled) setSession(next);\n });\n return () => {\n cancelled = true;\n };\n }, [persistence, sync]);\n\n useFlushOnHide(sync);\n useReady(Boolean(session && viewport && coreReady), onReady);\n\n if (!session || !viewport) return <p className=\"studio-loading\">Loading\u2026</p>;\n\n return (\n <EditorPage\n key={session.id}\n api={session.api}\n viewport={viewport}\n persistence={persistence}\n preferences={preferences}\n creationId={session.id}\n {...(gitSync ? { sync } : {})}\n onOpen={(id) => {\n void openSession(persistence, openId, id).then(setSession);\n }}\n />\n );\n}\n\n/** Pulls before the first scene opens (the welcome screen covers it), but never waits long for the network. */\nasync function startupSync(sync: GitSync): Promise<void> {\n if (!sync.connected) return;\n let timer: ReturnType<typeof setTimeout> | undefined;\n await Promise.race([\n sync.syncNow().catch(() => undefined),\n new Promise<void>((resolve) => (timer = setTimeout(resolve, STARTUP_SYNC_MS))),\n ]);\n clearTimeout(timer);\n}\n\n/** A push waiting for its delay goes out when the tab is hidden (best effort). */\nfunction useFlushOnHide(sync: GitSync): void {\n useEffect(() => {\n const onHide = () => {\n if (document.visibilityState === \"hidden\") sync.flush();\n };\n document.addEventListener(\"visibilitychange\", onHide);\n return () => document.removeEventListener(\"visibilitychange\", onHide);\n }, [sync]);\n}\n\n/** Calls `onReady` once the studio has painted its first frame. */\nfunction useReady(ready: boolean, onReady: (() => void) | undefined): void {\n const called = useRef(false);\n const callback = useRef(onReady);\n callback.current = onReady;\n useEffect(() => {\n if (!ready || called.current) return;\n const done = () => {\n if (called.current) return;\n called.current = true;\n callback.current?.();\n };\n let inner = 0;\n const frame = requestAnimationFrame(() => (inner = requestAnimationFrame(done)));\n // Frames don't run in a hidden or offscreen page: don't let `onReady` wait on them\n const fallback = setTimeout(done, 250);\n return () => {\n cancelAnimationFrame(frame);\n cancelAnimationFrame(inner);\n clearTimeout(fallback);\n };\n }, [ready]);\n}\n\n/**\n * One evaluator (WASM in a Worker) and one viewport per mount; both are disposed when the studio unmounts.\n * `coreReady` turns true once the evaluator's core (WASM, or the TS fallback) has loaded.\n */\nfunction useViewport(): { viewport: Viewport | undefined; coreReady: boolean } {\n const [viewport, setViewport] = useState<Viewport | undefined>(undefined);\n const [coreReady, setCoreReady] = useState(false);\n useEffect(() => {\n let live = true;\n const evaluator = createEvaluator();\n const view = createViewport({ evaluator });\n setViewport(view);\n void evaluator.ready.then(() => {\n if (live) setCoreReady(true);\n });\n return () => {\n live = false;\n view.dispose();\n evaluator.dispose();\n setViewport(undefined);\n };\n }, []);\n return { viewport, coreReady };\n}\n\nasync function openSession(persistence: Persistence, openId: { current: Id | undefined }, id?: Id): Promise<Session> {\n const target = id ?? (await persistence.current());\n // Claimed before the load: a background sync must not replace the record the editor is about to show\n openId.current = target;\n const loaded = target ? await persistence.load(target) : undefined;\n if (target && loaded) {\n await persistence.open(target);\n return { id: target, api: apiFor(loaded) };\n }\n const api = apiFor(EMPTY_LOG);\n seedFirstSculpt(api);\n const created = await persistence.create(\"Untitled scene\", api.log());\n openId.current = created;\n await persistence.open(created);\n return { id: created, api };\n}\n\nfunction apiFor(log: CreationLog): CreationApi {\n return createCreationApi({ ids: createIds(log), clock, log });\n}\n\nfunction safeLocalStorage(): Storage | undefined {\n try {\n return window.localStorage;\n } catch {\n return undefined;\n }\n}\n", "import type { FileAccess } from \"./library-persistence.js\";\n\n/** Download through a temporary link; pick through a hidden file input. */\nexport function browserFiles(): FileAccess {\n return {\n download(fileName, text) {\n const url = URL.createObjectURL(new Blob([text], { type: \"application/json\" }));\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileName;\n document.body.appendChild(link);\n link.click();\n link.remove();\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n },\n pick() {\n return new Promise((resolve) => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".json,application/json\";\n input.addEventListener(\"change\", () => {\n const file = input.files?.[0];\n if (!file) return resolve(undefined);\n void file.text().then((text) => resolve({ fileName: file.name, text }));\n });\n input.addEventListener(\"cancel\", () => resolve(undefined));\n input.click();\n });\n },\n };\n}\n", "import type { Clock } from \"@dreamy/api\";\n\nexport const clock: Clock = {\n now() {\n return Date.now();\n },\n};\n", "import type { CreationLog } from \"@dreamy/api\";\n\nexport const EMPTY_LOG: CreationLog = { format: \"dreamy-studio\", schemaVersion: 1, events: [] };\n\n/** A log file is the format tag, the schema version and the events. */\nexport function serializeCreationLog(log: CreationLog): string {\n return JSON.stringify({ format: log.format, schemaVersion: log.schemaVersion, events: log.events });\n}\n\n/** Parses a file into a log, or undefined when it is not a log of this model (retired schemas included). */\nexport function parseCreationLog(text: string): CreationLog | undefined {\n let data: unknown;\n try {\n data = JSON.parse(text);\n } catch {\n return undefined;\n }\n if (typeof data !== \"object\" || data === null) return undefined;\n const value = data as { format?: unknown; schemaVersion?: unknown; events?: unknown };\n if (value.format !== \"dreamy-studio\" || value.schemaVersion !== 1 || !Array.isArray(value.events)) return undefined;\n return data as CreationLog;\n}\n\n/** \"My Bunny.dreamy.json\" -> \"My Bunny\". */\nexport function creationNameFromFile(fileName: string): string {\n const base = fileName.replace(/\\.json$/i, \"\").replace(/\\.dreamy$/i, \"\").trim();\n return base || \"Imported creation\";\n}\n\nexport function fileNameFor(name: string): string {\n const safe = name.replace(/[\\\\/:*?\"<>|]+/g, \"-\").trim() || \"creation\";\n return `${safe}.dreamy.json`;\n}\n\n/** A creation as a file in the save repository: the log plus its library entry. Import reads it too. */\nexport type CreationRecordFile = {\n readonly id: string;\n readonly name: string;\n readonly updatedAt: number;\n readonly thumbnail?: string;\n readonly log: CreationLog;\n};\n\n/** Keys in a fixed order, one event per line, so equal records give equal bytes (and git diffs stay small). */\nexport function serializeCreationRecord({ id, name, updatedAt, thumbnail, log }: CreationRecordFile): string {\n const head = JSON.stringify({ format: log.format, schemaVersion: log.schemaVersion, id, name, updatedAt, thumbnail });\n const events = log.events.map((event) => ` ${JSON.stringify(event)}`).join(\",\\n\");\n return `${head.slice(0, -1)},\"events\":[\\n${events}\\n]}\\n`;\n}\n\n/** A record file, or a plain scene file (named `fallbackName`). */\nexport function parseCreationRecord(text: string, id: string, fallbackName = \"Untitled scene\"): CreationRecordFile | undefined {\n const log = parseCreationLog(text);\n if (!log) return undefined;\n const value = log as unknown as { name?: unknown; updatedAt?: unknown; thumbnail?: unknown };\n const name = typeof value.name === \"string\" && value.name.trim() ? value.name : fallbackName;\n const updatedAt = typeof value.updatedAt === \"number\" && Number.isFinite(value.updatedAt) ? value.updatedAt : 0;\n const clean: CreationLog = { format: log.format, schemaVersion: log.schemaVersion, events: log.events };\n return typeof value.thumbnail === \"string\"\n ? { id, name, updatedAt, thumbnail: value.thumbnail, log: clean }\n : { id, name, updatedAt, log: clean };\n}\n", "import type { GitSettings } from \"@dreamy/api\";\n\n/** Every creation is one file under this folder of the save repository. */\nexport const CREATIONS_DIR = \"creations\";\nconst SUFFIX = \".dreamy.json\";\n\nexport const creationPath = (id: string): string => `${CREATIONS_DIR}/${id}${SUFFIX}`;\n\nexport function creationIdOf(path: string): string | undefined {\n if (!path.startsWith(`${CREATIONS_DIR}/`) || !path.endsWith(SUFFIX)) return undefined;\n const id = path.slice(CREATIONS_DIR.length + 1, -SUFFIX.length);\n return id && !id.includes(\"/\") ? id : undefined;\n}\n\n/** The branch head and the blob SHA of every creation file at that commit. */\nexport type RemoteSnapshot = {\n readonly head: string;\n readonly files: ReadonlyMap<string, string>;\n};\n\n/** A file to write, or to delete when `content` is absent. `exists` says whether the snapshot had it. */\nexport type FileChange = { readonly path: string; readonly exists: boolean; readonly content?: string };\n\n/** The branch moved since the snapshot: take a new snapshot and sync again. */\nexport class StaleRemoteError extends Error {\n override readonly name = \"StaleRemoteError\";\n}\n\n/** One branch of the save repository. */\nexport type GitRemote = {\n readonly user: string;\n /** \"owner/name\" as the provider shows it. */\n readonly repo: string;\n readonly branch: string;\n snapshot(): Promise<RemoteSnapshot>;\n read(path: string, sha: string): Promise<string>;\n /** One commit on top of `parent`; throws StaleRemoteError when the branch is no longer at `parent`. */\n commit(message: string, changes: readonly FileChange[], parent: string): Promise<void>;\n};\n\nexport type Fetch = (input: string, init?: RequestInit) => Promise<Response>;\n\nconst DESCRIPTION = \"Dreamy save files: one creation per file under creations/.\";\n\n/** Git's blob id: SHA-1 of \"blob <byte length>\\0\" + the bytes (as vite-react computes it for differential push). */\nexport async function gitBlobSha(text: string): Promise<string> {\n const body = new TextEncoder().encode(text);\n const header = new TextEncoder().encode(`blob ${body.byteLength}\\0`);\n const bytes = new Uint8Array(header.length + body.length);\n bytes.set(header, 0);\n bytes.set(body, header.length);\n const hash = new Uint8Array(await crypto.subtle.digest(\"SHA-1\", bytes));\n return Array.from(hash, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\n/** Verifies the token, finds or creates the repository and the branch, and returns the remote. */\nexport function connectRemote(settings: GitSettings, fetcher: Fetch): Promise<GitRemote> {\n return settings.provider === \"github\" ? connectGitHub(settings, fetcher) : connectGitLab(settings, fetcher);\n}\n\ntype Http = {\n <T>(path: string, init?: { method?: string; body?: unknown }): Promise<T>;\n /** Undefined on 404. */\n maybe<T>(path: string): Promise<T | undefined>;\n text(path: string): Promise<string>;\n};\n\nclass HttpError extends Error {\n constructor(\n readonly status: number,\n message: string,\n ) {\n super(message);\n }\n}\n\nfunction http(\n base: string,\n headers: Record<string, string>,\n fetcher: Fetch,\n explain: (status: number, detail: string, request: string) => string,\n): Http {\n const send = async (path: string, init?: { method?: string; body?: unknown }): Promise<Response> => {\n const res = await fetcher(`${base}${path}`, {\n method: init?.method ?? \"GET\",\n headers: init?.body === undefined ? headers : { ...headers, \"Content-Type\": \"application/json\" },\n ...(init?.body === undefined ? {} : { body: JSON.stringify(init.body) }),\n // API responses carry max-age: a cached branch head would hide the latest commit\n cache: \"no-store\",\n });\n if (!res.ok) {\n const data = (await res.json().catch(() => ({}))) as { message?: unknown; error?: unknown; error_description?: unknown };\n const raw = [data.message ?? data.error, data.error_description].filter((part) => part !== undefined);\n const detail = raw.length > 0 ? raw.map((part) => (typeof part === \"string\" ? part : JSON.stringify(part))).join(\": \") : res.statusText;\n const request = `${init?.method ?? \"GET\"} ${path.split(\"?\")[0]}`;\n throw new HttpError(res.status, explain(res.status, detail, request));\n }\n return res;\n };\n const call = (async <T>(path: string, init?: { method?: string; body?: unknown }) =>\n (await (await send(path, init)).json()) as T) as Http;\n call.maybe = async <T>(path: string) => {\n try {\n return await call<T>(path);\n } catch (error) {\n if (error instanceof HttpError && error.status === 404) return undefined;\n throw error;\n }\n };\n call.text = async (path) => (await send(path)).text();\n return call;\n}\n\nconst enc = encodeURIComponent;\n\n// GitHub: REST v3 with the git data API, so a sync is one atomic commit.\n\nasync function connectGitHub(settings: GitSettings, fetcher: Fetch): Promise<GitRemote> {\n const api = http(\n \"https://api.github.com\",\n {\n Authorization: `Bearer ${settings.token.trim()}`,\n Accept: \"application/vnd.github+json\",\n \"X-GitHub-Api-Version\": \"2022-11-28\",\n },\n fetcher,\n (status, detail, request) =>\n status === 401\n ? `GitHub rejected the token on ${request} (${detail}).`\n : status === 403 || status === 404\n ? `GitHub: ${detail}. The token needs read and write access to the repository's contents; a fine-grained token can't create the repository, so create it on GitHub first.`\n : `GitHub: ${detail} (${status})`,\n );\n const { login } = await api<{ login: string }>(\"/user\");\n const [owner, name] = splitRepo(settings.repo, login);\n const branch = settings.branch.trim() || \"main\";\n type Repo = { full_name: string; default_branch: string };\n const body = { name, private: true, auto_init: true, description: DESCRIPTION };\n const repo =\n (await api.maybe<Repo>(`/repos/${enc(owner)}/${enc(name)}`)) ??\n (await api<Repo>(owner === login ? \"/user/repos\" : `/orgs/${enc(owner)}/repos`, { method: \"POST\", body }));\n const path = `/repos/${enc(owner)}/${enc(name)}`;\n if (!(await api.maybe(`${path}/git/ref/heads/${enc(branch)}`))) {\n const base = await api.maybe<{ object: { sha: string } }>(`${path}/git/ref/heads/${enc(repo.default_branch)}`);\n if (base) {\n await api(`${path}/git/refs`, { method: \"POST\", body: { ref: `refs/heads/${branch}`, sha: base.object.sha } });\n } else {\n // An empty repository has no refs: the contents API makes the first commit\n const readme = `# Dreamy saves\\n\\n${DESCRIPTION}\\n`;\n await api(`${path}/contents/README.md`, {\n method: \"PUT\",\n body: { message: \"Start the Dreamy save repository\", content: base64Utf8(readme), branch },\n });\n }\n }\n\n const commitOf = (sha: string) => api<{ tree: { sha: string } }>(`${path}/git/commits/${sha}`);\n return {\n user: login,\n repo: repo.full_name,\n branch,\n async snapshot() {\n const ref = await api<{ object: { sha: string } }>(`${path}/git/ref/heads/${enc(branch)}`);\n const head = ref.object.sha;\n const tree = await api<{ tree: { path: string; type: string; sha: string }[]; truncated?: boolean }>(\n `${path}/git/trees/${(await commitOf(head)).tree.sha}?recursive=1`,\n );\n if (tree.truncated) throw new Error(\"The save repository is too large to list in one request.\");\n const files = new Map<string, string>();\n for (const item of tree.tree) if (item.type === \"blob\" && creationIdOf(item.path)) files.set(item.path, item.sha);\n return { head, files };\n },\n async read(_path, sha) {\n const blob = await api<{ content: string; encoding: string }>(`${path}/git/blobs/${sha}`);\n return blob.encoding === \"base64\" ? decodeBase64Utf8(blob.content) : blob.content;\n },\n async commit(message, changes, parent) {\n const tree = await api<{ sha: string }>(`${path}/git/trees`, {\n method: \"POST\",\n body: {\n base_tree: (await commitOf(parent)).tree.sha,\n tree: changes.map((c) =>\n c.content === undefined\n ? { path: c.path, mode: \"100644\", type: \"blob\", sha: null }\n : { path: c.path, mode: \"100644\", type: \"blob\", content: c.content },\n ),\n },\n });\n const commit = await api<{ sha: string }>(`${path}/git/commits`, {\n method: \"POST\",\n body: { message, tree: tree.sha, parents: [parent] },\n });\n try {\n await api(`${path}/git/refs/heads/${enc(branch)}`, { method: \"PATCH\", body: { sha: commit.sha, force: false } });\n } catch (error) {\n if (error instanceof HttpError && (error.status === 409 || error.status === 422)) throw new StaleRemoteError(error.message);\n throw error;\n }\n },\n };\n}\n\n// GitLab: REST v4; the commits API takes every file action in one commit.\n\nasync function connectGitLab(settings: GitSettings, fetcher: Fetch): Promise<GitRemote> {\n const instance = (settings.instanceUrl?.trim() || \"https://gitlab.com\").replace(/\\/+$/, \"\");\n const group = settings.groupPath?.trim().replace(/^\\/+|\\/+$/g, \"\") || undefined;\n const api = http(`${instance}/api/v4`, { \"PRIVATE-TOKEN\": settings.token.trim() }, fetcher, (status, detail, request) =>\n status === 401\n ? `GitLab rejected the token on ${request} (${detail}).`\n : status === 403 && detail.includes(\"granular\")\n ? `GitLab: this fine-grained token lacks a permission for ${request} (${detail}). Check the GitLab group token permissions in the token help.`\n : status === 403\n ? `GitLab: ${detail} on ${request}. A personal token needs the api, read_repository and write_repository scopes; a group token needs the Developer role.`\n : `GitLab: ${detail} on ${request} (${status})`,\n );\n const denied = (error: unknown) => error instanceof HttpError && (error.status === 401 || error.status === 403);\n /** Undefined when the token may not read it (fine-grained tokens without Group: Read), as vite-react tolerates. */\n const optional = async <T>(request: string): Promise<T | undefined> => {\n try {\n return await api<T>(request);\n } catch (error) {\n if (denied(error) || (error instanceof HttpError && error.status === 404)) return undefined;\n throw error;\n }\n };\n\n // Token check as vite-react: /user, then the group, then the group's projects, then membership projects\n let user: string;\n try {\n user = (await api<{ username: string }>(\"/user\")).username;\n } catch (error) {\n if (!denied(error)) throw error;\n const groupOk =\n group !== undefined &&\n ((await optional(`/groups/${enc(group)}`)) !== undefined ||\n (await optional(`/groups/${enc(group)}/projects?per_page=1`)) !== undefined);\n if (groupOk && group) user = group;\n else {\n await api(\"/projects?membership=true&per_page=1\");\n user = group ?? \"GitLab token\";\n }\n }\n\n // Find the project the way vite-react's central vault does: list the group's (or the token's) projects\n type Project = { id: number; name: string; path: string; path_with_namespace: string; default_branch?: string };\n const wanted = settings.repo.trim().replace(/^\\/+|\\/+$/g, \"\").replace(/\\.git$/, \"\") || \"dreamy-saves\";\n const simple = wanted.split(\"/\").pop() ?? wanted;\n const listing = group\n ? `/groups/${enc(group)}/projects?include_subgroups=true&order_by=updated_at&per_page=100`\n : \"/projects?membership=true&order_by=updated_at&per_page=100\";\n // A group listing the token may not read falls back to membership projects (vite-react)\n const projects =\n (group ? await optional<Project[]>(listing) : undefined) ??\n (await api<Project[]>(\"/projects?membership=true&order_by=updated_at&per_page=100\"));\n const match = (p: Project) =>\n wanted.includes(\"/\")\n ? p.path_with_namespace.toLowerCase() === wanted.toLowerCase()\n : p.path.toLowerCase() === simple.toLowerCase() || p.name.toLowerCase() === simple.toLowerCase();\n const project = projects.find(match) ?? (await createProject());\n async function createProject(): Promise<Project> {\n // The group's id, if the token may read it (as Group or as Namespace); else the token's own namespace\n const owner = group\n ? ((await optional<{ id: number }>(`/groups/${enc(group)}`)) ??\n (await optional<{ id: number }>(`/namespaces/${enc(group)}`)))\n : undefined;\n return api<Project>(\"/projects\", {\n method: \"POST\",\n body: {\n name: simple,\n description: DESCRIPTION,\n visibility: \"private\",\n initialize_with_readme: true,\n ...(owner ? { namespace_id: owner.id } : {}),\n },\n });\n }\n\n const branch = settings.branch.trim() || \"main\";\n const path = `/projects/${project.id}/repository`;\n if (!(await api.maybe(`${path}/branches/${enc(branch)}`))) {\n const info = await api<Project>(`/projects/${project.id}`);\n const ref = info.default_branch ?? \"main\";\n await api(`${path}/branches?branch=${enc(branch)}&ref=${enc(ref)}`, { method: \"POST\" });\n }\n const headOf = async () => (await api<{ commit: { id: string } }>(`${path}/branches/${enc(branch)}`)).commit.id;\n let lastHead = branch;\n\n return {\n user,\n repo: project.path_with_namespace,\n branch,\n async snapshot() {\n const head = await headOf();\n lastHead = head;\n const files = new Map<string, string>();\n for (let page = 1; ; page += 1) {\n const items = await api.maybe<{ path: string; type: string; id: string }[]>(\n `${path}/tree?recursive=true&ref=${head}&per_page=100&page=${page}`,\n );\n if (!items) break;\n for (const item of items) if (item.type === \"blob\" && creationIdOf(item.path)) files.set(item.path, item.id);\n if (items.length < 100) break;\n }\n return { head, files };\n },\n // The files API, as vite-react pulls (fine-grained tokens can't use the blobs API)\n read: (filePath) => api.text(`${path}/files/${enc(filePath)}/raw?ref=${enc(lastHead)}`),\n async commit(message, changes, parent) {\n if ((await headOf()) !== parent) throw new StaleRemoteError(\"The branch moved.\");\n try {\n await api(`${path}/commits`, {\n method: \"POST\",\n body: {\n branch,\n commit_message: message,\n actions: changes.map((c) =>\n c.content === undefined\n ? { action: \"delete\", file_path: c.path }\n : { action: c.exists ? \"update\" : \"create\", file_path: c.path, content: c.content },\n ),\n },\n });\n } catch (error) {\n // A file created or deleted by another push in between\n if (error instanceof HttpError && error.status === 400) throw new StaleRemoteError(error.message);\n throw error;\n }\n },\n };\n}\n\n/** \"name\" -> [fallback owner, name]; \"owner/name\" or \"group/sub/name\" -> [owner, name]. */\nfunction splitRepo(repo: string, owner: string): [string, string] {\n const clean = repo.trim().replace(/^\\/+|\\/+$/g, \"\").replace(/\\.git$/, \"\") || \"dreamy-saves\";\n const cut = clean.lastIndexOf(\"/\");\n return cut < 0 ? [owner, clean] : [clean.slice(0, cut), clean.slice(cut + 1)];\n}\n\nfunction base64Utf8(text: string): string {\n let binary = \"\";\n for (const byte of new TextEncoder().encode(text)) binary += String.fromCharCode(byte);\n return btoa(binary);\n}\n\nfunction decodeBase64Utf8(base64: string): string {\n const binary = atob(base64.replace(/\\s/g, \"\"));\n return new TextDecoder().decode(Uint8Array.from(binary, (c) => c.charCodeAt(0)));\n}\n", "import type { Id, SyncSummary } from \"@dreamy/api\";\nimport { parseCreationRecord, serializeCreationRecord } from \"./creation-file.js\";\nimport { creationIdOf, creationPath, gitBlobSha, type FileChange, type GitRemote } from \"./git-remote.js\";\nimport type { LibraryDatabase, LibraryRecord } from \"./library-persistence.js\";\n\n/** What a creation looked like at its last sync: the repo's blob and the local record's blob. */\nexport type SyncedState = { readonly remoteSha: string; readonly localSha: string };\n\nexport type SyncDeps = {\n readonly database: LibraryDatabase;\n readonly remote: GitRemote;\n /** Last-sync state per creation. Updated in place as the sync goes. */\n readonly state: Map<Id, SyncedState>;\n readonly newId: () => Id;\n /** The creation open in the editor: never overwritten or deleted under it. */\n readonly protect: () => Id | undefined;\n};\n\nexport type SyncResult = SyncSummary & {\n /** Local records the sync wrote or deleted. */\n readonly changed: readonly Id[];\n};\n\nconst recordText = (record: LibraryRecord): string => serializeCreationRecord(record);\n\n/**\n * One three-way sync of the library with the repository, against the state of the last sync:\n * - changed on one side only: that side wins (push or pull);\n * - changed on both: keep both, the newer keeps the creation and the other becomes \"<name> (conflict copy)\";\n * - deleted on one side and unchanged on the other: deleted on both; edited on the other: it comes back.\n * Every push goes in one commit. A StaleRemoteError from the commit means: sync again.\n */\nexport async function syncLibrary({ database, remote, state, newId, protect }: SyncDeps): Promise<SyncResult> {\n const snapshot = await remote.snapshot();\n const local = new Map((await database.list()).map((r) => [r.id, r] as const));\n const changes: FileChange[] = [];\n const pushed = new Map<Id, SyncedState>();\n const changed: Id[] = [];\n const saved: string[] = [];\n let pulled = 0;\n let deleted = 0;\n let conflicts = 0;\n\n const fetchRemote = async (id: Id, sha: string): Promise<LibraryRecord | undefined> => {\n const record = parseCreationRecord(await remote.read(creationPath(id), sha), id);\n return record && { ...record, id };\n };\n const push = async (record: LibraryRecord, existed: boolean) => {\n const text = recordText(record);\n const sha = await gitBlobSha(text);\n changes.push({ path: creationPath(record.id), exists: existed, content: text });\n pushed.set(record.id, { remoteSha: sha, localSha: sha });\n saved.push(record.name);\n };\n const store = async (record: LibraryRecord, remoteSha: string) => {\n await database.write(record);\n state.set(record.id, { remoteSha, localSha: await gitBlobSha(recordText(record)) });\n changed.push(record.id);\n };\n const copyOf = (record: LibraryRecord): LibraryRecord => ({\n ...record,\n id: newId(),\n name: `${record.name} (conflict copy)`.slice(0, 80),\n });\n\n const ids = new Set<Id>([...local.keys()]);\n for (const path of snapshot.files.keys()) {\n const id = creationIdOf(path);\n if (id) ids.add(id);\n }\n\n for (const id of ids) {\n const mine = local.get(id);\n const remoteSha = snapshot.files.get(creationPath(id));\n const last = state.get(id);\n const localSha = mine ? await gitBlobSha(recordText(mine)) : undefined;\n const localChanged = mine !== undefined && localSha !== last?.localSha;\n const remoteChanged = remoteSha !== undefined && remoteSha !== last?.remoteSha;\n\n if (mine && remoteSha && localSha === remoteSha) {\n state.set(id, { remoteSha, localSha });\n } else if (mine && !remoteSha) {\n if (!last || localChanged || protect() === id) {\n await push(mine, false);\n } else {\n // Deleted in the repo, unchanged here\n await database.delete(id);\n state.delete(id);\n changed.push(id);\n deleted += 1;\n }\n } else if (!mine && remoteSha) {\n if (last && !remoteChanged) {\n // Deleted here, unchanged in the repo\n changes.push({ path: creationPath(id), exists: true });\n deleted += 1;\n } else {\n const theirs = await fetchRemote(id, remoteSha);\n if (theirs) {\n await store(theirs, remoteSha);\n pulled += 1;\n }\n }\n } else if (mine && remoteSha) {\n if (!remoteChanged) {\n if (localChanged) await push(mine, true);\n } else if (!localChanged && last) {\n if (protect() === id) continue; // the editor has it open: pulled on the next load\n const theirs = await fetchRemote(id, remoteSha);\n if (theirs) {\n await store(theirs, remoteSha);\n pulled += 1;\n }\n } else {\n const theirs = await fetchRemote(id, remoteSha);\n if (!theirs) {\n await push(mine, true);\n continue;\n }\n conflicts += 1;\n if (protect() === id || mine.updatedAt >= theirs.updatedAt) {\n // Ours keeps the creation; theirs is kept as a copy\n const copy = copyOf(theirs);\n await database.write(copy);\n changed.push(copy.id);\n await push(copy, false);\n await push(mine, true);\n } else {\n const copy = copyOf(mine);\n await database.write(copy);\n changed.push(copy.id);\n await push(copy, false);\n await store(theirs, remoteSha);\n }\n }\n } else {\n state.delete(id);\n }\n }\n\n if (changes.length > 0) {\n await remote.commit(commitMessage(saved, changes.length - saved.length), changes, snapshot.head);\n for (const change of changes) {\n const id = creationIdOf(change.path);\n if (!id) continue;\n const next = pushed.get(id);\n if (next) state.set(id, next);\n else state.delete(id);\n }\n }\n\n if (changed.length > 0) {\n const open = await database.current();\n if (open !== undefined && !(await database.read(open))) {\n const rest = await database.list();\n if (rest[0]) await database.setCurrent(rest[0].id);\n }\n }\n\n return { pushed: pushed.size, pulled, deleted, conflicts, changed };\n}\n\nfunction commitMessage(saved: readonly string[], removed: number): string {\n const parts = [\n saved.length > 0 ? `save ${saved.slice(0, 3).join(\", \")}${saved.length > 3 ? ` and ${saved.length - 3} more` : \"\"}` : \"\",\n removed > 0 ? `delete ${removed} creation${removed === 1 ? \"\" : \"s\"}` : \"\",\n ].filter(Boolean);\n return `Dreamy: ${parts.join(\"; \")}`;\n}\n", "import type { GitSettings, Id, LibrarySync, Persistence, SyncStatus, SyncSummary } from \"@dreamy/api\";\nimport { StaleRemoteError, type GitRemote } from \"./git-remote.js\";\nimport type { LibraryDatabase } from \"./library-persistence.js\";\nimport { syncLibrary, type SyncedState } from \"./library-sync.js\";\nimport type { KeyValueStorage } from \"./preferences.js\";\n\nconst SETTINGS_KEY = \"dreamy-studio:git-sync\";\nconst STATE_KEY = \"dreamy-studio:git-sync-state\";\n/** A push follows the last library change after this long. */\nexport const PUSH_DELAY_MS = 30_000;\nconst ATTEMPTS = 3;\n\ntype Stored = GitSettings & { readonly user?: string; readonly lastSyncedAt?: number };\n\nexport type GitSyncDeps = {\n readonly database: LibraryDatabase;\n readonly storage: KeyValueStorage | undefined;\n /** Verifies the settings and returns the remote (`connectRemote` over the browser's fetch). */\n readonly connect: (settings: GitSettings) => Promise<GitRemote>;\n readonly newId: () => Id;\n readonly now: () => number;\n /** The creation open in the editor. */\n readonly openId: () => Id | undefined;\n readonly pushDelayMs?: number;\n};\n\n/** The LibrarySync port plus what the composition root needs: scheduled pushes. */\nexport type GitSync = LibrarySync & {\n readonly connected: boolean;\n /** Debounced sync after a library change. */\n schedule(): void;\n /** Runs a scheduled sync now. */\n flush(): void;\n dispose(): void;\n};\n\n/**\n * Git sync of the library, as vite-react's central vault: one repository, a personal access token kept in\n * this browser's storage, browser requests to the GitHub / GitLab REST APIs. Syncs run one at a time.\n */\nexport function createGitSync({ database, storage, connect, newId, now, openId, pushDelayMs = PUSH_DELAY_MS }: GitSyncDeps): GitSync {\n let stored = read<Stored>(storage, SETTINGS_KEY);\n const state = new Map<Id, SyncedState>(Object.entries(read<Record<Id, SyncedState>>(storage, STATE_KEY) ?? {}));\n let remote: GitRemote | undefined;\n let status: SyncStatus = statusOf(stored, stored ? \"idle\" : \"off\");\n let running: Promise<SyncSummary> | undefined;\n let again = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const listeners = new Set<(s: SyncStatus) => void>();\n\n const setStatus = (next: SyncStatus) => {\n status = next;\n for (const listener of listeners) listener(status);\n };\n const saveState = () => write(storage, STATE_KEY, Object.fromEntries(state));\n\n const runOnce = async (): Promise<SyncSummary> => {\n const settings = stored;\n if (!settings) return { pushed: 0, pulled: 0, deleted: 0, conflicts: 0 };\n setStatus({ ...statusOf(settings, \"syncing\"), message: \"Syncing\u2026\" });\n try {\n remote ??= await connect(settings);\n for (let attempt = 1; ; attempt += 1) {\n try {\n const result = await syncLibrary({ database, remote, state, newId, protect: openId });\n saveState();\n stored = { ...settings, user: remote.user, repo: remote.repo, lastSyncedAt: now() };\n write(storage, SETTINGS_KEY, stored);\n setStatus({ ...statusOf(stored, \"idle\"), message: summaryText(result) });\n return result;\n } catch (error) {\n saveState();\n if (!(error instanceof StaleRemoteError) || attempt >= ATTEMPTS) throw error;\n }\n }\n } catch (error) {\n remote = undefined;\n setStatus({ ...statusOf(settings, \"error\"), message: error instanceof Error ? error.message : String(error) });\n throw error;\n }\n };\n\n const syncNow = (): Promise<SyncSummary> => {\n if (timer) clearTimeout(timer);\n timer = undefined;\n if (running) {\n again = true;\n return running;\n }\n running = runOnce().finally(() => {\n running = undefined;\n if (again) {\n again = false;\n void syncNow().catch(() => undefined);\n }\n });\n return running;\n };\n\n return {\n get connected() {\n return stored !== undefined;\n },\n status: () => status,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n settings() {\n if (!stored) return undefined;\n const { token: _token, user: _user, lastSyncedAt: _at, ...rest } = stored;\n return rest;\n },\n async connect(settings) {\n const next = await connect(settings);\n // Another repository: nothing in it was synced from here yet\n if (!stored || stored.provider !== settings.provider || stored.repo !== next.repo || stored.branch !== next.branch) {\n state.clear();\n saveState();\n }\n remote = next;\n stored = { ...settings, repo: next.repo, branch: next.branch, user: next.user };\n write(storage, SETTINGS_KEY, stored);\n setStatus(statusOf(stored, \"idle\"));\n await syncNow();\n },\n async disconnect() {\n if (timer) clearTimeout(timer);\n timer = undefined;\n stored = undefined;\n remote = undefined;\n state.clear();\n remove(storage, SETTINGS_KEY);\n remove(storage, STATE_KEY);\n setStatus(statusOf(undefined, \"off\"));\n },\n syncNow,\n schedule() {\n if (!stored) return;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => void syncNow().catch(() => undefined), pushDelayMs);\n },\n flush() {\n if (timer) void syncNow().catch(() => undefined);\n },\n dispose() {\n if (timer) clearTimeout(timer);\n timer = undefined;\n listeners.clear();\n },\n };\n}\n\n/** Persistence that schedules a push after every library write. */\nexport function withSyncSchedule(persistence: Persistence, sync: Pick<GitSync, \"schedule\">): Persistence {\n const after =\n <A extends unknown[], R>(run: (...args: A) => Promise<R>) =>\n async (...args: A): Promise<R> => {\n const result = await run(...args);\n sync.schedule();\n return result;\n };\n return {\n ...persistence,\n save: after(persistence.save),\n create: after(persistence.create),\n rename: after(persistence.rename),\n duplicate: after(persistence.duplicate),\n remove: after(persistence.remove),\n importFile: after(persistence.importFile),\n };\n}\n\nfunction statusOf(stored: Stored | undefined, state: SyncStatus[\"state\"]): SyncStatus {\n if (!stored) return { state: \"off\" };\n return {\n state,\n provider: stored.provider,\n repo: stored.repo,\n branch: stored.branch,\n ...(stored.user ? { user: stored.user } : {}),\n ...(stored.lastSyncedAt ? { lastSyncedAt: stored.lastSyncedAt } : {}),\n };\n}\n\nfunction summaryText({ pushed, pulled, deleted, conflicts }: SyncSummary): string {\n const parts = [\n pushed ? `${pushed} pushed` : \"\",\n pulled ? `${pulled} pulled` : \"\",\n deleted ? `${deleted} deleted` : \"\",\n conflicts ? `${conflicts} conflict${conflicts === 1 ? \"\" : \"s\"} kept as copies` : \"\",\n ].filter(Boolean);\n return parts.length > 0 ? parts.join(\", \") : \"Up to date\";\n}\n\nfunction read<T>(storage: KeyValueStorage | undefined, key: string): T | undefined {\n try {\n const raw = storage?.getItem(key);\n return raw ? (JSON.parse(raw) as T) : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction write(storage: KeyValueStorage | undefined, key: string, value: unknown): void {\n try {\n storage?.setItem(key, JSON.stringify(value));\n } catch {\n /* storage blocked: the settings last for this page only */\n }\n}\n\nfunction remove(storage: KeyValueStorage | undefined, key: string): void {\n try {\n storage?.removeItem?.(key);\n } catch {\n /* storage blocked */\n }\n}\n", "import type { CreationLog, IdGenerator } from \"@dreamy/api\";\n\n/** Ids continue after the largest numeric id already in the log, so a reopened creation never reuses one. */\nexport function createIds(log?: CreationLog): IdGenerator {\n let next = log ? maxNumericId(log.events) : 0;\n return {\n next() {\n next += 1;\n return String(next);\n },\n };\n}\n\nfunction maxNumericId(value: unknown): number {\n if (typeof value === \"string\" && /^[1-9]\\d*$/.test(value)) {\n const parsed = Number(value);\n return Number.isSafeInteger(parsed) ? parsed : 0;\n }\n if (Array.isArray(value)) return value.reduce((max: number, item) => Math.max(max, maxNumericId(item)), 0);\n if (typeof value === \"object\" && value !== null) {\n return Object.values(value).reduce((max: number, item) => Math.max(max, maxNumericId(item)), 0);\n }\n return 0;\n}\n", "import type { Id } from \"@dreamy/api\";\nimport type { LibraryDatabase, LibraryRecord } from \"./library-persistence.js\";\n\n/** A new database: the retired model's \"dreamy\" database is left alone and never read. */\nconst DB_NAME = \"dreamy-studio\";\nconst DB_VERSION = 1;\n\nexport function createIndexedDbLibrary(): LibraryDatabase {\n return {\n list: () => request<LibraryRecord[]>(\"creations\", \"readonly\", (s) => s.getAll()),\n read: (id) => request<LibraryRecord | undefined>(\"creations\", \"readonly\", (s) => s.get(id)),\n write: async (record) => {\n await request(\"creations\", \"readwrite\", (s) => s.put(record));\n },\n delete: async (id) => {\n await request(\"creations\", \"readwrite\", (s) => s.delete(id));\n },\n current: async () => (await request<{ id: Id } | undefined>(\"meta\", \"readonly\", (s) => s.get(\"open\")))?.id,\n setCurrent: async (id) => {\n await request(\"meta\", \"readwrite\", (s) => s.put({ key: \"open\", id }));\n },\n };\n}\n\nfunction openDb(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(DB_NAME, DB_VERSION);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(\"creations\")) db.createObjectStore(\"creations\", { keyPath: \"id\" });\n if (!db.objectStoreNames.contains(\"meta\")) db.createObjectStore(\"meta\", { keyPath: \"key\" });\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error ?? new Error(\"IndexedDB did not open.\"));\n });\n}\n\nasync function request<T>(\n store: string,\n mode: IDBTransactionMode,\n run: (objectStore: IDBObjectStore) => IDBRequest,\n): Promise<T> {\n const db = await openDb();\n try {\n return await new Promise<T>((resolve, reject) => {\n const req = run(db.transaction(store, mode).objectStore(store));\n req.onsuccess = () => resolve(req.result as T);\n req.onerror = () => reject(req.error ?? new Error(\"IndexedDB request failed.\"));\n });\n } finally {\n db.close();\n }\n}\n", "import type { CreationLog, Id, LibraryEntry, Persistence } from \"@dreamy/api\";\nimport { creationNameFromFile, fileNameFor, parseCreationRecord, serializeCreationLog } from \"./creation-file.js\";\n\nexport type LibraryRecord = LibraryEntry & { readonly log: CreationLog };\n\n/** Storage the library needs (IndexedDB in the browser, a map in tests). */\nexport type LibraryDatabase = {\n list(): Promise<readonly LibraryRecord[]>;\n read(id: Id): Promise<LibraryRecord | undefined>;\n write(record: LibraryRecord): Promise<void>;\n delete(id: Id): Promise<void>;\n current(): Promise<Id | undefined>;\n setCurrent(id: Id): Promise<void>;\n};\n\n/** Browser file access: download a text file, pick one to read. */\nexport type FileAccess = {\n download(fileName: string, text: string): void;\n pick(): Promise<{ readonly fileName: string; readonly text: string } | undefined>;\n};\n\nexport type LibraryDeps = {\n readonly database: LibraryDatabase;\n readonly files: FileAccess;\n readonly newId: () => Id;\n readonly now: () => number;\n};\n\n/** The Persistence port over a database and file access. Writes run one at a time, in order. */\nexport function createLibraryPersistence({ database, files, newId, now }: LibraryDeps): Persistence {\n let queue: Promise<unknown> = Promise.resolve();\n const enqueue = <T>(work: () => Promise<T>): Promise<T> => {\n const run = queue.then(work, work);\n queue = run.then(\n () => undefined,\n () => undefined,\n );\n return run;\n };\n const entry = ({ id, name, updatedAt, thumbnail }: LibraryRecord): LibraryEntry =>\n thumbnail === undefined ? { id, name, updatedAt } : { id, name, updatedAt, thumbnail };\n\n return {\n list: () =>\n enqueue(async () => [...(await database.list())].sort((a, b) => b.updatedAt - a.updatedAt).map(entry)),\n current: () => enqueue(() => database.current()),\n load: (id) => enqueue(async () => (await database.read(id))?.log),\n save: (id, log, thumbnail) => {\n const snapshot = structuredClone(log);\n return enqueue(async () => {\n const record = await database.read(id);\n if (!record) return;\n await database.write({ ...record, log: snapshot, updatedAt: now(), ...(thumbnail ? { thumbnail } : {}) });\n });\n },\n create: (name, log) =>\n enqueue(async () => {\n const id = newId();\n await database.write({ id, name, log: structuredClone(log), updatedAt: now() });\n return id;\n }),\n open: (id) => enqueue(() => database.setCurrent(id)),\n rename: (id, name) =>\n enqueue(async () => {\n const record = await database.read(id);\n if (record) await database.write({ ...record, name, updatedAt: now() });\n }),\n duplicate: (id) =>\n enqueue(async () => {\n const record = await database.read(id);\n const copy = newId();\n if (!record) throw new Error(\"That creation is not in the library.\");\n await database.write({ ...record, id: copy, name: `${record.name} copy`, updatedAt: now() });\n return copy;\n }),\n remove: (id) =>\n enqueue(async () => {\n await database.delete(id);\n if ((await database.current()) === id) {\n const rest = await database.list();\n if (rest[0]) await database.setCurrent(rest[0].id);\n }\n }),\n exportFile: (id) =>\n enqueue(async () => {\n const record = await database.read(id);\n if (record) files.download(fileNameFor(record.name), serializeCreationLog(record.log));\n }),\n importFile: () =>\n enqueue(async () => {\n const picked = await files.pick();\n if (!picked) return undefined;\n const id = newId();\n // A plain scene file, or a save-repository file (which also carries the creation's name)\n const file = parseCreationRecord(picked.text, id, creationNameFromFile(picked.fileName));\n if (!file) return undefined;\n await database.write({ id, name: file.name, log: file.log, updatedAt: now() });\n return id;\n }),\n downloadJson: async (name, data) => {\n files.download(name.endsWith(\".json\") ? name : `${name}.json`, JSON.stringify(data, null, 2));\n },\n };\n}\n", "import type { PreferencesStore, ViewPreferences } from \"@dreamy/api\";\n\nexport const DEFAULT_PREFERENCES: ViewPreferences = {\n renderMode: \"normal\",\n renderResolution: \"screen\",\n renderSelectedOnly: false,\n cameraSun: false,\n voxelResolution: 36,\n hints: true,\n stats: false,\n decalBoost: 15,\n};\n\nconst KEY = \"dreamy-studio:view-preferences\";\n\nexport type KeyValueStorage = {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem?(key: string): void;\n};\n\n/** View settings per browser. A missing, broken or blocked store falls back to the defaults. */\nexport function createPreferencesStore(storage: KeyValueStorage | undefined): PreferencesStore {\n return {\n load() {\n try {\n const raw = storage?.getItem(KEY);\n if (!raw) return DEFAULT_PREFERENCES;\n return sanitize({ ...DEFAULT_PREFERENCES, ...(JSON.parse(raw) as Partial<ViewPreferences>) });\n } catch {\n return DEFAULT_PREFERENCES;\n }\n },\n save(prefs) {\n try {\n storage?.setItem(KEY, JSON.stringify(sanitize(prefs)));\n } catch {\n /* storage blocked: preferences last for this page only */\n }\n },\n };\n}\n\nfunction sanitize(p: ViewPreferences): ViewPreferences {\n const voxel = Number.isFinite(p.voxelResolution) ? p.voxelResolution : DEFAULT_PREFERENCES.voxelResolution;\n return { ...p, voxelResolution: Math.min(64, Math.max(16, Math.round(voxel))) };\n}\n", "import type { CreationApi } from \"@dreamy/api\";\n\n/** A brand-new library starts like the POC: one cube sculpt above the ground. */\nexport function seedFirstSculpt(api: CreationApi): void {\n api.dispatch({\n type: \"CreateSculpt\",\n payload: {\n name: \"Sculpt 1\",\n transform: {\n position: { x: 0, y: 1.5, z: 0 },\n rotation: { x: 0, y: 0, z: 0, w: 1 },\n scale: { x: 1, y: 1, z: 1 },\n },\n stamp: {\n shape: \"cube\",\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0, w: 1 },\n scale: { x: 2, y: 2, z: 2 },\n mode: \"add\",\n },\n },\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useRef", "useEffect", "useState", "useState", "useEffect", "useEffect", "useRef", "createContext", "useContext", "useEffect", "useRef", "useState", "jsx", "createContext", "sheetHidden", "useContext", "useRef", "useState", "useEffect", "useEffect", "useRef", "useState", "useState", "jsx", "jsxs", "jsx", "jsxs", "jsx", "jsxs", "useEffect", "useRef", "useState", "jsx", "jsx", "jsxs", "useState", "useEffect", "useRef", "useState", "jsx", "jsx", "jsxs", "useState", "jsx", "jsxs", "jsx", "Fragment", "jsx", "jsxs", "useState", "jsx", "jsx", "jsxs", "jsx", "jsx", "jsxs", "useEffect", "useEffect", "useRef", "useState", "jsx", "useRef", "useState", "useEffect", "useCallback", "useEffect", "useRef", "useState", "jsx", "jsxs", "useRef", "useState", "useCallback", "useEffect", "jsx", "jsx", "jsx", "jsxs", "useEffect", "useEffect", "useRef", "useState", "jsx", "jsxs", "jsx", "Fragment", "jsx", "jsxs", "useRef", "useState", "bounds", "name", "art", "useEffect", "jsx", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "useState", "Fragment", "jsx", "jsxs", "useState", "jsx", "jsxs", "useState", "jsx", "jsx", "useState", "Fragment", "jsx", "jsxs", "useState", "Fragment", "jsx", "jsxs", "useState", "jsx", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "NONE", "useEffect", "useState", "jsx", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "jsx", "jsx", "jsx", "jsxs", "jsx", "jsxs", "jsx", "jsxs", "jsx", "jsxs", "useEffect", "useState", "useEffect", "useState", "useState", "jsx", "jsxs", "useState", "jsx", "jsxs", "useState", "useEffect", "jsx", "jsxs", "useState", "useEffect", "remove", "Fragment", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "jsx", "jsxs", "jsx", "Fragment", "jsx", "jsxs", "jsx", "Fragment", "jsx", "jsxs", "Fragment", "jsx", "jsxs", "color", "jsx", "jsxs", "jsx", "jsx", "jsxs", "jsx", "jsxs", "useEffect", "useState", "jsx", "useState", "useEffect", "jsx", "jsxs", "jsx", "jsxs", "TOOLS", "step", "jsx", "jsxs", "useEffect", "useMemo", "useRef", "jsx", "useRef", "useEffect", "useMemo", "jsx", "jsxs", "jsx", "jsxs", "useRef", "useState", "useEffect", "jsx", "useRef", "useEffect", "useMemo", "useRef", "useState", "EMPTY_LOG", "request", "jsx", "useRef", "useMemo", "gitSync", "useState", "useEffect", "EMPTY_LOG"]
|
|
7
|
+
}
|