Merge branch 'master' into feat/google-login

This commit is contained in:
Tienson Qin
2020-12-29 12:00:45 +08:00
35 changed files with 1546 additions and 508 deletions

View File

@@ -8,6 +8,7 @@
[frontend.state :as state]
[frontend.db :as db]
[frontend.db.model :as model]
[frontend.db.query-dsl :as query-dsl]
[dommy.core :as d]
[datascript.core :as dc]
[goog.dom :as gdom]
@@ -402,6 +403,13 @@
(let [inline-list (mldoc/inline->edn v (mldoc/default-config format))]
[:div.inline.mr-1 (map-inline {} inline-list)])))
(defn selection-range-in-block? []
(and (= "Range" (. (js/window.getSelection) -type))
(-> (js/window.getSelection)
(.-anchorNode)
(.-parentNode)
(.closest ".block-content"))))
(defn- render-macro
[config name arguments macro-content format]
(if macro-content
@@ -436,6 +444,8 @@
(not (= (:id config) "contents")))
[:span.text-gray-500 "]]"])]))
(declare custom-query)
(defn inline
[{:keys [html-export?] :as config} item]
(match item
@@ -647,6 +657,13 @@
[title])
arguments)]
(cond
(= name "query")
[:div.dsl-query
(let [query (string/join "," arguments)]
(custom-query (assoc config :dsl-query? true)
{:title [:code.p-1 (str "Query: " query)]
:query query}))]
(= name "youtube")
(let [url (first arguments)]
(when-let [youtube-id (cond
@@ -659,14 +676,17 @@
:else
nil)]
(when-not (string/blank? youtube-id)
[:iframe
{:allow-full-screen "allowfullscreen"
:allow
"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
:frame-border "0"
:src (str "https://www.youtube.com/embed/" youtube-id)
:height "315"
:width "560"}])))
(let [width (min (- (util/get-width) 96)
560)
height (int (* width (/ 315 560)))]
[:iframe
{:allow-full-screen "allowfullscreen"
:allow
"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
:frame-border "0"
:src (str "https://www.youtube.com/embed/" youtube-id)
:height height
:width width}]))))
(= name "embed")
(let [a (first arguments)]
@@ -1040,10 +1060,11 @@
(when (seq properties)
[:div.blocks-properties.text-sm.opacity-80.my-1.p-2
(for [[k v] properties]
^{:key (str (:block/uuid block) "-" k)}
[:div.my-1
[:b k]
[:span.mr-1 ":"]
(inline-text (:block/format block) v)])])))
(inline-text (:block/format block) (str v))])])))
(rum/defcs timestamp-cp < rum/reactive
(rum/local false ::show?)
@@ -1082,48 +1103,49 @@
(rum/defc block-content < rum/reactive
[config {:block/keys [uuid title level body meta content marker dummy? page format repo children pre-block? properties collapsed? idx block-refs-count scheduled scheduled-ast deadline deadline-ast repeated?] :as block} edit-input-id block-id slide?]
(let [dragging? (rum/react *dragging?)
attrs {:blockid (str uuid)
attrs {:blockid (str uuid)
;; FIXME: Click to copy a selection instead of click first and then copy
;; It seems that `util/caret-range` can't get the correct range
:on-click (fn [e]
(let [target (gobj/get e "target")]
(when-not (or (util/link? target)
(util/input? target)
(util/details-or-summary? target)
(and (util/sup? target)
(d/has-class? target "fn")))
(editor-handler/clear-selection! nil)
(editor-handler/unhighlight-block!)
(let [cursor-range (util/caret-range (gdom/getElement block-id))
properties-hidden? (text/properties-hidden? properties)
content (text/remove-level-spaces content format)
content (if properties-hidden? (text/remove-properties! content) content)]
(state/set-editing!
edit-input-id
content
block
cursor-range))
(util/stop e))))
:on-drag-over (fn [event]
(util/stop event)
(when-not (dnd-same-block? uuid)
(show-dnd-separator (str uuid "-nested"))))
:on-click (fn [e]
(when-not (selection-range-in-block?)
(let [target (gobj/get e "target")]
(when-not (or (util/link? target)
(util/input? target)
(util/details-or-summary? target)
(and (util/sup? target)
(d/has-class? target "fn")))
(editor-handler/clear-selection! nil)
(editor-handler/unhighlight-block!)
(let [cursor-range (util/caret-range (gdom/getElement block-id))
properties-hidden? (text/properties-hidden? properties)
content (text/remove-level-spaces content format)
content (if properties-hidden? (text/remove-properties! content) content)]
(state/set-editing!
edit-input-id
content
block
cursor-range))
(util/stop e)))))
:on-drag-over (fn [event]
(util/stop event)
(when-not (dnd-same-block? uuid)
(show-dnd-separator (str uuid "-nested"))))
:on-drag-leave (fn [event]
(hide-dnd-separator (str uuid))
(hide-dnd-separator (str uuid "-nested"))
(hide-dnd-separator (str uuid "-top")))
:on-drop (fn [event]
(util/stop event)
(when-not (dnd-same-block? uuid)
(let [from-dom-id (get-data-transfer-attr event "block-dom-id")]
(dnd/move-block @*dragging-block
block
from-dom-id
false
true)))
(reset! *dragging? false)
(reset! *dragging-block nil)
(editor-handler/unhighlight-block!))}]
:on-drop (fn [event]
(util/stop event)
(when-not (dnd-same-block? uuid)
(let [from-dom-id (get-data-transfer-attr event "block-dom-id")]
(dnd/move-block @*dragging-block
block
from-dom-id
false
true)))
(reset! *dragging? false)
(reset! *dragging-block nil)
(editor-handler/unhighlight-block!))}]
[:div.flex.relative
[:div.flex-1.flex-col.relative.block-content
(cond-> {:id (str "block-content-" uuid)}
@@ -1529,33 +1551,47 @@
(defn built-in-custom-query?
[title]
(contains? #{"🔨 NOW" "📅 NEXT"}
title))
(let [repo (state/get-current-repo)]
(let [queries (state/sub [:config repo :default-queries :journals])]
(when (seq queries)
(boolean (some #(= % title) (map :title queries)))))))
(defn- trigger-custom-query!
[state]
(let [[config query] (:rum/args state)
query-atom (if (:dsl-query? config)
(query-dsl/query (state/get-current-repo) (:query query))
(db/custom-query query))]
(assoc state :query-atom query-atom)))
(rum/defcs custom-query < rum/reactive
{:will-mount (fn [state]
(let [[config query] (:rum/args state)
query-atom (db/custom-query query)]
(assoc state :query-atom query-atom)))
{:will-mount trigger-custom-query!
:did-mount (fn [state]
(when-let [query (last (:rum/args state))]
(state/add-custom-query-component! query (:rum/react-component state)))
state)
:did-remount (fn [_old_state state]
(trigger-custom-query! state))
:will-unmount (fn [state]
(when-let [query (last (:rum/args state))]
(state/remove-custom-query-component! query)
(db/remove-custom-query! (state/get-current-repo) query))
state)}
[state config {:keys [title query inputs view collapsed? children?] :as q}]
(let [query-atom (:query-atom state)]
(let [dsl-query? (:dsl-query? config)
query-atom (:query-atom state)]
(let [current-block-uuid (or (:block/uuid (:block config))
(:block/uuid config))
;; exclude the current one, otherwise it'll loop forever
remove-blocks (if current-block-uuid [current-block-uuid] nil)
query-result (and query-atom (rum/react query-atom))
result (if (and query-result dsl-query?)
query-result
(db/custom-query-result-transform query-result remove-blocks q))
result (if query-result
(db/custom-query-result-transform query-result remove-blocks q))
view-f (sci/eval-string (pr-str view))
view-f (and view (sci/eval-string (pr-str view)))
only-blocks? (:block/uuid (first result))
blocks-grouped-by-page? (and (seq result)
(coll? (first result))
@@ -1582,6 +1618,7 @@
(and (seq result)
(or only-blocks? blocks-grouped-by-page?))
(->hiccup result (cond-> (assoc config
;; :editor-box editor/box
:custom-query? true
:group-by-page? blocks-grouped-by-page?)
children?
@@ -1592,9 +1629,9 @@
;; page list
(and (seq result)
(:page/name (first result)))
[:ol
[:ul#query-pages.mt-1
(for [{:page/keys [name original-name] :as page-entity} result]
[:li
[:li.mt-1
[:a {:href (rfe/href :page {:name name})
:on-click (fn [e]
(util/stop e)

View File

@@ -87,7 +87,15 @@
.ls-block {
min-height: 24px;
padding: 2px 0;
margin-top: 1px;
border-bottom: 1px solid transparent;
&.selected {
border-bottom-color: var(--ls-primary-background-color);
&:last-child {
border-bottom-color: transparent;
}
}
img {
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);

View File

@@ -47,7 +47,7 @@
(rum/defc custom-context-menu-content
[]
[:div#custom-context-menu.w-48.rounded-md.shadow-lg.transition.ease-out.duration-100.transform.opacity-100.scale-100.enter-done.absolute {:style {:z-index 4}}
[:div#custom-context-menu
[:div.py-1.rounded-md.bg-base-3.shadow-xs
(ui/menu-link
{:key "cut"
@@ -111,7 +111,7 @@
(let [properties (:block/properties block)
heading (get properties "heading")
heading? (= heading "true")]
[:div#custom-context-menu.w-64.rounded-md.shadow-lg.transition.ease-out.duration-100.transform.opacity-100.scale-100.enter-done.absolute {:style {:z-index 4}}
[:div#custom-context-menu
[:div.py-1.rounded-md.bg-base-3.shadow-xs
[:div.flex-row.flex.justify-between.py-4.pl-2
[:div.flex-row.flex.justify-between
@@ -177,7 +177,7 @@
(ui/menu-link
{:key "Copy block ref"
:on-click (fn [_e]
(editor-handler/copy-block-ref! block-id))}
(editor-handler/copy-block-ref! block-id #(str "((" % "))")))}
"Copy block ref")
(block-template block-id)

View File

@@ -9,4 +9,11 @@
.content a.initial-color:hover {
color: initial;
text-decoration: none;
}
#custom-context-menu {
@apply rounded-md shadow-lg transition ease-out duration-100 transform
opacity-100 scale-100 absolute;
z-index: calc(var(--ls-z-index-level-1) + 1);
}

View File

@@ -59,7 +59,8 @@
(if collapse?
(svg/arrow-right)
(svg/arrow-down))]
[:span.cp__diff-file-header-content path]
[:span.cp__diff-file-header-content {:style {:word-break "break-word"}}
path]
(when resolved?
[:span.text-green-600
{:dangerouslySetInnerHTML

View File

@@ -643,7 +643,7 @@
(when-let [element (gdom/getElement id)]
(.focus element)))
state)
:did-remount (fn [state]
:did-remount (fn [_old-state state]
(keyboards-handler/esc-save! state)
state)
:will-unmount (fn [state]

View File

@@ -370,7 +370,8 @@
[:div.text-sm.ml-1.mb-4.flex-1.inline-flex
{:key "page-file"}
[:span.opacity-50 {:style {:margin-top 2}} (t :file/file)]
[:a.bg-base-2.px-1.ml-1.mr-3 {:style {:border-radius 4}
[:a.bg-base-2.px-1.ml-1.mr-3 {:style {:border-radius 4
:word-break "break-word"}
:href (str "/file/" (util/url-encode file-path))}
file-path]

View File

@@ -1,3 +1,12 @@
.white-theme .cp__right-sidebar-settings a {
html[data-theme=light] {
.cp__right-sidebar-settings a {
color: var(--ls-primary-text-color);
}
.cp__right-sidebar {
.block-content {
--ls-page-inline-code-bg-color: var(--ls-quaternary-background-color);
--ls-page-blockquote-bg-color: var(--ls-quaternary-background-color);
}
}
}

View File

@@ -13,6 +13,7 @@
[frontend.search :as search]
[clojure.string :as string]
[goog.dom :as gdom]
[medley.core :as medley]
[frontend.context.i18n :as i18n]))
(rum/defc dropdown-content-wrapper [state content]
@@ -24,6 +25,46 @@
"exited" "transition ease-in duration-75 transform opacity-0 scale-95")}
content])
(defn- partition-between
"Split `coll` at positions where `pred?` is true."
[pred? coll]
(let [switch (reductions not= true (map pred? coll (rest coll)))]
(map (partial map first) (partition-by second (map list coll switch)))))
(rum/defc highlight-fuzzy
[content indexes]
(let [n (count content)
max-hightlighted-len 64
max-surrounding-len 32
first-index (first indexes)
last-index (nth indexes (dec (count indexes)))
last-index (min (+ first-index max-hightlighted-len -1) last-index)
last-index* (+ last-index max-surrounding-len)
indexes (take-while #(<= % last-index*) indexes)
content-begin (max 0 (- first-index max-surrounding-len))
content-end (min n (+ last-index 1 max-surrounding-len)) ; exclusive
; finds inconsecutive sections
sections (partition-between #(> (- %2 %) 1) indexes)
hl-ranges (for [sec sections
:let [begin (first sec)
end (-> sec last inc)]]
[begin end]) ; `end` is exclusive
hl-ranges* (concat [[content-begin content-begin]]
hl-ranges
[[content-end content-end]])
normal-ranges (for [[[_ begin] [end _]] (partition 2 1 hl-ranges*)] [begin end])
normal-hl-pairs (partition-all 2 (medley/interleave-all normal-ranges hl-ranges))]
[:p
(mapcat
(fn [[normal highlighted]]
[(when-some [[begin end] normal]
[:span (subs content begin end)])
(when-some [[begin end] highlighted]
[:mark (subs content begin end)])])
normal-hl-pairs)]))
(rum/defc highlight
[content q]
(let [q-pattern (->> q
@@ -135,11 +176,11 @@
data]
:block
(let [{:block/keys [page content]} data]
(let [{:block/keys [page content indexes]} data]
(let [page (:page/original-name page)]
[:div.flex-1
[:div.text-sm.font-medium page]
(highlight content search-q)]))
(highlight-fuzzy content indexes)]))
nil))})])))

View File

@@ -68,6 +68,7 @@
preferred-workflow (keyword (state/sub [:me :preferred_workflow]))
preferred-language (state/sub [:preferred-language])
enable-timetracking? (state/enable-timetracking?)
enable-block-time? (state/enable-block-time?)
show-brackets? (state/show-brackets?)
github-token (state/sub [:me :access-token])
cors-proxy (state/sub [:me :cors_proxy])
@@ -128,101 +129,112 @@
[:a {:href (str "/file/" (util/url-encode (str config/app-name "/" config/config-file)))}
(t :settings-page/edit-config-edn)])
(when logged? [:hr])
[:hr]
(when logged?
[:div.mt-6.sm:mt-5
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "preferred_format"}
(t :settings-page/preferred-file-format)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
[:select.mt-1.form-select.block.w-full.pl-3.pr-10.py-2.text-base.leading-6.border-gray-300.focus:outline-none.focus:shadow-outline-blue.focus:border-blue-300.sm:text-sm.sm:leading-5
{:on-change (fn [e]
(let [format (-> (util/evalue e)
[:div.mt-6.sm:mt-5
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "preferred_format"}
(t :settings-page/preferred-file-format)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
[:select.mt-1.form-select.block.w-full.pl-3.pr-10.py-2.text-base.leading-6.border-gray-300.focus:outline-none.focus:shadow-outline-blue.focus:border-blue-300.sm:text-sm.sm:leading-5
{:on-change (fn [e]
(let [format (-> (util/evalue e)
(string/lower-case)
keyword)]
(user-handler/set-preferred-format! format)))}
(for [format [:org :markdown]]
[:option (cond->
{:key (name format)}
(= format preferred-format)
(assoc :selected "selected"))
(string/capitalize (name format))])]]]]
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "preferred_workflow"}
(t :settings-page/preferred-workflow)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
[:select.mt-1.form-select.block.w-full.pl-3.pr-10.py-2.text-base.leading-6.border-gray-300.focus:outline-none.focus:shadow-outline-blue.focus:border-blue-300.sm:text-sm.sm:leading-5
{:on-change (fn [e]
(let [workflow (-> (util/evalue e)
(string/lower-case)
keyword)]
(user-handler/set-preferred-format! format)))}
(for [format [:org :markdown]]
[:option (cond->
{:key (name format)}
(= format preferred-format)
(assoc :selected "selected"))
(string/capitalize (name format))])]]]]
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "preferred_workflow"}
(t :settings-page/preferred-workflow)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
[:select.mt-1.form-select.block.w-full.pl-3.pr-10.py-2.text-base.leading-6.border-gray-300.focus:outline-none.focus:shadow-outline-blue.focus:border-blue-300.sm:text-sm.sm:leading-5
{:on-change (fn [e]
(let [workflow (-> (util/evalue e)
(string/lower-case)
keyword)
workflow (if (= workflow :now/later)
:now
:todo)]
(user-handler/set-preferred-workflow! workflow)))}
(for [workflow [:now :todo]]
[:option (cond->
{:key (name workflow)}
(= workflow preferred-workflow)
(assoc :selected "selected"))
(if (= workflow :now)
"NOW/LATER"
"TODO/DOING")])]]]]
keyword)
workflow (if (= workflow :now/later)
:now
:todo)]
(user-handler/set-preferred-workflow! workflow)))}
(for [workflow [:now :todo]]
[:option (cond->
{:key (name workflow)}
(= workflow preferred-workflow)
(assoc :selected "selected"))
(if (= workflow :now)
"NOW/LATER"
"TODO/DOING")])]]]]
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for "enable_timetracking"}
(t :settings-page/enable-timetracking)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.sm:max-w-xs
(ui/toggle enable-timetracking?
(fn []
(let [value (not enable-timetracking?)]
(config-handler/set-config! :feature/enable-timetracking? value))))]]]
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for "enable_timetracking"}
(t :settings-page/enable-timetracking)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.sm:max-w-xs
(ui/toggle enable-timetracking?
(fn []
(let [value (not enable-timetracking?)]
(config-handler/set-config! :feature/enable-timetracking? value))))]]]
[:hr]
[:div.mt-6.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.opacity-70
{:for "enable_block_time"}
(t :settings-page/enable-block-time)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.sm:max-w-xs
(ui/toggle enable-block-time?
(fn []
(let [value (not enable-block-time?)]
(config-handler/set-config! :feature/enable-block-time? value))))]]]
(ui/admonition
:important
[:p (t :settings-page/dont-use-other-peoples-proxy-servers)
[:a {:href "https://github.com/isomorphic-git/cors-proxy"
:target "_blank"}
"https://github.com/isomorphic-git/cors-proxy"]])
[:hr]
[:div.mt-6.sm:mt-5.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "cors"}
(t :settings-page/custom-cors-proxy-server)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
[:input#pat.form-input.block.w-full.transition.duration-150.ease-in-out.sm:text-sm.sm:leading-5
{:default-value cors-proxy
:on-blur (fn [event]
(when-let [server (util/evalue event)]
(user-handler/set-cors! server)
(notification/show! "Custom CORS proxy updated successfully!" :success)))
:on-key-press (fn [event]
(let [k (gobj/get event "key")]
(if (= "Enter" k)
(when-let [server (util/evalue event)]
(user-handler/set-cors! server)
(notification/show! "Custom CORS proxy updated successfully!" :success)))))}]]]]
(when logged?
[:div
(ui/admonition
:important
[:p (t :settings-page/dont-use-other-peoples-proxy-servers)
[:a {:href "https://github.com/isomorphic-git/cors-proxy"
:target "_blank"}
"https://github.com/isomorphic-git/cors-proxy"]])
[:div.mt-6.sm:mt-5.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "cors"}
(t :settings-page/custom-cors-proxy-server)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
[:input#pat.form-input.block.w-full.transition.duration-150.ease-in-out.sm:text-sm.sm:leading-5
{:default-value cors-proxy
:on-blur (fn [event]
(when-let [server (util/evalue event)]
(user-handler/set-cors! server)
(notification/show! "Custom CORS proxy updated successfully!" :success)))
:on-key-press (fn [event]
(let [k (gobj/get event "key")]
(if (= "Enter" k)
(when-let [server (util/evalue event)]
(user-handler/set-cors! server)
(notification/show! "Custom CORS proxy updated successfully!" :success)))))}]]]]
[:hr]
[:hr]])
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "developer_mode"}
(t :settings-page/developer-mode)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
(ui/button (if developer-mode? (t :settings-page/disable-developer-mode) (t :settings-page/enable-developer-mode))
:on-click #(state/set-developer-mode! (not developer-mode?)))]]]
[:div.sm:grid.sm:grid-cols-3.sm:gap-4.sm:items-start.sm:pt-5
[:label.block.text-sm.font-medium.leading-5.sm:mt-px.sm:pt-2.opacity-70
{:for "developer_mode"}
(t :settings-page/developer-mode)]
[:div.mt-1.sm:mt-0.sm:col-span-2
[:div.max-w-lg.rounded-md.shadow-sm.sm:max-w-xs
(ui/button (if developer-mode? (t :settings-page/disable-developer-mode) (t :settings-page/enable-developer-mode))
:on-click #(state/set-developer-mode! (not developer-mode?)))]]]
[:br]
(t :settings-page/developer-mode-desc)])]])))
[:br]
(t :settings-page/developer-mode-desc)]]])))

View File

@@ -115,7 +115,7 @@
height: calc(100vh - 3rem);
overflow-x: hidden;
overflow-y: auto;
z-index: 9;
z-index: var(--ls-z-index-level-1);
transition: width 0.3s, opacity 0.2s;
border-radius: var(--ls-border-radius-low) 0 0 0;

View File

@@ -1,6 +1,13 @@
:root {
scrollbar-width: thin;
scrollbar-color: var(--ls-scrollbar-foreground-color) var(--ls-scrollbar-background-color);
--ls-z-index-level-0: 0;
--ls-z-index-level-1: 9;
--ls-z-index-level-2: 99;
--ls-z-index-level-3: 999;
--ls-z-index-level-4: 9999;
--ls-z-index-level-5: 99999;
}
html:not(.is-mac) {