|  | @@ -11,35 +11,37 @@
 | 
	
		
			
				|  |  |              [frontend.commands :as commands]
 | 
	
		
			
				|  |  |              [frontend.components.datetime :as datetime-comp]
 | 
	
		
			
				|  |  |              [frontend.components.lazy-editor :as lazy-editor]
 | 
	
		
			
				|  |  | -            [frontend.components.svg :as svg]
 | 
	
		
			
				|  |  |              [frontend.components.macro :as macro]
 | 
	
		
			
				|  |  | +            [frontend.components.plugins :as plugins]
 | 
	
		
			
				|  |  | +            [frontend.components.query-table :as query-table]
 | 
	
		
			
				|  |  | +            [frontend.components.svg :as svg]
 | 
	
		
			
				|  |  |              [frontend.config :as config]
 | 
	
		
			
				|  |  |              [frontend.context.i18n :refer [t]]
 | 
	
		
			
				|  |  |              [frontend.date :as date]
 | 
	
		
			
				|  |  |              [frontend.db :as db]
 | 
	
		
			
				|  |  | -            [frontend.db.utils :as db-utils]
 | 
	
		
			
				|  |  |              [frontend.db-mixins :as db-mixins]
 | 
	
		
			
				|  |  |              [frontend.db.model :as model]
 | 
	
		
			
				|  |  |              [frontend.db.query-dsl :as query-dsl]
 | 
	
		
			
				|  |  | +            [frontend.db.utils :as db-utils]
 | 
	
		
			
				|  |  |              [frontend.extensions.highlight :as highlight]
 | 
	
		
			
				|  |  |              [frontend.extensions.latex :as latex]
 | 
	
		
			
				|  |  | -            [frontend.extensions.sci :as sci]
 | 
	
		
			
				|  |  | -            [frontend.extensions.pdf.assets :as pdf-assets]
 | 
	
		
			
				|  |  | -            [frontend.extensions.zotero :as zotero]
 | 
	
		
			
				|  |  |              [frontend.extensions.lightbox :as lightbox]
 | 
	
		
			
				|  |  | +            [frontend.extensions.pdf.assets :as pdf-assets]
 | 
	
		
			
				|  |  | +            [frontend.extensions.sci :as sci]
 | 
	
		
			
				|  |  |              [frontend.extensions.video.youtube :as youtube]
 | 
	
		
			
				|  |  | +            [frontend.extensions.zotero :as zotero]
 | 
	
		
			
				|  |  |              [frontend.format.block :as block]
 | 
	
		
			
				|  |  |              [frontend.format.mldoc :as mldoc]
 | 
	
		
			
				|  |  | -            [frontend.components.plugins :as plugins]
 | 
	
		
			
				|  |  | -            [frontend.handler.plugin :as plugin-handler]
 | 
	
		
			
				|  |  |              [frontend.handler.block :as block-handler]
 | 
	
		
			
				|  |  | +            [frontend.handler.common :as common-handler]
 | 
	
		
			
				|  |  |              [frontend.handler.dnd :as dnd]
 | 
	
		
			
				|  |  |              [frontend.handler.editor :as editor-handler]
 | 
	
		
			
				|  |  | +            [frontend.handler.plugin :as plugin-handler]
 | 
	
		
			
				|  |  | +            [frontend.handler.query :as query-handler]
 | 
	
		
			
				|  |  |              [frontend.handler.repeated :as repeated]
 | 
	
		
			
				|  |  |              [frontend.handler.route :as route-handler]
 | 
	
		
			
				|  |  |              [frontend.handler.ui :as ui-handler]
 | 
	
		
			
				|  |  | -            [frontend.handler.query :as query-handler]
 | 
	
		
			
				|  |  | -            [frontend.handler.common :as common-handler]
 | 
	
		
			
				|  |  | +            [frontend.mobile.util :as mobile-util]
 | 
	
		
			
				|  |  |              [frontend.modules.outliner.tree :as tree]
 | 
	
		
			
				|  |  |              [frontend.search :as search]
 | 
	
		
			
				|  |  |              [frontend.security :as security]
 | 
	
	
		
			
				|  | @@ -49,8 +51,8 @@
 | 
	
		
			
				|  |  |              [frontend.ui :as ui]
 | 
	
		
			
				|  |  |              [frontend.util :as util]
 | 
	
		
			
				|  |  |              [frontend.util.clock :as clock]
 | 
	
		
			
				|  |  | -            [frontend.util.property :as property]
 | 
	
		
			
				|  |  |              [frontend.util.drawer :as drawer]
 | 
	
		
			
				|  |  | +            [frontend.util.property :as property]
 | 
	
		
			
				|  |  |              [goog.dom :as gdom]
 | 
	
		
			
				|  |  |              [goog.object :as gobj]
 | 
	
		
			
				|  |  |              [lambdaisland.glogi :as log]
 | 
	
	
		
			
				|  | @@ -58,9 +60,7 @@
 | 
	
		
			
				|  |  |              [promesa.core :as p]
 | 
	
		
			
				|  |  |              [reitit.frontend.easy :as rfe]
 | 
	
		
			
				|  |  |              [rum.core :as rum]
 | 
	
		
			
				|  |  | -            [shadow.loader :as loader]
 | 
	
		
			
				|  |  | -            [frontend.components.query-table :as query-table]
 | 
	
		
			
				|  |  | -            [frontend.mobile.util :as mobile-util]))
 | 
	
		
			
				|  |  | +            [shadow.loader :as loader]))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  (defn safe-read-string
 | 
	
		
			
				|  |  |    ([s]
 | 
	
	
		
			
				|  | @@ -1876,6 +1876,54 @@
 | 
	
		
			
				|  |  |                      [:a.fade-link
 | 
	
		
			
				|  |  |                       summary]])]))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +(def swipe (atom nil))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defn- on-touch-start
 | 
	
		
			
				|  |  | +  [event]
 | 
	
		
			
				|  |  | +  (let [touch (aget (.-touches event) 0)
 | 
	
		
			
				|  |  | +        x (.-clientX touch)
 | 
	
		
			
				|  |  | +        y (.-clientY touch)]
 | 
	
		
			
				|  |  | +    (reset! swipe {:x x :y y})))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defn- on-touch-move
 | 
	
		
			
				|  |  | +  [event uuid]
 | 
	
		
			
				|  |  | +  (let [{:keys [x y]} @swipe
 | 
	
		
			
				|  |  | +        touch (aget (.-touches event) 0)
 | 
	
		
			
				|  |  | +        tx (.-clientX touch)
 | 
	
		
			
				|  |  | +        ty (.-clientY touch)
 | 
	
		
			
				|  |  | +        dx (- tx x)
 | 
	
		
			
				|  |  | +        dy (- ty y)]
 | 
	
		
			
				|  |  | +    (swap! swipe #(-> %
 | 
	
		
			
				|  |  | +                      (assoc :tx tx)
 | 
	
		
			
				|  |  | +                      (assoc :ty ty)))
 | 
	
		
			
				|  |  | +    (when-not (or (> (. js/Math abs dy) 5)
 | 
	
		
			
				|  |  | +                  (< (. js/Math abs dx) 3))
 | 
	
		
			
				|  |  | +      (let [left (.querySelector js/document (str "#block-left-menu-" uuid))
 | 
	
		
			
				|  |  | +            right (.querySelector js/document (str "#block-right-menu-" uuid))]
 | 
	
		
			
				|  |  | +        (if (> dx 0)
 | 
	
		
			
				|  |  | +          (set! (.. left -style -width) (str dx "px"))
 | 
	
		
			
				|  |  | +          (set! (.. right -style -width) (str (- dx) "px")))))))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(defn- on-touch-end
 | 
	
		
			
				|  |  | +  [_event block uuid]
 | 
	
		
			
				|  |  | +  (let [{:keys [x tx]} @swipe
 | 
	
		
			
				|  |  | +        dx (- tx x)]
 | 
	
		
			
				|  |  | +    (prn :tx tx :x x)
 | 
	
		
			
				|  |  | +    (when (> (. js/Math abs dx) 10)
 | 
	
		
			
				|  |  | +      (cond
 | 
	
		
			
				|  |  | +        (> dx 50)
 | 
	
		
			
				|  |  | +        (prn "indent")
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        (< dx -50)
 | 
	
		
			
				|  |  | +        (editor-handler/delete-block-aux! block true)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        :else
 | 
	
		
			
				|  |  | +        nil)
 | 
	
		
			
				|  |  | +      (let [left (.querySelector js/document (str "#block-left-menu-" uuid))
 | 
	
		
			
				|  |  | +            right (.querySelector js/document (str "#block-right-menu-" uuid))]
 | 
	
		
			
				|  |  | +        (set! (.. right -style -width) "0px")
 | 
	
		
			
				|  |  | +        (set! (.. left -style -width) "0px")))))
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  (rum/defc block-content < rum/reactive
 | 
	
		
			
				|  |  |    [config {:block/keys [uuid content children properties scheduled deadline format pre-block?] :as block} edit-input-id block-id slide?]
 | 
	
		
			
				|  |  |    (let [{:block/keys [title body] :as block} (if (:block/title block) block
 | 
	
	
		
			
				|  | @@ -1904,7 +1952,10 @@
 | 
	
		
			
				|  |  |                                      (not (string/includes? content "```"))
 | 
	
		
			
				|  |  |                                      (not (gobj/get e "shiftKey")))
 | 
	
		
			
				|  |  |                                 ;; clear highlighted text
 | 
	
		
			
				|  |  | -                               (util/clear-selection!)))}
 | 
	
		
			
				|  |  | +                               (util/clear-selection!)))
 | 
	
		
			
				|  |  | +              :on-touch-start on-touch-start
 | 
	
		
			
				|  |  | +              :on-touch-move (fn [event] (on-touch-move event uuid))
 | 
	
		
			
				|  |  | +              :on-touch-end (fn [event] (on-touch-end event block uuid))}
 | 
	
		
			
				|  |  |         (not slide?)
 | 
	
		
			
				|  |  |         (merge attrs))
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2198,6 +2249,22 @@
 | 
	
		
			
				|  |  |         (= (:id config)
 | 
	
		
			
				|  |  |            (str (:block/uuid block)))))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +(rum/defc block-left-menu < rum/reactive
 | 
	
		
			
				|  |  | +  [config {:block/keys [uuid] :as block}]
 | 
	
		
			
				|  |  | +  [:div.bg-red-100.flex
 | 
	
		
			
				|  |  | +   [:div.block-left-menu.w-0
 | 
	
		
			
				|  |  | +    {:id (str "block-left-menu-" uuid)
 | 
	
		
			
				|  |  | +     :style {:overflow "hidden"}}
 | 
	
		
			
				|  |  | +    (ui/icon "arrow-bar-right")]])
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +(rum/defc block-right-menu < rum/reactive
 | 
	
		
			
				|  |  | +  [config {:block/keys [uuid] :as block}]
 | 
	
		
			
				|  |  | +  [:div.bg-red-100.flex
 | 
	
		
			
				|  |  | +   [:div.block-right-menu.w-0
 | 
	
		
			
				|  |  | +    {:id (str "block-right-menu-" uuid)
 | 
	
		
			
				|  |  | +     :style {:overflow "hidden"}}
 | 
	
		
			
				|  |  | +    (ui/icon "trash")]])
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  (rum/defcs ^:large-vars/cleanup-todo block-container < rum/reactive
 | 
	
		
			
				|  |  |    {:init (fn [state]
 | 
	
		
			
				|  |  |             (let [[config block] (:rum/args state)
 | 
	
	
		
			
				|  | @@ -2309,7 +2376,11 @@
 | 
	
		
			
				|  |  |        (when (not slide?)
 | 
	
		
			
				|  |  |          (block-control config block uuid block-id collapsed? *control-show? edit?))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      (block-content-or-editor config block edit-input-id block-id heading-level edit?)]
 | 
	
		
			
				|  |  | +      (when (mobile-util/is-native-platform?)
 | 
	
		
			
				|  |  | +        (block-left-menu config block))
 | 
	
		
			
				|  |  | +      (block-content-or-editor config block edit-input-id block-id heading-level edit?)
 | 
	
		
			
				|  |  | +      (when (mobile-util/is-native-platform?)
 | 
	
		
			
				|  |  | +        (block-right-menu config block))]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |       (block-children config children collapsed?)
 | 
	
		
			
				|  |  |  
 |