Add initial work on grid layouts in containers

This commit is contained in:
Andrew Kingston 2024-07-26 15:41:07 +01:00
parent 91bc48b633
commit a3431e6884
No known key found for this signature in database
8 changed files with 103 additions and 36 deletions

View File

@ -119,6 +119,48 @@
}, },
"styles": ["padding", "size", "background", "border", "shadow"], "styles": ["padding", "size", "background", "border", "shadow"],
"settings": [ "settings": [
{
"type": "select",
"label": "Layout",
"key": "layout",
"showInBar": true,
"barStyle": "buttons",
"options": [
{
"label": "Flex",
"value": "flex",
"barIcon": "ModernGridView",
"barTitle": "Flex layout"
},
{
"label": "Grid",
"value": "grid",
"barIcon": "ViewGrid",
"barTitle": "Grid layout"
}
],
"defaultValue": "flex"
},
{
"type": "number",
"label": "Columns",
"key": "cols",
"placeholder": 12,
"dependsOn": {
"setting": "layout",
"value": "grid"
}
},
{
"type": "number",
"label": "Rows",
"key": "rows",
"placeholder": 12,
"dependsOn": {
"setting": "layout",
"value": "grid"
}
},
{ {
"type": "select", "type": "select",
"label": "Direction", "label": "Direction",
@ -139,7 +181,12 @@
"barTitle": "Row layout" "barTitle": "Row layout"
} }
], ],
"defaultValue": "column" "defaultValue": "column",
"dependsOn": {
"setting": "layout",
"value": "grid",
"invert": true
}
}, },
{ {
"type": "select", "type": "select",
@ -173,7 +220,12 @@
"barTitle": "Align stretched horizontally" "barTitle": "Align stretched horizontally"
} }
], ],
"defaultValue": "stretch" "defaultValue": "stretch",
"dependsOn": {
"setting": "layout",
"value": "grid",
"invert": true
}
}, },
{ {
"type": "select", "type": "select",
@ -207,7 +259,12 @@
"barTitle": "Align stretched vertically" "barTitle": "Align stretched vertically"
} }
], ],
"defaultValue": "top" "defaultValue": "top",
"dependsOn": {
"setting": "layout",
"value": "grid",
"invert": true
}
}, },
{ {
"type": "select", "type": "select",
@ -229,7 +286,12 @@
"barTitle": "Grow container" "barTitle": "Grow container"
} }
], ],
"defaultValue": "shrink" "defaultValue": "shrink",
"dependsOn": {
"setting": "layout",
"value": "grid",
"invert": true
}
}, },
{ {
"type": "select", "type": "select",
@ -255,7 +317,12 @@
"value": "L" "value": "L"
} }
], ],
"defaultValue": "M" "defaultValue": "M",
"dependsOn": {
"setting": "layout",
"value": "grid",
"invert": true
}
}, },
{ {
"type": "boolean", "type": "boolean",
@ -263,7 +330,12 @@
"key": "wrap", "key": "wrap",
"showInBar": true, "showInBar": true,
"barIcon": "ModernGridView", "barIcon": "ModernGridView",
"barTitle": "Wrap" "barTitle": "Wrap",
"dependsOn": {
"setting": "layout",
"value": "grid",
"invert": true
}
}, },
{ {
"type": "event", "type": "event",
@ -7167,23 +7239,6 @@
"scope": "local" "scope": "local"
} }
}, },
"grid": {
"name": "Grid",
"icon": "ViewGrid",
"hasChildren": true,
"settings": [
{
"type": "number",
"key": "cols",
"label": "Columns"
},
{
"type": "number",
"key": "rows",
"label": "Rows"
}
]
},
"gridblock": { "gridblock": {
"name": "Table", "name": "Table",
"icon": "Table", "icon": "Table",

View File

@ -1,7 +1,7 @@
<script> <script>
import { getContext } from "svelte" import { getContext } from "svelte"
import Placeholder from "./Placeholder.svelte" import Placeholder from "./Placeholder.svelte"
import Container from "./Container.svelte" import Container from "./container/Container.svelte"
const { Provider, ContextScopes } = getContext("sdk") const { Provider, ContextScopes } = getContext("sdk")
const component = getContext("component") const component = getContext("component")

View File

@ -0,0 +1,12 @@
<script>
import GridContainer from "./GridContainer.svelte"
import FlexContainer from "./FlexContainer.svelte"
export let layout = "flex"
$: component = layout === "grid" ? GridContainer : FlexContainer
</script>
<svelte:component this={component} {...$$props}>
<slot />
</svelte:component>

View File

@ -7,6 +7,9 @@
export let cols = 12 export let cols = 12
export let rows = 12 export let rows = 12
$: cols = cols || 12
$: rows = rows || 12
// Deliberately non-reactive as we want this fixed whenever the grid renders // Deliberately non-reactive as we want this fixed whenever the grid renders
const defaultColSpan = Math.ceil((cols + 1) / 2) const defaultColSpan = Math.ceil((cols + 1) / 2)
const defaultRowSpan = Math.ceil((rows + 1) / 2) const defaultRowSpan = Math.ceil((rows + 1) / 2)

View File

@ -13,7 +13,7 @@ import "@spectrum-css/page/dist/index-vars.css"
export { default as Placeholder } from "./Placeholder.svelte" export { default as Placeholder } from "./Placeholder.svelte"
// User facing components // User facing components
export { default as container } from "./Container.svelte" export { default as container } from "./container/Container.svelte"
export { default as section } from "./Section.svelte" export { default as section } from "./Section.svelte"
export { default as dataprovider } from "./DataProvider.svelte" export { default as dataprovider } from "./DataProvider.svelte"
export { default as divider } from "./Divider.svelte" export { default as divider } from "./Divider.svelte"
@ -35,7 +35,6 @@ export { default as spectrumcard } from "./SpectrumCard.svelte"
export { default as tag } from "./Tag.svelte" export { default as tag } from "./Tag.svelte"
export { default as markdownviewer } from "./MarkdownViewer.svelte" export { default as markdownviewer } from "./MarkdownViewer.svelte"
export { default as embeddedmap } from "./embedded-map/EmbeddedMap.svelte" export { default as embeddedmap } from "./embedded-map/EmbeddedMap.svelte"
export { default as grid } from "./Grid.svelte"
export { default as sidepanel } from "./SidePanel.svelte" export { default as sidepanel } from "./SidePanel.svelte"
export { default as modal } from "./Modal.svelte" export { default as modal } from "./Modal.svelte"
export { default as gridblock } from "./GridBlock.svelte" export { default as gridblock } from "./GridBlock.svelte"

View File

@ -25,7 +25,7 @@
e.target e.target
.closest?.(".component") .closest?.(".component")
?.parentNode.closest(".component") ?.parentNode.closest(".component")
?.childNodes[0].classList.contains("grid") || ?.childNodes[0].classList?.contains("grid") ||
e.target.classList.contains("anchor") e.target.classList.contains("anchor")
) )
} }

View File

@ -1,7 +1,6 @@
<script> <script>
import { onMount, onDestroy } from "svelte" import { onMount, onDestroy } from "svelte"
import Indicator from "./Indicator.svelte" import Indicator from "./Indicator.svelte"
import { domDebounce } from "utils/domDebounce"
import { builderStore } from "stores" import { builderStore } from "stores"
export let componentId = null export let componentId = null
@ -36,20 +35,20 @@
$: visibleIndicators = state.indicators.filter(x => x.visible) $: visibleIndicators = state.indicators.filter(x => x.visible)
$: offset = $builderStore.inBuilder ? 0 : 2 $: offset = $builderStore.inBuilder ? 0 : 2
$: $$props, debouncedUpdate() // $: $$props, updatePosition()
const checkInsideGrid = id => { const checkInsideGrid = id => {
const component = document.getElementsByClassName(id)[0] const component = document.getElementsByClassName(id)[0]
const domNode = component?.children[0] const domNode = component?.children[0]
// Ignore grid itself // Ignore grid itself
if (domNode?.classList.contains("grid")) { if (domNode?.classList?.contains("grid")) {
return false return false
} }
return component?.parentNode return component?.parentNode
?.closest?.(".component") ?.closest?.(".component")
?.childNodes[0]?.classList.contains("grid") ?.childNodes[0]?.classList?.contains("grid")
} }
const createIntersectionCallback = idx => entries => { const createIntersectionCallback = idx => entries => {
@ -145,17 +144,16 @@
}) })
}) })
} }
const debouncedUpdate = domDebounce(updatePosition)
onMount(() => { onMount(() => {
debouncedUpdate() updatePosition()
interval = setInterval(debouncedUpdate, 100) interval = setInterval(updatePosition, 100)
document.addEventListener("scroll", debouncedUpdate, true) document.addEventListener("scroll", updatePosition, true)
}) })
onDestroy(() => { onDestroy(() => {
clearInterval(interval) clearInterval(interval)
document.removeEventListener("scroll", debouncedUpdate, true) document.removeEventListener("scroll", updatePosition, true)
observers.forEach(o => o.disconnect()) observers.forEach(o => o.disconnect())
}) })
</script> </script>