diff --git a/client/web/assets/svg/16x16-bounds-12x12-icon/reset-colors.svg b/client/web/assets/svg/16x16-bounds-12x12-icon/reset-colors.svg new file mode 100644 index 00000000..d09ca7cd --- /dev/null +++ b/client/web/assets/svg/16x16-bounds-12x12-icon/reset-colors.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/web/assets/svg/16x16-bounds-12x12-icon/swap.svg b/client/web/assets/svg/16x16-bounds-12x12-icon/swap.svg new file mode 100644 index 00000000..b5e1a9f0 --- /dev/null +++ b/client/web/assets/svg/16x16-bounds-12x12-icon/swap.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/web/assets/svg/16x24-bounds-8x16-icon/dropdown-arrow.svg b/client/web/assets/svg/16x24-bounds-8x16-icon/dropdown-arrow.svg new file mode 100644 index 00000000..eeff7b48 --- /dev/null +++ b/client/web/assets/svg/16x24-bounds-8x16-icon/dropdown-arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/align-horizontal-center.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/align-horizontal-center.svg new file mode 100644 index 00000000..5fb2d4e8 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/align-horizontal-center.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/align-horizontal-left.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/align-horizontal-left.svg new file mode 100644 index 00000000..1d88c26f --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/align-horizontal-left.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/align-horizontal-right.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/align-horizontal-right.svg new file mode 100644 index 00000000..2e03fe63 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/align-horizontal-right.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/align-vertical-bottom.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/align-vertical-bottom.svg new file mode 100644 index 00000000..a233ab6c --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/align-vertical-bottom.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/align-vertical-center.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/align-vertical-center.svg new file mode 100644 index 00000000..dc60f243 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/align-vertical-center.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/align-vertical-top.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/align-vertical-top.svg new file mode 100644 index 00000000..618ba21f --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/align-vertical-top.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-difference.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-difference.svg new file mode 100644 index 00000000..0cf75b7e --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-difference.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-intersect.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-intersect.svg new file mode 100644 index 00000000..6f915e92 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-intersect.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-subtract-back.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-subtract-back.svg new file mode 100644 index 00000000..0042e51e --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-subtract-back.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-subtract-front.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-subtract-front.svg new file mode 100644 index 00000000..d84b2fa3 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-subtract-front.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-union.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-union.svg new file mode 100644 index 00000000..a0f69c43 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/boolean-union.svg @@ -0,0 +1,3 @@ + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/flip-horizontal.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/flip-horizontal.svg new file mode 100644 index 00000000..1076881d --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/flip-horizontal.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/web/assets/svg/24x24-bounds-16x16-icon/flip-vertical.svg b/client/web/assets/svg/24x24-bounds-16x16-icon/flip-vertical.svg new file mode 100644 index 00000000..b7904c65 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-16x16-icon/flip-vertical.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-crop.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-crop.svg new file mode 100644 index 00000000..23508a0d --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-crop.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-navigate.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-navigate.svg new file mode 100644 index 00000000..e602c2b5 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-navigate.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-sample.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-sample.svg new file mode 100644 index 00000000..caa7791b --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-sample.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-select.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-select.svg new file mode 100644 index 00000000..7323a8c0 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-layout-select.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-parametric-fill.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-parametric-fill.svg new file mode 100644 index 00000000..e13b631f --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-parametric-fill.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-parametric-gradient.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-parametric-gradient.svg new file mode 100644 index 00000000..f803c5c1 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-parametric-gradient.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-parametric-text.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-parametric-text.svg new file mode 100644 index 00000000..29144206 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-parametric-text.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-blur-sharpen.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-blur-sharpen.svg new file mode 100644 index 00000000..6a9a07b9 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-blur-sharpen.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-brush.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-brush.svg new file mode 100644 index 00000000..e243d5ae --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-brush.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-clone.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-clone.svg new file mode 100644 index 00000000..d464c16d --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-clone.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-heal.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-heal.svg new file mode 100644 index 00000000..494f1582 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-heal.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-patch.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-patch.svg new file mode 100644 index 00000000..0e0c0957 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-patch.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-relight.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-relight.svg new file mode 100644 index 00000000..c984146b --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-raster-relight.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-ellipse.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-ellipse.svg new file mode 100644 index 00000000..e725555c --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-ellipse.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-freehand.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-freehand.svg new file mode 100644 index 00000000..d974cdac --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-freehand.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-line.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-line.svg new file mode 100644 index 00000000..8d756ec5 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-line.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-path.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-path.svg new file mode 100644 index 00000000..91de5f9b --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-path.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-pen.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-pen.svg new file mode 100644 index 00000000..516cc345 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-pen.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-rectangle.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-rectangle.svg new file mode 100644 index 00000000..e6b8e228 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-rectangle.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-shape.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-shape.svg new file mode 100644 index 00000000..330b9859 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-shape.svg @@ -0,0 +1,4 @@ + + + + diff --git a/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-spline.svg b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-spline.svg new file mode 100644 index 00000000..fa287cd2 --- /dev/null +++ b/client/web/assets/svg/24x24-bounds-24x24-icon/document-tool-vector-spline.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/client/web/public/browserconfig.xml b/client/web/public/browserconfig.xml index 3ec377f7..64e2ba91 100644 --- a/client/web/public/browserconfig.xml +++ b/client/web/public/browserconfig.xml @@ -2,7 +2,7 @@ - + #ffffff diff --git a/client/web/src/components/layout/LayoutCol.vue b/client/web/src/components/layout/LayoutCol.vue index 6d8dd731..bbc4a364 100644 --- a/client/web/src/components/layout/LayoutCol.vue +++ b/client/web/src/components/layout/LayoutCol.vue @@ -9,6 +9,10 @@ display: flex; flex-direction: column; flex-grow: 1; + + .spacer { + flex: 1 1 100%; + } } diff --git a/client/web/src/components/layout/LayoutRow.vue b/client/web/src/components/layout/LayoutRow.vue index b05243e9..c1b7dad1 100644 --- a/client/web/src/components/layout/LayoutRow.vue +++ b/client/web/src/components/layout/LayoutRow.vue @@ -9,6 +9,10 @@ display: flex; flex-direction: row; flex-grow: 1; + + .spacer { + flex: 1 1 100%; + } } diff --git a/client/web/src/components/panel-system/DockablePanel.vue b/client/web/src/components/panel-system/DockablePanel.vue index 5b610975..93399298 100644 --- a/client/web/src/components/panel-system/DockablePanel.vue +++ b/client/web/src/components/panel-system/DockablePanel.vue @@ -4,14 +4,12 @@
{{tabLabel}} - + + +
-
- -
+
@@ -88,26 +86,8 @@ line-height: 28px; } - button { - flex: 0 0 auto; - outline: none; - border: none; - padding: 0; - width: 16px; - height: 16px; - background: none; - color: #ddd; - font-weight: bold; - font-size: 10px; - border-radius: 2px; + .icon-button { margin-left: 8px; - fill: #ddd; - - &:hover { - background: #555; - color: white; - fill: white; - } } &:not(.active) + .tab:not(.active) { @@ -137,24 +117,6 @@ } } } - - .panel-options-ellipsis { - width: 16px; - height: 24px; - margin: 2px 4px; - - svg { - width: 16px; - height: 24px; - border-radius: 2px; - fill: #ddd; - } - - &:hover svg { - background: #555; - fill: #fff; - } - } } .panel-content { @@ -170,6 +132,8 @@ import Document from "../panels/Document.vue"; import Properties from "../panels/Properties.vue"; import LayerTree from "../panels/LayerTree.vue"; import Minimap from "../panels/Minimap.vue"; +import IconButton from "../widgets/IconButton.vue"; +import DropdownButton, { DropdownButtonIcon } from "../widgets/DropdownButton.vue"; import VerticalEllipsis from "../../../assets/svg/16x24-bounds-8x16-icon/vertical-ellipsis.svg"; import CloseX from "../../../assets/svg/16x16-bounds-12x12-icon/close-x.svg"; @@ -179,6 +143,8 @@ export default defineComponent({ Properties, LayerTree, Minimap, + IconButton, + DropdownButton, CloseX, VerticalEllipsis, }, @@ -189,5 +155,10 @@ export default defineComponent({ tabActiveIndex: { type: Number, required: true }, panelType: { type: String, required: true }, }, + data() { + return { + DropdownButtonIcon, + }; + }, }); diff --git a/client/web/src/components/panels/Document.vue b/client/web/src/components/panels/Document.vue index 7daf5cd4..fcbfdbd5 100644 --- a/client/web/src/components/panels/Document.vue +++ b/client/web/src/components/panels/Document.vue @@ -2,16 +2,154 @@
- + Select + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
-
- -
+
- + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + +
+
+ + + + + + +
+
+
* { - margin: 0 4px; - } + margin: 0 8px; .label { white-space: nowrap; font-weight: bold; } - - .divider { - width: 1px; - height: 24px; - background: #888; - } - } - - .spacer { - flex: 1 1 100%; } } .shelf-and-viewport { .shelf { flex: 0 0 32px; + + .swatch-pair { + display: flex; + // Reversed order of elements paired with `column-reverse` allows primary to overlap secondary without relying on `z-index` + flex-direction: column-reverse; + } + + .working-colors { + .swatch { + width: 24px; + height: 24px; + border-radius: 50%; + border: 2px #888 solid; + box-shadow: 0 0 0 2px #333; + margin: 2px; + padding: 0; + box-sizing: unset; + outline: none; + } + + .primary.swatch { + margin-bottom: -8px; + } + } + + .swap-and-reset { + font-size: 0; + } } .viewport { @@ -82,12 +234,57 @@ } } } + +// The `where` pseduo-class does not contribtue to specificity +:where(.document .options-bar .side > :not(:first-child)) { + margin-left: 8px; +} diff --git a/client/web/src/components/widgets/DropdownButton.vue b/client/web/src/components/widgets/DropdownButton.vue new file mode 100644 index 00000000..be837551 --- /dev/null +++ b/client/web/src/components/widgets/DropdownButton.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/client/web/src/components/widgets/IconButton.vue b/client/web/src/components/widgets/IconButton.vue new file mode 100644 index 00000000..c9dcadef --- /dev/null +++ b/client/web/src/components/widgets/IconButton.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/client/web/src/components/widgets/ItemDivider.vue b/client/web/src/components/widgets/ItemDivider.vue new file mode 100644 index 00000000..26c476de --- /dev/null +++ b/client/web/src/components/widgets/ItemDivider.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/client/web/src/components/widgets/ShelfItem.vue b/client/web/src/components/widgets/ShelfItem.vue new file mode 100644 index 00000000..3c7fcb0c --- /dev/null +++ b/client/web/src/components/widgets/ShelfItem.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/client/web/wasm/src/wrappers.rs b/client/web/wasm/src/wrappers.rs index c8e96ce9..db11011f 100644 --- a/client/web/wasm/src/wrappers.rs +++ b/client/web/wasm/src/wrappers.rs @@ -54,6 +54,7 @@ pub fn translate_key(name: &str) -> events::Key { use events::Key as K; match name { "e" => K::KeyE, + "v" => K::KeyV, "r" => K::KeyR, "m" => K::KeyM, "x" => K::KeyX, diff --git a/core/editor/src/dispatcher/events.rs b/core/editor/src/dispatcher/events.rs index a50e6863..11faaff6 100644 --- a/core/editor/src/dispatcher/events.rs +++ b/core/editor/src/dispatcher/events.rs @@ -94,6 +94,7 @@ pub enum Key { KeyR, KeyM, KeyE, + KeyV, KeyX, Key0, Key1, diff --git a/core/editor/src/dispatcher/mod.rs b/core/editor/src/dispatcher/mod.rs index 80ed1964..9f87c498 100644 --- a/core/editor/src/dispatcher/mod.rs +++ b/core/editor/src/dispatcher/mod.rs @@ -62,6 +62,9 @@ impl Dispatcher { Key::KeyE => { editor_state.tool_state.active_tool_type = ToolType::Ellipse; } + Key::KeyV => { + editor_state.tool_state.active_tool_type = ToolType::Select; + } Key::KeyX => { editor_state.tool_state.swap_colors(); }