,
+ min: number,
+ max: number,
+ key: keyof WindmillConfig,
+ ) => {
+ const num = extractNumber(event);
+ if (num === null) {
+ return;
+ }
+ const float = parseFloat(num);
+ if (Number.isNaN(float)) {
+ onChange({ ...value, [key]: num });
+ return;
+ }
+ if (float >= min && float <= max) {
+ onChange({ ...value, [key]: num });
+ }
+ };
+
+ return (
+
+
+ handleChange(event, -90, 90, 'x')}
+ />
+ handleChange(event, -180, 180, 'y')}
+ />
+ handleChange(event, 0, 360, 'angle')}
+ />
+
+ );
+}
diff --git a/front/src/components/ux/windmill-table/parts/windmill-table-row/index.tsx b/front/src/components/ux/windmill-table/parts/windmill-table-row/index.tsx
new file mode 100644
index 0000000..ae57d36
--- /dev/null
+++ b/front/src/components/ux/windmill-table/parts/windmill-table-row/index.tsx
@@ -0,0 +1 @@
+export { WindmillTableRow } from './component';
diff --git a/front/src/components/ux/windmill-table/parts/windmill-table-row/style.module.scss b/front/src/components/ux/windmill-table/parts/windmill-table-row/style.module.scss
new file mode 100644
index 0000000..be7c298
--- /dev/null
+++ b/front/src/components/ux/windmill-table/parts/windmill-table-row/style.module.scss
@@ -0,0 +1,16 @@
+.row {
+ display: grid;
+ grid-template-columns: auto 1fr 1fr 1fr;
+}
+
+.checkboxLabel {
+ width: 46px;
+ justify-content: center;
+ border: 1px solid var(--clr-border-200);
+}
+
+.textInput {
+ border-radius: 0;
+ background-color: var(--clr-layer-200);
+ box-shadow: none;
+}
diff --git a/front/src/components/ux/windmill-table/parts/windmill-table-row/types.ts b/front/src/components/ux/windmill-table/parts/windmill-table-row/types.ts
new file mode 100644
index 0000000..7d212a7
--- /dev/null
+++ b/front/src/components/ux/windmill-table/parts/windmill-table-row/types.ts
@@ -0,0 +1,8 @@
+import { WindmillConfig } from '@components/ux/windmill-form';
+
+export type WindmillTableRowProps = {
+ value: WindmillConfig;
+ onChange: (value: WindmillConfig) => void;
+ onSelect: () => void;
+ selected: boolean;
+};
diff --git a/front/src/components/ux/windmill-table/styles.module.scss b/front/src/components/ux/windmill-table/styles.module.scss
new file mode 100644
index 0000000..e5d86de
--- /dev/null
+++ b/front/src/components/ux/windmill-table/styles.module.scss
@@ -0,0 +1,32 @@
+.table {
+ border-radius: 10px;
+ background-color: var(--clr-layer-200);
+ box-shadow: 0px 2px 2px var(--clr-shadow-100);
+}
+
+.header {
+ display: grid;
+ grid-template-columns: 46px 1fr 1fr 1fr;
+}
+
+.span {
+ padding: 13px;
+ border: 1px solid var(--clr-border-200);
+ background-color: var(--clr-layer-300);
+ text-align: center;
+
+ &:first-of-type {
+ border-top-left-radius: 10px;
+ }
+
+ &:last-of-type {
+ border-top-right-radius: 10px;
+ }
+}
+
+.footer {
+ padding: 5px;
+ border: 1px solid var(--clr-border-200);
+ border-radius: 0 0 10px 10px;
+ background-color: var(--clr-layer-300);
+}
diff --git a/front/src/components/ux/windmill-table/types.ts b/front/src/components/ux/windmill-table/types.ts
new file mode 100644
index 0000000..a7ebb07
--- /dev/null
+++ b/front/src/components/ux/windmill-table/types.ts
@@ -0,0 +1,6 @@
+import { WindmillConfig } from '../windmill-form';
+
+export type WindmillTableProps = {
+ value?: WindmillConfig[];
+ onChange?: (value: WindmillConfig[]) => void;
+};
diff --git a/front/src/store/color-theme/index.tsx b/front/src/store/color-theme/index.tsx
index ceb5a3d..95c8eff 100644
--- a/front/src/store/color-theme/index.tsx
+++ b/front/src/store/color-theme/index.tsx
@@ -1,12 +1,16 @@
-import { initializeColorTheme, setColorTheme } from '@utils/color-theme';
+import {
+ getColorTheme,
+ initializeColorTheme,
+ setColorTheme,
+} from '@utils/color-theme';
import { create } from 'zustand';
import { ColorThemeStore } from './types';
-const initialTheme = initializeColorTheme();
+initializeColorTheme();
export const useColorThemeStore = create((set) => ({
- theme: initialTheme,
+ theme: getColorTheme(),
setTheme: (theme) =>
set(() => {
setColorTheme(theme);
diff --git a/front/src/utils/array/index.ts b/front/src/utils/array/index.ts
index 04bca77..7b3a1fd 100644
--- a/front/src/utils/array/index.ts
+++ b/front/src/utils/array/index.ts
@@ -1 +1 @@
-export * from './utils';
+export { arrayToObject } from './utils';
diff --git a/front/src/utils/color-theme/utils.ts b/front/src/utils/color-theme/utils.ts
index f2a73f0..5bb4861 100644
--- a/front/src/utils/color-theme/utils.ts
+++ b/front/src/utils/color-theme/utils.ts
@@ -1,5 +1,5 @@
import { arrayToObject } from '@utils/array';
-import { STORAGE_KEYS } from 'src/storage/constants';
+import { STORAGE_KEYS } from '@utils/storage';
import { DEFAULT_THEME, THEMES } from './constants';
import { ColorTheme } from './types';
@@ -27,9 +27,7 @@ export const initializeColorTheme = () => {
const theme = getColorTheme();
if (!theme) {
setColorTheme(DEFAULT_THEME);
- return DEFAULT_THEME;
} else {
setHTMLColorTheme(theme);
- return theme;
}
};
diff --git a/front/src/utils/css/index.ts b/front/src/utils/css/index.ts
new file mode 100644
index 0000000..3b3290f
--- /dev/null
+++ b/front/src/utils/css/index.ts
@@ -0,0 +1 @@
+export { px } from './px';
diff --git a/front/src/utils/css/px.ts b/front/src/utils/css/px.ts
new file mode 100644
index 0000000..3e17125
--- /dev/null
+++ b/front/src/utils/css/px.ts
@@ -0,0 +1,3 @@
+export const px = (number: number) => {
+ return `${number}px`;
+};
diff --git a/front/src/utils/date/index.ts b/front/src/utils/date/index.ts
new file mode 100644
index 0000000..e3365cb
--- /dev/null
+++ b/front/src/utils/date/index.ts
@@ -0,0 +1 @@
+export * from './input';
diff --git a/front/src/utils/date/input.ts b/front/src/utils/date/input.ts
new file mode 100644
index 0000000..e87c4f0
--- /dev/null
+++ b/front/src/utils/date/input.ts
@@ -0,0 +1,8 @@
+export const dateToInputString = (date: Date) => {
+ const year = date.getFullYear();
+ const month = String(date.getMonth() + 1).padStart(2, '0');
+ const day = String(date.getDate()).padStart(2, '0');
+ const hours = String(date.getHours()).padStart(2, '0');
+ const minutes = String(date.getMinutes()).padStart(2, '0');
+ return `${year}-${month}-${day}T${hours}:${minutes}`;
+};
diff --git a/front/src/utils/form/control/hook.ts b/front/src/utils/form/control/hook.ts
new file mode 100644
index 0000000..8278ce2
--- /dev/null
+++ b/front/src/utils/form/control/hook.ts
@@ -0,0 +1,16 @@
+import { useCallback } from 'react';
+
+import { UseControlParams } from './types';
+
+export const useControl = ({
+ storeRef,
+}: UseControlParams) => {
+ return useCallback((name: K) => {
+ const hash = storeRef.current.hash;
+ const value = storeRef.current.values[name];
+ const onChange = (value: T[K]) => {
+ storeRef.current.values[name] = value;
+ };
+ return { name, hash, value, onChange };
+ }, []);
+};
diff --git a/front/src/utils/form/control/index.ts b/front/src/utils/form/control/index.ts
new file mode 100644
index 0000000..88a2e2a
--- /dev/null
+++ b/front/src/utils/form/control/index.ts
@@ -0,0 +1,2 @@
+export * from './hook';
+export * from './types';
diff --git a/front/src/utils/form/control/types.ts b/front/src/utils/form/control/types.ts
new file mode 100644
index 0000000..8b3da7a
--- /dev/null
+++ b/front/src/utils/form/control/types.ts
@@ -0,0 +1,5 @@
+import { FormStoreRef } from '../types';
+
+export type UseControlParams = {
+ storeRef: FormStoreRef;
+};
diff --git a/front/src/utils/form/controller/component.ts b/front/src/utils/form/controller/component.ts
new file mode 100644
index 0000000..71bbcc9
--- /dev/null
+++ b/front/src/utils/form/controller/component.ts
@@ -0,0 +1,24 @@
+import { useEffect, useState } from 'react';
+
+import { ControllerProps } from './types';
+
+export function Controller({
+ name,
+ hash,
+ value,
+ onChange,
+ render,
+}: ControllerProps) {
+ const [localValue, setLocalValue] = useState(value);
+
+ useEffect(() => {
+ setLocalValue(value);
+ }, [hash]);
+
+ const handleChange = (value: T) => {
+ setLocalValue(value);
+ onChange(value);
+ };
+
+ return render({ name, value: localValue, onChange: handleChange });
+}
diff --git a/front/src/utils/form/controller/index.ts b/front/src/utils/form/controller/index.ts
new file mode 100644
index 0000000..c86c484
--- /dev/null
+++ b/front/src/utils/form/controller/index.ts
@@ -0,0 +1,2 @@
+export * from './component';
+export * from './types';
diff --git a/front/src/utils/form/controller/types.ts b/front/src/utils/form/controller/types.ts
new file mode 100644
index 0000000..cd1bcd5
--- /dev/null
+++ b/front/src/utils/form/controller/types.ts
@@ -0,0 +1,13 @@
+export type ControllerRenderParams = {
+ name: string;
+ value: T;
+ onChange: (value: T) => void;
+};
+
+export type ControllerProps = {
+ name: string;
+ hash: number;
+ value: T;
+ onChange: (value: T) => void;
+ render: (params: ControllerRenderParams) => React.ReactNode;
+};
diff --git a/front/src/utils/form/get-values/hook.ts b/front/src/utils/form/get-values/hook.ts
new file mode 100644
index 0000000..b7b5b62
--- /dev/null
+++ b/front/src/utils/form/get-values/hook.ts
@@ -0,0 +1,11 @@
+import { useCallback } from 'react';
+
+import { UseGetFormStoreParams } from './types';
+
+export const useGetValues = ({
+ storeRef,
+}: UseGetFormStoreParams) => {
+ return useCallback(() => {
+ return storeRef.current.values;
+ }, []);
+};
diff --git a/front/src/utils/form/get-values/index.ts b/front/src/utils/form/get-values/index.ts
new file mode 100644
index 0000000..88a2e2a
--- /dev/null
+++ b/front/src/utils/form/get-values/index.ts
@@ -0,0 +1,2 @@
+export * from './hook';
+export * from './types';
diff --git a/front/src/utils/form/get-values/types.ts b/front/src/utils/form/get-values/types.ts
new file mode 100644
index 0000000..60eee43
--- /dev/null
+++ b/front/src/utils/form/get-values/types.ts
@@ -0,0 +1,5 @@
+import { FormStoreRef } from '../types';
+
+export type UseGetFormStoreParams = {
+ storeRef: FormStoreRef;
+};
diff --git a/front/src/utils/form/index.tsx b/front/src/utils/form/index.tsx
new file mode 100644
index 0000000..965c46f
--- /dev/null
+++ b/front/src/utils/form/index.tsx
@@ -0,0 +1,3 @@
+export { Controller } from './controller';
+export { type FormValues } from './types';
+export { useForm } from './use-form';
diff --git a/front/src/utils/form/register/hook.ts b/front/src/utils/form/register/hook.ts
new file mode 100644
index 0000000..9827f04
--- /dev/null
+++ b/front/src/utils/form/register/hook.ts
@@ -0,0 +1,23 @@
+import { useCallback } from 'react';
+
+import { RegistredElement, UseRegisterParams } from './types';
+import { getInputValue, setInputValue } from './util';
+
+export const useRegister = ({
+ storeRef,
+}: UseRegisterParams) => {
+ return useCallback(
+ (name: K) => {
+ const ref = (element: E) => {
+ const value = storeRef.current.values[name];
+ setInputValue(element, value);
+ };
+ const onChange = (event: React.ChangeEvent) => {
+ const value = getInputValue(event.target) as T[K];
+ storeRef.current.values[name] = value;
+ };
+ return { name, ref, onChange };
+ },
+ [],
+ );
+};
diff --git a/front/src/utils/form/register/index.ts b/front/src/utils/form/register/index.ts
new file mode 100644
index 0000000..88a2e2a
--- /dev/null
+++ b/front/src/utils/form/register/index.ts
@@ -0,0 +1,2 @@
+export * from './hook';
+export * from './types';
diff --git a/front/src/utils/form/register/types.ts b/front/src/utils/form/register/types.ts
new file mode 100644
index 0000000..ca25c9e
--- /dev/null
+++ b/front/src/utils/form/register/types.ts
@@ -0,0 +1,7 @@
+import { FormStoreRef } from '../types';
+
+export type UseRegisterParams = {
+ storeRef: FormStoreRef;
+};
+
+export type RegistredElement = HTMLInputElement | HTMLTextAreaElement;
diff --git a/front/src/utils/form/register/util.ts b/front/src/utils/form/register/util.ts
new file mode 100644
index 0000000..f35741b
--- /dev/null
+++ b/front/src/utils/form/register/util.ts
@@ -0,0 +1,30 @@
+import { RegistredElement } from './types';
+
+export const getInputValue = (element: RegistredElement) => {
+ if (element instanceof HTMLInputElement) {
+ if (element.type === 'checkbox' || element.type === 'radio') {
+ return element.checked;
+ }
+ return element.value;
+ } else if (element instanceof HTMLTextAreaElement) {
+ return element.value;
+ }
+};
+
+export const setInputValue = (
+ element: RegistredElement,
+ value: unknown,
+): void => {
+ if (!element) {
+ return;
+ }
+ if (element instanceof HTMLInputElement) {
+ if (element.type === 'checkbox' || element.type === 'radio') {
+ element.checked = (value as boolean) ?? false;
+ } else {
+ element.value = (value as string) ?? '';
+ }
+ } else if (element instanceof HTMLTextAreaElement) {
+ element.value = (value as string) ?? '';
+ }
+};
diff --git a/front/src/utils/form/reset/hook.ts b/front/src/utils/form/reset/hook.ts
new file mode 100644
index 0000000..c3bdc95
--- /dev/null
+++ b/front/src/utils/form/reset/hook.ts
@@ -0,0 +1,14 @@
+import { useCallback, useState } from 'react';
+
+import { FormValues } from '../types';
+import { UseResetParams } from './types';
+
+export const useReset = ({ storeRef }: UseResetParams) => {
+ const [, setRenderSwitch] = useState(true);
+
+ return useCallback((newValues: FormValues) => {
+ storeRef.current.values = { ...newValues };
+ storeRef.current.hash = new Date().getTime();
+ setRenderSwitch((renderSwitch) => !renderSwitch);
+ }, []);
+};
diff --git a/front/src/utils/form/reset/types.ts b/front/src/utils/form/reset/types.ts
new file mode 100644
index 0000000..e68ba7b
--- /dev/null
+++ b/front/src/utils/form/reset/types.ts
@@ -0,0 +1,5 @@
+import { FormStoreRef } from '../types';
+
+export type UseResetParams = {
+ storeRef: FormStoreRef;
+};
diff --git a/front/src/utils/form/types.ts b/front/src/utils/form/types.ts
new file mode 100644
index 0000000..684b874
--- /dev/null
+++ b/front/src/utils/form/types.ts
@@ -0,0 +1,8 @@
+export type FormValues = Partial;
+
+export type FormStore = {
+ values: FormValues;
+ hash: number;
+};
+
+export type FormStoreRef = React.MutableRefObject>;
diff --git a/front/src/utils/form/use-form/hook.ts b/front/src/utils/form/use-form/hook.ts
new file mode 100644
index 0000000..c31fac5
--- /dev/null
+++ b/front/src/utils/form/use-form/hook.ts
@@ -0,0 +1,27 @@
+import { useRef } from 'react';
+
+import { useControl } from '../control';
+import { useGetValues } from '../get-values';
+import { useRegister } from '../register';
+import { useReset } from '../reset/hook';
+import { FormStore } from '../types';
+import { UseFormParams } from './types';
+
+export const useForm = ({
+ initialValues = {},
+}: UseFormParams) => {
+ const storeRef = useRef>({
+ values: { ...initialValues },
+ hash: 0,
+ });
+
+ const register = useRegister({ storeRef });
+
+ const control = useControl({ storeRef });
+
+ const getValues = useGetValues({ storeRef });
+
+ const reset = useReset({ storeRef });
+
+ return { register, control, getValues, reset };
+};
diff --git a/front/src/utils/form/use-form/index.ts b/front/src/utils/form/use-form/index.ts
new file mode 100644
index 0000000..88a2e2a
--- /dev/null
+++ b/front/src/utils/form/use-form/index.ts
@@ -0,0 +1,2 @@
+export * from './hook';
+export * from './types';
diff --git a/front/src/utils/form/use-form/types.ts b/front/src/utils/form/use-form/types.ts
new file mode 100644
index 0000000..de9a87a
--- /dev/null
+++ b/front/src/utils/form/use-form/types.ts
@@ -0,0 +1,5 @@
+import { FormValues } from '../types';
+
+export type UseFormParams = {
+ initialValues?: FormValues;
+};
diff --git a/front/src/utils/miss-click/index.tsx b/front/src/utils/miss-click/index.tsx
index 2d53111..4b9f7d3 100644
--- a/front/src/utils/miss-click/index.tsx
+++ b/front/src/utils/miss-click/index.tsx
@@ -3,9 +3,13 @@ import { useEffect } from 'react';
export const useMissClick = (
ignore: React.MutableRefObject[],
callback: () => void,
+ visible: boolean,
) => {
useEffect(() => {
- const handler = (event: MouseEvent) => {
+ if (!visible) {
+ return;
+ }
+ const listener = (event: MouseEvent) => {
const { target } = event;
if (!(target instanceof Element)) {
return;
@@ -17,9 +21,9 @@ export const useMissClick = (
}
callback();
};
- window.addEventListener('click', handler);
+ window.addEventListener('click', listener);
return () => {
- window.removeEventListener('click', handler);
+ window.removeEventListener('click', listener);
};
- }, []);
+ }, [visible]);
};
diff --git a/front/src/storage/constants.ts b/front/src/utils/storage/constants.ts
similarity index 100%
rename from front/src/storage/constants.ts
rename to front/src/utils/storage/constants.ts
diff --git a/front/src/utils/storage/index.tsx b/front/src/utils/storage/index.tsx
new file mode 100644
index 0000000..c94f80f
--- /dev/null
+++ b/front/src/utils/storage/index.tsx
@@ -0,0 +1 @@
+export * from './constants';
diff --git a/front/tsconfig.json b/front/tsconfig.json
index a2e391d..a57cb58 100644
--- a/front/tsconfig.json
+++ b/front/tsconfig.json
@@ -2,13 +2,14 @@
"compilerOptions": {
"jsx": "react",
"target": "ES6",
+ "lib": ["dom", "ES2023"],
"moduleResolution": "Node",
"allowSyntheticDefaultImports": true,
"baseUrl": "./",
"paths": {
"@public/*": ["public/*"],
"@components/*": ["src/components/*"],
- "@storage/*": ["src/storage/*"],
+ "@storage/*": ["src/utils/storage/*"],
"@store/*": ["src/store/*"],
"@utils/*": ["src/utils/*"],
},
diff --git a/front/webpack.config.js b/front/webpack.config.js
index a40ac79..888e3d1 100644
--- a/front/webpack.config.js
+++ b/front/webpack.config.js
@@ -5,9 +5,9 @@ import TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin';
const __dirname = path.resolve();
const config = {
- entry: './routers/index.tsx',
+ entry: './src/index.tsx',
output: {
- path: path.resolve(__dirname, 'dist'),
+ path: path.resolve(__dirname, 'build'),
filename: 'main.js',
publicPath: '/',
},
@@ -30,7 +30,12 @@ const config = {
'style-loader',
{
loader: 'css-loader',
- options: { modules: { namedExport: false } },
+ options: {
+ modules: {
+ namedExport: false,
+ localIdentName: '[local]--[hash:base64:5]',
+ },
+ },
},
'sass-loader',
],
diff --git a/server/public/floris/035a179e-5d97-4adc-9c04-ab029eac2c41.png b/server/public/floris/035a179e-5d97-4adc-9c04-ab029eac2c41.png
new file mode 100644
index 0000000..1d6a3ba
Binary files /dev/null and b/server/public/floris/035a179e-5d97-4adc-9c04-ab029eac2c41.png differ
diff --git a/server/public/floris/06af7a24-8b78-4960-ab06-38d48a3f2ca3.png b/server/public/floris/06af7a24-8b78-4960-ab06-38d48a3f2ca3.png
new file mode 100644
index 0000000..46d8ceb
Binary files /dev/null and b/server/public/floris/06af7a24-8b78-4960-ab06-38d48a3f2ca3.png differ
diff --git a/server/public/floris/0bc8cac0-7d33-4e81-8987-e83462d315d3.png b/server/public/floris/0bc8cac0-7d33-4e81-8987-e83462d315d3.png
new file mode 100644
index 0000000..48a3ff0
Binary files /dev/null and b/server/public/floris/0bc8cac0-7d33-4e81-8987-e83462d315d3.png differ
diff --git a/server/public/floris/10d49437-7cfe-4916-be63-185414713dbc.png b/server/public/floris/10d49437-7cfe-4916-be63-185414713dbc.png
new file mode 100644
index 0000000..2849293
Binary files /dev/null and b/server/public/floris/10d49437-7cfe-4916-be63-185414713dbc.png differ
diff --git a/server/public/floris/11c6c379-5bbc-4b69-b9da-dc8ddfaa9fe0.png b/server/public/floris/11c6c379-5bbc-4b69-b9da-dc8ddfaa9fe0.png
new file mode 100644
index 0000000..6e2447e
Binary files /dev/null and b/server/public/floris/11c6c379-5bbc-4b69-b9da-dc8ddfaa9fe0.png differ
diff --git a/server/public/floris/16525ebd-7740-4d48-a8cf-8623b83735b6.png b/server/public/floris/16525ebd-7740-4d48-a8cf-8623b83735b6.png
new file mode 100644
index 0000000..9417ebf
Binary files /dev/null and b/server/public/floris/16525ebd-7740-4d48-a8cf-8623b83735b6.png differ
diff --git a/server/public/floris/1a216bab-847a-47e7-b199-8ed533b8913d.png b/server/public/floris/1a216bab-847a-47e7-b199-8ed533b8913d.png
new file mode 100644
index 0000000..9417ebf
Binary files /dev/null and b/server/public/floris/1a216bab-847a-47e7-b199-8ed533b8913d.png differ
diff --git a/server/public/floris/1ee71613-fc85-4268-9255-749c807eb019.png b/server/public/floris/1ee71613-fc85-4268-9255-749c807eb019.png
new file mode 100644
index 0000000..9e0ac68
Binary files /dev/null and b/server/public/floris/1ee71613-fc85-4268-9255-749c807eb019.png differ
diff --git a/server/public/floris/201e0a6d-9f88-4cc4-a0d9-8b70cb6733c9.png b/server/public/floris/201e0a6d-9f88-4cc4-a0d9-8b70cb6733c9.png
new file mode 100644
index 0000000..b2927c3
Binary files /dev/null and b/server/public/floris/201e0a6d-9f88-4cc4-a0d9-8b70cb6733c9.png differ
diff --git a/server/public/floris/21355189-7f85-45d4-ab9c-0318c641cb9e.png b/server/public/floris/21355189-7f85-45d4-ab9c-0318c641cb9e.png
new file mode 100644
index 0000000..907678c
Binary files /dev/null and b/server/public/floris/21355189-7f85-45d4-ab9c-0318c641cb9e.png differ
diff --git a/server/public/floris/227aa2c8-0fe0-4c97-a76c-3b48084720d4.png b/server/public/floris/227aa2c8-0fe0-4c97-a76c-3b48084720d4.png
new file mode 100644
index 0000000..ddb61c9
Binary files /dev/null and b/server/public/floris/227aa2c8-0fe0-4c97-a76c-3b48084720d4.png differ
diff --git a/server/public/floris/234b2ea7-23a5-4a8d-ae77-3d1ff6c9fbfe.png b/server/public/floris/234b2ea7-23a5-4a8d-ae77-3d1ff6c9fbfe.png
new file mode 100644
index 0000000..89f4743
Binary files /dev/null and b/server/public/floris/234b2ea7-23a5-4a8d-ae77-3d1ff6c9fbfe.png differ
diff --git a/server/public/floris/23eeab0b-d1c8-4878-b279-f9ab015f86d3.png b/server/public/floris/23eeab0b-d1c8-4878-b279-f9ab015f86d3.png
new file mode 100644
index 0000000..d361c2d
Binary files /dev/null and b/server/public/floris/23eeab0b-d1c8-4878-b279-f9ab015f86d3.png differ
diff --git a/server/public/floris/25135ffe-fff1-43d0-ab21-9a106f66a9c8.png b/server/public/floris/25135ffe-fff1-43d0-ab21-9a106f66a9c8.png
new file mode 100644
index 0000000..11ee447
Binary files /dev/null and b/server/public/floris/25135ffe-fff1-43d0-ab21-9a106f66a9c8.png differ
diff --git a/server/public/floris/29b9f425-d835-4349-98fe-e8b8623e0882.png b/server/public/floris/29b9f425-d835-4349-98fe-e8b8623e0882.png
new file mode 100644
index 0000000..377c46a
Binary files /dev/null and b/server/public/floris/29b9f425-d835-4349-98fe-e8b8623e0882.png differ
diff --git a/server/public/floris/3129dcf4-e51f-4506-bef7-13a25236d74d.png b/server/public/floris/3129dcf4-e51f-4506-bef7-13a25236d74d.png
new file mode 100644
index 0000000..7402c5d
Binary files /dev/null and b/server/public/floris/3129dcf4-e51f-4506-bef7-13a25236d74d.png differ
diff --git a/server/public/floris/31314a1a-5f60-476a-9f16-89319faac097.png b/server/public/floris/31314a1a-5f60-476a-9f16-89319faac097.png
new file mode 100644
index 0000000..666ac6a
Binary files /dev/null and b/server/public/floris/31314a1a-5f60-476a-9f16-89319faac097.png differ
diff --git a/server/public/floris/32e5bb87-b1c3-4702-a5ee-c3a20531cf9b.png b/server/public/floris/32e5bb87-b1c3-4702-a5ee-c3a20531cf9b.png
new file mode 100644
index 0000000..1ddc252
Binary files /dev/null and b/server/public/floris/32e5bb87-b1c3-4702-a5ee-c3a20531cf9b.png differ
diff --git a/server/public/floris/355d5282-47d5-4b0b-93e0-827a079f3f5c.png b/server/public/floris/355d5282-47d5-4b0b-93e0-827a079f3f5c.png
new file mode 100644
index 0000000..59b17a8
Binary files /dev/null and b/server/public/floris/355d5282-47d5-4b0b-93e0-827a079f3f5c.png differ
diff --git a/server/public/floris/3853a22d-7b97-4332-b376-9f5bf5bc9a32.png b/server/public/floris/3853a22d-7b97-4332-b376-9f5bf5bc9a32.png
new file mode 100644
index 0000000..7402c5d
Binary files /dev/null and b/server/public/floris/3853a22d-7b97-4332-b376-9f5bf5bc9a32.png differ
diff --git a/server/public/floris/46bd2173-0b7b-438f-a6ec-605dae8c747a.png b/server/public/floris/46bd2173-0b7b-438f-a6ec-605dae8c747a.png
new file mode 100644
index 0000000..b3f3c66
Binary files /dev/null and b/server/public/floris/46bd2173-0b7b-438f-a6ec-605dae8c747a.png differ
diff --git a/server/public/floris/4a493968-6e81-4c49-afc4-22912fd8113c.png b/server/public/floris/4a493968-6e81-4c49-afc4-22912fd8113c.png
new file mode 100644
index 0000000..5199ce6
Binary files /dev/null and b/server/public/floris/4a493968-6e81-4c49-afc4-22912fd8113c.png differ
diff --git a/server/public/floris/4b4fca7d-3d50-4c43-a882-95dcb5097dea.png b/server/public/floris/4b4fca7d-3d50-4c43-a882-95dcb5097dea.png
new file mode 100644
index 0000000..b2927c3
Binary files /dev/null and b/server/public/floris/4b4fca7d-3d50-4c43-a882-95dcb5097dea.png differ
diff --git a/server/public/floris/536f2c1f-5ba2-4132-a4f8-198b3a08049f.png b/server/public/floris/536f2c1f-5ba2-4132-a4f8-198b3a08049f.png
new file mode 100644
index 0000000..b3f3c66
Binary files /dev/null and b/server/public/floris/536f2c1f-5ba2-4132-a4f8-198b3a08049f.png differ
diff --git a/server/public/floris/5b1ea13d-614f-4c4a-8eb8-f65f5966c9a6.png b/server/public/floris/5b1ea13d-614f-4c4a-8eb8-f65f5966c9a6.png
new file mode 100644
index 0000000..02ccded
Binary files /dev/null and b/server/public/floris/5b1ea13d-614f-4c4a-8eb8-f65f5966c9a6.png differ
diff --git a/server/public/floris/5cdff5db-da5c-4b34-aa5a-77e97970f0eb.png b/server/public/floris/5cdff5db-da5c-4b34-aa5a-77e97970f0eb.png
new file mode 100644
index 0000000..b2927c3
Binary files /dev/null and b/server/public/floris/5cdff5db-da5c-4b34-aa5a-77e97970f0eb.png differ
diff --git a/server/public/floris/5d907710-3ac4-4807-9643-35d203c6c865.png b/server/public/floris/5d907710-3ac4-4807-9643-35d203c6c865.png
new file mode 100644
index 0000000..11ee447
Binary files /dev/null and b/server/public/floris/5d907710-3ac4-4807-9643-35d203c6c865.png differ
diff --git a/server/public/floris/5fa9d11b-6b0a-4446-9fee-b4e0712ed4bf.png b/server/public/floris/5fa9d11b-6b0a-4446-9fee-b4e0712ed4bf.png
new file mode 100644
index 0000000..59b17a8
Binary files /dev/null and b/server/public/floris/5fa9d11b-6b0a-4446-9fee-b4e0712ed4bf.png differ
diff --git a/server/public/floris/666e5339-abdf-42a2-95d2-08624c4d2dd0.png b/server/public/floris/666e5339-abdf-42a2-95d2-08624c4d2dd0.png
new file mode 100644
index 0000000..69a3700
Binary files /dev/null and b/server/public/floris/666e5339-abdf-42a2-95d2-08624c4d2dd0.png differ
diff --git a/server/public/floris/676bf294-4b74-426b-b68a-9a00f17d0933.png b/server/public/floris/676bf294-4b74-426b-b68a-9a00f17d0933.png
new file mode 100644
index 0000000..1791302
Binary files /dev/null and b/server/public/floris/676bf294-4b74-426b-b68a-9a00f17d0933.png differ
diff --git a/server/public/floris/6fd4366c-4a95-4000-a3c5-f3d21454cbb3.png b/server/public/floris/6fd4366c-4a95-4000-a3c5-f3d21454cbb3.png
new file mode 100644
index 0000000..2849293
Binary files /dev/null and b/server/public/floris/6fd4366c-4a95-4000-a3c5-f3d21454cbb3.png differ
diff --git a/server/public/floris/7034891f-c964-4d31-9226-7da51dbad516.png b/server/public/floris/7034891f-c964-4d31-9226-7da51dbad516.png
new file mode 100644
index 0000000..420f345
Binary files /dev/null and b/server/public/floris/7034891f-c964-4d31-9226-7da51dbad516.png differ
diff --git a/server/public/floris/72730cb8-c22d-4e5f-8fab-7f11efc3722c.png b/server/public/floris/72730cb8-c22d-4e5f-8fab-7f11efc3722c.png
new file mode 100644
index 0000000..9187106
Binary files /dev/null and b/server/public/floris/72730cb8-c22d-4e5f-8fab-7f11efc3722c.png differ
diff --git a/server/public/floris/72acf344-a507-42fd-b4a1-5bb645894b03.png b/server/public/floris/72acf344-a507-42fd-b4a1-5bb645894b03.png
new file mode 100644
index 0000000..47e3d90
Binary files /dev/null and b/server/public/floris/72acf344-a507-42fd-b4a1-5bb645894b03.png differ
diff --git a/server/public/floris/739023a2-c499-416c-b337-688765e9d168.png b/server/public/floris/739023a2-c499-416c-b337-688765e9d168.png
new file mode 100644
index 0000000..b2265fe
Binary files /dev/null and b/server/public/floris/739023a2-c499-416c-b337-688765e9d168.png differ
diff --git a/server/public/floris/75093389-2ac3-429a-90cf-83fe44891742.png b/server/public/floris/75093389-2ac3-429a-90cf-83fe44891742.png
new file mode 100644
index 0000000..94bdf74
Binary files /dev/null and b/server/public/floris/75093389-2ac3-429a-90cf-83fe44891742.png differ
diff --git a/server/public/floris/796471b9-458b-421b-9542-540d580417b4.png b/server/public/floris/796471b9-458b-421b-9542-540d580417b4.png
new file mode 100644
index 0000000..e9f0a3d
Binary files /dev/null and b/server/public/floris/796471b9-458b-421b-9542-540d580417b4.png differ
diff --git a/server/public/floris/7d5a9133-93b5-4edd-9119-519f66937c66.png b/server/public/floris/7d5a9133-93b5-4edd-9119-519f66937c66.png
new file mode 100644
index 0000000..b2d290f
Binary files /dev/null and b/server/public/floris/7d5a9133-93b5-4edd-9119-519f66937c66.png differ
diff --git a/server/public/floris/7d9ba71a-ad1b-4b6d-9596-cf4cd0a99299.png b/server/public/floris/7d9ba71a-ad1b-4b6d-9596-cf4cd0a99299.png
new file mode 100644
index 0000000..57a8a5f
Binary files /dev/null and b/server/public/floris/7d9ba71a-ad1b-4b6d-9596-cf4cd0a99299.png differ
diff --git a/server/public/floris/7dea2b6f-0ac6-4337-b8ca-65ea49bc6a2e.png b/server/public/floris/7dea2b6f-0ac6-4337-b8ca-65ea49bc6a2e.png
new file mode 100644
index 0000000..b2927c3
Binary files /dev/null and b/server/public/floris/7dea2b6f-0ac6-4337-b8ca-65ea49bc6a2e.png differ
diff --git a/server/public/floris/7f4e6ca1-4067-4fdd-94dc-40f6057f63e3.png b/server/public/floris/7f4e6ca1-4067-4fdd-94dc-40f6057f63e3.png
new file mode 100644
index 0000000..1791302
Binary files /dev/null and b/server/public/floris/7f4e6ca1-4067-4fdd-94dc-40f6057f63e3.png differ
diff --git a/server/public/floris/827bca1b-ad20-4dc6-8c57-42210e47543f.png b/server/public/floris/827bca1b-ad20-4dc6-8c57-42210e47543f.png
new file mode 100644
index 0000000..9698f5a
Binary files /dev/null and b/server/public/floris/827bca1b-ad20-4dc6-8c57-42210e47543f.png differ
diff --git a/server/public/floris/8892e6aa-e89a-4474-87d0-c4c612cfcb86.png b/server/public/floris/8892e6aa-e89a-4474-87d0-c4c612cfcb86.png
new file mode 100644
index 0000000..e0f12c0
Binary files /dev/null and b/server/public/floris/8892e6aa-e89a-4474-87d0-c4c612cfcb86.png differ
diff --git a/server/public/floris/88cac8b7-9809-4254-819e-120de581c9eb.png b/server/public/floris/88cac8b7-9809-4254-819e-120de581c9eb.png
new file mode 100644
index 0000000..b2265fe
Binary files /dev/null and b/server/public/floris/88cac8b7-9809-4254-819e-120de581c9eb.png differ
diff --git a/server/public/floris/891aa2e6-e485-491c-bf99-ba27a685da6c.png b/server/public/floris/891aa2e6-e485-491c-bf99-ba27a685da6c.png
new file mode 100644
index 0000000..488490d
Binary files /dev/null and b/server/public/floris/891aa2e6-e485-491c-bf99-ba27a685da6c.png differ
diff --git a/server/public/floris/89f8b3a8-3765-48fe-9cb3-ad9daf803190.png b/server/public/floris/89f8b3a8-3765-48fe-9cb3-ad9daf803190.png
new file mode 100644
index 0000000..923281f
Binary files /dev/null and b/server/public/floris/89f8b3a8-3765-48fe-9cb3-ad9daf803190.png differ
diff --git a/server/public/floris/8a5dbea5-95e5-4b5d-aa82-5165cf4bf748.png b/server/public/floris/8a5dbea5-95e5-4b5d-aa82-5165cf4bf748.png
new file mode 100644
index 0000000..dd887fb
Binary files /dev/null and b/server/public/floris/8a5dbea5-95e5-4b5d-aa82-5165cf4bf748.png differ
diff --git a/server/public/floris/90d8abed-8155-4eeb-a427-ba23798ade1b.png b/server/public/floris/90d8abed-8155-4eeb-a427-ba23798ade1b.png
new file mode 100644
index 0000000..b49dce0
Binary files /dev/null and b/server/public/floris/90d8abed-8155-4eeb-a427-ba23798ade1b.png differ
diff --git a/server/public/floris/9130196b-589a-4f64-b08c-82c254dfc45d.png b/server/public/floris/9130196b-589a-4f64-b08c-82c254dfc45d.png
new file mode 100644
index 0000000..b3f3c66
Binary files /dev/null and b/server/public/floris/9130196b-589a-4f64-b08c-82c254dfc45d.png differ
diff --git a/server/public/floris/935e2143-0706-46d4-9246-5e0bf92633f2.png b/server/public/floris/935e2143-0706-46d4-9246-5e0bf92633f2.png
new file mode 100644
index 0000000..0e3d28c
Binary files /dev/null and b/server/public/floris/935e2143-0706-46d4-9246-5e0bf92633f2.png differ
diff --git a/server/public/floris/95b56284-e148-4578-aed2-5ac2516671f5.png b/server/public/floris/95b56284-e148-4578-aed2-5ac2516671f5.png
new file mode 100644
index 0000000..e0f12c0
Binary files /dev/null and b/server/public/floris/95b56284-e148-4578-aed2-5ac2516671f5.png differ
diff --git a/server/public/floris/9880c167-2063-4cd5-b7cf-f777fe66c7dc.png b/server/public/floris/9880c167-2063-4cd5-b7cf-f777fe66c7dc.png
new file mode 100644
index 0000000..3535b8b
Binary files /dev/null and b/server/public/floris/9880c167-2063-4cd5-b7cf-f777fe66c7dc.png differ
diff --git a/server/public/floris/9a553ecd-7dbe-4ac4-af1e-c3f240cbd0e5.png b/server/public/floris/9a553ecd-7dbe-4ac4-af1e-c3f240cbd0e5.png
new file mode 100644
index 0000000..b2927c3
Binary files /dev/null and b/server/public/floris/9a553ecd-7dbe-4ac4-af1e-c3f240cbd0e5.png differ
diff --git a/server/public/floris/9f0341b1-b3aa-420c-a992-488ea3089704.png b/server/public/floris/9f0341b1-b3aa-420c-a992-488ea3089704.png
new file mode 100644
index 0000000..dd887fb
Binary files /dev/null and b/server/public/floris/9f0341b1-b3aa-420c-a992-488ea3089704.png differ
diff --git a/server/public/floris/9f4c97bb-5283-48b1-b63a-0edf4dd6719b.png b/server/public/floris/9f4c97bb-5283-48b1-b63a-0edf4dd6719b.png
new file mode 100644
index 0000000..4f85b5e
Binary files /dev/null and b/server/public/floris/9f4c97bb-5283-48b1-b63a-0edf4dd6719b.png differ
diff --git a/server/public/floris/a32bc4ae-2b8d-4385-afcb-f2d52438ecca.png b/server/public/floris/a32bc4ae-2b8d-4385-afcb-f2d52438ecca.png
new file mode 100644
index 0000000..1abd96b
Binary files /dev/null and b/server/public/floris/a32bc4ae-2b8d-4385-afcb-f2d52438ecca.png differ
diff --git a/server/public/floris/a46a6ec8-37d1-46fa-bbcd-742095bb2dbc.png b/server/public/floris/a46a6ec8-37d1-46fa-bbcd-742095bb2dbc.png
new file mode 100644
index 0000000..d9edcc1
Binary files /dev/null and b/server/public/floris/a46a6ec8-37d1-46fa-bbcd-742095bb2dbc.png differ
diff --git a/server/public/floris/a570d3f5-8211-4f45-b41a-813cddc0ae75.png b/server/public/floris/a570d3f5-8211-4f45-b41a-813cddc0ae75.png
new file mode 100644
index 0000000..666ac6a
Binary files /dev/null and b/server/public/floris/a570d3f5-8211-4f45-b41a-813cddc0ae75.png differ
diff --git a/server/public/floris/a6e854d5-c47b-4544-a4a0-5b72f647a935.png b/server/public/floris/a6e854d5-c47b-4544-a4a0-5b72f647a935.png
new file mode 100644
index 0000000..666ac6a
Binary files /dev/null and b/server/public/floris/a6e854d5-c47b-4544-a4a0-5b72f647a935.png differ
diff --git a/server/public/floris/ac5d2be4-35f3-493b-92e7-255d26bd82a5.png b/server/public/floris/ac5d2be4-35f3-493b-92e7-255d26bd82a5.png
new file mode 100644
index 0000000..e8c5acc
Binary files /dev/null and b/server/public/floris/ac5d2be4-35f3-493b-92e7-255d26bd82a5.png differ
diff --git a/server/public/floris/b79e2789-464a-4800-8dfd-57d05d61d5a1.png b/server/public/floris/b79e2789-464a-4800-8dfd-57d05d61d5a1.png
new file mode 100644
index 0000000..1791302
Binary files /dev/null and b/server/public/floris/b79e2789-464a-4800-8dfd-57d05d61d5a1.png differ
diff --git a/server/public/floris/bb06d08e-fea3-4d15-b58f-9a328192c449.png b/server/public/floris/bb06d08e-fea3-4d15-b58f-9a328192c449.png
new file mode 100644
index 0000000..59ad706
Binary files /dev/null and b/server/public/floris/bb06d08e-fea3-4d15-b58f-9a328192c449.png differ
diff --git a/server/public/floris/bea5009e-fcd8-412d-ae18-8a8207e715e2.png b/server/public/floris/bea5009e-fcd8-412d-ae18-8a8207e715e2.png
new file mode 100644
index 0000000..a08fb13
Binary files /dev/null and b/server/public/floris/bea5009e-fcd8-412d-ae18-8a8207e715e2.png differ
diff --git a/server/public/floris/bee4effc-e476-455b-95e1-ff4375402fbb.png b/server/public/floris/bee4effc-e476-455b-95e1-ff4375402fbb.png
new file mode 100644
index 0000000..9698f5a
Binary files /dev/null and b/server/public/floris/bee4effc-e476-455b-95e1-ff4375402fbb.png differ
diff --git a/server/public/floris/c4a606de-669f-45a2-b8a8-1d5f044103a4.png b/server/public/floris/c4a606de-669f-45a2-b8a8-1d5f044103a4.png
new file mode 100644
index 0000000..53c3e8f
Binary files /dev/null and b/server/public/floris/c4a606de-669f-45a2-b8a8-1d5f044103a4.png differ
diff --git a/server/public/floris/cf3a0493-c8a8-4967-87d4-7c3016f7a887.png b/server/public/floris/cf3a0493-c8a8-4967-87d4-7c3016f7a887.png
new file mode 100644
index 0000000..2574601
Binary files /dev/null and b/server/public/floris/cf3a0493-c8a8-4967-87d4-7c3016f7a887.png differ
diff --git a/server/public/floris/cf9e1696-1a96-427f-82fe-2ac042fd3178.png b/server/public/floris/cf9e1696-1a96-427f-82fe-2ac042fd3178.png
new file mode 100644
index 0000000..2d7a9db
Binary files /dev/null and b/server/public/floris/cf9e1696-1a96-427f-82fe-2ac042fd3178.png differ
diff --git a/server/public/floris/d0ef5542-8044-49ec-a744-f2e367b52bba.png b/server/public/floris/d0ef5542-8044-49ec-a744-f2e367b52bba.png
new file mode 100644
index 0000000..8a79c33
Binary files /dev/null and b/server/public/floris/d0ef5542-8044-49ec-a744-f2e367b52bba.png differ
diff --git a/server/public/floris/d3630984-05d1-4732-8830-c93a27e05782.png b/server/public/floris/d3630984-05d1-4732-8830-c93a27e05782.png
new file mode 100644
index 0000000..3036a91
Binary files /dev/null and b/server/public/floris/d3630984-05d1-4732-8830-c93a27e05782.png differ
diff --git a/server/public/floris/d7ab3f3c-2bf9-4f16-81c9-4946aadc0648.png b/server/public/floris/d7ab3f3c-2bf9-4f16-81c9-4946aadc0648.png
new file mode 100644
index 0000000..39b486c
Binary files /dev/null and b/server/public/floris/d7ab3f3c-2bf9-4f16-81c9-4946aadc0648.png differ
diff --git a/server/public/floris/d9b256a1-468c-434b-a9f9-e92c1019f360.png b/server/public/floris/d9b256a1-468c-434b-a9f9-e92c1019f360.png
new file mode 100644
index 0000000..b2927c3
Binary files /dev/null and b/server/public/floris/d9b256a1-468c-434b-a9f9-e92c1019f360.png differ
diff --git a/server/public/floris/d9e2a707-c2d7-4eaa-a733-66444bd1e5a0.png b/server/public/floris/d9e2a707-c2d7-4eaa-a733-66444bd1e5a0.png
new file mode 100644
index 0000000..e8c5acc
Binary files /dev/null and b/server/public/floris/d9e2a707-c2d7-4eaa-a733-66444bd1e5a0.png differ
diff --git a/server/public/floris/dc3e8cb1-7d7c-4914-aee2-cf5d2750aa1c.png b/server/public/floris/dc3e8cb1-7d7c-4914-aee2-cf5d2750aa1c.png
new file mode 100644
index 0000000..b2265fe
Binary files /dev/null and b/server/public/floris/dc3e8cb1-7d7c-4914-aee2-cf5d2750aa1c.png differ
diff --git a/server/public/floris/de88c5da-c7e5-4bcc-b848-8581cacbc309.png b/server/public/floris/de88c5da-c7e5-4bcc-b848-8581cacbc309.png
new file mode 100644
index 0000000..44a1cf1
Binary files /dev/null and b/server/public/floris/de88c5da-c7e5-4bcc-b848-8581cacbc309.png differ
diff --git a/server/public/floris/e094937c-5b79-4fa8-b0ad-1d39c11eb419.png b/server/public/floris/e094937c-5b79-4fa8-b0ad-1d39c11eb419.png
new file mode 100644
index 0000000..1ddc252
Binary files /dev/null and b/server/public/floris/e094937c-5b79-4fa8-b0ad-1d39c11eb419.png differ
diff --git a/server/public/floris/e0edd7fd-8dca-46ce-9b10-6f33e73cd1b8.png b/server/public/floris/e0edd7fd-8dca-46ce-9b10-6f33e73cd1b8.png
new file mode 100644
index 0000000..4925bd5
Binary files /dev/null and b/server/public/floris/e0edd7fd-8dca-46ce-9b10-6f33e73cd1b8.png differ
diff --git a/server/public/floris/e15a6bf8-e08f-426b-96b0-efe3f95cdab1.png b/server/public/floris/e15a6bf8-e08f-426b-96b0-efe3f95cdab1.png
new file mode 100644
index 0000000..c1a26dd
Binary files /dev/null and b/server/public/floris/e15a6bf8-e08f-426b-96b0-efe3f95cdab1.png differ
diff --git a/server/public/floris/e35293fd-043f-4866-b3e9-6ff75c92eab8.png b/server/public/floris/e35293fd-043f-4866-b3e9-6ff75c92eab8.png
new file mode 100644
index 0000000..9698f5a
Binary files /dev/null and b/server/public/floris/e35293fd-043f-4866-b3e9-6ff75c92eab8.png differ
diff --git a/server/public/floris/e544e81f-989f-44e4-a3a4-d58cc8824ccb.png b/server/public/floris/e544e81f-989f-44e4-a3a4-d58cc8824ccb.png
new file mode 100644
index 0000000..dd887fb
Binary files /dev/null and b/server/public/floris/e544e81f-989f-44e4-a3a4-d58cc8824ccb.png differ
diff --git a/server/public/floris/ebdc4e43-53a6-4ec1-a7d7-d9dae8e06397.png b/server/public/floris/ebdc4e43-53a6-4ec1-a7d7-d9dae8e06397.png
new file mode 100644
index 0000000..a7245a1
Binary files /dev/null and b/server/public/floris/ebdc4e43-53a6-4ec1-a7d7-d9dae8e06397.png differ
diff --git a/server/public/floris/f0650bc4-1301-4440-be56-89a223b80018.png b/server/public/floris/f0650bc4-1301-4440-be56-89a223b80018.png
new file mode 100644
index 0000000..a08fb13
Binary files /dev/null and b/server/public/floris/f0650bc4-1301-4440-be56-89a223b80018.png differ
diff --git a/server/public/floris/f401df27-2e48-49aa-b455-d84a7cb025e4.png b/server/public/floris/f401df27-2e48-49aa-b455-d84a7cb025e4.png
new file mode 100644
index 0000000..c2ed1f7
Binary files /dev/null and b/server/public/floris/f401df27-2e48-49aa-b455-d84a7cb025e4.png differ
diff --git a/server/public/floris/f66ca7d5-3983-4220-aac9-94fd4ca689dd.png b/server/public/floris/f66ca7d5-3983-4220-aac9-94fd4ca689dd.png
new file mode 100644
index 0000000..1ddc252
Binary files /dev/null and b/server/public/floris/f66ca7d5-3983-4220-aac9-94fd4ca689dd.png differ
diff --git a/server/public/floris/fb3ec95d-ef0b-4214-92fc-60fdbff20a69.png b/server/public/floris/fb3ec95d-ef0b-4214-92fc-60fdbff20a69.png
new file mode 100644
index 0000000..2063c75
Binary files /dev/null and b/server/public/floris/fb3ec95d-ef0b-4214-92fc-60fdbff20a69.png differ
diff --git a/server/public/floris/fb81bda6-a28b-475a-8e29-154da40e12d6.png b/server/public/floris/fb81bda6-a28b-475a-8e29-154da40e12d6.png
new file mode 100644
index 0000000..b84254d
Binary files /dev/null and b/server/public/floris/fb81bda6-a28b-475a-8e29-154da40e12d6.png differ
diff --git a/server/requirements.txt b/server/requirements.txt
index ad67f03..b1b41c5 100644
--- a/server/requirements.txt
+++ b/server/requirements.txt
@@ -31,4 +31,4 @@ typing_extensions==4.12.2
uvicorn==0.30.6
watchfiles==0.24.0
websockets==13.1
-PyMySQL=1.1.1
+PyMySQL==1.1.1
diff --git a/server/src/.cache.sqlite b/server/src/.cache.sqlite
new file mode 100644
index 0000000..b9bebe0
Binary files /dev/null and b/server/src/.cache.sqlite differ
diff --git a/server/src/main.py b/server/src/main.py
index a4a7788..78939e1 100644
--- a/server/src/main.py
+++ b/server/src/main.py
@@ -9,10 +9,24 @@ from fastapi.staticfiles import StaticFiles
from routers.floris_router import router as floris_router
from routers.floris_template_router import router as floris_template_router
from routers.weather_router import router as weather_router
+from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
+origins = [
+ "http://localhost:5000",
+ "*"
+]
+
+app.add_middleware(
+ CORSMiddleware,
+ allow_origins=origins,
+ allow_credentials=True,
+ allow_methods=["*"],
+ allow_headers=["*"],
+)
+
app.mount("/static", StaticFiles(directory=Path("../static")), name="static")
app.mount("/public", StaticFiles(directory=Path("../public")), name="public")