diff --git a/.gitignore b/.gitignore index f63292a08..0f043ebac 100644 --- a/.gitignore +++ b/.gitignore @@ -43,5 +43,5 @@ asset-stats.html /playwright/.cache/ .gitpod.yml /evcc.db - +/tsconfig.tsbuildinfo *storybook.log diff --git a/.vscode/extensions.json b/.vscode/extensions.json index dc9cabb64..7e9078b78 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -4,5 +4,6 @@ "vitest.explorer", "golang.go", "esbenp.prettier-vscode", + "yoavbls.pretty-ts-errors", ] } diff --git a/assets/js/app.js b/assets/js/app.js index abbb32f1d..164052c78 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -22,12 +22,12 @@ const app = createApp({ return { notifications: [], offline: false }; }, watch: { - offline: function (value) { + offline(value) { console.log(`we are ${value ? "offline" : "online"}`); }, }, methods: { - raise: function (msg) { + raise(msg) { if (this.offline) return; if (!msg.level) msg.level = "error"; const now = new Date(); @@ -46,19 +46,19 @@ const app = createApp({ ]; } }, - clear: function () { + clear() { this.notifications = []; }, - setOnline: function () { + setOnline() { this.offline = false; sendToApp({ type: "online" }); }, - setOffline: function () { + setOffline() { this.offline = true; sendToApp({ type: "offline" }); }, }, - render: function () { + render() { return h(App, { notifications: this.notifications, offline: this.offline }); }, }); diff --git a/assets/js/colors.js b/assets/js/colors.js deleted file mode 100644 index 25f2be076..000000000 --- a/assets/js/colors.js +++ /dev/null @@ -1,75 +0,0 @@ -import { reactive } from "vue"; - -// alternatives -// const COLORS = [ "#40916C", "#52B788", "#74C69D", "#95D5B2", "#B7E4C7", "#D8F3DC", "#081C15", "#1B4332", "#2D6A4F"]; -// const COLORS = ["#577590", "#43AA8B", "#90BE6D", "#F9C74F", "#F8961E", "#F3722C", "#F94144"]; -// const COLORS = ["#0077b6", "#00b4d8", "#90e0ef", "#caf0f8", "#03045e"]; -// const COLORS = [ "#0077B6FF", "#0096C7FF", "#00B4D8FF", "#48CAE4FF", "#90E0EFFF", "#ADE8F4FF", "#CAF0F8FF", "#03045EFF", "#023E8AFF", -// const COLORS = [ "#0077B6FF", "#00B4D8FF", "#90E0EFFF", "#40A578FF", "#9DDE8BFF", "#F8961EFF", "#F9C74FFF", "#E6FF94FF"]; - -const colors = reactive({ - text: null, - muted: null, - border: null, - self: null, - grid: null, - co2PerKWh: null, - pricePerKWh: null, - price: null, - co2: null, - background: null, - light: null, - selfPalette: ["#0FDE41FF", "#FFBD2FFF", "#FD6158FF", "#03C1EFFF", "#0F662DFF", "#FF922EFF"], - palette: [ - "#03C1EFFF", - "#FD6158FF", - "#31AB4AFF", - "#41517AFF", - "#FF922EFF", - "#0F662DFF", - "#0470D4FF", - "#FFBD2FFF", - "#77C93EFF", - "#4E1D10FF", - "#0AAFBFFF", - "#813504FF", - ], -}); - -export const dimColor = (color) => { - return color.toLowerCase().replace(/ff$/, "20"); -}; - -export const lighterColor = (color) => { - return color.toLowerCase().replace(/ff$/, "aa"); -}; - -export const fullColor = (color) => { - return color.toLowerCase().replace(/20$/, "ff"); -}; - -function updateCssColors() { - const style = window.getComputedStyle(document.documentElement); - colors.text = style.getPropertyValue("--evcc-default-text"); - colors.muted = style.getPropertyValue("--bs-gray-medium"); - colors.border = style.getPropertyValue("--bs-border-color-translucent"); - colors.self = style.getPropertyValue("--evcc-self"); - colors.grid = style.getPropertyValue("--evcc-grid"); - colors.price = style.getPropertyValue("--evcc-price"); - colors.co2 = style.getPropertyValue("--evcc-co2"); - colors.background = style.getPropertyValue("--evcc-background"); - colors.pricePerKWh = style.getPropertyValue("--bs-gray-medium"); - colors.co2PerKWh = style.getPropertyValue("--bs-gray-medium"); - colors.light = style.getPropertyValue("--bs-gray-light"); -} - -// update colors on theme change -const darkModeMatcher = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)"); -if (darkModeMatcher && darkModeMatcher.addEventListener) { - darkModeMatcher.addEventListener("change", updateCssColors); -} -// initialize colors -updateCssColors(); -window.requestAnimationFrame(updateCssColors); - -export default colors; diff --git a/assets/js/colors.ts b/assets/js/colors.ts new file mode 100644 index 000000000..649598ae9 --- /dev/null +++ b/assets/js/colors.ts @@ -0,0 +1,89 @@ +import { reactive } from "vue"; + +// alternatives +// const COLORS = [ "#40916C", "#52B788", "#74C69D", "#95D5B2", "#B7E4C7", "#D8F3DC", "#081C15", "#1B4332", "#2D6A4F"]; +// const COLORS = ["#577590", "#43AA8B", "#90BE6D", "#F9C74F", "#F8961E", "#F3722C", "#F94144"]; +// const COLORS = ["#0077b6", "#00b4d8", "#90e0ef", "#caf0f8", "#03045e"]; +// const COLORS = [ "#0077B6FF", "#0096C7FF", "#00B4D8FF", "#48CAE4FF", "#90E0EFFF", "#ADE8F4FF", "#CAF0F8FF", "#03045EFF", "#023E8AFF", +// const COLORS = [ "#0077B6FF", "#00B4D8FF", "#90E0EFFF", "#40A578FF", "#9DDE8BFF", "#F8961EFF", "#F9C74FFF", "#E6FF94FF"]; + +const colors: { + text: string | null; + muted: string | null; + border: string | null; + self: string | null; + grid: string | null; + co2PerKWh: string | null; + pricePerKWh: string | null; + price: string | null; + co2: string | null; + background: string | null; + light: string | null; + selfPalette: string[]; + palette: string[]; +} = reactive({ + text: null, + muted: null, + border: null, + self: null, + grid: null, + co2PerKWh: null, + pricePerKWh: null, + price: null, + co2: null, + background: null, + light: null, + selfPalette: ["#0FDE41FF", "#FFBD2FFF", "#FD6158FF", "#03C1EFFF", "#0F662DFF", "#FF922EFF"], + palette: [ + "#03C1EFFF", + "#FD6158FF", + "#31AB4AFF", + "#41517AFF", + "#FF922EFF", + "#0F662DFF", + "#0470D4FF", + "#FFBD2FFF", + "#77C93EFF", + "#4E1D10FF", + "#0AAFBFFF", + "#813504FF", + ], +}); + +export const dimColor = (color: string | null) => { + return color?.toLowerCase().replace(/ff$/, "20"); +}; + +export const lighterColor = (color: string | null) => { + return color?.toLowerCase().replace(/ff$/, "aa"); +}; + +export const fullColor = (color: string | null) => { + return color?.toLowerCase().replace(/20$/, "ff"); +}; + +function updateCssColors() { + const style = window.getComputedStyle(document.documentElement); + colors.text = style.getPropertyValue("--evcc-default-text"); + colors.muted = style.getPropertyValue("--bs-gray-medium"); + colors.border = style.getPropertyValue("--bs-border-color-translucent"); + colors.self = style.getPropertyValue("--evcc-self"); + colors.grid = style.getPropertyValue("--evcc-grid"); + colors.price = style.getPropertyValue("--evcc-price"); + colors.co2 = style.getPropertyValue("--evcc-co2"); + colors.background = style.getPropertyValue("--evcc-background"); + colors.pricePerKWh = style.getPropertyValue("--bs-gray-medium"); + colors.co2PerKWh = style.getPropertyValue("--bs-gray-medium"); + colors.light = style.getPropertyValue("--bs-gray-light"); +} + +// update colors on theme change +const darkModeMatcher = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)"); +if (darkModeMatcher && darkModeMatcher.addEventListener) { + darkModeMatcher.addEventListener("change", updateCssColors); +} +// initialize colors +updateCssColors(); +window.requestAnimationFrame(updateCssColors); + +export default colors; diff --git a/assets/js/components/Auth/PasswordModal.vue b/assets/js/components/Auth/PasswordModal.vue index 2badc9c2f..d4b8c3fde 100644 --- a/assets/js/components/Auth/PasswordModal.vue +++ b/assets/js/components/Auth/PasswordModal.vue @@ -85,7 +85,7 @@ -