diff --git a/docs/guides/custom-page-layout.md b/docs/guides/custom-page-layout.md
index 5203f2843e..f8490a87ed 100644
--- a/docs/guides/custom-page-layout.md
+++ b/docs/guides/custom-page-layout.md
@@ -26,6 +26,7 @@ registerLayout({
content: {
attachPanel: "none",
direction: "column",
+ scroll: true,
},
footer: {
attachPanel: "none",
@@ -39,6 +40,7 @@ där:
- `attachPanel` talar om hur en panel ska fästas. Om ytan inte kan ta paneler sätter man `"none"`.
- `direction` talar om ifall ytan flödar horisontellt eller vertikalt.
+- `scroll` talar om ifall ytan ska scrolla (i den riktning som `direction` talar om).
Styling använder [CSS grid](https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/CSS_layout/Grids) på `::part(grid name)` och kan se ut så här:
diff --git a/packages/vue/src/components/FPageClosablePanel/FPageClosablePanel.vue b/packages/vue/src/components/FPageClosablePanel/FPageClosablePanel.vue
new file mode 100644
index 0000000000..36090c2a01
--- /dev/null
+++ b/packages/vue/src/components/FPageClosablePanel/FPageClosablePanel.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
+
+
+
+
diff --git a/packages/vue/src/components/FPageClosablePanel/index.ts b/packages/vue/src/components/FPageClosablePanel/index.ts
new file mode 100644
index 0000000000..889a9eca09
--- /dev/null
+++ b/packages/vue/src/components/FPageClosablePanel/index.ts
@@ -0,0 +1 @@
+export { default as FPageClosablePanel } from "./FPageClosablePanel.vue";
diff --git a/packages/vue/src/components/FPageClosablePanel/use-panel.ts b/packages/vue/src/components/FPageClosablePanel/use-panel.ts
new file mode 100644
index 0000000000..686d186e2a
--- /dev/null
+++ b/packages/vue/src/components/FPageClosablePanel/use-panel.ts
@@ -0,0 +1,57 @@
+import { type Ref, ref } from "vue";
+
+type PanelCallback = (data: { item: T; reason: string }) => void;
+
+interface ClosablePanelControl {
+ readonly name: Readonly[>;
+ item: Ref];
+ callback: Ref | null>;
+ open(item: T, options?: { onClose?: PanelCallback }): void;
+ close(): void;
+ destroy(): void;
+}
+
+interface ClosablePanel {
+ open(item: T, options?: { onClose?: PanelCallback }): void;
+ close(): void;
+}
+
+const panels: Array> = [];
+
+export function createClosablePanel(name: string): ClosablePanelControl {
+ const control: ClosablePanelControl = {
+ name: ref(name),
+ item: ref(null),
+ callback: ref(null),
+ open(item, options) {
+ this.item.value = item;
+ this.callback.value = options?.onClose ?? null;
+ },
+ close() {
+ this.item.value = null;
+ this.callback.value = null;
+ },
+ destroy() {
+ /* do nothing */
+ },
+ };
+ panels.push(control);
+ return control as ClosablePanelControl;
+}
+
+export function usePanel(name: string): ClosablePanel {
+ return {
+ open(item, options) {
+ const panel = panels.find((it) => it.name.value === name);
+ if (panel) {
+ panel.open(item, options);
+ }
+ },
+ close() {
+ const panel = panels.find((it) => it.name.value === name);
+ if (panel) {
+ panel.close();
+ }
+ },
+ };
+}
diff --git a/packages/vue/src/components/FPageExpandablePanel/FPageExpandablePanel.vue b/packages/vue/src/components/FPageExpandablePanel/FPageExpandablePanel.vue
index fbb0bca257..6847bae54e 100644
--- a/packages/vue/src/components/FPageExpandablePanel/FPageExpandablePanel.vue
+++ b/packages/vue/src/components/FPageExpandablePanel/FPageExpandablePanel.vue
@@ -1,5 +1,11 @@
+
+
+
[header]
-
+
[panel header]
[panel content]
[panel content]
[panel content]
+ {{ leftVariant.name }}
Variant
Meny
Hopfällbar
+ Stängbar
[panel footer]
+
+
+
+ En annan panel.
+ {{ JSON.stringify({ item }, null, 2) }}
+
+ {{ leftVariant.name }}
+
+ Variant
+
+ Meny
+ Hopfällbar
+ Stängbar
+
+
+
+
-
+
[panel header]
[panel content]
@@ -39,11 +93,27 @@ const rightVariant = ref(FP
Meny
Hopfällbar
+ Stängbar
[panel footer]
+
+
+ {{ JSON.stringify({ item }, null, 2) }}
+
+ {{ rightVariant.name }}
+
+ Variant
+
+ Meny
+ Hopfällbar
+ Stängbar
+
+
+
+
@@ -59,6 +129,21 @@ const rightVariant = ref(FP
Maecenas rhoncus felis tincidunt dui faucibus, nec rhoncus tellus mollis. Phasellus vitae magna
turpis. Etiam in mattis mi. Duis at justo finibus, tristique lacus nec, lobortis dui.
+
+ Öppnas till vänster
+
+ Kända ankeborgare
+
+
+ {{ row.namn }}
+
+
+
+ Öppna grunka
+ Öppna mojäng
+
Ut placerat consectetur pretium. Proin luctus neque vitae consequat pellentesque. Aliquam arcu arcu,
auctor ac ipsum aliquet, bibendum pretium est. Integer sit amet mattis dolor, quis volutpat justo.
diff --git a/packages/vue/src/vite-dev/my-awesome-panel.vue b/packages/vue/src/vite-dev/my-awesome-panel.vue
new file mode 100644
index 0000000000..31080dfc17
--- /dev/null
+++ b/packages/vue/src/vite-dev/my-awesome-panel.vue
@@ -0,0 +1,17 @@
+
+
+
+
+ {{ item.namn }}
+
+ {{ JSON.stringify({ item }, null, 2) }}
+ Spara
+ Avbryt
+
+
+