• Как сделать раскрывающийся список с неопределённой высотой дочернего элемента с анимацией?

    @onevetka Автор вопроса
    Нашёл решение, через создание специального компонента, который принимает чайлд

    index.tsx
    // Base
    import React from 'react';
    import { CSSTransition } from 'react-transition-group';
    import useExpandableWrapper from './useExpandableWrapper';
    
    // Assets
    import styles from './style.module.scss';
    import animation from './animation.module.scss';
    
    interface ExpandableWrapperProps {
      isExpanded: boolean;
    }
    
    const ExpandableWrapper: React.FC<ExpandableWrapperProps> = ({
      children,
      isExpanded,
    }) => {
      const { onEnter, onEntered, onExit, onExiting, state } = useExpandableWrapper();
      const { childHeight } = state;
    
      return (
        <div style={{ height: childHeight }} className={styles.wrapper}>
          <CSSTransition
            in={isExpanded}
            timeout={600}
            classNames={animation}
            onEnter={onEnter}
            onEntered={onEntered}
            onExit={onExit}
            onExiting={onExiting}
            unmountOnExit
          >
            {children}
          </CSSTransition>
        </div>
      );
    };
    
    export default ExpandableWrapper;


    style.module.scss
    .wrapper {
      overflow: hidden;
      transition: height 300ms ease;
      height: auto;
    }


    useExpandableWrapper.ts (Хук вьюхи)
    import { useState } from 'react';
    
    const useExpandableWrapper = () => {
      const [childHeight, setChildHeight] = useState<string | number>(0);
    
      const onEnter = (element: HTMLElement) => {
        const height = element.offsetHeight;
        setChildHeight(height);
      };
    
      const onEntered = () => {
        setChildHeight('auto');
      };
    
      const onExit = (element: any) => {
        const height = element.offsetHeight;
        setChildHeight(height);
      };
    
      const onExiting = () => {
        const height = 0;
        setChildHeight(height);
      };
    
      const state = {
        childHeight,
      };
    
      return {
        onEnter,
        onEntered,
        onExit,
        onExiting,
        state,
      };
    };
    
    export default useExpandableWrapper;


    animation.style.scss (Файл с анимацией)
    .enter {
      opacity: 0;
      transition: all 600ms cubic-bezier(0.15, 0.84, 0.21, 0.96);
    }
    
    .enterActive {
      opacity: 1;
    }
    
    .exit {
      opacity: 1;
      transition: all 300ms cubic-bezier(0.15, 0.84, 0.21, 0.96);
    }
    
    .exitActive {
      opacity: 0;
    }
    Ответ написан
    Комментировать
  • Почему не работают overflow-x и overflow-y?

    @onevetka
    Я могу ошибаться. Но похоже эта проблема решается только переформулированием задачи. Когда вы ставите overflow-x или y hidden, другой параметр переходит в режим auto.
    Ответ написан
    Комментировать
  • Как с помощю Pyinstaller собрать рабочий exe файл, если я использую сторонние библиотеки?

    @onevetka
    Сначала добавьте в конце строки "main.py". И у вас, скорее всего, не добавлены некоторые фалы, требуемые скриптом. Потом у вас создастся дефолтный spec-файл. У него в разделе Analysis добавьте после main.py другие скрипты, а в datas в скобочках ('Имя_файла', 'папка_где_этот_файл'). Например у меня это было datas=[('data/Settings.txt', 'data'), ('data/CossacksPlayers.json', 'data'), ('images/LogoLOP.png', 'images'), ('LOfP.ico', '.')]
    Ответ написан
    Комментировать
  • На чем написан десктоп-клиент telegram?

    @onevetka
    Совершенно точно, что для desktop-версии они используют Qt.
    #include <QtCore/QTimer>
    #include <QtGui/QColor>
    Ответ написан
    Комментировать