@enact/limestone 1.9.3 → 1.10.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 (90) hide show
  1. package/.github/workflows/ci-reusable.yml +2 -2
  2. package/Alert/Alert.d.ts +9 -0
  3. package/Alert/Alert.js +35 -4
  4. package/Alert/Alert.module.css +12 -1
  5. package/Alert/tests/Alert-specs.js +91 -0
  6. package/Button/tests/Button-specs.js +26 -0
  7. package/CHANGELOG.md +34 -0
  8. package/Card/Card.d.ts +4 -4
  9. package/Card/Card.js +7 -8
  10. package/Card/tests/Card-specs.js +39 -5
  11. package/CheckboxItem/CheckboxItem.js +6 -4
  12. package/Chips/Chip.js +12 -6
  13. package/Chips/Chips.js +12 -6
  14. package/Chips/tests/Chip-specs.js +25 -5
  15. package/Chips/tests/Chips-specs.js +12 -2
  16. package/ColorPicker/ColorPicker.js +27 -25
  17. package/ContextualPopupDecorator/ContextualPopupDecorator.js +32 -22
  18. package/DayPicker/DaySelectorDecorator.js +12 -7
  19. package/Dropdown/Dropdown.module.css +4 -0
  20. package/Dropdown/DropdownList.js +74 -53
  21. package/FlexiblePopupPanels/useNavButtonFocus.js +7 -10
  22. package/Heading/Heading.d.ts +1 -1
  23. package/Heading/Heading.js +2 -2
  24. package/Icon/Icon.d.ts +1 -0
  25. package/Icon/Icon.js +1 -0
  26. package/Icon/IconList.js +2 -0
  27. package/IconItem/IconItem.module.css +3 -3
  28. package/IconItem/tests/IconItem-specs.js +30 -1
  29. package/Image/Image.js +6 -4
  30. package/Input/Input.js +12 -1
  31. package/Input/InputField.js +75 -24
  32. package/Input/InputField.module.css +262 -45
  33. package/Input/InputFieldDecoratorIcon.js +1 -0
  34. package/Input/InputFieldSpotlightDecorator.js +53 -8
  35. package/Input/index.d.ts +105 -93
  36. package/Input/tests/Input-specs.js +26 -0
  37. package/Input/tests/InputField-specs.js +149 -3
  38. package/Input/tests/InputPopup-specs.js +1 -1
  39. package/KeyGuide/KeyGuide.js +29 -27
  40. package/MediaOverlay/tests/MediaOverlay-specs.js +29 -0
  41. package/MediaPlayer/tests/util-specs.js +4 -1
  42. package/PageViews/PageViews.js +134 -69
  43. package/PageViews/PageViews.module.css +3 -0
  44. package/PageViews/PageViewsRouter.js +91 -42
  45. package/PageViews/tests/PageViews-specs.js +87 -0
  46. package/Panels/Header.js +6 -4
  47. package/Popup/Popup.js +5 -4
  48. package/PopupTabLayout/PopupTabLayout.js +11 -9
  49. package/RadioItem/RadioItem.js +7 -5
  50. package/Scroller/EditableWrapper.js +17 -14
  51. package/Scroller/Scroller.js +11 -10
  52. package/Scroller/useThemeScroller.js +3 -3
  53. package/Slider/Slider.d.ts +4 -0
  54. package/Slider/Slider.js +40 -16
  55. package/Slider/Slider.module.css +150 -0
  56. package/Slider/SliderBehaviorDecorator.js +16 -14
  57. package/Slider/tests/Slider-specs.js +51 -0
  58. package/Slider/utils.js +23 -7
  59. package/Spinner/Spinner.js +10 -8
  60. package/TabLayout/RefocusDecorator.js +14 -12
  61. package/TabLayout/tests/TabGroup-specs.js +1 -1
  62. package/ThemeDecorator/AccessibilityDecorator.js +12 -11
  63. package/ThemeDecorator/I18nFontDecorator.js +6 -4
  64. package/ThemeDecorator/ThemeDecorator.d.ts +7 -0
  65. package/ThemeDecorator/ThemeDecorator.js +24 -9
  66. package/TimePicker/TimePickerBase.js +5 -3
  67. package/TooltipDecorator/TooltipDecorator.js +12 -7
  68. package/TooltipDecorator/tests/useTooltip-specs.js +5 -2
  69. package/VideoPlayer/VideoPlayer.js +25 -24
  70. package/VirtualList/VirtualList.js +20 -18
  71. package/VirtualList/useSpotlight.js +1 -1
  72. package/fonts/Limestone_Icons.ttf +0 -0
  73. package/internal/AsyncRenderChildren/AsyncRenderChildren.js +9 -5
  74. package/internal/AsyncRenderChildren/tests/AsyncRenderChildren-specs.js +4 -1
  75. package/internal/DateTime/DateTimeDecorator.js +5 -4
  76. package/internal/Panels/PanelsRouter.js +35 -29
  77. package/internal/Panels/useAutoFocus.js +10 -6
  78. package/internal/Panels/useFocusOnTransition.js +4 -3
  79. package/internal/Picker/Picker.js +7 -5
  80. package/internal/Picker/SpottablePicker.js +15 -13
  81. package/internal/SharedStateDecorator/SharedStateDecorator.js +6 -4
  82. package/package.json +14 -11
  83. package/styles/colors.less +1 -0
  84. package/styles/variables.less +1 -1
  85. package/useScroll/HoverToScroll.js +15 -12
  86. package/useScroll/Scrollbar.js +14 -10
  87. package/useScroll/ScrollbarPlaceholder.js +3 -5
  88. package/useScroll/ScrollbarTrack.js +7 -5
  89. package/useScroll/useEvent.js +7 -2
  90. package/useScroll/useScroll.js +10 -2
@@ -24,6 +24,10 @@ input keys.
24
24
  * Sets the knob to selected state and allows it to move via 5-way controls.
25
25
  */
26
26
  active?: boolean;
27
+ /**
28
+ * Indicates if this component will be used as a colorPicker.
29
+ */
30
+ colorPicker?: boolean;
27
31
  /**
28
32
  * Customizes the component by mapping the supplied collection of CSS class names to the
29
33
  corresponding internal elements and states of this component.
package/Slider/Slider.js CHANGED
@@ -36,7 +36,7 @@ var _SliderBehaviorDecorator = _interopRequireDefault(require("./SliderBehaviorD
36
36
  var _utils = require("./utils");
37
37
  var _SliderModule = _interopRequireDefault(require("./Slider.module.css"));
38
38
  var _jsxRuntime = require("react/jsx-runtime");
39
- var _excluded = ["active", "className", "css", "disabled", "focused", "keyFrequency", "max", "min", "pressed", "showAnchor", "showMinMax"];
39
+ var _excluded = ["active", "className", "colorPicker", "css", "disabled", "focused", "keyFrequency", "max", "min", "pressed", "showAnchor", "showMinMax"];
40
40
  /**
41
41
  * Provides Limestone-themed slider components and behaviors.
42
42
  *
@@ -66,6 +66,7 @@ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t =
66
66
  var sliderDefaultProps = {
67
67
  activateOnSelect: false,
68
68
  active: false,
69
+ colorPicker: false,
69
70
  disabled: false,
70
71
  keyFrequency: [1],
71
72
  max: 100,
@@ -86,10 +87,12 @@ var sliderDefaultProps = {
86
87
  * @ui
87
88
  * @public
88
89
  */
89
- var SliderBase = exports.SliderBase = function SliderBase(props) {
90
+ var _SliderBase = exports.SliderBase = function SliderBase(props) {
90
91
  var sliderProps = (0, _util.setDefaultProps)(props, sliderDefaultProps);
92
+ (0, _util.checkPropTypes)(_SliderBase, sliderProps);
91
93
  var active = sliderProps.active,
92
94
  className = sliderProps.className,
95
+ colorPicker = sliderProps.colorPicker,
93
96
  css = sliderProps.css,
94
97
  disabled = sliderProps.disabled,
95
98
  focused = sliderProps.focused,
@@ -114,12 +117,13 @@ var SliderBase = exports.SliderBase = function SliderBase(props) {
114
117
  valueName: 'max'
115
118
  })(sliderProps);
116
119
  var tooltip = sliderProps.tooltip === true ? _ProgressBar2.ProgressBarTooltip : sliderProps.tooltip;
120
+ var context = (0, _react.useMemo)(function () {
121
+ return {
122
+ lastWheelTimeStamp: 0
123
+ };
124
+ }, []);
117
125
  var spotlightAccelerator = (0, _react.useRef)();
118
126
  var ref = (0, _react.useRef)();
119
- var _useRef = (0, _react.useRef)({
120
- lastWheelTimeStamp: 0
121
- }),
122
- context = _useRef.current;
123
127
  var handlers = (0, _useHandlers["default"])({
124
128
  onBlur: (0, _handle.handle)((0, _handle.forward)('onBlur'), (0, _handle.forProp)('active', true), (0, _handle.forward)('onActivate')),
125
129
  onKeyDown: (0, _handle.handle)((0, _handle.forProp)('disabled', false), (0, _handle.forwardWithPrevent)('onKeyDown'), (0, _anyPass["default"])([_utils.handleIncrement, _utils.handleDecrement])),
@@ -135,7 +139,7 @@ var SliderBase = exports.SliderBase = function SliderBase(props) {
135
139
  customCss: css,
136
140
  publicClassNames: true
137
141
  });
138
- var componentClassName = (0, _classnames2["default"])(_SliderModule["default"].slider, className, _defineProperty(_defineProperty(_defineProperty(_defineProperty({}, mergedCss.active, active), mergedCss.hasMinMax, showMinMax), mergedCss.pressed, pressed), mergedCss.showAnchor, showAnchor), css && css.slider);
142
+ var componentClassName = (0, _classnames2["default"])(_SliderModule["default"].slider, className, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({}, mergedCss.active, active), mergedCss.colorPicker, colorPicker), mergedCss.hasMinMax, showMinMax), mergedCss.pressed, pressed), mergedCss.showAnchor, showAnchor), css && css.slider);
139
143
  (0, _react.useEffect)(function () {
140
144
  spotlightAccelerator.current = new _Accelerator["default"](keyFrequency);
141
145
  }, [keyFrequency]);
@@ -161,18 +165,30 @@ var SliderBase = exports.SliderBase = function SliderBase(props) {
161
165
  delete rest.step;
162
166
  delete rest.tooltip;
163
167
  delete rest.wheelInterval;
168
+ var sliderMax = colorPicker ? 360 : max;
169
+ var sliderMin = colorPicker ? 0 : min;
170
+ var sliderStep = colorPicker ? 1 : step;
171
+ var styleObject = {
172
+ '--semantic-color-surface-default-handle': "hsla(".concat(rest.value ? rest.value : 0, ", 100%, 50%, 1)"),
173
+ '--semantic-color-surface-default-focused': "hsla(".concat(rest.value ? rest.value : 0, ", 100%, 50%, 1)")
174
+ };
164
175
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Slider["default"], _objectSpread(_objectSpread(_objectSpread({}, rest), handlers), {}, {
165
176
  "aria-disabled": disabled,
177
+ colorPicker: colorPicker,
166
178
  className: componentClassName,
167
179
  css: mergedCss,
168
180
  disabled: disabled,
169
- max: max,
170
- min: min,
181
+ max: sliderMax,
182
+ min: sliderMin,
171
183
  progressBarComponent: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ProgressBar["default"], {
172
- css: mergedCss
184
+ css: mergedCss,
185
+ style: {
186
+ backgroundImage: colorPicker && (0, _utils.hueGradient)(rest.orientation)
187
+ }
173
188
  }),
174
189
  ref: ref,
175
- step: step,
190
+ step: sliderStep,
191
+ style: colorPicker && styleObject,
176
192
  tooltipComponent: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ComponentOverride["default"], {
177
193
  component: tooltip,
178
194
  css: mergedCss,
@@ -181,15 +197,15 @@ var SliderBase = exports.SliderBase = function SliderBase(props) {
181
197
  minMaxComponent: showMinMax ? /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
182
198
  className: mergedCss.minMax,
183
199
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
184
- children: min
200
+ children: sliderMin
185
201
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
186
- children: max
202
+ children: sliderMax
187
203
  })]
188
204
  }) : null
189
205
  }));
190
206
  };
191
- SliderBase.displayName = 'Slider';
192
- SliderBase.propTypes = /** @lends limestone/Slider.SliderBase.prototype */{
207
+ _SliderBase.displayName = 'Slider';
208
+ _SliderBase.propTypes = /** @lends limestone/Slider.SliderBase.prototype */{
193
209
  /**
194
210
  * Activates the component when selected so that it may be manipulated via the directional
195
211
  * input keys.
@@ -205,6 +221,14 @@ SliderBase.propTypes = /** @lends limestone/Slider.SliderBase.prototype */{
205
221
  * @public
206
222
  */
207
223
  active: _propTypes["default"].bool,
224
+ /**
225
+ * Indicates if this component will be used as a colorPicker.
226
+ *
227
+ * @type {Boolean}
228
+ * @default false
229
+ * @public
230
+ */
231
+ colorPicker: _propTypes["default"].bool,
208
232
  /**
209
233
  * Customizes the component by mapping the supplied collection of CSS class names to the
210
234
  * corresponding internal elements and states of this component.
@@ -457,7 +481,7 @@ var SliderDecorator = exports.SliderDecorator = (0, _compose["default"])(_Pure["
457
481
  * @public
458
482
  */
459
483
 
460
- var Slider = exports.Slider = SliderDecorator(SliderBase);
484
+ var Slider = exports.Slider = SliderDecorator(_SliderBase);
461
485
  Slider.defaultPropValues = sliderDefaultProps;
462
486
 
463
487
  /**
@@ -341,6 +341,31 @@ Motion Mixins
341
341
  :global(.spotlight-input-touch) .slider:global(.neutral).noFill:global(.spottable):active.pressed .fill {
342
342
  background-color: transparent;
343
343
  }
344
+ .slider:global(.neutral).colorPicker .bar,
345
+ .slider:global(.neutral).colorPicker .fill,
346
+ .slider:global(.neutral).colorPicker .load {
347
+ background-color: transparent;
348
+ }
349
+ :global(.spotlight-input-key) .slider:global(.neutral).colorPicker:global(.spottable):focus .bar,
350
+ :global(.spotlight-input-mouse) .slider:global(.neutral).colorPicker:global(.spottable):focus .bar,
351
+ :global(.spotlight-input-key) .slider:global(.neutral).colorPicker:global(.spottable):focus .fill,
352
+ :global(.spotlight-input-mouse) .slider:global(.neutral).colorPicker:global(.spottable):focus .fill,
353
+ :global(.spotlight-input-key) .slider:global(.neutral).colorPicker:global(.spottable):focus .load,
354
+ :global(.spotlight-input-mouse) .slider:global(.neutral).colorPicker:global(.spottable):focus .load {
355
+ background-color: transparent;
356
+ }
357
+ :global(.spotlight-input-key) .slider:global(.neutral).colorPicker:global(.spottable):focus .knob::before,
358
+ :global(.spotlight-input-mouse) .slider:global(.neutral).colorPicker:global(.spottable):focus .knob::before {
359
+ border-color: var(--semantic-color-surface-white);
360
+ }
361
+ :global(.spotlight-input-touch) .slider:global(.neutral).colorPicker:global(.spottable):active .bar,
362
+ :global(.spotlight-input-touch) .slider:global(.neutral).colorPicker:global(.spottable):active .fill,
363
+ :global(.spotlight-input-touch) .slider:global(.neutral).colorPicker:global(.spottable):active .load {
364
+ background-color: transparent;
365
+ }
366
+ :global(.spotlight-input-touch) .slider:global(.neutral).colorPicker:global(.spottable):active .knob::before {
367
+ border-color: var(--semantic-color-surface-white);
368
+ }
344
369
  .slider:global(.neutral).showAnchor .progressBar::after {
345
370
  background-color: color(from var(--semantic-color-surface-default-track) srgb r g b / 0.7);
346
371
  }
@@ -486,6 +511,31 @@ Motion Mixins
486
511
  :global(.spotlight-input-touch) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).noFill:global(.spottable):active.pressed .fill {
487
512
  background-color: transparent;
488
513
  }
514
+ :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker .bar,
515
+ :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker .fill,
516
+ :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker .load {
517
+ background-color: transparent;
518
+ }
519
+ :global(.spotlight-input-key) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):focus .bar,
520
+ :global(.spotlight-input-mouse) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):focus .bar,
521
+ :global(.spotlight-input-key) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):focus .fill,
522
+ :global(.spotlight-input-mouse) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):focus .fill,
523
+ :global(.spotlight-input-key) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):focus .load,
524
+ :global(.spotlight-input-mouse) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):focus .load {
525
+ background-color: transparent;
526
+ }
527
+ :global(.spotlight-input-key) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):focus .knob::before,
528
+ :global(.spotlight-input-mouse) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):focus .knob::before {
529
+ border-color: var(--semantic-color-surface-white);
530
+ }
531
+ :global(.spotlight-input-touch) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):active .bar,
532
+ :global(.spotlight-input-touch) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):active .fill,
533
+ :global(.spotlight-input-touch) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):active .load {
534
+ background-color: transparent;
535
+ }
536
+ :global(.spotlight-input-touch) :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).colorPicker:global(.spottable):active .knob::before {
537
+ border-color: var(--semantic-color-surface-white);
538
+ }
489
539
  :global(.enact-a11y-high-contrast) .slider:global(.neutral):global(.highContrast).showAnchor .progressBar::after {
490
540
  background-color: color(from var(--semantic-color-surface-default-track) srgb r g b / 0.7);
491
541
  }
@@ -631,6 +681,31 @@ Motion Mixins
631
681
  :global(.spotlight-input-touch) .slider:global(.light).noFill:global(.spottable):active.pressed .fill {
632
682
  background-color: transparent;
633
683
  }
684
+ .slider:global(.light).colorPicker .bar,
685
+ .slider:global(.light).colorPicker .fill,
686
+ .slider:global(.light).colorPicker .load {
687
+ background-color: transparent;
688
+ }
689
+ :global(.spotlight-input-key) .slider:global(.light).colorPicker:global(.spottable):focus .bar,
690
+ :global(.spotlight-input-mouse) .slider:global(.light).colorPicker:global(.spottable):focus .bar,
691
+ :global(.spotlight-input-key) .slider:global(.light).colorPicker:global(.spottable):focus .fill,
692
+ :global(.spotlight-input-mouse) .slider:global(.light).colorPicker:global(.spottable):focus .fill,
693
+ :global(.spotlight-input-key) .slider:global(.light).colorPicker:global(.spottable):focus .load,
694
+ :global(.spotlight-input-mouse) .slider:global(.light).colorPicker:global(.spottable):focus .load {
695
+ background-color: transparent;
696
+ }
697
+ :global(.spotlight-input-key) .slider:global(.light).colorPicker:global(.spottable):focus .knob::before,
698
+ :global(.spotlight-input-mouse) .slider:global(.light).colorPicker:global(.spottable):focus .knob::before {
699
+ border-color: var(--semantic-color-surface-white);
700
+ }
701
+ :global(.spotlight-input-touch) .slider:global(.light).colorPicker:global(.spottable):active .bar,
702
+ :global(.spotlight-input-touch) .slider:global(.light).colorPicker:global(.spottable):active .fill,
703
+ :global(.spotlight-input-touch) .slider:global(.light).colorPicker:global(.spottable):active .load {
704
+ background-color: transparent;
705
+ }
706
+ :global(.spotlight-input-touch) .slider:global(.light).colorPicker:global(.spottable):active .knob::before {
707
+ border-color: var(--semantic-color-surface-white);
708
+ }
634
709
  .slider:global(.light).showAnchor .progressBar::after {
635
710
  background-color: color(from var(--semantic-color-surface-default-track) srgb r g b / 0.7);
636
711
  }
@@ -781,6 +856,31 @@ Motion Mixins
781
856
  :global(.spotlight-input-touch) .slider:global(.game).noFill:global(.spottable):active.pressed .fill {
782
857
  background-color: transparent;
783
858
  }
859
+ .slider:global(.game).colorPicker .bar,
860
+ .slider:global(.game).colorPicker .fill,
861
+ .slider:global(.game).colorPicker .load {
862
+ background-color: transparent;
863
+ }
864
+ :global(.spotlight-input-key) .slider:global(.game).colorPicker:global(.spottable):focus .bar,
865
+ :global(.spotlight-input-mouse) .slider:global(.game).colorPicker:global(.spottable):focus .bar,
866
+ :global(.spotlight-input-key) .slider:global(.game).colorPicker:global(.spottable):focus .fill,
867
+ :global(.spotlight-input-mouse) .slider:global(.game).colorPicker:global(.spottable):focus .fill,
868
+ :global(.spotlight-input-key) .slider:global(.game).colorPicker:global(.spottable):focus .load,
869
+ :global(.spotlight-input-mouse) .slider:global(.game).colorPicker:global(.spottable):focus .load {
870
+ background-color: transparent;
871
+ }
872
+ :global(.spotlight-input-key) .slider:global(.game).colorPicker:global(.spottable):focus .knob::before,
873
+ :global(.spotlight-input-mouse) .slider:global(.game).colorPicker:global(.spottable):focus .knob::before {
874
+ border-color: var(--semantic-color-surface-white);
875
+ }
876
+ :global(.spotlight-input-touch) .slider:global(.game).colorPicker:global(.spottable):active .bar,
877
+ :global(.spotlight-input-touch) .slider:global(.game).colorPicker:global(.spottable):active .fill,
878
+ :global(.spotlight-input-touch) .slider:global(.game).colorPicker:global(.spottable):active .load {
879
+ background-color: transparent;
880
+ }
881
+ :global(.spotlight-input-touch) .slider:global(.game).colorPicker:global(.spottable):active .knob::before {
882
+ border-color: var(--semantic-color-surface-white);
883
+ }
784
884
  .slider:global(.game).showAnchor .progressBar::after {
785
885
  background-color: color(from var(--semantic-color-surface-default-track) srgb r g b / 0.7);
786
886
  }
@@ -930,6 +1030,31 @@ Motion Mixins
930
1030
  :global(.spotlight-input-touch) :global(.green) .slider:global(.game).noFill:global(.spottable):active.pressed .fill {
931
1031
  background-color: transparent;
932
1032
  }
1033
+ :global(.green) .slider:global(.game).colorPicker .bar,
1034
+ :global(.green) .slider:global(.game).colorPicker .fill,
1035
+ :global(.green) .slider:global(.game).colorPicker .load {
1036
+ background-color: transparent;
1037
+ }
1038
+ :global(.spotlight-input-key) :global(.green) .slider:global(.game).colorPicker:global(.spottable):focus .bar,
1039
+ :global(.spotlight-input-mouse) :global(.green) .slider:global(.game).colorPicker:global(.spottable):focus .bar,
1040
+ :global(.spotlight-input-key) :global(.green) .slider:global(.game).colorPicker:global(.spottable):focus .fill,
1041
+ :global(.spotlight-input-mouse) :global(.green) .slider:global(.game).colorPicker:global(.spottable):focus .fill,
1042
+ :global(.spotlight-input-key) :global(.green) .slider:global(.game).colorPicker:global(.spottable):focus .load,
1043
+ :global(.spotlight-input-mouse) :global(.green) .slider:global(.game).colorPicker:global(.spottable):focus .load {
1044
+ background-color: transparent;
1045
+ }
1046
+ :global(.spotlight-input-key) :global(.green) .slider:global(.game).colorPicker:global(.spottable):focus .knob::before,
1047
+ :global(.spotlight-input-mouse) :global(.green) .slider:global(.game).colorPicker:global(.spottable):focus .knob::before {
1048
+ border-color: var(--semantic-color-surface-white);
1049
+ }
1050
+ :global(.spotlight-input-touch) :global(.green) .slider:global(.game).colorPicker:global(.spottable):active .bar,
1051
+ :global(.spotlight-input-touch) :global(.green) .slider:global(.game).colorPicker:global(.spottable):active .fill,
1052
+ :global(.spotlight-input-touch) :global(.green) .slider:global(.game).colorPicker:global(.spottable):active .load {
1053
+ background-color: transparent;
1054
+ }
1055
+ :global(.spotlight-input-touch) :global(.green) .slider:global(.game).colorPicker:global(.spottable):active .knob::before {
1056
+ border-color: var(--semantic-color-surface-white);
1057
+ }
933
1058
  :global(.green) .slider:global(.game).showAnchor .progressBar::after {
934
1059
  background-color: color(from var(--semantic-color-surface-default-track) srgb r g b / 0.7);
935
1060
  }
@@ -1079,6 +1204,31 @@ Motion Mixins
1079
1204
  :global(.spotlight-input-touch) :global(.orange) .slider:global(.game).noFill:global(.spottable):active.pressed .fill {
1080
1205
  background-color: transparent;
1081
1206
  }
1207
+ :global(.orange) .slider:global(.game).colorPicker .bar,
1208
+ :global(.orange) .slider:global(.game).colorPicker .fill,
1209
+ :global(.orange) .slider:global(.game).colorPicker .load {
1210
+ background-color: transparent;
1211
+ }
1212
+ :global(.spotlight-input-key) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):focus .bar,
1213
+ :global(.spotlight-input-mouse) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):focus .bar,
1214
+ :global(.spotlight-input-key) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):focus .fill,
1215
+ :global(.spotlight-input-mouse) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):focus .fill,
1216
+ :global(.spotlight-input-key) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):focus .load,
1217
+ :global(.spotlight-input-mouse) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):focus .load {
1218
+ background-color: transparent;
1219
+ }
1220
+ :global(.spotlight-input-key) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):focus .knob::before,
1221
+ :global(.spotlight-input-mouse) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):focus .knob::before {
1222
+ border-color: var(--semantic-color-surface-white);
1223
+ }
1224
+ :global(.spotlight-input-touch) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):active .bar,
1225
+ :global(.spotlight-input-touch) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):active .fill,
1226
+ :global(.spotlight-input-touch) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):active .load {
1227
+ background-color: transparent;
1228
+ }
1229
+ :global(.spotlight-input-touch) :global(.orange) .slider:global(.game).colorPicker:global(.spottable):active .knob::before {
1230
+ border-color: var(--semantic-color-surface-white);
1231
+ }
1082
1232
  :global(.orange) .slider:global(.game).showAnchor .progressBar::after {
1083
1233
  background-color: color(from var(--semantic-color-surface-default-track) srgb r g b / 0.7);
1084
1234
  }
@@ -56,8 +56,9 @@ var SliderBehaviorDecorator = exports.SliderBehaviorDecorator = (0, _hoc["defaul
56
56
  var emitSpotlightEvents = config.emitSpotlightEvents;
57
57
 
58
58
  // eslint-disable-next-line no-shadow
59
- var SliderBehaviorDecorator = function SliderBehaviorDecorator(props) {
59
+ var _SliderBehaviorDecorator = function SliderBehaviorDecorator(props) {
60
60
  var sliderBehaviorProps = (0, _util.setDefaultProps)(props, sliderBehaviorDefaultProps);
61
+ (0, _util.checkPropTypes)(_SliderBehaviorDecorator, sliderBehaviorProps);
61
62
  var paused = (0, _react.useMemo)(function () {
62
63
  return new _Pause["default"]();
63
64
  }, []);
@@ -81,12 +82,10 @@ var SliderBehaviorDecorator = exports.SliderBehaviorDecorator = (0, _hoc["defaul
81
82
  _useState0 = _slicedToArray(_useState9, 2),
82
83
  prevValue = _useState0[0],
83
84
  setPrevValue = _useState0[1];
84
- (0, _react.useEffect)(function () {
85
- if (sliderBehaviorProps.value !== prevValue) {
86
- setUseHintText(false);
87
- setPrevValue(sliderBehaviorProps.value);
88
- }
89
- }, [prevValue, sliderBehaviorProps.value]);
85
+ if (sliderBehaviorProps.value && sliderBehaviorProps.value !== prevValue) {
86
+ setUseHintText(false);
87
+ setPrevValue(sliderBehaviorProps.value);
88
+ }
90
89
  (0, _react.useEffect)(function () {
91
90
  return function () {
92
91
  paused.resume();
@@ -95,19 +94,22 @@ var SliderBehaviorDecorator = exports.SliderBehaviorDecorator = (0, _hoc["defaul
95
94
 
96
95
  var getValueText = (0, _react.useCallback)(function () {
97
96
  var ariaValueText = sliderBehaviorProps['aria-valuetext'],
97
+ colorPicker = sliderBehaviorProps.colorPicker,
98
98
  max = sliderBehaviorProps.max,
99
99
  min = sliderBehaviorProps.min,
100
100
  orientation = sliderBehaviorProps.orientation,
101
101
  _sliderBehaviorProps$ = sliderBehaviorProps.value,
102
102
  value = _sliderBehaviorProps$ === void 0 ? min : _sliderBehaviorProps$;
103
+ var sliderMax = colorPicker ? 360 : max;
104
+ var sliderMin = colorPicker ? 0 : min;
103
105
  var valueText = ariaValueText != null ? ariaValueText : value;
104
106
  var verticalHint = "".concat(new _IString["default"]((0, _$L["default"])('From {startValue} to {lastValue}')).format({
105
- startValue: min,
106
- lastValue: max
107
+ startValue: sliderMin,
108
+ lastValue: sliderMax
107
109
  }), " ").concat(valueText, " ").concat((0, _$L["default"])('change a value with up down button'));
108
110
  var horizontalHint = "".concat(new _IString["default"]((0, _$L["default"])('From {startValue} to {lastValue}')).format({
109
- startValue: min,
110
- lastValue: max
111
+ startValue: sliderMin,
112
+ lastValue: sliderMax
111
113
  }), " ").concat(valueText, " ").concat((0, _$L["default"])('change a value with left right button'));
112
114
  if (useHintText) {
113
115
  return orientation === 'horizontal' ? horizontalHint : verticalHint;
@@ -170,8 +172,8 @@ var SliderBehaviorDecorator = exports.SliderBehaviorDecorator = (0, _hoc["defaul
170
172
  onFocus: handleFocus
171
173
  }));
172
174
  };
173
- SliderBehaviorDecorator.displayName = 'SliderBehaviorDecorator';
174
- SliderBehaviorDecorator.propTypes = {
175
+ _SliderBehaviorDecorator.displayName = 'SliderBehaviorDecorator';
176
+ _SliderBehaviorDecorator.propTypes = {
175
177
  activateOnSelect: _propTypes["default"].bool,
176
178
  'aria-valuetext': _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
177
179
  max: _propTypes["default"].number,
@@ -179,6 +181,6 @@ var SliderBehaviorDecorator = exports.SliderBehaviorDecorator = (0, _hoc["defaul
179
181
  orientation: _propTypes["default"].string,
180
182
  value: _propTypes["default"].number
181
183
  };
182
- return SliderBehaviorDecorator;
184
+ return _SliderBehaviorDecorator;
183
185
  });
184
186
  var _default = exports["default"] = SliderBehaviorDecorator;
@@ -111,6 +111,32 @@ describe('Slider', function () {
111
111
  var expectedValue = '11';
112
112
  expect(slider).toHaveAttribute(expectedAttribute, expectedValue);
113
113
  });
114
+ test('should be pressed when selected', function () {
115
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Slider["default"], {}));
116
+ var slider = _react.screen.getByRole('slider');
117
+
118
+ // Select by key
119
+ _react.fireEvent.keyDown(slider, {
120
+ key: 'Enter',
121
+ code: 'Enter',
122
+ keyCode: 13,
123
+ which: 13
124
+ });
125
+ expect(slider).toHaveClass('pressed');
126
+ _react.fireEvent.keyUp(slider, {
127
+ key: 'Enter',
128
+ code: 'Enter',
129
+ keyCode: 13,
130
+ which: 13
131
+ });
132
+ expect(slider).not.toHaveClass('pressed');
133
+
134
+ // Select by pointer
135
+ _react.fireEvent.mouseDown(slider);
136
+ expect(slider).toHaveClass('pressed');
137
+ _react.fireEvent.mouseUp(slider);
138
+ expect(slider).not.toHaveClass('pressed');
139
+ });
114
140
  test('should activate the slider on enter keyup', function () {
115
141
  (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Slider["default"], {
116
142
  activateOnSelect: true
@@ -571,4 +597,29 @@ describe('Slider', function () {
571
597
  var tooltip = _react.screen.queryByText('0');
572
598
  expect(tooltip).toBeNull();
573
599
  });
600
+ test('should apply `colorPicker`', function () {
601
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Slider["default"], {
602
+ colorPicker: true
603
+ }));
604
+ var slider = _react.screen.getByRole('slider');
605
+ var expected = 'colorPicker';
606
+ expect(slider).toHaveClass(expected);
607
+ });
608
+ test('should fire `onChange` with `onChange` type when value changed for `colorPicker`', function () {
609
+ var handleChange = jest.fn();
610
+ (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Slider["default"], {
611
+ activateOnSelect: true,
612
+ colorPicker: true,
613
+ defaultValue: 50,
614
+ onChange: handleChange
615
+ }));
616
+ var slider = _react.screen.getByRole('slider');
617
+ activate(slider);
618
+ leftKeyDown(slider);
619
+ var expected = {
620
+ type: 'onChange'
621
+ };
622
+ var actual = handleChange.mock.calls.length && handleChange.mock.calls[0][0];
623
+ expect(actual).toMatchObject(expected);
624
+ });
574
625
  });
package/Slider/utils.js CHANGED
@@ -3,11 +3,14 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.handleIncrementByWheel = exports.handleIncrement = exports.handleDecrementByWheel = exports.handleDecrement = exports.forwardSpotlightEvents = exports.emitChange = void 0;
6
+ exports.hueGradient = exports.handleIncrementByWheel = exports.handleIncrement = exports.handleDecrementByWheel = exports.handleDecrement = exports.forwardSpotlightEvents = exports.emitChange = void 0;
7
7
  var _handle = require("@enact/core/handle");
8
8
  var _keymap = require("@enact/core/keymap");
9
9
  var _util = require("@enact/core/util");
10
10
  var _utils = require("@enact/ui/Slider/utils");
11
+ var hueGradient = exports.hueGradient = function hueGradient(orientation) {
12
+ return "linear-gradient(".concat(orientation === 'horizontal' ? 'to right' : 'to top', ", \n\thsla(0, 100%, 50%, 1),\n\thsla(10, 100%, 50%, 1),\n\thsla(20, 100%, 50%, 1),\n\thsla(30, 100%, 50%, 1),\n\thsla(40, 100%, 50%, 1),\n\thsla(50, 100%, 50%, 1),\n\thsla(60, 100%, 50%, 1),\n\thsla(70, 100%, 50%, 1),\n\thsla(80, 100%, 50%, 1),\n\thsla(90, 100%, 50%, 1),\n\thsla(100, 100%, 50%, 1),\n\thsla(110, 100%, 50%, 1),\n\thsla(120, 100%, 50%, 1),\n\thsla(130, 100%, 50%, 1),\n\thsla(140, 100%, 50%, 1),\n\thsla(150, 100%, 50%, 1),\n\thsla(160, 100%, 50%, 1),\n\thsla(170, 100%, 50%, 1),\n\thsla(180, 100%, 50%, 1),\n\thsla(190, 100%, 50%, 1),\n\thsla(200, 100%, 50%, 1),\n\thsla(210, 100%, 50%, 1),\n\thsla(220, 100%, 50%, 1),\n\thsla(230, 100%, 50%, 1),\n\thsla(240, 100%, 50%, 1),\n\thsla(250, 100%, 50%, 1),\n\thsla(260, 100%, 50%, 1),\n\thsla(270, 100%, 50%, 1),\n\thsla(280, 100%, 50%, 1),\n\thsla(290, 100%, 50%, 1),\n\thsla(300, 100%, 50%, 1),\n\thsla(310, 100%, 50%, 1),\n\thsla(320, 100%, 50%, 1),\n\thsla(330, 100%, 50%, 1),\n\thsla(340, 100%, 50%, 1),\n\thsla(350, 100%, 50%, 1),\n\thsla(360, 100%, 50%, 1))");
13
+ };
11
14
  var nop = function nop() {};
12
15
  var handleAcceleratedKeyDown = function handleAcceleratedKeyDown(ev, prop, _ref) {
13
16
  var spotlightAccelerator = _ref.current;
@@ -73,17 +76,30 @@ var checkInterval = function checkInterval(ev, _ref0, context) {
73
76
  };
74
77
  var emitChange = exports.emitChange = function emitChange(direction) {
75
78
  return (0, _handle.forwardCustom)('onChange', function (ev, _ref1) {
76
- var knobStep = _ref1.knobStep,
79
+ var colorPicker = _ref1.colorPicker,
80
+ knobStep = _ref1.knobStep,
77
81
  max = _ref1.max,
78
82
  min = _ref1.min,
79
83
  step = _ref1.step,
80
84
  _ref1$value = _ref1.value,
81
85
  value = _ref1$value === void 0 ? min : _ref1$value;
82
- var newValue = (0, _util.clamp)(min, max, value + calcStep(knobStep, step) * direction);
83
- return {
84
- value: newValue,
85
- proportion: (0, _utils.calcProportion)(min, max, newValue)
86
- };
86
+ if (colorPicker) {
87
+ var newValue = (0, _util.clamp)(0, 360, value + calcStep(knobStep, step) * direction);
88
+ return {
89
+ value: newValue,
90
+ proportion: (0, _utils.calcProportion)(min, max, newValue),
91
+ color: {
92
+ hex: (0, _utils.hslToHex)(value),
93
+ hsl: "hsla(".concat(value, ", 100%, 50%, 1)")
94
+ }
95
+ };
96
+ } else {
97
+ var _newValue = (0, _util.clamp)(min, max, value + calcStep(knobStep, step) * direction);
98
+ return {
99
+ value: _newValue,
100
+ proportion: (0, _utils.calcProportion)(min, max, _newValue)
101
+ };
102
+ }
87
103
  });
88
104
  };
89
105
  var isActive = function isActive(ev, props) {
@@ -6,13 +6,14 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports["default"] = exports.SpinnerDecorator = exports.SpinnerBase = exports.Spinner = void 0;
7
7
  var _kind = _interopRequireDefault(require("@enact/core/kind"));
8
8
  var _hoc = _interopRequireDefault(require("@enact/core/hoc"));
9
- var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _util = require("@enact/core/util");
10
+ var _spotlight = _interopRequireDefault(require("@enact/spotlight"));
11
+ var _Pause = _interopRequireDefault(require("@enact/spotlight/Pause"));
10
12
  var _Pure = _interopRequireDefault(require("@enact/ui/internal/Pure"));
13
+ var _Spinner = _interopRequireDefault(require("@enact/ui/Spinner"));
14
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
15
  var _compose = _interopRequireDefault(require("ramda/src/compose"));
12
16
  var _react = require("react");
13
- var _Pause = _interopRequireDefault(require("@enact/spotlight/Pause"));
14
- var _Spinner = _interopRequireDefault(require("@enact/ui/Spinner"));
15
- var _spotlight = _interopRequireDefault(require("@enact/spotlight"));
16
17
  var _$L = _interopRequireDefault(require("../internal/$L"));
17
18
  var _Marquee = _interopRequireDefault(require("../Marquee"));
18
19
  var _Skinnable = _interopRequireDefault(require("../Skinnable"));
@@ -191,7 +192,8 @@ var SpinnerBase = exports.SpinnerBase = (0, _kind["default"])({
191
192
  * @private
192
193
  */
193
194
  var SpinnerSpotlightDecorator = (0, _hoc["default"])(function (config, Wrapped) {
194
- var SpinnerSpotlight = function SpinnerSpotlight(props) {
195
+ var _SpinnerSpotlight = function SpinnerSpotlight(props) {
196
+ (0, _util.checkPropTypes)(_SpinnerSpotlight, props);
195
197
  var paused = (0, _react.useMemo)(function () {
196
198
  return new _Pause["default"]('Spinner');
197
199
  }, []);
@@ -213,8 +215,8 @@ var SpinnerSpotlightDecorator = (0, _hoc["default"])(function (config, Wrapped)
213
215
  }, [blockClickOn, paused]);
214
216
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(Wrapped, _objectSpread({}, props));
215
217
  };
216
- SpinnerSpotlight.displayName = 'SpinnerSpotlightDecorator';
217
- SpinnerSpotlight.propTypes = /** @lends limestone/Spinner.Spinner.prototype */{
218
+ _SpinnerSpotlight.displayName = 'SpinnerSpotlightDecorator';
219
+ _SpinnerSpotlight.propTypes = /** @lends limestone/Spinner.Spinner.prototype */{
218
220
  /**
219
221
  * Determines how far the click-blocking should extend.
220
222
  *
@@ -227,7 +229,7 @@ var SpinnerSpotlightDecorator = (0, _hoc["default"])(function (config, Wrapped)
227
229
  */
228
230
  blockClickOn: _propTypes["default"].oneOf(['screen', 'container', null])
229
231
  };
230
- return SpinnerSpotlight;
232
+ return _SpinnerSpotlight;
231
233
  });
232
234
 
233
235
  /**
@@ -5,13 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.getNavigableFilter = exports["default"] = exports.RefocusDecorator = void 0;
7
7
  exports.getTabsSpotlightId = getTabsSpotlightId;
8
+ var _util = require("@enact/core/util");
8
9
  var _spotlight = _interopRequireDefault(require("@enact/spotlight"));
9
10
  var _IdProvider = require("@enact/ui/internal/IdProvider");
10
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
12
  var _react = require("react");
12
13
  var _TabGroupModule = _interopRequireDefault(require("./TabGroup.module.css"));
13
14
  var _jsxRuntime = require("react/jsx-runtime");
14
- var _excluded = ["blockCollapseOnPortrait", "blockExpandOnLandscape", "collapsed", "index", "onCollapse", "onExpand", "onTabAnimationEnd", "orientation", "spotlightId"];
15
+ var _excluded = ["blockCollapseOnPortrait", "blockExpandOnLandscape", "collapsed", "index", "onCollapse", "onExpand", "onTabAnimationEnd", "orientation"];
15
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
16
17
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
17
18
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -60,17 +61,18 @@ function useScreenOrientation() {
60
61
  }
61
62
  var RefocusDecorator = exports.RefocusDecorator = function RefocusDecorator(Wrapped) {
62
63
  // eslint-disable-next-line no-shadow
63
- function RefocusDecorator(_ref) {
64
- var blockCollapseOnPortrait = _ref.blockCollapseOnPortrait,
65
- blockExpandOnLandscape = _ref.blockExpandOnLandscape,
66
- collapsed = _ref.collapsed,
67
- index = _ref.index,
68
- onCollapse = _ref.onCollapse,
69
- onExpand = _ref.onExpand,
70
- onTabAnimationEnd = _ref.onTabAnimationEnd,
71
- orientation = _ref.orientation,
72
- spotlightId = _ref.spotlightId,
73
- rest = _objectWithoutProperties(_ref, _excluded);
64
+ function RefocusDecorator(props) {
65
+ (0, _util.checkPropTypes)(RefocusDecorator, props);
66
+ var blockCollapseOnPortrait = props.blockCollapseOnPortrait,
67
+ blockExpandOnLandscape = props.blockExpandOnLandscape,
68
+ collapsed = props.collapsed,
69
+ index = props.index,
70
+ onCollapse = props.onCollapse,
71
+ onExpand = props.onExpand,
72
+ onTabAnimationEnd = props.onTabAnimationEnd,
73
+ orientation = props.orientation,
74
+ rest = _objectWithoutProperties(props, _excluded);
75
+ var spotlightId = props.spotlightId;
74
76
  var _useId = (0, _IdProvider.useId)({
75
77
  prefix: 'lime-tablayout-'
76
78
  }),
@@ -181,7 +181,7 @@ describe('TabGroup specs', function () {
181
181
  expect(handleFocusTab).toHaveBeenCalled();
182
182
  });
183
183
  test('should set the size for all tabs in horizontal orientation', function () {
184
- var size = 456;
184
+ var size = 'small';
185
185
  (0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_TabGroup["default"], {
186
186
  orientation: "horizontal",
187
187
  size: size,