|
628 | 628 | (let [^js target (.-target e)] |
629 | 629 | (when (some-> target (.closest ".as-toggle")) |
630 | 630 | (reset! collapsed? (not @collapsed?)))))} |
631 | | - (when-not (mobile-util/native-platform?) |
632 | | - (let [style {:width 14 :height 16}] |
633 | | - [:a.ls-foldable-title-control.block-control.opacity-50.hover:opacity-100 |
634 | | - (cond-> |
635 | | - {:style style} |
636 | | - (not title-trigger?) |
637 | | - (assoc :on-pointer-down on-pointer-down)) |
638 | | - [:span {:class (if (or @control? @collapsed?) "control-show cursor-pointer" "control-hide")} |
639 | | - (rotating-arrow @collapsed?)]])) |
| 631 | + (let [style {:width 14 :height 16}] |
| 632 | + [:a.ls-foldable-title-control.block-control.opacity-50.hover:opacity-100 |
| 633 | + (cond-> |
| 634 | + {:style style} |
| 635 | + (not title-trigger?) |
| 636 | + (assoc :on-pointer-down on-pointer-down)) |
| 637 | + [:span {:class (if (or @control? @collapsed? (util/mobile?)) |
| 638 | + "control-show cursor-pointer" |
| 639 | + "control-hide")} |
| 640 | + (rotating-arrow @collapsed?)]]) |
640 | 641 | (if (fn? header) |
641 | 642 | (header @collapsed?) |
642 | 643 | header)]]])) |
643 | 644 |
|
644 | 645 | (rum/defcs foldable < db-mixins/query rum/reactive |
645 | 646 | (rum/local false ::collapsed?) |
| 647 | + (rum/local true ::render-content?) |
| 648 | + (rum/local nil ::collapse-timeout) |
646 | 649 | {:will-mount (fn [state] |
647 | 650 | (let [args (:rum/args state)] |
648 | 651 | (when (true? (:default-collapsed? (last args))) |
649 | | - (reset! (get state ::collapsed?) true))) |
| 652 | + (reset! (get state ::collapsed?) true) |
| 653 | + (reset! (get state ::render-content?) false))) |
650 | 654 | state) |
| 655 | + :will-unmount (fn [state] |
| 656 | + (when-let [timeout-id @(get state ::collapse-timeout)] |
| 657 | + (js/clearTimeout timeout-id)) |
| 658 | + state) |
651 | 659 | :did-mount (fn [state] |
652 | 660 | (when-let [f (:init-collapsed (last (:rum/args state)))] |
653 | 661 | (f (::collapsed? state))) |
654 | 662 | state)} |
655 | 663 | [state header content {:keys [title-trigger? on-pointer-down class |
656 | 664 | _default-collapsed? _init-collapsed]}] |
657 | 665 | (let [collapsed? (get state ::collapsed?) |
| 666 | + render-content? (get state ::render-content?) |
| 667 | + collapse-timeout (get state ::collapse-timeout) |
| 668 | + transition-ms 200 |
658 | 669 | on-pointer-down (fn [e] |
659 | 670 | (util/stop e) |
660 | | - (swap! collapsed? not) |
661 | | - (when on-pointer-down |
662 | | - (on-pointer-down @collapsed?)))] |
| 671 | + (let [next-collapsed? (not @collapsed?)] |
| 672 | + (when-let [timeout-id @collapse-timeout] |
| 673 | + (js/clearTimeout timeout-id) |
| 674 | + (reset! collapse-timeout nil)) |
| 675 | + (when (false? next-collapsed?) |
| 676 | + (reset! render-content? true)) |
| 677 | + (reset! collapsed? next-collapsed?) |
| 678 | + (when (true? next-collapsed?) |
| 679 | + (reset! collapse-timeout |
| 680 | + (js/setTimeout |
| 681 | + (fn [] |
| 682 | + (reset! render-content? false) |
| 683 | + (reset! collapse-timeout nil)) |
| 684 | + transition-ms))) |
| 685 | + (when on-pointer-down |
| 686 | + (on-pointer-down next-collapsed?))))] |
663 | 687 | [:div.flex.flex-col |
664 | 688 | {:class class} |
665 | 689 | (foldable-title {:on-pointer-down on-pointer-down |
|
668 | 692 | :collapsed? collapsed?}) |
669 | 693 | ;; Don't stop propagation for the pointer down event to the high level content container. |
670 | 694 | ;; That may cause the drag function to not work. |
671 | | - [:div {:class (if @collapsed? "hidden" "initial")} |
672 | | - (if (fn? content) |
673 | | - (if (not @collapsed?) (content) nil) |
674 | | - content)]])) |
| 695 | + [:div.ls-foldable-content |
| 696 | + {:class (when @collapsed? "is-collapsed") |
| 697 | + :aria-hidden (boolean @collapsed?)} |
| 698 | + [:div.ls-foldable-content-inner |
| 699 | + (if (fn? content) |
| 700 | + (when @render-content? (content)) |
| 701 | + content)]]])) |
675 | 702 |
|
676 | 703 | (rum/defc admonition |
677 | 704 | [type content] |
|
0 commit comments