@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.
Files changed (125) hide show
  1. package/CHANGELOG.md +641 -0
  2. package/assets/article-image/article-image.njk +11 -10
  3. package/assets/article-image/article-image.scss +1 -15
  4. package/assets/form-field/form-field.njk +2 -2
  5. package/assets/form-field/form-field.scss +2 -6
  6. package/assets/teaser/dot-or-grade.njk +7 -0
  7. package/assets/teaser/teaser.scss +94 -0
  8. package/components/article-body-image/README.md +2 -2
  9. package/components/article-body-image/article-body-image.njk +1 -5
  10. package/components/article-top-image/README.md +2 -2
  11. package/components/article-top-image/article-top-image.njk +1 -5
  12. package/components/article-top-image/article-top-image.scss +1 -1
  13. package/components/badge/badge.scss +1 -5
  14. package/components/buddy-menu/buddy-menu.scss +1 -8
  15. package/components/button/button.njk +38 -43
  16. package/components/button/button.scss +6 -1
  17. package/components/button-toggle/button-toggle.js +2 -0
  18. package/components/button-toggle/button-toggle.njk +36 -36
  19. package/components/button-toggle/button-toggle.scss +6 -1
  20. package/components/byline/byline.njk +2 -2
  21. package/components/byline/byline.scss +1 -3
  22. package/components/checkbox/checkbox.njk +3 -3
  23. package/components/checkbox/checkbox.scss +8 -9
  24. package/components/disclaimer/disclaimer.njk +2 -2
  25. package/components/disclaimer/disclaimer.scss +23 -10
  26. package/components/factbox/README.md +2 -2
  27. package/components/factbox/factbox.njk +12 -24
  28. package/components/factbox/factbox.scss +16 -51
  29. package/components/footer/footer.scss +2 -8
  30. package/components/icon-button/README.md +2 -1
  31. package/components/icon-button/icon-button.njk +4 -4
  32. package/components/icon-button/icon-button.scss +5 -2
  33. package/components/icon-button-toggle/icon-button-toggle.js +2 -0
  34. package/components/icon-button-toggle/icon-button-toggle.njk +28 -36
  35. package/components/icon-button-toggle/icon-button-toggle.scss +5 -2
  36. package/components/icon-sprite/README.md +51 -0
  37. package/components/icon-sprite/icon-sprite.njk +12 -0
  38. package/components/icon-sprite/icon-sprite.scss +12 -0
  39. package/components/icon-with-wrapper/README.md +9 -2
  40. package/components/icon-with-wrapper/icon-with-wrapper.njk +2 -2
  41. package/components/icon-with-wrapper/icon-with-wrapper.scss +2 -1
  42. package/components/image-caption/README.md +38 -0
  43. package/components/image-caption/image-caption.njk +36 -0
  44. package/components/image-caption/image-caption.scss +25 -0
  45. package/components/list-item/list-item.njk +5 -5
  46. package/components/list-item/list-item.scss +1 -3
  47. package/components/pictogram/README.md +39 -0
  48. package/components/pictogram/pictogram.njk +30 -0
  49. package/components/pictogram/pictogram.scss +54 -0
  50. package/components/quote/README.md +1 -2
  51. package/components/quote/quote.njk +6 -8
  52. package/components/quote/quote.scss +1 -14
  53. package/components/radio-button/radio-button.njk +3 -3
  54. package/components/radio-button/radio-button.scss +8 -10
  55. package/components/spinner/spinner.njk +19 -23
  56. package/components/spinner/spinner.scss +4 -1
  57. package/components/teaser-dot/README.md +34 -0
  58. package/components/teaser-dot/teaser-dot.njk +24 -0
  59. package/components/teaser-dot/teaser-dot.scss +39 -0
  60. package/components/teaser-image/README.md +40 -0
  61. package/components/teaser-image/teaser-image.njk +21 -0
  62. package/components/teaser-image/teaser-image.scss +21 -0
  63. package/components/teaser-large/README.md +52 -0
  64. package/components/teaser-large/teaser-large.njk +93 -0
  65. package/components/teaser-large/teaser-large.scss +165 -0
  66. package/components/teaser-onsite/README.md +53 -0
  67. package/components/teaser-onsite/teaser-onsite.njk +45 -0
  68. package/components/teaser-onsite/teaser-onsite.scss +35 -0
  69. package/components/teaser-package/README.md +42 -0
  70. package/components/teaser-package/teaser-package.njk +36 -0
  71. package/components/teaser-package/teaser-package.scss +119 -0
  72. package/components/teaser-right-now/README.md +37 -0
  73. package/components/teaser-right-now/teaser-right-now.njk +29 -0
  74. package/components/teaser-right-now/teaser-right-now.scss +57 -0
  75. package/components/teaser-slideshow/README.md +42 -0
  76. package/components/teaser-slideshow/teaser-slideshow.njk +38 -0
  77. package/components/teaser-slideshow/teaser-slideshow.scss +37 -0
  78. package/components/teaser-split/README-container.md +40 -0
  79. package/components/teaser-split/README.md +49 -0
  80. package/components/teaser-split/teaser-split.njk +93 -0
  81. package/components/teaser-split/teaser-split.scss +85 -0
  82. package/components/teaser-standard/README.md +50 -0
  83. package/components/teaser-standard/teaser-standard.njk +81 -0
  84. package/components/teaser-standard/teaser-standard.scss +38 -0
  85. package/components/teaser-tipsa/README.md +41 -0
  86. package/components/teaser-tipsa/teaser-tipsa.njk +31 -0
  87. package/components/teaser-tipsa/teaser-tipsa.scss +22 -0
  88. package/components/text-button/text-button.njk +34 -37
  89. package/components/text-button/text-button.scss +12 -10
  90. package/components/text-button-toggle/text-button-toggle.js +2 -0
  91. package/components/text-button-toggle/text-button-toggle.njk +30 -33
  92. package/components/text-button-toggle/text-button-toggle.scss +10 -10
  93. package/components/text-input/text-input.scss +3 -8
  94. package/components/video-caption/README.md +1 -1
  95. package/components/video-caption/video-caption.njk +12 -6
  96. package/components/vip-badge/README.md +35 -0
  97. package/components/vip-badge/vip-badge.njk +23 -0
  98. package/components/vip-badge/vip-badge.scss +54 -0
  99. package/foundations/colors.scss +31 -0
  100. package/foundations/helpers/README-links.md +1 -1
  101. package/foundations/helpers/colors.scss +2 -0
  102. package/foundations/helpers/hover.scss +14 -0
  103. package/foundations/helpers/links.scss +15 -7
  104. package/foundations/icons/grade-icon.njk +50 -11
  105. package/foundations/icons/icon.njk +167 -143
  106. package/foundations/icons/sprite.njk +1 -0
  107. package/foundations/icons/sprite.svg +1 -0
  108. package/foundations/icons/svg/download.svg +3 -0
  109. package/foundations/icons/svg/filter_list.svg +3 -0
  110. package/foundations/icons/svg/pause.svg +3 -0
  111. package/foundations/icons/svg/vip.svg +3 -0
  112. package/foundations/typography/fontDefinitions.scss +82 -67
  113. package/foundations/variables/colorsCssVariables.scss +6 -0
  114. package/foundations/variables/colorsDnDarkTokens.scss +7 -1
  115. package/foundations/variables/colorsDnLightTokens.scss +8 -2
  116. package/foundations/variables/spacingLayout.scss +6 -1
  117. package/foundations/variables/spacingLayoutLargeScreen.scss +5 -0
  118. package/foundations/variables/spacingLayoutList.scss +5 -0
  119. package/foundations/variables/typographyTokensList.scss +1 -0
  120. package/foundations/variables/typographyTokensScreenLarge.scss +131 -123
  121. package/foundations/variables/typographyTokensScreenSmall.scss +122 -114
  122. package/package.json +2 -2
  123. package/tokens/colors-css-variables.json +6 -0
  124. package/tokens/spacing-layout-list.json +6 -1
  125. 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/foundations/icons/icon.njk' import Icon %}
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
- {% set componentClassName = "ds-text-btn" %}
6
- {% set classNamePrefix = componentClassName + "--" %}
7
- {% set variant = [] %}
8
- {% set text = params.text %}
9
- {% set attributes %}
10
- {% for attribute, value in params.attributes %}
11
- {{attribute}}="{{value}}"
12
- {% endfor %}
13
- {% endset %}
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
- {% if params.fullWidth %}
20
- {% set variant = (variant.push(classNamePrefix + "full-width"), variant) %}
17
+ {%- if params.fullWidth %}
18
+ {% set additionalClasses = (additionalClasses.push(classNamePrefix + "full-width"), additionalClasses) %}
21
19
  {% endif %}
22
20
 
23
- {% if params.condensed and not params.fullWidth %}
24
- {% set variant = (variant.push(classNamePrefix + "condensed"), variant) %}
21
+ {%- if params.condensed and not params.fullWidth %}
22
+ {% set additionalClasses = (additionalClasses.push(classNamePrefix + "condensed"), additionalClasses) %}
25
23
  {% endif %}
26
24
 
27
- {% if params.mobile and params.mobile.fullWidth %}
28
- {% set variant = (variant.push(classNamePrefix + "mobile-full-width"), variant) %}
25
+ {%- if params.mobile and params.mobile.fullWidth %}
26
+ {% set additionalClasses = (additionalClasses.push(classNamePrefix + "mobile-full-width"), additionalClasses) %}
29
27
  {% endif %}
30
28
 
31
- {% if params.iconName and params.iconPosition and params.iconPosition != "none" %}
32
- {% set variant = (variant.push(classNamePrefix + "icon" + "-" + params.iconPosition ), variant) %}
33
- {% set iconSvg = Icon({ icon: params.iconName }) %}
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
- {% set loadingHtml %}
34
+ {%- set loadingHtml %}
37
35
  {{ Spinner({ size: "small", variant: "primary", forcePx: params.forcePx }) }}
38
36
  {% endset %}
39
37
 
40
- {% if params.loading %}
41
- {% set variant = (variant.push("ds-loading"), variant) %}
38
+ {%- if params.loading %}
39
+ {% set additionalClasses = (additionalClasses.push("ds-loading"), additionalClasses) %}
42
40
  {% endif %}
43
41
 
44
- {% if params.classNames %}
45
- {% set variant = (variant.push(params.classNames), variant) %}
42
+ {%- if params.classNames %}
43
+ {% set additionalClasses = (additionalClasses.push(params.classNames), additionalClasses) %}
46
44
  {% endif%}
47
45
 
48
- {% set classes = componentClassName + " " + variant | join(" ") %}
49
-
50
- {% if params.href %}
51
- <a href="{{ params.href | default('#', true) }}" class="{{ classes }}" {{- attributes | safe }}>
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
- </div>
52
+ </span>
56
53
  </a>
57
- {% else %}
58
- <button type="{{ params.type | default('button') }}" class="{{ classes }}" {{ "disabled" if params.disabled }} {{- attributes | safe }}>
59
- <div class="{{ componentClassName + '__inner'}}">
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
- </div>
59
+ </span>
63
60
  </button>
64
61
  {% endif %}
65
62
  {% endmacro %}
@@ -1,11 +1,5 @@
1
- @use "../../foundations/helpers/spacing.scss" as *;
2
- @use "../../foundations/helpers/typography.scss" as *;
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
- &:hover:not(.ds-loading) .ds-text-btn__inner::before {
82
- background-color: $ds-color-component-primary-overlay;
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/foundations/icons/icon.njk' import Icon %}
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
- {% set variant = [] %}
8
- {% set attributes %}
9
- {% for attribute, value in params.attributes %}
10
- {{attribute}}="{{value}}"
11
- {% endfor %}
12
- {% endset %}
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
- {% if params.forcePx %}
19
- {% set variant = (variant.push("ds-force-px"), variant) %}
16
+ {%- if params.forcePx %}
17
+ {% set additionalClasses = (additionalClasses.push("ds-force-px"), additionalClasses) %}
20
18
  {% endif %}
21
19
 
22
- {% if params.condensed %}
23
- {% set variant = (variant.push(classNamePrefix + "condensed"), variant) %}
20
+ {%- if params.condensed %}
21
+ {% set additionalClasses = (additionalClasses.push(classNamePrefix + "condensed"), additionalClasses) %}
24
22
  {% endif %}
25
23
 
26
- {% set loadingHtml %}
27
- {{ Spinner({ size: "small", variant: "primary", forcePx: params.forcePx }) }}
28
- {% endset %}
24
+ {%- set loadingHtml %}
25
+ {{ Spinner({ size: "small", additionalClasses: "primary", forcePx: params.forcePx }) }}
26
+ {%- endset %}
29
27
 
30
- {% if params.loading %}
31
- {% set variant = (variant.push("ds-loading"), variant) %}
28
+ {%- if params.loading %}
29
+ {% set additionalClasses = (additionalClasses.push("ds-loading"), additionalClasses) %}
32
30
  {% endif %}
33
31
 
34
- {% if params.classNames %}
35
- {% set variant = (variant.push(params.classNames), variant) %}
32
+ {%- if params.classNames %}
33
+ {% set additionalClasses = (additionalClasses.push(params.classNames), additionalClasses) %}
36
34
  {% endif%}
37
35
 
38
- {% set classes = componentClassName + " " + variant | join(" ") %}
39
-
40
- <button type="{{ params.type | default('button') }}" class="{{ classes }}" {{ "disabled" if params.disabled }} {{- attributes | safe }}>
41
- <div class="{{ componentClassName + '__inner'}}">
42
- <div class="{{ componentClassName + '__off'}}">
43
- {{ Icon({ icon: params.iconName }) }} <span class="{{ componentClassName + '__text'}}">{{ params.text }}</span>
44
- </div>
45
- <div class="{{ componentClassName + '__on'}}">
46
- {{ Icon({ icon: params.selectedIconName }) }} <span class="{{ componentClassName + '__text'}}">{{ params.selectedText }}</span>
47
- </div>
48
- {{ loadingHtml | safe }}
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/spacing.scss" as *;
2
- @use "../../foundations/helpers/typography.scss" as *;
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
- &:hover:not(.ds-loading) .ds-text-btn-toggle__inner::before {
102
- background-color: $ds-color-component-primary-overlay;
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/spacing.scss" as *;
2
- @use "../../foundations/helpers/metrics.scss" as *;
3
- @use "../../foundations/helpers/utilities.scss" as *;
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: (
@@ -27,7 +27,7 @@ These are copy paste friendly examples to quickliy get started using a component
27
27
 
28
28
  {{ VideoCaption({
29
29
  caption: "Tre år har gått sedan terrordåden i Paris.",
30
- duration: "47 sek."
30
+ duration: "47 sek"
31
31
  }) }}
32
32
  ```
33
33
 
@@ -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
- {% endif %}
20
- {%- if params.caption %}
21
- {{- params.caption -}}
22
- {% endif %}
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
+ }
@@ -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
  }
@@ -15,7 +15,7 @@
15
15
 
16
16
  ### SCSS
17
17
  ```scss
18
- @use "@bonniernews/dn-design-system-web/foundations/helpers/links.scss" as *;
18
+ @use "@bonniernews/dn-design-system-web/foundations/helpers/forward.helpers.scss" as *;
19
19
 
20
20
  a {
21
21
  @include ds-link($ds-link-paragraph);
@@ -1 +1,3 @@
1
1
  @forward '../variables/colorsCssVariables.scss';
2
+
3
+ $ds-theme-color: var(--ds-theme-color);
@@ -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
+ }