x-ui-design 0.7.39 → 0.7.43

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
@@ -2603,7 +2603,7 @@ var RangePicker$1 = /*#__PURE__*/Object.freeze({
2603
2603
  default: RangePicker
2604
2604
  });
2605
2605
 
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}";
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}";
2607
2607
  styleInject(css_248z$d);
2608
2608
 
2609
2609
  const ConditionalWrapper = ({
@@ -2646,6 +2646,7 @@ const TimePicker = ({
2646
2646
  const hourRef = useRef(null);
2647
2647
  const minuteRef = useRef(null);
2648
2648
  const secondRef = useRef(null);
2649
+ const [dropdownPosition, setDropdownPosition] = useState({});
2649
2650
  useEffect(() => {
2650
2651
  setInnerValue(propValue || defaultValue ? new Date(propValue || defaultValue) : null);
2651
2652
  }, [propValue]);
@@ -2827,6 +2828,83 @@ const TimePicker = ({
2827
2828
  }
2828
2829
  }
2829
2830
  };
2831
+ const dropdownPossition = useCallback(() => {
2832
+ if (!inputRef.current) {
2833
+ return {};
2834
+ }
2835
+ const dropdownHeight = 230;
2836
+ const inputPoss = inputRef.current?.getBoundingClientRect();
2837
+ const windowHeight = window.innerHeight;
2838
+ const spaceBelow = windowHeight - (inputPoss.bottom || 0);
2839
+ const spaceAbove = inputPoss.top;
2840
+ const shouldShowAbove = spaceBelow < dropdownHeight;
2841
+ const shouldShowBelow = spaceAbove < dropdownHeight;
2842
+ if (open) {
2843
+ if (getPopupContainer) {
2844
+ if (!shouldShowBelow && !shouldShowAbove) {
2845
+ if (!Object.keys(dropdownPosition).length) {
2846
+ setDropdownPosition({
2847
+ position: 'absolute',
2848
+ top: (inputPoss.top || 0) + document.documentElement.scrollTop + (inputRef.current?.offsetHeight || 0),
2849
+ left: (inputPoss.left || 0) + document.documentElement.scrollLeft,
2850
+ height: 'max-content'
2851
+ });
2852
+ }
2853
+ return;
2854
+ }
2855
+ if (!shouldShowBelow) {
2856
+ setDropdownPosition({
2857
+ position: 'absolute',
2858
+ top: (inputPoss.top || 0) + document.documentElement.scrollTop - dropdownHeight,
2859
+ left: (inputPoss.left || 0) + document.documentElement.scrollLeft,
2860
+ height: 'max-content'
2861
+ });
2862
+ }
2863
+ if (!shouldShowAbove) {
2864
+ setDropdownPosition({
2865
+ position: 'absolute',
2866
+ top: (inputPoss.top || 0) + document.documentElement.scrollTop + (inputRef.current?.offsetHeight || 0),
2867
+ left: (inputPoss.left || 0) + document.documentElement.scrollLeft,
2868
+ height: 'max-content'
2869
+ });
2870
+ }
2871
+ }
2872
+ }
2873
+ }, [open, inputRef.current]);
2874
+ const getScrollParents = useCallback(element => {
2875
+ const parents = [];
2876
+ let current = element.parentElement;
2877
+ while (current) {
2878
+ if (current.scrollHeight > current.clientHeight) {
2879
+ parents.push(current);
2880
+ }
2881
+ current = current.parentElement;
2882
+ }
2883
+ return parents;
2884
+ }, []);
2885
+ useEffect(() => {
2886
+ if (!open) return;
2887
+ const _dropdownPossition = () => dropdownPossition();
2888
+ _dropdownPossition();
2889
+ const controller = new AbortController();
2890
+ const scrollableParents = getScrollParents(inputRef.current);
2891
+ scrollableParents.forEach(el => {
2892
+ el.addEventListener('scroll', _dropdownPossition, {
2893
+ passive: true,
2894
+ signal: controller.signal
2895
+ });
2896
+ });
2897
+ window.addEventListener('scroll', _dropdownPossition, {
2898
+ passive: true,
2899
+ signal: controller.signal
2900
+ });
2901
+ window.addEventListener('resize', _dropdownPossition, {
2902
+ signal: controller.signal
2903
+ });
2904
+ return () => {
2905
+ controller.abort();
2906
+ };
2907
+ }, [open, getPopupContainer, dropdownPossition]);
2830
2908
  const renderOptions = () => {
2831
2909
  const hours = Array.from({
2832
2910
  length: HOURS + ADD_EMPTY_SECTION_COUNT
@@ -2950,12 +3028,8 @@ const TimePicker = ({
2950
3028
  }, /*#__PURE__*/React.createElement("div", {
2951
3029
  ref: popupRef,
2952
3030
  style: {
2953
- ...(getPopupContainer ? {
2954
- position: 'absolute',
2955
- top: (inputRef.current?.getBoundingClientRect().top || 0) + (inputRef.current?.offsetHeight || 0),
2956
- left: inputRef.current?.getBoundingClientRect().left,
2957
- height: 'max-content'
2958
- } : {})
3031
+ ...dropdownPosition,
3032
+ opacity: Object.keys(dropdownPosition).length ? 1 : 0
2959
3033
  },
2960
3034
  className: clsx([`${prefixCls}-popup`, {
2961
3035
  [`${prefixCls}-popup-up`]: openUpward