@dnb/eufemia 9.28.0 → 9.29.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 (209) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/cjs/components/dialog/style/dnb-dialog.css +9 -6
  3. package/cjs/components/dialog/style/dnb-dialog.min.css +1 -1
  4. package/cjs/components/drawer/style/_drawer.scss +4 -3
  5. package/cjs/components/drawer/style/dnb-drawer.css +17 -10
  6. package/cjs/components/drawer/style/dnb-drawer.min.css +1 -1
  7. package/cjs/components/form-row/FormRowHelpers.d.ts +1 -1
  8. package/cjs/components/lib.d.ts +1 -89
  9. package/cjs/components/modal/style/_modal.scss +0 -1
  10. package/cjs/components/modal/style/dnb-modal.css +9 -6
  11. package/cjs/components/modal/style/dnb-modal.min.css +1 -1
  12. package/cjs/components/skeleton/SkeletonHelper.d.ts +2 -1
  13. package/cjs/components/slider/Slider.d.ts +6 -144
  14. package/cjs/components/slider/Slider.js +5 -595
  15. package/cjs/components/slider/SliderHelpers.d.ts +23 -0
  16. package/cjs/components/slider/SliderHelpers.js +239 -0
  17. package/cjs/components/slider/SliderInstance.d.ts +6 -0
  18. package/cjs/components/slider/SliderInstance.js +190 -0
  19. package/cjs/components/slider/SliderProvider.d.ts +4 -0
  20. package/cjs/components/slider/SliderProvider.js +264 -0
  21. package/cjs/components/slider/SliderThumb.d.ts +2 -0
  22. package/cjs/components/slider/SliderThumb.js +137 -0
  23. package/cjs/components/slider/SliderTrack.d.ts +6 -0
  24. package/cjs/components/slider/SliderTrack.js +131 -0
  25. package/cjs/components/slider/hooks/useSliderEvents.d.ts +11 -0
  26. package/cjs/components/slider/hooks/useSliderEvents.js +146 -0
  27. package/cjs/components/slider/hooks/useSliderProps.d.ts +1 -0
  28. package/cjs/components/slider/hooks/useSliderProps.js +16 -0
  29. package/cjs/components/slider/style/_slider.scss +19 -48
  30. package/cjs/components/slider/style/dnb-slider.css +30 -60
  31. package/cjs/components/slider/style/dnb-slider.min.css +1 -1
  32. package/cjs/components/slider/style/themes/dnb-slider-theme-ui.css +0 -16
  33. package/cjs/components/slider/style/themes/dnb-slider-theme-ui.min.css +1 -1
  34. package/cjs/components/slider/style/themes/dnb-slider-theme-ui.scss +0 -17
  35. package/cjs/components/slider/types.d.ts +75 -0
  36. package/cjs/components/slider/types.js +1 -0
  37. package/cjs/elements/Anchor.d.ts +44 -105
  38. package/cjs/elements/Anchor.js +48 -138
  39. package/cjs/elements/Element.d.ts +23 -40
  40. package/cjs/elements/Element.js +48 -122
  41. package/cjs/elements/Link.d.ts +18 -1
  42. package/cjs/elements/lib.d.ts +36 -2
  43. package/cjs/shared/Context.d.ts +2 -0
  44. package/cjs/shared/Eufemia.js +1 -1
  45. package/cjs/shared/helpers/Suffix.d.ts +2 -1
  46. package/cjs/shared/helpers/Suffix.js +5 -2
  47. package/cjs/shared/helpers/withCamelCaseProps.d.ts +1 -1
  48. package/cjs/shared/helpers/withSnakeCaseProps.d.ts +40 -0
  49. package/cjs/shared/helpers/withSnakeCaseProps.js +168 -0
  50. package/cjs/shared/locales/en-GB.d.ts +3 -3
  51. package/cjs/shared/locales/en-GB.js +3 -3
  52. package/cjs/shared/locales/en-US.d.ts +3 -3
  53. package/cjs/shared/locales/index.d.ts +6 -6
  54. package/cjs/shared/locales/nb-NO.d.ts +3 -3
  55. package/cjs/shared/locales/nb-NO.js +3 -3
  56. package/cjs/style/dnb-ui-components.css +39 -66
  57. package/cjs/style/dnb-ui-components.min.css +3 -3
  58. package/cjs/style/dnb-ui-elements.css +44 -28
  59. package/cjs/style/dnb-ui-elements.min.css +1 -1
  60. package/cjs/style/dnb-ui-tags.css +63 -40
  61. package/cjs/style/dnb-ui-tags.min.css +1 -1
  62. package/cjs/style/elements/_anchor-mixins.scss +6 -3
  63. package/cjs/style/themes/theme-eiendom/dnb-theme-eiendom.css +40 -40
  64. package/cjs/style/themes/theme-eiendom/dnb-theme-eiendom.min.css +2 -2
  65. package/cjs/style/themes/theme-ui/dnb-theme-ui.css +44 -44
  66. package/cjs/style/themes/theme-ui/dnb-theme-ui.min.css +2 -2
  67. package/components/dialog/style/dnb-dialog.css +9 -6
  68. package/components/dialog/style/dnb-dialog.min.css +1 -1
  69. package/components/drawer/style/_drawer.scss +4 -3
  70. package/components/drawer/style/dnb-drawer.css +17 -10
  71. package/components/drawer/style/dnb-drawer.min.css +1 -1
  72. package/components/form-row/FormRowHelpers.d.ts +1 -1
  73. package/components/lib.d.ts +1 -89
  74. package/components/modal/style/_modal.scss +0 -1
  75. package/components/modal/style/dnb-modal.css +9 -6
  76. package/components/modal/style/dnb-modal.min.css +1 -1
  77. package/components/skeleton/SkeletonHelper.d.ts +2 -1
  78. package/components/slider/Slider.d.ts +6 -144
  79. package/components/slider/Slider.js +5 -528
  80. package/components/slider/SliderHelpers.d.ts +23 -0
  81. package/components/slider/SliderHelpers.js +152 -0
  82. package/components/slider/SliderInstance.d.ts +6 -0
  83. package/components/slider/SliderInstance.js +162 -0
  84. package/components/slider/SliderProvider.d.ts +4 -0
  85. package/components/slider/SliderProvider.js +199 -0
  86. package/components/slider/SliderThumb.d.ts +2 -0
  87. package/components/slider/SliderThumb.js +109 -0
  88. package/components/slider/SliderTrack.d.ts +6 -0
  89. package/components/slider/SliderTrack.js +104 -0
  90. package/components/slider/hooks/useSliderEvents.d.ts +11 -0
  91. package/components/slider/hooks/useSliderEvents.js +132 -0
  92. package/components/slider/hooks/useSliderProps.d.ts +1 -0
  93. package/components/slider/hooks/useSliderProps.js +5 -0
  94. package/components/slider/style/_slider.scss +19 -48
  95. package/components/slider/style/dnb-slider.css +30 -60
  96. package/components/slider/style/dnb-slider.min.css +1 -1
  97. package/components/slider/style/themes/dnb-slider-theme-ui.css +0 -16
  98. package/components/slider/style/themes/dnb-slider-theme-ui.min.css +1 -1
  99. package/components/slider/style/themes/dnb-slider-theme-ui.scss +0 -17
  100. package/components/slider/types.d.ts +75 -0
  101. package/components/slider/types.js +1 -0
  102. package/elements/Anchor.d.ts +44 -105
  103. package/elements/Anchor.js +51 -113
  104. package/elements/Element.d.ts +23 -40
  105. package/elements/Element.js +44 -92
  106. package/elements/Link.d.ts +18 -1
  107. package/elements/lib.d.ts +36 -2
  108. package/es/components/dialog/style/dnb-dialog.css +9 -6
  109. package/es/components/dialog/style/dnb-dialog.min.css +1 -1
  110. package/es/components/drawer/style/_drawer.scss +4 -3
  111. package/es/components/drawer/style/dnb-drawer.css +17 -10
  112. package/es/components/drawer/style/dnb-drawer.min.css +1 -1
  113. package/es/components/form-row/FormRowHelpers.d.ts +1 -1
  114. package/es/components/lib.d.ts +1 -89
  115. package/es/components/modal/style/_modal.scss +0 -1
  116. package/es/components/modal/style/dnb-modal.css +9 -6
  117. package/es/components/modal/style/dnb-modal.min.css +1 -1
  118. package/es/components/skeleton/SkeletonHelper.d.ts +2 -1
  119. package/es/components/slider/Slider.d.ts +6 -144
  120. package/es/components/slider/Slider.js +5 -484
  121. package/es/components/slider/SliderHelpers.d.ts +23 -0
  122. package/es/components/slider/SliderHelpers.js +124 -0
  123. package/es/components/slider/SliderInstance.d.ts +6 -0
  124. package/es/components/slider/SliderInstance.js +167 -0
  125. package/es/components/slider/SliderProvider.d.ts +4 -0
  126. package/es/components/slider/SliderProvider.js +178 -0
  127. package/es/components/slider/SliderThumb.d.ts +2 -0
  128. package/es/components/slider/SliderThumb.js +100 -0
  129. package/es/components/slider/SliderTrack.d.ts +6 -0
  130. package/es/components/slider/SliderTrack.js +99 -0
  131. package/es/components/slider/hooks/useSliderEvents.d.ts +11 -0
  132. package/es/components/slider/hooks/useSliderEvents.js +129 -0
  133. package/es/components/slider/hooks/useSliderProps.d.ts +1 -0
  134. package/es/components/slider/hooks/useSliderProps.js +5 -0
  135. package/es/components/slider/style/_slider.scss +19 -48
  136. package/es/components/slider/style/dnb-slider.css +30 -60
  137. package/es/components/slider/style/dnb-slider.min.css +1 -1
  138. package/es/components/slider/style/themes/dnb-slider-theme-ui.css +0 -16
  139. package/es/components/slider/style/themes/dnb-slider-theme-ui.min.css +1 -1
  140. package/es/components/slider/style/themes/dnb-slider-theme-ui.scss +0 -17
  141. package/es/components/slider/types.d.ts +75 -0
  142. package/es/components/slider/types.js +1 -0
  143. package/es/elements/Anchor.d.ts +44 -105
  144. package/es/elements/Anchor.js +49 -80
  145. package/es/elements/Element.d.ts +23 -40
  146. package/es/elements/Element.js +44 -61
  147. package/es/elements/Link.d.ts +18 -1
  148. package/es/elements/lib.d.ts +36 -2
  149. package/es/shared/Context.d.ts +2 -0
  150. package/es/shared/Eufemia.js +1 -1
  151. package/es/shared/helpers/Suffix.d.ts +2 -1
  152. package/es/shared/helpers/Suffix.js +5 -3
  153. package/es/shared/helpers/withCamelCaseProps.d.ts +1 -1
  154. package/es/shared/helpers/withSnakeCaseProps.d.ts +40 -0
  155. package/es/shared/helpers/withSnakeCaseProps.js +72 -0
  156. package/es/shared/locales/en-GB.d.ts +3 -3
  157. package/es/shared/locales/en-GB.js +3 -3
  158. package/es/shared/locales/en-US.d.ts +3 -3
  159. package/es/shared/locales/index.d.ts +6 -6
  160. package/es/shared/locales/nb-NO.d.ts +3 -3
  161. package/es/shared/locales/nb-NO.js +3 -3
  162. package/es/style/dnb-ui-components.css +39 -66
  163. package/es/style/dnb-ui-components.min.css +3 -3
  164. package/es/style/dnb-ui-elements.css +44 -28
  165. package/es/style/dnb-ui-elements.min.css +1 -1
  166. package/es/style/dnb-ui-tags.css +63 -40
  167. package/es/style/dnb-ui-tags.min.css +1 -1
  168. package/es/style/elements/_anchor-mixins.scss +6 -3
  169. package/es/style/themes/theme-eiendom/dnb-theme-eiendom.css +40 -40
  170. package/es/style/themes/theme-eiendom/dnb-theme-eiendom.min.css +2 -2
  171. package/es/style/themes/theme-ui/dnb-theme-ui.css +44 -44
  172. package/es/style/themes/theme-ui/dnb-theme-ui.min.css +2 -2
  173. package/esm/dnb-ui-basis.min.mjs +1 -1
  174. package/esm/dnb-ui-components.min.mjs +3 -3
  175. package/esm/dnb-ui-elements.min.mjs +9 -10
  176. package/esm/dnb-ui-extensions.min.mjs +4 -4
  177. package/esm/dnb-ui-lib.min.mjs +3 -3
  178. package/esm/dnb-ui-web-components.min.mjs +3 -3
  179. package/package.json +1 -1
  180. package/shared/Context.d.ts +2 -0
  181. package/shared/Eufemia.js +1 -1
  182. package/shared/helpers/Suffix.d.ts +2 -1
  183. package/shared/helpers/Suffix.js +4 -2
  184. package/shared/helpers/withCamelCaseProps.d.ts +1 -1
  185. package/shared/helpers/withSnakeCaseProps.d.ts +40 -0
  186. package/shared/helpers/withSnakeCaseProps.js +115 -0
  187. package/shared/locales/en-GB.d.ts +3 -3
  188. package/shared/locales/en-GB.js +3 -3
  189. package/shared/locales/en-US.d.ts +3 -3
  190. package/shared/locales/index.d.ts +6 -6
  191. package/shared/locales/nb-NO.d.ts +3 -3
  192. package/shared/locales/nb-NO.js +3 -3
  193. package/style/dnb-ui-components.css +39 -66
  194. package/style/dnb-ui-components.min.css +3 -3
  195. package/style/dnb-ui-elements.css +44 -28
  196. package/style/dnb-ui-elements.min.css +1 -1
  197. package/style/dnb-ui-tags.css +63 -40
  198. package/style/dnb-ui-tags.min.css +1 -1
  199. package/style/elements/_anchor-mixins.scss +6 -3
  200. package/style/themes/theme-eiendom/dnb-theme-eiendom.css +40 -40
  201. package/style/themes/theme-eiendom/dnb-theme-eiendom.min.css +2 -2
  202. package/style/themes/theme-ui/dnb-theme-ui.css +44 -44
  203. package/style/themes/theme-ui/dnb-theme-ui.min.css +2 -2
  204. package/umd/dnb-ui-basis.min.js +1 -1
  205. package/umd/dnb-ui-components.min.js +5 -5
  206. package/umd/dnb-ui-elements.min.js +20 -21
  207. package/umd/dnb-ui-extensions.min.js +3 -3
  208. package/umd/dnb-ui-lib.min.js +4 -4
  209. package/umd/dnb-ui-web-components.min.js +3 -3
@@ -0,0 +1,124 @@
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import _extends from "@babel/runtime/helpers/esm/extends";
3
+
4
+ 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; }
5
+
6
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
7
+
8
+ import { format } from '../number-format/NumberUtils';
9
+ export const percentToValue = (percent, min, max) => {
10
+ if (typeof min === 'string') {
11
+ min = parseFloat(min);
12
+ }
13
+
14
+ if (typeof max === 'string') {
15
+ max = parseFloat(max);
16
+ }
17
+
18
+ return (max - min) * percent / 100 + min;
19
+ };
20
+ export const roundToStep = (number, step) => Math.round(number / step) * step;
21
+ export const getOffset = node => {
22
+ const {
23
+ pageYOffset,
24
+ pageXOffset
25
+ } = typeof window !== 'undefined' ? window : {
26
+ pageYOffset: 0,
27
+ pageXOffset: 0
28
+ };
29
+ const {
30
+ left,
31
+ top
32
+ } = node.getBoundingClientRect();
33
+ return {
34
+ top: top + pageYOffset,
35
+ left: left + pageXOffset
36
+ };
37
+ };
38
+ export const getMousePosition = event => {
39
+ if (event.changedTouches && event.changedTouches[0]) {
40
+ return {
41
+ x: event.changedTouches[0].pageX,
42
+ y: event.changedTouches[0].pageY
43
+ };
44
+ }
45
+
46
+ return {
47
+ x: event.pageX,
48
+ y: event.pageY
49
+ };
50
+ };
51
+ export const calculatePercent = (node, event, isVertical, isReverted) => {
52
+ const {
53
+ width,
54
+ height
55
+ } = node.getBoundingClientRect();
56
+ const {
57
+ top,
58
+ left
59
+ } = getOffset(node);
60
+ const {
61
+ x,
62
+ y
63
+ } = getMousePosition(event);
64
+ const value = isVertical ? y - top : x - left;
65
+ const onePercent = (isVertical ? height : width) / 100;
66
+ return Math.abs((isReverted ? 100 : 0) - clamp(value / onePercent));
67
+ };
68
+ export const clamp = (value, min = 0, max = 100) => Math.min(Math.max(value, min), max);
69
+ export const roundValue = (value, step) => {
70
+ return step > 0 ? roundToStep(value, step) : parseFloat(parseFloat(String(value)).toFixed(3));
71
+ };
72
+ export const createMockDiv = ({
73
+ width,
74
+ height
75
+ }) => {
76
+ const div = document.createElement('div');
77
+
78
+ _extends(div.style, {
79
+ width: `${width}px`,
80
+ height: `${height}px`
81
+ });
82
+
83
+ div.getBoundingClientRect = () => ({
84
+ width,
85
+ height,
86
+ top: 0,
87
+ left: 0,
88
+ right: width,
89
+ bottom: height
90
+ });
91
+
92
+ return div;
93
+ };
94
+ export const getUpdatedValues = (value, index, newValue) => {
95
+ return value.map((val, i) => {
96
+ if (i === index) {
97
+ val = newValue;
98
+ }
99
+
100
+ return val;
101
+ });
102
+ };
103
+ export const closestIndex = (goal, array) => {
104
+ const res = [...array].sort((a, b) => Math.abs(goal - a) - Math.abs(goal - b))[0];
105
+ return array.findIndex(num => num === res);
106
+ };
107
+ export const formatNumber = (value, opts = null) => {
108
+ if (opts) {
109
+ return format(value, opts);
110
+ }
111
+
112
+ return value;
113
+ };
114
+ export const getHumanNumber = (value, numberFormat) => {
115
+ const num = value;
116
+ const {
117
+ aria: humanNumber
118
+ } = numberFormat ? formatNumber(num, _objectSpread(_objectSpread({}, numberFormat || {}), {}, {
119
+ returnAria: true
120
+ })) : {
121
+ aria: null
122
+ };
123
+ return String(humanNumber || value);
124
+ };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Web Slider Component
3
+ *
4
+ */
5
+ /// <reference types="react" />
6
+ export declare function SliderInstance(): JSX.Element;
@@ -0,0 +1,167 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+
3
+ var _SubtractButton, _AddButton, _AlignmentHelper, _SliderMainTrack, _SliderSuffix;
4
+
5
+ import React from 'react';
6
+ import classnames from 'classnames';
7
+ import { isTrue } from '../../shared/component-helper';
8
+ import AlignmentHelper from '../../shared/AlignmentHelper';
9
+ import { createSpacingClasses } from '../space/SpacingHelper';
10
+ import { createSkeletonClass, skeletonDOMAttributes } from '../skeleton/SkeletonHelper';
11
+ import Context from '../../shared/Context';
12
+ import Suffix from '../../shared/helpers/Suffix';
13
+ import Button from '../button/Button';
14
+ import FormLabel from '../form-label/FormLabel';
15
+ import FormStatus from '../form-status/FormStatus';
16
+ import { SliderMainTrack, SliderTrackAfter, SliderTrackBefore } from './SliderTrack';
17
+ import { SliderThumb } from './SliderThumb';
18
+ import { useSliderProps } from './hooks/useSliderProps';
19
+ import { clamp, getHumanNumber } from './SliderHelpers';
20
+ export function SliderInstance() {
21
+ const context = React.useContext(Context);
22
+ const {
23
+ isReverse,
24
+ isVertical,
25
+ showButtons,
26
+ showStatus,
27
+ allProps
28
+ } = useSliderProps();
29
+ const {
30
+ id,
31
+ label,
32
+ labelSrOnly,
33
+ labelDirection,
34
+ status,
35
+ statusProps,
36
+ statusState,
37
+ statusNoAnimation,
38
+ globalStatusId,
39
+ stretch,
40
+ skeleton,
41
+ disabled,
42
+ className
43
+ } = allProps;
44
+ const mainParams = {
45
+ className: classnames("dnb-slider dnb-form-component", createSkeletonClass(null, skeleton), createSpacingClasses(allProps), className, isReverse && 'dnb-slider--reverse', isVertical && 'dnb-slider--vertical', disabled && 'dnb-slider__state--disabled', !showButtons && 'dnb-slider--no-buttons', isTrue(stretch) && 'dnb-slider--stretch', label && labelDirection && `dnb-slider__label--${labelDirection}`, showStatus && 'dnb-slider__form-status', status && `dnb-slider__status--${statusState}`)
46
+ };
47
+ const subtractButton = showButtons ? _SubtractButton || (_SubtractButton = React.createElement(SubtractButton, null)) : null;
48
+ const addButton = showButtons ? _AddButton || (_AddButton = React.createElement(AddButton, null)) : null;
49
+ skeletonDOMAttributes(mainParams, skeleton, context);
50
+ return React.createElement("span", mainParams, label && React.createElement(FormLabel, {
51
+ id: id + '-label',
52
+ text: label,
53
+ disabled: disabled,
54
+ skeleton: skeleton,
55
+ label_direction: labelDirection,
56
+ sr_only: labelSrOnly
57
+ }), React.createElement("span", {
58
+ className: "dnb-slider__wrapper"
59
+ }, _AlignmentHelper || (_AlignmentHelper = React.createElement(AlignmentHelper, null)), React.createElement(FormStatus, _extends({
60
+ show: showStatus,
61
+ id: id + '-form-status',
62
+ global_status_id: globalStatusId,
63
+ label: label,
64
+ text_id: id + '-status',
65
+ text: status,
66
+ status: statusState,
67
+ no_animation: statusNoAnimation,
68
+ skeleton: skeleton
69
+ }, statusProps)), React.createElement("span", {
70
+ className: "dnb-slider__inner"
71
+ }, showButtons && (isReverse ? addButton : subtractButton), _SliderMainTrack || (_SliderMainTrack = React.createElement(SliderMainTrack, null, React.createElement(SliderThumb, null), React.createElement(SliderTrackBefore, null), React.createElement(SliderTrackAfter, null))), showButtons && (isReverse ? subtractButton : addButton), _SliderSuffix || (_SliderSuffix = React.createElement(SliderSuffix, null)))));
72
+ }
73
+
74
+ function SliderSuffix() {
75
+ const {
76
+ allProps
77
+ } = useSliderProps();
78
+ const {
79
+ id,
80
+ suffix
81
+ } = allProps;
82
+ return suffix ? React.createElement(Suffix, {
83
+ className: "dnb-slider__suffix",
84
+ id: id + '-suffix',
85
+ context: allProps
86
+ }, suffix) : null;
87
+ }
88
+
89
+ function SubtractButton() {
90
+ const {
91
+ emitChange,
92
+ value,
93
+ attributes,
94
+ allProps
95
+ } = useSliderProps();
96
+ const {
97
+ step,
98
+ min,
99
+ max,
100
+ disabled,
101
+ skeleton,
102
+ subtractTitle,
103
+ numberFormat
104
+ } = allProps;
105
+
106
+ const onSubtractClickHandler = event => {
107
+ emitChange(event, clamp(value - (step || 1), min, max));
108
+ };
109
+
110
+ const subtractParams = {};
111
+
112
+ if (typeof attributes['aria-hidden'] !== 'undefined') {
113
+ subtractParams['aria-hidden'] = attributes['aria-hidden'];
114
+ }
115
+
116
+ const humanNumber = getHumanNumber(value, numberFormat);
117
+ return React.createElement(Button, _extends({
118
+ className: "dnb-slider__button dnb-slider__button--subtract",
119
+ variant: "secondary",
120
+ icon: "subtract",
121
+ size: "small",
122
+ "aria-label": subtractTitle === null || subtractTitle === void 0 ? void 0 : subtractTitle.replace('%s', humanNumber),
123
+ on_click: onSubtractClickHandler,
124
+ disabled: disabled,
125
+ skeleton: skeleton
126
+ }, subtractParams));
127
+ }
128
+
129
+ function AddButton() {
130
+ const {
131
+ emitChange,
132
+ value,
133
+ attributes,
134
+ allProps
135
+ } = useSliderProps();
136
+ const {
137
+ step,
138
+ min,
139
+ max,
140
+ disabled,
141
+ skeleton,
142
+ addTitle,
143
+ numberFormat
144
+ } = allProps;
145
+
146
+ const onAddClickHandler = event => {
147
+ emitChange(event, clamp(value + (step || 1), min, max));
148
+ };
149
+
150
+ const addParams = {};
151
+
152
+ if (typeof attributes['aria-hidden'] !== 'undefined') {
153
+ addParams['aria-hidden'] = attributes['aria-hidden'];
154
+ }
155
+
156
+ const humanNumber = getHumanNumber(value, numberFormat);
157
+ return React.createElement(Button, _extends({
158
+ className: "dnb-slider__button dnb-slider__button--add",
159
+ variant: "secondary",
160
+ icon: "add",
161
+ size: "small",
162
+ "aria-label": addTitle === null || addTitle === void 0 ? void 0 : addTitle.replace('%s', humanNumber),
163
+ on_click: onAddClickHandler,
164
+ disabled: disabled,
165
+ skeleton: skeleton
166
+ }, addParams));
167
+ }
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { SliderProps, SliderContextTypes } from './types';
3
+ export declare const SliderContext: React.Context<SliderContextTypes>;
4
+ export declare function SliderProvider(localProps: SliderProps): JSX.Element;
@@ -0,0 +1,178 @@
1
+ import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
2
+ const _excluded = ["step", "label", "labelDirection", "labelSrOnly", "status", "statusState", "statusProps", "statusNoAnimation", "globalStatusId", "stretch", "suffix", "thumbTitle", "subtractTitle", "addTitle", "hideButtons", "numberFormat", "skeleton", "max", "min", "disabled", "className", "id", "onInit", "onChange", "onDragStart", "onDragEnd", "vertical", "reverse", "value", "children"];
3
+ import React from 'react';
4
+ import { includeValidProps } from '../../components/form-row/FormRowHelpers';
5
+ import { usePropsWithContext } from '../../shared/hooks';
6
+ import { warn, isTrue, makeUniqueId, dispatchCustomElementEvent, getStatusState } from '../../shared/component-helper';
7
+ import Context from '../../shared/Context';
8
+ import { closestIndex, formatNumber, getUpdatedValues, roundValue } from './SliderHelpers';
9
+ import { convertSnakeCaseProps } from '../../shared/helpers/withSnakeCaseProps';
10
+ const defaultProps = {
11
+ statusState: 'error',
12
+ addTitle: '+',
13
+ subtractTitle: '−',
14
+ min: 0,
15
+ max: 100,
16
+ value: -1
17
+ };
18
+ export const SliderContext = React.createContext(null);
19
+ export function SliderProvider(localProps) {
20
+ const context = React.useContext(Context);
21
+ const allProps = convertSnakeCaseProps(usePropsWithContext(localProps, defaultProps, {
22
+ skeleton: context === null || context === void 0 ? void 0 : context.skeleton
23
+ }, context === null || context === void 0 ? void 0 : context.getTranslation(localProps).Slider, includeValidProps(context === null || context === void 0 ? void 0 : context.FormRow, {
24
+ vertical: null
25
+ }), context === null || context === void 0 ? void 0 : context.Slider));
26
+ const [_id] = React.useState(makeUniqueId);
27
+
28
+ if (!allProps.id) {
29
+ allProps.id = _id;
30
+ }
31
+
32
+ const {
33
+ step,
34
+ label,
35
+ labelDirection,
36
+ labelSrOnly,
37
+ status,
38
+ statusState,
39
+ statusProps,
40
+ statusNoAnimation,
41
+ globalStatusId,
42
+ stretch,
43
+ suffix,
44
+ thumbTitle: title,
45
+ subtractTitle,
46
+ addTitle,
47
+ hideButtons,
48
+ numberFormat,
49
+ skeleton,
50
+ max,
51
+ min,
52
+ disabled,
53
+ className,
54
+ id,
55
+ onInit,
56
+ onChange,
57
+ onDragStart,
58
+ onDragEnd,
59
+ vertical: _vertical,
60
+ reverse: _reverse,
61
+ value: _value,
62
+ children: _children
63
+ } = allProps,
64
+ attributes = _objectWithoutProperties(allProps, _excluded);
65
+
66
+ const [value, setValue] = React.useState(_value);
67
+ const [thumbState, setThumbState] = React.useState('initial');
68
+ const thumbIndex = React.useRef(-1);
69
+ const [isVertical] = React.useState(isTrue(_vertical));
70
+ const [isReverse] = React.useState(isVertical ? !isTrue(_reverse) : isTrue(_reverse));
71
+ const isMulti = Array.isArray(value);
72
+
73
+ const setThumbIndex = index => {
74
+ if (!isNaN(index)) {
75
+ thumbIndex.current = index;
76
+ }
77
+ };
78
+
79
+ if (allProps.use_scrollwheel) {
80
+ warn('use_scrollwheel is not supported anymore!');
81
+ }
82
+
83
+ const getAndUpdateCurrentIndex = currentValue => {
84
+ let currentIndex = null;
85
+
86
+ if (thumbIndex.current > -1) {
87
+ currentIndex = thumbIndex.current;
88
+ } else {
89
+ currentIndex = closestIndex(currentValue, value);
90
+ setThumbIndex(currentIndex);
91
+ }
92
+
93
+ return currentIndex;
94
+ };
95
+
96
+ const emitChange = (event, rawValue) => {
97
+ if (disabled || isTrue(skeleton)) {
98
+ return;
99
+ }
100
+
101
+ const currentValue = roundValue(rawValue, step);
102
+
103
+ if (currentValue > -1 && rawValue !== value) {
104
+ let newValue = currentValue;
105
+
106
+ if (isMulti) {
107
+ const currentIndex = getAndUpdateCurrentIndex(currentValue);
108
+ newValue = getUpdatedValues(value, currentIndex, currentValue);
109
+ }
110
+
111
+ if (typeof onChange === 'function') {
112
+ const obj = {
113
+ value: newValue,
114
+ rawValue,
115
+ raw_value: rawValue,
116
+ event,
117
+ number: null
118
+ };
119
+
120
+ if (numberFormat) {
121
+ obj.number = formatNumber(currentValue, numberFormat);
122
+ }
123
+
124
+ dispatchCustomElementEvent(allProps, 'onChange', obj);
125
+ }
126
+
127
+ setValue(newValue);
128
+ }
129
+ };
130
+
131
+ React.useEffect(() => {
132
+ if (isMulti) {
133
+ const hasChanged = _value.some((val, i) => {
134
+ return val !== value[i];
135
+ });
136
+
137
+ if (hasChanged) {
138
+ setValue(_value);
139
+ }
140
+ } else {
141
+ setValue(_value);
142
+ }
143
+ }, [_value, isMulti]);
144
+ const trackRef = React.useRef();
145
+ const jumpedTimeout = React.useRef();
146
+
147
+ const setJumpedState = () => {
148
+ setThumbState('jumped');
149
+ clearTimeout(jumpedTimeout.current);
150
+ jumpedTimeout.current = setTimeout(() => setThumbState('normal'), 100);
151
+ };
152
+
153
+ const showStatus = getStatusState(status);
154
+ const showButtons = !isMulti && !isTrue(hideButtons);
155
+ const values = isMulti ? value : [value];
156
+ return React.createElement(SliderContext.Provider, {
157
+ value: {
158
+ isMulti,
159
+ isReverse,
160
+ isVertical,
161
+ value,
162
+ values,
163
+ setValue,
164
+ attributes,
165
+ showStatus,
166
+ showButtons,
167
+ thumbState,
168
+ setThumbState,
169
+ thumbIndex,
170
+ setThumbIndex,
171
+ emitChange,
172
+ allProps,
173
+ trackRef,
174
+ setJumpedState,
175
+ jumpedTimeout
176
+ }
177
+ }, localProps.children);
178
+ }
@@ -0,0 +1,2 @@
1
+ /// <reference types="react" />
2
+ export declare function SliderThumb(): JSX.Element;
@@ -0,0 +1,100 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
3
+
4
+ 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; }
5
+
6
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
7
+
8
+ import React from 'react';
9
+ import { combineDescribedBy, combineLabelledBy, validateDOMAttributes } from '../../shared/component-helper';
10
+ import Button from '../button/Button';
11
+ import { useSliderEvents } from './hooks/useSliderEvents';
12
+ import { useSliderProps } from './hooks/useSliderProps';
13
+ import { clamp, getHumanNumber } from './SliderHelpers';
14
+ export function SliderThumb() {
15
+ const {
16
+ values,
17
+ thumbIndex,
18
+ isVertical,
19
+ showStatus,
20
+ attributes,
21
+ allProps
22
+ } = useSliderProps();
23
+ const {
24
+ id,
25
+ label,
26
+ min,
27
+ max,
28
+ step,
29
+ skeleton,
30
+ disabled,
31
+ suffix,
32
+ numberFormat
33
+ } = allProps;
34
+ const {
35
+ onThumbMouseDownHandler,
36
+ onThumbMouseUpHandler,
37
+ onThumbBlurHandler,
38
+ onThumbFocusHandler,
39
+ onHelperChangeHandler,
40
+ onHelperFocusHandler
41
+ } = useSliderEvents();
42
+
43
+ const thumbParams = _objectSpread({
44
+ onBlur: onThumbBlurHandler,
45
+ onFocus: onThumbFocusHandler
46
+ }, attributes);
47
+
48
+ const helperParams = {};
49
+
50
+ if (label) {
51
+ helperParams['aria-labelledby'] = combineLabelledBy(helperParams, label ? id + '-label' : null);
52
+ }
53
+
54
+ if (showStatus || suffix) {
55
+ helperParams['aria-describedby'] = combineDescribedBy(helperParams, showStatus ? id + '-status' : null, suffix ? id + '-suffix' : null);
56
+ }
57
+
58
+ validateDOMAttributes(null, helperParams);
59
+ validateDOMAttributes(allProps, thumbParams);
60
+ return React.createElement(React.Fragment, null, values.map((value, i) => {
61
+ const index = thumbIndex.current;
62
+ const percent = clamp((value - min) * 100 / (max - min));
63
+ const style = {
64
+ zIndex: index === i ? 4 : 3,
65
+ [`${isVertical ? 'top' : 'left'}`]: `${percent}%`
66
+ };
67
+ const humanNumber = getHumanNumber(value, numberFormat);
68
+ return React.createElement(React.Fragment, {
69
+ key: i
70
+ }, React.createElement("span", {
71
+ className: "dnb-slider__thumb",
72
+ style: style
73
+ }, React.createElement("input", _extends({
74
+ type: "range",
75
+ className: "dnb-slider__button-helper",
76
+ min: min,
77
+ max: max,
78
+ step: step,
79
+ value: value,
80
+ disabled: disabled,
81
+ onChange: onHelperChangeHandler,
82
+ onFocus: onHelperFocusHandler,
83
+ "aria-valuemin": min,
84
+ "aria-valuemax": max,
85
+ "aria-valuenow": value,
86
+ "aria-valuetext": humanNumber ? humanNumber : undefined,
87
+ "aria-orientation": isVertical ? 'vertical' : 'horizontal',
88
+ "data-index": i
89
+ }, helperParams)), React.createElement(Button, _extends({
90
+ element: "span",
91
+ type: "",
92
+ variant: "secondary",
93
+ disabled: disabled,
94
+ skeleton: skeleton,
95
+ "data-index": i,
96
+ onMouseDown: onThumbMouseDownHandler,
97
+ onMouseUp: onThumbMouseUpHandler
98
+ }, thumbParams))));
99
+ }));
100
+ }
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ export declare function SliderMainTrack({ children, }: {
3
+ children: React.ReactNode | React.ReactNode[];
4
+ }): JSX.Element;
5
+ export declare function SliderTrackBefore(): JSX.Element;
6
+ export declare function SliderTrackAfter(): JSX.Element;
@@ -0,0 +1,99 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
2
+
3
+ var _span;
4
+
5
+ import React from 'react';
6
+ import { dispatchCustomElementEvent, validateDOMAttributes } from '../../shared/component-helper';
7
+ import { useSliderEvents } from './hooks/useSliderEvents';
8
+ import { useSliderProps } from './hooks/useSliderProps';
9
+ import { clamp, formatNumber } from './SliderHelpers';
10
+ export function SliderMainTrack({
11
+ children
12
+ }) {
13
+ const {
14
+ isMulti,
15
+ value,
16
+ allProps,
17
+ trackRef,
18
+ jumpedTimeout,
19
+ thumbState
20
+ } = useSliderProps();
21
+ const {
22
+ id,
23
+ numberFormat,
24
+ onInit
25
+ } = allProps;
26
+ const {
27
+ onTrackClickHandler,
28
+ onThumbMouseDownHandler,
29
+ removeEvents
30
+ } = useSliderEvents();
31
+ React.useEffect(() => {
32
+ if (typeof onInit === 'function' && !isMulti) {
33
+ const obj = {
34
+ value,
35
+ number: null
36
+ };
37
+
38
+ if (numberFormat) {
39
+ obj.number = formatNumber(value, numberFormat);
40
+ }
41
+
42
+ dispatchCustomElementEvent(allProps, 'onInit', obj);
43
+ }
44
+
45
+ return () => {
46
+ removeEvents();
47
+ clearTimeout(jumpedTimeout.current);
48
+ };
49
+ }, []);
50
+ const trackParams = {
51
+ className: 'dnb-slider__track' + (thumbState ? ` dnb-slider__state--${thumbState}` : ""),
52
+ onTouchStart: onTrackClickHandler,
53
+ onTouchStartCapture: onThumbMouseDownHandler,
54
+ onMouseDown: onTrackClickHandler,
55
+ onMouseDownCapture: onThumbMouseDownHandler
56
+ };
57
+ validateDOMAttributes(null, trackParams);
58
+ return React.createElement("span", _extends({
59
+ id: id,
60
+ ref: trackRef
61
+ }, trackParams), children);
62
+ }
63
+ const trackObj = [['right', 'left'], ['bottom', 'top']];
64
+ export function SliderTrackBefore() {
65
+ const {
66
+ values: origValues,
67
+ isVertical,
68
+ thumbIndex,
69
+ allProps: {
70
+ min,
71
+ max
72
+ }
73
+ } = useSliderProps();
74
+ const values = origValues.sort((a, b) => a - b);
75
+ const isBetween = values.length >= 2;
76
+
77
+ if (isBetween && values[0] > values[values.length - 1]) {
78
+ values.reverse();
79
+ }
80
+
81
+ const index = thumbIndex.current;
82
+ const upperValue = values[isBetween ? 0 : index > -1 ? index : 0];
83
+ const upperPercent = isBetween ? clamp((upperValue - min) * 100 / (max - min)) : 0;
84
+ const lowerValue = values[isBetween ? values.length - 1 : index > -1 ? index : 0];
85
+ const lowerPercent = 100 - clamp((lowerValue - min) * 100 / (max - min));
86
+ const units = [trackObj[isVertical ? 1 : 0][0], trackObj[isVertical ? 1 : 0][1]];
87
+ const style = {};
88
+ style[units[0]] = `${lowerPercent}%`;
89
+ style[units[1]] = `${upperPercent}%`;
90
+ return React.createElement("span", {
91
+ className: "dnb-slider__line dnb-slider__line__before",
92
+ style: style
93
+ });
94
+ }
95
+ export function SliderTrackAfter() {
96
+ return _span || (_span = React.createElement("span", {
97
+ className: "dnb-slider__line dnb-slider__line__after"
98
+ }));
99
+ }