forked from MapComplete/MapComplete
UI: better style groups, make header sticky
This commit is contained in:
parent
20f005693d
commit
1bd060df82
4 changed files with 124 additions and 2 deletions
|
@ -3093,6 +3093,11 @@ input[type="range"].range-lg::-moz-range-thumb {
|
||||||
border-right-width: 1px;
|
border-right-width: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.border-x-2 {
|
||||||
|
border-left-width: 2px;
|
||||||
|
border-right-width: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
.border-y {
|
.border-y {
|
||||||
border-top-width: 1px;
|
border-top-width: 1px;
|
||||||
border-bottom-width: 1px;
|
border-bottom-width: 1px;
|
||||||
|
@ -5128,6 +5133,10 @@ input[type="range"].range-lg::-moz-range-thumb {
|
||||||
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.\[a-zA-Z0-9\:_-\] {
|
||||||
|
a-z-a--z0-9: -;
|
||||||
|
}
|
||||||
|
|
||||||
.\[a-zA-Z0-9\:_\] {
|
.\[a-zA-Z0-9\:_\] {
|
||||||
a-z-a--z0-9: ;
|
a-z-a--z0-9: ;
|
||||||
}
|
}
|
||||||
|
@ -5286,6 +5295,11 @@ input[type="text"] {
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.border-low-interaction {
|
||||||
|
border-color: var(--low-interaction-background-50);
|
||||||
|
border-style: dashed;
|
||||||
|
}
|
||||||
|
|
||||||
.border-region {
|
.border-region {
|
||||||
border: 2px dashed var(--interactive-background);
|
border: 2px dashed var(--interactive-background);
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
|
@ -5465,6 +5479,10 @@ textarea {
|
||||||
h2.group {
|
h2.group {
|
||||||
/* For flowbite accordions */
|
/* For flowbite accordions */
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
top: 0;
|
||||||
|
position: -webkit-sticky;
|
||||||
|
position: sticky;
|
||||||
|
z-index: 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
.group button {
|
.group button {
|
||||||
|
|
95
src/Models/ThemeConfig/LayerConfigDependencyGraph.ts
Normal file
95
src/Models/ThemeConfig/LayerConfigDependencyGraph.ts
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
import { LayerConfigJson } from "./Json/LayerConfigJson"
|
||||||
|
|
||||||
|
export interface LevelInfo {
|
||||||
|
level: number,
|
||||||
|
ids: string[],
|
||||||
|
loop?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export class LayerConfigDependencyGraph {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the dependencies for the given layer
|
||||||
|
* @param layerconfig
|
||||||
|
*/
|
||||||
|
public static getLayerImports(layerconfig: LayerConfigJson): string[] {
|
||||||
|
const defaultImports: ReadonlyArray<string> = ["questions", "filters","icons"]
|
||||||
|
if (defaultImports.indexOf(layerconfig.id) >= 0) {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
const importedTrs: string[] = []
|
||||||
|
for (const tr of layerconfig.tagRenderings ?? []) {
|
||||||
|
if (typeof tr === "string") {
|
||||||
|
importedTrs.push(tr)
|
||||||
|
} else if (tr["builtin"] !== undefined) {
|
||||||
|
const builtin = <string | string[]>tr["builtin"]
|
||||||
|
if (typeof builtin === "string") {
|
||||||
|
importedTrs.push(builtin)
|
||||||
|
} else {
|
||||||
|
importedTrs.push(...builtin)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const imports = new Set<string>(defaultImports)
|
||||||
|
for (const importValue of importedTrs) {
|
||||||
|
if (importValue.indexOf(".") < 0) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
const [layer, _] = importValue.split(".")
|
||||||
|
imports.add(layer)
|
||||||
|
}
|
||||||
|
return Array.from(imports)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static buildDirectDependencies(layers: LayerConfigJson[]) {
|
||||||
|
const dependsOn = new Map<string, string[]>()
|
||||||
|
for (const layer of layers) {
|
||||||
|
const layerDependsOn = LayerConfigDependencyGraph.getLayerImports(layer)
|
||||||
|
dependsOn.set(layer.id, layerDependsOn)
|
||||||
|
}
|
||||||
|
return dependsOn
|
||||||
|
}
|
||||||
|
public static buildLevels(dependsOn: Map<string, string[]>): LevelInfo[]{
|
||||||
|
|
||||||
|
const levels: LevelInfo[] = []
|
||||||
|
let levelIndex = 0
|
||||||
|
const seenIds = new Set<string>()
|
||||||
|
while (Array.from(dependsOn.keys()).length > 0) {
|
||||||
|
const currentLevel: LevelInfo = {
|
||||||
|
ids: <string[]>[],
|
||||||
|
level: levelIndex,
|
||||||
|
}
|
||||||
|
levelIndex++
|
||||||
|
levels.push(currentLevel)
|
||||||
|
for (const layerId of dependsOn.keys()) {
|
||||||
|
const dependencies = dependsOn.get(layerId)
|
||||||
|
if (dependencies.length === 0) {
|
||||||
|
currentLevel.ids.push(layerId)
|
||||||
|
seenIds.add(layerId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const newDependsOn = new Map<string, string[]>()
|
||||||
|
for (const layerId of dependsOn.keys()) {
|
||||||
|
if (seenIds.has(layerId)) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
const dependencies = dependsOn.get(layerId)
|
||||||
|
newDependsOn.set(layerId, dependencies.filter(d => !seenIds.has(d)))
|
||||||
|
}
|
||||||
|
const oldSize = dependsOn.size
|
||||||
|
if(oldSize === newDependsOn.size){
|
||||||
|
// We detected a loop.
|
||||||
|
currentLevel.loop = true
|
||||||
|
const allLayers =Array.from(newDependsOn.keys())
|
||||||
|
currentLevel.ids.push(...allLayers )
|
||||||
|
allLayers.forEach(l => seenIds.add(l))
|
||||||
|
}
|
||||||
|
dependsOn = newDependsOn
|
||||||
|
}
|
||||||
|
return levels
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
export let expanded = false
|
export let expanded = false
|
||||||
export let noBorder = false
|
export let noBorder = false
|
||||||
export let contentClass = noBorder ? "normal-background" : "low-interaction rounded-b p-2"
|
export let contentClass = noBorder ? "normal-background" : "low-interaction rounded-b p-2 border-x-2 border-b-2 border-dashed border-low-interaction"
|
||||||
let defaultClass: string = undefined
|
let defaultClass: string = undefined
|
||||||
if (noBorder) {
|
if (noBorder) {
|
||||||
defaultClass = "unstyled w-full flex-grow"
|
defaultClass = "unstyled w-full flex-grow"
|
||||||
|
@ -11,7 +11,8 @@
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Accordion>
|
<Accordion>
|
||||||
<AccordionItem open={expanded} paddingDefault="p-0" inactiveClass="text-black" {defaultClass}>
|
<AccordionItem open={expanded} paddingDefault="p-0" inactiveClass="text-black"
|
||||||
|
{defaultClass}>
|
||||||
<span slot="header" class={!noBorder ? "w-full p-2 text-base" : "w-full"}>
|
<span slot="header" class={!noBorder ? "w-full p-2 text-base" : "w-full"}>
|
||||||
<slot name="header" />
|
<slot name="header" />
|
||||||
</span>
|
</span>
|
||||||
|
|
|
@ -165,6 +165,11 @@ input[type="text"] {
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.border-low-interaction {
|
||||||
|
border-color: var(--low-interaction-background-50);
|
||||||
|
border-style: dashed;
|
||||||
|
}
|
||||||
|
|
||||||
.border-region {
|
.border-region {
|
||||||
border: 2px dashed var(--interactive-background);
|
border: 2px dashed var(--interactive-background);
|
||||||
border-radius: 0.5rem;
|
border-radius: 0.5rem;
|
||||||
|
@ -356,6 +361,9 @@ textarea {
|
||||||
h2.group {
|
h2.group {
|
||||||
/* For flowbite accordions */
|
/* For flowbite accordions */
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
top: 0;
|
||||||
|
position: sticky;
|
||||||
|
z-index: 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
.group button {
|
.group button {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue