@antimatter-audio/antimatter-ui 16.7.0 → 16.9.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 (128) hide show
  1. package/dist/index.js +169 -105
  2. package/dist/index.js.map +1 -1
  3. package/dist/types/advanced/BevelContainer/BevelContainer.d.ts +2 -2
  4. package/dist/types/advanced/BevelContainer/BevelContainer.d.ts.map +1 -1
  5. package/dist/types/advanced/CircularDiagramStyleVisualization/CircularDiagramStyleVisualization.d.ts +1 -1
  6. package/dist/types/advanced/CircularDiagramStyleVisualization/CircularDiagramStyleVisualization.d.ts.map +1 -1
  7. package/dist/types/advanced/CircularDiagramStyleVisualization/CircularDiagramStyleVisualizationSVG.d.ts +1 -1
  8. package/dist/types/advanced/CircularDiagramStyleVisualization/CircularDiagramStyleVisualizationSVG.d.ts.map +1 -1
  9. package/dist/types/advanced/ControlGroupWrapper/ControlGroupWrapper.d.ts +5 -3
  10. package/dist/types/advanced/ControlGroupWrapper/ControlGroupWrapper.d.ts.map +1 -1
  11. package/dist/types/advanced/IconButton/IconButton.d.ts +1 -1
  12. package/dist/types/advanced/IconButton/IconButton.d.ts.map +1 -1
  13. package/dist/types/advanced/KeyValueDisplayScreen/KeyValueDisplayScreen.d.ts +1 -1
  14. package/dist/types/advanced/KeyValueDisplayScreen/KeyValueDisplayScreen.d.ts.map +1 -1
  15. package/dist/types/advanced/LFOIntensityMeter/LFOIntensityMeter.d.ts +1 -1
  16. package/dist/types/advanced/LFOIntensityMeter/LFOIntensityMeter.d.ts.map +1 -1
  17. package/dist/types/advanced/LFOVisualizer/LFOVisualizer.d.ts +1 -1
  18. package/dist/types/advanced/LFOVisualizer/LFOVisualizer.d.ts.map +1 -1
  19. package/dist/types/advanced/ModMatrix/ModMatrix.d.ts +1 -1
  20. package/dist/types/advanced/ModMatrix/ModMatrix.d.ts.map +1 -1
  21. package/dist/types/advanced/ModMatrix/ModMatrixCell.d.ts +1 -1
  22. package/dist/types/advanced/ModMatrix/ModMatrixCell.d.ts.map +1 -1
  23. package/dist/types/advanced/ModMatrix/ModMatrixComboboxCell.d.ts +1 -1
  24. package/dist/types/advanced/ModMatrix/ModMatrixComboboxCell.d.ts.map +1 -1
  25. package/dist/types/advanced/ModMatrix/ModMatrixRow.d.ts +1 -1
  26. package/dist/types/advanced/ModMatrix/ModMatrixRow.d.ts.map +1 -1
  27. package/dist/types/advanced/ModMatrix/ModMatrixToggleCell.d.ts +1 -1
  28. package/dist/types/advanced/ModMatrix/ModMatrixToggleCell.d.ts.map +1 -1
  29. package/dist/types/advanced/ModuleFooter/InputModTab.d.ts +1 -1
  30. package/dist/types/advanced/ModuleFooter/InputModTab.d.ts.map +1 -1
  31. package/dist/types/advanced/ModuleFooter/LFOBox.d.ts +1 -1
  32. package/dist/types/advanced/ModuleFooter/LFOBox.d.ts.map +1 -1
  33. package/dist/types/advanced/ModuleFooter/LFOTab.d.ts +1 -1
  34. package/dist/types/advanced/ModuleFooter/LFOTab.d.ts.map +1 -1
  35. package/dist/types/advanced/ModuleFooter/ModuleFooter.d.ts +4 -4
  36. package/dist/types/advanced/ModuleFooter/ModuleFooter.d.ts.map +1 -1
  37. package/dist/types/advanced/ModuleFooter/SeqPanel.d.ts +1 -1
  38. package/dist/types/advanced/ModuleFooter/SeqPanel.d.ts.map +1 -1
  39. package/dist/types/advanced/ModuleFooter/SeqTab.d.ts +1 -1
  40. package/dist/types/advanced/ModuleFooter/SeqTab.d.ts.map +1 -1
  41. package/dist/types/advanced/ModuleHeader/ModuleHeader.d.ts +1 -1
  42. package/dist/types/advanced/ModuleHeader/ModuleHeader.d.ts.map +1 -1
  43. package/dist/types/advanced/Oscilloscope/LinePlot.d.ts +1 -1
  44. package/dist/types/advanced/Oscilloscope/LinePlot.d.ts.map +1 -1
  45. package/dist/types/advanced/Oscilloscope/Oscilloscope.d.ts +1 -1
  46. package/dist/types/advanced/Oscilloscope/Oscilloscope.d.ts.map +1 -1
  47. package/dist/types/advanced/OuterGlowFilter.d.ts +1 -1
  48. package/dist/types/advanced/OuterGlowFilter.d.ts.map +1 -1
  49. package/dist/types/advanced/PresetManager/PresetManager.d.ts +1 -1
  50. package/dist/types/advanced/PresetManager/PresetManager.d.ts.map +1 -1
  51. package/dist/types/advanced/StepSequencer/StepSequencer.d.ts +1 -1
  52. package/dist/types/advanced/StepSequencer/StepSequencer.d.ts.map +1 -1
  53. package/dist/types/advanced/ThemeWrapper/ThemeWrapper.d.ts +1 -1
  54. package/dist/types/advanced/ThemeWrapper/ThemeWrapper.d.ts.map +1 -1
  55. package/dist/types/advanced/VUMeter/VUMeter.d.ts +1 -1
  56. package/dist/types/advanced/VUMeter/VUMeter.d.ts.map +1 -1
  57. package/dist/types/common/utils.d.ts +61 -9
  58. package/dist/types/common/utils.d.ts.map +1 -1
  59. package/dist/types/common/utils.test.d.ts +2 -0
  60. package/dist/types/common/utils.test.d.ts.map +1 -0
  61. package/dist/types/context/GlobalContextProvider.d.ts +1 -1
  62. package/dist/types/context/GlobalContextProvider.d.ts.map +1 -1
  63. package/dist/types/core/Box/Box.d.ts +1 -1
  64. package/dist/types/core/Box/Box.d.ts.map +1 -1
  65. package/dist/types/core/Button/Button.d.ts +1 -1
  66. package/dist/types/core/Button/Button.d.ts.map +1 -1
  67. package/dist/types/core/Chart/AnimationDataWrapper.d.ts +1 -1
  68. package/dist/types/core/Chart/AnimationDataWrapper.d.ts.map +1 -1
  69. package/dist/types/core/Chart/Area.d.ts +1 -1
  70. package/dist/types/core/Chart/Area.d.ts.map +1 -1
  71. package/dist/types/core/Chart/Bar.d.ts +1 -1
  72. package/dist/types/core/Chart/Bar.d.ts.map +1 -1
  73. package/dist/types/core/Chart/Chart.d.ts +1 -1
  74. package/dist/types/core/Chart/Chart.d.ts.map +1 -1
  75. package/dist/types/core/Chart/Line.d.ts +1 -1
  76. package/dist/types/core/Chart/Line.d.ts.map +1 -1
  77. package/dist/types/core/Chart/LineChart/LineChart.d.ts +1 -1
  78. package/dist/types/core/Chart/LineChart/LineChart.d.ts.map +1 -1
  79. package/dist/types/core/Chart/LineChart/LineChartCanvas.d.ts +1 -1
  80. package/dist/types/core/Chart/LineChart/LineChartCanvas.d.ts.map +1 -1
  81. package/dist/types/core/Chart/LineChart/LineChartSvg.d.ts +1 -1
  82. package/dist/types/core/Chart/LineChart/LineChartSvg.d.ts.map +1 -1
  83. package/dist/types/core/Chart/StackedChart.d.ts +1 -1
  84. package/dist/types/core/Chart/StackedChart.d.ts.map +1 -1
  85. package/dist/types/core/Chart/Ticks.d.ts +1 -1
  86. package/dist/types/core/Chart/Ticks.d.ts.map +1 -1
  87. package/dist/types/core/Combobox/Combobox.d.ts +1 -1
  88. package/dist/types/core/Combobox/Combobox.d.ts.map +1 -1
  89. package/dist/types/core/Combobox/ComboboxComponent.d.ts +1 -1
  90. package/dist/types/core/Combobox/ComboboxComponent.d.ts.map +1 -1
  91. package/dist/types/core/Combobox/ListboxComponent.d.ts +1 -1
  92. package/dist/types/core/Combobox/ListboxComponent.d.ts.map +1 -1
  93. package/dist/types/core/DataViz/SingleBarViz.d.ts +1 -1
  94. package/dist/types/core/DataViz/SingleBarViz.d.ts.map +1 -1
  95. package/dist/types/core/Heading/Heading.d.ts +1 -1
  96. package/dist/types/core/Heading/Heading.d.ts.map +1 -1
  97. package/dist/types/core/Icon/Icon.d.ts +29 -29
  98. package/dist/types/core/Icon/Icon.d.ts.map +1 -1
  99. package/dist/types/core/Indicators/IndicatorLight.d.ts +1 -1
  100. package/dist/types/core/Indicators/IndicatorLight.d.ts.map +1 -1
  101. package/dist/types/core/Input/Input.d.ts +1 -1
  102. package/dist/types/core/Input/Input.d.ts.map +1 -1
  103. package/dist/types/core/Label/Label.d.ts +1 -1
  104. package/dist/types/core/Label/Label.d.ts.map +1 -1
  105. package/dist/types/core/PositioningWrapper/PositioningWrapper.d.ts +1 -1
  106. package/dist/types/core/PositioningWrapper/PositioningWrapper.d.ts.map +1 -1
  107. package/dist/types/core/Slider/BarSlider.d.ts +1 -1
  108. package/dist/types/core/Slider/BarSlider.d.ts.map +1 -1
  109. package/dist/types/core/Slider/RotaryCircle.d.ts +1 -1
  110. package/dist/types/core/Slider/RotaryCircle.d.ts.map +1 -1
  111. package/dist/types/core/Slider/RotaryCombobox.d.ts +1 -1
  112. package/dist/types/core/Slider/RotaryCombobox.d.ts.map +1 -1
  113. package/dist/types/core/Slider/RotarySlider.d.ts +1 -1
  114. package/dist/types/core/Slider/RotarySlider.d.ts.map +1 -1
  115. package/dist/types/core/Slider/Slider.d.ts +1 -1
  116. package/dist/types/core/Slider/Slider.d.ts.map +1 -1
  117. package/dist/types/core/Slider/Slider.test.d.ts +2 -0
  118. package/dist/types/core/Slider/Slider.test.d.ts.map +1 -0
  119. package/dist/types/core/Slider/SliderSVG.d.ts +3 -3
  120. package/dist/types/core/Slider/SliderSVG.d.ts.map +1 -1
  121. package/dist/types/core/Tabs/Tabs.d.ts +1 -1
  122. package/dist/types/core/Tabs/Tabs.d.ts.map +1 -1
  123. package/dist/types/core/Toggle/Toggle.d.ts +2 -1
  124. package/dist/types/core/Toggle/Toggle.d.ts.map +1 -1
  125. package/dist/types/hooks/useCombobox.d.ts.map +1 -1
  126. package/dist/types/hooks/useGroupFocus.d.ts.map +1 -1
  127. package/dist/types/hooks/useSlider.d.ts.map +1 -1
  128. package/package.json +10 -3
package/dist/index.js CHANGED
@@ -267,14 +267,14 @@ const decimalToPercent = (decimal)=>Math.round(100 * (typeof decimal === 'string
267
267
  const percentToDecimal = (percent)=>Math.round(0.01 * (typeof percent === 'string' ? parseFloat(percent) : percent));
268
268
  const inputCharacterIsValid = (char)=>{
269
269
  const validCharacter = /^[\d.-]$/;
270
+ if (char === null || char === undefined) return false;
270
271
  return validCharacter.test(char.toString());
271
272
  };
272
273
  const clamp = (val, min = 0, max = 1)=>{
273
274
  return Math.max(min, Math.min(max, val));
274
275
  };
275
- function snapToLegalValue({ value, properties }) {
276
- const { interval, start, end } = properties;
277
- if (interval == 0) return value;
276
+ function snapToLegalValue({ value, interval, start, end }) {
277
+ if (interval === 0) return value;
278
278
  const roundedInterval = parseFloat(interval?.toFixed(2));
279
279
  const formattedValue = start + roundedInterval * Math.floor((value - start) / roundedInterval + 0.5);
280
280
  return parseFloat(clamp(formattedValue, start, end)?.toFixed(2));
@@ -301,7 +301,9 @@ const getValidValueForInput = ({ value, oldValue, properties })=>{
301
301
  } else {
302
302
  return parseFloat(snapToLegalValue({
303
303
  value: parseFloat(validValue),
304
- properties
304
+ interval: properties.interval,
305
+ start: properties.start,
306
+ end: properties.end
305
307
  })?.toFixed(2));
306
308
  }
307
309
  } else {
@@ -383,19 +385,59 @@ const randomizeValue = (min, max)=>{
383
385
  // min?: number;
384
386
  // max?: number;
385
387
  // }
386
- const incrementValue = ({ incrementType, numSteps, delta, startingValue, buttonIncrement, buttonDirection = StepDirection.up, interval })=>{
388
+ const getTotalNumStepsMultiplier = (incrementType, numSteps)=>{
389
+ return incrementType === IncrementType.standard || incrementType === IncrementType.button ? Math.max(Math.abs(numSteps * 0.01), 1) : 1;
390
+ };
391
+ const incrementValue = ({ incrementType, sliderNumSteps, comboboxNumChoices, delta, startingValue, buttonIncrement, buttonDirection = StepDirection.up, sliderInterval, sliderMin, sliderMax })=>{
387
392
  const hasButtonIncrementType = incrementType === IncrementType.button || incrementType === IncrementType.indexButton;
388
- // const hasVelocity =
389
- // incrementType === IncrementType.standard ||
390
- // incrementType === IncrementType.index;
393
+ const hasVelocity = incrementType === IncrementType.standard || incrementType === IncrementType.index;
391
394
  const isFloatValue = incrementType === IncrementType.standard || incrementType === IncrementType.fine || incrementType === IncrementType.button;
392
395
  // const velocityMultiplier: number = 1;
393
- const buttonIncrementMultiplier = incrementType === IncrementType.button && buttonIncrement ? Math.abs(buttonIncrement) : 1;
394
- const totalNumStepsMultiplier = incrementType === IncrementType.standard ? Math.abs(numSteps * 0.01) : 1;
395
- const signMultiplier = hasButtonIncrementType ? Math.sign(buttonDirection === StepDirection.down ? -1 : 1) : delta ?? 1;
396
- const returnVal = (startingValue ?? 0) + (interval ?? 0) * // velocityMultiplier *
397
- buttonIncrementMultiplier * totalNumStepsMultiplier * signMultiplier;
398
- return isFloatValue ? parseFloat(returnVal?.toFixed(2)) : Math.round(returnVal);
396
+ const buttonIncrementMultiplier = hasButtonIncrementType && buttonIncrement ? Math.abs(buttonIncrement) : 1;
397
+ const totalNumStepsMultiplier = getTotalNumStepsMultiplier(incrementType, (isFloatValue ? sliderNumSteps : comboboxNumChoices) ?? 0);
398
+ const deltaMultiplier = hasVelocity ? Math.abs(delta ?? 1) : 1;
399
+ const signMultiplier = hasButtonIncrementType ? Math.sign(buttonDirection === StepDirection.down ? -1 : 1) : Math.sign(delta ?? 1);
400
+ const returnVal = (startingValue ?? 0) + (incrementType === IncrementType.indexButton || incrementType === IncrementType.index ? 1 : sliderInterval ?? 0) * signMultiplier * deltaMultiplier * buttonIncrementMultiplier * totalNumStepsMultiplier;
401
+ return isFloatValue ? Math.max(sliderMin, Math.min(parseFloat(returnVal?.toFixed(2)), sliderMax)) : Math.max(0, Math.min((comboboxNumChoices ?? 0) - 1, Math.round(returnVal)));
402
+ };
403
+ const incrementSlider = ({ delta, incrementType, startingValue, sliderInterval, sliderNumSteps, sliderMin, sliderMax })=>{
404
+ return incrementValue({
405
+ delta,
406
+ incrementType,
407
+ startingValue,
408
+ sliderInterval,
409
+ sliderNumSteps,
410
+ sliderMin,
411
+ sliderMax
412
+ });
413
+ };
414
+ const incrementSliderButton = ({ startingValue, buttonIncrement, buttonDirection, sliderInterval, sliderNumSteps, sliderMin, sliderMax })=>{
415
+ return incrementValue({
416
+ incrementType: IncrementType.button,
417
+ startingValue,
418
+ buttonIncrement,
419
+ buttonDirection,
420
+ sliderInterval,
421
+ sliderNumSteps,
422
+ sliderMin,
423
+ sliderMax
424
+ });
425
+ };
426
+ const incrementIndex = ({ delta, startingValue, comboboxNumChoices })=>{
427
+ return incrementValue({
428
+ delta,
429
+ incrementType: IncrementType.index,
430
+ startingValue,
431
+ comboboxNumChoices
432
+ });
433
+ };
434
+ const incrementIndexButton = ({ startingValue, comboboxNumChoices, buttonDirection })=>{
435
+ return incrementValue({
436
+ incrementType: IncrementType.indexButton,
437
+ startingValue,
438
+ comboboxNumChoices,
439
+ buttonDirection
440
+ });
399
441
  };
400
442
  const generateDropShadowFilterString = (colors, radius)=>{
401
443
  let output = [];
@@ -469,6 +511,11 @@ const animateRotaryCircle = ({ animationFrameRef, elementRef, prevValRef, active
469
511
  animationFrameRef.current = requestAnimationFrame(()=>{
470
512
  if (elementRef.current) {
471
513
  elementRef.current.style.strokeDashoffset = `${polarity === Polarity.unipolar ? unipolarOffset : bipolarOffset}`;
514
+ // console.log(
515
+ // value,
516
+ // elementRef.current.style.strokeDashoffset,
517
+ // 'strokeDashoffsetstrokeDashoffsetstrokeDashoffset',
518
+ // );
472
519
  }
473
520
  });
474
521
  prevValRef.current = value;
@@ -713,6 +760,7 @@ function Button({ disabled, text, id, className, style, onClick, children, outer
713
760
  borderColor: componentIsHovered && highlightBorderColor ? highlightBorderColor : borderColor,
714
761
  children: jsx("button", {
715
762
  id: id,
763
+ "data-testid": "button-component",
716
764
  onMouseDown: handleMouseDown,
717
765
  disabled: disabled,
718
766
  onClick: onClick && onClick,
@@ -1224,6 +1272,7 @@ function Icon({ icon, onClick, disabled = false, color = 'var(--color-text)', pa
1224
1272
  ...style
1225
1273
  },
1226
1274
  children: jsx(Icon, {
1275
+ "data-testid": "icon-component",
1227
1276
  width: numberWidth,
1228
1277
  color: disabled ? 'var(--color-gray-400)' : color
1229
1278
  })
@@ -1238,6 +1287,7 @@ function Label({ value, id, className, style, color = 'var(--color-text)', highl
1238
1287
  ], uppercase, outerGlowRadius, outerGlowColor, blur, children, htmlFor, fontSize = FontSizes.medium, ...rest }) {
1239
1288
  const [componentIsHovered, setComponentIsHovered] = useState(false);
1240
1289
  return jsx("label", {
1290
+ "data-testid": "label-component",
1241
1291
  id: id,
1242
1292
  htmlFor: htmlFor,
1243
1293
  onMouseEnter: ()=>setComponentIsHovered(true),
@@ -1348,11 +1398,17 @@ function Tabs({ items, initialSelectedIndex = undefined, id = '', className, pad
1348
1398
  useEffect(()=>{
1349
1399
  if (dataSource === DataSource.JuceCombobox) {
1350
1400
  setTimeout(()=>{
1351
- setChoices(comboBoxState.properties.choices);
1352
- setSelectedIndex(comboBoxState.getChoiceIndex());
1401
+ if (comboBoxState.properties.choices.length > 0) {
1402
+ setChoices(comboBoxState.properties.choices);
1403
+ setSelectedIndex(comboBoxState.getChoiceIndex());
1404
+ }
1353
1405
  });
1354
1406
  } else {
1355
- setChoices(items?.length ? items : []);
1407
+ setTimeout(()=>{
1408
+ if (items?.length) {
1409
+ setChoices(items);
1410
+ }
1411
+ });
1356
1412
  }
1357
1413
  }, []);
1358
1414
  useEffect(()=>{
@@ -1991,16 +2047,12 @@ const useCombobox = ({ id, label, items = [], filter, onChange, displayValInHead
1991
2047
  saveToBackend: false
1992
2048
  });
1993
2049
  }
1994
- if (selectedIndex > 0 && selectedIndex < choices.length) {
1995
- const newValue = incrementValue({
1996
- delta: delta[1] * -1,
1997
- incrementType: IncrementType.index,
1998
- startingValue: selectedIndex,
1999
- interval: properties?.interval ?? 0,
2000
- numSteps: properties?.numSteps ?? 0
2001
- });
2002
- comboBoxState?.setChoiceIndex(newValue);
2003
- }
2050
+ const newValue = incrementIndex({
2051
+ delta: delta[1] * -1,
2052
+ startingValue: selectedIndex,
2053
+ comboboxNumChoices: properties?.choices?.length ?? 0
2054
+ });
2055
+ comboBoxState?.setChoiceIndex(newValue);
2004
2056
  }
2005
2057
  }, {
2006
2058
  enabled: !isDisabled,
@@ -2042,22 +2094,21 @@ const useCombobox = ({ id, label, items = [], filter, onChange, displayValInHead
2042
2094
  }
2043
2095
  };
2044
2096
  const incrementComboboxButton = ()=>{
2045
- if (selectedIndex < properties.choices.length - 1) {
2046
- const newIndex = incrementValue({
2047
- interval: properties?.interval,
2097
+ if (selectedIndex <= properties.choices.length - 1) {
2098
+ const newIndex = incrementIndexButton({
2048
2099
  startingValue: selectedIndex,
2049
- incrementType: IncrementType.indexButton,
2050
- numSteps: properties?.choices?.length
2100
+ comboboxNumChoices: properties?.choices?.length,
2101
+ buttonDirection: StepDirection.up
2051
2102
  });
2052
2103
  handleChange(newIndex);
2053
2104
  }
2054
2105
  };
2055
2106
  const decrementComboboxButton = ()=>{
2056
2107
  if (selectedIndex > 0) {
2057
- const newIndex = incrementValue({
2108
+ const newIndex = incrementIndexButton({
2058
2109
  startingValue: selectedIndex,
2059
- incrementType: IncrementType.indexButton,
2060
- numSteps: properties?.choices?.length
2110
+ comboboxNumChoices: properties?.choices?.length,
2111
+ buttonDirection: StepDirection.down
2061
2112
  });
2062
2113
  handleChange(newIndex);
2063
2114
  }
@@ -2137,7 +2188,7 @@ function ComboboxComponent({ id, anchorTo, excludeItems = [], items, onChange, c
2137
2188
  }) : null,
2138
2189
  jsxs(Combobox$2, {
2139
2190
  value: selectedIndexLabel,
2140
- onChange: (selectedIndexLabel)=>handleChange(selectedIndexLabel),
2191
+ onChange: (selectedIndexLabel)=>selectedIndexLabel && handleChange(selectedIndexLabel),
2141
2192
  onClose: ()=>{
2142
2193
  setIncludeFilterString('');
2143
2194
  },
@@ -2283,6 +2334,7 @@ function Combobox$1({ label, showLabel, color = 'var(--color-text)', labelColor,
2283
2334
  flexDirection: Box.flexDirection.column,
2284
2335
  className: `${className ?? ''} ComboboxComponent`,
2285
2336
  width: getStringSizeValue(width) || 'auto',
2337
+ "data-testid": "combobox-component",
2286
2338
  style: {
2287
2339
  color: componentIsHovered && buttonHighlightColor ? buttonHighlightColor : color,
2288
2340
  // position: 'relative',
@@ -2322,6 +2374,7 @@ function Combobox$1({ label, showLabel, color = 'var(--color-text)', labelColor,
2322
2374
  },
2323
2375
  children: [
2324
2376
  jsx(ListboxButton, {
2377
+ "data-testid": "combobox-button",
2325
2378
  className: "Combobox-button-element",
2326
2379
  // onMouseEnter={() => setComponentIsHovered(true)}
2327
2380
  // onMouseLeave={() => setComponentIsHovered(false)}
@@ -2360,6 +2413,7 @@ function Combobox$1({ label, showLabel, color = 'var(--color-text)', labelColor,
2360
2413
  id: "Combobox-up-arrow",
2361
2414
  className: "Combobox-arrow",
2362
2415
  backgroundColor: "transparent",
2416
+ "data-testid": "combobox-up-arrow",
2363
2417
  highlightIconColor: buttonHighlightColor,
2364
2418
  highlightColor: buttonHighlightColor,
2365
2419
  disabledIconColor: labelColor,
@@ -2379,6 +2433,7 @@ function Combobox$1({ label, showLabel, color = 'var(--color-text)', labelColor,
2379
2433
  jsx(IconButton, {
2380
2434
  id: "Combobox-down-arrow",
2381
2435
  className: "Combobox-arrow",
2436
+ "data-testid": "combobox-down-arrow",
2382
2437
  backgroundColor: "transparent",
2383
2438
  disabledIconColor: labelColor,
2384
2439
  highlightIconColor: buttonHighlightColor,
@@ -2401,6 +2456,7 @@ function Combobox$1({ label, showLabel, color = 'var(--color-text)', labelColor,
2401
2456
  ]
2402
2457
  }),
2403
2458
  jsx(ListboxOptions, {
2459
+ "data-testid": "combobox-options",
2404
2460
  anchor: anchorTo,
2405
2461
  portal: false,
2406
2462
  className: "Combobox-items z-10",
@@ -2410,6 +2466,7 @@ function Combobox$1({ label, showLabel, color = 'var(--color-text)', labelColor,
2410
2466
  width
2411
2467
  },
2412
2468
  children: choices?.map((item, i)=>jsx(ListboxOption, {
2469
+ "data-testid": "combobox-option",
2413
2470
  className: classnames('Combobox-item'),
2414
2471
  value: item,
2415
2472
  // onMouseEnter={() => setHoveredDropdownItem(item)}
@@ -2528,7 +2585,6 @@ function Input({ onComplete, value, min, max, fontSize = FontSizes.xSmall, style
2528
2585
  // const [isHighlighted, setIsHighlighted] = useState<boolean>(false);
2529
2586
  const valueRef = useRef(null);
2530
2587
  const inputRef = useRef(null);
2531
- const isLocalhost = window.location.hostname === 'localhost';
2532
2588
  const inputId = `${id}-input`;
2533
2589
  // Sets up listeners to handle changes on the backend
2534
2590
  // const currentOuterGlowColor = !isHighlighted
@@ -2539,7 +2595,9 @@ function Input({ onComplete, value, min, max, fontSize = FontSizes.xSmall, style
2539
2595
  const sliderState = Juce.getSliderState(id);
2540
2596
  const legalVal = snapToLegalValue({
2541
2597
  value: sliderState?.scaledValue,
2542
- properties: sliderState.properties
2598
+ interval: sliderState.properties.interval,
2599
+ start: sliderState.properties.start,
2600
+ end: sliderState.properties.end
2543
2601
  });
2544
2602
  setInternalValue(legalVal);
2545
2603
  valueRef.current = legalVal;
@@ -2557,24 +2615,23 @@ function Input({ onComplete, value, min, max, fontSize = FontSizes.xSmall, style
2557
2615
  }
2558
2616
  }
2559
2617
  useEffect(()=>{
2560
- if (!isLocalhost) {
2561
- document.addEventListener('keyup', handleKeyUp);
2562
- //TODO: don't get slider state if value is passed as a prop?
2563
- const sliderState = Juce.getSliderState(id);
2564
- const valueListenerId = sliderState?.valueChangedEvent.addListener((e)=>{
2565
- const legalVal = snapToLegalValue({
2566
- value: sliderState?.scaledValue,
2567
- properties: sliderState.properties
2568
- });
2569
- valueRef.current = legalVal;
2570
- setInternalValue(legalVal);
2618
+ document.addEventListener('keyup', handleKeyUp);
2619
+ //TODO: don't get slider state if value is passed as a prop?
2620
+ const sliderState = Juce.getSliderState(id);
2621
+ const valueListenerId = sliderState?.valueChangedEvent.addListener((e)=>{
2622
+ const legalVal = snapToLegalValue({
2623
+ value: sliderState?.scaledValue,
2624
+ interval: sliderState.properties.interval,
2625
+ start: sliderState.properties.start,
2626
+ end: sliderState.properties.end
2571
2627
  });
2572
- return ()=>{
2573
- document.removeEventListener('keyup', handleKeyUp);
2574
- sliderState?.valueChangedEvent.removeListener(valueListenerId);
2575
- };
2576
- }
2577
- return;
2628
+ valueRef.current = legalVal;
2629
+ setInternalValue(legalVal);
2630
+ });
2631
+ return ()=>{
2632
+ document.removeEventListener('keyup', handleKeyUp);
2633
+ sliderState?.valueChangedEvent.removeListener(valueListenerId);
2634
+ };
2578
2635
  }, [
2579
2636
  window
2580
2637
  ]);
@@ -2611,6 +2668,7 @@ function Input({ onComplete, value, min, max, fontSize = FontSizes.xSmall, style
2611
2668
  return jsx("input", {
2612
2669
  id: inputId,
2613
2670
  ref: inputRef,
2671
+ "data-testid": "input-component",
2614
2672
  className: classnames('TextInput', className),
2615
2673
  // onFocus={() => setIsHighlighted(true)}
2616
2674
  onBlur: (e)=>{
@@ -2693,7 +2751,7 @@ const useSlider = ({ id, rowId, label, displayValInHeader = true, mockProperties
2693
2751
  const sliderState = Juce.getSliderState(id);
2694
2752
  // const numSteps = sliderState?.getNumSteps();
2695
2753
  const [scaledValue, setScaledValue] = useState(0);
2696
- const [normalisedValue, setNormalisedValue] = useState(sliderState?.normalisedValue);
2754
+ const [normalisedValue, setNormalisedValue] = useState(sliderState?.getNormalisedValue());
2697
2755
  const dragInProgress = useRef(false);
2698
2756
  const { highlightedItemChanged, setDefaultParameter, updateModSlotRowTarget, getModSlotPreview, mainPanelrandomizerObject } = useGlobalContext();
2699
2757
  const randomizerObjectToUse = randomizerObject && Object.keys(randomizerObject).length > 0 ? randomizerObject : mainPanelrandomizerObject;
@@ -2734,7 +2792,7 @@ const useSlider = ({ id, rowId, label, displayValInHeader = true, mockProperties
2734
2792
  // Update JUCE state
2735
2793
  const setJuceScaledValue = (newValue)=>{
2736
2794
  if (previousScaledValueRef?.current !== newValue) {
2737
- !isLocalhost && sliderState.setScaledValue(clamp(newValue, sliderState?.properties?.start, sliderState?.properties?.end));
2795
+ sliderState.setScaledValue(clamp(newValue, sliderState?.properties?.start, sliderState?.properties?.end));
2738
2796
  rowId && changeHandler(newValue, rowId);
2739
2797
  previousScaledValueRef.current = newValue;
2740
2798
  }
@@ -2756,31 +2814,28 @@ const useSlider = ({ id, rowId, label, displayValInHeader = true, mockProperties
2756
2814
  id
2757
2815
  ]);
2758
2816
  // Sets up listeners to handle changes on the backend
2759
- //@ts-expect-error
2760
2817
  useEffect(()=>{
2761
- if (!isLocalhost) {
2762
- document.addEventListener('keydown', keyDownListener);
2763
- document.addEventListener('keyup', keyUpListener);
2764
- const valueListenerId = sliderState?.valueChangedEvent.addListener(()=>{
2765
- const sliderState = Juce.getSliderState(id);
2766
- setNormalisedValue(sliderState.getNormalisedValue());
2767
- setScaledValue(parseFloat(sliderState?.scaledValue?.toFixed(2)));
2768
- if (displayValInHeader && (label || properties?.name)) {
2769
- highlightedItemChanged({
2770
- label: label || properties?.name || '',
2771
- value: parseFloat(sliderState?.scaledValue?.toFixed(2))
2772
- });
2773
- }
2774
- });
2775
- const propertiesListenerId = sliderState?.propertiesChangedEvent.addListener(()=>setProperties(sliderState?.properties));
2776
- previousScaledValueRef.current = sliderState.scaledValue;
2777
- return ()=>{
2778
- document.removeEventListener('keydown', keyDownListener);
2779
- document.removeEventListener('keyup', keyUpListener);
2780
- sliderState?.valueChangedEvent.removeListener(valueListenerId);
2781
- sliderState?.propertiesChangedEvent.removeListener(propertiesListenerId);
2782
- };
2783
- }
2818
+ document.addEventListener('keydown', keyDownListener);
2819
+ document.addEventListener('keyup', keyUpListener);
2820
+ const valueListenerId = sliderState?.valueChangedEvent.addListener((e)=>{
2821
+ const sliderState = Juce.getSliderState(id);
2822
+ setNormalisedValue(sliderState.getNormalisedValue());
2823
+ setScaledValue(parseFloat(sliderState?.scaledValue?.toFixed(2)));
2824
+ if (displayValInHeader && (label || properties?.name)) {
2825
+ highlightedItemChanged({
2826
+ label: label || properties?.name || '',
2827
+ value: parseFloat(sliderState?.scaledValue?.toFixed(2))
2828
+ });
2829
+ }
2830
+ });
2831
+ const propertiesListenerId = sliderState?.propertiesChangedEvent.addListener(()=>setProperties(sliderState?.properties));
2832
+ previousScaledValueRef.current = sliderState.scaledValue;
2833
+ return ()=>{
2834
+ document.removeEventListener('keydown', keyDownListener);
2835
+ document.removeEventListener('keyup', keyUpListener);
2836
+ sliderState?.valueChangedEvent.removeListener(valueListenerId);
2837
+ sliderState?.propertiesChangedEvent.removeListener(propertiesListenerId);
2838
+ };
2784
2839
  }, [
2785
2840
  window,
2786
2841
  changeHandler
@@ -2807,12 +2862,14 @@ const useSlider = ({ id, rowId, label, displayValInHeader = true, mockProperties
2807
2862
  }
2808
2863
  if (dragOrientation !== DragOrientation.followCursor) {
2809
2864
  const deltaVal = dragOrientation === DragOrientation.vertical ? delta[1] * -1 : delta[0];
2810
- const newValue = incrementValue({
2865
+ const newValue = incrementSlider({
2811
2866
  delta: deltaVal,
2812
2867
  incrementType: optionIsDown ? IncrementType.fine : IncrementType.standard,
2813
2868
  startingValue: previousScaledValueRef.current || 0,
2814
- interval: properties?.interval ?? 0,
2815
- numSteps: properties?.numSteps ?? 0
2869
+ sliderInterval: properties?.interval ?? 0,
2870
+ sliderNumSteps: properties?.numSteps ?? 0,
2871
+ sliderMin: properties?.start ?? 0,
2872
+ sliderMax: properties?.end ?? 0
2816
2873
  });
2817
2874
  setJuceScaledValue(newValue);
2818
2875
  }
@@ -2887,7 +2944,7 @@ styleInject(css_248z$c);
2887
2944
  var css_248z$b = ".ControlGroup.isFocused {\n --b: 1px; /* thickness of the border */\n --c: var(--slider-highlight-color); /* color of the border */\n --w: 5px; /* width of border */\n\n border: var(--b) solid #0000; /* space for the border */\n --_g: #0000 90deg, var(--c) 0;\n --_p: var(--w) var(--w) border-box no-repeat;\n background:\n conic-gradient(from 90deg at top var(--b) left var(--b), var(--_g)) 0 0 /\n var(--_p),\n conic-gradient(from 180deg at top var(--b) right var(--b), var(--_g)) 100% 0 /\n var(--_p),\n conic-gradient(from 0deg at bottom var(--b) left var(--b), var(--_g)) 0 100% /\n var(--_p),\n conic-gradient(from -90deg at bottom var(--b) right var(--b), var(--_g))\n 100% 100% / var(--_p);\n}\n";
2888
2945
  styleInject(css_248z$b);
2889
2946
 
2890
- function ControlGroupWrapper({ id, isDisabled = false, isFocused, className, children, width = 'auto', height = 'auto', borderHighlightColor = 'var(--color-brand)', flexDirection = FlexDirection$1.column, style }) {
2947
+ function ControlGroupWrapper({ id, isDisabled = false, isFocused, className, children, width = 'auto', height = 'auto', gap = Spacing.none, borderHighlightColor = 'var(--color-brand)', flexDirection = FlexDirection$1.column, style }) {
2891
2948
  // EXPECTED CONTROL GROUP STRUCTURE
2892
2949
  // <ControlGroup id={id-control-group}>
2893
2950
  // <Slider id={id}></Slider>
@@ -2897,6 +2954,7 @@ function ControlGroupWrapper({ id, isDisabled = false, isFocused, className, chi
2897
2954
  return jsx(Box, {
2898
2955
  id: groupId,
2899
2956
  width: width,
2957
+ gap: Box.gap.none,
2900
2958
  className: `ControlGroup ${isFocused ? 'isFocused' : ''} ${isDisabled ? 'isDisabled' : ''} ${className ? className : ''}`,
2901
2959
  style: {
2902
2960
  //@ts-expect-error
@@ -2910,6 +2968,7 @@ function ControlGroupWrapper({ id, isDisabled = false, isFocused, className, chi
2910
2968
  });
2911
2969
  }
2912
2970
  ControlGroupWrapper.FlexDirection = FlexDirection$1;
2971
+ ControlGroupWrapper.gap = Spacing;
2913
2972
 
2914
2973
  const ProgressCircle = ({ width, height, polarity = Polarity.unipolar, strokeWidth = 5, // trackOffset = 0,
2915
2974
  indicatorLineColor, indicatorLineGradient, outerGlowRadius, outerGlowColors = [], blur, indicatorLineRange, trackColor, radius, circ, activeZone, normalisedValue })=>{
@@ -2967,6 +3026,7 @@ indicatorLineColor, indicatorLineGradient, outerGlowRadius, outerGlowColors = []
2967
3026
  ref: sliderElementRef,
2968
3027
  id: "circle2",
2969
3028
  className: "ProgressCircle-fg",
3029
+ "data-testid": "progress-circle-component",
2970
3030
  cx: cx,
2971
3031
  cy: cy,
2972
3032
  r: radius,
@@ -3288,6 +3348,7 @@ function RotaryCircle({ polarity = Polarity.unipolar, className, id, trackWidth
3288
3348
  id: id,
3289
3349
  tabIndex: 0,
3290
3350
  className: classnames('Slider', 'RotarySlider', polarity === Polarity.unipolar ? 'Slider-polarity-unipolar' : 'Slider-polarity-bipolar', className),
3351
+ "data-testid": "slider-component",
3291
3352
  ...bindDrag(),
3292
3353
  onDoubleClick: ()=>{
3293
3354
  onDoubleClick && onDoubleClick();
@@ -3558,12 +3619,14 @@ function useGroupFocus({ isDisabled, id, inputRef, incrementBy }) {
3558
3619
  const increment = ()=>{
3559
3620
  if (!isMainSliderACombobox) {
3560
3621
  const scaledVal = sliderState?.scaledValue;
3561
- const newValue = incrementValue({
3562
- incrementType: IncrementType.button,
3563
- numSteps: sliderState?.properties?.numSteps,
3622
+ const newValue = incrementSliderButton({
3623
+ sliderNumSteps: sliderState?.properties?.numSteps,
3564
3624
  startingValue: scaledVal,
3565
3625
  buttonDirection: StepDirection.up,
3566
- interval: sliderState?.properties?.interval
3626
+ sliderInterval: sliderState?.properties?.interval,
3627
+ sliderMin: sliderState?.properties?.start,
3628
+ sliderMax: sliderState?.properties?.end,
3629
+ buttonIncrement: 1
3567
3630
  });
3568
3631
  sliderState.setScaledValue(newValue);
3569
3632
  } else {
@@ -3574,12 +3637,14 @@ function useGroupFocus({ isDisabled, id, inputRef, incrementBy }) {
3574
3637
  const decrement = ()=>{
3575
3638
  if (!isMainSliderACombobox) {
3576
3639
  const scaledVal = sliderState?.scaledValue;
3577
- const newValue = incrementValue({
3578
- incrementType: IncrementType.button,
3579
- numSteps: sliderState?.properties?.numSteps,
3640
+ const newValue = incrementSliderButton({
3641
+ sliderNumSteps: sliderState?.properties?.numSteps,
3580
3642
  startingValue: scaledVal,
3581
3643
  buttonDirection: StepDirection.down,
3582
- interval: sliderState?.properties?.interval
3644
+ sliderInterval: sliderState?.properties?.interval,
3645
+ sliderMin: sliderState?.properties?.start,
3646
+ sliderMax: sliderState?.properties?.end,
3647
+ buttonIncrement: 1
3583
3648
  });
3584
3649
  sliderState?.setScaledValue(newValue);
3585
3650
  } else {
@@ -3695,7 +3760,6 @@ indicatorId, indicatorLineColor, indicatorLineGradient = GradientStyles.unicolor
3695
3760
  id,
3696
3761
  inputRef
3697
3762
  });
3698
- // console.l
3699
3763
  // const defaultTrackWidth = size === RotarySliderSizes.large ? 5 : 3;
3700
3764
  const defaultHandleShape = size === RotarySliderSizes.large ? RotarySliderHandleShapes.circle : RotarySliderHandleShapes.rectangle;
3701
3765
  return jsx(Box, {
@@ -3797,7 +3861,7 @@ RotarySlider.handleShape = RotarySliderHandleShapes;
3797
3861
  RotarySlider.gradient = GradientStyles;
3798
3862
  RotarySlider.trackWidth = TrackWidths;
3799
3863
 
3800
- var css_248z$9 = ".BarSlider-innerWrapper:hover {\n cursor: pointer;\n}\n\n.BarSlider-Track {\n touch-action: none;\n position: relative;\n width: 100%;\n height: 100%;\n max-height: 100%;\n max-width: 100%;\n background-color: var(--bg-lv5);\n}\n\n.BarSlider-Track.isHighlighted {\n background-color: var(--bg-lv6);\n}\n.Barslider-IndicatorLineWrapper,\n.BarSlider-HandleWrapper {\n position: absolute;\n pointer-events: none;\n}\n\n.BarSlider-IndicatorLine {\n position: absolute;\n top: 0;\n /* left: 0; */\n right: 0;\n bottom: 0;\n pointer-events: none;\n}\n.BarSlider-Handle {\n position: absolute;\n pointer-events: none;\n}\n\n.BarSliderHandle {\n pointer-events: auto;\n}\n.Barslider-IndicatorLineWrapper {\n /* border-radius: var(--trackBorderRadius); */\n overflow: hidden;\n}\n\n.BarSlider-Input {\n font-weight: bold;\n width: 100%;\n}\n\n.BarSlider-Input.includeValueInHeightIsFalse {\n position: absolute;\n bottom: -1.7em;\n left: 0;\n right: 0;\n z-index: 10;\n}\n";
3864
+ var css_248z$9 = ".BarSlider-innerWrapper:hover,\n.BarSlider-dragWrapper:hover {\n cursor: pointer;\n}\n\n.BarSlider-Track {\n touch-action: none;\n position: relative;\n width: 100%;\n height: 100%;\n max-height: 100%;\n max-width: 100%;\n background-color: var(--bg-lv5);\n}\n\n.BarSlider-Track.isHighlighted {\n background-color: var(--bg-lv6);\n}\n.Barslider-IndicatorLineWrapper,\n.BarSlider-HandleWrapper {\n position: absolute;\n pointer-events: none;\n}\n\n.BarSlider-IndicatorLine {\n position: absolute;\n top: 0;\n /* left: 0; */\n right: 0;\n bottom: 0;\n pointer-events: none;\n}\n.BarSlider-Handle {\n position: absolute;\n pointer-events: none;\n}\n\n.BarSliderHandle {\n pointer-events: auto;\n}\n.Barslider-IndicatorLineWrapper {\n /* border-radius: var(--trackBorderRadius); */\n overflow: hidden;\n}\n\n.BarSlider-Input {\n font-weight: bold;\n width: 100%;\n}\n\n.BarSlider-Input.includeValueInHeightIsFalse {\n position: absolute;\n bottom: -1.7em;\n left: 0;\n right: 0;\n z-index: 10;\n}\n";
3801
3865
  styleInject(css_248z$9);
3802
3866
 
3803
3867
  function Slider$1({ polarity = Polarity.unipolar, orientation = Orientation.vertical, dragOrientation = DragOrientation.followCursor, isRandomizable = false, randomizerObject, isStandalone = true, isHighlighted = false, showValue = true, showHandle = true, showLabel = true, showInsetBoxShadow = true, resetterObject, className, id, width, height = Height.full, onChange, outerGlowRadius, outerGlowColors, trackBorderRadius = 20, blur, style, indicatorLineColor = 'var(--color-brand)', indicatorLineGradient, trackColor = 'var(--bg-lv3)', markColor = 'var(--bg-lv7)', markHighlightColor = 'var(--color-text)', trackStrokeColor, handleFillColor, handleStrokeColor, cornerBorderHighlightColor, trackWidth = TrackWidths.small, label, labelColor, marks = [], inputHighlightColor = 'var(--color-brand)', includeValueInHeight = true, // Mocks the initial scaled value of the slider for web veiws outside of JUCE
@@ -3865,7 +3929,7 @@ mockInitialNormalisedValue = 0, mockProperties = {
3865
3929
  normalisedValue
3866
3930
  ]);
3867
3931
  const trackWidthMap = {
3868
- small: 5,
3932
+ small: 8,
3869
3933
  large: 10
3870
3934
  };
3871
3935
  const trackStringWidth = typeof trackWidth === 'string' ? trackWidth !== TrackWidths.full ? `${trackWidthMap[trackWidth]}px` : '100%' : `${trackWidth}px`;
@@ -3882,10 +3946,6 @@ mockInitialNormalisedValue = 0, mockProperties = {
3882
3946
  [GradientStyles.unicolor]: singleColorGradient
3883
3947
  };
3884
3948
  const marginSize = Spacing.mediumSmall;
3885
- // const handleRef = useRef(null);
3886
- // useEffect(() => {
3887
- // console.log(normalisedValue, 'NORMALIZEDVAL');
3888
- // }, [normalisedValue]);
3889
3949
  return jsxs(Box, {
3890
3950
  flexDirection: Box.flexDirection.column,
3891
3951
  justifyContent: Box.justifyContent.center,
@@ -3893,7 +3953,7 @@ mockInitialNormalisedValue = 0, mockProperties = {
3893
3953
  className: classnames('BarSlider', isVertical && 'BarSlider--isVertical', isHorizontal && 'BarSlider--isHorizontal', className),
3894
3954
  id: id,
3895
3955
  ref: sliderElementRef,
3896
- gap: Box.gap.none,
3956
+ gap: isVertical ? ControlGroupWrapper.gap.small : ControlGroupWrapper.gap.none,
3897
3957
  height: isVertical ? height : 'auto',
3898
3958
  width: isHorizontal ? width : width ?? '100%',
3899
3959
  style: {
@@ -3915,22 +3975,25 @@ mockInitialNormalisedValue = 0, mockProperties = {
3915
3975
  jsxs(ControlGroupWrapper, {
3916
3976
  id: id,
3917
3977
  width: '100%',
3978
+ gap: isVertical ? ControlGroupWrapper.gap.small : ControlGroupWrapper.gap.none,
3918
3979
  height: '100%',
3919
3980
  isFocused: isFocused,
3920
- className: `RotarySlider-HighlightWrapper`,
3981
+ className: `BarSlider-HighlightWrapper`,
3921
3982
  borderHighlightColor: cornerBorderHighlightColor,
3922
3983
  children: [
3923
3984
  jsxs(Box, {
3924
3985
  style: {
3925
3986
  position: 'relative'
3926
3987
  },
3988
+ className: "BarSlider-dragWrapper",
3927
3989
  fullHeight: true,
3990
+ ...drag(),
3928
3991
  padding: isStandalone ? isVertical ? [
3929
3992
  Box.padding.none
3930
3993
  ] : [
3931
- marginSize,
3994
+ Box.padding.mediumSmall,
3932
3995
  Box.padding.small,
3933
- Box.padding.none,
3996
+ marginSize,
3934
3997
  Box.padding.small
3935
3998
  ] : [
3936
3999
  Box.padding.none
@@ -3994,7 +4057,7 @@ mockInitialNormalisedValue = 0, mockProperties = {
3994
4057
  touchAction: 'none'
3995
4058
  },
3996
4059
  "data-sliderElement": "true",
3997
- ...drag(),
4060
+ "data-testid": "slider-component",
3998
4061
  children: jsxs("div", {
3999
4062
  className: classnames('BarSlider-Track', isHighlighted && 'isHighlighted'),
4000
4063
  // onMouseEnter={onMouseEnter}
@@ -4329,6 +4392,7 @@ function Heading({ value, id, className, style, removeLineHeight = false, color
4329
4392
  ], fontSize = FontSizes.large, children }) {
4330
4393
  const Tag = tag;
4331
4394
  return jsx(Tag, {
4395
+ "data-testid": "heading-component",
4332
4396
  id: id,
4333
4397
  style: {
4334
4398
  fontSize: `var(--text-${fontSize}`,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../node_modules/style-inject/dist/style-inject.es.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n"],"names":[],"mappings":";;;;;;;;;AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,CAAC;;AAEzD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B,IAAI;AACJ,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B,EAAE;;AAEF,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,EAAE,CAAC,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD,EAAE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"index.js","sources":["../node_modules/style-inject/dist/style-inject.es.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n"],"names":[],"mappings":";;;;;;;;;AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO,CAAC;;AAEzD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,IAAI,CAAC,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B,IAAI;AACJ,EAAE,CAAC,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B,EAAE;;AAEF,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,EAAE,CAAC,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD,EAAE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","x_google_ignoreList":[0]}