();
+
+ readonly #renderHooks: RenderHooks;
+
+ readonly #Wrapper: () => ReactElement | null;
+
+ #unmounting?: Promise;
+
+ constructor() {
+ super();
+ this.#renderHooks = {
+ useState: this.useState.bind(this),
+ useCustomEvent: this.useCustomEvent.bind(this),
+ useContent: this.useContent.bind(this)
+ };
+ this.#Wrapper = this.#renderWrapper.bind(this);
+ this.#markAsUsed();
+ }
+
+ public async connectedCallback() {
+ this.#rendering = createElement(this.#Wrapper);
+ const createNewRoot = this.dispatchEvent(
+ new CustomEvent('flow-portal-add', {
+ bubbles: true,
+ cancelable: true,
+ composed: true,
+ detail: {
+ children: this.#rendering,
+ domNode: this
+ }
+ })
+ );
+
+ if (!createNewRoot || this.#root) {
+ return;
+ }
+
+ await this.#unmounting;
+
+ this.#root = createRoot(this);
+ this.#maybeRenderRoot();
+ this.#root.render(this.#rendering);
+ }
+
+ /**
+ * Add a callback for specified element identifier to be called when
+ * react element is ready.
+ *
+ * For internal use only. May be renamed or removed in a future release.
+ *
+ * @param id element identifier that callback is for
+ * @param readyCallback callback method to be informed on element ready state
+ * @internal
+ */
+ public addReadyCallback(id: string, readyCallback: ReadyCallbackFunction) {
+ this.#readyCallback.set(id, readyCallback);
+ }
+
+ public async disconnectedCallback() {
+ if (!this.#root) {
+ this.dispatchEvent(
+ new CustomEvent('flow-portal-remove', {
+ bubbles: true,
+ cancelable: true,
+ composed: true,
+ detail: {
+ children: this.#rendering,
+ domNode: this
+ }
+ })
+ );
+ } else {
+ this.#unmounting = Promise.resolve();
+ await this.#unmounting;
+ this.#root.unmount();
+ this.#root = undefined;
+ }
+ this.#rootRendered = false;
+ this.#rendering = undefined;
+ }
+
+ /**
+ * A hook API for using stateful JS properties of the Web Component from
+ * the React `render()`.
+ *
+ * @typeParam T - Type of the state value
+ *
+ * @param key - Web Component property name, which is used for two-way
+ * value propagation from the server and back.
+ * @param initialValue - Fallback initial value (optional). Only applies if
+ * the Java component constructor does not invoke `setState`.
+ * @returns A tuple with two values:
+ * 1. The current state.
+ * 2. The `set` function for changing the state and triggering render
+ * @protected
+ */
+ protected useState(key: string, initialValue?: T): [value: T, setValue: Dispatch] {
+ if (this.#stateSetters.has(key)) {
+ return [this.#state[key] as T, this.#stateSetters.get(key)!];
+ }
+
+ const value = ((this as Record)[key] as T) ?? initialValue!;
+ this.#state[key] = value;
+ Object.defineProperty(this, key, {
+ enumerable: true,
+ get(): T {
+ return this.#state[key];
+ },
+ set(nextValue: T) {
+ this.#state[key] = nextValue;
+ this.#dispatchFlowState({ type: 'stateKeyChanged', key, value });
+ }
+ });
+
+ const dispatchChangedEvent = this.useCustomEvent<{ value: T }>(`${key}-changed`, { detail: { value } });
+ const setValue = (value: T) => {
+ this.#state[key] = value;
+ dispatchChangedEvent({ value });
+ this.#dispatchFlowState({ type: 'stateKeyChanged', key, value });
+ };
+ this.#stateSetters.set(key, setValue as Dispatch);
+ return [value, setValue];
+ }
+
+ /**
+ * A hook helper to simplify dispatching a `CustomEvent` on the Web
+ * Component from React.
+ *
+ * @typeParam T - The type for `event.detail` value (optional).
+ *
+ * @param type - The `CustomEvent` type string.
+ * @param options - The settings for the `CustomEvent`.
+ * @returns The `dispatch` function. The function parameters change
+ * depending on the `T` generic type:
+ * - For `undefined` type (default), has no parameters.
+ * - For other types, has one parameter for the `event.detail` value of that type.
+ * @protected
+ */
+ protected useCustomEvent(type: string, options: CustomEventInit = {}): DispatchEvent {
+ if (!this.#customEvents.has(type)) {
+ const dispatch = ((detail?: T) => {
+ const eventInitDict =
+ detail === undefined
+ ? options
+ : {
+ ...options,
+ detail
+ };
+ const event = new CustomEvent(type, eventInitDict);
+ return this.dispatchEvent(event);
+ }) as DispatchEvent;
+ this.#customEvents.set(type, dispatch as DispatchEvent);
+ return dispatch;
+ }
+ return this.#customEvents.get(type)! as DispatchEvent;
+ }
+
+ /**
+ * The Web Component render function. To be implemented by users with React.
+ *
+ * @param hooks - the adapter APIs exposed for the implementation.
+ * @protected
+ */
+ protected abstract render(hooks: RenderHooks): ReactElement | null;
+
+ /**
+ * Prepare content container for Flow to bind server Element to.
+ *
+ * @param name container name attribute matching server name attribute
+ * @protected
+ */
+ protected useContent(name: string): ReactElement | null {
+ useEffect(() => {
+ this.#readyCallback.get(name)?.();
+ }, []);
+ return createElement('flow-content-container', { name, style: { display: 'contents' } });
+ }
+
+ #maybeRenderRoot() {
+ if (this.#rootRendered || !this.#root) {
+ return;
+ }
+
+ this.#root.render(createElement(this.#Wrapper));
+ this.#rootRendered = true;
+ }
+
+ #renderWrapper(): ReactElement | null {
+ const [state, dispatchFlowState] = useReducer(stateReducer, this.#state);
+ this.#state = state;
+ this.#dispatchFlowState = dispatchFlowState;
+ return this.render(this.#renderHooks);
+ }
+
+ #markAsUsed(): void {
+ // @ts-ignore
+ let vaadinObject = window.Vaadin || {};
+ // @ts-ignore
+ if (vaadinObject.developmentMode) {
+ vaadinObject.registrations = vaadinObject.registrations || [];
+ vaadinObject.registrations.push({
+ is: 'ReactAdapterElement',
+ version: '25.2.6'
+ });
+ }
+ }
+}
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-050179d38edf3560e7fc3d0177787bb20c55630f7c4b372ebad09b42b287a5dd.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-050179d38edf3560e7fc3d0177787bb20c55630f7c4b372ebad09b42b287a5dd.js
new file mode 100644
index 0000000..5e7d246
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-050179d38edf3560e7fc3d0177787bb20c55630f7c4b372ebad09b42b287a5dd.js
@@ -0,0 +1,51 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/avatar/src/vaadin-avatar.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
+import '@vaadin/grid/src/vaadin-grid.js';
+import '@vaadin/grid/src/vaadin-grid-column.js';
+import '@vaadin/grid/src/vaadin-grid-sorter.js';
+import 'Frontend/generated/jar-resources/gridConnector.ts';
+import '@vaadin/component-base/src/debounce.js';
+import '@vaadin/component-base/src/async.js';
+import '@vaadin/grid/src/vaadin-grid-active-item-mixin.js';
+import 'Frontend/generated/jar-resources/vaadin-grid-flow-selection-column.js';
+import '@vaadin/grid/src/vaadin-grid-column-group.js';
+import 'Frontend/generated/jar-resources/lit-renderer.ts';
+import 'lit/directives/live.js';
+import '@vaadin/form-layout/src/vaadin-form-layout.js';
+import '@vaadin/form-layout/src/vaadin-form-item.js';
+import '@vaadin/form-layout/src/vaadin-form-row.js';
+import '@vaadin/combo-box/src/vaadin-combo-box.js';
+import 'Frontend/generated/jar-resources/comboBoxConnector.js';
+import '@vaadin/combo-box/src/vaadin-combo-box-placeholder.js';
+import '@vaadin/multi-select-combo-box/src/vaadin-multi-select-combo-box.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-09a91b9550ef322666194480aeb843ea6225d32c6cf3cdd6c06d9751b9b982c4.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-09a91b9550ef322666194480aeb843ea6225d32c6cf3cdd6c06d9751b9b982c4.js
new file mode 100644
index 0000000..3071068
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-09a91b9550ef322666194480aeb843ea6225d32c6cf3cdd6c06d9751b9b982c4.js
@@ -0,0 +1,49 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/grid/src/vaadin-grid.js';
+import '@vaadin/grid/src/vaadin-grid-column.js';
+import '@vaadin/grid/src/vaadin-grid-sorter.js';
+import 'Frontend/generated/jar-resources/gridConnector.ts';
+import '@vaadin/component-base/src/debounce.js';
+import '@vaadin/component-base/src/async.js';
+import '@vaadin/grid/src/vaadin-grid-active-item-mixin.js';
+import 'Frontend/generated/jar-resources/vaadin-grid-flow-selection-column.js';
+import '@vaadin/grid/src/vaadin-grid-column-group.js';
+import 'Frontend/generated/jar-resources/lit-renderer.ts';
+import 'lit/directives/live.js';
+import '@vaadin/form-layout/src/vaadin-form-layout.js';
+import '@vaadin/form-layout/src/vaadin-form-item.js';
+import '@vaadin/form-layout/src/vaadin-form-row.js';
+import '@vaadin/combo-box/src/vaadin-combo-box.js';
+import 'Frontend/generated/jar-resources/comboBoxConnector.js';
+import '@vaadin/combo-box/src/vaadin-combo-box-placeholder.js';
+import '@vaadin/multi-select-combo-box/src/vaadin-multi-select-combo-box.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-1465405c28a197cc689b86bc09d756395cc2b486677ca560b40061d793a87524.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-1465405c28a197cc689b86bc09d756395cc2b486677ca560b40061d793a87524.js
new file mode 100644
index 0000000..f74837a
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-1465405c28a197cc689b86bc09d756395cc2b486677ca560b40061d793a87524.js
@@ -0,0 +1,31 @@
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-17458473c5b0c327e5fdfb8de65e9c031656ad433885b259b9e37650bcf5111d.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-17458473c5b0c327e5fdfb8de65e9c031656ad433885b259b9e37650bcf5111d.js
new file mode 100644
index 0000000..ed09c93
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-17458473c5b0c327e5fdfb8de65e9c031656ad433885b259b9e37650bcf5111d.js
@@ -0,0 +1,53 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/grid/src/vaadin-grid.js';
+import '@vaadin/grid/src/vaadin-grid-column.js';
+import '@vaadin/grid/src/vaadin-grid-sorter.js';
+import 'Frontend/generated/jar-resources/gridConnector.ts';
+import '@vaadin/component-base/src/debounce.js';
+import '@vaadin/component-base/src/async.js';
+import '@vaadin/grid/src/vaadin-grid-active-item-mixin.js';
+import 'Frontend/generated/jar-resources/vaadin-grid-flow-selection-column.js';
+import '@vaadin/grid/src/vaadin-grid-column-group.js';
+import 'Frontend/generated/jar-resources/lit-renderer.ts';
+import 'lit/directives/live.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
+import '@vaadin/form-layout/src/vaadin-form-layout.js';
+import '@vaadin/form-layout/src/vaadin-form-item.js';
+import '@vaadin/form-layout/src/vaadin-form-row.js';
+import '@vaadin/list-box/src/vaadin-list-box.js';
+import '@vaadin/item/src/vaadin-item.js';
+import '@vaadin/integer-field/src/vaadin-integer-field.js';
+import '@vaadin/combo-box/src/vaadin-combo-box.js';
+import 'Frontend/generated/jar-resources/comboBoxConnector.js';
+import '@vaadin/combo-box/src/vaadin-combo-box-placeholder.js';
+import '@vaadin/multi-select-combo-box/src/vaadin-multi-select-combo-box.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js
new file mode 100644
index 0000000..28c7a78
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js
@@ -0,0 +1,56 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/grid/src/vaadin-grid.js';
+import '@vaadin/grid/src/vaadin-grid-column.js';
+import '@vaadin/grid/src/vaadin-grid-sorter.js';
+import 'Frontend/generated/jar-resources/gridConnector.ts';
+import '@vaadin/component-base/src/debounce.js';
+import '@vaadin/component-base/src/async.js';
+import '@vaadin/grid/src/vaadin-grid-active-item-mixin.js';
+import 'Frontend/generated/jar-resources/vaadin-grid-flow-selection-column.js';
+import '@vaadin/grid/src/vaadin-grid-column-group.js';
+import 'Frontend/generated/jar-resources/lit-renderer.ts';
+import 'lit/directives/live.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
+import '@vaadin/form-layout/src/vaadin-form-layout.js';
+import '@vaadin/form-layout/src/vaadin-form-item.js';
+import '@vaadin/form-layout/src/vaadin-form-row.js';
+import '@vaadin/list-box/src/vaadin-list-box.js';
+import '@vaadin/item/src/vaadin-item.js';
+import '@vaadin/integer-field/src/vaadin-integer-field.js';
+import '@vaadin/combo-box/src/vaadin-combo-box.js';
+import 'Frontend/generated/jar-resources/comboBoxConnector.js';
+import '@vaadin/combo-box/src/vaadin-combo-box-placeholder.js';
+import '@vaadin/multi-select-combo-box/src/vaadin-multi-select-combo-box.js';
+import '@vaadin/custom-field/src/vaadin-custom-field.js';
+import '@vaadin/select/src/vaadin-select.js';
+import 'Frontend/generated/jar-resources/selectConnector.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-36157cc9f15f59ffacee94022392ef651f5128827a02941ad7397c3097927cf6.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-36157cc9f15f59ffacee94022392ef651f5128827a02941ad7397c3097927cf6.js
new file mode 100644
index 0000000..f5c7fcd
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-36157cc9f15f59ffacee94022392ef651f5128827a02941ad7397c3097927cf6.js
@@ -0,0 +1,49 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/grid/src/vaadin-grid.js';
+import '@vaadin/grid/src/vaadin-grid-column.js';
+import '@vaadin/grid/src/vaadin-grid-sorter.js';
+import 'Frontend/generated/jar-resources/gridConnector.ts';
+import '@vaadin/component-base/src/debounce.js';
+import '@vaadin/component-base/src/async.js';
+import '@vaadin/grid/src/vaadin-grid-active-item-mixin.js';
+import 'Frontend/generated/jar-resources/vaadin-grid-flow-selection-column.js';
+import '@vaadin/grid/src/vaadin-grid-column-group.js';
+import 'Frontend/generated/jar-resources/lit-renderer.ts';
+import 'lit/directives/live.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
+import '@vaadin/form-layout/src/vaadin-form-layout.js';
+import '@vaadin/form-layout/src/vaadin-form-item.js';
+import '@vaadin/form-layout/src/vaadin-form-row.js';
+import '@vaadin/password-field/src/vaadin-password-field.js';
+import '@vaadin/email-field/src/vaadin-email-field.js';
+import '@vaadin/checkbox-group/src/vaadin-checkbox-group.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-4a1b53ad267588ce5a6c622e0efdd0adeec2e922b2e51061d1fb0d63ad8f7363.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-4a1b53ad267588ce5a6c622e0efdd0adeec2e922b2e51061d1fb0d63ad8f7363.js
new file mode 100644
index 0000000..36300e7
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-4a1b53ad267588ce5a6c622e0efdd0adeec2e922b2e51061d1fb0d63ad8f7363.js
@@ -0,0 +1,46 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/grid/src/vaadin-grid.js';
+import '@vaadin/grid/src/vaadin-grid-column.js';
+import '@vaadin/grid/src/vaadin-grid-sorter.js';
+import 'Frontend/generated/jar-resources/gridConnector.ts';
+import '@vaadin/component-base/src/debounce.js';
+import '@vaadin/component-base/src/async.js';
+import '@vaadin/grid/src/vaadin-grid-active-item-mixin.js';
+import 'Frontend/generated/jar-resources/vaadin-grid-flow-selection-column.js';
+import '@vaadin/grid/src/vaadin-grid-column-group.js';
+import 'Frontend/generated/jar-resources/lit-renderer.ts';
+import 'lit/directives/live.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
+import '@vaadin/form-layout/src/vaadin-form-layout.js';
+import '@vaadin/form-layout/src/vaadin-form-item.js';
+import '@vaadin/form-layout/src/vaadin-form-row.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-5584551b9200a1d2b592bd96c14b3cacc38f4ef0c1fe22978154b3bbc6061f05.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-5584551b9200a1d2b592bd96c14b3cacc38f4ef0c1fe22978154b3bbc6061f05.js
new file mode 100644
index 0000000..634bf09
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-5584551b9200a1d2b592bd96c14b3cacc38f4ef0c1fe22978154b3bbc6061f05.js
@@ -0,0 +1,51 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/avatar/src/vaadin-avatar.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
+import '@vaadin/grid/src/vaadin-grid.js';
+import '@vaadin/grid/src/vaadin-grid-column.js';
+import '@vaadin/grid/src/vaadin-grid-sorter.js';
+import 'Frontend/generated/jar-resources/gridConnector.ts';
+import '@vaadin/component-base/src/debounce.js';
+import '@vaadin/component-base/src/async.js';
+import '@vaadin/grid/src/vaadin-grid-active-item-mixin.js';
+import 'Frontend/generated/jar-resources/vaadin-grid-flow-selection-column.js';
+import '@vaadin/grid/src/vaadin-grid-column-group.js';
+import 'Frontend/generated/jar-resources/lit-renderer.ts';
+import 'lit/directives/live.js';
+import '@vaadin/custom-field/src/vaadin-custom-field.js';
+import '@vaadin/multi-select-combo-box/src/vaadin-multi-select-combo-box.js';
+import 'Frontend/generated/jar-resources/comboBoxConnector.js';
+import '@vaadin/combo-box/src/vaadin-combo-box-placeholder.js';
+import '@vaadin/form-layout/src/vaadin-form-layout.js';
+import '@vaadin/form-layout/src/vaadin-form-item.js';
+import '@vaadin/form-layout/src/vaadin-form-row.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-6456be19764fead9274c211db67c1fed3129c53422a2de0c4ebc6ea374a4ec5c.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-6456be19764fead9274c211db67c1fed3129c53422a2de0c4ebc6ea374a4ec5c.js
new file mode 100644
index 0000000..d4faa89
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-6456be19764fead9274c211db67c1fed3129c53422a2de0c4ebc6ea374a4ec5c.js
@@ -0,0 +1,48 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/grid/src/vaadin-grid.js';
+import '@vaadin/grid/src/vaadin-grid-column.js';
+import '@vaadin/grid/src/vaadin-grid-sorter.js';
+import 'Frontend/generated/jar-resources/gridConnector.ts';
+import '@vaadin/component-base/src/debounce.js';
+import '@vaadin/component-base/src/async.js';
+import '@vaadin/grid/src/vaadin-grid-active-item-mixin.js';
+import 'Frontend/generated/jar-resources/vaadin-grid-flow-selection-column.js';
+import '@vaadin/grid/src/vaadin-grid-column-group.js';
+import 'Frontend/generated/jar-resources/lit-renderer.ts';
+import 'lit/directives/live.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
+import '@vaadin/form-layout/src/vaadin-form-layout.js';
+import '@vaadin/form-layout/src/vaadin-form-item.js';
+import '@vaadin/form-layout/src/vaadin-form-row.js';
+import '@vaadin/list-box/src/vaadin-list-box.js';
+import '@vaadin/item/src/vaadin-item.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-918bb383890df4641c1ca33b36e3fdba718a1ce1f4335789bcf9ca5a32123d48.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-918bb383890df4641c1ca33b36e3fdba718a1ce1f4335789bcf9ca5a32123d48.js
new file mode 100644
index 0000000..39008a2
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-918bb383890df4641c1ca33b36e3fdba718a1ce1f4335789bcf9ca5a32123d48.js
@@ -0,0 +1,52 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/avatar/src/vaadin-avatar.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
+import '@vaadin/grid/src/vaadin-grid.js';
+import '@vaadin/grid/src/vaadin-grid-column.js';
+import '@vaadin/grid/src/vaadin-grid-sorter.js';
+import 'Frontend/generated/jar-resources/gridConnector.ts';
+import '@vaadin/component-base/src/debounce.js';
+import '@vaadin/component-base/src/async.js';
+import '@vaadin/grid/src/vaadin-grid-active-item-mixin.js';
+import 'Frontend/generated/jar-resources/vaadin-grid-flow-selection-column.js';
+import '@vaadin/grid/src/vaadin-grid-column-group.js';
+import 'Frontend/generated/jar-resources/lit-renderer.ts';
+import 'lit/directives/live.js';
+import '@vaadin/form-layout/src/vaadin-form-layout.js';
+import '@vaadin/form-layout/src/vaadin-form-item.js';
+import '@vaadin/form-layout/src/vaadin-form-row.js';
+import '@vaadin/integer-field/src/vaadin-integer-field.js';
+import '@vaadin/combo-box/src/vaadin-combo-box.js';
+import 'Frontend/generated/jar-resources/comboBoxConnector.js';
+import '@vaadin/combo-box/src/vaadin-combo-box-placeholder.js';
+import '@vaadin/multi-select-combo-box/src/vaadin-multi-select-combo-box.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js
new file mode 100644
index 0000000..d7d854e
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js
@@ -0,0 +1,47 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/avatar/src/vaadin-avatar.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
+import '@vaadin/grid/src/vaadin-grid.js';
+import '@vaadin/grid/src/vaadin-grid-column.js';
+import '@vaadin/grid/src/vaadin-grid-sorter.js';
+import 'Frontend/generated/jar-resources/gridConnector.ts';
+import '@vaadin/component-base/src/debounce.js';
+import '@vaadin/component-base/src/async.js';
+import '@vaadin/grid/src/vaadin-grid-active-item-mixin.js';
+import 'Frontend/generated/jar-resources/vaadin-grid-flow-selection-column.js';
+import '@vaadin/grid/src/vaadin-grid-column-group.js';
+import 'Frontend/generated/jar-resources/lit-renderer.ts';
+import 'lit/directives/live.js';
+import '@vaadin/form-layout/src/vaadin-form-layout.js';
+import '@vaadin/form-layout/src/vaadin-form-item.js';
+import '@vaadin/form-layout/src/vaadin-form-row.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-b0eb0de7326631053d249cbbdaed9122656362ee32dec3dd21fc23f7db177400.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-b0eb0de7326631053d249cbbdaed9122656362ee32dec3dd21fc23f7db177400.js
new file mode 100644
index 0000000..0ad8685
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-b0eb0de7326631053d249cbbdaed9122656362ee32dec3dd21fc23f7db177400.js
@@ -0,0 +1,20 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-b3e84351087a7066a5317979e35ce71f4f249b80a6f66b5f0c9b0c0790866b93.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-b3e84351087a7066a5317979e35ce71f4f249b80a6f66b5f0c9b0c0790866b93.js
new file mode 100644
index 0000000..9061a3c
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-b3e84351087a7066a5317979e35ce71f4f249b80a6f66b5f0c9b0c0790866b93.js
@@ -0,0 +1,33 @@
+import '@vaadin/avatar/src/vaadin-avatar.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-b5a3b3b8d39c03fe35c3dda50e5bd1ec25755f18091bcaffc331ab0fd020c6fd.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-b5a3b3b8d39c03fe35c3dda50e5bd1ec25755f18091bcaffc331ab0fd020c6fd.js
new file mode 100644
index 0000000..1ac742e
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-b5a3b3b8d39c03fe35c3dda50e5bd1ec25755f18091bcaffc331ab0fd020c6fd.js
@@ -0,0 +1,32 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-fc7662d8a7810d7f14f9f989942d4df1753b8cef76009c17999d2ca394bbd8ca.js b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-fc7662d8a7810d7f14f9f989942d4df1753b8cef76009c17999d2ca394bbd8ca.js
new file mode 100644
index 0000000..4da0894
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/chunks/chunk-fc7662d8a7810d7f14f9f989942d4df1753b8cef76009c17999d2ca394bbd8ca.js
@@ -0,0 +1,54 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/app-layout/src/vaadin-app-layout.js';
+import '@vaadin/scroller/src/vaadin-scroller.js';
+import '@vaadin/side-nav/src/vaadin-side-nav.js';
+import '@vaadin/side-nav/src/vaadin-side-nav-item.js';
+import '@vaadin/tooltip/src/vaadin-tooltip.js';
+import '@vaadin/app-layout/src/vaadin-drawer-toggle.js';
+import '@vaadin/button/src/vaadin-button.js';
+import 'Frontend/generated/jar-resources/disableOnClickFunctions.js';
+import '@vaadin/horizontal-layout/src/vaadin-horizontal-layout.js';
+import '@vaadin/icons/vaadin-iconset.js';
+import '@vaadin/icon/src/vaadin-icon.js';
+import '@vaadin/upload/src/vaadin-upload.js';
+import 'Frontend/generated/jar-resources/vaadin-upload-manager-connector.ts';
+import '@vaadin/upload/vaadin-upload-manager.js';
+import '@vaadin/notification/src/vaadin-notification.js';
+import 'Frontend/generated/jar-resources/flow-component-renderer.js';
+import 'Frontend/generated/jar-resources/flow-component-directive.js';
+import 'lit';
+import '@vaadin/checkbox/src/vaadin-checkbox.js';
+import 'Frontend/generated/jar-resources/menubarConnector.js';
+import 'Frontend/generated/jar-resources/contextMenuConnector.js';
+import '@vaadin/menu-bar/src/vaadin-menu-bar.js';
+import '@vaadin/context-menu/src/vaadin-context-menu.js';
+import 'Frontend/generated/jar-resources/contextMenuTargetConnector.js';
+import '@vaadin/component-base/src/gestures.js';
+import '@vaadin/accordion/src/vaadin-accordion.js';
+import '@vaadin/accordion/src/vaadin-accordion-panel.js';
+import '@vaadin/details/src/vaadin-details.js';
+import 'Frontend/generated/jar-resources/messageListConnector.js';
+import '@vaadin/message-list/src/vaadin-message-list.js';
+import '@vaadin/grid/src/vaadin-grid.js';
+import '@vaadin/grid/src/vaadin-grid-column.js';
+import '@vaadin/grid/src/vaadin-grid-sorter.js';
+import 'Frontend/generated/jar-resources/gridConnector.ts';
+import '@vaadin/component-base/src/debounce.js';
+import '@vaadin/component-base/src/async.js';
+import '@vaadin/grid/src/vaadin-grid-active-item-mixin.js';
+import 'Frontend/generated/jar-resources/vaadin-grid-flow-selection-column.js';
+import '@vaadin/grid/src/vaadin-grid-column-group.js';
+import 'Frontend/generated/jar-resources/lit-renderer.ts';
+import 'lit/directives/live.js';
+import '@vaadin/text-field/src/vaadin-text-field.js';
+import '@vaadin/form-layout/src/vaadin-form-layout.js';
+import '@vaadin/form-layout/src/vaadin-form-item.js';
+import '@vaadin/form-layout/src/vaadin-form-row.js';
+import '@vaadin/list-box/src/vaadin-list-box.js';
+import '@vaadin/item/src/vaadin-item.js';
+import '@vaadin/integer-field/src/vaadin-integer-field.js';
+import '@vaadin/combo-box/src/vaadin-combo-box.js';
+import 'Frontend/generated/jar-resources/comboBoxConnector.js';
+import '@vaadin/combo-box/src/vaadin-combo-box-placeholder.js';
+import '@vaadin/multi-select-combo-box/src/vaadin-multi-select-combo-box.js';
+import '@vaadin/custom-field/src/vaadin-custom-field.js';
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/generated-flow-imports.d.ts b/kontor-spring/src/main/frontend/generated/flow/generated-flow-imports.d.ts
new file mode 100644
index 0000000..693da49
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/generated-flow-imports.d.ts
@@ -0,0 +1 @@
+export {}
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/generated-flow-imports.js b/kontor-spring/src/main/frontend/generated/flow/generated-flow-imports.js
new file mode 100644
index 0000000..f37254b
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/generated-flow-imports.js
@@ -0,0 +1,128 @@
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/login/src/vaadin-login-form.js';
+import '@vaadin/common-frontend/ConnectionIndicator.js';
+import 'Frontend/generated/jar-resources/ReactRouterOutletElement.tsx';
+import 'react-router';
+import 'react';
+
+const loadOnDemand = (key) => {
+ const pending = [];
+ if (key === '81bbe2e11b6af26d0d292e2e18bde37546d5b9ec24f4f4f78df2bc9f9c21f431') {
+ pending.push(import('./chunks/chunk-4a1b53ad267588ce5a6c622e0efdd0adeec2e922b2e51061d1fb0d63ad8f7363.js'));
+ }
+ if (key === '8904207b9d538b9eedfaaefd8e82d3415de8513bda9d6bb76f4012f0f336d200') {
+ pending.push(import('./chunks/chunk-050179d38edf3560e7fc3d0177787bb20c55630f7c4b372ebad09b42b287a5dd.js'));
+ }
+ if (key === '96ecac798fbbe91ef146ac4a25f5c31827427ca0f106ba66e63fc1fd6c27b83d') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === 'c0816c2bfaa97d6f3e7eea83c5478186457bdc79cfe3f284c42e192d68607157') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '58cc18f5518623050c6a99d327dd540140b9b0dca851a76a70e688291f661e11') {
+ pending.push(import('./chunks/chunk-b3e84351087a7066a5317979e35ce71f4f249b80a6f66b5f0c9b0c0790866b93.js'));
+ }
+ if (key === '83045a9760ea76fd534ed71ed553dc7cf2595a5d697e3c7bc55470d219770d05') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === 'e9df10b3be58513bb6452e4dbdce31e0b1dc33868fbba54ee72e82089cf39adf') {
+ pending.push(import('./chunks/chunk-050179d38edf3560e7fc3d0177787bb20c55630f7c4b372ebad09b42b287a5dd.js'));
+ }
+ if (key === '39b4a07b2b07a780f8ac9d2f7cc855e3b78ec60465d9d808690466c1f0bea792') {
+ pending.push(import('./chunks/chunk-b0eb0de7326631053d249cbbdaed9122656362ee32dec3dd21fc23f7db177400.js'));
+ }
+ if (key === '803ed44611ffeb1bcb1f604f267f09af48ef8a5bc8d765e481b67ed59f9b880a') {
+ pending.push(import('./chunks/chunk-36157cc9f15f59ffacee94022392ef651f5128827a02941ad7397c3097927cf6.js'));
+ }
+ if (key === '9f40817b690e11a5b23a3159bb774f15430c23768f26dc0d15efccc3d65223ac') {
+ pending.push(import('./chunks/chunk-17458473c5b0c327e5fdfb8de65e9c031656ad433885b259b9e37650bcf5111d.js'));
+ }
+ if (key === '391ac9fb4bd95bc899c5911c48a6f3b549b118923653444f5ab50acddfb6f291') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === '1ac8bd8d734d2603947b1db0616ea4dae4ce691a5264f5c9aeafcaa897e0a872') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === 'e5db1fd1f39047ab2857e9ef118681c3f831f39efbbb2a6f000e9475b77444e5') {
+ pending.push(import('./chunks/chunk-b3e84351087a7066a5317979e35ce71f4f249b80a6f66b5f0c9b0c0790866b93.js'));
+ }
+ if (key === '92a567041312ea4c7faa4dd5bcc74f73cd3b16dd721624d0bc68d1704138abe5') {
+ pending.push(import('./chunks/chunk-6456be19764fead9274c211db67c1fed3129c53422a2de0c4ebc6ea374a4ec5c.js'));
+ }
+ if (key === 'bfac19b5aab9cd5a47ff4a66f2a839ebbb4889867824be809c5dc3a3d47f94b8') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === 'a886fd99e05dd2c5ce3e4b643dc8d6d29189dee784fa78678d8ab4fcb89216c0') {
+ pending.push(import('./chunks/chunk-09a91b9550ef322666194480aeb843ea6225d32c6cf3cdd6c06d9751b9b982c4.js'));
+ }
+ if (key === 'becc589ccd4f7ac5e6f13c45eecc05f61d67ce57f585f1655800354ff4b55f3c') {
+ pending.push(import('./chunks/chunk-17458473c5b0c327e5fdfb8de65e9c031656ad433885b259b9e37650bcf5111d.js'));
+ }
+ if (key === '0ca48a0e12f1dbf4945f761a93a7df202b2908327a63c52f2f060559c2bcc7f0') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '2140ca6af7e9a5ff94d8a66b6e5a23e6d184ef7901ca73d33b3c30f74f94708a') {
+ pending.push(import('./chunks/chunk-b5a3b3b8d39c03fe35c3dda50e5bd1ec25755f18091bcaffc331ab0fd020c6fd.js'));
+ }
+ if (key === '89c2914ed5d19860240c0c1d3dba174616dc452c4ba8ae039f016cf9592e9432') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === 'ffd87f879398d3b6942e852eda9b64e28a124c8a61938c867efb360a5cf1d32e') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === 'c5f987a4896c791d13aeb6a03a4783ff03df304750a7db930a18d399dba31509') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === '3665d7598c9ed4112997a0493fb890edf38d23d3bd9fcb0eb09bf3e045f5228b') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === '4e76ad4411fbf58731cdad95d28e6fe0057fb4a97ffd54f193e52b111462552d') {
+ pending.push(import('./chunks/chunk-4a1b53ad267588ce5a6c622e0efdd0adeec2e922b2e51061d1fb0d63ad8f7363.js'));
+ }
+ if (key === '3e87cbb0d40d50da9c3b69d0dada85fe9b7f2f4bae2b79c8f0408a798b120549') {
+ pending.push(import('./chunks/chunk-fc7662d8a7810d7f14f9f989942d4df1753b8cef76009c17999d2ca394bbd8ca.js'));
+ }
+ if (key === 'ac7af13a0805d3ce8a287e9d860521c82aaf55d2c448ce3f62a85d44216a8189') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === 'a4eeeab53770801e478b15e6b179e5689afd43fc753f347e0c51ce934bd28a6c') {
+ pending.push(import('./chunks/chunk-5584551b9200a1d2b592bd96c14b3cacc38f4ef0c1fe22978154b3bbc6061f05.js'));
+ }
+ if (key === 'dca37e6961f625182e78a722a61c0eb9b8a2357b5e787fe616fe5993c2db5133') {
+ pending.push(import('./chunks/chunk-1465405c28a197cc689b86bc09d756395cc2b486677ca560b40061d793a87524.js'));
+ }
+ if (key === '5d710852587ce9ebabfac9ed950f6b11bc3a87d96860d4efdfb61dab7ae54091') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '2b0ca0e51ded6027d3f9e464513210d5503ab2a9bc532de5cfc81d78a58f422f') {
+ pending.push(import('./chunks/chunk-17458473c5b0c327e5fdfb8de65e9c031656ad433885b259b9e37650bcf5111d.js'));
+ }
+ if (key === '28b5e9145505152a4dbd9600977b8177d3a161906581ca5a1a923affc812a761') {
+ pending.push(import('./chunks/chunk-fc7662d8a7810d7f14f9f989942d4df1753b8cef76009c17999d2ca394bbd8ca.js'));
+ }
+ if (key === '68a5f871903ca703f0fac8dd0072e1bfc082ffa14aa445026be6e1eb6cfe1bd0') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '53ff1588255d7e5486eb67452c8d9c43baea0eecd9bd509fd7f0c55b3cccaa0d') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '4e356c0939a28ab8766b0375ca6cb478b6163eb9ad80745a9e2f2fc80997b6a2') {
+ pending.push(import('./chunks/chunk-918bb383890df4641c1ca33b36e3fdba718a1ce1f4335789bcf9ca5a32123d48.js'));
+ }
+ if (key === 'b4afd0c0906e26b51836d41720e1b8d91a7cacf0fd42e089f1e0fbc2ee27a5bb') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '2062a3f35e8fdb051e9362a8a8895d80ef719832e9394babcbaab3aac56d4f0e') {
+ pending.push(import('./chunks/chunk-5584551b9200a1d2b592bd96c14b3cacc38f4ef0c1fe22978154b3bbc6061f05.js'));
+ }
+ return Promise.all(pending);
+}
+
+window.Vaadin = window.Vaadin || {};
+window.Vaadin.Flow = window.Vaadin.Flow || {};
+window.Vaadin.Flow.loadOnDemand = loadOnDemand;
+window.Vaadin.Flow.resetFocus = () => {
+ let ae=document.activeElement;
+ while(ae&&ae.shadowRoot) ae = ae.shadowRoot.activeElement;
+ return !ae || ae.blur() || ae.focus() || true;
+}
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/flow/generated-flow-webcomponent-imports.js b/kontor-spring/src/main/frontend/generated/flow/generated-flow-webcomponent-imports.js
new file mode 100644
index 0000000..31c256c
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/flow/generated-flow-webcomponent-imports.js
@@ -0,0 +1,129 @@
+import { injectGlobalWebcomponentCss } from 'Frontend/generated/jar-resources/theme-util.js';
+
+import '@vaadin/vertical-layout/src/vaadin-vertical-layout.js';
+import '@vaadin/login/src/vaadin-login-form.js';
+import '@vaadin/common-frontend/ConnectionIndicator.js';
+import 'Frontend/generated/jar-resources/ReactRouterOutletElement.tsx';
+import 'react-router';
+import 'react';
+
+const loadOnDemand = (key) => {
+ const pending = [];
+ if (key === '81bbe2e11b6af26d0d292e2e18bde37546d5b9ec24f4f4f78df2bc9f9c21f431') {
+ pending.push(import('./chunks/chunk-4a1b53ad267588ce5a6c622e0efdd0adeec2e922b2e51061d1fb0d63ad8f7363.js'));
+ }
+ if (key === '8904207b9d538b9eedfaaefd8e82d3415de8513bda9d6bb76f4012f0f336d200') {
+ pending.push(import('./chunks/chunk-050179d38edf3560e7fc3d0177787bb20c55630f7c4b372ebad09b42b287a5dd.js'));
+ }
+ if (key === '96ecac798fbbe91ef146ac4a25f5c31827427ca0f106ba66e63fc1fd6c27b83d') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === 'c0816c2bfaa97d6f3e7eea83c5478186457bdc79cfe3f284c42e192d68607157') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '58cc18f5518623050c6a99d327dd540140b9b0dca851a76a70e688291f661e11') {
+ pending.push(import('./chunks/chunk-b3e84351087a7066a5317979e35ce71f4f249b80a6f66b5f0c9b0c0790866b93.js'));
+ }
+ if (key === '83045a9760ea76fd534ed71ed553dc7cf2595a5d697e3c7bc55470d219770d05') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === 'e9df10b3be58513bb6452e4dbdce31e0b1dc33868fbba54ee72e82089cf39adf') {
+ pending.push(import('./chunks/chunk-050179d38edf3560e7fc3d0177787bb20c55630f7c4b372ebad09b42b287a5dd.js'));
+ }
+ if (key === '39b4a07b2b07a780f8ac9d2f7cc855e3b78ec60465d9d808690466c1f0bea792') {
+ pending.push(import('./chunks/chunk-b0eb0de7326631053d249cbbdaed9122656362ee32dec3dd21fc23f7db177400.js'));
+ }
+ if (key === '803ed44611ffeb1bcb1f604f267f09af48ef8a5bc8d765e481b67ed59f9b880a') {
+ pending.push(import('./chunks/chunk-36157cc9f15f59ffacee94022392ef651f5128827a02941ad7397c3097927cf6.js'));
+ }
+ if (key === '9f40817b690e11a5b23a3159bb774f15430c23768f26dc0d15efccc3d65223ac') {
+ pending.push(import('./chunks/chunk-17458473c5b0c327e5fdfb8de65e9c031656ad433885b259b9e37650bcf5111d.js'));
+ }
+ if (key === '391ac9fb4bd95bc899c5911c48a6f3b549b118923653444f5ab50acddfb6f291') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === '1ac8bd8d734d2603947b1db0616ea4dae4ce691a5264f5c9aeafcaa897e0a872') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === 'e5db1fd1f39047ab2857e9ef118681c3f831f39efbbb2a6f000e9475b77444e5') {
+ pending.push(import('./chunks/chunk-b3e84351087a7066a5317979e35ce71f4f249b80a6f66b5f0c9b0c0790866b93.js'));
+ }
+ if (key === '92a567041312ea4c7faa4dd5bcc74f73cd3b16dd721624d0bc68d1704138abe5') {
+ pending.push(import('./chunks/chunk-6456be19764fead9274c211db67c1fed3129c53422a2de0c4ebc6ea374a4ec5c.js'));
+ }
+ if (key === 'bfac19b5aab9cd5a47ff4a66f2a839ebbb4889867824be809c5dc3a3d47f94b8') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === 'a886fd99e05dd2c5ce3e4b643dc8d6d29189dee784fa78678d8ab4fcb89216c0') {
+ pending.push(import('./chunks/chunk-09a91b9550ef322666194480aeb843ea6225d32c6cf3cdd6c06d9751b9b982c4.js'));
+ }
+ if (key === 'becc589ccd4f7ac5e6f13c45eecc05f61d67ce57f585f1655800354ff4b55f3c') {
+ pending.push(import('./chunks/chunk-17458473c5b0c327e5fdfb8de65e9c031656ad433885b259b9e37650bcf5111d.js'));
+ }
+ if (key === '0ca48a0e12f1dbf4945f761a93a7df202b2908327a63c52f2f060559c2bcc7f0') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '2140ca6af7e9a5ff94d8a66b6e5a23e6d184ef7901ca73d33b3c30f74f94708a') {
+ pending.push(import('./chunks/chunk-b5a3b3b8d39c03fe35c3dda50e5bd1ec25755f18091bcaffc331ab0fd020c6fd.js'));
+ }
+ if (key === '89c2914ed5d19860240c0c1d3dba174616dc452c4ba8ae039f016cf9592e9432') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === 'ffd87f879398d3b6942e852eda9b64e28a124c8a61938c867efb360a5cf1d32e') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === 'c5f987a4896c791d13aeb6a03a4783ff03df304750a7db930a18d399dba31509') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === '3665d7598c9ed4112997a0493fb890edf38d23d3bd9fcb0eb09bf3e045f5228b') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === '4e76ad4411fbf58731cdad95d28e6fe0057fb4a97ffd54f193e52b111462552d') {
+ pending.push(import('./chunks/chunk-4a1b53ad267588ce5a6c622e0efdd0adeec2e922b2e51061d1fb0d63ad8f7363.js'));
+ }
+ if (key === '3e87cbb0d40d50da9c3b69d0dada85fe9b7f2f4bae2b79c8f0408a798b120549') {
+ pending.push(import('./chunks/chunk-fc7662d8a7810d7f14f9f989942d4df1753b8cef76009c17999d2ca394bbd8ca.js'));
+ }
+ if (key === 'ac7af13a0805d3ce8a287e9d860521c82aaf55d2c448ce3f62a85d44216a8189') {
+ pending.push(import('./chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js'));
+ }
+ if (key === 'a4eeeab53770801e478b15e6b179e5689afd43fc753f347e0c51ce934bd28a6c') {
+ pending.push(import('./chunks/chunk-5584551b9200a1d2b592bd96c14b3cacc38f4ef0c1fe22978154b3bbc6061f05.js'));
+ }
+ if (key === 'dca37e6961f625182e78a722a61c0eb9b8a2357b5e787fe616fe5993c2db5133') {
+ pending.push(import('./chunks/chunk-1465405c28a197cc689b86bc09d756395cc2b486677ca560b40061d793a87524.js'));
+ }
+ if (key === '5d710852587ce9ebabfac9ed950f6b11bc3a87d96860d4efdfb61dab7ae54091') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '2b0ca0e51ded6027d3f9e464513210d5503ab2a9bc532de5cfc81d78a58f422f') {
+ pending.push(import('./chunks/chunk-17458473c5b0c327e5fdfb8de65e9c031656ad433885b259b9e37650bcf5111d.js'));
+ }
+ if (key === '28b5e9145505152a4dbd9600977b8177d3a161906581ca5a1a923affc812a761') {
+ pending.push(import('./chunks/chunk-fc7662d8a7810d7f14f9f989942d4df1753b8cef76009c17999d2ca394bbd8ca.js'));
+ }
+ if (key === '68a5f871903ca703f0fac8dd0072e1bfc082ffa14aa445026be6e1eb6cfe1bd0') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '53ff1588255d7e5486eb67452c8d9c43baea0eecd9bd509fd7f0c55b3cccaa0d') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '4e356c0939a28ab8766b0375ca6cb478b6163eb9ad80745a9e2f2fc80997b6a2') {
+ pending.push(import('./chunks/chunk-918bb383890df4641c1ca33b36e3fdba718a1ce1f4335789bcf9ca5a32123d48.js'));
+ }
+ if (key === 'b4afd0c0906e26b51836d41720e1b8d91a7cacf0fd42e089f1e0fbc2ee27a5bb') {
+ pending.push(import('./chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js'));
+ }
+ if (key === '2062a3f35e8fdb051e9362a8a8895d80ef719832e9394babcbaab3aac56d4f0e') {
+ pending.push(import('./chunks/chunk-5584551b9200a1d2b592bd96c14b3cacc38f4ef0c1fe22978154b3bbc6061f05.js'));
+ }
+ return Promise.all(pending);
+}
+window.Vaadin = window.Vaadin || {};
+window.Vaadin.Flow = window.Vaadin.Flow || {};
+window.Vaadin.Flow.loadOnDemand = loadOnDemand;
+window.Vaadin.Flow.resetFocus = () => {
+ let ae=document.activeElement;
+ while(ae&&ae.shadowRoot) ae = ae.shadowRoot.activeElement;
+ return !ae || ae.blur() || ae.focus() || true;
+}
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/generated-flow-files.txt b/kontor-spring/src/main/frontend/generated/generated-flow-files.txt
new file mode 100644
index 0000000..09835b6
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/generated-flow-files.txt
@@ -0,0 +1,94 @@
+app-shell-imports.d.ts
+app-shell-imports.js
+css.generated.d.ts
+flow/Flow.tsx
+flow/ReactAdapter.tsx
+flow/chunks/chunk-050179d38edf3560e7fc3d0177787bb20c55630f7c4b372ebad09b42b287a5dd.js
+flow/chunks/chunk-09a91b9550ef322666194480aeb843ea6225d32c6cf3cdd6c06d9751b9b982c4.js
+flow/chunks/chunk-1465405c28a197cc689b86bc09d756395cc2b486677ca560b40061d793a87524.js
+flow/chunks/chunk-17458473c5b0c327e5fdfb8de65e9c031656ad433885b259b9e37650bcf5111d.js
+flow/chunks/chunk-2d26a95ba6c84191291435d6713bc4840a15eaad9dcf9f70fc4a3a70aee09f13.js
+flow/chunks/chunk-36157cc9f15f59ffacee94022392ef651f5128827a02941ad7397c3097927cf6.js
+flow/chunks/chunk-4a1b53ad267588ce5a6c622e0efdd0adeec2e922b2e51061d1fb0d63ad8f7363.js
+flow/chunks/chunk-5584551b9200a1d2b592bd96c14b3cacc38f4ef0c1fe22978154b3bbc6061f05.js
+flow/chunks/chunk-6456be19764fead9274c211db67c1fed3129c53422a2de0c4ebc6ea374a4ec5c.js
+flow/chunks/chunk-918bb383890df4641c1ca33b36e3fdba718a1ce1f4335789bcf9ca5a32123d48.js
+flow/chunks/chunk-993657077513d5c8a0171b3eaf9fefcf9af77a45b27ce7cb2f83e54f445b12ea.js
+flow/chunks/chunk-b0eb0de7326631053d249cbbdaed9122656362ee32dec3dd21fc23f7db177400.js
+flow/chunks/chunk-b3e84351087a7066a5317979e35ce71f4f249b80a6f66b5f0c9b0c0790866b93.js
+flow/chunks/chunk-b5a3b3b8d39c03fe35c3dda50e5bd1ec25755f18091bcaffc331ab0fd020c6fd.js
+flow/chunks/chunk-fc7662d8a7810d7f14f9f989942d4df1753b8cef76009c17999d2ca394bbd8ca.js
+flow/generated-flow-imports.d.ts
+flow/generated-flow-imports.js
+flow/generated-flow-webcomponent-imports.js
+index.tsx
+jar-resources/Clipboard.d.ts
+jar-resources/Clipboard.js
+jar-resources/Clipboard.js.map
+jar-resources/Download.d.ts
+jar-resources/Download.js
+jar-resources/Download.js.map
+jar-resources/ElementResize.d.ts
+jar-resources/ElementResize.js
+jar-resources/ElementResize.js.map
+jar-resources/Flow.d.ts
+jar-resources/Flow.js
+jar-resources/Flow.js.map
+jar-resources/FlowBootstrap.d.ts
+jar-resources/FlowBootstrap.js
+jar-resources/FlowClient.d.ts
+jar-resources/FlowClient.js
+jar-resources/FlowShortcut.js
+jar-resources/Fullscreen.d.ts
+jar-resources/Fullscreen.js
+jar-resources/Fullscreen.js.map
+jar-resources/Geolocation.d.ts
+jar-resources/Geolocation.js
+jar-resources/Geolocation.js.map
+jar-resources/PageVisibility.d.ts
+jar-resources/PageVisibility.js
+jar-resources/PageVisibility.js.map
+jar-resources/ReactRouterOutletElement.tsx
+jar-resources/ScreenOrientation.d.ts
+jar-resources/ScreenOrientation.js
+jar-resources/ScreenOrientation.js.map
+jar-resources/WakeLock.d.ts
+jar-resources/WakeLock.js
+jar-resources/WakeLock.js.map
+jar-resources/WebShare.d.ts
+jar-resources/WebShare.js
+jar-resources/WebShare.js.map
+jar-resources/comboBoxConnector.js
+jar-resources/contextMenuConnector.js
+jar-resources/contextMenuTargetConnector.js
+jar-resources/datepickerConnector.js
+jar-resources/disableOnClickFunctions.js
+jar-resources/dndConnector.js
+jar-resources/flow-component-directive.js
+jar-resources/flow-component-renderer.js
+jar-resources/gridConnector.ts
+jar-resources/index.d.ts
+jar-resources/index.js
+jar-resources/index.js.map
+jar-resources/lit-renderer.ts
+jar-resources/menubarConnector.js
+jar-resources/messageListConnector.js
+jar-resources/selectConnector.js
+jar-resources/theme-util.js
+jar-resources/tooltip.ts
+jar-resources/treeGridConnector.ts
+jar-resources/vaadin-big-decimal-field.js
+jar-resources/vaadin-grid-flow-selection-column.js
+jar-resources/vaadin-popover/popover.ts
+jar-resources/vaadin-time-picker/helpers.js
+jar-resources/vaadin-time-picker/timepickerConnector.js
+jar-resources/vaadin-upload-manager-connector.ts
+jar-resources/virtualListConnector.js
+jsx-dev-transform/index.ts
+jsx-dev-transform/jsx-dev-runtime.ts
+jsx-dev-transform/jsx-runtime.ts
+layouts.json
+routes.tsx
+vaadin-featureflags.js
+vaadin-react.tsx
+vaadin.ts
\ No newline at end of file
diff --git a/kontor-spring/src/main/frontend/generated/index.tsx b/kontor-spring/src/main/frontend/generated/index.tsx
new file mode 100644
index 0000000..8c8a71a
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/index.tsx
@@ -0,0 +1,26 @@
+/******************************************************************************
+ * This file is auto-generated by Vaadin.
+ * If you want to customize the entry point, you can copy this file or create
+ * your own `index.tsx` in your frontend directory.
+ * By default, the `index.tsx` file should be in `./frontend/` folder.
+ *
+ * NOTE:
+ * - You need to restart the dev-server after adding the new `index.tsx` file.
+ * After that, all modifications to `index.tsx` are recompiled automatically.
+ * - `index.js` is also supported if you don't want to use TypeScript.
+ ******************************************************************************/
+
+import { createElement } from 'react';
+import { createRoot } from 'react-dom/client';
+import { RouterProvider } from 'react-router';
+import { router } from 'Frontend/generated/routes.js';
+
+function App() {
+ return ;
+}
+
+const outlet = document.getElementById('outlet')!;
+let root = (outlet as any)._root ?? createRoot(outlet);
+(outlet as any)._root = root;
+root.render(createElement(App));
+
diff --git a/kontor-spring/src/main/frontend/generated/jar-resources/Clipboard.d.ts b/kontor-spring/src/main/frontend/generated/jar-resources/Clipboard.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/jar-resources/Clipboard.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/kontor-spring/src/main/frontend/generated/jar-resources/Clipboard.js b/kontor-spring/src/main/frontend/generated/jar-resources/Clipboard.js
new file mode 100644
index 0000000..97ed1b1
--- /dev/null
+++ b/kontor-spring/src/main/frontend/generated/jar-resources/Clipboard.js
@@ -0,0 +1,199 @@
+/*
+ * Copyright 2000-2026 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+/**
+ * Reads the first item from the system clipboard and returns its text/plain
+ * and text/html representations. Either field is {@code null} if the
+ * corresponding MIME type is not present.
+ *
+ * The caller is expected to be inside a transient user gesture and to have
+ * been granted the {@code clipboard-read} permission; otherwise
+ * {@code navigator.clipboard.read} rejects and this function propagates the
+ * rejection.
+ */
+async function readClipboardPayload() {
+ const items = await navigator.clipboard.read();
+ if (!items.length) {
+ return null;
+ }
+ const item = items[0];
+ const get = async (type) => item.types.includes(type) ? (await item.getType(type)).text() : null;
+ return {
+ text: await get('text/plain'),
+ html: await get('text/html')
+ };
+}
+/**
+ * Re-encodes the given {@code
} as {@code image/png} via a canvas
+ * round-trip. The source can be any rasterisable format the browser already
+ * decodes ({@code image/png}, {@code image/jpeg}, {@code image/svg+xml}, ...);
+ * the output is always a {@code Promise} of {@code image/png}, the only
+ * image MIME type every browser's asynchronous Clipboard API accepts on write.
+ *
+ * Cross-origin images need {@code crossorigin="anonymous"} on the {@code
}
+ * plus matching CORS headers, otherwise the canvas is tainted and
+ * {@code toBlob} throws.
+ */
+function imageToPngBlob(img) {
+ return new Promise((resolve, reject) => {
+ const draw = () => {
+ try {
+ const width = img.naturalWidth || img.width;
+ const height = img.naturalHeight || img.height;
+ if (!width || !height) {
+ reject(new Error('image has no intrinsic size'));
+ return;
+ }
+ const canvas = document.createElement('canvas');
+ canvas.width = width;
+ canvas.height = height;
+ const ctx = canvas.getContext('2d');
+ if (!ctx) {
+ reject(new Error('2D canvas context not available'));
+ return;
+ }
+ ctx.drawImage(img, 0, 0, width, height);
+ canvas.toBlob((png) => (png ? resolve(png) : reject(new Error('canvas.toBlob returned null'))), 'image/png');
+ }
+ catch (err) {
+ reject(err);
+ }
+ };
+ if (img.complete) {
+ // `complete` is also true for an image that already failed to load or has
+ // an empty src; those have naturalWidth === 0 and their load/error events
+ // have already fired and will never fire again, so we must settle here
+ // rather than wait for an event that never comes.
+ if (img.naturalWidth > 0) {
+ draw();
+ }
+ else {
+ reject(new Error('image failed to load or has empty src'));
+ }
+ }
+ else {
+ img.addEventListener('load', draw, { once: true });
+ img.addEventListener('error', () => reject(new Error('image load failed')), { once: true });
+ }
+ });
+}
+/**
+ * Writes any combination of text/plain, text/html and image/png to the system
+ * clipboard as a single ClipboardItem. Any argument may be {@code null} to omit
+ * that MIME type; at least one is expected to be non-null (the caller enforces
+ * this). The image argument is the source {@code
}; it is re-encoded as
+ * {@code image/png} via {@link imageToPngBlob} and the resulting
+ * {@code Promise} is fed directly to {@code ClipboardItem} so the
+ * {@code navigator.clipboard.write} call stays synchronous inside the user
+ * gesture (Safari otherwise loses activation on the first await).
+ *
+ * The caller is expected to be inside a transient user gesture; otherwise
+ * {@code navigator.clipboard.write} rejects and this function propagates the
+ * rejection.
+ *
+ * Resolves with the {@code text/plain} value if present, otherwise with the
+ * {@code text/html} value, otherwise with {@code null} (image-only case).
+ */
+async function writeClipboardPayload(text, html, image) {
+ const entries = {};
+ if (text !== null) {
+ entries['text/plain'] = text;
+ }
+ if (html !== null) {
+ entries['text/html'] = html;
+ }
+ if (image !== null) {
+ entries['image/png'] = imageToPngBlob(image);
+ }
+ await navigator.clipboard.write([new ClipboardItem(entries)]);
+ return text !== null ? text : html;
+}
+/**
+ * Posts each file from a {@code paste} event's {@code clipboardData.files} as
+ * its own XHR to the URL stored as the named attribute on {@code element}. The
+ * wire format matches vaadin-upload: raw body, percent-encoded {@code X-Filename}
+ * header, MIME type in {@code Content-Type}.
+ *
+ * Each upload is processed in its own HTTP request, so the UI changes the
+ * server-side UploadHandler makes through {@code UI.access} are applied to the
+ * state tree but not sent to the client by the upload response itself. Once
+ * every upload of the paste has settled this helper dispatches a
+ * {@code vaadin-paste-upload-finished} event back on {@code element}; a
+ * server-side listener for that event triggers a normal Flow round trip that
+ * flushes those pending UI changes — so the API works without {@code @Push},
+ * exactly like a regular upload completing through the Upload component.
+ *
+ * Editable targets ({@code }, {@code