@rolster/react-components 19.8.15 → 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 (32) hide show
  1. package/dist/cjs/index.cjs +66 -29
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/es/index.mjs +65 -31
  4. package/dist/es/index.mjs.map +1 -1
  5. package/dist/esm/components/atoms/SwapHover/SwapHover.d.ts +8 -0
  6. package/dist/esm/components/atoms/SwapHover/SwapHover.js +7 -0
  7. package/dist/esm/components/atoms/SwapHover/SwapHover.js.map +1 -0
  8. package/dist/esm/components/molecules/FieldListSuggestions/FieldListSuggestions.js +1 -1
  9. package/dist/esm/components/molecules/FieldListSuggestions/FieldListSuggestions.js.map +1 -1
  10. package/dist/esm/components/molecules/FieldListSuggestions/SuggestionsPortalController.d.ts +1 -1
  11. package/dist/esm/components/molecules/FieldListSuggestions/SuggestionsPortalController.js +28 -8
  12. package/dist/esm/components/molecules/FieldListSuggestions/SuggestionsPortalController.js.map +1 -1
  13. package/dist/esm/components/organisms/PickerClock/PickerClock.js +4 -3
  14. package/dist/esm/components/organisms/PickerClock/PickerClock.js.map +1 -1
  15. package/dist/esm/components/organisms/PickerColor/PickerColor.js +6 -5
  16. package/dist/esm/components/organisms/PickerColor/PickerColor.js.map +1 -1
  17. package/dist/esm/controllers/EventCallbackController.d.ts +1 -0
  18. package/dist/esm/controllers/EventCallbackController.js +9 -0
  19. package/dist/esm/controllers/EventCallbackController.js.map +1 -0
  20. package/dist/esm/controllers/ListController.js +10 -13
  21. package/dist/esm/controllers/ListController.js.map +1 -1
  22. package/dist/esm/controllers/RelocationOnComponentController.js +4 -3
  23. package/dist/esm/controllers/RelocationOnComponentController.js.map +1 -1
  24. package/dist/esm/controllers/ResizeController.js +3 -2
  25. package/dist/esm/controllers/ResizeController.js.map +1 -1
  26. package/dist/esm/helpers/css.d.ts +1 -0
  27. package/dist/esm/helpers/css.js +8 -0
  28. package/dist/esm/helpers/css.js.map +1 -1
  29. package/dist/esm/index.d.ts +2 -0
  30. package/dist/esm/index.js +2 -0
  31. package/dist/esm/index.js.map +1 -1
  32. package/package.json +4 -4
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]) => {
@@ -1255,6 +1263,11 @@ function RlsSkeletonTextComponent({ active, children, rlsTheme }) {
1255
1263
  }
1256
1264
  const RlsSkeletonText = memo(RlsSkeletonTextComponent);
1257
1265
 
1266
+ function RlsSwapHoverComponent({ children, content, identifier, rlsTheme }) {
1267
+ return (jsxRuntimeExports.jsxs("div", { id: identifier, className: "rls-swap-hover", "rls-theme": rlsTheme, children: [jsxRuntimeExports.jsx("div", { className: "rls-swap-hover__primary", children: children }), jsxRuntimeExports.jsx("div", { className: "rls-swap-hover__secondary", children: content })] }));
1268
+ }
1269
+ const RlsHoverSwap = memo(RlsSwapHoverComponent);
1270
+
1258
1271
  function RlsSwitchComponent({ checked, capsule, disabled, identifier, onClick, rlsTheme }) {
1259
1272
  const className = renderClassStatus('rls-switch', {
1260
1273
  checked,
@@ -1631,6 +1644,19 @@ const reactI18n = i18n({
1631
1644
  }
1632
1645
  });
1633
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;
1634
1660
  function getScrollableAncestors(element) {
1635
1661
  const ancestors = [];
1636
1662
  let parent = element.parentElement;
@@ -1663,14 +1689,22 @@ function anchorIsVisible(rect, scrollables) {
1663
1689
  rect.right > left &&
1664
1690
  rect.left < right);
1665
1691
  }
1666
- 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) {
1667
1701
  const [mounted, setMounted] = useState(false);
1668
1702
  const [style, setStyle] = useState();
1669
1703
  const [theme, setTheme] = useState();
1670
1704
  useEffect(() => {
1671
1705
  setMounted(true);
1672
1706
  }, []);
1673
- const onAnchorHidden = useEffectEvent(() => {
1707
+ const onAnchorHidden = useEventCallback(() => {
1674
1708
  onHiddenAnchor?.();
1675
1709
  });
1676
1710
  useEffect(() => {
@@ -1688,15 +1722,20 @@ function useSuggestionsPortalController(visible, refAnchor, onHiddenAnchor) {
1688
1722
  }
1689
1723
  const rect = anchor.getBoundingClientRect();
1690
1724
  if (!anchorIsVisible(rect, scrollables)) {
1691
- onAnchorHidden();
1692
- return;
1725
+ return onAnchorHidden();
1693
1726
  }
1694
- setStyle({
1727
+ const style = {
1695
1728
  '--pvt-portal-top': `${rect.bottom}px`,
1696
1729
  '--pvt-portal-bottom': `${window.innerHeight - rect.top}px`,
1697
1730
  '--pvt-portal-left': `${rect.left}px`,
1698
1731
  '--pvt-portal-width': `${rect.width}px`
1699
- });
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);
1700
1739
  }
1701
1740
  function requestReposition() {
1702
1741
  cancelAnimationFrame(frame);
@@ -1710,7 +1749,7 @@ function useSuggestionsPortalController(visible, refAnchor, onHiddenAnchor) {
1710
1749
  window.removeEventListener('scroll', requestReposition, true);
1711
1750
  window.removeEventListener('resize', requestReposition);
1712
1751
  };
1713
- }, [mounted, visible, refAnchor]);
1752
+ }, [mounted, visible, refAnchor, higher]);
1714
1753
  return { active: mounted && !!refAnchor, style, theme };
1715
1754
  }
1716
1755
 
@@ -1724,7 +1763,7 @@ function RlsFieldListLi({ element, onClickElement, onKeydownElement, render }) {
1724
1763
  return (jsxRuntimeExports.jsx("li", { className: "rls-field-list__element", tabIndex: -1, onClick: onClick, onKeyDown: onKeyDown, children: render(element) }));
1725
1764
  }
1726
1765
  function RlsFieldListSuggestionsComponent({ elements, action, disabled, higher, render, renderEmpty, searchControl, visible, onClickBackdrop, onClickElement, onHiddenAnchor, onKeydownElement, refAnchor, refList, refSuggestions, rlsTheme }) {
1727
- const portal = useSuggestionsPortalController(visible, refAnchor, onHiddenAnchor);
1766
+ const portal = useSuggestionsPortalController(visible, refAnchor, onHiddenAnchor, higher);
1728
1767
  const [labels, setLabels] = useState({
1729
1768
  listEmptyDescription: reactI18n('listEmptyDescription'),
1730
1769
  listEmptyTitle: reactI18n('listEmptyTitle')
@@ -2457,14 +2496,7 @@ function RlsCardComponent({ children, className, outline, rlsTheme }) {
2457
2496
  const RlsCard = memo(RlsCardComponent);
2458
2497
 
2459
2498
  const MAX_LIST_HEIGHT_REM$1 = 90;
2460
- const FALLBACK_REM_SIZE$1 = 16;
2461
- function getRemSize$1() {
2462
- if (typeof window === 'undefined') {
2463
- return FALLBACK_REM_SIZE$1;
2464
- }
2465
- const fontSize = parseFloat(getComputedStyle(document.documentElement).fontSize);
2466
- return fontSize > 0 ? fontSize : FALLBACK_REM_SIZE$1;
2467
- }
2499
+ const VIEWPORT_GAP_REM = 8;
2468
2500
  function suggestionsShallowEqual(a, b) {
2469
2501
  return (a === b ||
2470
2502
  (a.length === b.length && a.every((element, index) => element === b[index])));
@@ -2480,10 +2512,12 @@ function shouldDisplayHigher$1(content, list) {
2480
2512
  if (!content) {
2481
2513
  return false;
2482
2514
  }
2515
+ const remSize = getRemSize$1();
2516
+ const gap = VIEWPORT_GAP_REM * remSize;
2483
2517
  const { top, bottom } = content.getBoundingClientRect();
2484
- const spaceAbove = top;
2485
- const spaceBelow = window.innerHeight - bottom;
2486
- 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;
2487
2521
  const desiredHeight = Math.min(list?.scrollHeight || maxHeight, maxHeight);
2488
2522
  if (spaceBelow >= desiredHeight) {
2489
2523
  return false;
@@ -2552,7 +2586,7 @@ function useListController({ suggestions, automatic, formControl, reference }) {
2552
2586
  formControl?.setValue(element?.value);
2553
2587
  }
2554
2588
  }, [formControl]);
2555
- const reconcileFormValue = useEffectEvent(() => {
2589
+ const reconcileFormValue = useEventCallback(() => {
2556
2590
  if (!changeValueInternal.current) {
2557
2591
  if (formControl?.value) {
2558
2592
  const element = collection.find(formControl.value);
@@ -3496,10 +3530,10 @@ function RlsPickerClockComponent({ formControl, onListener, rlsTheme, time }) {
3496
3530
  const classNamePM = renderClassStatus('rls-picker-clock__zone__value', {
3497
3531
  active: zoneIsPM
3498
3532
  });
3499
- const refreshClockHour = useEffectEvent(() => {
3533
+ const refreshClockHour = useEventCallback(() => {
3500
3534
  refreshClock(hour > 12 ? hour - 12 : hour);
3501
3535
  });
3502
- const refreshClockMinute = useEffectEvent(() => {
3536
+ const refreshClockMinute = useEventCallback(() => {
3503
3537
  refreshClock(minute);
3504
3538
  });
3505
3539
  useEffect(() => {
@@ -3763,7 +3797,7 @@ function RlsPickerColorComponent({ color, formControl, onListener, rlsTheme }) {
3763
3797
  y: (clientY - rect.top) / rect.height
3764
3798
  };
3765
3799
  }, []);
3766
- const updateColorOnCanvas = useEffectEvent((clientX, clientY) => {
3800
+ const updateColorOnCanvas = useEventCallback((clientX, clientY) => {
3767
3801
  if (!canvasRef.current)
3768
3802
  return;
3769
3803
  const pos = getPositionInElement(canvasRef.current, clientX, clientY);
@@ -3773,7 +3807,7 @@ function RlsPickerColorComponent({ color, formControl, onListener, rlsTheme }) {
3773
3807
  v: Math.round(Math.min(1, Math.max(0, 1 - pos.y)) * 100)
3774
3808
  }));
3775
3809
  });
3776
- const updateHueOnSlider = useEffectEvent((clientX, clientY) => {
3810
+ const updateHueOnSlider = useEventCallback((clientX, clientY) => {
3777
3811
  if (!hueRef.current)
3778
3812
  return;
3779
3813
  const pos = getPositionInElement(hueRef.current, clientX, clientY);
@@ -3782,7 +3816,7 @@ function RlsPickerColorComponent({ color, formControl, onListener, rlsTheme }) {
3782
3816
  h: Math.round(Math.min(1, Math.max(0, pos.x)) * 360)
3783
3817
  }));
3784
3818
  });
3785
- const updateAlphaOnSlider = useEffectEvent((clientX, clientY) => {
3819
+ const updateAlphaOnSlider = useEventCallback((clientX, clientY) => {
3786
3820
  if (!alphaRef.current)
3787
3821
  return;
3788
3822
  const pos = getPositionInElement(alphaRef.current, clientX, clientY);
@@ -3877,7 +3911,7 @@ function RlsPickerColorComponent({ color, formControl, onListener, rlsTheme }) {
3877
3911
  const onHexFocus = useCallback(() => {
3878
3912
  hexEditing.current = true;
3879
3913
  }, []);
3880
- const onHexBlur = useEffectEvent(() => {
3914
+ const onHexBlur = useEventCallback(() => {
3881
3915
  hexEditing.current = false;
3882
3916
  const normalized = normalizeHex(hexInput);
3883
3917
  if (normalized) {
@@ -4322,7 +4356,7 @@ function useRelocationOnComponent({ container: containerRef, element: elementRef
4322
4356
  }
4323
4357
  return clientY;
4324
4358
  }
4325
- const start = useEffectEvent((positionX, positionY) => {
4359
+ const start = useEventCallback((positionX, positionY) => {
4326
4360
  dragOffset.current = {
4327
4361
  x: positionX,
4328
4362
  y: positionY
@@ -4333,7 +4367,7 @@ function useRelocationOnComponent({ container: containerRef, element: elementRef
4333
4367
  };
4334
4368
  dragging.current = true;
4335
4369
  });
4336
- const relocation = useEffectEvent((positionX, positionY) => {
4370
+ const relocation = useEventCallback((positionX, positionY) => {
4337
4371
  const clientX = getClientX(positionX);
4338
4372
  const clientY = getClientY(positionY);
4339
4373
  elementRef.current.style.top = `${clientY}px`;
@@ -4386,7 +4420,7 @@ function useRelocationOnComponent({ container: containerRef, element: elementRef
4386
4420
 
4387
4421
  function useResize({ refElement, onResize }) {
4388
4422
  const dimension = useRef({ height: 0, width: 0 });
4389
- const observer = useEffectEvent((entries) => {
4423
+ const observer = useEventCallback((entries) => {
4390
4424
  const { height, width } = entries[0].contentRect;
4391
4425
  onResize?.({
4392
4426
  current: dimension.current,
@@ -5067,5 +5101,5 @@ function toggleAppTheme() {
5067
5101
  return theme;
5068
5102
  }
5069
5103
 
5070
- 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, 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 };
5071
5105
  //# sourceMappingURL=index.mjs.map