diff --git a/CHANGES.md b/CHANGES.md index b9ecfdcc1..606650c49 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -39,7 +39,8 @@ - Add actions to go to main component context menu option [Taiga #2053](https://tree.taiga.io/project/penpot/us/2053) - Add contrast between component select color and shape select color [Taiga #2121](https://tree.taiga.io/project/penpot/issue/2121) - Add animations in interactions [Taiga #2244](https://tree.taiga.io/project/penpot/us/2244) -- Add performance improvements on .penpot file import process [Taiga 2497](https://tree.taiga.io/project/penpot/us/2497) +- Add performance improvements on .penpot file import process [Taiga #2497](https://tree.taiga.io/project/penpot/us/2497) +- On team settings set color of members count to black [Taiga #2607](https://tree.taiga.io/project/penpot/us/2607) ### :bug: Bugs fixed @@ -93,6 +94,7 @@ - Normalize zoom levels in workspace and viewer [Taiga #2631](https://tree.taiga.io/project/penpot/issue/2631) - Avoid empty names in projects, files and pages [Taiga #2594](https://tree.taiga.io/project/penpot/issue/2594) - Fix "move to" menu when duplicated team or project names [Taiga #2655](https://tree.taiga.io/project/penpot/issue/2655) +- Fix ungroup a component leaves an asterisk in layers [Taiga #2694](https://tree.taiga.io/project/penpot/issue/2694) ### :arrow_up: Deps updates diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 55901d503..f716777a1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,7 +54,7 @@ We will use the `easy fix` mark for tag for indicate issues that are easy for beginners. -## Commit Message Guidelines ## +## Commit Guidelines ## We have very precise rules over how our git commit messages can be formatted. @@ -78,7 +78,6 @@ Where type is: - :ambulance: `:ambulance:` a commit that fixes critical bug - :books: `:books:` a commit that improves or adds documentation - :construction: `:construction:`: a wip commit -- :construction_worker: `:construction_worker:` a commit with CI related stuff - :boom: `:boom:` a commit with breaking changes - :wrench: `:wrench:` a commit for config updates - :zap: `:zap:` a commit with performance improvements @@ -91,13 +90,14 @@ More info: - https://gist.github.com/parmentf/035de27d6ed1dce0b36a - https://gist.github.com/rxaviers/7360908 -The subject should be: - -- Use the imperative mood. -- Capitalize the first letter. -- Don't put a period at the end of the subject line. -- Put a blank line between the subject line and the body. +Each commit should have: +- A concise subject using imperative mood. +- The subject should have capitalized the first letter and without + period at the end. +- A blank line between the subject line and the body. +- An entry on the CHANGES.md file if applicable, referencing the + github or taiga issue/user-story using the these same rules. ## Code of conduct ## diff --git a/backend/src/app/http/errors.clj b/backend/src/app/http/errors.clj index 803c72bee..9e27ce9f1 100644 --- a/backend/src/app/http/errors.clj +++ b/backend/src/app/http/errors.clj @@ -61,8 +61,15 @@ (defmethod handle-exception :validation [err _] - (let [edata (ex-data err)] - {:status 400 :body (dissoc edata ::s/problems ::s/value)})) + (let [data (ex-data err) + explain (binding [s/*explain-out* expound/printer] + (with-out-str + (s/explain-out (update data ::s/problems #(take 10 %)))))] + {:status 400 + :body (-> data + (dissoc ::s/problems) + (dissoc ::s/value) + (assoc :explain explain))})) (defmethod handle-exception :assertion [error request] diff --git a/common/src/app/common/pages/changes_builder.cljc b/common/src/app/common/pages/changes_builder.cljc index 81e913975..b808cbf61 100644 --- a/common/src/app/common/pages/changes_builder.cljc +++ b/common/src/app/common/pages/changes_builder.cljc @@ -56,29 +56,33 @@ (update :undo-changes d/preconj del-change))))) (defn change-parent - [changes parent-id shapes] - (assert (contains? (meta changes) ::objects) "Call (with-objects) first to use this function") + ([changes parent-id shapes] (change-parent changes parent-id shapes nil)) + ([changes parent-id shapes index] + (assert (contains? (meta changes) ::objects) "Call (with-objects) first to use this function") - (let [objects (::objects (meta changes)) - set-parent-change - {:type :mov-objects - :parent-id parent-id - :page-id (::page-id (meta changes)) - :shapes (->> shapes (mapv :id))} + (let [objects (::objects (meta changes)) + set-parent-change + (cond-> {:type :mov-objects + :parent-id parent-id + :page-id (::page-id (meta changes)) + :shapes (->> shapes (mapv :id))} - mk-undo-change - (fn [change-set shape] - (d/preconj - change-set - {:type :mov-objects - :page-id (::page-id (meta changes)) - :parent-id (:parent-id shape) - :shapes [(:id shape)] - :index (cp/position-on-parent (:id shape) objects)}))] + (some? index) + (assoc :index index)) - (-> changes - (update :redo-changes conj set-parent-change) - (update :undo-changes #(reduce mk-undo-change % shapes))))) + mk-undo-change + (fn [change-set shape] + (d/preconj + change-set + {:type :mov-objects + :page-id (::page-id (meta changes)) + :parent-id (:parent-id shape) + :shapes [(:id shape)] + :index (cp/position-on-parent (:id shape) objects)}))] + + (-> changes + (update :redo-changes conj set-parent-change) + (update :undo-changes #(reduce mk-undo-change % shapes)))))) (defn- generate-operation "Given an object old and new versions and an attribute will append into changes diff --git a/common/src/app/common/spec.cljc b/common/src/app/common/spec.cljc index 2e77b98e9..bf739c960 100644 --- a/common/src/app/common/spec.cljc +++ b/common/src/app/common/spec.cljc @@ -255,7 +255,7 @@ (let [data (s/explain-data spec data)] (throw (ex/error :type :validation :code :spec-validation - ::s/problems (::s/problems data))))) + ::ex/data data)))) result)) (defmacro instrument! diff --git a/frontend/resources/images/features/1.11-animations.gif b/frontend/resources/images/features/1.11-animations.gif new file mode 100644 index 000000000..3b56b1bf2 Binary files /dev/null and b/frontend/resources/images/features/1.11-animations.gif differ diff --git a/frontend/resources/images/features/1.11-bg-export.gif b/frontend/resources/images/features/1.11-bg-export.gif new file mode 100644 index 000000000..72c1cbbbe Binary files /dev/null and b/frontend/resources/images/features/1.11-bg-export.gif differ diff --git a/frontend/resources/images/features/1.11-zoom-widget.gif b/frontend/resources/images/features/1.11-zoom-widget.gif new file mode 100644 index 000000000..dd96e2d94 Binary files /dev/null and b/frontend/resources/images/features/1.11-zoom-widget.gif differ diff --git a/frontend/resources/styles/main/partials/dashboard-team.scss b/frontend/resources/styles/main/partials/dashboard-team.scss index 19c163cdf..94684950d 100644 --- a/frontend/resources/styles/main/partials/dashboard-team.scss +++ b/frontend/resources/styles/main/partials/dashboard-team.scss @@ -193,7 +193,7 @@ svg { width: 12px; height: 12px; - fill: $color-primary-dark; + fill: $color-black; } .owner { @@ -208,7 +208,7 @@ .summary { margin-top: 5px; - color: $color-primary-dark; + color: $color-black; .icon { padding: 0px 10px; margin-right: 12px; diff --git a/frontend/src/app/main/data/workspace/groups.cljs b/frontend/src/app/main/data/workspace/groups.cljs index a6e48c9b2..bf452c58f 100644 --- a/frontend/src/app/main/data/workspace/groups.cljs +++ b/frontend/src/app/main/data/workspace/groups.cljs @@ -9,6 +9,7 @@ [app.common.data :as d] [app.common.geom.shapes :as gsh] [app.common.pages :as cp] + [app.common.pages.changes-builder :as cb] [app.common.spec :as us] [app.main.data.workspace.changes :as dch] [app.main.data.workspace.common :as dwc] @@ -136,8 +137,8 @@ [group rchanges uchanges])) (defn prepare-remove-group - [page-id group objects] - (let [shapes (into [] (:shapes group)) ; ensure we always have vector + [it page-id group objects] + (let [children (mapv #(get objects %) (:shapes group)) parent-id (cp/get-parent (:id group) objects) parent (get objects parent-id) @@ -147,29 +148,25 @@ (filter #(#{(:id group)} (second %))) (ffirst)) - rchanges [{:type :mov-objects - :page-id page-id - :parent-id parent-id - :shapes shapes - :index index-in-parent} - {:type :del-obj - :page-id page-id - :id (:id group)}] - uchanges [{:type :add-obj - :page-id page-id - :id (:id group) - :frame-id (:frame-id group) - :obj (assoc group :shapes [])} - {:type :mov-objects - :page-id page-id - :parent-id (:id group) - :shapes shapes} - {:type :mov-objects - :page-id page-id - :parent-id parent-id - :shapes [(:id group)] - :index index-in-parent}]] - [rchanges uchanges])) + ids-to-detach (when (:component-id group) + (cp/get-children (:id group) objects)) + + detach-fn (fn [attrs] + (dissoc attrs + :component-id + :component-file + :component-root? + :remote-synced? + :shape-ref + :touched))] + + (cond-> (-> (cb/empty-changes it page-id) + (cb/with-objects objects) + (cb/change-parent parent-id children index-in-parent) + (cb/remove-objects [(:id group)])) + + (some? ids-to-detach) + (cb/update-shapes ids-to-detach detach-fn)))) (defn prepare-remove-mask [page-id mask] @@ -223,20 +220,20 @@ objects (wsh/lookup-page-objects state page-id) is-group? #(or (= :bool (:type %)) (= :group (:type %))) lookup #(get objects %) - prepare #(prepare-remove-group page-id % objects) + prepare #(prepare-remove-group it page-id % objects) - changes (sequence - (comp (map lookup) - (filter is-group?) - (map prepare)) - (wsh/lookup-selected state)) + changes-list (sequence + (comp (map lookup) + (filter is-group?) + (map prepare)) + (wsh/lookup-selected state)) - rchanges (into [] (mapcat first) changes) - uchanges (into [] (mapcat second) changes)] + changes {:redo-changes (vec (mapcat :redo-changes changes-list)) + :undo-changes (vec (mapcat :undo-changes changes-list)) + :origin it}] + + (rx/of (dch/commit-changes changes)))))) - (rx/of (dch/commit-changes {:redo-changes rchanges - :undo-changes uchanges - :origin it})))))) (def mask-group (ptk/reify ::mask-group ptk/WatchEvent diff --git a/frontend/src/app/main/errors.cljs b/frontend/src/app/main/errors.cljs index 194ff90c1..ce0a0eb5e 100644 --- a/frontend/src/app/main/errors.cljs +++ b/frontend/src/app/main/errors.cljs @@ -81,7 +81,13 @@ (js/console.group "Validation Error:") (ex/ignoring (js/console.info - (with-out-str (pprint error)))) + (with-out-str (pprint (dissoc error :explain))))) + + (when-let [explain (:explain error)] + (js/console.group "Spec explain:") + (js/console.log explain) + (js/console.groupEnd "Spec explain:")) + (js/console.groupEnd "Validation Error:")) diff --git a/frontend/src/app/main/ui/releases.cljs b/frontend/src/app/main/ui/releases.cljs index 1fee4c1d2..85b6b499b 100644 --- a/frontend/src/app/main/ui/releases.cljs +++ b/frontend/src/app/main/ui/releases.cljs @@ -11,6 +11,7 @@ [app.main.store :as st] [app.main.ui.releases.common :as rc] [app.main.ui.releases.v1-10] + [app.main.ui.releases.v1-11] [app.main.ui.releases.v1-4] [app.main.ui.releases.v1-5] [app.main.ui.releases.v1-6] @@ -81,4 +82,4 @@ (defmethod rc/render-release-notes "0.0" [params] - (rc/render-release-notes (assoc params :version "1.10"))) + (rc/render-release-notes (assoc params :version "1.11"))) diff --git a/frontend/src/app/main/ui/releases/v1_11.cljs b/frontend/src/app/main/ui/releases/v1_11.cljs new file mode 100644 index 000000000..56e8dacef --- /dev/null +++ b/frontend/src/app/main/ui/releases/v1_11.cljs @@ -0,0 +1,89 @@ +;; 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) UXBOX Labs SL + +(ns app.main.ui.releases.v1-11 + (:require + [app.main.ui.releases.common :as c] + [rumext.alpha :as mf])) + +(defmethod c/render-release-notes "1.11" + [{:keys [slide klass next finish navigate version]}] + (mf/html + (case @slide + :start + [:div.modal-overlay + [:div.animated {:class @klass} + [:div.modal-container.onboarding.feature + [:div.modal-left + [:img {:src "images/login-on.jpg" :border "0" :alt "What's new Beta release 1.11"}]] + [:div.modal-right + [:div.modal-title + [:h2 "What's new?"]] + [:span.release "Beta version " version] + [:div.modal-content + [:p "Penpot continues growing with new features that improve performance, user experience and visual design."] + [:p "We are happy to show you a sneak peak of the most important stuff that the Beta 1.11 version brings."]] + [:div.modal-navigation + [:button.btn-secondary {:on-click next} "Continue"]]] + [:img.deco {:src "images/deco-left.png" :border "0"}] + [:img.deco.right {:src "images/deco-right.png" :border "0"}]]]] + + 0 + [:div.modal-overlay + [:div.animated {:class @klass} + [:div.modal-container.onboarding.feature + [:div.modal-left + [:img {:src "images/features/1.11-animations.gif" :border "0" :alt "Animations"}]] + [:div.modal-right + [:div.modal-title + [:h2 "Prototype animations"]] + [:div.modal-content + [:p "Bring your prototypes to life with animations! With animations now you can define the transition between artboards when an interaction is triggered."] + [:p "Use dissolve, slide and push animations to fade screens and imitate gestures like swipe."]] + [:div.modal-navigation + [:button.btn-secondary {:on-click next} "Continue"] + [:& c/navigation-bullets + {:slide @slide + :navigate navigate + :total 3}]]]]]] + + 1 + [:div.modal-overlay + [:div.animated {:class @klass} + [:div.modal-container.onboarding.feature + [:div.modal-left + [:img {:src "images/features/1.11-bg-export.gif" :border "0" :alt "Ignore background on export"}]] + [:div.modal-right + [:div.modal-title + [:h2 "Ignore artboard background on export"]] + [:div.modal-content + [:p "Sometimes you don’t need the artboards to be part of your designs, but only their support to work on them."] + [:p "Now you can decide to include their backgrounds on your exports or leave them out."]] + [:div.modal-navigation + [:button.btn-secondary {:on-click next} "Continue"] + [:& c/navigation-bullets + {:slide @slide + :navigate navigate + :total 3}]]]]]] + + 2 + [:div.modal-overlay + [:div.animated {:class @klass} + [:div.modal-container.onboarding.feature + [:div.modal-left + [:img {:src "images/features/1.11-zoom-widget.gif" :border "0" :alt "New zoom widget"}]] + [:div.modal-right + [:div.modal-title + [:h2 "New zoom widget"]] + [:div.modal-content + [:p "We’ve redesigned zooming menus to improve their usability and the consistency between zooming in the design workspace and in the view mode."] + [:p "We’ve also added two new options to scale your designs at the view mode that might help you to make your presentations look better."]] + [:div.modal-navigation + [:button.btn-secondary {:on-click finish} "Start!"] + [:& c/navigation-bullets + {:slide @slide + :navigate navigate + :total 3}]]]]]])))