Date: Wed, 20 Dec 2023 12:21:07 +0100
Subject: [PATCH 04/29] SWED-2276 update alert component wherever used
---
.../__snapshots__/index.test.js.snap | 2 +-
.../components/ActionList/index.js | 2 +-
.../Charts/__snapshots__/index.test.js.snap | 22 +++++++++----------
.../components/Charts/index.js | 4 ++--
.../components/Nav/index.js | 2 +-
.../components/Select/index.js | 4 ++--
.../components/Toast/constants.js | 2 +-
src/App/Home/index.js | 4 +---
.../Patterns/components/LoginForm/index.js | 2 +-
.../Forms/__snapshots__/index.test.js.snap | 2 +-
.../__snapshots__/index.test.js.snap | 2 +-
.../DeprecatedComponentAlert/index.js | 3 ++-
.../__snapshots__/index.test.js.snap | 2 +-
.../ExperimentalComponentAlert/index.js | 3 ++-
14 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/src/App/ComponentsDocumentation/components/ActionList/__snapshots__/index.test.js.snap b/src/App/ComponentsDocumentation/components/ActionList/__snapshots__/index.test.js.snap
index 11b8ba9208..27bff24301 100644
--- a/src/App/ComponentsDocumentation/components/ActionList/__snapshots__/index.test.js.snap
+++ b/src/App/ComponentsDocumentation/components/ActionList/__snapshots__/index.test.js.snap
@@ -682,7 +682,7 @@ exports[`Components: ActionList renders 1`] = `
diff --git a/src/App/ComponentsDocumentation/components/ActionList/index.js b/src/App/ComponentsDocumentation/components/ActionList/index.js
index 78dc203c8e..8b6ea1a31d 100644
--- a/src/App/ComponentsDocumentation/components/ActionList/index.js
+++ b/src/App/ComponentsDocumentation/components/ActionList/index.js
@@ -87,7 +87,7 @@ const ActionList = () => {
Deprecated: Be aware, this component will not be maintained
diff --git a/src/App/ComponentsDocumentation/components/Charts/__snapshots__/index.test.js.snap b/src/App/ComponentsDocumentation/components/Charts/__snapshots__/index.test.js.snap
index 0bdf55fc7d..7321bddbd5 100644
--- a/src/App/ComponentsDocumentation/components/Charts/__snapshots__/index.test.js.snap
+++ b/src/App/ComponentsDocumentation/components/Charts/__snapshots__/index.test.js.snap
@@ -2507,7 +2507,7 @@ exports[`Dashboard: Charts renders 1`] = `
@@ -3316,7 +3316,7 @@ exports[`Dashboard: Charts renders 1`] = `
@@ -3640,7 +3640,7 @@ exports[`Dashboard: Charts renders 1`] = `
@@ -3868,7 +3868,7 @@ exports[`Dashboard: Charts renders 1`] = `
@@ -4167,7 +4167,7 @@ exports[`Dashboard: Charts renders 1`] = `
@@ -4494,7 +4494,7 @@ exports[`Dashboard: Charts renders 1`] = `
@@ -4847,7 +4847,7 @@ exports[`Dashboard: Charts renders 1`] = `
@@ -5086,7 +5086,7 @@ exports[`Dashboard: Charts renders 1`] = `
@@ -5313,7 +5313,7 @@ exports[`Dashboard: Charts renders 1`] = `
@@ -5636,7 +5636,7 @@ exports[`Dashboard: Charts renders 1`] = `
@@ -5893,7 +5893,7 @@ exports[`Dashboard: Charts renders 1`] = `
diff --git a/src/App/ComponentsDocumentation/components/Charts/index.js b/src/App/ComponentsDocumentation/components/Charts/index.js
index 397026f965..dc95736600 100644
--- a/src/App/ComponentsDocumentation/components/Charts/index.js
+++ b/src/App/ComponentsDocumentation/components/Charts/index.js
@@ -9,7 +9,7 @@ import Alert from "@components/Alert";
const AccessibilityAlert = () => (
@@ -838,7 +838,7 @@ const Charts = () => (
Deprecated: Be aware, this component will not be maintained
diff --git a/src/App/ComponentsDocumentation/components/Nav/index.js b/src/App/ComponentsDocumentation/components/Nav/index.js
index c035989f45..ab7a41eb3e 100644
--- a/src/App/ComponentsDocumentation/components/Nav/index.js
+++ b/src/App/ComponentsDocumentation/components/Nav/index.js
@@ -87,7 +87,7 @@ const Nav = () => {
Deprecated: Be aware, this component will not be maintained
diff --git a/src/App/ComponentsDocumentation/components/Select/index.js b/src/App/ComponentsDocumentation/components/Select/index.js
index ffff2a27b1..b01e3c69ec 100644
--- a/src/App/ComponentsDocumentation/components/Select/index.js
+++ b/src/App/ComponentsDocumentation/components/Select/index.js
@@ -38,7 +38,7 @@ const WhenToUse = () => (
{text}
- )
+ ),
)}
>
);
@@ -67,7 +67,7 @@ const Overview = () => (
Select the appropriate styling.
}
- icon="info"
+ icon="info-circle"
/>
{/*
diff --git a/src/App/ComponentsDocumentation/components/Toast/constants.js b/src/App/ComponentsDocumentation/components/Toast/constants.js
index 1a30a1a701..1362ce3bcf 100644
--- a/src/App/ComponentsDocumentation/components/Toast/constants.js
+++ b/src/App/ComponentsDocumentation/components/Toast/constants.js
@@ -81,7 +81,7 @@ const AlertBox = () => (
Static code example The code viewer shows an example on how to
diff --git a/src/App/Home/index.js b/src/App/Home/index.js
index 95737afaf1..9543a5b6cd 100644
--- a/src/App/Home/index.js
+++ b/src/App/Home/index.js
@@ -27,8 +27,6 @@ const Home = () => {
Welcome to the
{brandTitle} Design Guide
-
-
@@ -150,7 +148,7 @@ const Home = () => {
Versioning:
diff --git a/src/App/Patterns/components/LoginForm/index.js b/src/App/Patterns/components/LoginForm/index.js
index 73e93b63e5..faedeb990e 100644
--- a/src/App/Patterns/components/LoginForm/index.js
+++ b/src/App/Patterns/components/LoginForm/index.js
@@ -75,7 +75,7 @@ const LoginForm = ({
{alternativeLogins && }
{error && (
diff --git a/src/App/Patterns/content/Forms/__snapshots__/index.test.js.snap b/src/App/Patterns/content/Forms/__snapshots__/index.test.js.snap
index cfd0b1eaa4..120b97fb64 100644
--- a/src/App/Patterns/content/Forms/__snapshots__/index.test.js.snap
+++ b/src/App/Patterns/content/Forms/__snapshots__/index.test.js.snap
@@ -1543,7 +1543,7 @@ exports[`Forms: index renders 1`] = `
diff --git a/src/App/docutils/DeprecatedComponentAlert/__snapshots__/index.test.js.snap b/src/App/docutils/DeprecatedComponentAlert/__snapshots__/index.test.js.snap
index e4e3e9cd33..be292acf34 100644
--- a/src/App/docutils/DeprecatedComponentAlert/__snapshots__/index.test.js.snap
+++ b/src/App/docutils/DeprecatedComponentAlert/__snapshots__/index.test.js.snap
@@ -8,7 +8,7 @@ exports[`Utilities: DeprecatedComponentAlert renders 1`] = `
diff --git a/src/App/docutils/DeprecatedComponentAlert/index.js b/src/App/docutils/DeprecatedComponentAlert/index.js
index fb3b606ea5..11c56e8bd0 100644
--- a/src/App/docutils/DeprecatedComponentAlert/index.js
+++ b/src/App/docutils/DeprecatedComponentAlert/index.js
@@ -1,8 +1,9 @@
import React from "react";
import Alert from "@components/Alert";
+// TODO: is it actually used anywhere? else remove
const DeprecatedComponentAlert = () => (
-
+
Component deprecated!
This component has been deprecated and should not be used!
diff --git a/src/App/docutils/ExperimentalComponentAlert/__snapshots__/index.test.js.snap b/src/App/docutils/ExperimentalComponentAlert/__snapshots__/index.test.js.snap
index 013cb8383d..afcadb5829 100644
--- a/src/App/docutils/ExperimentalComponentAlert/__snapshots__/index.test.js.snap
+++ b/src/App/docutils/ExperimentalComponentAlert/__snapshots__/index.test.js.snap
@@ -8,7 +8,7 @@ exports[`Utilities: ExperimentalComponentAlert renders 1`] = `
diff --git a/src/App/docutils/ExperimentalComponentAlert/index.js b/src/App/docutils/ExperimentalComponentAlert/index.js
index 291e8d82e3..3dd09e6bb5 100644
--- a/src/App/docutils/ExperimentalComponentAlert/index.js
+++ b/src/App/docutils/ExperimentalComponentAlert/index.js
@@ -1,8 +1,9 @@
import React from "react";
import Alert from "@components/Alert";
+// TODO: is it actually used anywhere? else remove
const ExperimentalComponentAlert = () => (
-
+
Component under development!
This component is still under development and is subject to change.
From 3ce64f4f2cee9f37e67e188fc170485e48b6685a Mon Sep 17 00:00:00 2001
From: Raphael Ferrand
Date: Wed, 20 Dec 2023 12:46:34 +0100
Subject: [PATCH 05/29] SWED-2276 style alert component icons
---
src/less/components/alert.less | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/src/less/components/alert.less b/src/less/components/alert.less
index 9a7c5024ec..59691a6e74 100644
--- a/src/less/components/alert.less
+++ b/src/less/components/alert.less
@@ -9,18 +9,12 @@
margin-top: 0;
margin-bottom: 1rem;
display: flex;
- // TODO: check if gap instead or margin breaks design. For both the icon ANF the optional close button on the right side.
- // - does it display same gap?
- // - does it display a spacing when no icon and no close button?
- // IF all good then only keep gap and remove margin-right of icon & margin-left of close button
- gap: 1rem;
color: var(--black);
border-radius: 0.25rem;
background-color: var(--color-bg);
- & i {
+ & > i {
color: var(--color-icon);
- // TODO: remove if gap is enough ? but since gap different for close button then probably not
margin-right: 1rem;
}
From 6141ce6ada11e00445edc25a1c2e8c7c47d8bb73 Mon Sep 17 00:00:00 2001
From: Raphael Ferrand
Date: Fri, 22 Dec 2023 00:23:11 +0100
Subject: [PATCH 06/29] SWED-2276 add basic custom icon - update iconography
documentation
---
.../__snapshots__/index.test.js.snap | 652 +++++++++++++++++-
.../identity/Iconography/constants.js | 74 ++
.../Identity/identity/Iconography/index.js | 122 +++-
src/App/components/IconPreview/index.js | 9 +-
src/icons/shapes/check_circle_filled.svg | 4 +
src/icons/shapes/chevron_down.svg | 3 +
src/icons/shapes/close.svg | 4 +
src/icons/shapes/error_circle_filled.svg | 5 +
src/icons/shapes/error_triangle_filled.svg | 5 +
src/icons/shapes/info_circle_filled.svg | 4 +
src/icons/shapes/minus_substract.svg | 3 +
src/icons/shapes/plus_add.svg | 4 +
src/icons/shapes/warning_triangle_filled.svg | 5 +
src/less/core/iconography.less | 68 +-
14 files changed, 955 insertions(+), 7 deletions(-)
create mode 100644 src/icons/shapes/check_circle_filled.svg
create mode 100644 src/icons/shapes/chevron_down.svg
create mode 100644 src/icons/shapes/close.svg
create mode 100644 src/icons/shapes/error_circle_filled.svg
create mode 100644 src/icons/shapes/error_triangle_filled.svg
create mode 100644 src/icons/shapes/info_circle_filled.svg
create mode 100644 src/icons/shapes/minus_substract.svg
create mode 100644 src/icons/shapes/plus_add.svg
create mode 100644 src/icons/shapes/warning_triangle_filled.svg
diff --git a/src/App/Identity/identity/Iconography/__snapshots__/index.test.js.snap b/src/App/Identity/identity/Iconography/__snapshots__/index.test.js.snap
index b5eb27d490..5096acf0b9 100644
--- a/src/App/Identity/identity/Iconography/__snapshots__/index.test.js.snap
+++ b/src/App/Identity/identity/Iconography/__snapshots__/index.test.js.snap
@@ -15,11 +15,201 @@ exports[`Core: Iconography renders 1`] = `
TESTBRAND
we use Material icons from Material Design, but we also include icons for well-known payment providers, and flags for most nations in the world. All icons are integrated and are available in HTML and CSS.
+
+
+ Atlas Icons
+
+
+ For a full overview of the available icons, please, visit the https://atlasicons.vectopus.com .
+
+
+
+
+ open_in_new
+
+
+ Material Icons Overview
+
+
+
+ Example of how to implement icons
+
+
+ To use an icon, provide the following markup:
+
+
+ <i class="at-{icon_name}" aria-hidden="true"></i>
+
+
+
+
+
+
+ calendar-dots
+
+
+
+
+
+ image-gallery
+
+
+
+
+
+ home
+
+
+
+
+
+ shopping-cart
+
+
+
+
+
+ trash
+
+
+
+
+
+
+ HTML
+
+
+ content_copy
+
+
+ Copy to clipboard
+
+
+
+
+
+
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ 4
+
+
+ 5
+
+
+
+
+
+
+ <i class="at-calendar-dots" aria-hidden="true"></i>
+
+
+ <i class="at-image-gallery" aria-hidden="true"></i>
+
+
+ <i class="at-home" aria-hidden="true"></i>
+
+
+ <i class="at-shopping-cart" aria-hidden="true"></i>
+
+
+ <i class="at-trash" aria-hidden="true"></i>
+
+
+
+
+
+
+
+
+
+
- Material Outlined Icons
+ Material Outlined Icons (Deprecated)
+
+
+
+
+
+
+
+
+
+ Basic UI
+
+
+ Below is a list of basic UI custom icons.
+
+
+ Example of how to implement basic UI custom icons
+
+
+ To use an icon, provide the following markup:
+
+
+ <i class="swepay-icon-{icon-name}" aria-hidden="true" /i>
+
+
+
+
+
+
+ Icon
+
+
+ Code
+
+
+
+
+
+
+
+
+
+
+ chevron-down
+
+
+
+
+
+
+
+
+
+ chevron-up
+
+
+
+
+
+
+
+
+
+ chevron-left
+
+
+
+
+
+
+
+
+
+ chevron-right
+
+
+
+
+
+
+
+
+
+ check-circle-filled
+
+
+
+
+
+
+
+
+
+ close
+
+
+
+
+
+
+
+
+
+ error-circle-filled
+
+
+
+
+
+
+
+
+
+ error-triangle-filled
+
+
+
+
+
+
+
+
+
+ warning-triangle-filled
+
+
+
+
+
+
+
+
+
+ info-circle-filled
+
+
+
+
+
+
+
+
+
+ minus-substract
+
+
+
+
+
+
+
+
+
+ plus-add
+
+
+
+
+
+
+
+
+ HTML
+
+
+ content_copy
+
+
+ Copy to clipboard
+
+
+
+
+
+
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ 4
+
+
+ 5
+
+
+ 6
+
+
+ 7
+
+
+ 8
+
+
+ 9
+
+
+ 10
+
+
+ 11
+
+
+ 12
+
+
+
+
+
+
+ <i class="swepay-icon-chevron-down" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-chevron-up" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-chevron-left" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-chevron-right" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-check-circle-filled" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-close" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-error-circle-filled" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-error-triangle-filled" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-warning-triangle-filled" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-info-circle-filled" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-minus-substract" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-plus-add" aria-hidden="true"></i>
+
+
+
+
+
+
+
+
+
+
+ Sizes
+
+
+ Icons comes with 3 sizes. Basic is a 24px box. "small" is 18px, and "large" 32px.
+
+
+
+
+
+
+ small
+
+
+
+
+
+
+
+ "" (default)
+
+
+
+
+
+
+
+ large
+
+
+
+
+
+
+
+
+ HTML
+
+
+ content_copy
+
+
+ Copy to clipboard
+
+
+
+
+
+
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+
+
+
+
+ <i class="swepay-icon-info-circle-filled small" aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-info-circle-filled " aria-hidden="true"></i>
+
+
+ <i class="swepay-icon-info-circle-filled large" aria-hidden="true"></i>
+
+
diff --git a/src/App/Identity/identity/Iconography/constants.js b/src/App/Identity/identity/Iconography/constants.js
index 4a4866c284..63925a94d6 100644
--- a/src/App/Identity/identity/Iconography/constants.js
+++ b/src/App/Identity/identity/Iconography/constants.js
@@ -1,3 +1,11 @@
+export const atlasIcons = [
+ "calendar-dots",
+ "image-gallery",
+ "home",
+ "shopping-cart",
+ "trash",
+];
+
export const materialIcons = [
"insert_invitation",
"cake",
@@ -132,3 +140,69 @@ export const flags = [
];
export const flagSizes = ["tiny", "small", "medium", "large", "huge"];
+
+export const shapes = [
+ {
+ title: "Chevron down",
+ code: "chevron-down",
+ },
+ {
+ title: "Chevron up",
+ code: "chevron-up",
+ },
+ {
+ title: "Chevron left",
+ code: "chevron-left",
+ },
+ {
+ title: "Chevron right",
+ code: "chevron-right",
+ },
+ {
+ title: "Check circle filled",
+ code: "check-circle-filled",
+ },
+ {
+ title: "Close",
+ code: "close",
+ },
+ {
+ title: "Error circle filled",
+ code: "error-circle-filled",
+ },
+ {
+ title: "Error triangle filled",
+ code: "error-triangle-filled",
+ },
+ {
+ title: "Warning triangle filled",
+ code: "warning-triangle-filled",
+ },
+ {
+ title: "Info circle filled",
+ code: "info-circle-filled",
+ },
+ {
+ title: "Minus substract",
+ code: "minus-substract",
+ },
+ {
+ title: "Plus add",
+ code: "plus-add",
+ },
+];
+
+export const commonIconSizes = [
+ {
+ title: "small",
+ code: "small",
+ },
+ {
+ title: '"" (default)',
+ code: "",
+ },
+ {
+ title: "large",
+ code: "large",
+ },
+];
diff --git a/src/App/Identity/identity/Iconography/index.js b/src/App/Identity/identity/Iconography/index.js
index f53e88a4ed..8a61b6e975 100644
--- a/src/App/Identity/identity/Iconography/index.js
+++ b/src/App/Identity/identity/Iconography/index.js
@@ -7,9 +7,53 @@ import CodeTags from "@components/CodeTags";
const brandTitle = process.env.brandTitle;
+const AtlasIcons = () => (
+
+ Atlas Icons
+
+ For a full overview of the available icons, please, visit the
+ https://atlasicons.vectopus.com .{" "}
+
+
+
+
+ open_in_new
+
+ Material Icons Overview
+
+
+ Example of how to implement icons
+
+ To use an icon, provide the following markup:{" "}
+ '}
+ />
+
+
+ {tableData.atlasIcons.map((icon) => (
+
+ ))}
+
+
+ {tableData.atlasIcons.map((icon) => (
+
+
+ {"\n"}
+
+ ))}
+
+
+);
+
const MaterialIcons = () => (
- Material Outlined Icons
+ Material Outlined Icons (Deprecated)
We primarily use the version called Outlined in the Material icons to
avoid a to heavy look. For a full overview of the available icons, please,
@@ -170,6 +214,80 @@ const PaymentIcons = () => (
);
+const BasicUI = () => (
+
+ Basic UI
+ Below is a list of basic UI custom icons.
+
+ Example of how to implement basic UI custom icons
+
+ To use an icon, provide the following markup:{" "}
+ '}
+ />
+
+
+
+
+
+ Icon
+ Code
+
+
+
+ {tableData.shapes.map((icon) => (
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+ {tableData.shapes.map((icon) => (
+
+
+ {"\n"}
+
+ ))}
+
+ Sizes
+
+ Icons comes with 3 sizes. Basic is a 24px box. "small" is 18px, and
+ "large" 32px.{" "}
+
+
+ {tableData.commonIconSizes.map((size, i) => (
+
+
+ {"\n"}
+
+ ))}
+
+
+ {tableData.commonIconSizes.map((size, i) => (
+
+
+ {"\n"}
+
+ ))}
+
+
+);
+
const Flags = () => (
Flags
@@ -284,9 +402,11 @@ const Iconography = () => (
include icons for well-known payment providers, and flags for most nations
in the world. All icons are integrated and are available in HTML and CSS.
+
+
);
diff --git a/src/App/components/IconPreview/index.js b/src/App/components/IconPreview/index.js
index 3fe90e9430..3e42e31a49 100644
--- a/src/App/components/IconPreview/index.js
+++ b/src/App/components/IconPreview/index.js
@@ -13,11 +13,12 @@ const IconPreview = ({
}) => {
const classNames = className ? className.split(" ") : [];
const iconClasses = classnames(
- type,
- size ? `${type}-${size}` : "",
+ type !== "swepay-icon" ? type : "",
+ size && type !== "swepay-icon" ? `${type}-${size}` : "",
+ size && type === "swepay-icon" ? size?.code : "",
type === "material-icons" ? "" : `${type}-${name}`,
squaredFlag ? "flag-icon-squared" : "",
- ...classNames
+ ...classNames,
);
return preview || previewSize ? (
@@ -26,7 +27,7 @@ const IconPreview = ({
{iconClasses.includes("material-icons") ? name : null}
- {previewSize ? size : name}
+ {previewSize ? size?.title ?? size : name}
) : (
diff --git a/src/icons/shapes/check_circle_filled.svg b/src/icons/shapes/check_circle_filled.svg
new file mode 100644
index 0000000000..6e540be212
--- /dev/null
+++ b/src/icons/shapes/check_circle_filled.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/icons/shapes/chevron_down.svg b/src/icons/shapes/chevron_down.svg
new file mode 100644
index 0000000000..cd85179b86
--- /dev/null
+++ b/src/icons/shapes/chevron_down.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/icons/shapes/close.svg b/src/icons/shapes/close.svg
new file mode 100644
index 0000000000..d50f17a70f
--- /dev/null
+++ b/src/icons/shapes/close.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/icons/shapes/error_circle_filled.svg b/src/icons/shapes/error_circle_filled.svg
new file mode 100644
index 0000000000..cd1e337059
--- /dev/null
+++ b/src/icons/shapes/error_circle_filled.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/icons/shapes/error_triangle_filled.svg b/src/icons/shapes/error_triangle_filled.svg
new file mode 100644
index 0000000000..5d05895864
--- /dev/null
+++ b/src/icons/shapes/error_triangle_filled.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/icons/shapes/info_circle_filled.svg b/src/icons/shapes/info_circle_filled.svg
new file mode 100644
index 0000000000..3298b72950
--- /dev/null
+++ b/src/icons/shapes/info_circle_filled.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/icons/shapes/minus_substract.svg b/src/icons/shapes/minus_substract.svg
new file mode 100644
index 0000000000..e66de22098
--- /dev/null
+++ b/src/icons/shapes/minus_substract.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/icons/shapes/plus_add.svg b/src/icons/shapes/plus_add.svg
new file mode 100644
index 0000000000..c755149931
--- /dev/null
+++ b/src/icons/shapes/plus_add.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/src/icons/shapes/warning_triangle_filled.svg b/src/icons/shapes/warning_triangle_filled.svg
new file mode 100644
index 0000000000..55d670aac1
--- /dev/null
+++ b/src/icons/shapes/warning_triangle_filled.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/src/less/core/iconography.less b/src/less/core/iconography.less
index a1a5c0768c..b4bcf26a21 100644
--- a/src/less/core/iconography.less
+++ b/src/less/core/iconography.less
@@ -56,7 +56,7 @@ i {
font-feature-settings: "liga";
}
-// custom icons start
+// custom payment icons start
i.payment-icon {
height: 2rem;
@@ -601,3 +601,69 @@ each(@flag-list, .(@country-code) {
});
// flag icons sizing end
+
+// shape (basic UI) custom icons start
+i[class^="swepay-icon-"],
+i[class*=" swepay-icon-"] {
+ display: inline-block;
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center;
+ height: var(--icon-size, 24px);
+ width: var(--icon-size, 24px);
+ stroke: currentColor;
+ fill: currentColor;
+
+ &.swepay-icon-chevron-down {
+ background-image: url("../../icons/shapes/chevron_down.svg");
+ }
+
+ &.swepay-icon-chevron-up {
+ background-image: url("../../icons/shapes/chevron_down.svg");
+ transform: rotate(180deg);
+ }
+
+ &.swepay-icon-chevron-left {
+ background-image: url("../../icons/shapes/chevron_down.svg");
+ transform: rotate(270deg);
+ }
+
+ &.swepay-icon-chevron-right {
+ background-image: url("../../icons/shapes/chevron_down.svg");
+ transform: rotate(90deg);
+ }
+
+ &.swepay-icon-check-circle-filled {
+ background-image: url("../../icons/shapes/check_circle_filled.svg");
+ }
+
+ &.swepay-icon-close {
+ background-image: url("../../icons/shapes/close.svg");
+ }
+
+ &.swepay-icon-error-circle-filled {
+ background-image: url("../../icons/shapes/error_circle_filled.svg");
+ }
+
+ &.swepay-icon-error-triangle-filled {
+ background-image: url("../../icons/shapes/error_triangle_filled.svg");
+ }
+
+ &.swepay-icon-warning-triangle-filled {
+ background-image: url("../../icons/shapes/warning_triangle_filled.svg");
+ }
+
+ &.swepay-icon-info-circle-filled {
+ background-image: url("../../icons/shapes/info_circle_filled.svg");
+ }
+
+ &.swepay-icon-minus-substract {
+ background-image: url("../../icons/shapes/minus_substract.svg");
+ }
+
+ &.swepay-icon-plus-add {
+ background-image: url("../../icons/shapes/plus_add.svg");
+ }
+}
+
+// shape (basic UI) custom icons end
From 7243459875200c28e4a6bdf2d04a916380ecd3b5 Mon Sep 17 00:00:00 2001
From: Raphael Ferrand
Date: Fri, 22 Dec 2023 00:42:30 +0100
Subject: [PATCH 07/29] SWED-2276 move accordion internal icon to custom via
CSS
---
src/less/components/accordion.less | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
diff --git a/src/less/components/accordion.less b/src/less/components/accordion.less
index 902fb86e8e..0384e5c977 100644
--- a/src/less/components/accordion.less
+++ b/src/less/components/accordion.less
@@ -54,22 +54,19 @@
font-family: var(--brand-headline);
font-size: 1rem;
- // TODO: is this still necessary? if looks fine on chrome + ff + safari then only keep for material-icons
- // it seems that it's adding automatically the desired icon via :before trigering content to set the icon. Maybe hard to replace with Atlas?
- // eventually can keep it silently, and move away from it during next major release when bring new accordion
- // it doesn't require anything from users anyway since the icon is set on our side. So can change relaxed since the icon is not exposed but set on our side via CSS via :before
- // a possibility: replace by :before & :after with pure CSS
&:before {
- .material-icons-styling();
-
color: var(--brand-secondary);
- content: "keyboard_arrow_down";
+ content: "";
position: absolute;
right: 0;
top: 0;
- bottom: $top;
+ bottom: 0;
display: flex;
align-items: center;
+ background-image: url(../../icons/shapes/chevron_down.svg);
+ background-repeat: no-repeat;
+ background-position: center;
+ width: 20px;
}
}
From 1b8374112ccb62edc50e62dff8601711749473c9 Mon Sep 17 00:00:00 2001
From: Raphael Ferrand
Date: Sun, 24 Dec 2023 15:46:26 +0100
Subject: [PATCH 08/29] SWED-2276 add support for custom icons & fix mask
---
.../__snapshots__/index.test.js.snap | 48 +++++-----
.../identity/Iconography/constants.js | 24 ++---
src/less/components/action-list.less | 15 ++-
src/less/components/badge.less | 14 ++-
src/less/components/breadcrumb.less | 7 +-
src/less/components/button.less | 7 +-
src/less/components/dropdown.less | 15 ++-
src/less/components/expandable.less | 24 +++--
src/less/components/form.less | 7 +-
src/less/components/lists.less | 7 +-
src/less/components/media-object.less | 4 +-
src/less/components/nav.less | 14 ++-
src/less/components/payex/progress-step.less | 9 +-
src/less/components/radio.less | 9 +-
src/less/components/sidebar.less | 7 +-
src/less/components/topbar-experimental.less | 7 +-
src/less/components/topbar.less | 59 ++++++++++--
src/less/core/iconography.less | 52 +++++++----
src/less/core/typography.less | 91 ++++++++++++++++---
src/less/documentation-swedbankpay.less | 42 ---------
20 files changed, 316 insertions(+), 146 deletions(-)
diff --git a/src/App/Identity/identity/Iconography/__snapshots__/index.test.js.snap b/src/App/Identity/identity/Iconography/__snapshots__/index.test.js.snap
index 5096acf0b9..0dacaea95f 100644
--- a/src/App/Identity/identity/Iconography/__snapshots__/index.test.js.snap
+++ b/src/App/Identity/identity/Iconography/__snapshots__/index.test.js.snap
@@ -1263,14 +1263,14 @@ exports[`Core: Iconography renders 1`] = `
- check-circle-filled
+ close
@@ -1278,14 +1278,14 @@ exports[`Core: Iconography renders 1`] = `
- close
+ minus-substract
@@ -1293,14 +1293,14 @@ exports[`Core: Iconography renders 1`] = `
- error-circle-filled
+ plus-add
@@ -1308,14 +1308,14 @@ exports[`Core: Iconography renders 1`] = `
- error-triangle-filled
+ check-circle-filled
@@ -1323,14 +1323,14 @@ exports[`Core: Iconography renders 1`] = `
- warning-triangle-filled
+ error-circle-filled
@@ -1338,14 +1338,14 @@ exports[`Core: Iconography renders 1`] = `
- info-circle-filled
+ error-triangle-filled
@@ -1353,14 +1353,14 @@ exports[`Core: Iconography renders 1`] = `
- minus-substract
+ warning-triangle-filled
@@ -1368,14 +1368,14 @@ exports[`Core: Iconography renders 1`] = `
- plus-add
+ info-circle-filled
@@ -1470,28 +1470,28 @@ exports[`Core: Iconography renders 1`] = `
<i class="swepay-icon-chevron-right" aria-hidden="true"></i>
- <i class="swepay-icon-check-circle-filled" aria-hidden="true"></i>
+ <i class="swepay-icon-close" aria-hidden="true"></i>
- <i class="swepay-icon-close" aria-hidden="true"></i>
+ <i class="swepay-icon-minus-substract" aria-hidden="true"></i>
- <i class="swepay-icon-error-circle-filled" aria-hidden="true"></i>
+ <i class="swepay-icon-plus-add" aria-hidden="true"></i>
- <i class="swepay-icon-error-triangle-filled" aria-hidden="true"></i>
+ <i class="swepay-icon-check-circle-filled" aria-hidden="true"></i>
- <i class="swepay-icon-warning-triangle-filled" aria-hidden="true"></i>
+ <i class="swepay-icon-error-circle-filled" aria-hidden="true"></i>
- <i class="swepay-icon-info-circle-filled" aria-hidden="true"></i>
+ <i class="swepay-icon-error-triangle-filled" aria-hidden="true"></i>
- <i class="swepay-icon-minus-substract" aria-hidden="true"></i>
+ <i class="swepay-icon-warning-triangle-filled" aria-hidden="true"></i>
- <i class="swepay-icon-plus-add" aria-hidden="true"></i>
+ <i class="swepay-icon-info-circle-filled" aria-hidden="true"></i>
diff --git a/src/App/Identity/identity/Iconography/constants.js b/src/App/Identity/identity/Iconography/constants.js
index 63925a94d6..cea41b0c4a 100644
--- a/src/App/Identity/identity/Iconography/constants.js
+++ b/src/App/Identity/identity/Iconography/constants.js
@@ -158,14 +158,22 @@ export const shapes = [
title: "Chevron right",
code: "chevron-right",
},
- {
- title: "Check circle filled",
- code: "check-circle-filled",
- },
{
title: "Close",
code: "close",
},
+ {
+ title: "Minus substract",
+ code: "minus-substract",
+ },
+ {
+ title: "Plus add",
+ code: "plus-add",
+ },
+ {
+ title: "Check circle filled",
+ code: "check-circle-filled",
+ },
{
title: "Error circle filled",
code: "error-circle-filled",
@@ -182,14 +190,6 @@ export const shapes = [
title: "Info circle filled",
code: "info-circle-filled",
},
- {
- title: "Minus substract",
- code: "minus-substract",
- },
- {
- title: "Plus add",
- code: "plus-add",
- },
];
export const commonIconSizes = [
diff --git a/src/less/components/action-list.less b/src/less/components/action-list.less
index 142d110839..de34f1224c 100644
--- a/src/less/components/action-list.less
+++ b/src/less/components/action-list.less
@@ -25,7 +25,12 @@
color: var(--brand-secondary);
> .material-icons,
- > :is(i[class^="at-"], i[class*=" at-"]) {
+ > :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
margin-right: 0.5rem;
}
@@ -53,7 +58,13 @@
border: 0;
outline: 0;
- &:not(.material-icons, i[class^="at-"], i[class*=" at-"]) {
+ &:not(
+ .material-icons,
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
padding: 0.7rem;
}
diff --git a/src/less/components/badge.less b/src/less/components/badge.less
index 89a9ea7c14..03742ba3be 100644
--- a/src/less/components/badge.less
+++ b/src/less/components/badge.less
@@ -62,7 +62,12 @@
// TODO: ask designers: should we keep this? should people use icons in badge?
// If not then remove it and communicate it as breaking change
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 1rem;
vertical-align: text-top;
}
@@ -147,7 +152,12 @@
}
.material-icons,
- &:is([class^="at-"], [class*=" at-"]) {
+ &:is(
+ [class^="at-"],
+ [class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 1.25rem;
margin-right: 0.5rem;
}
diff --git a/src/less/components/breadcrumb.less b/src/less/components/breadcrumb.less
index c1436d786e..6b3a087cff 100644
--- a/src/less/components/breadcrumb.less
+++ b/src/less/components/breadcrumb.less
@@ -41,7 +41,12 @@ ol.breadcrumb {
}
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 1rem;
vertical-align: text-top;
}
diff --git a/src/less/components/button.less b/src/less/components/button.less
index 4d56aad7f4..3055d3d4af 100644
--- a/src/less/components/button.less
+++ b/src/less/components/button.less
@@ -188,7 +188,12 @@
.material-icons,
.material-icons-outlined,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 1.25rem;
position: relative;
display: inline-block;
diff --git a/src/less/components/dropdown.less b/src/less/components/dropdown.less
index 67e0aa6ced..ca7c6911ec 100644
--- a/src/less/components/dropdown.less
+++ b/src/less/components/dropdown.less
@@ -106,7 +106,12 @@
cursor: pointer;
> .material-icons,
- > :is(i[class^="at-"], i[class*=" at-"]) {
+ > :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
margin-right: 0.5rem;
}
@@ -166,7 +171,13 @@
border: 0;
outline: 0 solid var(--brand-secondary);
- &:not(.material-icons, i[class^="at-"], i[class*=" at-"]) {
+ &:not(
+ .material-icons,
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
padding: 0.7rem;
}
diff --git a/src/less/components/expandable.less b/src/less/components/expandable.less
index 3c3f2d64dd..6f3c411102 100644
--- a/src/less/components/expandable.less
+++ b/src/less/components/expandable.less
@@ -73,7 +73,12 @@
}
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
grid-area: icon;
}
@@ -86,20 +91,19 @@
margin: 0;
position: relative;
- // TODO: replace by pure CSS. Not issue since not exposed to users anyway
&:before {
- .material-icons-styling(@margin: 0 1rem);
-
color: var(--brand-secondary-light-2);
- content: "keyboard_arrow_down";
+ content: "";
position: absolute;
right: 0;
- top: 0;
- bottom: $top;
- display: flex;
- align-items: center;
font-size: 1.75rem;
- margin-right: 0;
+ height: 1.75rem;
+ width: 1.75rem;
+ background-color: currentColor;
+ mask-position: center;
+ mask-repeat: no-repeat;
+ mask: url("../../icons/shapes/chevron_down.svg");
+ margin: 0 0 0 1rem;
}
}
diff --git a/src/less/components/form.less b/src/less/components/form.less
index c9e7760e82..2ef404b3ac 100644
--- a/src/less/components/form.less
+++ b/src/less/components/form.less
@@ -56,7 +56,12 @@ label {
}
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
color: @brand-accent-links;
}
}
diff --git a/src/less/components/lists.less b/src/less/components/lists.less
index d0b38f5f9e..8c1b3fc45b 100644
--- a/src/less/components/lists.less
+++ b/src/less/components/lists.less
@@ -64,7 +64,12 @@
display: flex;
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
margin-right: 0.5rem;
}
}
diff --git a/src/less/components/media-object.less b/src/less/components/media-object.less
index bfcb7d9f5b..fb04a3cabb 100644
--- a/src/less/components/media-object.less
+++ b/src/less/components/media-object.less
@@ -13,7 +13,9 @@
.material-icons,
.material-icons-outlined,
i[class^="at-"],
- i[class*=" at-"]
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
) {
width: 48px;
height: 48px;
diff --git a/src/less/components/nav.less b/src/less/components/nav.less
index 6ff50151d6..22bf01bdb2 100644
--- a/src/less/components/nav.less
+++ b/src/less/components/nav.less
@@ -113,7 +113,12 @@
}
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
color: @brand-secondary;
user-select: none;
}
@@ -384,7 +389,12 @@
}
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
margin-right: var(--base-margin);
font-size: 24px;
}
diff --git a/src/less/components/payex/progress-step.less b/src/less/components/payex/progress-step.less
index 381529ae9c..02c5632da4 100644
--- a/src/less/components/payex/progress-step.less
+++ b/src/less/components/payex/progress-step.less
@@ -3,6 +3,13 @@
.steps
ol
li.steps-completed
- .steps-icon:is(i, [class^="at-"], [class*=" at-"], .material-icons) {
+ .steps-icon:is(
+ i,
+ [class^="at-"],
+ [class*=" at-"],
+ [class^="swepay-icon-"],
+ [class*=" swepay-icon-"],
+ .material-icons
+ ) {
color: var(--white);
}
diff --git a/src/less/components/radio.less b/src/less/components/radio.less
index 61d4fa33bc..687f39eef7 100644
--- a/src/less/components/radio.less
+++ b/src/less/components/radio.less
@@ -120,7 +120,14 @@
display: none;
}
- label :is(i[class^="at-"], i[class*=" at-"], .material-icons) {
+ label
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"],
+ .material-icons
+ ) {
color: var(--white);
margin-left: -10px;
}
diff --git a/src/less/components/sidebar.less b/src/less/components/sidebar.less
index 610f959daf..fc705a64a3 100644
--- a/src/less/components/sidebar.less
+++ b/src/less/components/sidebar.less
@@ -354,7 +354,12 @@
}
.material-icons-outlined,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
border: 1px solid;
}
}
diff --git a/src/less/components/topbar-experimental.less b/src/less/components/topbar-experimental.less
index 6f735f21a4..d7f349338a 100644
--- a/src/less/components/topbar-experimental.less
+++ b/src/less/components/topbar-experimental.less
@@ -166,7 +166,12 @@
margin: initial;
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
margin: 0;
}
}
diff --git a/src/less/components/topbar.less b/src/less/components/topbar.less
index f06eb945f8..3c69ddf7f0 100644
--- a/src/less/components/topbar.less
+++ b/src/less/components/topbar.less
@@ -132,7 +132,12 @@
}
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
margin: 0;
}
}
@@ -353,7 +358,12 @@
}
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
margin: 0;
}
}
@@ -386,7 +396,14 @@
margin-left: 1rem;
}
- :is(i[class^="at-"], i[class*=" at-"], .material-icons) + span {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"],
+ .material-icons
+ )
+ + span {
margin-left: 0;
}
}
@@ -395,7 +412,12 @@
margin: initial;
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
margin: 0;
}
}
@@ -444,7 +466,12 @@
align-items: center;
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
padding: 0 0.5rem 0 0;
user-select: none;
}
@@ -471,7 +498,12 @@
color: @black;
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
margin: 0;
}
}
@@ -578,9 +610,20 @@
&:not(.topbar-link-right) {
& .material-icons,
- & :is(i[class^="at-"], i[class*=" at-"]),
+ &
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ),
&.material-icons,
- &:is([class^="at-"], [class*=" at-"]) {
+ &:is(
+ [class^="at-"],
+ [class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
display: none;
}
}
diff --git a/src/less/core/iconography.less b/src/less/core/iconography.less
index b4bcf26a21..0a042ca270 100644
--- a/src/less/core/iconography.less
+++ b/src/less/core/iconography.less
@@ -606,63 +606,75 @@ each(@flag-list, .(@country-code) {
i[class^="swepay-icon-"],
i[class*=" swepay-icon-"] {
display: inline-block;
- background-size: contain;
- background-repeat: no-repeat;
+ // TODO: check if autoprefixed by autoprefixer, so work on Edge for example
+ mask-position: center;
+ mask-repeat: no-repeat;
background-position: center;
+ background-repeat: no-repeat;
+ background-size: contain;
height: var(--icon-size, 24px);
width: var(--icon-size, 24px);
- stroke: currentColor;
- fill: currentColor;
+ background-color: currentColor;
&.swepay-icon-chevron-down {
- background-image: url("../../icons/shapes/chevron_down.svg");
+ // TODO: check if autoprefixed by autoprefixer, so work on Edge for example
+ // -webkit-mask: url("../../icons/shapes/chevron_down.svg") no-repeat 50% 50%;
+ mask: url("../../icons/shapes/chevron_down.svg");
}
&.swepay-icon-chevron-up {
- background-image: url("../../icons/shapes/chevron_down.svg");
+ mask: url("../../icons/shapes/chevron_down.svg");
transform: rotate(180deg);
}
&.swepay-icon-chevron-left {
- background-image: url("../../icons/shapes/chevron_down.svg");
+ mask: url("../../icons/shapes/chevron_down.svg");
transform: rotate(270deg);
}
&.swepay-icon-chevron-right {
- background-image: url("../../icons/shapes/chevron_down.svg");
+ mask: url("../../icons/shapes/chevron_down.svg");
transform: rotate(90deg);
}
- &.swepay-icon-check-circle-filled {
- background-image: url("../../icons/shapes/check_circle_filled.svg");
+ &.swepay-icon-close {
+ mask: url("../../icons/shapes/close.svg");
}
- &.swepay-icon-close {
- background-image: url("../../icons/shapes/close.svg");
+ &.swepay-icon-minus-substract {
+ mask: url("../../icons/shapes/minus_substract.svg");
+ }
+
+ &.swepay-icon-plus-add {
+ mask: url("../../icons/shapes/plus_add.svg");
+ }
+
+ // ICONS styled differently since their color should never be modified.
+ // Therefore it uses background-image instead of mask
+
+ &.swepay-icon-check-circle-filled {
+ background-image: url("../../icons/shapes/check_circle_filled.svg");
+ background-color: initial;
}
&.swepay-icon-error-circle-filled {
background-image: url("../../icons/shapes/error_circle_filled.svg");
+ background-color: initial;
}
&.swepay-icon-error-triangle-filled {
background-image: url("../../icons/shapes/error_triangle_filled.svg");
+ background-color: initial;
}
&.swepay-icon-warning-triangle-filled {
background-image: url("../../icons/shapes/warning_triangle_filled.svg");
+ background-color: initial;
}
&.swepay-icon-info-circle-filled {
background-image: url("../../icons/shapes/info_circle_filled.svg");
- }
-
- &.swepay-icon-minus-substract {
- background-image: url("../../icons/shapes/minus_substract.svg");
- }
-
- &.swepay-icon-plus-add {
- background-image: url("../../icons/shapes/plus_add.svg");
+ background-color: initial;
}
}
diff --git a/src/less/core/typography.less b/src/less/core/typography.less
index 35c52bcc33..0576ecd1e2 100644
--- a/src/less/core/typography.less
+++ b/src/less/core/typography.less
@@ -32,7 +32,12 @@ h6,
}
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
display: inline-flex;
vertical-align: text-top;
}
@@ -45,7 +50,12 @@ h6,
font-weight: var(--font-weight-header, 400);
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 3.5rem;
line-height: 4.25rem;
}
@@ -59,7 +69,12 @@ h1,
font-weight: var(--font-weight-header, 400);
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 2rem;
line-height: 2.875rem;
}
@@ -73,7 +88,12 @@ h2,
font-weight: var(--font-weight-header, 400);
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 1.5rem;
line-height: 2.125rem;
}
@@ -87,7 +107,12 @@ h3,
font-weight: var(--font-weight-header, 400);
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 1.25rem;
line-height: 1.75rem;
}
@@ -101,7 +126,12 @@ h4,
line-height: 1.625rem;
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 1.125rem;
line-height: 1.625rem;
}
@@ -115,7 +145,12 @@ h5,
font-weight: var(--font-weight-header, 400);
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 1rem;
line-height: 1.5rem;
}
@@ -128,7 +163,12 @@ h6,
font-weight: var(--font-weight-bold, 700);
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 0.875rem;
line-height: 1.375rem;
}
@@ -234,7 +274,12 @@ blockquote,
line-height: 3.5rem;
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 2.5rem;
line-height: 3.5rem;
}
@@ -246,7 +291,12 @@ blockquote,
line-height: 2.75rem;
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 2rem;
line-height: 2.75rem;
}
@@ -258,7 +308,12 @@ blockquote,
line-height: 2.125rem;
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 1.5rem;
line-height: 2.125rem;
}
@@ -270,7 +325,12 @@ blockquote,
line-height: 1.875rem;
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 1.25rem;
line-height: 1.875rem;
}
@@ -287,7 +347,12 @@ blockquote,
line-height: 1.25rem;
.material-icons,
- :is(i[class^="at-"], i[class*=" at-"]) {
+ :is(
+ i[class^="at-"],
+ i[class*=" at-"],
+ i[class^="swepay-icon-"],
+ i[class*=" swepay-icon-"]
+ ) {
font-size: 0.875rem;
line-height: 1.25rem;
}
diff --git a/src/less/documentation-swedbankpay.less b/src/less/documentation-swedbankpay.less
index d4151efd04..770031f372 100644
--- a/src/less/documentation-swedbankpay.less
+++ b/src/less/documentation-swedbankpay.less
@@ -145,18 +145,6 @@
}
}
- /* Only used for showing border-utility [AW] */
- .demo-square {
- height: 5rem;
- width: 5rem;
- background-color: @light-gray;
- display: inline-block;
-
- &:not(:last-child) {
- margin-right: 1rem;
- }
- }
-
.glow-on-hover {
cursor: pointer;
position: relative;
@@ -910,22 +898,6 @@
border-radius: 2px;
}
- .doc-circle {
- display: flex;
- justify-content: center;
- align-items: center;
- margin: auto;
- height: 150px;
- width: $height;
- background-color: @brand-primary;
- border-radius: 50%;
-
- .material-icons,
- i:is([class^="at-"], [class*=" at-"]) {
- font-size: 6rem;
- }
- }
-
.doc-sidebar {
height: auto;
position: sticky;
@@ -2189,20 +2161,6 @@
}
}
-@media screen and (max-width: @screen-xs-max) {
- .documentation {
- .doc-circle {
- height: 120px;
- width: $height;
-
- .material-icons,
- i[class^="at-"] {
- font-size: 4rem;
- }
- }
- }
-}
-
@media (forced-colors: active) {
#designguide,
.documentation {
From 0973c8b29871919f095e658da499ad042d724f56 Mon Sep 17 00:00:00 2001
From: Raphael Ferrand
Date: Sun, 24 Dec 2023 19:07:21 +0100
Subject: [PATCH 09/29] SWED-2276 fix E2E tests icons
---
package.json | 2 +-
.../Accordion/accordion.e2e.spec.js | 63 +++++++-----------
...ankPay-accordions-Mobile-Chrome-darwin.png | Bin 45324 -> 45548 bytes
...ankPay-accordions-Mobile-Safari-darwin.png | Bin 41598 -> 41903 bytes
...SwedbankPay-accordions-chromium-darwin.png | Bin 52108 -> 52338 bytes
.../SwedbankPay-accordions-firefox-darwin.png | Bin 48304 -> 48230 bytes
.../SwedbankPay-accordions-webkit-darwin.png | Bin 46480 -> 46915 bytes
...Pay-dialog-button-Mobile-Chrome-darwin.png | Bin 2886 -> 2913 bytes
...dbankPay-dialog-button-chromium-darwin.png | Bin 2904 -> 2934 bytes
...kPay-dialog-modal-Mobile-Chrome-darwin.png | Bin 17392 -> 16720 bytes
...kPay-dialog-modal-Mobile-Safari-darwin.png | Bin 17026 -> 12270 bytes
...edbankPay-dialog-modal-chromium-darwin.png | Bin 17146 -> 15569 bytes
...wedbankPay-dialog-modal-firefox-darwin.png | Bin 18284 -> 16946 bytes
...alog-modal-screen-Mobile-Chrome-darwin.png | Bin 75440 -> 74918 bytes
...alog-modal-screen-Mobile-Safari-darwin.png | Bin 61381 -> 55319 bytes
...ay-dialog-modal-screen-chromium-darwin.png | Bin 173409 -> 172492 bytes
...Pay-dialog-modal-screen-firefox-darwin.png | Bin 176250 -> 176688 bytes
...kPay-dialog-modal-screen-webkit-darwin.png | Bin 163809 -> 164260 bytes
...SwedbankPay-dialog-modal-webkit-darwin.png | Bin 17944 -> 12582 bytes
...dropdownContainer-Mobile-Chrome-darwin.png | Bin 10354 -> 10513 bytes
...dropdownContainer-Mobile-Safari-darwin.png | Bin 10570 -> 10132 bytes
...ened-dropdownContainer-chromium-darwin.png | Bin 9994 -> 10139 bytes
...-previewContainer-Mobile-Chrome-darwin.png | Bin 5074 -> 5061 bytes
...-previewContainer-Mobile-Safari-darwin.png | Bin 6365 -> 6115 bytes
...pened-previewContainer-chromium-darwin.png | Bin 5263 -> 5389 bytes
...own-toggle-active-Mobile-Chrome-darwin.png | Bin 2990 -> 2977 bytes
...own-toggle-active-Mobile-Safari-darwin.png | Bin 3203 -> 3428 bytes
...dropdown-toggle-active-chromium-darwin.png | Bin 2937 -> 3131 bytes
...wn-toggle-hovered-Mobile-Chrome-darwin.png | Bin 2921 -> 2912 bytes
...wn-toggle-hovered-Mobile-Safari-darwin.png | Bin 3180 -> 3361 bytes
...ropdown-toggle-hovered-chromium-darwin.png | Bin 2932 -> 2976 bytes
...-dropdown-toggle-hovered-webkit-darwin.png | Bin 3116 -> 3361 bytes
...own-toggle-normal-Mobile-Chrome-darwin.png | Bin 2829 -> 2817 bytes
...own-toggle-normal-Mobile-Safari-darwin.png | Bin 2991 -> 3250 bytes
...dropdown-toggle-normal-chromium-darwin.png | Bin 2844 -> 2830 bytes
.../Expandable/expandable.e2e.spec.js | 48 ++++++-------
...kPay-danger-toast-Mobile-Chrome-darwin.png | Bin 13682 -> 13893 bytes
...kPay-danger-toast-Mobile-Safari-darwin.png | Bin 14403 -> 13792 bytes
...edbankPay-danger-toast-chromium-darwin.png | Bin 14354 -> 14328 bytes
...SwedbankPay-danger-toast-webkit-darwin.png | Bin 14161 -> 13660 bytes
...Pay-neutral-toast-Mobile-Chrome-darwin.png | Bin 13592 -> 13928 bytes
...Pay-neutral-toast-Mobile-Safari-darwin.png | Bin 13132 -> 12277 bytes
...dbankPay-neutral-toast-chromium-darwin.png | Bin 14347 -> 14221 bytes
...wedbankPay-neutral-toast-webkit-darwin.png | Bin 13118 -> 12306 bytes
...Pay-success-toast-Mobile-Chrome-darwin.png | Bin 13914 -> 14341 bytes
...Pay-success-toast-Mobile-Safari-darwin.png | Bin 13277 -> 15106 bytes
...dbankPay-success-toast-chromium-darwin.png | Bin 14316 -> 19005 bytes
...Pay-warning-toast-Mobile-Chrome-darwin.png | Bin 13540 -> 13884 bytes
...Pay-warning-toast-Mobile-Safari-darwin.png | Bin 12948 -> 14580 bytes
...dbankPay-warning-toast-chromium-darwin.png | Bin 13895 -> 13704 bytes
...wedbankPay-warning-toast-webkit-darwin.png | Bin 12848 -> 14620 bytes
...cy-desktop-closed-Mobile-Chrome-darwin.png | Bin 3382 -> 3400 bytes
...-legacy-desktop-closed-chromium-darwin.png | Bin 10884 -> 11130 bytes
...ar-legacy-desktop-closed-webkit-darwin.png | Bin 12678 -> 12335 bytes
...top-links-ui-feedbacks-chromium-darwin.png | Bin 5952 -> 6186 bytes
...sktop-links-ui-feedbacks-webkit-darwin.png | Bin 5438 -> 5215 bytes
...acy-mobile-closed-Mobile-Chrome-darwin.png | Bin 3382 -> 3400 bytes
...r-legacy-mobile-closed-chromium-darwin.png | Bin 5074 -> 5206 bytes
...acy-mobile-opened-Mobile-Chrome-darwin.png | Bin 9782 -> 9736 bytes
...r-legacy-mobile-opened-chromium-darwin.png | Bin 11740 -> 11858 bytes
...olor-Background-colors-chromium-darwin.png | Bin 20557 -> 20547 bytes
...-color-Background-colors-webkit-darwin.png | Bin 21687 -> 21581 bytes
...and-accent-colors-Mobile-Chrome-darwin.png | Bin 30840 -> 30941 bytes
...or-Brand-accent-colors-chromium-darwin.png | Bin 26999 -> 26800 bytes
...olor-Brand-accent-colors-webkit-darwin.png | Bin 27367 -> 26705 bytes
...-color-Color-pool-Mobile-Chrome-darwin.png | Bin 144053 -> 144959 bytes
...bankPay-color-Color-pool-webkit-darwin.png | Bin 127608 -> 128722 bytes
...or-Primary-colors-Mobile-Chrome-darwin.png | Bin 20824 -> 20847 bytes
...y-color-Primary-colors-chromium-darwin.png | Bin 13145 -> 13185 bytes
...Pay-color-Primary-colors-webkit-darwin.png | Bin 16048 -> 15547 bytes
...kPay-color-System-colors-webkit-darwin.png | Bin 39617 -> 39219 bytes
...ankPay-color-Text-colors-webkit-darwin.png | Bin 11983 -> 11920 bytes
...y-Desktop-headers-Mobile-Chrome-darwin.png | Bin 73874 -> 77765 bytes
...graphy-Desktop-headers-chromium-darwin.png | Bin 73874 -> 77765 bytes
...hy-Mobile-headers-Mobile-Chrome-darwin.png | Bin 74613 -> 75334 bytes
...ography-Mobile-headers-chromium-darwin.png | Bin 74613 -> 75334 bytes
src/less/core/iconography.less | 3 -
.../main/accordion/accordion.e2e.spec.js | 8 +--
78 files changed, 53 insertions(+), 71 deletions(-)
diff --git a/package.json b/package.json
index c605a837d4..131b0221d9 100644
--- a/package.json
+++ b/package.json
@@ -60,7 +60,7 @@
"@babel/eslint-parser": "^7.23.3",
"@babel/preset-env": "^7.23.3",
"@babel/preset-react": "^7.23.3",
- "@playwright/test": "^1.39.0",
+ "@playwright/test": "^1.40.1",
"@sentry/webpack-plugin": "^1.20.0",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^14.1.2",
diff --git a/src/App/ComponentsDocumentation/components/Accordion/accordion.e2e.spec.js b/src/App/ComponentsDocumentation/components/Accordion/accordion.e2e.spec.js
index 7fc10b7150..a1717d5c77 100644
--- a/src/App/ComponentsDocumentation/components/Accordion/accordion.e2e.spec.js
+++ b/src/App/ComponentsDocumentation/components/Accordion/accordion.e2e.spec.js
@@ -9,28 +9,25 @@ test("Accordion page exist", async ({ page }) => {
})
.click();
await expect(page.getByRole("link", { name: "Accordion" })).toHaveCount(
- page.viewportSize().width < 991 ? 1 : 2
+ page.viewportSize().width < 991 ? 1 : 2,
);
await page.getByText("calendar_view_dayAccordionarrow_forward").click();
await expect(page).toHaveTitle(/Accordion/);
await expect(
- page.getByRole("heading", { name: "Accordion", exact: true, level: 1 })
+ page.getByRole("heading", { name: "Accordion", exact: true, level: 1 }),
).toBeVisible();
});
test("visual regresion accordions", async ({ page }) => {
await page.goto("http://localhost:3000/components/accordion");
- await page
- .getByRole("button", { name: "keyboard_arrow_down My title" })
- .first()
- .click();
+ await page.getByRole("button", { name: "My title" }).first().click();
const brand = (await page.title()).includes("Swedbank")
? "SwedbankPay"
: "PayEx";
await expect(
- page.locator(".component-preview-content > div")
+ page.locator(".component-preview-content > div"),
).toHaveScreenshot(`${brand}-accordions.png`);
});
@@ -40,41 +37,35 @@ test.describe(`accordions options behave correctly`, () => {
}) => {
await page.goto("http://localhost:3000/components/accordion");
- await page
- .getByRole("button", { name: "keyboard_arrow_down My title" })
- .first()
- .click();
+ await page.getByRole("button", { name: "My title" }).first().click();
await expect(
page
.locator("#exp-1")
.getByText(
- "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con"
- )
+ "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con",
+ ),
).toBeVisible();
await expect(
page
.locator("#exp-3")
.getByText(
- "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con"
- )
+ "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con",
+ ),
).not.toBeVisible();
- await page
- .getByRole("button", { name: "keyboard_arrow_down My title" })
- .nth(2)
- .click();
+ await page.getByRole("button", { name: "My title" }).nth(2).click();
await expect(
page
.locator("#exp-1")
.getByText(
- "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con"
- )
+ "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con",
+ ),
).toBeVisible();
await expect(
page
.locator("#exp-3")
.getByText(
- "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con"
- )
+ "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con",
+ ),
).toBeVisible();
});
test(`accordions option "Open one at a time" can be clicked and works`, async ({
@@ -94,44 +85,38 @@ test.describe(`accordions options behave correctly`, () => {
await page.getByRole("button", { name: "Close options menu" }).click();
}
- await page
- .getByRole("button", { name: "keyboard_arrow_down My title" })
- .first()
- .click();
+ await page.getByRole("button", { name: "My title" }).first().click();
await expect(
page
.locator("#exp-1")
.getByText(
- "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con"
- )
+ "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con",
+ ),
).toBeVisible();
await expect(
page
.locator("#exp-3")
.getByText(
- "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con"
- )
+ "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con",
+ ),
).not.toBeVisible();
// FIXME: this part fails on Mobile Chrome, not sure why. Therefore skipping for now, but should be fixed
if (page.viewportSize().width >= 991 || browserName !== "chromium") {
- await page
- .getByRole("button", { name: "keyboard_arrow_down My title" })
- .nth(2)
- .click();
+ await page.getByRole("button", { name: "My title" }).nth(2).click();
await expect(
page
.locator("#exp-1")
.getByText(
- "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con"
- )
+ "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con",
+ ),
).not.toBeVisible();
await expect(
page
.locator("#exp-3")
.getByText(
- "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con"
- )
+ "Proident cupidatat irure excepteur id minim dolore mollit amet reprehenderit con",
+ ),
).toBeVisible();
}
});
diff --git a/src/App/ComponentsDocumentation/components/Accordion/accordion.e2e.spec.js-snapshots/SwedbankPay-accordions-Mobile-Chrome-darwin.png b/src/App/ComponentsDocumentation/components/Accordion/accordion.e2e.spec.js-snapshots/SwedbankPay-accordions-Mobile-Chrome-darwin.png
index 0dfc84f275ba1dc6189399f867fe89b3ca37cece..4186ba125e56dd24f23f97e78b2b038bd1646ebc 100644
GIT binary patch
literal 45548
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