@nice2dev/ui-graphics 1.0.6 → 1.1.0
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/dist/cjs/animation/AnimationEditor.js +6 -6
- package/dist/cjs/animation/Audience.js +2 -2
- package/dist/cjs/core/LocalUI.js +5 -5
- package/dist/cjs/game/GameAsset2dEditor.js +20 -20
- package/dist/cjs/packages/ui/dist/NiceButton-D9l39Rs7.js +598 -0
- package/dist/cjs/packages/ui/dist/NiceButton-D9l39Rs7.js.map +1 -0
- package/dist/cjs/packages/ui/dist/NiceErrorBoundary-niMx1aSJ.js +647 -0
- package/dist/cjs/packages/ui/dist/NiceErrorBoundary-niMx1aSJ.js.map +1 -0
- package/dist/cjs/packages/ui/dist/NiceModuleLifecyclePanel-I_TXRiiY.js +5048 -0
- package/dist/cjs/packages/ui/dist/NiceModuleLifecyclePanel-I_TXRiiY.js.map +1 -0
- package/dist/cjs/packages/ui/dist/NicePinCodeInput-CrMfdxxc.js +13081 -0
- package/dist/cjs/packages/ui/dist/NicePinCodeInput-CrMfdxxc.js.map +1 -0
- package/dist/cjs/packages/ui/dist/NiceSavedQueryPanel-CUAsdOjJ.js +6054 -0
- package/dist/cjs/packages/ui/dist/NiceSavedQueryPanel-CUAsdOjJ.js.map +1 -0
- package/dist/cjs/packages/ui/dist/NiceToggle-CaY1u82g.js +280 -0
- package/dist/cjs/packages/ui/dist/NiceToggle-CaY1u82g.js.map +1 -0
- package/dist/cjs/packages/ui/dist/NiceWindow-SiCaREbq.js +806 -0
- package/dist/cjs/packages/ui/dist/NiceWindow-SiCaREbq.js.map +1 -0
- package/dist/cjs/packages/ui/dist/charts-Bx_kNBsE.js +3508 -0
- package/dist/cjs/packages/ui/dist/charts-Bx_kNBsE.js.map +1 -0
- package/dist/cjs/packages/ui/dist/core-BpghV7Ls.js +10249 -0
- package/dist/cjs/packages/ui/dist/core-BpghV7Ls.js.map +1 -0
- package/dist/cjs/packages/ui/dist/index-CIl98Vbm.js +40039 -0
- package/dist/cjs/packages/ui/dist/index-CIl98Vbm.js.map +1 -0
- package/dist/cjs/pixel/PixelEditor.js +5 -5
- package/dist/cjs/pixel/PixelEditorMenuBar.js +2 -2
- package/dist/cjs/pixel/PixelEditorRightPanel.js +5 -5
- package/dist/cjs/pixel/PixelEditorTimeline.js +3 -3
- package/dist/cjs/pixel/PixelEditorToolbar.js +2 -2
- package/dist/cjs/pixel/SpriteGeneratorPanel.js +10 -10
- package/dist/cjs/vector/VectorEditor.js +5 -5
- package/dist/cjs/vector/VectorEditorMenuBar.js +4 -4
- package/dist/cjs/vector/VectorEditorRightPanel.js +15 -15
- package/dist/esm/animation/AnimationEditor.js +2 -2
- package/dist/esm/animation/Audience.js +1 -1
- package/dist/esm/core/LocalUI.js +2 -2
- package/dist/esm/game/GameAsset2dEditor.js +2 -2
- package/dist/esm/packages/ui/dist/NiceButton-D9l39Rs7.js +593 -0
- package/dist/esm/packages/ui/dist/NiceButton-D9l39Rs7.js.map +1 -0
- package/dist/esm/packages/ui/dist/NiceErrorBoundary-niMx1aSJ.js +637 -0
- package/dist/esm/packages/ui/dist/NiceErrorBoundary-niMx1aSJ.js.map +1 -0
- package/dist/esm/packages/ui/dist/NiceModuleLifecyclePanel-I_TXRiiY.js +5007 -0
- package/dist/esm/packages/ui/dist/NiceModuleLifecyclePanel-I_TXRiiY.js.map +1 -0
- package/dist/esm/packages/ui/dist/NicePinCodeInput-CrMfdxxc.js +13011 -0
- package/dist/esm/packages/ui/dist/NicePinCodeInput-CrMfdxxc.js.map +1 -0
- package/dist/esm/packages/ui/dist/NiceSavedQueryPanel-CUAsdOjJ.js +6037 -0
- package/dist/esm/packages/ui/dist/NiceSavedQueryPanel-CUAsdOjJ.js.map +1 -0
- package/dist/esm/packages/ui/dist/NiceToggle-CaY1u82g.js +276 -0
- package/dist/esm/packages/ui/dist/NiceToggle-CaY1u82g.js.map +1 -0
- package/dist/esm/packages/ui/dist/NiceWindow-SiCaREbq.js +795 -0
- package/dist/esm/packages/ui/dist/NiceWindow-SiCaREbq.js.map +1 -0
- package/dist/esm/packages/ui/dist/charts-Bx_kNBsE.js +3483 -0
- package/dist/esm/packages/ui/dist/charts-Bx_kNBsE.js.map +1 -0
- package/dist/esm/packages/ui/dist/core-BpghV7Ls.js +10071 -0
- package/dist/esm/packages/ui/dist/core-BpghV7Ls.js.map +1 -0
- package/dist/esm/packages/ui/dist/index-CIl98Vbm.js +39917 -0
- package/dist/esm/packages/ui/dist/index-CIl98Vbm.js.map +1 -0
- package/dist/esm/pixel/PixelEditor.js +3 -3
- package/dist/esm/pixel/PixelEditorMenuBar.js +1 -1
- package/dist/esm/pixel/PixelEditorRightPanel.js +3 -3
- package/dist/esm/pixel/PixelEditorTimeline.js +2 -2
- package/dist/esm/pixel/PixelEditorToolbar.js +1 -1
- package/dist/esm/pixel/SpriteGeneratorPanel.js +3 -3
- package/dist/esm/vector/VectorEditor.js +3 -3
- package/dist/esm/vector/VectorEditorMenuBar.js +2 -2
- package/dist/esm/vector/VectorEditorRightPanel.js +3 -3
- package/package.json +1 -1
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
|
-
var
|
|
6
|
-
var
|
|
5
|
+
var NiceButtonD9l39Rs7 = require('../packages/ui/dist/NiceButton-D9l39Rs7.js');
|
|
6
|
+
var NicePinCodeInputCrMfdxxc = require('../packages/ui/dist/NicePinCodeInput-CrMfdxxc.js');
|
|
7
7
|
var i18n = require('../core/i18n.js');
|
|
8
8
|
var AnimatedPerson = require('./AnimatedPerson.js');
|
|
9
9
|
var characterTypes = require('./characterTypes.js');
|
|
@@ -23,18 +23,18 @@ function ColorInputs({ value, onChange, }) {
|
|
|
23
23
|
const base = clampPalette(value);
|
|
24
24
|
const count = Math.min(3, Math.max(1, (_a = value === null || value === void 0 ? void 0 : value.length) !== null && _a !== void 0 ? _a : 1));
|
|
25
25
|
const view = base.slice(0, count);
|
|
26
|
-
return (jsxRuntime.jsxs("div", { className: "ntd-ae-color-inputs", children: [jsxRuntime.jsx("div", { className: "ntd-ae-colors", children: view.map((col, i) => (jsxRuntime.jsxs("label", { className: "ntd-ae-color-label", children: ["C", i + 1, jsxRuntime.jsx(
|
|
26
|
+
return (jsxRuntime.jsxs("div", { className: "ntd-ae-color-inputs", children: [jsxRuntime.jsx("div", { className: "ntd-ae-colors", children: view.map((col, i) => (jsxRuntime.jsxs("label", { className: "ntd-ae-color-label", children: ["C", i + 1, jsxRuntime.jsx(NiceButtonD9l39Rs7.N, { value: col, onChange: (color) => {
|
|
27
27
|
const next = [...view];
|
|
28
28
|
next[i] = color;
|
|
29
29
|
onChange(next);
|
|
30
|
-
} })] }, i))) }), jsxRuntime.jsxs("div", { className: "ntd-ae-color-btns", children: [jsxRuntime.jsx(
|
|
30
|
+
} })] }, i))) }), jsxRuntime.jsxs("div", { className: "ntd-ae-color-btns", children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { variant: "ghost", size: "sm", disabled: count <= 1, onClick: () => onChange(view.slice(0, Math.max(1, count - 1))), children: "-" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { variant: "ghost", size: "sm", disabled: count >= 3, onClick: () => onChange([...view, view[view.length - 1] || "var(--anim-default-black, #000000)"]), children: "+" })] })] }));
|
|
31
31
|
}
|
|
32
32
|
function Row({ title, children }) {
|
|
33
33
|
return (jsxRuntime.jsxs("div", { className: "ntd-ae-row", children: [jsxRuntime.jsx("div", { className: "ntd-ae-row-title", children: title }), jsxRuntime.jsx("div", { className: "ntd-ae-row-content", children: children })] }));
|
|
34
34
|
}
|
|
35
35
|
function FeatureEditor({ title, feature, variants, onChange, }) {
|
|
36
36
|
const options = variants.map((v) => ({ value: v, label: v }));
|
|
37
|
-
return (jsxRuntime.jsxs(Row, { title: title, children: [jsxRuntime.jsx(
|
|
37
|
+
return (jsxRuntime.jsxs(Row, { title: title, children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.a, { className: "ntd-ae-select", value: feature.variant, onChange: (val) => onChange({ ...feature, variant: val }), options: options }), jsxRuntime.jsx(ColorInputs, { value: feature.colors, onChange: (colors) => onChange({ ...feature, colors }) })] }));
|
|
38
38
|
}
|
|
39
39
|
/* ---------- component ---------- */
|
|
40
40
|
function NiceAnimationEditor({ initialConfig, onChange, storageKey = STORAGE_KEY, onNotify, showJsonPanel = true, showPreview = true, className, style, }) {
|
|
@@ -102,7 +102,7 @@ function NiceAnimationEditor({ initialConfig, onChange, storageKey = STORAGE_KEY
|
|
|
102
102
|
const updateFeature = (key, val) => {
|
|
103
103
|
setCfg((prev) => ({ ...prev, [key]: val }));
|
|
104
104
|
};
|
|
105
|
-
return (jsxRuntime.jsxs("div", { className: `ntd-animation-editor ${className !== null && className !== void 0 ? className : ""}`, style: style, children: [jsxRuntime.jsxs("div", { className: "ntd-ae-controls", children: [jsxRuntime.jsx(Row, { title: t("characterEditor.name", "Name"), children: jsxRuntime.jsx(
|
|
105
|
+
return (jsxRuntime.jsxs("div", { className: `ntd-animation-editor ${className !== null && className !== void 0 ? className : ""}`, style: style, children: [jsxRuntime.jsxs("div", { className: "ntd-ae-controls", children: [jsxRuntime.jsx(Row, { title: t("characterEditor.name", "Name"), children: jsxRuntime.jsx(NiceButtonD9l39Rs7.b, { className: "ntd-ae-input", value: cfg.name || "", onChange: (val) => setCfg({ ...cfg, name: val }), placeholder: t("characterEditor.namePlaceholder", "Character name") }) }), jsxRuntime.jsxs(Row, { title: t("characters.size", "Size"), children: [jsxRuntime.jsx(NicePinCodeInputCrMfdxxc.U, { min: 140, max: 300, value: (_a = cfg.size) !== null && _a !== void 0 ? _a : 180, onChange: (val) => setCfg({ ...cfg, size: val }) }), jsxRuntime.jsxs("span", { className: "ntd-ae-size-value", children: [(_b = cfg.size) !== null && _b !== void 0 ? _b : 180, "px"] })] }), jsxRuntime.jsx(FeatureEditor, { title: t("characters.faceShape", "Face"), feature: cfg.face, variants: characterTypes.VARIANTS.face, onChange: (v) => updateFeature("face", v) }), jsxRuntime.jsx(FeatureEditor, { title: t("characters.hairstyle", "Hair"), feature: cfg.hair, variants: characterTypes.VARIANTS.hair, onChange: (v) => updateFeature("hair", v) }), jsxRuntime.jsx(FeatureEditor, { title: t("characters.eyes", "Eyes"), feature: cfg.eyes, variants: characterTypes.VARIANTS.eyes, onChange: (v) => updateFeature("eyes", v) }), jsxRuntime.jsx(FeatureEditor, { title: t("characters.nose", "Nose"), feature: cfg.nose, variants: characterTypes.VARIANTS.nose, onChange: (v) => updateFeature("nose", v) }), jsxRuntime.jsx(FeatureEditor, { title: t("characters.mouth", "Mouth"), feature: cfg.mouth, variants: characterTypes.VARIANTS.mouth, onChange: (v) => updateFeature("mouth", v) }), jsxRuntime.jsx(FeatureEditor, { title: t("characters.clothing", "Outfit"), feature: cfg.outfit, variants: characterTypes.VARIANTS.outfit, onChange: (v) => updateFeature("outfit", v) }), jsxRuntime.jsx(FeatureEditor, { title: t("characters.headwear", "Headwear"), feature: cfg.headwear, variants: characterTypes.VARIANTS.headwear, onChange: (v) => updateFeature("headwear", v) }), jsxRuntime.jsx(FeatureEditor, { title: t("characters.prop", "Prop"), feature: cfg.prop, variants: characterTypes.VARIANTS.prop, onChange: (v) => updateFeature("prop", v) }), jsxRuntime.jsxs("div", { className: "ntd-ae-action-row", children: [jsxRuntime.jsxs(NiceButtonD9l39Rs7.c, { className: "ntd-ae-btn", variant: "ghost", onClick: randomizeColors, children: ["\uD83C\uDFB2 ", t("characterEditor.randomizeColors", "Randomize colors")] }), jsxRuntime.jsxs(NiceButtonD9l39Rs7.c, { className: "ntd-ae-btn", variant: "ghost", onClick: downloadJson, children: ["\u2B07 ", t("characters.downloadJson", "Download JSON")] })] }), showJsonPanel && (jsxRuntime.jsxs("div", { className: "ntd-ae-json-panel", children: [jsxRuntime.jsx("div", { className: "ntd-ae-json-label", children: t("characterEditor.jsonSection", "JSON") }), jsxRuntime.jsx(NicePinCodeInputCrMfdxxc.X, { className: "ntd-ae-textarea", value: json, onChange: (val) => setJson(val) }), jsxRuntime.jsxs("div", { className: "ntd-ae-json-actions", children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: "ntd-ae-btn", variant: "primary", onClick: applyJson, children: t("characterEditor.applyJson", "Apply JSON") }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: "ntd-ae-btn", variant: "ghost", onClick: () => navigator.clipboard.writeText(JSON.stringify(cfg, null, 2)), children: t("characterEditor.copyToClipboard", "Copy") })] })] }))] }), showPreview && (jsxRuntime.jsxs("div", { className: "ntd-ae-preview", children: [jsxRuntime.jsx("div", { className: "ntd-ae-preview-label", children: t("characterEditor.preview", "Preview") }), jsxRuntime.jsx(AnimatedPerson, { character: cfg, score: 10, startPose: "idle" })] }))] }));
|
|
106
106
|
}
|
|
107
107
|
/** @deprecated Use NiceAnimationEditor */
|
|
108
108
|
const AnimationEditor = NiceAnimationEditor;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
|
-
var
|
|
5
|
+
var NiceButtonD9l39Rs7 = require('../packages/ui/dist/NiceButton-D9l39Rs7.js');
|
|
6
6
|
var AnimatedPerson = require('./AnimatedPerson.js');
|
|
7
7
|
var characterTypes = require('./characterTypes.js');
|
|
8
8
|
var choreoDSL = require('./choreoDSL.js');
|
|
@@ -53,7 +53,7 @@ const NiceAudience = ({ count = 36, columns = 12 }) => {
|
|
|
53
53
|
display: "grid",
|
|
54
54
|
gap: 8,
|
|
55
55
|
gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))`,
|
|
56
|
-
}, children: people.map((c, i) => (jsxRuntime.jsx(AnimatedPerson, { character: c, score: 10, startPose: "idle", onReady: (fx) => (refs.current[i] = fx) }, i))) }), jsxRuntime.jsxs("div", { style: { display: "flex", gap: 8 }, children: [jsxRuntime.jsx(
|
|
56
|
+
}, children: people.map((c, i) => (jsxRuntime.jsx(AnimatedPerson, { character: c, score: 10, startPose: "idle", onReady: (fx) => (refs.current[i] = fx) }, i))) }), jsxRuntime.jsxs("div", { style: { display: "flex", gap: 8 }, children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { variant: "ghost", size: "sm", onClick: wave, children: "Wave" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { variant: "ghost", size: "sm", onClick: cheer, children: "Cheer" })] })] }));
|
|
57
57
|
};
|
|
58
58
|
|
|
59
59
|
module.exports = NiceAudience;
|
package/dist/cjs/core/LocalUI.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
|
-
var
|
|
6
|
-
var
|
|
5
|
+
var NiceButtonD9l39Rs7 = require('../packages/ui/dist/NiceButton-D9l39Rs7.js');
|
|
6
|
+
var NicePinCodeInputCrMfdxxc = require('../packages/ui/dist/NicePinCodeInput-CrMfdxxc.js');
|
|
7
7
|
|
|
8
8
|
const variantMap = {
|
|
9
9
|
"dark": "secondary",
|
|
@@ -18,7 +18,7 @@ const sizeMap = {
|
|
|
18
18
|
"md": "md",
|
|
19
19
|
};
|
|
20
20
|
const Button = ({ variant = "dark", size = "md", className = "", children, disabled, onClick, title, style, }) => {
|
|
21
|
-
return (jsxRuntime.jsx(
|
|
21
|
+
return (jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { variant: variantMap[variant], size: sizeMap[size], className: className, disabled: disabled, onClick: onClick, "aria-label": title, style: style, children: children }));
|
|
22
22
|
};
|
|
23
23
|
const RangeInput = ({ accentColor, style, className = "", value, min = 0, max = 100, step = 1, onChange, onMouseUp, }) => {
|
|
24
24
|
const handleChange = React.useCallback((val) => {
|
|
@@ -34,7 +34,7 @@ const RangeInput = ({ accentColor, style, className = "", value, min = 0, max =
|
|
|
34
34
|
onMouseUp({});
|
|
35
35
|
}
|
|
36
36
|
}, [onChange, onMouseUp]);
|
|
37
|
-
return (jsxRuntime.jsx(
|
|
37
|
+
return (jsxRuntime.jsx(NicePinCodeInputCrMfdxxc.U, { value: typeof value === "number" ? value : Number(value) || 0, min: Number(min), max: Number(max), step: Number(step), className: className, style: { ...style, "--nice-accent": accentColor }, onChange: handleChange, showValue: false }));
|
|
38
38
|
};
|
|
39
39
|
const TextArea = ({ className = "", value, onChange, rows, placeholder, disabled, style, }) => {
|
|
40
40
|
const handleChange = React.useCallback((newValue) => {
|
|
@@ -46,7 +46,7 @@ const TextArea = ({ className = "", value, onChange, rows, placeholder, disabled
|
|
|
46
46
|
onChange(syntheticEvent);
|
|
47
47
|
}
|
|
48
48
|
}, [onChange]);
|
|
49
|
-
return (jsxRuntime.jsx(
|
|
49
|
+
return (jsxRuntime.jsx(NicePinCodeInputCrMfdxxc.X, { className: className, value: typeof value === "string" ? value : String(value !== null && value !== void 0 ? value : ""), onChange: handleChange, rows: rows, placeholder: placeholder, disabled: disabled, style: style }));
|
|
50
50
|
};
|
|
51
51
|
|
|
52
52
|
exports.Button = Button;
|
|
@@ -4,15 +4,15 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var GameAsset2dEditor_module = require('./GameAsset2dEditor.module.css.js');
|
|
6
6
|
var useGameAssetEditor = require('./useGameAssetEditor.js');
|
|
7
|
-
var
|
|
8
|
-
var
|
|
7
|
+
var NiceButtonD9l39Rs7 = require('../packages/ui/dist/NiceButton-D9l39Rs7.js');
|
|
8
|
+
var NiceToggleCaY1u82g = require('../packages/ui/dist/NiceToggle-CaY1u82g.js');
|
|
9
9
|
|
|
10
10
|
/* ────────────────────────────────────────────────────────────────
|
|
11
11
|
MENU BAR
|
|
12
12
|
──────────────────────────────────────────────────────────────── */
|
|
13
13
|
const MenuBar = ({ api }) => {
|
|
14
14
|
const fileInputRef = React.useRef(null);
|
|
15
|
-
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.menuBar, children: [jsxRuntime.jsx("h3", { children: "\uD83C\uDFAE Game Asset Editor" }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.menuGroup, children: [jsxRuntime.jsx(
|
|
15
|
+
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.menuBar, children: [jsxRuntime.jsx("h3", { children: "\uD83C\uDFAE Game Asset Editor" }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.menuGroup, children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => api.newProject('New Project'), children: "\uD83D\uDCC4 New" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "\uD83D\uDCC2 Open" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.saveProject, children: "\uD83D\uDCBE Save" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.spacer }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.menuGroup, children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.undo, disabled: !api.canUndo, children: "\u21A9 Undo" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.redo, disabled: !api.canRedo, children: "\u21AA Redo" })] }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: ".json", style: { display: 'none' }, onChange: e => {
|
|
16
16
|
var _a;
|
|
17
17
|
const file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];
|
|
18
18
|
if (file)
|
|
@@ -30,7 +30,7 @@ const ModeTabs = ({ api }) => {
|
|
|
30
30
|
{ id: 'animation', label: 'Animation', icon: '🎬' },
|
|
31
31
|
{ id: 'effects', label: 'Effects', icon: '✨' },
|
|
32
32
|
];
|
|
33
|
-
return (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.modeTabs, children: modes.map(mode => (jsxRuntime.jsxs(
|
|
33
|
+
return (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.modeTabs, children: modes.map(mode => (jsxRuntime.jsxs(NiceButtonD9l39Rs7.c, { className: `${GameAsset2dEditor_module.modeTab} ${api.editorState.mode === mode.id ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.mode === mode.id ? 'primary' : 'ghost', onClick: () => api.setMode(mode.id), children: [mode.icon, " ", mode.label] }, mode.id))) }));
|
|
34
34
|
};
|
|
35
35
|
/* ────────────────────────────────────────────────────────────────
|
|
36
36
|
TILE MAP TOOLBAR
|
|
@@ -45,7 +45,7 @@ const TileMapToolbar = ({ api }) => {
|
|
|
45
45
|
{ id: 'line', icon: '╱', label: 'Line' },
|
|
46
46
|
{ id: 'eyedropper', icon: '💧', label: 'Eyedropper' },
|
|
47
47
|
];
|
|
48
|
-
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolbar, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.toolGroup, children: tools.map(tool => (jsxRuntime.jsx(
|
|
48
|
+
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolbar, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.toolGroup, children: tools.map(tool => (jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.tileMapTool === tool.id ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.tileMapTool === tool.id ? 'primary' : 'ghost', size: "sm", onClick: () => api.setTileMapTool(tool.id), title: tool.label, children: tool.icon }, tool.id))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.spacer }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.showGrid ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.showGrid ? 'primary' : 'ghost', size: "sm", onClick: api.toggleGrid, title: "Toggle Grid", children: "\u229E" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.showCollision ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.showCollision ? 'primary' : 'ghost', size: "sm", onClick: api.toggleCollision, title: "Show Collision", children: "\u25C7" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.snapToGrid ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.snapToGrid ? 'primary' : 'ghost', size: "sm", onClick: api.toggleSnap, title: "Snap to Grid", children: "\u22A1" })] }));
|
|
49
49
|
};
|
|
50
50
|
/* ────────────────────────────────────────────────────────────────
|
|
51
51
|
SPRITE SHEET TOOLBAR
|
|
@@ -53,14 +53,14 @@ const TileMapToolbar = ({ api }) => {
|
|
|
53
53
|
const SpriteSheetToolbar = ({ api }) => {
|
|
54
54
|
const [sliceWidth, setSliceWidth] = React.useState(16);
|
|
55
55
|
const [sliceHeight, setSliceHeight] = React.useState(16);
|
|
56
|
-
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolbar, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolGroup, children: [jsxRuntime.jsx(
|
|
56
|
+
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolbar, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolGroup, children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.spriteSheetTool === 'select' ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.spriteSheetTool === 'select' ? 'primary' : 'ghost', size: "sm", onClick: () => api.setSpriteSheetTool('select'), title: "Select", children: "\u2B1A" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.spriteSheetTool === 'slice' ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.spriteSheetTool === 'slice' ? 'primary' : 'ghost', size: "sm", onClick: () => api.setSpriteSheetTool('slice'), title: "Manual Slice", children: "\u2702" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.spacer }), jsxRuntime.jsxs("label", { style: { fontSize: 11, color: '#8892a8' }, children: ["Frame size:", jsxRuntime.jsx(NiceToggleCaY1u82g.a, { value: sliceWidth, onChange: val => setSliceWidth(val !== null && val !== void 0 ? val : 16), style: { width: 40, margin: '0 4px' }, className: GameAsset2dEditor_module.panelInput }), "\u00D7", jsxRuntime.jsx(NiceToggleCaY1u82g.a, { value: sliceHeight, onChange: val => setSliceHeight(val !== null && val !== void 0 ? val : 16), style: { width: 40, marginLeft: 4 }, className: GameAsset2dEditor_module.panelInput })] }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", onClick: () => api.autoSlice(sliceWidth, sliceHeight), style: { marginLeft: 8 }, children: "Auto Slice" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", onClick: api.detectSprites, style: { marginLeft: 4 }, children: "Detect Sprites" })] }));
|
|
57
57
|
};
|
|
58
58
|
/* ────────────────────────────────────────────────────────────────
|
|
59
59
|
TILE PALETTE (LEFT PANEL)
|
|
60
60
|
──────────────────────────────────────────────────────────────── */
|
|
61
61
|
const TilePalette = ({ api }) => {
|
|
62
62
|
const fileInputRef = React.useRef(null);
|
|
63
|
-
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Tiles" }), jsxRuntime.jsx(
|
|
63
|
+
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Tiles" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "+ Add" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: api.project.tileSets.length === 0 ? (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.emptyState, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "No tiles yet" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "Import Tiles" })] })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.tilePalette, children: api.project.tileSets.map(tile => (jsxRuntime.jsx("div", { className: `${GameAsset2dEditor_module.tileItem} ${api.editorState.selectedTileId === tile.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectTile(tile.id), title: tile.name, children: jsxRuntime.jsx("img", { src: tile.thumbnail, alt: tile.name }) }, tile.id))) })) }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", style: { display: 'none' }, onChange: e => {
|
|
64
64
|
var _a;
|
|
65
65
|
const file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];
|
|
66
66
|
if (file)
|
|
@@ -73,10 +73,10 @@ const TilePalette = ({ api }) => {
|
|
|
73
73
|
──────────────────────────────────────────────────────────────── */
|
|
74
74
|
const LayersPanel = ({ api }) => {
|
|
75
75
|
const activeMap = api.project.tileMaps.find(m => m.id === api.editorState.activeTileMapId);
|
|
76
|
-
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Layers" }), jsxRuntime.jsx(
|
|
76
|
+
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Layers" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.addLayer, disabled: !activeMap, children: "+ Add" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: activeMap ? (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.layersList, children: [...activeMap.layers].reverse().map(layer => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeLayerId === layer.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectLayer(layer.id), children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: `${GameAsset2dEditor_module.layerVisibility} ${!layer.visible ? GameAsset2dEditor_module.hidden : ''}`, variant: "ghost", size: "sm", onClick: e => {
|
|
77
77
|
e.stopPropagation();
|
|
78
78
|
api.toggleLayerVisibility(layer.id);
|
|
79
|
-
}, children: layer.visible ? '👁' : '○' }), jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: layer.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [Math.round(layer.opacity * 100), "%"] })] }, layer.id))) })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "No tile map selected" }) })) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Maps" }), jsxRuntime.jsx(
|
|
79
|
+
}, children: layer.visible ? '👁' : '○' }), jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: layer.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [Math.round(layer.opacity * 100), "%"] })] }, layer.id))) })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "No tile map selected" }) })) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Maps" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => api.createTileMap('New Map', 32, 32), children: "+ New" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: api.project.tileMaps.map(map => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeTileMapId === map.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectTileMap(map.id), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: map.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [map.width, "\u00D7", map.height] })] }, map.id))) })] }));
|
|
80
80
|
};
|
|
81
81
|
/* ────────────────────────────────────────────────────────────────
|
|
82
82
|
TILE MAP CANVAS
|
|
@@ -164,7 +164,7 @@ const TileMapCanvas = ({ api }) => {
|
|
|
164
164
|
if (isDragging && (api.editorState.tileMapTool === 'brush' || api.editorState.tileMapTool === 'eraser')) {
|
|
165
165
|
handleCanvasClick(e);
|
|
166
166
|
}
|
|
167
|
-
} })) : (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.emptyState, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "Create or select a tile map to start editing" }), jsxRuntime.jsx(
|
|
167
|
+
} })) : (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.emptyState, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "Create or select a tile map to start editing" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.btnPrimary, variant: "primary", onClick: () => api.createTileMap('New Map', 32, 32), children: "Create Tile Map" })] })) }));
|
|
168
168
|
};
|
|
169
169
|
/* ────────────────────────────────────────────────────────────────
|
|
170
170
|
SPRITE SHEET CANVAS
|
|
@@ -232,7 +232,7 @@ const SpriteSheetCanvas = ({ api }) => {
|
|
|
232
232
|
}, [activeSheet, api]);
|
|
233
233
|
return (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.viewport, children: activeSheet ? (jsxRuntime.jsx("canvas", { ref: canvasRef, className: GameAsset2dEditor_module.viewportCanvas, style: {
|
|
234
234
|
transform: `translate(-50%, -50%) scale(${api.editorState.zoom})`,
|
|
235
|
-
}, onClick: handleFrameClick })) : (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.emptyState, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "Import a sprite sheet to start" }), jsxRuntime.jsx(
|
|
235
|
+
}, onClick: handleFrameClick })) : (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.emptyState, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "Import a sprite sheet to start" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.btnPrimary, variant: "primary", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "Import Sprite Sheet" }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", style: { display: 'none' }, onChange: e => {
|
|
236
236
|
var _a;
|
|
237
237
|
const file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];
|
|
238
238
|
if (file)
|
|
@@ -245,7 +245,7 @@ const SpriteSheetCanvas = ({ api }) => {
|
|
|
245
245
|
──────────────────────────────────────────────────────────────── */
|
|
246
246
|
const SpriteSheetsList = ({ api }) => {
|
|
247
247
|
const fileInputRef = React.useRef(null);
|
|
248
|
-
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Sprite Sheets" }), jsxRuntime.jsx(
|
|
248
|
+
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Sprite Sheets" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "+ Import" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: api.project.spriteSheets.length === 0 ? (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "No sprite sheets" }) })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.layersList, children: api.project.spriteSheets.map(sheet => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeSpriteSheetId === sheet.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectSpriteSheet(sheet.id), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: sheet.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [sheet.frames.length, " frames"] })] }, sheet.id))) })) }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", style: { display: 'none' }, onChange: e => {
|
|
249
249
|
var _a;
|
|
250
250
|
const file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];
|
|
251
251
|
if (file)
|
|
@@ -266,7 +266,7 @@ const FramesPanel = ({ api }) => {
|
|
|
266
266
|
setAnimName('');
|
|
267
267
|
}
|
|
268
268
|
}, [animName, api]);
|
|
269
|
-
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsxs("span", { children: ["Frames (", (_a = activeSheet === null || activeSheet === void 0 ? void 0 : activeSheet.frames.length) !== null && _a !== void 0 ? _a : 0, ")"] }) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, style: { maxHeight: 200 }, children: activeSheet === null || activeSheet === void 0 ? void 0 : activeSheet.frames.map(frame => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.selectedFrameIds.includes(frame.id) ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectFrames([frame.id]), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: frame.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [frame.width, "\u00D7", frame.height] })] }, frame.id))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "Animations" }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [api.editorState.selectedFrameIds.length > 0 && (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, children: [jsxRuntime.jsx(
|
|
269
|
+
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsxs("span", { children: ["Frames (", (_a = activeSheet === null || activeSheet === void 0 ? void 0 : activeSheet.frames.length) !== null && _a !== void 0 ? _a : 0, ")"] }) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, style: { maxHeight: 200 }, children: activeSheet === null || activeSheet === void 0 ? void 0 : activeSheet.frames.map(frame => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.selectedFrameIds.includes(frame.id) ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectFrames([frame.id]), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: frame.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [frame.width, "\u00D7", frame.height] })] }, frame.id))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "Animations" }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [api.editorState.selectedFrameIds.length > 0 && (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.b, { className: GameAsset2dEditor_module.panelInput, placeholder: "Animation name...", value: animName, onChange: val => setAnimName(val) }), jsxRuntime.jsxs(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.btnPrimary, variant: "primary", onClick: createAnimationFromSelection, style: { marginTop: 8, width: '100%' }, disabled: !animName, children: ["Create from ", api.editorState.selectedFrameIds.length, " frames"] })] })), activeSheet === null || activeSheet === void 0 ? void 0 : activeSheet.animations.map(anim => (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: anim.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [anim.frameIds.length, "f"] }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.effectRemove, variant: "ghost", size: "sm", onClick: () => api.removeAnimation(anim.id), children: "\u00D7" })] }, anim.id)))] })] }));
|
|
270
270
|
};
|
|
271
271
|
/* ────────────────────────────────────────────────────────────────
|
|
272
272
|
ANIMATION STATE MACHINE
|
|
@@ -285,7 +285,7 @@ const AnimationStateMachineView = ({ api }) => {
|
|
|
285
285
|
}
|
|
286
286
|
return result;
|
|
287
287
|
}, [api.project.spriteSheets]);
|
|
288
|
-
return (jsxRuntime.jsxs("div", { style: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "State Machines" }), jsxRuntime.jsx("button", { className: GameAsset2dEditor_module.menuBtn, onClick: () => api.createStateMachine('New State Machine'), children: "+ New" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, style: { maxHeight: 150 }, children: api.project.stateMachines.map(sm => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeStateMachineId === sm.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectStateMachine(sm.id), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: sm.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [sm.states.length, " states"] })] }, sm.id))) }), activeSM && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "States" }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, children: [jsxRuntime.jsx(
|
|
288
|
+
return (jsxRuntime.jsxs("div", { style: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "State Machines" }), jsxRuntime.jsx("button", { className: GameAsset2dEditor_module.menuBtn, onClick: () => api.createStateMachine('New State Machine'), children: "+ New" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, style: { maxHeight: 150 }, children: api.project.stateMachines.map(sm => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeStateMachineId === sm.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectStateMachine(sm.id), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: sm.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [sm.states.length, " states"] })] }, sm.id))) }), activeSM && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "States" }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.b, { className: GameAsset2dEditor_module.panelInput, placeholder: "State name...", value: newStateName, onChange: val => setNewStateName(val) }), allAnimations.length > 0 && newStateName && (jsxRuntime.jsx(NiceButtonD9l39Rs7.a, { className: GameAsset2dEditor_module.panelInput, style: { marginTop: 4 }, onChange: val => {
|
|
289
289
|
if (val) {
|
|
290
290
|
api.addState(newStateName, val);
|
|
291
291
|
setNewStateName('');
|
|
@@ -296,7 +296,7 @@ const AnimationStateMachineView = ({ api }) => {
|
|
|
296
296
|
value: anim.id,
|
|
297
297
|
label: `${anim.sheetName}: ${anim.name}`
|
|
298
298
|
}))
|
|
299
|
-
] }))] }), activeSM.states.map(state => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.selectedStateId === state.id ? GameAsset2dEditor_module.selected : ''} ${activeSM.entryStateId === state.id ? GameAsset2dEditor_module.entry : ''}`, onClick: () => api.selectState(state.id), children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerName, children: [activeSM.entryStateId === state.id && '▶ ', state.name] }), jsxRuntime.jsx(
|
|
299
|
+
] }))] }), activeSM.states.map(state => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.selectedStateId === state.id ? GameAsset2dEditor_module.selected : ''} ${activeSM.entryStateId === state.id ? GameAsset2dEditor_module.entry : ''}`, onClick: () => api.selectState(state.id), children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerName, children: [activeSM.entryStateId === state.id && '▶ ', state.name] }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.effectRemove, variant: "ghost", size: "sm", onClick: e => {
|
|
300
300
|
e.stopPropagation();
|
|
301
301
|
api.removeState(state.id);
|
|
302
302
|
}, children: "\u00D7" })] }, state.id)))] })] }))] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.stateGraph, children: activeSM ? (jsxRuntime.jsxs("svg", { width: "100%", height: "100%", children: [jsxRuntime.jsx("defs", { children: jsxRuntime.jsx("marker", { id: "arrowhead", markerWidth: "10", markerHeight: "7", refX: "9", refY: "3.5", orient: "auto", children: jsxRuntime.jsx("polygon", { points: "0 0, 10 3.5, 0 7", fill: "#4a5a7e" }) }) }), activeSM.transitions.map(trans => {
|
|
@@ -308,12 +308,12 @@ const AnimationStateMachineView = ({ api }) => {
|
|
|
308
308
|
}), activeSM.states.map(state => {
|
|
309
309
|
var _a, _b;
|
|
310
310
|
return (jsxRuntime.jsx("foreignObject", { x: state.position.x, y: state.position.y, width: 120, height: 50, children: jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.stateNode} ${api.editorState.selectedStateId === state.id ? GameAsset2dEditor_module.selected : ''} ${activeSM.entryStateId === state.id ? GameAsset2dEditor_module.entry : ''}`, onClick: () => api.selectState(state.id), children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.stateNodeName, children: state.name }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.stateNodeAnim, children: (_b = (_a = allAnimations.find(a => a.id === state.animationId)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : 'No animation' })] }) }, state.id));
|
|
311
|
-
})] })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "Create a state machine to design animation flows" }) })) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Parameters" }), jsxRuntime.jsx(
|
|
311
|
+
})] })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "Create a state machine to design animation flows" }) })) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Parameters" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => api.addParameter('new_param', 'trigger'), disabled: !activeSM, children: "+ Add" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: activeSM === null || activeSM === void 0 ? void 0 : activeSM.parameters.map(param => (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerOpacity, children: param.type }), jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: param.name }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.effectRemove, variant: "ghost", size: "sm", onClick: () => api.removeParameter(param.id), children: "\u00D7" })] }, param.id))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "Transitions" }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [activeSM === null || activeSM === void 0 ? void 0 : activeSM.transitions.map(trans => {
|
|
312
312
|
var _a, _b;
|
|
313
313
|
const from = activeSM.states.find(s => s.id === trans.fromStateId);
|
|
314
314
|
const to = activeSM.states.find(s => s.id === trans.toStateId);
|
|
315
|
-
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerName, children: [(_a = from === null || from === void 0 ? void 0 : from.name) !== null && _a !== void 0 ? _a : '?', " \u2192 ", (_b = to === null || to === void 0 ? void 0 : to.name) !== null && _b !== void 0 ? _b : '?'] }), jsxRuntime.jsx(
|
|
316
|
-
}), api.editorState.selectedStateId && (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, style: { marginTop: 12 }, children: [jsxRuntime.jsx("label", { className: GameAsset2dEditor_module.panelLabel, children: "Add transition to:" }), jsxRuntime.jsx(
|
|
315
|
+
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerName, children: [(_a = from === null || from === void 0 ? void 0 : from.name) !== null && _a !== void 0 ? _a : '?', " \u2192 ", (_b = to === null || to === void 0 ? void 0 : to.name) !== null && _b !== void 0 ? _b : '?'] }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.effectRemove, variant: "ghost", size: "sm", onClick: () => api.removeTransition(trans.id), children: "\u00D7" })] }, trans.id));
|
|
316
|
+
}), api.editorState.selectedStateId && (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, style: { marginTop: 12 }, children: [jsxRuntime.jsx("label", { className: GameAsset2dEditor_module.panelLabel, children: "Add transition to:" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.a, { className: GameAsset2dEditor_module.panelInput, onChange: val => {
|
|
317
317
|
if (val && api.editorState.selectedStateId) {
|
|
318
318
|
api.addTransition(api.editorState.selectedStateId, val);
|
|
319
319
|
}
|
|
@@ -342,7 +342,7 @@ const EffectsView = ({ api }) => {
|
|
|
342
342
|
{ type: 'shadow', label: 'Shadow' },
|
|
343
343
|
{ type: 'palette-swap', label: 'Palette Swap' },
|
|
344
344
|
];
|
|
345
|
-
return (jsxRuntime.jsxs("div", { style: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "Add Effect" }) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: effectTypes.map(({ type, label }) => (jsxRuntime.jsx(
|
|
345
|
+
return (jsxRuntime.jsxs("div", { style: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "Add Effect" }) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: effectTypes.map(({ type, label }) => (jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.layerItem, variant: "ghost", onClick: () => api.addEffect(type), style: { cursor: 'pointer', border: 'none', textAlign: 'left' }, children: jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: label }) }, type))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "Presets" }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.b, { className: GameAsset2dEditor_module.panelInput, placeholder: "Preset name...", value: presetName, onChange: val => setPresetName(val) }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", style: { marginTop: 4, width: '100%' }, onClick: () => {
|
|
346
346
|
if (presetName) {
|
|
347
347
|
api.saveEffectPreset(presetName);
|
|
348
348
|
setPresetName('');
|
|
@@ -355,7 +355,7 @@ const EffectsView = ({ api }) => {
|
|
|
355
355
|
const StatusBar = ({ api }) => {
|
|
356
356
|
const activeMap = api.project.tileMaps.find(m => m.id === api.editorState.activeTileMapId);
|
|
357
357
|
const activeSheet = api.project.spriteSheets.find(s => s.id === api.editorState.activeSpriteSheetId);
|
|
358
|
-
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.statusBar, children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.statusItem, children: ["Mode: ", api.editorState.mode] }), api.editorState.mode === 'tilemap' && activeMap && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.statusItem, children: ["Map: ", activeMap.name, " (", activeMap.width, "\u00D7", activeMap.height, ")"] }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.statusItem, children: ["Tile: ", activeMap.tileWidth, "\u00D7", activeMap.tileHeight, "px"] })] })), api.editorState.mode === 'spritesheet' && activeSheet && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.statusItem, children: ["Sheet: ", activeSheet.name] }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.statusItem, children: ["Selected: ", api.editorState.selectedFrameIds.length, " frames"] })] })), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.zoomControl, children: [jsxRuntime.jsx(
|
|
358
|
+
return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.statusBar, children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.statusItem, children: ["Mode: ", api.editorState.mode] }), api.editorState.mode === 'tilemap' && activeMap && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.statusItem, children: ["Map: ", activeMap.name, " (", activeMap.width, "\u00D7", activeMap.height, ")"] }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.statusItem, children: ["Tile: ", activeMap.tileWidth, "\u00D7", activeMap.tileHeight, "px"] })] })), api.editorState.mode === 'spritesheet' && activeSheet && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.statusItem, children: ["Sheet: ", activeSheet.name] }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.statusItem, children: ["Selected: ", api.editorState.selectedFrameIds.length, " frames"] })] })), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.zoomControl, children: [jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.zoomBtn, variant: "ghost", size: "sm", onClick: () => api.setZoom(api.editorState.zoom - 0.25), children: "\u2212" }), jsxRuntime.jsxs("span", { children: [Math.round(api.editorState.zoom * 100), "%"] }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.zoomBtn, variant: "ghost", size: "sm", onClick: () => api.setZoom(api.editorState.zoom + 0.25), children: "+" }), jsxRuntime.jsx(NiceButtonD9l39Rs7.c, { className: GameAsset2dEditor_module.zoomBtn, variant: "ghost", size: "sm", onClick: () => api.setZoom(1), children: "\u2299" })] })] }));
|
|
359
359
|
};
|
|
360
360
|
/* ────────────────────────────────────────────────────────────────
|
|
361
361
|
MAIN COMPONENT
|