diff --git a/common/src/app/common/geom/shapes/bool.cljc b/common/src/app/common/geom/shapes/bool.cljc index a1eeb1581c..48116a88db 100644 --- a/common/src/app/common/geom/shapes/bool.cljc +++ b/common/src/app/common/geom/shapes/bool.cljc @@ -7,6 +7,7 @@ (ns app.common.geom.shapes.bool (:require [app.common.data :as d] + [app.common.files.helpers :as cpf] [app.common.svg.path.bool :as pb] [app.common.svg.path.shapes-to-path :as stp])) @@ -16,6 +17,7 @@ (let [extract-content-xf (comp (map (d/getf objects)) (filter (comp not :hidden)) + (remove cpf/svg-raw-shape?) (map #(stp/convert-to-path % objects)) (map :content)) diff --git a/frontend/src/app/main/data/workspace/libraries.cljs b/frontend/src/app/main/data/workspace/libraries.cljs index 292265dd95..0548f137f2 100644 --- a/frontend/src/app/main/data/workspace/libraries.cljs +++ b/frontend/src/app/main/data/workspace/libraries.cljs @@ -827,7 +827,7 @@ 0))))) (defn- add-component-for-swap - [shape file-id id-new-component target-cell] + [shape file-id id-new-component index target-cell] (dm/assert! (uuid? id-new-component)) (dm/assert! (uuid? file-id)) (ptk/reify ::add-component-for-swap @@ -837,7 +837,6 @@ libraries (wsh/get-libraries state) objects (:objects page) - index (find-shape-index objects (:parent-id shape) (:id shape)) position (gpt/point (:x shape) (:y shape)) changes (-> (pcb/empty-changes it (:id page)) (pcb/with-objects objects)) @@ -877,9 +876,11 @@ ;; If the target parent is a grid layout we need to pass the target cell target-cell (when (ctl/grid-layout? parent) - (ctl/get-cell-by-shape-id parent (:id shape)))] + (ctl/get-cell-by-shape-id parent (:id shape))) + + index (find-shape-index objects (:parent-id shape) (:id shape))] (rx/of (dwsh/delete-shapes nil (d/ordered-set (:id shape)) {:component-swap true}) - (add-component-for-swap shape file-id id-new-component target-cell) + (add-component-for-swap shape file-id id-new-component index target-cell) (ptk/data-event :layout/update [(:parent-id shape)])))))) (defn component-multi-swap diff --git a/frontend/src/app/main/snap.cljs b/frontend/src/app/main/snap.cljs index 3cd6b7dc6c..5b164429db 100644 --- a/frontend/src/app/main/snap.cljs +++ b/frontend/src/app/main/snap.cljs @@ -210,8 +210,9 @@ (defn search-snap-distance [selrect coord shapes-lt shapes-gt zoom] (->> (rx/combine-latest shapes-lt shapes-gt) - (rx/map (fn [[shapes-lt shapes-gt]] - (calculate-snap coord selrect shapes-lt shapes-gt zoom))))) + (rx/map + (fn [[shapes-lt shapes-gt]] + (calculate-snap coord selrect shapes-lt shapes-gt zoom))))) (defn select-shapes-area [page-id frame-id selected objects area] @@ -233,12 +234,12 @@ (rx/merge-map (fn [[frame selrect]] (let [vbox (deref refs/vbox) + frame-id (->> shapes first :frame-id) + frame-sr (when-not (cfh/root? frame) (dm/get-prop frame :selrect)) + bounds (d/nilv (grc/clip-rect frame-sr vbox) vbox) selected (into #{} (map :id shapes)) - areas (->> (gsh/get-areas - (or (grc/clip-rect (dm/get-prop frame :selrect) vbox) - vbox) - selrect) + areas (->> (gsh/get-areas bounds selrect) (d/mapm #(select-shapes-area page-id frame-id selected objects %2))) snap-x (search-snap-distance selrect :x (:left areas) (:right areas) zoom) snap-y (search-snap-distance selrect :y (:top areas) (:bottom areas) zoom)] diff --git a/frontend/src/app/main/ui/components/forms.cljs b/frontend/src/app/main/ui/components/forms.cljs index 267cf66be0..c37ca4b52c 100644 --- a/frontend/src/app/main/ui/components/forms.cljs +++ b/frontend/src/app/main/ui/components/forms.cljs @@ -87,7 +87,7 @@ (swap! form assoc-in [:touched input-name] true))) props (-> props - (dissoc :help-icon :form :trim :children :show-success?) + (dissoc :help-icon :form :trim :children :show-success? :auto-focus?) (assoc :id (name input-name) :value value :auto-focus auto-focus? diff --git a/frontend/src/app/main/ui/dashboard/team_form.cljs b/frontend/src/app/main/ui/dashboard/team_form.cljs index 258459beea..81db878651 100644 --- a/frontend/src/app/main/ui/dashboard/team_form.cljs +++ b/frontend/src/app/main/ui/dashboard/team_form.cljs @@ -14,7 +14,9 @@ [app.main.store :as st] [app.main.ui.components.forms :as fm] [app.main.ui.icons :as i] + [app.util.dom :as dom] [app.util.i18n :as i18n :refer [tr]] + [app.util.keyboard :as kbd] [app.util.router :as rt] [beicon.v2.core :as rx] [cljs.spec.alpha :as s] @@ -74,6 +76,15 @@ :validators [(fm/validate-not-empty :name (tr "auth.name.not-all-space")) (fm/validate-length :name fm/max-length-allowed (tr "auth.name.too-long"))] :initial initial) + handle-keydown + (mf/use-callback + (mf/deps) + (fn [e] + (when (kbd/enter? e) + (dom/prevent-default e) + (dom/stop-propagation e) + (on-submit form e)))) + on-close #(st/emit! (modal/hide))] [:div {:class (stl/css :modal-overlay)} @@ -97,7 +108,8 @@ :form form :name :name :placeholder "E.g. Design" - :label (tr "labels.create-team.placeholder")}]] + :label (tr "labels.create-team.placeholder") + :on-key-down handle-keydown}]] [:div {:class (stl/css :modal-footer)} [:div {:class (stl/css :action-buttons)} diff --git a/frontend/src/app/main/ui/onboarding/questions.cljs b/frontend/src/app/main/ui/onboarding/questions.cljs index fd3fcca94c..d324b16992 100644 --- a/frontend/src/app/main/ui/onboarding/questions.cljs +++ b/frontend/src/app/main/ui/onboarding/questions.cljs @@ -114,6 +114,13 @@ (s/keys :req-un [::experience-design-tool] :opt-un [::experience-design-tool-other])) +(defn- step-1-form-validator + [errors data] + (let [planning (-> (:planning data) (str/trim))] + (cond-> errors + (= planning "") + (assoc :planning {:code "missing"})))) + (defn- step-3-form-validator [errors data] (let [experience-design-tool (:experience-design-tool data) @@ -209,6 +216,7 @@ ;; and we want to keep the filled info step-1-form (fm/use-form :initial {} + :validators [step-1-form-validator] :spec ::questions-form-step-1) step-2-form (fm/use-form :initial {} diff --git a/frontend/src/app/main/ui/viewer.scss b/frontend/src/app/main/ui/viewer.scss index 351d4414de..94f54ae5f6 100644 --- a/frontend/src/app/main/ui/viewer.scss +++ b/frontend/src/app/main/ui/viewer.scss @@ -15,6 +15,7 @@ } .viewer-content { + overflow: hidden; grid-row: 2 / span 1; display: grid; grid-template-rows: $s-252 auto; diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs index d6332d87ca..dff6d0888e 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_container.cljs @@ -913,9 +913,10 @@ [:button {:class (stl/css :layout-option) :on-click set-flex} "Flex layout"] [:button {:class (stl/css :layout-option) :on-click set-grid} "Grid layout"]]]]) - [:button {:class (stl/css :remove-layout) - :on-click on-remove-layout} - i/remove-refactor]] + (when has-layout? + [:button {:class (stl/css :remove-layout) + :on-click on-remove-layout} + i/remove-refactor])] [:div {:class (stl/css :title-actions)} (if ^boolean grid-enabled? @@ -933,9 +934,10 @@ :data-value "flex" :on-click on-set-layout} i/add-refactor]) - [:button {:class (stl/css :remove-layout) - :on-click on-remove-layout} - i/remove-refactor]])]] + (when has-layout? + [:button {:class (stl/css :remove-layout) + :on-click on-remove-layout} + i/remove-refactor])])]] (when (and open? has-layout?) (when (not= :multiple layout-type) diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs index 6edb371760..48ca30a7c6 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/layout_item.cljs @@ -407,7 +407,7 @@ [:div {:class (stl/css :row)} [:& align-self-row {:is-col? is-col? :align-self align-self - :on-changer set-align-self}]]) + :on-change set-align-self}]]) (when is-layout-child? [:div {:class (stl/css :row)} diff --git a/frontend/src/app/main/ui/workspace/viewport/gradients.cljs b/frontend/src/app/main/ui/workspace/viewport/gradients.cljs index ae1dee6537..3e076fbb8f 100644 --- a/frontend/src/app/main/ui/workspace/viewport/gradients.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/gradients.cljs @@ -118,7 +118,7 @@ :on-pointer-up on-pointer-up}]]) (mf/defc gradient-handler-transformed - [{:keys [from-p to-p width-p from-color to-color zoom editing + [{:keys [from-p to-p width-p from-color to-color zoom editing transform on-change-start on-change-finish on-change-width]}] (let [moving-point (mf/use-var nil) angle (+ 90 (gpt/angle from-p to-p)) @@ -151,7 +151,7 @@ (reset! moving-point nil))] (mf/use-effect - (mf/deps @moving-point from-p to-p width-p) + (mf/deps @moving-point from-p to-p width-p transform) (fn [] (let [subs (->> st/stream (rx/filter mse/pointer-event?) @@ -159,17 +159,18 @@ (rx/map mse/get-pointer-position) (rx/subs! (fn [pt] - (case @moving-point - :from-p (when on-change-start (on-change-start pt)) - :to-p (when on-change-finish (on-change-finish pt)) - :width-p (when on-change-width - (let [width-v (gpt/unit (gpt/to-vec from-p width-p)) - distance (gpt/point-line-distance pt from-p to-p) - new-width-p (gpt/add - from-p - (gpt/multiply width-v (gpt/point distance)))] - (on-change-width new-width-p))) - nil))))] + (let [pt (gpt/transform pt transform)] + (case @moving-point + :from-p (when on-change-start (on-change-start pt)) + :to-p (when on-change-finish (on-change-finish pt)) + :width-p (when on-change-width + (let [width-v (gpt/unit (gpt/to-vec from-p width-p)) + distance (gpt/point-line-distance pt from-p to-p) + new-width-p (gpt/add + from-p + (gpt/multiply width-v (gpt/point distance)))] + (on-change-width new-width-p))) + nil)))))] (fn [] (rx/dispose! subs))))) [:g.gradient-handlers [:defs @@ -295,6 +296,7 @@ :width-p (when (= :radial (:type gradient)) width-p) :from-color {:value start-color :opacity start-opacity} :to-color {:value end-color :opacity end-opacity} + :transform transform :zoom zoom :on-change-start on-change-start :on-change-finish on-change-finish diff --git a/frontend/src/app/main/ui/workspace/viewport/snap_distances.cljs b/frontend/src/app/main/ui/workspace/viewport/snap_distances.cljs index 8b0b477cf9..4d8941fc66 100644 --- a/frontend/src/app/main/ui/workspace/viewport/snap_distances.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/snap_distances.cljs @@ -8,6 +8,7 @@ (:require [app.common.data :as d] [app.common.data.macros :as dm] + [app.common.files.helpers :as cph] [app.common.geom.rect :as grc] [app.common.geom.shapes :as gsh] [app.common.math :as mth] @@ -212,9 +213,9 @@ gt-side (if (= coord :x) :right :bottom) vbox (deref refs/vbox) - areas (gsh/get-areas - (or (grc/clip-rect (dm/get-prop frame :selrect) vbox) vbox) - selrect) + frame-sr (when-not (cph/root? frame) (dm/get-prop frame :selrect)) + bounds (d/nilv (grc/clip-rect frame-sr vbox) vbox) + areas (gsh/get-areas bounds selrect) query-side (fn [side]