From 61d5aa3605163524cc33e8cc8dce9ed19f2da634 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Wed, 14 May 2025 17:06:54 +0800 Subject: [PATCH 01/67] Rename :logseq.property/parent to :logseq.property.class/extends --- deps/db/src/logseq/db/frontend/class.cljs | 16 ++++++------- deps/db/src/logseq/db/frontend/db.cljs | 4 ++-- deps/db/src/logseq/db/frontend/property.cljs | 21 ++++++++-------- deps/db/src/logseq/db/frontend/rules.cljc | 11 +++++++-- deps/db/src/logseq/db/sqlite/build.cljs | 2 +- .../db/src/logseq/db/sqlite/create_graph.cljs | 4 ++-- deps/db/src/logseq/db/sqlite/export.cljs | 18 +++++++------- deps/db/src/logseq/db/sqlite/util.cljs | 4 ++-- .../logseq/db/sqlite/create_graph_test.cljs | 4 ++-- deps/db/test/logseq/db_test.cljs | 4 ++-- .../src/logseq/graph_parser/exporter.cljs | 18 +++++++------- .../logseq/graph_parser/exporter_test.cljs | 8 +++---- .../src/logseq/outliner/property.cljs | 8 +++---- .../src/logseq/outliner/validate.cljs | 16 ++++++------- .../test/logseq/outliner/validate_test.cljs | 2 +- .../create_graph_with_schema_org.cljs | 8 +++---- src/main/frontend/components/cmdk/core.cljs | 2 +- src/main/frontend/components/container.cljs | 2 +- src/main/frontend/components/editor.cljs | 3 ++- src/main/frontend/components/property.cljs | 2 +- .../frontend/components/property/config.cljs | 16 ++++++------- .../frontend/components/property/value.cljs | 24 +++++++++---------- src/main/frontend/worker/db/migrate.cljs | 4 ++-- src/main/frontend/worker/handler/page.cljs | 2 +- .../worker/handler/page/db_based/page.cljs | 8 +++---- src/rtc_e2e_test/example.cljs | 2 +- src/test/frontend/db/db_based_model_test.cljs | 6 ++--- .../handler/page/db_based/page_test.cljs | 4 ++-- .../worker/rtc/gen_client_op_test.cljs | 20 ++++++++-------- 29 files changed, 126 insertions(+), 117 deletions(-) diff --git a/deps/db/src/logseq/db/frontend/class.cljs b/deps/db/src/logseq/db/frontend/class.cljs index 0c6b6edc2a..1e03552fbc 100644 --- a/deps/db/src/logseq/db/frontend/class.cljs +++ b/deps/db/src/logseq/db/frontend/class.cljs @@ -26,12 +26,12 @@ :logseq.class/Journal {:title "Journal" - :properties {:logseq.property/parent :logseq.class/Page + :properties {:logseq.property.class/extends :logseq.class/Page :logseq.property.journal/title-format "MMM do, yyyy"}} :logseq.class/Whiteboard {:title "Whiteboard" - :properties {:logseq.property/parent :logseq.class/Page}} + :properties {:logseq.property.class/extends :logseq.class/Page}} :logseq.class/Task {:title "Task" @@ -49,7 +49,7 @@ :logseq.class/Cards {:title "Cards" :properties {:logseq.property/icon {:type :tabler-icon :id "search"} - :logseq.property/parent :logseq.class/Query}} + :logseq.property.class/extends :logseq.class/Query}} :logseq.class/Asset {:title "Asset" @@ -94,7 +94,7 @@ "Children of :logseq.class/Page" (set (keep (fn [[class-ident m]] - (when (= (get-in m [:properties :logseq.property/parent]) :logseq.class/Page) class-ident)) + (when (= (get-in m [:properties :logseq.property.class/extends]) :logseq.class/Page) class-ident)) built-in-classes))) (def page-classes @@ -120,13 +120,13 @@ (defn get-structured-children [db eid] (->> - (d/q '[:find [?children ...] - :in $ ?parent % + (d/q '[:find [?c ...] + :in $ ?class-extends % :where - (parent ?parent ?children)] + (class-extends ?p ?c)] db eid - (:parent rules/rules)) + (:class-extends rules/rules)) (remove #{eid}))) ;; Helper fns diff --git a/deps/db/src/logseq/db/frontend/db.cljs b/deps/db/src/logseq/db/frontend/db.cljs index 5d83ec31f0..239a779e99 100644 --- a/deps/db/src/logseq/db/frontend/db.cljs +++ b/deps/db/src/logseq/db/frontend/db.cljs @@ -50,14 +50,14 @@ (defn get-page-parents [node & {:keys [node-class?]}] - (when-let [parent (:logseq.property/parent node)] + (when-let [parent (:logseq.property.class/extends node)] (loop [current-parent parent parents' []] (if (and current-parent (if node-class? (entity-util/class? current-parent) true) (not (contains? parents' current-parent))) - (recur (:logseq.property/parent current-parent) + (recur (:logseq.property.class/extends current-parent) (conj parents' current-parent)) (vec (reverse parents')))))) diff --git a/deps/db/src/logseq/db/frontend/property.cljs b/deps/db/src/logseq/db/frontend/property.cljs index 6909b22895..88bd3469a5 100644 --- a/deps/db/src/logseq/db/frontend/property.cljs +++ b/deps/db/src/logseq/db/frontend/property.cljs @@ -6,8 +6,8 @@ [flatland.ordered.map :refer [ordered-map]] [logseq.common.defkeywords :refer [defkeywords]] [logseq.common.uuid :as common-uuid] - [logseq.db.frontend.property.type :as db-property-type] - [logseq.db.frontend.db-ident :as db-ident])) + [logseq.db.frontend.db-ident :as db-ident] + [logseq.db.frontend.property.type :as db-property-type])) ;; Main property vars ;; ================== @@ -148,13 +148,6 @@ :hide? true :view-context :block} :queryable? true} - :logseq.property/parent {:title "Parent" - :schema {:type :node - :public? true - :view-context :page} - :queryable? true - :properties - {:logseq.property/description "Provides parent-child relationships between nodes. For tags this enables inheritance and for pages this enables namespaces."}} :logseq.property/default-value {:title "Default value" :schema {:type :entity :public? false @@ -165,6 +158,14 @@ :public? false :hide? true :view-context :property}} + ;; TODO: support cardinality many for extends + :logseq.property.class/extends {:title "Extends" + :schema {:type :class + :public? true + :view-context :class} + :queryable? true + :properties + {:logseq.property/description "This enables tags to inherit properties from other tags"}} :logseq.property.class/properties {:title "Tag Properties" :schema {:type :property :cardinality :many @@ -732,4 +733,4 @@ "Given a built-in's db-ident, determine if its property value is a ref" [db-ident] (contains? db-property-type/value-ref-property-types - (get-in built-in-properties [db-ident :schema :type]))) \ No newline at end of file + (get-in built-in-properties [db-ident :schema :type]))) diff --git a/deps/db/src/logseq/db/frontend/rules.cljc b/deps/db/src/logseq/db/frontend/rules.cljc index 11022e7031..d70b2d8aaa 100644 --- a/deps/db/src/logseq/db/frontend/rules.cljc +++ b/deps/db/src/logseq/db/frontend/rules.cljc @@ -8,11 +8,18 @@ ;; rule "parent" is optimized for parent node -> child node nesting queries {:parent '[[(parent ?p ?c) - [?c :logseq.property/parent ?p]] + [?c :block/parent ?p]] [(parent ?p ?c) - [?t :logseq.property/parent ?p] + [?t :block/parent ?p] (parent ?t ?c)]] + :class-extends + '[[(class-extends ?p ?c) + [?c :logseq.property.class/extends ?p]] + [(class-extends ?p ?c) + [?t :logseq.property.class/extends ?p] + (class-extends ?t ?c)]] + :alias '[[(alias ?e2 ?e1) [?e2 :block/alias ?e1]] diff --git a/deps/db/src/logseq/db/sqlite/build.cljs b/deps/db/src/logseq/db/sqlite/build.cljs index 1715b26890..25b60e9e0f 100644 --- a/deps/db/src/logseq/db/sqlite/build.cljs +++ b/deps/db/src/logseq/db/sqlite/build.cljs @@ -281,7 +281,7 @@ (->block-properties (merge props (db-property-build/build-properties-with-ref-values pvalue-tx-m)) uuid-maps all-idents options)) (when class-parent - {:logseq.property/parent + {:logseq.property.class/extends (or (class-db-ids class-parent) (if (db-malli-schema/class? class-parent) class-parent diff --git a/deps/db/src/logseq/db/sqlite/create_graph.cljs b/deps/db/src/logseq/db/sqlite/create_graph.cljs index 08390987c4..7e603363bf 100644 --- a/deps/db/src/logseq/db/sqlite/create_graph.cljs +++ b/deps/db/src/logseq/db/sqlite/create_graph.cljs @@ -128,7 +128,7 @@ :properties (filter entity-util/property? properties-tx)})) (def built-in-pages-names - #{"Contents"}) + #{"Contents" "Library"}) (defn- validate-tx-for-duplicate-idents [tx] (when-let [conflicting-idents @@ -226,7 +226,7 @@ (map mark-block-as-built-in)) hidden-pages (concat (build-initial-views) (build-favorites-page)) ;; These classes bootstrap our tags and properties as they depend on each other e.g. - ;; Root <-> Tag, classes-tx depends on logseq.property/parent, properties-tx depends on Property + ;; Root <-> Tag, classes-tx depends on logseq.property.class/extends, properties-tx depends on Property bootstrap-class? (fn [c] (contains? #{:logseq.class/Root :logseq.class/Property :logseq.class/Tag :logseq.class/Template} (:db/ident c))) bootstrap-classes (filter bootstrap-class? default-classes) bootstrap-class-ids (map #(select-keys % [:db/ident :block/uuid]) bootstrap-classes) diff --git a/deps/db/src/logseq/db/sqlite/export.cljs b/deps/db/src/logseq/db/sqlite/export.cljs index b6b80447bc..c75a93b328 100644 --- a/deps/db/src/logseq/db/sqlite/export.cljs +++ b/deps/db/src/logseq/db/sqlite/export.cljs @@ -7,16 +7,16 @@ [datascript.core :as d] [datascript.impl.entity :as de] [logseq.db :as ldb] + [logseq.db.common.entity-plus :as entity-plus] [logseq.db.frontend.class :as db-class] [logseq.db.frontend.content :as db-content] [logseq.db.frontend.db :as db-db] - [logseq.db.common.entity-plus :as entity-plus] [logseq.db.frontend.entity-util :as entity-util] [logseq.db.frontend.property :as db-property] - [logseq.db.sqlite.build :as sqlite-build] - [medley.core :as medley] [logseq.db.frontend.property.type :as db-property-type] - [logseq.db.frontend.schema :as db-schema])) + [logseq.db.frontend.schema :as db-schema] + [logseq.db.sqlite.build :as sqlite-build] + [medley.core :as medley])) ;; Export fns ;; ========== @@ -166,7 +166,7 @@ (map (fn [[ent build-property]] (let [ent-properties (apply dissoc (db-property/properties ent) ;; For overlapping class properties, these would be built in :classes - :logseq.property/parent :logseq.property.class/properties + :logseq.property.class/extends :logseq.property.class/properties (into db-property/schema-properties db-property/public-db-attribute-properties))] [(:db/ident ent) (cond-> build-property @@ -191,10 +191,10 @@ (assoc :block/alias (set (map #(vector :block/uuid (:block/uuid %)) (:block/alias class-ent)))) ;; It's caller's responsibility to ensure parent is included in final export (and (not shallow-copy?) - (:logseq.property/parent class-ent) - (not= :logseq.class/Root (:db/ident (:logseq.property/parent class-ent)))) + (:logseq.property.class/extends class-ent) + (not= :logseq.class/Root (:db/ident (:logseq.property.class/extends class-ent)))) (assoc :build/class-parent - (:db/ident (:logseq.property/parent class-ent))))) + (:db/ident (:logseq.property.class/extends class-ent))))) (defn- build-node-classes [db build-block block-tags properties] @@ -588,7 +588,7 @@ classes (->> class-ents (map (fn [ent] - (let [ent-properties (apply dissoc (db-property/properties ent) :logseq.property/parent db-property/public-db-attribute-properties)] + (let [ent-properties (apply dissoc (db-property/properties ent) :logseq.property.class/extends db-property/public-db-attribute-properties)] (vector (:db/ident ent) (cond-> (build-export-class ent options) (seq ent-properties) diff --git a/deps/db/src/logseq/db/sqlite/util.cljs b/deps/db/src/logseq/db/sqlite/util.cljs index 74ab902c00..951b26769b 100644 --- a/deps/db/src/logseq/db/sqlite/util.cljs +++ b/deps/db/src/logseq/db/sqlite/util.cljs @@ -99,8 +99,8 @@ (cond-> (merge block {:block/tags (set (conj (:block/tags block) :logseq.class/Tag))}) (and (not= (:db/ident block) :logseq.class/Root) - (nil? (:logseq.property/parent block))) - (assoc :logseq.property/parent :logseq.class/Root)))) + (nil? (:logseq.property.class/extends block))) + (assoc :logseq.property.class/extends :logseq.class/Root)))) (defn build-new-page "Builds a basic page to be transacted. A minimal version of gp-block/page-name->map" diff --git a/deps/db/test/logseq/db/sqlite/create_graph_test.cljs b/deps/db/test/logseq/db/sqlite/create_graph_test.cljs index 0a99838cc1..d3b69f888e 100644 --- a/deps/db/test/logseq/db/sqlite/create_graph_test.cljs +++ b/deps/db/test/logseq/db/sqlite/create_graph_test.cljs @@ -84,9 +84,9 @@ (is (= (count (dissoc db-class/built-in-classes :logseq.class/Root)) (count (->> (d/datoms @conn :avet :block/tags :logseq.class/Tag) (map #(d/entity @conn (:e %))) - (mapcat :logseq.property/_parent) + (mapcat :logseq.property.class/_extends) set))) - "Reverse lookup of :logseq.property/parent correctly fetches number of child classes"))) + "Reverse lookup of :logseq.property.class/extends correctly fetches number of child classes"))) (deftest new-graph-initializes-default-properties-correctly (let [conn (db-test/create-conn)] diff --git a/deps/db/test/logseq/db_test.cljs b/deps/db/test/logseq/db_test.cljs index 9e6a7ddd97..c53bf1db41 100644 --- a/deps/db/test/logseq/db_test.cljs +++ b/deps/db/test/logseq/db_test.cljs @@ -37,12 +37,12 @@ :block/title "y" :block/name "y" :block/uuid #uuid "7008db08-ba0c-4aa9-afc6-7e4783e40a99" - :logseq.property/parent [:block/uuid #uuid "6c353967-f79b-4785-b804-a39b81d72461"]} + :logseq.property.class/extends [:block/uuid #uuid "6c353967-f79b-4785-b804-a39b81d72461"]} {:block/tags :logseq.class/Tag :block/title "z" :block/name "z" :block/uuid #uuid "d95f2912-a7af-41b9-8ed5-28861f7fc0be" - :logseq.property/parent [:block/uuid #uuid "7008db08-ba0c-4aa9-afc6-7e4783e40a99"]}]) + :logseq.property.class/extends [:block/uuid #uuid "7008db08-ba0c-4aa9-afc6-7e4783e40a99"]}]) (deftest get-page-parents (let [conn (db-test/create-conn)] diff --git a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs index f221ce4c93..a527e17316 100644 --- a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs @@ -17,6 +17,7 @@ [logseq.common.uuid :as common-uuid] [logseq.db :as ldb] [logseq.db.common.order :as db-order] + [logseq.db.common.property-util :as db-property-util] [logseq.db.frontend.class :as db-class] [logseq.db.frontend.content :as db-content] [logseq.db.frontend.db-ident :as db-ident] @@ -29,8 +30,7 @@ [logseq.graph-parser.block :as gp-block] [logseq.graph-parser.extract :as extract] [logseq.graph-parser.property :as gp-property] - [promesa.core :as p] - [logseq.db.common.property-util :as db-property-util])) + [promesa.core :as p])) (defn- add-missing-timestamps "Add updated-at or created-at timestamps if they doesn't exist" @@ -62,7 +62,7 @@ (defn- replace-namespace-with-parent [block page-names-to-uuids] (if (:block/namespace block) (-> (dissoc block :block/namespace) - (assoc :logseq.property/parent + (assoc :logseq.property.class/extends {:block/uuid (get-page-uuid page-names-to-uuids (get-in block [:block/namespace :block/name]) {:block block :block/namespace (:block/namespace block)})})) @@ -735,7 +735,7 @@ (update :block dissoc :block/properties :block/properties-text-values :block/properties-order :block/invalid-properties))) (defn- handle-page-properties - "Adds page properties including special handling for :logseq.property/parent" + "Adds page properties including special handling for :logseq.property.class/extends" [{:block/keys [properties] :as block*} db {:keys [page-names-to-uuids classes-tx]} refs {:keys [user-options log-fn import-state] :as options}] (let [{:keys [block properties-tx]} (handle-page-and-block-properties block* db page-names-to-uuids refs options) @@ -748,7 +748,7 @@ class-m (find-or-create-class db ((some-fn ::original-title :block/title) block) (:all-idents import-state) block) class-m' (-> block (merge class-m) - (assoc :logseq.property/parent + (assoc :logseq.property.class/extends (let [new-class (first parent-classes-from-properties) class-m (find-or-create-class db new-class (:all-idents import-state)) class-m' (merge class-m @@ -921,9 +921,9 @@ "Like ldb/get-page-parents but using all-existing-page-uuids" [node all-existing-page-uuids] (let [get-parent (fn get-parent [n] - (when (:block/uuid (:logseq.property/parent n)) - (or (get all-existing-page-uuids (:block/uuid (:logseq.property/parent n))) - (throw (ex-info (str "No parent page found for " (pr-str (:block/uuid (:logseq.property/parent n)))) + (when (:block/uuid (:logseq.property.class/extends n)) + (or (get all-existing-page-uuids (:block/uuid (:logseq.property.class/extends n))) + (throw (ex-info (str "No parent page found for " (pr-str (:block/uuid (:logseq.property.class/extends n)))) {:node n})))))] (when-let [parent (get-parent node)] (loop [current-parent parent @@ -959,7 +959,7 @@ (let [;; These attributes are not allowed to be transacted because they must not change across files disallowed-attributes [:block/name :block/uuid :block/format :block/title :block/journal-day :block/created-at :block/updated-at] - allowed-attributes (into [:block/tags :block/alias :logseq.property/parent :db/ident] + allowed-attributes (into [:block/tags :block/alias :logseq.property.class/extends :db/ident] (keep #(when (db-malli-schema/user-property? (key %)) (key %)) m)) block-changes (select-keys m allowed-attributes)] diff --git a/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs b/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs index 7b1ba29426..68dad7b52b 100644 --- a/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs +++ b/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs @@ -9,8 +9,8 @@ [logseq.common.graph :as common-graph] [logseq.common.util.date-time :as date-time-util] [logseq.db :as ldb] - [logseq.db.frontend.content :as db-content] [logseq.db.common.entity-plus :as entity-plus] + [logseq.db.frontend.content :as db-content] [logseq.db.frontend.malli-schema :as db-malli-schema] [logseq.db.frontend.rules :as rules] [logseq.db.frontend.validate :as db-validate] @@ -326,7 +326,7 @@ (:block/alias (db-test/readable-properties (db-test/find-page-by-title @conn "chat-gpt")))) "alias set correctly") (is (= ["y"] - (->> (d/q '[:find [?b ...] :where [?b :block/title "y"] [?b :logseq.property/parent]] + (->> (d/q '[:find [?b ...] :where [?b :block/title "y"] [?b :logseq.property.class/extends]] @conn) first (d/entity @conn) @@ -675,9 +675,9 @@ set)) "All classes are correctly defined by :type") - (is (= "CreativeWork" (get-in (d/entity @conn :user.class/Movie) [:logseq.property/parent :block/title])) + (is (= "CreativeWork" (get-in (d/entity @conn :user.class/Movie) [:logseq.property.class/extends :block/title])) "Existing page correctly set as class parent") - (is (= "Thing" (get-in (d/entity @conn :user.class/CreativeWork) [:logseq.property/parent :block/title])) + (is (= "Thing" (get-in (d/entity @conn :user.class/CreativeWork) [:logseq.property.class/extends :block/title])) "New page correctly set as class parent"))) (deftest-async export-files-with-property-pages-disabled diff --git a/deps/outliner/src/logseq/outliner/property.cljs b/deps/outliner/src/logseq/outliner/property.cljs index bb0b25b616..53193142ce 100644 --- a/deps/outliner/src/logseq/outliner/property.cljs +++ b/deps/outliner/src/logseq/outliner/property.cljs @@ -310,7 +310,7 @@ _ (when (= property-id :block/tags) (outliner-validate/validate-tags-property @conn block-eids v)) property (d/entity @conn property-id) - _ (when (= (:db/ident property) :logseq.property/parent) + _ (when (= (:db/ident property) :logseq.property.class/extends) (outliner-validate/validate-parent-property (if (number? v) (d/entity @conn v) v) (map #(d/entity @conn %) block-eids))) @@ -355,9 +355,9 @@ property-id :logseq.property/empty-placeholder}] {:outliner-op :save-block}) - (and (ldb/class? block) (= property-id :logseq.property/parent)) + (and (ldb/class? block) (= property-id :logseq.property.class/extends)) (ldb/transact! conn - [[:db/add (:db/id block) :logseq.property/parent :logseq.class/Root]] + [[:db/add (:db/id block) :logseq.property.class/extends :logseq.class/Root]] {:outliner-op :save-block}) (contains? db-property/db-attribute-properties property-id) @@ -383,7 +383,7 @@ db-attribute? (some? (db-schema/schema property-id))] (when (= property-id :block/tags) (outliner-validate/validate-tags-property @conn [block-eid] v)) - (when (= property-id :logseq.property/parent) + (when (= property-id :logseq.property.class/extends) (outliner-validate/validate-parent-property v [block])) (cond db-attribute? diff --git a/deps/outliner/src/logseq/outliner/validate.cljs b/deps/outliner/src/logseq/outliner/validate.cljs index cc0e2c3f35..de4a0f78f1 100644 --- a/deps/outliner/src/logseq/outliner/validate.cljs +++ b/deps/outliner/src/logseq/outliner/validate.cljs @@ -50,11 +50,11 @@ :in $ ?eid ?type ?title :where [?b :block/title ?title] - [?b :logseq.property/parent ?type] + [?b :logseq.property.class/extends ?type] [(not= ?b ?eid)]] db (:db/id entity) - (:db/id (:logseq.property/parent entity)) + (:db/id (:logseq.property.class/extends entity)) new-title))] (throw (ex-info "Duplicate page by parent" {:type :notification @@ -80,7 +80,7 @@ [?b :block/tags ?tag-id] [(missing? $ ?b :logseq.property/built-in?)] [(not= ?b ?eid)]] - (:logseq.property/parent entity) + (:logseq.property.class/extends entity) '[:find [?b ...] :in $ ?eid ?title [?tag-id ...] :where @@ -88,8 +88,8 @@ [?b :block/tags ?tag-id] [(not= ?b ?eid)] ;; same parent - [?b :logseq.property/parent ?bp] - [?eid :logseq.property/parent ?ep] + [?b :logseq.property.class/extends ?bp] + [?eid :logseq.property.class/extends ?ep] [(= ?bp ?ep)]] :else '[:find [?b ...] @@ -116,13 +116,13 @@ (map (fn [id] (str "#" (:block/title (d/entity db id)))) common-tag-ids))) :type :warning}}))))) - (:logseq.property/parent entity) + (:logseq.property.class/extends entity) (validate-unique-by-parent-and-name db entity new-title))) (defn ^:api validate-unique-by-name-tag-and-block-type "Validates uniqueness of nodes for the following cases: - Page names are unique for a tag e.g. their can be Apple #Company and Apple #Fruit - - Page names are unique for a :logseq.property/parent" + - Page names are unique for a :logseq.property.class/extends" [db new-title entity] (when (entity-util/page? entity) (validate-unique-for-page db new-title entity))) @@ -220,4 +220,4 @@ "Validates deleting a property value from :block/tags for given blocks" [db block-eids v] (disallow-tagging-a-built-in-entity db block-eids {:delete? true}) - (disallow-node-cant-tag-with-private-tags db block-eids v {:delete? true})) \ No newline at end of file + (disallow-node-cant-tag-with-private-tags db block-eids v {:delete? true})) diff --git a/deps/outliner/test/logseq/outliner/validate_test.cljs b/deps/outliner/test/logseq/outliner/validate_test.cljs index ae4fd92ceb..630dd15f8c 100644 --- a/deps/outliner/test/logseq/outliner/validate_test.cljs +++ b/deps/outliner/test/logseq/outliner/validate_test.cljs @@ -168,7 +168,7 @@ (testing "Validate property relationships" (let [parent-child-pairs (d/q '[:find ?parent ?child - :where [?child :logseq.property/parent ?parent]] @conn)] + :where [?child :logseq.property.class/extends ?parent]] @conn)] (doseq [[parent-id child-id] parent-child-pairs] (let [parent (d/entity @conn parent-id) child (d/entity @conn child-id)] diff --git a/scripts/src/logseq/tasks/db_graph/create_graph_with_schema_org.cljs b/scripts/src/logseq/tasks/db_graph/create_graph_with_schema_org.cljs index eeeb1f0988..a6c715c67b 100644 --- a/scripts/src/logseq/tasks/db_graph/create_graph_with_schema_org.cljs +++ b/scripts/src/logseq/tasks/db_graph/create_graph_with_schema_org.cljs @@ -365,14 +365,14 @@ (d/q '[:find [(pull ?b [* {:logseq.property.class/properties [:block/title]} {:logseq.property/classes [:block/title]} - {:logseq.property/parent [:block/title]} + {:logseq.property.class/extends [:block/title]} {:block/tags [:block/title]} {:block/refs [:block/title]}]) ...] :in $ :where [?b :db/ident ?ident]] db)) top-level-properties [:logseq.property/type :logseq.property.class/properties :logseq.property/classes - :logseq.property/parent :block/tags] + :logseq.property.class/extends :block/tags] debug-attributes (into [:block/name :block/title :db/cardinality :db/ident :block/refs] top-level-properties)] (fs/writeFileSync "schema-org.edn" @@ -389,8 +389,8 @@ v))))) (seq (:logseq.property.class/properties m)) (update :logseq.property.class/properties #(set (map :block/title %))) - (some? (:logseq.property/parent m)) - (update :logseq.property/parent :block/title) + (some? (:logseq.property.class/extends m)) + (update :logseq.property.class/extends :block/title) (seq (:logseq.property/classes m)) (update :logseq.property/classes #(set (map :block/title %))) (seq (:block/tags m)) diff --git a/src/main/frontend/components/cmdk/core.cljs b/src/main/frontend/components/cmdk/core.cljs index b92d6900a0..680e8d41b2 100644 --- a/src/main/frontend/components/cmdk/core.cljs +++ b/src/main/frontend/components/cmdk/core.cljs @@ -115,7 +115,7 @@ (or (let [page (some-> (text/get-namespace-last-part input) string/trim db/get-page) - parent-title (:block/title (:logseq.property/parent page)) + parent-title (:block/title (:block/parent page)) namespace? (string/includes? input "/")] (and page (or (not namespace?) diff --git a/src/main/frontend/components/container.cljs b/src/main/frontend/components/container.cljs index c4cbc197e0..2e59336229 100644 --- a/src/main/frontend/components/container.cljs +++ b/src/main/frontend/components/container.cljs @@ -155,7 +155,7 @@ (block/inline-text :markdown (:block/title page)) untitled? (t :untitled) :else (let [title' (pdf-utils/fix-local-asset-pagename title) - parent (:logseq.property/parent page)] + parent (:block/parent page)] (if (and parent (not (ldb/class? page))) (str (:block/title parent) ns-util/parent-char title') title')))] diff --git a/src/main/frontend/components/editor.cljs b/src/main/frontend/components/editor.cljs index 5f34ad8b92..c3f6cda2ba 100644 --- a/src/main/frontend/components/editor.cljs +++ b/src/main/frontend/components/editor.cljs @@ -123,7 +123,8 @@ (state/clear-editor-action!) (p/let [page (db/get-page chosen-item) _ (when-not page (page-handler/> [(when (and (not (contains? #{:logseq.property/parent :logseq.property.class/properties} (:db/ident property))) + group' (->> [(when (and (not (contains? #{:logseq.property.class/extends :logseq.property.class/properties} (:db/ident property))) (contains? #{:default :number :date :checkbox :node} property-type) (not (and (= :default property-type) @@ -673,13 +673,13 @@ :disabled? config/publishing? :submenu-content (fn [ops] (ui-position-sub-pane property (assoc ops :ui-position position)))}))) - (when (not (contains? #{:logseq.property/parent :logseq.property.class/properties} (:db/ident property))) + (when (not (contains? #{:logseq.property.class/extends :logseq.property.class/properties} (:db/ident property))) (dropdown-editor-menuitem {:icon :eye-off :title "Hide by default" :toggle-checked? (boolean (:logseq.property/hide? property)) :disabled? config/publishing? :on-toggle-checked-change #(db-property-handler/set-block-property! (:db/id property) :logseq.property/hide? %)})) - (when (not (contains? #{:logseq.property/parent :logseq.property.class/properties} (:db/ident property))) + (when (not (contains? #{:logseq.property.class/extends :logseq.property.class/properties} (:db/ident property))) (dropdown-editor-menuitem {:icon :eye-off :title "Hide empty value" :toggle-checked? (boolean (:logseq.property/hide-empty-value property)) @@ -727,7 +727,7 @@ (or class-schema? (not (and (ldb/class? owner-block) - (contains? #{:logseq.property/parent} (:db/ident property)))))) + (contains? #{:logseq.property.class/extends} (:db/ident property)))))) (dropdown-editor-menuitem {:id :delete-property :icon :x :title (if class-schema? "Delete property from tag" "Delete property from node") diff --git a/src/main/frontend/components/property/value.cljs b/src/main/frontend/components/property/value.cljs index 97d9baf0df..66503aec55 100644 --- a/src/main/frontend/components/property/value.cljs +++ b/src/main/frontend/components/property/value.cljs @@ -582,7 +582,7 @@ page-entity (ldb/get-case-page (db/get-db) page) id (:db/id page-entity) class? (or (= :block/tags (:db/ident property)) - (and (= :logseq.property/parent (:db/ident property)) + (and (= :logseq.property.class/extends (:db/ident property)) (ldb/class? block))) ;; Note: property and other types shouldn't be converted to class page? (ldb/internal-page? page-entity)] @@ -630,7 +630,7 @@ items' (->> (if (and (seq selected-choices) (not multiple-choices?) - (not (and (ldb/class? block) (= (:db/ident property) :logseq.property/parent))) + (not (and (ldb/class? block) (= (:db/ident property) :logseq.property.class/extends))) (not= (:db/ident property) :logseq.property.view/type)) (concat items [{:value clear-value @@ -685,14 +685,14 @@ (if (every? entity-map? v) (map :db/id v) [(:db/id v)]))) - parent-property? (= (:db/ident property) :logseq.property/parent) - children-pages (when parent-property? (model/get-structured-children repo (:db/id block))) + extends-property? (= (:db/ident property) :logseq.property.class/extends) + children-pages (when extends-property? (model/get-structured-children repo (:db/id block))) property-type (:logseq.property/type property) get-all-classes-f (fn [] (model/get-all-classes repo {:except-root-class? true :except-private-tags? (not (contains? #{:logseq.property/template-applied-to} (:db/ident property)))})) nodes (cond - parent-property? + extends-property? (let [;; Disallows cyclic hierarchies exclude-ids (-> (set (map (fn [id] (:block/uuid (db/entity id))) children-pages)) (conj (:block/uuid block))) ; break cycle @@ -787,7 +787,7 @@ "Set alias" :else (str "Set " (:block/title property))) - :show-new-when-not-exact-match? (if (or (and parent-property? (contains? (set children-pages) (:db/id block))) + :show-new-when-not-exact-match? (if (or (and extends-property? (contains? (set children-pages) (:db/id block))) ;; Don't allow creating private tags (and (= :block/tags (:db/ident property)) (seq (set/intersection (set (map :db/ident classes')) @@ -868,20 +868,20 @@ non-root-classes (cond-> (remove (fn [c] (= (:db/ident c) :logseq.class/Root)) classes) class? (conj (frontend.db/entity :logseq.class/Tag))) - parent-property? (= (:db/ident property) :logseq.property/parent)] + extends-property? (= (:db/ident property) :logseq.property.class/extends)] ;; effect runs once (hooks/use-effect! (fn [] (cond - (and parent-property? (not (ldb/class? block)) + (and extends-property? (not (ldb/class? block)) (ldb/internal-page? block)) (p/let [result (db-async/> result (remove ldb/built-in?))] (set-result-and-initial-choices! result')) - parent-property? + extends-property? nil (seq non-root-classes) @@ -1491,15 +1491,15 @@ (multiple-values block property opts) :else - (let [parent? (= property-ident :logseq.property/parent) + (let [extends? (= property-ident :logseq.property.class/extends) value-cp (property-scalar-value block property v (merge opts {:editor-id editor-id :dom-id dom-id})) - page-ancestors (when parent? + page-ancestors (when extends? (let [ancestor-pages (loop [parents [block]] - (if-let [parent (:logseq.property/parent (last parents))] + (if-let [parent (:logseq.property.class/extends (last parents))] (when-not (contains? (set parents) parent) (recur (conj parents parent))) parents))] diff --git a/src/main/frontend/worker/db/migrate.cljs b/src/main/frontend/worker/db/migrate.cljs index becefecf72..d6de1f51ad 100644 --- a/src/main/frontend/worker/db/migrate.cljs +++ b/src/main/frontend/worker/db/migrate.cljs @@ -358,7 +358,7 @@ (fn [id] (let [value (:db/id (:class/parent (d/entity db id)))] [[:db/retract id :class/parent] - [:db/add id :logseq.property/parent value]])))))))) + [:db/add id :logseq.property.class/extends value]])))))))) (defn- deprecate-class-schema-properties [conn _search-db] @@ -884,7 +884,7 @@ [12 {:fix update-block-type-many->one}] [13 {:classes [:logseq.class/Journal] :properties [:logseq.property.journal/title-format]}] - [14 {:properties [:logseq.property/parent] + [14 {:properties [:logseq.property.class/extends] :fix deprecate-class-parent}] [15 {:properties [:logseq.property.class/properties] :fix deprecate-class-schema-properties}] diff --git a/src/main/frontend/worker/handler/page.cljs b/src/main/frontend/worker/handler/page.cljs index e9516bdb10..e54a1c1a79 100644 --- a/src/main/frontend/worker/handler/page.cljs +++ b/src/main/frontend/worker/handler/page.cljs @@ -98,7 +98,7 @@ (->> (filter (fn [p] (ldb/class? p)) (:logseq.property/_parent page)) (map (fn [p] {:db/id (:db/id p) - :logseq.property/parent :logseq.class/Root})))) + :logseq.property.class/extends :logseq.class/Root})))) tx-data (concat truncate-blocks-tx-data restore-class-parent-tx delete-page-tx diff --git a/src/main/frontend/worker/handler/page/db_based/page.cljs b/src/main/frontend/worker/handler/page/db_based/page.cljs index 7b11e49024..d7287f64f1 100644 --- a/src/main/frontend/worker/handler/page/db_based/page.cljs +++ b/src/main/frontend/worker/handler/page/db_based/page.cljs @@ -92,7 +92,7 @@ '[:find [?b ...] :in $ ?parent-name ?child-name :where - [?b :logseq.property/parent ?p] + [?b :logseq.property.class/extends ?p] [?b :block/name ?child-name] [?p :block/name ?parent-name]] db @@ -148,7 +148,7 @@ (if class? (cond (and (de/entity? page) (ldb/class? page)) - (assoc page :logseq.property/parent parent-eid) + (assoc page :logseq.property.class/extends parent-eid) (de/entity? page) ; page exists but not a class, avoid converting here because this could be troublesome. nil @@ -157,10 +157,10 @@ (db-class/build-new-class db page) :else - (db-class/build-new-class db (assoc page :logseq.property/parent parent-eid))) + (db-class/build-new-class db (assoc page :logseq.property.class/extends parent-eid))) (if (or (de/entity? page) (zero? idx)) page - (assoc page :logseq.property/parent parent-eid))))) + (assoc page :logseq.property.class/extends parent-eid))))) pages))) [page]) (remove nil?)))) diff --git a/src/rtc_e2e_test/example.cljs b/src/rtc_e2e_test/example.cljs index 55bd189e44..972a1b6b37 100644 --- a/src/rtc_e2e_test/example.cljs +++ b/src/rtc_e2e_test/example.cljs @@ -3,6 +3,6 @@ ;; (datascript.transit/write-transit-str db) (def example-db-transit - "[\"~#datascript/DB\",[\"^ \",\"~:schema\",[\"^ \",\"~i32\",\"~:logseq.property.journal/title-format\",\"~i64\",\"~:logseq.class/Query\",\"~:logseq.property.view/type.table\",[\"^ \",\"~:db/ident\",\"^6\"],\"~:file/created-at\",[\"^ \"],\"~i1\",\"~:logseq.kv/db-type\",\"~i33\",\"~:logseq.property/status\",\"~i65\",\"~:logseq.class/Advanced-Query\",\"~:logseq.property.fsrs/state\",[\"^ \",\"~:db/index\",true,\"~:db/cardinality\",\"~:db.cardinality/one\",\"^7\",\"^>\"],\"~:logseq.kv/graph-initial-schema-version\",[\"^ \",\"^7\",\"^B\"],\"~:block/tx-id\",[\"^ \"],\"~i2\",\"~:logseq.kv/schema-version\",\"~i34\",\"~:logseq.property/status.backlog\",\"~i66\",\"~:logseq.class/Card\",\"~:logseq.property.pdf/file-path\",[\"^ \",\"^?\",true,\"~:db/valueType\",\"~:db.type/ref\",\"^@\",\"^A\",\"^7\",\"^I\"],\"~:logseq.property.table/sorting\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^L\"],\"~i3\",\"^B\",\"~i35\",\"~:logseq.property/status.todo\",\"~i67\",\"~:logseq.class/Cards\",\"~:logseq.property/public\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^Q\"],\"~i4\",\"~:logseq.kv/graph-created-at\",\"~i36\",\"~:logseq.property/status.doing\",\"~:logseq.property/priority.low\",[\"^ \",\"^7\",\"^U\"],\"~:file/content\",[\"^ \"],\"~:logseq.property/priority.high\",[\"^ \",\"^7\",\"^W\"],\"~i5\",\"~:logseq.property/empty-placeholder\",\"~i37\",\"~:logseq.property/status.in-review\",\"~:logseq.property/priority.urgent\",[\"^ \",\"^7\",\"^[\"],\"~:logseq.property/hl-color\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^10\"],\"~:logseq.property.table/sized-columns\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^11\"],\"~:block/alias\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"~:db.cardinality/many\",\"^7\",\"^12\"],\"~i6\",\"~:logseq.class/Root\",\"~i38\",\"~:logseq.property/status.done\",\"~:kv/value\",[\"^ \"],\"~i7\",\"~:logseq.property/built-in?\",\"~i39\",\"~:logseq.property/status.canceled\",\"~:logseq.property.linked-references/includes\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^13\",\"^7\",\"^1;\"],\"~:block/link\",[\"^ \",\"^J\",\"^K\",\"^?\",true],\"~:logseq.property.view/type\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1=\"],\"~:logseq.property/heading\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^1>\"],\"~i8\",\"^12\",\"~i40\",\"~:logseq.property/priority\",\"~:block/uuid\",[\"^ \",\"~:db/unique\",\"~:db.unique/identity\"],\"~:logseq.property.table/hidden-columns\",[\"^ \",\"^?\",true,\"^@\",\"^13\",\"^7\",\"^1D\"],\"~i9\",\"~:block/tags\",\"~i41\",\"^U\",\"~:block/updated-at\",[\"^ \",\"^?\",true],\"~:asset/uuid\",[\"^ \",\"^1B\",\"^1C\"],\"~i10\",\"~:logseq.property/parent\",\"~i42\",\"~:logseq.property/priority.medium\",\"~:logseq.property.view/type.list\",[\"^ \",\"^7\",\"^1M\"],\"^1L\",[\"^ \",\"^7\",\"^1L\"],\"~i11\",\"~:logseq.property.class/properties\",\"~:file/size\",[\"^ \"],\"~i43\",\"^W\",\"~:block/refs\",[\"^ \",\"^J\",\"^K\",\"^@\",\"^13\"],\"^H\",[\"^ \",\"^7\",\"^H\"],\"^1@\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1@\"],\"~i12\",\"~:logseq.property.class/hide-from-node\",\"~i44\",\"^[\",\"^T\",[\"^ \",\"^7\",\"^T\"],\"^D\",[\"^ \",\"^7\",\"^D\"],\"~:logseq.property.pdf/hl-page\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1V\"],\"~:logseq.property/hl-type\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^1W\"],\"~i13\",\"~:logseq.property/query\",\"~i45\",\"~:logseq.property/deadline\",\"~:block/closed-value-property\",[\"^ \",\"^J\",\"^K\",\"^@\",\"^13\"],\"^Z\",[\"^ \",\"^7\",\"^Z\"],\"~i14\",\"~:logseq.property/page-tags\",\"~:file/last-modified-at\",[\"^ \"],\"~i46\",\"~:logseq.property/icon\",\"^16\",[\"^ \",\"^7\",\"^16\"],\"^1O\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^13\",\"^7\",\"^1O\"],\"^1:\",[\"^ \",\"^7\",\"^1:\"],\"~i15\",\"~:logseq.property/background-color\",\"~i47\",\"^Q\",\"~:block/created-at\",[\"^ \",\"^?\",true],\"^22\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^13\",\"^7\",\"^22\"],\"^N\",[\"^ \",\"^7\",\"^N\"],\"~:logseq.class/Task\",[\"^ \",\"^7\",\"^2:\"],\"~:block/collapsed?\",[\"^ \"],\"~:logseq.property.tldraw/page\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^2<\"],\"~i16\",\"~:logseq.property/background-image\",\"~i48\",\"~:logseq.property/exclude-from-graph-view\",\"~:logseq.property/value\",[\"^ \"],\"^18\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^18\"],\"~:block/schema\",[\"^ \"],\"~i17\",\"^1>\",\"~i49\",\"~:logseq.property/description\",\"^1T\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^1T\"],\"~:logseq.property.linked-references/excludes\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^13\",\"^7\",\"^2F\"],\"~:logseq.property/ls-type\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^2G\"],\"^P\",[\"^ \",\"^7\",\"^P\"],\"~:logseq.property/view-for\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^2H\"],\"~i18\",\"~:logseq.property/created-from-property\",\"^1Y\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1Y\"],\"~i50\",\"^1=\",\"^27\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^27\"],\"~:block/journal-day\",[\"^ \",\"^?\",true],\"~i19\",\"^2G\",\"^14\",[\"^ \",\"^7\",\"^14\"],\"~i51\",\"^6\",\"~:block/format\",[\"^ \"],\"^X\",[\"^ \",\"^7\",\"^X\"],\"~i20\",\"^1W\",\"~i52\",\"^1M\",\"^1E\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^13\",\"^7\",\"^1E\"],\"~:block/title\",[\"^ \",\"^?\",true],\"~:logseq.property.tldraw/shape\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^2S\"],\"~:asset/meta\",[\"^ \"],\"^1[\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1[\"],\"~i21\",\"^10\",\"~i53\",\"^L\",\"^2J\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^2J\"],\"^25\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^25\"],\"~i22\",\"^1V\",\"~i54\",\"~:logseq.property.table/filters\",\"^R\",[\"^ \",\"^7\",\"^R\"],\"~i23\",\"~:logseq.property.pdf/hl-stamp\",\"~i55\",\"^1D\",\"~:logseq.property/order-list-type\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^31\"],\"^2@\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^2@\"],\"~i24\",\"~:logseq.property.pdf/hl-value\",\"~i56\",\"~:logseq.property.table/ordered-columns\",\"^2>\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^2>\"],\"^7\",[\"^ \",\"^1B\",\"^1C\"],\"~:property/schema.classes\",[\"^ \",\"^J\",\"^K\",\"^@\",\"^13\"],\"^2E\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^2E\"],\"~:block/path-refs\",[\"^ \",\"^J\",\"^K\",\"^@\",\"^13\"],\"~:block/parent\",[\"^ \",\"^J\",\"^K\",\"^?\",true],\"~i25\",\"~:logseq.property.pdf/file\",\"~i57\",\"^11\",\"~:block/type\",[\"^ \",\"^?\",true],\"~:logseq.class/Journal\",[\"^ \",\"^7\",\"^3=\"],\"~i26\",\"^I\",\"~i58\",\"^2H\",\"^33\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^33\"],\"^5\",[\"^ \",\"^7\",\"^5\"],\"~i27\",\"^31\",\"~i59\",\"~:logseq.property.asset/remote-metadata\",\"^3B\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^3B\"],\"^2[\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^2[\"],\"~:block/order\",[\"^ \",\"^?\",true],\"^;\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^;\"],\"~:logseq.property.fsrs/due\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^3D\"],\"~i28\",\"^1;\",\"~i60\",\"^3D\",\"~:block/page\",[\"^ \",\"^J\",\"^K\",\"^?\",true],\"~:block/name\",[\"^ \",\"^?\",true],\"^35\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^35\"],\"~:file/path\",[\"^ \",\"^1B\",\"^1C\"],\"~i29\",\"^2F\",\"~i61\",\"^>\",\"^F\",[\"^ \",\"^7\",\"^F\"],\"^1J\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1J\"],\"~i30\",\"^2<\",\"~i62\",\"^2:\",\"^3:\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^3:\"],\"^3\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^3\"],\"^=\",[\"^ \",\"^7\",\"^=\"],\"~i31\",\"^2S\",\"~i63\",\"^3=\",\"^9\",[\"^ \",\"^7\",\"^9\"],\"^2Y\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^2Y\"]],\"~:datoms\",[\"~#list\",[[\"~#datascript/Datom\",[1,\"^7\",\"^9\",536870913]],[\"^3R\",[1,\"^17\",\"db\",536870913]],[\"^3R\",[2,\"^7\",\"^D\",536870913]],[\"^3R\",[2,\"^17\",25,536870913]],[\"^3R\",[3,\"^7\",\"^B\",536870913]],[\"^3R\",[3,\"^17\",25,536870913]],[\"^3R\",[4,\"^7\",\"^R\",536870913]],[\"^3R\",[4,\"^17\",1727187033523,536870913]],[\"^3R\",[5,\"^7\",\"^X\",536870913]],[\"^3R\",[6,\"^29\",1727187033526,536870913]],[\"^3R\",[6,\"^2O\",\"~:markdown\",536870913]],[\"^3R\",[6,\"^3H\",\"root tag\",536870913]],[\"^3R\",[6,\"^2R\",\"Root Tag\",536870913]],[\"^3R\",[6,\"^3<\",\"class\",536870913]],[\"^3R\",[6,\"^1G\",1727187033526,536870913]],[\"^3R\",[6,\"^1A\",\"~u00000002-2737-8382-7000-000000000000\",536870913]],[\"^3R\",[6,\"^7\",\"^14\",536870913]],[\"^3R\",[6,\"^18\",true,536870913]],[\"^3R\",[7,\"^29\",1727187033523,536870913]],[\"^3R\",[7,\"^2O\",\"^3S\",536870913]],[\"^3R\",[7,\"^3H\",\"built-in?\",536870913]],[\"^3R\",[7,\"^3C\",\"bNP\",536870913]],[\"^3R\",[7,\"^2B\",[\"^ \",\"~:type\",\"~:checkbox\",\"~:hide?\",true],536870913]],[\"^3R\",[7,\"^2R\",\"built-in?\",536870913]],[\"^3R\",[7,\"^3<\",\"property\",536870913]],[\"^3R\",[7,\"^1G\",1727187033523,536870913]],[\"^3R\",[7,\"^1A\",\"~u00000002-1125-9581-6000-000000000000\",536870913]],[\"^3R\",[7,\"^@\",\"^A\",536870913]],[\"^3R\",[7,\"^7\",\"^18\",536870913]],[\"^3R\",[7,\"^?\",true,536870913]],[\"^3R\",[7,\"^18\",true,536870913]],[\"^3R\",[8,\"^29\",1727187033524,536870913]],[\"^3R\",[8,\"^2O\",\"^3S\",536870913]],[\"^3R\",[8,\"^3H\",\"alias\",536870913]],[\"^3R\",[8,\"^3C\",\"bNQ\",536870913]],[\"^3R\",[8,\"^2B\",[\"^ \",\"^3T\",\"~:page\",\"~:view-context\",\"^3W\",\"~:public?\",true],536870913]],[\"^3R\",[8,\"^2R\",\"Alias\",536870913]],[\"^3R\",[8,\"^3<\",\"property\",536870913]],[\"^3R\",[8,\"^1G\",1727187033524,536870913]],[\"^3R\",[8,\"^1A\",\"~u00000002-2112-6446-9900-000000000000\",536870913]],[\"^3R\",[8,\"^@\",\"^13\",536870913]],[\"^3R\",[8,\"^7\",\"^12\",536870913]],[\"^3R\",[8,\"^?\",true,536870913]],[\"^3R\",[8,\"^J\",\"^K\",536870913]],[\"^3R\",[8,\"^18\",true,536870913]],[\"^3R\",[9,\"^29\",1727187033524,536870913]],[\"^3R\",[9,\"^2O\",\"^3S\",536870913]],[\"^3R\",[9,\"^3H\",\"tags\",536870913]],[\"^3R\",[9,\"^3C\",\"bNR\",536870913]],[\"^3R\",[9,\"^2B\",[\"^ \",\"^3T\",\"~:class\",\"^3Y\",true],536870913]],[\"^3R\",[9,\"^2R\",\"Tags\",536870913]],[\"^3R\",[9,\"^3<\",\"property\",536870913]],[\"^3R\",[9,\"^1G\",1727187033524,536870913]],[\"^3R\",[9,\"^1A\",\"~u00000002-1814-9483-4000-000000000000\",536870913]],[\"^3R\",[9,\"^@\",\"^13\",536870913]],[\"^3R\",[9,\"^7\",\"^1E\",536870913]],[\"^3R\",[9,\"^?\",true,536870913]],[\"^3R\",[9,\"^J\",\"^K\",536870913]],[\"^3R\",[9,\"^18\",true,536870913]],[\"^3R\",[9,\"^36\",6,536870913]],[\"^3R\",[10,\"^29\",1727187033524,536870913]],[\"^3R\",[10,\"^2O\",\"^3S\",536870913]],[\"^3R\",[10,\"^3H\",\"parent\",536870913]],[\"^3R\",[10,\"^3C\",\"bNS\",536870913]],[\"^3R\",[10,\"^2B\",[\"^ \",\"^3T\",\"~:node\",\"^3Y\",true,\"^3X\",\"^3W\"],536870913]],[\"^3R\",[10,\"^2R\",\"Parent\",536870913]],[\"^3R\",[10,\"^3<\",\"property\",536870913]],[\"^3R\",[10,\"^1G\",1727187033524,536870913]],[\"^3R\",[10,\"^1A\",\"~u00000002-1779-8450-9000-000000000000\",536870913]],[\"^3R\",[10,\"^@\",\"^A\",536870913]],[\"^3R\",[10,\"^7\",\"^1J\",536870913]],[\"^3R\",[10,\"^?\",true,536870913]],[\"^3R\",[10,\"^J\",\"^K\",536870913]],[\"^3R\",[10,\"^18\",true,536870913]],[\"^3R\",[11,\"^29\",1727187033524,536870913]],[\"^3R\",[11,\"^2O\",\"^3S\",536870913]],[\"^3R\",[11,\"^3H\",\"tag properties\",536870913]],[\"^3R\",[11,\"^3C\",\"bNT\",536870913]],[\"^3R\",[11,\"^2B\",[\"^ \",\"^3T\",\"~:property\",\"^3Y\",true,\"^3X\",\"~:never\"],536870913]],[\"^3R\",[11,\"^2R\",\"Tag Properties\",536870913]],[\"^3R\",[11,\"^3<\",\"property\",536870913]],[\"^3R\",[11,\"^1G\",1727187033524,536870913]],[\"^3R\",[11,\"^1A\",\"~u00000002-2123-7120-5000-000000000000\",536870913]],[\"^3R\",[11,\"^@\",\"^13\",536870913]],[\"^3R\",[11,\"^7\",\"^1O\",536870913]],[\"^3R\",[11,\"^?\",true,536870913]],[\"^3R\",[11,\"^J\",\"^K\",536870913]],[\"^3R\",[11,\"^18\",true,536870913]],[\"^3R\",[12,\"^29\",1727187033524,536870913]],[\"^3R\",[12,\"^2O\",\"^3S\",536870913]],[\"^3R\",[12,\"^3H\",\"hide from node\",536870913]],[\"^3R\",[12,\"^3C\",\"bNU\",536870913]],[\"^3R\",[12,\"^2B\",[\"^ \",\"^3T\",\"^3U\",\"^3Y\",true,\"^3X\",\"^3Z\"],536870913]],[\"^3R\",[12,\"^2R\",\"Hide from Node\",536870913]],[\"^3R\",[12,\"^3<\",\"property\",536870913]],[\"^3R\",[12,\"^1G\",1727187033524,536870913]],[\"^3R\",[12,\"^1A\",\"~u00000002-2610-3727-0000-000000000000\",536870913]],[\"^3R\",[12,\"^@\",\"^A\",536870913]],[\"^3R\",[12,\"^7\",\"^1T\",536870913]],[\"^3R\",[12,\"^?\",true,536870913]],[\"^3R\",[12,\"^18\",true,536870913]],[\"^3R\",[13,\"^29\",1727187033524,536870913]],[\"^3R\",[13,\"^2O\",\"^3S\",536870913]],[\"^3R\",[13,\"^3H\",\"query\",536870913]],[\"^3R\",[13,\"^3C\",\"bNV\",536870913]],[\"^3R\",[13,\"^2B\",[\"^ \",\"^3T\",\"~:default\",\"^3Y\",true,\"^3X\",\"~:block\"],536870913]],[\"^3R\",[13,\"^2R\",\"Query\",536870913]],[\"^3R\",[13,\"^3<\",\"property\",536870913]],[\"^3R\",[13,\"^1G\",1727187033524,536870913]],[\"^3R\",[13,\"^1A\",\"~u00000002-9741-4126-0000-000000000000\",536870913]],[\"^3R\",[13,\"^@\",\"^A\",536870913]],[\"^3R\",[13,\"^7\",\"^1Y\",536870913]],[\"^3R\",[13,\"^?\",true,536870913]],[\"^3R\",[13,\"^J\",\"^K\",536870913]],[\"^3R\",[13,\"^18\",true,536870913]],[\"^3R\",[14,\"^29\",1727187033524,536870913]],[\"^3R\",[14,\"^2O\",\"^3S\",536870913]],[\"^3R\",[14,\"^3H\",\"page tags\",536870913]],[\"^3R\",[14,\"^3C\",\"bNW\",536870913]],[\"^3R\",[14,\"^2B\",[\"^ \",\"^3T\",\"^3W\",\"^3Y\",true,\"^3X\",\"^3W\"],536870913]],[\"^3R\",[14,\"^2R\",\"Page Tags\",536870913]],[\"^3R\",[14,\"^3<\",\"property\",536870913]],[\"^3R\",[14,\"^1G\",1727187033524,536870913]],[\"^3R\",[14,\"^1A\",\"~u00000002-2133-5311-8500-000000000000\",536870913]],[\"^3R\",[14,\"^@\",\"^13\",536870913]],[\"^3R\",[14,\"^7\",\"^22\",536870913]],[\"^3R\",[14,\"^?\",true,536870913]],[\"^3R\",[14,\"^J\",\"^K\",536870913]],[\"^3R\",[14,\"^18\",true,536870913]],[\"^3R\",[15,\"^29\",1727187033524,536870913]],[\"^3R\",[15,\"^2O\",\"^3S\",536870913]],[\"^3R\",[15,\"^3H\",\"background-color\",536870913]],[\"^3R\",[15,\"^3C\",\"bNX\",536870913]],[\"^3R\",[15,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3V\",true],536870913]],[\"^3R\",[15,\"^2R\",\"background-color\",536870913]],[\"^3R\",[15,\"^3<\",\"property\",536870913]],[\"^3R\",[15,\"^1G\",1727187033524,536870913]],[\"^3R\",[15,\"^1A\",\"~u00000002-5191-2660-6000-000000000000\",536870913]],[\"^3R\",[15,\"^@\",\"^A\",536870913]],[\"^3R\",[15,\"^7\",\"^27\",536870913]],[\"^3R\",[15,\"^?\",true,536870913]],[\"^3R\",[15,\"^J\",\"^K\",536870913]],[\"^3R\",[15,\"^18\",true,536870913]],[\"^3R\",[16,\"^29\",1727187033524,536870913]],[\"^3R\",[16,\"^2O\",\"^3S\",536870913]],[\"^3R\",[16,\"^3H\",\"background-image\",536870913]],[\"^3R\",[16,\"^3C\",\"bNY\",536870913]],[\"^3R\",[16,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3X\",\"^43\",\"^3Y\",true],536870913]],[\"^3R\",[16,\"^2R\",\"background-image\",536870913]],[\"^3R\",[16,\"^3<\",\"property\",536870913]],[\"^3R\",[16,\"^1G\",1727187033524,536870913]],[\"^3R\",[16,\"^1A\",\"~u00000002-2513-1712-8000-000000000000\",536870913]],[\"^3R\",[16,\"^@\",\"^A\",536870913]],[\"^3R\",[16,\"^7\",\"^2>\",536870913]],[\"^3R\",[16,\"^?\",true,536870913]],[\"^3R\",[16,\"^J\",\"^K\",536870913]],[\"^3R\",[16,\"^18\",true,536870913]],[\"^3R\",[17,\"^29\",1727187033524,536870913]],[\"^3R\",[17,\"^2O\",\"^3S\",536870913]],[\"^3R\",[17,\"^3H\",\"heading\",536870913]],[\"^3R\",[17,\"^3C\",\"bNZ\",536870913]],[\"^3R\",[17,\"^2B\",[\"^ \",\"^3T\",\"~:any\",\"^3V\",true],536870913]],[\"^3R\",[17,\"^2R\",\"heading\",536870913]],[\"^3R\",[17,\"^3<\",\"property\",536870913]],[\"^3R\",[17,\"^1G\",1727187033524,536870913]],[\"^3R\",[17,\"^1A\",\"~u00000002-1858-7494-1500-000000000000\",536870913]],[\"^3R\",[17,\"^@\",\"^A\",536870913]],[\"^3R\",[17,\"^7\",\"^1>\",536870913]],[\"^3R\",[17,\"^?\",true,536870913]],[\"^3R\",[17,\"^18\",true,536870913]],[\"^3R\",[18,\"^29\",1727187033524,536870913]],[\"^3R\",[18,\"^2O\",\"^3S\",536870913]],[\"^3R\",[18,\"^3H\",\"created-from-property\",536870913]],[\"^3R\",[18,\"^3C\",\"bNa\",536870913]],[\"^3R\",[18,\"^2B\",[\"^ \",\"^3T\",\"~:entity\",\"^3V\",true],536870913]],[\"^3R\",[18,\"^2R\",\"created-from-property\",536870913]],[\"^3R\",[18,\"^3<\",\"property\",536870913]],[\"^3R\",[18,\"^1G\",1727187033524,536870913]],[\"^3R\",[18,\"^1A\",\"~u00000002-8618-9226-7000-000000000000\",536870913]],[\"^3R\",[18,\"^@\",\"^A\",536870913]],[\"^3R\",[18,\"^7\",\"^2J\",536870913]],[\"^3R\",[18,\"^?\",true,536870913]],[\"^3R\",[18,\"^J\",\"^K\",536870913]],[\"^3R\",[18,\"^18\",true,536870913]],[\"^3R\",[19,\"^29\",1727187033524,536870913]],[\"^3R\",[19,\"^2O\",\"^3S\",536870913]],[\"^3R\",[19,\"^3H\",\"ls-type\",536870913]],[\"^3R\",[19,\"^3C\",\"bNb\",536870913]],[\"^3R\",[19,\"^2B\",[\"^ \",\"^3T\",\"~:keyword\",\"^3V\",true],536870913]],[\"^3R\",[19,\"^2R\",\"ls-type\",536870913]],[\"^3R\",[19,\"^3<\",\"property\",536870913]],[\"^3R\",[19,\"^1G\",1727187033524,536870913]],[\"^3R\",[19,\"^1A\",\"~u00000002-3269-7934-5000-000000000000\",536870913]],[\"^3R\",[19,\"^@\",\"^A\",536870913]],[\"^3R\",[19,\"^7\",\"^2G\",536870913]],[\"^3R\",[19,\"^?\",true,536870913]],[\"^3R\",[19,\"^18\",true,536870913]],[\"^3R\",[20,\"^29\",1727187033524,536870913]],[\"^3R\",[20,\"^2O\",\"^3S\",536870913]],[\"^3R\",[20,\"^3H\",\"hl-type\",536870913]],[\"^3R\",[20,\"^3C\",\"bNc\",536870913]],[\"^3R\",[20,\"^2B\",[\"^ \",\"^3T\",\"^46\",\"^3V\",true],536870913]],[\"^3R\",[20,\"^2R\",\"hl-type\",536870913]],[\"^3R\",[20,\"^3<\",\"property\",536870913]],[\"^3R\",[20,\"^1G\",1727187033524,536870913]],[\"^3R\",[20,\"^1A\",\"~u00000002-2083-0223-8000-000000000000\",536870913]],[\"^3R\",[20,\"^@\",\"^A\",536870913]],[\"^3R\",[20,\"^7\",\"^1W\",536870913]],[\"^3R\",[20,\"^?\",true,536870913]],[\"^3R\",[20,\"^18\",true,536870913]],[\"^3R\",[21,\"^29\",1727187033524,536870913]],[\"^3R\",[21,\"^2O\",\"^3S\",536870913]],[\"^3R\",[21,\"^3H\",\"hl-color\",536870913]],[\"^3R\",[21,\"^3C\",\"bNd\",536870913]],[\"^3R\",[21,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3V\",true],536870913]],[\"^3R\",[21,\"^2R\",\"hl-color\",536870913]],[\"^3R\",[21,\"^3<\",\"property\",536870913]],[\"^3R\",[21,\"^1G\",1727187033524,536870913]],[\"^3R\",[21,\"^1A\",\"~u00000002-2137-2691-4700-000000000000\",536870913]],[\"^3R\",[21,\"^@\",\"^A\",536870913]],[\"^3R\",[21,\"^7\",\"^10\",536870913]],[\"^3R\",[21,\"^?\",true,536870913]],[\"^3R\",[21,\"^J\",\"^K\",536870913]],[\"^3R\",[21,\"^18\",true,536870913]],[\"^3R\",[22,\"^29\",1727187033524,536870913]],[\"^3R\",[22,\"^2O\",\"^3S\",536870913]],[\"^3R\",[22,\"^3H\",\"hl-page\",536870913]],[\"^3R\",[22,\"^3C\",\"bNe\",536870913]],[\"^3R\",[22,\"^2B\",[\"^ \",\"^3T\",\"~:number\",\"^3V\",true],536870913]],[\"^3R\",[22,\"^2R\",\"hl-page\",536870913]],[\"^3R\",[22,\"^3<\",\"property\",536870913]],[\"^3R\",[22,\"^1G\",1727187033524,536870913]],[\"^3R\",[22,\"^1A\",\"~u00000002-7532-8459-6000-000000000000\",536870913]],[\"^3R\",[22,\"^@\",\"^A\",536870913]],[\"^3R\",[22,\"^7\",\"^1V\",536870913]],[\"^3R\",[22,\"^?\",true,536870913]],[\"^3R\",[22,\"^J\",\"^K\",536870913]],[\"^3R\",[22,\"^18\",true,536870913]],[\"^3R\",[23,\"^29\",1727187033524,536870913]],[\"^3R\",[23,\"^2O\",\"^3S\",536870913]],[\"^3R\",[23,\"^3H\",\"hl-stamp\",536870913]],[\"^3R\",[23,\"^3C\",\"bNf\",536870913]],[\"^3R\",[23,\"^2B\",[\"^ \",\"^3T\",\"^47\",\"^3V\",true],536870913]],[\"^3R\",[23,\"^2R\",\"hl-stamp\",536870913]],[\"^3R\",[23,\"^3<\",\"property\",536870913]],[\"^3R\",[23,\"^1G\",1727187033524,536870913]],[\"^3R\",[23,\"^1A\",\"~u00000002-1293-4649-2300-000000000000\",536870913]],[\"^3R\",[23,\"^@\",\"^A\",536870913]],[\"^3R\",[23,\"^7\",\"^2[\",536870913]],[\"^3R\",[23,\"^?\",true,536870913]],[\"^3R\",[23,\"^J\",\"^K\",536870913]],[\"^3R\",[23,\"^18\",true,536870913]],[\"^3R\",[24,\"^29\",1727187033524,536870913]],[\"^3R\",[24,\"^2O\",\"^3S\",536870913]],[\"^3R\",[24,\"^3H\",\"hl-value\",536870913]],[\"^3R\",[24,\"^3C\",\"bNg\",536870913]],[\"^3R\",[24,\"^2B\",[\"^ \",\"^3T\",\"~:map\",\"^3V\",true],536870913]],[\"^3R\",[24,\"^2R\",\"hl-value\",536870913]],[\"^3R\",[24,\"^3<\",\"property\",536870913]],[\"^3R\",[24,\"^1G\",1727187033524,536870913]],[\"^3R\",[24,\"^1A\",\"~u00000002-5458-2940-2000-000000000000\",536870913]],[\"^3R\",[24,\"^@\",\"^A\",536870913]],[\"^3R\",[24,\"^7\",\"^33\",536870913]],[\"^3R\",[24,\"^?\",true,536870913]],[\"^3R\",[24,\"^18\",true,536870913]],[\"^3R\",[25,\"^29\",1727187033525,536870913]],[\"^3R\",[25,\"^2O\",\"^3S\",536870913]],[\"^3R\",[25,\"^3H\",\"file\",536870913]],[\"^3R\",[25,\"^3C\",\"bNh\",536870913]],[\"^3R\",[25,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3V\",true,\"^3Y\",true,\"^3X\",\"^3W\"],536870913]],[\"^3R\",[25,\"^2R\",\"file\",536870913]],[\"^3R\",[25,\"^3<\",\"property\",536870913]],[\"^3R\",[25,\"^1G\",1727187033525,536870913]],[\"^3R\",[25,\"^1A\",\"~u00000002-1681-6464-3400-000000000000\",536870913]],[\"^3R\",[25,\"^@\",\"^A\",536870913]],[\"^3R\",[25,\"^7\",\"^3:\",536870913]],[\"^3R\",[25,\"^?\",true,536870913]],[\"^3R\",[25,\"^J\",\"^K\",536870913]],[\"^3R\",[25,\"^18\",true,536870913]],[\"^3R\",[26,\"^29\",1727187033525,536870913]],[\"^3R\",[26,\"^2O\",\"^3S\",536870913]],[\"^3R\",[26,\"^3H\",\"file-path\",536870913]],[\"^3R\",[26,\"^3C\",\"bNi\",536870913]],[\"^3R\",[26,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3V\",true,\"^3Y\",true,\"^3X\",\"^3W\"],536870913]],[\"^3R\",[26,\"^2R\",\"file-path\",536870913]],[\"^3R\",[26,\"^3<\",\"property\",536870913]],[\"^3R\",[26,\"^1G\",1727187033525,536870913]],[\"^3R\",[26,\"^1A\",\"~u00000002-5663-3568-2000-000000000000\",536870913]],[\"^3R\",[26,\"^@\",\"^A\",536870913]],[\"^3R\",[26,\"^7\",\"^I\",536870913]],[\"^3R\",[26,\"^?\",true,536870913]],[\"^3R\",[26,\"^J\",\"^K\",536870913]],[\"^3R\",[26,\"^18\",true,536870913]],[\"^3R\",[27,\"^29\",1727187033525,536870913]],[\"^3R\",[27,\"^2O\",\"^3S\",536870913]],[\"^3R\",[27,\"^3H\",\"logseq.order-list-type\",536870913]],[\"^3R\",[27,\"^3C\",\"bNj\",536870913]],[\"^3R\",[27,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3V\",true],536870913]],[\"^3R\",[27,\"^2R\",\"logseq.order-list-type\",536870913]],[\"^3R\",[27,\"^3<\",\"property\",536870913]],[\"^3R\",[27,\"^1G\",1727187033525,536870913]],[\"^3R\",[27,\"^1A\",\"~u00000002-6078-1711-1000-000000000000\",536870913]],[\"^3R\",[27,\"^@\",\"^A\",536870913]],[\"^3R\",[27,\"^7\",\"^31\",536870913]],[\"^3R\",[27,\"^?\",true,536870913]],[\"^3R\",[27,\"^J\",\"^K\",536870913]],[\"^3R\",[27,\"^18\",true,536870913]],[\"^3R\",[28,\"^29\",1727187033525,536870913]],[\"^3R\",[28,\"^2O\",\"^3S\",536870913]],[\"^3R\",[28,\"^3H\",\"includes\",536870913]],[\"^3R\",[28,\"^3C\",\"bNk\",536870913]],[\"^3R\",[28,\"^2B\",[\"^ \",\"^3T\",\"^3[\",\"^3V\",true],536870913]],[\"^3R\",[28,\"^2R\",\"includes\",536870913]],[\"^3R\",[28,\"^3<\",\"property\",536870913]],[\"^3R\",[28,\"^1G\",1727187033525,536870913]],[\"^3R\",[28,\"^1A\",\"~u00000002-1680-5777-0300-000000000000\",536870913]],[\"^3R\",[28,\"^@\",\"^13\",536870913]],[\"^3R\",[28,\"^7\",\"^1;\",536870913]],[\"^3R\",[28,\"^?\",true,536870913]],[\"^3R\",[28,\"^J\",\"^K\",536870913]],[\"^3R\",[28,\"^18\",true,536870913]],[\"^3R\",[29,\"^29\",1727187033525,536870913]],[\"^3R\",[29,\"^2O\",\"^3S\",536870913]],[\"^3R\",[29,\"^3H\",\"excludes\",536870913]],[\"^3R\",[29,\"^3C\",\"bNl\",536870913]],[\"^3R\",[29,\"^2B\",[\"^ \",\"^3T\",\"^3[\",\"^3V\",true],536870913]],[\"^3R\",[29,\"^2R\",\"excludes\",536870913]],[\"^3R\",[29,\"^3<\",\"property\",536870913]],[\"^3R\",[29,\"^1G\",1727187033525,536870913]],[\"^3R\",[29,\"^1A\",\"~u00000002-2426-7588-9000-000000000000\",536870913]],[\"^3R\",[29,\"^@\",\"^13\",536870913]],[\"^3R\",[29,\"^7\",\"^2F\",536870913]],[\"^3R\",[29,\"^?\",true,536870913]],[\"^3R\",[29,\"^J\",\"^K\",536870913]],[\"^3R\",[29,\"^18\",true,536870913]],[\"^3R\",[30,\"^29\",1727187033525,536870913]],[\"^3R\",[30,\"^2O\",\"^3S\",536870913]],[\"^3R\",[30,\"^3H\",\"logseq.tldraw.page\",536870913]],[\"^3R\",[30,\"^3C\",\"bNm\",536870913]],[\"^3R\",[30,\"^2B\",[\"^ \",\"^3T\",\"^48\",\"^3V\",true],536870913]],[\"^3R\",[30,\"^2R\",\"logseq.tldraw.page\",536870913]],[\"^3R\",[30,\"^3<\",\"property\",536870913]],[\"^3R\",[30,\"^1G\",1727187033525,536870913]],[\"^3R\",[30,\"^1A\",\"~u00000002-3546-2145-7000-000000000000\",536870913]],[\"^3R\",[30,\"^@\",\"^A\",536870913]],[\"^3R\",[30,\"^7\",\"^2<\",536870913]],[\"^3R\",[30,\"^?\",true,536870913]],[\"^3R\",[30,\"^18\",true,536870913]],[\"^3R\",[31,\"^29\",1727187033525,536870913]],[\"^3R\",[31,\"^2O\",\"^3S\",536870913]],[\"^3R\",[31,\"^3H\",\"logseq.tldraw.shape\",536870913]],[\"^3R\",[31,\"^3C\",\"bNn\",536870913]],[\"^3R\",[31,\"^2B\",[\"^ \",\"^3T\",\"^48\",\"^3V\",true],536870913]],[\"^3R\",[31,\"^2R\",\"logseq.tldraw.shape\",536870913]],[\"^3R\",[31,\"^3<\",\"property\",536870913]],[\"^3R\",[31,\"^1G\",1727187033525,536870913]],[\"^3R\",[31,\"^1A\",\"~u00000002-1313-2454-2000-000000000000\",536870913]],[\"^3R\",[31,\"^@\",\"^A\",536870913]],[\"^3R\",[31,\"^7\",\"^2S\",536870913]],[\"^3R\",[31,\"^?\",true,536870913]],[\"^3R\",[31,\"^18\",true,536870913]],[\"^3R\",[32,\"^29\",1727187033525,536870913]],[\"^3R\",[32,\"^2O\",\"^3S\",536870913]],[\"^3R\",[32,\"^3H\",\"title format\",536870913]],[\"^3R\",[32,\"^3C\",\"bNo\",536870913]],[\"^3R\",[32,\"^2B\",[\"^ \",\"^3T\",\"~:string\",\"^3Y\",false],536870913]],[\"^3R\",[32,\"^2R\",\"Title Format\",536870913]],[\"^3R\",[32,\"^3<\",\"property\",536870913]],[\"^3R\",[32,\"^1G\",1727187033525,536870913]],[\"^3R\",[32,\"^1A\",\"~u00000002-1536-4979-5400-000000000000\",536870913]],[\"^3R\",[32,\"^@\",\"^A\",536870913]],[\"^3R\",[32,\"^7\",\"^3\",536870913]],[\"^3R\",[32,\"^?\",true,536870913]],[\"^3R\",[32,\"^18\",true,536870913]],[\"^3R\",[33,\"^29\",1727187033525,536870913]],[\"^3R\",[33,\"^2O\",\"^3S\",536870913]],[\"^3R\",[33,\"^3H\",\"status\",536870913]],[\"^3R\",[33,\"^3C\",\"bNp\",536870913]],[\"^3R\",[33,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3Y\",true,\"~:position\",\"~:block-left\"],536870913]],[\"^3R\",[33,\"^2R\",\"Status\",536870913]],[\"^3R\",[33,\"^3<\",\"property\",536870913]],[\"^3R\",[33,\"^1G\",1727187033525,536870913]],[\"^3R\",[33,\"^1A\",\"~u00000002-1399-1718-0300-000000000000\",536870913]],[\"^3R\",[33,\"^@\",\"^A\",536870913]],[\"^3R\",[33,\"^7\",\"^;\",536870913]],[\"^3R\",[33,\"^?\",true,536870913]],[\"^3R\",[33,\"^J\",\"^K\",536870913]],[\"^3R\",[33,\"^18\",true,536870913]],[\"^3R\",[34,\"^20\",33,536870913]],[\"^3R\",[34,\"^29\",1727187033525,536870913]],[\"^3R\",[34,\"^2O\",\"^3S\",536870913]],[\"^3R\",[34,\"^3C\",\"bNq\",536870913]],[\"^3R\",[34,\"^3G\",33,536870913]],[\"^3R\",[34,\"^38\",33,536870913]],[\"^3R\",[34,\"^2R\",\"Backlog\",536870913]],[\"^3R\",[34,\"^3<\",\"closed value\",536870913]],[\"^3R\",[34,\"^1G\",1727187033525,536870913]],[\"^3R\",[34,\"^1A\",\"~u00000002-1797-5174-0500-000000000000\",536870913]],[\"^3R\",[34,\"^7\",\"^F\",536870913]],[\"^3R\",[34,\"^18\",true,536870913]],[\"^3R\",[34,\"^2J\",33,536870913]],[\"^3R\",[34,\"^25\",[\"^ \",\"^3T\",\"~:tabler-icon\",\"~:id\",\"Backlog\"],536870913]],[\"^3R\",[35,\"^20\",33,536870913]],[\"^3R\",[35,\"^29\",1727187033525,536870913]],[\"^3R\",[35,\"^2O\",\"^3S\",536870913]],[\"^3R\",[35,\"^3C\",\"bNr\",536870913]],[\"^3R\",[35,\"^3G\",33,536870913]],[\"^3R\",[35,\"^38\",33,536870913]],[\"^3R\",[35,\"^2R\",\"Todo\",536870913]],[\"^3R\",[35,\"^3<\",\"closed value\",536870913]],[\"^3R\",[35,\"^1G\",1727187033525,536870913]],[\"^3R\",[35,\"^1A\",\"~u00000002-1776-1920-4900-000000000000\",536870913]],[\"^3R\",[35,\"^7\",\"^N\",536870913]],[\"^3R\",[35,\"^18\",true,536870913]],[\"^3R\",[35,\"^2J\",33,536870913]],[\"^3R\",[35,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"Todo\"],536870913]],[\"^3R\",[36,\"^20\",33,536870913]],[\"^3R\",[36,\"^29\",1727187033525,536870913]],[\"^3R\",[36,\"^2O\",\"^3S\",536870913]],[\"^3R\",[36,\"^3C\",\"bNs\",536870913]],[\"^3R\",[36,\"^3G\",33,536870913]],[\"^3R\",[36,\"^38\",33,536870913]],[\"^3R\",[36,\"^2R\",\"Doing\",536870913]],[\"^3R\",[36,\"^3<\",\"closed value\",536870913]],[\"^3R\",[36,\"^1G\",1727187033525,536870913]],[\"^3R\",[36,\"^1A\",\"~u00000002-5524-7947-6000-000000000000\",536870913]],[\"^3R\",[36,\"^7\",\"^T\",536870913]],[\"^3R\",[36,\"^18\",true,536870913]],[\"^3R\",[36,\"^2J\",33,536870913]],[\"^3R\",[36,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"InProgress50\"],536870913]],[\"^3R\",[37,\"^20\",33,536870913]],[\"^3R\",[37,\"^29\",1727187033525,536870913]],[\"^3R\",[37,\"^2O\",\"^3S\",536870913]],[\"^3R\",[37,\"^3C\",\"bNt\",536870913]],[\"^3R\",[37,\"^3G\",33,536870913]],[\"^3R\",[37,\"^38\",33,536870913]],[\"^3R\",[37,\"^2R\",\"In Review\",536870913]],[\"^3R\",[37,\"^3<\",\"closed value\",536870913]],[\"^3R\",[37,\"^1G\",1727187033525,536870913]],[\"^3R\",[37,\"^1A\",\"~u00000002-3550-9421-0000-000000000000\",536870913]],[\"^3R\",[37,\"^7\",\"^Z\",536870913]],[\"^3R\",[37,\"^18\",true,536870913]],[\"^3R\",[37,\"^2J\",33,536870913]],[\"^3R\",[37,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"InReview\"],536870913]],[\"^3R\",[38,\"^20\",33,536870913]],[\"^3R\",[38,\"^29\",1727187033525,536870913]],[\"^3R\",[38,\"^2O\",\"^3S\",536870913]],[\"^3R\",[38,\"^3C\",\"bNu\",536870913]],[\"^3R\",[38,\"^3G\",33,536870913]],[\"^3R\",[38,\"^38\",33,536870913]],[\"^3R\",[38,\"^2R\",\"Done\",536870913]],[\"^3R\",[38,\"^3<\",\"closed value\",536870913]],[\"^3R\",[38,\"^1G\",1727187033525,536870913]],[\"^3R\",[38,\"^1A\",\"~u00000002-1430-0577-4000-000000000000\",536870913]],[\"^3R\",[38,\"^7\",\"^16\",536870913]],[\"^3R\",[38,\"^18\",true,536870913]],[\"^3R\",[38,\"^2J\",33,536870913]],[\"^3R\",[38,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"Done\"],536870913]],[\"^3R\",[39,\"^20\",33,536870913]],[\"^3R\",[39,\"^29\",1727187033525,536870913]],[\"^3R\",[39,\"^2O\",\"^3S\",536870913]],[\"^3R\",[39,\"^3C\",\"bNv\",536870913]],[\"^3R\",[39,\"^3G\",33,536870913]],[\"^3R\",[39,\"^38\",33,536870913]],[\"^3R\",[39,\"^2R\",\"Canceled\",536870913]],[\"^3R\",[39,\"^3<\",\"closed value\",536870913]],[\"^3R\",[39,\"^1G\",1727187033525,536870913]],[\"^3R\",[39,\"^1A\",\"~u00000002-1217-7438-9000-000000000000\",536870913]],[\"^3R\",[39,\"^7\",\"^1:\",536870913]],[\"^3R\",[39,\"^18\",true,536870913]],[\"^3R\",[39,\"^2J\",33,536870913]],[\"^3R\",[39,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"Cancelled\"],536870913]],[\"^3R\",[40,\"^29\",1727187033525,536870913]],[\"^3R\",[40,\"^2O\",\"^3S\",536870913]],[\"^3R\",[40,\"^3H\",\"priority\",536870913]],[\"^3R\",[40,\"^3C\",\"bNw\",536870913]],[\"^3R\",[40,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3Y\",true,\"^4:\",\"^4;\"],536870913]],[\"^3R\",[40,\"^2R\",\"Priority\",536870913]],[\"^3R\",[40,\"^3<\",\"property\",536870913]],[\"^3R\",[40,\"^1G\",1727187033525,536870913]],[\"^3R\",[40,\"^1A\",\"~u00000002-1714-7859-9500-000000000000\",536870913]],[\"^3R\",[40,\"^@\",\"^A\",536870913]],[\"^3R\",[40,\"^7\",\"^1@\",536870913]],[\"^3R\",[40,\"^?\",true,536870913]],[\"^3R\",[40,\"^J\",\"^K\",536870913]],[\"^3R\",[40,\"^18\",true,536870913]],[\"^3R\",[41,\"^20\",40,536870913]],[\"^3R\",[41,\"^29\",1727187033525,536870913]],[\"^3R\",[41,\"^2O\",\"^3S\",536870913]],[\"^3R\",[41,\"^3C\",\"bNx\",536870913]],[\"^3R\",[41,\"^3G\",40,536870913]],[\"^3R\",[41,\"^38\",40,536870913]],[\"^3R\",[41,\"^2R\",\"Low\",536870913]],[\"^3R\",[41,\"^3<\",\"closed value\",536870913]],[\"^3R\",[41,\"^1G\",1727187033525,536870913]],[\"^3R\",[41,\"^1A\",\"~u00000002-8891-7452-4000-000000000000\",536870913]],[\"^3R\",[41,\"^7\",\"^U\",536870913]],[\"^3R\",[41,\"^18\",true,536870913]],[\"^3R\",[41,\"^2J\",40,536870913]],[\"^3R\",[41,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"priorityLvlLow\"],536870913]],[\"^3R\",[42,\"^20\",40,536870913]],[\"^3R\",[42,\"^29\",1727187033525,536870913]],[\"^3R\",[42,\"^2O\",\"^3S\",536870913]],[\"^3R\",[42,\"^3C\",\"bNy\",536870913]],[\"^3R\",[42,\"^3G\",40,536870913]],[\"^3R\",[42,\"^38\",40,536870913]],[\"^3R\",[42,\"^2R\",\"Medium\",536870913]],[\"^3R\",[42,\"^3<\",\"closed value\",536870913]],[\"^3R\",[42,\"^1G\",1727187033525,536870913]],[\"^3R\",[42,\"^1A\",\"~u00000002-4650-7295-0000-000000000000\",536870913]],[\"^3R\",[42,\"^7\",\"^1L\",536870913]],[\"^3R\",[42,\"^18\",true,536870913]],[\"^3R\",[42,\"^2J\",40,536870913]],[\"^3R\",[42,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"priorityLvlMedium\"],536870913]],[\"^3R\",[43,\"^20\",40,536870913]],[\"^3R\",[43,\"^29\",1727187033525,536870913]],[\"^3R\",[43,\"^2O\",\"^3S\",536870913]],[\"^3R\",[43,\"^3C\",\"bNz\",536870913]],[\"^3R\",[43,\"^3G\",40,536870913]],[\"^3R\",[43,\"^38\",40,536870913]],[\"^3R\",[43,\"^2R\",\"High\",536870913]],[\"^3R\",[43,\"^3<\",\"closed value\",536870913]],[\"^3R\",[43,\"^1G\",1727187033525,536870913]],[\"^3R\",[43,\"^1A\",\"~u00000002-1281-2351-0000-000000000000\",536870913]],[\"^3R\",[43,\"^7\",\"^W\",536870913]],[\"^3R\",[43,\"^18\",true,536870913]],[\"^3R\",[43,\"^2J\",40,536870913]],[\"^3R\",[43,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"priorityLvlHigh\"],536870913]],[\"^3R\",[44,\"^20\",40,536870913]],[\"^3R\",[44,\"^29\",1727187033525,536870913]],[\"^3R\",[44,\"^2O\",\"^3S\",536870913]],[\"^3R\",[44,\"^3C\",\"bO0\",536870913]],[\"^3R\",[44,\"^3G\",40,536870913]],[\"^3R\",[44,\"^38\",40,536870913]],[\"^3R\",[44,\"^2R\",\"Urgent\",536870913]],[\"^3R\",[44,\"^3<\",\"closed value\",536870913]],[\"^3R\",[44,\"^1G\",1727187033525,536870913]],[\"^3R\",[44,\"^1A\",\"~u00000002-4458-8138-1000-000000000000\",536870913]],[\"^3R\",[44,\"^7\",\"^[\",536870913]],[\"^3R\",[44,\"^18\",true,536870913]],[\"^3R\",[44,\"^2J\",40,536870913]],[\"^3R\",[44,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"priorityLvlUrgent\"],536870913]],[\"^3R\",[45,\"^29\",1727187033525,536870913]],[\"^3R\",[45,\"^2O\",\"^3S\",536870913]],[\"^3R\",[45,\"^3H\",\"deadline\",536870913]],[\"^3R\",[45,\"^3C\",\"bO1\",536870913]],[\"^3R\",[45,\"^2B\",[\"^ \",\"^3T\",\"~:date\",\"^3Y\",true,\"^4:\",\"~:block-below\"],536870913]],[\"^3R\",[45,\"^2R\",\"Deadline\",536870913]],[\"^3R\",[45,\"^3<\",\"property\",536870913]],[\"^3R\",[45,\"^1G\",1727187033525,536870913]],[\"^3R\",[45,\"^1A\",\"~u00000002-2149-5604-4000-000000000000\",536870913]],[\"^3R\",[45,\"^@\",\"^A\",536870913]],[\"^3R\",[45,\"^7\",\"^1[\",536870913]],[\"^3R\",[45,\"^?\",true,536870913]],[\"^3R\",[45,\"^J\",\"^K\",536870913]],[\"^3R\",[45,\"^18\",true,536870913]],[\"^3R\",[46,\"^29\",1727187033526,536870913]],[\"^3R\",[46,\"^2O\",\"^3S\",536870913]],[\"^3R\",[46,\"^3H\",\"icon\",536870913]],[\"^3R\",[46,\"^3C\",\"bO2\",536870913]],[\"^3R\",[46,\"^2B\",[\"^ \",\"^3T\",\"^48\"],536870913]],[\"^3R\",[46,\"^2R\",\"Icon\",536870913]],[\"^3R\",[46,\"^3<\",\"property\",536870913]],[\"^3R\",[46,\"^1G\",1727187033526,536870913]],[\"^3R\",[46,\"^1A\",\"~u00000002-5891-2328-5000-000000000000\",536870913]],[\"^3R\",[46,\"^@\",\"^A\",536870913]],[\"^3R\",[46,\"^7\",\"^25\",536870913]],[\"^3R\",[46,\"^?\",true,536870913]],[\"^3R\",[46,\"^18\",true,536870913]],[\"^3R\",[47,\"^29\",1727187033526,536870913]],[\"^3R\",[47,\"^2O\",\"^3S\",536870913]],[\"^3R\",[47,\"^3H\",\"public\",536870913]],[\"^3R\",[47,\"^3C\",\"bO3\",536870913]],[\"^3R\",[47,\"^2B\",[\"^ \",\"^3T\",\"^3U\",\"^3V\",true,\"^3X\",\"^3W\",\"^3Y\",true],536870913]],[\"^3R\",[47,\"^2R\",\"public\",536870913]],[\"^3R\",[47,\"^3<\",\"property\",536870913]],[\"^3R\",[47,\"^1G\",1727187033526,536870913]],[\"^3R\",[47,\"^1A\",\"~u00000002-1705-3327-6500-000000000000\",536870913]],[\"^3R\",[47,\"^@\",\"^A\",536870913]],[\"^3R\",[47,\"^7\",\"^Q\",536870913]],[\"^3R\",[47,\"^?\",true,536870913]],[\"^3R\",[47,\"^18\",true,536870913]],[\"^3R\",[48,\"^29\",1727187033526,536870913]],[\"^3R\",[48,\"^2O\",\"^3S\",536870913]],[\"^3R\",[48,\"^3H\",\"exclude-from-graph-view\",536870913]],[\"^3R\",[48,\"^3C\",\"bO4\",536870913]],[\"^3R\",[48,\"^2B\",[\"^ \",\"^3T\",\"^3U\",\"^3V\",true,\"^3X\",\"^3W\",\"^3Y\",true],536870913]],[\"^3R\",[48,\"^2R\",\"exclude-from-graph-view\",536870913]],[\"^3R\",[48,\"^3<\",\"property\",536870913]],[\"^3R\",[48,\"^1G\",1727187033526,536870913]],[\"^3R\",[48,\"^1A\",\"~u00000002-4524-3306-5000-000000000000\",536870913]],[\"^3R\",[48,\"^@\",\"^A\",536870913]],[\"^3R\",[48,\"^7\",\"^2@\",536870913]],[\"^3R\",[48,\"^?\",true,536870913]],[\"^3R\",[48,\"^18\",true,536870913]],[\"^3R\",[49,\"^29\",1727187033526,536870913]],[\"^3R\",[49,\"^2O\",\"^3S\",536870913]],[\"^3R\",[49,\"^3H\",\"description\",536870913]],[\"^3R\",[49,\"^3C\",\"bO5\",536870913]],[\"^3R\",[49,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3Y\",true],536870913]],[\"^3R\",[49,\"^2R\",\"Description\",536870913]],[\"^3R\",[49,\"^3<\",\"property\",536870913]],[\"^3R\",[49,\"^1G\",1727187033526,536870913]],[\"^3R\",[49,\"^1A\",\"~u00000002-3362-3620-0000-000000000000\",536870913]],[\"^3R\",[49,\"^@\",\"^A\",536870913]],[\"^3R\",[49,\"^7\",\"^2E\",536870913]],[\"^3R\",[49,\"^?\",true,536870913]],[\"^3R\",[49,\"^J\",\"^K\",536870913]],[\"^3R\",[49,\"^18\",true,536870913]],[\"^3R\",[50,\"^29\",1727187033526,536870913]],[\"^3R\",[50,\"^2O\",\"^3S\",536870913]],[\"^3R\",[50,\"^3H\",\"view type\",536870913]],[\"^3R\",[50,\"^3C\",\"bO6\",536870913]],[\"^3R\",[50,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3Y\",false,\"^3V\",true],536870913]],[\"^3R\",[50,\"^2R\",\"View Type\",536870913]],[\"^3R\",[50,\"^3<\",\"property\",536870913]],[\"^3R\",[50,\"^1G\",1727187033526,536870913]],[\"^3R\",[50,\"^1A\",\"~u00000002-2182-3760-7000-000000000000\",536870913]],[\"^3R\",[50,\"^@\",\"^A\",536870913]],[\"^3R\",[50,\"^7\",\"^1=\",536870913]],[\"^3R\",[50,\"^?\",true,536870913]],[\"^3R\",[50,\"^J\",\"^K\",536870913]],[\"^3R\",[50,\"^18\",true,536870913]],[\"^3R\",[51,\"^20\",50,536870913]],[\"^3R\",[51,\"^29\",1727187033526,536870913]],[\"^3R\",[51,\"^2O\",\"^3S\",536870913]],[\"^3R\",[51,\"^3C\",\"bO7\",536870913]],[\"^3R\",[51,\"^3G\",50,536870913]],[\"^3R\",[51,\"^38\",50,536870913]],[\"^3R\",[51,\"^2R\",\"Table View\",536870913]],[\"^3R\",[51,\"^3<\",\"closed value\",536870913]],[\"^3R\",[51,\"^1G\",1727187033526,536870913]],[\"^3R\",[51,\"^1A\",\"~u00000002-1942-5424-0000-000000000000\",536870913]],[\"^3R\",[51,\"^7\",\"^6\",536870913]],[\"^3R\",[51,\"^18\",true,536870913]],[\"^3R\",[51,\"^2J\",50,536870913]],[\"^3R\",[52,\"^20\",50,536870913]],[\"^3R\",[52,\"^29\",1727187033526,536870913]],[\"^3R\",[52,\"^2O\",\"^3S\",536870913]],[\"^3R\",[52,\"^3C\",\"bO8\",536870913]],[\"^3R\",[52,\"^3G\",50,536870913]],[\"^3R\",[52,\"^38\",50,536870913]],[\"^3R\",[52,\"^2R\",\"List View\",536870913]],[\"^3R\",[52,\"^3<\",\"closed value\",536870913]],[\"^3R\",[52,\"^1G\",1727187033526,536870913]],[\"^3R\",[52,\"^1A\",\"~u00000002-1164-8285-0200-000000000000\",536870913]],[\"^3R\",[52,\"^7\",\"^1M\",536870913]],[\"^3R\",[52,\"^18\",true,536870913]],[\"^3R\",[52,\"^2J\",50,536870913]],[\"^3R\",[53,\"^29\",1727187033526,536870913]],[\"^3R\",[53,\"^2O\",\"^3S\",536870913]],[\"^3R\",[53,\"^3H\",\"sorting\",536870913]],[\"^3R\",[53,\"^3C\",\"bO9\",536870913]],[\"^3R\",[53,\"^2B\",[\"^ \",\"^3T\",\"~:coll\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[53,\"^2R\",\"sorting\",536870913]],[\"^3R\",[53,\"^3<\",\"property\",536870913]],[\"^3R\",[53,\"^1G\",1727187033526,536870913]],[\"^3R\",[53,\"^1A\",\"~u00000002-2081-0259-4000-000000000000\",536870913]],[\"^3R\",[53,\"^@\",\"^A\",536870913]],[\"^3R\",[53,\"^7\",\"^L\",536870913]],[\"^3R\",[53,\"^?\",true,536870913]],[\"^3R\",[53,\"^18\",true,536870913]],[\"^3R\",[54,\"^29\",1727187033526,536870913]],[\"^3R\",[54,\"^2O\",\"^3S\",536870913]],[\"^3R\",[54,\"^3H\",\"filters\",536870913]],[\"^3R\",[54,\"^3C\",\"bOA\",536870913]],[\"^3R\",[54,\"^2B\",[\"^ \",\"^3T\",\"^4@\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[54,\"^2R\",\"filters\",536870913]],[\"^3R\",[54,\"^3<\",\"property\",536870913]],[\"^3R\",[54,\"^1G\",1727187033526,536870913]],[\"^3R\",[54,\"^1A\",\"~u00000002-1702-3936-3300-000000000000\",536870913]],[\"^3R\",[54,\"^@\",\"^A\",536870913]],[\"^3R\",[54,\"^7\",\"^2Y\",536870913]],[\"^3R\",[54,\"^?\",true,536870913]],[\"^3R\",[54,\"^18\",true,536870913]],[\"^3R\",[55,\"^29\",1727187033526,536870913]],[\"^3R\",[55,\"^2O\",\"^3S\",536870913]],[\"^3R\",[55,\"^3H\",\"hidden-columns\",536870913]],[\"^3R\",[55,\"^3C\",\"bOB\",536870913]],[\"^3R\",[55,\"^2B\",[\"^ \",\"^3T\",\"^46\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[55,\"^2R\",\"hidden-columns\",536870913]],[\"^3R\",[55,\"^3<\",\"property\",536870913]],[\"^3R\",[55,\"^1G\",1727187033526,536870913]],[\"^3R\",[55,\"^1A\",\"~u00000002-9750-5719-2000-000000000000\",536870913]],[\"^3R\",[55,\"^@\",\"^13\",536870913]],[\"^3R\",[55,\"^7\",\"^1D\",536870913]],[\"^3R\",[55,\"^?\",true,536870913]],[\"^3R\",[55,\"^18\",true,536870913]],[\"^3R\",[56,\"^29\",1727187033526,536870913]],[\"^3R\",[56,\"^2O\",\"^3S\",536870913]],[\"^3R\",[56,\"^3H\",\"ordered-columns\",536870913]],[\"^3R\",[56,\"^3C\",\"bOC\",536870913]],[\"^3R\",[56,\"^2B\",[\"^ \",\"^3T\",\"^4@\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[56,\"^2R\",\"ordered-columns\",536870913]],[\"^3R\",[56,\"^3<\",\"property\",536870913]],[\"^3R\",[56,\"^1G\",1727187033526,536870913]],[\"^3R\",[56,\"^1A\",\"~u00000002-1485-5871-0000-000000000000\",536870913]],[\"^3R\",[56,\"^@\",\"^A\",536870913]],[\"^3R\",[56,\"^7\",\"^35\",536870913]],[\"^3R\",[56,\"^?\",true,536870913]],[\"^3R\",[56,\"^18\",true,536870913]],[\"^3R\",[57,\"^29\",1727187033526,536870913]],[\"^3R\",[57,\"^2O\",\"^3S\",536870913]],[\"^3R\",[57,\"^3H\",\"sized-columns\",536870913]],[\"^3R\",[57,\"^3C\",\"bOD\",536870913]],[\"^3R\",[57,\"^2B\",[\"^ \",\"^3T\",\"^48\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[57,\"^2R\",\"sized-columns\",536870913]],[\"^3R\",[57,\"^3<\",\"property\",536870913]],[\"^3R\",[57,\"^1G\",1727187033526,536870913]],[\"^3R\",[57,\"^1A\",\"~u00000002-1675-5105-5500-000000000000\",536870913]],[\"^3R\",[57,\"^@\",\"^A\",536870913]],[\"^3R\",[57,\"^7\",\"^11\",536870913]],[\"^3R\",[57,\"^?\",true,536870913]],[\"^3R\",[57,\"^18\",true,536870913]],[\"^3R\",[58,\"^29\",1727187033526,536870913]],[\"^3R\",[58,\"^2O\",\"^3S\",536870913]],[\"^3R\",[58,\"^3H\",\"view-for\",536870913]],[\"^3R\",[58,\"^3C\",\"bOE\",536870913]],[\"^3R\",[58,\"^2B\",[\"^ \",\"^3T\",\"^3[\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[58,\"^2R\",\"view-for\",536870913]],[\"^3R\",[58,\"^3<\",\"property\",536870913]],[\"^3R\",[58,\"^1G\",1727187033526,536870913]],[\"^3R\",[58,\"^1A\",\"~u00000002-3627-4319-0000-000000000000\",536870913]],[\"^3R\",[58,\"^@\",\"^A\",536870913]],[\"^3R\",[58,\"^7\",\"^2H\",536870913]],[\"^3R\",[58,\"^?\",true,536870913]],[\"^3R\",[58,\"^J\",\"^K\",536870913]],[\"^3R\",[58,\"^18\",true,536870913]],[\"^3R\",[59,\"^29\",1727187033526,536870913]],[\"^3R\",[59,\"^2O\",\"^3S\",536870913]],[\"^3R\",[59,\"^3H\",\"remote-metadata\",536870913]],[\"^3R\",[59,\"^3C\",\"bOF\",536870913]],[\"^3R\",[59,\"^2B\",[\"^ \",\"^3T\",\"^48\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[59,\"^2R\",\"remote-metadata\",536870913]],[\"^3R\",[59,\"^3<\",\"property\",536870913]],[\"^3R\",[59,\"^1G\",1727187033526,536870913]],[\"^3R\",[59,\"^1A\",\"~u00000002-9907-5046-9000-000000000000\",536870913]],[\"^3R\",[59,\"^@\",\"^A\",536870913]],[\"^3R\",[59,\"^7\",\"^3B\",536870913]],[\"^3R\",[59,\"^?\",true,536870913]],[\"^3R\",[59,\"^18\",true,536870913]],[\"^3R\",[60,\"^29\",1727187033526,536870913]],[\"^3R\",[60,\"^2O\",\"^3S\",536870913]],[\"^3R\",[60,\"^3H\",\"due\",536870913]],[\"^3R\",[60,\"^3C\",\"bOG\",536870913]],[\"^3R\",[60,\"^2B\",[\"^ \",\"^3T\",\"~:datetime\",\"^3V\",false,\"^3Y\",false],536870913]],[\"^3R\",[60,\"^2R\",\"Due\",536870913]],[\"^3R\",[60,\"^3<\",\"property\",536870913]],[\"^3R\",[60,\"^1G\",1727187033526,536870913]],[\"^3R\",[60,\"^1A\",\"~u00000002-1089-0805-4900-000000000000\",536870913]],[\"^3R\",[60,\"^@\",\"^A\",536870913]],[\"^3R\",[60,\"^7\",\"^3D\",536870913]],[\"^3R\",[60,\"^?\",true,536870913]],[\"^3R\",[60,\"^18\",true,536870913]],[\"^3R\",[61,\"^29\",1727187033526,536870913]],[\"^3R\",[61,\"^2O\",\"^3S\",536870913]],[\"^3R\",[61,\"^3H\",\"state\",536870913]],[\"^3R\",[61,\"^3C\",\"bOH\",536870913]],[\"^3R\",[61,\"^2B\",[\"^ \",\"^3T\",\"^48\",\"^3V\",false,\"^3Y\",false],536870913]],[\"^3R\",[61,\"^2R\",\"State\",536870913]],[\"^3R\",[61,\"^3<\",\"property\",536870913]],[\"^3R\",[61,\"^1G\",1727187033526,536870913]],[\"^3R\",[61,\"^1A\",\"~u00000002-1165-1650-8700-000000000000\",536870913]],[\"^3R\",[61,\"^@\",\"^A\",536870913]],[\"^3R\",[61,\"^7\",\"^>\",536870913]],[\"^3R\",[61,\"^?\",true,536870913]],[\"^3R\",[61,\"^18\",true,536870913]],[\"^3R\",[62,\"^29\",1727187033526,536870913]],[\"^3R\",[62,\"^2O\",\"^3S\",536870913]],[\"^3R\",[62,\"^3H\",\"task\",536870913]],[\"^3R\",[62,\"^2R\",\"Task\",536870913]],[\"^3R\",[62,\"^3<\",\"class\",536870913]],[\"^3R\",[62,\"^1G\",1727187033526,536870913]],[\"^3R\",[62,\"^1A\",\"~u00000002-1282-1814-5700-000000000000\",536870913]],[\"^3R\",[62,\"^7\",\"^2:\",536870913]],[\"^3R\",[62,\"^18\",true,536870913]],[\"^3R\",[62,\"^1J\",6,536870913]],[\"^3R\",[62,\"^1O\",33,536870913]],[\"^3R\",[62,\"^1O\",40,536870913]],[\"^3R\",[62,\"^1O\",45,536870913]],[\"^3R\",[63,\"^29\",1727187033527,536870913]],[\"^3R\",[63,\"^2O\",\"^3S\",536870913]],[\"^3R\",[63,\"^3H\",\"journal\",536870913]],[\"^3R\",[63,\"^2R\",\"Journal\",536870913]],[\"^3R\",[63,\"^3<\",\"class\",536870913]],[\"^3R\",[63,\"^1G\",1727187033527,536870913]],[\"^3R\",[63,\"^1A\",\"~u00000002-1979-7410-8100-000000000000\",536870913]],[\"^3R\",[63,\"^7\",\"^3=\",536870913]],[\"^3R\",[63,\"^18\",true,536870913]],[\"^3R\",[63,\"^1J\",6,536870913]],[\"^3R\",[63,\"^3\",\"MMM do, yyyy\",536870913]],[\"^3R\",[64,\"^29\",1727187033527,536870913]],[\"^3R\",[64,\"^2O\",\"^3S\",536870913]],[\"^3R\",[64,\"^3H\",\"query\",536870913]],[\"^3R\",[64,\"^2R\",\"Query\",536870913]],[\"^3R\",[64,\"^3<\",\"class\",536870913]],[\"^3R\",[64,\"^1G\",1727187033527,536870913]],[\"^3R\",[64,\"^1A\",\"~u00000002-2324-8016-6000-000000000000\",536870913]],[\"^3R\",[64,\"^7\",\"^5\",536870913]],[\"^3R\",[64,\"^18\",true,536870913]],[\"^3R\",[64,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"search\"],536870913]],[\"^3R\",[64,\"^1J\",6,536870913]],[\"^3R\",[64,\"^1O\",13,536870913]],[\"^3R\",[65,\"^29\",1727187033527,536870913]],[\"^3R\",[65,\"^2O\",\"^3S\",536870913]],[\"^3R\",[65,\"^3H\",\"advanced query\",536870913]],[\"^3R\",[65,\"^2R\",\"Advanced query\",536870913]],[\"^3R\",[65,\"^3<\",\"class\",536870913]],[\"^3R\",[65,\"^1G\",1727187033527,536870913]],[\"^3R\",[65,\"^1A\",\"~u00000002-1141-5857-5800-000000000000\",536870913]],[\"^3R\",[65,\"^7\",\"^=\",536870913]],[\"^3R\",[65,\"^18\",true,536870913]],[\"^3R\",[65,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"search\"],536870913]],[\"^3R\",[65,\"^1J\",64,536870913]],[\"^3R\",[66,\"^29\",1727187033527,536870913]],[\"^3R\",[66,\"^2O\",\"^3S\",536870913]],[\"^3R\",[66,\"^3H\",\"card\",536870913]],[\"^3R\",[66,\"^2R\",\"Card\",536870913]],[\"^3R\",[66,\"^3<\",\"class\",536870913]],[\"^3R\",[66,\"^1G\",1727187033527,536870913]],[\"^3R\",[66,\"^1A\",\"~u00000002-1358-2811-0900-000000000000\",536870913]],[\"^3R\",[66,\"^7\",\"^H\",536870913]],[\"^3R\",[66,\"^18\",true,536870913]],[\"^3R\",[66,\"^1J\",6,536870913]],[\"^3R\",[66,\"^1O\",60,536870913]],[\"^3R\",[66,\"^1O\",61,536870913]],[\"^3R\",[67,\"^29\",1727187033527,536870913]],[\"^3R\",[67,\"^2O\",\"^3S\",536870913]],[\"^3R\",[67,\"^3H\",\"cards\",536870913]],[\"^3R\",[67,\"^2R\",\"Cards\",536870913]],[\"^3R\",[67,\"^3<\",\"class\",536870913]],[\"^3R\",[67,\"^1G\",1727187033527,536870913]],[\"^3R\",[67,\"^1A\",\"~u00000002-1284-2651-6700-000000000000\",536870913]],[\"^3R\",[67,\"^7\",\"^P\",536870913]],[\"^3R\",[67,\"^18\",true,536870913]],[\"^3R\",[67,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"search\"],536870913]],[\"^3R\",[67,\"^1J\",64,536870913]],[\"^3R\",[68,\"^1A\",\"~u66f2c859-0e01-4f36-81c2-db5c0eb86adf\",536870913]],[\"^3R\",[68,\"^V\",\"{:meta/version 1\\n\\n ;; Set the preferred format.\\n ;; This is _only_ for file graphs.\\n ;; Available options:\\n ;; - Markdown (default)\\n ;; - Org\\n ;; :preferred-format \\\"Markdown\\\"\\n\\n ;; Set the preferred workflow style.\\n ;; This is _only_ for file graphs.\\n ;; Available options:\\n ;; - :now for NOW/LATER style (default)\\n ;; - :todo for TODO/DOING style\\n ;; Exclude directories/files.\\n ;; This is _only_ for file graphs.\\n ;; Example usage:\\n ;; :hidden [\\\"/archived\\\" \\\"/test.md\\\" \\\"../assets/archived\\\"]\\n ;; Define the default journal page template.\\n ;; Enter the template name between the quotes.\\n :default-templates\\n {:journals \\\"\\\"}\\n\\n ;; Set a custom date format for the journal page title.\\n ;; This is _only_ for file graphs.\\n ;; Default value: \\\"MMM do, yyyy\\\"\\n ;; e.g., \\\"Jan 19th, 2038\\\"\\n ;; Example usage e.g., \\\"Tue 19th, Jan 2038\\\"\\n ;; :journal/page-title-format \\\"EEE do, MMM yyyy\\\"\\n\\n ;; Specify the journal filename format using a valid date format string.\\n ;; !Warning:\\n ;; This configuration is not retroactive and affects only new journals.\\n ;; To show old journal files in the app, manually rename the files in the\\n ;; journal directory to match the new format.\\n ;; Default value: \\\"yyyy_MM_dd\\\"\\n ;; :journal/file-name-format \\\"yyyy_MM_dd\\\"\\n\\n ;; Enable tooltip preview on hover.\\n ;; Default value: true\\n :ui/enable-tooltip? true\\n\\n ;; Display brackets [[]] around page references.\\n ;; Default value: true\\n ;; :ui/show-brackets? true\\n\\n ;; Display all lines of a block when referencing ((block)).\\n ;; Default value: false\\n :ui/show-full-blocks? false\\n\\n ;; Automatically expand block references when zooming in.\\n ;; Default value: true\\n :ui/auto-expand-block-refs? true\\n\\n ;; Hide empty block properties\\n ;; This is _only_ for DB graphs.\\n ;; Default value: false\\n ;; :ui/hide-empty-properties? false\\n\\n ;; Disable accent marks when searching.\\n ;; After changing this setting, rebuild the search index by pressing (^C ^S).\\n ;; Default value: true\\n :feature/enable-search-remove-accents? true\\n\\n ;; Enable journals.\\n ;; Default value: true\\n ;; :feature/enable-journals? true\\n\\n ;; Enable flashcards.\\n ;; Default value: true\\n ;; :feature/enable-flashcards? true\\n\\n ;; Enable whiteboards.\\n ;; Default value: true\\n ;; :feature/enable-whiteboards? true\\n\\n ;; Disable the journal's built-in 'Scheduled tasks and deadlines' query.\\n ;; Default value: false\\n ;; :feature/disable-scheduled-and-deadline-query? false\\n\\n ;; Specify the number of days displayed in the future for\\n ;; the 'scheduled tasks and deadlines' query.\\n ;; Example usage:\\n ;; Display all scheduled and deadline blocks for the next 14 days:\\n ;; :scheduled/future-days 14\\n ;; Default value: 7\\n ;; :scheduled/future-days 7\\n\\n ;; Specify the first day of the week.\\n ;; Available options:\\n ;; - integer from 0 to 6 (Monday to Sunday)\\n ;; Default value: 6 (Sunday)\\n :start-of-week 6\\n\\n ;; Specify a custom CSS import.\\n ;; This option takes precedence over the local `logseq/custom.css` file.\\n ;; Example usage:\\n ;; :custom-css-url \\\"@import url('https://cdn.jsdelivr.net/gh/dracula/logseq@master/custom.css');\\\"\\n\\n ;; Specify a custom JS import.\\n ;; This option takes precedence over the local `logseq/custom.js` file.\\n ;; Example usage:\\n ;; :custom-js-url \\\"https://cdn.logseq.com/custom.js\\\"\\n\\n ;; Set bullet indentation when exporting\\n ;; Available options:\\n ;; - `:eight-spaces` as eight spaces\\n ;; - `:four-spaces` as four spaces\\n ;; - `:two-spaces` as two spaces\\n ;; - `:tab` as a tab character (default)\\n ;; :export/bullet-indentation :tab\\n\\n ;; Publish all pages within the Graph\\n ;; Regardless of whether individual pages have been marked as public.\\n ;; Default value: false\\n ;; :publishing/all-pages-public? false\\n\\n ;; Define the default home page and sidebar status.\\n ;; If unspecified, the journal page will be loaded on startup and the right sidebar will stay hidden.\\n ;; The `:page` value represents the name of the page displayed at startup.\\n ;; Available options for `:sidebar` are:\\n ;; - \\\"Contents\\\" to display the Contents page in the right sidebar.\\n ;; - A specific page name to display in the right sidebar.\\n ;; - An array of multiple pages, e.g., [\\\"Contents\\\" \\\"Page A\\\" \\\"Page B\\\"].\\n ;; If `:sidebar` remains unset, the right sidebar will stay hidden.\\n ;; Examples:\\n ;; 1. Set \\\"Changelog\\\" as the home page and display \\\"Contents\\\" in the right sidebar:\\n ;; :default-home {:page \\\"Changelog\\\", :sidebar \\\"Contents\\\"}\\n ;; 2. Set \\\"Jun 3rd, 2021\\\" as the home page without the right sidebar:\\n ;; :default-home {:page \\\"Jun 3rd, 2021\\\"}\\n ;; 3. Set \\\"home\\\" as the home page and display multiple pages in the right sidebar:\\n ;; :default-home {:page \\\"home\\\", :sidebar [\\\"Page A\\\" \\\"Page B\\\"]}\\n\\n ;; Set the default location for storing notes.\\n ;; Default value: \\\"pages\\\"\\n ;; :pages-directory \\\"pages\\\"\\n\\n ;; Set the default location for storing journals.\\n ;; Default value: \\\"journals\\\"\\n ;; :journals-directory \\\"journals\\\"\\n\\n ;; Set the default location for storing whiteboards.\\n ;; Default value: \\\"whiteboards\\\"\\n ;; :whiteboards-directory \\\"whiteboards\\\"\\n\\n ;; Enabling this option converts\\n ;; This is _only_ for file graphs.\\n ;; [[Grant Ideas]] to [[file:./grant_ideas.org][Grant Ideas]] for org-mode.\\n ;; For more information, visit https://github.com/logseq/logseq/issues/672\\n ;; :org-mode/insert-file-link? false\\n\\n ;; Configure custom shortcuts.\\n ;; Syntax:\\n ;; 1. + indicates simultaneous key presses, e.g., `Ctrl+Shift+a`.\\n ;; 2. A space between keys represents key chords, e.g., `t s` means\\n ;; pressing `t` followed by `s`.\\n ;; 3. mod refers to `Ctrl` for Windows/Linux and `Command` for Mac.\\n ;; 4. Use false to disable a specific shortcut.\\n ;; 5. You can define multiple bindings for a single action, e.g., [\\\"ctrl+j\\\" \\\"down\\\"].\\n ;; The full list of configurable shortcuts is available at:\\n ;; https://github.com/logseq/logseq/blob/master/src/main/frontend/modules/shortcut/config.cljs\\n ;; Example:\\n ;; :shortcuts\\n ;; {:editor/new-block \\\"enter\\\"\\n ;; :editor/new-line \\\"shift+enter\\\"\\n ;; :editor/insert-link \\\"mod+shift+k\\\"\\n ;; :editor/highlight false\\n ;; :ui/toggle-settings \\\"t s\\\"\\n ;; :editor/up [\\\"ctrl+k\\\" \\\"up\\\"]\\n ;; :editor/down [\\\"ctrl+j\\\" \\\"down\\\"]\\n ;; :editor/left [\\\"ctrl+h\\\" \\\"left\\\"]\\n ;; :editor/right [\\\"ctrl+l\\\" \\\"right\\\"]}\\n :shortcuts {}\\n\\n ;; Configure the behavior of pressing Enter in document mode.\\n ;; if set to true, pressing Enter will create a new block.\\n ;; Default value: false\\n :shortcut/doc-mode-enter-for-new-block? false\\n\\n ;; Block content larger than `block/title-max-length` will not be searchable\\n ;; or editable for performance.\\n ;; Default value: 10000\\n :block/title-max-length 10000\\n\\n ;; Display command documentation on hover.\\n ;; Default value: true\\n :ui/show-command-doc? true\\n\\n ;; Display empty bullet points.\\n ;; Default value: false\\n :ui/show-empty-bullets? false\\n\\n ;; Pre-defined :view function to use with advanced queries.\\n :query/views\\n {:pprint\\n (fn [r] [:pre.code (pprint r)])}\\n\\n ;; Advanced queries `:result-transform` function.\\n ;; Transform the query result before displaying it.\\n ;; Example usage for DB graphs:\\n;; :query/result-transforms\\n;; {:sort-by-priority\\n;; (fn [result] (sort-by (fn [h] (get h :logseq.property/priority \\\"Z\\\")) result))}\\n\\n;; Queries will be displayed at the bottom of today's journal page.\\n;; Example usage:\\n;; :default-queries\\n;; {:journals []}\\n\\n ;; Add custom commands to the command palette\\n ;; Example usage:\\n ;; :commands\\n ;; [\\n ;; [\\\"js\\\" \\\"Javascript\\\"]\\n ;; [\\\"md\\\" \\\"Markdown\\\"]\\n ;; ]\\n :commands []\\n\\n ;; Enable collapsing blocks with titles but no children.\\n ;; By default, only blocks with children can be collapsed.\\n ;; Setting `:outliner/block-title-collapse-enabled?` to true allows collapsing\\n ;; blocks with titles (multiple lines) and content. For example:\\n ;; - block title\\n ;; block content\\n ;; Default value: false\\n :outliner/block-title-collapse-enabled? false\\n\\n ;; Macros replace texts and will make you more productive.\\n ;; Example usage:\\n ;; Change the :macros value below to:\\n ;; {\\\"poem\\\" \\\"Rose is $1, violet's $2. Life's ordered: Org assists you.\\\"}\\n ;; input \\\"{{poem red,blue}}\\\"\\n ;; becomes\\n ;; Rose is red, violet's blue. Life's ordered: Org assists you.\\n :macros {}\\n\\n ;; Configure the default expansion level for linked references.\\n ;; For example, consider the following block hierarchy:\\n ;; - a [[page]] (level 1)\\n ;; - b (level 2)\\n ;; - c (level 3)\\n ;; - d (level 4)\\n ;;\\n ;; With the default value of level 2, block b will be collapsed.\\n ;; If the level's value is set to 3, block c will be collapsed.\\n ;; Default value: 2\\n :ref/default-open-blocks-level 2\\n\\n ;; Configure the threshold for linked references before collapsing.\\n ;; Default value: 100\\n :ref/linked-references-collapsed-threshold 50\\n\\n ;; Graph view configuration.\\n ;; Example usage:\\n ;; :graph/settings\\n ;; {:orphan-pages? true ; Default value: true\\n ;; :builtin-pages? false ; Default value: false\\n ;; :excluded-pages? false ; Default value: false\\n ;; :journal? false} ; Default value: false\\n\\n ;; Graph view configuration.\\n ;; Example usage:\\n ;; :graph/forcesettings\\n ;; {:link-dist 180 ; Default value: 180\\n ;; :charge-strength -600 ; Default value: -600\\n ;; :charge-range 600} ; Default value: 600\\n\\n\\n ;; Favorites to list on the left sidebar\\n ;; This is _only_ for file graphs.\\n ;; Set flashcards interval.\\n ;; Expected value:\\n ;; - Float between 0 and 1\\n ;; higher values result in faster changes to the next review interval.\\n ;; Default value: 0.5\\n ;; :srs/learning-fraction 0.5\\n\\n ;; Set the initial interval after the first successful review of a card.\\n ;; Default value: 4\\n ;; :srs/initial-interval 4\\n\\n ;; Hide specific block properties.\\n ;; Example usage:\\n ;; :block-hidden-properties #{:public :icon}\\n\\n ;; Create a page for all properties.\\n ;; This is _only_ for file graphs.\\n ;; Default value: true\\n;; Properties to exclude from having property pages\\n ;; This is _only_ for file graphs.\\n ;; Example usage:\\n ;; :property-pages/excludelist #{:duration :author}\\n\\n ;; By default, property value separated by commas will not be treated as\\n ;; page references. You can add properties to enable it.\\n ;; This is _only_ for file graphs.\\n ;; Example usage:\\n ;; :property/separated-by-commas #{:alias :tags}\\n\\n ;; Properties that are ignored when parsing property values for references\\n ;; This is _only_ for file graphs.\\n ;; Example usage:\\n ;; :ignored-page-references-keywords #{:author :website}\\n\\n ;; logbook configuration.\\n ;; :logbook/settings\\n ;; {:with-second-support? false ;limit logbook to minutes, seconds will be eliminated\\n ;; :enabled-in-all-blocks true ;display logbook in all blocks after timetracking\\n ;; :enabled-in-timestamped-blocks false ;don't display logbook at all\\n ;; }\\n\\n ;; Mobile photo upload configuration.\\n ;; :mobile/photo\\n ;; {:allow-editing? true\\n ;; :quality 80}\\n\\n ;; Mobile features options\\n ;; Gestures\\n ;; Example usage:\\n ;; :mobile\\n ;; {:gestures/disabled-in-block-with-tags [\\\"kanban\\\"]}\\n\\n ;; Extra CodeMirror options\\n ;; See https://codemirror.net/5/doc/manual.html#config for possible options\\n ;; Example usage:\\n ;; :editor/extra-codemirror-options\\n ;; {:lineWrapping false ; Default value: false\\n ;; :lineNumbers true ; Default value: true\\n ;; :readOnly false} ; Default value: false\\n\\n ;; Enable logical outdenting\\n ;; Default value: false\\n ;; :editor/logical-outdenting? false\\n\\n ;; Prefer pasting the file when text and a file are in the clipboard.\\n ;; Default value: false\\n ;; :editor/preferred-pasting-file? false\\n\\n ;; Quick capture templates for receiving content from other apps.\\n ;; Each template contains three elements {time}, {text} and {url}, which can be auto-expanded\\n ;; by receiving content from other apps. Note: the {} cannot be omitted.\\n ;; - {time}: capture time\\n ;; - {date}: capture date using current date format, use `[[{date}]]` to get a page reference\\n ;; - {text}: text that users selected before sharing.\\n ;; - {url}: URL or assets path for media files stored in Logseq.\\n ;; You can also reorder them or use only one or two of them in the template.\\n ;; You can also insert or format any text in the template, as shown in the following examples.\\n ;; :quick-capture-templates\\n ;; {:text \\\"[[quick capture]] **{time}**: {text} from {url}\\\"\\n ;; :media \\\"[[quick capture]] **{time}**: {url}\\\"}\\n\\n ;; Quick capture options.\\n ;; - insert-today? Insert the capture at the end of today's journal page (boolean).\\n ;; - redirect-page? Redirect to the quick capture page after capturing (boolean).\\n ;; - default-page The default page to capture to if insert-today? is false (string).\\n ;; :quick-capture-options\\n ;; {:insert-today? false ;; Default value: true\\n ;; :redirect-page? false ;; Default value: false\\n ;; :default-page \\\"quick capture\\\"} ;; Default page: \\\"quick capture\\\"\\n\\n ;; File sync options\\n ;; Ignore these files when syncing, regexp is supported.\\n ;; :file-sync/ignore-files []\\n\\n ;; Configure the Enter key behavior for\\n ;; context-aware editing with DWIM (Do What I Mean).\\n ;; context-aware Enter key behavior implies that pressing Enter will\\n ;; have different outcomes based on the context.\\n ;; For instance, pressing Enter within a list generates a new list item,\\n ;; whereas pressing Enter in a block reference opens the referenced block.\\n ;; :dwim/settings\\n ;; {:admonition&src? true ;; Default value: true\\n ;; :markup? false ;; Default value: false\\n ;; :block-ref? true ;; Default value: true\\n ;; :page-ref? true ;; Default value: true\\n ;; :properties? true ;; Default value: true\\n ;; :list? false} ;; Default value: false\\n\\n ;; Configure the escaping method for special characters in page titles.\\n ;; This is _only_ for file graphs.\\n ;; Warning:\\n ;; This is a dangerous operation. To modify the setting,\\n ;; you'll need to manually rename all affected files and\\n ;; re-index them on all clients after synchronization.\\n ;; Incorrect handling may result in messy page titles.\\n ;; Available options:\\n ;; - :triple-lowbar (default)\\n ;; ;use triple underscore `___` for slash `/` in page title\\n ;; ;use Percent-encoding for other invalid characters\\n}\\n\",536870913]],[\"^3R\",[68,\"^8\",\"~m1727187033523\",536870913]],[\"^3R\",[68,\"^23\",\"~m1727187033523\",536870913]],[\"^3R\",[68,\"^3I\",\"logseq/config.edn\",536870913]],[\"^3R\",[69,\"^1A\",\"~u66f2c859-fb71-49ad-b56f-b177b647ed89\",536870913]],[\"^3R\",[69,\"^V\",\"\",536870913]],[\"^3R\",[69,\"^8\",\"~m1727187033523\",536870913]],[\"^3R\",[69,\"^23\",\"~m1727187033523\",536870913]],[\"^3R\",[69,\"^3I\",\"logseq/custom.css\",536870913]],[\"^3R\",[70,\"^1A\",\"~u66f2c859-a95c-4b95-96dc-339b7181e86e\",536870913]],[\"^3R\",[70,\"^V\",\"\",536870913]],[\"^3R\",[70,\"^8\",\"~m1727187033523\",536870913]],[\"^3R\",[70,\"^23\",\"~m1727187033523\",536870913]],[\"^3R\",[70,\"^3I\",\"logseq/custom.js\",536870913]],[\"^3R\",[71,\"^29\",1727187033527,536870913]],[\"^3R\",[71,\"^2O\",\"^3S\",536870913]],[\"^3R\",[71,\"^3H\",\"contents\",536870913]],[\"^3R\",[71,\"^2R\",\"Contents\",536870913]],[\"^3R\",[71,\"^3<\",\"page\",536870913]],[\"^3R\",[71,\"^1G\",1727187033527,536870913]],[\"^3R\",[71,\"^1A\",\"~u66f2c859-d18d-433a-bd24-ab24995cfae1\",536870913]],[\"^3R\",[71,\"^18\",true,536870913]],[\"^3R\",[72,\"^29\",1727187033588,536870914]],[\"^3R\",[72,\"^2O\",\"^3S\",536870914]],[\"^3R\",[72,\"^3H\",\"$$$views\",536870914]],[\"^3R\",[72,\"^2R\",\"$$$views\",536870914]],[\"^3R\",[72,\"^3<\",\"hidden\",536870914]],[\"^3R\",[72,\"^1G\",1727187033588,536870914]],[\"^3R\",[72,\"^1A\",\"~u66f2c859-f1f7-40da-8854-604ef354f7ff\",536870914]],[\"^3R\",[73,\"^29\",1727187033588,536870914]],[\"^3R\",[73,\"^2O\",\"^3S\",536870914]],[\"^3R\",[73,\"^3C\",\"bOI\",536870914]],[\"^3R\",[73,\"^3G\",72,536870914]],[\"^3R\",[73,\"^38\",72,536870914]],[\"^3R\",[73,\"^2R\",\"All Pages Default View\",536870914]],[\"^3R\",[73,\"^1G\",1727187033588,536870914]],[\"^3R\",[73,\"^1A\",\"~u66f2c859-9076-4a30-a788-533c01d02f85\",536870914]],[\"^3R\",[73,\"^18\",true,536870914]],[\"^3R\",[73,\"^2H\",72,536870914]],[\"^3R\",[74,\"^29\",1727187033721,536870915]],[\"^3R\",[74,\"^2O\",\"^3S\",536870915]],[\"^3R\",[74,\"^2L\",20240924,536870915]],[\"^3R\",[74,\"^3H\",\"sep 24th, 2024\",536870915]],[\"^3R\",[74,\"^37\",9,536870918]],[\"^3R\",[74,\"^37\",63,536870918]],[\"^3R\",[74,\"^1R\",9,536870917]],[\"^3R\",[74,\"^1R\",63,536870917]],[\"^3R\",[74,\"^1E\",63,536870915]],[\"^3R\",[74,\"^2R\",\"Sep 24th, 2024\",536870915]],[\"^3R\",[74,\"^C\",536870917,536870918]],[\"^3R\",[74,\"^3<\",\"journal\",536870915]],[\"^3R\",[74,\"^1G\",1727187033721,536870915]],[\"^3R\",[74,\"^1A\",\"~u00000001-2024-0924-0000-000000000000\",536870915]],[\"^3R\",[75,\"^29\",1727187033722,536870915]],[\"^3R\",[75,\"^2O\",\"^3S\",536870915]],[\"^3R\",[75,\"^3C\",\"a0\",536870915]],[\"^3R\",[75,\"^3G\",74,536870915]],[\"^3R\",[75,\"^38\",74,536870915]],[\"^3R\",[75,\"^37\",74,536870918]],[\"^3R\",[75,\"^2R\",\"\",536870915]],[\"^3R\",[75,\"^C\",536870917,536870918]],[\"^3R\",[75,\"^1G\",1727187033722,536870915]],[\"^3R\",[75,\"^1A\",\"~u66f2c859-8d26-4147-b6dc-a7f93fbd3989\",536870915]]]]]]") + "[\"~#datascript/DB\",[\"^ \",\"~:schema\",[\"^ \",\"~i32\",\"~:logseq.property.journal/title-format\",\"~i64\",\"~:logseq.class/Query\",\"~:logseq.property.view/type.table\",[\"^ \",\"~:db/ident\",\"^6\"],\"~:file/created-at\",[\"^ \"],\"~i1\",\"~:logseq.kv/db-type\",\"~i33\",\"~:logseq.property/status\",\"~i65\",\"~:logseq.class/Advanced-Query\",\"~:logseq.property.fsrs/state\",[\"^ \",\"~:db/index\",true,\"~:db/cardinality\",\"~:db.cardinality/one\",\"^7\",\"^>\"],\"~:logseq.kv/graph-initial-schema-version\",[\"^ \",\"^7\",\"^B\"],\"~:block/tx-id\",[\"^ \"],\"~i2\",\"~:logseq.kv/schema-version\",\"~i34\",\"~:logseq.property/status.backlog\",\"~i66\",\"~:logseq.class/Card\",\"~:logseq.property.pdf/file-path\",[\"^ \",\"^?\",true,\"~:db/valueType\",\"~:db.type/ref\",\"^@\",\"^A\",\"^7\",\"^I\"],\"~:logseq.property.table/sorting\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^L\"],\"~i3\",\"^B\",\"~i35\",\"~:logseq.property/status.todo\",\"~i67\",\"~:logseq.class/Cards\",\"~:logseq.property/public\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^Q\"],\"~i4\",\"~:logseq.kv/graph-created-at\",\"~i36\",\"~:logseq.property/status.doing\",\"~:logseq.property/priority.low\",[\"^ \",\"^7\",\"^U\"],\"~:file/content\",[\"^ \"],\"~:logseq.property/priority.high\",[\"^ \",\"^7\",\"^W\"],\"~i5\",\"~:logseq.property/empty-placeholder\",\"~i37\",\"~:logseq.property/status.in-review\",\"~:logseq.property/priority.urgent\",[\"^ \",\"^7\",\"^[\"],\"~:logseq.property/hl-color\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^10\"],\"~:logseq.property.table/sized-columns\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^11\"],\"~:block/alias\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"~:db.cardinality/many\",\"^7\",\"^12\"],\"~i6\",\"~:logseq.class/Root\",\"~i38\",\"~:logseq.property/status.done\",\"~:kv/value\",[\"^ \"],\"~i7\",\"~:logseq.property/built-in?\",\"~i39\",\"~:logseq.property/status.canceled\",\"~:logseq.property.linked-references/includes\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^13\",\"^7\",\"^1;\"],\"~:block/link\",[\"^ \",\"^J\",\"^K\",\"^?\",true],\"~:logseq.property.view/type\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1=\"],\"~:logseq.property/heading\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^1>\"],\"~i8\",\"^12\",\"~i40\",\"~:logseq.property/priority\",\"~:block/uuid\",[\"^ \",\"~:db/unique\",\"~:db.unique/identity\"],\"~:logseq.property.table/hidden-columns\",[\"^ \",\"^?\",true,\"^@\",\"^13\",\"^7\",\"^1D\"],\"~i9\",\"~:block/tags\",\"~i41\",\"^U\",\"~:block/updated-at\",[\"^ \",\"^?\",true],\"~:asset/uuid\",[\"^ \",\"^1B\",\"^1C\"],\"~i10\",\"~:logseq.property.class/extends\",\"~i42\",\"~:logseq.property/priority.medium\",\"~:logseq.property.view/type.list\",[\"^ \",\"^7\",\"^1M\"],\"^1L\",[\"^ \",\"^7\",\"^1L\"],\"~i11\",\"~:logseq.property.class/properties\",\"~:file/size\",[\"^ \"],\"~i43\",\"^W\",\"~:block/refs\",[\"^ \",\"^J\",\"^K\",\"^@\",\"^13\"],\"^H\",[\"^ \",\"^7\",\"^H\"],\"^1@\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1@\"],\"~i12\",\"~:logseq.property.class/hide-from-node\",\"~i44\",\"^[\",\"^T\",[\"^ \",\"^7\",\"^T\"],\"^D\",[\"^ \",\"^7\",\"^D\"],\"~:logseq.property.pdf/hl-page\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1V\"],\"~:logseq.property/hl-type\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^1W\"],\"~i13\",\"~:logseq.property/query\",\"~i45\",\"~:logseq.property/deadline\",\"~:block/closed-value-property\",[\"^ \",\"^J\",\"^K\",\"^@\",\"^13\"],\"^Z\",[\"^ \",\"^7\",\"^Z\"],\"~i14\",\"~:logseq.property/page-tags\",\"~:file/last-modified-at\",[\"^ \"],\"~i46\",\"~:logseq.property/icon\",\"^16\",[\"^ \",\"^7\",\"^16\"],\"^1O\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^13\",\"^7\",\"^1O\"],\"^1:\",[\"^ \",\"^7\",\"^1:\"],\"~i15\",\"~:logseq.property/background-color\",\"~i47\",\"^Q\",\"~:block/created-at\",[\"^ \",\"^?\",true],\"^22\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^13\",\"^7\",\"^22\"],\"^N\",[\"^ \",\"^7\",\"^N\"],\"~:logseq.class/Task\",[\"^ \",\"^7\",\"^2:\"],\"~:block/collapsed?\",[\"^ \"],\"~:logseq.property.tldraw/page\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^2<\"],\"~i16\",\"~:logseq.property/background-image\",\"~i48\",\"~:logseq.property/exclude-from-graph-view\",\"~:logseq.property/value\",[\"^ \"],\"^18\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^18\"],\"~:block/schema\",[\"^ \"],\"~i17\",\"^1>\",\"~i49\",\"~:logseq.property/description\",\"^1T\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^1T\"],\"~:logseq.property.linked-references/excludes\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^13\",\"^7\",\"^2F\"],\"~:logseq.property/ls-type\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^2G\"],\"^P\",[\"^ \",\"^7\",\"^P\"],\"~:logseq.property/view-for\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^2H\"],\"~i18\",\"~:logseq.property/created-from-property\",\"^1Y\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1Y\"],\"~i50\",\"^1=\",\"^27\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^27\"],\"~:block/journal-day\",[\"^ \",\"^?\",true],\"~i19\",\"^2G\",\"^14\",[\"^ \",\"^7\",\"^14\"],\"~i51\",\"^6\",\"~:block/format\",[\"^ \"],\"^X\",[\"^ \",\"^7\",\"^X\"],\"~i20\",\"^1W\",\"~i52\",\"^1M\",\"^1E\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^13\",\"^7\",\"^1E\"],\"~:block/title\",[\"^ \",\"^?\",true],\"~:logseq.property.tldraw/shape\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^2S\"],\"~:asset/meta\",[\"^ \"],\"^1[\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1[\"],\"~i21\",\"^10\",\"~i53\",\"^L\",\"^2J\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^2J\"],\"^25\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^25\"],\"~i22\",\"^1V\",\"~i54\",\"~:logseq.property.table/filters\",\"^R\",[\"^ \",\"^7\",\"^R\"],\"~i23\",\"~:logseq.property.pdf/hl-stamp\",\"~i55\",\"^1D\",\"~:logseq.property/order-list-type\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^31\"],\"^2@\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^2@\"],\"~i24\",\"~:logseq.property.pdf/hl-value\",\"~i56\",\"~:logseq.property.table/ordered-columns\",\"^2>\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^2>\"],\"^7\",[\"^ \",\"^1B\",\"^1C\"],\"~:property/schema.classes\",[\"^ \",\"^J\",\"^K\",\"^@\",\"^13\"],\"^2E\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^2E\"],\"~:block/path-refs\",[\"^ \",\"^J\",\"^K\",\"^@\",\"^13\"],\"~:block/parent\",[\"^ \",\"^J\",\"^K\",\"^?\",true],\"~i25\",\"~:logseq.property.pdf/file\",\"~i57\",\"^11\",\"~:block/type\",[\"^ \",\"^?\",true],\"~:logseq.class/Journal\",[\"^ \",\"^7\",\"^3=\"],\"~i26\",\"^I\",\"~i58\",\"^2H\",\"^33\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^33\"],\"^5\",[\"^ \",\"^7\",\"^5\"],\"~i27\",\"^31\",\"~i59\",\"~:logseq.property.asset/remote-metadata\",\"^3B\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^3B\"],\"^2[\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^2[\"],\"~:block/order\",[\"^ \",\"^?\",true],\"^;\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^;\"],\"~:logseq.property.fsrs/due\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^3D\"],\"~i28\",\"^1;\",\"~i60\",\"^3D\",\"~:block/page\",[\"^ \",\"^J\",\"^K\",\"^?\",true],\"~:block/name\",[\"^ \",\"^?\",true],\"^35\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^35\"],\"~:file/path\",[\"^ \",\"^1B\",\"^1C\"],\"~i29\",\"^2F\",\"~i61\",\"^>\",\"^F\",[\"^ \",\"^7\",\"^F\"],\"^1J\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^1J\"],\"~i30\",\"^2<\",\"~i62\",\"^2:\",\"^3:\",[\"^ \",\"^?\",true,\"^J\",\"^K\",\"^@\",\"^A\",\"^7\",\"^3:\"],\"^3\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^3\"],\"^=\",[\"^ \",\"^7\",\"^=\"],\"~i31\",\"^2S\",\"~i63\",\"^3=\",\"^9\",[\"^ \",\"^7\",\"^9\"],\"^2Y\",[\"^ \",\"^?\",true,\"^@\",\"^A\",\"^7\",\"^2Y\"]],\"~:datoms\",[\"~#list\",[[\"~#datascript/Datom\",[1,\"^7\",\"^9\",536870913]],[\"^3R\",[1,\"^17\",\"db\",536870913]],[\"^3R\",[2,\"^7\",\"^D\",536870913]],[\"^3R\",[2,\"^17\",25,536870913]],[\"^3R\",[3,\"^7\",\"^B\",536870913]],[\"^3R\",[3,\"^17\",25,536870913]],[\"^3R\",[4,\"^7\",\"^R\",536870913]],[\"^3R\",[4,\"^17\",1727187033523,536870913]],[\"^3R\",[5,\"^7\",\"^X\",536870913]],[\"^3R\",[6,\"^29\",1727187033526,536870913]],[\"^3R\",[6,\"^2O\",\"~:markdown\",536870913]],[\"^3R\",[6,\"^3H\",\"root tag\",536870913]],[\"^3R\",[6,\"^2R\",\"Root Tag\",536870913]],[\"^3R\",[6,\"^3<\",\"class\",536870913]],[\"^3R\",[6,\"^1G\",1727187033526,536870913]],[\"^3R\",[6,\"^1A\",\"~u00000002-2737-8382-7000-000000000000\",536870913]],[\"^3R\",[6,\"^7\",\"^14\",536870913]],[\"^3R\",[6,\"^18\",true,536870913]],[\"^3R\",[7,\"^29\",1727187033523,536870913]],[\"^3R\",[7,\"^2O\",\"^3S\",536870913]],[\"^3R\",[7,\"^3H\",\"built-in?\",536870913]],[\"^3R\",[7,\"^3C\",\"bNP\",536870913]],[\"^3R\",[7,\"^2B\",[\"^ \",\"~:type\",\"~:checkbox\",\"~:hide?\",true],536870913]],[\"^3R\",[7,\"^2R\",\"built-in?\",536870913]],[\"^3R\",[7,\"^3<\",\"property\",536870913]],[\"^3R\",[7,\"^1G\",1727187033523,536870913]],[\"^3R\",[7,\"^1A\",\"~u00000002-1125-9581-6000-000000000000\",536870913]],[\"^3R\",[7,\"^@\",\"^A\",536870913]],[\"^3R\",[7,\"^7\",\"^18\",536870913]],[\"^3R\",[7,\"^?\",true,536870913]],[\"^3R\",[7,\"^18\",true,536870913]],[\"^3R\",[8,\"^29\",1727187033524,536870913]],[\"^3R\",[8,\"^2O\",\"^3S\",536870913]],[\"^3R\",[8,\"^3H\",\"alias\",536870913]],[\"^3R\",[8,\"^3C\",\"bNQ\",536870913]],[\"^3R\",[8,\"^2B\",[\"^ \",\"^3T\",\"~:page\",\"~:view-context\",\"^3W\",\"~:public?\",true],536870913]],[\"^3R\",[8,\"^2R\",\"Alias\",536870913]],[\"^3R\",[8,\"^3<\",\"property\",536870913]],[\"^3R\",[8,\"^1G\",1727187033524,536870913]],[\"^3R\",[8,\"^1A\",\"~u00000002-2112-6446-9900-000000000000\",536870913]],[\"^3R\",[8,\"^@\",\"^13\",536870913]],[\"^3R\",[8,\"^7\",\"^12\",536870913]],[\"^3R\",[8,\"^?\",true,536870913]],[\"^3R\",[8,\"^J\",\"^K\",536870913]],[\"^3R\",[8,\"^18\",true,536870913]],[\"^3R\",[9,\"^29\",1727187033524,536870913]],[\"^3R\",[9,\"^2O\",\"^3S\",536870913]],[\"^3R\",[9,\"^3H\",\"tags\",536870913]],[\"^3R\",[9,\"^3C\",\"bNR\",536870913]],[\"^3R\",[9,\"^2B\",[\"^ \",\"^3T\",\"~:class\",\"^3Y\",true],536870913]],[\"^3R\",[9,\"^2R\",\"Tags\",536870913]],[\"^3R\",[9,\"^3<\",\"property\",536870913]],[\"^3R\",[9,\"^1G\",1727187033524,536870913]],[\"^3R\",[9,\"^1A\",\"~u00000002-1814-9483-4000-000000000000\",536870913]],[\"^3R\",[9,\"^@\",\"^13\",536870913]],[\"^3R\",[9,\"^7\",\"^1E\",536870913]],[\"^3R\",[9,\"^?\",true,536870913]],[\"^3R\",[9,\"^J\",\"^K\",536870913]],[\"^3R\",[9,\"^18\",true,536870913]],[\"^3R\",[9,\"^36\",6,536870913]],[\"^3R\",[10,\"^29\",1727187033524,536870913]],[\"^3R\",[10,\"^2O\",\"^3S\",536870913]],[\"^3R\",[10,\"^3H\",\"parent\",536870913]],[\"^3R\",[10,\"^3C\",\"bNS\",536870913]],[\"^3R\",[10,\"^2B\",[\"^ \",\"^3T\",\"~:node\",\"^3Y\",true,\"^3X\",\"^3W\"],536870913]],[\"^3R\",[10,\"^2R\",\"Parent\",536870913]],[\"^3R\",[10,\"^3<\",\"property\",536870913]],[\"^3R\",[10,\"^1G\",1727187033524,536870913]],[\"^3R\",[10,\"^1A\",\"~u00000002-1779-8450-9000-000000000000\",536870913]],[\"^3R\",[10,\"^@\",\"^A\",536870913]],[\"^3R\",[10,\"^7\",\"^1J\",536870913]],[\"^3R\",[10,\"^?\",true,536870913]],[\"^3R\",[10,\"^J\",\"^K\",536870913]],[\"^3R\",[10,\"^18\",true,536870913]],[\"^3R\",[11,\"^29\",1727187033524,536870913]],[\"^3R\",[11,\"^2O\",\"^3S\",536870913]],[\"^3R\",[11,\"^3H\",\"tag properties\",536870913]],[\"^3R\",[11,\"^3C\",\"bNT\",536870913]],[\"^3R\",[11,\"^2B\",[\"^ \",\"^3T\",\"~:property\",\"^3Y\",true,\"^3X\",\"~:never\"],536870913]],[\"^3R\",[11,\"^2R\",\"Tag Properties\",536870913]],[\"^3R\",[11,\"^3<\",\"property\",536870913]],[\"^3R\",[11,\"^1G\",1727187033524,536870913]],[\"^3R\",[11,\"^1A\",\"~u00000002-2123-7120-5000-000000000000\",536870913]],[\"^3R\",[11,\"^@\",\"^13\",536870913]],[\"^3R\",[11,\"^7\",\"^1O\",536870913]],[\"^3R\",[11,\"^?\",true,536870913]],[\"^3R\",[11,\"^J\",\"^K\",536870913]],[\"^3R\",[11,\"^18\",true,536870913]],[\"^3R\",[12,\"^29\",1727187033524,536870913]],[\"^3R\",[12,\"^2O\",\"^3S\",536870913]],[\"^3R\",[12,\"^3H\",\"hide from node\",536870913]],[\"^3R\",[12,\"^3C\",\"bNU\",536870913]],[\"^3R\",[12,\"^2B\",[\"^ \",\"^3T\",\"^3U\",\"^3Y\",true,\"^3X\",\"^3Z\"],536870913]],[\"^3R\",[12,\"^2R\",\"Hide from Node\",536870913]],[\"^3R\",[12,\"^3<\",\"property\",536870913]],[\"^3R\",[12,\"^1G\",1727187033524,536870913]],[\"^3R\",[12,\"^1A\",\"~u00000002-2610-3727-0000-000000000000\",536870913]],[\"^3R\",[12,\"^@\",\"^A\",536870913]],[\"^3R\",[12,\"^7\",\"^1T\",536870913]],[\"^3R\",[12,\"^?\",true,536870913]],[\"^3R\",[12,\"^18\",true,536870913]],[\"^3R\",[13,\"^29\",1727187033524,536870913]],[\"^3R\",[13,\"^2O\",\"^3S\",536870913]],[\"^3R\",[13,\"^3H\",\"query\",536870913]],[\"^3R\",[13,\"^3C\",\"bNV\",536870913]],[\"^3R\",[13,\"^2B\",[\"^ \",\"^3T\",\"~:default\",\"^3Y\",true,\"^3X\",\"~:block\"],536870913]],[\"^3R\",[13,\"^2R\",\"Query\",536870913]],[\"^3R\",[13,\"^3<\",\"property\",536870913]],[\"^3R\",[13,\"^1G\",1727187033524,536870913]],[\"^3R\",[13,\"^1A\",\"~u00000002-9741-4126-0000-000000000000\",536870913]],[\"^3R\",[13,\"^@\",\"^A\",536870913]],[\"^3R\",[13,\"^7\",\"^1Y\",536870913]],[\"^3R\",[13,\"^?\",true,536870913]],[\"^3R\",[13,\"^J\",\"^K\",536870913]],[\"^3R\",[13,\"^18\",true,536870913]],[\"^3R\",[14,\"^29\",1727187033524,536870913]],[\"^3R\",[14,\"^2O\",\"^3S\",536870913]],[\"^3R\",[14,\"^3H\",\"page tags\",536870913]],[\"^3R\",[14,\"^3C\",\"bNW\",536870913]],[\"^3R\",[14,\"^2B\",[\"^ \",\"^3T\",\"^3W\",\"^3Y\",true,\"^3X\",\"^3W\"],536870913]],[\"^3R\",[14,\"^2R\",\"Page Tags\",536870913]],[\"^3R\",[14,\"^3<\",\"property\",536870913]],[\"^3R\",[14,\"^1G\",1727187033524,536870913]],[\"^3R\",[14,\"^1A\",\"~u00000002-2133-5311-8500-000000000000\",536870913]],[\"^3R\",[14,\"^@\",\"^13\",536870913]],[\"^3R\",[14,\"^7\",\"^22\",536870913]],[\"^3R\",[14,\"^?\",true,536870913]],[\"^3R\",[14,\"^J\",\"^K\",536870913]],[\"^3R\",[14,\"^18\",true,536870913]],[\"^3R\",[15,\"^29\",1727187033524,536870913]],[\"^3R\",[15,\"^2O\",\"^3S\",536870913]],[\"^3R\",[15,\"^3H\",\"background-color\",536870913]],[\"^3R\",[15,\"^3C\",\"bNX\",536870913]],[\"^3R\",[15,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3V\",true],536870913]],[\"^3R\",[15,\"^2R\",\"background-color\",536870913]],[\"^3R\",[15,\"^3<\",\"property\",536870913]],[\"^3R\",[15,\"^1G\",1727187033524,536870913]],[\"^3R\",[15,\"^1A\",\"~u00000002-5191-2660-6000-000000000000\",536870913]],[\"^3R\",[15,\"^@\",\"^A\",536870913]],[\"^3R\",[15,\"^7\",\"^27\",536870913]],[\"^3R\",[15,\"^?\",true,536870913]],[\"^3R\",[15,\"^J\",\"^K\",536870913]],[\"^3R\",[15,\"^18\",true,536870913]],[\"^3R\",[16,\"^29\",1727187033524,536870913]],[\"^3R\",[16,\"^2O\",\"^3S\",536870913]],[\"^3R\",[16,\"^3H\",\"background-image\",536870913]],[\"^3R\",[16,\"^3C\",\"bNY\",536870913]],[\"^3R\",[16,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3X\",\"^43\",\"^3Y\",true],536870913]],[\"^3R\",[16,\"^2R\",\"background-image\",536870913]],[\"^3R\",[16,\"^3<\",\"property\",536870913]],[\"^3R\",[16,\"^1G\",1727187033524,536870913]],[\"^3R\",[16,\"^1A\",\"~u00000002-2513-1712-8000-000000000000\",536870913]],[\"^3R\",[16,\"^@\",\"^A\",536870913]],[\"^3R\",[16,\"^7\",\"^2>\",536870913]],[\"^3R\",[16,\"^?\",true,536870913]],[\"^3R\",[16,\"^J\",\"^K\",536870913]],[\"^3R\",[16,\"^18\",true,536870913]],[\"^3R\",[17,\"^29\",1727187033524,536870913]],[\"^3R\",[17,\"^2O\",\"^3S\",536870913]],[\"^3R\",[17,\"^3H\",\"heading\",536870913]],[\"^3R\",[17,\"^3C\",\"bNZ\",536870913]],[\"^3R\",[17,\"^2B\",[\"^ \",\"^3T\",\"~:any\",\"^3V\",true],536870913]],[\"^3R\",[17,\"^2R\",\"heading\",536870913]],[\"^3R\",[17,\"^3<\",\"property\",536870913]],[\"^3R\",[17,\"^1G\",1727187033524,536870913]],[\"^3R\",[17,\"^1A\",\"~u00000002-1858-7494-1500-000000000000\",536870913]],[\"^3R\",[17,\"^@\",\"^A\",536870913]],[\"^3R\",[17,\"^7\",\"^1>\",536870913]],[\"^3R\",[17,\"^?\",true,536870913]],[\"^3R\",[17,\"^18\",true,536870913]],[\"^3R\",[18,\"^29\",1727187033524,536870913]],[\"^3R\",[18,\"^2O\",\"^3S\",536870913]],[\"^3R\",[18,\"^3H\",\"created-from-property\",536870913]],[\"^3R\",[18,\"^3C\",\"bNa\",536870913]],[\"^3R\",[18,\"^2B\",[\"^ \",\"^3T\",\"~:entity\",\"^3V\",true],536870913]],[\"^3R\",[18,\"^2R\",\"created-from-property\",536870913]],[\"^3R\",[18,\"^3<\",\"property\",536870913]],[\"^3R\",[18,\"^1G\",1727187033524,536870913]],[\"^3R\",[18,\"^1A\",\"~u00000002-8618-9226-7000-000000000000\",536870913]],[\"^3R\",[18,\"^@\",\"^A\",536870913]],[\"^3R\",[18,\"^7\",\"^2J\",536870913]],[\"^3R\",[18,\"^?\",true,536870913]],[\"^3R\",[18,\"^J\",\"^K\",536870913]],[\"^3R\",[18,\"^18\",true,536870913]],[\"^3R\",[19,\"^29\",1727187033524,536870913]],[\"^3R\",[19,\"^2O\",\"^3S\",536870913]],[\"^3R\",[19,\"^3H\",\"ls-type\",536870913]],[\"^3R\",[19,\"^3C\",\"bNb\",536870913]],[\"^3R\",[19,\"^2B\",[\"^ \",\"^3T\",\"~:keyword\",\"^3V\",true],536870913]],[\"^3R\",[19,\"^2R\",\"ls-type\",536870913]],[\"^3R\",[19,\"^3<\",\"property\",536870913]],[\"^3R\",[19,\"^1G\",1727187033524,536870913]],[\"^3R\",[19,\"^1A\",\"~u00000002-3269-7934-5000-000000000000\",536870913]],[\"^3R\",[19,\"^@\",\"^A\",536870913]],[\"^3R\",[19,\"^7\",\"^2G\",536870913]],[\"^3R\",[19,\"^?\",true,536870913]],[\"^3R\",[19,\"^18\",true,536870913]],[\"^3R\",[20,\"^29\",1727187033524,536870913]],[\"^3R\",[20,\"^2O\",\"^3S\",536870913]],[\"^3R\",[20,\"^3H\",\"hl-type\",536870913]],[\"^3R\",[20,\"^3C\",\"bNc\",536870913]],[\"^3R\",[20,\"^2B\",[\"^ \",\"^3T\",\"^46\",\"^3V\",true],536870913]],[\"^3R\",[20,\"^2R\",\"hl-type\",536870913]],[\"^3R\",[20,\"^3<\",\"property\",536870913]],[\"^3R\",[20,\"^1G\",1727187033524,536870913]],[\"^3R\",[20,\"^1A\",\"~u00000002-2083-0223-8000-000000000000\",536870913]],[\"^3R\",[20,\"^@\",\"^A\",536870913]],[\"^3R\",[20,\"^7\",\"^1W\",536870913]],[\"^3R\",[20,\"^?\",true,536870913]],[\"^3R\",[20,\"^18\",true,536870913]],[\"^3R\",[21,\"^29\",1727187033524,536870913]],[\"^3R\",[21,\"^2O\",\"^3S\",536870913]],[\"^3R\",[21,\"^3H\",\"hl-color\",536870913]],[\"^3R\",[21,\"^3C\",\"bNd\",536870913]],[\"^3R\",[21,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3V\",true],536870913]],[\"^3R\",[21,\"^2R\",\"hl-color\",536870913]],[\"^3R\",[21,\"^3<\",\"property\",536870913]],[\"^3R\",[21,\"^1G\",1727187033524,536870913]],[\"^3R\",[21,\"^1A\",\"~u00000002-2137-2691-4700-000000000000\",536870913]],[\"^3R\",[21,\"^@\",\"^A\",536870913]],[\"^3R\",[21,\"^7\",\"^10\",536870913]],[\"^3R\",[21,\"^?\",true,536870913]],[\"^3R\",[21,\"^J\",\"^K\",536870913]],[\"^3R\",[21,\"^18\",true,536870913]],[\"^3R\",[22,\"^29\",1727187033524,536870913]],[\"^3R\",[22,\"^2O\",\"^3S\",536870913]],[\"^3R\",[22,\"^3H\",\"hl-page\",536870913]],[\"^3R\",[22,\"^3C\",\"bNe\",536870913]],[\"^3R\",[22,\"^2B\",[\"^ \",\"^3T\",\"~:number\",\"^3V\",true],536870913]],[\"^3R\",[22,\"^2R\",\"hl-page\",536870913]],[\"^3R\",[22,\"^3<\",\"property\",536870913]],[\"^3R\",[22,\"^1G\",1727187033524,536870913]],[\"^3R\",[22,\"^1A\",\"~u00000002-7532-8459-6000-000000000000\",536870913]],[\"^3R\",[22,\"^@\",\"^A\",536870913]],[\"^3R\",[22,\"^7\",\"^1V\",536870913]],[\"^3R\",[22,\"^?\",true,536870913]],[\"^3R\",[22,\"^J\",\"^K\",536870913]],[\"^3R\",[22,\"^18\",true,536870913]],[\"^3R\",[23,\"^29\",1727187033524,536870913]],[\"^3R\",[23,\"^2O\",\"^3S\",536870913]],[\"^3R\",[23,\"^3H\",\"hl-stamp\",536870913]],[\"^3R\",[23,\"^3C\",\"bNf\",536870913]],[\"^3R\",[23,\"^2B\",[\"^ \",\"^3T\",\"^47\",\"^3V\",true],536870913]],[\"^3R\",[23,\"^2R\",\"hl-stamp\",536870913]],[\"^3R\",[23,\"^3<\",\"property\",536870913]],[\"^3R\",[23,\"^1G\",1727187033524,536870913]],[\"^3R\",[23,\"^1A\",\"~u00000002-1293-4649-2300-000000000000\",536870913]],[\"^3R\",[23,\"^@\",\"^A\",536870913]],[\"^3R\",[23,\"^7\",\"^2[\",536870913]],[\"^3R\",[23,\"^?\",true,536870913]],[\"^3R\",[23,\"^J\",\"^K\",536870913]],[\"^3R\",[23,\"^18\",true,536870913]],[\"^3R\",[24,\"^29\",1727187033524,536870913]],[\"^3R\",[24,\"^2O\",\"^3S\",536870913]],[\"^3R\",[24,\"^3H\",\"hl-value\",536870913]],[\"^3R\",[24,\"^3C\",\"bNg\",536870913]],[\"^3R\",[24,\"^2B\",[\"^ \",\"^3T\",\"~:map\",\"^3V\",true],536870913]],[\"^3R\",[24,\"^2R\",\"hl-value\",536870913]],[\"^3R\",[24,\"^3<\",\"property\",536870913]],[\"^3R\",[24,\"^1G\",1727187033524,536870913]],[\"^3R\",[24,\"^1A\",\"~u00000002-5458-2940-2000-000000000000\",536870913]],[\"^3R\",[24,\"^@\",\"^A\",536870913]],[\"^3R\",[24,\"^7\",\"^33\",536870913]],[\"^3R\",[24,\"^?\",true,536870913]],[\"^3R\",[24,\"^18\",true,536870913]],[\"^3R\",[25,\"^29\",1727187033525,536870913]],[\"^3R\",[25,\"^2O\",\"^3S\",536870913]],[\"^3R\",[25,\"^3H\",\"file\",536870913]],[\"^3R\",[25,\"^3C\",\"bNh\",536870913]],[\"^3R\",[25,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3V\",true,\"^3Y\",true,\"^3X\",\"^3W\"],536870913]],[\"^3R\",[25,\"^2R\",\"file\",536870913]],[\"^3R\",[25,\"^3<\",\"property\",536870913]],[\"^3R\",[25,\"^1G\",1727187033525,536870913]],[\"^3R\",[25,\"^1A\",\"~u00000002-1681-6464-3400-000000000000\",536870913]],[\"^3R\",[25,\"^@\",\"^A\",536870913]],[\"^3R\",[25,\"^7\",\"^3:\",536870913]],[\"^3R\",[25,\"^?\",true,536870913]],[\"^3R\",[25,\"^J\",\"^K\",536870913]],[\"^3R\",[25,\"^18\",true,536870913]],[\"^3R\",[26,\"^29\",1727187033525,536870913]],[\"^3R\",[26,\"^2O\",\"^3S\",536870913]],[\"^3R\",[26,\"^3H\",\"file-path\",536870913]],[\"^3R\",[26,\"^3C\",\"bNi\",536870913]],[\"^3R\",[26,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3V\",true,\"^3Y\",true,\"^3X\",\"^3W\"],536870913]],[\"^3R\",[26,\"^2R\",\"file-path\",536870913]],[\"^3R\",[26,\"^3<\",\"property\",536870913]],[\"^3R\",[26,\"^1G\",1727187033525,536870913]],[\"^3R\",[26,\"^1A\",\"~u00000002-5663-3568-2000-000000000000\",536870913]],[\"^3R\",[26,\"^@\",\"^A\",536870913]],[\"^3R\",[26,\"^7\",\"^I\",536870913]],[\"^3R\",[26,\"^?\",true,536870913]],[\"^3R\",[26,\"^J\",\"^K\",536870913]],[\"^3R\",[26,\"^18\",true,536870913]],[\"^3R\",[27,\"^29\",1727187033525,536870913]],[\"^3R\",[27,\"^2O\",\"^3S\",536870913]],[\"^3R\",[27,\"^3H\",\"logseq.order-list-type\",536870913]],[\"^3R\",[27,\"^3C\",\"bNj\",536870913]],[\"^3R\",[27,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3V\",true],536870913]],[\"^3R\",[27,\"^2R\",\"logseq.order-list-type\",536870913]],[\"^3R\",[27,\"^3<\",\"property\",536870913]],[\"^3R\",[27,\"^1G\",1727187033525,536870913]],[\"^3R\",[27,\"^1A\",\"~u00000002-6078-1711-1000-000000000000\",536870913]],[\"^3R\",[27,\"^@\",\"^A\",536870913]],[\"^3R\",[27,\"^7\",\"^31\",536870913]],[\"^3R\",[27,\"^?\",true,536870913]],[\"^3R\",[27,\"^J\",\"^K\",536870913]],[\"^3R\",[27,\"^18\",true,536870913]],[\"^3R\",[28,\"^29\",1727187033525,536870913]],[\"^3R\",[28,\"^2O\",\"^3S\",536870913]],[\"^3R\",[28,\"^3H\",\"includes\",536870913]],[\"^3R\",[28,\"^3C\",\"bNk\",536870913]],[\"^3R\",[28,\"^2B\",[\"^ \",\"^3T\",\"^3[\",\"^3V\",true],536870913]],[\"^3R\",[28,\"^2R\",\"includes\",536870913]],[\"^3R\",[28,\"^3<\",\"property\",536870913]],[\"^3R\",[28,\"^1G\",1727187033525,536870913]],[\"^3R\",[28,\"^1A\",\"~u00000002-1680-5777-0300-000000000000\",536870913]],[\"^3R\",[28,\"^@\",\"^13\",536870913]],[\"^3R\",[28,\"^7\",\"^1;\",536870913]],[\"^3R\",[28,\"^?\",true,536870913]],[\"^3R\",[28,\"^J\",\"^K\",536870913]],[\"^3R\",[28,\"^18\",true,536870913]],[\"^3R\",[29,\"^29\",1727187033525,536870913]],[\"^3R\",[29,\"^2O\",\"^3S\",536870913]],[\"^3R\",[29,\"^3H\",\"excludes\",536870913]],[\"^3R\",[29,\"^3C\",\"bNl\",536870913]],[\"^3R\",[29,\"^2B\",[\"^ \",\"^3T\",\"^3[\",\"^3V\",true],536870913]],[\"^3R\",[29,\"^2R\",\"excludes\",536870913]],[\"^3R\",[29,\"^3<\",\"property\",536870913]],[\"^3R\",[29,\"^1G\",1727187033525,536870913]],[\"^3R\",[29,\"^1A\",\"~u00000002-2426-7588-9000-000000000000\",536870913]],[\"^3R\",[29,\"^@\",\"^13\",536870913]],[\"^3R\",[29,\"^7\",\"^2F\",536870913]],[\"^3R\",[29,\"^?\",true,536870913]],[\"^3R\",[29,\"^J\",\"^K\",536870913]],[\"^3R\",[29,\"^18\",true,536870913]],[\"^3R\",[30,\"^29\",1727187033525,536870913]],[\"^3R\",[30,\"^2O\",\"^3S\",536870913]],[\"^3R\",[30,\"^3H\",\"logseq.tldraw.page\",536870913]],[\"^3R\",[30,\"^3C\",\"bNm\",536870913]],[\"^3R\",[30,\"^2B\",[\"^ \",\"^3T\",\"^48\",\"^3V\",true],536870913]],[\"^3R\",[30,\"^2R\",\"logseq.tldraw.page\",536870913]],[\"^3R\",[30,\"^3<\",\"property\",536870913]],[\"^3R\",[30,\"^1G\",1727187033525,536870913]],[\"^3R\",[30,\"^1A\",\"~u00000002-3546-2145-7000-000000000000\",536870913]],[\"^3R\",[30,\"^@\",\"^A\",536870913]],[\"^3R\",[30,\"^7\",\"^2<\",536870913]],[\"^3R\",[30,\"^?\",true,536870913]],[\"^3R\",[30,\"^18\",true,536870913]],[\"^3R\",[31,\"^29\",1727187033525,536870913]],[\"^3R\",[31,\"^2O\",\"^3S\",536870913]],[\"^3R\",[31,\"^3H\",\"logseq.tldraw.shape\",536870913]],[\"^3R\",[31,\"^3C\",\"bNn\",536870913]],[\"^3R\",[31,\"^2B\",[\"^ \",\"^3T\",\"^48\",\"^3V\",true],536870913]],[\"^3R\",[31,\"^2R\",\"logseq.tldraw.shape\",536870913]],[\"^3R\",[31,\"^3<\",\"property\",536870913]],[\"^3R\",[31,\"^1G\",1727187033525,536870913]],[\"^3R\",[31,\"^1A\",\"~u00000002-1313-2454-2000-000000000000\",536870913]],[\"^3R\",[31,\"^@\",\"^A\",536870913]],[\"^3R\",[31,\"^7\",\"^2S\",536870913]],[\"^3R\",[31,\"^?\",true,536870913]],[\"^3R\",[31,\"^18\",true,536870913]],[\"^3R\",[32,\"^29\",1727187033525,536870913]],[\"^3R\",[32,\"^2O\",\"^3S\",536870913]],[\"^3R\",[32,\"^3H\",\"title format\",536870913]],[\"^3R\",[32,\"^3C\",\"bNo\",536870913]],[\"^3R\",[32,\"^2B\",[\"^ \",\"^3T\",\"~:string\",\"^3Y\",false],536870913]],[\"^3R\",[32,\"^2R\",\"Title Format\",536870913]],[\"^3R\",[32,\"^3<\",\"property\",536870913]],[\"^3R\",[32,\"^1G\",1727187033525,536870913]],[\"^3R\",[32,\"^1A\",\"~u00000002-1536-4979-5400-000000000000\",536870913]],[\"^3R\",[32,\"^@\",\"^A\",536870913]],[\"^3R\",[32,\"^7\",\"^3\",536870913]],[\"^3R\",[32,\"^?\",true,536870913]],[\"^3R\",[32,\"^18\",true,536870913]],[\"^3R\",[33,\"^29\",1727187033525,536870913]],[\"^3R\",[33,\"^2O\",\"^3S\",536870913]],[\"^3R\",[33,\"^3H\",\"status\",536870913]],[\"^3R\",[33,\"^3C\",\"bNp\",536870913]],[\"^3R\",[33,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3Y\",true,\"~:position\",\"~:block-left\"],536870913]],[\"^3R\",[33,\"^2R\",\"Status\",536870913]],[\"^3R\",[33,\"^3<\",\"property\",536870913]],[\"^3R\",[33,\"^1G\",1727187033525,536870913]],[\"^3R\",[33,\"^1A\",\"~u00000002-1399-1718-0300-000000000000\",536870913]],[\"^3R\",[33,\"^@\",\"^A\",536870913]],[\"^3R\",[33,\"^7\",\"^;\",536870913]],[\"^3R\",[33,\"^?\",true,536870913]],[\"^3R\",[33,\"^J\",\"^K\",536870913]],[\"^3R\",[33,\"^18\",true,536870913]],[\"^3R\",[34,\"^20\",33,536870913]],[\"^3R\",[34,\"^29\",1727187033525,536870913]],[\"^3R\",[34,\"^2O\",\"^3S\",536870913]],[\"^3R\",[34,\"^3C\",\"bNq\",536870913]],[\"^3R\",[34,\"^3G\",33,536870913]],[\"^3R\",[34,\"^38\",33,536870913]],[\"^3R\",[34,\"^2R\",\"Backlog\",536870913]],[\"^3R\",[34,\"^3<\",\"closed value\",536870913]],[\"^3R\",[34,\"^1G\",1727187033525,536870913]],[\"^3R\",[34,\"^1A\",\"~u00000002-1797-5174-0500-000000000000\",536870913]],[\"^3R\",[34,\"^7\",\"^F\",536870913]],[\"^3R\",[34,\"^18\",true,536870913]],[\"^3R\",[34,\"^2J\",33,536870913]],[\"^3R\",[34,\"^25\",[\"^ \",\"^3T\",\"~:tabler-icon\",\"~:id\",\"Backlog\"],536870913]],[\"^3R\",[35,\"^20\",33,536870913]],[\"^3R\",[35,\"^29\",1727187033525,536870913]],[\"^3R\",[35,\"^2O\",\"^3S\",536870913]],[\"^3R\",[35,\"^3C\",\"bNr\",536870913]],[\"^3R\",[35,\"^3G\",33,536870913]],[\"^3R\",[35,\"^38\",33,536870913]],[\"^3R\",[35,\"^2R\",\"Todo\",536870913]],[\"^3R\",[35,\"^3<\",\"closed value\",536870913]],[\"^3R\",[35,\"^1G\",1727187033525,536870913]],[\"^3R\",[35,\"^1A\",\"~u00000002-1776-1920-4900-000000000000\",536870913]],[\"^3R\",[35,\"^7\",\"^N\",536870913]],[\"^3R\",[35,\"^18\",true,536870913]],[\"^3R\",[35,\"^2J\",33,536870913]],[\"^3R\",[35,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"Todo\"],536870913]],[\"^3R\",[36,\"^20\",33,536870913]],[\"^3R\",[36,\"^29\",1727187033525,536870913]],[\"^3R\",[36,\"^2O\",\"^3S\",536870913]],[\"^3R\",[36,\"^3C\",\"bNs\",536870913]],[\"^3R\",[36,\"^3G\",33,536870913]],[\"^3R\",[36,\"^38\",33,536870913]],[\"^3R\",[36,\"^2R\",\"Doing\",536870913]],[\"^3R\",[36,\"^3<\",\"closed value\",536870913]],[\"^3R\",[36,\"^1G\",1727187033525,536870913]],[\"^3R\",[36,\"^1A\",\"~u00000002-5524-7947-6000-000000000000\",536870913]],[\"^3R\",[36,\"^7\",\"^T\",536870913]],[\"^3R\",[36,\"^18\",true,536870913]],[\"^3R\",[36,\"^2J\",33,536870913]],[\"^3R\",[36,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"InProgress50\"],536870913]],[\"^3R\",[37,\"^20\",33,536870913]],[\"^3R\",[37,\"^29\",1727187033525,536870913]],[\"^3R\",[37,\"^2O\",\"^3S\",536870913]],[\"^3R\",[37,\"^3C\",\"bNt\",536870913]],[\"^3R\",[37,\"^3G\",33,536870913]],[\"^3R\",[37,\"^38\",33,536870913]],[\"^3R\",[37,\"^2R\",\"In Review\",536870913]],[\"^3R\",[37,\"^3<\",\"closed value\",536870913]],[\"^3R\",[37,\"^1G\",1727187033525,536870913]],[\"^3R\",[37,\"^1A\",\"~u00000002-3550-9421-0000-000000000000\",536870913]],[\"^3R\",[37,\"^7\",\"^Z\",536870913]],[\"^3R\",[37,\"^18\",true,536870913]],[\"^3R\",[37,\"^2J\",33,536870913]],[\"^3R\",[37,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"InReview\"],536870913]],[\"^3R\",[38,\"^20\",33,536870913]],[\"^3R\",[38,\"^29\",1727187033525,536870913]],[\"^3R\",[38,\"^2O\",\"^3S\",536870913]],[\"^3R\",[38,\"^3C\",\"bNu\",536870913]],[\"^3R\",[38,\"^3G\",33,536870913]],[\"^3R\",[38,\"^38\",33,536870913]],[\"^3R\",[38,\"^2R\",\"Done\",536870913]],[\"^3R\",[38,\"^3<\",\"closed value\",536870913]],[\"^3R\",[38,\"^1G\",1727187033525,536870913]],[\"^3R\",[38,\"^1A\",\"~u00000002-1430-0577-4000-000000000000\",536870913]],[\"^3R\",[38,\"^7\",\"^16\",536870913]],[\"^3R\",[38,\"^18\",true,536870913]],[\"^3R\",[38,\"^2J\",33,536870913]],[\"^3R\",[38,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"Done\"],536870913]],[\"^3R\",[39,\"^20\",33,536870913]],[\"^3R\",[39,\"^29\",1727187033525,536870913]],[\"^3R\",[39,\"^2O\",\"^3S\",536870913]],[\"^3R\",[39,\"^3C\",\"bNv\",536870913]],[\"^3R\",[39,\"^3G\",33,536870913]],[\"^3R\",[39,\"^38\",33,536870913]],[\"^3R\",[39,\"^2R\",\"Canceled\",536870913]],[\"^3R\",[39,\"^3<\",\"closed value\",536870913]],[\"^3R\",[39,\"^1G\",1727187033525,536870913]],[\"^3R\",[39,\"^1A\",\"~u00000002-1217-7438-9000-000000000000\",536870913]],[\"^3R\",[39,\"^7\",\"^1:\",536870913]],[\"^3R\",[39,\"^18\",true,536870913]],[\"^3R\",[39,\"^2J\",33,536870913]],[\"^3R\",[39,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"Cancelled\"],536870913]],[\"^3R\",[40,\"^29\",1727187033525,536870913]],[\"^3R\",[40,\"^2O\",\"^3S\",536870913]],[\"^3R\",[40,\"^3H\",\"priority\",536870913]],[\"^3R\",[40,\"^3C\",\"bNw\",536870913]],[\"^3R\",[40,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3Y\",true,\"^4:\",\"^4;\"],536870913]],[\"^3R\",[40,\"^2R\",\"Priority\",536870913]],[\"^3R\",[40,\"^3<\",\"property\",536870913]],[\"^3R\",[40,\"^1G\",1727187033525,536870913]],[\"^3R\",[40,\"^1A\",\"~u00000002-1714-7859-9500-000000000000\",536870913]],[\"^3R\",[40,\"^@\",\"^A\",536870913]],[\"^3R\",[40,\"^7\",\"^1@\",536870913]],[\"^3R\",[40,\"^?\",true,536870913]],[\"^3R\",[40,\"^J\",\"^K\",536870913]],[\"^3R\",[40,\"^18\",true,536870913]],[\"^3R\",[41,\"^20\",40,536870913]],[\"^3R\",[41,\"^29\",1727187033525,536870913]],[\"^3R\",[41,\"^2O\",\"^3S\",536870913]],[\"^3R\",[41,\"^3C\",\"bNx\",536870913]],[\"^3R\",[41,\"^3G\",40,536870913]],[\"^3R\",[41,\"^38\",40,536870913]],[\"^3R\",[41,\"^2R\",\"Low\",536870913]],[\"^3R\",[41,\"^3<\",\"closed value\",536870913]],[\"^3R\",[41,\"^1G\",1727187033525,536870913]],[\"^3R\",[41,\"^1A\",\"~u00000002-8891-7452-4000-000000000000\",536870913]],[\"^3R\",[41,\"^7\",\"^U\",536870913]],[\"^3R\",[41,\"^18\",true,536870913]],[\"^3R\",[41,\"^2J\",40,536870913]],[\"^3R\",[41,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"priorityLvlLow\"],536870913]],[\"^3R\",[42,\"^20\",40,536870913]],[\"^3R\",[42,\"^29\",1727187033525,536870913]],[\"^3R\",[42,\"^2O\",\"^3S\",536870913]],[\"^3R\",[42,\"^3C\",\"bNy\",536870913]],[\"^3R\",[42,\"^3G\",40,536870913]],[\"^3R\",[42,\"^38\",40,536870913]],[\"^3R\",[42,\"^2R\",\"Medium\",536870913]],[\"^3R\",[42,\"^3<\",\"closed value\",536870913]],[\"^3R\",[42,\"^1G\",1727187033525,536870913]],[\"^3R\",[42,\"^1A\",\"~u00000002-4650-7295-0000-000000000000\",536870913]],[\"^3R\",[42,\"^7\",\"^1L\",536870913]],[\"^3R\",[42,\"^18\",true,536870913]],[\"^3R\",[42,\"^2J\",40,536870913]],[\"^3R\",[42,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"priorityLvlMedium\"],536870913]],[\"^3R\",[43,\"^20\",40,536870913]],[\"^3R\",[43,\"^29\",1727187033525,536870913]],[\"^3R\",[43,\"^2O\",\"^3S\",536870913]],[\"^3R\",[43,\"^3C\",\"bNz\",536870913]],[\"^3R\",[43,\"^3G\",40,536870913]],[\"^3R\",[43,\"^38\",40,536870913]],[\"^3R\",[43,\"^2R\",\"High\",536870913]],[\"^3R\",[43,\"^3<\",\"closed value\",536870913]],[\"^3R\",[43,\"^1G\",1727187033525,536870913]],[\"^3R\",[43,\"^1A\",\"~u00000002-1281-2351-0000-000000000000\",536870913]],[\"^3R\",[43,\"^7\",\"^W\",536870913]],[\"^3R\",[43,\"^18\",true,536870913]],[\"^3R\",[43,\"^2J\",40,536870913]],[\"^3R\",[43,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"priorityLvlHigh\"],536870913]],[\"^3R\",[44,\"^20\",40,536870913]],[\"^3R\",[44,\"^29\",1727187033525,536870913]],[\"^3R\",[44,\"^2O\",\"^3S\",536870913]],[\"^3R\",[44,\"^3C\",\"bO0\",536870913]],[\"^3R\",[44,\"^3G\",40,536870913]],[\"^3R\",[44,\"^38\",40,536870913]],[\"^3R\",[44,\"^2R\",\"Urgent\",536870913]],[\"^3R\",[44,\"^3<\",\"closed value\",536870913]],[\"^3R\",[44,\"^1G\",1727187033525,536870913]],[\"^3R\",[44,\"^1A\",\"~u00000002-4458-8138-1000-000000000000\",536870913]],[\"^3R\",[44,\"^7\",\"^[\",536870913]],[\"^3R\",[44,\"^18\",true,536870913]],[\"^3R\",[44,\"^2J\",40,536870913]],[\"^3R\",[44,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"priorityLvlUrgent\"],536870913]],[\"^3R\",[45,\"^29\",1727187033525,536870913]],[\"^3R\",[45,\"^2O\",\"^3S\",536870913]],[\"^3R\",[45,\"^3H\",\"deadline\",536870913]],[\"^3R\",[45,\"^3C\",\"bO1\",536870913]],[\"^3R\",[45,\"^2B\",[\"^ \",\"^3T\",\"~:date\",\"^3Y\",true,\"^4:\",\"~:block-below\"],536870913]],[\"^3R\",[45,\"^2R\",\"Deadline\",536870913]],[\"^3R\",[45,\"^3<\",\"property\",536870913]],[\"^3R\",[45,\"^1G\",1727187033525,536870913]],[\"^3R\",[45,\"^1A\",\"~u00000002-2149-5604-4000-000000000000\",536870913]],[\"^3R\",[45,\"^@\",\"^A\",536870913]],[\"^3R\",[45,\"^7\",\"^1[\",536870913]],[\"^3R\",[45,\"^?\",true,536870913]],[\"^3R\",[45,\"^J\",\"^K\",536870913]],[\"^3R\",[45,\"^18\",true,536870913]],[\"^3R\",[46,\"^29\",1727187033526,536870913]],[\"^3R\",[46,\"^2O\",\"^3S\",536870913]],[\"^3R\",[46,\"^3H\",\"icon\",536870913]],[\"^3R\",[46,\"^3C\",\"bO2\",536870913]],[\"^3R\",[46,\"^2B\",[\"^ \",\"^3T\",\"^48\"],536870913]],[\"^3R\",[46,\"^2R\",\"Icon\",536870913]],[\"^3R\",[46,\"^3<\",\"property\",536870913]],[\"^3R\",[46,\"^1G\",1727187033526,536870913]],[\"^3R\",[46,\"^1A\",\"~u00000002-5891-2328-5000-000000000000\",536870913]],[\"^3R\",[46,\"^@\",\"^A\",536870913]],[\"^3R\",[46,\"^7\",\"^25\",536870913]],[\"^3R\",[46,\"^?\",true,536870913]],[\"^3R\",[46,\"^18\",true,536870913]],[\"^3R\",[47,\"^29\",1727187033526,536870913]],[\"^3R\",[47,\"^2O\",\"^3S\",536870913]],[\"^3R\",[47,\"^3H\",\"public\",536870913]],[\"^3R\",[47,\"^3C\",\"bO3\",536870913]],[\"^3R\",[47,\"^2B\",[\"^ \",\"^3T\",\"^3U\",\"^3V\",true,\"^3X\",\"^3W\",\"^3Y\",true],536870913]],[\"^3R\",[47,\"^2R\",\"public\",536870913]],[\"^3R\",[47,\"^3<\",\"property\",536870913]],[\"^3R\",[47,\"^1G\",1727187033526,536870913]],[\"^3R\",[47,\"^1A\",\"~u00000002-1705-3327-6500-000000000000\",536870913]],[\"^3R\",[47,\"^@\",\"^A\",536870913]],[\"^3R\",[47,\"^7\",\"^Q\",536870913]],[\"^3R\",[47,\"^?\",true,536870913]],[\"^3R\",[47,\"^18\",true,536870913]],[\"^3R\",[48,\"^29\",1727187033526,536870913]],[\"^3R\",[48,\"^2O\",\"^3S\",536870913]],[\"^3R\",[48,\"^3H\",\"exclude-from-graph-view\",536870913]],[\"^3R\",[48,\"^3C\",\"bO4\",536870913]],[\"^3R\",[48,\"^2B\",[\"^ \",\"^3T\",\"^3U\",\"^3V\",true,\"^3X\",\"^3W\",\"^3Y\",true],536870913]],[\"^3R\",[48,\"^2R\",\"exclude-from-graph-view\",536870913]],[\"^3R\",[48,\"^3<\",\"property\",536870913]],[\"^3R\",[48,\"^1G\",1727187033526,536870913]],[\"^3R\",[48,\"^1A\",\"~u00000002-4524-3306-5000-000000000000\",536870913]],[\"^3R\",[48,\"^@\",\"^A\",536870913]],[\"^3R\",[48,\"^7\",\"^2@\",536870913]],[\"^3R\",[48,\"^?\",true,536870913]],[\"^3R\",[48,\"^18\",true,536870913]],[\"^3R\",[49,\"^29\",1727187033526,536870913]],[\"^3R\",[49,\"^2O\",\"^3S\",536870913]],[\"^3R\",[49,\"^3H\",\"description\",536870913]],[\"^3R\",[49,\"^3C\",\"bO5\",536870913]],[\"^3R\",[49,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3Y\",true],536870913]],[\"^3R\",[49,\"^2R\",\"Description\",536870913]],[\"^3R\",[49,\"^3<\",\"property\",536870913]],[\"^3R\",[49,\"^1G\",1727187033526,536870913]],[\"^3R\",[49,\"^1A\",\"~u00000002-3362-3620-0000-000000000000\",536870913]],[\"^3R\",[49,\"^@\",\"^A\",536870913]],[\"^3R\",[49,\"^7\",\"^2E\",536870913]],[\"^3R\",[49,\"^?\",true,536870913]],[\"^3R\",[49,\"^J\",\"^K\",536870913]],[\"^3R\",[49,\"^18\",true,536870913]],[\"^3R\",[50,\"^29\",1727187033526,536870913]],[\"^3R\",[50,\"^2O\",\"^3S\",536870913]],[\"^3R\",[50,\"^3H\",\"view type\",536870913]],[\"^3R\",[50,\"^3C\",\"bO6\",536870913]],[\"^3R\",[50,\"^2B\",[\"^ \",\"^3T\",\"^42\",\"^3Y\",false,\"^3V\",true],536870913]],[\"^3R\",[50,\"^2R\",\"View Type\",536870913]],[\"^3R\",[50,\"^3<\",\"property\",536870913]],[\"^3R\",[50,\"^1G\",1727187033526,536870913]],[\"^3R\",[50,\"^1A\",\"~u00000002-2182-3760-7000-000000000000\",536870913]],[\"^3R\",[50,\"^@\",\"^A\",536870913]],[\"^3R\",[50,\"^7\",\"^1=\",536870913]],[\"^3R\",[50,\"^?\",true,536870913]],[\"^3R\",[50,\"^J\",\"^K\",536870913]],[\"^3R\",[50,\"^18\",true,536870913]],[\"^3R\",[51,\"^20\",50,536870913]],[\"^3R\",[51,\"^29\",1727187033526,536870913]],[\"^3R\",[51,\"^2O\",\"^3S\",536870913]],[\"^3R\",[51,\"^3C\",\"bO7\",536870913]],[\"^3R\",[51,\"^3G\",50,536870913]],[\"^3R\",[51,\"^38\",50,536870913]],[\"^3R\",[51,\"^2R\",\"Table View\",536870913]],[\"^3R\",[51,\"^3<\",\"closed value\",536870913]],[\"^3R\",[51,\"^1G\",1727187033526,536870913]],[\"^3R\",[51,\"^1A\",\"~u00000002-1942-5424-0000-000000000000\",536870913]],[\"^3R\",[51,\"^7\",\"^6\",536870913]],[\"^3R\",[51,\"^18\",true,536870913]],[\"^3R\",[51,\"^2J\",50,536870913]],[\"^3R\",[52,\"^20\",50,536870913]],[\"^3R\",[52,\"^29\",1727187033526,536870913]],[\"^3R\",[52,\"^2O\",\"^3S\",536870913]],[\"^3R\",[52,\"^3C\",\"bO8\",536870913]],[\"^3R\",[52,\"^3G\",50,536870913]],[\"^3R\",[52,\"^38\",50,536870913]],[\"^3R\",[52,\"^2R\",\"List View\",536870913]],[\"^3R\",[52,\"^3<\",\"closed value\",536870913]],[\"^3R\",[52,\"^1G\",1727187033526,536870913]],[\"^3R\",[52,\"^1A\",\"~u00000002-1164-8285-0200-000000000000\",536870913]],[\"^3R\",[52,\"^7\",\"^1M\",536870913]],[\"^3R\",[52,\"^18\",true,536870913]],[\"^3R\",[52,\"^2J\",50,536870913]],[\"^3R\",[53,\"^29\",1727187033526,536870913]],[\"^3R\",[53,\"^2O\",\"^3S\",536870913]],[\"^3R\",[53,\"^3H\",\"sorting\",536870913]],[\"^3R\",[53,\"^3C\",\"bO9\",536870913]],[\"^3R\",[53,\"^2B\",[\"^ \",\"^3T\",\"~:coll\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[53,\"^2R\",\"sorting\",536870913]],[\"^3R\",[53,\"^3<\",\"property\",536870913]],[\"^3R\",[53,\"^1G\",1727187033526,536870913]],[\"^3R\",[53,\"^1A\",\"~u00000002-2081-0259-4000-000000000000\",536870913]],[\"^3R\",[53,\"^@\",\"^A\",536870913]],[\"^3R\",[53,\"^7\",\"^L\",536870913]],[\"^3R\",[53,\"^?\",true,536870913]],[\"^3R\",[53,\"^18\",true,536870913]],[\"^3R\",[54,\"^29\",1727187033526,536870913]],[\"^3R\",[54,\"^2O\",\"^3S\",536870913]],[\"^3R\",[54,\"^3H\",\"filters\",536870913]],[\"^3R\",[54,\"^3C\",\"bOA\",536870913]],[\"^3R\",[54,\"^2B\",[\"^ \",\"^3T\",\"^4@\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[54,\"^2R\",\"filters\",536870913]],[\"^3R\",[54,\"^3<\",\"property\",536870913]],[\"^3R\",[54,\"^1G\",1727187033526,536870913]],[\"^3R\",[54,\"^1A\",\"~u00000002-1702-3936-3300-000000000000\",536870913]],[\"^3R\",[54,\"^@\",\"^A\",536870913]],[\"^3R\",[54,\"^7\",\"^2Y\",536870913]],[\"^3R\",[54,\"^?\",true,536870913]],[\"^3R\",[54,\"^18\",true,536870913]],[\"^3R\",[55,\"^29\",1727187033526,536870913]],[\"^3R\",[55,\"^2O\",\"^3S\",536870913]],[\"^3R\",[55,\"^3H\",\"hidden-columns\",536870913]],[\"^3R\",[55,\"^3C\",\"bOB\",536870913]],[\"^3R\",[55,\"^2B\",[\"^ \",\"^3T\",\"^46\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[55,\"^2R\",\"hidden-columns\",536870913]],[\"^3R\",[55,\"^3<\",\"property\",536870913]],[\"^3R\",[55,\"^1G\",1727187033526,536870913]],[\"^3R\",[55,\"^1A\",\"~u00000002-9750-5719-2000-000000000000\",536870913]],[\"^3R\",[55,\"^@\",\"^13\",536870913]],[\"^3R\",[55,\"^7\",\"^1D\",536870913]],[\"^3R\",[55,\"^?\",true,536870913]],[\"^3R\",[55,\"^18\",true,536870913]],[\"^3R\",[56,\"^29\",1727187033526,536870913]],[\"^3R\",[56,\"^2O\",\"^3S\",536870913]],[\"^3R\",[56,\"^3H\",\"ordered-columns\",536870913]],[\"^3R\",[56,\"^3C\",\"bOC\",536870913]],[\"^3R\",[56,\"^2B\",[\"^ \",\"^3T\",\"^4@\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[56,\"^2R\",\"ordered-columns\",536870913]],[\"^3R\",[56,\"^3<\",\"property\",536870913]],[\"^3R\",[56,\"^1G\",1727187033526,536870913]],[\"^3R\",[56,\"^1A\",\"~u00000002-1485-5871-0000-000000000000\",536870913]],[\"^3R\",[56,\"^@\",\"^A\",536870913]],[\"^3R\",[56,\"^7\",\"^35\",536870913]],[\"^3R\",[56,\"^?\",true,536870913]],[\"^3R\",[56,\"^18\",true,536870913]],[\"^3R\",[57,\"^29\",1727187033526,536870913]],[\"^3R\",[57,\"^2O\",\"^3S\",536870913]],[\"^3R\",[57,\"^3H\",\"sized-columns\",536870913]],[\"^3R\",[57,\"^3C\",\"bOD\",536870913]],[\"^3R\",[57,\"^2B\",[\"^ \",\"^3T\",\"^48\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[57,\"^2R\",\"sized-columns\",536870913]],[\"^3R\",[57,\"^3<\",\"property\",536870913]],[\"^3R\",[57,\"^1G\",1727187033526,536870913]],[\"^3R\",[57,\"^1A\",\"~u00000002-1675-5105-5500-000000000000\",536870913]],[\"^3R\",[57,\"^@\",\"^A\",536870913]],[\"^3R\",[57,\"^7\",\"^11\",536870913]],[\"^3R\",[57,\"^?\",true,536870913]],[\"^3R\",[57,\"^18\",true,536870913]],[\"^3R\",[58,\"^29\",1727187033526,536870913]],[\"^3R\",[58,\"^2O\",\"^3S\",536870913]],[\"^3R\",[58,\"^3H\",\"view-for\",536870913]],[\"^3R\",[58,\"^3C\",\"bOE\",536870913]],[\"^3R\",[58,\"^2B\",[\"^ \",\"^3T\",\"^3[\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[58,\"^2R\",\"view-for\",536870913]],[\"^3R\",[58,\"^3<\",\"property\",536870913]],[\"^3R\",[58,\"^1G\",1727187033526,536870913]],[\"^3R\",[58,\"^1A\",\"~u00000002-3627-4319-0000-000000000000\",536870913]],[\"^3R\",[58,\"^@\",\"^A\",536870913]],[\"^3R\",[58,\"^7\",\"^2H\",536870913]],[\"^3R\",[58,\"^?\",true,536870913]],[\"^3R\",[58,\"^J\",\"^K\",536870913]],[\"^3R\",[58,\"^18\",true,536870913]],[\"^3R\",[59,\"^29\",1727187033526,536870913]],[\"^3R\",[59,\"^2O\",\"^3S\",536870913]],[\"^3R\",[59,\"^3H\",\"remote-metadata\",536870913]],[\"^3R\",[59,\"^3C\",\"bOF\",536870913]],[\"^3R\",[59,\"^2B\",[\"^ \",\"^3T\",\"^48\",\"^3V\",true,\"^3Y\",false],536870913]],[\"^3R\",[59,\"^2R\",\"remote-metadata\",536870913]],[\"^3R\",[59,\"^3<\",\"property\",536870913]],[\"^3R\",[59,\"^1G\",1727187033526,536870913]],[\"^3R\",[59,\"^1A\",\"~u00000002-9907-5046-9000-000000000000\",536870913]],[\"^3R\",[59,\"^@\",\"^A\",536870913]],[\"^3R\",[59,\"^7\",\"^3B\",536870913]],[\"^3R\",[59,\"^?\",true,536870913]],[\"^3R\",[59,\"^18\",true,536870913]],[\"^3R\",[60,\"^29\",1727187033526,536870913]],[\"^3R\",[60,\"^2O\",\"^3S\",536870913]],[\"^3R\",[60,\"^3H\",\"due\",536870913]],[\"^3R\",[60,\"^3C\",\"bOG\",536870913]],[\"^3R\",[60,\"^2B\",[\"^ \",\"^3T\",\"~:datetime\",\"^3V\",false,\"^3Y\",false],536870913]],[\"^3R\",[60,\"^2R\",\"Due\",536870913]],[\"^3R\",[60,\"^3<\",\"property\",536870913]],[\"^3R\",[60,\"^1G\",1727187033526,536870913]],[\"^3R\",[60,\"^1A\",\"~u00000002-1089-0805-4900-000000000000\",536870913]],[\"^3R\",[60,\"^@\",\"^A\",536870913]],[\"^3R\",[60,\"^7\",\"^3D\",536870913]],[\"^3R\",[60,\"^?\",true,536870913]],[\"^3R\",[60,\"^18\",true,536870913]],[\"^3R\",[61,\"^29\",1727187033526,536870913]],[\"^3R\",[61,\"^2O\",\"^3S\",536870913]],[\"^3R\",[61,\"^3H\",\"state\",536870913]],[\"^3R\",[61,\"^3C\",\"bOH\",536870913]],[\"^3R\",[61,\"^2B\",[\"^ \",\"^3T\",\"^48\",\"^3V\",false,\"^3Y\",false],536870913]],[\"^3R\",[61,\"^2R\",\"State\",536870913]],[\"^3R\",[61,\"^3<\",\"property\",536870913]],[\"^3R\",[61,\"^1G\",1727187033526,536870913]],[\"^3R\",[61,\"^1A\",\"~u00000002-1165-1650-8700-000000000000\",536870913]],[\"^3R\",[61,\"^@\",\"^A\",536870913]],[\"^3R\",[61,\"^7\",\"^>\",536870913]],[\"^3R\",[61,\"^?\",true,536870913]],[\"^3R\",[61,\"^18\",true,536870913]],[\"^3R\",[62,\"^29\",1727187033526,536870913]],[\"^3R\",[62,\"^2O\",\"^3S\",536870913]],[\"^3R\",[62,\"^3H\",\"task\",536870913]],[\"^3R\",[62,\"^2R\",\"Task\",536870913]],[\"^3R\",[62,\"^3<\",\"class\",536870913]],[\"^3R\",[62,\"^1G\",1727187033526,536870913]],[\"^3R\",[62,\"^1A\",\"~u00000002-1282-1814-5700-000000000000\",536870913]],[\"^3R\",[62,\"^7\",\"^2:\",536870913]],[\"^3R\",[62,\"^18\",true,536870913]],[\"^3R\",[62,\"^1J\",6,536870913]],[\"^3R\",[62,\"^1O\",33,536870913]],[\"^3R\",[62,\"^1O\",40,536870913]],[\"^3R\",[62,\"^1O\",45,536870913]],[\"^3R\",[63,\"^29\",1727187033527,536870913]],[\"^3R\",[63,\"^2O\",\"^3S\",536870913]],[\"^3R\",[63,\"^3H\",\"journal\",536870913]],[\"^3R\",[63,\"^2R\",\"Journal\",536870913]],[\"^3R\",[63,\"^3<\",\"class\",536870913]],[\"^3R\",[63,\"^1G\",1727187033527,536870913]],[\"^3R\",[63,\"^1A\",\"~u00000002-1979-7410-8100-000000000000\",536870913]],[\"^3R\",[63,\"^7\",\"^3=\",536870913]],[\"^3R\",[63,\"^18\",true,536870913]],[\"^3R\",[63,\"^1J\",6,536870913]],[\"^3R\",[63,\"^3\",\"MMM do, yyyy\",536870913]],[\"^3R\",[64,\"^29\",1727187033527,536870913]],[\"^3R\",[64,\"^2O\",\"^3S\",536870913]],[\"^3R\",[64,\"^3H\",\"query\",536870913]],[\"^3R\",[64,\"^2R\",\"Query\",536870913]],[\"^3R\",[64,\"^3<\",\"class\",536870913]],[\"^3R\",[64,\"^1G\",1727187033527,536870913]],[\"^3R\",[64,\"^1A\",\"~u00000002-2324-8016-6000-000000000000\",536870913]],[\"^3R\",[64,\"^7\",\"^5\",536870913]],[\"^3R\",[64,\"^18\",true,536870913]],[\"^3R\",[64,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"search\"],536870913]],[\"^3R\",[64,\"^1J\",6,536870913]],[\"^3R\",[64,\"^1O\",13,536870913]],[\"^3R\",[65,\"^29\",1727187033527,536870913]],[\"^3R\",[65,\"^2O\",\"^3S\",536870913]],[\"^3R\",[65,\"^3H\",\"advanced query\",536870913]],[\"^3R\",[65,\"^2R\",\"Advanced query\",536870913]],[\"^3R\",[65,\"^3<\",\"class\",536870913]],[\"^3R\",[65,\"^1G\",1727187033527,536870913]],[\"^3R\",[65,\"^1A\",\"~u00000002-1141-5857-5800-000000000000\",536870913]],[\"^3R\",[65,\"^7\",\"^=\",536870913]],[\"^3R\",[65,\"^18\",true,536870913]],[\"^3R\",[65,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"search\"],536870913]],[\"^3R\",[65,\"^1J\",64,536870913]],[\"^3R\",[66,\"^29\",1727187033527,536870913]],[\"^3R\",[66,\"^2O\",\"^3S\",536870913]],[\"^3R\",[66,\"^3H\",\"card\",536870913]],[\"^3R\",[66,\"^2R\",\"Card\",536870913]],[\"^3R\",[66,\"^3<\",\"class\",536870913]],[\"^3R\",[66,\"^1G\",1727187033527,536870913]],[\"^3R\",[66,\"^1A\",\"~u00000002-1358-2811-0900-000000000000\",536870913]],[\"^3R\",[66,\"^7\",\"^H\",536870913]],[\"^3R\",[66,\"^18\",true,536870913]],[\"^3R\",[66,\"^1J\",6,536870913]],[\"^3R\",[66,\"^1O\",60,536870913]],[\"^3R\",[66,\"^1O\",61,536870913]],[\"^3R\",[67,\"^29\",1727187033527,536870913]],[\"^3R\",[67,\"^2O\",\"^3S\",536870913]],[\"^3R\",[67,\"^3H\",\"cards\",536870913]],[\"^3R\",[67,\"^2R\",\"Cards\",536870913]],[\"^3R\",[67,\"^3<\",\"class\",536870913]],[\"^3R\",[67,\"^1G\",1727187033527,536870913]],[\"^3R\",[67,\"^1A\",\"~u00000002-1284-2651-6700-000000000000\",536870913]],[\"^3R\",[67,\"^7\",\"^P\",536870913]],[\"^3R\",[67,\"^18\",true,536870913]],[\"^3R\",[67,\"^25\",[\"^ \",\"^3T\",\"^4<\",\"^4=\",\"search\"],536870913]],[\"^3R\",[67,\"^1J\",64,536870913]],[\"^3R\",[68,\"^1A\",\"~u66f2c859-0e01-4f36-81c2-db5c0eb86adf\",536870913]],[\"^3R\",[68,\"^V\",\"{:meta/version 1\\n\\n ;; Set the preferred format.\\n ;; This is _only_ for file graphs.\\n ;; Available options:\\n ;; - Markdown (default)\\n ;; - Org\\n ;; :preferred-format \\\"Markdown\\\"\\n\\n ;; Set the preferred workflow style.\\n ;; This is _only_ for file graphs.\\n ;; Available options:\\n ;; - :now for NOW/LATER style (default)\\n ;; - :todo for TODO/DOING style\\n ;; Exclude directories/files.\\n ;; This is _only_ for file graphs.\\n ;; Example usage:\\n ;; :hidden [\\\"/archived\\\" \\\"/test.md\\\" \\\"../assets/archived\\\"]\\n ;; Define the default journal page template.\\n ;; Enter the template name between the quotes.\\n :default-templates\\n {:journals \\\"\\\"}\\n\\n ;; Set a custom date format for the journal page title.\\n ;; This is _only_ for file graphs.\\n ;; Default value: \\\"MMM do, yyyy\\\"\\n ;; e.g., \\\"Jan 19th, 2038\\\"\\n ;; Example usage e.g., \\\"Tue 19th, Jan 2038\\\"\\n ;; :journal/page-title-format \\\"EEE do, MMM yyyy\\\"\\n\\n ;; Specify the journal filename format using a valid date format string.\\n ;; !Warning:\\n ;; This configuration is not retroactive and affects only new journals.\\n ;; To show old journal files in the app, manually rename the files in the\\n ;; journal directory to match the new format.\\n ;; Default value: \\\"yyyy_MM_dd\\\"\\n ;; :journal/file-name-format \\\"yyyy_MM_dd\\\"\\n\\n ;; Enable tooltip preview on hover.\\n ;; Default value: true\\n :ui/enable-tooltip? true\\n\\n ;; Display brackets [[]] around page references.\\n ;; Default value: true\\n ;; :ui/show-brackets? true\\n\\n ;; Display all lines of a block when referencing ((block)).\\n ;; Default value: false\\n :ui/show-full-blocks? false\\n\\n ;; Automatically expand block references when zooming in.\\n ;; Default value: true\\n :ui/auto-expand-block-refs? true\\n\\n ;; Hide empty block properties\\n ;; This is _only_ for DB graphs.\\n ;; Default value: false\\n ;; :ui/hide-empty-properties? false\\n\\n ;; Disable accent marks when searching.\\n ;; After changing this setting, rebuild the search index by pressing (^C ^S).\\n ;; Default value: true\\n :feature/enable-search-remove-accents? true\\n\\n ;; Enable journals.\\n ;; Default value: true\\n ;; :feature/enable-journals? true\\n\\n ;; Enable flashcards.\\n ;; Default value: true\\n ;; :feature/enable-flashcards? true\\n\\n ;; Enable whiteboards.\\n ;; Default value: true\\n ;; :feature/enable-whiteboards? true\\n\\n ;; Disable the journal's built-in 'Scheduled tasks and deadlines' query.\\n ;; Default value: false\\n ;; :feature/disable-scheduled-and-deadline-query? false\\n\\n ;; Specify the number of days displayed in the future for\\n ;; the 'scheduled tasks and deadlines' query.\\n ;; Example usage:\\n ;; Display all scheduled and deadline blocks for the next 14 days:\\n ;; :scheduled/future-days 14\\n ;; Default value: 7\\n ;; :scheduled/future-days 7\\n\\n ;; Specify the first day of the week.\\n ;; Available options:\\n ;; - integer from 0 to 6 (Monday to Sunday)\\n ;; Default value: 6 (Sunday)\\n :start-of-week 6\\n\\n ;; Specify a custom CSS import.\\n ;; This option takes precedence over the local `logseq/custom.css` file.\\n ;; Example usage:\\n ;; :custom-css-url \\\"@import url('https://cdn.jsdelivr.net/gh/dracula/logseq@master/custom.css');\\\"\\n\\n ;; Specify a custom JS import.\\n ;; This option takes precedence over the local `logseq/custom.js` file.\\n ;; Example usage:\\n ;; :custom-js-url \\\"https://cdn.logseq.com/custom.js\\\"\\n\\n ;; Set bullet indentation when exporting\\n ;; Available options:\\n ;; - `:eight-spaces` as eight spaces\\n ;; - `:four-spaces` as four spaces\\n ;; - `:two-spaces` as two spaces\\n ;; - `:tab` as a tab character (default)\\n ;; :export/bullet-indentation :tab\\n\\n ;; Publish all pages within the Graph\\n ;; Regardless of whether individual pages have been marked as public.\\n ;; Default value: false\\n ;; :publishing/all-pages-public? false\\n\\n ;; Define the default home page and sidebar status.\\n ;; If unspecified, the journal page will be loaded on startup and the right sidebar will stay hidden.\\n ;; The `:page` value represents the name of the page displayed at startup.\\n ;; Available options for `:sidebar` are:\\n ;; - \\\"Contents\\\" to display the Contents page in the right sidebar.\\n ;; - A specific page name to display in the right sidebar.\\n ;; - An array of multiple pages, e.g., [\\\"Contents\\\" \\\"Page A\\\" \\\"Page B\\\"].\\n ;; If `:sidebar` remains unset, the right sidebar will stay hidden.\\n ;; Examples:\\n ;; 1. Set \\\"Changelog\\\" as the home page and display \\\"Contents\\\" in the right sidebar:\\n ;; :default-home {:page \\\"Changelog\\\", :sidebar \\\"Contents\\\"}\\n ;; 2. Set \\\"Jun 3rd, 2021\\\" as the home page without the right sidebar:\\n ;; :default-home {:page \\\"Jun 3rd, 2021\\\"}\\n ;; 3. Set \\\"home\\\" as the home page and display multiple pages in the right sidebar:\\n ;; :default-home {:page \\\"home\\\", :sidebar [\\\"Page A\\\" \\\"Page B\\\"]}\\n\\n ;; Set the default location for storing notes.\\n ;; Default value: \\\"pages\\\"\\n ;; :pages-directory \\\"pages\\\"\\n\\n ;; Set the default location for storing journals.\\n ;; Default value: \\\"journals\\\"\\n ;; :journals-directory \\\"journals\\\"\\n\\n ;; Set the default location for storing whiteboards.\\n ;; Default value: \\\"whiteboards\\\"\\n ;; :whiteboards-directory \\\"whiteboards\\\"\\n\\n ;; Enabling this option converts\\n ;; This is _only_ for file graphs.\\n ;; [[Grant Ideas]] to [[file:./grant_ideas.org][Grant Ideas]] for org-mode.\\n ;; For more information, visit https://github.com/logseq/logseq/issues/672\\n ;; :org-mode/insert-file-link? false\\n\\n ;; Configure custom shortcuts.\\n ;; Syntax:\\n ;; 1. + indicates simultaneous key presses, e.g., `Ctrl+Shift+a`.\\n ;; 2. A space between keys represents key chords, e.g., `t s` means\\n ;; pressing `t` followed by `s`.\\n ;; 3. mod refers to `Ctrl` for Windows/Linux and `Command` for Mac.\\n ;; 4. Use false to disable a specific shortcut.\\n ;; 5. You can define multiple bindings for a single action, e.g., [\\\"ctrl+j\\\" \\\"down\\\"].\\n ;; The full list of configurable shortcuts is available at:\\n ;; https://github.com/logseq/logseq/blob/master/src/main/frontend/modules/shortcut/config.cljs\\n ;; Example:\\n ;; :shortcuts\\n ;; {:editor/new-block \\\"enter\\\"\\n ;; :editor/new-line \\\"shift+enter\\\"\\n ;; :editor/insert-link \\\"mod+shift+k\\\"\\n ;; :editor/highlight false\\n ;; :ui/toggle-settings \\\"t s\\\"\\n ;; :editor/up [\\\"ctrl+k\\\" \\\"up\\\"]\\n ;; :editor/down [\\\"ctrl+j\\\" \\\"down\\\"]\\n ;; :editor/left [\\\"ctrl+h\\\" \\\"left\\\"]\\n ;; :editor/right [\\\"ctrl+l\\\" \\\"right\\\"]}\\n :shortcuts {}\\n\\n ;; Configure the behavior of pressing Enter in document mode.\\n ;; if set to true, pressing Enter will create a new block.\\n ;; Default value: false\\n :shortcut/doc-mode-enter-for-new-block? false\\n\\n ;; Block content larger than `block/title-max-length` will not be searchable\\n ;; or editable for performance.\\n ;; Default value: 10000\\n :block/title-max-length 10000\\n\\n ;; Display command documentation on hover.\\n ;; Default value: true\\n :ui/show-command-doc? true\\n\\n ;; Display empty bullet points.\\n ;; Default value: false\\n :ui/show-empty-bullets? false\\n\\n ;; Pre-defined :view function to use with advanced queries.\\n :query/views\\n {:pprint\\n (fn [r] [:pre.code (pprint r)])}\\n\\n ;; Advanced queries `:result-transform` function.\\n ;; Transform the query result before displaying it.\\n ;; Example usage for DB graphs:\\n;; :query/result-transforms\\n;; {:sort-by-priority\\n;; (fn [result] (sort-by (fn [h] (get h :logseq.property/priority \\\"Z\\\")) result))}\\n\\n;; Queries will be displayed at the bottom of today's journal page.\\n;; Example usage:\\n;; :default-queries\\n;; {:journals []}\\n\\n ;; Add custom commands to the command palette\\n ;; Example usage:\\n ;; :commands\\n ;; [\\n ;; [\\\"js\\\" \\\"Javascript\\\"]\\n ;; [\\\"md\\\" \\\"Markdown\\\"]\\n ;; ]\\n :commands []\\n\\n ;; Enable collapsing blocks with titles but no children.\\n ;; By default, only blocks with children can be collapsed.\\n ;; Setting `:outliner/block-title-collapse-enabled?` to true allows collapsing\\n ;; blocks with titles (multiple lines) and content. For example:\\n ;; - block title\\n ;; block content\\n ;; Default value: false\\n :outliner/block-title-collapse-enabled? false\\n\\n ;; Macros replace texts and will make you more productive.\\n ;; Example usage:\\n ;; Change the :macros value below to:\\n ;; {\\\"poem\\\" \\\"Rose is $1, violet's $2. Life's ordered: Org assists you.\\\"}\\n ;; input \\\"{{poem red,blue}}\\\"\\n ;; becomes\\n ;; Rose is red, violet's blue. Life's ordered: Org assists you.\\n :macros {}\\n\\n ;; Configure the default expansion level for linked references.\\n ;; For example, consider the following block hierarchy:\\n ;; - a [[page]] (level 1)\\n ;; - b (level 2)\\n ;; - c (level 3)\\n ;; - d (level 4)\\n ;;\\n ;; With the default value of level 2, block b will be collapsed.\\n ;; If the level's value is set to 3, block c will be collapsed.\\n ;; Default value: 2\\n :ref/default-open-blocks-level 2\\n\\n ;; Configure the threshold for linked references before collapsing.\\n ;; Default value: 100\\n :ref/linked-references-collapsed-threshold 50\\n\\n ;; Graph view configuration.\\n ;; Example usage:\\n ;; :graph/settings\\n ;; {:orphan-pages? true ; Default value: true\\n ;; :builtin-pages? false ; Default value: false\\n ;; :excluded-pages? false ; Default value: false\\n ;; :journal? false} ; Default value: false\\n\\n ;; Graph view configuration.\\n ;; Example usage:\\n ;; :graph/forcesettings\\n ;; {:link-dist 180 ; Default value: 180\\n ;; :charge-strength -600 ; Default value: -600\\n ;; :charge-range 600} ; Default value: 600\\n\\n\\n ;; Favorites to list on the left sidebar\\n ;; This is _only_ for file graphs.\\n ;; Set flashcards interval.\\n ;; Expected value:\\n ;; - Float between 0 and 1\\n ;; higher values result in faster changes to the next review interval.\\n ;; Default value: 0.5\\n ;; :srs/learning-fraction 0.5\\n\\n ;; Set the initial interval after the first successful review of a card.\\n ;; Default value: 4\\n ;; :srs/initial-interval 4\\n\\n ;; Hide specific block properties.\\n ;; Example usage:\\n ;; :block-hidden-properties #{:public :icon}\\n\\n ;; Create a page for all properties.\\n ;; This is _only_ for file graphs.\\n ;; Default value: true\\n;; Properties to exclude from having property pages\\n ;; This is _only_ for file graphs.\\n ;; Example usage:\\n ;; :property-pages/excludelist #{:duration :author}\\n\\n ;; By default, property value separated by commas will not be treated as\\n ;; page references. You can add properties to enable it.\\n ;; This is _only_ for file graphs.\\n ;; Example usage:\\n ;; :property/separated-by-commas #{:alias :tags}\\n\\n ;; Properties that are ignored when parsing property values for references\\n ;; This is _only_ for file graphs.\\n ;; Example usage:\\n ;; :ignored-page-references-keywords #{:author :website}\\n\\n ;; logbook configuration.\\n ;; :logbook/settings\\n ;; {:with-second-support? false ;limit logbook to minutes, seconds will be eliminated\\n ;; :enabled-in-all-blocks true ;display logbook in all blocks after timetracking\\n ;; :enabled-in-timestamped-blocks false ;don't display logbook at all\\n ;; }\\n\\n ;; Mobile photo upload configuration.\\n ;; :mobile/photo\\n ;; {:allow-editing? true\\n ;; :quality 80}\\n\\n ;; Mobile features options\\n ;; Gestures\\n ;; Example usage:\\n ;; :mobile\\n ;; {:gestures/disabled-in-block-with-tags [\\\"kanban\\\"]}\\n\\n ;; Extra CodeMirror options\\n ;; See https://codemirror.net/5/doc/manual.html#config for possible options\\n ;; Example usage:\\n ;; :editor/extra-codemirror-options\\n ;; {:lineWrapping false ; Default value: false\\n ;; :lineNumbers true ; Default value: true\\n ;; :readOnly false} ; Default value: false\\n\\n ;; Enable logical outdenting\\n ;; Default value: false\\n ;; :editor/logical-outdenting? false\\n\\n ;; Prefer pasting the file when text and a file are in the clipboard.\\n ;; Default value: false\\n ;; :editor/preferred-pasting-file? false\\n\\n ;; Quick capture templates for receiving content from other apps.\\n ;; Each template contains three elements {time}, {text} and {url}, which can be auto-expanded\\n ;; by receiving content from other apps. Note: the {} cannot be omitted.\\n ;; - {time}: capture time\\n ;; - {date}: capture date using current date format, use `[[{date}]]` to get a page reference\\n ;; - {text}: text that users selected before sharing.\\n ;; - {url}: URL or assets path for media files stored in Logseq.\\n ;; You can also reorder them or use only one or two of them in the template.\\n ;; You can also insert or format any text in the template, as shown in the following examples.\\n ;; :quick-capture-templates\\n ;; {:text \\\"[[quick capture]] **{time}**: {text} from {url}\\\"\\n ;; :media \\\"[[quick capture]] **{time}**: {url}\\\"}\\n\\n ;; Quick capture options.\\n ;; - insert-today? Insert the capture at the end of today's journal page (boolean).\\n ;; - redirect-page? Redirect to the quick capture page after capturing (boolean).\\n ;; - default-page The default page to capture to if insert-today? is false (string).\\n ;; :quick-capture-options\\n ;; {:insert-today? false ;; Default value: true\\n ;; :redirect-page? false ;; Default value: false\\n ;; :default-page \\\"quick capture\\\"} ;; Default page: \\\"quick capture\\\"\\n\\n ;; File sync options\\n ;; Ignore these files when syncing, regexp is supported.\\n ;; :file-sync/ignore-files []\\n\\n ;; Configure the Enter key behavior for\\n ;; context-aware editing with DWIM (Do What I Mean).\\n ;; context-aware Enter key behavior implies that pressing Enter will\\n ;; have different outcomes based on the context.\\n ;; For instance, pressing Enter within a list generates a new list item,\\n ;; whereas pressing Enter in a block reference opens the referenced block.\\n ;; :dwim/settings\\n ;; {:admonition&src? true ;; Default value: true\\n ;; :markup? false ;; Default value: false\\n ;; :block-ref? true ;; Default value: true\\n ;; :page-ref? true ;; Default value: true\\n ;; :properties? true ;; Default value: true\\n ;; :list? false} ;; Default value: false\\n\\n ;; Configure the escaping method for special characters in page titles.\\n ;; This is _only_ for file graphs.\\n ;; Warning:\\n ;; This is a dangerous operation. To modify the setting,\\n ;; you'll need to manually rename all affected files and\\n ;; re-index them on all clients after synchronization.\\n ;; Incorrect handling may result in messy page titles.\\n ;; Available options:\\n ;; - :triple-lowbar (default)\\n ;; ;use triple underscore `___` for slash `/` in page title\\n ;; ;use Percent-encoding for other invalid characters\\n}\\n\",536870913]],[\"^3R\",[68,\"^8\",\"~m1727187033523\",536870913]],[\"^3R\",[68,\"^23\",\"~m1727187033523\",536870913]],[\"^3R\",[68,\"^3I\",\"logseq/config.edn\",536870913]],[\"^3R\",[69,\"^1A\",\"~u66f2c859-fb71-49ad-b56f-b177b647ed89\",536870913]],[\"^3R\",[69,\"^V\",\"\",536870913]],[\"^3R\",[69,\"^8\",\"~m1727187033523\",536870913]],[\"^3R\",[69,\"^23\",\"~m1727187033523\",536870913]],[\"^3R\",[69,\"^3I\",\"logseq/custom.css\",536870913]],[\"^3R\",[70,\"^1A\",\"~u66f2c859-a95c-4b95-96dc-339b7181e86e\",536870913]],[\"^3R\",[70,\"^V\",\"\",536870913]],[\"^3R\",[70,\"^8\",\"~m1727187033523\",536870913]],[\"^3R\",[70,\"^23\",\"~m1727187033523\",536870913]],[\"^3R\",[70,\"^3I\",\"logseq/custom.js\",536870913]],[\"^3R\",[71,\"^29\",1727187033527,536870913]],[\"^3R\",[71,\"^2O\",\"^3S\",536870913]],[\"^3R\",[71,\"^3H\",\"contents\",536870913]],[\"^3R\",[71,\"^2R\",\"Contents\",536870913]],[\"^3R\",[71,\"^3<\",\"page\",536870913]],[\"^3R\",[71,\"^1G\",1727187033527,536870913]],[\"^3R\",[71,\"^1A\",\"~u66f2c859-d18d-433a-bd24-ab24995cfae1\",536870913]],[\"^3R\",[71,\"^18\",true,536870913]],[\"^3R\",[72,\"^29\",1727187033588,536870914]],[\"^3R\",[72,\"^2O\",\"^3S\",536870914]],[\"^3R\",[72,\"^3H\",\"$$$views\",536870914]],[\"^3R\",[72,\"^2R\",\"$$$views\",536870914]],[\"^3R\",[72,\"^3<\",\"hidden\",536870914]],[\"^3R\",[72,\"^1G\",1727187033588,536870914]],[\"^3R\",[72,\"^1A\",\"~u66f2c859-f1f7-40da-8854-604ef354f7ff\",536870914]],[\"^3R\",[73,\"^29\",1727187033588,536870914]],[\"^3R\",[73,\"^2O\",\"^3S\",536870914]],[\"^3R\",[73,\"^3C\",\"bOI\",536870914]],[\"^3R\",[73,\"^3G\",72,536870914]],[\"^3R\",[73,\"^38\",72,536870914]],[\"^3R\",[73,\"^2R\",\"All Pages Default View\",536870914]],[\"^3R\",[73,\"^1G\",1727187033588,536870914]],[\"^3R\",[73,\"^1A\",\"~u66f2c859-9076-4a30-a788-533c01d02f85\",536870914]],[\"^3R\",[73,\"^18\",true,536870914]],[\"^3R\",[73,\"^2H\",72,536870914]],[\"^3R\",[74,\"^29\",1727187033721,536870915]],[\"^3R\",[74,\"^2O\",\"^3S\",536870915]],[\"^3R\",[74,\"^2L\",20240924,536870915]],[\"^3R\",[74,\"^3H\",\"sep 24th, 2024\",536870915]],[\"^3R\",[74,\"^37\",9,536870918]],[\"^3R\",[74,\"^37\",63,536870918]],[\"^3R\",[74,\"^1R\",9,536870917]],[\"^3R\",[74,\"^1R\",63,536870917]],[\"^3R\",[74,\"^1E\",63,536870915]],[\"^3R\",[74,\"^2R\",\"Sep 24th, 2024\",536870915]],[\"^3R\",[74,\"^C\",536870917,536870918]],[\"^3R\",[74,\"^3<\",\"journal\",536870915]],[\"^3R\",[74,\"^1G\",1727187033721,536870915]],[\"^3R\",[74,\"^1A\",\"~u00000001-2024-0924-0000-000000000000\",536870915]],[\"^3R\",[75,\"^29\",1727187033722,536870915]],[\"^3R\",[75,\"^2O\",\"^3S\",536870915]],[\"^3R\",[75,\"^3C\",\"a0\",536870915]],[\"^3R\",[75,\"^3G\",74,536870915]],[\"^3R\",[75,\"^38\",74,536870915]],[\"^3R\",[75,\"^37\",74,536870918]],[\"^3R\",[75,\"^2R\",\"\",536870915]],[\"^3R\",[75,\"^C\",536870917,536870918]],[\"^3R\",[75,\"^1G\",1727187033722,536870915]],[\"^3R\",[75,\"^1A\",\"~u66f2c859-8d26-4147-b6dc-a7f93fbd3989\",536870915]]]]]]") (def example-db (dt/read-transit-str example-db-transit)) diff --git a/src/test/frontend/db/db_based_model_test.cljs b/src/test/frontend/db/db_based_model_test.cljs index 199f1f289c..b0c6b2c5b1 100644 --- a/src/test/frontend/db/db_based_model_test.cljs +++ b/src/test/frontend/db/db_based_model_test.cljs @@ -48,7 +48,7 @@ ;; set class2's parent to class1 (let [class2 (db/get-case-page "class2")] (db/transact! [{:db/id (:db/id class2) - :logseq.property/parent (:db/id class)}])) + :logseq.property.class/extends (:db/id class)}])) (test-helper/save-block! repo sbid "Block 2" {:tags ["class2"]}) (is (= (map :db/id (model/get-class-objects repo (:db/id class))) [(:db/id (db/entity [:block/uuid fbid])) @@ -82,9 +82,9 @@ class2 (db/get-case-page "class2") class3 (db/get-case-page "class3") _ (db/transact! [{:db/id (:db/id class2) - :logseq.property/parent (:db/id class1)} + :logseq.property.class/extends (:db/id class1)} {:db/id (:db/id class3) - :logseq.property/parent (:db/id class2)}])] + :logseq.property.class/extends (:db/id class2)}])] (is (= (model/get-structured-children repo (:db/id (db/get-case-page "class1"))) [(:db/id class2) (:db/id class3)])))) diff --git a/src/test/frontend/worker/handler/page/db_based/page_test.cljs b/src/test/frontend/worker/handler/page/db_based/page_test.cljs index 349e4a64ff..c6b1f5f5dd 100644 --- a/src/test/frontend/worker/handler/page/db_based/page_test.cljs +++ b/src/test/frontend/worker/handler/page/db_based/page_test.cljs @@ -52,8 +52,8 @@ (let [_ (worker-db-page/create! conn "vim/keys" {:split-namespace? true}) _ (worker-db-page/create! conn "emacs/keys" {:split-namespace? true})] (is (= #{"vim" "emacs"} - (->> (d/q '[:find [(pull ?b [{:logseq.property/parent [:block/title]}]) ...] :where [?b :block/title "keys"]] @conn) - (map #(get-in % [:logseq.property/parent :block/title])) + (->> (d/q '[:find [(pull ?b [{:logseq.property.class/extends [:block/title]}]) ...] :where [?b :block/title "keys"]] @conn) + (map #(get-in % [:logseq.property.class/extends :block/title])) set)) "Two child pages with same name exist and have different parents"))) diff --git a/src/test/frontend/worker/rtc/gen_client_op_test.cljs b/src/test/frontend/worker/rtc/gen_client_op_test.cljs index 0b7346ad3b..0adfe91a99 100644 --- a/src/test/frontend/worker/rtc/gen_client_op_test.cljs +++ b/src/test/frontend/worker/rtc/gen_client_op_test.cljs @@ -89,7 +89,7 @@ (let [conn (db-test/create-conn) tx-data [[:db/add 1000000 :block/uuid #uuid "66856a29-6eb3-4122-af97-8580a853c6a6" 536870954] [:db/add 1000000 :block/updated-at 1720019497643 536870954] - [:db/add 1000000 :logseq.property/parent :logseq.class/Root 536870954] + [:db/add 1000000 :logseq.property.class/extends :logseq.class/Root 536870954] [:db/add 1000000 :block/created-at 1720019497643 536870954] [:db/add 1000000 :db/ident :user.class/zzz 536870954] [:db/add 1000000 :block/tags :logseq.class/Tag 536870954] @@ -109,7 +109,7 @@ [:block/created-at "[\"~#'\",1720019497643]"] [:block/tags #uuid "00000002-5389-0208-3000-000000000000"] [:block/title "[\"~#'\",\"zzz\"]"] - [:logseq.property/parent #uuid "00000002-2737-8382-7000-000000000000"] + [:logseq.property.class/extends #uuid "00000002-2737-8382-7000-000000000000"] ;;1. shouldn't have :db/ident, :db/ident is special, will be handled later ])}]] (map (fn [[op-type _t op-value]] @@ -168,10 +168,10 @@ :block/tags :block/title :db/cardinality}] #_{:clj-kondo/ignore [:unresolved-symbol :invalid-arity]} (is (->> (me/find (subject/generate-rtc-ops-from-property-entities [ent]) - ([:move _ {:block-uuid ?block-uuid}] - [:update-page _ {:block-uuid ?block-uuid}] - [:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}]) - !av-coll-attrs) + ([:move _ {:block-uuid ?block-uuid}] + [:update-page _ {:block-uuid ?block-uuid}] + [:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}]) + !av-coll-attrs) set (set/difference av-coll-attrs) empty?)))) @@ -180,13 +180,13 @@ (let [repo (state/get-current-repo) db (conn/get-db repo true) ent (d/entity db :logseq.class/Template) - av-coll-attrs #{:logseq.property.class/properties :logseq.property/built-in? :logseq.property/parent + av-coll-attrs #{:logseq.property.class/properties :logseq.property/built-in? :logseq.property.class/extends :block/tags :block/title}] #_{:clj-kondo/ignore [:unresolved-symbol :invalid-arity]} (is (->> (me/find (subject/generate-rtc-ops-from-class-entities [ent]) - ([:update-page _ {:block-uuid ?block-uuid}] - [:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}]) - !av-coll-attrs) + ([:update-page _ {:block-uuid ?block-uuid}] + [:update _ {:block-uuid ?block-uuid :av-coll ([!av-coll-attrs . _ ...] ...)}]) + !av-coll-attrs) set (set/difference av-coll-attrs) empty?)))) From 349dbec466879b8acee0af148cab36ca92bc29cc Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Wed, 14 May 2025 18:24:40 +0800 Subject: [PATCH 02/67] feat: move all created pages to library --- src/main/frontend/components/container.cljs | 5 ++++- .../worker/handler/page/db_based/page.cljs | 21 ++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/frontend/components/container.cljs b/src/main/frontend/components/container.cljs index 2e59336229..06e85c9f09 100644 --- a/src/main/frontend/components/container.cljs +++ b/src/main/frontend/components/container.cljs @@ -156,7 +156,10 @@ untitled? (t :untitled) :else (let [title' (pdf-utils/fix-local-asset-pagename title) parent (:block/parent page)] - (if (and parent (not (ldb/class? page))) + (if (and parent + (not (or (ldb/class? page) + (and (:logseq.property/built-in? parent) + (= (:block/title parent) "Library"))))) (str (:block/title parent) ns-util/parent-char title') title')))] diff --git a/src/main/frontend/worker/handler/page/db_based/page.cljs b/src/main/frontend/worker/handler/page/db_based/page.cljs index d7287f64f1..558a1f975c 100644 --- a/src/main/frontend/worker/handler/page/db_based/page.cljs +++ b/src/main/frontend/worker/handler/page/db_based/page.cljs @@ -165,11 +165,20 @@ [page]) (remove nil?)))) +(defn- page-with-parent-and-order + [db page] + (let [library (ldb/get-page db "Library")] + (when (nil? library) + (throw (ex-info "Library page doesn't exist" {}))) + (assoc page + :block/parent (:db/id library) + :block/order (db-order/gen-key nil nil)))) + (defn create "Pure function without side effects" [db title* {:keys [create-first-block? tags properties uuid persist-op? whiteboard? - class? today-journal? split-namespace?] + class? today-journal? split-namespace? reference?] :or {create-first-block? true properties nil uuid nil @@ -201,10 +210,12 @@ [:db/retract [:block/uuid (:block/uuid existing-page)] :block/tags :logseq.class/Page]]] {:tx-meta tx-meta :tx-data tx-data}))) - (let [page (gp-block/page-name->map title db true date-formatter - {:class? class? - :page-uuid (when (uuid? uuid) uuid) - :skip-existing-page-check? true}) + (let [page (->> + (gp-block/page-name->map title db true date-formatter + {:class? class? + :page-uuid (when (uuid? uuid) uuid) + :skip-existing-page-check? true}) + (page-with-parent-and-order db)) [page parents] (if (and (text/namespace-page? title) split-namespace?) (let [pages (split-namespace-pages db page date-formatter)] [(last pages) (butlast pages)]) From 263063974d68c31a73f8c3607e96542f109b0e04 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Wed, 14 May 2025 21:17:08 +0800 Subject: [PATCH 03/67] Create blocks in Library for new namespace pages --- deps/outliner/src/logseq/outliner/core.cljs | 7 ++- .../worker/handler/page/db_based/page.cljs | 63 +++++++++---------- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/deps/outliner/src/logseq/outliner/core.cljs b/deps/outliner/src/logseq/outliner/core.cljs index 360f62636e..5dbf644472 100644 --- a/deps/outliner/src/logseq/outliner/core.cljs +++ b/deps/outliner/src/logseq/outliner/core.cljs @@ -609,7 +609,7 @@ :else [block sibling?]) - sibling? (if (ldb/page? block) false sibling?) + ;; sibling? (if (ldb/page? block) false sibling?) block (if (de/entity? block) block (d/entity db (:db/id block)))] [block sibling?]))) @@ -683,7 +683,7 @@ blocks) [target-block sibling?] (get-target-block db blocks target-block opts) _ (assert (some? target-block) (str "Invalid target: " target-block)) - sibling? (if (ldb/page? target-block) false sibling?) + ;; sibling? (if (ldb/page? target-block) false sibling?) replace-empty-target? (if (and (some? replace-empty-target?) (:block/title target-block) (string/blank? (:block/title target-block))) @@ -984,7 +984,8 @@ :sibling? true :indent? false}))) - (when (and parent (not (ldb/page? (d/entity db (:db/id parent))))) + (when parent + ;; (and parent (not (ldb/page? (d/entity db (:db/id parent))))) (let [blocks' (take-while (fn [b] (not= (:db/id (:block/parent b)) (:db/id (:block/parent parent)))) diff --git a/src/main/frontend/worker/handler/page/db_based/page.cljs b/src/main/frontend/worker/handler/page/db_based/page.cljs index 558a1f975c..b6930dcf43 100644 --- a/src/main/frontend/worker/handler/page/db_based/page.cljs +++ b/src/main/frontend/worker/handler/page/db_based/page.cljs @@ -101,6 +101,15 @@ first (d/entity db))) +(defn- page-with-parent-and-order + [db page & {:keys [parent]}] + (let [library (ldb/get-page db "Library")] + (when (nil? library) + (throw (ex-info "Library page doesn't exist" {}))) + (assoc page + :block/parent (or parent (:db/id library)) + :block/order (db-order/gen-key)))) + (defn- split-namespace-pages [db page date-formatter] (let [{:block/keys [title] block-uuid :block/uuid} page] @@ -112,20 +121,19 @@ parts (->> (string/split title ns-util/parent-re) (map string/trim) (remove string/blank?)) - pages (doall - (map-indexed - (fn [idx part] - (let [last-part? (= idx (dec (count parts))) - page (if (zero? idx) - (ldb/get-page db part) - (get-page-by-parent-name db (nth parts (dec idx)) part)) - result (or page - (gp-block/page-name->map part db true date-formatter - {:page-uuid (when last-part? block-uuid) - :skip-existing-page-check? true - :class? class?}))] - result)) - parts))] + pages (map-indexed + (fn [idx part] + (let [last-part? (= idx (dec (count parts))) + page (if (zero? idx) + (ldb/get-page db part) + (get-page-by-parent-name db (nth parts (dec idx)) part)) + result (or page + (gp-block/page-name->map part db true date-formatter + {:page-uuid (when last-part? block-uuid) + :skip-existing-page-check? true + :class? class?}))] + result)) + parts)] (cond (and (not class?) (not (every? ldb/internal-page? pages))) (throw (ex-info "Cannot create this page unless all parents are pages" @@ -158,27 +166,18 @@ :else (db-class/build-new-class db (assoc page :logseq.property.class/extends parent-eid))) - (if (or (de/entity? page) (zero? idx)) + (if (de/entity? page) page - (assoc page :logseq.property.class/extends parent-eid))))) + (page-with-parent-and-order db page {:parent parent-eid}))))) pages))) [page]) (remove nil?)))) -(defn- page-with-parent-and-order - [db page] - (let [library (ldb/get-page db "Library")] - (when (nil? library) - (throw (ex-info "Library page doesn't exist" {}))) - (assoc page - :block/parent (:db/id library) - :block/order (db-order/gen-key nil nil)))) - (defn create "Pure function without side effects" [db title* {:keys [create-first-block? tags properties uuid persist-op? whiteboard? - class? today-journal? split-namespace? reference?] + class? today-journal? split-namespace?] :or {create-first-block? true properties nil uuid nil @@ -210,16 +209,14 @@ [:db/retract [:block/uuid (:block/uuid existing-page)] :block/tags :logseq.class/Page]]] {:tx-meta tx-meta :tx-data tx-data}))) - (let [page (->> - (gp-block/page-name->map title db true date-formatter - {:class? class? - :page-uuid (when (uuid? uuid) uuid) - :skip-existing-page-check? true}) - (page-with-parent-and-order db)) + (let [page (gp-block/page-name->map title db true date-formatter + {:class? class? + :page-uuid (when (uuid? uuid) uuid) + :skip-existing-page-check? true}) [page parents] (if (and (text/namespace-page? title) split-namespace?) (let [pages (split-namespace-pages db page date-formatter)] [(last pages) (butlast pages)]) - [page nil])] + [(page-with-parent-and-order db page) nil])] (when (and page (or (nil? (:db/ident page)) ;; New page creation must not override built-in entities (not (db-malli-schema/internal-ident? (:db/ident page))))) From 5f547a4e1700493e133ac4a263972aa8404b65bc Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 15 May 2025 01:41:12 +0800 Subject: [PATCH 04/67] enhance: save only namespaced pages to Library --- deps/db/src/logseq/db/frontend/malli_schema.cljs | 6 ++++-- .../src/logseq/graph_parser/block.cljs | 15 ++++++++++++++- deps/outliner/src/logseq/outliner/core.cljs | 2 +- deps/shui/src/logseq/shui/base/core.cljs | 3 +-- src/main/frontend/components/block.cljs | 4 ++-- src/main/frontend/components/cmdk/list_item.cljs | 2 +- src/main/frontend/components/page.cljs | 16 ++++++++-------- src/main/frontend/components/repo.cljs | 2 +- src/main/frontend/components/rtc/indicator.cljs | 2 +- .../worker/handler/page/db_based/page.cljs | 13 ++----------- 10 files changed, 35 insertions(+), 30 deletions(-) diff --git a/deps/db/src/logseq/db/frontend/malli_schema.cljs b/deps/db/src/logseq/db/frontend/malli_schema.cljs index fa0be75713..d92dd29e0a 100644 --- a/deps/db/src/logseq/db/frontend/malli_schema.cljs +++ b/deps/db/src/logseq/db/frontend/malli_schema.cljs @@ -3,9 +3,9 @@ (:require [clojure.set :as set] [clojure.string :as string] [datascript.core :as d] + [logseq.db.common.entity-plus :as entity-plus] [logseq.db.common.order :as db-order] [logseq.db.frontend.class :as db-class] - [logseq.db.common.entity-plus :as entity-plus] [logseq.db.frontend.entity-util :as entity-util] [logseq.db.frontend.property :as db-property] [logseq.db.frontend.property.type :as db-property-type] @@ -277,7 +277,9 @@ (concat [:map ;; journal-day is only set for journal pages - [:block/journal-day {:optional true} :int]] + [:block/journal-day {:optional true} :int] + [:block/parent {:optional true} :int] + [:block/order {:optional true} block-order]] page-attrs page-or-block-attrs))) diff --git a/deps/graph-parser/src/logseq/graph_parser/block.cljs b/deps/graph-parser/src/logseq/graph_parser/block.cljs index d7a6ccad8d..7d4297c61d 100644 --- a/deps/graph-parser/src/logseq/graph_parser/block.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/block.cljs @@ -364,6 +364,18 @@ [s] (string/replace s "#" "HashTag-")) +(defn page-with-parent-and-order + "Apply to namespace pages" + [db page & {:keys [parent]}] + ;; FIXME: using db/ident instead of page title because users can create pages + ;; with the same name + (let [library (ldb/get-page db "Library")] + (when (nil? library) + (throw (ex-info "Library page doesn't exist" {}))) + (assoc page + :block/parent (or parent (:db/id library)) + :block/order (db-order/gen-key)))) + ;; TODO: refactor (defn page-name->map "Create a page's map structure given a original page name (string). @@ -411,7 +423,8 @@ (defn- ref->map [db *col {:keys [date-formatter db-based? *name->id tag?]}] - (let [col (remove string/blank? @*col) + (let [db-based? (or (and db (ldb/db-based-graph? db)) db-based?) + col (remove string/blank? @*col) children-pages (when-not db-based? (->> (mapcat (fn [p] (let [p (if (map? p) diff --git a/deps/outliner/src/logseq/outliner/core.cljs b/deps/outliner/src/logseq/outliner/core.cljs index 5dbf644472..ab2e89b8b5 100644 --- a/deps/outliner/src/logseq/outliner/core.cljs +++ b/deps/outliner/src/logseq/outliner/core.cljs @@ -839,7 +839,7 @@ (:db/id (:block/parent target-block)) (:db/id target-block)) :block/order block-order} - not-same-page? + (and not-same-page? (not (or (ldb/page? block) (ldb/page? target-block)))) (assoc :block/page target-page))] children-page-tx (when not-same-page? (let [children-ids (ldb/get-block-children-ids db (:block/uuid block))] diff --git a/deps/shui/src/logseq/shui/base/core.cljs b/deps/shui/src/logseq/shui/base/core.cljs index 61175a4fc5..2a1aa7b744 100644 --- a/deps/shui/src/logseq/shui/base/core.cljs +++ b/deps/shui/src/logseq/shui/base/core.cljs @@ -51,8 +51,7 @@ {:variant variant :data-button :icon :style (when size {:width size :height size})}) - (tabler-icon/root (name icon-name) (merge {:size 20 - :key "icon"} icon-props)) + (tabler-icon/root (name icon-name) (merge {:size 20} icon-props)) child)) (def button-ghost-icon (partial button-icon :ghost)) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index ba31bff564..4307e2b4cf 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -62,7 +62,6 @@ [frontend.mobile.util :as mobile-util] [frontend.modules.outliner.tree :as tree] [frontend.modules.shortcut.utils :as shortcut-utils] - [frontend.util.ref :as ref] [frontend.security :as security] [frontend.state :as state] [frontend.template :as template] @@ -70,6 +69,7 @@ [frontend.util :as util] [frontend.util.file-based.clock :as clock] [frontend.util.file-based.drawer :as drawer] + [frontend.util.ref :as ref] [frontend.util.text :as text-util] [goog.dom :as gdom] [goog.functions :refer [debounce]] @@ -3230,7 +3230,7 @@ (rum/with-key (breadcrumb-fragment config block label opts) (str (:block/uuid block)))) [:span.opacity-70 {:key "dots"} "⋯"]))) - (interpose (rum/with-key (breadcrumb-separator) "icon")))] + (interpose (breadcrumb-separator)))] (when (seq breadcrumbs) [:div.breadcrumb.block-parents {:class (when (seq breadcrumbs) diff --git a/src/main/frontend/components/cmdk/list_item.cljs b/src/main/frontend/components/cmdk/list_item.cljs index 49c5ae2d06..b2e94e45da 100644 --- a/src/main/frontend/components/cmdk/list_item.cljs +++ b/src/main/frontend/components/cmdk/list_item.cljs @@ -40,7 +40,7 @@ highlighted-text (string/replace normal-text query-re "<:hlmarker>$1<:hlmarker>") segs (string/split highlighted-text #"<:hlmarker>")] (if (seq segs) - (into [:span {:data-testid text-string}] + (into [:span {"data-testid" text-string}] (map-indexed (fn [i seg] (if (even? i) [:span seg] diff --git a/src/main/frontend/components/page.cljs b/src/main/frontend/components/page.cljs index 3d096756e9..6518e840de 100644 --- a/src/main/frontend/components/page.cljs +++ b/src/main/frontend/components/page.cljs @@ -192,13 +192,13 @@ (rum/defcs page-blocks-cp < rum/reactive db-mixins/query {:will-mount (fn [state] (when-not (config/db-based-graph?) - (let [page-e (first (:rum/args state)) - page-name (:block/name page-e)] - (when (and page-name - (db/journal-page? page-name) - (>= (date/journal-title->int page-name) - (date/journal-title->int (date/today)))) - (state/pub-event! [:journal/insert-template page-name])))) + (let [page-e (first (:rum/args state)) + page-name (:block/name page-e)] + (when (and page-name + (db/journal-page? page-name) + (>= (date/journal-title->int page-name) + (date/journal-title->int (date/today)))) + (state/pub-event! [:journal/insert-template page-name])))) state)} [state block* {:keys [sidebar? whiteboard?] :as config}] (when-let [id (:db/id block*)] @@ -447,7 +447,7 @@ (let [with-actions? (not config/publishing?)] [:div.ls-page-title.flex.flex-1.w-full.content.items-start.title {:class (when-not whiteboard-page? "title") - :data-testid "page title" + "data-testid" "page title" :on-pointer-down (fn [e] (when (util/right-click? e) (state/set-state! :page-title/context {:page (:block/title page) diff --git a/src/main/frontend/components/repo.cljs b/src/main/frontend/components/repo.cljs index 695649354b..cf65bcf26f 100644 --- a/src/main/frontend/components/repo.cljs +++ b/src/main/frontend/components/repo.cljs @@ -69,7 +69,7 @@ :let [only-cloud? (and remote? (nil? root)) db-based? (config/db-based-graph? url)]] [:div.flex.justify-between.mb-4.items-center.group {:key (or url GraphUUID) - :data-testid url} + "data-testid" url} [:div [:span.flex.items-center.gap-1 (normalized-graph-label repo diff --git a/src/main/frontend/components/rtc/indicator.cljs b/src/main/frontend/components/rtc/indicator.cljs index 0956d69e91..5b6f5f466a 100644 --- a/src/main/frontend/components/rtc/indicator.cljs +++ b/src/main/frontend/components/rtc/indicator.cljs @@ -156,7 +156,7 @@ unpushed-block-update-count (:pending-local-ops detail-info) {:keys [local-tx remote-tx]} detail-info] [:div.cp__rtc-sync - [:div.hidden {:data-testid "rtc-tx"} (pr-str {:local-tx local-tx :remote-tx remote-tx})] + [:div.hidden {"data-testid" "rtc-tx"} (pr-str {:local-tx local-tx :remote-tx remote-tx})] [:div.cp__rtc-sync-indicator.flex.flex-row.items-center.gap-1 (when downloading?' (shui/button diff --git a/src/main/frontend/worker/handler/page/db_based/page.cljs b/src/main/frontend/worker/handler/page/db_based/page.cljs index b6930dcf43..40b7fb35f4 100644 --- a/src/main/frontend/worker/handler/page/db_based/page.cljs +++ b/src/main/frontend/worker/handler/page/db_based/page.cljs @@ -101,15 +101,6 @@ first (d/entity db))) -(defn- page-with-parent-and-order - [db page & {:keys [parent]}] - (let [library (ldb/get-page db "Library")] - (when (nil? library) - (throw (ex-info "Library page doesn't exist" {}))) - (assoc page - :block/parent (or parent (:db/id library)) - :block/order (db-order/gen-key)))) - (defn- split-namespace-pages [db page date-formatter] (let [{:block/keys [title] block-uuid :block/uuid} page] @@ -168,7 +159,7 @@ (db-class/build-new-class db (assoc page :logseq.property.class/extends parent-eid))) (if (de/entity? page) page - (page-with-parent-and-order db page {:parent parent-eid}))))) + (gp-block/page-with-parent-and-order db page {:parent parent-eid}))))) pages))) [page]) (remove nil?)))) @@ -216,7 +207,7 @@ [page parents] (if (and (text/namespace-page? title) split-namespace?) (let [pages (split-namespace-pages db page date-formatter)] [(last pages) (butlast pages)]) - [(page-with-parent-and-order db page) nil])] + [page nil])] (when (and page (or (nil? (:db/ident page)) ;; New page creation must not override built-in entities (not (db-malli-schema/internal-ident? (:db/ident page))))) From 0dd44221eacf06de08aedb5fc92f22da050ce712 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 15 May 2025 05:02:57 +0800 Subject: [PATCH 05/67] fix: namespace page breadcrumbs --- src/main/frontend/components/block.cljs | 7 ++++--- src/main/frontend/components/page.cljs | 11 +++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 4307e2b4cf..076f112e6b 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -3200,14 +3200,14 @@ :disable-preview? true :stop-click-event? false)] (when show? - (let [page-name-props (when show-page? + (let [page-name-props (when (and show-page? (not (= (:block/uuid page) block-id))) [page (page-cp (dissoc config :breadcrumb? true) page) {:block/name (or page-title page-name)}]) parents-props (doall (for [{:block/keys [uuid name title] :as block} parents] (if name - [block (page-cp {} block)] + [block (page-cp {:disable-preview? true} block)] (let [result (block/parse-title-and-body uuid (get block :block/format :markdown) @@ -3222,7 +3222,8 @@ (->elem :span (map-inline config ast-title)) (->elem :div (markup-elements-cp config ast-body))))])))) breadcrumbs (->> (into [] parents-props) - (concat [page-name-props] (when more? [:more])) + (concat [page-name-props] + (when more? [:more])) (filterv identity) (map (fn [x] (if (and (vector? x) (second x)) diff --git a/src/main/frontend/components/page.cljs b/src/main/frontend/components/page.cljs index 6518e840de..5b1654c4eb 100644 --- a/src/main/frontend/components/page.cljs +++ b/src/main/frontend/components/page.cljs @@ -646,6 +646,11 @@ (if (and whiteboard-page? (not sidebar?)) [:div ((state/get-component :whiteboard/tldraw-preview) (:block/uuid page))] ;; FIXME: this is not reactive [:div.relative.grid.gap-8.page-inner + (when (and (:block/parent page) (not sidebar?) (not whiteboard?)) + (let [config (merge config {:id "block-parent" + :block? true})] + (component-block/breadcrumb config repo block-id {:level-limit 3}))) + (when-not (or block? sidebar?) [:div.flex.flex-row.space-between (when (and (or (mobile-util/native-platform?) (util/mobile?)) (not db-based?)) @@ -668,12 +673,6 @@ [:div.-mb-8 (sidebar-page-properties config page)]) - (when (and block? (not sidebar?) (not whiteboard?)) - (let [config (merge config {:id "block-parent" - :block? true})] - [:div.mb-4 - (component-block/breadcrumb config repo block-id {:level-limit 3})])) - (when show-tabs? (tabs page {:current-page? option :sidebar? sidebar? :*tabs-rendered? *tabs-rendered?})) From 49ce2c4942b924acdbd186e2bac38a8930dc1355 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 15 May 2025 05:15:27 +0800 Subject: [PATCH 06/67] enhance: show breadcrumbs for namespaced pages in cmdk && node reference. --- src/main/frontend/components/cmdk/core.cljs | 6 +++++- src/main/frontend/components/editor.cljs | 3 +-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/frontend/components/cmdk/core.cljs b/src/main/frontend/components/cmdk/core.cljs index 680e8d41b2..24e8daa9ab 100644 --- a/src/main/frontend/components/cmdk/core.cljs +++ b/src/main/frontend/components/cmdk/core.cljs @@ -261,6 +261,9 @@ (hash-map :icon icon :icon-theme :gray :text title' + :header (when (:block/parent entity) + (block/breadcrumb {:disable-preview? true + :search? true} repo (:block/uuid page) {})) :source-page (or source-page page)))) (defn- block-item @@ -271,7 +274,8 @@ {:icon icon :icon-theme :gray :text (highlight-content-query text @!input) - :header (when-not (db/page? block) (block/breadcrumb {:search? true} repo id {})) + :header (when (:block/parent block) (block/breadcrumb {:disable-preview? true + :search? true} repo id {})) :current-page? (when-let [page-id (:block/page block)] (= page-id (:block/uuid current-page))) :source-block block})) diff --git a/src/main/frontend/components/editor.cljs b/src/main/frontend/components/editor.cljs index c3f6cda2ba..8b9612a643 100644 --- a/src/main/frontend/components/editor.cljs +++ b/src/main/frontend/components/editor.cljs @@ -187,8 +187,7 @@ (or (db/entity [:block/uuid id]) block) block)] [:div.flex.flex-col - (when (and (not (or db-tag? (:page? block) (ldb/page? block))) - (:block/uuid block')) + (when (and (:block/uuid block') (:block/parent block')) (when-let [breadcrumb (state/get-component :block/breadcrumb)] [:div.text-xs.opacity-70.mb-1 {:style {:margin-left 3}} (breadcrumb {:search? true} (state/get-current-repo) (:block/uuid block') {})])) From 1c019312348b2640abe9f16cd33ee0bebe378562 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 15 May 2025 05:25:53 +0800 Subject: [PATCH 07/67] enhance: disable node preview in editing mode --- src/main/frontend/components/block.cljs | 38 +++++++++++++------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 076f112e6b..e244bfbdf1 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -785,25 +785,27 @@ (let [*el-trigger (hooks/use-ref nil)] (hooks/use-effect! (fn [] - (when (true? visible?) - (shui/popup-show! - (hooks/deref *el-trigger) render - {:root-props {:onOpenChange (fn [v] (set-visible! v)) - :modal false} - :content-props {:class "ls-preview-popup" - :onInteractOutside (fn [^js e] (.preventDefault e)) - :onEscapeKeyDown (fn [^js e] - (when (state/editing?) - (.preventDefault e) - (some-> (hooks/deref *el-popup) (.focus))))} - :as-dropdown? false})) + (when-not (state/editing?) + (when (true? visible?) + (shui/popup-show! + (hooks/deref *el-trigger) render + {:root-props {:onOpenChange (fn [v] (set-visible! v)) + :modal false} + :content-props {:class "ls-preview-popup" + :onInteractOutside (fn [^js e] (.preventDefault e)) + :onEscapeKeyDown (fn [^js e] + (when (state/editing?) + (.preventDefault e) + (some-> (hooks/deref *el-popup) (.focus))))} + :as-dropdown? false})) + + (when (false? visible?) + (shui/popup-hide!) + (when (state/get-edit-block) + (state/clear-edit!))) + (hooks/set-ref! *timer nil) + (hooks/set-ref! *timer1 nil)) - (when (false? visible?) - (shui/popup-hide!) - (when (state/get-edit-block) - (state/clear-edit!))) - (hooks/set-ref! *timer nil) - (hooks/set-ref! *timer1 nil) ;; teardown (fn [] (when visible? From c010df25483cb30d825d50d6925d4e35ab4f5007 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 15 May 2025 05:32:45 +0800 Subject: [PATCH 08/67] Style tweaks --- src/main/frontend/components/block.cljs | 2 +- src/main/frontend/components/page.cljs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index e244bfbdf1..fa1b94a210 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -3174,7 +3174,7 @@ (rum/defc breadcrumb-separator [] (ui/icon "chevron-right" {:style {:font-size 20} - :class "opacity-50 mx-1"})) + :class "opacity-50"})) ;; "block-id - uuid of the target block of breadcrumb. page uuid is also acceptable" (rum/defc breadcrumb-aux < rum/reactive diff --git a/src/main/frontend/components/page.cljs b/src/main/frontend/components/page.cljs index 5b1654c4eb..1337a17fbc 100644 --- a/src/main/frontend/components/page.cljs +++ b/src/main/frontend/components/page.cljs @@ -649,7 +649,8 @@ (when (and (:block/parent page) (not sidebar?) (not whiteboard?)) (let [config (merge config {:id "block-parent" :block? true})] - (component-block/breadcrumb config repo block-id {:level-limit 3}))) + [:div.ml-1 + (component-block/breadcrumb config repo block-id {:level-limit 3})])) (when-not (or block? sidebar?) [:div.flex.flex-row.space-between From ee1005baf559677fa330176db7d83fdfcfda5a01 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 15 May 2025 05:41:19 +0800 Subject: [PATCH 09/67] fix: breadcrumbs --- src/main/frontend/components/block.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index fa1b94a210..bdc0b3b4de 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -3202,7 +3202,7 @@ :disable-preview? true :stop-click-event? false)] (when show? - (let [page-name-props (when (and show-page? (not (= (:block/uuid page) block-id))) + (let [page-name-props (when (and show-page? (not (ldb/page? (db/entity [:block/uuid block-id])))) [page (page-cp (dissoc config :breadcrumb? true) page) {:block/name (or page-title page-name)}]) From 568db4a7598653c73f668e4fd744b828dc14186a Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 15 May 2025 15:52:31 +0800 Subject: [PATCH 10/67] enhance(ux): show block breadcrumbs on header --- src/main/frontend/components/block.cljs | 23 +++-- src/main/frontend/components/header.cljs | 94 +++++++++++-------- src/main/frontend/components/header.css | 25 +++++ src/main/frontend/components/page.cljs | 6 -- .../frontend/components/right_sidebar.css | 10 -- 5 files changed, 92 insertions(+), 66 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index bdc0b3b4de..d220a0dcc9 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -666,7 +666,6 @@ tag? (:tag? config) page-name (when (:block/title page-entity) (util/page-name-sanity-lc (:block/title page-entity))) - breadcrumb? (:breadcrumb? config) config (assoc config :whiteboard-page? whiteboard-page?) untitled? (when page-name (model/untitled-page? (:block/title page-entity))) show-icon? (:show-icon? config)] @@ -696,9 +695,6 @@ (and other-position? (not (util/shift-key? e))) (some-> (.-target e) (.closest ".jtrigger") (.click)) - breadcrumb? - (.preventDefault e) - :else (do (.preventDefault e) @@ -3173,8 +3169,8 @@ (rum/defc breadcrumb-separator [] - (ui/icon "chevron-right" {:style {:font-size 20} - :class "opacity-50"})) + [:span.opacity-50.px-1 + "/"]) ;; "block-id - uuid of the target block of breadcrumb. page uuid is also acceptable" (rum/defc breadcrumb-aux < rum/reactive @@ -3204,12 +3200,12 @@ (when show? (let [page-name-props (when (and show-page? (not (ldb/page? (db/entity [:block/uuid block-id])))) [page - (page-cp (dissoc config :breadcrumb? true) page) + (page-cp {:disable-preview? true} page) {:block/name (or page-title page-name)}]) parents-props (doall (for [{:block/keys [uuid name title] :as block} parents] (if name - [block (page-cp {:disable-preview? true} block)] + [block (page-cp {:disable-preview? true} block) true] (let [result (block/parse-title-and-body uuid (get block :block/format :markdown) @@ -3222,16 +3218,19 @@ (when ast-title (if (seq ast-title) (->elem :span (map-inline config ast-title)) - (->elem :div (markup-elements-cp config ast-body))))])))) + (->elem :div (markup-elements-cp config ast-body)))) + false])))) breadcrumbs (->> (into [] parents-props) (concat [page-name-props] (when more? [:more])) (filterv identity) (map (fn [x] (if (and (vector? x) (second x)) - (let [[block label] x] - (rum/with-key (breadcrumb-fragment config block label opts) - (str (:block/uuid block)))) + (let [[block label page?] x + label' (if page? + label + (breadcrumb-fragment config block label opts))] + (rum/with-key label' (str (:block/uuid block)))) [:span.opacity-70 {:key "dots"} "⋯"]))) (interpose (breadcrumb-separator)))] (when (seq breadcrumbs) diff --git a/src/main/frontend/components/header.cljs b/src/main/frontend/components/header.cljs index 1c44f878d4..8cba1e4ac1 100644 --- a/src/main/frontend/components/header.cljs +++ b/src/main/frontend/components/header.cljs @@ -5,6 +5,7 @@ [clojure.string :as string] [dommy.core :as d] [frontend.common.missionary :as c.m] + [frontend.components.block :as component-block] [frontend.components.export :as export] [frontend.components.file-sync :as fs-sync] [frontend.components.page-menu :as page-menu] @@ -29,6 +30,7 @@ [frontend.ui :as ui] [frontend.util :as util] [frontend.version :refer [version]] + [logseq.common.util :as common-util] [logseq.db :as ldb] [logseq.shui.hooks :as hooks] [logseq.shui.ui :as shui] @@ -331,6 +333,19 @@ (when (state/sub :ui/toggle-highlight-recent-blocks?) (recent-slider-inner))) +(rum/defc block-breadcrumb + [page-name] + [:div.ls-block-breadcrumb.text-base.pl-2 + (when-let [page (when (and page-name (common-util/uuid-string? page-name)) + (db/entity [:block/uuid (uuid page-name)]))] + (when (:block/parent page) + [:div.text-sm + (component-block/breadcrumb {} + (state/get-current-repo) + (:block/uuid page) + {:level-limit 2 + :header? true})]))]) + (rum/defc ^:large-vars/cleanup-todo header-aux < rum/reactive [{:keys [current-repo default-home new-block-mode]}] (let [electron-mac? (and util/mac? (util/electron?)) @@ -356,7 +371,7 @@ [:div.l.flex.items-center.drag-region [left-menu (if (mobile-util/native-platform?) - ;; back button for mobile + ;; back button for mobile (when-not (or (state/home?) custom-home-page? (state/whiteboard-dashboard?)) (ui/with-shortcut :go/backward "bottom" [:button.it.navigation.nav-left.button.icon.opacity-70 @@ -373,53 +388,56 @@ (state/pub-event! [:go/search]))} (ui/icon "search" {:size ui/icon-size})])))]] - [:div.r.flex.drag-region - (when (and current-repo - (ldb/get-graph-rtc-uuid (db/get-db)) - (user-handler/logged-in?) - (config/db-based-graph? current-repo) - (user-handler/team-member?)) - [:<> - (recent-slider) - (rum/with-key (rtc-collaborators) - (str "collab-" current-repo)) - (rtc-indicator/indicator)]) + [:div.r.flex.drag-region.justify-between.items-center.gap-2 + [:div.flex.flex-1 + (block-breadcrumb (state/get-current-page))] + [:div.flex + (when (and current-repo + (ldb/get-graph-rtc-uuid (db/get-db)) + (user-handler/logged-in?) + (config/db-based-graph? current-repo) + (user-handler/team-member?)) + [:<> + (recent-slider) + (rum/with-key (rtc-collaborators) + (str "collab-" current-repo)) + (rtc-indicator/indicator)]) - (when (and current-repo - (not (config/demo-graph? current-repo)) - (not (config/db-based-graph? current-repo)) - (user-handler/alpha-or-beta-user?)) - (fs-sync/indicator)) + (when (and current-repo + (not (config/demo-graph? current-repo)) + (not (config/db-based-graph? current-repo)) + (user-handler/alpha-or-beta-user?)) + (fs-sync/indicator)) - (when (and (not= (state/get-current-route) :home) - (not custom-home-page?)) - (home-button)) + (when (and (not= (state/get-current-route) :home) + (not custom-home-page?)) + (home-button)) - (when config/lsp-enabled? - [:<> - (plugins/hook-ui-items :toolbar) - (plugins/updates-notifications)]) + (when config/lsp-enabled? + [:<> + (plugins/hook-ui-items :toolbar) + (plugins/updates-notifications)]) - (when (state/feature-http-server-enabled?) - (server/server-indicator (state/sub :electron/server))) + (when (state/feature-http-server-enabled?) + (server/server-indicator (state/sub :electron/server))) - (when (util/electron?) - (back-and-forward)) + (when (util/electron?) + (back-and-forward)) - (when-not (mobile-util/native-platform?) - (new-block-mode)) + (when-not (mobile-util/native-platform?) + (new-block-mode)) - (when config/publishing? - [:a.text-sm.font-medium.button {:href (rfe/href :graph)} - (t :graph)]) + (when config/publishing? + [:a.text-sm.font-medium.button {:href (rfe/href :graph)} + (t :graph)]) - (toolbar-dots-menu {:t t - :current-repo current-repo - :default-home default-home}) + (toolbar-dots-menu {:t t + :current-repo current-repo + :default-home default-home}) - (sidebar/toggle) + (sidebar/toggle) - (updater-tips-new-version t)]])) + (updater-tips-new-version t)]]])) (def ^:private header-related-flow (m/latest diff --git a/src/main/frontend/components/header.css b/src/main/frontend/components/header.css index e18bcd2491..8ce42b2433 100644 --- a/src/main/frontend/components/header.css +++ b/src/main/frontend/components/header.css @@ -314,3 +314,28 @@ html.is-zoomed-native-ios { min-width: auto; } } + + +.cp__header { + > .r > div:not(.ui__dropdown-trigger) a, button { + @apply opacity-70; + + &:hover { + @apply opacity-100; + } + } +} + +.cp__header { + .breadcrumb { + @apply flex items-center; + } + + .breadcrumb a { + @apply !opacity-75 hover:!opacity-100; + span { + @apply whitespace-nowrap text-ellipsis inline-block overflow-x-hidden align-middle; + max-width: 34ch; + } + } +} diff --git a/src/main/frontend/components/page.cljs b/src/main/frontend/components/page.cljs index 1337a17fbc..93f3fdeffc 100644 --- a/src/main/frontend/components/page.cljs +++ b/src/main/frontend/components/page.cljs @@ -646,12 +646,6 @@ (if (and whiteboard-page? (not sidebar?)) [:div ((state/get-component :whiteboard/tldraw-preview) (:block/uuid page))] ;; FIXME: this is not reactive [:div.relative.grid.gap-8.page-inner - (when (and (:block/parent page) (not sidebar?) (not whiteboard?)) - (let [config (merge config {:id "block-parent" - :block? true})] - [:div.ml-1 - (component-block/breadcrumb config repo block-id {:level-limit 3})])) - (when-not (or block? sidebar?) [:div.flex.flex-row.space-between (when (and (or (mobile-util/native-platform?) (util/mobile?)) (not db-based?)) diff --git a/src/main/frontend/components/right_sidebar.css b/src/main/frontend/components/right_sidebar.css index 5623f8de08..5f154c138f 100644 --- a/src/main/frontend/components/right_sidebar.css +++ b/src/main/frontend/components/right_sidebar.css @@ -21,16 +21,6 @@ html[data-theme=light] { height: calc(100vh - 48px); } -.cp__header { - > .r > div:not(.ui__dropdown-trigger) a, button { - @apply opacity-70; - - &:hover { - @apply opacity-100; - } - } -} - .cp__right-sidebar-topbar { @apply px-1 h-12; From c096f9fb39432ca64f4be9129a21bf8ca6ad0fa4 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 15 May 2025 16:02:06 +0800 Subject: [PATCH 11/67] Style tweaks --- src/main/frontend/components/page.cljs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/frontend/components/page.cljs b/src/main/frontend/components/page.cljs index 93f3fdeffc..8ea1e0be85 100644 --- a/src/main/frontend/components/page.cljs +++ b/src/main/frontend/components/page.cljs @@ -611,7 +611,6 @@ (let [current-repo (state/sub :git/current-repo) *tabs-rendered? (::tabs-rendered? state) repo (or repo current-repo) - block-id (:block/uuid page) block? (some? (:block/page page)) class-page? (ldb/class? page) property-page? (ldb/property? page) @@ -673,7 +672,9 @@ (when (or (not show-tabs?) tabs-rendered?) [:div.ls-page-blocks - {:style {:margin-left (if whiteboard? 0 -20)}} + {:style {:margin-left (if whiteboard? 0 -20)} + :class (when-not sidebar? + "mt-4")} (page-blocks-cp page (merge option {:sidebar? sidebar? :container-id (:container-id state) :whiteboard? whiteboard?}))])]) From 99e816e9de00e6b2a938a883265cfb67eb0f69d2 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 16 May 2025 14:45:44 +0800 Subject: [PATCH 12/67] chore: rename get-page-parents to get-class-extends --- deps/db/src/logseq/db.cljs | 4 ++-- deps/db/src/logseq/db/frontend/class.cljs | 2 +- deps/db/src/logseq/db/frontend/db.cljs | 10 +++++----- deps/db/test/logseq/db_test.cljs | 2 +- .../src/logseq/graph_parser/exporter.cljs | 2 +- deps/outliner/src/logseq/outliner/validate.cljs | 2 +- src/main/frontend/worker/pipeline.cljs | 2 +- src/main/frontend/worker/search.cljs | 4 ++-- .../worker/handler/page/db_based/page_test.cljs | 11 ++++++----- 9 files changed, 20 insertions(+), 19 deletions(-) diff --git a/deps/db/src/logseq/db.cljs b/deps/db/src/logseq/db.cljs index 10f30fba5e..08407d6ec5 100644 --- a/deps/db/src/logseq/db.cljs +++ b/deps/db/src/logseq/db.cljs @@ -534,9 +534,9 @@ (when db (get-key-value db :logseq.kv/remote-schema-version))) (def get-all-properties db-db/get-all-properties) -(def get-page-parents db-db/get-page-parents) +(def get-class-extends db-db/get-class-extends) (def get-classes-parents db-db/get-classes-parents) -(def get-title-with-parents db-db/get-title-with-parents) +(def get-class-title-with-extends db-db/get-class-title-with-extends) (def class-instance? db-db/class-instance?) (def inline-tag? db-db/inline-tag?) (def node-display-type-classes db-db/node-display-type-classes) diff --git a/deps/db/src/logseq/db/frontend/class.cljs b/deps/db/src/logseq/db/frontend/class.cljs index 1e03552fbc..76b53661a7 100644 --- a/deps/db/src/logseq/db/frontend/class.cljs +++ b/deps/db/src/logseq/db/frontend/class.cljs @@ -121,7 +121,7 @@ [db eid] (->> (d/q '[:find [?c ...] - :in $ ?class-extends % + :in $ ?p % :where (class-extends ?p ?c)] db diff --git a/deps/db/src/logseq/db/frontend/db.cljs b/deps/db/src/logseq/db/frontend/db.cljs index 239a779e99..7a2602cfef 100644 --- a/deps/db/src/logseq/db/frontend/db.cljs +++ b/deps/db/src/logseq/db/frontend/db.cljs @@ -48,7 +48,7 @@ (map (fn [d] (d/entity db (:e d)))))) -(defn get-page-parents +(defn get-class-extends [node & {:keys [node-class?]}] (when-let [parent (:logseq.property.class/extends node)] (loop [current-parent parent @@ -61,10 +61,10 @@ (conj parents' current-parent)) (vec (reverse parents')))))) -(defn get-title-with-parents +(defn get-class-title-with-extends [entity] - (if (or (entity-util/class? entity) (entity-util/internal-page? entity)) - (let [parents' (->> (get-page-parents entity) + (if (entity-util/class? entity) + (let [parents' (->> (get-class-extends entity) (remove (fn [e] (= :logseq.class/Root (:db/ident e)))) vec)] (string/join @@ -75,7 +75,7 @@ (defn get-classes-parents [tags] (let [tags' (filter entity-util/class? tags) - result (mapcat #(get-page-parents % {:node-class? true}) tags')] + result (mapcat #(get-class-extends % {:node-class? true}) tags')] (set result))) (defn class-instance? diff --git a/deps/db/test/logseq/db_test.cljs b/deps/db/test/logseq/db_test.cljs index c53bf1db41..f6d22c1f09 100644 --- a/deps/db/test/logseq/db_test.cljs +++ b/deps/db/test/logseq/db_test.cljs @@ -48,7 +48,7 @@ (let [conn (db-test/create-conn)] (d/transact! conn class-parents-data) (is (= #{"x" "y"} - (->> (ldb/get-page-parents (ldb/get-page @conn "z") {:node-class? true}) + (->> (ldb/get-class-parents (ldb/get-page @conn "z") {:node-class? true}) (map :block/title) set))))) diff --git a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs index a527e17316..fb996aa34e 100644 --- a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs @@ -126,7 +126,7 @@ db (ns-util/get-last-part full-name)) (map #(d/entity db %)) - (some #(let [parents (->> (ldb/get-page-parents %) + (some #(let [parents (->> (ldb/get-class-extends %) (remove (fn [e] (= :logseq.class/Root (:db/ident e)))) vec)] (when (= full-name (string/join ns-util/namespace-char (map :block/name (conj parents %)))) diff --git a/deps/outliner/src/logseq/outliner/validate.cljs b/deps/outliner/src/logseq/outliner/validate.cljs index de4a0f78f1..abc1c8ee77 100644 --- a/deps/outliner/src/logseq/outliner/validate.cljs +++ b/deps/outliner/src/logseq/outliner/validate.cljs @@ -59,7 +59,7 @@ (throw (ex-info "Duplicate page by parent" {:type :notification :payload {:message (str "Another page named " (pr-str new-title) " already exists for parents " - (pr-str (->> (ldb/get-page-parents entity) + (pr-str (->> (ldb/get-class-extends entity) (map :block/title) (string/join ns-util/parent-char)))) :type :warning}})))) diff --git a/src/main/frontend/worker/pipeline.cljs b/src/main/frontend/worker/pipeline.cljs index 08c1bb788e..d59fc21330 100644 --- a/src/main/frontend/worker/pipeline.cljs +++ b/src/main/frontend/worker/pipeline.cljs @@ -64,7 +64,7 @@ template-blocks (->> (mapcat (fn [id] (let [tag (d/entity db id) journal? (= journal-id id) - parents (ldb/get-page-parents tag {:node-class? true}) + parents (ldb/get-class-extends tag {:node-class? true}) templates (mapcat :logseq.property/_template-applied-to (conj parents tag))] (cond->> templates journal? diff --git a/src/main/frontend/worker/search.cljs b/src/main/frontend/worker/search.cljs index 3923badf5c..2a2a1f83cc 100644 --- a/src/main/frontend/worker/search.cljs +++ b/src/main/frontend/worker/search.cljs @@ -225,7 +225,7 @@ DROP TRIGGER IF EXISTS blocks_au; ;; (let [content (if (and db-based? (seq (:block/properties block))) ;; (str content (when (not= content "") "\n") (get-db-properties-str db properties)) ;; content)]) - (let [title (ldb/get-title-with-parents (assoc block :block.temp/search? true))] + (let [title (ldb/get-class-title-with-extends (assoc block :block.temp/search? true))] (when uuid {:id (str uuid) :page (str (or (:block/uuid page) uuid)) @@ -319,7 +319,7 @@ DROP TRIGGER IF EXISTS blocks_au; {:db/id (:db/id block) :block/uuid block-id :block/title (if (ldb/page? block) - (ldb/get-title-with-parents block) + (ldb/get-class-title-with-extends block) (or snippet title)) :block/page (if (common-util/uuid-string? page) (uuid page) diff --git a/src/test/frontend/worker/handler/page/db_based/page_test.cljs b/src/test/frontend/worker/handler/page/db_based/page_test.cljs index c6b1f5f5dd..84472dadc0 100644 --- a/src/test/frontend/worker/handler/page/db_based/page_test.cljs +++ b/src/test/frontend/worker/handler/page/db_based/page_test.cljs @@ -31,10 +31,11 @@ ;; Create a child page for a class [_ child-uuid3] (worker-db-page/create! conn "c1/c2" {:split-namespace? true :class? true}) child-page3 (d/entity @conn [:block/uuid child-uuid3])] - (is (= ["foo" "bar"] (map :block/title (ldb/get-page-parents child-page))) + (is (= ["foo" "bar"] (map :block/title [(:block/parent (:block/parent child-page)) + (:block/parent child-page)])) "Child page with new parent has correct parents") - (is (= (map :block/uuid (ldb/get-page-parents child-page)) - (map :block/uuid (ldb/get-page-parents child-page2))) + (is (= (map :block/uuid (ldb/get-class-extends child-page)) + (map :block/uuid (ldb/get-class-extends child-page2))) "Child page with existing parents has correct parents") (is (= ["Root Tag" "c1"] (map :block/title (ldb/get-classes-parents [child-page3]))) "Child class with new parent has correct parents") @@ -52,8 +53,8 @@ (let [_ (worker-db-page/create! conn "vim/keys" {:split-namespace? true}) _ (worker-db-page/create! conn "emacs/keys" {:split-namespace? true})] (is (= #{"vim" "emacs"} - (->> (d/q '[:find [(pull ?b [{:logseq.property.class/extends [:block/title]}]) ...] :where [?b :block/title "keys"]] @conn) - (map #(get-in % [:logseq.property.class/extends :block/title])) + (->> (d/q '[:find [(pull ?b [{:block/parent [:block/title]}]) ...] :where [?b :block/title "keys"]] @conn) + (map #(get-in % [:block/parent :block/title])) set)) "Two child pages with same name exist and have different parents"))) From 407154d537d49d9975e5d3926c6041700ead6696 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 16 May 2025 15:01:13 +0800 Subject: [PATCH 13/67] fix: tests --- src/test/frontend/worker/rtc/rtc_fns_test.cljs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/frontend/worker/rtc/rtc_fns_test.cljs b/src/test/frontend/worker/rtc/rtc_fns_test.cljs index bf148bc609..91be912c5a 100644 --- a/src/test/frontend/worker/rtc/rtc_fns_test.cljs +++ b/src/test/frontend/worker/rtc/rtc_fns_test.cljs @@ -179,7 +179,7 @@ :block/order "a2" :block/parent [:block/uuid page-uuid]}] (ldb/get-page @conn page-name) - {:sibling? true :keep-uuid? true})) + {:sibling? false :keep-uuid? true})) (testing "apply-remote-move-ops-test1" (let [data-from-ws {:req-id "req-id" :t 1 ;; not used @@ -249,7 +249,7 @@ :block/left [:block/uuid uuid1-client] :block/parent [:block/uuid page-uuid]}] (ldb/get-page @conn page-name) - {:sibling? true :keep-uuid? true})) + {:sibling? false :keep-uuid? true})) (testing "apply-remote-remove-ops-test1" (let [data-from-ws {:req-id "req-id" :t 1 :t-before 0 :affected-blocks @@ -406,7 +406,7 @@ result: :block/left [:block/uuid uuid1-client] :block/parent [:block/uuid page1-uuid]}] (ldb/get-page @conn page-name) - {:sibling? true :keep-uuid? true})) + {:sibling? false :keep-uuid? true})) (let [data-from-ws {:req-id "req-id" :t 1 :t-before 0 :affected-blocks {page2-uuid {:op :update-page From b9fedf2eb966c6faab71ac1c50b9806c8a26558a Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 16 May 2025 16:03:42 +0800 Subject: [PATCH 14/67] fix: use ldb/get-built-in-page to get Library To avoid get another page with the same title. --- deps/db/src/logseq/db.cljs | 6 ++++++ deps/db/src/logseq/db/sqlite/create_graph.cljs | 2 +- deps/db/src/logseq/db/sqlite/util.cljs | 8 ++++---- deps/graph-parser/src/logseq/graph_parser/block.cljs | 4 +--- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/deps/db/src/logseq/db.cljs b/deps/db/src/logseq/db.cljs index 08407d6ec5..b991b41d21 100644 --- a/deps/db/src/logseq/db.cljs +++ b/deps/db/src/logseq/db.cljs @@ -243,6 +243,12 @@ (d/entity db [:block/uuid id]) (d/entity db (get-first-page-by-name db (name page-id-name-or-uuid))))))) +(defn get-built-in-page + [db title] + (when db + (let [id (common-uuid/gen-uuid :builtin-block-uuid title)] + (d/entity db [:block/uuid id])))) + (defn get-case-page "Case sensitive version of get-page. For use with DB graphs" [db page-name-or-uuid] diff --git a/deps/db/src/logseq/db/sqlite/create_graph.cljs b/deps/db/src/logseq/db/sqlite/create_graph.cljs index 7e603363bf..2419a300e9 100644 --- a/deps/db/src/logseq/db/sqlite/create_graph.cljs +++ b/deps/db/src/logseq/db/sqlite/create_graph.cljs @@ -128,7 +128,7 @@ :properties (filter entity-util/property? properties-tx)})) (def built-in-pages-names - #{"Contents" "Library"}) + #{"Library"}) (defn- validate-tx-for-duplicate-idents [tx] (when-let [conflicting-idents diff --git a/deps/db/src/logseq/db/sqlite/util.cljs b/deps/db/src/logseq/db/sqlite/util.cljs index 951b26769b..6e3575b523 100644 --- a/deps/db/src/logseq/db/sqlite/util.cljs +++ b/deps/db/src/logseq/db/sqlite/util.cljs @@ -104,11 +104,11 @@ (defn build-new-page "Builds a basic page to be transacted. A minimal version of gp-block/page-name->map" - [page-name] + [title] (block-with-timestamps - {:block/name (common-util/page-name-sanity-lc page-name) - :block/title page-name - :block/uuid (common-uuid/gen-uuid :builtin-block-uuid page-name) + {:block/name (common-util/page-name-sanity-lc title) + :block/title title + :block/uuid (common-uuid/gen-uuid :builtin-block-uuid title) :block/tags #{:logseq.class/Page}})) (defn kv diff --git a/deps/graph-parser/src/logseq/graph_parser/block.cljs b/deps/graph-parser/src/logseq/graph_parser/block.cljs index 7d4297c61d..af8ca72dea 100644 --- a/deps/graph-parser/src/logseq/graph_parser/block.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/block.cljs @@ -367,9 +367,7 @@ (defn page-with-parent-and-order "Apply to namespace pages" [db page & {:keys [parent]}] - ;; FIXME: using db/ident instead of page title because users can create pages - ;; with the same name - (let [library (ldb/get-page db "Library")] + (let [library (ldb/get-built-in-page db "Library")] (when (nil? library) (throw (ex-info "Library page doesn't exist" {}))) (assoc page From 0822e455f8bde8f274d5efd0f3ba7b6475e22e80 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 16 May 2025 16:27:28 +0800 Subject: [PATCH 15/67] Add tests for namespaces in Library --- src/main/frontend/components/cmdk/core.cljs | 3 ++- .../frontend/worker/handler/page/db_based/page.cljs | 13 +++++++------ .../worker/handler/page/db_based/page_test.cljs | 8 +++++++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/frontend/components/cmdk/core.cljs b/src/main/frontend/components/cmdk/core.cljs index 24e8daa9ab..ebb3e9d981 100644 --- a/src/main/frontend/components/cmdk/core.cljs +++ b/src/main/frontend/components/cmdk/core.cljs @@ -122,7 +122,8 @@ (and parent-title (= (util/page-name-sanity-lc parent-title) - (util/page-name-sanity-lc (nth (reverse (string/split input "/")) 1))))))) + (some-> (util/nth-safe (reverse (string/split input "/")) 1) + util/page-name-sanity-lc)))))) (some (fn [block] (and (:block/tags block) diff --git a/src/main/frontend/worker/handler/page/db_based/page.cljs b/src/main/frontend/worker/handler/page/db_based/page.cljs index 40b7fb35f4..515306ffdf 100644 --- a/src/main/frontend/worker/handler/page/db_based/page.cljs +++ b/src/main/frontend/worker/handler/page/db_based/page.cljs @@ -86,23 +86,24 @@ :block/title ""})])) (defn- get-page-by-parent-name - [db parent-title child-title] + [db parent-title child-title class?] (some->> (d/q '[:find [?b ...] - :in $ ?parent-name ?child-name + :in $ ?attribute ?parent-name ?child-name :where - [?b :logseq.property.class/extends ?p] + [?b ?attribute ?p] [?b :block/name ?child-name] [?p :block/name ?parent-name]] db + (if class? :logseq.property.class/extends :block/parent) (common-util/page-name-sanity-lc parent-title) (common-util/page-name-sanity-lc child-title)) first (d/entity db))) (defn- split-namespace-pages - [db page date-formatter] + [db page date-formatter create-class?] (let [{:block/keys [title] block-uuid :block/uuid} page] (->> (if (and (or (entity-util/class? page) @@ -117,7 +118,7 @@ (let [last-part? (= idx (dec (count parts))) page (if (zero? idx) (ldb/get-page db part) - (get-page-by-parent-name db (nth parts (dec idx)) part)) + (get-page-by-parent-name db (nth parts (dec idx)) part create-class?)) result (or page (gp-block/page-name->map part db true date-formatter {:page-uuid (when last-part? block-uuid) @@ -205,7 +206,7 @@ :page-uuid (when (uuid? uuid) uuid) :skip-existing-page-check? true}) [page parents] (if (and (text/namespace-page? title) split-namespace?) - (let [pages (split-namespace-pages db page date-formatter)] + (let [pages (split-namespace-pages db page date-formatter class?)] [(last pages) (butlast pages)]) [page nil])] (when (and page (or (nil? (:db/ident page)) diff --git a/src/test/frontend/worker/handler/page/db_based/page_test.cljs b/src/test/frontend/worker/handler/page/db_based/page_test.cljs index 84472dadc0..66219ac6de 100644 --- a/src/test/frontend/worker/handler/page/db_based/page_test.cljs +++ b/src/test/frontend/worker/handler/page/db_based/page_test.cljs @@ -30,7 +30,13 @@ child-page2 (d/entity @conn [:block/uuid child-uuid2]) ;; Create a child page for a class [_ child-uuid3] (worker-db-page/create! conn "c1/c2" {:split-namespace? true :class? true}) - child-page3 (d/entity @conn [:block/uuid child-uuid3])] + child-page3 (d/entity @conn [:block/uuid child-uuid3]) + library (ldb/get-built-in-page @conn "Library") + bar (ldb/get-page @conn "bar")] + (is (= ["foo"] (map :block/title (:block/_parent library))) + "Namespace (non-class) pages are added to the Library page") + (is (= ["baz" "baz2"] (map :block/title (:block/_parent bar))) + "Child pages are created under the same parent") (is (= ["foo" "bar"] (map :block/title [(:block/parent (:block/parent child-page)) (:block/parent child-page)])) "Child page with new parent has correct parents") From dca6ef95ee982b186ed1fcf813bb28ad98d1135e Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 16 May 2025 21:31:06 +0800 Subject: [PATCH 16/67] add migration --- deps/db/src/logseq/db/frontend/schema.cljs | 2 +- .../db/src/logseq/db/sqlite/create_graph.cljs | 2 +- .../logseq/graph_parser/exporter_test.cljs | 2 +- src/main/frontend/components/class.cljs | 6 +- src/main/frontend/components/page.cljs | 2 +- src/main/frontend/db/model.cljs | 2 +- src/main/frontend/worker/db/migrate.cljs | 80 +++++++++++++++---- src/main/frontend/worker/handler/page.cljs | 2 +- 8 files changed, 73 insertions(+), 25 deletions(-) diff --git a/deps/db/src/logseq/db/frontend/schema.cljs b/deps/db/src/logseq/db/frontend/schema.cljs index daf826d256..3260587a98 100644 --- a/deps/db/src/logseq/db/frontend/schema.cljs +++ b/deps/db/src/logseq/db/frontend/schema.cljs @@ -37,7 +37,7 @@ (map (juxt :major :minor) [(parse-schema-version x) (parse-schema-version y)]))) -(def version (parse-schema-version "64.8")) +(def version (parse-schema-version "64.9")) (defn major-version "Return a number. diff --git a/deps/db/src/logseq/db/sqlite/create_graph.cljs b/deps/db/src/logseq/db/sqlite/create_graph.cljs index 2419a300e9..6d4d78861b 100644 --- a/deps/db/src/logseq/db/sqlite/create_graph.cljs +++ b/deps/db/src/logseq/db/sqlite/create_graph.cljs @@ -13,7 +13,7 @@ [logseq.db.frontend.schema :as db-schema] [logseq.db.sqlite.util :as sqlite-util])) -(defn- mark-block-as-built-in [block] +(defn mark-block-as-built-in [block] (assoc block :logseq.property/built-in? true)) (defn- schema->qualified-property-keyword diff --git a/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs b/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs index 68dad7b52b..7311574f4e 100644 --- a/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs +++ b/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs @@ -390,7 +390,7 @@ (testing "namespaces" (let [expand-children (fn expand-children [ent parent] - (if-let [children (:logseq.property/_parent ent)] + (if-let [children (:block/_parent ent)] (cons {:parent (:block/title parent) :child (:block/title ent)} (mapcat #(expand-children % ent) children)) [{:parent (:block/title parent) :child (:block/title ent)}]))] diff --git a/src/main/frontend/components/class.cljs b/src/main/frontend/components/class.cljs index 3ceb6708c1..63a0f8b8b2 100644 --- a/src/main/frontend/components/class.cljs +++ b/src/main/frontend/components/class.cljs @@ -7,14 +7,14 @@ (defn class-children-aux [class {:keys [default-collapsed?] :as opts}] - (let [children (->> (:logseq.property/_parent class) + (let [children (->> (:logseq.property.class/_extends class) ;; Disallow parent cycles (remove #(= (:db/id class) (:db/id %))))] (when (seq children) [:ul (for [child (sort-by :block/title children)] (let [title [:li.ml-2 (block/page-reference false (:block/uuid child) {:show-brackets? false} nil)]] - (if (seq (:logseq.property/_parent child)) + (if (seq (:logseq.property.class/_extends child)) (ui/foldable title (class-children-aux child opts) @@ -23,7 +23,7 @@ (rum/defc class-children [class] - (when (seq (:logseq.property/_parent class)) + (when (seq (:logseq.property.class/_extends class)) (let [children-pages (set (model/get-structured-children (state/get-current-repo) (:db/id class))) ;; Expand children if there are about a pageful of total blocks to display default-collapsed? (> (count children-pages) 30)] diff --git a/src/main/frontend/components/page.cljs b/src/main/frontend/components/page.cljs index 8ea1e0be85..9b1cbc783f 100644 --- a/src/main/frontend/components/page.cljs +++ b/src/main/frontend/components/page.cljs @@ -690,7 +690,7 @@ (when (and (not block?) (not db-based?)) (tagged-pages repo page title)) - (when (and (ldb/page? page) (:logseq.property/_parent page)) + (when (and (ldb/page? page) (:logseq.property.class/_extends page)) (class-component/class-children page)) ;; referenced blocks diff --git a/src/main/frontend/db/model.cljs b/src/main/frontend/db/model.cljs index 484ac5ccb7..7bbfdfecc7 100644 --- a/src/main/frontend/db/model.cljs +++ b/src/main/frontend/db/model.cljs @@ -549,7 +549,7 @@ independent of format as format specific heading characters are stripped" [repo class-id] (when-let [class (db-utils/entity repo class-id)] (->> - (if (first (:logseq.property/_parent class)) ; has children classes + (if (first (:logseq.property.class/_extends class)) ; has children classes (let [all-classes (conj (->> (get-structured-children repo class-id) (map #(db-utils/entity repo %))) class)] diff --git a/src/main/frontend/worker/db/migrate.cljs b/src/main/frontend/worker/db/migrate.cljs index d6de1f51ad..ba5a4dda54 100644 --- a/src/main/frontend/worker/db/migrate.cljs +++ b/src/main/frontend/worker/db/migrate.cljs @@ -208,20 +208,20 @@ filters-tx))) (defn- rename-properties - [props-to-rename] - (fn [conn _search-db] + [props-to-rename & {:keys [replace-fn]}] + (fn [conn] (when (ldb/db-based-graph? @conn) - (let [props-tx (rename-properties-aux @conn props-to-rename)] - ;; Property changes need to be in their own tx for subsequent uses of properties to take effect - (ldb/transact! conn props-tx {:db-migrate? true}) - - (mapcat (fn [[old new]] - ;; can't use datoms b/c user properties aren't indexed - (->> (d/q '[:find ?b ?prop-v :in $ ?prop :where [?b ?prop ?prop-v]] @conn old) - (mapcat (fn [[id prop-value]] - [[:db/retract id old] - [:db/add id new prop-value]])))) - props-to-rename))))) + (let [props-tx (rename-properties-aux @conn props-to-rename) + fix-tx (mapcat (fn [[old new]] + ;; can't use datoms b/c user properties aren't indexed + (->> (d/q '[:find ?b ?prop-v :in $ ?prop :where [?b ?prop ?prop-v]] @conn old) + (mapcat (fn [[id prop-value]] + (if (fn? replace-fn) + (replace-fn id prop-value) + [[:db/retract id old] + [:db/add id new prop-value]]))))) + props-to-rename)] + (concat props-tx fix-tx))))) (defn- rename-classes [classes-to-rename] @@ -796,7 +796,7 @@ :logseq.task/repeated? :logseq.property.repeat/repeated? :logseq.task/scheduled-on-property :logseq.property.repeat/temporal-property :logseq.task/recur-status-property :logseq.property.repeat/checked-property}) - conn search-db)) + conn)) (defn- rename-task-properties [conn search-db] @@ -856,7 +856,54 @@ :logseq.task/priority :logseq.property/priority :logseq.task/deadline :logseq.property/deadline :logseq.task/scheduled :logseq.property/scheduled}) - conn search-db)) + conn)) + +(defn- fix-rename-parent-to-extends + [conn _search-db] + (let [db @conn + parent-entity (d/entity db :logseq.property/parent)] + (when parent-entity + (let [old-p :logseq.property/parent + new-p :logseq.property.class/extends + f (rename-properties + {old-p new-p} + {:replace-fn (fn [id prop-value] + (let [page (d/entity db id) + new-p' (if (ldb/class? page) new-p :block/parent)] + [[:db/retract id old-p] + [:db/add id new-p' prop-value]]))}) + rename-property-tx (f conn) + library-page (if-let [page (ldb/get-built-in-page db "Library")] + page + (-> (sqlite-util/build-new-page "Library") + sqlite-create-graph/mark-block-as-built-in)) + library-id (:block/uuid library-page) + library-page-tx (when-not (de/entity? library-page) + [library-page]) + pages-with-parent (->> (d/datoms db :avet :logseq.property/parent) + (keep (fn [d] + (let [e (d/entity db (:e d))] + (when-not (ldb/class? e) + e))))) + parents (->> pages-with-parent + (map :logseq.property/parent) + (common-util/distinct-by :db/id)) + top-parents (remove :logseq.property/parent parents) + top-parent-ids (set (map :db/id top-parents)) + move-top-parents-to-library (map (fn [parent] + {:db/id (:db/id parent) + :block/parent [:block/uuid library-id] + :block/order (db-order/gen-key)}) top-parents) + update-children-parent-and-order (->> pages-with-parent + (remove (fn [page] (top-parent-ids (:db/id page)))) + (map (fn [page] + {:db/id (:db/id page) + :block/order (db-order/gen-key)})))] + (concat + rename-property-tx + library-page-tx + move-top-parents-to-library + update-children-parent-and-order))))) (def ^:large-vars/cleanup-todo schema-version->updates "A vec of tuples defining datascript migrations. Each tuple consists of the @@ -969,7 +1016,8 @@ ["64.5" {:fix add-group-by-property-for-list-views}] ["64.6" {:fix cardinality-one-multiple-values}] ["64.7" {:fix rename-repeated-properties}] - ["64.8" {:fix rename-task-properties}]]) + ["64.8" {:fix rename-task-properties}] + ["64.9" {:fix fix-rename-parent-to-extends}]]) (let [[major minor] (last (sort (map (comp (juxt :major :minor) db-schema/parse-schema-version first) schema-version->updates))) diff --git a/src/main/frontend/worker/handler/page.cljs b/src/main/frontend/worker/handler/page.cljs index e54a1c1a79..70cbc46eb2 100644 --- a/src/main/frontend/worker/handler/page.cljs +++ b/src/main/frontend/worker/handler/page.cljs @@ -95,7 +95,7 @@ delete-property-tx [[:db.fn/retractEntity (:db/id page)]]) restore-class-parent-tx (when db-based? - (->> (filter (fn [p] (ldb/class? p)) (:logseq.property/_parent page)) + (->> (filter ldb/class? (:logseq.property.class/_extends page)) (map (fn [p] {:db/id (:db/id p) :logseq.property.class/extends :logseq.class/Root})))) From 4ee5e68560229743ce09da54ba11085e1a837185 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 16 May 2025 22:11:12 +0800 Subject: [PATCH 17/67] fix: breadcrumbs --- src/main/frontend/components/block.cljs | 51 ++++++++---------------- src/main/frontend/components/header.cljs | 5 +-- src/main/frontend/components/header.css | 3 ++ src/main/frontend/extensions/tldraw.cljs | 3 +- src/main/frontend/worker/db/migrate.cljs | 4 +- 5 files changed, 24 insertions(+), 42 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index d220a0dcc9..e9d76ebc9a 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -3174,35 +3174,22 @@ ;; "block-id - uuid of the target block of breadcrumb. page uuid is also acceptable" (rum/defc breadcrumb-aux < rum/reactive - [config repo block-id {:keys [show-page? indent? end-separator? level-limit _navigating-block] - :or {show-page? true - level-limit 3} + [config repo block-id {:keys [show-page? indent? end-separator? _navigating-block] + :or {show-page? true} :as opts}] (let [from-property (when (and block-id (config/db-based-graph? repo)) (:logseq.property/created-from-property (db/entity [:block/uuid block-id]))) - parents (db/get-block-parents repo block-id {:depth (inc level-limit)}) - parents (remove nil? (concat parents [from-property])) - page (or (db/get-block-page repo block-id) ;; only return for block uuid - (model/query-block-by-uuid block-id)) ;; return page entity when received page uuid - page-name (:block/name page) - page-title (:block/title page) - show? (or (seq parents) show-page? page-name) - parents (if (= page-name (:block/name (first parents))) - (rest parents) - parents) - more? (> (count parents) level-limit) - parents (if more? (take-last level-limit parents) parents) + parents (db/get-block-parents repo block-id {:depth 1000}) + parents (cond-> (remove nil? (concat parents [from-property])) + (not show-page?) + rest) config (assoc config :breadcrumb? true :disable-redirect? true :disable-preview? true :stop-click-event? false)] - (when show? - (let [page-name-props (when (and show-page? (not (ldb/page? (db/entity [:block/uuid block-id])))) - [page - (page-cp {:disable-preview? true} page) - {:block/name (or page-title page-name)}]) - parents-props (doall + (when (seq parents) + (let [parents-props (doall (for [{:block/keys [uuid name title] :as block} parents] (if name [block (page-cp {:disable-preview? true} block) true] @@ -3220,18 +3207,13 @@ (->elem :span (map-inline config ast-title)) (->elem :div (markup-elements-cp config ast-body)))) false])))) - breadcrumbs (->> (into [] parents-props) - (concat [page-name-props] - (when more? [:more])) - (filterv identity) + breadcrumbs (->> parents-props (map (fn [x] - (if (and (vector? x) (second x)) - (let [[block label page?] x - label' (if page? - label - (breadcrumb-fragment config block label opts))] - (rum/with-key label' (str (:block/uuid block)))) - [:span.opacity-70 {:key "dots"} "⋯"]))) + (let [[block label page?] x + label' (if page? + label + (breadcrumb-fragment config block label opts))] + (rum/with-key label' (str (:block/uuid block)))))) (interpose (breadcrumb-separator)))] (when (seq breadcrumbs) [:div.breadcrumb.block-parents @@ -3247,8 +3229,7 @@ (when end-separator? (breadcrumb-separator))]))))) (rum/defc breadcrumb - [config repo block-id {:keys [_show-page? _indent? _end-separator? level-limit _navigating-block] - :or {level-limit 3} + [config repo block-id {:keys [_show-page? _indent? _end-separator? _navigating-block] :as opts}] (let [[block set-block!] (hooks/use-state (db/entity [:block/uuid block-id]))] (hooks/use-effect! @@ -3258,7 +3239,7 @@ {:children? false :skip-refresh? true}) _ (when-let [id (:db/id block)] - (db-async/ Date: Fri, 16 May 2025 22:18:11 +0800 Subject: [PATCH 18/67] fix: breadcrumb style --- src/main/frontend/components/header.cljs | 2 +- src/main/frontend/extensions/tldraw.cljs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/frontend/components/header.cljs b/src/main/frontend/components/header.cljs index bd1257875f..9734775ef9 100644 --- a/src/main/frontend/components/header.cljs +++ b/src/main/frontend/components/header.cljs @@ -387,7 +387,7 @@ (state/pub-event! [:go/search]))} (ui/icon "search" {:size ui/icon-size})])))]] - [:div.r.flex.drag-region.justify-between.items-center.gap-2 + [:div.r.flex.drag-region.justify-between.items-center.gap-2.overflow-x-hidden.w-full [:div.flex.flex-1 (block-breadcrumb (state/get-current-page))] [:div.flex diff --git a/src/main/frontend/extensions/tldraw.cljs b/src/main/frontend/extensions/tldraw.cljs index edbebc25a8..e78acca641 100644 --- a/src/main/frontend/extensions/tldraw.cljs +++ b/src/main/frontend/extensions/tldraw.cljs @@ -54,7 +54,7 @@ (block/breadcrumb {:preview? true} (state/get-current-repo) (uuid (gobj/get props "blockId")) - {:end-separator? (gobj/get props "endSeparator")})) + {:end-separator? (gobj/get props "endSeparator")})) - (rum/defc tweet [props] From baa615f463f4bc6cb192db0715a330aa20ef6cc5 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 16 May 2025 22:51:45 +0800 Subject: [PATCH 19/67] Add migration test --- src/main/frontend/worker/db/migrate.cljs | 2 +- src/test/frontend/worker/migrate_test.cljs | 78 ++++++++++++++++++++++ src/test/migration/64.8.transit | 1 + 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/test/frontend/worker/migrate_test.cljs create mode 100644 src/test/migration/64.8.transit diff --git a/src/main/frontend/worker/db/migrate.cljs b/src/main/frontend/worker/db/migrate.cljs index cf576535d3..8a8ec5a970 100644 --- a/src/main/frontend/worker/db/migrate.cljs +++ b/src/main/frontend/worker/db/migrate.cljs @@ -207,7 +207,7 @@ ordered-columns-tx filters-tx))) -(defn- rename-properties +(defn rename-properties [props-to-rename & {:keys [replace-fn]}] (fn [conn] (when (ldb/db-based-graph? @conn) diff --git a/src/test/frontend/worker/migrate_test.cljs b/src/test/frontend/worker/migrate_test.cljs new file mode 100644 index 0000000000..4ab1f314d5 --- /dev/null +++ b/src/test/frontend/worker/migrate_test.cljs @@ -0,0 +1,78 @@ +(ns frontend.worker.migrate-test + (:require ["fs" :as fs-node] + [cljs.test :refer [deftest is testing]] + [datascript.core :as d] + [frontend.worker.db.migrate :as db-migrate] + [logseq.db :as ldb])) + +(deftest ^:focus test-fix-rename-parent-to-extends + (testing "Rename parent to extends" + (let [db-transit (str (fs-node/readFileSync "src/test/migration/64.8.transit")) + db (ldb/read-transit-str db-transit) + conn (d/conn-from-db db) + tx-data (db-migrate/fix-rename-parent-to-extends conn nil)] + (is (= (->> tx-data + (map (fn [data] + (if (and (map? data) (:block/created-at data)) + (dissoc data :block/created-at :block/updated-at) + data)))) + [{:db/id 35, + :db/ident :logseq.property.class/extends, + :block/title "Extends", + :block/name "extends"} + [:db/retract 161 :logseq.property/parent] + [:db/add 161 :logseq.property.class/extends 1] + [:db/retract 163 :logseq.property/parent] + [:db/add 163 :logseq.property.class/extends 162] + [:db/retract 139 :logseq.property/parent] + [:db/add 139 :logseq.property.class/extends 137] + [:db/retract 138 :logseq.property/parent] + [:db/add 138 :logseq.property.class/extends 1] + [:db/retract 140 :logseq.property/parent] + [:db/add 140 :logseq.property.class/extends 1] + [:db/retract 158 :logseq.property/parent] + [:db/add 158 :block/parent 155] + [:db/retract 134 :logseq.property/parent] + [:db/add 134 :logseq.property.class/extends 133] + [:db/retract 3 :logseq.property/parent] + [:db/add 3 :logseq.property.class/extends 1] + [:db/retract 142 :logseq.property/parent] + [:db/add 142 :logseq.property.class/extends 1] + [:db/retract 135 :logseq.property/parent] + [:db/add 135 :logseq.property.class/extends 133] + [:db/retract 133 :logseq.property/parent] + [:db/add 133 :logseq.property.class/extends 1] + [:db/retract 162 :logseq.property/parent] + [:db/add 162 :logseq.property.class/extends 161] + [:db/retract 144 :logseq.property/parent] + [:db/add 144 :logseq.property.class/extends 1] + [:db/retract 155 :logseq.property/parent] + [:db/add 155 :block/parent 154] + [:db/retract 165 :logseq.property/parent] + [:db/add 165 :logseq.property.class/extends 162] + [:db/retract 143 :logseq.property/parent] + [:db/add 143 :logseq.property.class/extends 1] + [:db/retract 136 :logseq.property/parent] + [:db/add 136 :logseq.property.class/extends 1] + [:db/retract 2 :logseq.property/parent] + [:db/add 2 :logseq.property.class/extends 1] + [:db/retract 4 :logseq.property/parent] + [:db/add 4 :logseq.property.class/extends 1] + [:db/retract 156 :logseq.property/parent] + [:db/add 156 :block/parent 155] + [:db/retract 141 :logseq.property/parent] + [:db/add 141 :logseq.property.class/extends 1] + [:db/retract 137 :logseq.property/parent] + [:db/add 137 :logseq.property.class/extends 1] + {:block/name "library", + :block/title "Library", + :block/uuid #uuid "00000004-1294-7765-6000-000000000000", + :block/tags #{:logseq.class/Page}, + :logseq.property/built-in? true} + {:db/id 154, + :block/parent + [:block/uuid #uuid "00000004-1294-7765-6000-000000000000"], + :block/order "a6"} + {:db/id 155, :block/order "a7"} + {:db/id 156, :block/order "a8"} + {:db/id 158, :block/order "a9"}]))))) diff --git a/src/test/migration/64.8.transit b/src/test/migration/64.8.transit new file mode 100644 index 0000000000..9ac89046d1 --- /dev/null +++ b/src/test/migration/64.8.transit @@ -0,0 +1 @@ +["~#datascript/DB",["^ ","~:schema",["^ ","~i32","~:logseq.property.node/display-type","~i64","~:logseq.property.tldraw/shape","~i96","~:logseq.property/icon","~i128","~:logseq.property.history/scalar-value","~:logseq.property.view/type.table",["^ ","~:db/ident","^:"],"~:logseq.property/ui-position",["^ ","~:db/index",true,"~:db/cardinality","~:db.cardinality/one","^;","^<"],"~:file/created-at",["^ "],"~:logseq.property.repeat/temporal-property",["^ ","^=",true,"~:db/valueType","~:db.type/ref","^>","^?","^;","^A"],"~:logseq.property.user/name",["^ ","^=",true,"^>","^?","^;","^D"],"~i1","~:logseq.class/Root","~i33","~:logseq.property/description","~i65","~:logseq.property.journal/title-format","~i97","~:logseq.property/publishing-public?","~:logseq.property.pdf/hl-image",["^ ","^=",true,"^B","^C","^>","^?","^;","^L"],"~i129","~:logseq.property/created-by","~i161","~:user.class/c1-WZWvHmP_","~:logseq.property.fsrs/state",["^ ","^=",true,"^>","^?","^;","^Q"],"~:logseq.property.pdf/hl-color",["^ ","^=",true,"^B","^C","^>","^?","^;","^R"],"~:logseq.kv/graph-initial-schema-version",["^ ","^;","^S"],"~:block/tx-id",["^ "],"~:logseq.property/value",["^ ","^=",true,"^>","^?","^;","^U"],"~:logseq.property.repeat/recur-unit.week",["^ ","^;","^V"],"~i2","~:logseq.class/Tag","~i34","~:logseq.property.code/lang","~i66","~:logseq.property/choice-checkbox-state","~i98","~:logseq.property/exclude-from-graph-view","~i130","~:logseq.property/created-by-ref","~i162","~:user.class/c2-MLtnsZDo","~:logseq.property.table/sorting",["^ ","^=",true,"^>","^?","^;","^16"],"~:logseq.property.table/pinned-columns",["^ ","^=",true,"^B","^C","^>","~:db.cardinality/many","^;","^17"],"~:logseq.property.repeat/recur-unit.day",["^ ","^;","^19"],"~i3","~:logseq.class/Property","~i35","~:logseq.property/parent","~i67","~:logseq.property/checkbox-display-properties","~i99","~:logseq.property.view/type","~i131","~:logseq.property/used-template","~i163","~:user.class/c3-ohC96z8l","~i4","~:logseq.class/Template","~i68","~:logseq.property/status","~i100","^:","~i132","~:logseq.property/template-applied-to","~:logseq.property/deadline",["^ ","^=",true,"^>","^?","^;","^1K"],"~:logseq.property/type",["^ ","^=",true,"^>","^?","^;","^1L"],"~:logseq.property.repeat/recur-unit.year",["^ ","^;","^1M"],"~:file/content",["^ "],"~i5","~:logseq.kv/db-type","~i37","~:logseq.property/default-value","~i69","~:logseq.property/status.backlog","~i101","~:logseq.property.view/type.list","~i133","~:logseq.class/Page","~i165","~:user.class/c4-jwaGdjpF","~:logseq.property.table/sized-columns",["^ ","^=",true,"^>","^?","^;","^1Z"],"~:block/alias",["^ ","^=",true,"^B","^C","^>","^18","^;","^1["],"~i6","~:logseq.kv/schema-version","~:logseq.property.user/avatar",["^ ","^=",true,"^>","^?","^;","^21"],"~i38","~:logseq.property/scalar-default-value","~i70","~:logseq.property/status.todo","~i102","~:logseq.property.view/type.gallery","~i134","~:logseq.class/Journal","~:kv/value",["^ "],"^23",["^ ","^=",true,"^>","^?","^;","^23"],"~:logseq.property.asset/type",["^ ","^=",true,"^>","^?","^;","^2;"],"~:logseq.class/Asset",["^ ","^;","^2<"],"~:logseq.property/color.green",["^ ","^;","^2="],"~i7","^S","~i39","~:logseq.property.class/properties","~i71","~:logseq.property/status.doing","~i103","~:logseq.property.view/feature-type","~i135","~:logseq.class/Whiteboard","~:logseq.property.linked-references/includes",["^ ","^=",true,"^B","^C","^>","^18","^;","^2F"],"~:logseq.property.repeat/recur-unit",["^ ","^=",true,"^B","^C","^>","^?","^;","^2G"],"^1>",["^ ","^=",true,"^B","^C","^>","^18","^;","^1>"],"~:block/link",["^ ","^=",true,"^B","^C","^>","^?","^;","^2H"],"^1@",["^ ","^=",true,"^B","^C","^>","^?","^;","^1@"],"~:logseq.class/Quote-block",["^ ","^;","^2I"],"~:logseq.property/heading",["^ ","^=",true,"^>","^?","^;","^2J"],"~i8","~:logseq.kv/graph-created-at","~i40","~:logseq.property/hide-empty-value","~i72","~:logseq.property/status.in-review","~i104","~:logseq.property.view/group-by-property","~:block/uuid",["^ ","~:db/unique","~:db.unique/identity"],"~i136","~:logseq.class/Task","~:logseq.property/color.purple",["^ ","^;","^2W"],"~:logseq.property.table/hidden-columns",["^ ","^=",true,"^>","^18","^;","^2X"],"^1:",["^ ","^;","^1:"],"~i9","~:logseq.property/empty-placeholder","~i73","~:logseq.property/status.done","~i105","^16","^1W",["^ ","^;","^1W"],"~i137","~:logseq.class/Query","~:block/updated-at",["^ ","^=",true,"^>","^?","^;","^33"],"~:logseq.property/color.blue",["^ ","^;","^34"],"~i10","^1L","~i42","~:logseq.property.class/hide-from-node","~i74","~:logseq.property/status.canceled","~i106","~:logseq.property.table/filters","~i138","~:logseq.class/Card","^1U",["^ ","^;","^1U"],"~i11","~:logseq.property/built-in?","~:file/size",["^ "],"~i43","~:logseq.property/query","^1G",["^ ","^=",true,"^B","^C","^>","^?","^;","^1G"],"~i75","~:logseq.property/priority","~i107","^2X","~i139","~:logseq.class/Cards","^2M",["^ ","^=",true,"^>","^?","^;","^2M"],"~:block/refs",["^ ","^=",true,"^B","^C","^>","^18","^;","^3H"],"^3=",["^ ","^;","^3="],"^N",["^ ","^=",true,"^>","^?","^;","^N"],"~i12","~:logseq.property/hide?","~i44","~:logseq.property/page-tags","~i76","~:logseq.property/priority.low","~i108","~:logseq.property.table/ordered-columns","~i140","^2<","^15",["^ ","^;","^15"],"^2Q",["^ ","^=",true,"^B","^C","^>","^?","^;","^2Q"],"~:logseq.property/view-context",["^ ","^=",true,"^>","^?","^;","^3R"],"^20",["^ ","^;","^20"],"~:logseq.property.pdf/hl-page",["^ ","^=",true,"^>","^?","^;","^3S"],"~i13","~:logseq.property/created-from-property","~:block/closed-value-property",["^ ","^=",true,"^B","^C","^>","^18","^;","^3V"],"~i77","~:logseq.property/priority.medium","~i109","^1Z","~:logseq.property.asset/checksum",["^ ","^=",true,"^>","^?","^;","^3Z"],"^K",["^ ","^=",true,"^>","^?","^;","^K"],"~i141","~:logseq.class/Code-block","^3",["^ ","^=",true,"^>","^?","^;","^3"],"^1S",["^ ","^;","^1S"],"~i14","~:logseq.property/public?","~:file/last-modified-at",["^ "],"~i46","~:logseq.property/background-color","~i78","~:logseq.property/priority.high","~i110","^17","~i142","^2I","^2?",["^ ","^=",true,"^B","^C","^>","^18","^;","^2?"],"^1B",["^ ","^=",true,"^B","^C","^>","^?","^;","^1B"],"~:logseq.property/enable-history?",["^ ","^=",true,"^>","^?","^;","^4:"],"~i15","^3R","~i47","^2J","~i79","~:logseq.property/priority.urgent","~:logseq.class/Math-block",["^ ","^;","^4?"],"~i111","~:logseq.property/view-for","~i143","^4?","~:block/created-at",["^ ","^=",true,"^>","^?","^;","^4C"],"^9",["^ ","^=",true,"^>","^?","^;","^9"],"^3L",["^ ","^=",true,"^B","^C","^>","^18","^;","^3L"],"~:logseq.property/scheduled",["^ ","^=",true,"^>","^?","^;","^4D"],"^2V",["^ ","^;","^2V"],"~:block/collapsed?",["^ ","^=",true,"^>","^?","^;","^4E"],"~:logseq.property.asset/last-visit-page",["^ ","^=",true,"^>","^?","^;","^4F"],"~:logseq.property.tldraw/page",["^ ","^=",true,"^>","^?","^;","^4G"],"~i16","^<","~i48","~:logseq.property/asset","~i80","^1K","^P",["^ ","^;","^P"],"~i112","^2;","~i144","~:logseq.class/Pdf-annotation","^3?",["^ ","^=",true,"^>","^?","^;","^3?"],"~i17","~:logseq.property/classes","~i49","~:logseq.property/ls-type","^37",["^ ","^=",true,"^>","^?","^;","^37"],"~i113","~:logseq.property.asset/size","~:logseq.property.linked-references/excludes",["^ ","^=",true,"^B","^C","^>","^18","^;","^4U"],"^2C",["^ ","^=",true,"^>","^?","^;","^2C"],"^40",["^ ","^;","^40"],"^[",["^ ","^=",true,"^>","^?","^;","^["],"~:logseq.property.repeat/checked-property",["^ ","^=",true,"^B","^C","^>","^?","^;","^4V"],"~:logseq.property.asset/resize-metadata",["^ ","^=",true,"^>","^?","^;","^4W"],"^4R",["^ ","^=",true,"^>","^?","^;","^4R"],"^3G",["^ ","^;","^3G"],"^1D",["^ ","^;","^1D"],"~:logseq.property.user/email",["^ ","^=",true,"^>","^?","^;","^4X"],"^4A",["^ ","^=",true,"^B","^C","^>","^?","^;","^4A"],"~i18","^U","^3B",["^ ","^=",true,"^B","^C","^>","^?","^;","^3B"],"~i50","~:logseq.property.pdf/hl-type","~i82","^4D","~i114","^3Z","^3J",["^ ","^=",true,"^>","^?","^;","^3J"],"^45",["^ ","^=",true,"^B","^C","^>","^?","^;","^45"],"~:logseq.property.repeat/recur-frequency",["^ ","^=",true,"^B","^C","^>","^?","^;","^52"],"^1Q",["^ ","^=",true,"^B","^C","^>","^?","^;","^1Q"],"~:block/journal-day",["^ ","^=",true],"^1Y",["^ ","^;","^1Y"],"~:logseq.property/color.red",["^ ","^;","^54"],"~i19","^1[","^E",["^ ","^;","^E"],"~i51","^R","~i115","^4F","~:logseq.property.repeat/recur-unit.minute",["^ ","^;","^58"],"^2Y",["^ ","^;","^2Y"],"^Y",["^ ","^=",true,"^>","^?","^;","^Y"],"~i20","~:block/tags","~i52","~:logseq.property/color.yellow","~i84","^52","~i116","~:logseq.property.asset/remote-metadata","^13",["^ ","^=",true,"^B","^C","^>","^?","^;","^13"],"^47",["^ ","^;","^47"],"^3N",["^ ","^;","^3N"],"^5:",["^ ","^=",true,"^B","^C","^>","^18","^;","^5:"],"~:block/title",["^ ","^=",true,"^>","^?","^;","^5@"],"^5",["^ ","^=",true,"^>","^?","^;","^5"],"^2E",["^ ","^;","^2E"],"~i21","~:block/parent","~i53","^54","~i117","^4W","^3U",["^ ","^=",true,"^B","^C","^>","^?","^;","^3U"],"^7",["^ ","^=",true,"^>","^?","^;","^7"],"^4>",["^ ","^;","^4>"],"^4T",["^ ","^=",true,"^>","^?","^;","^4T"],"~i22","~:block/order","~i54","^2=","~i86","^2G","~i118","~:logseq.property.fsrs/due","^4P",["^ ","^=",true,"^B","^C","^>","^18","^;","^4P"],"^4J",["^ ","^=",true,"^B","^C","^>","^?","^;","^4J"],"^2K",["^ ","^;","^2K"],"~i23","^4E","~i55","^34","~i87","^58","~i119","^Q","~:logseq.property/order-list-type",["^ ","^=",true,"^B","^C","^>","^?","^;","^5O"],"^11",["^ ","^=",true,"^>","^?","^;","^11"],"~i24","~:block/page","~i56","^2W","^4[",["^ ","^=",true,"^>","^?","^;","^4["],"~i88","~:logseq.property.repeat/recur-unit.hour","~i120","^D","^;",["^ ","^2S","^2T"],"^27",["^ ","^;","^27"],"^G",["^ ","^=",true,"^B","^C","^>","^?","^;","^G"],"~:logseq.property.history/block",["^ ","^=",true,"^B","^C","^>","^?","^;","^5V"],"~:block/path-refs",["^ ","^=",true,"^B","^C","^>","^18","^;","^5W"],"^5B",["^ ","^=",true,"^B","^C","^>","^?","^;","^5B"],"~i25","^3H","~i57","^3S","~i89","^19","~i121","^4X","^29",["^ ","^;","^29"],"~i26","^5W","~i58","^L","~i90","^V","^5T",["^ ","^;","^5T"],"^5<",["^ ","^;","^5<"],"~i122","^21","^3X",["^ ","^;","^3X"],"~:logseq.property.history/property",["^ ","^=",true,"^B","^C","^>","^?","^;","^64"],"~:logseq.property.pdf/hl-value",["^ ","^=",true,"^>","^?","^;","^65"],"^32",["^ ","^;","^32"],"~i27","^2H","~i59","^65","~i91","~:logseq.property.repeat/recur-unit.month","~i123","^4:","^5?",["^ ","^=",true,"^>","^?","^;","^5?"],"^69",["^ ","^;","^69"],"^5F",["^ ","^=",true,"^>","^?","^;","^5F"],"^3D",["^ ","^=",true,"^B","^C","^>","^?","^;","^3D"],"~:logseq.property.history/ref-value",["^ ","^=",true,"^B","^C","^>","^?","^;","^6;"],"^5J",["^ ","^=",true,"^>","^?","^;","^5J"],"~i28","^5@","^2A",["^ ","^;","^2A"],"~i60","^5O","~i92","^1M","^5Q",["^ ","^=",true,"^B","^C","^>","^?","^;","^5Q"],"~:block/name",["^ ","^=",true],"^4N",["^ ","^;","^4N"],"^3P",["^ ","^=",true,"^>","^?","^;","^3P"],"~:file/path",["^ ","^2S","^2T"],"~i29","^3V","~i61","^2F","~i93","~:logseq.property.repeat/repeated?","~i125","^5V","^6D",["^ ","^=",true,"^>","^?","^;","^6D"],"^W",["^ ","^;","^W"],"^2O",["^ ","^;","^2O"],"^42",["^ ","^=",true,"^>","^?","^;","^42"],"^1<",["^ ","^=",true,"^B","^C","^>","^?","^;","^1<"],"~i30","^4C","~i62","^4U","~i94","^A","~i126","^64","^39",["^ ","^;","^39"],"^1J",["^ ","^=",true,"^B","^C","^>","^18","^;","^1J"],"^1E",["^ ","^;","^1E"],"^I",["^ ","^=",true,"^>","^?","^;","^I"],"^2[",["^ ","^;","^2["],"~i31","^33","~i63","^4G","^1O",["^ ","^;","^1O"],"~i95","^4V","~i127","^6;","^3;",["^ ","^=",true,"^>","^?","^;","^3;"],"^25",["^ ","^;","^25"]],"~:datoms",["~#list",[["~#datascript/Datom",[1,"^4C",1747407249336,536870913]],["^6P",[1,"^6?","root tag",536870913]],["^6P",[1,"^5:",2,536870913]],["^6P",[1,"^5@","Root Tag",536870913]],["^6P",[1,"^33",1747407249336,536870913]],["^6P",[1,"^2R","~u00000002-2737-8382-7000-000000000000",536870913]],["^6P",[1,"^;","^E",536870913]],["^6P",[1,"^3?",true,536870913]],["^6P",[2,"^4C",1747407249336,536870913]],["^6P",[2,"^6?","tag",536870913]],["^6P",[2,"^5:",2,536870913]],["^6P",[2,"^5@","Tag",536870913]],["^6P",[2,"^33",1747407249336,536870913]],["^6P",[2,"^2R","~u00000002-5389-0208-3000-000000000000",536870913]],["^6P",[2,"^;","^W",536870913]],["^6P",[2,"^3?",true,536870913]],["^6P",[2,"^1<",1,536870913]],["^6P",[3,"^4C",1747407249336,536870913]],["^6P",[3,"^6?","property",536870913]],["^6P",[3,"^5:",2,536870913]],["^6P",[3,"^5@","Property",536870913]],["^6P",[3,"^33",1747407249336,536870913]],["^6P",[3,"^2R","~u00000002-1038-7670-4800-000000000000",536870913]],["^6P",[3,"^;","^1:",536870913]],["^6P",[3,"^3?",true,536870913]],["^6P",[3,"^1<",1,536870913]],["^6P",[4,"^4C",1747407249337,536870913]],["^6P",[4,"^6?","template",536870913]],["^6P",[4,"^5:",2,536870913]],["^6P",[4,"^5@","Template",536870913]],["^6P",[4,"^33",1747407249337,536870913]],["^6P",[4,"^2R","~u00000002-1720-8548-4600-000000000000",536870913]],["^6P",[4,"^;","^1E",536870913]],["^6P",[4,"^3?",true,536870913]],["^6P",[4,"^1<",1,536870913]],["^6P",[4,"^2?",132,536870913]],["^6P",[5,"^;","^1O",536870913]],["^6P",[5,"^2:","db",536870913]],["^6P",[6,"^;","^20",536870913]],["^6P",[6,"^2:",["^ ","~:major",64,"~:minor",8],536870913]],["^6P",[7,"^;","^S",536870913]],["^6P",[7,"^2:",["^ ","^6Q",64,"^6R",8],536870913]],["^6P",[8,"^;","^2K",536870913]],["^6P",[8,"^2:",1747407249331,536870913]],["^6P",[9,"^;","^2Y",536870913]],["^6P",[10,"^4C",1747407249331,536870913]],["^6P",[10,"^6?","property type",536870913]],["^6P",[10,"^5F","czyz",536870913]],["^6P",[10,"^5:",3,536870913]],["^6P",[10,"^5@","Property type",536870913]],["^6P",[10,"^33",1747407249331,536870913]],["^6P",[10,"^2R","~u00000002-8384-2404-0000-000000000000",536870913]],["^6P",[10,"^>","^?",536870913]],["^6P",[10,"^;","^1L",536870913]],["^6P",[10,"^=",true,536870913]],["^6P",[10,"^3?",true,536870913]],["^6P",[10,"^3J",true,536870913]],["^6P",[10,"^1L","~:keyword",536870913]],["^6P",[11,"^4C",1747407249331,536870913]],["^6P",[11,"^6?","built in?",536870913]],["^6P",[11,"^5F","czz0",536870913]],["^6P",[11,"^5:",3,536870913]],["^6P",[11,"^5@","Built in?",536870913]],["^6P",[11,"^33",1747407249331,536870913]],["^6P",[11,"^2R","~u00000002-1125-9581-6000-000000000000",536870913]],["^6P",[11,"^>","^?",536870913]],["^6P",[11,"^;","^3?",536870913]],["^6P",[11,"^=",true,536870913]],["^6P",[11,"^3?",true,536870913]],["^6P",[11,"^3J",true,536870913]],["^6P",[11,"^1L","~:checkbox",536870913]],["^6P",[12,"^4C",1747407249332,536870913]],["^6P",[12,"^6?","hide this property",536870913]],["^6P",[12,"^5F","czz1",536870913]],["^6P",[12,"^5:",3,536870913]],["^6P",[12,"^5@","Hide this property",536870913]],["^6P",[12,"^33",1747407249332,536870913]],["^6P",[12,"^2R","~u00000002-6836-5746-0000-000000000000",536870913]],["^6P",[12,"^>","^?",536870913]],["^6P",[12,"^;","^3J",536870913]],["^6P",[12,"^=",true,536870913]],["^6P",[12,"^3?",true,536870913]],["^6P",[12,"^3J",true,536870913]],["^6P",[12,"^1L","^6T",536870913]],["^6P",[13,"^4C",1747407249332,536870913]],["^6P",[13,"^6?","created from property",536870913]],["^6P",[13,"^5F","czz2",536870913]],["^6P",[13,"^5:",3,536870913]],["^6P",[13,"^5@","Created from property",536870913]],["^6P",[13,"^33",1747407249332,536870913]],["^6P",[13,"^2R","~u00000002-8618-9226-7000-000000000000",536870913]],["^6P",[13,"^>","^?",536870913]],["^6P",[13,"^;","^3U",536870913]],["^6P",[13,"^=",true,536870913]],["^6P",[13,"^B","^C",536870913]],["^6P",[13,"^3?",true,536870913]],["^6P",[13,"^3J",true,536870913]],["^6P",[13,"^1L","~:entity",536870913]],["^6P",[14,"^4C",1747407249332,536870913]],["^6P",[14,"^6?","property public?",536870913]],["^6P",[14,"^5F","czz3",536870913]],["^6P",[14,"^5:",3,536870913]],["^6P",[14,"^5@","Property public?",536870913]],["^6P",[14,"^33",1747407249332,536870913]],["^6P",[14,"^2R","~u00000002-1843-0851-4900-000000000000",536870913]],["^6P",[14,"^>","^?",536870913]],["^6P",[14,"^;","^42",536870913]],["^6P",[14,"^=",true,536870913]],["^6P",[14,"^3?",true,536870913]],["^6P",[14,"^3J",true,536870913]],["^6P",[14,"^1L","^6T",536870913]],["^6P",[15,"^4C",1747407249332,536870913]],["^6P",[15,"^6?","property view context",536870913]],["^6P",[15,"^5F","czz4",536870913]],["^6P",[15,"^5:",3,536870913]],["^6P",[15,"^5@","Property view context",536870913]],["^6P",[15,"^33",1747407249332,536870913]],["^6P",[15,"^2R","~u00000002-1547-3958-2800-000000000000",536870913]],["^6P",[15,"^>","^?",536870913]],["^6P",[15,"^;","^3R",536870913]],["^6P",[15,"^=",true,536870913]],["^6P",[15,"^3?",true,536870913]],["^6P",[15,"^3J",true,536870913]],["^6P",[15,"^1L","^6S",536870913]],["^6P",[16,"^4C",1747407249332,536870913]],["^6P",[16,"^6?","property position",536870913]],["^6P",[16,"^5F","czz5",536870913]],["^6P",[16,"^5:",3,536870913]],["^6P",[16,"^5@","Property position",536870913]],["^6P",[16,"^33",1747407249332,536870913]],["^6P",[16,"^2R","~u00000002-1869-2008-6400-000000000000",536870913]],["^6P",[16,"^>","^?",536870913]],["^6P",[16,"^;","^<",536870913]],["^6P",[16,"^=",true,536870913]],["^6P",[16,"^3?",true,536870913]],["^6P",[16,"^3J",true,536870913]],["^6P",[16,"^1L","^6S",536870913]],["^6P",[17,"^4C",1747407249332,536870913]],["^6P",[17,"^6?","property classes",536870913]],["^6P",[17,"^5F","czz6",536870913]],["^6P",[17,"^5:",3,536870913]],["^6P",[17,"^5@","Property classes",536870913]],["^6P",[17,"^33",1747407249332,536870913]],["^6P",[17,"^2R","~u00000002-9137-5048-6000-000000000000",536870913]],["^6P",[17,"^>","^18",536870913]],["^6P",[17,"^;","^4P",536870913]],["^6P",[17,"^=",true,536870913]],["^6P",[17,"^B","^C",536870913]],["^6P",[17,"^3?",true,536870913]],["^6P",[17,"^3J",true,536870913]],["^6P",[17,"^42",false,536870913]],["^6P",[17,"^1L","^6U",536870913]],["^6P",[18,"^4C",1747407249332,536870913]],["^6P",[18,"^6?","property value",536870913]],["^6P",[18,"^5F","czz7",536870913]],["^6P",[18,"^5:",3,536870913]],["^6P",[18,"^5@","Property value",536870913]],["^6P",[18,"^33",1747407249332,536870913]],["^6P",[18,"^2R","~u00000002-1396-5248-6500-000000000000",536870913]],["^6P",[18,"^>","^?",536870913]],["^6P",[18,"^;","^U",536870913]],["^6P",[18,"^=",true,536870913]],["^6P",[18,"^3?",true,536870913]],["^6P",[18,"^3J",true,536870913]],["^6P",[18,"^42",false,536870913]],["^6P",[18,"^1L","~:any",536870913]],["^6P",[19,"^4C",1747407249332,536870913]],["^6P",[19,"^6?","alias",536870913]],["^6P",[19,"^5F","czz8",536870913]],["^6P",[19,"^5:",3,536870913]],["^6P",[19,"^5@","Alias",536870913]],["^6P",[19,"^33",1747407249332,536870913]],["^6P",[19,"^2R","~u00000002-2112-6446-9900-000000000000",536870913]],["^6P",[19,"^>","^18",536870913]],["^6P",[19,"^;","^1[",536870913]],["^6P",[19,"^=",true,536870913]],["^6P",[19,"^B","^C",536870913]],["^6P",[19,"^3?",true,536870913]],["^6P",[19,"^42",true,536870913]],["^6P",[19,"^1L","~:page",536870913]],["^6P",[19,"^3R","^6W",536870913]],["^6P",[20,"^4C",1747407249332,536870913]],["^6P",[20,"^6?","tags",536870913]],["^6P",[20,"^5F","czz9",536870913]],["^6P",[20,"^5:",3,536870913]],["^6P",[20,"^5@","Tags",536870913]],["^6P",[20,"^33",1747407249332,536870913]],["^6P",[20,"^2R","~u00000002-1814-9483-4000-000000000000",536870913]],["^6P",[20,"^>","^18",536870913]],["^6P",[20,"^;","^5:",536870913]],["^6P",[20,"^=",true,536870913]],["^6P",[20,"^B","^C",536870913]],["^6P",[20,"^3?",true,536870913]],["^6P",[20,"^42",true,536870913]],["^6P",[20,"^1L","~:class",536870913]],["^6P",[21,"^4C",1747407249332,536870913]],["^6P",[21,"^6?","node parent",536870913]],["^6P",[21,"^5F","czzA",536870913]],["^6P",[21,"^5:",3,536870913]],["^6P",[21,"^5@","Node parent",536870913]],["^6P",[21,"^33",1747407249332,536870913]],["^6P",[21,"^2R","~u00000002-9183-0906-4000-000000000000",536870913]],["^6P",[21,"^>","^?",536870913]],["^6P",[21,"^;","^5B",536870913]],["^6P",[21,"^=",true,536870913]],["^6P",[21,"^B","^C",536870913]],["^6P",[21,"^3?",true,536870913]],["^6P",[21,"^3J",true,536870913]],["^6P",[21,"^42",false,536870913]],["^6P",[21,"^1L","^6U",536870913]],["^6P",[22,"^4C",1747407249332,536870913]],["^6P",[22,"^6?","node order",536870913]],["^6P",[22,"^5F","czzB",536870913]],["^6P",[22,"^5:",3,536870913]],["^6P",[22,"^5@","Node order",536870913]],["^6P",[22,"^33",1747407249332,536870913]],["^6P",[22,"^2R","~u00000002-1429-2824-3700-000000000000",536870913]],["^6P",[22,"^>","^?",536870913]],["^6P",[22,"^;","^5F",536870913]],["^6P",[22,"^=",true,536870913]],["^6P",[22,"^3?",true,536870913]],["^6P",[22,"^3J",true,536870913]],["^6P",[22,"^42",false,536870913]],["^6P",[22,"^1L","~:string",536870913]],["^6P",[23,"^4C",1747407249332,536870913]],["^6P",[23,"^6?","node collapsed?",536870913]],["^6P",[23,"^5F","czzC",536870913]],["^6P",[23,"^5:",3,536870913]],["^6P",[23,"^5@","Node collapsed?",536870913]],["^6P",[23,"^33",1747407249332,536870913]],["^6P",[23,"^2R","~u00000002-2140-2109-9100-000000000000",536870913]],["^6P",[23,"^>","^?",536870913]],["^6P",[23,"^;","^4E",536870913]],["^6P",[23,"^=",true,536870913]],["^6P",[23,"^3?",true,536870913]],["^6P",[23,"^3J",true,536870913]],["^6P",[23,"^42",false,536870913]],["^6P",[23,"^1L","^6T",536870913]],["^6P",[24,"^4C",1747407249332,536870913]],["^6P",[24,"^6?","node page",536870913]],["^6P",[24,"^5F","czzD",536870913]],["^6P",[24,"^5:",3,536870913]],["^6P",[24,"^5@","Node page",536870913]],["^6P",[24,"^33",1747407249332,536870913]],["^6P",[24,"^2R","~u00000002-8223-1410-8000-000000000000",536870913]],["^6P",[24,"^>","^?",536870913]],["^6P",[24,"^;","^5Q",536870913]],["^6P",[24,"^=",true,536870913]],["^6P",[24,"^B","^C",536870913]],["^6P",[24,"^3?",true,536870913]],["^6P",[24,"^3J",true,536870913]],["^6P",[24,"^42",false,536870913]],["^6P",[24,"^1L","^6U",536870913]],["^6P",[25,"^4C",1747407249333,536870913]],["^6P",[25,"^6?","node references",536870913]],["^6P",[25,"^5F","czzE",536870913]],["^6P",[25,"^5:",3,536870913]],["^6P",[25,"^5@","Node references",536870913]],["^6P",[25,"^33",1747407249333,536870913]],["^6P",[25,"^2R","~u00000002-1214-4953-4900-000000000000",536870913]],["^6P",[25,"^>","^18",536870913]],["^6P",[25,"^;","^3H",536870913]],["^6P",[25,"^=",true,536870913]],["^6P",[25,"^B","^C",536870913]],["^6P",[25,"^3?",true,536870913]],["^6P",[25,"^3J",true,536870913]],["^6P",[25,"^42",false,536870913]],["^6P",[25,"^1L","^6U",536870913]],["^6P",[26,"^4C",1747407249333,536870913]],["^6P",[26,"^6?","node path references",536870913]],["^6P",[26,"^5F","czzF",536870913]],["^6P",[26,"^5:",3,536870913]],["^6P",[26,"^5@","Node path references",536870913]],["^6P",[26,"^33",1747407249333,536870913]],["^6P",[26,"^2R","~u00000002-2109-1813-5200-000000000000",536870913]],["^6P",[26,"^>","^18",536870913]],["^6P",[26,"^;","^5W",536870913]],["^6P",[26,"^=",true,536870913]],["^6P",[26,"^B","^C",536870913]],["^6P",[26,"^3?",true,536870913]],["^6P",[26,"^3J",true,536870913]],["^6P",[26,"^42",false,536870913]],["^6P",[26,"^1L","^6U",536870913]],["^6P",[27,"^4C",1747407249333,536870913]],["^6P",[27,"^6?","node links to",536870913]],["^6P",[27,"^5F","czzG",536870913]],["^6P",[27,"^5:",3,536870913]],["^6P",[27,"^5@","Node links to",536870913]],["^6P",[27,"^33",1747407249333,536870913]],["^6P",[27,"^2R","~u00000002-1872-3999-9300-000000000000",536870913]],["^6P",[27,"^>","^?",536870913]],["^6P",[27,"^;","^2H",536870913]],["^6P",[27,"^=",true,536870913]],["^6P",[27,"^B","^C",536870913]],["^6P",[27,"^3?",true,536870913]],["^6P",[27,"^3J",true,536870913]],["^6P",[27,"^42",false,536870913]],["^6P",[27,"^1L","^6U",536870913]],["^6P",[28,"^4C",1747407249333,536870913]],["^6P",[28,"^6?","node title",536870913]],["^6P",[28,"^5F","czzH",536870913]],["^6P",[28,"^5:",3,536870913]],["^6P",[28,"^5@","Node title",536870913]],["^6P",[28,"^33",1747407249333,536870913]],["^6P",[28,"^2R","~u00000002-7104-4568-4000-000000000000",536870913]],["^6P",[28,"^>","^?",536870913]],["^6P",[28,"^;","^5@",536870913]],["^6P",[28,"^=",true,536870913]],["^6P",[28,"^3?",true,536870913]],["^6P",[28,"^3J",true,536870913]],["^6P",[28,"^42",false,536870913]],["^6P",[28,"^1L","^6Y",536870913]],["^6P",[29,"^4C",1747407249333,536870913]],["^6P",[29,"^6?","closed value property",536870913]],["^6P",[29,"^5F","czzI",536870913]],["^6P",[29,"^5:",3,536870913]],["^6P",[29,"^5@","Closed value property",536870913]],["^6P",[29,"^33",1747407249333,536870913]],["^6P",[29,"^2R","~u00000002-1157-7928-1300-000000000000",536870913]],["^6P",[29,"^>","^?",536870913]],["^6P",[29,"^;","^3V",536870913]],["^6P",[29,"^=",true,536870913]],["^6P",[29,"^B","^C",536870913]],["^6P",[29,"^3?",true,536870913]],["^6P",[29,"^3J",true,536870913]],["^6P",[29,"^42",false,536870913]],["^6P",[29,"^1L","^6U",536870913]],["^6P",[30,"^4C",1747407249333,536870913]],["^6P",[30,"^6?","node created at",536870913]],["^6P",[30,"^5F","czzJ",536870913]],["^6P",[30,"^5:",3,536870913]],["^6P",[30,"^5@","Node created at",536870913]],["^6P",[30,"^33",1747407249333,536870913]],["^6P",[30,"^2R","~u00000002-1440-0150-0000-000000000000",536870913]],["^6P",[30,"^>","^?",536870913]],["^6P",[30,"^;","^4C",536870913]],["^6P",[30,"^=",true,536870913]],["^6P",[30,"^3?",true,536870913]],["^6P",[30,"^3J",true,536870913]],["^6P",[30,"^42",false,536870913]],["^6P",[30,"^1L","~:datetime",536870913]],["^6P",[31,"^4C",1747407249333,536870913]],["^6P",[31,"^6?","node updated at",536870913]],["^6P",[31,"^5F","czzK",536870913]],["^6P",[31,"^5:",3,536870913]],["^6P",[31,"^5@","Node updated at",536870913]],["^6P",[31,"^33",1747407249333,536870913]],["^6P",[31,"^2R","~u00000002-1516-5505-5100-000000000000",536870913]],["^6P",[31,"^>","^?",536870913]],["^6P",[31,"^;","^33",536870913]],["^6P",[31,"^=",true,536870913]],["^6P",[31,"^3?",true,536870913]],["^6P",[31,"^3J",true,536870913]],["^6P",[31,"^42",false,536870913]],["^6P",[31,"^1L","^6Z",536870913]],["^6P",[32,"^4C",1747407249333,536870913]],["^6P",[32,"^6?","node display type",536870913]],["^6P",[32,"^5F","czzL",536870913]],["^6P",[32,"^5:",3,536870913]],["^6P",[32,"^5@","Node Display Type",536870913]],["^6P",[32,"^33",1747407249333,536870913]],["^6P",[32,"^2R","~u00000002-4424-4618-9000-000000000000",536870913]],["^6P",[32,"^>","^?",536870913]],["^6P",[32,"^;","^3",536870913]],["^6P",[32,"^=",true,536870913]],["^6P",[32,"^3?",true,536870913]],["^6P",[32,"^3J",true,536870913]],["^6P",[32,"^42",false,536870913]],["^6P",[32,"^1L","^6S",536870913]],["^6P",[32,"^3R","~:block",536870913]],["^6P",[33,"^4C",1747407249333,536870913]],["^6P",[33,"^6?","description",536870913]],["^6P",[33,"^5F","czzM",536870913]],["^6P",[33,"^5:",3,536870913]],["^6P",[33,"^5@","Description",536870913]],["^6P",[33,"^33",1747407249333,536870913]],["^6P",[33,"^2R","~u00000002-3362-3620-0000-000000000000",536870913]],["^6P",[33,"^>","^?",536870913]],["^6P",[33,"^;","^G",536870913]],["^6P",[33,"^=",true,536870913]],["^6P",[33,"^B","^C",536870913]],["^6P",[33,"^3?",true,536870913]],["^6P",[33,"^42",true,536870913]],["^6P",[33,"^1L","~:default",536870913]],["^6P",[34,"^4C",1747407249333,536870913]],["^6P",[34,"^6?","code mode",536870913]],["^6P",[34,"^5F","czzN",536870913]],["^6P",[34,"^5:",3,536870913]],["^6P",[34,"^5@","Code Mode",536870913]],["^6P",[34,"^33",1747407249333,536870913]],["^6P",[34,"^2R","~u00000002-8578-9716-5000-000000000000",536870913]],["^6P",[34,"^>","^?",536870913]],["^6P",[34,"^;","^Y",536870913]],["^6P",[34,"^=",true,536870913]],["^6P",[34,"^3?",true,536870913]],["^6P",[34,"^3J",true,536870913]],["^6P",[34,"^42",false,536870913]],["^6P",[34,"^1L","^6Y",536870913]],["^6P",[34,"^3R","^6[",536870913]],["^6P",[35,"^4C",1747407249333,536870913]],["^6P",[35,"^6?","parent",536870913]],["^6P",[35,"^5F","czzO",536870913]],["^6P",[35,"^5:",3,536870913]],["^6P",[35,"^5@","Parent",536870913]],["^6P",[35,"^33",1747407249333,536870913]],["^6P",[35,"^2R","~u00000002-1779-8450-9000-000000000000",536870913]],["^6P",[35,"^>","^?",536870913]],["^6P",[35,"^;","^1<",536870913]],["^6P",[35,"^=",true,536870913]],["^6P",[35,"^B","^C",536870913]],["^6P",[35,"^3?",true,536870913]],["^6P",[35,"^G",36,536870913]],["^6P",[35,"^42",true,536870913]],["^6P",[35,"^1L","~:node",536870913]],["^6P",[35,"^3R","^6W",536870913]],["^6P",[36,"^4C",1747407249333,536870913]],["^6P",[36,"^5F","czzP",536870913]],["^6P",[36,"^5Q",35,536870913]],["^6P",[36,"^5B",35,536870913]],["^6P",[36,"^5@","Provides parent-child relationships between nodes. For tags this enables inheritance and for pages this enables namespaces.",536870913]],["^6P",[36,"^33",1747407249333,536870913]],["^6P",[36,"^2R","~u00000004-6576-7869-2000-000000000000",536870913]],["^6P",[36,"^3?",true,536870913]],["^6P",[36,"^3U",33,536870913]],["^6P",[37,"^4C",1747407249333,536870913]],["^6P",[37,"^6?","default value",536870913]],["^6P",[37,"^5F","czzQ",536870913]],["^6P",[37,"^5:",3,536870913]],["^6P",[37,"^5@","Default value",536870913]],["^6P",[37,"^33",1747407249333,536870913]],["^6P",[37,"^2R","~u00000002-8920-7966-2000-000000000000",536870913]],["^6P",[37,"^>","^?",536870913]],["^6P",[37,"^;","^1Q",536870913]],["^6P",[37,"^=",true,536870913]],["^6P",[37,"^B","^C",536870913]],["^6P",[37,"^3?",true,536870913]],["^6P",[37,"^3J",true,536870913]],["^6P",[37,"^42",false,536870913]],["^6P",[37,"^1L","^6U",536870913]],["^6P",[37,"^3R","~:property",536870913]],["^6P",[38,"^4C",1747407249333,536870913]],["^6P",[38,"^6?","non ref type default value",536870913]],["^6P",[38,"^5F","czzR",536870913]],["^6P",[38,"^5:",3,536870913]],["^6P",[38,"^5@","Non ref type default value",536870913]],["^6P",[38,"^33",1747407249333,536870913]],["^6P",[38,"^2R","~u00000002-1595-7230-1400-000000000000",536870913]],["^6P",[38,"^>","^?",536870913]],["^6P",[38,"^;","^23",536870913]],["^6P",[38,"^=",true,536870913]],["^6P",[38,"^3?",true,536870913]],["^6P",[38,"^3J",true,536870913]],["^6P",[38,"^42",false,536870913]],["^6P",[38,"^1L","^6V",536870913]],["^6P",[38,"^3R","^72",536870913]],["^6P",[39,"^4C",1747407249333,536870913]],["^6P",[39,"^6?","tag properties",536870913]],["^6P",[39,"^5F","czzS",536870913]],["^6P",[39,"^5:",3,536870913]],["^6P",[39,"^5@","Tag Properties",536870913]],["^6P",[39,"^33",1747407249333,536870913]],["^6P",[39,"^2R","~u00000002-2123-7120-5000-000000000000",536870913]],["^6P",[39,"^>","^18",536870913]],["^6P",[39,"^;","^2?",536870913]],["^6P",[39,"^=",true,536870913]],["^6P",[39,"^B","^C",536870913]],["^6P",[39,"^3?",true,536870913]],["^6P",[39,"^42",true,536870913]],["^6P",[39,"^1L","^72",536870913]],["^6P",[39,"^3R","~:never",536870913]],["^6P",[40,"^4C",1747407249333,536870913]],["^6P",[40,"^6?","hide empty value",536870913]],["^6P",[40,"^5F","czzT",536870913]],["^6P",[40,"^5:",3,536870913]],["^6P",[40,"^5@","Hide empty value",536870913]],["^6P",[40,"^33",1747407249333,536870913]],["^6P",[40,"^2R","~u00000002-2062-3258-9900-000000000000",536870913]],["^6P",[40,"^>","^?",536870913]],["^6P",[40,"^;","^2M",536870913]],["^6P",[40,"^=",true,536870913]],["^6P",[40,"^3?",true,536870913]],["^6P",[40,"^G",41,536870913]],["^6P",[40,"^42",true,536870913]],["^6P",[40,"^1L","^6T",536870913]],["^6P",[40,"^3R","^72",536870913]],["^6P",[41,"^4C",1747407249333,536870913]],["^6P",[41,"^5F","czzU",536870913]],["^6P",[41,"^5Q",40,536870913]],["^6P",[41,"^5B",40,536870913]],["^6P",[41,"^5@","Hides a property's value on any node when empty e.g. when a property appears on a node through a tag.",536870913]],["^6P",[41,"^33",1747407249333,536870913]],["^6P",[41,"^2R","~u00000004-1118-8585-8000-000000000000",536870913]],["^6P",[41,"^3?",true,536870913]],["^6P",[41,"^3U",33,536870913]],["^6P",[42,"^4C",1747407249333,536870913]],["^6P",[42,"^6?","hide from node",536870913]],["^6P",[42,"^5F","czzV",536870913]],["^6P",[42,"^5:",3,536870913]],["^6P",[42,"^5@","Hide from Node",536870913]],["^6P",[42,"^33",1747407249333,536870913]],["^6P",[42,"^2R","~u00000002-2610-3727-0000-000000000000",536870913]],["^6P",[42,"^>","^?",536870913]],["^6P",[42,"^;","^37",536870913]],["^6P",[42,"^=",true,536870913]],["^6P",[42,"^3?",true,536870913]],["^6P",[42,"^42",true,536870913]],["^6P",[42,"^1L","^6T",536870913]],["^6P",[42,"^3R","^6X",536870913]],["^6P",[43,"^4C",1747407249333,536870913]],["^6P",[43,"^6?","query",536870913]],["^6P",[43,"^5F","czzW",536870913]],["^6P",[43,"^5:",3,536870913]],["^6P",[43,"^5@","Query",536870913]],["^6P",[43,"^33",1747407249333,536870913]],["^6P",[43,"^2R","~u00000002-9741-4126-0000-000000000000",536870913]],["^6P",[43,"^>","^?",536870913]],["^6P",[43,"^;","^3B",536870913]],["^6P",[43,"^=",true,536870913]],["^6P",[43,"^B","^C",536870913]],["^6P",[43,"^3?",true,536870913]],["^6P",[43,"^3J",true,536870913]],["^6P",[43,"^42",true,536870913]],["^6P",[43,"^1L","^70",536870913]],["^6P",[43,"^3R","^6[",536870913]],["^6P",[44,"^4C",1747407249333,536870913]],["^6P",[44,"^6?","page tags",536870913]],["^6P",[44,"^5F","czzX",536870913]],["^6P",[44,"^5:",3,536870913]],["^6P",[44,"^5@","Page Tags",536870913]],["^6P",[44,"^33",1747407249333,536870913]],["^6P",[44,"^2R","~u00000002-2133-5311-8500-000000000000",536870913]],["^6P",[44,"^>","^18",536870913]],["^6P",[44,"^;","^3L",536870913]],["^6P",[44,"^=",true,536870913]],["^6P",[44,"^B","^C",536870913]],["^6P",[44,"^3?",true,536870913]],["^6P",[44,"^G",45,536870913]],["^6P",[44,"^42",true,536870913]],["^6P",[44,"^1L","^6W",536870913]],["^6P",[44,"^3R","^6W",536870913]],["^6P",[45,"^4C",1747407249333,536870913]],["^6P",[45,"^5F","czzY",536870913]],["^6P",[45,"^5Q",44,536870913]],["^6P",[45,"^5B",44,536870913]],["^6P",[45,"^5@","Provides a way for a page to associate to another page i.e. backward compatible tagging.",536870913]],["^6P",[45,"^33",1747407249333,536870913]],["^6P",[45,"^2R","~u00000004-1223-8671-8000-000000000000",536870913]],["^6P",[45,"^3?",true,536870913]],["^6P",[45,"^3U",33,536870913]],["^6P",[46,"^4C",1747407249333,536870913]],["^6P",[46,"^6?","background color",536870913]],["^6P",[46,"^5F","czzZ",536870913]],["^6P",[46,"^5:",3,536870913]],["^6P",[46,"^5@","Background color",536870913]],["^6P",[46,"^33",1747407249333,536870913]],["^6P",[46,"^2R","~u00000002-5191-2660-6000-000000000000",536870913]],["^6P",[46,"^>","^?",536870913]],["^6P",[46,"^;","^45",536870913]],["^6P",[46,"^=",true,536870913]],["^6P",[46,"^B","^C",536870913]],["^6P",[46,"^3?",true,536870913]],["^6P",[46,"^3J",true,536870913]],["^6P",[46,"^1L","^70",536870913]],["^6P",[47,"^4C",1747407249333,536870913]],["^6P",[47,"^6?","heading",536870913]],["^6P",[47,"^5F","czza",536870913]],["^6P",[47,"^5:",3,536870913]],["^6P",[47,"^5@","Heading",536870913]],["^6P",[47,"^33",1747407249333,536870913]],["^6P",[47,"^2R","~u00000002-1858-7494-1500-000000000000",536870913]],["^6P",[47,"^>","^?",536870913]],["^6P",[47,"^;","^2J",536870913]],["^6P",[47,"^=",true,536870913]],["^6P",[47,"^3?",true,536870913]],["^6P",[47,"^3J",true,536870913]],["^6P",[47,"^1L","^6V",536870913]],["^6P",[48,"^4C",1747407249333,536870913]],["^6P",[48,"^6?","asset",536870913]],["^6P",[48,"^5F","czzb",536870913]],["^6P",[48,"^5:",3,536870913]],["^6P",[48,"^5@","Asset",536870913]],["^6P",[48,"^33",1747407249333,536870913]],["^6P",[48,"^2R","~u00000002-8768-5679-0000-000000000000",536870913]],["^6P",[48,"^>","^?",536870913]],["^6P",[48,"^;","^4J",536870913]],["^6P",[48,"^=",true,536870913]],["^6P",[48,"^B","^C",536870913]],["^6P",[48,"^3?",true,536870913]],["^6P",[48,"^3J",true,536870913]],["^6P",[48,"^1L","^6U",536870913]],["^6P",[49,"^4C",1747407249334,536870913]],["^6P",[49,"^6?","ls-type",536870913]],["^6P",[49,"^5F","czzc",536870913]],["^6P",[49,"^5:",3,536870913]],["^6P",[49,"^5@","ls-type",536870913]],["^6P",[49,"^33",1747407249334,536870913]],["^6P",[49,"^2R","~u00000002-3269-7934-5000-000000000000",536870913]],["^6P",[49,"^>","^?",536870913]],["^6P",[49,"^;","^4R",536870913]],["^6P",[49,"^=",true,536870913]],["^6P",[49,"^3?",true,536870913]],["^6P",[49,"^3J",true,536870913]],["^6P",[49,"^1L","^6S",536870913]],["^6P",[50,"^4C",1747407249334,536870913]],["^6P",[50,"^6?","annotation type",536870913]],["^6P",[50,"^5F","czzd",536870913]],["^6P",[50,"^5:",3,536870913]],["^6P",[50,"^5@","Annotation type",536870913]],["^6P",[50,"^33",1747407249334,536870913]],["^6P",[50,"^2R","~u00000002-9984-3783-2000-000000000000",536870913]],["^6P",[50,"^>","^?",536870913]],["^6P",[50,"^;","^4[",536870913]],["^6P",[50,"^=",true,536870913]],["^6P",[50,"^3?",true,536870913]],["^6P",[50,"^3J",true,536870913]],["^6P",[50,"^1L","^6S",536870913]],["^6P",[51,"^4C",1747407249334,536870913]],["^6P",[51,"^6?","annotation color",536870913]],["^6P",[51,"^5F","czze",536870913]],["^6P",[51,"^5:",3,536870913]],["^6P",[51,"^5@","Annotation color",536870913]],["^6P",[51,"^33",1747407249334,536870913]],["^6P",[51,"^2R","~u00000002-6747-9388-7000-000000000000",536870913]],["^6P",[51,"^>","^?",536870913]],["^6P",[51,"^;","^R",536870913]],["^6P",[51,"^=",true,536870913]],["^6P",[51,"^B","^C",536870913]],["^6P",[51,"^3?",true,536870913]],["^6P",[51,"^3J",true,536870913]],["^6P",[51,"^1L","^70",536870913]],["^6P",[52,"^3V",51,536870913]],["^6P",[52,"^4C",1747407249334,536870913]],["^6P",[52,"^5F","czzf",536870913]],["^6P",[52,"^5Q",51,536870913]],["^6P",[52,"^5B",51,536870913]],["^6P",[52,"^5@","yellow",536870913]],["^6P",[52,"^33",1747407249334,536870913]],["^6P",[52,"^2R","~u00000002-1752-1030-0200-000000000000",536870913]],["^6P",[52,"^;","^5<",536870913]],["^6P",[52,"^3?",true,536870913]],["^6P",[52,"^3U",51,536870913]],["^6P",[53,"^3V",51,536870913]],["^6P",[53,"^4C",1747407249334,536870913]],["^6P",[53,"^5F","czzg",536870913]],["^6P",[53,"^5Q",51,536870913]],["^6P",[53,"^5B",51,536870913]],["^6P",[53,"^5@","red",536870913]],["^6P",[53,"^33",1747407249334,536870913]],["^6P",[53,"^2R","~u00000002-4136-2216-2000-000000000000",536870913]],["^6P",[53,"^;","^54",536870913]],["^6P",[53,"^3?",true,536870913]],["^6P",[53,"^3U",51,536870913]],["^6P",[54,"^3V",51,536870913]],["^6P",[54,"^4C",1747407249334,536870913]],["^6P",[54,"^5F","czzh",536870913]],["^6P",[54,"^5Q",51,536870913]],["^6P",[54,"^5B",51,536870913]],["^6P",[54,"^5@","green",536870913]],["^6P",[54,"^33",1747407249334,536870913]],["^6P",[54,"^2R","~u00000002-1992-2016-2600-000000000000",536870913]],["^6P",[54,"^;","^2=",536870913]],["^6P",[54,"^3?",true,536870913]],["^6P",[54,"^3U",51,536870913]],["^6P",[55,"^3V",51,536870913]],["^6P",[55,"^4C",1747407249334,536870913]],["^6P",[55,"^5F","czzi",536870913]],["^6P",[55,"^5Q",51,536870913]],["^6P",[55,"^5B",51,536870913]],["^6P",[55,"^5@","blue",536870913]],["^6P",[55,"^33",1747407249334,536870913]],["^6P",[55,"^2R","~u00000002-1836-0512-4100-000000000000",536870913]],["^6P",[55,"^;","^34",536870913]],["^6P",[55,"^3?",true,536870913]],["^6P",[55,"^3U",51,536870913]],["^6P",[56,"^3V",51,536870913]],["^6P",[56,"^4C",1747407249334,536870913]],["^6P",[56,"^5F","czzj",536870913]],["^6P",[56,"^5Q",51,536870913]],["^6P",[56,"^5B",51,536870913]],["^6P",[56,"^5@","purple",536870913]],["^6P",[56,"^33",1747407249334,536870913]],["^6P",[56,"^2R","~u00000002-1104-3848-5600-000000000000",536870913]],["^6P",[56,"^;","^2W",536870913]],["^6P",[56,"^3?",true,536870913]],["^6P",[56,"^3U",51,536870913]],["^6P",[57,"^4C",1747407249334,536870913]],["^6P",[57,"^6?","annotation page",536870913]],["^6P",[57,"^5F","czzk",536870913]],["^6P",[57,"^5:",3,536870913]],["^6P",[57,"^5@","Annotation page",536870913]],["^6P",[57,"^33",1747407249334,536870913]],["^6P",[57,"^2R","~u00000002-7532-8459-6000-000000000000",536870913]],["^6P",[57,"^>","^?",536870913]],["^6P",[57,"^;","^3S",536870913]],["^6P",[57,"^=",true,536870913]],["^6P",[57,"^3?",true,536870913]],["^6P",[57,"^3J",true,536870913]],["^6P",[57,"^1L","~:raw-number",536870913]],["^6P",[58,"^4C",1747407249334,536870913]],["^6P",[58,"^6?","annotation image",536870913]],["^6P",[58,"^5F","czzl",536870913]],["^6P",[58,"^5:",3,536870913]],["^6P",[58,"^5@","Annotation image",536870913]],["^6P",[58,"^33",1747407249334,536870913]],["^6P",[58,"^2R","~u00000002-1377-6700-9000-000000000000",536870913]],["^6P",[58,"^>","^?",536870913]],["^6P",[58,"^;","^L",536870913]],["^6P",[58,"^=",true,536870913]],["^6P",[58,"^B","^C",536870913]],["^6P",[58,"^3?",true,536870913]],["^6P",[58,"^3J",true,536870913]],["^6P",[58,"^1L","^6U",536870913]],["^6P",[59,"^4C",1747407249334,536870913]],["^6P",[59,"^6?","annotation data",536870913]],["^6P",[59,"^5F","czzm",536870913]],["^6P",[59,"^5:",3,536870913]],["^6P",[59,"^5@","Annotation data",536870913]],["^6P",[59,"^33",1747407249334,536870913]],["^6P",[59,"^2R","~u00000002-5458-2940-2000-000000000000",536870913]],["^6P",[59,"^>","^?",536870913]],["^6P",[59,"^;","^65",536870913]],["^6P",[59,"^=",true,536870913]],["^6P",[59,"^3?",true,536870913]],["^6P",[59,"^3J",true,536870913]],["^6P",[59,"^1L","~:map",536870913]],["^6P",[60,"^4C",1747407249334,536870913]],["^6P",[60,"^6?","list type",536870913]],["^6P",[60,"^5F","czzn",536870913]],["^6P",[60,"^5:",3,536870913]],["^6P",[60,"^5@","List type",536870913]],["^6P",[60,"^33",1747407249334,536870913]],["^6P",[60,"^2R","~u00000002-6078-1711-1000-000000000000",536870913]],["^6P",[60,"^>","^?",536870913]],["^6P",[60,"^;","^5O",536870913]],["^6P",[60,"^=",true,536870913]],["^6P",[60,"^B","^C",536870913]],["^6P",[60,"^3?",true,536870913]],["^6P",[60,"^3J",true,536870913]],["^6P",[60,"^1L","^70",536870913]],["^6P",[61,"^4C",1747407249334,536870913]],["^6P",[61,"^6?","included references",536870913]],["^6P",[61,"^5F","czzo",536870913]],["^6P",[61,"^5:",3,536870913]],["^6P",[61,"^5@","Included references",536870913]],["^6P",[61,"^33",1747407249334,536870913]],["^6P",[61,"^2R","~u00000002-1680-5777-0300-000000000000",536870913]],["^6P",[61,"^>","^18",536870913]],["^6P",[61,"^;","^2F",536870913]],["^6P",[61,"^=",true,536870913]],["^6P",[61,"^B","^C",536870913]],["^6P",[61,"^3?",true,536870913]],["^6P",[61,"^3J",true,536870913]],["^6P",[61,"^1L","^71",536870913]],["^6P",[62,"^4C",1747407249334,536870913]],["^6P",[62,"^6?","excluded references",536870913]],["^6P",[62,"^5F","czzp",536870913]],["^6P",[62,"^5:",3,536870913]],["^6P",[62,"^5@","Excluded references",536870913]],["^6P",[62,"^33",1747407249334,536870913]],["^6P",[62,"^2R","~u00000002-2426-7588-9000-000000000000",536870913]],["^6P",[62,"^>","^18",536870913]],["^6P",[62,"^;","^4U",536870913]],["^6P",[62,"^=",true,536870913]],["^6P",[62,"^B","^C",536870913]],["^6P",[62,"^3?",true,536870913]],["^6P",[62,"^3J",true,536870913]],["^6P",[62,"^1L","^71",536870913]],["^6P",[63,"^4C",1747407249334,536870913]],["^6P",[63,"^6?","tldraw page",536870913]],["^6P",[63,"^5F","czzq",536870913]],["^6P",[63,"^5:",3,536870913]],["^6P",[63,"^5@","Tldraw Page",536870913]],["^6P",[63,"^33",1747407249334,536870913]],["^6P",[63,"^2R","~u00000002-3546-2145-7000-000000000000",536870913]],["^6P",[63,"^>","^?",536870913]],["^6P",[63,"^;","^4G",536870913]],["^6P",[63,"^=",true,536870913]],["^6P",[63,"^3?",true,536870913]],["^6P",[63,"^3J",true,536870913]],["^6P",[63,"^1L","^75",536870913]],["^6P",[64,"^4C",1747407249334,536870913]],["^6P",[64,"^6?","tldraw shape",536870913]],["^6P",[64,"^5F","czzr",536870913]],["^6P",[64,"^5:",3,536870913]],["^6P",[64,"^5@","Tldraw Shape",536870913]],["^6P",[64,"^33",1747407249334,536870913]],["^6P",[64,"^2R","~u00000002-1313-2454-2000-000000000000",536870913]],["^6P",[64,"^>","^?",536870913]],["^6P",[64,"^;","^5",536870913]],["^6P",[64,"^=",true,536870913]],["^6P",[64,"^3?",true,536870913]],["^6P",[64,"^3J",true,536870913]],["^6P",[64,"^1L","^75",536870913]],["^6P",[65,"^4C",1747407249334,536870913]],["^6P",[65,"^6?","title format",536870913]],["^6P",[65,"^5F","czzs",536870913]],["^6P",[65,"^5:",3,536870913]],["^6P",[65,"^5@","Title Format",536870913]],["^6P",[65,"^33",1747407249334,536870913]],["^6P",[65,"^2R","~u00000002-1536-4979-5400-000000000000",536870913]],["^6P",[65,"^>","^?",536870913]],["^6P",[65,"^;","^I",536870913]],["^6P",[65,"^=",true,536870913]],["^6P",[65,"^3?",true,536870913]],["^6P",[65,"^42",false,536870913]],["^6P",[65,"^1L","^6Y",536870913]],["^6P",[66,"^4C",1747407249334,536870913]],["^6P",[66,"^6?","choice checkbox state",536870913]],["^6P",[66,"^5F","czzt",536870913]],["^6P",[66,"^5:",3,536870913]],["^6P",[66,"^5@","Choice checkbox state",536870913]],["^6P",[66,"^33",1747407249334,536870913]],["^6P",[66,"^2R","~u00000002-1272-4228-6300-000000000000",536870913]],["^6P",[66,"^>","^?",536870913]],["^6P",[66,"^;","^[",536870913]],["^6P",[66,"^=",true,536870913]],["^6P",[66,"^3?",true,536870913]],["^6P",[66,"^3J",true,536870913]],["^6P",[66,"^1L","^6T",536870913]],["^6P",[67,"^4C",1747407249334,536870913]],["^6P",[67,"^6?","properties displayed as checkbox",536870913]],["^6P",[67,"^5F","czzu",536870913]],["^6P",[67,"^5:",3,536870913]],["^6P",[67,"^5@","Properties displayed as checkbox",536870913]],["^6P",[67,"^33",1747407249334,536870913]],["^6P",[67,"^2R","~u00000002-3215-3256-9000-000000000000",536870913]],["^6P",[67,"^>","^18",536870913]],["^6P",[67,"^;","^1>",536870913]],["^6P",[67,"^=",true,536870913]],["^6P",[67,"^B","^C",536870913]],["^6P",[67,"^3?",true,536870913]],["^6P",[67,"^3J",true,536870913]],["^6P",[67,"^1L","^72",536870913]],["^6P",[68,"^4C",1747407249334,536870913]],["^6P",[68,"^6?","status",536870913]],["^6P",[68,"^5F","czzv",536870913]],["^6P",[68,"^5:",3,536870913]],["^6P",[68,"^5@","Status",536870913]],["^6P",[68,"^33",1747407249334,536870913]],["^6P",[68,"^2R","~u00000002-9072-1685-3000-000000000000",536870913]],["^6P",[68,"^>","^?",536870913]],["^6P",[68,"^;","^1G",536870913]],["^6P",[68,"^=",true,536870913]],["^6P",[68,"^B","^C",536870913]],["^6P",[68,"^3?",true,536870913]],["^6P",[68,"^1Q",70,536870913]],["^6P",[68,"^4:",true,536870913]],["^6P",[68,"^2M",true,536870913]],["^6P",[68,"^42",true,536870913]],["^6P",[68,"^1L","^70",536870913]],["^6P",[68,"^<","~:block-left",536870913]],["^6P",[69,"^3V",68,536870913]],["^6P",[69,"^4C",1747407249334,536870913]],["^6P",[69,"^5F","czzw",536870913]],["^6P",[69,"^5Q",68,536870913]],["^6P",[69,"^5B",68,536870913]],["^6P",[69,"^5@","Backlog",536870913]],["^6P",[69,"^33",1747407249334,536870913]],["^6P",[69,"^2R","~u00000002-7233-3491-0000-000000000000",536870913]],["^6P",[69,"^;","^1S",536870913]],["^6P",[69,"^3?",true,536870913]],["^6P",[69,"^3U",68,536870913]],["^6P",[69,"^7",["^ ","~:type","~:tabler-icon","~:id","Backlog"],536870913]],["^6P",[70,"^3V",68,536870913]],["^6P",[70,"^4C",1747407249334,536870913]],["^6P",[70,"^5F","czzx",536870913]],["^6P",[70,"^5Q",68,536870913]],["^6P",[70,"^5B",68,536870913]],["^6P",[70,"^5@","Todo",536870913]],["^6P",[70,"^33",1747407249334,536870913]],["^6P",[70,"^2R","~u00000002-1615-5853-7700-000000000000",536870913]],["^6P",[70,"^;","^25",536870913]],["^6P",[70,"^3?",true,536870913]],["^6P",[70,"^[",false,536870913]],["^6P",[70,"^3U",68,536870913]],["^6P",[70,"^7",["^ ","^77","^78","^79","Todo"],536870913]],["^6P",[71,"^3V",68,536870913]],["^6P",[71,"^4C",1747407249334,536870913]],["^6P",[71,"^5F","czzy",536870913]],["^6P",[71,"^5Q",68,536870913]],["^6P",[71,"^5B",68,536870913]],["^6P",[71,"^5@","Doing",536870913]],["^6P",[71,"^33",1747407249334,536870913]],["^6P",[71,"^2R","~u00000002-1840-1229-0800-000000000000",536870913]],["^6P",[71,"^;","^2A",536870913]],["^6P",[71,"^3?",true,536870913]],["^6P",[71,"^3U",68,536870913]],["^6P",[71,"^7",["^ ","^77","^78","^79","InProgress50"],536870913]],["^6P",[72,"^3V",68,536870913]],["^6P",[72,"^4C",1747407249334,536870913]],["^6P",[72,"^5F","czzz",536870913]],["^6P",[72,"^5Q",68,536870913]],["^6P",[72,"^5B",68,536870913]],["^6P",[72,"^5@","In Review",536870913]],["^6P",[72,"^33",1747407249334,536870913]],["^6P",[72,"^2R","~u00000002-1870-0014-4300-000000000000",536870913]],["^6P",[72,"^;","^2O",536870913]],["^6P",[72,"^3?",true,536870913]],["^6P",[72,"^3U",68,536870913]],["^6P",[72,"^7",["^ ","^77","^78","^79","InReview"],536870913]],["^6P",[73,"^3V",68,536870913]],["^6P",[73,"^4C",1747407249334,536870913]],["^6P",[73,"^5F","d0000",536870913]],["^6P",[73,"^5Q",68,536870913]],["^6P",[73,"^5B",68,536870913]],["^6P",[73,"^5@","Done",536870913]],["^6P",[73,"^33",1747407249334,536870913]],["^6P",[73,"^2R","~u00000002-1827-5820-8200-000000000000",536870913]],["^6P",[73,"^;","^2[",536870913]],["^6P",[73,"^3?",true,536870913]],["^6P",[73,"^[",true,536870913]],["^6P",[73,"^3U",68,536870913]],["^6P",[73,"^7",["^ ","^77","^78","^79","Done"],536870913]],["^6P",[74,"^3V",68,536870913]],["^6P",[74,"^4C",1747407249334,536870913]],["^6P",[74,"^5F","d0001",536870913]],["^6P",[74,"^5Q",68,536870913]],["^6P",[74,"^5B",68,536870913]],["^6P",[74,"^5@","Canceled",536870913]],["^6P",[74,"^33",1747407249334,536870913]],["^6P",[74,"^2R","~u00000002-7526-4326-2000-000000000000",536870913]],["^6P",[74,"^;","^39",536870913]],["^6P",[74,"^3?",true,536870913]],["^6P",[74,"^3U",68,536870913]],["^6P",[74,"^7",["^ ","^77","^78","^79","Cancelled"],536870913]],["^6P",[75,"^4C",1747407249334,536870913]],["^6P",[75,"^6?","priority",536870913]],["^6P",[75,"^5F","d0002",536870913]],["^6P",[75,"^5:",3,536870913]],["^6P",[75,"^5@","Priority",536870913]],["^6P",[75,"^33",1747407249334,536870913]],["^6P",[75,"^2R","~u00000002-2392-2841-1000-000000000000",536870913]],["^6P",[75,"^>","^?",536870913]],["^6P",[75,"^;","^3D",536870913]],["^6P",[75,"^=",true,536870913]],["^6P",[75,"^B","^C",536870913]],["^6P",[75,"^3?",true,536870913]],["^6P",[75,"^4:",true,536870913]],["^6P",[75,"^2M",true,536870913]],["^6P",[75,"^42",true,536870913]],["^6P",[75,"^1L","^70",536870913]],["^6P",[75,"^<","^76",536870913]],["^6P",[76,"^3V",75,536870913]],["^6P",[76,"^4C",1747407249334,536870913]],["^6P",[76,"^5F","d0003",536870913]],["^6P",[76,"^5Q",75,536870913]],["^6P",[76,"^5B",75,536870913]],["^6P",[76,"^5@","Low",536870913]],["^6P",[76,"^33",1747407249334,536870913]],["^6P",[76,"^2R","~u00000002-2107-4537-4800-000000000000",536870913]],["^6P",[76,"^;","^3N",536870913]],["^6P",[76,"^3?",true,536870913]],["^6P",[76,"^3U",75,536870913]],["^6P",[76,"^7",["^ ","^77","^78","^79","priorityLvlLow"],536870913]],["^6P",[77,"^3V",75,536870913]],["^6P",[77,"^4C",1747407249334,536870913]],["^6P",[77,"^5F","d0004",536870913]],["^6P",[77,"^5Q",75,536870913]],["^6P",[77,"^5B",75,536870913]],["^6P",[77,"^5@","Medium",536870913]],["^6P",[77,"^33",1747407249334,536870913]],["^6P",[77,"^2R","~u00000002-1829-3222-7800-000000000000",536870913]],["^6P",[77,"^;","^3X",536870913]],["^6P",[77,"^3?",true,536870913]],["^6P",[77,"^3U",75,536870913]],["^6P",[77,"^7",["^ ","^77","^78","^79","priorityLvlMedium"],536870913]],["^6P",[78,"^3V",75,536870913]],["^6P",[78,"^4C",1747407249334,536870913]],["^6P",[78,"^5F","d0005",536870913]],["^6P",[78,"^5Q",75,536870913]],["^6P",[78,"^5B",75,536870913]],["^6P",[78,"^5@","High",536870913]],["^6P",[78,"^33",1747407249334,536870913]],["^6P",[78,"^2R","~u00000002-5672-2766-8000-000000000000",536870913]],["^6P",[78,"^;","^47",536870913]],["^6P",[78,"^3?",true,536870913]],["^6P",[78,"^3U",75,536870913]],["^6P",[78,"^7",["^ ","^77","^78","^79","priorityLvlHigh"],536870913]],["^6P",[79,"^3V",75,536870913]],["^6P",[79,"^4C",1747407249334,536870913]],["^6P",[79,"^5F","d0006",536870913]],["^6P",[79,"^5Q",75,536870913]],["^6P",[79,"^5B",75,536870913]],["^6P",[79,"^5@","Urgent",536870913]],["^6P",[79,"^33",1747407249334,536870913]],["^6P",[79,"^2R","~u00000002-1996-4346-6700-000000000000",536870913]],["^6P",[79,"^;","^4>",536870913]],["^6P",[79,"^3?",true,536870913]],["^6P",[79,"^3U",75,536870913]],["^6P",[79,"^7",["^ ","^77","^78","^79","priorityLvlUrgent"],536870913]],["^6P",[80,"^4C",1747407249334,536870913]],["^6P",[80,"^6?","deadline",536870913]],["^6P",[80,"^5F","d0007",536870913]],["^6P",[80,"^5:",3,536870913]],["^6P",[80,"^5@","Deadline",536870913]],["^6P",[80,"^33",1747407249334,536870913]],["^6P",[80,"^2R","~u00000002-1685-9016-0400-000000000000",536870913]],["^6P",[80,"^>","^?",536870913]],["^6P",[80,"^;","^1K",536870913]],["^6P",[80,"^=",true,536870913]],["^6P",[80,"^3?",true,536870913]],["^6P",[80,"^G",81,536870913]],["^6P",[80,"^2M",true,536870913]],["^6P",[80,"^42",true,536870913]],["^6P",[80,"^1L","^6Z",536870913]],["^6P",[80,"^<","~:block-below",536870913]],["^6P",[81,"^4C",1747407249334,536870913]],["^6P",[81,"^5F","d0008",536870913]],["^6P",[81,"^5Q",80,536870913]],["^6P",[81,"^5B",80,536870913]],["^6P",[81,"^5@","Use it to finish something at a specific date(time).",536870913]],["^6P",[81,"^33",1747407249334,536870913]],["^6P",[81,"^2R","~u00000004-1356-3664-2200-000000000000",536870913]],["^6P",[81,"^3?",true,536870913]],["^6P",[81,"^3U",33,536870913]],["^6P",[82,"^4C",1747407249334,536870913]],["^6P",[82,"^6?","scheduled",536870913]],["^6P",[82,"^5F","d0009",536870913]],["^6P",[82,"^5:",3,536870913]],["^6P",[82,"^5@","Scheduled",536870913]],["^6P",[82,"^33",1747407249334,536870913]],["^6P",[82,"^2R","~u00000002-1644-5209-4300-000000000000",536870913]],["^6P",[82,"^>","^?",536870913]],["^6P",[82,"^;","^4D",536870913]],["^6P",[82,"^=",true,536870913]],["^6P",[82,"^3?",true,536870913]],["^6P",[82,"^G",83,536870913]],["^6P",[82,"^2M",true,536870913]],["^6P",[82,"^42",true,536870913]],["^6P",[82,"^1L","^6Z",536870913]],["^6P",[82,"^<","^7:",536870913]],["^6P",[83,"^4C",1747407249334,536870913]],["^6P",[83,"^5F","d000A",536870913]],["^6P",[83,"^5Q",82,536870913]],["^6P",[83,"^5B",82,536870913]],["^6P",[83,"^5@","Use it to plan something to start at a specific date(time).",536870913]],["^6P",[83,"^33",1747407249334,536870913]],["^6P",[83,"^2R","~u00000004-9817-6380-0000-000000000000",536870913]],["^6P",[83,"^3?",true,536870913]],["^6P",[83,"^3U",33,536870913]],["^6P",[84,"^4C",1747407249335,536870913]],["^6P",[84,"^6?","repeating recur frequency",536870913]],["^6P",[84,"^5F","d000B",536870913]],["^6P",[84,"^5:",3,536870913]],["^6P",[84,"^5@","Repeating recur frequency",536870913]],["^6P",[84,"^33",1747407249335,536870913]],["^6P",[84,"^2R","~u00000002-8716-1592-2000-000000000000",536870913]],["^6P",[84,"^>","^?",536870913]],["^6P",[84,"^;","^52",536870913]],["^6P",[84,"^=",true,536870913]],["^6P",[84,"^B","^C",536870913]],["^6P",[84,"^3?",true,536870913]],["^6P",[84,"^1Q",85,536870913]],["^6P",[84,"^2M",true,536870913]],["^6P",[84,"^42",false,536870913]],["^6P",[84,"^1L","~:number",536870913]],["^6P",[85,"^4C",1747407249335,536870913]],["^6P",[85,"^5F","d000C",536870913]],["^6P",[85,"^5Q",84,536870913]],["^6P",[85,"^5B",84,536870913]],["^6P",[85,"^33",1747407249335,536870913]],["^6P",[85,"^2R","~u00000004-1654-1034-2600-000000000000",536870913]],["^6P",[85,"^3?",true,536870913]],["^6P",[85,"^3U",84,536870913]],["^6P",[85,"^U",1,536870913]],["^6P",[86,"^4C",1747407249335,536870913]],["^6P",[86,"^6?","repeating recur unit",536870913]],["^6P",[86,"^5F","d000D",536870913]],["^6P",[86,"^5:",3,536870913]],["^6P",[86,"^5@","Repeating recur unit",536870913]],["^6P",[86,"^33",1747407249335,536870913]],["^6P",[86,"^2R","~u00000002-6903-0624-7000-000000000000",536870913]],["^6P",[86,"^>","^?",536870913]],["^6P",[86,"^;","^2G",536870913]],["^6P",[86,"^=",true,536870913]],["^6P",[86,"^B","^C",536870913]],["^6P",[86,"^3?",true,536870913]],["^6P",[86,"^1Q",89,536870913]],["^6P",[86,"^2M",true,536870913]],["^6P",[86,"^42",false,536870913]],["^6P",[86,"^1L","^70",536870913]],["^6P",[87,"^3V",86,536870913]],["^6P",[87,"^4C",1747407249335,536870913]],["^6P",[87,"^5F","d000E",536870913]],["^6P",[87,"^5Q",86,536870913]],["^6P",[87,"^5B",86,536870913]],["^6P",[87,"^5@","Minute",536870913]],["^6P",[87,"^33",1747407249335,536870913]],["^6P",[87,"^2R","~u00000002-1513-6550-8500-000000000000",536870913]],["^6P",[87,"^;","^58",536870913]],["^6P",[87,"^3?",true,536870913]],["^6P",[87,"^3U",86,536870913]],["^6P",[88,"^3V",86,536870913]],["^6P",[88,"^4C",1747407249335,536870913]],["^6P",[88,"^5F","d000F",536870913]],["^6P",[88,"^5Q",86,536870913]],["^6P",[88,"^5B",86,536870913]],["^6P",[88,"^5@","Hour",536870913]],["^6P",[88,"^33",1747407249335,536870913]],["^6P",[88,"^2R","~u00000002-1438-8849-5400-000000000000",536870913]],["^6P",[88,"^;","^5T",536870913]],["^6P",[88,"^3?",true,536870913]],["^6P",[88,"^3U",86,536870913]],["^6P",[89,"^3V",86,536870913]],["^6P",[89,"^4C",1747407249335,536870913]],["^6P",[89,"^5F","d000G",536870913]],["^6P",[89,"^5Q",86,536870913]],["^6P",[89,"^5B",86,536870913]],["^6P",[89,"^5@","Day",536870913]],["^6P",[89,"^33",1747407249335,536870913]],["^6P",[89,"^2R","~u00000002-3924-1785-8000-000000000000",536870913]],["^6P",[89,"^;","^19",536870913]],["^6P",[89,"^3?",true,536870913]],["^6P",[89,"^3U",86,536870913]],["^6P",[90,"^3V",86,536870913]],["^6P",[90,"^4C",1747407249335,536870913]],["^6P",[90,"^5F","d000H",536870913]],["^6P",[90,"^5Q",86,536870913]],["^6P",[90,"^5B",86,536870913]],["^6P",[90,"^5@","Week",536870913]],["^6P",[90,"^33",1747407249335,536870913]],["^6P",[90,"^2R","~u00000002-2130-9244-4900-000000000000",536870913]],["^6P",[90,"^;","^V",536870913]],["^6P",[90,"^3?",true,536870913]],["^6P",[90,"^3U",86,536870913]],["^6P",[91,"^3V",86,536870913]],["^6P",[91,"^4C",1747407249335,536870913]],["^6P",[91,"^5F","d000I",536870913]],["^6P",[91,"^5Q",86,536870913]],["^6P",[91,"^5B",86,536870913]],["^6P",[91,"^5@","Month",536870913]],["^6P",[91,"^33",1747407249335,536870913]],["^6P",[91,"^2R","~u00000002-2073-3937-9700-000000000000",536870913]],["^6P",[91,"^;","^69",536870913]],["^6P",[91,"^3?",true,536870913]],["^6P",[91,"^3U",86,536870913]],["^6P",[92,"^3V",86,536870913]],["^6P",[92,"^4C",1747407249335,536870913]],["^6P",[92,"^5F","d000J",536870913]],["^6P",[92,"^5Q",86,536870913]],["^6P",[92,"^5B",86,536870913]],["^6P",[92,"^5@","Year",536870913]],["^6P",[92,"^33",1747407249335,536870913]],["^6P",[92,"^2R","~u00000002-1520-4385-2400-000000000000",536870913]],["^6P",[92,"^;","^1M",536870913]],["^6P",[92,"^3?",true,536870913]],["^6P",[92,"^3U",86,536870913]],["^6P",[93,"^4C",1747407249335,536870913]],["^6P",[93,"^6?","node repeats?",536870913]],["^6P",[93,"^5F","d000K",536870913]],["^6P",[93,"^5:",3,536870913]],["^6P",[93,"^5@","Node Repeats?",536870913]],["^6P",[93,"^33",1747407249335,536870913]],["^6P",[93,"^2R","~u00000002-1908-1217-8900-000000000000",536870913]],["^6P",[93,"^>","^?",536870913]],["^6P",[93,"^;","^6D",536870913]],["^6P",[93,"^=",true,536870913]],["^6P",[93,"^3?",true,536870913]],["^6P",[93,"^3J",true,536870913]],["^6P",[93,"^1L","^6T",536870913]],["^6P",[94,"^4C",1747407249335,536870913]],["^6P",[94,"^6?","repeating temporal property",536870913]],["^6P",[94,"^5F","d000L",536870913]],["^6P",[94,"^5:",3,536870913]],["^6P",[94,"^5@","Repeating Temporal Property",536870913]],["^6P",[94,"^33",1747407249335,536870913]],["^6P",[94,"^2R","~u00000002-8346-1078-4000-000000000000",536870913]],["^6P",[94,"^>","^?",536870913]],["^6P",[94,"^;","^A",536870913]],["^6P",[94,"^=",true,536870913]],["^6P",[94,"^B","^C",536870913]],["^6P",[94,"^3?",true,536870913]],["^6P",[94,"^3J",true,536870913]],["^6P",[94,"^1L","^72",536870913]],["^6P",[95,"^4C",1747407249335,536870913]],["^6P",[95,"^6?","repeating checked property",536870913]],["^6P",[95,"^5F","d000M",536870913]],["^6P",[95,"^5:",3,536870913]],["^6P",[95,"^5@","Repeating Checked Property",536870913]],["^6P",[95,"^33",1747407249335,536870913]],["^6P",[95,"^2R","~u00000002-1866-3655-5300-000000000000",536870913]],["^6P",[95,"^>","^?",536870913]],["^6P",[95,"^;","^4V",536870913]],["^6P",[95,"^=",true,536870913]],["^6P",[95,"^B","^C",536870913]],["^6P",[95,"^3?",true,536870913]],["^6P",[95,"^3J",true,536870913]],["^6P",[95,"^1L","^72",536870913]],["^6P",[96,"^4C",1747407249335,536870913]],["^6P",[96,"^6?","icon",536870913]],["^6P",[96,"^5F","d000N",536870913]],["^6P",[96,"^5:",3,536870913]],["^6P",[96,"^5@","Icon",536870913]],["^6P",[96,"^33",1747407249335,536870913]],["^6P",[96,"^2R","~u00000002-5891-2328-5000-000000000000",536870913]],["^6P",[96,"^>","^?",536870913]],["^6P",[96,"^;","^7",536870913]],["^6P",[96,"^=",true,536870913]],["^6P",[96,"^3?",true,536870913]],["^6P",[96,"^1L","^75",536870913]],["^6P",[97,"^4C",1747407249335,536870913]],["^6P",[97,"^6?","publishing public?",536870913]],["^6P",[97,"^5F","d000O",536870913]],["^6P",[97,"^5:",3,536870913]],["^6P",[97,"^5@","Publishing Public?",536870913]],["^6P",[97,"^33",1747407249335,536870913]],["^6P",[97,"^2R","~u00000002-1094-6579-3900-000000000000",536870913]],["^6P",[97,"^>","^?",536870913]],["^6P",[97,"^;","^K",536870913]],["^6P",[97,"^=",true,536870913]],["^6P",[97,"^3?",true,536870913]],["^6P",[97,"^3J",true,536870913]],["^6P",[97,"^42",true,536870913]],["^6P",[97,"^1L","^6T",536870913]],["^6P",[97,"^3R","^6W",536870913]],["^6P",[98,"^4C",1747407249335,536870913]],["^6P",[98,"^6?","excluded from graph view?",536870913]],["^6P",[98,"^5F","d000P",536870913]],["^6P",[98,"^5:",3,536870913]],["^6P",[98,"^5@","Excluded from Graph view?",536870913]],["^6P",[98,"^33",1747407249335,536870913]],["^6P",[98,"^2R","~u00000002-4524-3306-5000-000000000000",536870913]],["^6P",[98,"^>","^?",536870913]],["^6P",[98,"^;","^11",536870913]],["^6P",[98,"^=",true,536870913]],["^6P",[98,"^3?",true,536870913]],["^6P",[98,"^3J",true,536870913]],["^6P",[98,"^42",true,536870913]],["^6P",[98,"^1L","^6T",536870913]],["^6P",[98,"^3R","^6W",536870913]],["^6P",[99,"^4C",1747407249335,536870913]],["^6P",[99,"^6?","view type",536870913]],["^6P",[99,"^5F","d000Q",536870913]],["^6P",[99,"^5:",3,536870913]],["^6P",[99,"^5@","View Type",536870913]],["^6P",[99,"^33",1747407249335,536870913]],["^6P",[99,"^2R","~u00000002-2182-3760-7000-000000000000",536870913]],["^6P",[99,"^>","^?",536870913]],["^6P",[99,"^;","^1@",536870913]],["^6P",[99,"^=",true,536870913]],["^6P",[99,"^B","^C",536870913]],["^6P",[99,"^3?",true,536870913]],["^6P",[99,"^1Q",100,536870913]],["^6P",[99,"^3J",true,536870913]],["^6P",[99,"^42",false,536870913]],["^6P",[99,"^1L","^70",536870913]],["^6P",[100,"^3V",99,536870913]],["^6P",[100,"^4C",1747407249335,536870913]],["^6P",[100,"^5F","d000R",536870913]],["^6P",[100,"^5Q",99,536870913]],["^6P",[100,"^5B",99,536870913]],["^6P",[100,"^5@","Table View",536870913]],["^6P",[100,"^33",1747407249335,536870913]],["^6P",[100,"^2R","~u00000002-1942-5424-0000-000000000000",536870913]],["^6P",[100,"^;","^:",536870913]],["^6P",[100,"^3?",true,536870913]],["^6P",[100,"^3U",99,536870913]],["^6P",[100,"^7",["^ ","^77","^78","^79","table"],536870913]],["^6P",[101,"^3V",99,536870913]],["^6P",[101,"^4C",1747407249335,536870913]],["^6P",[101,"^5F","d000S",536870913]],["^6P",[101,"^5Q",99,536870913]],["^6P",[101,"^5B",99,536870913]],["^6P",[101,"^5@","List View",536870913]],["^6P",[101,"^33",1747407249335,536870913]],["^6P",[101,"^2R","~u00000002-1164-8285-0200-000000000000",536870913]],["^6P",[101,"^;","^1U",536870913]],["^6P",[101,"^3?",true,536870913]],["^6P",[101,"^3U",99,536870913]],["^6P",[101,"^7",["^ ","^77","^78","^79","list"],536870913]],["^6P",[102,"^3V",99,536870913]],["^6P",[102,"^4C",1747407249335,536870913]],["^6P",[102,"^5F","d000T",536870913]],["^6P",[102,"^5Q",99,536870913]],["^6P",[102,"^5B",99,536870913]],["^6P",[102,"^5@","Gallery View",536870913]],["^6P",[102,"^33",1747407249335,536870913]],["^6P",[102,"^2R","~u00000002-1506-0511-2000-000000000000",536870913]],["^6P",[102,"^;","^27",536870913]],["^6P",[102,"^3?",true,536870913]],["^6P",[102,"^3U",99,536870913]],["^6P",[102,"^7",["^ ","^77","^78","^79","layout-grid"],536870913]],["^6P",[103,"^4C",1747407249335,536870913]],["^6P",[103,"^6?","view feature type",536870913]],["^6P",[103,"^5F","d000U",536870913]],["^6P",[103,"^5:",3,536870913]],["^6P",[103,"^5@","View Feature Type",536870913]],["^6P",[103,"^33",1747407249335,536870913]],["^6P",[103,"^2R","~u00000002-9391-4187-1000-000000000000",536870913]],["^6P",[103,"^>","^?",536870913]],["^6P",[103,"^;","^2C",536870913]],["^6P",[103,"^=",true,536870913]],["^6P",[103,"^3?",true,536870913]],["^6P",[103,"^3J",true,536870913]],["^6P",[103,"^42",false,536870913]],["^6P",[103,"^1L","^6S",536870913]],["^6P",[104,"^4C",1747407249335,536870913]],["^6P",[104,"^6?","view group by property",536870913]],["^6P",[104,"^5F","d000V",536870913]],["^6P",[104,"^5:",3,536870913]],["^6P",[104,"^5@","View group by property",536870913]],["^6P",[104,"^33",1747407249335,536870913]],["^6P",[104,"^2R","~u00000002-8092-1623-6000-000000000000",536870913]],["^6P",[104,"^>","^?",536870913]],["^6P",[104,"^;","^2Q",536870913]],["^6P",[104,"^=",true,536870913]],["^6P",[104,"^B","^C",536870913]],["^6P",[104,"^3?",true,536870913]],["^6P",[104,"^3J",true,536870913]],["^6P",[104,"^42",false,536870913]],["^6P",[104,"^1L","^72",536870913]],["^6P",[105,"^4C",1747407249335,536870913]],["^6P",[105,"^6?","view sorting",536870913]],["^6P",[105,"^5F","d000W",536870913]],["^6P",[105,"^5:",3,536870913]],["^6P",[105,"^5@","View sorting",536870913]],["^6P",[105,"^33",1747407249335,536870913]],["^6P",[105,"^2R","~u00000002-2081-0259-4000-000000000000",536870913]],["^6P",[105,"^>","^?",536870913]],["^6P",[105,"^;","^16",536870913]],["^6P",[105,"^=",true,536870913]],["^6P",[105,"^3?",true,536870913]],["^6P",[105,"^3J",true,536870913]],["^6P",[105,"^42",false,536870913]],["^6P",[105,"^1L","~:coll",536870913]],["^6P",[106,"^4C",1747407249335,536870913]],["^6P",[106,"^6?","view filters",536870913]],["^6P",[106,"^5F","d000X",536870913]],["^6P",[106,"^5:",3,536870913]],["^6P",[106,"^5@","View filters",536870913]],["^6P",[106,"^33",1747407249335,536870913]],["^6P",[106,"^2R","~u00000002-1702-3936-3300-000000000000",536870913]],["^6P",[106,"^>","^?",536870913]],["^6P",[106,"^;","^3;",536870913]],["^6P",[106,"^=",true,536870913]],["^6P",[106,"^3?",true,536870913]],["^6P",[106,"^3J",true,536870913]],["^6P",[106,"^42",false,536870913]],["^6P",[106,"^1L","^75",536870913]],["^6P",[107,"^4C",1747407249335,536870913]],["^6P",[107,"^6?","view hidden columns",536870913]],["^6P",[107,"^5F","d000Y",536870913]],["^6P",[107,"^5:",3,536870913]],["^6P",[107,"^5@","View hidden columns",536870913]],["^6P",[107,"^33",1747407249335,536870913]],["^6P",[107,"^2R","~u00000002-9750-5719-2000-000000000000",536870913]],["^6P",[107,"^>","^18",536870913]],["^6P",[107,"^;","^2X",536870913]],["^6P",[107,"^=",true,536870913]],["^6P",[107,"^3?",true,536870913]],["^6P",[107,"^3J",true,536870913]],["^6P",[107,"^42",false,536870913]],["^6P",[107,"^1L","^6S",536870913]],["^6P",[108,"^4C",1747407249335,536870913]],["^6P",[108,"^6?","view ordered columns",536870913]],["^6P",[108,"^5F","d000Z",536870913]],["^6P",[108,"^5:",3,536870913]],["^6P",[108,"^5@","View ordered columns",536870913]],["^6P",[108,"^33",1747407249335,536870913]],["^6P",[108,"^2R","~u00000002-1485-5871-0000-000000000000",536870913]],["^6P",[108,"^>","^?",536870913]],["^6P",[108,"^;","^3P",536870913]],["^6P",[108,"^=",true,536870913]],["^6P",[108,"^3?",true,536870913]],["^6P",[108,"^3J",true,536870913]],["^6P",[108,"^42",false,536870913]],["^6P",[108,"^1L","^7<",536870913]],["^6P",[109,"^4C",1747407249335,536870913]],["^6P",[109,"^6?","view columns settings",536870913]],["^6P",[109,"^5F","d000a",536870913]],["^6P",[109,"^5:",3,536870913]],["^6P",[109,"^5@","View columns settings",536870913]],["^6P",[109,"^33",1747407249335,536870913]],["^6P",[109,"^2R","~u00000002-1675-5105-5500-000000000000",536870913]],["^6P",[109,"^>","^?",536870913]],["^6P",[109,"^;","^1Z",536870913]],["^6P",[109,"^=",true,536870913]],["^6P",[109,"^3?",true,536870913]],["^6P",[109,"^3J",true,536870913]],["^6P",[109,"^42",false,536870913]],["^6P",[109,"^1L","^75",536870913]],["^6P",[110,"^4C",1747407249335,536870913]],["^6P",[110,"^6?","table view pinned columns",536870913]],["^6P",[110,"^5F","d000b",536870913]],["^6P",[110,"^5:",3,536870913]],["^6P",[110,"^5@","Table view pinned columns",536870913]],["^6P",[110,"^33",1747407249335,536870913]],["^6P",[110,"^2R","~u00000002-2673-7513-8000-000000000000",536870913]],["^6P",[110,"^>","^18",536870913]],["^6P",[110,"^;","^17",536870913]],["^6P",[110,"^=",true,536870913]],["^6P",[110,"^B","^C",536870913]],["^6P",[110,"^3?",true,536870913]],["^6P",[110,"^3J",true,536870913]],["^6P",[110,"^42",false,536870913]],["^6P",[110,"^1L","^72",536870913]],["^6P",[111,"^4C",1747407249335,536870913]],["^6P",[111,"^6?","this view belongs to",536870913]],["^6P",[111,"^5F","d000c",536870913]],["^6P",[111,"^5:",3,536870913]],["^6P",[111,"^5@","This view belongs to",536870913]],["^6P",[111,"^33",1747407249335,536870913]],["^6P",[111,"^2R","~u00000002-3627-4319-0000-000000000000",536870913]],["^6P",[111,"^>","^?",536870913]],["^6P",[111,"^;","^4A",536870913]],["^6P",[111,"^=",true,536870913]],["^6P",[111,"^B","^C",536870913]],["^6P",[111,"^3?",true,536870913]],["^6P",[111,"^3J",true,536870913]],["^6P",[111,"^42",false,536870913]],["^6P",[111,"^1L","^71",536870913]],["^6P",[112,"^4C",1747407249335,536870913]],["^6P",[112,"^6?","file type",536870913]],["^6P",[112,"^5F","d000d",536870913]],["^6P",[112,"^5:",3,536870913]],["^6P",[112,"^5@","File Type",536870913]],["^6P",[112,"^33",1747407249335,536870913]],["^6P",[112,"^2R","~u00000002-1142-0830-9800-000000000000",536870913]],["^6P",[112,"^>","^?",536870913]],["^6P",[112,"^;","^2;",536870913]],["^6P",[112,"^=",true,536870913]],["^6P",[112,"^3?",true,536870913]],["^6P",[112,"^3J",true,536870913]],["^6P",[112,"^42",false,536870913]],["^6P",[112,"^1L","^6Y",536870913]],["^6P",[113,"^4C",1747407249335,536870913]],["^6P",[113,"^6?","file size",536870913]],["^6P",[113,"^5F","d000e",536870913]],["^6P",[113,"^5:",3,536870913]],["^6P",[113,"^5@","File Size",536870913]],["^6P",[113,"^33",1747407249335,536870913]],["^6P",[113,"^2R","~u00000002-1167-8621-9000-000000000000",536870913]],["^6P",[113,"^>","^?",536870913]],["^6P",[113,"^;","^4T",536870913]],["^6P",[113,"^=",true,536870913]],["^6P",[113,"^3?",true,536870913]],["^6P",[113,"^3J",true,536870913]],["^6P",[113,"^42",false,536870913]],["^6P",[113,"^1L","^74",536870913]],["^6P",[114,"^4C",1747407249335,536870913]],["^6P",[114,"^6?","file checksum",536870913]],["^6P",[114,"^5F","d000f",536870913]],["^6P",[114,"^5:",3,536870913]],["^6P",[114,"^5@","File checksum",536870913]],["^6P",[114,"^33",1747407249335,536870913]],["^6P",[114,"^2R","~u00000002-1011-4169-7900-000000000000",536870913]],["^6P",[114,"^>","^?",536870913]],["^6P",[114,"^;","^3Z",536870913]],["^6P",[114,"^=",true,536870913]],["^6P",[114,"^3?",true,536870913]],["^6P",[114,"^3J",true,536870913]],["^6P",[114,"^42",false,536870913]],["^6P",[114,"^1L","^6Y",536870913]],["^6P",[115,"^4C",1747407249335,536870913]],["^6P",[115,"^6?","last visit page",536870913]],["^6P",[115,"^5F","d000g",536870913]],["^6P",[115,"^5:",3,536870913]],["^6P",[115,"^5@","Last visit page",536870913]],["^6P",[115,"^33",1747407249335,536870913]],["^6P",[115,"^2R","~u00000002-2107-8035-3500-000000000000",536870913]],["^6P",[115,"^>","^?",536870913]],["^6P",[115,"^;","^4F",536870913]],["^6P",[115,"^=",true,536870913]],["^6P",[115,"^3?",true,536870913]],["^6P",[115,"^3J",true,536870913]],["^6P",[115,"^42",false,536870913]],["^6P",[115,"^1L","^74",536870913]],["^6P",[116,"^4C",1747407249335,536870913]],["^6P",[116,"^6?","file remote metadata",536870913]],["^6P",[116,"^5F","d000h",536870913]],["^6P",[116,"^5:",3,536870913]],["^6P",[116,"^5@","File remote metadata",536870913]],["^6P",[116,"^33",1747407249335,536870913]],["^6P",[116,"^2R","~u00000002-9907-5046-9000-000000000000",536870913]],["^6P",[116,"^>","^?",536870913]],["^6P",[116,"^;","^5?",536870913]],["^6P",[116,"^=",true,536870913]],["^6P",[116,"^3?",true,536870913]],["^6P",[116,"^3J",true,536870913]],["^6P",[116,"^42",false,536870913]],["^6P",[116,"^1L","^75",536870913]],["^6P",[117,"^4C",1747407249335,536870913]],["^6P",[117,"^6?","asset resize metadata",536870913]],["^6P",[117,"^5F","d000i",536870913]],["^6P",[117,"^5:",3,536870913]],["^6P",[117,"^5@","Asset resize metadata",536870913]],["^6P",[117,"^33",1747407249335,536870913]],["^6P",[117,"^2R","~u00000002-1297-5230-5500-000000000000",536870913]],["^6P",[117,"^>","^?",536870913]],["^6P",[117,"^;","^4W",536870913]],["^6P",[117,"^=",true,536870913]],["^6P",[117,"^3?",true,536870913]],["^6P",[117,"^3J",true,536870913]],["^6P",[117,"^42",false,536870913]],["^6P",[117,"^1L","^75",536870913]],["^6P",[118,"^4C",1747407249335,536870913]],["^6P",[118,"^6?","due",536870913]],["^6P",[118,"^5F","d000j",536870913]],["^6P",[118,"^5:",3,536870913]],["^6P",[118,"^5@","Due",536870913]],["^6P",[118,"^33",1747407249335,536870913]],["^6P",[118,"^2R","~u00000002-1089-0805-4900-000000000000",536870913]],["^6P",[118,"^>","^?",536870913]],["^6P",[118,"^;","^5J",536870913]],["^6P",[118,"^=",true,536870913]],["^6P",[118,"^3?",true,536870913]],["^6P",[118,"^3J",false,536870913]],["^6P",[118,"^42",false,536870913]],["^6P",[118,"^1L","^6Z",536870913]],["^6P",[119,"^4C",1747407249336,536870913]],["^6P",[119,"^6?","state",536870913]],["^6P",[119,"^5F","d000k",536870913]],["^6P",[119,"^5:",3,536870913]],["^6P",[119,"^5@","State",536870913]],["^6P",[119,"^33",1747407249336,536870913]],["^6P",[119,"^2R","~u00000002-1165-1650-8700-000000000000",536870913]],["^6P",[119,"^>","^?",536870913]],["^6P",[119,"^;","^Q",536870913]],["^6P",[119,"^=",true,536870913]],["^6P",[119,"^3?",true,536870913]],["^6P",[119,"^3J",false,536870913]],["^6P",[119,"^42",false,536870913]],["^6P",[119,"^1L","^75",536870913]],["^6P",[120,"^4C",1747407249336,536870913]],["^6P",[120,"^6?","user name",536870913]],["^6P",[120,"^5F","d000l",536870913]],["^6P",[120,"^5:",3,536870913]],["^6P",[120,"^5@","User Name",536870913]],["^6P",[120,"^33",1747407249336,536870913]],["^6P",[120,"^2R","~u00000002-1360-0260-1600-000000000000",536870913]],["^6P",[120,"^>","^?",536870913]],["^6P",[120,"^;","^D",536870913]],["^6P",[120,"^=",true,536870913]],["^6P",[120,"^3?",true,536870913]],["^6P",[120,"^3J",false,536870913]],["^6P",[120,"^42",true,536870913]],["^6P",[120,"^1L","^6Y",536870913]],["^6P",[121,"^4C",1747407249336,536870913]],["^6P",[121,"^6?","user email",536870913]],["^6P",[121,"^5F","d000m",536870913]],["^6P",[121,"^5:",3,536870913]],["^6P",[121,"^5@","User Email",536870913]],["^6P",[121,"^33",1747407249336,536870913]],["^6P",[121,"^2R","~u00000002-1655-2060-6300-000000000000",536870913]],["^6P",[121,"^>","^?",536870913]],["^6P",[121,"^;","^4X",536870913]],["^6P",[121,"^=",true,536870913]],["^6P",[121,"^3?",true,536870913]],["^6P",[121,"^3J",false,536870913]],["^6P",[121,"^42",true,536870913]],["^6P",[121,"^1L","^6Y",536870913]],["^6P",[122,"^4C",1747407249336,536870913]],["^6P",[122,"^6?","user avatar",536870913]],["^6P",[122,"^5F","d000n",536870913]],["^6P",[122,"^5:",3,536870913]],["^6P",[122,"^5@","User Avatar",536870913]],["^6P",[122,"^33",1747407249336,536870913]],["^6P",[122,"^2R","~u00000002-4165-4885-8000-000000000000",536870913]],["^6P",[122,"^>","^?",536870913]],["^6P",[122,"^;","^21",536870913]],["^6P",[122,"^=",true,536870913]],["^6P",[122,"^3?",true,536870913]],["^6P",[122,"^3J",false,536870913]],["^6P",[122,"^42",true,536870913]],["^6P",[122,"^1L","^6Y",536870913]],["^6P",[123,"^4C",1747407249336,536870913]],["^6P",[123,"^6?","enable property history",536870913]],["^6P",[123,"^5F","d000o",536870913]],["^6P",[123,"^5:",3,536870913]],["^6P",[123,"^5@","Enable property history",536870913]],["^6P",[123,"^33",1747407249336,536870913]],["^6P",[123,"^2R","~u00000002-8058-5960-2000-000000000000",536870913]],["^6P",[123,"^>","^?",536870913]],["^6P",[123,"^;","^4:",536870913]],["^6P",[123,"^=",true,536870913]],["^6P",[123,"^3?",true,536870913]],["^6P",[123,"^G",124,536870913]],["^6P",[123,"^42",true,536870913]],["^6P",[123,"^1L","^6T",536870913]],["^6P",[123,"^3R","^72",536870913]],["^6P",[124,"^4C",1747407249336,536870913]],["^6P",[124,"^5F","d000p",536870913]],["^6P",[124,"^5Q",123,536870913]],["^6P",[124,"^5B",123,536870913]],["^6P",[124,"^5@","Records history anytime a property's value changes on a node.",536870913]],["^6P",[124,"^33",1747407249336,536870913]],["^6P",[124,"^2R","~u00000004-1438-1481-0000-000000000000",536870913]],["^6P",[124,"^3?",true,536870913]],["^6P",[124,"^3U",33,536870913]],["^6P",[125,"^4C",1747407249336,536870913]],["^6P",[125,"^6?","history block",536870913]],["^6P",[125,"^5F","d000q",536870913]],["^6P",[125,"^5:",3,536870913]],["^6P",[125,"^5@","History block",536870913]],["^6P",[125,"^33",1747407249336,536870913]],["^6P",[125,"^2R","~u00000002-1142-5541-6000-000000000000",536870913]],["^6P",[125,"^>","^?",536870913]],["^6P",[125,"^;","^5V",536870913]],["^6P",[125,"^=",true,536870913]],["^6P",[125,"^B","^C",536870913]],["^6P",[125,"^3?",true,536870913]],["^6P",[125,"^3J",true,536870913]],["^6P",[125,"^1L","^6U",536870913]],["^6P",[126,"^4C",1747407249336,536870913]],["^6P",[126,"^6?","history property",536870913]],["^6P",[126,"^5F","d000r",536870913]],["^6P",[126,"^5:",3,536870913]],["^6P",[126,"^5@","History property",536870913]],["^6P",[126,"^33",1747407249336,536870913]],["^6P",[126,"^2R","~u00000002-1600-4090-8200-000000000000",536870913]],["^6P",[126,"^>","^?",536870913]],["^6P",[126,"^;","^64",536870913]],["^6P",[126,"^=",true,536870913]],["^6P",[126,"^B","^C",536870913]],["^6P",[126,"^3?",true,536870913]],["^6P",[126,"^3J",true,536870913]],["^6P",[126,"^1L","^72",536870913]],["^6P",[127,"^4C",1747407249336,536870913]],["^6P",[127,"^6?","history value",536870913]],["^6P",[127,"^5F","d000s",536870913]],["^6P",[127,"^5:",3,536870913]],["^6P",[127,"^5@","History value",536870913]],["^6P",[127,"^33",1747407249336,536870913]],["^6P",[127,"^2R","~u00000002-5131-3603-7000-000000000000",536870913]],["^6P",[127,"^>","^?",536870913]],["^6P",[127,"^;","^6;",536870913]],["^6P",[127,"^=",true,536870913]],["^6P",[127,"^B","^C",536870913]],["^6P",[127,"^3?",true,536870913]],["^6P",[127,"^3J",true,536870913]],["^6P",[127,"^1L","^6U",536870913]],["^6P",[128,"^4C",1747407249336,536870913]],["^6P",[128,"^6?","history scalar value",536870913]],["^6P",[128,"^5F","d000t",536870913]],["^6P",[128,"^5:",3,536870913]],["^6P",[128,"^5@","History scalar value",536870913]],["^6P",[128,"^33",1747407249336,536870913]],["^6P",[128,"^2R","~u00000002-2393-3777-5000-000000000000",536870913]],["^6P",[128,"^>","^?",536870913]],["^6P",[128,"^;","^9",536870913]],["^6P",[128,"^=",true,536870913]],["^6P",[128,"^3?",true,536870913]],["^6P",[128,"^3J",true,536870913]],["^6P",[128,"^1L","^6V",536870913]],["^6P",[129,"^4C",1747407249336,536870913]],["^6P",[129,"^6?","node created by(deprecated)",536870913]],["^6P",[129,"^5F","d000u",536870913]],["^6P",[129,"^5:",3,536870913]],["^6P",[129,"^5@","Node created by(deprecated)",536870913]],["^6P",[129,"^33",1747407249336,536870913]],["^6P",[129,"^2R","~u00000002-1367-2955-9500-000000000000",536870913]],["^6P",[129,"^>","^?",536870913]],["^6P",[129,"^;","^N",536870913]],["^6P",[129,"^=",true,536870913]],["^6P",[129,"^3?",true,536870913]],["^6P",[129,"^3J",true,536870913]],["^6P",[129,"^1L","^6Y",536870913]],["^6P",[130,"^4C",1747407249336,536870913]],["^6P",[130,"^6?","node created by",536870913]],["^6P",[130,"^5F","d000v",536870913]],["^6P",[130,"^5:",3,536870913]],["^6P",[130,"^5@","Node created by",536870913]],["^6P",[130,"^33",1747407249336,536870913]],["^6P",[130,"^2R","~u00000002-8544-3390-8000-000000000000",536870913]],["^6P",[130,"^>","^?",536870913]],["^6P",[130,"^;","^13",536870913]],["^6P",[130,"^=",true,536870913]],["^6P",[130,"^B","^C",536870913]],["^6P",[130,"^3?",true,536870913]],["^6P",[130,"^3J",true,536870913]],["^6P",[130,"^1L","^6U",536870913]],["^6P",[131,"^4C",1747407249336,536870913]],["^6P",[131,"^6?","used template",536870913]],["^6P",[131,"^5F","d000w",536870913]],["^6P",[131,"^5:",3,536870913]],["^6P",[131,"^5@","Used template",536870913]],["^6P",[131,"^33",1747407249336,536870913]],["^6P",[131,"^2R","~u00000002-9803-6990-6000-000000000000",536870913]],["^6P",[131,"^>","^?",536870913]],["^6P",[131,"^;","^1B",536870913]],["^6P",[131,"^=",true,536870913]],["^6P",[131,"^B","^C",536870913]],["^6P",[131,"^3?",true,536870913]],["^6P",[131,"^4P",4,536870913]],["^6P",[131,"^3J",true,536870913]],["^6P",[131,"^42",false,536870913]],["^6P",[131,"^1L","^71",536870913]],["^6P",[132,"^4C",1747407249336,536870913]],["^6P",[132,"^6?","apply template to tags",536870913]],["^6P",[132,"^5F","d000x",536870913]],["^6P",[132,"^5:",3,536870913]],["^6P",[132,"^5@","Apply template to tags",536870913]],["^6P",[132,"^33",1747407249336,536870913]],["^6P",[132,"^2R","~u00000002-4291-2432-2000-000000000000",536870913]],["^6P",[132,"^>","^18",536870913]],["^6P",[132,"^;","^1J",536870913]],["^6P",[132,"^=",true,536870913]],["^6P",[132,"^B","^C",536870913]],["^6P",[132,"^3?",true,536870913]],["^6P",[132,"^42",true,536870913]],["^6P",[132,"^1L","^6X",536870913]],["^6P",[133,"^4C",1747407249336,536870913]],["^6P",[133,"^6?","page",536870913]],["^6P",[133,"^5:",2,536870913]],["^6P",[133,"^5@","Page",536870913]],["^6P",[133,"^33",1747407249336,536870913]],["^6P",[133,"^2R","~u00000002-1484-3403-2900-000000000000",536870913]],["^6P",[133,"^;","^1W",536870913]],["^6P",[133,"^3?",true,536870913]],["^6P",[133,"^1<",1,536870913]],["^6P",[134,"^4C",1747407249336,536870913]],["^6P",[134,"^6?","journal",536870913]],["^6P",[134,"^5:",2,536870913]],["^6P",[134,"^5@","Journal",536870913]],["^6P",[134,"^33",1747407249336,536870913]],["^6P",[134,"^2R","~u00000002-1979-7410-8100-000000000000",536870913]],["^6P",[134,"^;","^29",536870913]],["^6P",[134,"^3?",true,536870913]],["^6P",[134,"^1<",133,536870913]],["^6P",[134,"^I","MMM do, yyyy",536870913]],["^6P",[135,"^4C",1747407249336,536870913]],["^6P",[135,"^6?","whiteboard",536870913]],["^6P",[135,"^5:",2,536870913]],["^6P",[135,"^5@","Whiteboard",536870913]],["^6P",[135,"^33",1747407249336,536870913]],["^6P",[135,"^2R","~u00000002-1013-6984-5200-000000000000",536870913]],["^6P",[135,"^;","^2E",536870913]],["^6P",[135,"^3?",true,536870913]],["^6P",[135,"^1<",133,536870913]],["^6P",[136,"^4C",1747407249336,536870913]],["^6P",[136,"^6?","task",536870913]],["^6P",[136,"^5:",2,536870913]],["^6P",[136,"^5@","Task",536870913]],["^6P",[136,"^33",1747407249336,536870913]],["^6P",[136,"^2R","~u00000002-1282-1814-5700-000000000000",536870913]],["^6P",[136,"^;","^2V",536870913]],["^6P",[136,"^3?",true,536870913]],["^6P",[136,"^1<",1,536870913]],["^6P",[136,"^2?",68,536870913]],["^6P",[136,"^2?",75,536870913]],["^6P",[136,"^2?",80,536870913]],["^6P",[136,"^2?",82,536870913]],["^6P",[137,"^4C",1747407249336,536870913]],["^6P",[137,"^6?","query",536870913]],["^6P",[137,"^5:",2,536870913]],["^6P",[137,"^5@","Query",536870913]],["^6P",[137,"^33",1747407249336,536870913]],["^6P",[137,"^2R","~u00000002-2324-8016-6000-000000000000",536870913]],["^6P",[137,"^;","^32",536870913]],["^6P",[137,"^3?",true,536870913]],["^6P",[137,"^7",["^ ","^77","^78","^79","search"],536870913]],["^6P",[137,"^1<",1,536870913]],["^6P",[137,"^2?",43,536870913]],["^6P",[138,"^4C",1747407249336,536870913]],["^6P",[138,"^6?","card",536870913]],["^6P",[138,"^5:",2,536870913]],["^6P",[138,"^5@","Card",536870913]],["^6P",[138,"^33",1747407249336,536870913]],["^6P",[138,"^2R","~u00000002-1358-2811-0900-000000000000",536870913]],["^6P",[138,"^;","^3=",536870913]],["^6P",[138,"^3?",true,536870913]],["^6P",[138,"^1<",1,536870913]],["^6P",[138,"^2?",118,536870913]],["^6P",[138,"^2?",119,536870913]],["^6P",[139,"^4C",1747407249336,536870913]],["^6P",[139,"^6?","cards",536870913]],["^6P",[139,"^5:",2,536870913]],["^6P",[139,"^5@","Cards",536870913]],["^6P",[139,"^33",1747407249336,536870913]],["^6P",[139,"^2R","~u00000002-1284-2651-6700-000000000000",536870913]],["^6P",[139,"^;","^3G",536870913]],["^6P",[139,"^3?",true,536870913]],["^6P",[139,"^7",["^ ","^77","^78","^79","search"],536870913]],["^6P",[139,"^1<",137,536870913]],["^6P",[140,"^4C",1747407249336,536870913]],["^6P",[140,"^6?","asset",536870913]],["^6P",[140,"^5:",2,536870913]],["^6P",[140,"^5@","Asset",536870913]],["^6P",[140,"^33",1747407249336,536870913]],["^6P",[140,"^2R","~u00000002-7975-0297-0000-000000000000",536870913]],["^6P",[140,"^;","^2<",536870913]],["^6P",[140,"^3?",true,536870913]],["^6P",[140,"^1<",1,536870913]],["^6P",[140,"^37",true,536870913]],["^6P",[140,"^2?",112,536870913]],["^6P",[140,"^2?",113,536870913]],["^6P",[140,"^2?",114,536870913]],["^6P",[140,"^1@",102,536870913]],["^6P",[141,"^4C",1747407249336,536870913]],["^6P",[141,"^6?","code",536870913]],["^6P",[141,"^5:",2,536870913]],["^6P",[141,"^5@","Code",536870913]],["^6P",[141,"^33",1747407249336,536870913]],["^6P",[141,"^2R","~u00000002-1454-9866-4100-000000000000",536870913]],["^6P",[141,"^;","^40",536870913]],["^6P",[141,"^3?",true,536870913]],["^6P",[141,"^1<",1,536870913]],["^6P",[141,"^37",true,536870913]],["^6P",[141,"^2?",32,536870913]],["^6P",[141,"^2?",34,536870913]],["^6P",[142,"^4C",1747407249336,536870913]],["^6P",[142,"^6?","quote",536870913]],["^6P",[142,"^5:",2,536870913]],["^6P",[142,"^5@","Quote",536870913]],["^6P",[142,"^33",1747407249336,536870913]],["^6P",[142,"^2R","~u00000002-1176-1666-1700-000000000000",536870913]],["^6P",[142,"^;","^2I",536870913]],["^6P",[142,"^3?",true,536870913]],["^6P",[142,"^1<",1,536870913]],["^6P",[142,"^37",true,536870913]],["^6P",[142,"^2?",32,536870913]],["^6P",[143,"^4C",1747407249336,536870913]],["^6P",[143,"^6?","math",536870913]],["^6P",[143,"^5:",2,536870913]],["^6P",[143,"^5@","Math",536870913]],["^6P",[143,"^33",1747407249336,536870913]],["^6P",[143,"^2R","~u00000002-2038-9631-2100-000000000000",536870913]],["^6P",[143,"^;","^4?",536870913]],["^6P",[143,"^3?",true,536870913]],["^6P",[143,"^1<",1,536870913]],["^6P",[143,"^37",true,536870913]],["^6P",[143,"^2?",32,536870913]],["^6P",[144,"^4C",1747407249336,536870913]],["^6P",[144,"^6?","pdf annotation",536870913]],["^6P",[144,"^5:",2,536870913]],["^6P",[144,"^5@","PDF Annotation",536870913]],["^6P",[144,"^33",1747407249336,536870913]],["^6P",[144,"^2R","~u00000002-5049-5962-0000-000000000000",536870913]],["^6P",[144,"^;","^4N",536870913]],["^6P",[144,"^3?",true,536870913]],["^6P",[144,"^1<",1,536870913]],["^6P",[144,"^37",true,536870913]],["^6P",[144,"^2?",48,536870913]],["^6P",[144,"^2?",49,536870913]],["^6P",[144,"^2?",50,536870913]],["^6P",[144,"^2?",51,536870913]],["^6P",[144,"^2?",57,536870913]],["^6P",[144,"^2?",58,536870913]],["^6P",[144,"^2?",59,536870913]],["^6P",[145,"^2R","~u00000004-3919-3813-3000-000000000000",536870913]],["^6P",[145,"^1N","{:meta/version 1\n ;; Hide empty block properties\n ;; This is _only_ for DB graphs.\n ;; Default value: false\n ;; :ui/hide-empty-properties? false\n\n ;; Enable tooltip preview on hover.\n ;; Default value: true\n :ui/enable-tooltip? true\n\n ;; Display brackets [[]] around page references.\n ;; Default value: true\n ;; :ui/show-brackets? true\n\n ;; Display all lines of a block when referencing ((block)).\n ;; Default value: false\n :ui/show-full-blocks? false\n\n ;; Automatically expand block references when zooming in.\n ;; Default value: true\n :ui/auto-expand-block-refs? true\n\n ;; Disable accent marks when searching.\n ;; After changing this setting, rebuild the search index by pressing (^C ^S).\n ;; Default value: true\n :feature/enable-search-remove-accents? true\n\n ;; Enable journals.\n ;; Default value: true\n ;; :feature/enable-journals? true\n\n ;; Enable flashcards.\n ;; Default value: true\n ;; :feature/enable-flashcards? true\n\n ;; Enable whiteboards.\n ;; Default value: true\n ;; :feature/enable-whiteboards? true\n\n ;; Disable the journal's built-in 'Scheduled tasks and deadlines' query.\n ;; Default value: false\n ;; :feature/disable-scheduled-and-deadline-query? false\n\n ;; Specify the number of days displayed in the future for\n ;; the 'scheduled tasks and deadlines' query.\n ;; Example usage:\n ;; Display all scheduled and deadline blocks for the next 14 days:\n ;; :scheduled/future-days 14\n ;; Default value: 7\n ;; :scheduled/future-days 7\n\n ;; Specify the first day of the week.\n ;; Available options:\n ;; - integer from 0 to 6 (Monday to Sunday)\n ;; Default value: 6 (Sunday)\n :start-of-week 6\n\n ;; Specify a custom CSS import.\n ;; This option takes precedence over the local `logseq/custom.css` file.\n ;; Example usage:\n ;; :custom-css-url \"@import url('https://cdn.jsdelivr.net/gh/dracula/logseq@master/custom.css');\"\n\n ;; Specify a custom JS import.\n ;; This option takes precedence over the local `logseq/custom.js` file.\n ;; Example usage:\n ;; :custom-js-url \"https://cdn.logseq.com/custom.js\"\n\n ;; Set bullet indentation when exporting\n ;; Available options:\n ;; - `:eight-spaces` as eight spaces\n ;; - `:four-spaces` as four spaces\n ;; - `:two-spaces` as two spaces\n ;; - `:tab` as a tab character (default)\n ;; :export/bullet-indentation :tab\n\n ;; Publish all pages within the Graph\n ;; Regardless of whether individual pages have been marked as public.\n ;; Default value: false\n ;; :publishing/all-pages-public? false\n\n ;; Define the default home page and sidebar status.\n ;; If unspecified, the journal page will be loaded on startup and the right sidebar will stay hidden.\n ;; The `:page` value represents the name of the page displayed at startup.\n ;; Available options for `:sidebar` are:\n ;; - \"Contents\" to display the Contents page in the right sidebar.\n ;; - A specific page name to display in the right sidebar.\n ;; - An array of multiple pages, e.g., [\"Contents\" \"Page A\" \"Page B\"].\n ;; If `:sidebar` remains unset, the right sidebar will stay hidden.\n ;; Examples:\n ;; 1. Set \"Changelog\" as the home page and display \"Contents\" in the right sidebar:\n ;; :default-home {:page \"Changelog\", :sidebar \"Contents\"}\n ;; 2. Set \"Jun 3rd, 2021\" as the home page without the right sidebar:\n ;; :default-home {:page \"Jun 3rd, 2021\"}\n ;; 3. Set \"home\" as the home page and display multiple pages in the right sidebar:\n ;; :default-home {:page \"home\", :sidebar [\"Page A\" \"Page B\"]}\n\n ;; Configure custom shortcuts.\n ;; Syntax:\n ;; 1. + indicates simultaneous key presses, e.g., `Ctrl+Shift+a`.\n ;; 2. A space between keys represents key chords, e.g., `t s` means\n ;; pressing `t` followed by `s`.\n ;; 3. mod refers to `Ctrl` for Windows/Linux and `Command` for Mac.\n ;; 4. Use false to disable a specific shortcut.\n ;; 5. You can define multiple bindings for a single action, e.g., [\"ctrl+j\" \"down\"].\n ;; The full list of configurable shortcuts is available at:\n ;; https://github.com/logseq/logseq/blob/master/src/main/frontend/modules/shortcut/config.cljs\n ;; Example:\n ;; :shortcuts\n ;; {:editor/new-block \"enter\"\n ;; :editor/new-line \"shift+enter\"\n ;; :editor/insert-link \"mod+shift+k\"\n ;; :editor/highlight false\n ;; :ui/toggle-settings \"t s\"\n ;; :editor/up [\"ctrl+k\" \"up\"]\n ;; :editor/down [\"ctrl+j\" \"down\"]\n ;; :editor/left [\"ctrl+h\" \"left\"]\n ;; :editor/right [\"ctrl+l\" \"right\"]}\n :shortcuts {}\n\n ;; Configure the behavior of pressing Enter in document mode.\n ;; if set to true, pressing Enter will create a new block.\n ;; Default value: false\n :shortcut/doc-mode-enter-for-new-block? false\n\n ;; Block content larger than `block/title-max-length` will not be searchable\n ;; or editable for performance.\n ;; Default value: 10000\n :block/title-max-length 10000\n\n ;; Display command documentation on hover.\n ;; Default value: true\n :ui/show-command-doc? true\n\n ;; Display empty bullet points.\n ;; Default value: false\n :ui/show-empty-bullets? false\n\n ;; Pre-defined :view function to use with advanced queries.\n :query/views\n {:pprint\n (fn [r] [:pre.code (pprint r)])}\n\n ;; Advanced queries `:result-transform` function.\n ;; Transform the query result before displaying it.\n ;; Example usage for DB graphs:\n;; :query/result-transforms\n;; {:sort-by-priority\n;; (fn [result] (sort-by (fn [h] (get h :logseq.property/priority \"Z\")) result))}\n\n;; Queries will be displayed at the bottom of today's journal page.\n;; Example usage:\n;; :default-queries\n;; {:journals []}\n\n ;; Add custom commands to the command palette\n ;; Example usage:\n ;; :commands\n ;; [\n ;; [\"js\" \"Javascript\"]\n ;; [\"md\" \"Markdown\"]\n ;; ]\n :commands []\n\n ;; Enable collapsing blocks with titles but no children.\n ;; By default, only blocks with children can be collapsed.\n ;; Setting `:outliner/block-title-collapse-enabled?` to true allows collapsing\n ;; blocks with titles (multiple lines) and content. For example:\n ;; - block title\n ;; block content\n ;; Default value: false\n :outliner/block-title-collapse-enabled? false\n\n ;; Macros replace texts and will make you more productive.\n ;; Example usage:\n ;; Change the :macros value below to:\n ;; {\"poem\" \"Rose is $1, violet's $2. Life's ordered: Org assists you.\"}\n ;; input \"{{poem red,blue}}\"\n ;; becomes\n ;; Rose is red, violet's blue. Life's ordered: Org assists you.\n :macros {}\n\n ;; Configure the default expansion level for linked references.\n ;; For example, consider the following block hierarchy:\n ;; - a [[page]] (level 1)\n ;; - b (level 2)\n ;; - c (level 3)\n ;; - d (level 4)\n ;;\n ;; With the default value of level 2, block b will be collapsed.\n ;; If the level's value is set to 3, block c will be collapsed.\n ;; Default value: 2\n :ref/default-open-blocks-level 2\n\n ;; Configure the threshold for linked references before collapsing.\n ;; Default value: 100\n :ref/linked-references-collapsed-threshold 50\n\n ;; Graph view configuration.\n ;; Example usage:\n ;; :graph/settings\n ;; {:orphan-pages? true ; Default value: true\n ;; :builtin-pages? false ; Default value: false\n ;; :excluded-pages? false ; Default value: false\n ;; :journal? false} ; Default value: false\n\n ;; Graph view configuration.\n ;; Example usage:\n ;; :graph/forcesettings\n ;; {:link-dist 180 ; Default value: 180\n ;; :charge-strength -600 ; Default value: -600\n ;; :charge-range 600} ; Default value: 600\n\n ;; Mobile photo upload configuration.\n ;; :mobile/photo\n ;; {:allow-editing? true\n ;; :quality 80}\n\n ;; Mobile features options\n ;; Gestures\n ;; Example usage:\n ;; :mobile\n ;; {:gestures/disabled-in-block-with-tags [\"kanban\"]}\n\n ;; Extra CodeMirror options\n ;; See https://codemirror.net/5/doc/manual.html#config for possible options\n ;; Example usage:\n ;; :editor/extra-codemirror-options\n ;; {:lineWrapping false ; Default value: false\n ;; :lineNumbers true ; Default value: true\n ;; :readOnly false} ; Default value: false\n\n ;; Enable logical outdenting\n ;; Default value: false\n ;; :editor/logical-outdenting? false\n\n ;; Prefer pasting the file when text and a file are in the clipboard.\n ;; Default value: false\n ;; :editor/preferred-pasting-file? false\n\n ;; Quick capture templates for receiving content from other apps.\n ;; Each template contains three elements {time}, {text} and {url}, which can be auto-expanded\n ;; by receiving content from other apps. Note: the {} cannot be omitted.\n ;; - {time}: capture time\n ;; - {date}: capture date using current date format, use `[[{date}]]` to get a page reference\n ;; - {text}: text that users selected before sharing.\n ;; - {url}: URL or assets path for media files stored in Logseq.\n ;; You can also reorder them or use only one or two of them in the template.\n ;; You can also insert or format any text in the template, as shown in the following examples.\n ;; :quick-capture-templates\n ;; {:text \"[[quick capture]] **{time}**: {text} from {url}\"\n ;; :media \"[[quick capture]] **{time}**: {url}\"}\n\n ;; Quick capture options.\n ;; - insert-today? Insert the capture at the end of today's journal page (boolean).\n ;; - redirect-page? Redirect to the quick capture page after capturing (boolean).\n ;; - default-page The default page to capture to if insert-today? is false (string).\n ;; :quick-capture-options\n ;; {:insert-today? false ;; Default value: true\n ;; :redirect-page? false ;; Default value: false\n ;; :default-page \"quick capture\"} ;; Default page: \"quick capture\"\n\n ;; Configure the Enter key behavior for\n ;; context-aware editing with DWIM (Do What I Mean).\n ;; context-aware Enter key behavior implies that pressing Enter will\n ;; have different outcomes based on the context.\n ;; For instance, pressing Enter within a list generates a new list item,\n ;; whereas pressing Enter in a block reference opens the referenced block.\n ;; :dwim/settings\n ;; {:admonition&src? true ;; Default value: true\n ;; :markup? false ;; Default value: false\n ;; :block-ref? true ;; Default value: true\n ;; :page-ref? true ;; Default value: true\n ;; :properties? true ;; Default value: true\n ;; :list? false} ;; Default value: false\n }",536870913]],["^6P",[145,"^@","~m1747407249331",536870913]],["^6P",[145,"^43","~m1747407249331",536870913]],["^6P",[145,"^6@","logseq/config.edn",536870913]],["^6P",[146,"^2R","~u00000004-1713-4660-3800-000000000000",536870913]],["^6P",[146,"^1N","",536870913]],["^6P",[146,"^@","~m1747407249331",536870913]],["^6P",[146,"^43","~m1747407249331",536870913]],["^6P",[146,"^6@","logseq/custom.css",536870913]],["^6P",[147,"^2R","~u00000004-1335-6485-2300-000000000000",536870913]],["^6P",[147,"^1N","",536870913]],["^6P",[147,"^@","~m1747407249331",536870913]],["^6P",[147,"^43","~m1747407249331",536870913]],["^6P",[147,"^6@","logseq/custom.js",536870913]],["^6P",[148,"^4C",1747407249337,536870913]],["^6P",[148,"^6?","contents",536870913]],["^6P",[148,"^5:",133,536870913]],["^6P",[148,"^5@","Contents",536870913]],["^6P",[148,"^33",1747407249337,536870913]],["^6P",[148,"^2R","~u00000004-1690-2597-3200-000000000000",536870913]],["^6P",[148,"^3?",true,536870913]],["^6P",[149,"^4C",1747407249336,536870913]],["^6P",[149,"^6?","$$$views",536870913]],["^6P",[149,"^5:",133,536870913]],["^6P",[149,"^5@","$$$views",536870913]],["^6P",[149,"^T",536870978,536870979]],["^6P",[149,"^33",1747407249336,536870913]],["^6P",[149,"^2R","~u00000004-1906-3437-5800-000000000000",536870913]],["^6P",[149,"^3?",true,536870913]],["^6P",[149,"^3J",true,536870913]],["^6P",[150,"^4C",1747407249336,536870913]],["^6P",[150,"^6?","$$$favorites",536870913]],["^6P",[150,"^5:",133,536870913]],["^6P",[150,"^5@","$$$favorites",536870913]],["^6P",[150,"^33",1747407249336,536870913]],["^6P",[150,"^2R","~u00000004-1018-5888-4100-000000000000",536870913]],["^6P",[150,"^3?",true,536870913]],["^6P",[150,"^3J",true,536870913]],["^6P",[151,"^4C",1747407249597,536870914]],["^6P",[151,"^53",20250516,536870914]],["^6P",[151,"^6?","may 16th, 2025",536870914]],["^6P",[151,"^5W",20,536870918]],["^6P",[151,"^5W",134,536870918]],["^6P",[151,"^5W",153,536870918]],["^6P",[151,"^3H",20,536870917]],["^6P",[151,"^3H",134,536870917]],["^6P",[151,"^3H",153,536870917]],["^6P",[151,"^5:",134,536870914]],["^6P",[151,"^5@","May 16th, 2025",536870914]],["^6P",[151,"^T",536870917,536870918]],["^6P",[151,"^33",1747407249597,536870914]],["^6P",[151,"^2R","~u00000001-2025-0516-0000-000000000000",536870914]],["^6P",[151,"^13",153,536870916]],["^6P",[152,"^4C",1747407249597,536870914]],["^6P",[152,"^5F","a0",536870914]],["^6P",[152,"^5Q",151,536870914]],["^6P",[152,"^5B",151,536870914]],["^6P",[152,"^5W",151,536870918]],["^6P",[152,"^5W",153,536870918]],["^6P",[152,"^3H",153,536870917]],["^6P",[152,"^5@","",536870914]],["^6P",[152,"^T",536870917,536870918]],["^6P",[152,"^33",1747407249597,536870914]],["^6P",[152,"^2R","~u68275191-57ca-44af-9e86-2fa286a7b6d4",536870914]],["^6P",[152,"^13",153,536870916]],["^6P",[153,"^4C",1747407249603,536870916]],["^6P",[153,"^6?","tienson",536870916]],["^6P",[153,"^5W",20,536870918]],["^6P",[153,"^5W",120,536870918]],["^6P",[153,"^5W",121,536870918]],["^6P",[153,"^5W",133,536870918]],["^6P",[153,"^3H",20,536870917]],["^6P",[153,"^3H",120,536870917]],["^6P",[153,"^3H",121,536870917]],["^6P",[153,"^3H",133,536870917]],["^6P",[153,"^5:",133,536870916]],["^6P",[153,"^5@","tienson",536870916]],["^6P",[153,"^T",536870917,536870918]],["^6P",[153,"^33",1747407249603,536870916]],["^6P",[153,"^2R","~u59f30f2c-6dc9-4a53-927b-ea405814c9e9",536870916]],["^6P",[153,"^4X","tiensonqin@gmail.com",536870916]],["^6P",[153,"^D","tienson",536870916]],["^6P",[154,"^4C",1747407263357,536870921]],["^6P",[154,"^6?","foo",536870921]],["^6P",[154,"^5W",20,536870925]],["^6P",[154,"^5W",133,536870925]],["^6P",[154,"^5W",153,536870925]],["^6P",[154,"^3H",20,536870924]],["^6P",[154,"^3H",133,536870924]],["^6P",[154,"^3H",153,536870924]],["^6P",[154,"^5:",133,536870921]],["^6P",[154,"^5@","foo",536870921]],["^6P",[154,"^T",536870924,536870925]],["^6P",[154,"^33",1747407263357,536870921]],["^6P",[154,"^2R","~u6827519f-683a-4984-b05b-2689a4fd20d9",536870921]],["^6P",[154,"^13",153,536870923]],["^6P",[155,"^4C",1747407263360,536870921]],["^6P",[155,"^6?","bar",536870921]],["^6P",[155,"^5W",20,536870925]],["^6P",[155,"^5W",35,536870925]],["^6P",[155,"^5W",133,536870925]],["^6P",[155,"^5W",153,536870925]],["^6P",[155,"^5W",154,536870925]],["^6P",[155,"^3H",20,536870924]],["^6P",[155,"^3H",35,536870924]],["^6P",[155,"^3H",133,536870924]],["^6P",[155,"^3H",153,536870924]],["^6P",[155,"^3H",154,536870924]],["^6P",[155,"^5:",133,536870921]],["^6P",[155,"^5@","bar",536870921]],["^6P",[155,"^T",536870924,536870925]],["^6P",[155,"^33",1747407263360,536870921]],["^6P",[155,"^2R","~u6827519f-d7a2-4569-9375-fe175d2e489b",536870921]],["^6P",[155,"^13",153,536870923]],["^6P",[155,"^1<",154,536870921]],["^6P",[156,"^4C",1747407263361,536870921]],["^6P",[156,"^6?","baz",536870921]],["^6P",[156,"^5W",20,536870925]],["^6P",[156,"^5W",35,536870925]],["^6P",[156,"^5W",133,536870925]],["^6P",[156,"^5W",153,536870925]],["^6P",[156,"^5W",155,536870925]],["^6P",[156,"^3H",20,536870924]],["^6P",[156,"^3H",35,536870924]],["^6P",[156,"^3H",133,536870924]],["^6P",[156,"^3H",153,536870924]],["^6P",[156,"^3H",155,536870924]],["^6P",[156,"^5:",133,536870921]],["^6P",[156,"^5@","baz",536870921]],["^6P",[156,"^T",536870924,536870925]],["^6P",[156,"^33",1747407263361,536870921]],["^6P",[156,"^2R","~u6827519f-a791-4937-9b93-614e6add2d0d",536870921]],["^6P",[156,"^13",153,536870923]],["^6P",[156,"^1<",155,536870921]],["^6P",[157,"^4C",1747407263361,536870921]],["^6P",[157,"^5F","a0",536870921]],["^6P",[157,"^5Q",156,536870921]],["^6P",[157,"^5B",156,536870921]],["^6P",[157,"^5W",153,536870925]],["^6P",[157,"^5W",156,536870925]],["^6P",[157,"^3H",153,536870924]],["^6P",[157,"^5@","",536870921]],["^6P",[157,"^T",536870924,536870925]],["^6P",[157,"^33",1747407263361,536870921]],["^6P",[157,"^2R","~u6827519f-0e67-496f-a65f-7ea487d4d99e",536870921]],["^6P",[157,"^13",153,536870923]],["^6P",[158,"^4C",1747407268977,536870926]],["^6P",[158,"^6?","baz2",536870926]],["^6P",[158,"^5W",20,536870930]],["^6P",[158,"^5W",35,536870930]],["^6P",[158,"^5W",133,536870930]],["^6P",[158,"^5W",153,536870930]],["^6P",[158,"^5W",155,536870930]],["^6P",[158,"^3H",20,536870929]],["^6P",[158,"^3H",35,536870929]],["^6P",[158,"^3H",133,536870929]],["^6P",[158,"^3H",153,536870929]],["^6P",[158,"^3H",155,536870929]],["^6P",[158,"^5:",133,536870926]],["^6P",[158,"^5@","baz2",536870926]],["^6P",[158,"^T",536870929,536870930]],["^6P",[158,"^33",1747407268977,536870926]],["^6P",[158,"^2R","~u682751a4-a79b-476f-b0e2-0c5e276a545a",536870926]],["^6P",[158,"^13",153,536870928]],["^6P",[158,"^1<",155,536870926]],["^6P",[159,"^4C",1747407268977,536870926]],["^6P",[159,"^5F","a0",536870926]],["^6P",[159,"^5Q",158,536870926]],["^6P",[159,"^5B",158,536870926]],["^6P",[159,"^5W",153,536870930]],["^6P",[159,"^5W",158,536870930]],["^6P",[159,"^3H",153,536870929]],["^6P",[159,"^5@","",536870926]],["^6P",[159,"^T",536870929,536870930]],["^6P",[159,"^33",1747407268977,536870926]],["^6P",[159,"^2R","~u682751a4-cb46-4a6e-a869-530eabd44fa6",536870926]],["^6P",[159,"^13",153,536870928]],["^6P",[160,"^4C",1747407272155,536870931]],["^6P",[160,"^5F","a0",536870931]],["^6P",[160,"^5Q",149,536870931]],["^6P",[160,"^5B",149,536870931]],["^6P",[160,"^5W",24,536870939]],["^6P",[160,"^5W",149,536870939]],["^6P",[160,"^5W",153,536870939]],["^6P",[160,"^5W",154,536870939]],["^6P",[160,"^3H",24,536870938]],["^6P",[160,"^3H",153,536870938]],["^6P",[160,"^3H",154,536870938]],["^6P",[160,"^5@","Linked references",536870931]],["^6P",[160,"^T",536870938,536870939]],["^6P",[160,"^33",1747407272164,536870935]],["^6P",[160,"^2R","~u682751a8-4854-464c-94f2-0d4fcdcb2c37",536870931]],["^6P",[160,"^13",153,536870937]],["^6P",[160,"^4A",154,536870932]],["^6P",[160,"^2C","~:linked-references",536870933]],["^6P",[160,"^2Q",24,536870935]],["^6P",[160,"^1@",101,536870934]],["^6P",[161,"^4C",1747407284707,536870940]],["^6P",[161,"^6?","c1",536870940]],["^6P",[161,"^5W",1,536870944]],["^6P",[161,"^5W",2,536870944]],["^6P",[161,"^5W",20,536870944]],["^6P",[161,"^5W",35,536870944]],["^6P",[161,"^5W",153,536870944]],["^6P",[161,"^3H",1,536870943]],["^6P",[161,"^3H",2,536870943]],["^6P",[161,"^3H",20,536870943]],["^6P",[161,"^3H",35,536870943]],["^6P",[161,"^3H",153,536870943]],["^6P",[161,"^5:",2,536870940]],["^6P",[161,"^5@","c1",536870940]],["^6P",[161,"^T",536870943,536870944]],["^6P",[161,"^33",1747407284710,536870940]],["^6P",[161,"^2R","~u682751b4-c13d-4e2d-9bf1-f98ff2222cc1",536870940]],["^6P",[161,"^;","^P",536870940]],["^6P",[161,"^13",153,536870942]],["^6P",[161,"^1<",1,536870940]],["^6P",[162,"^4C",1747407284708,536870940]],["^6P",[162,"^6?","c2",536870940]],["^6P",[162,"^5W",2,536870944]],["^6P",[162,"^5W",20,536870944]],["^6P",[162,"^5W",35,536870944]],["^6P",[162,"^5W",153,536870944]],["^6P",[162,"^5W",161,536870944]],["^6P",[162,"^3H",2,536870943]],["^6P",[162,"^3H",20,536870943]],["^6P",[162,"^3H",35,536870943]],["^6P",[162,"^3H",153,536870943]],["^6P",[162,"^3H",161,536870943]],["^6P",[162,"^5:",2,536870940]],["^6P",[162,"^5@","c2",536870940]],["^6P",[162,"^T",536870943,536870944]],["^6P",[162,"^33",1747407284710,536870940]],["^6P",[162,"^2R","~u682751b4-645a-4eab-9acf-e2f7b8696fa9",536870940]],["^6P",[162,"^;","^15",536870940]],["^6P",[162,"^13",153,536870942]],["^6P",[162,"^1<",161,536870940]],["^6P",[163,"^4C",1747407284710,536870940]],["^6P",[163,"^6?","c3",536870940]],["^6P",[163,"^5W",2,536870944]],["^6P",[163,"^5W",20,536870944]],["^6P",[163,"^5W",35,536870944]],["^6P",[163,"^5W",153,536870944]],["^6P",[163,"^5W",162,536870944]],["^6P",[163,"^3H",2,536870943]],["^6P",[163,"^3H",20,536870943]],["^6P",[163,"^3H",35,536870943]],["^6P",[163,"^3H",153,536870943]],["^6P",[163,"^3H",162,536870943]],["^6P",[163,"^5:",2,536870940]],["^6P",[163,"^5@","c3",536870940]],["^6P",[163,"^T",536870943,536870944]],["^6P",[163,"^33",1747407284710,536870940]],["^6P",[163,"^2R","~u682751b4-1d01-4da5-95f5-38512503e352",536870940]],["^6P",[163,"^;","^1D",536870940]],["^6P",[163,"^13",153,536870942]],["^6P",[163,"^1<",162,536870940]],["^6P",[164,"^4C",1747407285103,536870945]],["^6P",[164,"^5F","a1",536870945]],["^6P",[164,"^5Q",149,536870945]],["^6P",[164,"^5B",149,536870945]],["^6P",[164,"^5W",149,536870951]],["^6P",[164,"^5W",153,536870951]],["^6P",[164,"^5W",163,536870951]],["^6P",[164,"^3H",153,536870950]],["^6P",[164,"^3H",163,536870950]],["^6P",[164,"^5@","All",536870945]],["^6P",[164,"^T",536870950,536870951]],["^6P",[164,"^33",1747407285106,536870947]],["^6P",[164,"^2R","~u682751b5-90ca-4d49-b10e-5ff16891b4ca",536870945]],["^6P",[164,"^13",153,536870949]],["^6P",[164,"^4A",163,536870946]],["^6P",[164,"^2C","~:class-objects",536870947]],["^6P",[165,"^4C",1747407295104,536870952]],["^6P",[165,"^6?","c4",536870952]],["^6P",[165,"^5W",2,536870956]],["^6P",[165,"^5W",20,536870956]],["^6P",[165,"^5W",35,536870956]],["^6P",[165,"^5W",153,536870956]],["^6P",[165,"^5W",162,536870956]],["^6P",[165,"^3H",2,536870955]],["^6P",[165,"^3H",20,536870955]],["^6P",[165,"^3H",35,536870955]],["^6P",[165,"^3H",153,536870955]],["^6P",[165,"^3H",162,536870955]],["^6P",[165,"^5:",2,536870952]],["^6P",[165,"^5@","c4",536870952]],["^6P",[165,"^T",536870955,536870956]],["^6P",[165,"^33",1747407295104,536870952]],["^6P",[165,"^2R","~u682751bf-e47c-449f-b0eb-1aedda4760a5",536870952]],["^6P",[165,"^;","^1Y",536870952]],["^6P",[165,"^13",153,536870954]],["^6P",[165,"^1<",162,536870952]],["^6P",[166,"^4C",1747407295481,536870957]],["^6P",[166,"^5F","a2",536870957]],["^6P",[166,"^5Q",149,536870957]],["^6P",[166,"^5B",149,536870957]],["^6P",[166,"^5W",149,536870963]],["^6P",[166,"^5W",153,536870963]],["^6P",[166,"^5W",165,536870963]],["^6P",[166,"^3H",153,536870962]],["^6P",[166,"^3H",165,536870962]],["^6P",[166,"^5@","All",536870957]],["^6P",[166,"^T",536870962,536870963]],["^6P",[166,"^33",1747407295483,536870959]],["^6P",[166,"^2R","~u682751bf-0471-47c1-ad81-88c888db956e",536870957]],["^6P",[166,"^13",153,536870961]],["^6P",[166,"^4A",165,536870958]],["^6P",[166,"^2C","^7>",536870959]],["^6P",[167,"^4C",1747407300408,536870964]],["^6P",[167,"^5F","a3",536870964]],["^6P",[167,"^5Q",149,536870964]],["^6P",[167,"^5B",149,536870964]],["^6P",[167,"^5W",149,536870970]],["^6P",[167,"^5W",153,536870970]],["^6P",[167,"^5W",161,536870970]],["^6P",[167,"^3H",153,536870969]],["^6P",[167,"^3H",161,536870969]],["^6P",[167,"^5@","All",536870964]],["^6P",[167,"^T",536870969,536870970]],["^6P",[167,"^33",1747407300415,536870966]],["^6P",[167,"^2R","~u682751c4-1d6d-4f1b-8eae-adeb8a59036f",536870964]],["^6P",[167,"^13",153,536870968]],["^6P",[167,"^4A",161,536870965]],["^6P",[167,"^2C","^7>",536870966]],["^6P",[168,"^4C",1747407300448,536870971]],["^6P",[168,"^5F","a4",536870971]],["^6P",[168,"^5Q",149,536870971]],["^6P",[168,"^5B",149,536870971]],["^6P",[168,"^5W",24,536870979]],["^6P",[168,"^5W",149,536870979]],["^6P",[168,"^5W",153,536870979]],["^6P",[168,"^5W",161,536870979]],["^6P",[168,"^3H",24,536870978]],["^6P",[168,"^3H",153,536870978]],["^6P",[168,"^3H",161,536870978]],["^6P",[168,"^5@","Linked references",536870971]],["^6P",[168,"^T",536870978,536870979]],["^6P",[168,"^33",1747407300453,536870975]],["^6P",[168,"^2R","~u682751c4-e2ae-431b-8368-7135f3f926d4",536870971]],["^6P",[168,"^13",153,536870977]],["^6P",[168,"^4A",161,536870972]],["^6P",[168,"^2C","^7=",536870973]],["^6P",[168,"^2Q",24,536870975]],["^6P",[168,"^1@",101,536870974]]]]]] \ No newline at end of file From c0e3a5f81cb72f73229daecdc42334491822719f Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 16 May 2025 23:34:14 +0800 Subject: [PATCH 20/67] fix: lint --- deps/db/src/logseq/db/sqlite/create_graph.cljs | 2 +- deps/db/test/logseq/db_test.cljs | 2 +- deps/graph-parser/src/logseq/graph_parser/block.cljs | 10 ---------- src/main/frontend/worker/db/migrate.cljs | 2 +- .../frontend/worker/handler/page/db_based/page.cljs | 12 +++++++++++- src/test/frontend/worker/migrate_test.cljs | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/deps/db/src/logseq/db/sqlite/create_graph.cljs b/deps/db/src/logseq/db/sqlite/create_graph.cljs index 6d4d78861b..a633f74afd 100644 --- a/deps/db/src/logseq/db/sqlite/create_graph.cljs +++ b/deps/db/src/logseq/db/sqlite/create_graph.cljs @@ -128,7 +128,7 @@ :properties (filter entity-util/property? properties-tx)})) (def built-in-pages-names - #{"Library"}) + #{"Library" "Contents"}) (defn- validate-tx-for-duplicate-idents [tx] (when-let [conflicting-idents diff --git a/deps/db/test/logseq/db_test.cljs b/deps/db/test/logseq/db_test.cljs index f6d22c1f09..1d01d5a6ad 100644 --- a/deps/db/test/logseq/db_test.cljs +++ b/deps/db/test/logseq/db_test.cljs @@ -48,7 +48,7 @@ (let [conn (db-test/create-conn)] (d/transact! conn class-parents-data) (is (= #{"x" "y"} - (->> (ldb/get-class-parents (ldb/get-page @conn "z") {:node-class? true}) + (->> (ldb/get-class-extends (ldb/get-page @conn "z") {:node-class? true}) (map :block/title) set))))) diff --git a/deps/graph-parser/src/logseq/graph_parser/block.cljs b/deps/graph-parser/src/logseq/graph_parser/block.cljs index af8ca72dea..19ec659e52 100644 --- a/deps/graph-parser/src/logseq/graph_parser/block.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/block.cljs @@ -364,16 +364,6 @@ [s] (string/replace s "#" "HashTag-")) -(defn page-with-parent-and-order - "Apply to namespace pages" - [db page & {:keys [parent]}] - (let [library (ldb/get-built-in-page db "Library")] - (when (nil? library) - (throw (ex-info "Library page doesn't exist" {}))) - (assoc page - :block/parent (or parent (:db/id library)) - :block/order (db-order/gen-key)))) - ;; TODO: refactor (defn page-name->map "Create a page's map structure given a original page name (string). diff --git a/src/main/frontend/worker/db/migrate.cljs b/src/main/frontend/worker/db/migrate.cljs index e0e1185357..2225c09ae2 100644 --- a/src/main/frontend/worker/db/migrate.cljs +++ b/src/main/frontend/worker/db/migrate.cljs @@ -859,7 +859,7 @@ :logseq.task/scheduled :logseq.property/scheduled}) conn)) -(defn- fix-rename-parent-to-extends +(defn fix-rename-parent-to-extends [conn _search-db] (let [db @conn parent-entity (d/entity db :logseq.property/parent)] diff --git a/src/main/frontend/worker/handler/page/db_based/page.cljs b/src/main/frontend/worker/handler/page/db_based/page.cljs index 515306ffdf..536dc35757 100644 --- a/src/main/frontend/worker/handler/page/db_based/page.cljs +++ b/src/main/frontend/worker/handler/page/db_based/page.cljs @@ -102,6 +102,16 @@ first (d/entity db))) +(defn- page-with-parent-and-order + "Apply to namespace pages" + [db page & {:keys [parent]}] + (let [library (ldb/get-built-in-page db "Library")] + (when (nil? library) + (throw (ex-info "Library page doesn't exist" {}))) + (assoc page + :block/parent (or parent (:db/id library)) + :block/order (db-order/gen-key)))) + (defn- split-namespace-pages [db page date-formatter create-class?] (let [{:block/keys [title] block-uuid :block/uuid} page] @@ -160,7 +170,7 @@ (db-class/build-new-class db (assoc page :logseq.property.class/extends parent-eid))) (if (de/entity? page) page - (gp-block/page-with-parent-and-order db page {:parent parent-eid}))))) + (page-with-parent-and-order db page {:parent parent-eid}))))) pages))) [page]) (remove nil?)))) diff --git a/src/test/frontend/worker/migrate_test.cljs b/src/test/frontend/worker/migrate_test.cljs index 4ab1f314d5..1be457359d 100644 --- a/src/test/frontend/worker/migrate_test.cljs +++ b/src/test/frontend/worker/migrate_test.cljs @@ -5,7 +5,7 @@ [frontend.worker.db.migrate :as db-migrate] [logseq.db :as ldb])) -(deftest ^:focus test-fix-rename-parent-to-extends +(deftest test-fix-rename-parent-to-extends (testing "Rename parent to extends" (let [db-transit (str (fs-node/readFileSync "src/test/migration/64.8.transit")) db (ldb/read-transit-str db-transit) From 92d8e9ea73486bd439312916d2edc0c68c6b4bd2 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 16 May 2025 23:48:32 +0800 Subject: [PATCH 21/67] fix: db export test --- deps/db/test/logseq/db/sqlite/export_test.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/deps/db/test/logseq/db/sqlite/export_test.cljs b/deps/db/test/logseq/db/sqlite/export_test.cljs index 2255b6c955..567dd9fba4 100644 --- a/deps/db/test/logseq/db/sqlite/export_test.cljs +++ b/deps/db/test/logseq/db/sqlite/export_test.cljs @@ -695,6 +695,8 @@ {:page {:block/uuid property-uuid} :blocks [{:block/title "property block1"}]} ;; built-in pages + {:page {:block/title "Library" :build/properties {:logseq.property/built-in? true}} + :blocks []} {:page {:block/title "Contents" :build/properties {:logseq.property/built-in? true}} :blocks [{:block/title "right sidebar"}]} {:page {:block/title common-config/favorites-page-name @@ -887,4 +889,4 @@ (testing "With ::existing-pages-keep-properties?, existing properties on existing pages are not overwritten by imported data" (test-import-existing-page {:existing-pages-keep-properties? true} {:logseq.property/description "first description" - :logseq.property/exclude-from-graph-view true}))) \ No newline at end of file + :logseq.property/exclude-from-graph-view true}))) From 8411a1e91b8a6c0550e043cc3ab66054071fbfe7 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Fri, 16 May 2025 23:56:59 +0800 Subject: [PATCH 22/67] fix: db query tests --- deps/db/src/logseq/db/frontend/rules.cljc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deps/db/src/logseq/db/frontend/rules.cljc b/deps/db/src/logseq/db/frontend/rules.cljc index d70b2d8aaa..e4cd561567 100644 --- a/deps/db/src/logseq/db/frontend/rules.cljc +++ b/deps/db/src/logseq/db/frontend/rules.cljc @@ -143,7 +143,7 @@ [?b :block/tags ?tc] (or [(= ?t ?tc)] - (parent ?t ?tc))] + (class-extends ?t ?tc))] :has-property-or-object-property '[(has-property-or-object-property? ?b ?prop) @@ -243,7 +243,7 @@ :priority #{:simple-query-property} :property-missing-value #{:object-has-class-property} :has-property-or-object-property #{:object-has-class-property} - :object-has-class-property #{:parent} + :object-has-class-property #{:class-extends} :has-simple-query-property #{:has-property-or-object-property} :has-private-simple-query-property #{:has-property-or-object-property} :property-default-value #{:existing-property-value :property-missing-value} From cb3183637db9121e43cc686e634195bf29d91610 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 17 May 2025 00:05:25 +0800 Subject: [PATCH 23/67] fix: db tests --- deps/db/test/logseq/db/frontend/rules_test.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/db/test/logseq/db/frontend/rules_test.cljs b/deps/db/test/logseq/db/frontend/rules_test.cljs index 0f0cf76b5c..a6b760001d 100644 --- a/deps/db/test/logseq/db/frontend/rules_test.cljs +++ b/deps/db/test/logseq/db/frontend/rules_test.cljs @@ -12,7 +12,7 @@ (deftest get-full-deps (let [default-value-deps #{:property-default-value :property-missing-value :existing-property-value - :object-has-class-property :parent} + :object-has-class-property :class-extends} property-value-deps (conj default-value-deps :property-value :property-scalar-default-value) property-deps (conj property-value-deps :simple-query-property) task-deps (conj property-deps :task) From 337db306c8f41e073ec2a8c45c4eeee8eca6e450 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 17 May 2025 01:07:08 +0800 Subject: [PATCH 24/67] fix: tests --- src/test/frontend/worker/migrate_test.cljs | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/test/frontend/worker/migrate_test.cljs b/src/test/frontend/worker/migrate_test.cljs index 1be457359d..4a05222e93 100644 --- a/src/test/frontend/worker/migrate_test.cljs +++ b/src/test/frontend/worker/migrate_test.cljs @@ -13,8 +13,12 @@ tx-data (db-migrate/fix-rename-parent-to-extends conn nil)] (is (= (->> tx-data (map (fn [data] - (if (and (map? data) (:block/created-at data)) + (cond + (and (map? data) (:block/created-at data)) (dissoc data :block/created-at :block/updated-at) + (and (map? data) (:block/order data)) + (dissoc data :block/order) + :else data)))) [{:db/id 35, :db/ident :logseq.property.class/extends, @@ -72,7 +76,14 @@ {:db/id 154, :block/parent [:block/uuid #uuid "00000004-1294-7765-6000-000000000000"], - :block/order "a6"} - {:db/id 155, :block/order "a7"} - {:db/id 156, :block/order "a8"} - {:db/id 158, :block/order "a9"}]))))) + ;; :block/order "a6" + } + {:db/id 155, + ;; :block/order "a7" + } + {:db/id 156, + ;; :block/order "a8" + } + {:db/id 158, + ;; :block/order "a9" + }]))))) From 9fc54c7dbf8dda9bb95117210841fb6abdbdf04f Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 17 May 2025 01:57:54 +0800 Subject: [PATCH 25/67] fix: exporter --- deps/db/test/logseq/db_test.cljs | 2 +- .../src/logseq/graph_parser/exporter.cljs | 27 ++++++++++--------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/deps/db/test/logseq/db_test.cljs b/deps/db/test/logseq/db_test.cljs index 1d01d5a6ad..cae32b3f4e 100644 --- a/deps/db/test/logseq/db_test.cljs +++ b/deps/db/test/logseq/db_test.cljs @@ -44,7 +44,7 @@ :block/uuid #uuid "d95f2912-a7af-41b9-8ed5-28861f7fc0be" :logseq.property.class/extends [:block/uuid #uuid "7008db08-ba0c-4aa9-afc6-7e4783e40a99"]}]) -(deftest get-page-parents +(deftest get-class-extends (let [conn (db-test/create-conn)] (d/transact! conn class-parents-data) (is (= #{"x" "y"} diff --git a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs index 76433e2e96..67938f015b 100644 --- a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs @@ -60,10 +60,10 @@ (merge ex-data' {:page-name page-name :page-names (sort (keys @page-names-to-uuids))}))))) -(defn- replace-namespace-with-parent [block page-names-to-uuids] +(defn- replace-namespace-with-parent [block page-names-to-uuids parent-k] (if (:block/namespace block) (-> (dissoc block :block/namespace) - (assoc :logseq.property.class/extends + (assoc parent-k {:block/uuid (get-page-uuid page-names-to-uuids (get-in block [:block/namespace :block/name]) {:block block :block/namespace (:block/namespace block)})})) @@ -172,7 +172,7 @@ (dissoc :block/created-at :block/updated-at) (merge (add-missing-timestamps (select-keys tag-block [:block/created-at :block/updated-at]))) - (replace-namespace-with-parent page-names-to-uuids))] + (replace-namespace-with-parent page-names-to-uuids :logseq.property.class/extends))] (when (:new-class? (meta class-m)) (swap! classes-tx conj class-m')) (assert (:block/uuid class-m') "Class must have a :block/uuid") [:block/uuid (:block/uuid class-m')])))))) @@ -736,7 +736,7 @@ (update :block dissoc :block/properties :block/properties-text-values :block/properties-order :block/invalid-properties))) (defn- handle-page-properties - "Adds page properties including special handling for :logseq.property.class/extends" + "Adds page properties including special handling for :block/parent" [{:block/keys [properties] :as block*} db {:keys [page-names-to-uuids classes-tx]} refs {:keys [user-options log-fn import-state] :as options}] (let [{:keys [block properties-tx]} (handle-page-and-block-properties block* db page-names-to-uuids refs options) @@ -749,7 +749,8 @@ class-m (find-or-create-class db ((some-fn ::original-title :block/title) block) (:all-idents import-state) block) class-m' (-> block (merge class-m) - (assoc :logseq.property.class/extends + (dissoc :block/namespace) + (assoc :logseq.class.property/extends (let [new-class (first parent-classes-from-properties) class-m (find-or-create-class db new-class (:all-idents import-state)) class-m' (merge class-m @@ -759,9 +760,8 @@ (when (:new-class? (meta class-m)) (swap! classes-tx conj class-m')) [:block/uuid (:block/uuid class-m')])))] class-m') - block) - block'' (replace-namespace-with-parent block' page-names-to-uuids)] - {:block block'' :properties-tx properties-tx})) + (replace-namespace-with-parent block page-names-to-uuids :block/parent))] + {:block block' :properties-tx properties-tx})) (defn- pretty-print-dissoc "Remove list of keys from a given map string while preserving whitespace" @@ -937,10 +937,11 @@ "Like ldb/get-page-parents but using all-existing-page-uuids" [node all-existing-page-uuids] (let [get-parent (fn get-parent [n] - (when (:block/uuid (:logseq.property.class/extends n)) - (or (get all-existing-page-uuids (:block/uuid (:logseq.property.class/extends n))) - (throw (ex-info (str "No parent page found for " (pr-str (:block/uuid (:logseq.property.class/extends n)))) - {:node n})))))] + (let [parent (or (:logseq.property.class/extends n) (:block/parent n))] + (when-let [parent-id (:block/uuid parent)] + (or (get all-existing-page-uuids parent-id) + (throw (ex-info (str "No parent page found for " (pr-str (:block/uuid parent))) + {:node n}))))))] (when-let [parent (get-parent node)] (loop [current-parent parent parents' []] @@ -975,7 +976,7 @@ (let [;; These attributes are not allowed to be transacted because they must not change across files disallowed-attributes [:block/name :block/uuid :block/format :block/title :block/journal-day :block/created-at :block/updated-at] - allowed-attributes (into [:block/tags :block/alias :logseq.property.class/extends :db/ident] + allowed-attributes (into [:block/tags :block/alias :block/parent :logseq.class.property/extends :db/ident] (keep #(when (db-malli-schema/user-property? (key %)) (key %)) m)) block-changes (select-keys m allowed-attributes)] From 7dbb3eb3bd6be6b9e8fc15fb1bab40288788b165 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 17 May 2025 02:49:42 +0800 Subject: [PATCH 26/67] wip: fix graph-parser tests --- deps/db/src/logseq/db/frontend/malli_schema.cljs | 3 ++- deps/graph-parser/src/logseq/graph_parser/block.cljs | 3 +-- .../graph-parser/test/logseq/graph_parser/exporter_test.cljs | 5 +++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/deps/db/src/logseq/db/frontend/malli_schema.cljs b/deps/db/src/logseq/db/frontend/malli_schema.cljs index a1251cd174..d419020561 100644 --- a/deps/db/src/logseq/db/frontend/malli_schema.cljs +++ b/deps/db/src/logseq/db/frontend/malli_schema.cljs @@ -287,7 +287,8 @@ (vec (concat [:map - [:db/ident class-ident]] + [:db/ident class-ident] + [:logseq.property.class/extends {:optional true} :int]] page-attrs page-or-block-attrs))) diff --git a/deps/graph-parser/src/logseq/graph_parser/block.cljs b/deps/graph-parser/src/logseq/graph_parser/block.cljs index 19ec659e52..d7a6ccad8d 100644 --- a/deps/graph-parser/src/logseq/graph_parser/block.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/block.cljs @@ -411,8 +411,7 @@ (defn- ref->map [db *col {:keys [date-formatter db-based? *name->id tag?]}] - (let [db-based? (or (and db (ldb/db-based-graph? db)) db-based?) - col (remove string/blank? @*col) + (let [col (remove string/blank? @*col) children-pages (when-not db-based? (->> (mapcat (fn [p] (let [p (if (map? p) diff --git a/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs b/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs index 31463b6b51..60218d75a8 100644 --- a/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs +++ b/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs @@ -326,7 +326,7 @@ (:block/alias (db-test/readable-properties (db-test/find-page-by-title @conn "chat-gpt")))) "alias set correctly") (is (= ["y"] - (->> (d/q '[:find [?b ...] :where [?b :block/title "y"] [?b :logseq.property.class/extends]] + (->> (d/q '[:find [?b ...] :where [?b :block/title "y"] [?b :block/parent]] @conn) first (d/entity @conn) @@ -396,7 +396,8 @@ [{:parent (:block/title parent) :child (:block/title ent)}]))] (is (= [{:parent "n1" :child "x"} {:parent "x" :child "z"} - {:parent "x" :child "y"}] + {:parent "x" :child "y"} + {:parent "y", :child "some content"}] (rest (expand-children (db-test/find-page-by-title @conn "n1") nil))) "First namespace tests duplicate parent page name") (is (= [{:parent "n2" :child "x"} From eb61c1bf7b799c9c6b1434973d233dffb3b5f274 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 17 May 2025 05:35:30 +0800 Subject: [PATCH 27/67] fix: graph-parser tests :block/parent needs to be retracted for classes and properties. --- .../src/logseq/graph_parser/exporter.cljs | 49 +++++++++++++------ 1 file changed, 33 insertions(+), 16 deletions(-) diff --git a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs index 67938f015b..dd9f120bd0 100644 --- a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs @@ -60,14 +60,22 @@ (merge ex-data' {:page-name page-name :page-names (sort (keys @page-names-to-uuids))}))))) +(defn- block-db-tag? + [block] + (and (set? (:block/tags block)) + (contains? (:block/tags block) :logseq.class/Tag))) + (defn- replace-namespace-with-parent [block page-names-to-uuids parent-k] - (if (:block/namespace block) - (-> (dissoc block :block/namespace) - (assoc parent-k - {:block/uuid (get-page-uuid page-names-to-uuids - (get-in block [:block/namespace :block/name]) - {:block block :block/namespace (:block/namespace block)})})) - block)) + (let [parent-k' (if (block-db-tag? block) + :logseq.property.class/extends + parent-k)] + (if (:block/namespace block) + (-> (dissoc block :block/namespace) + (assoc parent-k' + {:block/uuid (get-page-uuid page-names-to-uuids + (get-in block [:block/namespace :block/name]) + {:block block :block/namespace (:block/namespace block)})})) + block))) (defn- build-class-ident-name [class-name] @@ -736,7 +744,7 @@ (update :block dissoc :block/properties :block/properties-text-values :block/properties-order :block/invalid-properties))) (defn- handle-page-properties - "Adds page properties including special handling for :block/parent" + "Adds page properties including special handling for :logseq.property.class/extends or :block/parent" [{:block/keys [properties] :as block*} db {:keys [page-names-to-uuids classes-tx]} refs {:keys [user-options log-fn import-state] :as options}] (let [{:keys [block properties-tx]} (handle-page-and-block-properties block* db page-names-to-uuids refs options) @@ -750,7 +758,7 @@ class-m' (-> block (merge class-m) (dissoc :block/namespace) - (assoc :logseq.class.property/extends + (assoc :logseq.property.class/extends (let [new-class (first parent-classes-from-properties) class-m (find-or-create-class db new-class (:all-idents import-state)) class-m' (merge class-m @@ -976,7 +984,7 @@ (let [;; These attributes are not allowed to be transacted because they must not change across files disallowed-attributes [:block/name :block/uuid :block/format :block/title :block/journal-day :block/created-at :block/updated-at] - allowed-attributes (into [:block/tags :block/alias :block/parent :logseq.class.property/extends :db/ident] + allowed-attributes (into [:block/tags :block/alias :block/parent :logseq.property.class/extends :db/ident] (keep #(when (db-malli-schema/user-property? (key %)) (key %)) m)) block-changes (select-keys m allowed-attributes)] @@ -1176,6 +1184,15 @@ (set (map (comp keyword string/lower-case) (:property-parent-classes user-options))) file-built-in-property-names)})})) +(defn- retract-parent-and-page-tag + [col] + (vec + (mapcat (fn [b] + (let [eid [:block/uuid (:block/uuid b)]] + [[:db/retract eid :block/parent] + [:db/retract eid :block/tags :logseq.class/Page]])) + col))) + (defn- split-pages-and-properties-tx "Separates new pages from new properties tx in preparation for properties to be transacted separately. Also builds property pages tx and converts existing @@ -1204,8 +1221,7 @@ {:block/uuid existing-page-uuid}))) (set/intersection new-properties (set (map keyword (keys existing-pages))))) ;; Could do this only for existing pages but the added complexity isn't worth reducing the tx noise - retract-page-tag-from-properties-tx (map #(vector :db/retract [:block/uuid (:block/uuid %)] :block/tags :logseq.class/Page) - (concat property-pages-tx converted-property-pages-tx)) + retract-page-tag-from-properties-tx (retract-parent-and-page-tag (concat property-pages-tx converted-property-pages-tx)) ;; Save properties on new property pages separately as they can contain new properties and thus need to be ;; transacted separately the property pages property-page-properties-tx (keep (fn [b] @@ -1329,17 +1345,18 @@ (->> pages-tx' ;; Existing pages that have converted to property or class (filter #(and (:db/ident %) (get existing-pages' (:block/uuid %)))) - (mapv #(vector :db/retract [:block/uuid (:block/uuid %)] :block/tags :logseq.class/Page)))] + retract-parent-and-page-tag)] {:pages-tx (mapv (fn [page] (if (or (contains? classes (:block/uuid page)) (contains? existing-properties (:block/uuid page))) - (update page :block/tags (fn [tags] (vec (remove #(= % :logseq.class/Page) tags)))) + (-> page + (update :block/tags (fn [tags] (vec (remove #(= % :logseq.class/Page) tags)))) + (dissoc :block/parent)) page)) pages-tx') :retract-page-tags-tx - (into (mapv #(vector :db/retract [:block/uuid (:block/uuid %)] :block/tags :logseq.class/Page) - classes-tx) + (into (retract-parent-and-page-tag classes-tx) retract-page-tag-from-existing-pages)})) (defn- save-from-tx From 6c12676a084099b7f1eac05b336c6caf54f19183 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sat, 17 May 2025 05:46:23 +0800 Subject: [PATCH 28/67] fix: check pages only --- .../test/logseq/graph_parser/exporter_test.cljs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs b/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs index 3f3d445ab6..a16ae04174 100644 --- a/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs +++ b/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs @@ -394,11 +394,11 @@ (cons {:parent (:block/title parent) :child (:block/title ent)} (mapcat #(expand-children % ent) children)) [{:parent (:block/title parent) :child (:block/title ent)}]))] + ;; check pages only (is (= [{:parent "n1" :child "x"} {:parent "x" :child "z"} - {:parent "x" :child "y"} - {:parent "y", :child "some content"}] - (rest (expand-children (db-test/find-page-by-title @conn "n1") nil))) + {:parent "x" :child "y"}] + (take 3 (rest (expand-children (db-test/find-page-by-title @conn "n1") nil)))) "First namespace tests duplicate parent page name") (is (= [{:parent "n2" :child "x"} {:parent "x" :child "z"} From 334b5be62e12fccab846a97c1ae2c574eeb3fbb9 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 18 May 2025 03:19:46 +0800 Subject: [PATCH 29/67] fix: search namespace pages --- deps/common/src/logseq/common/config.cljs | 17 ++++--------- deps/db/src/logseq/db.cljs | 2 +- deps/db/src/logseq/db/frontend/db.cljs | 29 +++++++++++++++++++++++ src/main/frontend/handler/assets.cljs | 11 +-------- src/main/frontend/worker/search.cljs | 4 ++-- 5 files changed, 37 insertions(+), 26 deletions(-) diff --git a/deps/common/src/logseq/common/config.cljs b/deps/common/src/logseq/common/config.cljs index eb8f385b5b..2b9d932393 100644 --- a/deps/common/src/logseq/common/config.cljs +++ b/deps/common/src/logseq/common/config.cljs @@ -1,7 +1,6 @@ (ns logseq.common.config "Common config constants and fns that are shared between deps and app" - (:require [clojure.string :as string] - [goog.object :as gobj])) + (:require [clojure.string :as string])) (goog-define PUBLISHING false) @@ -30,10 +29,6 @@ (def app-name "logseq") (defonce asset-protocol "assets://") -(defonce capacitor-protocol "capacitor://") -(defonce capacitor-prefix "_capacitor_file_") -(defonce capacitor-protocol-with-prefix (str capacitor-protocol "localhost/" capacitor-prefix)) -(defonce capacitor-x-protocol-with-prefix (str (gobj/getValueByKeys js/globalThis "location" "href") capacitor-prefix)) (defonce local-assets-dir "assets") @@ -48,17 +43,13 @@ (defn local-protocol-asset? [s] (when (string? s) - (or (string/starts-with? s asset-protocol) - (string/starts-with? s capacitor-protocol) - (string/starts-with? s capacitor-x-protocol-with-prefix)))) + (string/starts-with? s asset-protocol))) (defn remove-asset-protocol [s] (if (local-protocol-asset? s) (-> s - (string/replace-first asset-protocol "file://") - (string/replace-first capacitor-protocol-with-prefix "file://") - (string/replace-first capacitor-x-protocol-with-prefix "file://")) + (string/replace-first asset-protocol "file://")) s)) (defonce default-draw-directory "draws") @@ -154,4 +145,4 @@ :favorites "is not stored in config for DB graphs" :default-templates - "is replaced by #Template and the `Apply template to tags` property"})) \ No newline at end of file + "is replaced by #Template and the `Apply template to tags` property"})) diff --git a/deps/db/src/logseq/db.cljs b/deps/db/src/logseq/db.cljs index 23cdb2f1e9..36e56c02d2 100644 --- a/deps/db/src/logseq/db.cljs +++ b/deps/db/src/logseq/db.cljs @@ -541,7 +541,7 @@ (def get-all-properties db-db/get-all-properties) (def get-class-extends db-db/get-class-extends) (def get-classes-parents db-db/get-classes-parents) -(def get-class-title-with-extends db-db/get-class-title-with-extends) +(def get-title-with-parents db-db/get-title-with-parents) (def class-instance? db-db/class-instance?) (def inline-tag? db-db/inline-tag?) (def node-display-type-classes db-db/node-display-type-classes) diff --git a/deps/db/src/logseq/db/frontend/db.cljs b/deps/db/src/logseq/db/frontend/db.cljs index 2272701340..a95056a5ea 100644 --- a/deps/db/src/logseq/db/frontend/db.cljs +++ b/deps/db/src/logseq/db/frontend/db.cljs @@ -56,6 +56,18 @@ (conj parents' current-parent)) (vec (reverse parents')))))) +(defn get-page-parents + [node] + (when-let [parent (:block/parent node)] + (loop [current-parent parent + parents' []] + (if (and + current-parent + (not (contains? parents' current-parent))) + (recur (:block/parent current-parent) + (conj parents' current-parent)) + (vec (reverse parents')))))) + (defn get-class-title-with-extends [entity] (if (entity-util/class? entity) @@ -67,6 +79,23 @@ (map :block/title (conj (vec parents') entity)))) (:block/title entity))) +(defn get-title-with-parents + [entity] + (cond + (entity-util/class? entity) + (get-class-title-with-extends entity) + + (entity-util/page? entity) + (let [parents' (->> (get-page-parents entity) + (remove (fn [e] + (and (:logseq.property/built-in? e) (= "Library" (:block/title e))))))] + (string/join + ns-util/parent-char + (map :block/title (conj (vec parents') entity)))) + + :else + (:block/title entity))) + (defn get-classes-parents [tags] (let [tags' (filter entity-util/class? tags) diff --git a/src/main/frontend/handler/assets.cljs b/src/main/frontend/handler/assets.cljs index 53740d4426..ca83ab8bf7 100644 --- a/src/main/frontend/handler/assets.cljs +++ b/src/main/frontend/handler/assets.cljs @@ -49,15 +49,6 @@ (medley/find-first #(= name (:name (second %1))) (medley/indexed alias-dirs)))) -(defn- convert-platform-protocol - [full-path] - - (cond-> full-path - (and (string? full-path) - (mobile-util/native-platform?)) - (string/replace-first - #"^(file://|assets://)" common-config/capacitor-protocol-with-prefix))) - (defn resolve-asset-real-path-url [repo rpath] (when-let [rpath (and (string? rpath) @@ -86,7 +77,7 @@ (if has-schema? (path/path-join graph-root rpath) (path/prepend-protocol "file:" (path/path-join graph-root rpath)))))] - (convert-platform-protocol ret))))) + ret)))) (defn normalize-asset-resource-url "try to convert resource file to url asset link" diff --git a/src/main/frontend/worker/search.cljs b/src/main/frontend/worker/search.cljs index 2a2a1f83cc..3923badf5c 100644 --- a/src/main/frontend/worker/search.cljs +++ b/src/main/frontend/worker/search.cljs @@ -225,7 +225,7 @@ DROP TRIGGER IF EXISTS blocks_au; ;; (let [content (if (and db-based? (seq (:block/properties block))) ;; (str content (when (not= content "") "\n") (get-db-properties-str db properties)) ;; content)]) - (let [title (ldb/get-class-title-with-extends (assoc block :block.temp/search? true))] + (let [title (ldb/get-title-with-parents (assoc block :block.temp/search? true))] (when uuid {:id (str uuid) :page (str (or (:block/uuid page) uuid)) @@ -319,7 +319,7 @@ DROP TRIGGER IF EXISTS blocks_au; {:db/id (:db/id block) :block/uuid block-id :block/title (if (ldb/page? block) - (ldb/get-class-title-with-extends block) + (ldb/get-title-with-parents block) (or snippet title)) :block/page (if (common-util/uuid-string? page) (uuid page) From 626edf73d7d389cf0a2d4026d5ee706ca948dcae Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 18 May 2025 03:31:02 +0800 Subject: [PATCH 30/67] fix: refs count --- src/main/frontend/components/block.cljs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index ee0a18dddc..2efd4d1ca7 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -3455,9 +3455,7 @@ show-query? (rum/react *show-query?) *refs-count (get state ::refs-count) hide-block-refs? (rum/react *hide-block-refs?) - refs-count (if (seq (:block/_refs block)) - (count (remove :logseq.property/view-for (:block/_refs block))) - (rum/react *refs-count)) + refs-count (rum/react *refs-count) [original-block block] (build-block config* block {:navigating-block navigating-block :navigated? navigated?}) config* (if original-block (assoc config* :original-block original-block) From a43198d1094defd8e653a09b231f10d1f0f1b7f2 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 18 May 2025 04:58:00 +0800 Subject: [PATCH 31/67] fix: able to remove namespace page from Library --- src/main/frontend/components/block.cljs | 2 +- src/main/frontend/components/icon.cljs | 6 +++++- src/main/frontend/handler/editor.cljs | 28 +++++++++++++++++-------- src/resources/dicts/en.edn | 2 +- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 2efd4d1ca7..7ab62dd52c 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -2130,7 +2130,7 @@ :ignore-children? (:page-title? config)}) link? (boolean (:original-block config)) icon-size (if collapsed? 12 14) - icon (icon-component/get-node-icon-cp block {:size icon-size :color? true}) + icon (icon-component/get-node-icon-cp block {:size icon-size :color? true :link? link?}) with-icon? (and (some? icon) (or (db/page? block) (:logseq.property/icon block) diff --git a/src/main/frontend/components/icon.cljs b/src/main/frontend/components/icon.cljs index 5f8305f8fb..ffb6e856a3 100644 --- a/src/main/frontend/components/icon.cljs +++ b/src/main/frontend/components/icon.cljs @@ -64,8 +64,12 @@ (defn get-node-icon-cp [node-entity opts] (let [opts' (merge {:size 14} opts) - node-icon (if (:own-icon? opts) + node-icon (cond + (:own-icon? opts) (get node-entity (pu/get-pid :logseq.property/icon)) + (:link? opts) + "arrow-narrow-right" + :else (get-node-icon node-entity))] (when-not (or (string/blank? node-icon) (and (contains? #{"letter-n" "file"} node-icon) (:not-text-or-page? opts))) [:div.icon-cp-container.flex.items-center diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index bca2fe84e3..2303d0bfcc 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -35,7 +35,6 @@ [frontend.modules.outliner.op :as outliner-op] [frontend.modules.outliner.tree :as tree] [frontend.modules.outliner.ui :as ui-outliner-tx] - [frontend.util.ref :as ref] [frontend.search :as search] [frontend.state :as state] [frontend.template :as template] @@ -44,6 +43,7 @@ [frontend.util.file-based.drawer :as drawer] [frontend.util.keycode :as keycode] [frontend.util.list :as list] + [frontend.util.ref :as ref] [frontend.util.text :as text-util] [frontend.util.thingatpt :as thingatpt] [goog.dom :as gdom] @@ -1062,14 +1062,24 @@ (let [repo (state/get-current-repo) block-uuids (distinct (map #(uuid (dom/attr % "blockid")) dom-blocks)) lookup-refs (map (fn [id] [:block/uuid id]) block-uuids) - blocks (->> (map db/entity lookup-refs) - (remove ldb/page?)) - top-level-blocks (when (seq blocks) (block-handler/get-top-level-blocks blocks)) - sorted-blocks (mapcat (fn [block] - (tree/get-sorted-block-and-children repo (:db/id block))) - top-level-blocks)] - (when (seq sorted-blocks) - (delete-blocks! repo (map :block/uuid sorted-blocks) sorted-blocks dom-blocks))))))) + blocks (map db/entity lookup-refs) + non-page-blocks (remove ldb/page? blocks) + pages (filter ldb/page? blocks) + library-page (ldb/get-built-in-page (db/get-db) "Library") + library-pages (when library-page + (filter #(= (:db/id (:block/parent %)) (:db/id library-page)) pages))] + (if (seq library-pages) + (ui-outliner-tx/transact! + {:outliner-op :save-blocks} + (doseq [page library-pages] + (outliner-op/remove-block-property! (:db/id page) :block/parent))) + (when (seq non-page-blocks) + (let [top-level-blocks (when (seq blocks) (block-handler/get-top-level-blocks non-page-blocks)) + sorted-blocks (mapcat (fn [block] + (tree/get-sorted-block-and-children repo (:db/id block))) + top-level-blocks)] + (when (seq sorted-blocks) + (delete-blocks! repo (map :block/uuid sorted-blocks) sorted-blocks dom-blocks)))))))))) (def url-regex "Didn't use link/plain-link as it is incorrectly detects words as urls." diff --git a/src/resources/dicts/en.edn b/src/resources/dicts/en.edn index de02d4b377..65cb62bbb1 100644 --- a/src/resources/dicts/en.edn +++ b/src/resources/dicts/en.edn @@ -137,7 +137,7 @@ :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/delete-confirmation "Are you sure you want to delete this page and its file?" + :page/delete-confirmation "Are you sure you want to delete this page?" :page/db-delete-confirmation "Are you sure you want to delete this page?" :page/open-in-finder "Open in directory" :page/open-with-default-app "Open with default app" From c79a12e51d60eae99c99fc0f67bd13fc37a45665 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 18 May 2025 05:27:02 +0800 Subject: [PATCH 32/67] fix: move nodes in Library --- deps/outliner/src/logseq/outliner/core.cljs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/deps/outliner/src/logseq/outliner/core.cljs b/deps/outliner/src/logseq/outliner/core.cljs index ab2e89b8b5..87ee5f05e1 100644 --- a/deps/outliner/src/logseq/outliner/core.cljs +++ b/deps/outliner/src/logseq/outliner/core.cljs @@ -502,12 +502,21 @@ {} block))) +(defn- get-target-block-page + [target-block] + (or + (:db/id (:block/page target-block)) + ;; target parent is a page + (when-let [parent (:block/parent target-block)] + (when (ldb/page? parent) + (:db/id parent))) + ;; target-block is a page itself + (:db/id target-block))) + (defn- build-insert-blocks-tx [db target-block blocks uuids get-new-id {:keys [sibling? outliner-op replace-empty-target? insert-template? keep-block-order?]}] (let [block-ids (set (map :block/uuid blocks)) - target-page (or (:db/id (:block/page target-block)) - ;; target block is a page itself - (:db/id target-block)) + target-page (get-target-block-page target-block) orders (get-block-orders blocks target-block sibling? keep-block-order?)] (map-indexed (fn [idx {:block/keys [parent] :as block}] (when-let [uuid' (get uuids (:block/uuid block))] @@ -823,10 +832,8 @@ (let [target-block (d/entity db (:db/id target-block)) block (d/entity db (:db/id block)) first-block-page (:db/id (:block/page block)) - target-page (or (:db/id (:block/page target-block)) - (:db/id target-block)) + target-page (get-target-block-page target-block) not-same-page? (not= first-block-page target-page) - block-order (if sibling? (db-order/gen-key (:block/order target-block) (:block/order (ldb/get-right-sibling target-block))) @@ -839,7 +846,7 @@ (:db/id (:block/parent target-block)) (:db/id target-block)) :block/order block-order} - (and not-same-page? (not (or (ldb/page? block) (ldb/page? target-block)))) + (not (ldb/page? block)) (assoc :block/page target-page))] children-page-tx (when not-same-page? (let [children-ids (ldb/get-block-children-ids db (:block/uuid block))] From 5183ae5e356f48c1c1a7fbd55e3deef88556fe26 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 18 May 2025 05:43:28 +0800 Subject: [PATCH 33/67] fix: collaborators style --- src/main/frontend/components/header.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/frontend/components/header.cljs b/src/main/frontend/components/header.cljs index 2be0472ca8..d5c398d968 100644 --- a/src/main/frontend/components/header.cljs +++ b/src/main/frontend/components/header.cljs @@ -68,7 +68,7 @@ (let [rtc-graph-id (ldb/get-graph-rtc-uuid (db/get-db)) online-users @(::online-users state)] (when rtc-graph-id - [:div.rtc-collaborators.flex.gap-1.text-sm.py-2.bg-gray-01.items-center + [:div.rtc-collaborators.flex.gap-1.text-sm.bg-gray-01.items-center (shui/button-ghost-icon :user-plus {:on-click #(shui/dialog-open! (fn [] From 7150d014a56cf03d34c08aff770b4f5a7f2093e8 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 18 May 2025 06:19:28 +0800 Subject: [PATCH 34/67] fix: move top namespace pages to Library when importing file graphs --- .../src/logseq/graph_parser/exporter.cljs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs index dd9f120bd0..167fa45aa9 100644 --- a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs @@ -1630,6 +1630,26 @@ :macros (or (:macros options) (:macros config))} (merge (select-keys options [:set-ui-state :export-file :notify-user])))) +(defn- move-top-parent-pages-to-library + [conn repo-or-conn] + (let [db @conn + library-page (ldb/get-built-in-page db "Library") + library-id (:block/uuid library-page) + top-parent-pages (->> (d/datoms db :avet :block/parent) + (keep (fn [d] + (let [child (d/entity db (:e d)) + parent (d/entity db (:v d))] + (when (and (nil? (:block/parent parent)) (ldb/page? child) (ldb/page? parent)) + parent)))) + (common-util/distinct-by :block/uuid)) + tx-data (map + (fn [parent] + {:db/id (:db/id parent) + :block/parent [:block/uuid library-id] + :block/order (db-order/gen-key)}) + top-parent-pages)] + (ldb/transact! repo-or-conn tx-data))) + (defn export-file-graph "Main fn which exports a file graph given its files and imports them into a DB graph. Files is expected to be a seq of maps with a :path key. @@ -1674,6 +1694,7 @@ (export-doc-files conn doc-files Date: Wed, 21 May 2025 10:05:20 -0400 Subject: [PATCH 35/67] fix: remove unused :node-class? option on fn Only classes will use this fn so it's no longer needed. The option was also missing on a couple fns which could've lead to buggy behavior --- deps/db/src/logseq/db/frontend/db.cljs | 33 +++++++++---------- deps/db/test/logseq/db_test.cljs | 2 +- .../src/logseq/outliner/validate.cljs | 4 +-- src/main/frontend/worker/pipeline.cljs | 2 +- .../handler/page/db_based/page_test.cljs | 7 ++-- 5 files changed, 23 insertions(+), 25 deletions(-) diff --git a/deps/db/src/logseq/db/frontend/db.cljs b/deps/db/src/logseq/db/frontend/db.cljs index a95056a5ea..37afa42b40 100644 --- a/deps/db/src/logseq/db/frontend/db.cljs +++ b/deps/db/src/logseq/db/frontend/db.cljs @@ -44,14 +44,13 @@ (d/entity db (:e d)))))) (defn get-class-extends - [node & {:keys [node-class?]}] + "Returns all parents of a class" + [node] (when-let [parent (:logseq.property.class/extends node)] (loop [current-parent parent parents' []] - (if (and - current-parent - (if node-class? (entity-util/class? current-parent) true) - (not (contains? parents' current-parent))) + (if (and current-parent + (not (contains? parents' current-parent))) (recur (:logseq.property.class/extends current-parent) (conj parents' current-parent)) (vec (reverse parents')))))) @@ -61,23 +60,20 @@ (when-let [parent (:block/parent node)] (loop [current-parent parent parents' []] - (if (and - current-parent - (not (contains? parents' current-parent))) + (if (and current-parent + (not (contains? parents' current-parent))) (recur (:block/parent current-parent) (conj parents' current-parent)) (vec (reverse parents')))))) -(defn get-class-title-with-extends +(defn- get-class-title-with-extends [entity] - (if (entity-util/class? entity) - (let [parents' (->> (get-class-extends entity) - (remove (fn [e] (= :logseq.class/Root (:db/ident e)))) - vec)] - (string/join - ns-util/parent-char - (map :block/title (conj (vec parents') entity)))) - (:block/title entity))) + (let [parents' (->> (get-class-extends entity) + (remove (fn [e] (= :logseq.class/Root (:db/ident e)))) + vec)] + (string/join + ns-util/parent-char + (map :block/title (conj (vec parents') entity))))) (defn get-title-with-parents [entity] @@ -97,9 +93,10 @@ (:block/title entity))) (defn get-classes-parents + "Returns all parents of all classes. Like get-class-extends but for multiple classes" [tags] (let [tags' (filter entity-util/class? tags) - result (mapcat #(get-class-extends % {:node-class? true}) tags')] + result (mapcat get-class-extends tags')] (set result))) (defn class-instance? diff --git a/deps/db/test/logseq/db_test.cljs b/deps/db/test/logseq/db_test.cljs index 7fd63e78a2..c06b80d3d1 100644 --- a/deps/db/test/logseq/db_test.cljs +++ b/deps/db/test/logseq/db_test.cljs @@ -48,7 +48,7 @@ (let [conn (db-test/create-conn)] (d/transact! conn class-parents-data) (is (= #{"x" "y"} - (->> (ldb/get-class-extends (ldb/get-page @conn "z") {:node-class? true}) + (->> (ldb/get-class-extends (ldb/get-page @conn "z")) (map :block/title) set))))) diff --git a/deps/outliner/src/logseq/outliner/validate.cljs b/deps/outliner/src/logseq/outliner/validate.cljs index abc1c8ee77..84102d295a 100644 --- a/deps/outliner/src/logseq/outliner/validate.cljs +++ b/deps/outliner/src/logseq/outliner/validate.cljs @@ -45,7 +45,7 @@ :payload {:message "Built-in pages can't be edited" :type :warning}})))) -(defn- validate-unique-by-parent-and-name [db entity new-title] +(defn- validate-unique-by-extends-and-name [db entity new-title] (when-let [_res (seq (d/q '[:find [?b ...] :in $ ?eid ?type ?title :where @@ -117,7 +117,7 @@ :type :warning}}))))) (:logseq.property.class/extends entity) - (validate-unique-by-parent-and-name db entity new-title))) + (validate-unique-by-extends-and-name db entity new-title))) (defn ^:api validate-unique-by-name-tag-and-block-type "Validates uniqueness of nodes for the following cases: diff --git a/src/main/frontend/worker/pipeline.cljs b/src/main/frontend/worker/pipeline.cljs index 8ca5154119..ff3eb7d8ae 100644 --- a/src/main/frontend/worker/pipeline.cljs +++ b/src/main/frontend/worker/pipeline.cljs @@ -64,7 +64,7 @@ template-blocks (->> (mapcat (fn [id] (let [tag (d/entity db id) journal? (= journal-id id) - parents (ldb/get-class-extends tag {:node-class? true}) + parents (ldb/get-class-extends tag) templates (mapcat :logseq.property/_template-applied-to (conj parents tag))] (cond->> templates journal? diff --git a/src/test/frontend/worker/handler/page/db_based/page_test.cljs b/src/test/frontend/worker/handler/page/db_based/page_test.cljs index 60a8ac322a..923c8d2dfa 100644 --- a/src/test/frontend/worker/handler/page/db_based/page_test.cljs +++ b/src/test/frontend/worker/handler/page/db_based/page_test.cljs @@ -3,7 +3,8 @@ [datascript.core :as d] [frontend.worker.handler.page.db-based.page :as worker-db-page] [logseq.db :as ldb] - [logseq.db.test.helper :as db-test])) + [logseq.db.test.helper :as db-test] + [logseq.db.frontend.db :as db-db])) (deftest create-class (let [conn (db-test/create-conn) @@ -40,8 +41,8 @@ (is (= ["foo" "bar"] (map :block/title [(:block/parent (:block/parent child-page)) (:block/parent child-page)])) "Child page with new parent has correct parents") - (is (= (map :block/uuid (ldb/get-class-extends child-page)) - (map :block/uuid (ldb/get-class-extends child-page2))) + (is (= (map :block/uuid (db-db/get-page-parents child-page)) + (map :block/uuid (db-db/get-page-parents child-page2))) "Child page with existing parents has correct parents") (is (= ["Root Tag" "c1"] (map :block/title (ldb/get-classes-parents [child-page3]))) "Child class with new parent has correct parents") From 30ccf2ab24150b64df160c094fda31a5aeb177d3 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Wed, 21 May 2025 10:15:53 -0400 Subject: [PATCH 36/67] fix: remove incorrect translations :en language changed for this entry so remove as they are no longer correct --- src/resources/dicts/af.edn | 1 - src/resources/dicts/ca.edn | 1 - src/resources/dicts/cs.edn | 1 - src/resources/dicts/de.edn | 1 - src/resources/dicts/es.edn | 1 - src/resources/dicts/fa.edn | 1 - src/resources/dicts/fr.edn | 1 - src/resources/dicts/id.edn | 1 - src/resources/dicts/it.edn | 1 - src/resources/dicts/ja.edn | 1 - src/resources/dicts/ko.edn | 1 - src/resources/dicts/nb-no.edn | 1 - src/resources/dicts/nl.edn | 1 - src/resources/dicts/pl.edn | 1 - src/resources/dicts/pt-br.edn | 1 - src/resources/dicts/pt-pt.edn | 1 - src/resources/dicts/ru.edn | 1 - src/resources/dicts/sk.edn | 1 - src/resources/dicts/tr.edn | 1 - src/resources/dicts/uk.edn | 1 - src/resources/dicts/zh-cn.edn | 1 - src/resources/dicts/zh-hant.edn | 1 - 22 files changed, 22 deletions(-) diff --git a/src/resources/dicts/af.edn b/src/resources/dicts/af.edn index cfce4a512c..265b5c6d00 100644 --- a/src/resources/dicts/af.edn +++ b/src/resources/dicts/af.edn @@ -22,7 +22,6 @@ :right-side-bar/switch-theme "Skakel oor na die {1} tema" :right-side-bar/contents "Inhoud" :right-side-bar/block-ref "Blok verwysing" - :page/delete-confirmation "Is jy seker jy wil die bladsy uitvee?" :file/name "Lêer naam" :file/last-modified-at "Laas verander op" :file/no-data "Geen data" diff --git a/src/resources/dicts/ca.edn b/src/resources/dicts/ca.edn index a4d466bbb1..8ec410dbe2 100644 --- a/src/resources/dicts/ca.edn +++ b/src/resources/dicts/ca.edn @@ -419,7 +419,6 @@ :page/copy-page-url "Copiar URL de la pàgina" :page/created-at "Creada el" :page/delete "Eliminar pàgina" - :page/delete-confirmation "Està segur que desitja eliminar aquesta pàgina i el seu arxiu?" :page/illegal-page-name "¡Nom de pàgina no permès!" :page/logseq-is-having-a-problem "Logseq està tenint un problema. Per intentar tornar a un estat de treball, intenti el següent procediment en ordre:" :page/make-private "Fer privada" diff --git a/src/resources/dicts/cs.edn b/src/resources/dicts/cs.edn index 76e4d42576..ab455c1d08 100644 --- a/src/resources/dicts/cs.edn +++ b/src/resources/dicts/cs.edn @@ -130,7 +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/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" :page/make-public "Označit stránku jjako veřejnou" diff --git a/src/resources/dicts/de.edn b/src/resources/dicts/de.edn index 59eb32f800..3884467738 100644 --- a/src/resources/dicts/de.edn +++ b/src/resources/dicts/de.edn @@ -235,7 +235,6 @@ :page/copy-page-url "Seiten-URL kopieren" :page/created-at "Erstellt am" :page/delete "Seite löschen" - :page/delete-confirmation "Diese Seite und die zugehörige Datei löschen?" :page/illegal-page-name "Seitenname nicht zulässig!" :page/logseq-is-having-a-problem "Logseq hat ein Problem festgestellt. Versuche zurückzukehren ..." :page/make-private "Privat machen" diff --git a/src/resources/dicts/es.edn b/src/resources/dicts/es.edn index 863bff4ab7..745912a905 100644 --- a/src/resources/dicts/es.edn +++ b/src/resources/dicts/es.edn @@ -418,7 +418,6 @@ :page/copy-page-url "Copiar URL de la página" :page/created-at "Creada el" :page/delete "Eliminar página" - :page/delete-confirmation "¿Está seguro que desea eliminar esta página y su archivo?" :page/illegal-page-name "¡Nombre de página ilegal!" :page/logseq-is-having-a-problem "Logseq está teniendo un problema. Para intentar volver a un estado de trabajo, intenta los siguientes pasos seguros en orden:" :page/make-private "Hacer privada" diff --git a/src/resources/dicts/fa.edn b/src/resources/dicts/fa.edn index daba90fdf8..61ad555165 100644 --- a/src/resources/dicts/fa.edn +++ b/src/resources/dicts/fa.edn @@ -106,7 +106,6 @@ :page/logseq-is-having-a-problem "لاگ‌سیک دچار مشکلی شده است. برای بازگرداندن آن به حالت قابل استفاده لطفا گام‌های زیر را به ترتیب انجام دهید:" :page/step "گام {1}" :page/try "امتحان کنید" - :page/delete-confirmation "مطمئنید که می‌خواید این برگه به همراه پرونده‌اش را پاک کنید؟" :page/open-in-finder "باز کردن در پوشه" :page/open-with-default-app "باز کردن با برنامه پیش‌فرض" :page/make-public "عمومی ساختن برای انتشار" diff --git a/src/resources/dicts/fr.edn b/src/resources/dicts/fr.edn index c7588c446f..cdc780c873 100644 --- a/src/resources/dicts/fr.edn +++ b/src/resources/dicts/fr.edn @@ -29,7 +29,6 @@ :right-side-bar/all-pages "Toutes les pages" :right-side-bar/flashcards "Cartes-mémoire" :left-side-bar/journals "Journaux" - :page/delete-confirmation "Voulez-vous vraiment supprimer la page ?" :page/make-public "Rendre la page publique" :page/make-private "Rendre la page privée" :page/delete "Supprimer la page (supprime le fichier)" diff --git a/src/resources/dicts/id.edn b/src/resources/dicts/id.edn index 605e058818..11a0edbfca 100644 --- a/src/resources/dicts/id.edn +++ b/src/resources/dicts/id.edn @@ -125,7 +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/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" :page/make-public "Buat publik untuk dipublikasikan" diff --git a/src/resources/dicts/it.edn b/src/resources/dicts/it.edn index 8cd94a0709..51ad5f9d77 100644 --- a/src/resources/dicts/it.edn +++ b/src/resources/dicts/it.edn @@ -33,7 +33,6 @@ :left-side-bar/journals "Diario" :left-side-bar/nav-favorites "Preferiti" :left-side-bar/nav-recent-pages "Recenti" - :page/delete-confirmation "Sei sicuro di voler eliminare questa pagina e i suoi dati?" :page/open-in-finder "Apri nella cartella" :page/open-with-default-app "Apri con l'app predefinita" :page/make-public "Segna come pubblico per la pubblicazione" diff --git a/src/resources/dicts/ja.edn b/src/resources/dicts/ja.edn index dcee803302..2337f83937 100644 --- a/src/resources/dicts/ja.edn +++ b/src/resources/dicts/ja.edn @@ -134,7 +134,6 @@ :page/logseq-is-having-a-problem "Logseqになにか問題があります。きちんと動く状態に戻すため、以下の項目を上から順番に実行してください:" :page/step "ステップ{1}" :page/try "試す" - :page/delete-confirmation "このページとページのファイルを削除してもよいですか?" :page/open-in-finder "ディレクトリで開く" :page/open-with-default-app "既定のアプリで開く" :page/make-public "パブリッシュのため公開する" diff --git a/src/resources/dicts/ko.edn b/src/resources/dicts/ko.edn index abd2204d88..9b51e0ba5d 100644 --- a/src/resources/dicts/ko.edn +++ b/src/resources/dicts/ko.edn @@ -34,7 +34,6 @@ :left-side-bar/journals "일지" :left-side-bar/nav-favorites "즐겨찾기" :left-side-bar/nav-recent-pages "최근 페이지" - :page/delete-confirmation "이 페이지와 페이지의 파일들을 삭제하시겠습니까?" :page/open-in-finder "디렉토리에서 열기" :page/open-with-default-app "기본 앱으로 열기" :page/make-public "출판 전 공개 상태로 만들기" diff --git a/src/resources/dicts/nb-no.edn b/src/resources/dicts/nb-no.edn index 25385c1733..f64b5c90fd 100644 --- a/src/resources/dicts/nb-no.edn +++ b/src/resources/dicts/nb-no.edn @@ -37,7 +37,6 @@ :left-side-bar/journals "Dagbøker" :left-side-bar/nav-favorites "Favoritter" :left-side-bar/nav-recent-pages "Nylig" - :page/delete-confirmation "Er du sikker på at du vil slette denne siden og filen dens?" :page/open-in-finder "Åpne i mappe" :page/open-with-default-app "Åpne med forhåndsvalgt app" :page/make-public "Gjør den offentlig for publisering" diff --git a/src/resources/dicts/nl.edn b/src/resources/dicts/nl.edn index af0284f7cd..e0f4541fea 100644 --- a/src/resources/dicts/nl.edn +++ b/src/resources/dicts/nl.edn @@ -97,7 +97,6 @@ :page/copy-page-url "Kopieer pagina URL" :page/created-at "Aangemaakt op" :page/delete "Verwijder pagina" - :page/delete-confirmation "Weet u zeker dat u deze pagina wilt verwijderen..." :page/make-private "Maak prive" :page/make-public "Maak publiek" :page/open-backup-directory "Open backups map pagina" diff --git a/src/resources/dicts/pl.edn b/src/resources/dicts/pl.edn index 696e18ae11..ffb6d9954d 100644 --- a/src/resources/dicts/pl.edn +++ b/src/resources/dicts/pl.edn @@ -36,7 +36,6 @@ :left-side-bar/journals "Dzienniki" :left-side-bar/nav-favorites "Ulubione" :left-side-bar/nav-recent-pages "Ostatnio odwiedzane" - :page/delete-confirmation "Czy jesteś pewien że chcesz usunąć tę stronę i jej plik?" :page/open-in-finder "Otwórz w przeglądarce plików" :page/open-with-default-app "Otwórz w domyślnej aplikacji" :page/make-public "Oznacz jako publiczną" diff --git a/src/resources/dicts/pt-br.edn b/src/resources/dicts/pt-br.edn index dfe386bc3f..7f29711447 100644 --- a/src/resources/dicts/pt-br.edn +++ b/src/resources/dicts/pt-br.edn @@ -130,7 +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/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" :page/make-public "Torná-la pública para publicação" diff --git a/src/resources/dicts/pt-pt.edn b/src/resources/dicts/pt-pt.edn index 0005fe0e7e..24ddc33625 100644 --- a/src/resources/dicts/pt-pt.edn +++ b/src/resources/dicts/pt-pt.edn @@ -54,7 +54,6 @@ :page/logseq-is-having-a-problem "Logseq está tendo um problema. Para tentar colocá-lo de volta em um estado de funcionamento, por favor tente os seguintes passos seguros em ordem:" :page/step "Passo {1}" :page/try "Tentar" - :page/delete-confirmation "Tem a certeza de que quer apagar esta página e o respetivo ficheiro?" :page/open-in-finder "Abrir em pasta" :page/open-with-default-app "Abrir com a aplicação predefinida" :page/make-public "Tornar pública para publicação" diff --git a/src/resources/dicts/ru.edn b/src/resources/dicts/ru.edn index 454a2562c9..eb5e243f94 100644 --- a/src/resources/dicts/ru.edn +++ b/src/resources/dicts/ru.edn @@ -61,7 +61,6 @@ :page/logseq-is-having-a-problem "У Logseq возникла проблема. Чтобы попытаться вернуть его в рабочее состояние, пожалуйста, попробуйте выполнить следующие безопасные шаги по порядку:" :page/step "Шаг {1}" :page/try "Попробовать" - :page/delete-confirmation "Вы уверены, что хотите удалить эту страницу и её файл(ы)?" :page/open-in-finder "Открыть в каталоге" :page/open-with-default-app "Открыть в приложении по умолчанию" :page/make-public "Сделать доступной для публикации" diff --git a/src/resources/dicts/sk.edn b/src/resources/dicts/sk.edn index 83134c142a..e698107c54 100644 --- a/src/resources/dicts/sk.edn +++ b/src/resources/dicts/sk.edn @@ -130,7 +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/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" :page/make-public "Označiť stránku ako verejnú" diff --git a/src/resources/dicts/tr.edn b/src/resources/dicts/tr.edn index f89016853f..627e1a0e3c 100644 --- a/src/resources/dicts/tr.edn +++ b/src/resources/dicts/tr.edn @@ -134,7 +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/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ç" :page/make-public "Yayımlamak için herkese açık hale getir" diff --git a/src/resources/dicts/uk.edn b/src/resources/dicts/uk.edn index 01fc507637..bc37b9efac 100644 --- a/src/resources/dicts/uk.edn +++ b/src/resources/dicts/uk.edn @@ -55,7 +55,6 @@ :page/logseq-is-having-a-problem "У Logseq виникла проблема. Щоб спробувати повернути його до робочого стану, виконайте такі безпечні кроки по порядку:" :page/step "Крок {1}" :page/try "Спробувати" - :page/delete-confirmation "Ви впевнені, що хочете видалити цю сторінку та її файл?" :page/open-in-finder "Відкрити у директорії" :page/open-with-default-app "Відкрити за допомогою програми за умовчанням" :page/make-public "Зробіти загальнодоступним для публікації" diff --git a/src/resources/dicts/zh-cn.edn b/src/resources/dicts/zh-cn.edn index 4c03a0992b..68010de817 100644 --- a/src/resources/dicts/zh-cn.edn +++ b/src/resources/dicts/zh-cn.edn @@ -107,7 +107,6 @@ :left-side-bar/journals "日志" :left-side-bar/nav-favorites "收藏页面" :left-side-bar/nav-recent-pages "最近使用" - :page/delete-confirmation "您确定要删除此页面和文件吗?" :page/open-in-finder "打开文件对应目录" :page/open-with-default-app "用默认应用打开文件" :page/make-public "导出 HTML 时发布本页面" diff --git a/src/resources/dicts/zh-hant.edn b/src/resources/dicts/zh-hant.edn index b7dcae64b3..22827356e0 100644 --- a/src/resources/dicts/zh-hant.edn +++ b/src/resources/dicts/zh-hant.edn @@ -55,7 +55,6 @@ :page/logseq-is-having-a-problem "Logseq 出了些問題。請按照以下安全步驟將其恢復到正常狀態:" :page/step "步驟 {1}" :page/try "嘗試" - :page/delete-confirmation "你確定想刪除此頁面檔案嗎?" :page/open-in-finder "開啟資料夾" :page/open-with-default-app "使用預設應用程式開啟" :page/make-public "將其公開讓所有人均可檢視" From 1310a9ec701f3af8c182f272138ecff2561598f5 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Wed, 21 May 2025 12:57:17 -0400 Subject: [PATCH 37/67] fix: remove unused override in exporter fn The correct attribute is already passed into replace-namespace-with-parent. Didn't observe any test where this override was needed --- .../src/logseq/graph_parser/exporter.cljs | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs index 167fa45aa9..83d4681983 100644 --- a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs @@ -60,22 +60,14 @@ (merge ex-data' {:page-name page-name :page-names (sort (keys @page-names-to-uuids))}))))) -(defn- block-db-tag? - [block] - (and (set? (:block/tags block)) - (contains? (:block/tags block) :logseq.class/Tag))) - (defn- replace-namespace-with-parent [block page-names-to-uuids parent-k] - (let [parent-k' (if (block-db-tag? block) - :logseq.property.class/extends - parent-k)] - (if (:block/namespace block) - (-> (dissoc block :block/namespace) - (assoc parent-k' - {:block/uuid (get-page-uuid page-names-to-uuids - (get-in block [:block/namespace :block/name]) - {:block block :block/namespace (:block/namespace block)})})) - block))) + (if (:block/namespace block) + (-> (dissoc block :block/namespace) + (assoc parent-k + {:block/uuid (get-page-uuid page-names-to-uuids + (get-in block [:block/namespace :block/name]) + {:block block :block/namespace (:block/namespace block)})})) + block)) (defn- build-class-ident-name [class-name] From 471889729e32adfa22a73c8ce2f324d398509028 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Wed, 21 May 2025 14:31:12 -0400 Subject: [PATCH 38/67] fix: graphs with existing Library page are imported incorrectly and merged with new built-in page when :property-classes option is used --- deps/graph-parser/src/logseq/graph_parser/exporter.cljs | 5 ++++- .../graph-parser/test/logseq/graph_parser/exporter_test.cljs | 3 ++- .../test/resources/exporter-test-graph/pages/Library.md | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 deps/graph-parser/test/resources/exporter-test-graph/pages/Library.md diff --git a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs index 83d4681983..1ad37eb9c7 100644 --- a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs @@ -424,9 +424,12 @@ (def all-built-in-names "All built-in properties and classes as a set of keywords" (set/union all-built-in-property-file-ids + ;; This should list all new pages introduced with db graph (set (->> db-class/built-in-classes vals - (map #(-> % :title string/lower-case keyword)))))) + (map :title) + (concat ["Library"]) + (map #(-> % string/lower-case keyword)))))) (def file-built-in-property-names "File-graph built-in property names that are supported. Expressed as set of keywords" diff --git a/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs b/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs index a16ae04174..405bf7bf36 100644 --- a/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs +++ b/deps/graph-parser/test/logseq/graph_parser/exporter_test.cljs @@ -591,7 +591,8 @@ (p/let [file-graph-dir "test/resources/exporter-test-graph" files (mapv #(node-path/join file-graph-dir %) ["journals/2024_02_23.md" "pages/url.md" "pages/Whiteboard___Tool.md" - "pages/Whiteboard___Arrow_head_toggle.md"]) + "pages/Whiteboard___Arrow_head_toggle.md" + "pages/Library.md"]) conn (db-test/create-conn) _ (import-files-to-db files conn {:property-classes ["type"]}) _ (@#'gp-exporter/export-class-properties conn conn)] diff --git a/deps/graph-parser/test/resources/exporter-test-graph/pages/Library.md b/deps/graph-parser/test/resources/exporter-test-graph/pages/Library.md new file mode 100644 index 0000000000..d38160000b --- /dev/null +++ b/deps/graph-parser/test/resources/exporter-test-graph/pages/Library.md @@ -0,0 +1 @@ +type:: [[Class]] From b55c55831f9c55e757c4ba4b1e8012bf6315b692 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Wed, 21 May 2025 16:11:53 -0400 Subject: [PATCH 39/67] chore: add test for migration bug in f4d3dca19c33f2facd7d8608e590055234ff8bab. Put the fix in feat/db since it should be deploy asap and test in this branch since only this branch has the ability to test migrations --- src/test/frontend/worker/migrate_test.cljs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/test/frontend/worker/migrate_test.cljs b/src/test/frontend/worker/migrate_test.cljs index 4a05222e93..da1f5e87fd 100644 --- a/src/test/frontend/worker/migrate_test.cljs +++ b/src/test/frontend/worker/migrate_test.cljs @@ -87,3 +87,19 @@ {:db/id 158, ;; :block/order "a9" }]))))) + +(deftest ensure-built-in-data-exists! + (let [db-transit (str (fs-node/readFileSync "src/test/migration/64.8.transit")) + db (ldb/read-transit-str db-transit) + conn (d/conn-from-db db) + initial-version (:kv/value (d/entity @conn :logseq.kv/graph-initial-schema-version)) + graph-created-at (:kv/value (d/entity @conn :logseq.kv/graph-created-at)) + _ (assert (= {:major 64 :minor 8} initial-version)) + _ (assert (some? graph-created-at)) + _ (db-migrate/ensure-built-in-data-exists! conn)] + (is (= initial-version + (:kv/value (d/entity @conn :logseq.kv/graph-initial-schema-version))) + "Initial version not changed by fn") + (is (= graph-created-at + (:kv/value (d/entity @conn :logseq.kv/graph-created-at))) + "Graph created at not changed by fn"))) \ No newline at end of file From dad56a3e91485263667173edfe814d2995d37a3c Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Wed, 21 May 2025 18:13:42 -0400 Subject: [PATCH 40/67] fix: block count in validation :block/parent can be used by pages now --- deps/db/src/logseq/db/frontend/validate.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/db/src/logseq/db/frontend/validate.cljs b/deps/db/src/logseq/db/frontend/validate.cljs index 82a0f68fad..4653473b18 100644 --- a/deps/db/src/logseq/db/frontend/validate.cljs +++ b/deps/db/src/logseq/db/frontend/validate.cljs @@ -118,7 +118,7 @@ {:entities (count entities) :pages (count (filter :block/name entities)) ;; Nodes that aren't pages - :blocks (count (filter :block/parent entities)) + :blocks (count (filter :block/page entities)) :classes classes-count :properties properties-count ;; Objects that aren't classes or properties From 78a89f67e131dbe72b31ce5d1fa28ef757cbf985 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Thu, 22 May 2025 11:53:14 -0400 Subject: [PATCH 41/67] fix: convert tag to page leaves class specific properties This could lead to subtle bugs with pages accidentally taking on class-like behavior --- src/main/frontend/handler/db_based/page.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/frontend/handler/db_based/page.cljs b/src/main/frontend/handler/db_based/page.cljs index 0f5fedb0a3..825d8dbc73 100644 --- a/src/main/frontend/handler/db_based/page.cljs +++ b/src/main/frontend/handler/db_based/page.cljs @@ -65,6 +65,8 @@ (fn convert-fn [] (let [page-txs [[:db/retract (:db/id page-entity) :db/ident] [:db/retract (:db/id page-entity) :block/tags :logseq.class/Tag] + [:db/retract (:db/id page-entity) :logseq.property.class/extends] + [:db/retract (:db/id page-entity) :logseq.property.class/properties] [:db/add (:db/id page-entity) :block/tags :logseq.class/Page]] obj-txs (mapcat (fn [obj] (let [tags (map #(db/entity (state/get-current-repo) (:db/id %)) (:block/tags obj))] @@ -75,7 +77,7 @@ txs (concat page-txs obj-txs)] (db/transact! (state/get-current-repo) txs {:outliner-op :save-block})))] (-> (shui/dialog-confirm! - "Converting a tag to page also removes tags from any nodes that have that tag. Are you ok with that?" + "Converting a tag to page also removes its tag properties and its tag from all nodes tagged with it. Are you ok with that?" {:id :convert-tag-to-page :data-reminder :ok}) (p/then convert-fn))))))) From 4b39ce213fdf14d91288d28cae284bbe612bceb7 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Thu, 22 May 2025 12:05:23 -0400 Subject: [PATCH 42/67] fix: convert tag to page can break a tag branch Converting a tag parent causes the graph to be invalid and buggy as tag children are then extended by non-tags --- src/main/frontend/handler/db_based/page.cljs | 52 ++++++++++---------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/main/frontend/handler/db_based/page.cljs b/src/main/frontend/handler/db_based/page.cljs index 825d8dbc73..a0d1cda3f1 100644 --- a/src/main/frontend/handler/db_based/page.cljs +++ b/src/main/frontend/handler/db_based/page.cljs @@ -56,31 +56,33 @@ (db/transact! (state/get-current-repo) txs {:outliner-op :save-block})))) (defn convert-tag-to-page! - [page-entity] - (if (db/page-exists? (:block/title page-entity) #{:logseq.class/Page}) - (notification/show! (str "A page with the name \"" (:block/title page-entity) "\" already exists.") :warning false) - (when-not (:logseq.property/built-in? page-entity) - (p/let [objects (db-async/ (shui/dialog-confirm! - "Converting a tag to page also removes its tag properties and its tag from all nodes tagged with it. Are you ok with that?" - {:id :convert-tag-to-page - :data-reminder :ok}) - (p/then convert-fn))))))) + [entity] + (if (db/page-exists? (:block/title entity) #{:logseq.class/Page}) + (notification/show! (str "A page with the name \"" (:block/title entity) "\" already exists.") :warning false) + (when-not (:logseq.property/built-in? entity) + (if (seq (:logseq.property.class/_extends entity)) + (notification/show! "This tag cannot be converted because it has tag children. All tag children must be removed or converted before converting this tag." :warning false) + (p/let [objects (db-async/ (shui/dialog-confirm! + "Converting a tag to page also removes its tag properties and its tag from all nodes tagged with it. Are you ok with that?" + {:id :convert-tag-to-page + :data-reminder :ok}) + (p/then convert-fn)))))))) (defn Date: Thu, 22 May 2025 14:20:56 -0400 Subject: [PATCH 43/67] fix: outdated extends property validation Was still validating as if it handled multiple page types when it only applies to classes now --- .../src/logseq/outliner/property.cljs | 4 +-- .../src/logseq/outliner/validate.cljs | 27 +++++++++---------- .../test/logseq/outliner/validate_test.cljs | 16 +++++------ 3 files changed, 20 insertions(+), 27 deletions(-) diff --git a/deps/outliner/src/logseq/outliner/property.cljs b/deps/outliner/src/logseq/outliner/property.cljs index 78ca5a7c33..8a4f87912a 100644 --- a/deps/outliner/src/logseq/outliner/property.cljs +++ b/deps/outliner/src/logseq/outliner/property.cljs @@ -311,7 +311,7 @@ (outliner-validate/validate-tags-property @conn block-eids v)) property (d/entity @conn property-id) _ (when (= (:db/ident property) :logseq.property.class/extends) - (outliner-validate/validate-parent-property + (outliner-validate/validate-extends-property (if (number? v) (d/entity @conn v) v) (map #(d/entity @conn %) block-eids))) _ (assert (some? property) (str "Property " property-id " doesn't exist yet")) @@ -384,7 +384,7 @@ (when (= property-id :block/tags) (outliner-validate/validate-tags-property @conn [block-eid] v)) (when (= property-id :logseq.property.class/extends) - (outliner-validate/validate-parent-property v [block])) + (outliner-validate/validate-extends-property v [block])) (cond db-attribute? (when-not (and (= property-id :block/alias) (= v (:db/id block))) ; alias can't be itself diff --git a/deps/outliner/src/logseq/outliner/validate.cljs b/deps/outliner/src/logseq/outliner/validate.cljs index 84102d295a..4223ded87c 100644 --- a/deps/outliner/src/logseq/outliner/validate.cljs +++ b/deps/outliner/src/logseq/outliner/validate.cljs @@ -144,32 +144,29 @@ (validate-unique-by-name-tag-and-block-type db new-title existing-block-entity) (validate-disallow-page-with-journal-name new-title existing-block-entity)) -(defn- validate-parent-property-have-same-type - "Validates whether given parent and children are valid. Allows 'class' and - 'page' types to have a relationship with their own type. May consider allowing more - page types if they don't cause systemic bugs" +(defn- validate-extends-property-have-correct-type + "Validates whether given parent and children are classes" [parent-ent child-ents] - (when (or (and (ldb/class? parent-ent) (not (every? ldb/class? child-ents))) - (and (ldb/internal-page? parent-ent) (not (every? ldb/internal-page? child-ents))) - (not ((some-fn ldb/class? ldb/internal-page?) parent-ent))) - (throw (ex-info "Can't set this page as a parent because the child page is a different type" + (when (or (not (ldb/class? parent-ent)) + (not (every? ldb/class? child-ents))) + (throw (ex-info "Can't extend this page since either it is not a tag or is extending from a page that is not a tag" {:type :notification - :payload {:message "Can't set this page as a parent because the child page is a different type" - :type :warning} + :payload {:message "Can't extend this page since either it is not a tag or is extending from a page that is not a tag" + :type :error} :blocks (map #(select-keys % [:db/id :block/title]) (remove ldb/class? child-ents))})))) -(defn- disallow-built-in-class-parent-change +(defn- disallow-built-in-class-extends-change [_parent-ent child-ents] (when (some #(get db-class/built-in-classes (:db/ident %)) child-ents) (throw (ex-info "Can't change the parent of a built-in tag" {:type :notification :payload {:message "Can't change the parent of a built-in tag" - :type :warning}})))) + :type :error}})))) -(defn validate-parent-property +(defn validate-extends-property [parent-ent child-ents] - (disallow-built-in-class-parent-change parent-ent child-ents) - (validate-parent-property-have-same-type parent-ent child-ents)) + (disallow-built-in-class-extends-change parent-ent child-ents) + (validate-extends-property-have-correct-type parent-ent child-ents)) (defn- disallow-node-cant-tag-with-built-in-non-tags [db _block-eids v] diff --git a/deps/outliner/test/logseq/outliner/validate_test.cljs b/deps/outliner/test/logseq/outliner/validate_test.cljs index 630dd15f8c..7b397052b9 100644 --- a/deps/outliner/test/logseq/outliner/validate_test.cljs +++ b/deps/outliner/test/logseq/outliner/validate_test.cljs @@ -65,7 +65,7 @@ (db-test/find-page-by-title @conn "Fruit"))) "Allow class to have same name as a page"))) -(deftest validate-parent-property +(deftest validate-extends-property (let [conn (db-test/create-conn-with-blocks {:properties {:prop1 {:logseq.property/type :default}} :classes {:Class1 {} :Class2 {}} @@ -73,34 +73,30 @@ [{:page {:block/title "page1"}} {:page {:block/title "page2"}}]}) page1 (db-test/find-page-by-title @conn "page1") - page2 (db-test/find-page-by-title @conn "page2") class1 (db-test/find-page-by-title @conn "Class1") class2 (db-test/find-page-by-title @conn "Class2") property (db-test/find-page-by-title @conn "prop1")] (testing "valid parent and child combinations" - (is (nil? (outliner-validate/validate-parent-property page1 [page2])) - "parent page to child page is valid") - (is (nil? (outliner-validate/validate-parent-property class1 [class2])) + (is (nil? (outliner-validate/validate-extends-property class1 [class2])) "parent class to child class is valid")) (testing "invalid parent and child combinations" (are [parent child] (thrown-with-msg? js/Error - #"Can't set" - (outliner-validate/validate-parent-property parent [child])) + #"Can't extend" + (outliner-validate/validate-extends-property parent [child])) class1 page1 page1 class1 - property page1 property class1)) (testing "built-in tag can't have parent changed" (is (thrown-with-msg? js/Error #"Can't change.*built-in" - (outliner-validate/validate-parent-property (entity-plus/entity-memoized @conn :logseq.class/Task) + (outliner-validate/validate-extends-property (entity-plus/entity-memoized @conn :logseq.class/Task) [(entity-plus/entity-memoized @conn :logseq.class/Cards)])))))) (deftest validate-tags-property @@ -172,5 +168,5 @@ (doseq [[parent-id child-id] parent-child-pairs] (let [parent (d/entity @conn parent-id) child (d/entity @conn child-id)] - (is (nil? (#'outliner-validate/validate-parent-property-have-same-type parent [child])) + (is (nil? (#'outliner-validate/validate-extends-property-have-correct-type parent [child])) (str "Parent and child page is valid: " (pr-str (:block/title parent)) " " (pr-str (:block/title child)))))))))) From 8a6de53d09b34cd50fc7cc2ba3f05dc56260bde7 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Thu, 22 May 2025 15:04:44 -0400 Subject: [PATCH 44/67] fix: namespaced pages converted to tags result in invalid graph. This wasn't a use case we supported before and if we do decide to support it should be purposefully done and available from all parts of the UI, not just conversion --- src/main/frontend/components/page_menu.cljs | 2 +- .../frontend/components/property/value.cljs | 2 +- src/main/frontend/handler/db_based/page.cljs | 23 +++++++++++-------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/frontend/components/page_menu.cljs b/src/main/frontend/components/page_menu.cljs index 9a8d8d371b..fcc36d54c5 100644 --- a/src/main/frontend/components/page_menu.cljs +++ b/src/main/frontend/components/page_menu.cljs @@ -151,7 +151,7 @@ (when (and db-based? (ldb/internal-page? page)) {:title (t :page/convert-to-tag) :options {:on-click (fn [] - (db-page-handler/convert-to-tag! page))}}) + (db-page-handler/convert-page-to-tag! page))}}) (when (and db-based? (ldb/class? page) (not (:logseq.property/built-in? page))) {:title (t :page/convert-tag-to-page) diff --git a/src/main/frontend/components/property/value.cljs b/src/main/frontend/components/property/value.cljs index e7d8d5e438..c7667db698 100644 --- a/src/main/frontend/components/property/value.cljs +++ b/src/main/frontend/components/property/value.cljs @@ -608,7 +608,7 @@ (:db/id page))) (and class? page? id) - (p/let [_ (db-page-handler/convert-to-tag! page-entity)] + (p/let [_ (db-page-handler/convert-page-to-tag! page-entity)] id) :else diff --git a/src/main/frontend/handler/db_based/page.cljs b/src/main/frontend/handler/db_based/page.cljs index a0d1cda3f1..40d1ee31c0 100644 --- a/src/main/frontend/handler/db_based/page.cljs +++ b/src/main/frontend/handler/db_based/page.cljs @@ -42,18 +42,21 @@ (when (valid-tag? repo (db/entity repo [:block/uuid block-id]) tag-entity) (db-property-handler/set-block-property! block-id :block/tags (:db/id tag-entity))))) -(defn convert-to-tag! +(defn convert-page-to-tag! "Converts a Page to a Tag" [page-entity] - (if (db/page-exists? (:block/title page-entity) #{:logseq.class/Tag}) - (notification/show! (str "A tag with the name \"" (:block/title page-entity) "\" already exists.") :warning false) - (let [txs [(db-class/build-new-class (db/get-db) - {:db/id (:db/id page-entity) - :block/title (:block/title page-entity) - :block/created-at (:block/created-at page-entity)}) - [:db/retract (:db/id page-entity) :block/tags :logseq.class/Page]]] + (cond (db/page-exists? (:block/title page-entity) #{:logseq.class/Tag}) + (notification/show! (str "A tag with the name \"" (:block/title page-entity) "\" already exists.") :warning false) + (:block/parent page-entity) + (notification/show! "Namespaced pages can't be tags" :error false) + :else + (let [txs [(db-class/build-new-class (db/get-db) + {:db/id (:db/id page-entity) + :block/title (:block/title page-entity) + :block/created-at (:block/created-at page-entity)}) + [:db/retract (:db/id page-entity) :block/tags :logseq.class/Page]]] - (db/transact! (state/get-current-repo) txs {:outliner-op :save-block})))) + (db/transact! (state/get-current-repo) txs {:outliner-op :save-block})))) (defn convert-tag-to-page! [entity] @@ -61,7 +64,7 @@ (notification/show! (str "A page with the name \"" (:block/title entity) "\" already exists.") :warning false) (when-not (:logseq.property/built-in? entity) (if (seq (:logseq.property.class/_extends entity)) - (notification/show! "This tag cannot be converted because it has tag children. All tag children must be removed or converted before converting this tag." :warning false) + (notification/show! "This tag cannot be converted because it has tag children. All tag children must be removed or converted before converting this tag." :error false) (p/let [objects (db-async/ Date: Thu, 22 May 2025 15:46:17 -0400 Subject: [PATCH 45/67] fix: :view-context broken for properties Could add properties to several invalid or nonsensical nodes e.g. Extends to pages or blocks --- src/main/frontend/components/property.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/frontend/components/property.cljs b/src/main/frontend/components/property.cljs index 67d62e6d4f..9b4e98c0e3 100644 --- a/src/main/frontend/components/property.cljs +++ b/src/main/frontend/components/property.cljs @@ -156,7 +156,8 @@ (p/let [repo (state/get-current-repo) properties (if (:class-schema? select-opts) (property-handler/get-class-property-choices) - (db-model/get-all-properties repo {:remove-ui-non-suitable-properties? true})) + (db-model/get-all-properties repo {:remove-ui-non-suitable-properties? true + :block (:block select-opts)})) classes (->> (db-model/get-all-classes repo) (remove ldb/built-in?))] (set-classes! classes) @@ -418,6 +419,7 @@ (shui/popup-hide!)))}] (property-select (merge (:select-opts opts) {:on-chosen on-chosen :input-opts input-opts + :block block :class-schema? class-schema?}))))])) (rum/defcs new-property < rum/reactive From 7497363d6a7254343f859ec686a2fd6151591e48 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 15 Jun 2025 08:33:15 +0800 Subject: [PATCH 46/67] chore: bump schema version --- deps/db/src/logseq/db/frontend/schema.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/db/src/logseq/db/frontend/schema.cljs b/deps/db/src/logseq/db/frontend/schema.cljs index eec1ccbf71..e9dbf863b3 100644 --- a/deps/db/src/logseq/db/frontend/schema.cljs +++ b/deps/db/src/logseq/db/frontend/schema.cljs @@ -37,7 +37,7 @@ (map (juxt :major :minor) [(parse-schema-version x) (parse-schema-version y)]))) -(def version (parse-schema-version "64.10")) +(def version (parse-schema-version "65.1")) (defn major-version "Return a number. From edfd020276f89d9185d6da93389ad0576c5a6a6c Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Sun, 15 Jun 2025 17:09:17 +0800 Subject: [PATCH 47/67] enhance(ux): list pages only on the Library page --- deps/db/src/logseq/db.cljs | 21 +++++++++++++-------- src/main/frontend/components/block.cljs | 5 ++++- src/main/frontend/components/page.cljs | 3 ++- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/deps/db/src/logseq/db.cljs b/deps/db/src/logseq/db.cljs index 1f04ead27a..f7e011e74f 100644 --- a/deps/db/src/logseq/db.cljs +++ b/deps/db/src/logseq/db.cljs @@ -22,6 +22,14 @@ [logseq.db.sqlite.util :as sqlite-util]) (:refer-clojure :exclude [object?])) +(def built-in? entity-util/built-in?) +(def built-in-class-property? db-db/built-in-class-property?) +(def private-built-in-page? db-db/private-built-in-page?) + +(def write-transit-str sqlite-util/write-transit-str) +(def read-transit-str sqlite-util/read-transit-str) +(def build-favorite-tx db-db/build-favorite-tx) + (defonce *transact-fn (atom nil)) (defn register-transact-fn! [f] @@ -248,6 +256,11 @@ (let [id (common-uuid/gen-uuid :builtin-block-uuid title)] (d/entity db [:block/uuid id])))) +(defn library? + [page] + (and (built-in? page) + (= "Library" (:block/title page)))) + (defn get-case-page "Case sensitive version of get-page. For use with DB graphs" [db page-name-or-uuid] @@ -476,14 +489,6 @@ (when-not (hidden-or-internal-tag? e) e)))))) -(def built-in? entity-util/built-in?) -(def built-in-class-property? db-db/built-in-class-property?) -(def private-built-in-page? db-db/private-built-in-page?) - -(def write-transit-str sqlite-util/write-transit-str) -(def read-transit-str sqlite-util/read-transit-str) -(def build-favorite-tx db-db/build-favorite-tx) - (defn get-key-value [db key-ident] (:kv/value (d/entity db key-ident))) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 6af4bf383a..e4eaa69689 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -2117,12 +2117,15 @@ [config block children collapsed?] (let [ref? (:ref? config) query? (:custom-query? config) + library? (:library? config) children (when (coll? children) (let [ref-matched-children-ids (:ref-matched-children-ids config)] (cond->> (remove nil? children) ref-matched-children-ids ;; Block children will not be rendered if the filters do not match them - (filter (fn [b] (ref-matched-children-ids (:db/id b)))))))] + (filter (fn [b] (ref-matched-children-ids (:db/id b)))) + library? + (filter ldb/page?))))] (when (and (coll? children) (seq children) (not collapsed?)) diff --git a/src/main/frontend/components/page.cljs b/src/main/frontend/components/page.cljs index 7704f50dc6..19b235e1a1 100644 --- a/src/main/frontend/components/page.cljs +++ b/src/main/frontend/components/page.cljs @@ -180,7 +180,8 @@ :db/id (:db/id block) :block? block? :editor-box editor/box - :document/mode? document-mode?} + :document/mode? document-mode? + :library? (ldb/library? block)} config) config (common-handler/config-with-document-mode hiccup-config) blocks (if block? [block] (db/sort-by-order children block))] From f442ae82a06c7a0aab53df62277b8f09ef2f433e Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 11:05:22 +0800 Subject: [PATCH 48/67] enhance(ux): able to create pages directly on Library --- deps/outliner/src/logseq/outliner/core.cljs | 14 ++++++++------ deps/outliner/src/logseq/outliner/validate.cljs | 13 ++++++++++++- src/main/frontend/handler/editor.cljs | 17 ++++++++++++----- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/deps/outliner/src/logseq/outliner/core.cljs b/deps/outliner/src/logseq/outliner/core.cljs index d7e572e110..684e03cdee 100644 --- a/deps/outliner/src/logseq/outliner/core.cljs +++ b/deps/outliner/src/logseq/outliner/core.cljs @@ -334,7 +334,7 @@ txs (map (fn [id] [:db.fn/retractEntity [:block/uuid id]]) ids) page-tx (let [block (d/entity db [:block/uuid block-id])] (when (:block/pre-block? block) - (let [id (:db/id (:block/page block))] + (when-let [id (:db/id (:block/page block))] [[:db/retract id :block/properties] [:db/retract id :block/properties-order] [:db/retract id :block/properties-text-values] @@ -531,11 +531,13 @@ (let [ref-ids (set (map :block/uuid (:block/refs block)))] (->> (set/intersection block-ids ref-ids) (remove #{(:block/uuid block)}))))) - m {:db/id (:db/id block) - :block/uuid uuid' - :block/page target-page - :block/parent parent - :block/order order} + m (cond-> + {:db/id (:db/id block) + :block/uuid uuid' + :block/parent parent + :block/order order} + (not (ldb/page? block)) + (assoc :block/page target-page)) result (-> (if (de/entity? block) (assoc m :block/level (:block/level block)) diff --git a/deps/outliner/src/logseq/outliner/validate.cljs b/deps/outliner/src/logseq/outliner/validate.cljs index 34a9b9c91f..b42d237ba9 100644 --- a/deps/outliner/src/logseq/outliner/validate.cljs +++ b/deps/outliner/src/logseq/outliner/validate.cljs @@ -88,10 +88,21 @@ [?b :block/title ?title] [?b :block/tags ?tag-id] [(not= ?b ?eid)] - ;; same parent + ;; same extends [?b :logseq.property.class/extends ?bp] [?eid :logseq.property.class/extends ?ep] [(= ?bp ?ep)]] + (:block/parent entity) + '[:find [?b ...] + :in $ ?eid ?title [?tag-id ...] + :where + [?b :block/title ?title] + [?b :block/tags ?tag-id] + [(not= ?b ?eid)] + ;; same parent + [?b :block/parent ?bp] + [?eid :block/parent ?ep] + [(= ?bp ?ep)]] :else '[:find [?b ...] :in $ ?eid ?title [?tag-id ...] diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index 761761772d..cccc5cf01a 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -336,14 +336,21 @@ true :else - (not has-children?))] + (not has-children?)) + library? (:library? config) + new-block' (if library? + (-> new-block + (-> (assoc :block/tags #{:logseq.class/Page} + :block/name (util/page-name-sanity-lc (:block/title new-block))) + (dissoc :block/page))) + new-block)] (ui-outliner-tx/transact! {:outliner-op :insert-blocks} (save-current-block! {:current-block current-block}) - (outliner-op/insert-blocks! [new-block] current-block {:sibling? sibling? - :keep-uuid? keep-uuid? - :ordered-list? ordered-list? - :replace-empty-target? replace-empty-target?})))) + (outliner-op/insert-blocks! [new-block'] current-block {:sibling? sibling? + :keep-uuid? keep-uuid? + :ordered-list? ordered-list? + :replace-empty-target? replace-empty-target?})))) (defn- block-self-alone-when-insert? [config uuid] From e9df12d452a0ce8190794c0ebad9a5683af11a07 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 14:38:00 +0800 Subject: [PATCH 49/67] fix: add button should create new page instead of new block For the Library page. --- src/main/frontend/components/page.cljs | 21 +++++++++++---------- src/main/frontend/handler/editor.cljs | 12 +++++++----- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/main/frontend/components/page.cljs b/src/main/frontend/components/page.cljs index 19b235e1a1..2b483c3610 100644 --- a/src/main/frontend/components/page.cljs +++ b/src/main/frontend/components/page.cljs @@ -100,11 +100,12 @@ (declare page-cp) (rum/defc add-button - [block container-id] + [block {:keys [container-id] :as config*}] (let [*ref (rum/use-ref nil) has-children? (:block/_parent block) page? (ldb/page? block) - opacity-class (if has-children? "opacity-0" "opacity-50")] + opacity-class (if has-children? "opacity-0" "opacity-50") + config (dissoc config* :page)] (when page? [:div.ls-block.block-add-button.flex-1.flex-col.rounded-sm.cursor-text.transition-opacity.ease-in.duration-100.!py-0 {:class opacity-class @@ -113,8 +114,8 @@ :on-click (fn [e] (util/stop e) (state/set-state! :editor/container-id container-id) - (editor-handler/api-insert-new-block! "" - {:block-uuid (:block/uuid block)})) + (editor-handler/api-insert-new-block! "" (merge config + {:block-uuid (:block/uuid block)}))) :on-mouse-over (fn [] (let [ref (rum/deref *ref) prev-block (util/get-prev-block-non-collapsed (rum/deref *ref) {:up-down? true})] @@ -132,7 +133,7 @@ (util/stop e) (when (= "Enter" (util/ekey e)) (state/set-state! :editor/container-id container-id) - (editor-handler/api-insert-new-block! "" block))) + (editor-handler/api-insert-new-block! "" (merge config block)))) :tab-index 0} [:div.flex.flex-row [:div.flex.items-center {:style {:height 28 @@ -165,13 +166,14 @@ (remove (fn [b] (some? (get b (:db/ident block)))) children) :else - children)] + children) + config (assoc config :library? (ldb/library? block))] (cond (and (not block?) (not config/publishing?) (empty? children) block) - (add-button block (:container-id config)) + (add-button block config) :else (let [document-mode? (state/sub :document/mode?) @@ -180,14 +182,13 @@ :db/id (:db/id block) :block? block? :editor-box editor/box - :document/mode? document-mode? - :library? (ldb/library? block)} + :document/mode? document-mode?} config) config (common-handler/config-with-document-mode hiccup-config) blocks (if block? [block] (db/sort-by-order children block))] [:div.relative (page-blocks-inner block blocks config sidebar? whiteboard? block-id) - (add-button block (:container-id config))]))))) + (add-button block config)]))))) (rum/defc today-queries < rum/reactive [repo today? sidebar?] diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index cccc5cf01a..5254c40b32 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -533,7 +533,8 @@ custom-uuid replace-empty-target? edit-block? ordered-list? other-attrs] :or {sibling? false before? false - edit-block? true}}] + edit-block? true} + :as config}] (when (or page block-uuid) (let [repo (state/get-current-repo) db-based? (config/db-based-graph? repo) @@ -594,10 +595,11 @@ (p/do! (ui-outliner-tx/transact! {:outliner-op :insert-blocks} - (outliner-insert-block! {} block-m new-block {:sibling? sibling? - :keep-uuid? true - :ordered-list? ordered-list? - :replace-empty-target? replace-empty-target?}) + (outliner-insert-block! config block-m new-block + {:sibling? sibling? + :keep-uuid? true + :ordered-list? ordered-list? + :replace-empty-target? replace-empty-target?}) (when (and db-based? (seq properties)) (property-handler/set-block-properties! repo (:block/uuid new-block) properties))) (when edit-block? From ed42ae17b252668d77d5ac3f61e80ed2e5b12aab Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 15:05:13 +0800 Subject: [PATCH 50/67] enhance: able to delete pages from Library --- .../db/src/logseq/db/common/initial_data.cljs | 5 ++- deps/outliner/src/logseq/outliner/core.cljs | 3 +- src/main/frontend/components/block.cljs | 3 +- .../frontend/handler/db_based/recent.cljs | 14 ++++---- src/main/frontend/handler/editor.cljs | 32 +++++++++---------- 5 files changed, 32 insertions(+), 25 deletions(-) diff --git a/deps/db/src/logseq/db/common/initial_data.cljs b/deps/db/src/logseq/db/common/initial_data.cljs index d46f2230ed..8a9744a5f7 100644 --- a/deps/db/src/logseq/db/common/initial_data.cljs +++ b/deps/db/src/logseq/db/common/initial_data.cljs @@ -1,6 +1,7 @@ (ns logseq.db.common.initial-data "Provides db helper fns for graph initialization and lazy loading entities" (:require [clojure.set :as set] + [clojure.string :as string] [datascript.core :as d] [datascript.impl.entity :as de] [logseq.common.config :as common-config] @@ -339,7 +340,9 @@ rseq (keep (fn [datom] (let [e (d/entity db (:e datom))] - (when (and (common-entity-util/page? e) (not (entity-util/hidden? e))) + (when (and (common-entity-util/page? e) + (not (entity-util/hidden? e)) + (not (string/blank? (:block/title e)))) e)))) (take 30))) diff --git a/deps/outliner/src/logseq/outliner/core.cljs b/deps/outliner/src/logseq/outliner/core.cljs index 684e03cdee..38f28e0f91 100644 --- a/deps/outliner/src/logseq/outliner/core.cljs +++ b/deps/outliner/src/logseq/outliner/core.cljs @@ -785,7 +785,8 @@ (let [top-level-blocks (filter-top-level-blocks db blocks) non-consecutive? (and (> (count top-level-blocks) 1) (seq (ldb/get-non-consecutive-blocks db top-level-blocks))) top-level-blocks* (->> (get-top-level-blocks top-level-blocks non-consecutive?) - (remove ldb/page?)) + ;; (remove ldb/page?) + ) top-level-blocks (remove :logseq.property/built-in? top-level-blocks*) txs-state (ds/new-outliner-txs-state) block-ids (map (fn [b] [:block/uuid (:block/uuid b)]) top-level-blocks) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index e4eaa69689..d3d3839ea4 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -2166,7 +2166,8 @@ icon-size (if collapsed? 12 14) icon (icon-component/get-node-icon-cp block {:size icon-size :color? true :link? link?}) with-icon? (and (some? icon) - (or (db/page? block) + (or (and (db/page? block) + (not (:library? config))) (:logseq.property/icon block) link? (some :logseq.property/icon (:block/tags block)) diff --git a/src/main/frontend/handler/db_based/recent.cljs b/src/main/frontend/handler/db_based/recent.cljs index a738fdd791..6a0802e0ca 100644 --- a/src/main/frontend/handler/db_based/recent.cljs +++ b/src/main/frontend/handler/db_based/recent.cljs @@ -1,6 +1,7 @@ (ns frontend.handler.db-based.recent "Fns related to recent pages feature" - (:require [frontend.db :as db] + (:require [clojure.string :as string] + [frontend.db :as db] [frontend.state :as state] [logseq.db :as ldb])) @@ -9,11 +10,12 @@ (assert db-id (number? db-id)) (when-not (:db/restoring? @state/state) (when-let [page (db/entity db-id)] - (let [pages (state/get-recent-pages)] - (when-not (or (ldb/hidden? page) - ((set pages) db-id)) - (let [new-pages (vec (take 15 (distinct (cons db-id pages))))] - (state/set-recent-pages! new-pages))))))) + (when-not (string/blank? (:block/title page)) + (let [pages (state/get-recent-pages)] + (when-not (or (ldb/hidden? page) + ((set pages) db-id)) + (let [new-pages (vec (take 15 (distinct (cons db-id pages))))] + (state/set-recent-pages! new-pages)))))))) (defn get-recent-pages [] diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index 5254c40b32..42335b6ff2 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -1056,23 +1056,23 @@ block-uuids (distinct (map #(uuid (dom/attr % "blockid")) dom-blocks)) lookup-refs (map (fn [id] [:block/uuid id]) block-uuids) blocks (map db/entity lookup-refs) - non-page-blocks (remove ldb/page? blocks) pages (filter ldb/page? blocks) - library-page (ldb/get-built-in-page (db/get-db) "Library") - library-pages (when library-page - (filter #(= (:db/id (:block/parent %)) (:db/id library-page)) pages))] - (if (seq library-pages) - (ui-outliner-tx/transact! - {:outliner-op :save-blocks} - (doseq [page library-pages] - (outliner-op/remove-block-property! (:db/id page) :block/parent))) - (when (seq non-page-blocks) - (let [top-level-blocks (when (seq blocks) (block-handler/get-top-level-blocks non-page-blocks)) - sorted-blocks (mapcat (fn [block] - (tree/get-sorted-block-and-children repo (:db/id block))) - top-level-blocks)] - (when (seq sorted-blocks) - (delete-blocks! repo (map :block/uuid sorted-blocks) sorted-blocks dom-blocks)))))))))) + pages-with-parent (filter :block/parent pages)] + (ui-outliner-tx/transact! + {:outliner-op :delete-blocks} + (doseq [page pages-with-parent] + (outliner-op/remove-block-property! (:db/id page) :block/parent)) + (let [blocks' (if (seq pages-with-parent) + (let [ids (set (map :db/id pages-with-parent))] + (remove (fn [b] (ids (:db/id b))) blocks)) + blocks)] + (when (seq blocks') + (let [top-level-blocks (block-handler/get-top-level-blocks blocks') + sorted-blocks (mapcat (fn [block] + (tree/get-sorted-block-and-children repo (:db/id block))) + top-level-blocks)] + (when (seq sorted-blocks) + (delete-blocks! repo (map :block/uuid sorted-blocks) sorted-blocks dom-blocks))))))))))) (def url-regex "Didn't use link/plain-link as it is incorrectly detects words as urls." From 73db9a2ac8ac197cdc425aadb78558a7941dc992 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 15:10:35 +0800 Subject: [PATCH 51/67] fix: disallow classes and properties on Library --- src/main/frontend/components/block.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index d3d3839ea4..ffe6408822 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -2125,7 +2125,7 @@ ;; Block children will not be rendered if the filters do not match them (filter (fn [b] (ref-matched-children-ids (:db/id b)))) library? - (filter ldb/page?))))] + (filter (fn [b] (and (ldb/page? b) (not (or (ldb/class? b) (ldb/property? b)))))))))] (when (and (coll? children) (seq children) (not collapsed?)) From 2b3e712762b85e7082ba08289bb5657218fe4193 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 15:23:41 +0800 Subject: [PATCH 52/67] fix: delete untitled pages --- src/main/frontend/components/block.cljs | 3 +++ src/main/frontend/handler/db_based/recent.cljs | 5 +++-- src/main/frontend/handler/editor.cljs | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index ffe6408822..0f4ffd6003 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -2451,6 +2451,9 @@ db (db/get-db) query? (ldb/class-instance? (entity-plus/entity-memoized db :logseq.class/Query) block')] (cond + (and (:page-title? config) (ldb/page? block) (string/blank? (:block/title block))) + [:div.opacity-75 "Untitled"] + (:raw-title? config) (text-block-title (dissoc config :raw-title?) block) diff --git a/src/main/frontend/handler/db_based/recent.cljs b/src/main/frontend/handler/db_based/recent.cljs index 6a0802e0ca..56c9b61b9b 100644 --- a/src/main/frontend/handler/db_based/recent.cljs +++ b/src/main/frontend/handler/db_based/recent.cljs @@ -26,5 +26,6 @@ (filter db/page?) (remove ldb/hidden?) (remove (fn [e] - (and (ldb/property? e) - (true? (:logseq.property/hide? e))))))) + (or (and (ldb/property? e) + (true? (:logseq.property/hide? e))) + (string/blank? (:block/title e))))))) diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index 42335b6ff2..75880907a4 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -1057,7 +1057,7 @@ lookup-refs (map (fn [id] [:block/uuid id]) block-uuids) blocks (map db/entity lookup-refs) pages (filter ldb/page? blocks) - pages-with-parent (filter :block/parent pages)] + pages-with-parent (filter (fn [page] (and (:block/parent page) (not (string/blank? (:block/title page))))) pages)] (ui-outliner-tx/transact! {:outliner-op :delete-blocks} (doseq [page pages-with-parent] From 961ab750e9b0c32ca62d1e18f9d47850fbe68fc2 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 15:44:43 +0800 Subject: [PATCH 53/67] fix: untitled page --- src/main/frontend/components/block.cljs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 0f4ffd6003..b5eef4e601 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -673,7 +673,9 @@ page-name (when (:block/title page-entity) (util/page-name-sanity-lc (:block/title page-entity))) config (assoc config :whiteboard-page? whiteboard-page?) - untitled? (when page-name (model/untitled-page? (:block/title page-entity))) + untitled? (when page-name + (or (model/untitled-page? (:block/title page-entity)) + (and (ldb/page? page-entity) (string/blank? (:block/title page-entity))))) show-icon? (:show-icon? config)] [:a.relative (cond-> From 19168f92f7eab525ba79bd1e08c11ec040b6bc41 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 15:50:34 +0800 Subject: [PATCH 54/67] fix: don't validate empty pages for Library pages --- deps/outliner/src/logseq/outliner/core.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deps/outliner/src/logseq/outliner/core.cljs b/deps/outliner/src/logseq/outliner/core.cljs index 38f28e0f91..63cdde9451 100644 --- a/deps/outliner/src/logseq/outliner/core.cljs +++ b/deps/outliner/src/logseq/outliner/core.cljs @@ -261,7 +261,7 @@ (not= block-title (:block/title block-entity))) _ (when (and db-based? page? block-title) (outliner-validate/validate-page-title-characters block-title {:node m*})) - m* (if (and db-based? page-title-changed?) + m* (if (and db-based? page-title-changed? (not (and page? (:block/parent block-entity)))) (let [_ (outliner-validate/validate-page-title (:block/title m*) {:node m*}) page-name (common-util/page-name-sanity-lc (:block/title m*))] (assoc m* :block/name page-name)) From 48c9a17e91a4912a9f917fbb7fa8398d99856d4b Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 15:53:10 +0800 Subject: [PATCH 55/67] fix: misaligned brackets --- src/main/frontend/components/block.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/frontend/components/block.css b/src/main/frontend/components/block.css index 9fc50d827e..ebdd607739 100644 --- a/src/main/frontend/components/block.css +++ b/src/main/frontend/components/block.css @@ -378,7 +378,7 @@ @apply rounded transition-[background]; .bracket { - @apply opacity-30; + @apply opacity-30 inline-flex; } &:hover { From 68640cb4e5641c92637f6682d473100d56c26c0e Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 16:23:55 +0800 Subject: [PATCH 56/67] enhance: display parent page when referencing a page --- src/main/frontend/components/block.cljs | 13 ++++++++++--- src/main/frontend/util.cljc | 5 ++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index b5eef4e601..bdd6efe2f8 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -663,8 +663,9 @@ All page-names are sanitized except page-name-in-block" [state {:keys [contents-page? whiteboard-page? other-position? show-unique-title? stop-click-event? - on-context-menu] - :or {stop-click-event? true} + on-context-menu with-parent?] + :or {stop-click-event? true + with-parent? true} :as config} page-entity children label] (let [*hover? (::hover? state) @@ -732,6 +733,11 @@ :own-icon? true})] [:span {:class (str "icon-emoji-wrap " (when emoji? "as-emoji"))} icon]))) + + (when (and (ldb/page? page-entity) with-parent?) + (when-let [parent (:block/parent page-entity)] + [:span.select-none (str (:block/title parent) "/")])) + [:span (if (and (coll? children) (seq children)) (for [child children] @@ -3239,7 +3245,8 @@ (let [parents-props (doall (for [{:block/keys [uuid name title] :as block} parents] (if name - [block (page-cp {:disable-preview? true} block) true] + [block (page-cp {:disable-preview? true + :with-parent? false} block) true] (let [result (block/parse-title-and-body uuid (get block :block/format :markdown) diff --git a/src/main/frontend/util.cljc b/src/main/frontend/util.cljc index 40086f2edf..063eae5f9c 100644 --- a/src/main/frontend/util.cljc +++ b/src/main/frontend/util.cljc @@ -354,6 +354,9 @@ (gobj/get range "endContainer") (gobj/get range "endOffset")) (let [contents (.cloneContents pre-caret-range) + ;; Remove all `.select-none` nodes + _ (doseq [el (.querySelectorAll contents ".select-none")] + (.remove el)) html (some-> (first (.-childNodes contents)) (gobj/get "innerHTML") str) @@ -365,7 +368,7 @@ (string/ends-with? html "
") ;; multiple lines with a new line (string/ends-with? html "
"))) - value (.toString pre-caret-range)] + value (.-textContent contents)] (if br-ended? (str value "\n") value))))) From b348b031e457e2379fd2d31c97629805a0269e66 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 19:00:53 +0800 Subject: [PATCH 57/67] enhance(ux): able to move existing pages to Library --- deps/shui/src/logseq/shui/base/core.cljs | 7 +-- src/main/frontend/components/library.cljs | 71 +++++++++++++++++++++++ src/main/frontend/components/page.cljs | 4 ++ src/main/frontend/handler/editor.cljs | 7 +++ src/main/frontend/worker/search.cljs | 45 +++++++------- 5 files changed, 109 insertions(+), 25 deletions(-) create mode 100644 src/main/frontend/components/library.cljs diff --git a/deps/shui/src/logseq/shui/base/core.cljs b/deps/shui/src/logseq/shui/base/core.cljs index 2a1aa7b744..1755881086 100644 --- a/deps/shui/src/logseq/shui/base/core.cljs +++ b/deps/shui/src/logseq/shui/base/core.cljs @@ -44,13 +44,12 @@ (apply button-base props' children))) (defn button-icon - [variant icon-name {:keys [icon-props size] :as props} child] - + [variant icon-name {:keys [icon-props button-size] :as props} child] (button - (merge (dissoc props :icon-props :size) + (merge (dissoc props :icon-props :button-size) {:variant variant :data-button :icon - :style (when size {:width size :height size})}) + :style (when button-size {:width button-size :height button-size})}) (tabler-icon/root (name icon-name) (merge {:size 20} icon-props)) child)) diff --git a/src/main/frontend/components/library.cljs b/src/main/frontend/components/library.cljs new file mode 100644 index 0000000000..57e623590d --- /dev/null +++ b/src/main/frontend/components/library.cljs @@ -0,0 +1,71 @@ +(ns frontend.components.library + "Library page" + (:require [clojure.string :as string] + [frontend.components.select :as components-select] + [frontend.db :as db] + [frontend.handler.db-based.property :as db-property-handler] + [frontend.handler.editor :as editor-handler] + [frontend.search :as search] + [frontend.state :as state] + [frontend.ui :as ui] + [logseq.shui.hooks :as hooks] + [logseq.shui.ui :as shui] + [promesa.core :as p] + [rum.core :as rum])) + +(rum/defc select-pages + [library-page] + (let [[result set-result!] (hooks/use-state nil) + [input set-input!] (hooks/use-state "") + [selected-choices set-selected-choices!] (hooks/use-state #{}) + items (map (fn [block] + {:value (:db/id block) + :label (:block/title block)}) + result)] + (hooks/use-effect! + (fn [] + (if (string/blank? input) + (set-result! nil) + (p/let [result (search/block-search (state/get-current-repo) input {:enable-snippet? false + :built-in? false + :page-only? true + :library-page-search? true})] + (set-result! result)))) + [(hooks/use-debounced-value input 200)]) + (components-select/select + {:items items + :extract-fn :label + :extract-chosen-fn :value + :selected-choices selected-choices + :on-chosen (fn [chosen selected?] + (if selected? + (do + (editor-handler/move-blocks! [{:db/id chosen}] library-page false) + (set-selected-choices! (conj selected-choices chosen))) + (do + (db/transact! (state/get-current-repo) + [[:db/retract chosen :block/parent]] + {:outliner-op :save-block}) + (set-selected-choices! (disj selected-choices chosen))))) + :multiple-choices? true + :input-default-placeholder "Add pages" + :show-new-when-not-exact-match? false + :on-input set-input! + :input-opts {:class "!p-1 !text-sm"}}))) + +(rum/defc add-pages + [library-page] + [:div.ls-add-pages.px-1 + (shui/button + {:variant :secondary + :size :sm + :class "text-muted-foreground hover:text-foreground" + :on-click (fn [e] + (shui/popup-show! + (.-target e) + (fn [] + [:div {:style {:min-height 120}} + (select-pages library-page)]) + {:align :start}))} + (ui/icon "plus" {:size 16}) + "Add pages to Library")]) diff --git a/src/main/frontend/components/page.cljs b/src/main/frontend/components/page.cljs index 2b483c3610..32906def90 100644 --- a/src/main/frontend/components/page.cljs +++ b/src/main/frontend/components/page.cljs @@ -8,6 +8,7 @@ [frontend.components.db-based.page :as db-page] [frontend.components.editor :as editor] [frontend.components.file-based.hierarchy :as hierarchy] + [frontend.components.library :as library] [frontend.components.objects :as objects] [frontend.components.plugins :as plugins] [frontend.components.property.config :as property-config] @@ -630,6 +631,9 @@ :preview? preview?}))) (lsp-pagebar-slot)]) + (when (and db-based? (ldb/library? page)) + (library/add-pages page)) + (when (and db-based? sidebar? (ldb/page? page)) [:div.-mb-8 (sidebar-page-properties config page)]) diff --git a/src/main/frontend/handler/editor.cljs b/src/main/frontend/handler/editor.cljs index 75880907a4..a9a185cf0a 100644 --- a/src/main/frontend/handler/editor.cljs +++ b/src/main/frontend/handler/editor.cljs @@ -842,6 +842,13 @@ (delete-block-aux! block) (when edit-block-f (edit-block-f)))))))))))) +(defn move-blocks! + [blocks target sibling?] + (when (seq blocks) + (ui-outliner-tx/transact! + {:outliner-op :move-blocks} + (outliner-op/move-blocks! blocks target sibling?)))) + (defn delete-block! [repo] (delete-block-inner! repo (get-state))) diff --git a/src/main/frontend/worker/search.cljs b/src/main/frontend/worker/search.cljs index 98d11c527e..48f83d989b 100644 --- a/src/main/frontend/worker/search.cljs +++ b/src/main/frontend/worker/search.cljs @@ -273,7 +273,7 @@ DROP TRIGGER IF EXISTS blocks_au; * :limit - Number of result to limit search results. Defaults to 100 * :dev? - Allow all nodes to be seen for development. Defaults to false * :built-in? - Whether to return public built-in nodes for db graphs. Defaults to false" - [repo conn search-db q {:keys [limit page enable-snippet? built-in? dev? page-only?] + [repo conn search-db q {:keys [limit page enable-snippet? built-in? dev? page-only? library-page-search?] :as option :or {enable-snippet? true}}] (when-not (string/blank? q) @@ -308,26 +308,29 @@ DROP TRIGGER IF EXISTS blocks_au; (let [{:keys [id page title snippet]} result block-id (uuid id)] (when-let [block (d/entity @conn [:block/uuid block-id])] - (when (if dev? - true - (if built-in? - (or (not (ldb/built-in? block)) - (not (ldb/private-built-in-page? block)) - (ldb/class? block)) - (or (not (ldb/built-in? block)) - (ldb/class? block)))) - {:db/id (:db/id block) - :block/uuid block-id - :block/title (if (ldb/page? block) - (ldb/get-title-with-parents block) - (or snippet title)) - :block/page (if (common-util/uuid-string? page) - (uuid page) - nil) - :block/tags (seq (map :db/id (:block/tags block))) - :page? (ldb/page? block) - :alias (some-> (first (:block/_alias block)) - (select-keys [:block/uuid :block/title]))})))))) + (when-not (and library-page-search? + (or (:block/parent block) + (not (ldb/internal-page? block)))) ; remove pages that already have parents + (when (if dev? + true + (if built-in? + (or (not (ldb/built-in? block)) + (not (ldb/private-built-in-page? block)) + (ldb/class? block)) + (or (not (ldb/built-in? block)) + (ldb/class? block)))) + {:db/id (:db/id block) + :block/uuid block-id + :block/title (if (ldb/page? block) + (ldb/get-title-with-parents block) + (or snippet title)) + :block/page (if (common-util/uuid-string? page) + (uuid page) + nil) + :block/tags (seq (map :db/id (:block/tags block))) + :page? (ldb/page? block) + :alias (some-> (first (:block/_alias block)) + (select-keys [:block/uuid :block/title]))}))))))) page-or-object-result (filter (fn [b] (or (:page? b) (:block/tags result))) result)] (->> (concat page-or-object-result From 5c506e340acbd8ab4b10f1341201c943e99a778f Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 19:51:12 +0800 Subject: [PATCH 58/67] fix: lint --- .../src/logseq/outliner/validate.cljs | 84 ++++++++++--------- src/main/frontend/components/library.cljs | 1 - 2 files changed, 44 insertions(+), 41 deletions(-) diff --git a/deps/outliner/src/logseq/outliner/validate.cljs b/deps/outliner/src/logseq/outliner/validate.cljs index b42d237ba9..ae56e5e2ec 100644 --- a/deps/outliner/src/logseq/outliner/validate.cljs +++ b/deps/outliner/src/logseq/outliner/validate.cljs @@ -65,51 +65,55 @@ (string/join ns-util/parent-char)))) :type :warning}})))) +(defn- another-id-q + [entity] + (cond + (ldb/property? entity) + ;; Property names are unique in that they can + ;; have the same names as built-in property names + '[:find [?b ...] + :in $ ?eid ?title [?tag-id ...] + :where + [?b :block/title ?title] + [?b :block/tags ?tag-id] + [(missing? $ ?b :logseq.property/built-in?)] + [(not= ?b ?eid)]] + (:logseq.property.class/extends entity) + '[:find [?b ...] + :in $ ?eid ?title [?tag-id ...] + :where + [?b :block/title ?title] + [?b :block/tags ?tag-id] + [(not= ?b ?eid)] + ;; same extends + [?b :logseq.property.class/extends ?bp] + [?eid :logseq.property.class/extends ?ep] + [(= ?bp ?ep)]] + (:block/parent entity) + '[:find [?b ...] + :in $ ?eid ?title [?tag-id ...] + :where + [?b :block/title ?title] + [?b :block/tags ?tag-id] + [(not= ?b ?eid)] + ;; same parent + [?b :block/parent ?bp] + [?eid :block/parent ?ep] + [(= ?bp ?ep)]] + :else + '[:find [?b ...] + :in $ ?eid ?title [?tag-id ...] + :where + [?b :block/title ?title] + [?b :block/tags ?tag-id] + [(not= ?b ?eid)]])) + (defn- validate-unique-for-page [db new-title {:block/keys [tags] :as entity}] (cond (seq tags) (when-let [another-id (first - (d/q (cond - (ldb/property? entity) - ;; Property names are unique in that they can - ;; have the same names as built-in property names - '[:find [?b ...] - :in $ ?eid ?title [?tag-id ...] - :where - [?b :block/title ?title] - [?b :block/tags ?tag-id] - [(missing? $ ?b :logseq.property/built-in?)] - [(not= ?b ?eid)]] - (:logseq.property.class/extends entity) - '[:find [?b ...] - :in $ ?eid ?title [?tag-id ...] - :where - [?b :block/title ?title] - [?b :block/tags ?tag-id] - [(not= ?b ?eid)] - ;; same extends - [?b :logseq.property.class/extends ?bp] - [?eid :logseq.property.class/extends ?ep] - [(= ?bp ?ep)]] - (:block/parent entity) - '[:find [?b ...] - :in $ ?eid ?title [?tag-id ...] - :where - [?b :block/title ?title] - [?b :block/tags ?tag-id] - [(not= ?b ?eid)] - ;; same parent - [?b :block/parent ?bp] - [?eid :block/parent ?ep] - [(= ?bp ?ep)]] - :else - '[:find [?b ...] - :in $ ?eid ?title [?tag-id ...] - :where - [?b :block/title ?title] - [?b :block/tags ?tag-id] - [(not= ?b ?eid)]]) + (d/q (another-id-q entity) db (:db/id entity) new-title diff --git a/src/main/frontend/components/library.cljs b/src/main/frontend/components/library.cljs index 57e623590d..2f164eceb4 100644 --- a/src/main/frontend/components/library.cljs +++ b/src/main/frontend/components/library.cljs @@ -3,7 +3,6 @@ (:require [clojure.string :as string] [frontend.components.select :as components-select] [frontend.db :as db] - [frontend.handler.db-based.property :as db-property-handler] [frontend.handler.editor :as editor-handler] [frontend.search :as search] [frontend.state :as state] From bb083b45ead7ea800b4dc4fef744fdabe8e24811 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 19:55:45 +0800 Subject: [PATCH 59/67] style tweaks --- src/main/frontend/components/header.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/frontend/components/header.css b/src/main/frontend/components/header.css index 088fcee2b2..7999fe0874 100644 --- a/src/main/frontend/components/header.css +++ b/src/main/frontend/components/header.css @@ -328,7 +328,7 @@ html.is-zoomed-native-ios { .cp__header { .ls-block-breadcrumb { - @apply text-sm pl-2; + @apply text-sm pl-4; } .breadcrumb { @apply flex items-center; From bb46a4832219009ca6c4aa3035941b7648034947 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 20:42:53 +0800 Subject: [PATCH 60/67] fix: pages shouldn't have :block/page attribute --- deps/outliner/src/logseq/outliner/core.cljs | 14 ++++++-------- src/main/frontend/components/block.cljs | 3 ++- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/deps/outliner/src/logseq/outliner/core.cljs b/deps/outliner/src/logseq/outliner/core.cljs index 63cdde9451..010feb6803 100644 --- a/deps/outliner/src/logseq/outliner/core.cljs +++ b/deps/outliner/src/logseq/outliner/core.cljs @@ -621,7 +621,6 @@ :else [block sibling?]) - ;; sibling? (if (ldb/page? block) false sibling?) block (if (de/entity? block) block (d/entity db (:db/id block)))] [block sibling?]))) @@ -695,7 +694,6 @@ blocks) [target-block sibling?] (get-target-block db blocks target-block opts) _ (assert (some? target-block) (str "Invalid target: " target-block)) - ;; sibling? (if (ldb/page? target-block) false sibling?) replace-empty-target? (if (and (some? replace-empty-target?) (:block/title target-block) (string/blank? (:block/title target-block))) @@ -784,9 +782,7 @@ [db blocks] (let [top-level-blocks (filter-top-level-blocks db blocks) non-consecutive? (and (> (count top-level-blocks) 1) (seq (ldb/get-non-consecutive-blocks db top-level-blocks))) - top-level-blocks* (->> (get-top-level-blocks top-level-blocks non-consecutive?) - ;; (remove ldb/page?) - ) + top-level-blocks* (get-top-level-blocks top-level-blocks non-consecutive?) top-level-blocks (remove :logseq.property/built-in? top-level-blocks*) txs-state (ds/new-outliner-txs-state) block-ids (map (fn [b] [:block/uuid (:block/uuid b)]) top-level-blocks) @@ -854,8 +850,11 @@ (assoc :block/page target-page))] children-page-tx (when not-same-page? (let [children-ids (ldb/get-block-children-ids db (:block/uuid block))] - (map (fn [id] {:block/uuid id - :block/page target-page}) children-ids))) + (keep (fn [id] + (let [child (d/entity db [:block/uuid id])] + (when-not (ldb/page? child) + {:block/uuid id + :block/page target-page}))) children-ids))) target-from-property (:logseq.property/created-from-property target-block) block-from-property (:logseq.property/created-from-property block) property-tx (let [retract-property-tx (when block-from-property @@ -996,7 +995,6 @@ :indent? false}))) (when parent - ;; (and parent (not (ldb/page? (d/entity db (:db/id parent))))) (let [blocks' (take-while (fn [b] (not= (:db/id (:block/parent b)) (:db/id (:block/parent parent)))) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index bdd6efe2f8..64359f783e 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -736,7 +736,8 @@ (when (and (ldb/page? page-entity) with-parent?) (when-let [parent (:block/parent page-entity)] - [:span.select-none (str (:block/title parent) "/")])) + (when-not (ldb/library? parent) + [:span.select-none (str (:block/title parent) "/")]))) [:span (if (and (coll? children) (seq children)) From 3fc6710f0648de57631d49ec3f29caadbbe98bb8 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 21:05:40 +0800 Subject: [PATCH 61/67] enhance(ux): add pages to the bottom of Library page --- src/main/frontend/components/library.cljs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/frontend/components/library.cljs b/src/main/frontend/components/library.cljs index 2f164eceb4..e121a194c3 100644 --- a/src/main/frontend/components/library.cljs +++ b/src/main/frontend/components/library.cljs @@ -7,6 +7,7 @@ [frontend.search :as search] [frontend.state :as state] [frontend.ui :as ui] + [logseq.db :as ldb] [logseq.shui.hooks :as hooks] [logseq.shui.ui :as shui] [promesa.core :as p] @@ -38,8 +39,12 @@ :selected-choices selected-choices :on-chosen (fn [chosen selected?] (if selected? - (do - (editor-handler/move-blocks! [{:db/id chosen}] library-page false) + (let [last-child (->> (:block/_parent (db/entity (:db/id library-page))) + ldb/sort-by-order + last) + target (or last-child library-page) + sibling? (some? last-child)] + (editor-handler/move-blocks! [{:db/id chosen}] target sibling?) (set-selected-choices! (conj selected-choices chosen))) (do (db/transact! (state/get-current-repo) From 9ea07091d925a8ee285dceaf3f3743129c85e68d Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Mon, 16 Jun 2025 21:23:38 +0800 Subject: [PATCH 62/67] fix: show page title without parent in cmdk result Its parent will be included in the breadcrumb. --- src/main/frontend/components/cmdk/core.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/frontend/components/cmdk/core.cljs b/src/main/frontend/components/cmdk/core.cljs index 49ae19e7fa..8d2d1be2ab 100644 --- a/src/main/frontend/components/cmdk/core.cljs +++ b/src/main/frontend/components/cmdk/core.cljs @@ -295,7 +295,7 @@ source-page (or (model/get-alias-source-page repo (:db/id entity)) (:alias page)) icon (get-page-icon entity) - title (block-handler/block-unique-title page) + title (block-handler/block-unique-title (or entity page)) title' (if source-page (str title " -> alias: " (:block/title source-page)) title)] (hash-map :icon icon :icon-theme :gray From 51d0cf520770deb652eef93b54e130f5c1b0555c Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Tue, 17 Jun 2025 19:59:33 +0800 Subject: [PATCH 63/67] fix: ordered list number on Library page --- src/main/frontend/handler/block.cljs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/frontend/handler/block.cljs b/src/main/frontend/handler/block.cljs index bf578be509..d09270082a 100644 --- a/src/main/frontend/handler/block.cljs +++ b/src/main/frontend/handler/block.cljs @@ -77,14 +77,13 @@ (= type order-list-type))) prev-block-fn #(some-> (db/entity (:db/id %)) ldb/get-left-sibling) prev-block (prev-block-fn block)] - (letfn [(page-fn? [b] (some-> b :block/name some?)) - (order-sibling-list [b] + (letfn [(order-sibling-list [b] (lazy-seq - (when (and (not (page-fn? b)) (order-block-fn? b)) + (when (order-block-fn? b) (cons b (order-sibling-list (prev-block-fn b)))))) (order-parent-list [b] (lazy-seq - (when (and (not (page-fn? b)) (order-block-fn? b)) + (when (order-block-fn? b) (cons b (order-parent-list (db-model/get-block-parent (:block/uuid b)))))))] (let [idx (if prev-block (count (order-sibling-list block)) 1) From a84b648fbf411ca64ac60e4eb398028c6b892857 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Tue, 17 Jun 2025 20:15:25 +0800 Subject: [PATCH 64/67] fix: block breadcrumb in cmdk results --- src/main/frontend/components/cmdk/core.cljs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/frontend/components/cmdk/core.cljs b/src/main/frontend/components/cmdk/core.cljs index 8d2d1be2ab..36be47f2cb 100644 --- a/src/main/frontend/components/cmdk/core.cljs +++ b/src/main/frontend/components/cmdk/core.cljs @@ -314,8 +314,8 @@ {:icon icon :icon-theme :gray :text (highlight-content-query text @!input) - :header (when (:block/parent block) (block/breadcrumb {:disable-preview? true - :search? true} repo id {})) + :header (block/breadcrumb {:disable-preview? true + :search? true} repo id {}) :current-page? (when-let [page-id (:block/page block)] (= page-id (:block/uuid current-page))) :source-block block})) From 37741d856e993b54779417f0b5038d17b518efa1 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Tue, 17 Jun 2025 20:29:15 +0800 Subject: [PATCH 65/67] fix: align start node icon --- src/main/frontend/components/block.cljs | 4 ++-- src/main/frontend/components/cmdk/list_item.cljs | 2 +- src/main/frontend/components/editor.cljs | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index 027bb40900..b7982adcf8 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -3285,7 +3285,7 @@ (rum/defc breadcrumb [config repo block-id {:keys [_show-page? _indent? _end-separator? _navigating-block] :as opts}] - (let [[block set-block!] (hooks/use-state (db/entity [:block/uuid block-id]))] + (let [[block set-block!] (hooks/use-state nil)] (hooks/use-effect! (fn [] (p/let [block (db-async/ Date: Wed, 18 Jun 2025 08:25:47 +0800 Subject: [PATCH 66/67] enhance: put library page name to config to make it easier to rename --- deps/common/src/logseq/common/config.cljs | 1 + deps/db/src/logseq/db.cljs | 3 ++- deps/db/src/logseq/db/frontend/db.cljs | 3 ++- deps/db/src/logseq/db/sqlite/create_graph.cljs | 3 ++- deps/graph-parser/src/logseq/graph_parser/exporter.cljs | 4 ++-- src/main/frontend/components/container.cljs | 4 +++- src/main/frontend/worker/db/migrate.cljs | 5 +++-- src/main/frontend/worker/handler/page/db_based/page.cljs | 3 ++- .../frontend/worker/handler/page/db_based/page_test.cljs | 7 ++++--- src/test/frontend/worker/migrate_test.cljs | 6 ++++-- 10 files changed, 25 insertions(+), 14 deletions(-) diff --git a/deps/common/src/logseq/common/config.cljs b/deps/common/src/logseq/common/config.cljs index 2b9d932393..570be62878 100644 --- a/deps/common/src/logseq/common/config.cljs +++ b/deps/common/src/logseq/common/config.cljs @@ -34,6 +34,7 @@ (defonce favorites-page-name "$$$favorites") (defonce views-page-name "$$$views") +(defonce library-page-name "Library") (defn local-asset? [s] diff --git a/deps/db/src/logseq/db.cljs b/deps/db/src/logseq/db.cljs index f7e011e74f..211d19ad63 100644 --- a/deps/db/src/logseq/db.cljs +++ b/deps/db/src/logseq/db.cljs @@ -7,6 +7,7 @@ [clojure.walk :as walk] [datascript.core :as d] [datascript.impl.entity :as de] + [logseq.common.config :as common-config] [logseq.common.util :as common-util] [logseq.common.uuid :as common-uuid] [logseq.db.common.delete-blocks :as delete-blocks] ;; Load entity extensions @@ -259,7 +260,7 @@ (defn library? [page] (and (built-in? page) - (= "Library" (:block/title page)))) + (= common-config/library-page-name (:block/title page)))) (defn get-case-page "Case sensitive version of get-page. For use with DB graphs" diff --git a/deps/db/src/logseq/db/frontend/db.cljs b/deps/db/src/logseq/db/frontend/db.cljs index 2119651d02..a1495ca1ec 100644 --- a/deps/db/src/logseq/db/frontend/db.cljs +++ b/deps/db/src/logseq/db/frontend/db.cljs @@ -3,6 +3,7 @@ (:require [clojure.set :as set] [clojure.string :as string] [datascript.core :as d] + [logseq.common.config :as common-config] [logseq.common.util.namespace :as ns-util] [logseq.common.util.page-ref :as page-ref] [logseq.db.frontend.class :as db-class] @@ -83,7 +84,7 @@ (entity-util/page? entity) (let [parents' (->> (get-page-parents entity) (remove (fn [e] - (and (:logseq.property/built-in? e) (= "Library" (:block/title e))))))] + (and (:logseq.property/built-in? e) (= common-config/library-page-name (:block/title e))))))] (string/join ns-util/parent-char (map :block/title (conj (vec parents') entity)))) diff --git a/deps/db/src/logseq/db/sqlite/create_graph.cljs b/deps/db/src/logseq/db/sqlite/create_graph.cljs index d0b4ccbc48..682ca862d2 100644 --- a/deps/db/src/logseq/db/sqlite/create_graph.cljs +++ b/deps/db/src/logseq/db/sqlite/create_graph.cljs @@ -128,7 +128,8 @@ :properties (filter entity-util/property? properties-tx)})) (def built-in-pages-names - #{"Library" "Contents"}) + #{common-config/library-page-name + "Contents"}) (defn- validate-tx-for-duplicate-idents [tx] (when-let [conflicting-idents diff --git a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs index 068395ec96..76c4f1e0f3 100644 --- a/deps/graph-parser/src/logseq/graph_parser/exporter.cljs +++ b/deps/graph-parser/src/logseq/graph_parser/exporter.cljs @@ -431,7 +431,7 @@ (set (->> db-class/built-in-classes vals (map :title) - (concat ["Library"]) + (concat [common-config/library-page-name]) (map #(-> % string/lower-case keyword)))))) (def file-built-in-property-names @@ -1746,7 +1746,7 @@ (defn- move-top-parent-pages-to-library [conn repo-or-conn] (let [db @conn - library-page (ldb/get-built-in-page db "Library") + library-page (ldb/get-built-in-page db common-config/library-page-name) library-id (:block/uuid library-page) top-parent-pages (->> (d/datoms db :avet :block/parent) (keep (fn [d] diff --git a/src/main/frontend/components/container.cljs b/src/main/frontend/components/container.cljs index 79418f9093..8a789db8c5 100644 --- a/src/main/frontend/components/container.cljs +++ b/src/main/frontend/components/container.cljs @@ -48,6 +48,7 @@ [frontend.version :refer [version]] [goog.dom :as gdom] [goog.object :as gobj] + [logseq.common.config :as common-config] [logseq.common.path :as path] [logseq.common.util.namespace :as ns-util] [logseq.db :as ldb] @@ -159,7 +160,8 @@ (if (and parent (not (or (ldb/class? page) (and (:logseq.property/built-in? parent) - (= (:block/title parent) "Library"))))) + (= (:block/title parent) + common-config/library-page-name))))) (str (:block/title parent) ns-util/parent-char title') title')))] diff --git a/src/main/frontend/worker/db/migrate.cljs b/src/main/frontend/worker/db/migrate.cljs index 8f5704acab..9b693ee8b4 100644 --- a/src/main/frontend/worker/db/migrate.cljs +++ b/src/main/frontend/worker/db/migrate.cljs @@ -5,6 +5,7 @@ [datascript.core :as d] [datascript.impl.entity :as de] [frontend.worker.util :as worker-util] + [logseq.common.config :as common-config] [logseq.common.util :as common-util] [logseq.db :as ldb] [logseq.db.common.order :as db-order] @@ -160,9 +161,9 @@ [[:db/retract id old-p] [:db/add id new-p' prop-value]]))}) rename-property-tx (f conn) - library-page (if-let [page (ldb/get-built-in-page db "Library")] + library-page (if-let [page (ldb/get-built-in-page db common-config/library-page-name)] page - (-> (sqlite-util/build-new-page "Library") + (-> (sqlite-util/build-new-page common-config/library-page-name) sqlite-create-graph/mark-block-as-built-in)) library-id (:block/uuid library-page) library-page-tx (when-not (de/entity? library-page) diff --git a/src/main/frontend/worker/handler/page/db_based/page.cljs b/src/main/frontend/worker/handler/page/db_based/page.cljs index 8933350db6..e574340d37 100644 --- a/src/main/frontend/worker/handler/page/db_based/page.cljs +++ b/src/main/frontend/worker/handler/page/db_based/page.cljs @@ -3,6 +3,7 @@ (:require [clojure.string :as string] [datascript.core :as d] [datascript.impl.entity :as de] + [logseq.common.config :as common-config] [logseq.common.util :as common-util] [logseq.common.util.namespace :as ns-util] [logseq.db :as ldb] @@ -94,7 +95,7 @@ (defn- page-with-parent-and-order "Apply to namespace pages" [db page & {:keys [parent]}] - (let [library (ldb/get-built-in-page db "Library")] + (let [library (ldb/get-built-in-page db common-config/library-page-name)] (when (nil? library) (throw (ex-info "Library page doesn't exist" {}))) (assoc page diff --git a/src/test/frontend/worker/handler/page/db_based/page_test.cljs b/src/test/frontend/worker/handler/page/db_based/page_test.cljs index 923c8d2dfa..34e1ea5e88 100644 --- a/src/test/frontend/worker/handler/page/db_based/page_test.cljs +++ b/src/test/frontend/worker/handler/page/db_based/page_test.cljs @@ -2,9 +2,10 @@ (:require [cljs.test :refer [deftest is testing]] [datascript.core :as d] [frontend.worker.handler.page.db-based.page :as worker-db-page] + [logseq.common.config :as common-config] [logseq.db :as ldb] - [logseq.db.test.helper :as db-test] - [logseq.db.frontend.db :as db-db])) + [logseq.db.frontend.db :as db-db] + [logseq.db.test.helper :as db-test])) (deftest create-class (let [conn (db-test/create-conn) @@ -32,7 +33,7 @@ ;; Create a child page for a class [_ child-uuid3] (worker-db-page/create! conn "c1/c2" {:split-namespace? true :class? true}) child-page3 (d/entity @conn [:block/uuid child-uuid3]) - library (ldb/get-built-in-page @conn "Library") + library (ldb/get-built-in-page @conn common-config/library-page-name) bar (ldb/get-page @conn "bar")] (is (= ["foo"] (map :block/title (:block/_parent library))) "Namespace (non-class) pages are added to the Library page") diff --git a/src/test/frontend/worker/migrate_test.cljs b/src/test/frontend/worker/migrate_test.cljs index dcbc5cef93..a662e3b044 100644 --- a/src/test/frontend/worker/migrate_test.cljs +++ b/src/test/frontend/worker/migrate_test.cljs @@ -1,8 +1,10 @@ (ns frontend.worker.migrate-test (:require ["fs" :as fs-node] [cljs.test :refer [deftest is testing]] + [clojure.string :as string] [datascript.core :as d] [frontend.worker.db.migrate :as db-migrate] + [logseq.common.config :as common-config] [logseq.db :as ldb])) (deftest test-fix-rename-parent-to-extends @@ -68,8 +70,8 @@ [:db/add 141 :logseq.property.class/extends 1] [:db/retract 137 :logseq.property/parent] [:db/add 137 :logseq.property.class/extends 1] - {:block/name "library", - :block/title "Library", + {:block/name (string/lower-case common-config/library-page-name), + :block/title common-config/library-page-name, :block/uuid #uuid "00000004-1294-7765-6000-000000000000", :block/tags #{:logseq.class/Page}, :logseq.property/built-in? true} From 2663694717fce51b5dfe7394a0aa58ee54fee46e Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Wed, 18 Jun 2025 08:30:44 +0800 Subject: [PATCH 67/67] enhance(ux): don't show child page properties on Library --- src/main/frontend/components/block.cljs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/frontend/components/block.cljs b/src/main/frontend/components/block.cljs index b7982adcf8..5e61e108c4 100644 --- a/src/main/frontend/components/block.cljs +++ b/src/main/frontend/components/block.cljs @@ -3700,6 +3700,7 @@ (block-right-menu config block editing?))]) (when (and db-based? + (not (:library? config)) (or (:tag-dialog? config) (and (not collapsed?)