diff --git a/cmd/bustest/main.go b/cmd/bustest/main.go
deleted file mode 100644
index 66ed9aa..0000000
--- a/cmd/bustest/main.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package main
-
-import (
- lucifer3 "git.aiterp.net/lucifer3/server"
- "git.aiterp.net/lucifer3/server/services"
- "git.aiterp.net/lucifer3/server/services/effectenforcer"
- "git.aiterp.net/lucifer3/server/services/hue"
- "git.aiterp.net/lucifer3/server/services/mill"
- "git.aiterp.net/lucifer3/server/services/nanoleaf"
- "git.aiterp.net/lucifer3/server/services/tradfri"
- "time"
-)
-
-func main() {
- bus := lucifer3.EventBus{}
-
- resolver := services.NewResolver()
- sceneMap := services.NewSceneMap(resolver)
-
- bus.JoinPrivileged(resolver)
- bus.JoinPrivileged(sceneMap)
- bus.Join(effectenforcer.NewService(resolver, sceneMap))
- bus.Join(nanoleaf.NewService())
- bus.Join(hue.NewService())
- bus.Join(tradfri.NewService())
- bus.Join(mill.NewService())
-
- time.Sleep(time.Hour)
-}
diff --git a/cmd/generate-k-image/main.go b/cmd/generate-k-image/main.go
new file mode 100644
index 0000000..eb5453a
--- /dev/null
+++ b/cmd/generate-k-image/main.go
@@ -0,0 +1,47 @@
+package main
+
+import (
+ "git.aiterp.net/lucifer3/server/internal/color"
+ "image"
+ color2 "image/color"
+ "image/png"
+ "math"
+ "os"
+)
+
+func main() {
+ img := image.NewRGBA(image.Rect(0, 0, 1000, 1000))
+ for y := 0; y < 1000; y += 1 {
+ for x := 0; x < 1000; x += 1 {
+ vecX := float64(x-500) / 500.0
+ vecY := float64(y-500) / 500.0
+ dist := math.Sqrt(vecX*vecX + vecY*vecY)
+ angle := math.Mod((math.Atan2(vecY/dist, vecX/dist)*(180/math.Pi))+360+90, 360)
+
+ if dist >= 0.9 && dist < 1 && angle > 2.5 && angle < 357.5 {
+ k := 1000 + int(11000*((angle-2.5)/355))
+ c := color.Color{K: &k}
+ rgb, _ := c.ToRGB()
+ img.Set(x, y, color2.RGBA{
+ R: uint8(rgb.RGB.Red * 255.0),
+ G: uint8(rgb.RGB.Green * 255.0),
+ B: uint8(rgb.RGB.Blue * 255.0),
+ A: 255,
+ })
+ } else if dist < 0.85 {
+ rgb := (color.HueSat{Hue: math.Mod(angle+180, 360), Sat: dist / 0.85}).ToRGB()
+
+ img.Set(x, y, color2.RGBA{
+ R: uint8(rgb.Red * 255.0),
+ G: uint8(rgb.Green * 255.0),
+ B: uint8(rgb.Blue * 255.0),
+ A: 255,
+ })
+ } else {
+ img.Set(x, y, color2.RGBA{R: 0, G: 0, B: 0, A: 0})
+ }
+ }
+ }
+
+ _ = png.Encode(os.Stdout, img)
+}
diff --git a/cmd/generate-xy-image/main.go b/cmd/generate-xy-image/main.go
new file mode 100644
index 0000000..46f9483
--- /dev/null
+++ b/cmd/generate-xy-image/main.go
@@ -0,0 +1,32 @@
+package main
+
+import (
+ "git.aiterp.net/lucifer3/server/internal/color"
+ "image"
+ color2 "image/color"
+ "image/png"
+ "log"
+ "os"
+)
+
+func main() {
+ img := image.NewRGBA(image.Rect(0, 0, 500, 500))
+ for y := 0; y < 500; y += 1 {
+ for x := 0; x < 500; x += 1 {
+ rgb := (color.XY{X: float64(x) / 499, Y: float64(y) / 499}).ToRGB()
+
+ if y == 300 {
+ log.Println(rgb.Red, rgb.Green, rgb.Blue)
+ }
+
+ img.Set(x, y, color2.RGBA{
+ R: uint8(rgb.Red * 255.0),
+ G: uint8(rgb.Green * 255.0),
+ B: uint8(rgb.Blue * 255.0),
+ A: 255,
+ })
+ }
+ }
+
+ _ = png.Encode(os.Stdout, img)
+}
diff --git a/effects/manual.go b/effects/manual.go
index 45e09a8..dad1ea8 100644
--- a/effects/manual.go
+++ b/effects/manual.go
@@ -8,10 +8,10 @@ import (
)
type Manual struct {
- Power *bool `json:"power,omitempty"`
- Color *color.Color `json:"color,omitempty"`
- Intensity *float64 `json:"intensity,omitempty"`
- Temperature *float64 `json:"temperature,omitempty"`
+ Power *bool `json:"power"`
+ Color *color.Color `json:"color"`
+ Intensity *float64 `json:"intensity"`
+ Temperature *float64 `json:"temperature"`
}
func (e Manual) EffectDescription() string {
diff --git a/frontend/src/app.html b/frontend/src/app.html
index 638d1cc..0d1e6e0 100644
--- a/frontend/src/app.html
+++ b/frontend/src/app.html
@@ -4,6 +4,7 @@
+
\ No newline at end of file
diff --git a/frontend/src/lib/components/ColorPicker.svelte b/frontend/src/lib/components/ColorPicker.svelte
new file mode 100644
index 0000000..411b2ba
--- /dev/null
+++ b/frontend/src/lib/components/ColorPicker.svelte
@@ -0,0 +1,108 @@
+
+
+
+
+{#if $selectedColorPicker == id}
+
+
+ {#if xy}
+
+
+ {:else}
+
+
+ {/if}
+
+{/if}
+
+
\ No newline at end of file
diff --git a/frontend/src/lib/components/Icon.svelte b/frontend/src/lib/components/Icon.svelte
index a8340c7..df2337f 100644
--- a/frontend/src/lib/components/Icon.svelte
+++ b/frontend/src/lib/components/Icon.svelte
@@ -54,6 +54,7 @@
import { faCircleDot } from "@fortawesome/free-solid-svg-icons/faCircleDot";
import { faMasksTheater } from "@fortawesome/free-solid-svg-icons/faMasksTheater";
import { faTag } from "@fortawesome/free-solid-svg-icons/faTag";
+ import { faFilter } from "@fortawesome/free-solid-svg-icons/faFilter";
const icons = {
"clock": faClock,
@@ -88,6 +89,7 @@
"circle_dot": faCircleDot,
"masks_theater": faMasksTheater,
"tag": faTag,
+ "filter": faFilter,
};
export type IconName = keyof typeof icons;
diff --git a/frontend/src/lib/components/bforms/BFormColorOption.svelte b/frontend/src/lib/components/bforms/BFormColorOption.svelte
new file mode 100644
index 0000000..b5cb558
--- /dev/null
+++ b/frontend/src/lib/components/bforms/BFormColorOption.svelte
@@ -0,0 +1,98 @@
+
+
+
+
+
+ {#if color != null}
+
+
+
+ {/if}
+ {#if color?.xy != null}
+
+
+ {/if}
+ {#if color?.hs != null}
+
+
+ {/if}
+ {#if color?.rgb != null}
+
+
+
+ {/if}
+ {#if color?.k != null}
+
+ {/if}
+
+
+
\ No newline at end of file
diff --git a/frontend/src/lib/components/bforms/BFormDeleteOption.svelte b/frontend/src/lib/components/bforms/BFormDeleteOption.svelte
new file mode 100644
index 0000000..d50b0ab
--- /dev/null
+++ b/frontend/src/lib/components/bforms/BFormDeleteOption.svelte
@@ -0,0 +1,8 @@
+
+
+ dispatch("delete")} red state icon=trash>
diff --git a/frontend/src/lib/components/bforms/BFormIntensityOption.svelte b/frontend/src/lib/components/bforms/BFormIntensityOption.svelte
new file mode 100644
index 0000000..e3b4954
--- /dev/null
+++ b/frontend/src/lib/components/bforms/BFormIntensityOption.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/lib/components/bforms/BFormLine.svelte b/frontend/src/lib/components/bforms/BFormLine.svelte
new file mode 100644
index 0000000..0b7cb8a
--- /dev/null
+++ b/frontend/src/lib/components/bforms/BFormLine.svelte
@@ -0,0 +1,12 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/lib/components/bforms/BFormOption.svelte b/frontend/src/lib/components/bforms/BFormOption.svelte
new file mode 100644
index 0000000..e4e3aa5
--- /dev/null
+++ b/frontend/src/lib/components/bforms/BFormOption.svelte
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/lib/components/bforms/BFormParameter.svelte b/frontend/src/lib/components/bforms/BFormParameter.svelte
new file mode 100644
index 0000000..7f5f82d
--- /dev/null
+++ b/frontend/src/lib/components/bforms/BFormParameter.svelte
@@ -0,0 +1,103 @@
+
+
+{#if $enabled}
+
+
+ {#if type === "number"}
+
+ {:else if type === "text"}
+
+ {:else if type === "select"}
+
+ {/if}
+
+{/if}
+
+
diff --git a/frontend/src/lib/components/bforms/BFormPowerOption.svelte b/frontend/src/lib/components/bforms/BFormPowerOption.svelte
new file mode 100644
index 0000000..f1d14bd
--- /dev/null
+++ b/frontend/src/lib/components/bforms/BFormPowerOption.svelte
@@ -0,0 +1,17 @@
+
+
+
\ No newline at end of file
diff --git a/frontend/src/lib/components/bforms/BFormTemperatureOption.svelte b/frontend/src/lib/components/bforms/BFormTemperatureOption.svelte
new file mode 100644
index 0000000..3910fba
--- /dev/null
+++ b/frontend/src/lib/components/bforms/BFormTemperatureOption.svelte
@@ -0,0 +1,20 @@
+
+
+
+ {#if value != null}
+
+ {/if}
+
\ No newline at end of file
diff --git a/frontend/src/lib/components/scripting/ScriptAssignmentState.svelte b/frontend/src/lib/components/scripting/ScriptAssignmentState.svelte
new file mode 100644
index 0000000..34445f5
--- /dev/null
+++ b/frontend/src/lib/components/scripting/ScriptAssignmentState.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+ {#if deletable}
+
+ {/if}
+
diff --git a/frontend/src/lib/contexts/StateContext.svelte b/frontend/src/lib/contexts/StateContext.svelte
index 68ce036..2e3c41e 100644
--- a/frontend/src/lib/contexts/StateContext.svelte
+++ b/frontend/src/lib/contexts/StateContext.svelte
@@ -1,9 +1,10 @@