@rolster/react-components 19.8.16 → 19.8.17

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 (29) hide show
  1. package/dist/cjs/index.cjs +60 -29
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/es/index.mjs +60 -31
  4. package/dist/es/index.mjs.map +1 -1
  5. package/dist/esm/components/molecules/FieldListSuggestions/FieldListSuggestions.js +1 -1
  6. package/dist/esm/components/molecules/FieldListSuggestions/FieldListSuggestions.js.map +1 -1
  7. package/dist/esm/components/molecules/FieldListSuggestions/SuggestionsPortalController.d.ts +1 -1
  8. package/dist/esm/components/molecules/FieldListSuggestions/SuggestionsPortalController.js +28 -8
  9. package/dist/esm/components/molecules/FieldListSuggestions/SuggestionsPortalController.js.map +1 -1
  10. package/dist/esm/components/organisms/PickerClock/PickerClock.js +4 -3
  11. package/dist/esm/components/organisms/PickerClock/PickerClock.js.map +1 -1
  12. package/dist/esm/components/organisms/PickerColor/PickerColor.js +6 -5
  13. package/dist/esm/components/organisms/PickerColor/PickerColor.js.map +1 -1
  14. package/dist/esm/controllers/EventCallbackController.d.ts +1 -0
  15. package/dist/esm/controllers/EventCallbackController.js +9 -0
  16. package/dist/esm/controllers/EventCallbackController.js.map +1 -0
  17. package/dist/esm/controllers/ListController.js +10 -13
  18. package/dist/esm/controllers/ListController.js.map +1 -1
  19. package/dist/esm/controllers/RelocationOnComponentController.js +4 -3
  20. package/dist/esm/controllers/RelocationOnComponentController.js.map +1 -1
  21. package/dist/esm/controllers/ResizeController.js +3 -2
  22. package/dist/esm/controllers/ResizeController.js.map +1 -1
  23. package/dist/esm/helpers/css.d.ts +1 -0
  24. package/dist/esm/helpers/css.js +8 -0
  25. package/dist/esm/helpers/css.js.map +1 -1
  26. package/dist/esm/index.d.ts +1 -0
  27. package/dist/esm/index.js +1 -0
  28. package/dist/esm/index.js.map +1 -1
  29. package/package.json +1 -1
package/dist/es/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import require$$0, { memo, useMemo, useState, useRef, useCallback, useEffect, useEffectEvent, createContext, useContext } from 'react';
1
+ import require$$0, { memo, useMemo, useState, useRef, useCallback, useEffect, useInsertionEffect, createContext, useContext } from 'react';
2
2
  import { currencyFormat, BigDecimal, valueIsDefined, SealedPartial } from '@rolster/commons';
3
3
  import { i18n, i18nSubscribe } from '@rolster/i18n';
4
4
  import ReactDOM, { createPortal } from 'react-dom';
@@ -428,6 +428,14 @@ function requireJsxRuntime () {
428
428
 
429
429
  var jsxRuntimeExports = requireJsxRuntime();
430
430
 
431
+ const FALLBACK_REM_SIZE$1 = 16;
432
+ function getRemSize$1() {
433
+ if (typeof window === 'undefined') {
434
+ return FALLBACK_REM_SIZE$1;
435
+ }
436
+ const fontSize = parseFloat(getComputedStyle(document.documentElement).fontSize);
437
+ return fontSize > 0 ? fontSize : FALLBACK_REM_SIZE$1;
438
+ }
431
439
  function renderClassStatus(base, status = {}, additionals) {
432
440
  const classElement = [base];
433
441
  Object.entries(status).forEach(([key, state]) => {
@@ -1636,6 +1644,19 @@ const reactI18n = i18n({
1636
1644
  }
1637
1645
  });
1638
1646
 
1647
+ function useEventCallback(callback) {
1648
+ const refCallback = useRef(callback);
1649
+ useInsertionEffect(() => {
1650
+ refCallback.current = callback;
1651
+ });
1652
+ return useCallback((...args) => refCallback.current(...args), []);
1653
+ }
1654
+
1655
+ const MAX_LIST_HEIGHT_REM$2 = 180;
1656
+ const MOBILE_MEDIA_QUERY = '(max-width: 480px)';
1657
+ const SUGGESTIONS_OFFSET_REM = 6;
1658
+ const SUGGESTIONS_OVERLAP_REM = 4;
1659
+ const VIEWPORT_GAP_REM$1 = 8;
1639
1660
  function getScrollableAncestors(element) {
1640
1661
  const ancestors = [];
1641
1662
  let parent = element.parentElement;
@@ -1668,14 +1689,22 @@ function anchorIsVisible(rect, scrollables) {
1668
1689
  rect.right > left &&
1669
1690
  rect.left < right);
1670
1691
  }
1671
- function useSuggestionsPortalController(visible, refAnchor, onHiddenAnchor) {
1692
+ function getMaxHeight(rect, higher) {
1693
+ const remSize = getRemSize$1();
1694
+ const gap = VIEWPORT_GAP_REM$1 * remSize;
1695
+ const available = higher
1696
+ ? rect.top + SUGGESTIONS_OVERLAP_REM * remSize - gap
1697
+ : window.innerHeight - rect.bottom - SUGGESTIONS_OFFSET_REM * remSize - gap;
1698
+ return Math.max(0, Math.round(available));
1699
+ }
1700
+ function useSuggestionsPortalController(visible, refAnchor, onHiddenAnchor, higher) {
1672
1701
  const [mounted, setMounted] = useState(false);
1673
1702
  const [style, setStyle] = useState();
1674
1703
  const [theme, setTheme] = useState();
1675
1704
  useEffect(() => {
1676
1705
  setMounted(true);
1677
1706
  }, []);
1678
- const onAnchorHidden = useEffectEvent(() => {
1707
+ const onAnchorHidden = useEventCallback(() => {
1679
1708
  onHiddenAnchor?.();
1680
1709
  });
1681
1710
  useEffect(() => {
@@ -1693,15 +1722,20 @@ function useSuggestionsPortalController(visible, refAnchor, onHiddenAnchor) {
1693
1722
  }
1694
1723
  const rect = anchor.getBoundingClientRect();
1695
1724
  if (!anchorIsVisible(rect, scrollables)) {
1696
- onAnchorHidden();
1697
- return;
1725
+ return onAnchorHidden();
1698
1726
  }
1699
- setStyle({
1727
+ const style = {
1700
1728
  '--pvt-portal-top': `${rect.bottom}px`,
1701
1729
  '--pvt-portal-bottom': `${window.innerHeight - rect.top}px`,
1702
1730
  '--pvt-portal-left': `${rect.left}px`,
1703
1731
  '--pvt-portal-width': `${rect.width}px`
1704
- });
1732
+ };
1733
+ if (!window.matchMedia?.(MOBILE_MEDIA_QUERY).matches) {
1734
+ const maxHeight = `min(${MAX_LIST_HEIGHT_REM$2}rem, ${getMaxHeight(rect, higher)}px)`;
1735
+ style['--pvt-list-max-height'] = maxHeight;
1736
+ style['--pvt-list-body-max-height'] = maxHeight;
1737
+ }
1738
+ setStyle(style);
1705
1739
  }
1706
1740
  function requestReposition() {
1707
1741
  cancelAnimationFrame(frame);
@@ -1715,7 +1749,7 @@ function useSuggestionsPortalController(visible, refAnchor, onHiddenAnchor) {
1715
1749
  window.removeEventListener('scroll', requestReposition, true);
1716
1750
  window.removeEventListener('resize', requestReposition);
1717
1751
  };
1718
- }, [mounted, visible, refAnchor]);
1752
+ }, [mounted, visible, refAnchor, higher]);
1719
1753
  return { active: mounted && !!refAnchor, style, theme };
1720
1754
  }
1721
1755
 
@@ -1729,7 +1763,7 @@ function RlsFieldListLi({ element, onClickElement, onKeydownElement, render }) {
1729
1763
  return (jsxRuntimeExports.jsx("li", { className: "rls-field-list__element", tabIndex: -1, onClick: onClick, onKeyDown: onKeyDown, children: render(element) }));
1730
1764
  }
1731
1765
  function RlsFieldListSuggestionsComponent({ elements, action, disabled, higher, render, renderEmpty, searchControl, visible, onClickBackdrop, onClickElement, onHiddenAnchor, onKeydownElement, refAnchor, refList, refSuggestions, rlsTheme }) {
1732
- const portal = useSuggestionsPortalController(visible, refAnchor, onHiddenAnchor);
1766
+ const portal = useSuggestionsPortalController(visible, refAnchor, onHiddenAnchor, higher);
1733
1767
  const [labels, setLabels] = useState({
1734
1768
  listEmptyDescription: reactI18n('listEmptyDescription'),
1735
1769
  listEmptyTitle: reactI18n('listEmptyTitle')
@@ -2462,14 +2496,7 @@ function RlsCardComponent({ children, className, outline, rlsTheme }) {
2462
2496
  const RlsCard = memo(RlsCardComponent);
2463
2497
 
2464
2498
  const MAX_LIST_HEIGHT_REM$1 = 90;
2465
- const FALLBACK_REM_SIZE$1 = 16;
2466
- function getRemSize$1() {
2467
- if (typeof window === 'undefined') {
2468
- return FALLBACK_REM_SIZE$1;
2469
- }
2470
- const fontSize = parseFloat(getComputedStyle(document.documentElement).fontSize);
2471
- return fontSize > 0 ? fontSize : FALLBACK_REM_SIZE$1;
2472
- }
2499
+ const VIEWPORT_GAP_REM = 8;
2473
2500
  function suggestionsShallowEqual(a, b) {
2474
2501
  return (a === b ||
2475
2502
  (a.length === b.length && a.every((element, index) => element === b[index])));
@@ -2485,10 +2512,12 @@ function shouldDisplayHigher$1(content, list) {
2485
2512
  if (!content) {
2486
2513
  return false;
2487
2514
  }
2515
+ const remSize = getRemSize$1();
2516
+ const gap = VIEWPORT_GAP_REM * remSize;
2488
2517
  const { top, bottom } = content.getBoundingClientRect();
2489
- const spaceAbove = top;
2490
- const spaceBelow = window.innerHeight - bottom;
2491
- const maxHeight = MAX_LIST_HEIGHT_REM$1 * getRemSize$1();
2518
+ const spaceAbove = top - gap;
2519
+ const spaceBelow = window.innerHeight - bottom - gap;
2520
+ const maxHeight = MAX_LIST_HEIGHT_REM$1 * remSize;
2492
2521
  const desiredHeight = Math.min(list?.scrollHeight || maxHeight, maxHeight);
2493
2522
  if (spaceBelow >= desiredHeight) {
2494
2523
  return false;
@@ -2557,7 +2586,7 @@ function useListController({ suggestions, automatic, formControl, reference }) {
2557
2586
  formControl?.setValue(element?.value);
2558
2587
  }
2559
2588
  }, [formControl]);
2560
- const reconcileFormValue = useEffectEvent(() => {
2589
+ const reconcileFormValue = useEventCallback(() => {
2561
2590
  if (!changeValueInternal.current) {
2562
2591
  if (formControl?.value) {
2563
2592
  const element = collection.find(formControl.value);
@@ -3501,10 +3530,10 @@ function RlsPickerClockComponent({ formControl, onListener, rlsTheme, time }) {
3501
3530
  const classNamePM = renderClassStatus('rls-picker-clock__zone__value', {
3502
3531
  active: zoneIsPM
3503
3532
  });
3504
- const refreshClockHour = useEffectEvent(() => {
3533
+ const refreshClockHour = useEventCallback(() => {
3505
3534
  refreshClock(hour > 12 ? hour - 12 : hour);
3506
3535
  });
3507
- const refreshClockMinute = useEffectEvent(() => {
3536
+ const refreshClockMinute = useEventCallback(() => {
3508
3537
  refreshClock(minute);
3509
3538
  });
3510
3539
  useEffect(() => {
@@ -3768,7 +3797,7 @@ function RlsPickerColorComponent({ color, formControl, onListener, rlsTheme }) {
3768
3797
  y: (clientY - rect.top) / rect.height
3769
3798
  };
3770
3799
  }, []);
3771
- const updateColorOnCanvas = useEffectEvent((clientX, clientY) => {
3800
+ const updateColorOnCanvas = useEventCallback((clientX, clientY) => {
3772
3801
  if (!canvasRef.current)
3773
3802
  return;
3774
3803
  const pos = getPositionInElement(canvasRef.current, clientX, clientY);
@@ -3778,7 +3807,7 @@ function RlsPickerColorComponent({ color, formControl, onListener, rlsTheme }) {
3778
3807
  v: Math.round(Math.min(1, Math.max(0, 1 - pos.y)) * 100)
3779
3808
  }));
3780
3809
  });
3781
- const updateHueOnSlider = useEffectEvent((clientX, clientY) => {
3810
+ const updateHueOnSlider = useEventCallback((clientX, clientY) => {
3782
3811
  if (!hueRef.current)
3783
3812
  return;
3784
3813
  const pos = getPositionInElement(hueRef.current, clientX, clientY);
@@ -3787,7 +3816,7 @@ function RlsPickerColorComponent({ color, formControl, onListener, rlsTheme }) {
3787
3816
  h: Math.round(Math.min(1, Math.max(0, pos.x)) * 360)
3788
3817
  }));
3789
3818
  });
3790
- const updateAlphaOnSlider = useEffectEvent((clientX, clientY) => {
3819
+ const updateAlphaOnSlider = useEventCallback((clientX, clientY) => {
3791
3820
  if (!alphaRef.current)
3792
3821
  return;
3793
3822
  const pos = getPositionInElement(alphaRef.current, clientX, clientY);
@@ -3882,7 +3911,7 @@ function RlsPickerColorComponent({ color, formControl, onListener, rlsTheme }) {
3882
3911
  const onHexFocus = useCallback(() => {
3883
3912
  hexEditing.current = true;
3884
3913
  }, []);
3885
- const onHexBlur = useEffectEvent(() => {
3914
+ const onHexBlur = useEventCallback(() => {
3886
3915
  hexEditing.current = false;
3887
3916
  const normalized = normalizeHex(hexInput);
3888
3917
  if (normalized) {
@@ -4327,7 +4356,7 @@ function useRelocationOnComponent({ container: containerRef, element: elementRef
4327
4356
  }
4328
4357
  return clientY;
4329
4358
  }
4330
- const start = useEffectEvent((positionX, positionY) => {
4359
+ const start = useEventCallback((positionX, positionY) => {
4331
4360
  dragOffset.current = {
4332
4361
  x: positionX,
4333
4362
  y: positionY
@@ -4338,7 +4367,7 @@ function useRelocationOnComponent({ container: containerRef, element: elementRef
4338
4367
  };
4339
4368
  dragging.current = true;
4340
4369
  });
4341
- const relocation = useEffectEvent((positionX, positionY) => {
4370
+ const relocation = useEventCallback((positionX, positionY) => {
4342
4371
  const clientX = getClientX(positionX);
4343
4372
  const clientY = getClientY(positionY);
4344
4373
  elementRef.current.style.top = `${clientY}px`;
@@ -4391,7 +4420,7 @@ function useRelocationOnComponent({ container: containerRef, element: elementRef
4391
4420
 
4392
4421
  function useResize({ refElement, onResize }) {
4393
4422
  const dimension = useRef({ height: 0, width: 0 });
4394
- const observer = useEffectEvent((entries) => {
4423
+ const observer = useEventCallback((entries) => {
4395
4424
  const { height, width } = entries[0].contentRect;
4396
4425
  onResize?.({
4397
4426
  current: dimension.current,
@@ -5072,5 +5101,5 @@ function toggleAppTheme() {
5072
5101
  return theme;
5073
5102
  }
5074
5103
 
5075
- export { ConfirmationResult, DEFAULT_COLOR, RlsAccordion, RlsAlert, RlsAmount, RlsApplication, RlsAreaText, RlsAvatar, RlsBadge, RlsBallot, RlsBody, RlsBottomSheet, RlsBreadcrumb, RlsButton, RlsButtonAction, RlsButtonIcon, RlsButtonOption, RlsButtonProgress, RlsButtonStepper, RlsButtonToggle, RlsCard, RlsCheckBox, RlsCheckBoxControl, RlsChooserAutocomplete, RlsChooserAutocompleteTemplate, RlsChooserList, RlsChooserListTemplate, RlsChooserSelect, RlsChooserSelectTemplate, RlsConfirmation, RlsContent, RlsContext, RlsDatatable, RlsDatatableCell, RlsDatatableData, RlsDatatableFloating, RlsDatatableHeader, RlsDatatableRecord, RlsDatatableSubheader, RlsDatatableTitle, RlsDatatableTotals, RlsDropdown, RlsFieldArea, RlsFieldAutocomplete, RlsFieldAutocompleteTemplate, RlsFieldClock, RlsFieldColor, RlsFieldDate, RlsFieldDateRange, RlsFieldDecimal, RlsFieldFile, RlsFieldList, RlsFieldListSuggestions, RlsFieldListTemplate, RlsFieldMoney, RlsFieldNumber, RlsFieldPassword, RlsFieldPercentage, RlsFieldReadonly, RlsFieldSelect, RlsFieldSelectTemplate, RlsFieldText, RlsFormNavigation, RlsHoverSwap, RlsIcon, RlsImage, RlsImageChooser, RlsImageEditor, RlsInput, RlsInputCounter, RlsInputDecimal, RlsInputMoney, RlsInputNumber, RlsInputPassword, RlsInputPercentage, RlsInputSearch, RlsInputText, RlsLabel, RlsLabelCheckBox, RlsLabelRadioButton, RlsLabelSwitch, RlsLed, RlsMessageEmpty, RlsMessageFormError, RlsMessageIcon, RlsModal, RlsModalClock, RlsModalDate, RlsModalDateRange, RlsModalSheet, RlsNavbar, RlsNavbarMenu, RlsPagination, RlsPickerClock, RlsPickerColor, RlsPickerDate, RlsPickerDateRange, RlsPickerDay, RlsPickerDayRange, RlsPickerMonth, RlsPickerSelectorTitle, RlsPickerYear, RlsPoster, RlsProgressBar, RlsProgressCircular, RlsRadioButton, RlsSkeleton, RlsSkeletonText, RlsSlider, RlsSnackbar, RlsSpinner, RlsSwitch, RlsSwitchControl, RlsTabs, RlsTabularText, RlsToolbar, calculateImgDimension, generateThemePalette, getAppTheme, hexIsValid, hexToHsl, hexToHsv, hexToRgb, hslToHex, hsvToHex, hsvToRgb, normalizeHex, rangeFormatTemplate, renderClassStatus, rgbToHex, rgbToHsl, rgbToHsv, setAppTheme, setDesignSystem, setErrorsI18n, setThemeColor, toggleAppTheme, useConfirmation, useDatatable, useDesingSystemController, useDropdownController, useFieldAutocomplete, useFieldList, useFieldSelect, useFormSingleSelectionController, useFormToggleController, useImageEditorController, useListController, useNotifications, usePortalController, useRelocationOnComponent, useResize, useRlsContext, useSnackbar, useTabsController };
5104
+ export { ConfirmationResult, DEFAULT_COLOR, RlsAccordion, RlsAlert, RlsAmount, RlsApplication, RlsAreaText, RlsAvatar, RlsBadge, RlsBallot, RlsBody, RlsBottomSheet, RlsBreadcrumb, RlsButton, RlsButtonAction, RlsButtonIcon, RlsButtonOption, RlsButtonProgress, RlsButtonStepper, RlsButtonToggle, RlsCard, RlsCheckBox, RlsCheckBoxControl, RlsChooserAutocomplete, RlsChooserAutocompleteTemplate, RlsChooserList, RlsChooserListTemplate, RlsChooserSelect, RlsChooserSelectTemplate, RlsConfirmation, RlsContent, RlsContext, RlsDatatable, RlsDatatableCell, RlsDatatableData, RlsDatatableFloating, RlsDatatableHeader, RlsDatatableRecord, RlsDatatableSubheader, RlsDatatableTitle, RlsDatatableTotals, RlsDropdown, RlsFieldArea, RlsFieldAutocomplete, RlsFieldAutocompleteTemplate, RlsFieldClock, RlsFieldColor, RlsFieldDate, RlsFieldDateRange, RlsFieldDecimal, RlsFieldFile, RlsFieldList, RlsFieldListSuggestions, RlsFieldListTemplate, RlsFieldMoney, RlsFieldNumber, RlsFieldPassword, RlsFieldPercentage, RlsFieldReadonly, RlsFieldSelect, RlsFieldSelectTemplate, RlsFieldText, RlsFormNavigation, RlsHoverSwap, RlsIcon, RlsImage, RlsImageChooser, RlsImageEditor, RlsInput, RlsInputCounter, RlsInputDecimal, RlsInputMoney, RlsInputNumber, RlsInputPassword, RlsInputPercentage, RlsInputSearch, RlsInputText, RlsLabel, RlsLabelCheckBox, RlsLabelRadioButton, RlsLabelSwitch, RlsLed, RlsMessageEmpty, RlsMessageFormError, RlsMessageIcon, RlsModal, RlsModalClock, RlsModalDate, RlsModalDateRange, RlsModalSheet, RlsNavbar, RlsNavbarMenu, RlsPagination, RlsPickerClock, RlsPickerColor, RlsPickerDate, RlsPickerDateRange, RlsPickerDay, RlsPickerDayRange, RlsPickerMonth, RlsPickerSelectorTitle, RlsPickerYear, RlsPoster, RlsProgressBar, RlsProgressCircular, RlsRadioButton, RlsSkeleton, RlsSkeletonText, RlsSlider, RlsSnackbar, RlsSpinner, RlsSwitch, RlsSwitchControl, RlsTabs, RlsTabularText, RlsToolbar, calculateImgDimension, generateThemePalette, getAppTheme, getRemSize$1 as getRemSize, hexIsValid, hexToHsl, hexToHsv, hexToRgb, hslToHex, hsvToHex, hsvToRgb, normalizeHex, rangeFormatTemplate, renderClassStatus, rgbToHex, rgbToHsl, rgbToHsv, setAppTheme, setDesignSystem, setErrorsI18n, setThemeColor, toggleAppTheme, useConfirmation, useDatatable, useDesingSystemController, useDropdownController, useEventCallback, useFieldAutocomplete, useFieldList, useFieldSelect, useFormSingleSelectionController, useFormToggleController, useImageEditorController, useListController, useNotifications, usePortalController, useRelocationOnComponent, useResize, useRlsContext, useSnackbar, useTabsController };
5076
5105
  //# sourceMappingURL=index.mjs.map