x-ui-design 0.7.36 → 0.7.38

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.
package/dist/index.esm.js CHANGED
@@ -2606,6 +2606,12 @@ var RangePicker$1 = /*#__PURE__*/Object.freeze({
2606
2606
  var css_248z$d = ".xUi-timepicker-wrapper{display:inline-block;font-size:14px;position:relative}.xUi-timepicker-input-wrapper{position:relative;width:100%}.xUi-timepicker-input{border:1px solid var(--xui-border-color);border-radius:6px;box-sizing:border-box;font-size:14px;height:32px;line-height:32px;padding:4px 11px;transition:all .3s;width:100%}.xUi-timepicker-input:focus,.xUi-timepicker-input:hover{border-color:var(--xui-primary-color-light)}.xUi-timepicker-input:focus{outline:none}.xUi-timepicker-input::placeholder{opacity:.6}.xUi-timepicker-clear{color:rgba(0,0,0,.45);cursor:pointer;font-size:12px;position:absolute;right:8px;top:50%;transform:translateY(-50%);z-index:2}.xUi-timepicker-clear:hover{color:rgba(0,0,0,.75)}.xUi-timepicker-popup{background:#fff;border:1px solid var(--xui-border-color);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.15);display:flex;left:0;padding:8px 0;z-index:1}.xUi-timepicker-panel{display:flex;width:100%}.xUi-timepicker-column{align-items:center;display:flex;flex:1;flex-direction:column;margin-bottom:5px;max-height:169px;overflow-y:auto;padding-left:4px;width:52px}.xUi-timepicker-column::-webkit-scrollbar,.xUi-timepicker-column::-webkit-scrollbar-thumb{width:4px}.xUi-timepicker-column:nth-child(2){border-left:1px solid var(--xui-border-color);border-right:1px solid var(--xui-border-color)}.xUi-timepicker-cell{align-items:center;border-radius:4px;cursor:pointer;display:flex;font-size:14px;justify-content:center;margin-bottom:2px;padding:6px 0;text-align:center;transition:background .3s;width:44px}.xUi-timepicker-cell:hover{background-color:#e6f4ff}.xUi-timepicker-cell-selected{background-color:#e6f4ff;font-weight:500}.xUi-timepicker-cell-disabled{color:rgba(0,0,0,.25);pointer-events:none;user-select:none}.xUi-timepicker-now-btn{color:#4096ff;cursor:pointer;font-weight:500;margin-top:10px;padding:0 0 4px;text-align:center;transition:background .3s}.xUi-timepicker-icons{align-items:center;display:flex;gap:4px;position:absolute;right:8px;top:50%;transform:translateY(-50%)}.xUi-timepicker-suffix{align-items:center;cursor:pointer;display:flex;justify-content:center}.xUi-timepicker-suffix svg{color:#999;height:14px;width:14px}.xUi-timepicker-clear{right:0;top:1px}.xUi-timepicker-actions{align-items:center;border-top:1px solid var(--xui-border-color);display:flex;justify-content:space-between;padding:0 4px}.xUi-timepicker-ok-btn{background-color:var(--xui-primary-color);border:none;border-radius:4px;color:#fff;cursor:pointer;margin-top:7px;outline:none;padding:4px 8px;transition:.3s ease}.xUi-timepicker-ok-btn:disabled{background-color:var(--xui-color-disabled);color:grey;font-size:13px}.xUi-timepicker-ok-btn:not(:disabled):hover{background-color:var(--xui-primary-color-light)}.xUi-timepicker-popup{margin-top:4px;position:absolute;top:100%}.xUi-timepicker-popup-up{bottom:100%;margin-bottom:4px;top:auto!important}";
2607
2607
  styleInject(css_248z$d);
2608
2608
 
2609
+ const ConditionalWrapper = ({
2610
+ condition,
2611
+ wrapper,
2612
+ children
2613
+ }) => condition ? wrapper(children) : children;
2614
+
2609
2615
  const HOURS = 24;
2610
2616
  const INPUT_SIZE = 13;
2611
2617
  const TIME_OPTION_PADDING = 4;
@@ -2627,7 +2633,8 @@ const TimePicker = ({
2627
2633
  showNow = true,
2628
2634
  clearIcon = /*#__PURE__*/React.createElement(ClearIcon, null),
2629
2635
  suffixIcon = /*#__PURE__*/React.createElement(TimeIcon, null),
2630
- placeholder = 'Select time'
2636
+ placeholder = 'Select time',
2637
+ getPopupContainer
2631
2638
  }) => {
2632
2639
  const [open, setOpen] = useState(false);
2633
2640
  const [innerValue, setInnerValue] = useState(propValue || defaultValue ? new Date(propValue || defaultValue) : null);
@@ -2644,6 +2651,7 @@ const TimePicker = ({
2644
2651
  if (popupRef.current && !popupRef.current.contains(e.target) && inputRef.current && !inputRef.current.contains(e.target)) {
2645
2652
  setOpen(false);
2646
2653
  setTempValue(null);
2654
+ setOpenUpward(false);
2647
2655
  if (!innerValue) {
2648
2656
  onChange?.(null, '');
2649
2657
  }
@@ -2667,20 +2675,20 @@ const TimePicker = ({
2667
2675
  scrollToTop(secondRef, second || 0);
2668
2676
  }
2669
2677
  }, [open, innerValue]);
2670
- useEffect(() => {
2671
- if (open && inputRef.current && popupRef.current) {
2678
+ const decideOpenDirection = () => {
2679
+ if (inputRef.current) {
2672
2680
  const inputRect = inputRef.current.getBoundingClientRect();
2673
- const popupRect = popupRef.current.getBoundingClientRect();
2674
2681
  const viewportHeight = window.innerHeight;
2682
+ const popupHeight = 240;
2675
2683
  const spaceBelow = viewportHeight - inputRect.bottom;
2676
2684
  const spaceAbove = inputRect.top;
2677
- if (spaceBelow < popupRect.height && spaceAbove > popupRect.height) {
2685
+ if (spaceBelow < popupHeight && spaceAbove > popupHeight) {
2678
2686
  setOpenUpward(true);
2679
2687
  } else {
2680
2688
  setOpenUpward(false);
2681
2689
  }
2682
2690
  }
2683
- }, [open]);
2691
+ };
2684
2692
  useEffect(() => {
2685
2693
  onSelect?.(tempValue);
2686
2694
  }, [tempValue, onSelect]);
@@ -2902,7 +2910,10 @@ const TimePicker = ({
2902
2910
  style: style
2903
2911
  }, /*#__PURE__*/React.createElement("div", {
2904
2912
  className: `${prefixCls}-input-wrapper`,
2905
- onClick: () => setOpen(true)
2913
+ onClick: () => {
2914
+ decideOpenDirection();
2915
+ setOpen(true);
2916
+ }
2906
2917
  }, /*#__PURE__*/React.createElement("input", {
2907
2918
  ref: inputRef,
2908
2919
  size: INPUT_SIZE,
@@ -2927,14 +2938,26 @@ const TimePicker = ({
2927
2938
  className: `${prefixCls}-suffix`,
2928
2939
  onClick: e => {
2929
2940
  e.stopPropagation();
2941
+ decideOpenDirection();
2930
2942
  setOpen(true);
2931
2943
  }
2932
- }, suffixIcon))), open && /*#__PURE__*/React.createElement("div", {
2944
+ }, suffixIcon))), open && /*#__PURE__*/React.createElement(ConditionalWrapper, {
2945
+ condition: getPopupContainer !== undefined,
2946
+ wrapper: element => getPopupContainer ? /*#__PURE__*/createPortal(element, getPopupContainer(popupRef.current)) : /*#__PURE__*/React.createElement(React.Fragment, null, element)
2947
+ }, /*#__PURE__*/React.createElement("div", {
2933
2948
  ref: popupRef,
2949
+ style: {
2950
+ ...(getPopupContainer ? {
2951
+ position: 'absolute',
2952
+ top: (inputRef.current?.getBoundingClientRect().top || 0) + (inputRef.current?.offsetHeight || 0),
2953
+ left: inputRef.current?.getBoundingClientRect().left,
2954
+ height: 'max-content'
2955
+ } : {})
2956
+ },
2934
2957
  className: clsx([`${prefixCls}-popup`, {
2935
2958
  [`${prefixCls}-popup-up`]: openUpward
2936
2959
  }])
2937
- }, renderOptions()));
2960
+ }, renderOptions())));
2938
2961
  };
2939
2962
 
2940
2963
  var TimePicker$1 = /*#__PURE__*/Object.freeze({
@@ -3469,12 +3492,6 @@ var Tag$1 = /*#__PURE__*/Object.freeze({
3469
3492
  default: Tag
3470
3493
  });
3471
3494
 
3472
- const ConditionalWrapper = ({
3473
- condition,
3474
- wrapper,
3475
- children
3476
- }) => condition ? wrapper(children) : children;
3477
-
3478
3495
  var css_248z$5 = "@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.xUi-select{background-color:transparent;border:1px solid var(--xui-border-color);border-radius:var(--xui-border-radius-sm);box-sizing:border-box;color:var(--xui-text-color);display:inline-flex;flex-direction:row-reverse;min-height:24px;padding:2px 8px;position:relative;width:100%}.xUi-select-disabled{background:rgba(0,0,0,.04)}.xUi-select-arrow{align-items:center;color:var(--xui-text-color-light);display:flex;gap:6px;margin:0 4px;pointer-events:all!important}.xUi-select-arrow svg{align-items:center;display:flex;justify-content:center}.xUi-select-loading{animation:spin 1s linear infinite;color:var(--xui-text-color-light);display:inline-block;margin:0 8px}.xUi-select .xUi-select-trigger{align-items:center;background:transparent;border-radius:var(--xui-border-radius-sm);cursor:pointer;display:flex;justify-content:space-between;width:100%}.xUi-select .xUi-select-clear-btn{background:none;border:none;color:#999;cursor:pointer;font-size:var(--xui-font-size-lg);line-height:1;margin:0 8px;padding:0}.xUi-select .xUi-select-clear-btn:hover{color:var(--xui-primary-color)}.xUi-select-dropdown{background-color:var(--xui-select-background-color);border-radius:var(--xui-border-radius-sm);box-shadow:0 4px 12px rgba(0,0,0,.15);left:0;margin-top:5px;max-height:350px;overflow-y:auto;position:absolute;right:unset;top:100%;width:inherit;z-index:10}.xUi-select-dropdown.bottomRight,.xUi-select-dropdown.topRight{left:unset;right:0}.xUi-select .xUi-select-loading-spinner{color:#999;padding:10px;text-align:center}.xUi-select:focus-within{border-color:var(--xui-primary-color-light);box-shadow:none}.xUi-select:hover:not(.xUi-select-disabled){border-color:var(--xui-primary-color)}.xUi-select-disabled,.xUi-select-disabled .xUi-select-input,.xUi-select-disabled .xUi-select-trigger{cursor:not-allowed!important;opacity:.6!important}.xUi-select-selected-icon{color:var(--xui-primary-color-light)}.xUi-select-error{border-color:var(--xui-error-color)}.xUi-select-arrow .error-svg-icon,.xUi-select-error .error-svg-icon{color:var(--xui-error-color)}.xUi-select .xUi-select-input{align-items:center;background:transparent;border:none;color:var(--xui-text-color);cursor:pointer;display:inline-flex;font-size:var(--xui-font-size-md);height:auto;height:-webkit-fit-content;outline:none;padding:0;user-select:none;width:100%}.xUi-select .xUi-select-input:focus{border:none;box-shadow:none;outline:none}.xUi-select.middle{border-radius:var(--xui-border-radius-md);min-height:30px}.xUi-select.middle,.xUi-select.middle input{font-size:var(--xui-font-size-md)}.xUi-select.middle .xUi-select-trigger{border-radius:var(--xui-border-radius-md)}.xUi-select.large{font-size:var(--xui-font-size-lg);min-height:44px}.xUi-select.large,.xUi-select.large .xUi-select-trigger{border-radius:var(--xui-border-radius-lg)}.xUi-select input{font-size:var(--xui-font-size-lg)}";
3479
3496
  styleInject(css_248z$5);
3480
3497