@bonniernews/dn-design-system-web 3.0.0-alpha.8 → 3.0.0-alpha.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +641 -0
- package/assets/article-image/article-image.njk +11 -10
- package/assets/article-image/article-image.scss +1 -15
- package/assets/form-field/form-field.njk +2 -2
- package/assets/form-field/form-field.scss +2 -6
- package/assets/teaser/dot-or-grade.njk +7 -0
- package/assets/teaser/teaser.scss +94 -0
- package/components/article-body-image/README.md +2 -2
- package/components/article-body-image/article-body-image.njk +1 -5
- package/components/article-top-image/README.md +2 -2
- package/components/article-top-image/article-top-image.njk +1 -5
- package/components/article-top-image/article-top-image.scss +1 -1
- package/components/badge/badge.scss +1 -5
- package/components/buddy-menu/buddy-menu.scss +1 -8
- package/components/button/button.njk +38 -43
- package/components/button/button.scss +6 -1
- package/components/button-toggle/button-toggle.js +2 -0
- package/components/button-toggle/button-toggle.njk +36 -36
- package/components/button-toggle/button-toggle.scss +6 -1
- package/components/byline/byline.njk +2 -2
- package/components/byline/byline.scss +1 -3
- package/components/checkbox/checkbox.njk +3 -3
- package/components/checkbox/checkbox.scss +8 -9
- package/components/disclaimer/disclaimer.njk +2 -2
- package/components/disclaimer/disclaimer.scss +23 -10
- package/components/factbox/README.md +2 -2
- package/components/factbox/factbox.njk +12 -24
- package/components/factbox/factbox.scss +16 -51
- package/components/footer/footer.scss +2 -8
- package/components/icon-button/README.md +2 -1
- package/components/icon-button/icon-button.njk +4 -4
- package/components/icon-button/icon-button.scss +5 -2
- package/components/icon-button-toggle/icon-button-toggle.js +2 -0
- package/components/icon-button-toggle/icon-button-toggle.njk +28 -36
- package/components/icon-button-toggle/icon-button-toggle.scss +5 -2
- package/components/icon-sprite/README.md +51 -0
- package/components/icon-sprite/icon-sprite.njk +12 -0
- package/components/icon-sprite/icon-sprite.scss +12 -0
- package/components/icon-with-wrapper/README.md +9 -2
- package/components/icon-with-wrapper/icon-with-wrapper.njk +2 -2
- package/components/icon-with-wrapper/icon-with-wrapper.scss +2 -1
- package/components/image-caption/README.md +38 -0
- package/components/image-caption/image-caption.njk +36 -0
- package/components/image-caption/image-caption.scss +25 -0
- package/components/list-item/list-item.njk +5 -5
- package/components/list-item/list-item.scss +1 -3
- package/components/pictogram/README.md +39 -0
- package/components/pictogram/pictogram.njk +30 -0
- package/components/pictogram/pictogram.scss +54 -0
- package/components/quote/README.md +1 -2
- package/components/quote/quote.njk +6 -8
- package/components/quote/quote.scss +1 -14
- package/components/radio-button/radio-button.njk +3 -3
- package/components/radio-button/radio-button.scss +8 -10
- package/components/spinner/spinner.njk +19 -23
- package/components/spinner/spinner.scss +4 -1
- package/components/teaser-dot/README.md +34 -0
- package/components/teaser-dot/teaser-dot.njk +24 -0
- package/components/teaser-dot/teaser-dot.scss +39 -0
- package/components/teaser-image/README.md +40 -0
- package/components/teaser-image/teaser-image.njk +21 -0
- package/components/teaser-image/teaser-image.scss +21 -0
- package/components/teaser-large/README.md +52 -0
- package/components/teaser-large/teaser-large.njk +93 -0
- package/components/teaser-large/teaser-large.scss +165 -0
- package/components/teaser-onsite/README.md +53 -0
- package/components/teaser-onsite/teaser-onsite.njk +45 -0
- package/components/teaser-onsite/teaser-onsite.scss +35 -0
- package/components/teaser-package/README.md +42 -0
- package/components/teaser-package/teaser-package.njk +36 -0
- package/components/teaser-package/teaser-package.scss +119 -0
- package/components/teaser-right-now/README.md +37 -0
- package/components/teaser-right-now/teaser-right-now.njk +29 -0
- package/components/teaser-right-now/teaser-right-now.scss +57 -0
- package/components/teaser-slideshow/README.md +42 -0
- package/components/teaser-slideshow/teaser-slideshow.njk +38 -0
- package/components/teaser-slideshow/teaser-slideshow.scss +37 -0
- package/components/teaser-split/README-container.md +40 -0
- package/components/teaser-split/README.md +49 -0
- package/components/teaser-split/teaser-split.njk +93 -0
- package/components/teaser-split/teaser-split.scss +85 -0
- package/components/teaser-standard/README.md +50 -0
- package/components/teaser-standard/teaser-standard.njk +81 -0
- package/components/teaser-standard/teaser-standard.scss +38 -0
- package/components/teaser-tipsa/README.md +41 -0
- package/components/teaser-tipsa/teaser-tipsa.njk +31 -0
- package/components/teaser-tipsa/teaser-tipsa.scss +22 -0
- package/components/text-button/text-button.njk +34 -37
- package/components/text-button/text-button.scss +12 -10
- package/components/text-button-toggle/text-button-toggle.js +2 -0
- package/components/text-button-toggle/text-button-toggle.njk +30 -33
- package/components/text-button-toggle/text-button-toggle.scss +10 -10
- package/components/text-input/text-input.scss +3 -8
- package/components/video-caption/README.md +1 -1
- package/components/video-caption/video-caption.njk +12 -6
- package/components/vip-badge/README.md +35 -0
- package/components/vip-badge/vip-badge.njk +23 -0
- package/components/vip-badge/vip-badge.scss +54 -0
- package/foundations/colors.scss +31 -0
- package/foundations/helpers/README-links.md +1 -1
- package/foundations/helpers/colors.scss +2 -0
- package/foundations/helpers/hover.scss +14 -0
- package/foundations/helpers/links.scss +15 -7
- package/foundations/icons/grade-icon.njk +50 -11
- package/foundations/icons/icon.njk +167 -143
- package/foundations/icons/sprite.njk +1 -0
- package/foundations/icons/sprite.svg +1 -0
- package/foundations/icons/svg/download.svg +3 -0
- package/foundations/icons/svg/filter_list.svg +3 -0
- package/foundations/icons/svg/pause.svg +3 -0
- package/foundations/icons/svg/vip.svg +3 -0
- package/foundations/typography/fontDefinitions.scss +82 -67
- package/foundations/variables/colorsCssVariables.scss +6 -0
- package/foundations/variables/colorsDnDarkTokens.scss +7 -1
- package/foundations/variables/colorsDnLightTokens.scss +8 -2
- package/foundations/variables/spacingLayout.scss +6 -1
- package/foundations/variables/spacingLayoutLargeScreen.scss +5 -0
- package/foundations/variables/spacingLayoutList.scss +5 -0
- package/foundations/variables/typographyTokensList.scss +1 -0
- package/foundations/variables/typographyTokensScreenLarge.scss +131 -123
- package/foundations/variables/typographyTokensScreenSmall.scss +122 -114
- package/package.json +2 -2
- package/tokens/colors-css-variables.json +6 -0
- package/tokens/spacing-layout-list.json +6 -1
- package/foundations/icons/icon-sprite.svg +0 -2
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
- GitHub: [BonnierNews/dn-design-system/../web/src/components/teaser-tipsa](https://github.com/BonnierNews/dn-design-system/tree/main/web/src/components/teaser-tipsa)
|
|
2
|
+
- Storybook (PROD): [TeaserTipsa > Web](https://designsystem.dn.se/?path=/story/components-app-web-section-components-teasertipsa-web)
|
|
3
|
+
- Storybook (LATEST): [TeaserTipsa > Web](https://designsystem-latest.dn.se/?path=/story/components-app-web-section-components-teasertipsa-web)
|
|
4
|
+
|
|
5
|
+
----
|
|
6
|
+
|
|
7
|
+
# teaser-tipsa
|
|
8
|
+
|
|
9
|
+
It's quite common to include a dot in the title string, like "• This is a title"
|
|
10
|
+
|
|
11
|
+
## Parameters
|
|
12
|
+
|
|
13
|
+
|parameter | type | required | options | default | description |
|
|
14
|
+
|:--- | :--- | :--- | :--- | :--- | :--- |
|
|
15
|
+
|title | String | yes | | | Heading of the teaser |
|
|
16
|
+
|targetLink | String | yes | | | Target URL for the teaser |
|
|
17
|
+
|text | String | no | | | Teaser subtext |
|
|
18
|
+
|areaType | String | no | "right" or "bauta" or "bautaxl" | | The area where the column is rendered |
|
|
19
|
+
|theme | String | no | nyheter, kultur, ekonomi, sport, sthlm | (empty) | The theme-class to apply to the teaser |
|
|
20
|
+
|attributes | Object | no | | | Ex. { target: "_blank", "data-test": "lorem ipsum" } |
|
|
21
|
+
|classNames | String | no | | | Ex. "my-special-class" |
|
|
22
|
+
|~forcePx~ | | | | | Not supported |
|
|
23
|
+
|
|
24
|
+
## Minimum requirement example
|
|
25
|
+
|
|
26
|
+
### Nunjucks
|
|
27
|
+
|
|
28
|
+
These are copy paste friendly examples to quickliy get started using a component.
|
|
29
|
+
|
|
30
|
+
```html
|
|
31
|
+
{% from '@bonniernews/dn-design-system-web/components/teaser-tipsa/teaser-tipsa.njk' import TeaserTipsa %}
|
|
32
|
+
|
|
33
|
+
{{ TeaserTipsa({
|
|
34
|
+
title: "• Jessie Ware låter den fullödiga fullängdaren vänta på sig",
|
|
35
|
+
})}}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### SCSS
|
|
39
|
+
```scss
|
|
40
|
+
@use "@bonniernews/dn-design-system-web/components/teaser-tipsa/teaser-tipsa" as *;
|
|
41
|
+
```
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{% from '@bonniernews/dn-design-system-web/njk-helpers/attributes.njk' import getAttributes %}
|
|
2
|
+
|
|
3
|
+
{% macro TeaserTipsa(params) %}
|
|
4
|
+
{% set componentClassName = "ds-teaser" %}
|
|
5
|
+
{% set classNamePrefix = componentClassName + "--" %}
|
|
6
|
+
{% set additionalClasses = ["ds-teaser--tipsa"] %}
|
|
7
|
+
{% set attributes = getAttributes(params.attributes) %}
|
|
8
|
+
|
|
9
|
+
{% if params.classNames %}
|
|
10
|
+
{% set additionalClasses = (additionalClasses.push(params.classNames), additionalClasses) %}
|
|
11
|
+
{% endif%}
|
|
12
|
+
|
|
13
|
+
{% set classes = componentClassName + " " + additionalClasses | join(" ") %}
|
|
14
|
+
|
|
15
|
+
<a href="{{ params.targetLink }}"
|
|
16
|
+
class="{{ classes }}"
|
|
17
|
+
{{- attributes | safe }}>
|
|
18
|
+
|
|
19
|
+
<div class="{{ componentClassName + '__content'}}">
|
|
20
|
+
<h2 class="ds-teaser__title">
|
|
21
|
+
{{ params.title | safe }}
|
|
22
|
+
</h2>
|
|
23
|
+
|
|
24
|
+
{% if params.text %}
|
|
25
|
+
<p class="{{ componentClassName + '__text'}}">
|
|
26
|
+
{{ params.text | safe }}
|
|
27
|
+
</p>
|
|
28
|
+
{% endif %}
|
|
29
|
+
</div>
|
|
30
|
+
</a>
|
|
31
|
+
{% endmacro %}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
@use "../../foundations/helpers/forward.helpers.scss" as *;
|
|
2
|
+
@use "../../assets/teaser/teaser.scss" as *;
|
|
3
|
+
|
|
4
|
+
.ds-teaser.ds-teaser--tipsa {
|
|
5
|
+
.ds-teaser__content {
|
|
6
|
+
@include ds-spacing-layout($ds-sl-teaser-vertical $ds-sl-teaser-horizontal);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.ds-teaser__title {
|
|
10
|
+
@include ds-typography($ds-typography-expressive-heading02bold);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@include ds-hover(true) {
|
|
14
|
+
.ds-teaser__title {
|
|
15
|
+
@include ds-underline(2px, 1px);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.ds-teaser__text {
|
|
20
|
+
@include ds-typography($ds-typography-functional-body02regular);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1,65 +1,62 @@
|
|
|
1
|
-
{% from '@bonniernews/dn-design-system-web/
|
|
1
|
+
{% from '@bonniernews/dn-design-system-web/components/icon-sprite/icon-sprite.njk' import IconUse %}
|
|
2
2
|
{% from '@bonniernews/dn-design-system-web/components/spinner/spinner.njk' import Spinner %}
|
|
3
|
+
{% from '@bonniernews/dn-design-system-web/njk-helpers/attributes.njk' import getAttributes %}
|
|
3
4
|
|
|
4
5
|
{% macro TextButton(params) %}
|
|
5
|
-
{
|
|
6
|
-
{
|
|
7
|
-
{
|
|
8
|
-
{
|
|
9
|
-
{
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
{% if params.forcePx %}
|
|
16
|
-
{% set variant = (variant.push("ds-force-px"), variant) %}
|
|
6
|
+
{%- set componentClassName = "ds-text-btn" %}
|
|
7
|
+
{%- set classNamePrefix = componentClassName + "--" %}
|
|
8
|
+
{%- set additionalClasses = [] %}
|
|
9
|
+
{%- set text = params.text %}
|
|
10
|
+
{%- set attributes = getAttributes(params.attributes) %}
|
|
11
|
+
{%- set ariaLabel = 'aria-label="' + text + '"' if not params.attributes["aria-label"] else "" %}
|
|
12
|
+
|
|
13
|
+
{%- if params.forcePx %}
|
|
14
|
+
{% set additionalClasses = (additionalClasses.push("ds-force-px"), additionalClasses) %}
|
|
17
15
|
{% endif %}
|
|
18
16
|
|
|
19
|
-
{
|
|
20
|
-
{% set
|
|
17
|
+
{%- if params.fullWidth %}
|
|
18
|
+
{% set additionalClasses = (additionalClasses.push(classNamePrefix + "full-width"), additionalClasses) %}
|
|
21
19
|
{% endif %}
|
|
22
20
|
|
|
23
|
-
{
|
|
24
|
-
{% set
|
|
21
|
+
{%- if params.condensed and not params.fullWidth %}
|
|
22
|
+
{% set additionalClasses = (additionalClasses.push(classNamePrefix + "condensed"), additionalClasses) %}
|
|
25
23
|
{% endif %}
|
|
26
24
|
|
|
27
|
-
{
|
|
28
|
-
{% set
|
|
25
|
+
{%- if params.mobile and params.mobile.fullWidth %}
|
|
26
|
+
{% set additionalClasses = (additionalClasses.push(classNamePrefix + "mobile-full-width"), additionalClasses) %}
|
|
29
27
|
{% endif %}
|
|
30
28
|
|
|
31
|
-
{
|
|
32
|
-
{% set
|
|
33
|
-
{% set iconSvg =
|
|
29
|
+
{%- if params.iconName and params.iconPosition and params.iconPosition != "none" %}
|
|
30
|
+
{% set additionalClasses = (additionalClasses.push(classNamePrefix + "icon" + "-" + params.iconPosition ), additionalClasses) %}
|
|
31
|
+
{% set iconSvg = IconUse({ icon: params.iconName }) %}
|
|
34
32
|
{% endif %}
|
|
35
33
|
|
|
36
|
-
{
|
|
34
|
+
{%- set loadingHtml %}
|
|
37
35
|
{{ Spinner({ size: "small", variant: "primary", forcePx: params.forcePx }) }}
|
|
38
36
|
{% endset %}
|
|
39
37
|
|
|
40
|
-
{
|
|
41
|
-
{% set
|
|
38
|
+
{%- if params.loading %}
|
|
39
|
+
{% set additionalClasses = (additionalClasses.push("ds-loading"), additionalClasses) %}
|
|
42
40
|
{% endif %}
|
|
43
41
|
|
|
44
|
-
{
|
|
45
|
-
{% set
|
|
42
|
+
{%- if params.classNames %}
|
|
43
|
+
{% set additionalClasses = (additionalClasses.push(params.classNames), additionalClasses) %}
|
|
46
44
|
{% endif%}
|
|
47
45
|
|
|
48
|
-
{
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
<div class="{{ componentClassName + '__inner'}}">
|
|
46
|
+
{%- set classes = componentClassName + " " + additionalClasses | join(" ") %}
|
|
47
|
+
{%- if params.href %}
|
|
48
|
+
<a href="{{ params.href | default('#', true) }}" {{ ariaLabel | safe }} class="{{ classes }}" {{- attributes | safe }}>
|
|
49
|
+
<span class="{{ componentClassName + '__inner'}}" aria-hidden="true">
|
|
53
50
|
<span class="ds-text-btn__text">{{ text }}</span>
|
|
54
51
|
{{- iconSvg | safe if iconSvg -}} {{ loadingHtml | safe }}
|
|
55
|
-
</
|
|
52
|
+
</span>
|
|
56
53
|
</a>
|
|
57
|
-
{
|
|
58
|
-
<button type="{{ params.type | default('button') }}" class="{{ classes }}" {{ "disabled" if params.disabled }} {{- attributes | safe }}>
|
|
59
|
-
<
|
|
54
|
+
{%- else %}
|
|
55
|
+
<button type="{{ params.type | default('button') }}" {{ ariaLabel | safe }} class="{{ classes }}" {{ "disabled" if params.disabled }} {{- attributes | safe }}>
|
|
56
|
+
<span class="{{ componentClassName + '__inner' }}" aria-hidden="true">
|
|
60
57
|
<span class="ds-text-btn__text">{{ text }}</span>
|
|
61
58
|
{{- iconSvg | safe if iconSvg -}} {{ loadingHtml | safe }}
|
|
62
|
-
</
|
|
59
|
+
</span>
|
|
63
60
|
</button>
|
|
64
61
|
{% endif %}
|
|
65
62
|
{% endmacro %}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
@use "../../foundations/helpers/
|
|
2
|
-
@use "
|
|
3
|
-
@use "../../foundations/helpers/mediaQueries.scss" as *;
|
|
4
|
-
@use "../../foundations/helpers/metrics.scss" as *;
|
|
5
|
-
@use "../../foundations/helpers/utilities.scss" as *;
|
|
6
|
-
@use "../../foundations/helpers/colors.scss" as *;
|
|
7
|
-
@use "../../foundations/helpers/loading.scss" as *;
|
|
8
|
-
@use "../../foundations/icons/icon.scss" as *;
|
|
1
|
+
@use "../../foundations/helpers/forward.helpers.scss" as *;
|
|
2
|
+
@use "../icon-sprite/icon-sprite.scss";
|
|
9
3
|
@use "../spinner/spinner.scss" as *;
|
|
10
4
|
|
|
11
5
|
$ds-text-btn__min-clickable-area: 0;
|
|
@@ -37,6 +31,10 @@ $ds-text-btn__icon-size: 24px;
|
|
|
37
31
|
padding: 0;
|
|
38
32
|
position: relative;
|
|
39
33
|
|
|
34
|
+
span {
|
|
35
|
+
pointer-events: none;
|
|
36
|
+
}
|
|
37
|
+
|
|
40
38
|
&:focus-visible {
|
|
41
39
|
outline: none;
|
|
42
40
|
.ds-text-btn__inner {
|
|
@@ -78,9 +76,12 @@ $ds-text-btn__icon-size: 24px;
|
|
|
78
76
|
}
|
|
79
77
|
}
|
|
80
78
|
|
|
81
|
-
|
|
82
|
-
|
|
79
|
+
@include ds-hover() {
|
|
80
|
+
&:hover:not(.ds-loading) .ds-text-btn__inner::before {
|
|
81
|
+
background-color: $ds-color-component-primary-overlay;
|
|
82
|
+
}
|
|
83
83
|
}
|
|
84
|
+
|
|
84
85
|
&:active:not(.ds-loading) .ds-text-btn__inner::before {
|
|
85
86
|
background-color: $ds-color-component-primary-overlay-02;
|
|
86
87
|
}
|
|
@@ -95,6 +96,7 @@ $ds-text-btn__icon-size: 24px;
|
|
|
95
96
|
&,
|
|
96
97
|
& .ds-text-btn__inner {
|
|
97
98
|
width: 100%;
|
|
99
|
+
box-sizing: border-box;
|
|
98
100
|
}
|
|
99
101
|
}
|
|
100
102
|
|
|
@@ -9,6 +9,8 @@ function dsTextButtonToggle(toggleElements = []) {
|
|
|
9
9
|
toggleEl.addEventListener("click", () => {
|
|
10
10
|
if (toggleEl.classList.contains("ds-text-btn-toggle--disabled")) return;
|
|
11
11
|
toggleEl.classList.toggle("ds-text-btn-toggle--selected");
|
|
12
|
+
const ariaChecked = toggleEl.getAttribute("aria-checked") === "true" ? "false" : "true";
|
|
13
|
+
toggleEl.setAttribute("aria-checked", ariaChecked);
|
|
12
14
|
});
|
|
13
15
|
});
|
|
14
16
|
}
|
|
@@ -1,51 +1,48 @@
|
|
|
1
|
-
{% from '@bonniernews/dn-design-system-web/
|
|
1
|
+
{% from '@bonniernews/dn-design-system-web/components/icon-sprite/icon-sprite.njk' import IconUse %}
|
|
2
2
|
{% from '@bonniernews/dn-design-system-web/components/spinner/spinner.njk' import Spinner %}
|
|
3
|
+
{% from '@bonniernews/dn-design-system-web/njk-helpers/attributes.njk' import getAttributes %}
|
|
3
4
|
|
|
4
5
|
{% macro TextButtonToggle(params) %}
|
|
5
6
|
{% set componentClassName = "ds-text-btn-toggle" %}
|
|
6
7
|
{% set classNamePrefix = componentClassName + "--" %}
|
|
7
|
-
{
|
|
8
|
-
{
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
{% if params.selected %}
|
|
15
|
-
{% set variant = (variant.push(classNamePrefix + "selected"), variant) %}
|
|
8
|
+
{%- set additionalClasses = [] %}
|
|
9
|
+
{%- set attributes = getAttributes(params.attributes) %}
|
|
10
|
+
{%- set ariaLabel = 'aria-label="' + params.text + '"' if not params.attributes["aria-label"] else "" %}
|
|
11
|
+
|
|
12
|
+
{%- if params.selected %}
|
|
13
|
+
{% set additionalClasses = (additionalClasses.push(classNamePrefix + "selected"), additionalClasses) %}
|
|
16
14
|
{% endif %}
|
|
17
15
|
|
|
18
|
-
{
|
|
19
|
-
{% set
|
|
16
|
+
{%- if params.forcePx %}
|
|
17
|
+
{% set additionalClasses = (additionalClasses.push("ds-force-px"), additionalClasses) %}
|
|
20
18
|
{% endif %}
|
|
21
19
|
|
|
22
|
-
{
|
|
23
|
-
{% set
|
|
20
|
+
{%- if params.condensed %}
|
|
21
|
+
{% set additionalClasses = (additionalClasses.push(classNamePrefix + "condensed"), additionalClasses) %}
|
|
24
22
|
{% endif %}
|
|
25
23
|
|
|
26
|
-
{
|
|
27
|
-
{{ Spinner({ size: "small",
|
|
28
|
-
{
|
|
24
|
+
{%- set loadingHtml %}
|
|
25
|
+
{{ Spinner({ size: "small", additionalClasses: "primary", forcePx: params.forcePx }) }}
|
|
26
|
+
{%- endset %}
|
|
29
27
|
|
|
30
|
-
{
|
|
31
|
-
{% set
|
|
28
|
+
{%- if params.loading %}
|
|
29
|
+
{% set additionalClasses = (additionalClasses.push("ds-loading"), additionalClasses) %}
|
|
32
30
|
{% endif %}
|
|
33
31
|
|
|
34
|
-
{
|
|
35
|
-
{% set
|
|
32
|
+
{%- if params.classNames %}
|
|
33
|
+
{% set additionalClasses = (additionalClasses.push(params.classNames), additionalClasses) %}
|
|
36
34
|
{% endif%}
|
|
37
35
|
|
|
38
|
-
{
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
<
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
</div>
|
|
36
|
+
{%- set classes = componentClassName + " " + additionalClasses | join(" ") %}
|
|
37
|
+
<button type="{{ params.type | default('button') }}" role="switch" {{ ariaLabel | safe }} aria-checked="{{ "true" if params.selected else "false" }}" class="{{ classes }}" {{ "disabled" if params.disabled }} {{- attributes | safe }}>
|
|
38
|
+
<span class="{{ componentClassName + '__inner' }}" aria-hidden="true">
|
|
39
|
+
<span class="{{ componentClassName + '__off' }}">
|
|
40
|
+
{{ IconUse({ icon: params.iconName }) }} <span class="{{ componentClassName + '__text'}}">{{ params.text }}</span>
|
|
41
|
+
</span>
|
|
42
|
+
<span class="{{ componentClassName + '__on' }}">
|
|
43
|
+
{{ IconUse({ icon: params.selectedIconName }) }} <span class="{{ componentClassName + '__text' }}">{{ params.selectedText }}</span>
|
|
44
|
+
</span>
|
|
45
|
+
{{ loadingHtml | safe }}
|
|
46
|
+
</span>
|
|
50
47
|
</button>
|
|
51
48
|
{% endmacro %}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
@use "../../foundations/helpers/
|
|
2
|
-
@use "
|
|
3
|
-
@use "../../foundations/helpers/mediaQueries.scss" as *;
|
|
4
|
-
@use "../../foundations/helpers/metrics.scss" as *;
|
|
5
|
-
@use "../../foundations/helpers/utilities.scss" as *;
|
|
6
|
-
@use "../../foundations/helpers/colors.scss" as *;
|
|
7
|
-
@use "../../foundations/helpers/loading.scss" as *;
|
|
8
|
-
@use "../../foundations/icons/icon.scss" as *;
|
|
1
|
+
@use "../../foundations/helpers/forward.helpers.scss" as *;
|
|
2
|
+
@use "../icon-sprite/icon-sprite.scss";
|
|
9
3
|
@use "../spinner/spinner.scss" as *;
|
|
10
4
|
|
|
11
5
|
$ds-text-btn-toggle__min-clickable-area: 0;
|
|
@@ -37,6 +31,10 @@ $ds-text-btn-toggle__icon-size: 24px;
|
|
|
37
31
|
padding: 0;
|
|
38
32
|
position: relative;
|
|
39
33
|
|
|
34
|
+
span {
|
|
35
|
+
pointer-events: none;
|
|
36
|
+
}
|
|
37
|
+
|
|
40
38
|
&:focus-visible {
|
|
41
39
|
outline: none;
|
|
42
40
|
.ds-text-btn-toggle__inner {
|
|
@@ -98,8 +96,10 @@ $ds-text-btn-toggle__icon-size: 24px;
|
|
|
98
96
|
}
|
|
99
97
|
}
|
|
100
98
|
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
@include ds-hover() {
|
|
100
|
+
&:hover:not(.ds-loading) .ds-text-btn-toggle__inner::before {
|
|
101
|
+
background-color: $ds-color-component-primary-overlay;
|
|
102
|
+
}
|
|
103
103
|
}
|
|
104
104
|
&:active:not(.ds-loading) .ds-text-btn-toggle__inner::before {
|
|
105
105
|
background-color: $ds-color-component-primary-overlay-02;
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
@use "../../foundations/helpers/
|
|
2
|
-
@use "../../
|
|
3
|
-
@use "
|
|
4
|
-
@use "../../foundations/helpers/typography.scss" as *;
|
|
5
|
-
@use "../../foundations/helpers/colors.scss" as *;
|
|
6
|
-
@use "../../assets/form-field/form-field.scss" as *;
|
|
7
|
-
@use "../../foundations/icons/icon.scss" as *;
|
|
8
|
-
@use "../icon-button/icon-button.scss" as *;
|
|
1
|
+
@use "../../foundations/helpers/forward.helpers.scss" as *;
|
|
2
|
+
@use "../../assets/form-field/form-field.scss";
|
|
3
|
+
@use "../icon-button/icon-button.scss";
|
|
9
4
|
|
|
10
5
|
$ds-text-input-toggle-btn__width: 32px;
|
|
11
6
|
$ds-text-input-toggle-btn__area: (
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{% from '@bonniernews/dn-design-system-web/njk-helpers/attributes.njk' import getAttributes %}
|
|
2
|
+
{% from '@bonniernews/dn-design-system-web/foundations/a11y/visually-hidden.njk' import VisuallyHidden %}
|
|
2
3
|
|
|
3
4
|
{% macro VideoCaption(params) %}
|
|
4
5
|
{%- set componentClassName = "ds-video-caption" %}
|
|
@@ -12,13 +13,18 @@
|
|
|
12
13
|
{% endif%}
|
|
13
14
|
{%- set classes = componentClassName + " " + additionalClasses | join(" ") %}
|
|
14
15
|
<figcaption class="{{ classes }}" {{- attributes | safe }}>
|
|
15
|
-
{%- if params.duration
|
|
16
|
-
<span class="{{ componentClassName + '__duration'}}">
|
|
16
|
+
{%- if params.duration -%}
|
|
17
|
+
<span class="{{ componentClassName + '__duration'}}" aria-hidden="true">
|
|
17
18
|
{{- params.duration -}}
|
|
18
19
|
</span>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
{
|
|
20
|
+
{{ VisuallyHidden({
|
|
21
|
+
text: "Videon är " + params.duration + " lång."
|
|
22
|
+
})}}
|
|
23
|
+
{%- endif %}
|
|
24
|
+
{% if params.caption -%}
|
|
25
|
+
<span class="{{ componentClassName + '__text'}}">
|
|
26
|
+
{{- params.caption -}}
|
|
27
|
+
</span>
|
|
28
|
+
{% endif -%}
|
|
23
29
|
</figcaption>
|
|
24
30
|
{% endmacro %}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
- GitHub: [BonnierNews/dn-design-system/../web/src/components/vip-badge](https://github.com/BonnierNews/dn-design-system/tree/main/web/src/components/vip-badge)
|
|
2
|
+
- Storybook (PROD): [VipBadge > Web > Vip Badge](https://designsystem.dn.se/?path=/story/components-app-web-section-components-vipbadge-web)
|
|
3
|
+
- Storybook (LATEST): [VipBadge > Web > Vip Badge With Text](https://designsystem-latest.dn.se/?path=/story/components-app-web-section-components-vipbadge-web)
|
|
4
|
+
|
|
5
|
+
----
|
|
6
|
+
|
|
7
|
+
# VipBadge
|
|
8
|
+
|
|
9
|
+
## Parameters
|
|
10
|
+
|
|
11
|
+
|parameter | type | required | options | default | description |
|
|
12
|
+
|:--- | :--- | :--- | :--- | :--- | :--- |
|
|
13
|
+
|showText | bool | no | | false | By default only icon is shown |
|
|
14
|
+
|attributes | Object | no | | | Ex. { target: "_blank", "data-test": "lorem ipsum" } |
|
|
15
|
+
|classNames | String | no | | | Ex. "my-special-class" |
|
|
16
|
+
|forcePx | bool | no | true, false | false | Fixed pixel value is used for typography to prevent scaling based on html font-size |
|
|
17
|
+
|
|
18
|
+
## Minimum requirement example
|
|
19
|
+
|
|
20
|
+
### Nunjucks
|
|
21
|
+
|
|
22
|
+
These are copy paste friendly examples to quickliy get started using a component.
|
|
23
|
+
|
|
24
|
+
```html
|
|
25
|
+
{% from '@bonniernews/dn-design-system-web/components/vip-badge/vip-badge.njk' import VipBadge %}
|
|
26
|
+
|
|
27
|
+
{{ VipBadge({
|
|
28
|
+
showText: true
|
|
29
|
+
})}}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### SCSS
|
|
33
|
+
```scss
|
|
34
|
+
@use "@bonniernews/dn-design-system-web/components/vip-badge/vip-badge" as *;
|
|
35
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{% from '@bonniernews/dn-design-system-web/components/icon-sprite/icon-sprite.njk' import IconUse %}
|
|
2
|
+
{% from '@bonniernews/dn-design-system-web/njk-helpers/attributes.njk' import getAttributes %}
|
|
3
|
+
|
|
4
|
+
{% macro VipBadge(params) %}
|
|
5
|
+
{%- set componentClassName = "ds-vip-badge" %}
|
|
6
|
+
{%- set classNamePrefix = componentClassName + "--" %}
|
|
7
|
+
{%- set additionalClasses = [] %}
|
|
8
|
+
{%- set attributes = getAttributes(params.attributes) %}
|
|
9
|
+
{%- if params.classNames %}
|
|
10
|
+
{% set additionalClasses = (additionalClasses.push(params.classNames), additionalClasses) %}
|
|
11
|
+
{% endif %}
|
|
12
|
+
{%- if params.showText %}
|
|
13
|
+
{% set additionalClasses = (additionalClasses.push(classNamePrefix + "text"), additionalClasses) %}
|
|
14
|
+
{% endif%}
|
|
15
|
+
{%- if params.forcePx %}
|
|
16
|
+
{% set additionalClasses = (additionalClasses.push("ds-force-px"), additionalClasses) %}
|
|
17
|
+
{% endif %}
|
|
18
|
+
{%- set classes = componentClassName + " " + additionalClasses | join(" ") %}
|
|
19
|
+
<div class="{{ classes }}" {{- attributes | safe }} aria-hidden="true">
|
|
20
|
+
{{ IconUse({ icon: 'vip' | safe }) }}
|
|
21
|
+
{{ "För dig som prenumererar" if params.showText else "" }}
|
|
22
|
+
</div>
|
|
23
|
+
{% endmacro %}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
@use "../../foundations/helpers/forward.helpers.scss" as *;
|
|
2
|
+
@use "../icon-sprite/icon-sprite.scss";
|
|
3
|
+
|
|
4
|
+
$ds-vip-badge__icon-size: 16px;
|
|
5
|
+
|
|
6
|
+
.ds-vip-badge {
|
|
7
|
+
display: none;
|
|
8
|
+
align-items: center;
|
|
9
|
+
box-sizing: content-box;
|
|
10
|
+
border-radius: ds-px-to-rem(ds-metrics-border-radius(x1)) 0
|
|
11
|
+
ds-px-to-rem(ds-metrics-border-radius(x1))
|
|
12
|
+
ds-px-to-rem(ds-metrics-border-radius(x1));
|
|
13
|
+
background-color: $ds-color-component-business;
|
|
14
|
+
color: $ds-color-static-white;
|
|
15
|
+
fill: $ds-color-static-white;
|
|
16
|
+
@include ds-typography($ds-typography-functional-meta01regular);
|
|
17
|
+
padding: ds-px-to-rem(ds-spacing-component($ds-sc-x1));
|
|
18
|
+
|
|
19
|
+
@at-root .ds-force-px#{&} {
|
|
20
|
+
@include ds-typography($ds-typography-functional-meta01regular, true);
|
|
21
|
+
border-radius: ds-metrics-border-radius(x1) 0 ds-metrics-border-radius(x1)
|
|
22
|
+
ds-metrics-border-radius(x1);
|
|
23
|
+
padding: ds-spacing-component($ds-sc-x1);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// bang class indicating that the user has premium access
|
|
27
|
+
.dn-premium & {
|
|
28
|
+
display: inline-flex;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.ds-icon {
|
|
32
|
+
height: ds-px-to-rem($ds-vip-badge__icon-size);
|
|
33
|
+
width: ds-px-to-rem($ds-vip-badge__icon-size);
|
|
34
|
+
@at-root .ds-force-px#{&} {
|
|
35
|
+
height: $ds-vip-badge__icon-size;
|
|
36
|
+
width: $ds-vip-badge__icon-size;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.ds-vip-badge--text {
|
|
42
|
+
padding: ds-px-to-rem(ds-spacing-component($ds-sc-x1))
|
|
43
|
+
ds-px-to-rem(ds-spacing-component($ds-sc-x2));
|
|
44
|
+
@at-root .ds-force-px#{&} {
|
|
45
|
+
padding: ds-spacing-component($ds-sc-x1 $ds-sc-x2);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.ds-icon {
|
|
49
|
+
margin-right: ds-px-to-rem(ds-spacing-component($ds-sc-x1));
|
|
50
|
+
@at-root .ds-force-px#{&} {
|
|
51
|
+
margin-right: ds-spacing-component($ds-sc-x1);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
package/foundations/colors.scss
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
@use 'sass:string';
|
|
3
3
|
@use './variables/colorsDnLightTokens';
|
|
4
4
|
@use './variables/colorsDnDarkTokens';
|
|
5
|
+
@use './helpers/colors.scss' as *;
|
|
5
6
|
|
|
6
7
|
html,
|
|
7
8
|
.ds-light {
|
|
@@ -25,4 +26,34 @@ html,
|
|
|
25
26
|
@each $name, $value in meta.module-variables("colorsDnDarkTokens") {
|
|
26
27
|
--ds-color-#{string.slice($name, 13)}: #{$value};
|
|
27
28
|
}
|
|
29
|
+
|
|
30
|
+
// these are not static so needs to be defined here also
|
|
31
|
+
--ds-theme-color: #{$ds-color-component-brand};
|
|
32
|
+
.ds-theme--nyheter {
|
|
33
|
+
--ds-theme-color: #{$ds-color-component-brand};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
html {
|
|
38
|
+
--ds-theme-color: #{$ds-color-component-brand};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.ds-theme--nyheter {
|
|
42
|
+
--ds-theme-color: #{$ds-color-component-brand};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.ds-theme--ekonomi {
|
|
46
|
+
--ds-theme-color: #{$ds-color-static-economy};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.ds-theme--kultur {
|
|
50
|
+
--ds-theme-color: #{$ds-color-static-kultur};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.ds-theme--sport {
|
|
54
|
+
--ds-theme-color: #{$ds-color-static-sport};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.ds-theme--sthlm {
|
|
58
|
+
--ds-theme-color: #{$ds-color-static-sthlm};
|
|
28
59
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
@use "mediaQueries.scss" as *;
|
|
2
|
+
@use "colors.scss" as *;
|
|
3
|
+
@use "metrics.scss" as *;
|
|
2
4
|
|
|
3
5
|
@mixin ds-hover($includeSelector: false) {
|
|
4
6
|
@include ds-mq-smallest-breakpoint(desktop, "and (hover: hover)") {
|
|
@@ -11,3 +13,15 @@
|
|
|
11
13
|
}
|
|
12
14
|
}
|
|
13
15
|
}
|
|
16
|
+
|
|
17
|
+
@mixin ds-teaser-focus($offset: 2px, $includeSelector: true) {
|
|
18
|
+
@if $includeSelector {
|
|
19
|
+
&:focus-visible {
|
|
20
|
+
outline: ds-metrics-border-width(x2) solid $ds-color-border-focus-02;
|
|
21
|
+
outline-offset: $offset;
|
|
22
|
+
}
|
|
23
|
+
} @else {
|
|
24
|
+
outline: ds-metrics-border-width(x2) solid $ds-color-border-focus-02;
|
|
25
|
+
outline-offset: $offset;
|
|
26
|
+
}
|
|
27
|
+
}
|