mirror of
https://github.com/penpot/penpot.git
synced 2025-08-01 00:48:38 +02:00
✨ Show grid layout on component thumbnails and empty grids
This commit is contained in:
parent
68c85c8fa5
commit
a70d909a25
5 changed files with 135 additions and 10 deletions
|
@ -89,11 +89,16 @@
|
||||||
:layout-gap :layout-container
|
:layout-gap :layout-container
|
||||||
:layout-gap-type :layout-container
|
:layout-gap-type :layout-container
|
||||||
:layout-justify-content :layout-container
|
:layout-justify-content :layout-container
|
||||||
|
:layout-justify-items :layout-container
|
||||||
:layout-wrap-type :layout-container
|
:layout-wrap-type :layout-container
|
||||||
:layout-padding-type :layout-container
|
:layout-padding-type :layout-container
|
||||||
:layout-padding :layout-container
|
:layout-padding :layout-container
|
||||||
:layout-h-orientation :layout-container
|
:layout-h-orientation :layout-container
|
||||||
:layout-v-orientation :layout-container
|
:layout-v-orientation :layout-container
|
||||||
|
:layout-grid-dir :layout-container
|
||||||
|
:layout-grid-rows :layout-container
|
||||||
|
:layout-grid-columns :layout-container
|
||||||
|
:layout-grid-cells :layout-container
|
||||||
|
|
||||||
:layout-item-margin :layout-item
|
:layout-item-margin :layout-item
|
||||||
:layout-item-margin-type :layout-item
|
:layout-item-margin-type :layout-item
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
[app.main.ui.context :as muc]
|
[app.main.ui.context :as muc]
|
||||||
[app.main.ui.shapes.attrs :as attrs]
|
[app.main.ui.shapes.attrs :as attrs]
|
||||||
[app.main.ui.shapes.custom-stroke :refer [shape-fills shape-strokes]]
|
[app.main.ui.shapes.custom-stroke :refer [shape-fills shape-strokes]]
|
||||||
|
[app.main.ui.shapes.grid-layout-viewer :refer [grid-layout-viewer]]
|
||||||
[app.util.object :as obj]
|
[app.util.object :as obj]
|
||||||
[debug :refer [debug?]]
|
[debug :refer [debug?]]
|
||||||
[rumext.v2 :as mf]))
|
[rumext.v2 :as mf]))
|
||||||
|
@ -138,9 +139,12 @@
|
||||||
childs (unchecked-get props "childs")
|
childs (unchecked-get props "childs")
|
||||||
childs (cond-> childs
|
childs (cond-> childs
|
||||||
(ctl/any-layout? shape)
|
(ctl/any-layout? shape)
|
||||||
(cph/sort-layout-children-z-index))]
|
(cph/sort-layout-children-z-index))
|
||||||
|
is-component? (mf/use-ctx muc/is-component?)]
|
||||||
[:> frame-container props
|
[:> frame-container props
|
||||||
[:g.frame-children {:opacity (:opacity shape)}
|
[:g.frame-children {:opacity (:opacity shape)}
|
||||||
(for [item childs]
|
(for [item childs]
|
||||||
[:& shape-wrapper {:key (dm/str (:id item)) :shape item}])]])))
|
[:& shape-wrapper {:key (dm/str (:id item)) :shape item}])]
|
||||||
|
(when (and is-component? (empty? childs))
|
||||||
|
[:& grid-layout-viewer {:shape shape :childs childs}])])))
|
||||||
|
|
||||||
|
|
99
frontend/src/app/main/ui/shapes/grid_layout_viewer.cljs
Normal file
99
frontend/src/app/main/ui/shapes/grid_layout_viewer.cljs
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
;;
|
||||||
|
;; Copyright (c) KALEIDOS INC
|
||||||
|
|
||||||
|
(ns app.main.ui.shapes.grid-layout-viewer
|
||||||
|
(:require
|
||||||
|
[app.common.data.macros :as dm]
|
||||||
|
[app.common.geom.matrix :as gmt]
|
||||||
|
[app.common.geom.point :as gpt]
|
||||||
|
[app.common.geom.shapes :as gsh]
|
||||||
|
[app.common.geom.shapes.grid-layout :as gsg]
|
||||||
|
[app.common.geom.shapes.points :as gpo]
|
||||||
|
[app.common.types.shape.layout :as ctl]
|
||||||
|
[rumext.v2 :as mf]))
|
||||||
|
|
||||||
|
(mf/defc grid-cell-area-label
|
||||||
|
{::mf/wrap-props false}
|
||||||
|
[props]
|
||||||
|
|
||||||
|
(let [cell-origin (unchecked-get props "origin")
|
||||||
|
cell-width (unchecked-get props "width")
|
||||||
|
text (unchecked-get props "text")
|
||||||
|
|
||||||
|
area-width (* 10 (count text))
|
||||||
|
area-height 25
|
||||||
|
area-x (- (+ (:x cell-origin) cell-width) area-width)
|
||||||
|
area-y (:y cell-origin)
|
||||||
|
|
||||||
|
area-text-x (+ area-x (/ area-width 2))
|
||||||
|
area-text-y (+ area-y (/ area-height 2))]
|
||||||
|
|
||||||
|
[:g {:pointer-events "none"}
|
||||||
|
[:rect {:x area-x
|
||||||
|
:y area-y
|
||||||
|
:width area-width
|
||||||
|
:height area-height
|
||||||
|
:style {:fill "var(--color-distance)"
|
||||||
|
:fill-opacity 0.3}}]
|
||||||
|
[:text {:x area-text-x
|
||||||
|
:y area-text-y
|
||||||
|
:style {:fill "var(--color-distance)"
|
||||||
|
:font-family "worksans"
|
||||||
|
:font-weight 600
|
||||||
|
:font-size 14
|
||||||
|
:alignment-baseline "central"
|
||||||
|
:text-anchor "middle"}}
|
||||||
|
text]]))
|
||||||
|
|
||||||
|
(mf/defc grid-cell
|
||||||
|
{::mf/wrap-props false}
|
||||||
|
[props]
|
||||||
|
(let [shape (unchecked-get props "shape")
|
||||||
|
cell (unchecked-get props "cell")
|
||||||
|
layout-data (unchecked-get props "layout-data")
|
||||||
|
|
||||||
|
cell-bounds (gsg/cell-bounds layout-data cell)
|
||||||
|
cell-origin (gpo/origin cell-bounds)
|
||||||
|
cell-width (gpo/width-points cell-bounds)
|
||||||
|
cell-height (gpo/height-points cell-bounds)
|
||||||
|
cell-center (gsh/center-points cell-bounds)
|
||||||
|
cell-origin (gpt/transform cell-origin (gmt/transform-in cell-center (:transform-inverse shape)))]
|
||||||
|
|
||||||
|
[:g.cell
|
||||||
|
[:rect
|
||||||
|
{:transform (dm/str (gmt/transform-in cell-center (:transform shape)))
|
||||||
|
:x (:x cell-origin)
|
||||||
|
:y (:y cell-origin)
|
||||||
|
:width cell-width
|
||||||
|
:height cell-height
|
||||||
|
:style {:stroke "var(--color-distance)"
|
||||||
|
:stroke-width 1.5
|
||||||
|
:fill "none"}}]
|
||||||
|
|
||||||
|
(when (:area-name cell)
|
||||||
|
[:& grid-cell-area-label {:origin cell-origin
|
||||||
|
:width cell-width
|
||||||
|
:text (:area-name cell)}])]))
|
||||||
|
|
||||||
|
(mf/defc grid-layout-viewer
|
||||||
|
{::mf/wrap-props false}
|
||||||
|
[props]
|
||||||
|
(let [shape (unchecked-get props "shape")
|
||||||
|
childs (unchecked-get props "childs")
|
||||||
|
|
||||||
|
children
|
||||||
|
(->> childs
|
||||||
|
(remove :hidden)
|
||||||
|
(map #(vector (gpo/parent-coords-bounds (:points %) (:points shape)) %)))
|
||||||
|
|
||||||
|
layout-data (gsg/calc-layout-data shape children (:points shape))]
|
||||||
|
|
||||||
|
[:g.cells
|
||||||
|
(for [cell (ctl/get-cells shape {:sort? true})]
|
||||||
|
[:& grid-cell {:key (dm/str "cell-" (:id cell))
|
||||||
|
:shape shape
|
||||||
|
:layout-data layout-data
|
||||||
|
:cell cell}])]))
|
|
@ -11,6 +11,7 @@
|
||||||
[app.common.data.macros :as dm]
|
[app.common.data.macros :as dm]
|
||||||
[app.common.geom.shapes :as gsh]
|
[app.common.geom.shapes :as gsh]
|
||||||
[app.common.pages.helpers :as cph]
|
[app.common.pages.helpers :as cph]
|
||||||
|
[app.common.types.shape-tree :as ctt]
|
||||||
[app.common.types.shape.layout :as ctl]
|
[app.common.types.shape.layout :as ctl]
|
||||||
[app.main.data.workspace.modifiers :as dwm]
|
[app.main.data.workspace.modifiers :as dwm]
|
||||||
[app.main.refs :as refs]
|
[app.main.refs :as refs]
|
||||||
|
@ -591,12 +592,24 @@
|
||||||
{:id (first selected)
|
{:id (first selected)
|
||||||
:zoom zoom}])
|
:zoom zoom}])
|
||||||
|
|
||||||
(when (or show-grid-editor? hover-grid?)
|
[:g.grid-layout-editor {:clipPath "url(#clip-handlers)"}
|
||||||
[:g.grid-layout-editor {:clipPath "url(#clip-handlers)"}
|
(when (or show-grid-editor? hover-grid?)
|
||||||
[:& grid-layout/editor
|
[:& grid-layout/editor
|
||||||
{:zoom zoom
|
{:zoom zoom
|
||||||
:objects base-objects
|
:objects base-objects
|
||||||
:modifiers modifiers
|
:modifiers modifiers
|
||||||
:shape (or (get base-objects edition)
|
:shape (or (get base-objects edition)
|
||||||
(get base-objects @hover-top-frame-id))
|
(get base-objects @hover-top-frame-id))
|
||||||
:view-only (not show-grid-editor?)}]])]]]))
|
:view-only (not show-grid-editor?)}])
|
||||||
|
|
||||||
|
(for [frame (ctt/get-frames objects)]
|
||||||
|
(when (and (ctl/grid-layout? frame)
|
||||||
|
(empty? (:shapes frame))
|
||||||
|
(not= edition (:id frame))
|
||||||
|
(not= @hover-top-frame-id (:id frame)))
|
||||||
|
[:& grid-layout/editor
|
||||||
|
{:zoom zoom
|
||||||
|
:objects base-objects
|
||||||
|
:modifiers modifiers
|
||||||
|
:shape frame
|
||||||
|
:view-only true}]))]]]]))
|
||||||
|
|
|
@ -684,11 +684,15 @@
|
||||||
hover-cells (:hover grid-edition)
|
hover-cells (:hover grid-edition)
|
||||||
selected-cells (:selected grid-edition)
|
selected-cells (:selected grid-edition)
|
||||||
|
|
||||||
children (->> (:shapes shape)
|
children
|
||||||
(map (d/getf objects))
|
(mf/use-memo
|
||||||
(map #(gsh/transform-shape % (dm/get-in modifiers [(:id %) :modifiers])))
|
(mf/deps shape modifiers)
|
||||||
(remove :hidden)
|
(fn []
|
||||||
(map #(vector (gpo/parent-coords-bounds (:points %) (:points shape)) %)))
|
(->> (:shapes shape)
|
||||||
|
(map (d/getf objects))
|
||||||
|
(map #(gsh/transform-shape % (dm/get-in modifiers [(:id %) :modifiers])))
|
||||||
|
(remove :hidden)
|
||||||
|
(map #(vector (gpo/parent-coords-bounds (:points %) (:points shape)) %)))))
|
||||||
|
|
||||||
children (hooks/use-equal-memo children)
|
children (hooks/use-equal-memo children)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue