Merge branch 'feat/db' into feat/capacitor-new

This commit is contained in:
charlie
2025-05-13 12:28:36 +08:00
39 changed files with 128 additions and 459 deletions

View File

@@ -170,58 +170,6 @@ jobs:
with:
name: static
path: static
e2e-test:
name: E2E Test Shard ${{ matrix.shard }}
runs-on: ubuntu-22.04
strategy:
matrix:
shard: [1, 2, 3]
needs: [ compile-cljs ]
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Download The Static Asset
uses: actions/download-artifact@v4
with:
name: static
path: static
- name: Set up Node
uses: actions/setup-node@v3
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'yarn'
cache-dependency-path: |
yarn.lock
static/yarn.lock
- name: Fetch yarn deps for E2E test
run: |
yarn install
(cd static && yarn install && yarn rebuild:all)
env:
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: true
- name: Install Fluxbox
run: sudo apt-get update && sudo apt-get install -y fluxbox
# Emulate a virtual framebuffer on machines with no display hardware
- name: Run XVFB
run: Xvfb :1 -screen 0 1024x768x24 >/dev/null 2>&1 &
# Start a lightweight window manager to simulate window actions (maximize,restore etc)
- name: Start Fluxbox
run: DISPLAY=:1.0 fluxbox >/dev/null 2>&1 &
- name: Run Playwright test
run: DISPLAY=:1.0 npx playwright test --reporter github --shard=${{ matrix.shard }}/3
env:
LOGSEQ_CI: true
DEBUG: "pw:api"
RELEASE: true # skip dev only test
build-linux-x64:
runs-on: ubuntu-22.04
needs: [ compile-cljs ]
@@ -580,7 +528,7 @@ jobs:
nightly-release:
if: ${{ github.event_name == 'schedule' || github.event.inputs.build-target == 'nightly' }}
needs: [ build-macos-x64, build-macos-arm64, build-linux-x64, build-linux-arm64, codesign-windows, build-android, e2e-test ]
needs: [ build-macos-x64, build-macos-arm64, build-linux-x64, build-linux-arm64, codesign-windows, build-android]
runs-on: ubuntu-22.04
steps:
- name: Download MacOS x64 Artifacts
@@ -660,7 +608,7 @@ jobs:
release:
# NOTE: For now, we only have beta channel to be released on Github
if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.build-target == 'beta' }}
needs: [ build-macos-x64, build-macos-arm64, build-linux-x64, build-linux-arm64, codesign-windows, build-android, e2e-test ]
needs: [ build-macos-x64, build-macos-arm64, build-linux-x64, build-linux-arm64, codesign-windows, build-android]
runs-on: ubuntu-22.04
steps:
- name: Download MacOS x64 Artifacts

View File

@@ -11,7 +11,6 @@
-/resources/static/js/katex.min.js
-/resources/static/js/mhchem.min.js
-/resources/static/js/mldoc.min.js
-/resources/static/js/reveal.js
-/resources/static/js/sci.min.js
-/resources/static/js/excalidraw.min.js
-/resources/static/js/react-force-graph.min.js

View File

@@ -1,30 +1,28 @@
(ns logseq.db.common.property-util
"Property related util fns. Fns used in both DB and file graphs should go here"
(:require [datascript.core :as d]
[logseq.db.common.entity-plus :as entity-plus]
[logseq.db.frontend.property :as db-property]
[logseq.db.sqlite.util :as sqlite-util]))
(defn- get-file-pid-by-ident
(defn get-file-pid
"Gets file graph property id given the db graph ident"
[db-ident]
(get-in db-property/built-in-properties [db-ident :name] (name db-ident)))
;; Map of unique cases where the db graph keyword name is different than the file graph id
(let [unique-file-ids {:logseq.property/order-list-type :logseq.order-list-type
:logseq.property.tldraw/page :logseq.tldraw.page
:logseq.property.tldraw/shape :logseq.tldraw.shape
:logseq.property/publishing-public? :public}]
(or (get unique-file-ids db-ident)
(keyword (name db-ident)))))
;; TODO: refactor later to remove this fn
;; TODO: replace repo with db later to remove this fn
(defn get-pid
"Get a built-in property's id (keyword name for file graph and db-ident for db
graph) given its db-ident. No need to use this fn in a db graph only context"
[repo db-ident]
(if (sqlite-util/db-based-graph? repo)
db-ident
(get-file-pid-by-ident db-ident)))
(defn get-pid-2
"Get a built-in property's id (keyword name for file graph and db-ident for db
graph) given its db-ident. No need to use this fn in a db graph only context"
[db db-ident]
(if (entity-plus/db-based-graph? db)
db-ident
(get-file-pid-by-ident db-ident)))
(get-file-pid db-ident)))
(defn lookup
"Get the property value by a built-in property's db-ident from coll. For file and db graphs"

View File

@@ -12,7 +12,7 @@
;; Main property vars
;; ==================
(def ^:large-vars/data-var built-in-properties*
(def ^:large-vars/data-var built-in-properties
"Map of built in properties for db graphs with their :db/ident as keys.
Each property has a config map with the following keys:
TODO: Move some of these keys to :properties since :schema is a deprecated concept
@@ -26,8 +26,6 @@
seen in when :public? is set. Valid values are :page, :block and :never. Property can
be viewed in any context if not set
* :title - Property's :block/title
* :name - Property's :block/name as a keyword. If none given, one is derived from the db/ident.
TODO: This is barely used for old properties. Deprecate this and move to gp-exporter
* :attribute - Property keyword that is saved to a datascript attribute outside of :block/properties
* :queryable? - Boolean for whether property can be queried in the query builder
* :closed-values - Vec of closed-value maps for properties with choices. Map
@@ -196,10 +194,6 @@
{:logseq.property/description "Provides a way for a page to associate to another page i.e. backward compatible tagging."}}
:logseq.property/background-color {:title "Background color"
:schema {:type :default :hide? true}}
:logseq.property/background-image {:title "Background image"
:schema
{:type :default ; FIXME: asset
:view-context :block}}
;; number (1-6) or boolean for auto heading
:logseq.property/heading {:title "Heading"
:schema {:type :any :hide? true}
@@ -241,7 +235,6 @@
:schema {:type :map :hide? true}}
;; FIXME: :logseq.property/order-list-type should updated to closed values
:logseq.property/order-list-type {:title "List type"
:name :logseq.order-list-type
:schema {:type :default
:hide? true}}
:logseq.property.linked-references/includes {:title "Included references"
@@ -253,10 +246,10 @@
:schema {:type :node
:cardinality :many
:hide? true}}
:logseq.property.tldraw/page {:name :logseq.tldraw.page
:logseq.property.tldraw/page {:title "Tldraw Page"
:schema {:type :map
:hide? true}}
:logseq.property.tldraw/shape {:name :logseq.tldraw.shape
:logseq.property.tldraw/shape {:title "Tldraw Shape"
:schema {:type :map
:hide? true}}
@@ -567,17 +560,6 @@
:public? true}
:queryable? true})))
(def built-in-properties
(->> built-in-properties*
(map (fn [[k v]]
(assert (and (keyword? k) (namespace k)))
[k
;; All built-ins must have a :name
(if (:name v)
v
(assoc v :name (keyword (string/lower-case (name k)))))]))
(into (ordered-map))))
(def db-attribute-properties
"Internal properties that are also db schema attributes"
#{:block/alias :block/tags :block/parent
@@ -701,22 +683,6 @@
(or (:block/title ent)
(:logseq.property/value ent)))
(defn- ref->property-value-content
"Given a ref from a pulled query e.g. `{:db/id X}`, gets a readable name for
the property value of a ref type property"
[db ref]
(some->> (:db/id ref)
(d/entity db)
property-value-content))
(defn ref->property-value-contents
"Given a ref or refs from a pulled query e.g. `{:db/id X}`, gets a readable
name for the property values of a ref type property"
[db ref]
(if (or (set? ref) (sequential? ref))
(set (map #(ref->property-value-content db %) ref))
(ref->property-value-content db ref)))
(defn get-closed-value-entity-by-name
"Given a property, finds one of its closed values by name or nil if none
found. Works for all closed value types"
@@ -752,16 +718,6 @@
[property]
(= (:db/cardinality property) :db.cardinality/many))
(defn properties-by-name
"Given a block from a query result, returns a map of its properties indexed by
property names"
[db block]
(->> (properties block)
(map (fn [[k v]]
[(:block/title (d/entity db k))
(ref->property-value-contents db v)]))
(into {})))
(defn public-built-in-property?
"Indicates whether built-in property can be seen and edited by users"
[entity]

View File

@@ -51,20 +51,19 @@
"Given a properties map in the format of db-property/built-in-properties, builds their properties tx"
[built-in-properties]
(mapcat
(fn [[db-ident {:keys [attribute schema title closed-values properties] :as m}]]
(fn [[db-ident {:keys [attribute schema title closed-values properties]}]]
(let [db-ident (or attribute db-ident)
prop-name (or title (name (:name m)))
schema' (schema->qualified-property-keyword schema)
[property & others] (if closed-values
(db-property-build/build-closed-values
db-ident
prop-name
title
{:db/ident db-ident :schema schema' :closed-values closed-values}
{})
[(sqlite-util/build-new-property
db-ident
schema'
{:title prop-name})])
{:title title})])
pvalue-tx-m (->property-value-tx-m
(merge property
;; This config is for :logseq.property/default-value and may need to

View File

@@ -54,17 +54,17 @@
[{:page {:block/title "page1"}
:blocks [{:block/title "some todo"
:build/properties {:logseq.property/status :logseq.property/status.doing}}
{:block/title "some slide"
:build/properties {:logseq.property/background-image "https://placekitten.com/200/300"}}]}])]
{:block/title "rojo"
:build/properties {:logseq.property/background-color "red"}}]}])]
(is (= :logseq.property/status.doing
(->> (db-test/find-block-by-content @conn "some todo")
:logseq.property/status
:db/ident))
"built-in property with closed value is created and correctly associated to a block")
(is (= "https://placekitten.com/200/300"
(->> (db-test/find-block-by-content @conn "some slide")
:logseq.property/background-image
(is (= "red"
(->> (db-test/find-block-by-content @conn "rojo")
:logseq.property/background-color
db-property/property-value-content))
"built-in :default property is created and correctly associated to a block")))

View File

@@ -29,7 +29,8 @@
[logseq.graph-parser.block :as gp-block]
[logseq.graph-parser.extract :as extract]
[logseq.graph-parser.property :as gp-property]
[promesa.core :as p]))
[promesa.core :as p]
[logseq.db.common.property-util :as db-property-util]))
(defn- add-missing-timestamps
"Add updated-at or created-at timestamps if they doesn't exist"
@@ -405,38 +406,36 @@
(when (and prev-type (not= prev-type prop-type))
{:type {:from prev-type :to prop-type}})))
(def built-in-property-name-to-idents
"Map of all built-in keyword property names to their idents. Using in-memory property
names because these are legacy names already in a user's file graph"
(merge (->> (dissoc db-property/built-in-properties :logseq.property/publishing-public?)
(map (fn [[k v]]
[(:name v) k]))
(into {}))
;; TODO: Move 3 remaining :name config from built-in-properties to here
{:public :logseq.property/publishing-public?}))
(def built-in-property-file-to-db-idents
"Map of built-in property file ids to their db graph idents"
(->> (keys db-property/built-in-properties)
(map (fn [k]
[(db-property-util/get-file-pid k) k]))
(into {})))
(def all-built-in-property-names
"All built-in property names as a set of keywords"
(-> built-in-property-name-to-idents keys set
(def all-built-in-property-file-ids
"All built-in property file ids as a set of keywords"
(-> built-in-property-file-to-db-idents keys set
;; built-in-properties that map to new properties
(set/union #{:filters :query-table :query-properties :query-sort-by :query-sort-desc :hl-stamp :file :file-path})))
;; TODO: Review whether this should be using :block/title instead of file graph ids
(def all-built-in-names
"All built-in properties and classes as a set of keywords"
(set/union all-built-in-property-names
(set/union all-built-in-property-file-ids
(set (->> db-class/built-in-classes
vals
(map #(-> % :title string/lower-case keyword))))))
(def file-built-in-property-names
"File-graph built-in property names that are supported. Expressed as set of keywords"
#{:alias :tags :background-color :background-image :heading
#{:alias :tags :background-color :heading
:query-table :query-properties :query-sort-by :query-sort-desc
:ls-type :hl-type :hl-color :hl-page :hl-stamp :hl-value :file :file-path
:logseq.order-list-type :logseq.tldraw.page :logseq.tldraw.shape
:icon :public :exclude-from-graph-view :filters})
(assert (set/subset? file-built-in-property-names all-built-in-property-names)
(assert (set/subset? file-built-in-property-names all-built-in-property-file-ids)
"All file-built-in properties are used in db graph")
(def query-table-special-keys
@@ -518,7 +517,7 @@
:ls-type
[[:logseq.property/ls-type (keyword prop-value)]]
;; else
[[(built-in-property-name-to-idents prop) prop-value]]))))
[[(built-in-property-file-to-db-idents prop) prop-value]]))))
(into {}))]
(cond-> m
(and (contains? props :query-sort-desc) (:query-sort-by props))
@@ -661,7 +660,7 @@
;; Not supported as they have been ignored for a long time and cause invalid built-in pages
:now :later :doing :done :canceled :cancelled :in-progress :todo :wait :waiting
;; deprecated in db graphs
:macros :logseq.query/nlp-date
:background-image :macros :logseq.query/nlp-date
:card-last-interval :card-repeats :card-last-reviewed :card-next-schedule
:card-ease-factor :card-last-score
:logseq.color :logseq.table.borders :logseq.table.stripes :logseq.table.max-width

View File

@@ -67,7 +67,6 @@ const common = {
'node_modules/html2canvas/dist/html2canvas.min.js',
'node_modules/interactjs/dist/interact.min.js',
'node_modules/photoswipe/dist/umd/*.js',
'node_modules/reveal.js/dist/reveal.js',
'node_modules/shepherd.js/dist/js/shepherd.min.js',
'node_modules/marked/marked.min.js',
'node_modules/@highlightjs/cdn-assets/highlight.min.js',
@@ -103,7 +102,6 @@ const common = {
]).pipe(gulp.dest(path.join(outputPath, 'js', 'pdfjs', 'cmaps'))),
() => gulp.src([
'node_modules/inter-ui/inter.css',
'node_modules/reveal.js/dist/theme/fonts/source-sans-pro/**',
]).pipe(gulp.dest(path.join(outputPath, 'css'))),
() => gulp.src('node_modules/inter-ui/Inter (web)/*.*').
pipe(gulp.dest(path.join(outputPath, 'css', 'Inter (web)'))),

View File

@@ -426,8 +426,7 @@
["Advanced Query" (advanced-query-steps) "Create an advanced query block" :icon/query]
(when-not db?
["Zotero" (zotero-steps) "Import Zotero journal article" :icon/circle-letter-z])
(when-not db?
["Query function" [[:editor/input "{{function }}" {:backward-pos 2}]] "Create a query function" :icon/queryCode])
["Query function" [[:editor/input "{{function }}" {:backward-pos 2}]] "Create a query function" :icon/queryCode]
["Calculator"
(calc-steps)
"Insert a calculator" :icon/calculator]
@@ -474,7 +473,7 @@
commands)
;; Allow user to modify or extend, should specify how to extend.
(state/get-commands)
(when-let [plugin-commands (seq (some->> (state/get-plugins-slash-commands)
(mapv #(vec (concat % [nil :icon/puzzle])))))]

View File

@@ -5,7 +5,6 @@
[datascript.core :as d]
[logseq.common.util :as common-util]
[logseq.db :as ldb]
[logseq.db.common.property-util :as db-property-util]
[logseq.db.common.entity-plus :as entity-plus]
[logseq.db.sqlite.create-graph :as sqlite-create-graph]
[logseq.graph-parser.db :as gp-db]))
@@ -85,7 +84,7 @@
db-based? (entity-plus/db-based-graph? db)
created-ats (map :block/created-at full-pages)
;; build up nodes
;; build up nodes
full-pages'
(cond->> full-pages
created-at-filter
@@ -94,7 +93,9 @@
(remove ldb/journal?)
(not excluded-pages?)
(remove (fn [p] (true?
(get p (db-property-util/get-pid-2 db :logseq.property/exclude-from-graph-view))))))
(if db-based?
(get p :logseq.property/exclude-from-graph-view)
(get-in p [:block/properties :exclude-from-graph-view]))))))
links (concat relation tagged-pages namespaces)
linked (set (mapcat identity links))
build-in-pages (->> (if db-based? sqlite-create-graph/built-in-pages-names gp-db/built-in-pages-names)

View File

@@ -1272,7 +1272,6 @@
(if (and block (:block/title block))
(let [content-cp (block-content config'
block nil (:block/uuid block)
(:slide? config)
nil)
display-type (:logseq.property.node/display-type block)]
(if (and display-type (not (contains? #{:quote :math} display-type)))
@@ -2271,7 +2270,6 @@
block-ast-title (:block.temp/ast-title block)
config (assoc config :block block)
level (:level config)
slide? (boolean (:slide? config))
block-ref? (:block-ref? config)
block-type (or (keyword (pu/lookup block :logseq.property/ls-type)) :default)
html-export? (:html-export? config)
@@ -2339,12 +2337,10 @@
(concat
(when (config/local-file-based-graph? (state/get-current-repo))
[(when (and (not pre-block?)
(not html-export?)
(not slide?))
(not html-export?))
(file-block/block-checkbox block (str "mr-1 cursor")))
(when (and (not pre-block?)
(not html-export?)
(not slide?))
(not html-export?))
(file-block/marker-switch block))
(file-block/marker-cp block)
(file-block/priority-cp block)])
@@ -2648,13 +2644,12 @@
(state/set-selection-start-block! block-id)))))))))
(rum/defc dnd-separator-wrapper < rum/reactive
[block children block-id slide? top? block-content?]
[block children block-id top? block-content?]
(let [dragging? (rum/react *dragging?)
drag-to-block (rum/react *drag-to-block)]
(when (and
(= block-id drag-to-block)
dragging?
(not slide?)
(not (:block/pre-block? block)))
(let [move-to (rum/react *move-to)]
(when-not
@@ -2696,9 +2691,9 @@
[state block tag config popup-opts]
(let [*hover? (::hover? state)
*hover-container? (::hover-container? state)]
[:div.block-tag.items-center.relative.px-1
[:div.block-tag.items-center.relative
{:key (str "tag-" (:db/id tag))
:class (if @*hover? "bg-gray-03 rounded" "")
:class (if @*hover? "bg-gray-03 rounded pr-1" "px-1")
:on-mouse-over #(reset! *hover-container? true)
:on-mouse-out #(reset! *hover-container? false)}
[:div.flex.items-center
@@ -2727,7 +2722,7 @@
"Remove tag"))])
popup-opts))}
(if (and @*hover? (not (ldb/private-tags (:db/ident tag))))
[:a.inline-flex.text-muted-foreground.mr-1
[:a.inline-flex.text-muted-foreground
{:title "Remove this tag"
:style {:margin-top 1}
:on-pointer-down
@@ -2872,7 +2867,7 @@
(clock/seconds->days:hours:minutes:seconds time-spent))]))))
(rum/defc ^:large-vars/cleanup-todo block-content < rum/reactive
[config {:block/keys [uuid] :as block} edit-input-id block-id slide? *show-query?]
[config {:block/keys [uuid] :as block} edit-input-id block-id *show-query?]
(let [repo (state/get-current-repo)
db-based? (config/db-based-graph? (state/get-current-repo))
scheduled (when-not db-based? (:block/scheduled block))
@@ -2940,7 +2935,7 @@
[:div.block-content.inline
(cond-> {:id (str "block-content-" uuid)
:key (str "block-content-" uuid)}
(not slide?)
true
(merge attrs))
[:<>
@@ -2974,7 +2969,6 @@
(let [hidden? (property-file/properties-hidden? (:block/properties block))]
(not hidden?))
(not (and block-ref? (or (seq ast-title) (seq ast-body))))
(not (:slide? config))
(not= block-type :whiteboard-shape)
(not (:table-block-title? config)))
(properties-cp config block))
@@ -2989,18 +2983,19 @@
(rum/defc block-refs-count < rum/static
[block block-refs-count' *hide-block-refs?]
(when (> block-refs-count' 0)
(shui/button {:variant :ghost
:title "Open block references"
:class "px-1 py-0 w-5 h-5 opacity-70 hover:opacity-100"
:size :sm
:on-click (fn [e]
(if (gobj/get e "shiftKey")
(state/sidebar-add-block!
(state/get-current-repo)
(:db/id block)
:block-ref)
(swap! *hide-block-refs? not)))}
[:span.text-sm block-refs-count'])))
[:div.h-6
(shui/button {:variant :ghost
:title "Open block references"
:class "px-1 py-0 w-5 h-5 opacity-70 hover:opacity-100"
:size :sm
:on-click (fn [e]
(if (gobj/get e "shiftKey")
(state/sidebar-add-block!
(state/get-current-repo)
(:db/id block)
:block-ref)
(swap! *hide-block-refs? not)))}
[:span.text-sm block-refs-count'])]))
(rum/defc block-left-menu < rum/reactive
[_config {:block/keys [uuid] :as _block}]
@@ -3020,7 +3015,7 @@
[:div.more (ui/icon "dots-circle-horizontal" {:size 18})])]])
(rum/defc block-content-with-error
[config block edit-input-id block-id slide? *show-query? editor-box]
[config block edit-input-id block-id *show-query? editor-box]
(let [[editing? set-editing!] (hooks/use-state false)
query (:logseq.property/query block)]
(ui/catch-error
@@ -3048,7 +3043,7 @@
(editor-handler/unhighlight-blocks!)
(state/set-editing! edit-input-id content block "" {:db (db/get-db)
:container-id (:container-id config)}))}})])
(block-content config block edit-input-id block-id slide? *show-query?))))
(block-content config block edit-input-id block-id *show-query?))))
(rum/defcs ^:large-vars/cleanup-todo block-content-or-editor < rum/reactive
(rum/local false ::hover?)
@@ -3058,7 +3053,6 @@
(or (:block/format block) :markdown))
editor-box (state/get-component :editor/box)
editor-id (str "editor-" edit-input-id)
slide? (:slide? config)
block-reference-only? (some->
(:block/title block)
string/trim
@@ -3089,8 +3083,8 @@
:format format}
edit-input-id
config))]
[:div.flex.flex-1.w-full.block-content-wrapper {:style {:display (if (:slide? config) "block" "flex")}}
(block-content-with-error config block edit-input-id block-id slide? *show-query? editor-box)
[:div.flex.flex-1.w-full.block-content-wrapper {:style {:display "flex"}}
(block-content-with-error config block edit-input-id block-id *show-query? editor-box)
(when (and (not hide-block-refs-count?)
(not named?)
@@ -3110,14 +3104,16 @@
{:on-pointer-down (fn [e]
(util/stop e)
(editor-handler/edit-block! block :max))}
svg/edit])])])
svg/edit])])
(when-not (or (:table? config) (:property? config) (:page-title? config))
(block-refs-count block refs-count *hide-block-refs?))])
(when-not (:table-block-title? config)
[:div.flex.flex-row.items-center.self-start.gap-1
(when (and db-based? (not table?)) (block-positioned-properties config block :block-right))
(when-not (or (:table? config) (:property? config) (:page-title? config))
(block-refs-count block refs-count *hide-block-refs?))
(when (and db-based? (not table?))
[:div.opacity-70.hover:opacity-100
(block-positioned-properties config block :block-right)])
(when-not (or (:block-ref? config) (:table? config) (:gallery-view? config)
(:property? config))
@@ -3519,7 +3515,6 @@
breadcrumb-show? (:breadcrumb-show? config)
*show-left-menu? (::show-block-left-menu? container-state)
*show-right-menu? (::show-block-right-menu? container-state)
slide? (boolean (:slide? config))
doc-mode? (:document/mode? config)
embed? (:embed? config)
page-embed? (:page-embed? config)
@@ -3587,7 +3582,7 @@
level
(assoc :level level)
(not slide?)
true
(merge attrs)
(or reference? (and embed? (not page-embed?)))
@@ -3606,7 +3601,7 @@
;; only render this for the first block in each container
(when (and top? (not (or table? property?)))
(dnd-separator-wrapper block children block-id slide? true false))
(dnd-separator-wrapper block children block-id true false))
(when-not (:hide-title? config)
[:div.block-main-container.flex.flex-row.gap-1
@@ -3627,7 +3622,7 @@
:on-mouse-leave (fn [_e]
(block-mouse-leave *control-show? block-id doc-mode?))}
(when (and (not slide?) (not in-whiteboard?) (not property?) (not (:table-block-title? config)))
(when (and (not in-whiteboard?) (not property?) (not (:table-block-title? config)))
(let [edit? (or editing?
(= uuid (:block/uuid (state/get-edit-block))))]
(block-control (assoc config :hide-bullet? (:page-title? config))
@@ -3719,7 +3714,7 @@
(dissoc :original-block :data))]
(block-children config' block children collapsed?)))
(when-not (or in-whiteboard? table? property?) (dnd-separator-wrapper block children block-id slide? false false))]))
(when-not (or in-whiteboard? table? property?) (dnd-separator-wrapper block children block-id false false))]))
(rum/defc block-container-inner
[container-state repo config* block opts]
@@ -4041,7 +4036,7 @@
(cond
(nil? inside-portal?) nil
(or (:slide? config) inside-portal?)
inside-portal?
(highlight/highlight (str (random-uuid))
{:class (str "language-" language)
:data-lang language}
@@ -4134,8 +4129,7 @@
(->elem :div.is-paragraph (map-inline config l)))
["Horizontal_Rule"]
(when-not (:slide? config)
[:hr])
[:hr]
["Heading" h]
(block-container config h)
["List" l]

View File

@@ -963,6 +963,10 @@ html.is-mac {
.block-title-wrap {
@apply overflow-hidden h-6 whitespace-nowrap text-ellipsis;
}
.jtrigger {
@apply px-1;
}
}
.positioned-properties.block-below {

View File

@@ -3,14 +3,30 @@
(:require [clojure.walk :as walk]
[frontend.extensions.sci :as sci]
[frontend.handler.common :as common-handler]
[frontend.handler.db-based.property.util :as db-pu]
[goog.string :as gstring]
[goog.string.format]
[frontend.state :as state]
[frontend.config :as config]))
[frontend.config :as config]
[datascript.core :as d]
[logseq.db.frontend.property :as db-property]
[frontend.db.conn :as db-conn]))
(defn- properties-by-name
"Given a block from a query result, returns a map of its properties indexed by
property names"
[db block]
(->> (db-property/properties block)
(map (fn [[k v]]
[(:block/title (d/entity db k))
;; For now just support cardinality :one
(when-not (set? v)
(some->> (:db/id v)
(d/entity db)
db-property/property-value-content))]))
(into {})))
(defn- normalize-query-function
[ast repo result]
[ast* repo result]
(let [ast (walk/prewalk
(fn [f]
(if (and (list? f)
@@ -25,26 +41,21 @@
(first f)
(list 'map (second f) 'result)))
f))
ast)]
ast*)
db-based-graph? (config/db-based-graph? repo)
;; These keyword aliases should be the same as those used in the query-table for sorting
special-file-graph-keywords
{:block :block/title
:page :block/name
:created-at :block/created-at
:updated-at :block/updated-at}]
(walk/postwalk
(fn [f]
(cond
(keyword? f)
;; These keyword aliases should be the same as those used in the query-table for sorting
(case f
:block
:block/title
:page
:block/name
:created-at
:block/created-at
:updated-at
:block/updated-at
(let [prop-key (if (config/db-based-graph? repo) (name f) f)
(if-let [kw (and (not db-based-graph?) (get special-file-graph-keywords f))]
kw
(let [prop-key (if db-based-graph? (name f) f)
vals (map #(get-in % [:block/properties prop-key]) result)
int? (some integer? vals)]
`(~'fn [~'b]
@@ -65,9 +76,12 @@
(mapcat val query-result*)
query-result*)
repo (state/get-current-repo)
db (db-conn/get-db repo)
query-result' (if (config/db-based-graph? repo)
(map #(assoc % :block/properties (db-pu/properties-by-name repo %)) query-result)
query-result)
(->> query-result
(map #(d/entity db (:db/id %)))
(map #(hash-map :block/properties (properties-by-name db %))))
query-result)
fn-string (-> (gstring/format "(fn [result] %s)" (first arguments))
(common-handler/safe-read-string "failed to parse function")
(normalize-query-function repo query-result')

View File

@@ -106,16 +106,6 @@
{:title (t :page/delete)
:options {:on-click #(delete-page-confirm! page)}})
(when (and (not (mobile-util/native-platform?))
(not whiteboard?)
(state/get-current-page))
{:title (t :page/slide-view)
:options {:on-click (fn []
(state/sidebar-add-block!
repo
(:db/id page)
:page-slide-view))}})
;; TODO: In the future, we'd like to extract file-related actions
;; (such as open-in-finder & open-with-default-app) into a sub-menu of
;; this one. However this component doesn't yet exist. PRs are welcome!

View File

@@ -13,7 +13,6 @@
[frontend.db :as db]
[frontend.db.async :as db-async]
[frontend.db.rtc.debug-ui :as rtc-debug-ui]
[frontend.extensions.slide :as slide]
[frontend.handler.editor :as editor-handler]
[frontend.handler.route :as route-handler]
[frontend.handler.ui :as ui-handler]
@@ -25,7 +24,6 @@
[logseq.shui.ui :as shui]
[medley.core :as medley]
[promesa.core :as p]
[reitit.frontend.easy :as rfe]
[rum.core :as rum]))
(rum/defc toggle
@@ -129,13 +127,6 @@
[repo new-value block-type]))})
(str init-key))]
:page-slide-view
(when entity
[[:a.page-title {:href (rfe/href :page {:name (str (:block/uuid entity))})}
(:block/title entity)]
[:div.ml-2.slide.mt-2
(slide/slide entity)]])
:shortcut-settings
[[:.flex.items-center (ui/icon "command" {:class "text-md mr-2"}) (t :help/shortcuts)]
(shortcut-settings)]

View File

@@ -29,8 +29,7 @@
get-block-immediate-children get-block-page
get-file file-exists? get-files-full
get-latest-journals get-page get-case-page get-page-alias-names
get-page-blocks-no-cache get-page-format
journal-page? page? sub-block
get-page-format journal-page? page? sub-block
page-empty? page-exists? get-alias-source-page
has-children? whiteboard-page?])

View File

@@ -1,129 +0,0 @@
(ns frontend.extensions.slide
(:require [cljs-bean.core :as bean]
[clojure.string :as string]
[frontend.components.block :as block]
[frontend.config :as config]
[frontend.context.i18n :refer [t]]
[frontend.db :as db]
[frontend.db-mixins :as db-mixins]
[frontend.db.conn :as conn]
[frontend.handler.db-based.property.util :as db-pu]
[frontend.loader :as loader]
[frontend.modules.outliner.tree :as outliner-tree]
[frontend.state :as state]
[frontend.ui :as ui]
[logseq.db :as ldb]
[logseq.db.frontend.property :as db-property]
[rum.core :as rum]))
(defn loaded? []
js/window.Reveal)
(defn- with-properties
[m block]
(let [repo (state/get-current-repo)
db-based? (config/db-based-graph? repo)
properties (if db-based?
(as-> (db-property/properties block) properties
(->> properties
(keep (fn [[k v]]
;; Don't inject hidden props like created-from-property
(when-not (:logseq.property/hide? (db/entity repo k))
[k
(if (:db/id v)
;; Can't use db-property-util/lookup b/c vals aren't entities
(db-property/ref->property-value-contents (conn/get-db) v)
v)])))
(into {})))
(:block/properties block))]
(if (seq properties)
(merge m
(update-keys
properties
(fn [k]
(-> (str "data-" (if db-based? (db-pu/get-property-name k) (name k)))
(string/replace "data-data-" "data-")))))
m)))
(defonce *loading? (atom false))
(defn render!
[]
(let [deck (js/window.Reveal.
(js/document.querySelector ".reveal")
(bean/->js
{:embedded true
:controls true
:history false
:center true
:transition "slide"
:keyboardCondition "focused"}))]
(.initialize deck)))
;; reveal.js doesn't support multiple nested sections yet.
;; https://github.com/hakimel/reveal.js/issues/1440
(rum/defc block-container
[config block level]
(let [children (:block/children block)
has-children? (seq children)
children (when has-children?
(map (fn [block]
(block-container config block (inc level))) children))
block-el (block/block-container config (dissoc block :block/children))
dom-attrs (with-properties {:key (str "slide-block-" (:block/uuid block))} block)]
(if has-children?
[:section dom-attrs
[:section.relative
block-el]
children]
[:section dom-attrs block-el])))
(defn slide-content
[loading? style config blocks]
[:div
[:p.text-sm
(t :page/slide-view-tip-go-fullscreen)]
[:div.reveal {:style style}
(when loading?
[:div.ls-center (ui/loading "")])
[:div.slides
(map #(block-container config % 1) blocks)]]])
(rum/defc slide < rum/reactive db-mixins/query
{:did-mount (fn [state]
(if (loaded?)
(do
(reset! *loading? false)
(render!))
(do
(reset! *loading? true)
(loader/load
(config/asset-uri (if config/publishing? "static/js/reveal.js" "/static/js/reveal.js"))
(fn []
(reset! *loading? false)
(render!)))))
state)}
[page]
(let [page-name (:block/title page)
loading? (rum/react *loading?)
journal? (ldb/journal? page)
repo (state/get-current-repo)
blocks (-> (db/get-page-blocks-no-cache repo (:db/id page))
(outliner-tree/blocks->vec-tree (:db/id page)))
blocks (if (and journal? (not (config/db-based-graph? repo)))
(rest blocks)
blocks)
blocks (map (fn [block]
(update block :block/children
(fn [children]
(->>
(mapcat
(fn [x]
(tree-seq map? :block/children x))
children)
(map #(dissoc % :block/children)))))) blocks)
config {:id "slide-reveal-js"
:slide? true
:sidebar? true
:page-name page-name}]
(slide-content loading? {:height 400} config blocks)))

View File

@@ -1,39 +0,0 @@
html[data-theme=light] {
#right-sidebar .reveal {
h1,
h2,
h3,
h4,
h5,
h6 {
color: initial;
}
}
}
.reveal {
color: var(--ls-primary-text-color);
background: var(--ls-slide-background-color);
pre.code {
background: transparent;
}
.hljs {
background: none;
}
section img {
margin: 1rem auto;
}
.progress span {
display: block;
height: 100%;
width: 100%;
background-color: currentColor;
transition: transform 0.8s cubic-bezier(0.26, 0.86, 0.44, 0.985);
transform-origin: 0 0;
transform: scaleX(0);
}
}

View File

@@ -5,11 +5,6 @@
[frontend.state :as state]
[logseq.db.frontend.property :as db-property]))
(defn get-property-name
"Get a property's name given its id"
[id]
(:block/title (db-utils/entity id)))
(defn get-property-value
"Get a property's name given its id"
[e]
@@ -17,16 +12,10 @@
(db-property/property-value-content e)
e))
(defn properties-by-name
"Given a block from a query result, returns a map of its properties indexed by property names"
[repo block]
(let [db (conn/get-db repo)]
(db-property/properties-by-name db block)))
(defn readable-properties
"Given a DB graph's properties, returns a readable properties map with keys as
property names and property values dereferenced where possible. Has some
overlap with db-property/properties-by-name"
overlap with block-macros/properties-by-name"
([properties] (readable-properties properties {:original-key? true}))
([properties {:keys [original-key? key-fn]
:or {key-fn identity}}]

View File

@@ -3295,11 +3295,6 @@
(when (state/editing?)
(keydown-backspace-handler false e)))
(defn- slide-focused?
[]
(some-> (first (dom/by-class "reveal"))
(dom/has-class? "focused")))
(defn- in-page-preview?
[]
(some-> js/document.activeElement
@@ -3312,7 +3307,6 @@
(when (and (not (auto-complete?))
(or (in-page-preview?)
(not (in-shui-popup?)))
(not (slide-focused?))
(not (state/get-timestamp-block)))
(util/stop e)
(cond

View File

@@ -779,10 +779,10 @@
#?(:cljs
(defn get-blocks-noncollapse
([]
(->> (d/sel "div:not(.reveal) .ls-block")
(->> (d/sel "div .ls-block")
(filter (fn [b] (some? (gobj/get b "offsetParent"))))))
([blocks-container]
(->> (d/sel blocks-container "div:not(.reveal) .ls-block")
(->> (d/sel blocks-container "div .ls-block")
(filter (fn [b] (some? (gobj/get b "offsetParent"))))))))
#?(:cljs

View File

@@ -428,8 +428,6 @@
:page/open-in-finder "Obrir ubicació del arxiu"
:page/open-with-default-app "Obrir amb la aplicació preestablerta"
:page/page-already-exists "¡La pàgina “{1}” ja existeix!"
:page/slide-view "Veure com diapositives"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Consell: pressiona "] [:code "f"] [:span.opacity-70 " per anar a pantalla completa"]])
:page/something-went-wrong "Alguna cosa ha sortit malament"
:page/step "Pas {1}"
:page/try "Intentar"

View File

@@ -130,8 +130,6 @@
:page/logseq-is-having-a-problem "Logseq má problém. Chcete-li se pokusit uvést jej zpět do funkčního stavu, vyzkoušejte prosím následující bezpečné kroky v uvedeném pořadí:"
:page/step "Krok {1}"
:page/try "Zkusit"
:page/slide-view "Zobrazit jjako snímky"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tip: stiskněte "] [:code "f"] [:span.opacity-70 " pro celou obrazovku"]])
:page/delete-confirmation "Jste si jisti, že chcete tuto stránku a její soubor odstranit?"
:page/open-in-finder "Otevřít v adresáři"
:page/open-with-default-app "Otevřít pomocí výchozí aplikace"

View File

@@ -244,8 +244,6 @@
:page/open-in-finder "Im Verzeichnis öffnen"
:page/open-with-default-app "Mit Standard-Anwendung öffnen"
:page/page-already-exists "Die Seite “{1}” existiert bereits!"
:page/slide-view "Als Slides anzeigen"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tipp: Drücken Sie "] [:code "f"] [:span.opacity-70 ", um zum Vollbild zu wechseln"]])
:page/something-went-wrong "Es ist etwas schief gelaufen."
:page/step "Schritt {1}"
:page/try "Versuch"

View File

@@ -137,8 +137,6 @@
:page/logseq-is-having-a-problem "Logseq is having a problem. To try to get it back to a working state, please try the following safe steps in order:"
:page/step "Step {1}"
:page/try "Try"
:page/slide-view "View as slides"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tip: press "] [:code "f"] [:span.opacity-70 " to go fullscreen"]])
:page/delete-confirmation "Are you sure you want to delete this page and its file?"
:page/db-delete-confirmation "Are you sure you want to delete this page?"
:page/open-in-finder "Open in directory"

View File

@@ -427,8 +427,6 @@
:page/open-in-finder "Abrir ubicación del archivo"
:page/open-with-default-app "Abrir con la aplicación predeterminada"
:page/page-already-exists "¡La página “{1}” ya existe!"
:page/slide-view "Ver como diapositivas"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Consejo: presiona "] [:code "f"] [:span.opacity-70 " para ir a pantalla completa"]])
:page/something-went-wrong "Algo malió sal"
:page/step "Paso {1}"
:page/try "Intentar"

View File

@@ -106,8 +106,6 @@
:page/logseq-is-having-a-problem "لاگ‌سیک دچار مشکلی شده است. برای بازگرداندن آن به حالت قابل استفاده لطفا گام‌های زیر را به ترتیب انجام دهید:"
:page/step "گام {1}"
:page/try "امتحان کنید"
:page/slide-view "نمایش به صورت اسلاید"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "نکته: دکمه "] [:code "f"] [:span.opacity-70 " را برای رفتن به حالت تمام صفحه بفشارید"]])
:page/delete-confirmation "مطمئنید که می‌خواید این برگه به همراه پرونده‌اش را پاک کنید؟"
:page/open-in-finder "باز کردن در پوشه"
:page/open-with-default-app "باز کردن با برنامه پیش‌فرض"

View File

@@ -504,7 +504,6 @@
:on-boarding/quick-tour-journal-page-title "📆 Page du journal quotidien"
:on-boarding/quick-tour-left-sidebar-desc "Ouvrir le panneau latéral gauche pour explorer des éléments du menu impor…"
:on-boarding/quick-tour-left-sidebar-title "👀 Panneau latéral gauche"
:page/slide-view-tip-go-fullscreen "(fn [] [[:span.opacity-70 \"Conseil: appuyer \"] [:code \"f\"] [:span.opacity-70 \" pour entrer en mode plein écran\"]])"
:bug-report/inspector-page-placeholder "Appuyer longuement ici pour coller si vous êtes sur mobile"
:bug-report/inspector-page-tip "Quelque chose ne va pas ? Pas de problème, cliquez pour retourner à…"
:bug-report/main-desc "Pouvez-vous nous aider en signalant un bogue ? Nous…"
@@ -632,7 +631,6 @@
:page/illegal-page-name "Nom de page interdit !"
:page/logseq-is-having-a-problem "Logseq a un problème. Pour essayer de le ravoir…"
:page/page-already-exists "Page “{1}” existe déjà !"
:page/slide-view "Visualiser en diapositives"
:page/something-went-wrong "Quelque chose s'est mal passé"
:page/step "Étape {1}"
:page/try "Essayer"

View File

@@ -125,8 +125,6 @@
:page/logseq-is-having-a-problem "Logseq mengalami masalah. Untuk mencoba mengembalikannya ke keadaan yang berfungsi, silakan coba langkah-langkah aman berikut ini secara berurutan:"
:page/step "Langkah {1}"
:page/try "Coba"
:page/slide-view "Tampilkan sebagai slide"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tip: tekan "] [:code "f"] [:span.opacity-70 " untuk masuk ke mode layar penuh"]])
:page/delete-confirmation "Apakah Anda yakin ingin menghapus halaman ini beserta berkasnya?"
:page/open-in-finder "Buka dalam direktori"
:page/open-with-default-app "Buka dengan aplikasi default"

View File

@@ -509,8 +509,6 @@
:page/illegal-page-name "Nome di pagina non ammesso!"
:page/logseq-is-having-a-problem "Logseq sta riscontrando un problema. Per tentare di farlo tornare a funzionare esegue i seguenti passi in ordine:"
:page/page-already-exists "La pagina “{1}” esiste già!"
:page/slide-view "Visualizza come diapositive"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Suggerimento: premi "] [:code "f"] [:span.opacity-70 " per andare in schermo intero"]])
:page/something-went-wrong "Qualcosa è andato storto"
:page/step "Passo {1}"
:page/try "Prova"

View File

@@ -134,8 +134,6 @@
:page/logseq-is-having-a-problem "Logseqになにか問題があります。きちんと動く状態に戻すため、以下の項目を上から順番に実行してください"
:page/step "ステップ{1}"
:page/try "試す"
:page/slide-view "スライドとして見る"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "お役立ち情報:"] [:code "f"] [:span.opacity-70 "を押すことでフルスクリーンにできます"]])
:page/delete-confirmation "このページとページのファイルを削除してもよいですか?"
:page/open-in-finder "ディレクトリで開く"
:page/open-with-default-app "既定のアプリで開く"

View File

@@ -385,6 +385,5 @@
:settings-page/preferred-pasting-file-hint "활성화하면, 인터넷으로부터 이미지를 붙여넣기할 때 이미지를 다운로드한 뒤 삽입합니다. 비활성화하면, 이미지의 링크를 붙여넣습니다."
:settings-page/auto-expand-block-refs "확대 시 블록 참조 펼치기"
:settings-page/auto-expand-block-refs-tip "이 설정은 블록을 확대할 때 블록 참조를 자동으로 펼칠지를 결정합니다."
:page/slide-view "슬라이드로 보기"
:settings-page/tab-keymap "단축키"
}

View File

@@ -624,7 +624,6 @@
:on-boarding/tour-whiteboard-btn-next "Neste"
:page/illegal-page-name "Ulovlig sidenavn!"
:page/page-already-exists "Siden “{1}” eksisterer fra før!"
:page/slide-view "Vis som lysbilder"
:page/whiteboard-to-journal-error "Whiteboard sider kan ikke bli navnet om til dagboktiter!"
:plugin/auto-check-for-updates "Se etter oppdateringer automatisk"
:plugin/installed-plugin "Innstallert utvidelse: {1}"
@@ -668,7 +667,6 @@
:export-save-to-file "Lagre til fil"
:export-transparent-background "Transparent bakgrunn"
:bug-report/clipboard-inspector-title "Utklippstavle datainspektør"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tips: trykk "] [:code "f"] [:span.opacity-70 " for fullskjerm"]])
:query/config-property-settings "Egenskapsinnstillinger for denne spørringen:"
:search-item/no-result "Ingen matchende resultat"
:settings-permission/start-granting "Gi tillatelse"

View File

@@ -534,8 +534,6 @@
:page/illegal-page-name "Nieprawidłowa nazwa strony!"
:page/logseq-is-having-a-problem "Logseq ma problem. Żeby przywrócić go do działającego stanu wykonaj po kolei następujące bezpieczne kroki:"
:page/page-already-exists "Strona “{1}” już istnieje!"
:page/slide-view "Pokaż jako slajdy"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Wskazówka: wciśnij "] [:code "f"] [:span.opacity-70 " żeby otworzyć na pełnym ekranie"]])
:page/something-went-wrong "Coś poszło nie tak"
:page/step "Step (1)"
:page/try "Spróbuj"

View File

@@ -130,8 +130,6 @@
:page/logseq-is-having-a-problem "Logseq está com um problema. Para tentar fazê-lo voltar a funcionar, siga as etapas seguras a seguir:"
:page/step "Etapa {1}"
:page/try "Tentar"
:page/slide-view "Visualizar como slides"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Dica: pressione "] [:code "f"] [:span.opacity-70 " para ir para tela cheia"]])
:page/delete-confirmation "Tem certeza de que deseja excluir esta página e seu arquivo?"
:page/open-in-finder "Abrir no diretório"
:page/open-with-default-app "Abrir com o aplicativo padrão"

View File

@@ -130,8 +130,6 @@
:page/logseq-is-having-a-problem "Logseq má problém. Skúste tieto bezpečné kroky, aby ste ho dostali do funkčného stavu:"
:page/step "Krok {1}"
:page/try "Vyskúšať"
:page/slide-view "Zobraziť ako prezentáciu"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "Tip: stlačte "] [:code "f"] [:span.opacity-70 " pre celú obrazovku"]])
:page/delete-confirmation "Naozaj chcete odstrániť túto stránku a jej súbor?"
:page/open-in-finder "Otvoriť v adresári"
:page/open-with-default-app "Otvoriť v predvolenej aplikácii"

View File

@@ -134,8 +134,6 @@
:page/logseq-is-having-a-problem "Logseq'te bir sorun var. Tekrar çalışır duruma getirmek için lütfen aşağıdaki güvenli adımları sırayla deneyin:"
:page/step "{1}. Adım"
:page/try "Deneyin"
:page/slide-view "Slayt olarak görüntüle"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "İpucu: Tam ekrana geçmek için "] [:code "f"] [:span.opacity-70 " tuşuna basın"]])
:page/delete-confirmation "Bu sayfayı ve dosyasını silmek istediğinizden emin misiniz?"
:page/open-in-finder "Dizini aç"
:page/open-with-default-app "Varsayılan uygulamayla aç"

View File

@@ -79,8 +79,6 @@
:help/title-terms "条款"
:linked-references/filter-search "在链接的页面内搜索"
:page/copy-page-url "复制页面 URL"
:page/slide-view "幻灯片视图"
:page/slide-view-tip-go-fullscreen (fn [] [[:span.opacity-70 "小技巧: 按 "] [:code "f"] [:span.opacity-70 " 进入全屏"]])
:plugin/contribute "✨编写和提交新插件"
:right-side-bar/show-journals "显示日记"
:select/default-prompt "请选择"

View File

@@ -7,8 +7,6 @@
@import "packages/ui/src/index.css"; /* Tailwind base imported here */
@import "resources/css/shui.css";
@import "inter-ui/inter.css";
@import "reveal.js/dist/reveal.css";
@import "reveal.js/dist/theme/black.css";
@import "photoswipe/dist/photoswipe.css";
@import "shepherd.js/dist/css/shepherd.css";
@import "packages/amplify/dist/amplify.css";