mirror of
https://github.com/penpot/penpot.git
synced 2025-12-11 22:14:05 +01:00
✨ Materialize several tokens related flags (#7773)
* 📚 Add line to changelog * ♻️ Remove typography types flag * ♻️ Remove composite typography token flag * ♻️ Remove token units flag * 🎉 Activate by default two token flags * ♻️ Update inspect tab tests to navigate to the right info tab * 🐛 Fix test --------- Co-authored-by: Xavier Julian <xavier.julian@kaleidos.net>
This commit is contained in:
@@ -69,6 +69,8 @@ example. It's still usable as before, we just removed the example.
|
|||||||
- Make the file export process more reliable [Taiga #12555](https://tree.taiga.io/project/penpot/us/12555)
|
- Make the file export process more reliable [Taiga #12555](https://tree.taiga.io/project/penpot/us/12555)
|
||||||
- Add auth flow changes [Taiga #12333](https://tree.taiga.io/project/penpot/us/12333)
|
- Add auth flow changes [Taiga #12333](https://tree.taiga.io/project/penpot/us/12333)
|
||||||
- Add new shape validation mechanism for shapes [Github #7696](https://github.com/penpot/penpot/pull/7696)
|
- Add new shape validation mechanism for shapes [Github #7696](https://github.com/penpot/penpot/pull/7696)
|
||||||
|
- Apply color tokens from sidebar [Taiga #11353](https://tree.taiga.io/project/penpot/us/11353)
|
||||||
|
- Display tokens in the inspect tab [Taiga #9313](https://tree.taiga.io/project/penpot/us/9313)
|
||||||
|
|
||||||
### :bug: Bugs fixed
|
### :bug: Bugs fixed
|
||||||
|
|
||||||
|
|||||||
@@ -120,11 +120,8 @@
|
|||||||
:terms-and-privacy-checkbox
|
:terms-and-privacy-checkbox
|
||||||
;; Only for developtment.
|
;; Only for developtment.
|
||||||
:tiered-file-data-storage
|
:tiered-file-data-storage
|
||||||
:token-units
|
|
||||||
:token-base-font-size
|
:token-base-font-size
|
||||||
:token-color
|
:token-color
|
||||||
:token-typography-types
|
|
||||||
:token-typography-composite
|
|
||||||
:token-shadow
|
:token-shadow
|
||||||
:transit-readable-response
|
:transit-readable-response
|
||||||
:user-feedback
|
:user-feedback
|
||||||
@@ -171,9 +168,8 @@
|
|||||||
:enable-google-fonts-provider
|
:enable-google-fonts-provider
|
||||||
:enable-component-thumbnails
|
:enable-component-thumbnails
|
||||||
:enable-render-wasm-dpr
|
:enable-render-wasm-dpr
|
||||||
:enable-token-units
|
:enable-token-color
|
||||||
:enable-token-typography-types
|
:enable-inspect-styles
|
||||||
:enable-token-typography-composite
|
|
||||||
:enable-feature-fdata-objects-map])
|
:enable-feature-fdata-objects-map])
|
||||||
|
|
||||||
(defn parse
|
(defn parse
|
||||||
|
|||||||
@@ -266,10 +266,6 @@
|
|||||||
typography-token-keys
|
typography-token-keys
|
||||||
#{:line-height}))
|
#{:line-height}))
|
||||||
|
|
||||||
;; TODO: Created to extract the font-size feature from the typography feature flag.
|
|
||||||
;; Delete this once the typography feature flag is removed.
|
|
||||||
(def ff-typography-keys (set/difference typography-keys font-size-keys))
|
|
||||||
|
|
||||||
(def ^:private schema:number
|
(def ^:private schema:number
|
||||||
(-> (reduce mu/union [[:map [:line-height {:optional true} token-name-ref]]
|
(-> (reduce mu/union [[:map [:line-height {:optional true} token-name-ref]]
|
||||||
schema:rotation])
|
schema:rotation])
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ test("[Taiga #9116] Copy CSS background color in the selected format in the INSP
|
|||||||
});
|
});
|
||||||
await inspectButton.click();
|
await inspectButton.click();
|
||||||
|
|
||||||
|
// Open color space selector combobox and change to RGBA format
|
||||||
const colorDropdown = workspacePage.page
|
const colorDropdown = workspacePage.page
|
||||||
.getByRole("combobox")
|
.getByRole("combobox")
|
||||||
.getByText("HEX");
|
.getByText("HEX");
|
||||||
@@ -60,6 +61,17 @@ test("[Taiga #9116] Copy CSS background color in the selected format in the INSP
|
|||||||
});
|
});
|
||||||
await rgbaFormatButton.click();
|
await rgbaFormatButton.click();
|
||||||
|
|
||||||
|
// Open info tab selector and select the computed tab
|
||||||
|
const infoTabSelector = workspacePage.page
|
||||||
|
.getByRole("combobox")
|
||||||
|
.getByText("Styles");
|
||||||
|
await infoTabSelector.click();
|
||||||
|
|
||||||
|
const infoTabSelectorButton = workspacePage.page.getByRole("option", {
|
||||||
|
name: "Computed",
|
||||||
|
});
|
||||||
|
await infoTabSelectorButton.click();
|
||||||
|
|
||||||
const copyColorButton = workspacePage.page.getByRole("button", {
|
const copyColorButton = workspacePage.page.getByRole("button", {
|
||||||
name: "Copy color",
|
name: "Copy color",
|
||||||
});
|
});
|
||||||
@@ -118,6 +130,17 @@ test("[Taiga #10630] [INSPECT] Style assets not being displayed on info tab", as
|
|||||||
});
|
});
|
||||||
await inspectButton.click();
|
await inspectButton.click();
|
||||||
|
|
||||||
|
// Open info tab selector and select the computed tab
|
||||||
|
const infoTabSelector = workspacePage.page
|
||||||
|
.getByRole("combobox")
|
||||||
|
.getByText("Styles");
|
||||||
|
await infoTabSelector.click();
|
||||||
|
|
||||||
|
const infoTabSelectorButton = workspacePage.page.getByRole("option", {
|
||||||
|
name: "Computed",
|
||||||
|
});
|
||||||
|
await infoTabSelectorButton.click();
|
||||||
|
|
||||||
const colorLibraryName = workspacePage.page.getByTestId("color-library-name");
|
const colorLibraryName = workspacePage.page.getByTestId("color-library-name");
|
||||||
|
|
||||||
await expect(colorLibraryName).toHaveText("test-color-187cd5");
|
await expect(colorLibraryName).toHaveText("test-color-187cd5");
|
||||||
|
|||||||
@@ -126,6 +126,12 @@ const openInspectTab = async (workspacePage) => {
|
|||||||
await workspacePage.page.waitForTimeout(500);
|
await workspacePage.page.waitForTimeout(500);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @typedef {'hex' | 'rgba' | 'hsla'} ColorSpace
|
||||||
|
*
|
||||||
|
* @param {WorkspacePage} workspacePage - The workspace page instance
|
||||||
|
* @param {ColorSpace} colorSpace - The color space to select
|
||||||
|
*/
|
||||||
const selectColorSpace = async (workspacePage, colorSpace) => {
|
const selectColorSpace = async (workspacePage, colorSpace) => {
|
||||||
const sidebar = workspacePage.page.getByTestId("right-sidebar");
|
const sidebar = workspacePage.page.getByTestId("right-sidebar");
|
||||||
const colorSpaceSelector = sidebar.getByLabel("Select color space");
|
const colorSpaceSelector = sidebar.getByLabel("Select color space");
|
||||||
|
|||||||
@@ -94,10 +94,6 @@ const setupTypographyTokensFile = async (page, options = {}) => {
|
|||||||
return setupTokensFile(page, {
|
return setupTokensFile(page, {
|
||||||
file: "workspace/get-file-typography-tokens.json",
|
file: "workspace/get-file-typography-tokens.json",
|
||||||
fileFragment: "workspace/get-file-fragment-typography-tokens.json",
|
fileFragment: "workspace/get-file-fragment-typography-tokens.json",
|
||||||
flags: [
|
|
||||||
"enable-token-typography-types",
|
|
||||||
"enable-token-typography-composite",
|
|
||||||
],
|
|
||||||
...options,
|
...options,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -974,42 +970,9 @@ test.describe("Tokens: Themes modal", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test.describe("Tokens: Apply token", () => {
|
test.describe("Tokens: Apply token", () => {
|
||||||
// When deleting the "enable-token-color" flag, permanently remove this test.
|
|
||||||
test("User applies color token to a shape without tokens on design-tab", async ({
|
|
||||||
page,
|
|
||||||
}) => {
|
|
||||||
const { workspacePage, tokensSidebar, tokenContextMenuForToken } =
|
|
||||||
await setupTokensFile(page);
|
|
||||||
|
|
||||||
await page.getByRole("tab", { name: "Layers" }).click();
|
|
||||||
|
|
||||||
await workspacePage.layers
|
|
||||||
.getByTestId("layer-row")
|
|
||||||
.filter({ hasText: "Button" })
|
|
||||||
.click();
|
|
||||||
|
|
||||||
const tokensTabButton = page.getByRole("tab", { name: "Tokens" });
|
|
||||||
await tokensTabButton.click();
|
|
||||||
|
|
||||||
await tokensSidebar
|
|
||||||
.getByRole("button")
|
|
||||||
.filter({ hasText: "Color" })
|
|
||||||
.click();
|
|
||||||
|
|
||||||
await tokensSidebar
|
|
||||||
.getByRole("button", { name: "colors.black" })
|
|
||||||
.click({ button: "right" });
|
|
||||||
await tokenContextMenuForToken.getByText("Fill").click();
|
|
||||||
|
|
||||||
const inputColor = workspacePage.page.getByRole("textbox", {
|
|
||||||
name: "Color",
|
|
||||||
});
|
|
||||||
await expect(inputColor).toHaveValue("000000");
|
|
||||||
});
|
|
||||||
|
|
||||||
test("User applies color token to a shape", async ({ page }) => {
|
test("User applies color token to a shape", async ({ page }) => {
|
||||||
const { workspacePage, tokensSidebar, tokenContextMenuForToken } =
|
const { workspacePage, tokensSidebar, tokenContextMenuForToken } =
|
||||||
await setupTokensFile(page, { flags: ["enable-token-color"] });
|
await setupTokensFile(page);
|
||||||
|
|
||||||
await page.getByRole("tab", { name: "Layers" }).click();
|
await page.getByRole("tab", { name: "Layers" }).click();
|
||||||
|
|
||||||
|
|||||||
@@ -8,9 +8,8 @@
|
|||||||
(:require
|
(:require
|
||||||
[app.common.json :as json]
|
[app.common.json :as json]
|
||||||
[app.common.path-names :as cpn]
|
[app.common.path-names :as cpn]
|
||||||
[app.common.types.token :as ctt]
|
|
||||||
[app.common.types.tokens-lib :as ctob]
|
[app.common.types.tokens-lib :as ctob]
|
||||||
[app.config :as cf]
|
|
||||||
[app.main.data.notifications :as ntf]
|
[app.main.data.notifications :as ntf]
|
||||||
[app.main.data.style-dictionary :as sd]
|
[app.main.data.style-dictionary :as sd]
|
||||||
[app.main.data.workspace.tokens.errors :as wte]
|
[app.main.data.workspace.tokens.errors :as wte]
|
||||||
@@ -62,17 +61,7 @@
|
|||||||
[decoded-json file-name]
|
[decoded-json file-name]
|
||||||
(try
|
(try
|
||||||
{:tokens-lib (ctob/parse-decoded-json decoded-json file-name)
|
{:tokens-lib (ctob/parse-decoded-json decoded-json file-name)
|
||||||
:unknown-tokens (ctob/get-tokens-of-unknown-type decoded-json
|
:unknown-tokens (ctob/get-tokens-of-unknown-type decoded-json {})}
|
||||||
;; Filter out FF token-types
|
|
||||||
{:process-token-type
|
|
||||||
(fn [dtcg-token-type]
|
|
||||||
(if (or
|
|
||||||
(and (not (contains? cf/flags :token-units))
|
|
||||||
(= dtcg-token-type "number"))
|
|
||||||
(and (not (contains? cf/flags :token-typography-types))
|
|
||||||
(contains? ctt/ff-typography-keys dtcg-token-type)))
|
|
||||||
nil
|
|
||||||
dtcg-token-type))})}
|
|
||||||
(catch js/Error e
|
(catch js/Error e
|
||||||
(let [err (or (extract-name-error e)
|
(let [err (or (extract-name-error e)
|
||||||
(wte/error-ex-info :error.import/invalid-json-data decoded-json e))]
|
(wte/error-ex-info :error.import/invalid-json-data decoded-json e))]
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
(:require
|
(:require
|
||||||
[app.common.data :as d]
|
[app.common.data :as d]
|
||||||
[app.common.types.shape.layout :as ctsl]
|
[app.common.types.shape.layout :as ctsl]
|
||||||
[app.common.types.token :as ctt]
|
|
||||||
[app.common.types.tokens-lib :as ctob]
|
[app.common.types.tokens-lib :as ctob]
|
||||||
[app.config :as cf]
|
[app.config :as cf]
|
||||||
[app.main.data.style-dictionary :as sd]
|
[app.main.data.style-dictionary :as sd]
|
||||||
@@ -23,23 +22,13 @@
|
|||||||
(def ref:token-type-open-status
|
(def ref:token-type-open-status
|
||||||
(l/derived (l/key :open-status-by-type) refs/workspace-tokens))
|
(l/derived (l/key :open-status-by-type) refs/workspace-tokens))
|
||||||
|
|
||||||
(defn- remove-keys [m ks]
|
|
||||||
(d/removem (comp ks key) m))
|
|
||||||
|
|
||||||
(defn- get-sorted-token-groups
|
(defn- get-sorted-token-groups
|
||||||
"Separate token-types into groups of `empty` or `filled` depending if
|
"Separate token-types into groups of `empty` or `filled` depending if
|
||||||
tokens exist for that type. Sort each group alphabetically (by their type).
|
tokens exist for that type. Sort each group alphabetically (by their type)."
|
||||||
If `:token-units` is not in cf/flags, number tokens are excluded."
|
|
||||||
[tokens-by-type]
|
[tokens-by-type]
|
||||||
(let [token-units? (contains? cf/flags :token-units)
|
(let [token-shadow? (contains? cf/flags :token-shadow)
|
||||||
token-typography-composite-types? (contains? cf/flags :token-typography-composite)
|
|
||||||
token-typography-types? (contains? cf/flags :token-typography-types)
|
|
||||||
token-shadow? (contains? cf/flags :token-shadow)
|
|
||||||
all-types (cond-> dwta/token-properties
|
all-types (cond-> dwta/token-properties
|
||||||
(not token-shadow?) (dissoc :shadow)
|
(not token-shadow?) (dissoc :shadow))
|
||||||
(not token-units?) (dissoc :number)
|
|
||||||
(not token-typography-composite-types?) (remove-keys ctt/typography-token-keys)
|
|
||||||
(not token-typography-types?) (remove-keys ctt/ff-typography-keys))
|
|
||||||
all-types (-> all-types keys seq)]
|
all-types (-> all-types keys seq)]
|
||||||
(loop [empty #js []
|
(loop [empty #js []
|
||||||
filled #js []
|
filled #js []
|
||||||
|
|||||||
Reference in New Issue
Block a user