Update UI colors and alignment for consistency with the design mockup (#157)

Closes #111
This commit is contained in:
Keavon Chambers
2021-05-23 19:01:13 -07:00
parent 4b19a459b7
commit 34efac990b
21 changed files with 286 additions and 182 deletions
+29 -2
View File
@@ -3,12 +3,38 @@
</template> </template>
<style lang="scss"> <style lang="scss">
:root {
--color-0-black: #000;
--color-1-nearblack: #111;
--color-2-mildblack: #222;
--color-3-darkgray: #333;
--color-4-dimgray: #444;
--color-5-dullgray: #555;
--color-6-lowergray: #666;
--color-7-middlegray: #777;
--color-8-uppergray: #888;
--color-9-palegray: #999;
--color-a-softgray: #aaa;
--color-b-lightgray: #bbb;
--color-c-brightgray: #ccc;
--color-d-mildwhite: #ddd;
--color-e-nearwhite: #eee;
--color-f-white: #fff;
--color-accent: #3194d6;
--color-accent-hover: #49a5e2;
// TODO: Replace with CSS color() function to calculate alpha when browsers support it
// See https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/color() and https://caniuse.com/css-color-function
// E6 = 90% alpha
--popover-opacity-color-2-mildblack: #222222e6;
}
html, html,
body, body,
#app { #app {
margin: 0; margin: 0;
height: 100%; height: 100%;
background: #222; background: var(--color-2-mildblack);
user-select: none; user-select: none;
} }
@@ -19,7 +45,7 @@ button {
font-family: "Source Sans Pro", Arial, sans-serif; font-family: "Source Sans Pro", Arial, sans-serif;
font-size: 14px; font-size: 14px;
line-height: 1; line-height: 1;
color: #ddd; color: var(--color-e-nearwhite);
} }
svg, svg,
@@ -38,6 +64,7 @@ img {
p { p {
margin: 0; margin: 0;
} }
p { p {
margin-top: 8px; margin-top: 8px;
} }
+29 -17
View File
@@ -4,35 +4,47 @@
<div class="left side"> <div class="left side">
<span class="label">Select</span> <span class="label">Select</span>
<ItemDivider /> <Separator :type="SeparatorType.Section" />
<IconButton :size="24" title="Horizontal Align Left"><AlignHorizontalLeft /></IconButton> <IconButton :size="24" title="Horizontal Align Left"><AlignHorizontalLeft /></IconButton>
<IconButton :size="24" title="Horizontal Align Center"><AlignHorizontalCenter /></IconButton> <IconButton :size="24" title="Horizontal Align Center"><AlignHorizontalCenter /></IconButton>
<IconButton :size="24" gapAfter title="Horizontal Align Right"><AlignHorizontalRight /></IconButton> <IconButton :size="24" gapAfter title="Horizontal Align Right"><AlignHorizontalRight /></IconButton>
<Separator :type="SeparatorType.Unrelated" />
<IconButton :size="24" title="Vertical Align Top"><AlignVerticalTop /></IconButton> <IconButton :size="24" title="Vertical Align Top"><AlignVerticalTop /></IconButton>
<IconButton :size="24" title="Vertical Align Center"><AlignVerticalCenter /></IconButton> <IconButton :size="24" title="Vertical Align Center"><AlignVerticalCenter /></IconButton>
<IconButton :size="24" title="Vertical Align Bottom"><AlignVerticalBottom /></IconButton> <IconButton :size="24" title="Vertical Align Bottom"><AlignVerticalBottom /></IconButton>
<Separator :type="SeparatorType.Related" />
<PopoverButton> <PopoverButton>
<h3>Align</h3> <h3>Align</h3>
<p>More alignment-related buttons will be here</p> <p>More alignment-related buttons will be here</p>
</PopoverButton> </PopoverButton>
<ItemDivider /> <Separator :type="SeparatorType.Section" />
<IconButton :size="24" title="Flip Horizontal"><FlipHorizontal /></IconButton> <IconButton :size="24" title="Flip Horizontal"><FlipHorizontal /></IconButton>
<IconButton :size="24" title="Flip Vertical"><FlipVertical /></IconButton> <IconButton :size="24" title="Flip Vertical"><FlipVertical /></IconButton>
<Separator :type="SeparatorType.Related" />
<PopoverButton> <PopoverButton>
<h3>Flip</h3> <h3>Flip</h3>
<p>More flip-related buttons will be here</p> <p>More flip-related buttons will be here</p>
</PopoverButton> </PopoverButton>
<ItemDivider /> <Separator :type="SeparatorType.Section" />
<IconButton :size="24" title="Boolean Union"><BooleanUnion /></IconButton> <IconButton :size="24" title="Boolean Union"><BooleanUnion /></IconButton>
<IconButton :size="24" title="Boolean Subtract Front"><BooleanSubtractFront /></IconButton> <IconButton :size="24" title="Boolean Subtract Front"><BooleanSubtractFront /></IconButton>
<IconButton :size="24" title="Boolean Subtract Back"><BooleanSubtractBack /></IconButton> <IconButton :size="24" title="Boolean Subtract Back"><BooleanSubtractBack /></IconButton>
<IconButton :size="24" title="Boolean Intersect"><BooleanIntersect /></IconButton> <IconButton :size="24" title="Boolean Intersect"><BooleanIntersect /></IconButton>
<IconButton :size="24" title="Boolean Difference"><BooleanDifference /></IconButton> <IconButton :size="24" title="Boolean Difference"><BooleanDifference /></IconButton>
<Separator :type="SeparatorType.Related" />
<PopoverButton> <PopoverButton>
<h3>Boolean</h3> <h3>Boolean</h3>
<p>More boolean-related buttons will be here</p> <p>More boolean-related buttons will be here</p>
@@ -50,12 +62,15 @@
</PopoverButton> </PopoverButton>
</RadioInput> </RadioInput>
<ItemDivider /> <Separator :type="SeparatorType.Section" />
<IconButton :size="24" title="Zoom In"><ZoomIn /></IconButton> <IconButton :size="24" title="Zoom In"><ZoomIn /></IconButton>
<IconButton :size="24" title="Zoom Out"><ZoomOut /></IconButton> <IconButton :size="24" title="Zoom Out"><ZoomOut /></IconButton>
<IconButton :size="24" title="Zoom to 100%"><ZoomReset /></IconButton> <IconButton :size="24" title="Zoom to 100%"><ZoomReset /></IconButton>
<NumberInput />
<Separator :type="SeparatorType.Related" />
<NumberInput :value="25" :unit="`%`" />
</div> </div>
</LayoutRow> </LayoutRow>
<LayoutRow :class="'shelf-and-viewport'"> <LayoutRow :class="'shelf-and-viewport'">
@@ -66,13 +81,13 @@
<ShelfItem title="Navigate Tool" :active="activeTool === 'Navigate'" @click="'tool not implemented' || selectTool('Navigate')"><NavigateTool /></ShelfItem> <ShelfItem title="Navigate Tool" :active="activeTool === 'Navigate'" @click="'tool not implemented' || selectTool('Navigate')"><NavigateTool /></ShelfItem>
<ShelfItem title="Eyedropper Tool" :active="activeTool === 'Eyedropper'" @click="'tool not implemented' || selectTool('Eyedropper')"><EyedropperTool /></ShelfItem> <ShelfItem title="Eyedropper Tool" :active="activeTool === 'Eyedropper'" @click="'tool not implemented' || selectTool('Eyedropper')"><EyedropperTool /></ShelfItem>
<ItemDivider horizontal /> <Separator :type="SeparatorType.Section" :direction="SeparatorDirection.Vertical" />
<ShelfItem title="Text Tool" :active="activeTool === 'Text'" @click="'tool not implemented' || selectTool('Text')"><TextTool /></ShelfItem> <ShelfItem title="Text Tool" :active="activeTool === 'Text'" @click="'tool not implemented' || selectTool('Text')"><TextTool /></ShelfItem>
<ShelfItem title="Fill Tool" :active="activeTool === 'Fill'" @click="'tool not implemented' || selectTool('Fill')"><FillTool /></ShelfItem> <ShelfItem title="Fill Tool" :active="activeTool === 'Fill'" @click="'tool not implemented' || selectTool('Fill')"><FillTool /></ShelfItem>
<ShelfItem title="Gradient Tool" :active="activeTool === 'Gradient'" @click="'tool not implemented' || selectTool('Gradient')"><GradientTool /></ShelfItem> <ShelfItem title="Gradient Tool" :active="activeTool === 'Gradient'" @click="'tool not implemented' || selectTool('Gradient')"><GradientTool /></ShelfItem>
<ItemDivider horizontal /> <Separator :type="SeparatorType.Section" :direction="SeparatorDirection.Vertical" />
<ShelfItem title="Brush Tool" :active="activeTool === 'Brush'" @click="'tool not implemented' || selectTool('Brush')"><BrushTool /></ShelfItem> <ShelfItem title="Brush Tool" :active="activeTool === 'Brush'" @click="'tool not implemented' || selectTool('Brush')"><BrushTool /></ShelfItem>
<ShelfItem title="Heal Tool" :active="activeTool === 'Heal'" @click="'tool not implemented' || selectTool('Heal')"><HealTool /></ShelfItem> <ShelfItem title="Heal Tool" :active="activeTool === 'Heal'" @click="'tool not implemented' || selectTool('Heal')"><HealTool /></ShelfItem>
@@ -81,7 +96,7 @@
<ShelfItem title="Detail Tool" :active="activeTool === 'BlurSharpen'" @click="'tool not implemented' || selectTool('BlurSharpen')"><BlurSharpenTool /></ShelfItem> <ShelfItem title="Detail Tool" :active="activeTool === 'BlurSharpen'" @click="'tool not implemented' || selectTool('BlurSharpen')"><BlurSharpenTool /></ShelfItem>
<ShelfItem title="Relight Tool" :active="activeTool === 'Relight'" @click="'tool not implemented' || selectTool('Relight')"><RelightTool /></ShelfItem> <ShelfItem title="Relight Tool" :active="activeTool === 'Relight'" @click="'tool not implemented' || selectTool('Relight')"><RelightTool /></ShelfItem>
<ItemDivider horizontal /> <Separator :type="SeparatorType.Section" :direction="SeparatorDirection.Vertical" />
<ShelfItem title="Path Tool" :active="activeTool === 'Path'" @click="'tool not implemented' || selectTool('Path')"><PathTool /></ShelfItem> <ShelfItem title="Path Tool" :active="activeTool === 'Path'" @click="'tool not implemented' || selectTool('Path')"><PathTool /></ShelfItem>
<ShelfItem title="Pen Tool (P)" :active="activeTool === 'Pen'" @click="selectTool('Pen')"><PenTool /></ShelfItem> <ShelfItem title="Pen Tool (P)" :active="activeTool === 'Pen'" @click="selectTool('Pen')"><PenTool /></ShelfItem>
@@ -116,7 +131,7 @@
flex: 0 0 auto; flex: 0 0 auto;
display: flex; display: flex;
align-items: center; align-items: center;
margin: 0 8px; margin: 0 4px;
.label { .label {
white-space: nowrap; white-space: nowrap;
@@ -134,7 +149,7 @@
flex: 1 1 100%; flex: 1 1 100%;
.canvas { .canvas {
background: #111; background: var(--color-1-nearblack);
width: 100%; width: 100%;
height: 100%; height: 100%;
@@ -146,11 +161,6 @@
} }
} }
} }
// The `where` pseduo-class does not contribtue to specificity
:where(.document .options-bar .side > :not(:first-child)) {
margin-left: 8px;
}
</style> </style>
<script lang="ts"> <script lang="ts">
@@ -161,7 +171,7 @@ import LayoutCol from "../layout/LayoutCol.vue";
import WorkingColors from "../widgets/WorkingColors.vue"; import WorkingColors from "../widgets/WorkingColors.vue";
import { PopoverDirection } from "../widgets/overlays/Popover.vue"; import { PopoverDirection } from "../widgets/overlays/Popover.vue";
import ShelfItem from "../widgets/ShelfItem.vue"; import ShelfItem from "../widgets/ShelfItem.vue";
import ItemDivider from "../widgets/ItemDivider.vue"; import Separator, { SeparatorDirection, SeparatorType } from "../widgets/Separator.vue";
import IconButton from "../widgets/buttons/IconButton.vue"; import IconButton from "../widgets/buttons/IconButton.vue";
import PopoverButton from "../widgets/buttons/PopoverButton.vue"; import PopoverButton from "../widgets/buttons/PopoverButton.vue";
import RadioInput from "../widgets/inputs/RadioInput.vue"; import RadioInput from "../widgets/inputs/RadioInput.vue";
@@ -215,7 +225,7 @@ export default defineComponent({
LayoutCol, LayoutCol,
WorkingColors, WorkingColors,
ShelfItem, ShelfItem,
ItemDivider, Separator,
IconButton, IconButton,
PopoverButton, PopoverButton,
RadioInput, RadioInput,
@@ -318,6 +328,8 @@ export default defineComponent({
viewportSvg: "", viewportSvg: "",
activeTool: "Select", activeTool: "Select",
PopoverDirection, PopoverDirection,
SeparatorDirection,
SeparatorType,
}; };
}, },
}); });
+13 -4
View File
@@ -1,8 +1,10 @@
<template> <template>
<LayoutCol :class="'layer-tree-panel'"> <LayoutCol :class="'layer-tree-panel'">
<LayoutRow :class="'options-bar'"> <LayoutRow :class="'options-bar'">
<NumberInput /> <NumberInput :value="100" :unit="`%`" />
<NumberInput />
<Separator :type="SeparatorType.Related" />
<PopoverButton> <PopoverButton>
<h3>Compositing Options</h3> <h3>Compositing Options</h3>
<p>More blend and compositing options will be here</p> <p>More blend and compositing options will be here</p>
@@ -36,8 +38,12 @@
.layer-tree-panel { .layer-tree-panel {
.options-bar { .options-bar {
height: 32px; height: 32px;
margin: 0 8px; margin: 0 4px;
align-items: center; align-items: center;
.number-input {
flex: 1 1 100%;
}
} }
.layer-row { .layer-row {
@@ -49,7 +55,7 @@
.layer { .layer {
display: flex; display: flex;
align-items: center; align-items: center;
background: #555; background: var(--color-5-dullgray);
border-radius: 4px; border-radius: 4px;
width: 100%; width: 100%;
height: 100%; height: 100%;
@@ -79,6 +85,7 @@ import { defineComponent } from "vue";
import { ResponseType, registerResponseHandler, Response, ExpandFolder, LayerPanelEntry } from "../../response-handler"; import { ResponseType, registerResponseHandler, Response, ExpandFolder, LayerPanelEntry } from "../../response-handler";
import LayoutRow from "../layout/LayoutRow.vue"; import LayoutRow from "../layout/LayoutRow.vue";
import LayoutCol from "../layout/LayoutCol.vue"; import LayoutCol from "../layout/LayoutCol.vue";
import Separator, { SeparatorType } from "../widgets/Separator.vue";
import NumberInput from "../widgets/inputs/NumberInput.vue"; import NumberInput from "../widgets/inputs/NumberInput.vue";
import PopoverButton from "../widgets/buttons/PopoverButton.vue"; import PopoverButton from "../widgets/buttons/PopoverButton.vue";
import { PopoverDirection } from "../widgets/overlays/Popover.vue"; import { PopoverDirection } from "../widgets/overlays/Popover.vue";
@@ -94,6 +101,7 @@ export default defineComponent({
components: { components: {
LayoutRow, LayoutRow,
LayoutCol, LayoutCol,
Separator,
PopoverButton, PopoverButton,
NumberInput, NumberInput,
IconButton, IconButton,
@@ -127,6 +135,7 @@ export default defineComponent({
data() { data() {
return { return {
PopoverDirection, PopoverDirection,
SeparatorType,
layers: [] as Array<LayerPanelEntry>, layers: [] as Array<LayerPanelEntry>,
}; };
}, },
@@ -53,8 +53,8 @@
display: block; display: block;
width: 100%; width: 100%;
height: 100%; height: 100%;
background: linear-gradient(45deg, #ccc 25%, transparent 25%, transparent 75%, #ccc 75%), linear-gradient(45deg, #ccc 25%, transparent 25%, transparent 75%, #ccc 75%), background: linear-gradient(45deg, #cccccc 25%, transparent 25%, transparent 75%, #cccccc 75%), linear-gradient(45deg, #cccccc 25%, transparent 25%, transparent 75%, #cccccc 75%),
linear-gradient(#fff, #fff); linear-gradient(#ffffff, #ffffff);
background-size: 16px 16px; background-size: 16px 16px;
background-position: 0 0, 8px 8px; background-position: 0 0, 8px 8px;
position: relative; position: relative;
@@ -97,7 +97,7 @@
left: 0; left: 0;
border-style: solid; border-style: solid;
border-width: 4px 0 4px 4px; border-width: 4px 0 4px 4px;
border-color: transparent transparent transparent black; border-color: transparent transparent transparent #000000;
} }
&::after { &::after {
@@ -107,7 +107,7 @@
right: 0; right: 0;
border-style: solid; border-style: solid;
border-width: 4px 4px 4px 0; border-width: 4px 4px 4px 0;
border-color: transparent black transparent transparent; border-color: transparent #000000 transparent transparent;
} }
} }
} }
@@ -1,50 +0,0 @@
<template>
<div class="item-spacer" :class="{ horizontal: horizontal }">
<div></div>
</div>
</template>
<style lang="scss">
.item-spacer {
margin-left: 0;
& + * {
margin-left: 0;
}
&:not(.horizontal) {
height: 100%;
padding: 0 8px;
div {
height: calc(100% - 8px);
width: 1px;
margin: 4px 0;
background: #888;
}
}
&.horizontal {
width: 100%;
padding: 8px 0;
div {
height: 1px;
width: calc(100% - 8px);
margin: 0 4px;
background: #888;
}
}
}
</style>
<script lang="ts">
import { defineComponent } from "vue";
export default defineComponent({
components: {},
props: {
horizontal: { type: Boolean, default: false },
},
});
</script>
@@ -0,0 +1,82 @@
<template>
<div class="separator" :class="[direction.toLowerCase(), type.toLowerCase()]">
<div v-if="type === SeparatorType.Section"></div>
</div>
</template>
<style lang="scss">
.separator {
&.vertical {
&.related {
margin-top: 4px;
}
&.unrelated {
margin-top: 8px;
}
&.section {
width: 100%;
margin: 8px 0;
div {
height: 1px;
width: calc(100% - 8px);
margin: 0 4px;
background: var(--color-7-middlegray);
}
}
}
&.horizontal {
&.related {
margin-left: 4px;
}
&.unrelated {
margin-left: 8px;
}
&.section {
height: 100%;
margin: 0 8px;
div {
height: calc(100% - 8px);
width: 1px;
margin: 4px 0;
background: var(--color-7-middlegray);
}
}
}
}
</style>
<script lang="ts">
import { defineComponent } from "vue";
export enum SeparatorDirection {
"Horizontal" = "Horizontal",
"Vertical" = "Vertical",
}
export enum SeparatorType {
"Related" = "Related",
"Unrelated" = "Unrelated",
"Section" = "Section",
}
export default defineComponent({
components: {},
props: {
direction: { type: String, default: SeparatorDirection.Horizontal },
type: { type: String, default: SeparatorType.Unrelated },
},
data() {
return {
SeparatorDirection,
SeparatorType,
};
},
});
</script>
@@ -10,11 +10,11 @@
border-radius: 2px; border-radius: 2px;
&:hover { &:hover {
background: #666; background: var(--color-6-lowergray);
} }
&.active { &.active {
background: #3194d6; background: var(--color-accent);
} }
svg { svg {
@@ -1,5 +1,5 @@
<template> <template>
<button class="icon-button" :class="[`size-${String(size)}`, gapAfter && 'gap-after']"> <button class="icon-button" :class="`size-${String(size)}`">
<slot></slot> <slot></slot>
</button> </button>
</template> </template>
@@ -14,7 +14,7 @@
border-radius: 2px; border-radius: 2px;
background: none; background: none;
vertical-align: top; vertical-align: top;
fill: #ddd; fill: var(--color-e-nearwhite);
width: 16px; width: 16px;
height: 16px; height: 16px;
@@ -23,14 +23,10 @@
margin-left: 0; margin-left: 0;
} }
&.gap-after + .icon-button {
margin-left: 8px;
}
&:hover { &:hover {
background: #666; background: var(--color-6-lowergray);
color: white; color: var(--color-f-white);
fill: white; fill: var(--color-f-white);
} }
&.size-10 { &.size-10 {
@@ -15,7 +15,7 @@
position: relative; position: relative;
width: 16px; width: 16px;
height: 24px; height: 24px;
margin: 2px 4px; flex: 0 0 auto;
.popover { .popover {
left: 50%; left: 50%;
@@ -29,12 +29,12 @@
border: none; border: none;
border-radius: 2px; border-radius: 2px;
vertical-align: top; vertical-align: top;
background: #111; background: var(--color-1-nearblack);
fill: #ddd; fill: var(--color-e-nearwhite);
&:hover { &:hover {
background: #666; background: var(--color-6-lowergray);
fill: #fff; fill: var(--color-f-white);
} }
} }
} }
@@ -20,18 +20,18 @@
padding: 0 8px; padding: 0 8px;
svg { svg {
fill: #ddd; fill: var(--color-e-nearwhite);
} }
&:hover { &:hover {
background: #666; background: var(--color-6-lowergray);
svg { svg {
fill: #fff; fill: var(--color-f-white);
} }
span { span {
color: #fff; color: var(--color-f-white);
} }
} }
} }
@@ -2,7 +2,7 @@
<div class="number-input"> <div class="number-input">
<button class="arrow left"></button> <button class="arrow left"></button>
<button class="arrow right"></button> <button class="arrow right"></button>
<input type="text" spellcheck="false" value="25%" /> <input type="text" spellcheck="false" :value="`${value}${unit}`" />
</div> </div>
</template> </template>
@@ -12,7 +12,7 @@
height: 24px; height: 24px;
position: relative; position: relative;
border-radius: 2px; border-radius: 2px;
background: #111; background: var(--color-1-nearblack);
overflow: hidden; overflow: hidden;
input { input {
@@ -23,13 +23,13 @@
background: none; background: none;
padding: 0; padding: 0;
line-height: 24px; line-height: 24px;
color: #ddd; color: var(--color-e-nearwhite);
font-size: inherit; font-size: inherit;
text-align: center; text-align: center;
font-family: inherit; font-family: inherit;
&::selection { &::selection {
background: #3194d6; background: var(--color-accent);
} }
} }
@@ -46,14 +46,14 @@
padding: 9px 0; padding: 9px 0;
&:hover { &:hover {
background: #666; background: var(--color-6-lowergray);
&.right::before { &.right::before {
border-color: transparent transparent transparent #fff; border-color: transparent transparent transparent var(--color-f-white);
} }
&.left::after { &.left::after {
border-color: transparent #fff transparent transparent; border-color: transparent var(--color-f-white) transparent transparent;
} }
} }
@@ -68,7 +68,7 @@
height: 0; height: 0;
border-style: solid; border-style: solid;
border-width: 3px 0 3px 3px; border-width: 3px 0 3px 3px;
border-color: transparent transparent transparent #ddd; border-color: transparent transparent transparent var(--color-e-nearwhite);
display: block; display: block;
} }
} }
@@ -84,7 +84,7 @@
height: 0; height: 0;
border-style: solid; border-style: solid;
border-width: 3px 3px 3px 0; border-width: 3px 3px 3px 0;
border-color: transparent #ddd transparent transparent; border-color: transparent var(--color-e-nearwhite) transparent transparent;
display: block; display: block;
} }
} }
@@ -97,6 +97,9 @@ import { defineComponent } from "vue";
export default defineComponent({ export default defineComponent({
components: {}, components: {},
props: {}, props: {
value: { type: Number, required: true },
unit: { type: String, default: "" },
},
}); });
</script> </script>
@@ -29,17 +29,17 @@
} }
} }
button { & > button {
background: #555; background: var(--color-5-dullgray);
fill: #ddd; fill: var(--color-e-nearwhite);
&:hover { &:hover {
background: #666; background: var(--color-6-lowergray);
} }
&.active { &.active {
background: #3194d6; background: var(--color-accent);
fill: #fff; fill: var(--color-f-white);
} }
} }
} }
@@ -1,13 +1,13 @@
<template> <template>
<div class="swatch-pair"> <div class="swatch-pair">
<div class="secondary swatch"> <div class="secondary swatch">
<button @click="clickSecondarySwatch" style="background: white"></button> <button @click="clickSecondarySwatch" style="background: #ffffff"></button>
<Popover :direction="PopoverDirection.Right" horizontal ref="secondarySwatchPopover"> <Popover :direction="PopoverDirection.Right" horizontal ref="secondarySwatchPopover">
<ColorPicker /> <ColorPicker />
</Popover> </Popover>
</div> </div>
<div class="primary swatch"> <div class="primary swatch">
<button @click="clickPrimarySwatch" style="background: black"></button> <button @click="clickPrimarySwatch" style="background: #000000"></button>
<Popover :direction="PopoverDirection.Right" horizontal ref="primarySwatchPopover"> <Popover :direction="PopoverDirection.Right" horizontal ref="primarySwatchPopover">
<ColorPicker /> <ColorPicker />
</Popover> </Popover>
@@ -24,15 +24,15 @@
.swatch { .swatch {
width: 28px; width: 28px;
height: 28px; height: 28px;
margin: 2px; margin: 0 2px;
position: relative; position: relative;
button { button {
width: 100%; width: 100%;
height: 100%; height: 100%;
border-radius: 50%; border-radius: 50%;
border: 2px #888 solid; border: 2px var(--color-7-middlegray) solid;
box-shadow: 0 0 0 2px #333; box-shadow: 0 0 0 2px var(--color-3-darkgray);
margin: 0; margin: 0;
padding: 0; padding: 0;
box-sizing: border-box; box-sizing: border-box;
@@ -1,5 +1,5 @@
<template> <template>
<div class="icon" :class="[`size-${String(size)}`, gapAfter && 'gap-after']"> <div class="icon" :class="`size-${String(size)}`">
<slot></slot> <slot></slot>
</div> </div>
</template> </template>
@@ -8,14 +8,11 @@
.icon { .icon {
display: inline-block; display: inline-block;
flex: 0 0 auto; flex: 0 0 auto;
fill: #ddd; fill: var(--color-e-nearwhite);
vertical-align: top; vertical-align: top;
width: 16px; width: 16px;
height: 16px; height: 16px;
margin-left: 0;
&:not(.gap-after) + .icon {
margin-left: 0;
}
&.size-10 { &.size-10 {
width: 10px; width: 10px;
@@ -38,12 +38,12 @@
font-family: "Inconsolata", monospace; font-family: "Inconsolata", monospace;
font-weight: bold; font-weight: bold;
text-align: center; text-align: center;
color: #111; color: var(--color-2-mildblack);
background: #ddd; background: var(--color-e-nearwhite);
border: 1px; border: 1px;
box-sizing: border-box; box-sizing: border-box;
border-style: solid; border-style: solid;
border-color: #888; border-color: var(--color-7-middlegray);
border-radius: 4px; border-radius: 4px;
height: 16px; height: 16px;
line-height: 16px; line-height: 16px;
@@ -71,11 +71,11 @@
.input-mouse { .input-mouse {
.bright { .bright {
fill: #ddd; fill: var(--color-e-nearwhite);
} }
.dim { .dim {
fill: #888; fill: var(--color-7-middlegray);
} }
svg { svg {
@@ -10,6 +10,8 @@
</template> </template>
<style lang="scss"> <style lang="scss">
@use "sass:color";
.popover { .popover {
position: absolute; position: absolute;
width: 0; width: 0;
@@ -35,28 +37,28 @@
.top > & { .top > & {
border-width: 8px 6px 0 6px; border-width: 8px 6px 0 6px;
border-color: #222222e6 transparent transparent transparent; border-color: var(--popover-opacity-color-2-mildblack) transparent transparent transparent;
margin-left: -6px; margin-left: -6px;
margin-bottom: 2px; margin-bottom: 2px;
} }
.bottom > & { .bottom > & {
border-width: 0 6px 8px 6px; border-width: 0 6px 8px 6px;
border-color: transparent transparent #222222e6 transparent; border-color: transparent transparent var(--popover-opacity-color-2-mildblack) transparent;
margin-left: -6px; margin-left: -6px;
margin-top: 2px; margin-top: 2px;
} }
.left > & { .left > & {
border-width: 6px 0 6px 8px; border-width: 6px 0 6px 8px;
border-color: transparent transparent transparent #222222e6; border-color: transparent transparent transparent var(--popover-opacity-color-2-mildblack);
margin-top: -6px; margin-top: -6px;
margin-right: 2px; margin-right: 2px;
} }
.right > & { .right > & {
border-width: 6px 8px 6px 0; border-width: 6px 8px 6px 0;
border-color: transparent #222222e6 transparent transparent; border-color: transparent var(--popover-opacity-color-2-mildblack) transparent transparent;
margin-top: -6px; margin-top: -6px;
margin-left: 2px; margin-left: 2px;
} }
@@ -86,10 +88,10 @@
} }
.popover-content { .popover-content {
background: #222222e6; background: var(--popover-opacity-color-2-mildblack);
box-shadow: #000 0 0 4px; box-shadow: var(--color-0-black) 0 0 4px;
border-radius: 4px; border-radius: 4px;
color: #eee; color: var(--color-e-nearwhite);
font-size: inherit; font-size: inherit;
padding: 8px; padding: 8px;
z-index: 0; z-index: 0;
@@ -1,12 +1,12 @@
<template> <template>
<LayoutCol class="main-window"> <LayoutCol class="main-window">
<LayoutRow :class="'title-bar'"> <LayoutRow :class="'title-bar-row'">
<TitleBar :platform="platform" :maximized="maximized" /> <TitleBar :platform="platform" :maximized="maximized" />
</LayoutRow> </LayoutRow>
<LayoutRow :class="'workspace'"> <LayoutRow :class="'workspace-row'">
<Workspace /> <Workspace />
</LayoutRow> </LayoutRow>
<LayoutRow :class="'status-bar'"> <LayoutRow :class="'status-bar-row'">
<StatusBar /> <StatusBar />
</LayoutRow> </LayoutRow>
</LayoutCol> </LayoutCol>
@@ -17,17 +17,17 @@
height: 100%; height: 100%;
} }
.title-bar { .title-bar-row {
height: 28px; height: 28px;
flex: 0 0 auto; flex: 0 0 auto;
} }
.workspace { .workspace-row {
flex: 1 1 100%; flex: 1 1 100%;
height: 100%; height: 100%;
} }
.status-bar { .status-bar-row {
height: 24px; height: 24px;
flex: 0 0 auto; flex: 0 0 auto;
} }
@@ -1,21 +1,25 @@
<template> <template>
<div class="status-bar"> <div class="status-bar">
<UserInputLabel :inputMouse="'LMB'">Select Object</UserInputLabel> <UserInputLabel :inputMouse="'LMBDrag'">Drag Selected</UserInputLabel>
<span class="plus">+</span> <Separator :type="SeparatorType.Section" />
<UserInputLabel :inputKeys="['⇧']">Grow/Shrink Selection</UserInputLabel>
<div class="divider"></div>
<UserInputLabel :inputMouse="'LMBDrag'">Select Area</UserInputLabel>
<span class="plus">+</span>
<UserInputLabel :inputKeys="['⇧']">Grow/Shrink Selection</UserInputLabel>
<div class="divider"></div>
<UserInputLabel :inputKeys="['G']">Grab Selected</UserInputLabel> <UserInputLabel :inputKeys="['G']">Grab Selected</UserInputLabel>
<UserInputLabel :inputKeys="['R']">Rotate Selected</UserInputLabel> <UserInputLabel :inputKeys="['R']">Rotate Selected</UserInputLabel>
<UserInputLabel :inputKeys="['S']">Scale Selected</UserInputLabel> <UserInputLabel :inputKeys="['S']">Scale Selected</UserInputLabel>
<div class="divider"></div> <Separator :type="SeparatorType.Section" />
<UserInputLabel :inputMouse="'LMB'">Select Object</UserInputLabel>
<span class="plus">+</span>
<UserInputLabel :inputKeys="['Ctrl']">Innermost</UserInputLabel>
<span class="plus">+</span>
<UserInputLabel :inputKeys="['⇧']">Grow/Shrink Selection</UserInputLabel>
<Separator :type="SeparatorType.Section" />
<UserInputLabel :inputMouse="'LMBDrag'">Select Area</UserInputLabel>
<span class="plus">+</span>
<UserInputLabel :inputKeys="['⇧']">Grow/Shrink Selection</UserInputLabel>
<Separator :type="SeparatorType.Section" />
<UserInputLabel :inputKeys="['↑', '→', '↓', '←']">Nudge Selected</UserInputLabel> <UserInputLabel :inputKeys="['↑', '→', '↓', '←']">Nudge Selected</UserInputLabel>
<span class="plus">+</span> <span class="plus">+</span>
<UserInputLabel :inputKeys="['⇧']">Big Increment Nudge</UserInputLabel> <UserInputLabel :inputKeys="['⇧']">Big Increment Nudge</UserInputLabel>
<div class="divider"></div> <Separator :type="SeparatorType.Section" />
<UserInputLabel :inputKeys="['Alt']" :inputMouse="'LMBDrag'">Move Duplicate</UserInputLabel> <UserInputLabel :inputKeys="['Alt']" :inputMouse="'LMBDrag'">Move Duplicate</UserInputLabel>
<UserInputLabel :inputKeys="['Ctrl', 'D']">Duplicate</UserInputLabel> <UserInputLabel :inputKeys="['Ctrl', 'D']">Duplicate</UserInputLabel>
</div> </div>
@@ -24,33 +28,45 @@
<style lang="scss"> <style lang="scss">
.status-bar { .status-bar {
display: flex; display: flex;
}
.plus { .plus {
display: flex; display: flex;
align-items: center; align-items: center;
font-weight: bold; font-weight: bold;
} }
.divider { .user-input-label + .user-input-label {
width: 1px; margin-left: 0;
height: 16px; }
margin: 4px 0;
background: #888;
}
.user-input-label + .user-input-label { .separator.section {
margin-left: 0; margin: 0;
}
> :first-child {
margin-left: 4px;
}
> :last-child {
margin-right: 4px;
}
} }
</style> </style>
<script lang="ts"> <script lang="ts">
import { defineComponent } from "vue"; import { defineComponent } from "vue";
import UserInputLabel from "../../widgets/labels/UserInputLabel.vue"; import UserInputLabel from "../../widgets/labels/UserInputLabel.vue";
import Separator, { SeparatorType } from "../../widgets/Separator.vue";
export default defineComponent({ export default defineComponent({
components: { components: {
UserInputLabel, UserInputLabel,
Separator,
},
data() {
return {
SeparatorType,
};
}, },
}); });
</script> </script>
@@ -20,14 +20,14 @@
padding: 0 20px; padding: 0 20px;
svg { svg {
fill: #ddd; fill: var(--color-e-nearwhite);
} }
&:hover { &:hover {
background: #666; background: var(--color-6-lowergray);
svg { svg {
fill: #fff; fill: var(--color-f-white);
} }
} }
+13 -9
View File
@@ -22,7 +22,7 @@
<style lang="scss"> <style lang="scss">
.panel { .panel {
background: #111; background: var(--color-1-nearblack);
border-radius: 8px; border-radius: 8px;
flex-grow: 1; flex-grow: 1;
display: flex; display: flex;
@@ -35,7 +35,7 @@
flex-direction: row; flex-direction: row;
&.min-widths .tab-group .tab { &.min-widths .tab-group .tab {
min-width: 120px; min-width: 124px;
max-width: 360px; max-width: 360px;
} }
@@ -47,13 +47,13 @@
.tab { .tab {
height: 100%; height: 100%;
padding: 0 10px; padding: 0 8px;
display: flex; display: flex;
align-items: center; align-items: center;
position: relative; position: relative;
&.active { &.active {
background: #333; background: var(--color-3-darkgray);
border-radius: 8px 8px 0 0; border-radius: 8px 8px 0 0;
position: relative; position: relative;
@@ -69,13 +69,13 @@
&:not(:first-child)::before { &:not(:first-child)::before {
left: -16px; left: -16px;
border-bottom-right-radius: 8px; border-bottom-right-radius: 8px;
box-shadow: 8px 0 0 0 #333; box-shadow: 8px 0 0 0 var(--color-3-darkgray);
} }
&::after { &::after {
right: -16px; right: -16px;
border-bottom-left-radius: 8px; border-bottom-left-radius: 8px;
box-shadow: -8px 0 0 0 #333; box-shadow: -8px 0 0 0 var(--color-3-darkgray);
} }
} }
@@ -102,7 +102,7 @@
left: -1px; left: -1px;
width: 1px; width: 1px;
height: 16px; height: 16px;
background: #444; background: var(--color-4-dimgray);
} }
} }
@@ -115,15 +115,19 @@
right: -1px; right: -1px;
width: 1px; width: 1px;
height: 16px; height: 16px;
background: #444; background: var(--color-4-dimgray);
} }
} }
} }
} }
.popover-button {
margin: 2px 4px;
}
} }
.panel-body { .panel-body {
background: #333; background: var(--color-3-darkgray);
flex-grow: 1; flex-grow: 1;
} }
} }
@@ -5,21 +5,21 @@
:panelType="'Document'" :panelType="'Document'"
:tabCloseButtons="true" :tabCloseButtons="true"
:tabMinWidths="true" :tabMinWidths="true"
:tabLabels="['X-35B Over Death Valley*', 'Document 2', 'Document 3', 'Document 4', 'Document 5']" :tabLabels="['X-35B Over Death Valley*', 'Document 1', 'Document 2', 'Document 3', 'Document 4', 'Document 5']"
:tabActiveIndex="0" :tabActiveIndex="0"
/> />
</LayoutCol> </LayoutCol>
<LayoutCol class="workspace-grid-resize-gutter"></LayoutCol> <LayoutCol class="workspace-grid-resize-gutter"></LayoutCol>
<LayoutCol class="workspace-grid-subdivision" style="flex-grow: 319"> <LayoutCol class="workspace-grid-subdivision" style="flex-grow: 319">
<LayoutRow class="workspace-grid-subdivision"> <LayoutRow class="workspace-grid-subdivision" style="flex-grow: 402">
<Panel :panelType="'Properties'" :tabLabels="['Properties', 'Spreadsheet', 'Palettes']" :tabActiveIndex="0" /> <Panel :panelType="'Properties'" :tabLabels="['Properties', 'Spreadsheet', 'Palettes']" :tabActiveIndex="0" />
</LayoutRow> </LayoutRow>
<LayoutRow class="workspace-grid-resize-gutter"></LayoutRow> <LayoutRow class="workspace-grid-resize-gutter"></LayoutRow>
<LayoutRow class="workspace-grid-subdivision"> <LayoutRow class="workspace-grid-subdivision" style="flex-grow: 590">
<Panel :panelType="'LayerTree'" :tabLabels="['Layer Tree']" :tabActiveIndex="0" /> <Panel :panelType="'LayerTree'" :tabLabels="['Layer Tree']" :tabActiveIndex="0" />
</LayoutRow> </LayoutRow>
<LayoutRow class="workspace-grid-resize-gutter"></LayoutRow> <LayoutRow class="workspace-grid-resize-gutter"></LayoutRow>
<LayoutRow class="workspace-grid-subdivision" style="flex-grow: 0; height: 0"> <LayoutRow class="workspace-grid-subdivision folded">
<Panel :panelType="'Minimap'" :tabLabels="['Minimap', 'Asset Manager']" :tabActiveIndex="0" /> <Panel :panelType="'Minimap'" :tabLabels="['Minimap', 'Asset Manager']" :tabActiveIndex="0" />
</LayoutRow> </LayoutRow>
</LayoutCol> </LayoutCol>
@@ -29,6 +29,12 @@
<style lang="scss"> <style lang="scss">
.workspace-grid-subdivision { .workspace-grid-subdivision {
min-height: 28px; min-height: 28px;
flex: 1 1 0;
&.folded {
flex-grow: 0;
height: 0;
}
} }
.workspace-grid-resize-gutter { .workspace-grid-resize-gutter {