@effect-tui/react 0.1.0-alpha.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 +138 -0
- package/dist/jsx-dev-runtime.d.ts +3 -0
- package/dist/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/jsx-dev-runtime.js +3 -0
- package/dist/jsx-dev-runtime.js.map +1 -0
- package/dist/jsx-runtime.d.ts +47 -0
- package/dist/jsx-runtime.d.ts.map +1 -0
- package/dist/jsx-runtime.js +6 -0
- package/dist/jsx-runtime.js.map +1 -0
- package/dist/src/codeblock.d.ts +9 -0
- package/dist/src/codeblock.d.ts.map +1 -0
- package/dist/src/codeblock.js +24 -0
- package/dist/src/codeblock.js.map +1 -0
- package/dist/src/constants.d.ts +3 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +3 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/debug/DiagnosticsPanel.d.ts +7 -0
- package/dist/src/debug/DiagnosticsPanel.d.ts.map +1 -0
- package/dist/src/debug/DiagnosticsPanel.js +13 -0
- package/dist/src/debug/DiagnosticsPanel.js.map +1 -0
- package/dist/src/highlight.d.ts +20 -0
- package/dist/src/highlight.d.ts.map +1 -0
- package/dist/src/highlight.js +51 -0
- package/dist/src/highlight.js.map +1 -0
- package/dist/src/hooks/index.d.ts +4 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/index.js +3 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/use-keyboard.d.ts +18 -0
- package/dist/src/hooks/use-keyboard.d.ts.map +1 -0
- package/dist/src/hooks/use-keyboard.js +26 -0
- package/dist/src/hooks/use-keyboard.js.map +1 -0
- package/dist/src/hooks/use-paste.d.ts +5 -0
- package/dist/src/hooks/use-paste.d.ts.map +1 -0
- package/dist/src/hooks/use-paste.js +14 -0
- package/dist/src/hooks/use-paste.js.map +1 -0
- package/dist/src/hooks/useFrameStats.d.ts +7 -0
- package/dist/src/hooks/useFrameStats.d.ts.map +1 -0
- package/dist/src/hooks/useFrameStats.js +28 -0
- package/dist/src/hooks/useFrameStats.js.map +1 -0
- package/dist/src/hosts/base.d.ts +22 -0
- package/dist/src/hosts/base.d.ts.map +1 -0
- package/dist/src/hosts/base.js +53 -0
- package/dist/src/hosts/base.js.map +1 -0
- package/dist/src/hosts/box.d.ts +26 -0
- package/dist/src/hosts/box.d.ts.map +1 -0
- package/dist/src/hosts/box.js +84 -0
- package/dist/src/hosts/box.js.map +1 -0
- package/dist/src/hosts/canvas.d.ts +48 -0
- package/dist/src/hosts/canvas.d.ts.map +1 -0
- package/dist/src/hosts/canvas.js +109 -0
- package/dist/src/hosts/canvas.js.map +1 -0
- package/dist/src/hosts/codeblock.d.ts +32 -0
- package/dist/src/hosts/codeblock.d.ts.map +1 -0
- package/dist/src/hosts/codeblock.js +118 -0
- package/dist/src/hosts/codeblock.js.map +1 -0
- package/dist/src/hosts/hstack.d.ts +18 -0
- package/dist/src/hosts/hstack.d.ts.map +1 -0
- package/dist/src/hosts/hstack.js +45 -0
- package/dist/src/hosts/hstack.js.map +1 -0
- package/dist/src/hosts/index.d.ts +16 -0
- package/dist/src/hosts/index.d.ts.map +1 -0
- package/dist/src/hosts/index.js +40 -0
- package/dist/src/hosts/index.js.map +1 -0
- package/dist/src/hosts/spacer.d.ts +19 -0
- package/dist/src/hosts/spacer.d.ts.map +1 -0
- package/dist/src/hosts/spacer.js +28 -0
- package/dist/src/hosts/spacer.js.map +1 -0
- package/dist/src/hosts/text.d.ts +43 -0
- package/dist/src/hosts/text.d.ts.map +1 -0
- package/dist/src/hosts/text.js +148 -0
- package/dist/src/hosts/text.js.map +1 -0
- package/dist/src/hosts/vstack.d.ts +18 -0
- package/dist/src/hosts/vstack.d.ts.map +1 -0
- package/dist/src/hosts/vstack.js +45 -0
- package/dist/src/hosts/vstack.js.map +1 -0
- package/dist/src/hosts/zstack.d.ts +20 -0
- package/dist/src/hosts/zstack.d.ts.map +1 -0
- package/dist/src/hosts/zstack.js +65 -0
- package/dist/src/hosts/zstack.js.map +1 -0
- package/dist/src/index.d.ts +20 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +20 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/inline/index.d.ts +32 -0
- package/dist/src/inline/index.d.ts.map +1 -0
- package/dist/src/inline/index.js +111 -0
- package/dist/src/inline/index.js.map +1 -0
- package/dist/src/jsx.d.ts +2 -0
- package/dist/src/jsx.d.ts.map +1 -0
- package/dist/src/jsx.js +4 -0
- package/dist/src/jsx.js.map +1 -0
- package/dist/src/motion/color-motion-value.d.ts +32 -0
- package/dist/src/motion/color-motion-value.d.ts.map +1 -0
- package/dist/src/motion/color-motion-value.js +80 -0
- package/dist/src/motion/color-motion-value.js.map +1 -0
- package/dist/src/motion/color.d.ts +30 -0
- package/dist/src/motion/color.d.ts.map +1 -0
- package/dist/src/motion/color.js +172 -0
- package/dist/src/motion/color.js.map +1 -0
- package/dist/src/motion/color.test.d.ts +2 -0
- package/dist/src/motion/color.test.d.ts.map +1 -0
- package/dist/src/motion/color.test.js +97 -0
- package/dist/src/motion/color.test.js.map +1 -0
- package/dist/src/motion/event-emitter.d.ts +18 -0
- package/dist/src/motion/event-emitter.d.ts.map +1 -0
- package/dist/src/motion/event-emitter.js +30 -0
- package/dist/src/motion/event-emitter.js.map +1 -0
- package/dist/src/motion/frame.d.ts +9 -0
- package/dist/src/motion/frame.d.ts.map +1 -0
- package/dist/src/motion/frame.js +51 -0
- package/dist/src/motion/frame.js.map +1 -0
- package/dist/src/motion/hooks.d.ts +75 -0
- package/dist/src/motion/hooks.d.ts.map +1 -0
- package/dist/src/motion/hooks.js +190 -0
- package/dist/src/motion/hooks.js.map +1 -0
- package/dist/src/motion/index.d.ts +4 -0
- package/dist/src/motion/index.d.ts.map +1 -0
- package/dist/src/motion/index.js +7 -0
- package/dist/src/motion/index.js.map +1 -0
- package/dist/src/motion/motion-value.d.ts +40 -0
- package/dist/src/motion/motion-value.d.ts.map +1 -0
- package/dist/src/motion/motion-value.js +109 -0
- package/dist/src/motion/motion-value.js.map +1 -0
- package/dist/src/motion/motion-value.test.d.ts +2 -0
- package/dist/src/motion/motion-value.test.d.ts.map +1 -0
- package/dist/src/motion/motion-value.test.js +177 -0
- package/dist/src/motion/motion-value.test.js.map +1 -0
- package/dist/src/motion/spring-math.d.ts +28 -0
- package/dist/src/motion/spring-math.d.ts.map +1 -0
- package/dist/src/motion/spring-math.js +81 -0
- package/dist/src/motion/spring-math.js.map +1 -0
- package/dist/src/motion/types.d.ts +25 -0
- package/dist/src/motion/types.d.ts.map +1 -0
- package/dist/src/motion/types.js +13 -0
- package/dist/src/motion/types.js.map +1 -0
- package/dist/src/output.d.ts +47 -0
- package/dist/src/output.d.ts.map +1 -0
- package/dist/src/output.js +125 -0
- package/dist/src/output.js.map +1 -0
- package/dist/src/profiler.d.ts +6 -0
- package/dist/src/profiler.d.ts.map +1 -0
- package/dist/src/profiler.js +73 -0
- package/dist/src/profiler.js.map +1 -0
- package/dist/src/reconciler/host-config.d.ts +16 -0
- package/dist/src/reconciler/host-config.d.ts.map +1 -0
- package/dist/src/reconciler/host-config.js +174 -0
- package/dist/src/reconciler/host-config.js.map +1 -0
- package/dist/src/reconciler/types.d.ts +52 -0
- package/dist/src/reconciler/types.d.ts.map +1 -0
- package/dist/src/reconciler/types.js +2 -0
- package/dist/src/reconciler/types.js.map +1 -0
- package/dist/src/renderer.d.ts +101 -0
- package/dist/src/renderer.d.ts.map +1 -0
- package/dist/src/renderer.js +509 -0
- package/dist/src/renderer.js.map +1 -0
- package/dist/src/terminal.d.ts +37 -0
- package/dist/src/terminal.d.ts.map +1 -0
- package/dist/src/terminal.js +65 -0
- package/dist/src/terminal.js.map +1 -0
- package/dist/src/test/index.d.ts +3 -0
- package/dist/src/test/index.d.ts.map +1 -0
- package/dist/src/test/index.js +3 -0
- package/dist/src/test/index.js.map +1 -0
- package/dist/src/test/mock-streams.d.ts +44 -0
- package/dist/src/test/mock-streams.d.ts.map +1 -0
- package/dist/src/test/mock-streams.js +136 -0
- package/dist/src/test/mock-streams.js.map +1 -0
- package/dist/src/test/render-tui.d.ts +47 -0
- package/dist/src/test/render-tui.d.ts.map +1 -0
- package/dist/src/test/render-tui.js +76 -0
- package/dist/src/test/render-tui.js.map +1 -0
- package/dist/src/trace/SpanTree.d.ts +10 -0
- package/dist/src/trace/SpanTree.d.ts.map +1 -0
- package/dist/src/trace/SpanTree.js +104 -0
- package/dist/src/trace/SpanTree.js.map +1 -0
- package/dist/src/trace/index.d.ts +30 -0
- package/dist/src/trace/index.d.ts.map +1 -0
- package/dist/src/trace/index.js +142 -0
- package/dist/src/trace/index.js.map +1 -0
- package/dist/src/trace/location.d.ts +9 -0
- package/dist/src/trace/location.d.ts.map +1 -0
- package/dist/src/trace/location.js +88 -0
- package/dist/src/trace/location.js.map +1 -0
- package/dist/src/trace/span-processor.d.ts +16 -0
- package/dist/src/trace/span-processor.d.ts.map +1 -0
- package/dist/src/trace/span-processor.js +54 -0
- package/dist/src/trace/span-processor.js.map +1 -0
- package/dist/src/trace/span-state.d.ts +79 -0
- package/dist/src/trace/span-state.d.ts.map +1 -0
- package/dist/src/trace/span-state.js +229 -0
- package/dist/src/trace/span-state.js.map +1 -0
- package/dist/src/trace/tui-logger.d.ts +8 -0
- package/dist/src/trace/tui-logger.d.ts.map +1 -0
- package/dist/src/trace/tui-logger.js +70 -0
- package/dist/src/trace/tui-logger.js.map +1 -0
- package/dist/src/utils/border.d.ts +31 -0
- package/dist/src/utils/border.d.ts.map +1 -0
- package/dist/src/utils/border.js +81 -0
- package/dist/src/utils/border.js.map +1 -0
- package/dist/src/utils/flex-layout.d.ts +20 -0
- package/dist/src/utils/flex-layout.d.ts.map +1 -0
- package/dist/src/utils/flex-layout.js +85 -0
- package/dist/src/utils/flex-layout.js.map +1 -0
- package/dist/src/utils/index.d.ts +5 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +5 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/padding.d.ts +26 -0
- package/dist/src/utils/padding.d.ts.map +1 -0
- package/dist/src/utils/padding.js +34 -0
- package/dist/src/utils/padding.js.map +1 -0
- package/dist/src/utils/styles.d.ts +13 -0
- package/dist/src/utils/styles.d.ts.map +1 -0
- package/dist/src/utils/styles.js +5 -0
- package/dist/src/utils/styles.js.map +1 -0
- package/dist/src/visualize/index.d.ts +50 -0
- package/dist/src/visualize/index.d.ts.map +1 -0
- package/dist/src/visualize/index.js +194 -0
- package/dist/src/visualize/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +94 -0
- package/src/codeblock.tsx +47 -0
- package/src/constants.ts +2 -0
- package/src/debug/DiagnosticsPanel.tsx +38 -0
- package/src/highlight.ts +76 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/use-keyboard.ts +37 -0
- package/src/hooks/use-paste.ts +14 -0
- package/src/hooks/useFrameStats.ts +32 -0
- package/src/hosts/base.ts +65 -0
- package/src/hosts/box.ts +105 -0
- package/src/hosts/canvas.ts +155 -0
- package/src/hosts/codeblock.ts +145 -0
- package/src/hosts/hstack.ts +64 -0
- package/src/hosts/index.ts +45 -0
- package/src/hosts/spacer.ts +40 -0
- package/src/hosts/text.ts +175 -0
- package/src/hosts/vstack.ts +64 -0
- package/src/hosts/zstack.ts +77 -0
- package/src/index.ts +62 -0
- package/src/inline/index.tsx +181 -0
- package/src/jsx.ts +3 -0
- package/src/motion/color-motion-value.ts +90 -0
- package/src/motion/color.test.ts +115 -0
- package/src/motion/color.ts +191 -0
- package/src/motion/event-emitter.ts +35 -0
- package/src/motion/frame.ts +59 -0
- package/src/motion/hooks.ts +237 -0
- package/src/motion/index.ts +17 -0
- package/src/motion/motion-value.test.ts +222 -0
- package/src/motion/motion-value.ts +140 -0
- package/src/motion/spring-math.ts +114 -0
- package/src/motion/types.ts +34 -0
- package/src/output.ts +156 -0
- package/src/profiler.ts +88 -0
- package/src/reconciler/host-config.ts +277 -0
- package/src/reconciler/types.ts +66 -0
- package/src/renderer.ts +661 -0
- package/src/terminal.ts +67 -0
- package/src/test/index.ts +8 -0
- package/src/test/mock-streams.ts +149 -0
- package/src/test/render-tui.ts +118 -0
- package/src/trace/SpanTree.tsx +195 -0
- package/src/trace/index.tsx +205 -0
- package/src/trace/location.ts +90 -0
- package/src/trace/span-processor.ts +65 -0
- package/src/trace/span-state.ts +286 -0
- package/src/trace/tui-logger.ts +72 -0
- package/src/utils/border.ts +108 -0
- package/src/utils/flex-layout.ts +125 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/padding.ts +45 -0
- package/src/utils/styles.ts +14 -0
- package/src/visualize/index.tsx +305 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "@effect-tui/react/jsx-runtime";
|
|
2
|
+
// Inline task visualization with Layer-based dependency injection
|
|
3
|
+
// Usage:
|
|
4
|
+
// import { task, InlineRendererLive } from "@effect-tui/react/inline"
|
|
5
|
+
// const program = Effect.gen(function* () {
|
|
6
|
+
// yield* task("Fetch user", fetchUser)
|
|
7
|
+
// yield* task("Process data", processData)
|
|
8
|
+
// }).pipe(Effect.provide(InlineRendererLive))
|
|
9
|
+
// Effect.runPromise(program)
|
|
10
|
+
import { Context, Effect, Either, Layer } from "effect";
|
|
11
|
+
import { Colors } from "@effect-tui/core";
|
|
12
|
+
import { createRenderer, createRoot } from "../renderer.js";
|
|
13
|
+
// Spinner frames
|
|
14
|
+
const SPINNER = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
|
|
15
|
+
function TaskList({ tasks, spinnerIndex }) {
|
|
16
|
+
return (_jsx("vstack", { children: tasks.map((task, i) => {
|
|
17
|
+
const icon = task.status === "running"
|
|
18
|
+
? SPINNER[spinnerIndex % SPINNER.length]
|
|
19
|
+
: task.status === "success"
|
|
20
|
+
? "✓"
|
|
21
|
+
: task.status === "failure"
|
|
22
|
+
? "✗"
|
|
23
|
+
: "○";
|
|
24
|
+
const color = task.status === "running"
|
|
25
|
+
? Colors.brightYellow
|
|
26
|
+
: task.status === "success"
|
|
27
|
+
? Colors.brightGreen
|
|
28
|
+
: task.status === "failure"
|
|
29
|
+
? Colors.brightRed
|
|
30
|
+
: Colors.gray(10);
|
|
31
|
+
return (_jsxs("hstack", { spacing: 1, children: [_jsx("text", { bold: true, fg: color, children: icon }), _jsx("text", { fg: task.status === "pending" ? Colors.gray(10) : undefined, children: task.label })] }, i));
|
|
32
|
+
}) }));
|
|
33
|
+
}
|
|
34
|
+
export const InlineRenderer = Context.GenericTag("@effect-tui/react/InlineRenderer");
|
|
35
|
+
// Create the live layer
|
|
36
|
+
export const InlineRendererLive = Layer.scoped(InlineRenderer, Effect.gen(function* () {
|
|
37
|
+
// Create renderer in inline mode
|
|
38
|
+
const renderer = createRenderer({ mode: "inline" });
|
|
39
|
+
const root = createRoot(renderer);
|
|
40
|
+
// Session state - accumulate all tasks
|
|
41
|
+
const tasks = [];
|
|
42
|
+
let spinnerIndex = 0;
|
|
43
|
+
let intervalId = null;
|
|
44
|
+
const render = () => {
|
|
45
|
+
root.render(_jsx(TaskList, { tasks: [...tasks], spinnerIndex: spinnerIndex }));
|
|
46
|
+
};
|
|
47
|
+
const startSpinner = (label) => {
|
|
48
|
+
tasks.push({ label, status: "running" });
|
|
49
|
+
spinnerIndex = 0;
|
|
50
|
+
render();
|
|
51
|
+
intervalId = setInterval(() => {
|
|
52
|
+
spinnerIndex = (spinnerIndex + 1) % SPINNER.length;
|
|
53
|
+
render();
|
|
54
|
+
}, 80);
|
|
55
|
+
};
|
|
56
|
+
const stopSpinner = (status, labelSuffix) => {
|
|
57
|
+
if (intervalId) {
|
|
58
|
+
clearInterval(intervalId);
|
|
59
|
+
intervalId = null;
|
|
60
|
+
}
|
|
61
|
+
// Update last task status
|
|
62
|
+
if (tasks.length > 0) {
|
|
63
|
+
tasks[tasks.length - 1].status = status;
|
|
64
|
+
if (labelSuffix) {
|
|
65
|
+
tasks[tasks.length - 1].label += labelSuffix;
|
|
66
|
+
}
|
|
67
|
+
render();
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
// Cleanup on scope close
|
|
71
|
+
yield* Effect.addFinalizer(() => Effect.sync(() => {
|
|
72
|
+
if (intervalId)
|
|
73
|
+
clearInterval(intervalId);
|
|
74
|
+
root.unmount();
|
|
75
|
+
}));
|
|
76
|
+
return InlineRenderer.of({
|
|
77
|
+
task: (label, effect, options) => Effect.gen(function* () {
|
|
78
|
+
startSpinner(label);
|
|
79
|
+
const result = yield* effect.pipe(Effect.either);
|
|
80
|
+
if (Either.isRight(result)) {
|
|
81
|
+
const suffix = options?.formatResult ? ` → ${options.formatResult(result.right)}` : "";
|
|
82
|
+
stopSpinner("success", suffix);
|
|
83
|
+
yield* Effect.sleep(50);
|
|
84
|
+
return result.right;
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
stopSpinner("failure");
|
|
88
|
+
yield* Effect.sleep(50);
|
|
89
|
+
return yield* Effect.fail(result.left);
|
|
90
|
+
}
|
|
91
|
+
}),
|
|
92
|
+
});
|
|
93
|
+
}));
|
|
94
|
+
/**
|
|
95
|
+
* Wrap an effect with inline progress visualization.
|
|
96
|
+
* Requires InlineRendererLive layer to be provided.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* const program = Effect.gen(function* () {
|
|
101
|
+
* const user = yield* task("Fetch user", fetchUser, {
|
|
102
|
+
* formatResult: (u) => u.name
|
|
103
|
+
* })
|
|
104
|
+
* yield* task("Send email", sendEmail(user))
|
|
105
|
+
* }).pipe(Effect.provide(InlineRendererLive))
|
|
106
|
+
*
|
|
107
|
+
* Effect.runPromise(program)
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export const task = (label, effect, options) => Effect.flatMap(InlineRenderer, (r) => r.task(label, effect, options));
|
|
111
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/inline/index.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsx.d.ts","sourceRoot":"","sources":["../../src/jsx.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAA"}
|
package/dist/src/jsx.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsx.js","sourceRoot":"","sources":["../../src/jsx.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,sEAAsE;AACtE,OAAO,EAAE,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ColorMotionValue - animates RGBA colors using 4 internal numeric springs.
|
|
3
|
+
*/
|
|
4
|
+
import { type RGBA, type ColorInput } from "./color.js";
|
|
5
|
+
import { EventEmitter } from "./event-emitter.js";
|
|
6
|
+
import type { SpringOptions } from "./types.js";
|
|
7
|
+
/**
|
|
8
|
+
* ColorMotionValue animates RGBA colors using 4 internal numeric springs.
|
|
9
|
+
* Each channel (r, g, b, a) is animated independently with the same spring config.
|
|
10
|
+
*/
|
|
11
|
+
export declare class ColorMotionValue extends EventEmitter<RGBA> {
|
|
12
|
+
private rMv;
|
|
13
|
+
private gMv;
|
|
14
|
+
private bMv;
|
|
15
|
+
private aMv;
|
|
16
|
+
constructor(initial: ColorInput);
|
|
17
|
+
/** Get current RGBA value */
|
|
18
|
+
get(): RGBA;
|
|
19
|
+
/** Set color immediately (no animation) */
|
|
20
|
+
jump(color: ColorInput): void;
|
|
21
|
+
/** Set target color and animate with spring */
|
|
22
|
+
set(color: ColorInput, options?: SpringOptions): void;
|
|
23
|
+
/** Check if any channel is animating */
|
|
24
|
+
isAnimating(): boolean;
|
|
25
|
+
/** Stop all channel animations */
|
|
26
|
+
stop(): void;
|
|
27
|
+
/** Destroy and clean up */
|
|
28
|
+
destroy(): void;
|
|
29
|
+
/** Subscribe internal motion values to a callback (used by hooks) */
|
|
30
|
+
_subscribeChannels(callback: () => void): () => void;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=color-motion-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-motion-value.d.ts","sourceRoot":"","sources":["../../../src/motion/color-motion-value.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAc,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,YAAY,CAAC,IAAI,CAAC;IACtD,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,GAAG,CAAqB;gBAEpB,OAAO,EAAE,UAAU;IAS/B,6BAA6B;IAC7B,GAAG,IAAI,IAAI;IASX,2CAA2C;IAC3C,IAAI,CAAC,KAAK,EAAE,UAAU;IAStB,+CAA+C;IAC/C,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,aAAa;IAQ9C,wCAAwC;IACxC,WAAW,IAAI,OAAO;IAItB,kCAAkC;IAClC,IAAI;IAOJ,2BAA2B;IAC3B,OAAO;IAQP,qEAAqE;IACrE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;CASrD"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ColorMotionValue - animates RGBA colors using 4 internal numeric springs.
|
|
3
|
+
*/
|
|
4
|
+
import { parseColor } from "./color.js";
|
|
5
|
+
import { EventEmitter } from "./event-emitter.js";
|
|
6
|
+
import { MotionValue } from "./motion-value.js";
|
|
7
|
+
/**
|
|
8
|
+
* ColorMotionValue animates RGBA colors using 4 internal numeric springs.
|
|
9
|
+
* Each channel (r, g, b, a) is animated independently with the same spring config.
|
|
10
|
+
*/
|
|
11
|
+
export class ColorMotionValue extends EventEmitter {
|
|
12
|
+
rMv;
|
|
13
|
+
gMv;
|
|
14
|
+
bMv;
|
|
15
|
+
aMv;
|
|
16
|
+
constructor(initial) {
|
|
17
|
+
super();
|
|
18
|
+
const rgba = parseColor(initial);
|
|
19
|
+
this.rMv = new MotionValue(rgba.r);
|
|
20
|
+
this.gMv = new MotionValue(rgba.g);
|
|
21
|
+
this.bMv = new MotionValue(rgba.b);
|
|
22
|
+
this.aMv = new MotionValue(rgba.a);
|
|
23
|
+
}
|
|
24
|
+
/** Get current RGBA value */
|
|
25
|
+
get() {
|
|
26
|
+
return {
|
|
27
|
+
r: Math.round(Math.max(0, Math.min(255, this.rMv.get()))),
|
|
28
|
+
g: Math.round(Math.max(0, Math.min(255, this.gMv.get()))),
|
|
29
|
+
b: Math.round(Math.max(0, Math.min(255, this.bMv.get()))),
|
|
30
|
+
a: Math.max(0, Math.min(1, this.aMv.get())),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** Set color immediately (no animation) */
|
|
34
|
+
jump(color) {
|
|
35
|
+
const rgba = parseColor(color);
|
|
36
|
+
this.rMv.jump(rgba.r);
|
|
37
|
+
this.gMv.jump(rgba.g);
|
|
38
|
+
this.bMv.jump(rgba.b);
|
|
39
|
+
this.aMv.jump(rgba.a);
|
|
40
|
+
this.notify("change", this.get());
|
|
41
|
+
}
|
|
42
|
+
/** Set target color and animate with spring */
|
|
43
|
+
set(color, options) {
|
|
44
|
+
const rgba = parseColor(color);
|
|
45
|
+
this.rMv.set(rgba.r, options);
|
|
46
|
+
this.gMv.set(rgba.g, options);
|
|
47
|
+
this.bMv.set(rgba.b, options);
|
|
48
|
+
this.aMv.set(rgba.a, options);
|
|
49
|
+
}
|
|
50
|
+
/** Check if any channel is animating */
|
|
51
|
+
isAnimating() {
|
|
52
|
+
return this.rMv.isAnimating() || this.gMv.isAnimating() || this.bMv.isAnimating() || this.aMv.isAnimating();
|
|
53
|
+
}
|
|
54
|
+
/** Stop all channel animations */
|
|
55
|
+
stop() {
|
|
56
|
+
this.rMv.stop();
|
|
57
|
+
this.gMv.stop();
|
|
58
|
+
this.bMv.stop();
|
|
59
|
+
this.aMv.stop();
|
|
60
|
+
}
|
|
61
|
+
/** Destroy and clean up */
|
|
62
|
+
destroy() {
|
|
63
|
+
this.rMv.destroy();
|
|
64
|
+
this.gMv.destroy();
|
|
65
|
+
this.bMv.destroy();
|
|
66
|
+
this.aMv.destroy();
|
|
67
|
+
this.clearSubscribers();
|
|
68
|
+
}
|
|
69
|
+
/** Subscribe internal motion values to a callback (used by hooks) */
|
|
70
|
+
_subscribeChannels(callback) {
|
|
71
|
+
const unsubs = [
|
|
72
|
+
this.rMv.on("change", callback),
|
|
73
|
+
this.gMv.on("change", callback),
|
|
74
|
+
this.bMv.on("change", callback),
|
|
75
|
+
this.aMv.on("change", callback),
|
|
76
|
+
];
|
|
77
|
+
return () => unsubs.forEach((u) => u());
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=color-motion-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-motion-value.js","sourceRoot":"","sources":["../../../src/motion/color-motion-value.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export type RGBA = {
|
|
2
|
+
r: number;
|
|
3
|
+
g: number;
|
|
4
|
+
b: number;
|
|
5
|
+
a: number;
|
|
6
|
+
};
|
|
7
|
+
export type ColorInput = string | RGBA | {
|
|
8
|
+
r: number;
|
|
9
|
+
g: number;
|
|
10
|
+
b: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Parse any supported color format to RGBA.
|
|
14
|
+
* Supports:
|
|
15
|
+
* - Hex: "#ff0000", "#f00", "#ff0000ff"
|
|
16
|
+
* - RGB: "rgb(255, 0, 0)", "rgba(255, 0, 0, 0.5)"
|
|
17
|
+
* - HSL: "hsl(0, 100%, 50%)", "hsla(0, 100%, 50%, 0.5)"
|
|
18
|
+
* - Object: { r: 255, g: 0, b: 0 } or { r: 255, g: 0, b: 0, a: 1 }
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseColor(input: ColorInput): RGBA;
|
|
21
|
+
/**
|
|
22
|
+
* Convert HSL to RGBA.
|
|
23
|
+
* h: 0-360, s: 0-100, l: 0-100, a: 0-1
|
|
24
|
+
*/
|
|
25
|
+
export declare function hslToRgb(h: number, s: number, l: number, a: number): RGBA;
|
|
26
|
+
/**
|
|
27
|
+
* Check if a value looks like a color input.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isColorInput(value: unknown): value is ColorInput;
|
|
30
|
+
//# sourceMappingURL=color.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../../../src/motion/color.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AACjE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5E;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CA6BlD;AA0ED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CA8CzE;AAUD;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAUhE"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
// Color parsing for spring animations
|
|
2
|
+
// Motion-compatible: hex, rgb(), rgba(), hsl(), hsla(), RGB object
|
|
3
|
+
/**
|
|
4
|
+
* Parse any supported color format to RGBA.
|
|
5
|
+
* Supports:
|
|
6
|
+
* - Hex: "#ff0000", "#f00", "#ff0000ff"
|
|
7
|
+
* - RGB: "rgb(255, 0, 0)", "rgba(255, 0, 0, 0.5)"
|
|
8
|
+
* - HSL: "hsl(0, 100%, 50%)", "hsla(0, 100%, 50%, 0.5)"
|
|
9
|
+
* - Object: { r: 255, g: 0, b: 0 } or { r: 255, g: 0, b: 0, a: 1 }
|
|
10
|
+
*/
|
|
11
|
+
export function parseColor(input) {
|
|
12
|
+
if (typeof input === "object") {
|
|
13
|
+
return {
|
|
14
|
+
r: input.r,
|
|
15
|
+
g: input.g,
|
|
16
|
+
b: input.b,
|
|
17
|
+
a: "a" in input ? input.a : 1,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const str = input.trim().toLowerCase();
|
|
21
|
+
// Hex: #rgb, #rrggbb, #rrggbbaa
|
|
22
|
+
if (str.startsWith("#")) {
|
|
23
|
+
return parseHex(str);
|
|
24
|
+
}
|
|
25
|
+
// rgb(r, g, b) or rgba(r, g, b, a)
|
|
26
|
+
if (str.startsWith("rgb")) {
|
|
27
|
+
return parseRgb(str);
|
|
28
|
+
}
|
|
29
|
+
// hsl(h, s%, l%) or hsla(h, s%, l%, a)
|
|
30
|
+
if (str.startsWith("hsl")) {
|
|
31
|
+
return parseHsl(str);
|
|
32
|
+
}
|
|
33
|
+
// Unknown format, return black
|
|
34
|
+
return { r: 0, g: 0, b: 0, a: 1 };
|
|
35
|
+
}
|
|
36
|
+
function parseHex(hex) {
|
|
37
|
+
const h = hex.slice(1);
|
|
38
|
+
if (h.length === 3) {
|
|
39
|
+
// #rgb -> #rrggbb
|
|
40
|
+
return {
|
|
41
|
+
r: parseInt(h[0] + h[0], 16),
|
|
42
|
+
g: parseInt(h[1] + h[1], 16),
|
|
43
|
+
b: parseInt(h[2] + h[2], 16),
|
|
44
|
+
a: 1,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
if (h.length === 4) {
|
|
48
|
+
// #rgba -> #rrggbbaa
|
|
49
|
+
return {
|
|
50
|
+
r: parseInt(h[0] + h[0], 16),
|
|
51
|
+
g: parseInt(h[1] + h[1], 16),
|
|
52
|
+
b: parseInt(h[2] + h[2], 16),
|
|
53
|
+
a: parseInt(h[3] + h[3], 16) / 255,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
if (h.length === 6) {
|
|
57
|
+
return {
|
|
58
|
+
r: parseInt(h.slice(0, 2), 16),
|
|
59
|
+
g: parseInt(h.slice(2, 4), 16),
|
|
60
|
+
b: parseInt(h.slice(4, 6), 16),
|
|
61
|
+
a: 1,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (h.length === 8) {
|
|
65
|
+
return {
|
|
66
|
+
r: parseInt(h.slice(0, 2), 16),
|
|
67
|
+
g: parseInt(h.slice(2, 4), 16),
|
|
68
|
+
b: parseInt(h.slice(4, 6), 16),
|
|
69
|
+
a: parseInt(h.slice(6, 8), 16) / 255,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return { r: 0, g: 0, b: 0, a: 1 };
|
|
73
|
+
}
|
|
74
|
+
function parseRgb(str) {
|
|
75
|
+
// rgb(255, 0, 0) or rgba(255, 0, 0, 0.5)
|
|
76
|
+
// Also supports spaces: rgb(255 0 0) and rgb(255 0 0 / 0.5)
|
|
77
|
+
const match = str.match(/rgba?\(\s*(\d+)\s*[,\s]\s*(\d+)\s*[,\s]\s*(\d+)\s*(?:[,/]\s*([\d.]+))?\s*\)/);
|
|
78
|
+
if (match) {
|
|
79
|
+
return {
|
|
80
|
+
r: clamp255(parseInt(match[1], 10)),
|
|
81
|
+
g: clamp255(parseInt(match[2], 10)),
|
|
82
|
+
b: clamp255(parseInt(match[3], 10)),
|
|
83
|
+
a: match[4] ? clamp1(parseFloat(match[4])) : 1,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return { r: 0, g: 0, b: 0, a: 1 };
|
|
87
|
+
}
|
|
88
|
+
function parseHsl(str) {
|
|
89
|
+
// hsl(0, 100%, 50%) or hsla(0, 100%, 50%, 0.5)
|
|
90
|
+
const match = str.match(/hsla?\(\s*(\d+)\s*[,\s]\s*([\d.]+)%?\s*[,\s]\s*([\d.]+)%?\s*(?:[,/]\s*([\d.]+))?\s*\)/);
|
|
91
|
+
if (match) {
|
|
92
|
+
const h = parseFloat(match[1]);
|
|
93
|
+
const s = parseFloat(match[2]);
|
|
94
|
+
const l = parseFloat(match[3]);
|
|
95
|
+
const a = match[4] ? clamp1(parseFloat(match[4])) : 1;
|
|
96
|
+
return hslToRgb(h, s, l, a);
|
|
97
|
+
}
|
|
98
|
+
return { r: 0, g: 0, b: 0, a: 1 };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Convert HSL to RGBA.
|
|
102
|
+
* h: 0-360, s: 0-100, l: 0-100, a: 0-1
|
|
103
|
+
*/
|
|
104
|
+
export function hslToRgb(h, s, l, a) {
|
|
105
|
+
// Normalize
|
|
106
|
+
h = ((h % 360) + 360) % 360;
|
|
107
|
+
s = clamp1(s / 100);
|
|
108
|
+
l = clamp1(l / 100);
|
|
109
|
+
const c = (1 - Math.abs(2 * l - 1)) * s;
|
|
110
|
+
const x = c * (1 - Math.abs(((h / 60) % 2) - 1));
|
|
111
|
+
const m = l - c / 2;
|
|
112
|
+
let r = 0;
|
|
113
|
+
let g = 0;
|
|
114
|
+
let b = 0;
|
|
115
|
+
if (h < 60) {
|
|
116
|
+
r = c;
|
|
117
|
+
g = x;
|
|
118
|
+
b = 0;
|
|
119
|
+
}
|
|
120
|
+
else if (h < 120) {
|
|
121
|
+
r = x;
|
|
122
|
+
g = c;
|
|
123
|
+
b = 0;
|
|
124
|
+
}
|
|
125
|
+
else if (h < 180) {
|
|
126
|
+
r = 0;
|
|
127
|
+
g = c;
|
|
128
|
+
b = x;
|
|
129
|
+
}
|
|
130
|
+
else if (h < 240) {
|
|
131
|
+
r = 0;
|
|
132
|
+
g = x;
|
|
133
|
+
b = c;
|
|
134
|
+
}
|
|
135
|
+
else if (h < 300) {
|
|
136
|
+
r = x;
|
|
137
|
+
g = 0;
|
|
138
|
+
b = c;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
r = c;
|
|
142
|
+
g = 0;
|
|
143
|
+
b = x;
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
r: Math.round((r + m) * 255),
|
|
147
|
+
g: Math.round((g + m) * 255),
|
|
148
|
+
b: Math.round((b + m) * 255),
|
|
149
|
+
a,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
function clamp255(n) {
|
|
153
|
+
return Math.max(0, Math.min(255, Math.round(n)));
|
|
154
|
+
}
|
|
155
|
+
function clamp1(n) {
|
|
156
|
+
return Math.max(0, Math.min(1, n));
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Check if a value looks like a color input.
|
|
160
|
+
*/
|
|
161
|
+
export function isColorInput(value) {
|
|
162
|
+
if (typeof value === "string") {
|
|
163
|
+
const s = value.trim().toLowerCase();
|
|
164
|
+
return s.startsWith("#") || s.startsWith("rgb") || s.startsWith("hsl");
|
|
165
|
+
}
|
|
166
|
+
if (typeof value === "object" && value !== null) {
|
|
167
|
+
const obj = value;
|
|
168
|
+
return typeof obj.r === "number" && typeof obj.g === "number" && typeof obj.b === "number";
|
|
169
|
+
}
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=color.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.js","sourceRoot":"","sources":["../../../src/motion/color.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,mEAAmE;AAKnE;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACL,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,CAAC,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC9B,CAAA;IACH,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAEtC,gCAAgC;IAChC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;IAED,mCAAmC;IACnC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;IAED,uCAAuC;IACvC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;IACtB,CAAC;IAED,+BAA+B;IAC/B,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;AACnC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAEtB,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,kBAAkB;QAClB,OAAO;YACL,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC5B,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC5B,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC5B,CAAC,EAAE,CAAC;SACL,CAAA;IACH,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,qBAAqB;QACrB,OAAO;YACL,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC5B,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC5B,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC5B,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;SACnC,CAAA;IACH,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO;YACL,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,CAAC,EAAE,CAAC;SACL,CAAA;IACH,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO;YACL,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC9B,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG;SACrC,CAAA;IACH,CAAC;IAED,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;AACnC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,yCAAyC;IACzC,4DAA4D;IAC5D,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAA;IACtG,IAAI,KAAK,EAAE,CAAC;QACV,OAAO;YACL,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/C,CAAA;IACH,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;AACnC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,+CAA+C;IAC/C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,uFAAuF,CAAC,CAAA;IAChH,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACrD,OAAO,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;IACjE,YAAY;IACZ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAA;IAC3B,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;IACnB,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;IAEnB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACvC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAChD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAEnB,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,CAAC,GAAG,CAAC,CAAA;IAET,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACX,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;IACP,CAAC;SAAM,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACnB,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;IACP,CAAC;SAAM,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACnB,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;IACP,CAAC;SAAM,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACnB,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;IACP,CAAC;SAAM,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACnB,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;IACP,CAAC;SAAM,CAAC;QACN,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;QACL,CAAC,GAAG,CAAC,CAAA;IACP,CAAC;IAED,OAAO;QACL,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QAC5B,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QAC5B,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;QAC5B,CAAC;KACF,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAClD,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACpC,OAAO,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IACxE,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,KAAgC,CAAA;QAC5C,OAAO,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,CAAA;IAC5F,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.test.d.ts","sourceRoot":"","sources":["../../../src/motion/color.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { parseColor, isColorInput } from "./color.js";
|
|
3
|
+
describe("parseColor", () => {
|
|
4
|
+
describe("hex", () => {
|
|
5
|
+
it("parses 6-digit hex", () => {
|
|
6
|
+
expect(parseColor("#ff0000")).toEqual({ r: 255, g: 0, b: 0, a: 1 });
|
|
7
|
+
expect(parseColor("#00ff00")).toEqual({ r: 0, g: 255, b: 0, a: 1 });
|
|
8
|
+
expect(parseColor("#0000ff")).toEqual({ r: 0, g: 0, b: 255, a: 1 });
|
|
9
|
+
});
|
|
10
|
+
it("parses 3-digit hex shorthand", () => {
|
|
11
|
+
expect(parseColor("#f00")).toEqual({ r: 255, g: 0, b: 0, a: 1 });
|
|
12
|
+
expect(parseColor("#0f0")).toEqual({ r: 0, g: 255, b: 0, a: 1 });
|
|
13
|
+
expect(parseColor("#00f")).toEqual({ r: 0, g: 0, b: 255, a: 1 });
|
|
14
|
+
});
|
|
15
|
+
it("parses 8-digit hex with alpha", () => {
|
|
16
|
+
expect(parseColor("#ff000080")).toEqual({ r: 255, g: 0, b: 0, a: 128 / 255 });
|
|
17
|
+
expect(parseColor("#00ff00ff")).toEqual({ r: 0, g: 255, b: 0, a: 1 });
|
|
18
|
+
});
|
|
19
|
+
it("handles case insensitivity", () => {
|
|
20
|
+
expect(parseColor("#FF0000")).toEqual({ r: 255, g: 0, b: 0, a: 1 });
|
|
21
|
+
expect(parseColor("#AbCdEf")).toEqual({ r: 171, g: 205, b: 239, a: 1 });
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe("rgb/rgba", () => {
|
|
25
|
+
it("parses rgb()", () => {
|
|
26
|
+
expect(parseColor("rgb(255, 0, 0)")).toEqual({ r: 255, g: 0, b: 0, a: 1 });
|
|
27
|
+
expect(parseColor("rgb(0, 255, 0)")).toEqual({ r: 0, g: 255, b: 0, a: 1 });
|
|
28
|
+
});
|
|
29
|
+
it("parses rgba()", () => {
|
|
30
|
+
expect(parseColor("rgba(255, 0, 0, 0.5)")).toEqual({ r: 255, g: 0, b: 0, a: 0.5 });
|
|
31
|
+
expect(parseColor("rgba(0, 255, 0, 1)")).toEqual({ r: 0, g: 255, b: 0, a: 1 });
|
|
32
|
+
});
|
|
33
|
+
it("handles spaces", () => {
|
|
34
|
+
expect(parseColor("rgb( 255 , 0 , 0 )")).toEqual({ r: 255, g: 0, b: 0, a: 1 });
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("hsl/hsla", () => {
|
|
38
|
+
it("parses hsl()", () => {
|
|
39
|
+
// Red: hsl(0, 100%, 50%)
|
|
40
|
+
const red = parseColor("hsl(0, 100%, 50%)");
|
|
41
|
+
expect(red.r).toBe(255);
|
|
42
|
+
expect(red.g).toBe(0);
|
|
43
|
+
expect(red.b).toBe(0);
|
|
44
|
+
// Green: hsl(120, 100%, 50%)
|
|
45
|
+
const green = parseColor("hsl(120, 100%, 50%)");
|
|
46
|
+
expect(green.r).toBe(0);
|
|
47
|
+
expect(green.g).toBe(255);
|
|
48
|
+
expect(green.b).toBe(0);
|
|
49
|
+
// Blue: hsl(240, 100%, 50%)
|
|
50
|
+
const blue = parseColor("hsl(240, 100%, 50%)");
|
|
51
|
+
expect(blue.r).toBe(0);
|
|
52
|
+
expect(blue.g).toBe(0);
|
|
53
|
+
expect(blue.b).toBe(255);
|
|
54
|
+
});
|
|
55
|
+
it("parses hsla() with alpha", () => {
|
|
56
|
+
const result = parseColor("hsla(0, 100%, 50%, 0.5)");
|
|
57
|
+
expect(result.r).toBe(255);
|
|
58
|
+
expect(result.a).toBe(0.5);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe("object", () => {
|
|
62
|
+
it("passes through RGB object", () => {
|
|
63
|
+
expect(parseColor({ r: 100, g: 150, b: 200 })).toEqual({ r: 100, g: 150, b: 200, a: 1 });
|
|
64
|
+
});
|
|
65
|
+
it("passes through RGBA object", () => {
|
|
66
|
+
expect(parseColor({ r: 100, g: 150, b: 200, a: 0.5 })).toEqual({ r: 100, g: 150, b: 200, a: 0.5 });
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
describe("invalid input", () => {
|
|
70
|
+
it("returns black for unknown format", () => {
|
|
71
|
+
expect(parseColor("invalid")).toEqual({ r: 0, g: 0, b: 0, a: 1 });
|
|
72
|
+
expect(parseColor("red")).toEqual({ r: 0, g: 0, b: 0, a: 1 }); // Named colors not supported
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("isColorInput", () => {
|
|
77
|
+
it("returns true for hex strings", () => {
|
|
78
|
+
expect(isColorInput("#ff0000")).toBe(true);
|
|
79
|
+
expect(isColorInput("#f00")).toBe(true);
|
|
80
|
+
});
|
|
81
|
+
it("returns true for rgb/hsl strings", () => {
|
|
82
|
+
expect(isColorInput("rgb(255, 0, 0)")).toBe(true);
|
|
83
|
+
expect(isColorInput("hsl(0, 100%, 50%)")).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
it("returns true for RGB objects", () => {
|
|
86
|
+
expect(isColorInput({ r: 255, g: 0, b: 0 })).toBe(true);
|
|
87
|
+
expect(isColorInput({ r: 255, g: 0, b: 0, a: 1 })).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
it("returns false for numbers", () => {
|
|
90
|
+
expect(isColorInput(123)).toBe(false);
|
|
91
|
+
});
|
|
92
|
+
it("returns false for invalid strings", () => {
|
|
93
|
+
expect(isColorInput("hello")).toBe(false);
|
|
94
|
+
expect(isColorInput("red")).toBe(false);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=color.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.test.js","sourceRoot":"","sources":["../../../src/motion/color.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAErD,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;QACnB,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACnE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACnE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACrE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YAChE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YAChE,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAClE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC,CAAA;YAC7E,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACvE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACnE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACzE,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YAC1E,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC5E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;YAClF,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAChF,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACxB,MAAM,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAChF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YACtB,yBAAyB;YACzB,MAAM,GAAG,GAAG,UAAU,CAAC,mBAAmB,CAAC,CAAA;YAC3C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACvB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACrB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAErB,6BAA6B;YAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAA;YAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACzB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAEvB,4BAA4B;YAC5B,MAAM,IAAI,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAA;YAC9C,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACtB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACtB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC1B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,MAAM,GAAG,UAAU,CAAC,yBAAyB,CAAC,CAAA;YACpD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC1F,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;QACpG,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACjE,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA,CAAC,6BAA6B;QAC7F,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjD,MAAM,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvD,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple event emitter base class for MotionValue and ColorMotionValue.
|
|
3
|
+
*/
|
|
4
|
+
export type EventName = "change" | "animationStart" | "animationComplete";
|
|
5
|
+
export type Subscriber<T> = (value: T) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Base class providing event subscription functionality.
|
|
8
|
+
*/
|
|
9
|
+
export declare abstract class EventEmitter<T = unknown> {
|
|
10
|
+
protected subscribers: Map<EventName, Set<Subscriber<any>>>;
|
|
11
|
+
/** Subscribe to events */
|
|
12
|
+
on<E extends EventName>(event: E, callback: Subscriber<E extends "change" ? T : void>): () => void;
|
|
13
|
+
/** Notify all subscribers of an event */
|
|
14
|
+
protected notify(event: EventName, value?: unknown): void;
|
|
15
|
+
/** Clear all subscriptions */
|
|
16
|
+
protected clearSubscribers(): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=event-emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-emitter.d.ts","sourceRoot":"","sources":["../../../src/motion/event-emitter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,gBAAgB,GAAG,mBAAmB,CAAA;AACzE,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAA;AAE9C;;GAEG;AACH,8BAAsB,YAAY,CAAC,CAAC,GAAG,OAAO;IAC5C,SAAS,CAAC,WAAW,uCAA6C;IAElE,0BAA0B;IAC1B,EAAE,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,SAAS,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,MAAM,IAAI;IAQlG,yCAAyC;IACzC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO;IAOlD,8BAA8B;IAC9B,SAAS,CAAC,gBAAgB;CAG3B"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple event emitter base class for MotionValue and ColorMotionValue.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Base class providing event subscription functionality.
|
|
6
|
+
*/
|
|
7
|
+
export class EventEmitter {
|
|
8
|
+
subscribers = new Map();
|
|
9
|
+
/** Subscribe to events */
|
|
10
|
+
on(event, callback) {
|
|
11
|
+
if (!this.subscribers.has(event)) {
|
|
12
|
+
this.subscribers.set(event, new Set());
|
|
13
|
+
}
|
|
14
|
+
this.subscribers.get(event)?.add(callback);
|
|
15
|
+
return () => this.subscribers.get(event)?.delete(callback);
|
|
16
|
+
}
|
|
17
|
+
/** Notify all subscribers of an event */
|
|
18
|
+
notify(event, value) {
|
|
19
|
+
const subs = this.subscribers.get(event);
|
|
20
|
+
if (subs) {
|
|
21
|
+
for (const cb of subs)
|
|
22
|
+
cb(value);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Clear all subscriptions */
|
|
26
|
+
clearSubscribers() {
|
|
27
|
+
this.subscribers.clear();
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=event-emitter.js.map
|