@quartz-community/note-properties 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,21 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ### Added
11
+
12
+ - Initial Quartz community plugin template.
13
+
14
+ ### Fixed
15
+
16
+ - Frontmatter wikilinks containing spaces are now correctly slugified instead of rendering with `%20` in the href. `[[My Note]]` in a frontmatter property now renders as `./my-note` instead of `./My%20Note`.
17
+
18
+ ### Changed
19
+
20
+ - **BREAKING (inherited from `@quartz-community/utils`)**: tag URLs and frontmatter-wikilink slugs are now lowercased to match Obsidian's case-insensitive matching. Tags `#MyTag`, `#mytag`, and `#MYTAG` collapse into a single tag page `tags/mytag`.
21
+ - Replaced the plugin's local slugification helpers with the shared `@quartz-community/utils` versions to eliminate drift across the Quartz ecosystem.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Quartz Community
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # @quartz-community/note-properties
2
+
3
+ Parses frontmatter properties and renders them as a visible properties view on the page, similar to Obsidian's properties panel.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npx quartz plugin add github:quartz-community/note-properties
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ This plugin serves as both a **transformer** (parsing frontmatter) and a **component** (displaying the properties view).
14
+
15
+ ```yaml title="quartz.config.yaml"
16
+ plugins:
17
+ # Transformer (parses frontmatter)
18
+ - source: github:quartz-community/note-properties
19
+ enabled: true
20
+ options:
21
+ includeAll: false
22
+ includedProperties:
23
+ - description
24
+ - tags
25
+ - aliases
26
+ excludedProperties: []
27
+ hidePropertiesView: false
28
+ delimiters: "---"
29
+ language: yaml
30
+
31
+ # Component (displays properties in the page layout)
32
+ - source: github:quartz-community/note-properties
33
+ enabled: true
34
+ layout:
35
+ position: beforeBody
36
+ priority: 15
37
+ ```
38
+
39
+ For advanced use cases, you can override in TypeScript:
40
+
41
+ ```ts title="quartz.ts (override)"
42
+ import * as ExternalPlugin from "./.quartz/plugins";
43
+
44
+ ExternalPlugin.NoteProperties({
45
+ includeAll: false,
46
+ includedProperties: ["description", "tags", "aliases"],
47
+ excludedProperties: [],
48
+ hidePropertiesView: false,
49
+ delimiters: "---",
50
+ language: "yaml",
51
+ });
52
+ ```
53
+
54
+ ## Configuration
55
+
56
+ | Option | Type | Default | Description |
57
+ | -------------------- | ---------- | ------------------------------------ | --------------------------------------------------------- |
58
+ | `includeAll` | `boolean` | `false` | Whether to include all frontmatter properties. |
59
+ | `includedProperties` | `string[]` | `["description", "tags", "aliases"]` | Properties to include when `includeAll` is `false`. |
60
+ | `excludedProperties` | `string[]` | `[]` | Properties to exclude when `includeAll` is `true`. |
61
+ | `hidePropertiesView` | `boolean` | `false` | Whether to hide the rendered properties view on the page. |
62
+ | `delimiters` | `string` | `"---"` | The frontmatter delimiter style. |
63
+ | `language` | `string` | `"yaml"` | The frontmatter language (`"yaml"` or `"toml"`). |
64
+
65
+ ## Documentation
66
+
67
+ See the [Quartz documentation](https://quartz.jzhao.xyz/plugins/Frontmatter) for more information.
68
+
69
+ ## License
70
+
71
+ MIT
@@ -0,0 +1,8 @@
1
+ import { QuartzComponent } from '@quartz-community/types';
2
+
3
+ interface NotePropertiesComponentOptions {
4
+ collapsed?: boolean;
5
+ }
6
+ declare const _default: (opts?: NotePropertiesComponentOptions) => QuartzComponent;
7
+
8
+ export { _default as NotePropertiesComponent, type NotePropertiesComponentOptions };
@@ -0,0 +1,329 @@
1
+ import { createRequire } from 'module';
2
+
3
+ createRequire(import.meta.url);
4
+
5
+ // node_modules/@quartz-community/utils/dist/lang.js
6
+ function classNames(...classes) {
7
+ return classes.filter(Boolean).join(" ");
8
+ }
9
+
10
+ // node_modules/github-slugger/regex.js
11
+ var regex = /[\0-\x1F!-,\.\/:-@\[-\^`\{-\xA9\xAB-\xB4\xB6-\xB9\xBB-\xBF\xD7\xF7\u02C2-\u02C5\u02D2-\u02DF\u02E5-\u02EB\u02ED\u02EF-\u02FF\u0375\u0378\u0379\u037E\u0380-\u0385\u0387\u038B\u038D\u03A2\u03F6\u0482\u0530\u0557\u0558\u055A-\u055F\u0589-\u0590\u05BE\u05C0\u05C3\u05C6\u05C8-\u05CF\u05EB-\u05EE\u05F3-\u060F\u061B-\u061F\u066A-\u066D\u06D4\u06DD\u06DE\u06E9\u06FD\u06FE\u0700-\u070F\u074B\u074C\u07B2-\u07BF\u07F6-\u07F9\u07FB\u07FC\u07FE\u07FF\u082E-\u083F\u085C-\u085F\u086B-\u089F\u08B5\u08C8-\u08D2\u08E2\u0964\u0965\u0970\u0984\u098D\u098E\u0991\u0992\u09A9\u09B1\u09B3-\u09B5\u09BA\u09BB\u09C5\u09C6\u09C9\u09CA\u09CF-\u09D6\u09D8-\u09DB\u09DE\u09E4\u09E5\u09F2-\u09FB\u09FD\u09FF\u0A00\u0A04\u0A0B-\u0A0E\u0A11\u0A12\u0A29\u0A31\u0A34\u0A37\u0A3A\u0A3B\u0A3D\u0A43-\u0A46\u0A49\u0A4A\u0A4E-\u0A50\u0A52-\u0A58\u0A5D\u0A5F-\u0A65\u0A76-\u0A80\u0A84\u0A8E\u0A92\u0AA9\u0AB1\u0AB4\u0ABA\u0ABB\u0AC6\u0ACA\u0ACE\u0ACF\u0AD1-\u0ADF\u0AE4\u0AE5\u0AF0-\u0AF8\u0B00\u0B04\u0B0D\u0B0E\u0B11\u0B12\u0B29\u0B31\u0B34\u0B3A\u0B3B\u0B45\u0B46\u0B49\u0B4A\u0B4E-\u0B54\u0B58-\u0B5B\u0B5E\u0B64\u0B65\u0B70\u0B72-\u0B81\u0B84\u0B8B-\u0B8D\u0B91\u0B96-\u0B98\u0B9B\u0B9D\u0BA0-\u0BA2\u0BA5-\u0BA7\u0BAB-\u0BAD\u0BBA-\u0BBD\u0BC3-\u0BC5\u0BC9\u0BCE\u0BCF\u0BD1-\u0BD6\u0BD8-\u0BE5\u0BF0-\u0BFF\u0C0D\u0C11\u0C29\u0C3A-\u0C3C\u0C45\u0C49\u0C4E-\u0C54\u0C57\u0C5B-\u0C5F\u0C64\u0C65\u0C70-\u0C7F\u0C84\u0C8D\u0C91\u0CA9\u0CB4\u0CBA\u0CBB\u0CC5\u0CC9\u0CCE-\u0CD4\u0CD7-\u0CDD\u0CDF\u0CE4\u0CE5\u0CF0\u0CF3-\u0CFF\u0D0D\u0D11\u0D45\u0D49\u0D4F-\u0D53\u0D58-\u0D5E\u0D64\u0D65\u0D70-\u0D79\u0D80\u0D84\u0D97-\u0D99\u0DB2\u0DBC\u0DBE\u0DBF\u0DC7-\u0DC9\u0DCB-\u0DCE\u0DD5\u0DD7\u0DE0-\u0DE5\u0DF0\u0DF1\u0DF4-\u0E00\u0E3B-\u0E3F\u0E4F\u0E5A-\u0E80\u0E83\u0E85\u0E8B\u0EA4\u0EA6\u0EBE\u0EBF\u0EC5\u0EC7\u0ECE\u0ECF\u0EDA\u0EDB\u0EE0-\u0EFF\u0F01-\u0F17\u0F1A-\u0F1F\u0F2A-\u0F34\u0F36\u0F38\u0F3A-\u0F3D\u0F48\u0F6D-\u0F70\u0F85\u0F98\u0FBD-\u0FC5\u0FC7-\u0FFF\u104A-\u104F\u109E\u109F\u10C6\u10C8-\u10CC\u10CE\u10CF\u10FB\u1249\u124E\u124F\u1257\u1259\u125E\u125F\u1289\u128E\u128F\u12B1\u12B6\u12B7\u12BF\u12C1\u12C6\u12C7\u12D7\u1311\u1316\u1317\u135B\u135C\u1360-\u137F\u1390-\u139F\u13F6\u13F7\u13FE-\u1400\u166D\u166E\u1680\u169B-\u169F\u16EB-\u16ED\u16F9-\u16FF\u170D\u1715-\u171F\u1735-\u173F\u1754-\u175F\u176D\u1771\u1774-\u177F\u17D4-\u17D6\u17D8-\u17DB\u17DE\u17DF\u17EA-\u180A\u180E\u180F\u181A-\u181F\u1879-\u187F\u18AB-\u18AF\u18F6-\u18FF\u191F\u192C-\u192F\u193C-\u1945\u196E\u196F\u1975-\u197F\u19AC-\u19AF\u19CA-\u19CF\u19DA-\u19FF\u1A1C-\u1A1F\u1A5F\u1A7D\u1A7E\u1A8A-\u1A8F\u1A9A-\u1AA6\u1AA8-\u1AAF\u1AC1-\u1AFF\u1B4C-\u1B4F\u1B5A-\u1B6A\u1B74-\u1B7F\u1BF4-\u1BFF\u1C38-\u1C3F\u1C4A-\u1C4C\u1C7E\u1C7F\u1C89-\u1C8F\u1CBB\u1CBC\u1CC0-\u1CCF\u1CD3\u1CFB-\u1CFF\u1DFA\u1F16\u1F17\u1F1E\u1F1F\u1F46\u1F47\u1F4E\u1F4F\u1F58\u1F5A\u1F5C\u1F5E\u1F7E\u1F7F\u1FB5\u1FBD\u1FBF-\u1FC1\u1FC5\u1FCD-\u1FCF\u1FD4\u1FD5\u1FDC-\u1FDF\u1FED-\u1FF1\u1FF5\u1FFD-\u203E\u2041-\u2053\u2055-\u2070\u2072-\u207E\u2080-\u208F\u209D-\u20CF\u20F1-\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211E-\u2123\u2125\u2127\u2129\u212E\u213A\u213B\u2140-\u2144\u214A-\u214D\u214F-\u215F\u2189-\u24B5\u24EA-\u2BFF\u2C2F\u2C5F\u2CE5-\u2CEA\u2CF4-\u2CFF\u2D26\u2D28-\u2D2C\u2D2E\u2D2F\u2D68-\u2D6E\u2D70-\u2D7E\u2D97-\u2D9F\u2DA7\u2DAF\u2DB7\u2DBF\u2DC7\u2DCF\u2DD7\u2DDF\u2E00-\u2E2E\u2E30-\u3004\u3008-\u3020\u3030\u3036\u3037\u303D-\u3040\u3097\u3098\u309B\u309C\u30A0\u30FB\u3100-\u3104\u3130\u318F-\u319F\u31C0-\u31EF\u3200-\u33FF\u4DC0-\u4DFF\u9FFD-\u9FFF\uA48D-\uA4CF\uA4FE\uA4FF\uA60D-\uA60F\uA62C-\uA63F\uA673\uA67E\uA6F2-\uA716\uA720\uA721\uA789\uA78A\uA7C0\uA7C1\uA7CB-\uA7F4\uA828-\uA82B\uA82D-\uA83F\uA874-\uA87F\uA8C6-\uA8CF\uA8DA-\uA8DF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA954-\uA95F\uA97D-\uA97F\uA9C1-\uA9CE\uA9DA-\uA9DF\uA9FF\uAA37-\uAA3F\uAA4E\uAA4F\uAA5A-\uAA5F\uAA77-\uAA79\uAAC3-\uAADA\uAADE\uAADF\uAAF0\uAAF1\uAAF7-\uAB00\uAB07\uAB08\uAB0F\uAB10\uAB17-\uAB1F\uAB27\uAB2F\uAB5B\uAB6A-\uAB6F\uABEB\uABEE\uABEF\uABFA-\uABFF\uD7A4-\uD7AF\uD7C7-\uD7CA\uD7FC-\uD7FF\uE000-\uF8FF\uFA6E\uFA6F\uFADA-\uFAFF\uFB07-\uFB12\uFB18-\uFB1C\uFB29\uFB37\uFB3D\uFB3F\uFB42\uFB45\uFBB2-\uFBD2\uFD3E-\uFD4F\uFD90\uFD91\uFDC8-\uFDEF\uFDFC-\uFDFF\uFE10-\uFE1F\uFE30-\uFE32\uFE35-\uFE4C\uFE50-\uFE6F\uFE75\uFEFD-\uFF0F\uFF1A-\uFF20\uFF3B-\uFF3E\uFF40\uFF5B-\uFF65\uFFBF-\uFFC1\uFFC8\uFFC9\uFFD0\uFFD1\uFFD8\uFFD9\uFFDD-\uFFFF]|\uD800[\uDC0C\uDC27\uDC3B\uDC3E\uDC4E\uDC4F\uDC5E-\uDC7F\uDCFB-\uDD3F\uDD75-\uDDFC\uDDFE-\uDE7F\uDE9D-\uDE9F\uDED1-\uDEDF\uDEE1-\uDEFF\uDF20-\uDF2C\uDF4B-\uDF4F\uDF7B-\uDF7F\uDF9E\uDF9F\uDFC4-\uDFC7\uDFD0\uDFD6-\uDFFF]|\uD801[\uDC9E\uDC9F\uDCAA-\uDCAF\uDCD4-\uDCD7\uDCFC-\uDCFF\uDD28-\uDD2F\uDD64-\uDDFF\uDF37-\uDF3F\uDF56-\uDF5F\uDF68-\uDFFF]|\uD802[\uDC06\uDC07\uDC09\uDC36\uDC39-\uDC3B\uDC3D\uDC3E\uDC56-\uDC5F\uDC77-\uDC7F\uDC9F-\uDCDF\uDCF3\uDCF6-\uDCFF\uDD16-\uDD1F\uDD3A-\uDD7F\uDDB8-\uDDBD\uDDC0-\uDDFF\uDE04\uDE07-\uDE0B\uDE14\uDE18\uDE36\uDE37\uDE3B-\uDE3E\uDE40-\uDE5F\uDE7D-\uDE7F\uDE9D-\uDEBF\uDEC8\uDEE7-\uDEFF\uDF36-\uDF3F\uDF56-\uDF5F\uDF73-\uDF7F\uDF92-\uDFFF]|\uD803[\uDC49-\uDC7F\uDCB3-\uDCBF\uDCF3-\uDCFF\uDD28-\uDD2F\uDD3A-\uDE7F\uDEAA\uDEAD-\uDEAF\uDEB2-\uDEFF\uDF1D-\uDF26\uDF28-\uDF2F\uDF51-\uDFAF\uDFC5-\uDFDF\uDFF7-\uDFFF]|\uD804[\uDC47-\uDC65\uDC70-\uDC7E\uDCBB-\uDCCF\uDCE9-\uDCEF\uDCFA-\uDCFF\uDD35\uDD40-\uDD43\uDD48-\uDD4F\uDD74\uDD75\uDD77-\uDD7F\uDDC5-\uDDC8\uDDCD\uDDDB\uDDDD-\uDDFF\uDE12\uDE38-\uDE3D\uDE3F-\uDE7F\uDE87\uDE89\uDE8E\uDE9E\uDEA9-\uDEAF\uDEEB-\uDEEF\uDEFA-\uDEFF\uDF04\uDF0D\uDF0E\uDF11\uDF12\uDF29\uDF31\uDF34\uDF3A\uDF45\uDF46\uDF49\uDF4A\uDF4E\uDF4F\uDF51-\uDF56\uDF58-\uDF5C\uDF64\uDF65\uDF6D-\uDF6F\uDF75-\uDFFF]|\uD805[\uDC4B-\uDC4F\uDC5A-\uDC5D\uDC62-\uDC7F\uDCC6\uDCC8-\uDCCF\uDCDA-\uDD7F\uDDB6\uDDB7\uDDC1-\uDDD7\uDDDE-\uDDFF\uDE41-\uDE43\uDE45-\uDE4F\uDE5A-\uDE7F\uDEB9-\uDEBF\uDECA-\uDEFF\uDF1B\uDF1C\uDF2C-\uDF2F\uDF3A-\uDFFF]|\uD806[\uDC3B-\uDC9F\uDCEA-\uDCFE\uDD07\uDD08\uDD0A\uDD0B\uDD14\uDD17\uDD36\uDD39\uDD3A\uDD44-\uDD4F\uDD5A-\uDD9F\uDDA8\uDDA9\uDDD8\uDDD9\uDDE2\uDDE5-\uDDFF\uDE3F-\uDE46\uDE48-\uDE4F\uDE9A-\uDE9C\uDE9E-\uDEBF\uDEF9-\uDFFF]|\uD807[\uDC09\uDC37\uDC41-\uDC4F\uDC5A-\uDC71\uDC90\uDC91\uDCA8\uDCB7-\uDCFF\uDD07\uDD0A\uDD37-\uDD39\uDD3B\uDD3E\uDD48-\uDD4F\uDD5A-\uDD5F\uDD66\uDD69\uDD8F\uDD92\uDD99-\uDD9F\uDDAA-\uDEDF\uDEF7-\uDFAF\uDFB1-\uDFFF]|\uD808[\uDF9A-\uDFFF]|\uD809[\uDC6F-\uDC7F\uDD44-\uDFFF]|[\uD80A\uD80B\uD80E-\uD810\uD812-\uD819\uD824-\uD82B\uD82D\uD82E\uD830-\uD833\uD837\uD839\uD83D\uD83F\uD87B-\uD87D\uD87F\uD885-\uDB3F\uDB41-\uDBFF][\uDC00-\uDFFF]|\uD80D[\uDC2F-\uDFFF]|\uD811[\uDE47-\uDFFF]|\uD81A[\uDE39-\uDE3F\uDE5F\uDE6A-\uDECF\uDEEE\uDEEF\uDEF5-\uDEFF\uDF37-\uDF3F\uDF44-\uDF4F\uDF5A-\uDF62\uDF78-\uDF7C\uDF90-\uDFFF]|\uD81B[\uDC00-\uDE3F\uDE80-\uDEFF\uDF4B-\uDF4E\uDF88-\uDF8E\uDFA0-\uDFDF\uDFE2\uDFE5-\uDFEF\uDFF2-\uDFFF]|\uD821[\uDFF8-\uDFFF]|\uD823[\uDCD6-\uDCFF\uDD09-\uDFFF]|\uD82C[\uDD1F-\uDD4F\uDD53-\uDD63\uDD68-\uDD6F\uDEFC-\uDFFF]|\uD82F[\uDC6B-\uDC6F\uDC7D-\uDC7F\uDC89-\uDC8F\uDC9A-\uDC9C\uDC9F-\uDFFF]|\uD834[\uDC00-\uDD64\uDD6A-\uDD6C\uDD73-\uDD7A\uDD83\uDD84\uDD8C-\uDDA9\uDDAE-\uDE41\uDE45-\uDFFF]|\uD835[\uDC55\uDC9D\uDCA0\uDCA1\uDCA3\uDCA4\uDCA7\uDCA8\uDCAD\uDCBA\uDCBC\uDCC4\uDD06\uDD0B\uDD0C\uDD15\uDD1D\uDD3A\uDD3F\uDD45\uDD47-\uDD49\uDD51\uDEA6\uDEA7\uDEC1\uDEDB\uDEFB\uDF15\uDF35\uDF4F\uDF6F\uDF89\uDFA9\uDFC3\uDFCC\uDFCD]|\uD836[\uDC00-\uDDFF\uDE37-\uDE3A\uDE6D-\uDE74\uDE76-\uDE83\uDE85-\uDE9A\uDEA0\uDEB0-\uDFFF]|\uD838[\uDC07\uDC19\uDC1A\uDC22\uDC25\uDC2B-\uDCFF\uDD2D-\uDD2F\uDD3E\uDD3F\uDD4A-\uDD4D\uDD4F-\uDEBF\uDEFA-\uDFFF]|\uD83A[\uDCC5-\uDCCF\uDCD7-\uDCFF\uDD4C-\uDD4F\uDD5A-\uDFFF]|\uD83B[\uDC00-\uDDFF\uDE04\uDE20\uDE23\uDE25\uDE26\uDE28\uDE33\uDE38\uDE3A\uDE3C-\uDE41\uDE43-\uDE46\uDE48\uDE4A\uDE4C\uDE50\uDE53\uDE55\uDE56\uDE58\uDE5A\uDE5C\uDE5E\uDE60\uDE63\uDE65\uDE66\uDE6B\uDE73\uDE78\uDE7D\uDE7F\uDE8A\uDE9C-\uDEA0\uDEA4\uDEAA\uDEBC-\uDFFF]|\uD83C[\uDC00-\uDD2F\uDD4A-\uDD4F\uDD6A-\uDD6F\uDD8A-\uDFFF]|\uD83E[\uDC00-\uDFEF\uDFFA-\uDFFF]|\uD869[\uDEDE-\uDEFF]|\uD86D[\uDF35-\uDF3F]|\uD86E[\uDC1E\uDC1F]|\uD873[\uDEA2-\uDEAF]|\uD87A[\uDFE1-\uDFFF]|\uD87E[\uDE1E-\uDFFF]|\uD884[\uDF4B-\uDFFF]|\uDB40[\uDC00-\uDCFF\uDDF0-\uDFFF]/g;
12
+ function slug(value, maintainCase) {
13
+ if (typeof value !== "string") return "";
14
+ value = value.toLowerCase();
15
+ return value.replace(regex, "").replace(/ /g, "-");
16
+ }
17
+ var l;
18
+ function S(n2) {
19
+ return n2.children;
20
+ }
21
+ l = { __e: function(n2, l2, u3, t2) {
22
+ for (var i2, r2, o2; l2 = l2.__; ) if ((i2 = l2.__c) && !i2.__) try {
23
+ if ((r2 = i2.constructor) && null != r2.getDerivedStateFromError && (i2.setState(r2.getDerivedStateFromError(n2)), o2 = i2.__d), null != i2.componentDidCatch && (i2.componentDidCatch(n2, t2 || {}), o2 = i2.__d), o2) return i2.__E = i2;
24
+ } catch (l3) {
25
+ n2 = l3;
26
+ }
27
+ throw n2;
28
+ } }, "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout, Math.random().toString(8);
29
+
30
+ // node_modules/preact/jsx-runtime/dist/jsxRuntime.mjs
31
+ var f2 = 0;
32
+ function u2(e2, t2, n2, o2, i2, u3) {
33
+ t2 || (t2 = {});
34
+ var a2, c2, p2 = t2;
35
+ if ("ref" in p2) for (c2 in p2 = {}, t2) "ref" == c2 ? a2 = t2[c2] : p2[c2] = t2[c2];
36
+ var l2 = { type: e2, props: p2, key: n2, ref: a2, __k: null, __: null, __b: 0, __e: null, __c: null, constructor: void 0, __v: --f2, __i: -1, __u: 0, __source: i2, __self: u3 };
37
+ if ("function" == typeof e2 && (a2 = e2.defaultProps)) for (c2 in a2) void 0 === p2[c2] && (p2[c2] = a2[c2]);
38
+ return l.vnode && l.vnode(l2), l2;
39
+ }
40
+
41
+ // node_modules/@quartz-community/utils/dist/index.js
42
+ function simplifySlug(fp) {
43
+ const res = stripSlashes(trimSuffix(fp, "index"), true);
44
+ return res.length === 0 ? "/" : res;
45
+ }
46
+ function slugifyFilePath(fp, excludeExt) {
47
+ fp = stripSlashes(fp);
48
+ const ext = getFileExtension(fp);
49
+ const withoutFileExt = fp.replace(new RegExp(ext + "$"), "");
50
+ const finalExt = [".md", ".html", void 0].includes(ext) ? "" : ext;
51
+ let slug2 = _sluggify(withoutFileExt);
52
+ if (endsWith(slug2, "_index")) {
53
+ slug2 = slug2.replace(/_index$/, "index");
54
+ }
55
+ const segments = slug2.split("/");
56
+ if (segments.length >= 2 && segments[segments.length - 1] === segments[segments.length - 2]) {
57
+ segments[segments.length - 1] = "index";
58
+ slug2 = segments.join("/");
59
+ }
60
+ return slug2 + (finalExt ?? "");
61
+ }
62
+ function joinSegments(...args) {
63
+ if (args.length === 0) {
64
+ return "";
65
+ }
66
+ let joined = args.filter((segment) => segment !== "" && segment !== "/").map((segment) => stripSlashes(segment)).join("/");
67
+ const first = args[0];
68
+ const last = args[args.length - 1];
69
+ if (first?.startsWith("/")) {
70
+ joined = "/" + joined;
71
+ }
72
+ if (last?.endsWith("/")) {
73
+ joined = joined + "/";
74
+ }
75
+ return joined;
76
+ }
77
+ function endsWith(s2, suffix) {
78
+ return s2 === suffix || s2.endsWith("/" + suffix);
79
+ }
80
+ function trimSuffix(s2, suffix) {
81
+ if (endsWith(s2, suffix)) {
82
+ s2 = s2.slice(0, -suffix.length);
83
+ }
84
+ return s2;
85
+ }
86
+ function stripSlashes(s2, onlyStripPrefix) {
87
+ if (s2.startsWith("/")) {
88
+ s2 = s2.substring(1);
89
+ }
90
+ if (!onlyStripPrefix && s2.endsWith("/")) {
91
+ s2 = s2.slice(0, -1);
92
+ }
93
+ return s2;
94
+ }
95
+ function getFileExtension(s2) {
96
+ return s2.match(/\.[A-Za-z0-9]+$/)?.[0];
97
+ }
98
+ function splitAnchor(link) {
99
+ const [fp, anchor] = link.split("#", 2);
100
+ if (fp.endsWith(".pdf")) {
101
+ return [fp, anchor === void 0 ? "" : `#${anchor}`];
102
+ }
103
+ if (anchor === void 0) {
104
+ return [fp, ""];
105
+ }
106
+ const bare = anchor.startsWith("^") ? anchor.slice(1) : anchor;
107
+ const slugged = "#" + slug(bare);
108
+ return [fp, slugged];
109
+ }
110
+ function slugifyPath(s2) {
111
+ return s2.split("/").map(
112
+ (segment) => segment.replace(/\s/g, "-").replace(/&/g, "-and-").replace(/%/g, "-percent").replace(/\?/g, "").replace(/#/g, "").replace(/[<>:"|*]/g, "").toLowerCase()
113
+ ).join("/").replace(/\/$/, "");
114
+ }
115
+ function _sluggify(s2) {
116
+ return slugifyPath(s2);
117
+ }
118
+
119
+ // src/util/path.ts
120
+ function simplifySlug2(fp) {
121
+ return simplifySlug(fp);
122
+ }
123
+ function resolveRelative(current, target) {
124
+ const simplified = simplifySlug2(target);
125
+ const rootPath = pathToRoot(current);
126
+ return joinSegments(rootPath, simplified);
127
+ }
128
+ function slugifyWikilinkTarget(target) {
129
+ const [rawPath, anchor] = splitAnchor(target);
130
+ if (!rawPath) return anchor;
131
+ const pathWithExt = rawPath.endsWith(".md") ? rawPath : `${rawPath}.md`;
132
+ const slug2 = slugifyFilePath(pathWithExt);
133
+ return slug2 + anchor;
134
+ }
135
+ function pathToRoot(slug2) {
136
+ let rootPath = slug2.split("/").filter((x2) => x2 !== "").slice(0, -1).map((_2) => "..").join("/");
137
+ if (rootPath.length === 0) {
138
+ rootPath = ".";
139
+ }
140
+ return rootPath;
141
+ }
142
+
143
+ // src/i18n/locales/en-US.ts
144
+ var en_US_default = {
145
+ components: {
146
+ noteProperties: {
147
+ title: "Properties"
148
+ }
149
+ }
150
+ };
151
+
152
+ // src/i18n/index.ts
153
+ var locales = {
154
+ "en-US": en_US_default
155
+ };
156
+ function i18n(locale) {
157
+ return locales[locale] || en_US_default;
158
+ }
159
+
160
+ // src/components/styles/noteProperties.scss
161
+ var noteProperties_default = '.note-properties {\n margin: 0.5rem 0 1rem;\n border: 1px solid var(--lightgray);\n border-radius: 5px;\n font-size: 0.9rem;\n}\n.note-properties[open] > .note-properties-header {\n border-bottom: 1px solid var(--lightgray);\n}\n.note-properties .note-properties-header {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.4rem 0.8rem;\n cursor: pointer;\n user-select: none;\n list-style: none;\n color: var(--darkgray);\n font-weight: 600;\n}\n.note-properties .note-properties-header::-webkit-details-marker {\n display: none;\n}\n.note-properties .note-properties-header::before {\n content: "";\n display: inline-block;\n width: 0.5em;\n height: 0.5em;\n border-right: 2px solid var(--darkgray);\n border-bottom: 2px solid var(--darkgray);\n transform: rotate(-45deg);\n transition: transform 0.2s ease;\n}\n.note-properties[open] > .note-properties-header::before {\n transform: rotate(45deg);\n}\n.note-properties .note-properties-count {\n margin-left: auto;\n font-size: 0.75rem;\n color: var(--gray);\n font-weight: 400;\n}\n.note-properties .note-properties-table {\n width: 100%;\n border-collapse: collapse;\n table-layout: fixed;\n}\n.note-properties .note-properties-row {\n border-bottom: 1px solid var(--lightgray);\n}\n.note-properties .note-properties-row:last-child {\n border-bottom: none;\n}\n.note-properties .note-properties-key {\n width: 35%;\n padding: 0.35rem 0.8rem;\n color: var(--gray);\n font-size: 0.85rem;\n vertical-align: top;\n word-break: break-word;\n}\n.note-properties .note-properties-value {\n padding: 0.35rem 0.8rem;\n vertical-align: top;\n word-break: break-word;\n}\n.note-properties .note-properties-empty {\n color: var(--gray);\n font-style: italic;\n}\n.note-properties .note-properties-boolean input[type=checkbox] {\n pointer-events: none;\n margin: 0;\n vertical-align: middle;\n}\n.note-properties .note-properties-number {\n font-family: var(--codeFont);\n font-size: 0.85em;\n}\n.note-properties .note-properties-link {\n text-decoration: none;\n color: var(--secondary);\n}\n.note-properties .note-properties-link:hover {\n text-decoration: underline;\n}\n.note-properties .note-properties-separator {\n color: var(--gray);\n}\n.note-properties .note-properties-list {\n display: inline;\n}\n.note-properties .note-properties-tags {\n display: inline-flex;\n}\n.note-properties .note-properties-tags .tag-link {\n display: inline-block;\n padding: 0.1rem 0.4rem;\n border-radius: 3px;\n background: var(--highlight);\n color: var(--secondary);\n font-size: 0.85em;\n text-decoration: none;\n}\n.note-properties .note-properties-tags .tag-link:hover {\n background: var(--secondary);\n color: var(--light);\n}\n.note-properties .note-properties-object code {\n font-size: 0.85em;\n padding: 0.1rem 0.3rem;\n border-radius: 3px;\n background: var(--highlight);\n word-break: break-all;\n}';
162
+
163
+ // src/components/scripts/noteProperties.inline.ts
164
+ var noteProperties_inline_default = 'var o="note-properties-collapsed";function d(){let e=document.querySelector("details.note-properties");if(!e)return;let t=localStorage.getItem(o);if(t!==null){let i=t==="true";e.open=!i}let n=()=>{localStorage.setItem(o,String(!e.open))};e.addEventListener("toggle",n),typeof window<"u"&&window.addCleanup&&window.addCleanup(()=>{e.removeEventListener("toggle",n)})}document.addEventListener("nav",()=>{d()});document.addEventListener("render",()=>{d()});\n';
165
+
166
+ // src/components/NoteProperties.tsx
167
+ var WIKILINK_RE = /\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g;
168
+ var MDLINK_RE = /\[([^\]]*)\]\(([^)]+)\)/g;
169
+ var URL_RE = /https?:\/\/[^\s<>]+/g;
170
+ function lookupHref(ctx, slugifiedTarget) {
171
+ return ctx.resolvedLinks[slugifiedTarget] ?? resolveRelative(ctx.slug, slugifiedTarget);
172
+ }
173
+ function renderTextWithLinks(text, ctx) {
174
+ const segments = [];
175
+ for (const match of text.matchAll(WIKILINK_RE)) {
176
+ const target = match[1];
177
+ const display = match[2] ?? target;
178
+ const href = lookupHref(ctx, slugifyWikilinkTarget(target));
179
+ segments.push({
180
+ start: match.index,
181
+ end: match.index + match[0].length,
182
+ node: /* @__PURE__ */ u2("a", { href, class: "internal internal-link note-properties-link", children: display })
183
+ });
184
+ }
185
+ for (const match of text.matchAll(MDLINK_RE)) {
186
+ const overlaps = segments.some(
187
+ (s2) => match.index < s2.end && match.index + match[0].length > s2.start
188
+ );
189
+ if (overlaps) continue;
190
+ const display = match[1];
191
+ const href = match[2];
192
+ const isExternal = href.startsWith("http://") || href.startsWith("https://");
193
+ const resolvedHref = isExternal ? href : lookupHref(ctx, href);
194
+ segments.push({
195
+ start: match.index,
196
+ end: match.index + match[0].length,
197
+ node: /* @__PURE__ */ u2(
198
+ "a",
199
+ {
200
+ href: resolvedHref,
201
+ class: classNames(
202
+ isExternal ? "external external-link" : "internal internal-link",
203
+ "note-properties-link"
204
+ ),
205
+ ...isExternal ? { target: "_blank", rel: "noopener noreferrer" } : {},
206
+ children: display || href
207
+ }
208
+ )
209
+ });
210
+ }
211
+ for (const match of text.matchAll(URL_RE)) {
212
+ const overlaps = segments.some(
213
+ (s2) => match.index < s2.end && match.index + match[0].length > s2.start
214
+ );
215
+ if (overlaps) continue;
216
+ segments.push({
217
+ start: match.index,
218
+ end: match.index + match[0].length,
219
+ node: /* @__PURE__ */ u2(
220
+ "a",
221
+ {
222
+ href: match[0],
223
+ class: "external external-link note-properties-link",
224
+ target: "_blank",
225
+ rel: "noopener noreferrer",
226
+ children: match[0]
227
+ }
228
+ )
229
+ });
230
+ }
231
+ if (segments.length === 0) return [text];
232
+ segments.sort((a2, b2) => a2.start - b2.start);
233
+ const result = [];
234
+ let cursor = 0;
235
+ for (const seg of segments) {
236
+ if (seg.start > cursor) {
237
+ result.push(text.slice(cursor, seg.start));
238
+ }
239
+ result.push(seg.node);
240
+ cursor = seg.end;
241
+ }
242
+ if (cursor < text.length) {
243
+ result.push(text.slice(cursor));
244
+ }
245
+ return result;
246
+ }
247
+ function renderValue(value, ctx) {
248
+ if (value === null || value === void 0) {
249
+ return /* @__PURE__ */ u2("span", { class: "note-properties-empty", children: "\u2014" });
250
+ }
251
+ if (typeof value === "boolean") {
252
+ return /* @__PURE__ */ u2("span", { class: classNames("note-properties-boolean", value ? "is-true" : "is-false"), children: /* @__PURE__ */ u2("input", { type: "checkbox", checked: value, disabled: true }) });
253
+ }
254
+ if (typeof value === "number") {
255
+ return /* @__PURE__ */ u2("span", { class: "note-properties-number", children: value });
256
+ }
257
+ if (typeof value === "string") {
258
+ const parts = renderTextWithLinks(value, ctx);
259
+ return /* @__PURE__ */ u2("span", { class: "note-properties-text", children: parts });
260
+ }
261
+ if (Array.isArray(value)) {
262
+ const items = value.map((item, idx) => {
263
+ const rendered = renderValue(item, ctx);
264
+ return /* @__PURE__ */ u2(S, { children: [
265
+ idx > 0 && /* @__PURE__ */ u2("span", { class: "note-properties-separator", children: ", " }),
266
+ rendered
267
+ ] });
268
+ });
269
+ return /* @__PURE__ */ u2("span", { class: "note-properties-list", children: items });
270
+ }
271
+ if (typeof value === "object") {
272
+ return /* @__PURE__ */ u2("span", { class: "note-properties-object", children: /* @__PURE__ */ u2("code", { children: JSON.stringify(value) }) });
273
+ }
274
+ return String(value);
275
+ }
276
+ function renderTagList(tags, ctx) {
277
+ const items = tags.map((tag, idx) => {
278
+ const href = resolveRelative(ctx.slug, `tags/${tag}`);
279
+ return /* @__PURE__ */ u2(S, { children: [
280
+ idx > 0 && /* @__PURE__ */ u2("span", { class: "note-properties-separator", children: ", " }),
281
+ /* @__PURE__ */ u2("a", { href, class: "internal internal-link tag-link", children: tag })
282
+ ] });
283
+ });
284
+ return /* @__PURE__ */ u2("span", { class: "note-properties-tags", children: items });
285
+ }
286
+ var NoteProperties_default = ((opts) => {
287
+ const { collapsed = false } = opts ?? {};
288
+ const Component = (props) => {
289
+ const noteProps = props.fileData?.noteProperties;
290
+ if (!noteProps) return null;
291
+ if (noteProps.showProperties === false) return null;
292
+ if (noteProps.showProperties !== true && noteProps.hideView) return null;
293
+ const properties = noteProps.properties;
294
+ const entries = Object.entries(properties);
295
+ if (entries.length === 0) return null;
296
+ const locale = props.cfg?.locale || "en-US";
297
+ const i18nData = i18n(locale);
298
+ const ctx = {
299
+ slug: props.fileData?.slug ?? "",
300
+ resolvedLinks: noteProps.resolvedLinks ?? {}
301
+ };
302
+ const isCollapsed = noteProps.collapseProperties ?? collapsed;
303
+ return /* @__PURE__ */ u2(
304
+ "details",
305
+ {
306
+ class: classNames(props.displayClass, "note-properties", "metadata-container"),
307
+ open: !isCollapsed,
308
+ "data-collapsed": isCollapsed,
309
+ children: [
310
+ /* @__PURE__ */ u2("summary", { class: "note-properties-header", children: [
311
+ /* @__PURE__ */ u2("span", { class: "note-properties-title", children: i18nData.components.noteProperties.title }),
312
+ /* @__PURE__ */ u2("span", { class: "note-properties-count", children: entries.length })
313
+ ] }),
314
+ /* @__PURE__ */ u2("table", { class: "note-properties-table", children: /* @__PURE__ */ u2("tbody", { children: entries.map(([key, value]) => /* @__PURE__ */ u2("tr", { class: "note-properties-row metadata-property", children: [
315
+ /* @__PURE__ */ u2("td", { class: "note-properties-key metadata-property-key", children: key }),
316
+ /* @__PURE__ */ u2("td", { class: "note-properties-value metadata-property-value", children: key === "tags" && Array.isArray(value) ? renderTagList(value, ctx) : renderValue(value, ctx) })
317
+ ] }, key)) }) })
318
+ ]
319
+ }
320
+ );
321
+ };
322
+ Component.css = noteProperties_default;
323
+ Component.afterDOMLoaded = noteProperties_inline_default;
324
+ return Component;
325
+ });
326
+
327
+ export { NoteProperties_default as NotePropertiesComponent };
328
+ //# sourceMappingURL=index.js.map
329
+ //# sourceMappingURL=index.js.map