Преглед на файлове

enhance(ux): WIP page preview with the shui popups

charlie преди 1 година
родител
ревизия
e4a1f723e2
променени са 3 файла, в които са добавени 80 реда и са изтрити 55 реда
  1. 5 0
      resources/css/shui.css
  2. 75 46
      src/main/frontend/components/block.cljs
  3. 0 9
      src/main/frontend/tippy-tooltip.css

+ 5 - 0
resources/css/shui.css

@@ -220,11 +220,16 @@ html[data-theme=dark] {
 .ui__dialog-overlay, .ui__alert-dialog-overlay,
 .ui__dialog-content, .ui__alert-dialog-content,
 .ui__dropdown-menu-content, .ui__select-content {
+
   &.z-50 {
     @apply z-[999];
   }
 }
 
+div[data-radix-popper-content-wrapper] {
+  @apply !z-[999];
+}
+
 .ui__dialog-overlay {
   &[data-align=start],
   &[data-align=top] {

+ 75 - 46
src/main/frontend/components/block.cljs

@@ -661,37 +661,41 @@
           (ui/icon "x" {:size 15})]))]))
 
 (rum/defc page-preview-trigger
-  [{:keys [children sidebar? tippy-position tippy-distance fixed-position? open? manual?] :as config} page-name]
-  (let [*tippy-ref (rum/create-ref)
-        page-name (when page-name (util/page-name-sanity-lc page-name))
+  [{:keys [children sidebar? open? manual?] :as config} page-name]
+  (let [page-name (when page-name (util/page-name-sanity-lc page-name))
+        *el-trigger (rum/use-ref nil)
+        [visible? set-visible!] (rum/use-state nil)
+        *timer (rum/use-ref nil)                            ;; enter
+        *timer1 (rum/use-ref nil)                           ;; leave
         _  #_:clj-kondo/ignore (rum/defc html-template []
                                  (let [*el-popup (rum/use-ref nil)]
 
                                    (rum/use-effect!
-                                    (fn []
-                                      (let [el-popup (rum/deref *el-popup)
-                                            cb (fn [^js e]
-                                                 (when-not (state/editing?)
-                                                   ;; Esc
-                                                   (and (= e.which 27)
-                                                        (when-let [tp (rum/deref *tippy-ref)]
-                                                          (.hideTooltip tp)))))]
-
-                                        (js/setTimeout #(.focus el-popup))
-                                        (.addEventListener el-popup "keyup" cb)
-                                        #(.removeEventListener el-popup "keyup" cb)))
-                                    [])
+                                     (fn []
+                                       (let [el-popup (rum/deref *el-popup)
+                                             focus! #(js/setTimeout (fn [] (.focus el-popup)))
+                                             cb (fn [^js e]
+                                                  ;; Esc
+                                                  (when (= (.-which e) 27)
+                                                    (if-not (state/editing?)
+                                                      (set-visible! false) (focus!))))]
+
+                                         (focus!)
+                                         (.addEventListener el-popup "keydown" cb)
+                                         (fn []
+                                           (.removeEventListener el-popup "keydown" cb)
+                                           (set-visible! false))))
+                                     [])
 
                                    (let [redirect-page-name (or (and page-name (model/get-redirect-page-name page-name (:block/alias? config)))
-                                                                page-name)]
+                                                              page-name)]
                                      (when redirect-page-name
-                                       [:div.tippy-wrapper.overflow-y-auto.p-4.outline-none.rounded-md
-                                        {:ref   *el-popup
+                                       [:div.tippy-wrapper.p-4.outline-none.rounded-md
+                                        {:ref *el-popup
                                          :tab-index -1
-                                         :style {:width          600
-                                                 :text-align     "left"
-                                                 :font-weight    500
-                                                 :max-height     600
+                                         :style {:width 600
+                                                 :text-align "left"
+                                                 :font-weight 500
                                                  :padding-bottom 64}}
                                         (let [page-cp (state/get-page-blocks-cp)]
                                           (page-cp {:repo (state/get-current-repo)
@@ -699,32 +703,57 @@
                                                     :sidebar? sidebar?
                                                     :preview? true}))]))))]
 
+    (rum/use-effect!
+      (fn []
+        (when (true? visible?)
+          (shui/popup-show!
+            (rum/deref *el-trigger) html-template
+            {:root-props {:onOpenChange (fn [v] (set-visible! v))}
+             :content-props {:class "ls-preview-popup"
+                             :onEscapeKeyDown (fn [^js e] (.preventDefault e))}
+             :as-dropdown? false}))
+
+        (when (false? visible?)
+          (shui/popup-hide!))
+        (rum/set-ref! *timer nil)
+        (rum/set-ref! *timer1 nil))
+      [visible?])
+
     (if (or (not manual?) open?)
-      (ui/tippy {:ref             *tippy-ref
-                 :in-editor?      true
-                 :html            html-template
-                 :interactive     true
-                 :delay           [1000, 100]
-                 :fixed-position? fixed-position?
-                 :position        (or tippy-position "top")
-                 :distance        (or tippy-distance 10)
-                 :popperOptions   {:modifiers {:preventOverflow
-                                               {:enabled           true
-                                                :boundariesElement "viewport"}}}}
-                children)
-      children)))
+      [:span
+       {:ref *el-trigger
+        :on-mouse-enter (fn []
+                          (let [timer (rum/deref *timer)
+                                timer1 (rum/deref *timer1)]
+                            (when-not timer
+                              (rum/set-ref! *timer
+                                (js/setTimeout #(set-visible! true) 1000)))
+                            (when timer1
+                              (js/clearTimeout timer1)
+                              (rum/set-ref! *timer1 nil))))
+        :on-mouse-leave (fn []
+                          (when (not visible?)
+                            (let [timer (rum/deref *timer)
+                                  timer1 (rum/deref *timer1)]
+                              (when timer
+                                (js/clearTimeout timer)
+                                (rum/set-ref! *timer nil))
+                              (when-not timer1
+                                (rum/set-ref! *timer1
+                                  (js/setTimeout #(set-visible! false) 200))))))}
+       children] children)))
 
 (rum/defcs page-cp < db-mixins/query rum/reactive
-  {:init (fn [state]
-           (let [page (last (:rum/args state))]
-             (assoc state ::page-entity
-                    (if (e/entity? page)
-                      page
-                      ;; Use uuid when available to uniquely identify case sensitive contexts
-                      (db/get-page (or (:block/uuid page) (:block/name page)))))))}
-  "Component for a page. `page` argument contains :block/name which can be (un)sanitized page name.
-   Keys for `config`:
-   - `:preview?`: Is this component under preview mode? (If true, `page-preview-trigger` won't be registered to this `page-cp`)"
+                     {:init (fn [state]
+                              (let [page (last (:rum/args state))]
+                                (assoc state ::page-entity
+                                  (if (e/entity? page)
+                                    page
+                                    ;; Use uuid when available to uniquely identify case sensitive contexts
+                                    (db/get-page (or (:block/uuid page) (:block/name page)))))))}
+                     "Component for a page. `page` argument contains :block/name which can be (un)sanitized page name.
+                      Keys for `config`:
+                      - `:preview?`: Is this component under preview mode? (If true, `page-preview-trigger` won't be registered to this `page-cp`)"
   [state {:keys [label children preview? disable-preview?] :as config} page]
   (let [page-entity (::page-entity state)]
     (when-let [page-entity (when page-entity (db/sub-block (:db/id page-entity)))]

+ 0 - 9
src/main/frontend/tippy-tooltip.css

@@ -74,15 +74,6 @@
   text-align: left;
 }
 
-.tippy-wrapper {
-  border-radius: 8px;
-  margin: 0 -6px;
-}
-
-.tippy-hover {
-  cursor: pointer;
-}
-
 .tippy-popper .tippy-tooltip.monospace-theme {
   font-family: 'Fira Code', Monaco, Menlo, Consolas, 'COURIER NEW', monospace;
 }