From 1466ad8cc5a85567fce4e1cbc99add4134c27e2b Mon Sep 17 00:00:00 2001 From: charlie Date: Wed, 7 Feb 2024 16:48:44 +0800 Subject: [PATCH] enhance(ui): WIP playground for x popup --- deps/shui/src/logseq/shui/demo2.cljs | 59 ++++++++++++++++++++++++++++ src/main/frontend/routes.cljs | 2 +- 2 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 deps/shui/src/logseq/shui/demo2.cljs diff --git a/deps/shui/src/logseq/shui/demo2.cljs b/deps/shui/src/logseq/shui/demo2.cljs new file mode 100644 index 000000000..6db00e6ae --- /dev/null +++ b/deps/shui/src/logseq/shui/demo2.cljs @@ -0,0 +1,59 @@ +(ns logseq.shui.demo2 + (:require [rum.core :as rum] + [logseq.shui.ui :as ui] + [frontend.rum :refer [use-atom]])) + +(defonce *x-popup-state + (atom {:open? false :content nil :position [0 0]})) + +(defn show-x-popup! + [^js event content & {:keys [as-menu? root-props content-props]}] + (let [x (.-clientX event) + y (.-clientY event)] + (reset! *x-popup-state + {:open? true :content content :position [x y] + :as-menu? as-menu? :root-props root-props :content-props content-props}))) + +(defn hide-x-popup! + [] + (reset! *x-popup-state + {:open? false :content nil :position [0 0] :as-menu? false})) + +(rum/defc x-popup [] + (let [[{:keys [open? content position as-menu? root-props content-props]} _] (use-atom *x-popup-state)] + (when-let [[x y] position] + (let [popup-root (if as-menu? ui/dropdown-menu ui/popover) + popup-trigger (if as-menu? ui/dropdown-menu-trigger ui/popover-trigger) + popup-content (if as-menu? ui/dropdown-menu-content ui/popover-content)] + (popup-root + (merge root-props {:open open?}) + (popup-trigger + {:as-child true} + (ui/button {:class "w-1 h-1 overflow-hidden fixed p-0 opacity-0" + :style {:top y :left x}} "")) + (popup-content + (merge {:onEscapeKeyDown #(hide-x-popup!) + :onPointerDownOutside #(hide-x-popup!)} content-props) + (if (fn? content) (content) content)))) + ))) + +(rum/defc page [] + [:div.sm:p-10 + [:h1.text-3xl.font-bold.border-b.pb-4 "UI X Popup"] + + (rum/portal (x-popup) js/document.body) + + [:<> + [:div.w-full.p-4.border.rounded.dotted.h-96.mt-8.bg-gray-02 + {:on-click #(show-x-popup! % + (->> (range 8) + (map (fn [it] + (ui/dropdown-menu-item + {:on-select (fn [] + (ui/toast! it) + (hide-x-popup!)) } + [:strong it])))) + {:as-menu? true + :content-props {:class "w-48"}}) + :on-context-menu #(show-x-popup! % + [:h1.text-3xl.font-bold "hi x popup for custom context menu!"])}]]]) \ No newline at end of file diff --git a/src/main/frontend/routes.cljs b/src/main/frontend/routes.cljs index 77d181bf5..99fc9c73e 100644 --- a/src/main/frontend/routes.cljs +++ b/src/main/frontend/routes.cljs @@ -12,7 +12,7 @@ [frontend.extensions.zotero :as zotero] [frontend.components.bug-report :as bug-report] [frontend.components.user.login :as login] - [logseq.shui.demo :as shui] + [logseq.shui.demo2 :as shui] [frontend.components.imports :as imports])) ;; http://localhost:3000/#?anchor=fn.1