diff --git a/CHANGES.md b/CHANGES.md index e772f5caa..221882bee 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,22 @@ ### :heart: Community contributions by (Thank you!) + +## 1.17.2 + +### :bug: Bugs fixed +- Fix invite members button text [Taiga #4794](https://tree.taiga.io/project/penpot/issue/4794) + +## 1.17.2 + +### :bug: Bugs fixed +- Fix paste board inside itself [Taiga #4775](https://tree.taiga.io/project/penpot/issue/4775) +- Fix middle button panning can drag guides [Taiga #4266](https://tree.taiga.io/project/penpot/issue/4266) + +### :heart: Community contributions by (Thank you!) + +- To @ondrejkonec: for some code contributions on this release. + ## 1.17.1 ### :bug: Bugs fixed diff --git a/backend/src/app/rpc.clj b/backend/src/app/rpc.clj index 21ffd721d..5fe9d372e 100644 --- a/backend/src/app/rpc.clj +++ b/backend/src/app/rpc.clj @@ -7,7 +7,6 @@ (ns app.rpc (:require [app.auth.ldap :as-alias ldap] - [app.common.data :as d] [app.common.exceptions :as ex] [app.common.logging :as l] [app.common.spec :as us] diff --git a/common/src/app/common/geom/shapes/flex_layout/bounds.cljc b/common/src/app/common/geom/shapes/flex_layout/bounds.cljc index fea42fcad..9cce53ed4 100644 --- a/common/src/app/common/geom/shapes/flex_layout/bounds.cljc +++ b/common/src/app/common/geom/shapes/flex_layout/bounds.cljc @@ -68,6 +68,12 @@ (gpt/add base-p (hv 0.01)) (gpt/add base-p (vv 0.01))] + col? + (conj (gpt/add base-p (vv min-height))) + + row? + (conj (gpt/add base-p (hv min-width))) + (and col? h-start?) (conj (gpt/add base-p (hv min-width))) diff --git a/frontend/resources/styles/main/partials/modal.scss b/frontend/resources/styles/main/partials/modal.scss index 79cf01609..06c7210c3 100644 --- a/frontend/resources/styles/main/partials/modal.scss +++ b/frontend/resources/styles/main/partials/modal.scss @@ -1495,10 +1495,6 @@ display: grid; grid-template-columns: 1fr auto; gap: 8px; - .btn-large { - overflow: hidden; - text-overflow: ellipsis; - } .btn-primary { max-width: 250px; } @@ -1587,7 +1583,19 @@ } } .buttons { - margin-top: 12px; + margin: 12px 0; + button { + height: auto; + } + input { + white-space: break-spaces; + word-break: break-word; + height: fit-content; + margin: 0; + padding: 5px 10px; + min-height: 40px; + max-height: 90px; + } } } } diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index 4b2179ceb..50308b66d 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -1440,6 +1440,19 @@ (and (= 1 (count selected)) (= :frame (get-in objects [(first selected) :type]))))) +(defn same-frame-from-selected? [state frame-id] + (let [selected (wsh/lookup-selected state)] + (contains? frame-id (first selected)))) + +(defn frame-same-size? + [paste-obj frame-obj] + (and + (= (:heigth (:selrect (first (vals paste-obj)))) + (:heigth (:selrect frame-obj))) + (= (:width (:selrect (first (vals paste-obj)))) + (:width (:selrect frame-obj))))) + + (defn- paste-shape [{selected :selected paste-objects :objects ;; rename this because here comes only the clipboard shapes, @@ -1478,55 +1491,67 @@ item)) (calculate-paste-position [state mouse-pos in-viewport?] - (let [page-objects (wsh/lookup-page-objects state) - selected-objs (map #(get paste-objects %) selected) - page-selected (wsh/lookup-selected state) - wrapper (gsh/selection-rect selected-objs) - orig-pos (gpt/point (:x1 wrapper) (:y1 wrapper))] + (let [page-objects (wsh/lookup-page-objects state) + selected-objs (map #(get paste-objects %) selected) + first-selected-obj (first selected-objs) + page-selected (wsh/lookup-selected state) + wrapper (gsh/selection-rect selected-objs) + orig-pos (gpt/point (:x1 wrapper) (:y1 wrapper)) + frame-id (first page-selected) + frame-object (get page-objects frame-id) + base (cph/get-base-shape page-objects page-selected) + index (cph/get-position-on-parent page-objects (:id base))] (cond - ;; Pasting inside a frame (selected-frame? state) - (let [frame-id (first page-selected) - frame-object (get page-objects frame-id) - origin-frame-id (:frame-id (first selected-objs)) - origin-frame-object (get page-objects origin-frame-id) + (if (or (same-frame-from-selected? state (first (vals paste-objects))) + (frame-same-size? paste-objects frame-object)) + ;; Paste next to selected frame, if selected is itself or of the same size as the copied + (let [selected-frame-obj (get page-objects (first page-selected)) + parent-id (:parent-id base) + paste-x (+ (:width selected-frame-obj) (:x selected-frame-obj) 50) + paste-y (:y selected-frame-obj) + delta (gpt/subtract (gpt/point paste-x paste-y) orig-pos)] - margin-x (-> (- (:width origin-frame-object) (+ (:x wrapper) (:width wrapper))) - (min (- (:width frame-object) (:width wrapper)))) + [(:frame-id base) parent-id delta index]) - margin-y (-> (- (:height origin-frame-object) (+ (:y wrapper) (:height wrapper))) - (min (- (:height frame-object) (:height wrapper)))) + ;; Paste inside selected frame otherwise + (let [origin-frame-id (:frame-id first-selected-obj) + origin-frame-object (get page-objects origin-frame-id) + + margin-x (-> (- (:width origin-frame-object) (+ (:x wrapper) (:width wrapper))) + (min (- (:width frame-object) (:width wrapper)))) + + margin-y (-> (- (:height origin-frame-object) (+ (:y wrapper) (:height wrapper))) + (min (- (:height frame-object) (:height wrapper)))) ;; Pasted objects mustn't exceed the selected frame x limit - paste-x (if (> (+ (:width wrapper) (:x1 wrapper)) (:width frame-object)) - (+ (- (:x frame-object) (:x orig-pos)) (- (:width frame-object) (:width wrapper) margin-x)) - (:x frame-object)) + paste-x (if (> (+ (:width wrapper) (:x1 wrapper)) (:width frame-object)) + (+ (- (:x frame-object) (:x orig-pos)) (- (:width frame-object) (:width wrapper) margin-x)) + (:x frame-object)) ;; Pasted objects mustn't exceed the selected frame y limit - paste-y (if (> (+ (:height wrapper) (:y1 wrapper)) (:height frame-object)) - (+ (- (:y frame-object) (:y orig-pos)) (- (:height frame-object) (:height wrapper) margin-y)) - (:y frame-object)) + paste-y (if (> (+ (:height wrapper) (:y1 wrapper)) (:height frame-object)) + (+ (- (:y frame-object) (:y orig-pos)) (- (:height frame-object) (:height wrapper) margin-y)) + (:y frame-object)) - delta (if (= origin-frame-id uuid/zero) + delta (if (= origin-frame-id uuid/zero) ;; When the origin isn't in a frame the result is pasted in the center. - (gpt/subtract (gsh/center-shape frame-object) (gsh/center-selrect wrapper)) + (gpt/subtract (gsh/center-shape frame-object) (gsh/center-selrect wrapper)) ;; When pasting from one frame to another frame the object position must be limited to container boundaries. If the pasted object doesn't fit we try to: ;; - Align it to the limits on the x and y axis ;; - Respect the distance of the object to the right and bottom in the original frame - (gpt/point paste-x paste-y))] - [frame-id frame-id delta]) - + (gpt/point paste-x paste-y))] + [frame-id frame-id delta])) + (empty? page-selected) (let [frame-id (ctst/top-nested-frame page-objects mouse-pos) delta (gpt/subtract mouse-pos orig-pos)] [frame-id frame-id delta]) :else - (let [base (cph/get-base-shape page-objects page-selected) - index (cph/get-position-on-parent page-objects (:id base)) - frame-id (:frame-id base) + (let [frame-id (:frame-id base) parent-id (:parent-id base) delta (if in-viewport? (gpt/subtract mouse-pos orig-pos) diff --git a/frontend/src/app/main/ui/onboarding/team_choice.cljs b/frontend/src/app/main/ui/onboarding/team_choice.cljs index 36700ca72..b1a1e5342 100644 --- a/frontend/src/app/main/ui/onboarding/team_choice.cljs +++ b/frontend/src/app/main/ui/onboarding/team_choice.cljs @@ -196,9 +196,8 @@ :name name :step 2}))} (tr "labels.back")] - [:div {:title (tr "onboarding.choice.team-up.invite-members-submit")} - [:& fm/submit-button - {:label (tr "onboarding.choice.team-up.invite-members-submit")}]]] + [:& fm/submit-button + {:label (tr "onboarding.choice.team-up.invite-members-submit")}]] [:div.skip-action {:on-click on-skip} [:div.action (tr "onboarding.choice.team-up.invite-members-skip")]]]] diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/shapes/multiple.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/shapes/multiple.cljs index 3ca283c50..7245fe2ad 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/shapes/multiple.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/shapes/multiple.cljs @@ -340,8 +340,7 @@ (when-not (empty? measure-ids) [:& measures-menu {:type type :all-types all-types :ids measure-ids :values measure-values :shape shapes}]) - (when has-layout-container? - [:& layout-container-menu {:type type :ids layout-container-ids :values layout-container-values :multiple true}]) + [:& layout-container-menu {:type type :ids layout-container-ids :values layout-container-values :multiple true}] (when (or is-layout-child? has-layout-container?) [:& layout-item-menu diff --git a/frontend/src/app/main/ui/workspace/viewport/guides.cljs b/frontend/src/app/main/ui/workspace/viewport/guides.cljs index 97aa1d805..dd624febd 100644 --- a/frontend/src/app/main/ui/workspace/viewport/guides.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/guides.cljs @@ -69,10 +69,11 @@ on-pointer-down (mf/use-callback (fn [event] - (dom/capture-pointer event) - (mf/set-ref-val! dragging-ref true) - (mf/set-ref-val! start-ref (dom/get-client-position event)) - (mf/set-ref-val! start-pos-ref (get @ms/mouse-position axis)))) + (when (= 0 (.-button event)) + (dom/capture-pointer event) + (mf/set-ref-val! dragging-ref true) + (mf/set-ref-val! start-ref (dom/get-client-position event)) + (mf/set-ref-val! start-pos-ref (get @ms/mouse-position axis))))) on-pointer-up (mf/use-callback