@dnb/eufemia 9.34.3 → 9.35.0

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 (142) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/cjs/components/breadcrumb/style/dnb-breadcrumb.css +6 -0
  3. package/cjs/components/breadcrumb/style/dnb-breadcrumb.min.css +1 -1
  4. package/cjs/components/global-status/style/dnb-global-status.css +6 -0
  5. package/cjs/components/global-status/style/dnb-global-status.min.css +1 -1
  6. package/cjs/components/section/Section.d.ts +2 -2
  7. package/cjs/components/section/style/_section.scss +8 -0
  8. package/cjs/components/section/style/dnb-section.css +6 -0
  9. package/cjs/components/section/style/dnb-section.min.css +1 -1
  10. package/cjs/components/space/Space.d.ts +0 -2
  11. package/cjs/components/space/Space.js +16 -10
  12. package/cjs/components/tabs/Tabs.d.ts +2 -2
  13. package/cjs/components/tabs/Tabs.js +6 -11
  14. package/cjs/components/tabs/TabsContentWrapper.d.ts +1 -1
  15. package/cjs/components/tabs/TabsContentWrapper.js +6 -4
  16. package/cjs/components/tabs/style/_tabs.scss +15 -2
  17. package/cjs/components/tabs/style/dnb-tabs.css +14 -2
  18. package/cjs/components/tabs/style/dnb-tabs.min.css +1 -1
  19. package/cjs/components/tabs/style/themes/dnb-tabs-theme-eiendom.css +3 -3
  20. package/cjs/components/tabs/style/themes/dnb-tabs-theme-eiendom.min.css +1 -1
  21. package/cjs/components/tabs/style/themes/dnb-tabs-theme-ui.css +3 -3
  22. package/cjs/components/tabs/style/themes/dnb-tabs-theme-ui.min.css +1 -1
  23. package/cjs/components/tabs/style/themes/dnb-tabs-theme-ui.scss +4 -1
  24. package/cjs/components/upload/Upload.js +14 -17
  25. package/cjs/components/upload/UploadFileInput.js +17 -22
  26. package/cjs/components/upload/UploadFileList.js +1 -0
  27. package/cjs/components/upload/UploadFileListCell.d.ts +2 -1
  28. package/cjs/components/upload/UploadFileListCell.js +65 -7
  29. package/cjs/components/upload/UploadVerify.d.ts +4 -1
  30. package/cjs/components/upload/UploadVerify.js +67 -1
  31. package/cjs/components/upload/style/themes/dnb-upload-theme-ui.css +16 -3
  32. package/cjs/components/upload/style/themes/dnb-upload-theme-ui.min.css +1 -1
  33. package/cjs/components/upload/style/themes/dnb-upload-theme-ui.scss +9 -0
  34. package/cjs/components/upload/types.d.ts +3 -1
  35. package/cjs/components/upload/useUpload.d.ts +1 -2
  36. package/cjs/components/upload/useUpload.js +19 -3
  37. package/cjs/shared/Eufemia.js +1 -1
  38. package/cjs/style/dnb-ui-components.css +20 -2
  39. package/cjs/style/dnb-ui-components.min.css +2 -2
  40. package/cjs/style/themes/theme-eiendom/dnb-theme-eiendom.css +22 -9
  41. package/cjs/style/themes/theme-eiendom/dnb-theme-eiendom.min.css +2 -2
  42. package/cjs/style/themes/theme-ui/dnb-theme-ui.css +19 -6
  43. package/cjs/style/themes/theme-ui/dnb-theme-ui.min.css +2 -2
  44. package/components/breadcrumb/style/dnb-breadcrumb.css +6 -0
  45. package/components/breadcrumb/style/dnb-breadcrumb.min.css +1 -1
  46. package/components/global-status/style/dnb-global-status.css +6 -0
  47. package/components/global-status/style/dnb-global-status.min.css +1 -1
  48. package/components/section/Section.d.ts +2 -2
  49. package/components/section/style/_section.scss +8 -0
  50. package/components/section/style/dnb-section.css +6 -0
  51. package/components/section/style/dnb-section.min.css +1 -1
  52. package/components/space/Space.d.ts +0 -2
  53. package/components/space/Space.js +15 -9
  54. package/components/tabs/Tabs.d.ts +2 -2
  55. package/components/tabs/Tabs.js +6 -11
  56. package/components/tabs/TabsContentWrapper.d.ts +1 -1
  57. package/components/tabs/TabsContentWrapper.js +5 -4
  58. package/components/tabs/style/_tabs.scss +15 -2
  59. package/components/tabs/style/dnb-tabs.css +14 -2
  60. package/components/tabs/style/dnb-tabs.min.css +1 -1
  61. package/components/tabs/style/themes/dnb-tabs-theme-eiendom.css +3 -3
  62. package/components/tabs/style/themes/dnb-tabs-theme-eiendom.min.css +1 -1
  63. package/components/tabs/style/themes/dnb-tabs-theme-ui.css +3 -3
  64. package/components/tabs/style/themes/dnb-tabs-theme-ui.min.css +1 -1
  65. package/components/tabs/style/themes/dnb-tabs-theme-ui.scss +4 -1
  66. package/components/upload/Upload.js +11 -15
  67. package/components/upload/UploadFileInput.js +16 -21
  68. package/components/upload/UploadFileList.js +1 -0
  69. package/components/upload/UploadFileListCell.d.ts +2 -1
  70. package/components/upload/UploadFileListCell.js +44 -3
  71. package/components/upload/UploadVerify.d.ts +4 -1
  72. package/components/upload/UploadVerify.js +27 -1
  73. package/components/upload/style/themes/dnb-upload-theme-ui.css +16 -3
  74. package/components/upload/style/themes/dnb-upload-theme-ui.min.css +1 -1
  75. package/components/upload/style/themes/dnb-upload-theme-ui.scss +9 -0
  76. package/components/upload/types.d.ts +3 -1
  77. package/components/upload/useUpload.d.ts +1 -2
  78. package/components/upload/useUpload.js +17 -3
  79. package/es/components/breadcrumb/style/dnb-breadcrumb.css +6 -0
  80. package/es/components/breadcrumb/style/dnb-breadcrumb.min.css +1 -1
  81. package/es/components/global-status/style/dnb-global-status.css +6 -0
  82. package/es/components/global-status/style/dnb-global-status.min.css +1 -1
  83. package/es/components/section/Section.d.ts +2 -2
  84. package/es/components/section/style/_section.scss +8 -0
  85. package/es/components/section/style/dnb-section.css +6 -0
  86. package/es/components/section/style/dnb-section.min.css +1 -1
  87. package/es/components/space/Space.d.ts +0 -2
  88. package/es/components/space/Space.js +15 -9
  89. package/es/components/tabs/Tabs.d.ts +2 -2
  90. package/es/components/tabs/Tabs.js +6 -11
  91. package/es/components/tabs/TabsContentWrapper.d.ts +1 -1
  92. package/es/components/tabs/TabsContentWrapper.js +5 -4
  93. package/es/components/tabs/style/_tabs.scss +15 -2
  94. package/es/components/tabs/style/dnb-tabs.css +14 -2
  95. package/es/components/tabs/style/dnb-tabs.min.css +1 -1
  96. package/es/components/tabs/style/themes/dnb-tabs-theme-eiendom.css +3 -3
  97. package/es/components/tabs/style/themes/dnb-tabs-theme-eiendom.min.css +1 -1
  98. package/es/components/tabs/style/themes/dnb-tabs-theme-ui.css +3 -3
  99. package/es/components/tabs/style/themes/dnb-tabs-theme-ui.min.css +1 -1
  100. package/es/components/tabs/style/themes/dnb-tabs-theme-ui.scss +4 -1
  101. package/es/components/upload/Upload.js +11 -13
  102. package/es/components/upload/UploadFileInput.js +13 -17
  103. package/es/components/upload/UploadFileList.js +1 -0
  104. package/es/components/upload/UploadFileListCell.d.ts +2 -1
  105. package/es/components/upload/UploadFileListCell.js +36 -2
  106. package/es/components/upload/UploadVerify.d.ts +4 -1
  107. package/es/components/upload/UploadVerify.js +12 -1
  108. package/es/components/upload/style/themes/dnb-upload-theme-ui.css +16 -3
  109. package/es/components/upload/style/themes/dnb-upload-theme-ui.min.css +1 -1
  110. package/es/components/upload/style/themes/dnb-upload-theme-ui.scss +9 -0
  111. package/es/components/upload/types.d.ts +3 -1
  112. package/es/components/upload/useUpload.d.ts +1 -2
  113. package/es/components/upload/useUpload.js +15 -3
  114. package/es/shared/Eufemia.js +1 -1
  115. package/es/style/dnb-ui-components.css +20 -2
  116. package/es/style/dnb-ui-components.min.css +2 -2
  117. package/es/style/themes/theme-eiendom/dnb-theme-eiendom.css +22 -9
  118. package/es/style/themes/theme-eiendom/dnb-theme-eiendom.min.css +2 -2
  119. package/es/style/themes/theme-ui/dnb-theme-ui.css +19 -6
  120. package/es/style/themes/theme-ui/dnb-theme-ui.min.css +2 -2
  121. package/esm/dnb-ui-lib.min.mjs +2 -2
  122. package/package.json +1 -1
  123. package/shared/Eufemia.js +1 -1
  124. package/style/dnb-ui-components.css +20 -2
  125. package/style/dnb-ui-components.min.css +2 -2
  126. package/style/themes/theme-eiendom/dnb-theme-eiendom.css +22 -9
  127. package/style/themes/theme-eiendom/dnb-theme-eiendom.min.css +2 -2
  128. package/style/themes/theme-ui/dnb-theme-ui.css +19 -6
  129. package/style/themes/theme-ui/dnb-theme-ui.min.css +2 -2
  130. package/umd/dnb-ui-lib.min.js +3 -3
  131. package/esm/dnb-ui-basis.min.mjs +0 -5
  132. package/esm/dnb-ui-components.min.mjs +0 -17
  133. package/esm/dnb-ui-elements.min.mjs +0 -16
  134. package/esm/dnb-ui-extensions.min.mjs +0 -17
  135. package/esm/dnb-ui-icons.min.mjs +0 -1
  136. package/esm/dnb-ui-web-components.min.mjs +0 -17
  137. package/umd/dnb-ui-basis.min.js +0 -12
  138. package/umd/dnb-ui-components.min.js +0 -24
  139. package/umd/dnb-ui-elements.min.js +0 -23
  140. package/umd/dnb-ui-extensions.min.js +0 -24
  141. package/umd/dnb-ui-icons.min.js +0 -1
  142. package/umd/dnb-ui-web-components.min.js +0 -24
@@ -2,7 +2,7 @@ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import _extends from "@babel/runtime/helpers/esm/extends";
3
3
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
4
4
  const _excluded = ["element", "no_collapse", "children", "innerRef"],
5
- _excluded2 = ["element", "inline", "no_collapse", "top", "right", "bottom", "left", "space", "stretch", "skeleton", "innerRef", "id", "className"];
5
+ _excluded2 = ["element", "inline", "no_collapse", "top", "right", "bottom", "left", "space", "stretch", "skeleton", "innerRef", "className"];
6
6
 
7
7
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
8
8
 
@@ -16,6 +16,7 @@ import Context from '../../shared/Context';
16
16
  import { spacingPropTypes } from './SpacingHelper';
17
17
  import { createSpacingClasses, isInline, spacingDefaultProps } from './SpacingUtils';
18
18
  import { skeletonDOMAttributes, createSkeletonClass } from '../skeleton/SkeletonHelper';
19
+ import Section from '../section/Section';
19
20
  export { spacingPropTypes };
20
21
 
21
22
  function Element(_ref) {
@@ -28,9 +29,18 @@ function Element(_ref) {
28
29
  props = _objectWithoutProperties(_ref, _excluded);
29
30
 
30
31
  const E = element;
31
- const component = React.createElement(E, _extends({}, props, {
32
- ref: innerRef
33
- }), children);
32
+ let component = null;
33
+
34
+ if (E === Section) {
35
+ component = React.createElement(E, _extends({}, props, {
36
+ inner_ref: innerRef
37
+ }), children);
38
+ } else {
39
+ validateDOMAttributes({}, props);
40
+ component = React.createElement(E, _extends({}, props, {
41
+ ref: innerRef
42
+ }), children);
43
+ }
34
44
 
35
45
  if (isTrue(no_collapse)) {
36
46
  const R = E === 'span' || isInline(Element) ? 'span' : 'div';
@@ -71,7 +81,6 @@ export default class Space extends React.PureComponent {
71
81
  stretch,
72
82
  skeleton,
73
83
  innerRef,
74
- id: _id,
75
84
  className
76
85
  } = _ref2,
77
86
  attributes = _objectWithoutProperties(_ref2, _excluded2);
@@ -89,7 +98,6 @@ export default class Space extends React.PureComponent {
89
98
  }, attributes);
90
99
 
91
100
  skeletonDOMAttributes(params, skeleton);
92
- validateDOMAttributes(this.props, params);
93
101
  return React.createElement(Element, _extends({
94
102
  element: element,
95
103
  no_collapse: no_collapse,
@@ -104,7 +112,6 @@ _defineProperty(Space, "tagName", 'dnb-space');
104
112
  _defineProperty(Space, "contextType", Context);
105
113
 
106
114
  _defineProperty(Space, "defaultProps", _objectSpread(_objectSpread({
107
- id: null,
108
115
  element: 'div',
109
116
  inline: null,
110
117
  no_collapse: null
@@ -117,8 +124,7 @@ _defineProperty(Space, "defaultProps", _objectSpread(_objectSpread({
117
124
  }));
118
125
 
119
126
  process.env.NODE_ENV !== "production" ? Space.propTypes = _objectSpread(_objectSpread({
120
- id: PropTypes.string,
121
- element: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
127
+ element: PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.node]),
122
128
  inline: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
123
129
  no_collapse: PropTypes.oneOfType([PropTypes.string, PropTypes.bool])
124
130
  }, spacingPropTypes), {}, {
@@ -83,7 +83,7 @@ export interface TabsProps extends React.HTMLProps<HTMLElement> {
83
83
  content_style?: string;
84
84
 
85
85
  /**
86
- * To modify the `spacing` onto the content wrapper. Use a supported modifier from the <a href="/uilib/components/section/properties">Section component</a>. Defaults to `true`.
86
+ * To modify the `spacing` onto the content wrapper. Use a supported modifier from the <a href="/uilib/components/section/properties">Section component</a>. Defaults to `large`.
87
87
  */
88
88
  content_spacing?: TabsContentSpacing;
89
89
  label?: string;
@@ -109,7 +109,7 @@ export interface TabsProps extends React.HTMLProps<HTMLElement> {
109
109
  tabs_style?: string;
110
110
 
111
111
  /**
112
- * To modify the `spacing` inside the tab list. Use a supported modifier from the <a href="/uilib/components/section/properties">Section component</a>. Defaults to `false`.
112
+ * To modify the `spacing` inside the tab list. Defaults to `null`.
113
113
  */
114
114
  tabs_spacing?: TabsTabsSpacing;
115
115
 
@@ -487,7 +487,7 @@ export default class Tabs extends React.PureComponent {
487
487
  hasScrollbar
488
488
  } = this.state;
489
489
  return React.createElement("div", _extends({
490
- className: classnames('dnb-tabs__tabs', className, align && `dnb-tabs__tabs--${align}`, tabs_style && `dnb-section dnb-section--${tabs_style}`, tabs_spacing && `dnb-section--spacing-${isTrue(tabs_spacing) ? 'default' : tabs_spacing}`, hasScrollbar && 'dnb-tabs--has-scrollbar', nav_button_edge && 'dnb-tabs--at-edge', no_border && 'dnb-tabs__tabs--no-border'),
490
+ className: classnames('dnb-tabs__tabs', className, align && `dnb-tabs__tabs--${align}`, tabs_style && `dnb-section dnb-section--${tabs_style}`, tabs_spacing && `dnb-section--spacing-${isTrue(tabs_spacing) ? 'large' : tabs_spacing}`, hasScrollbar && 'dnb-tabs--has-scrollbar', nav_button_edge && 'dnb-tabs--at-edge', no_border && 'dnb-tabs__tabs--no-border'),
491
491
  ref: this._tabsRef
492
492
  }, rest), React.createElement(ScrollNavButton, {
493
493
  onMouseDown: this.openPrevTab,
@@ -899,17 +899,12 @@ Tip: Check out other solutions like <Tabs.Content id="unique">Your content, outs
899
899
  const cachedContent = Object.entries(this._cache).map(([key, {
900
900
  content
901
901
  }]) => {
902
- const params = {};
903
-
904
- if (key !== String(selected_key)) {
905
- params.hidden = true;
906
- params['aria-hidden'] = true;
907
- }
908
-
909
- return React.createElement("div", _extends({
902
+ const hide = key !== String(selected_key);
903
+ return React.createElement("div", {
910
904
  key: key,
911
- className: "dnb-tabs__cached"
912
- }, params), content);
905
+ "aria-hidden": hide ? true : undefined,
906
+ className: 'dnb-tabs__cached' + (hide ? " dnb-tabs__cached--hidden" : "")
907
+ }, content);
913
908
  });
914
909
  return cachedContent;
915
910
  }
@@ -22,7 +22,7 @@ export interface ContentWrapperProps extends React.HTMLProps<HTMLElement> {
22
22
  content_style?: string;
23
23
 
24
24
  /**
25
- * To modify the `spacing` onto the content wrapper. Use a supported modifier from the <a href="/uilib/components/section/properties">Section component</a>. Defaults to `true`.
25
+ * To modify the `spacing` onto the content wrapper. Use a supported modifier from the <a href="/uilib/components/section/properties">Section component</a>. Defaults to `large`.
26
26
  */
27
27
  content_spacing?: ContentWrapperContentSpacing;
28
28
 
@@ -9,6 +9,7 @@ import { validateDOMAttributes, isTrue, combineLabelledBy } from '../../shared/c
9
9
  import { createSpacingClasses } from '../space/SpacingHelper';
10
10
  import Section from '../section/Section';
11
11
  import EventEmitter from '../../shared/helpers/EventEmitter';
12
+ import HeightAnimation from '../height-animation/HeightAnimation';
12
13
  export default class ContentWrapper extends React.PureComponent {
13
14
  constructor(props) {
14
15
  super(props);
@@ -63,21 +64,21 @@ export default class ContentWrapper extends React.PureComponent {
63
64
  }
64
65
 
65
66
  validateDOMAttributes(this.props, params);
66
- const Element = content_style ? Section : 'div';
67
67
  let content = children;
68
68
 
69
69
  if (typeof children === 'function') {
70
70
  content = children(this.state);
71
71
  }
72
72
 
73
- return React.createElement(Element, _extends({
73
+ return React.createElement(HeightAnimation, _extends({
74
+ showOverflow: true,
74
75
  role: "tabpanel",
75
76
  tabIndex: "-1",
76
77
  id: `${id}-content`,
77
78
  spacing: content_style ? false : undefined,
78
79
  style_type: content_style ? content_style : undefined,
79
- element: content_style ? 'div' : undefined,
80
- className: classnames('dnb-tabs__content dnb-no-focus', createSpacingClasses(rest), isTrue(content_spacing) && 'dnb-tabs__content--spacing')
80
+ element: content_style ? Section : 'div',
81
+ className: classnames("dnb-tabs__content dnb-no-focus", createSpacingClasses(rest), content_spacing && `dnb-section--spacing-${isTrue(content_spacing) ? 'large' : content_spacing}`)
81
82
  }, params), content);
82
83
  }
83
84
 
@@ -179,7 +179,20 @@
179
179
  }
180
180
  }
181
181
 
182
+ &__cached {
183
+ opacity: 1;
184
+ transition: opacity 1s var(--easing-default);
185
+ }
186
+ &__cached--hidden {
187
+ opacity: 0;
188
+ visibility: hidden;
189
+
190
+ height: 0 !important;
191
+ overflow: hidden;
192
+ }
193
+
182
194
  /* stylelint-disable */
195
+ html[data-visual-test] & &__cached,
183
196
  html[data-visual-test] & &__button,
184
197
  html[data-visual-test] & &__button__snap,
185
198
  html[data-visual-test] & &__scroll-nav-button {
@@ -187,7 +200,7 @@
187
200
  }
188
201
  /* stylelint-enable */
189
202
 
190
- &__content--spacing {
191
- padding-top: 2rem;
203
+ &__content {
204
+ padding-bottom: 0;
192
205
  }
193
206
  }
@@ -251,10 +251,22 @@
251
251
  /* stylelint-enable */ }
252
252
  html[data-whatinput='keyboard'] .dnb-tabs__button__snap:last-of-type.focus .dnb-tabs__button:focus {
253
253
  margin-right: 0.5rem; }
254
+ .dnb-tabs__cached {
255
+ opacity: 1;
256
+ -webkit-transition: opacity 1s cubic-bezier(0.42, 0, 0, 1);
257
+ transition: opacity 1s cubic-bezier(0.42, 0, 0, 1);
258
+ -webkit-transition: opacity 1s var(--easing-default);
259
+ transition: opacity 1s var(--easing-default); }
260
+ .dnb-tabs__cached--hidden {
261
+ opacity: 0;
262
+ visibility: hidden;
263
+ height: 0 !important;
264
+ overflow: hidden; }
265
+ html[data-visual-test] .dnb-tabs .dnb-tabs__cached,
254
266
  html[data-visual-test] .dnb-tabs .dnb-tabs__button,
255
267
  html[data-visual-test] .dnb-tabs .dnb-tabs__button__snap,
256
268
  html[data-visual-test] .dnb-tabs .dnb-tabs__scroll-nav-button {
257
269
  -webkit-transition: none !important;
258
270
  transition: none !important; }
259
- .dnb-tabs__content--spacing {
260
- padding-top: 2rem; }
271
+ .dnb-tabs__content {
272
+ padding-bottom: 0; }
@@ -1 +1 @@
1
- .dnb-tabs{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:rgba(0,0,0,0);-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#333;color:var(--color-black-80,#333);font-family:DNB,sans-serif;font-family:var(--font-family-default);font-size:1rem;font-size:var(--font-size-small);font-style:normal;font-weight:400;font-weight:var(--font-weight-basis);line-height:1.5rem;line-height:var(--line-height-basis);margin:0;padding:0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-break:break-word}.dnb-tabs *,.dnb-tabs :after,.dnb-tabs :before{background-repeat:no-repeat;-webkit-box-sizing:border-box;box-sizing:border-box}.dnb-tabs :after,.dnb-tabs :before{text-decoration:inherit;vertical-align:inherit}.dnb-tabs__tabs{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;z-index:1}.dnb-tabs__tabs,.dnb-tabs__tabs.dnb-section--spacing{padding-bottom:0}.dnb-tabs__tabs__tablist{-webkit-box-flex:0;-ms-scroll-chaining:none;-webkit-overflow-scrolling:touch;-ms-overflow-style:auto;-ms-overflow-style:none;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex:0 1 auto;flex:0 1 auto;overflow-x:auto;overscroll-behavior:contain;scrollbar-color:#14555a transparent;scrollbar-color:var(--color-emerald-green) transparent;scrollbar-width:thin;scrollbar-width:none}.dnb-tabs__tabs__tablist:focus{outline:none}html[data-whatinput=keyboard] .dnb-tabs__tabs__tablist:focus{--border-color:var(--color-emerald-green);border-color:transparent;-webkit-box-shadow:0 0 0 .125rem var(--border-color);box-shadow:0 0 0 .125rem var(--border-color)}@media screen and (-ms-high-contrast:none){html[data-whatinput=keyboard] .dnb-tabs__tabs__tablist:focus{-webkit-box-shadow:0 0 0 .125rem #14555a;box-shadow:0 0 0 .125rem #14555a;-webkit-box-shadow:0 0 0 .125rem var(--color-emerald-green);box-shadow:0 0 0 .125rem var(--color-emerald-green)}}html:not([data-visual-test]) .dnb-tabs__tabs__tablist{scroll-behavior:smooth}html[data-visual-test] .dnb-tabs__tabs__tablist{scroll-behavior:auto!important}.dnb-tabs__tabs__tablist::-webkit-scrollbar{display:none}.dnb-tabs__tabs--left .dnb-tabs__tabs__tablist{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.dnb-tabs__tabs--right .dnb-tabs__tabs__tablist{-webkit-box-flex:1;-webkit-box-pack:end;-ms-flex-pack:end;-ms-flex:1;flex:1;justify-content:flex-end}.dnb-tabs__tabs--center .dnb-tabs__tabs__tablist{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.dnb-tabs__tabs:before{bottom:0;content:"";height:1px;left:-100vw;position:absolute;width:100vw;z-index:-1}.dnb-tabs__tabs--no-border:before{content:none}.dnb-tabs__scroll-nav-button{display:none;opacity:0;pointer-events:none;position:absolute;right:-2px;-webkit-transition:opacity .6s ease-out;transition:opacity .6s ease-out;z-index:2}.dnb-tabs__scroll-nav-button:first-of-type{left:-2px;right:auto}.dnb-tabs__scroll-nav-button--visible{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1;pointer-events:auto}.dnb-tabs__scroll-nav-button--hide{opacity:0!important;pointer-events:none}.dnb-core-style .dnb-tabs .dnb-tabs__button,.dnb-tabs__button{background-color:transparent;border:none;cursor:pointer;font-size:1.125rem;font-size:var(--font-size-basis);line-height:1.5rem;line-height:var(--line-height-basis);margin:0;outline:none;padding:0 .125rem;position:relative;text-decoration:none;-webkit-transition:margin .4s ease-out;transition:margin .4s ease-out;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;white-space:nowrap;z-index:1}.dnb-core-style .dnb-tabs .dnb-tabs__button__title .dnb-icon,.dnb-tabs__button__title .dnb-icon{font-size:1rem;font-size:var(--font-size-small);-webkit-transform:translateY(-.125rem);transform:translateY(-.125rem)}.dnb-core-style .dnb-tabs .dnb-tabs__button .dnb-dummy,.dnb-tabs__button .dnb-dummy{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:0;margin-top:.25rem;overflow:hidden;visibility:hidden}.dnb-core-style .dnb-tabs .dnb-tabs__button:after,.dnb-tabs__button:after{bottom:0;content:"";height:1px;left:0;position:absolute;right:0;width:100%;z-index:-1}.dnb-tabs__button__snap{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 1rem 0 1.5rem;-webkit-transition:padding 1s cubic-bezier(.42,0,0,1);transition:padding 1s cubic-bezier(.42,0,0,1);-webkit-transition:padding 1s var(--easing-default);transition:padding 1s var(--easing-default);will-change:padding}@media screen and (max-width:40em){.dnb-tabs__button__snap{padding:0 1rem}}.dnb-tabs__button__snap:first-of-type{padding-left:0}.dnb-tabs__button__snap:last-of-type{padding-right:.5rem}html[data-whatinput=keyboard] .dnb-tabs__button__snap:first-of-type.focus .dnb-tabs__button:focus{margin-left:.5rem}html[data-whatinput=keyboard] .dnb-tabs__button__snap:last-of-type.focus .dnb-tabs__button:focus{margin-right:.5rem}html[data-visual-test] .dnb-tabs .dnb-tabs__button,html[data-visual-test] .dnb-tabs .dnb-tabs__button__snap,html[data-visual-test] .dnb-tabs .dnb-tabs__scroll-nav-button{-webkit-transition:none!important;transition:none!important}.dnb-tabs__content--spacing{padding-top:2rem}
1
+ .dnb-tabs{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:rgba(0,0,0,0);-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#333;color:var(--color-black-80,#333);font-family:DNB,sans-serif;font-family:var(--font-family-default);font-size:1rem;font-size:var(--font-size-small);font-style:normal;font-weight:400;font-weight:var(--font-weight-basis);line-height:1.5rem;line-height:var(--line-height-basis);margin:0;padding:0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;word-break:break-word}.dnb-tabs *,.dnb-tabs :after,.dnb-tabs :before{background-repeat:no-repeat;-webkit-box-sizing:border-box;box-sizing:border-box}.dnb-tabs :after,.dnb-tabs :before{text-decoration:inherit;vertical-align:inherit}.dnb-tabs__tabs{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;z-index:1}.dnb-tabs__tabs,.dnb-tabs__tabs.dnb-section--spacing{padding-bottom:0}.dnb-tabs__tabs__tablist{-webkit-box-flex:0;-ms-scroll-chaining:none;-webkit-overflow-scrolling:touch;-ms-overflow-style:auto;-ms-overflow-style:none;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex:0 1 auto;flex:0 1 auto;overflow-x:auto;overscroll-behavior:contain;scrollbar-color:#14555a transparent;scrollbar-color:var(--color-emerald-green) transparent;scrollbar-width:thin;scrollbar-width:none}.dnb-tabs__tabs__tablist:focus{outline:none}html[data-whatinput=keyboard] .dnb-tabs__tabs__tablist:focus{--border-color:var(--color-emerald-green);border-color:transparent;-webkit-box-shadow:0 0 0 .125rem var(--border-color);box-shadow:0 0 0 .125rem var(--border-color)}@media screen and (-ms-high-contrast:none){html[data-whatinput=keyboard] .dnb-tabs__tabs__tablist:focus{-webkit-box-shadow:0 0 0 .125rem #14555a;box-shadow:0 0 0 .125rem #14555a;-webkit-box-shadow:0 0 0 .125rem var(--color-emerald-green);box-shadow:0 0 0 .125rem var(--color-emerald-green)}}html:not([data-visual-test]) .dnb-tabs__tabs__tablist{scroll-behavior:smooth}html[data-visual-test] .dnb-tabs__tabs__tablist{scroll-behavior:auto!important}.dnb-tabs__tabs__tablist::-webkit-scrollbar{display:none}.dnb-tabs__tabs--left .dnb-tabs__tabs__tablist{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.dnb-tabs__tabs--right .dnb-tabs__tabs__tablist{-webkit-box-flex:1;-webkit-box-pack:end;-ms-flex-pack:end;-ms-flex:1;flex:1;justify-content:flex-end}.dnb-tabs__tabs--center .dnb-tabs__tabs__tablist{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.dnb-tabs__tabs:before{bottom:0;content:"";height:1px;left:-100vw;position:absolute;width:100vw;z-index:-1}.dnb-tabs__tabs--no-border:before{content:none}.dnb-tabs__scroll-nav-button{display:none;opacity:0;pointer-events:none;position:absolute;right:-2px;-webkit-transition:opacity .6s ease-out;transition:opacity .6s ease-out;z-index:2}.dnb-tabs__scroll-nav-button:first-of-type{left:-2px;right:auto}.dnb-tabs__scroll-nav-button--visible{display:-webkit-box;display:-ms-flexbox;display:flex;opacity:1;pointer-events:auto}.dnb-tabs__scroll-nav-button--hide{opacity:0!important;pointer-events:none}.dnb-core-style .dnb-tabs .dnb-tabs__button,.dnb-tabs__button{background-color:transparent;border:none;cursor:pointer;font-size:1.125rem;font-size:var(--font-size-basis);line-height:1.5rem;line-height:var(--line-height-basis);margin:0;outline:none;padding:0 .125rem;position:relative;text-decoration:none;-webkit-transition:margin .4s ease-out;transition:margin .4s ease-out;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none;white-space:nowrap;z-index:1}.dnb-core-style .dnb-tabs .dnb-tabs__button__title .dnb-icon,.dnb-tabs__button__title .dnb-icon{font-size:1rem;font-size:var(--font-size-small);-webkit-transform:translateY(-.125rem);transform:translateY(-.125rem)}.dnb-core-style .dnb-tabs .dnb-tabs__button .dnb-dummy,.dnb-tabs__button .dnb-dummy{-webkit-box-orient:vertical;-webkit-box-direction:normal;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;height:0;margin-top:.25rem;overflow:hidden;visibility:hidden}.dnb-core-style .dnb-tabs .dnb-tabs__button:after,.dnb-tabs__button:after{bottom:0;content:"";height:1px;left:0;position:absolute;right:0;width:100%;z-index:-1}.dnb-tabs__button__snap{display:-webkit-box;display:-ms-flexbox;display:flex;padding:0 1rem 0 1.5rem;-webkit-transition:padding 1s cubic-bezier(.42,0,0,1);transition:padding 1s cubic-bezier(.42,0,0,1);-webkit-transition:padding 1s var(--easing-default);transition:padding 1s var(--easing-default);will-change:padding}@media screen and (max-width:40em){.dnb-tabs__button__snap{padding:0 1rem}}.dnb-tabs__button__snap:first-of-type{padding-left:0}.dnb-tabs__button__snap:last-of-type{padding-right:.5rem}html[data-whatinput=keyboard] .dnb-tabs__button__snap:first-of-type.focus .dnb-tabs__button:focus{margin-left:.5rem}html[data-whatinput=keyboard] .dnb-tabs__button__snap:last-of-type.focus .dnb-tabs__button:focus{margin-right:.5rem}.dnb-tabs__cached{opacity:1;-webkit-transition:opacity 1s cubic-bezier(.42,0,0,1);transition:opacity 1s cubic-bezier(.42,0,0,1);-webkit-transition:opacity 1s var(--easing-default);transition:opacity 1s var(--easing-default)}.dnb-tabs__cached--hidden{height:0!important;opacity:0;overflow:hidden;visibility:hidden}html[data-visual-test] .dnb-tabs .dnb-tabs__button,html[data-visual-test] .dnb-tabs .dnb-tabs__button__snap,html[data-visual-test] .dnb-tabs .dnb-tabs__cached,html[data-visual-test] .dnb-tabs .dnb-tabs__scroll-nav-button{-webkit-transition:none!important;transition:none!important}.dnb-tabs__content{padding-bottom:0}
@@ -40,7 +40,7 @@
40
40
 
41
41
  .dnb-tabs__content:focus {
42
42
  position: relative; }
43
- .dnb-tabs__content:focus::after {
43
+ .dnb-tabs__content:focus::before {
44
44
  content: '';
45
45
  position: absolute;
46
46
  z-index: -1;
@@ -51,13 +51,13 @@
51
51
  max-width: 100vw;
52
52
  border-radius: 0.5rem;
53
53
  outline: none; }
54
- html[data-whatinput='keyboard'] .dnb-tabs__content:focus::after {
54
+ html[data-whatinput='keyboard'] .dnb-tabs__content:focus::before {
55
55
  --border-color: var(--color-emerald-green);
56
56
  -webkit-box-shadow: 0 0 0 0.125rem var(--border-color);
57
57
  box-shadow: 0 0 0 0.125rem var(--border-color);
58
58
  border-color: transparent; }
59
59
  @media screen and (-ms-high-contrast: none) {
60
- html[data-whatinput='keyboard'] .dnb-tabs__content:focus::after {
60
+ html[data-whatinput='keyboard'] .dnb-tabs__content:focus::before {
61
61
  -webkit-box-shadow: 0 0 0 0.125rem #14555a;
62
62
  box-shadow: 0 0 0 0.125rem #14555a;
63
63
  -webkit-box-shadow: 0 0 0 0.125rem var(--color-emerald-green);
@@ -1 +1 @@
1
- .dnb-tabs__tabs:not(.dnb-section):before{background-color:#ebebeb;background-color:var(--color-black-8);-webkit-box-shadow:100vw 0 0 0 #ebebeb;box-shadow:100vw 0 0 0 #ebebeb;-webkit-box-shadow:100vw 0 0 0 var(--color-black-8);box-shadow:100vw 0 0 0 var(--color-black-8)}.dnb-tabs__tabs__tablist:focus{border-radius:.5rem}.dnb-tabs--at-edge .dnb-tabs__scroll-nav-button:first-of-type{border-radius:0 50% 50% 0}.dnb-tabs--at-edge .dnb-tabs__scroll-nav-button:last-of-type{border-radius:50% 0 0 50%}.dnb-tabs--at-edge .dnb-tabs__tabs__tablist:focus{border-radius:0}.dnb-tabs__content:focus{position:relative}.dnb-tabs__content:focus:after{border-radius:.5rem;bottom:-.5rem;content:"";left:-.5rem;max-width:100vw;outline:none;position:absolute;right:-.5rem;top:.125rem;z-index:-1}html[data-whatinput=keyboard] .dnb-tabs__content:focus:after{--border-color:var(--color-emerald-green);border-color:transparent;-webkit-box-shadow:0 0 0 .125rem var(--border-color);box-shadow:0 0 0 .125rem var(--border-color)}@media screen and (-ms-high-contrast:none){html[data-whatinput=keyboard] .dnb-tabs__content:focus:after{-webkit-box-shadow:0 0 0 .125rem #14555a;box-shadow:0 0 0 .125rem #14555a;-webkit-box-shadow:0 0 0 .125rem var(--color-emerald-green);box-shadow:0 0 0 .125rem var(--color-emerald-green)}}.dnb-tabs__button__title{color:#007272;color:var(--color-sea-green);display:block;font-size:1.125rem;font-size:var(--font-size-basis);font-weight:400;font-weight:var(--font-weight-regular);padding:.5rem 0 .25rem;text-align:center}html:not([data-whatintent=touch]) .dnb-tabs__button:hover:not([disabled]){background-color:#d2f0e9;background-color:var(--color-mint-green-50)}html:not([data-whatintent=touch]) .dnb-tabs__button:hover:not([disabled]):after{background-color:#007272;background-color:var(--color-sea-green);border-radius:2px;height:2px}.dnb-tabs__button:focus{overflow:visible}.dnb-tabs__button:focus:before{border-radius:inherit;bottom:0;content:"";height:inherit;left:-.5rem;outline:none;position:absolute;right:-.5rem;top:0;z-index:1}html[data-whatinput=keyboard] .dnb-tabs__button:focus:before{--border-color:var(--color-emerald-green);border-color:transparent;-webkit-box-shadow:0 0 0 .125rem var(--border-color);box-shadow:0 0 0 .125rem var(--border-color)}@media screen and (-ms-high-contrast:none){html[data-whatinput=keyboard] .dnb-tabs__button:focus:before{-webkit-box-shadow:0 0 0 .125rem #14555a;box-shadow:0 0 0 .125rem #14555a;-webkit-box-shadow:0 0 0 .125rem var(--color-emerald-green);box-shadow:0 0 0 .125rem var(--color-emerald-green)}}.dnb-tabs__button:focus:before{border-radius:1.5rem;bottom:.5rem;left:-.375rem;right:-.375rem;top:.5rem}.dnb-tabs__button[disabled] .dnb-tabs__button__title{color:#b3dada;color:var(--color-sea-green-30)}.dnb-tabs__button:not([disabled]).selected:after,.dnb-tabs__button:not([disabled]):active:after{background-color:#007272;background-color:var(--color-sea-green);border-radius:2px;height:2px}.dnb-tabs__button:not([disabled]).selected .dnb-tabs__button__title,.dnb-tabs__button:not([disabled]):active .dnb-tabs__button__title{color:#14555a;color:var(--color-emerald-green)}.dnb-tabs__button:not([disabled]).selected .dnb-tabs__button__title,.dnb-tabs__button span[hidden]{font-weight:500;font-weight:var(--font-weight-medium)}html:not([data-whatintent=touch]) .dnb-tabs__button:hover[disabled]{cursor:not-allowed}html:not([data-whatintent=touch]) .dnb-tabs__button:hover:not([disabled]){background-color:#f2f4ec;background-color:var(--color-pistachio)}
1
+ .dnb-tabs__tabs:not(.dnb-section):before{background-color:#ebebeb;background-color:var(--color-black-8);-webkit-box-shadow:100vw 0 0 0 #ebebeb;box-shadow:100vw 0 0 0 #ebebeb;-webkit-box-shadow:100vw 0 0 0 var(--color-black-8);box-shadow:100vw 0 0 0 var(--color-black-8)}.dnb-tabs__tabs__tablist:focus{border-radius:.5rem}.dnb-tabs--at-edge .dnb-tabs__scroll-nav-button:first-of-type{border-radius:0 50% 50% 0}.dnb-tabs--at-edge .dnb-tabs__scroll-nav-button:last-of-type{border-radius:50% 0 0 50%}.dnb-tabs--at-edge .dnb-tabs__tabs__tablist:focus{border-radius:0}.dnb-tabs__content:focus{position:relative}.dnb-tabs__content:focus:before{border-radius:.5rem;bottom:-.5rem;content:"";left:-.5rem;max-width:100vw;outline:none;position:absolute;right:-.5rem;top:.125rem;z-index:-1}html[data-whatinput=keyboard] .dnb-tabs__content:focus:before{--border-color:var(--color-emerald-green);border-color:transparent;-webkit-box-shadow:0 0 0 .125rem var(--border-color);box-shadow:0 0 0 .125rem var(--border-color)}@media screen and (-ms-high-contrast:none){html[data-whatinput=keyboard] .dnb-tabs__content:focus:before{-webkit-box-shadow:0 0 0 .125rem #14555a;box-shadow:0 0 0 .125rem #14555a;-webkit-box-shadow:0 0 0 .125rem var(--color-emerald-green);box-shadow:0 0 0 .125rem var(--color-emerald-green)}}.dnb-tabs__button__title{color:#007272;color:var(--color-sea-green);display:block;font-size:1.125rem;font-size:var(--font-size-basis);font-weight:400;font-weight:var(--font-weight-regular);padding:.5rem 0 .25rem;text-align:center}html:not([data-whatintent=touch]) .dnb-tabs__button:hover:not([disabled]){background-color:#d2f0e9;background-color:var(--color-mint-green-50)}html:not([data-whatintent=touch]) .dnb-tabs__button:hover:not([disabled]):after{background-color:#007272;background-color:var(--color-sea-green);border-radius:2px;height:2px}.dnb-tabs__button:focus{overflow:visible}.dnb-tabs__button:focus:before{border-radius:inherit;bottom:0;content:"";height:inherit;left:-.5rem;outline:none;position:absolute;right:-.5rem;top:0;z-index:1}html[data-whatinput=keyboard] .dnb-tabs__button:focus:before{--border-color:var(--color-emerald-green);border-color:transparent;-webkit-box-shadow:0 0 0 .125rem var(--border-color);box-shadow:0 0 0 .125rem var(--border-color)}@media screen and (-ms-high-contrast:none){html[data-whatinput=keyboard] .dnb-tabs__button:focus:before{-webkit-box-shadow:0 0 0 .125rem #14555a;box-shadow:0 0 0 .125rem #14555a;-webkit-box-shadow:0 0 0 .125rem var(--color-emerald-green);box-shadow:0 0 0 .125rem var(--color-emerald-green)}}.dnb-tabs__button:focus:before{border-radius:1.5rem;bottom:.5rem;left:-.375rem;right:-.375rem;top:.5rem}.dnb-tabs__button[disabled] .dnb-tabs__button__title{color:#b3dada;color:var(--color-sea-green-30)}.dnb-tabs__button:not([disabled]).selected:after,.dnb-tabs__button:not([disabled]):active:after{background-color:#007272;background-color:var(--color-sea-green);border-radius:2px;height:2px}.dnb-tabs__button:not([disabled]).selected .dnb-tabs__button__title,.dnb-tabs__button:not([disabled]):active .dnb-tabs__button__title{color:#14555a;color:var(--color-emerald-green)}.dnb-tabs__button:not([disabled]).selected .dnb-tabs__button__title,.dnb-tabs__button span[hidden]{font-weight:500;font-weight:var(--font-weight-medium)}html:not([data-whatintent=touch]) .dnb-tabs__button:hover[disabled]{cursor:not-allowed}html:not([data-whatintent=touch]) .dnb-tabs__button:hover:not([disabled]){background-color:#f2f4ec;background-color:var(--color-pistachio)}
@@ -36,7 +36,7 @@
36
36
 
37
37
  .dnb-tabs__content:focus {
38
38
  position: relative; }
39
- .dnb-tabs__content:focus::after {
39
+ .dnb-tabs__content:focus::before {
40
40
  content: '';
41
41
  position: absolute;
42
42
  z-index: -1;
@@ -47,13 +47,13 @@
47
47
  max-width: 100vw;
48
48
  border-radius: 0.5rem;
49
49
  outline: none; }
50
- html[data-whatinput='keyboard'] .dnb-tabs__content:focus::after {
50
+ html[data-whatinput='keyboard'] .dnb-tabs__content:focus::before {
51
51
  --border-color: var(--color-emerald-green);
52
52
  -webkit-box-shadow: 0 0 0 0.125rem var(--border-color);
53
53
  box-shadow: 0 0 0 0.125rem var(--border-color);
54
54
  border-color: transparent; }
55
55
  @media screen and (-ms-high-contrast: none) {
56
- html[data-whatinput='keyboard'] .dnb-tabs__content:focus::after {
56
+ html[data-whatinput='keyboard'] .dnb-tabs__content:focus::before {
57
57
  -webkit-box-shadow: 0 0 0 0.125rem #14555a;
58
58
  box-shadow: 0 0 0 0.125rem #14555a;
59
59
  -webkit-box-shadow: 0 0 0 0.125rem var(--color-emerald-green);
@@ -1 +1 @@
1
- .dnb-tabs__tabs:not(.dnb-section):before{background-color:#ebebeb;background-color:var(--color-black-8);-webkit-box-shadow:100vw 0 0 0 #ebebeb;box-shadow:100vw 0 0 0 #ebebeb;-webkit-box-shadow:100vw 0 0 0 var(--color-black-8);box-shadow:100vw 0 0 0 var(--color-black-8)}.dnb-tabs__tabs__tablist:focus{border-radius:.5rem}.dnb-tabs--at-edge .dnb-tabs__scroll-nav-button:first-of-type{border-radius:0 50% 50% 0}.dnb-tabs--at-edge .dnb-tabs__scroll-nav-button:last-of-type{border-radius:50% 0 0 50%}.dnb-tabs--at-edge .dnb-tabs__tabs__tablist:focus{border-radius:0}.dnb-tabs__content:focus{position:relative}.dnb-tabs__content:focus:after{border-radius:.5rem;bottom:-.5rem;content:"";left:-.5rem;max-width:100vw;outline:none;position:absolute;right:-.5rem;top:.125rem;z-index:-1}html[data-whatinput=keyboard] .dnb-tabs__content:focus:after{--border-color:var(--color-emerald-green);border-color:transparent;-webkit-box-shadow:0 0 0 .125rem var(--border-color);box-shadow:0 0 0 .125rem var(--border-color)}@media screen and (-ms-high-contrast:none){html[data-whatinput=keyboard] .dnb-tabs__content:focus:after{-webkit-box-shadow:0 0 0 .125rem #14555a;box-shadow:0 0 0 .125rem #14555a;-webkit-box-shadow:0 0 0 .125rem var(--color-emerald-green);box-shadow:0 0 0 .125rem var(--color-emerald-green)}}.dnb-tabs__button__title{color:#007272;color:var(--color-sea-green);display:block;font-size:1.125rem;font-size:var(--font-size-basis);font-weight:400;font-weight:var(--font-weight-regular);padding:.5rem 0 .25rem;text-align:center}html:not([data-whatintent=touch]) .dnb-tabs__button:hover[disabled]{cursor:not-allowed}html:not([data-whatintent=touch]) .dnb-tabs__button:hover:not([disabled]){background-color:#d2f0e9;background-color:var(--color-mint-green-50)}html:not([data-whatintent=touch]) .dnb-tabs__button:hover:not([disabled]):after{background-color:#007272;background-color:var(--color-sea-green);border-radius:2px;height:2px}.dnb-tabs__button:focus{overflow:visible}.dnb-tabs__button:focus:before{border-radius:inherit;bottom:0;content:"";height:inherit;left:-.5rem;outline:none;position:absolute;right:-.5rem;top:0;z-index:1}html[data-whatinput=keyboard] .dnb-tabs__button:focus:before{--border-color:var(--color-emerald-green);border-color:transparent;-webkit-box-shadow:0 0 0 .125rem var(--border-color);box-shadow:0 0 0 .125rem var(--border-color)}@media screen and (-ms-high-contrast:none){html[data-whatinput=keyboard] .dnb-tabs__button:focus:before{-webkit-box-shadow:0 0 0 .125rem #14555a;box-shadow:0 0 0 .125rem #14555a;-webkit-box-shadow:0 0 0 .125rem var(--color-emerald-green);box-shadow:0 0 0 .125rem var(--color-emerald-green)}}.dnb-tabs__button:focus:before{border-radius:1.5rem;bottom:.5rem;left:-.375rem;right:-.375rem;top:.5rem}.dnb-tabs__button[disabled] .dnb-tabs__button__title{color:#b3dada;color:var(--color-sea-green-30)}.dnb-tabs__button:not([disabled]).selected:after,.dnb-tabs__button:not([disabled]):active:after{background-color:#007272;background-color:var(--color-sea-green);border-radius:2px;height:2px}.dnb-tabs__button:not([disabled]).selected .dnb-tabs__button__title,.dnb-tabs__button:not([disabled]):active .dnb-tabs__button__title{color:#14555a;color:var(--color-emerald-green)}.dnb-tabs__button:not([disabled]).selected .dnb-tabs__button__title,.dnb-tabs__button span[hidden]{font-weight:500;font-weight:var(--font-weight-medium)}
1
+ .dnb-tabs__tabs:not(.dnb-section):before{background-color:#ebebeb;background-color:var(--color-black-8);-webkit-box-shadow:100vw 0 0 0 #ebebeb;box-shadow:100vw 0 0 0 #ebebeb;-webkit-box-shadow:100vw 0 0 0 var(--color-black-8);box-shadow:100vw 0 0 0 var(--color-black-8)}.dnb-tabs__tabs__tablist:focus{border-radius:.5rem}.dnb-tabs--at-edge .dnb-tabs__scroll-nav-button:first-of-type{border-radius:0 50% 50% 0}.dnb-tabs--at-edge .dnb-tabs__scroll-nav-button:last-of-type{border-radius:50% 0 0 50%}.dnb-tabs--at-edge .dnb-tabs__tabs__tablist:focus{border-radius:0}.dnb-tabs__content:focus{position:relative}.dnb-tabs__content:focus:before{border-radius:.5rem;bottom:-.5rem;content:"";left:-.5rem;max-width:100vw;outline:none;position:absolute;right:-.5rem;top:.125rem;z-index:-1}html[data-whatinput=keyboard] .dnb-tabs__content:focus:before{--border-color:var(--color-emerald-green);border-color:transparent;-webkit-box-shadow:0 0 0 .125rem var(--border-color);box-shadow:0 0 0 .125rem var(--border-color)}@media screen and (-ms-high-contrast:none){html[data-whatinput=keyboard] .dnb-tabs__content:focus:before{-webkit-box-shadow:0 0 0 .125rem #14555a;box-shadow:0 0 0 .125rem #14555a;-webkit-box-shadow:0 0 0 .125rem var(--color-emerald-green);box-shadow:0 0 0 .125rem var(--color-emerald-green)}}.dnb-tabs__button__title{color:#007272;color:var(--color-sea-green);display:block;font-size:1.125rem;font-size:var(--font-size-basis);font-weight:400;font-weight:var(--font-weight-regular);padding:.5rem 0 .25rem;text-align:center}html:not([data-whatintent=touch]) .dnb-tabs__button:hover[disabled]{cursor:not-allowed}html:not([data-whatintent=touch]) .dnb-tabs__button:hover:not([disabled]){background-color:#d2f0e9;background-color:var(--color-mint-green-50)}html:not([data-whatintent=touch]) .dnb-tabs__button:hover:not([disabled]):after{background-color:#007272;background-color:var(--color-sea-green);border-radius:2px;height:2px}.dnb-tabs__button:focus{overflow:visible}.dnb-tabs__button:focus:before{border-radius:inherit;bottom:0;content:"";height:inherit;left:-.5rem;outline:none;position:absolute;right:-.5rem;top:0;z-index:1}html[data-whatinput=keyboard] .dnb-tabs__button:focus:before{--border-color:var(--color-emerald-green);border-color:transparent;-webkit-box-shadow:0 0 0 .125rem var(--border-color);box-shadow:0 0 0 .125rem var(--border-color)}@media screen and (-ms-high-contrast:none){html[data-whatinput=keyboard] .dnb-tabs__button:focus:before{-webkit-box-shadow:0 0 0 .125rem #14555a;box-shadow:0 0 0 .125rem #14555a;-webkit-box-shadow:0 0 0 .125rem var(--color-emerald-green);box-shadow:0 0 0 .125rem var(--color-emerald-green)}}.dnb-tabs__button:focus:before{border-radius:1.5rem;bottom:.5rem;left:-.375rem;right:-.375rem;top:.5rem}.dnb-tabs__button[disabled] .dnb-tabs__button__title{color:#b3dada;color:var(--color-sea-green-30)}.dnb-tabs__button:not([disabled]).selected:after,.dnb-tabs__button:not([disabled]):active:after{background-color:#007272;background-color:var(--color-sea-green);border-radius:2px;height:2px}.dnb-tabs__button:not([disabled]).selected .dnb-tabs__button__title,.dnb-tabs__button:not([disabled]):active .dnb-tabs__button__title{color:#14555a;color:var(--color-emerald-green)}.dnb-tabs__button:not([disabled]).selected .dnb-tabs__button__title,.dnb-tabs__button span[hidden]{font-weight:500;font-weight:var(--font-weight-medium)}
@@ -36,9 +36,12 @@
36
36
  border-radius: 0;
37
37
  }
38
38
 
39
+ // Make focus ring when keyboard is used to navigate
39
40
  &__content:focus {
40
41
  position: relative;
41
- &::after {
42
+
43
+ // Use "before" (instead of after) in order to not collide with Section styles
44
+ &::before {
42
45
  content: '';
43
46
  position: absolute;
44
47
  z-index: -1;
@@ -60,7 +60,8 @@ const Upload = localProps => {
60
60
  const {
61
61
  files,
62
62
  setFiles,
63
- setInternalFiles
63
+ setInternalFiles,
64
+ existsInFiles
64
65
  } = useUpload(id);
65
66
  return React.createElement(UploadContext.Provider, {
66
67
  value: _objectSpread(_objectSpread({}, extendedProps), {}, {
@@ -75,24 +76,21 @@ const Upload = localProps => {
75
76
  }, props), _UploadInfo || (_UploadInfo = React.createElement(UploadInfo, null)), _UploadFileInput || (_UploadFileInput = React.createElement(UploadFileInput, null)), _UploadFileList || (_UploadFileList = React.createElement(UploadFileList, null)))));
76
77
 
77
78
  function onInputUpload(newFiles) {
78
- const existsInFiles = file => files.some(({
79
- file: f
80
- }) => {
81
- return f.name === file.name && f.size === file.size && f.lastModified === file.lastModified;
82
- });
79
+ const mergedFiles = [...files, ...newFiles.map(fileItem => {
80
+ const {
81
+ file
82
+ } = fileItem;
83
83
 
84
- const uniqueFiles = [...files, ...newFiles.filter(({
85
- file
86
- }) => {
87
- return !existsInFiles(file);
88
- }).map(fileItem => {
89
84
  if (!fileItem.id) {
90
85
  fileItem.id = makeUniqueId();
91
86
  }
92
87
 
88
+ fileItem.exists = existsInFiles(file, files);
93
89
  return fileItem;
94
90
  })];
95
- const verifiedFiles = verifyFiles(uniqueFiles, {
91
+ const verifiedFiles = verifyFiles(mergedFiles.filter(({
92
+ exists
93
+ }) => !exists), {
96
94
  fileMaxSize,
97
95
  acceptedFileTypes,
98
96
  errorUnsupportedFile,
@@ -100,7 +98,7 @@ const Upload = localProps => {
100
98
  });
101
99
  const validFiles = [...verifiedFiles].slice(0, filesAmountLimit);
102
100
  setFiles(validFiles);
103
- setInternalFiles(verifiedFiles);
101
+ setInternalFiles(mergedFiles);
104
102
 
105
103
  if (typeof onChange === 'function') {
106
104
  onChange({
@@ -1,12 +1,12 @@
1
1
  var _UploadStatus;
2
2
 
3
- import React, { useEffect, useRef } from 'react';
3
+ import React, { useRef } from 'react';
4
4
  import Button from '../button/Button';
5
5
  import { folder as FolderIcon } from '../../icons';
6
6
  import { makeUniqueId } from '../../shared/component-helper';
7
7
  import { UploadContext } from './UploadContext';
8
8
  import UploadStatus from './UploadStatus';
9
- import useUpload from './useUpload';
9
+ import { extendWithAbbreviation } from './UploadVerify';
10
10
 
11
11
  const UploadFileInput = () => {
12
12
  const fileInput = useRef(null);
@@ -18,17 +18,6 @@ const UploadFileInput = () => {
18
18
  onInputUpload,
19
19
  filesAmountLimit
20
20
  } = context;
21
- const {
22
- internalFiles
23
- } = useUpload(id);
24
- const accept = acceptedFileTypes.reduce((accept, format, index) => {
25
- const previus = index === 0 ? '' : `${accept},`;
26
- return `${previus} .${format}`;
27
- }, '');
28
- useEffect(() => {
29
- fileInput.current.value = null;
30
- fileInput.current.accept = accept;
31
- }, []);
32
21
 
33
22
  const openFileDialog = () => {
34
23
  var _fileInput$current;
@@ -37,6 +26,7 @@ const UploadFileInput = () => {
37
26
  };
38
27
 
39
28
  const sharedId = id || makeUniqueId();
29
+ const accept = extendWithAbbreviation(acceptedFileTypes).map(type => `.${type}`).join(',');
40
30
  return React.createElement("div", {
41
31
  "data-testid": "upload-file-input"
42
32
  }, React.createElement(Button, {
@@ -48,19 +38,20 @@ const UploadFileInput = () => {
48
38
  icon_position: "left",
49
39
  variant: "secondary",
50
40
  wrap: true,
51
- onClick: openFileDialog,
52
- disabled: internalFiles.length > filesAmountLimit
41
+ onClick: openFileDialog
53
42
  }, buttonText), _UploadStatus || (_UploadStatus = React.createElement(UploadStatus, null)), React.createElement("input", {
54
43
  "aria-labelledby": `${sharedId}-input`,
55
44
  "data-testid": "upload-file-input-input",
56
45
  ref: fileInput,
46
+ accept: accept,
57
47
  className: "dnb-upload__file-input",
58
48
  type: "file",
59
- onChange: handleFileInput,
49
+ onChange: onChangeHandler,
50
+ onClick: onClickHandler,
60
51
  multiple: filesAmountLimit > 1
61
52
  }));
62
53
 
63
- function handleFileInput(event) {
54
+ function onChangeHandler(event) {
64
55
  const target = event.target;
65
56
  const {
66
57
  files
@@ -71,6 +62,11 @@ const UploadFileInput = () => {
71
62
  };
72
63
  }));
73
64
  }
65
+
66
+ function onClickHandler(event) {
67
+ const target = event.target;
68
+ target.value = null;
69
+ }
74
70
  };
75
71
 
76
72
  export default UploadFileInput;
@@ -48,6 +48,7 @@ function UploadFileList() {
48
48
 
49
49
  return React.createElement(UploadFileListCell, {
50
50
  key: index,
51
+ id: id,
51
52
  uploadFile: uploadFile,
52
53
  onDelete: onDeleteHandler,
53
54
  deleteButtonText: deleteButton,
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import { UploadFile } from './types';
3
3
  export declare type UploadFileListCellProps = {
4
+ id: string;
4
5
  /**
5
6
  * Uploaded file
6
7
  */
@@ -15,5 +16,5 @@ export declare type UploadFileListCellProps = {
15
16
  loadingText: React.ReactNode;
16
17
  deleteButtonText: React.ReactNode;
17
18
  };
18
- declare const UploadFileListCell: ({ uploadFile, onDelete, loadingText, deleteButtonText, }: UploadFileListCellProps) => JSX.Element;
19
+ declare const UploadFileListCell: ({ id, uploadFile, onDelete, loadingText, deleteButtonText, }: UploadFileListCellProps) => JSX.Element;
19
20
  export default UploadFileListCell;
@@ -1,6 +1,7 @@
1
1
  var _ProgressIndicator, _Icon;
2
2
 
3
3
  import React, { useRef } from 'react';
4
+ import classnames from 'classnames';
4
5
  import Button from '../button/Button';
5
6
  import Icon from '../../components/Icon';
6
7
  import FormStatus from '../../components/FormStatus';
@@ -8,6 +9,7 @@ import ProgressIndicator from '../../components/progress-indicator';
8
9
  import P from '../../elements/P';
9
10
  import { trash as TrashIcon, exclamation_medium as ExclamationIcon, file_pdf_medium as pdf, file_xls_medium as xls, file_ppt_medium as ppt, file_csv_medium as csv, file_txt_medium as txt, file_xml_medium as xml, file_medium as file } from '../../icons';
10
11
  import { getPreviousSibling, warn } from '../../shared/component-helper';
12
+ import useUpload from './useUpload';
11
13
  const images = {
12
14
  pdf,
13
15
  xls,
@@ -19,6 +21,7 @@ const images = {
19
21
  };
20
22
 
21
23
  const UploadFileListCell = ({
24
+ id,
22
25
  uploadFile,
23
26
  onDelete,
24
27
  loadingText,
@@ -39,6 +42,7 @@ const UploadFileListCell = ({
39
42
  const hasWarning = errorMessage != null;
40
43
  const imageUrl = URL.createObjectURL(file);
41
44
  const cellRef = useRef();
45
+ const exists = useExistsHighlight(id, file);
42
46
 
43
47
  const handleDisappearFocus = () => {
44
48
  try {
@@ -57,7 +61,7 @@ const UploadFileListCell = ({
57
61
 
58
62
  return React.createElement("li", {
59
63
  "data-testid": "upload-file-list-cell",
60
- className: 'dnb-upload__file-cell' + (hasWarning ? " dnb-upload__file-cell--warning" : ""),
64
+ className: classnames('dnb-upload__file-cell', hasWarning && 'dnb-upload__file-cell--warning', exists && 'dnb-upload__file-cell--highlight'),
61
65
  ref: cellRef
62
66
  }, React.createElement("div", {
63
67
  className: "dnb-upload__file-cell__content"
@@ -121,4 +125,34 @@ const UploadFileListCell = ({
121
125
  }
122
126
  };
123
127
 
124
- export default UploadFileListCell;
128
+ export default UploadFileListCell;
129
+
130
+ function useExistsHighlight(id, file) {
131
+ const {
132
+ internalFiles
133
+ } = useUpload(id);
134
+ const [exists, updateExists] = React.useState(false);
135
+ const timerRef = React.useRef();
136
+
137
+ const clearTimers = () => {
138
+ clearTimeout(timerRef.current);
139
+ };
140
+
141
+ React.useEffect(() => {
142
+ const exists = internalFiles.some(({
143
+ exists,
144
+ file: f
145
+ }) => {
146
+ return exists && f.name === file.name && f.size === file.size;
147
+ });
148
+
149
+ if (exists) {
150
+ updateExists(true);
151
+ clearTimers();
152
+ timerRef.current = setTimeout(() => updateExists(false), 1500);
153
+ }
154
+
155
+ return clearTimers;
156
+ }, [file, internalFiles]);
157
+ return exists;
158
+ }
@@ -1,2 +1,5 @@
1
- import { UploadContextProps, UploadFile } from './types';
1
+ import { UploadFile, UploadContextProps, UploadAcceptedFileTypes } from './types';
2
2
  export declare function verifyFiles(files: UploadFile[], context: Pick<UploadContextProps, 'errorUnsupportedFile' | 'errorLargeFile' | 'acceptedFileTypes' | 'fileMaxSize'>): UploadFile[];
3
+ export declare function extendWithAbbreviation(acceptedFileTypes: UploadAcceptedFileTypes, abbreviations?: {
4
+ jpg: string;
5
+ }): string[];
@@ -17,7 +17,7 @@ export function verifyFiles(files, context) {
17
17
  return false;
18
18
  }
19
19
 
20
- const foundType = acceptedFileTypes.some(type => {
20
+ const foundType = extendWithAbbreviation(acceptedFileTypes).some(type => {
21
21
  return file.type.includes(type);
22
22
  });
23
23
  return !foundType ? errorUnsupportedFile : null;
@@ -36,4 +36,15 @@ export function verifyFiles(files, context) {
36
36
  return item;
37
37
  });
38
38
  return cleanedFiles;
39
+ }
40
+ export function extendWithAbbreviation(acceptedFileTypes, abbreviations = {
41
+ jpg: 'jpeg'
42
+ }) {
43
+ const list = [...acceptedFileTypes];
44
+ Object.entries(abbreviations).forEach(([type, abbr]) => {
45
+ if (list.some(t => t === type) && !list.some(t => t === abbr)) {
46
+ list.push(abbr);
47
+ }
48
+ });
49
+ return list;
39
50
  }
@@ -27,9 +27,22 @@
27
27
  .dnb-upload--active {
28
28
  background-color: #f2f4ec;
29
29
  background-color: var(--color-pistachio); }
30
- .dnb-upload__file-cell--warning .dnb-upload__file-cell__content__left .dnb-icon {
31
- color: #dc2a2a;
32
- color: var(--color-fire-red); }
30
+ .dnb-upload__file-cell {
31
+ /** Highlight Animation */
32
+ -webkit-transition: background-color;
33
+ transition: background-color;
34
+ -webkit-transition-duration: 1.5s;
35
+ transition-duration: 1.5s;
36
+ -webkit-transition-timing-function: cubic-bezier(0.42, 0, 0, 1);
37
+ transition-timing-function: cubic-bezier(0.42, 0, 0, 1);
38
+ -webkit-transition-timing-function: var(--easing-default);
39
+ transition-timing-function: var(--easing-default); }
40
+ .dnb-upload__file-cell--warning .dnb-upload__file-cell__content__left .dnb-icon {
41
+ color: #dc2a2a;
42
+ color: var(--color-fire-red); }
43
+ .dnb-upload__file-cell--highlight {
44
+ background-color: #fbf6ec;
45
+ background-color: var(--color-sand-yellow); }
33
46
  .dnb-upload__text.dnb-p {
34
47
  color: #737373;
35
48
  color: var(--color-black-55); }