Compare commits

...

35 commits

Author SHA1 Message Date
Johannes Marbach ba162dfcfd
Merge e3ca1ba2b8 into 96799c287a 2026-04-14 23:39:14 +01:00
Kévin Commaille 96799c287a
Improvements to "Filtering" section (#2347)
Some checks are pending
Spec / 🔎 Validate OpenAPI specifications (push) Waiting to run
Spec / 🔎 Check Event schema examples (push) Waiting to run
Spec / 🔎 Check OpenAPI definitions examples (push) Waiting to run
Spec / 🔎 Check JSON Schemas inline examples (push) Waiting to run
Spec / ⚙️ Calculate baseURL for later jobs (push) Waiting to run
Spec / 🐍 Build OpenAPI definitions (push) Blocked by required conditions
Spec / 📢 Run towncrier for changelog (push) Waiting to run
Spec / 📖 Build the spec (push) Blocked by required conditions
Spec / 🔎 Validate generated HTML (push) Blocked by required conditions
Spec / 📖 Build the historical backup spec (push) Blocked by required conditions
Spec / Create release (push) Blocked by required conditions
Spell Check / Spell Check with Typos (push) Waiting to run
* Clarify string format of filtering endpoints.

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>

* Use inline code for endpoints and add link to /members definition

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>

* Add changelog

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>

---------

Signed-off-by: Kévin Commaille <zecakeh@tedomum.fr>
2026-04-14 16:34:47 -04:00
Johannes Marbach e3ca1ba2b8 Load main results in pages of 3
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 15:48:57 +01:00
Johannes Marbach 4f0eba6355 Fix broken close button
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 15:17:22 +01:00
Johannes Marbach 8fb380d465 Load and render main results one by one
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 15:11:52 +01:00
Johannes Marbach 754e9c82b8 Document why we cannot use wasm-unsafe-eval yet
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 11:34:59 +01:00
Johannes Marbach 86675ad4a4 Only start searching upon hitting Enter
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 11:32:27 +01:00
Johannes Marbach 49fec082f5 Use empty and append to insert the html
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 11:24:13 +01:00
Johannes Marbach 0cc8ee38d5 Use btn-link style for expander
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 11:22:21 +01:00
Johannes Marbach af1e9382ca Use a <button> for the closer
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 11:16:37 +01:00
Johannes Marbach 84b5e98f25 Switch to (outline) buttons for the expander
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 11:07:57 +01:00
Johannes Marbach 0cf8fca4da Unwrap jQuery object
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 10:59:39 +01:00
Johannes Marbach bccbff878d Fix relative path to pagefind script
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 10:56:03 +01:00
Johannes Marbach 308bcfd20e Pin pagefind version
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-24 10:41:01 +01:00
Johannes Marbach 1f5d598754
Fix typo in HTML ID
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-24 10:23:11 +01:00
Johannes Marbach 59c7282ddb
Use correct pluralisation for zero results
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-24 10:22:03 +01:00
Johannes Marbach f49668d722
Fix typo
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-24 10:20:31 +01:00
Johannes Marbach 1c2e58d66f
Use relative path for pagefind JS
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-03-24 10:17:37 +01:00
Johannes Marbach de25ba5265 Document how to build the search index locally
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-20 14:14:45 +01:00
Johannes Marbach e9a29f27dc Fix CSP
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-20 14:05:19 +01:00
Andrew Morgan 2fd3c28a7a Attempt to fix page jump upon expanding search results 2026-03-20 12:54:14 +00:00
Johannes Marbach 15f36d1934 Only use plural of 'results' when actually necessary
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-20 13:44:11 +01:00
Johannes Marbach 9edb9b3e5b Add triangle indicator on expander buttons and remove left margins
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-20 13:38:12 +01:00
Johannes Marbach 94fca47a7d Add total number of subresults per main result
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-20 13:37:41 +01:00
Johannes Marbach a56969149f Stop bluring the input
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-20 13:18:36 +01:00
Johannes Marbach 72205be3dc Set cursor style and a11y label on close button
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-20 13:13:05 +01:00
Johannes Marbach 8e383835b9 Toggle expander label between show and hide
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-20 13:08:53 +01:00
Johannes Marbach 92b7e714e7 Add loading spinner while the search is running
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-20 12:52:01 +01:00
Johannes Marbach 6f05c2c78e Improve search field placeholder
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-19 15:13:29 +01:00
Johannes Marbach 9a1b7ffa7c Group subresults
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-19 08:50:45 +01:00
Johannes Marbach e679a00720 Override search-input template
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-17 14:16:24 +01:00
Johannes Marbach 7dfd746e06 Remove leftovers
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-17 13:21:42 +01:00
Johannes Marbach 77f7e8104a Merge branch 'main' into johannes/page-search 2026-03-17 13:09:06 +01:00
Johannes Marbach b3d4f9a96e Change to using Pagefind via the built-in Docsy search UI
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-17 13:04:43 +01:00
Johannes Marbach fdd2a9abe8 Add page search widget
Signed-off-by: Johannes Marbach <n0-0ne+github@mailbox.org>
2026-03-06 15:25:50 +01:00
15 changed files with 537 additions and 8 deletions

View file

@ -236,6 +236,10 @@ jobs:
run: |
tar -C "spec${baseURL}" --strip-components=1 -xzf openapi.tar.gz
- name: "🔍 pagefind indexing"
run: |
npm run pagefind -- --site "spec${baseURL}"
- name: "📦 Tarball creation"
run: |
cd spec

View file

@ -79,6 +79,18 @@ We use a highly customized [Docsy](https://www.docsy.dev/) theme for our generat
Awesome. If you're looking at making design-related changes to the spec site, please coordinate with us in
[#matrix-docs:matrix.org](https://matrix.to/#/#matrix-docs:matrix.org) before opening a PR.
## Page search
The spec uses [Pagefind](https://pagefind.app/) to provide a page search widget. To test this locally, you'll need to generate the
search index _after_ building the static site.
```
hugo build && npm run pagefind -- --site public && hugo serve
```
Note that while `hugo serve` supports hot reloading, changes made to the site content won't reflect in the search index without
rebuilding it.
## Building the specification
If for some reason you're not a CI/CD system and want to render a static version of the spec for yourself, follow the above

290
assets/js/offline-search.js Normal file
View file

@ -0,0 +1,290 @@
/*
Copyright 2026 The Matrix.org Foundation C.I.C.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Adapted from [1] to combine Docsy's built-in search UI with the Pagefind
search backend.
[1]: https://github.com/matrix-org/docsy/blob/71d103ebb20ace3d528178c4b6d92b6cc4f7fd53/assets/js/offline-search.js
*/
(function ($) {
"use strict";
$(document).ready(async function () {
// This is going to be loaded from ${deployment}/js/main.js so to use a relative path
// to the Pagefind script we need to navigate one level up.
const pagefind = await import("../pagefind/pagefind.js");
const $searchInput = $(".td-search input");
//
// Lazily initialise Pagefind only when the user is about to start a search.
//
$searchInput.focus(() => {
pagefind.init();
});
//
// Set up search input handler.
//
$searchInput.on("keypress", (event) => {
// Start searching only upon Enter.
if (event.which === 13) {
event.preventDefault();
render($(event.target));
return;
}
});
// Prevent reloading page by enter key on sidebar search.
$searchInput.closest("form").on("submit", () => {
return false;
});
//
// Callback for searching and rendering the results.
//
const render = async ($targetSearchInput) => {
//
// Dispose any existing popover.
//
disposePopover($targetSearchInput);
//
// Check if we need to do a search at all.
//
const searchQuery = $targetSearchInput.val();
if (searchQuery === "") {
return;
}
//
// Prepare the results popover.
//
const $html = $("<div>");
// Add the header and close button.
$html.append($("<div>")
.css({
display: "flex",
justifyContent: "space-between",
marginBottom: "1em",
})
.append($("<span>")
.text("Search results")
.css({ fontWeight: "bold" }))
.append($("<button>")
.addClass("td-offline-search-results__close-button")
.addClass("btn")
.addClass("btn-sm")
.addClass("btn-link")
.attr("type", "button")
.attr("aria-label", "Close")
.on("click", () => {
$targetSearchInput.val("");
disposePopover($targetSearchInput);
})
)
);
// Add the main search results body.
const $searchResultBody = $("<div>").css({
maxHeight: `calc(100vh - ${
$targetSearchInput.offset().top - $(window).scrollTop() + 180
}px)`,
overflowY: "auto",
});
$html.append($searchResultBody);
// Append a spinner while we're busy.
const $spinner = createSpinner();
$searchResultBody.append($spinner)
// Display the popover.
const popover = new bootstrap.Popover($targetSearchInput[0], {
content: $html[0],
html: true,
customClass: "td-offline-search-results",
placement: "bottom",
});
popover.show();
//
// Kick off the search, load the results and inject them into the popover.
//
const search = await pagefind.debouncedSearch(searchQuery);
if (search === null) {
// A more recent search call has been made, nothing to do.
return;
}
if (search.results.length === 0) {
$searchResultBody.append(
$("<p>").text(`No results found for query "${searchQuery}"`)
);
} else {
await loadAndRenderResults(search.results, 0, $spinner, $searchResultBody);
}
};
});
})(jQuery);
//
// Helpers
//
const disposePopover = ($targetSearchInput) => {
const popover = bootstrap.Popover.getInstance($targetSearchInput[0]);
if (popover !== null) {
popover.dispose();
}
}
const createSpinner = () => {
return $("<div>")
.addClass("spinner-container")
.append($("<div>")
.addClass("spinner-border")
.attr("role", "status")
.append($("<div>")
.addClass("visually-hidden")
.text("Loading...")))
.append($("<p>")
.text("Loading..."));
}
const loadAndRenderResults = async (results, offset, $spinner, $searchResultBody) => {
// Load and render the first three results and hide the remainder behind a
// button to not freeze the browser by loading results that may not be
// displayed.
const LIMIT = 3;
for (const [index, result] of results.entries()) {
if (index < LIMIT) {
// Insert a container for the result *before* the spinner. This
// will push down the spinner as new content is loaded and keep
// it at the end of the popover.
const $container = $("<div>");
$spinner.before($container);
renderResult(await result.data(), index + offset, $container);
} else if (index === LIMIT) {
const num_hidden_results = results.length - index;
const $loader = $("<button>")
.attr("type", "button")
.addClass("td-offline-search-results__expander-button")
.addClass("btn")
.addClass("btn-sm")
.addClass("btn-link")
.text(`Load more results from ${num_hidden_results} other ${pagesString(num_hidden_results)}`)
.on("click", async () => {
// Remove the button.
$loader.remove();
// Add a spinner while we're busy.
const $spinner = createSpinner();
$searchResultBody.append($spinner)
// Load and render the results.
await loadAndRenderResults(results.slice(LIMIT), LIMIT + offset, $spinner, $searchResultBody);
});
$spinner.before($loader)
}
}
// Remove the spinner now that everything was loaded.
$spinner.remove();
}
const renderResult = (data, index, $container) => {
// Add the main result's page title.
$container.append($("<div>")
.append($("<a>")
.css({
fontSize: "1.2rem",
})
.attr("href", data.url)
.text(data.meta.title))
.append($("<span>")
.addClass("text-body-secondary")
.text(` ${data.sub_results.length} ${resultsString(data.sub_results.length)}`)));
// Render the first 3 subresults per page and wrap the rest
// in a collapsed container.
const LIMIT = 3;
let $wrapper = null;
data.sub_results.forEach((s, index_s) => {
if (index_s === LIMIT) {
const num_hidden_results = data.sub_results.length - index_s;
const wrapper_id = `collapsible-subresults-${index}`;
const $action = $("<span>").text("▶ Show");
const $expander = $("<button>")
.attr("data-bs-toggle", "collapse")
.attr("data-bs-target", `#${wrapper_id}`)
.attr("aria-expanded", "false")
.attr("aria-controls", wrapper_id)
.attr("type", "button")
.addClass("td-offline-search-results__expander-button")
.addClass("btn")
.addClass("btn-sm")
.addClass("btn-link")
.append($action)
.append($("<span>").text(` ${num_hidden_results} more ${resultsString(num_hidden_results)} from ${data.meta.title}`));
$container.append($("<p>").append($expander));
$wrapper = $("<div>")
.addClass("collapse td-offline-search-results__subresults")
.attr("id", wrapper_id)
.on("hide.bs.collapse", _ => $action.text("▶ Show"))
.on("show.bs.collapse", _ => $action.text("▼ Hide"));
$container.append($wrapper);
}
const $entry = $("<div>")
.css("margin-top", "0.5rem");
$entry.append(
$("<a>")
.addClass("d-block")
.attr("href", s.url)
.text(s.title)
);
$entry.append($("<p>").html(s.excerpt));
if (index_s < LIMIT) {
$container.append($entry);
} else {
$wrapper.append($entry);
}
});
};
const resultsString = (n) => {
return n === 1 ? "result" : "results";
};
const pagesString = (n) => {
return n === 1 ? "page" : "pages";
};

View file

@ -661,3 +661,32 @@ dd {
margin: 0;
}
}
/* Style for the page search widget */
.td-offline-search-results {
width: 100%;
max-width: 460px;
}
.td-offline-search-results .td-offline-search-results__subresults.collapse.show {
// Prevent the first child margin from collapsing upward when Bootstrap
// finishes the collapse animation, which otherwise causes a small jump.
display: flow-root;
}
.td-offline-search-results .spinner-container {
text-align: center;
}
.td-offline-search-results__close-button {
// Prevent the label from rendering white on white.
--bs-btn-color: unset;
}
.td-offline-search-results__expander-button {
// Prevent the label from rendering white on white.
--bs-btn-color: unset;
// Avoid any extra inset.
--bs-btn-padding-x: 0;
--bs-btn-padding-y: 0;
}

View file

@ -0,0 +1 @@
Clarify formats of string types.

View file

@ -0,0 +1 @@
Add page search widget.

View file

@ -66,6 +66,7 @@ description = "Home of the Matrix specification for decentralised communication"
[params]
copyright = "The Matrix.org Foundation C.I.C."
offlineSearch = true
[params.version]
# must be one of "unstable", "current", "historical"
@ -151,7 +152,10 @@ sidebar_menu_compact = true
[server.headers.values]
# `style-src 'unsafe-inline'` is needed to correctly render the maths in the Olm spec:
# https://github.com/KaTeX/KaTeX/issues/4096
Content-Security-Policy = "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self'; img-src 'self' data:; connect-src 'self'; font-src 'self' data:; media-src 'self'; child-src 'self'; form-action 'self'; object-src 'self'"
# `script-src 'unsafe-eval'` is needed because Pagefind relies on it to load its Wasm.
# In future, we should switch to `wasm-unsafe-eval` but this doesn't yet work in Safari:
# https://github.com/Pagefind/pagefind/blob/main/docs/content/docs/hosting.md
Content-Security-Policy = "default-src 'self'; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-eval'; img-src 'self' data:; connect-src 'self'; font-src 'self' data:; media-src 'self'; child-src 'self'; form-action 'self'; object-src 'self'"
X-XSS-Protection = "1; mode=block"
X-Content-Type-Options = "nosniff"
# Strict-Transport-Security = "max-age=31536000; includeSubDomains; preload"

View file

@ -3120,19 +3120,20 @@ events they have already been sent, and choose to skip sending membership
events for members whose membership has not changed. These are called
'redundant membership events'. Clients may request that redundant membership
events are always included in responses by setting `include_redundant_members`
to true in the filter.
to `true` in the filter.
The expected pattern for using lazy-loading is currently:
- Client performs an initial /sync with lazy-loading enabled, and
- Client performs an initial `/sync` with lazy-loading enabled, and
receives only the membership events which relate to the senders of
the events it receives.
- Clients which support display-name tab-completion or other
operations which require rapid access to all members in a room
should call /members for the currently selected room, with an `?at`
parameter set to the /sync response's from token. The member list
for the room is then maintained by the state in subsequent
incremental /sync responses.
should call [`/members`](#get_matrixclientv3roomsroomidmembers) for
the currently selected room, with an `?at` parameter set to the
`/sync` response's `from` token. The member list for the room is
then maintained by the state in subsequent incremental `/sync`
responses.
- Clients which do not support tab-completion may instead pull in
profiles for arbitrary users (e.g. read receipts, typing
notifications) on demand by querying the room state or [`/profile`](#get_matrixclientv3profileuserid).

View file

@ -26,6 +26,8 @@ properties:
`senders` filter.
items:
type: string
format: mx-user-id
pattern: "^@"
type: array
not_types:
description: A list of event types to exclude. If this list is absent then no
@ -40,6 +42,8 @@ properties:
senders are included.
items:
type: string
format: mx-user-id
pattern: "^@"
type: array
types:
description: A list of event types to include. If this list is absent then all

View file

@ -43,12 +43,16 @@ allOf:
filter.
items:
type: string
format: mx-room-id
pattern: "^!"
type: array
rooms:
description: A list of room IDs to include. If this list is absent then all rooms
are included.
items:
type: string
format: mx-room-id
pattern: "^!"
type: array
contains_url:
type: boolean

View file

@ -50,6 +50,8 @@ properties:
`state`, `timeline` or `account_data`
items:
type: string
format: mx-room-id
pattern: "^!"
type: array
rooms:
description: A list of room IDs to include. If this list is absent then all rooms
@ -57,6 +59,8 @@ properties:
`state`, `timeline` or `account_data`
items:
type: string
format: mx-room-id
pattern: "^!"
type: array
ephemeral:
allOf:

View file

@ -36,6 +36,8 @@ paths:
example: "@alice:example.com"
schema:
type: string
format: mx-user-id
pattern: "^@"
requestBody:
content:
application/json:
@ -130,6 +132,8 @@ paths:
example: "@alice:example.com"
schema:
type: string
format: mx-user-id
pattern: "^@"
- in: path
name: filterId
description: The filter ID to download.

View file

@ -0,0 +1,10 @@
<div class="td-search td-search--offline">
<div class="td-search__icon"></div>
<input
type="search"
class="td-search__input form-control"
placeholder="Search the spec"
aria-label="Search the spec"
autocomplete="off"
>
</div>

159
package-lock.json generated
View file

@ -12,6 +12,7 @@
"@fullhuman/postcss-purgecss": "^6.0.0",
"autoprefixer": "^10.4.20",
"node-fetch": "^2.6.7",
"pagefind": "^1.4.0",
"postcss": "^8.4.49",
"postcss-cli": "^11.0.0"
}
@ -170,6 +171,90 @@
"node": ">= 8"
}
},
"node_modules/@pagefind/darwin-arm64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.4.0.tgz",
"integrity": "sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@pagefind/darwin-x64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.4.0.tgz",
"integrity": "sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"darwin"
]
},
"node_modules/@pagefind/freebsd-x64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.4.0.tgz",
"integrity": "sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"freebsd"
]
},
"node_modules/@pagefind/linux-arm64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.4.0.tgz",
"integrity": "sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@pagefind/linux-x64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.4.0.tgz",
"integrity": "sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"linux"
]
},
"node_modules/@pagefind/windows-x64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.4.0.tgz",
"integrity": "sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==",
"cpu": [
"x64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"win32"
]
},
"node_modules/@pkgjs/parseargs": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@ -914,6 +999,24 @@
"dev": true,
"license": "BlueOak-1.0.0"
},
"node_modules/pagefind": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.4.0.tgz",
"integrity": "sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==",
"dev": true,
"license": "MIT",
"bin": {
"pagefind": "lib/runner/bin.cjs"
},
"optionalDependencies": {
"@pagefind/darwin-arm64": "1.4.0",
"@pagefind/darwin-x64": "1.4.0",
"@pagefind/freebsd-x64": "1.4.0",
"@pagefind/linux-arm64": "1.4.0",
"@pagefind/linux-x64": "1.4.0",
"@pagefind/windows-x64": "1.4.0"
}
},
"node_modules/path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
@ -1652,6 +1755,48 @@
"fastq": "^1.6.0"
}
},
"@pagefind/darwin-arm64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.4.0.tgz",
"integrity": "sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==",
"dev": true,
"optional": true
},
"@pagefind/darwin-x64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.4.0.tgz",
"integrity": "sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==",
"dev": true,
"optional": true
},
"@pagefind/freebsd-x64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.4.0.tgz",
"integrity": "sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==",
"dev": true,
"optional": true
},
"@pagefind/linux-arm64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.4.0.tgz",
"integrity": "sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==",
"dev": true,
"optional": true
},
"@pagefind/linux-x64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.4.0.tgz",
"integrity": "sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==",
"dev": true,
"optional": true
},
"@pagefind/windows-x64": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.4.0.tgz",
"integrity": "sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==",
"dev": true,
"optional": true
},
"@pkgjs/parseargs": {
"version": "0.11.0",
"resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@ -2117,6 +2262,20 @@
"integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
"dev": true
},
"pagefind": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.4.0.tgz",
"integrity": "sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==",
"dev": true,
"requires": {
"@pagefind/darwin-arm64": "1.4.0",
"@pagefind/darwin-x64": "1.4.0",
"@pagefind/freebsd-x64": "1.4.0",
"@pagefind/linux-arm64": "1.4.0",
"@pagefind/linux-x64": "1.4.0",
"@pagefind/windows-x64": "1.4.0"
}
},
"path-key": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",

View file

@ -5,7 +5,8 @@
"main": "none.js",
"scripts": {
"get-proposals": "node ./scripts/proposals.js",
"test": "echo \"Error: no test specified\" && exit 1"
"test": "echo \"Error: no test specified\" && exit 1",
"pagefind": "pagefind $@"
},
"repository": {
"type": "git",
@ -22,6 +23,7 @@
"@fullhuman/postcss-purgecss": "^6.0.0",
"autoprefixer": "^10.4.20",
"node-fetch": "^2.6.7",
"pagefind": "^1.4.0",
"postcss": "^8.4.49",
"postcss-cli": "^11.0.0"
}