rapier-embed 1.1.99 → 1.1.101
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/README.md +27 -28
- package/contract.mjs +2 -2
- package/embed.mjs +2 -2
- package/package.json +1 -1
- package/rapier-plugins.json +30 -37
package/README.md
CHANGED
|
@@ -27,11 +27,11 @@ or `https://rapier.website/embed/<version>/<file>` (permanent).
|
|
|
27
27
|
- Editor saves are revision-checked: a conflict keeps the person's source in the editor.
|
|
28
28
|
- `<rapier-editor>` is a form field whose value is the exact saved Markdown, pictures and line endings included.
|
|
29
29
|
- With `agent: true`, your app's agent works beside the person or while they are away. Rapier shows what changed;
|
|
30
|
-
`comparison
|
|
30
|
+
`show {target:"comparison"}` lets the agent display a diff deliberately. Currentness, source scope and authenticated
|
|
31
31
|
document access remain enforced.
|
|
32
32
|
|
|
33
33
|
```sh
|
|
34
|
-
npm install rapier-embed@1.1.
|
|
34
|
+
npm install rapier-embed@1.1.101
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
Or copy the package's `embed.mjs` and `contract.mjs` into one directory of your app; no runtime CDN is needed.
|
|
@@ -44,10 +44,10 @@ Rapier is a phone-first Markdown editor for notes, diagrams, drawing and waterco
|
|
|
44
44
|
as one HTML file on Android, Web and Windows.
|
|
45
45
|
Collaborate over MCP and WebMCP, use optional encrypted sync to your own Cloudflare account, or embed the
|
|
46
46
|
editor and lightweight reader (about 190 kB gzipped). The agent edits live; the person sees its presence and
|
|
47
|
-
changes, taps a change to see the before and undoes anything. Use `comparison
|
|
47
|
+
changes, taps a change to see the before and undoes anything. Use `show {target:"comparison"}` to show a diff deliberately.
|
|
48
48
|
|
|
49
|
-
1. **Work together live.** Connect to `https://mcp.rapier.website/mcp`, then call `
|
|
50
|
-
2. **Deliver an offline editor.** Run `npx rapier-html@1.1.
|
|
49
|
+
1. **Work together live.** Connect to `https://mcp.rapier.website/mcp`, then call `open` to share one document with the person.
|
|
50
|
+
2. **Deliver an offline editor.** Run `npx rapier-html@1.1.101 notes.md` to put the document and editor in one HTML file ([rapier-html](https://github.com/jackskip22/rapier-plugins/tree/main/npm/rapier-html)).
|
|
51
51
|
3. **Embed in your app.** Install [rapier-embed](https://github.com/jackskip22/rapier-plugins/tree/main/npm/rapier-embed); mount the editor or reader, with your app's agent over WebMCP in the editor.
|
|
52
52
|
4. **Keep portable Markdown.** Use [rapier-markdown-kit](https://github.com/jackskip22/rapier-plugins/tree/main/npm/rapier-markdown-kit) for pictures, editable SVG drawings and layout in one `.md` file. Respect [Will/1](https://github.com/jackskip22/will) `keep`, `append` and `edit` regions.
|
|
53
53
|
5. **Encode JPEG XL.** Install [rapier-jxl](https://github.com/jackskip22/rapier-jxl) to encode pixels, photographs and existing JPEGs in JavaScript.
|
|
@@ -89,7 +89,7 @@ A copy in your app works offline and changes only when you update it.
|
|
|
89
89
|
1. Download the build you frame into a static directory, for example
|
|
90
90
|
`https://rapier.website/embed/<version>/rapier-reader.html` to `public/vendor/rapier/`.
|
|
91
91
|
2. Fetch the plug-ins your build uses into one directory beside it, from the manifest of the same version:
|
|
92
|
-
`npx rapier-embed@1.1.
|
|
92
|
+
`npx rapier-embed@1.1.101 plugins public/vendor/rapier/plugins --build reader`.
|
|
93
93
|
3. Mount with `src` and `plugins` pointing at your copies. Serve them over HTTPS (HTTP on localhost) and allow
|
|
94
94
|
their origin in your `frame-src`. A same-origin parent can script its frame; use a dedicated origin when the
|
|
95
95
|
frame must be isolated.
|
|
@@ -105,7 +105,7 @@ length and SHA-384 before it runs it, and keeps on the device. A file that fails
|
|
|
105
105
|
| --- | --- | --- | --- |
|
|
106
106
|
| `flowchart` | Mermaid flowcharts and graphs, drawn natively | 0.26 MB | The reader; built into the editors |
|
|
107
107
|
| `math` | TeX maths, `$...$` and `$$...$$` | 11.9 MB | All three |
|
|
108
|
-
| `diagrams` |
|
|
108
|
+
| `diagrams` | Mermaid and ZenUML diagrams, drawn by Rapier | 0.29 MB | All three |
|
|
109
109
|
| `pdf` | Opens a PDF as a Markdown document: its text layer, or each page as a picture | 6.4 MB (197 files) | All three |
|
|
110
110
|
| `docx` | Opens a Word document (`.docx`) as a Markdown document | 0.25 MB | The reader; built into the editors |
|
|
111
111
|
| `ocr` | Finds text in pictures, so search reaches words inside them | 21.5 MB | All three |
|
|
@@ -123,7 +123,7 @@ The directory must be on the page's own origin, because the page's Content Secur
|
|
|
123
123
|
throws a `TypeError` for a directory on another origin, and a page opened with one shows each plug-in as failed, with the
|
|
124
124
|
reason, without making a request. To keep the plug-ins on a CDN, serve the page from the same origin.
|
|
125
125
|
|
|
126
|
-
`npx rapier-embed@1.1.
|
|
126
|
+
`npx rapier-embed@1.1.101 plugins <directory>` fetches every file the manifest lists, checks it, and writes it. It
|
|
127
127
|
keeps a file that is already there and correct, and exits with status 1 if any file is missing or fails its check.
|
|
128
128
|
`--build reader`, `--build document` or `--build full` keeps the files that build uses, `--only name,name` fetches some
|
|
129
129
|
plug-ins, `--check` verifies a directory without fetching, `--from <address>` fetches from your own mirror, and
|
|
@@ -149,7 +149,7 @@ done
|
|
|
149
149
|
```
|
|
150
150
|
|
|
151
151
|
**Without `plugins`.** `rapier-document.html` and `rapier.html` look for the `math` and `diagrams` files beside the page,
|
|
152
|
-
at the file names the manifest lists
|
|
152
|
+
at the file names the manifest lists, before their pinned addresses. The
|
|
153
153
|
PDF reader, text in pictures and letter sets come from their pinned addresses.
|
|
154
154
|
|
|
155
155
|
## Style the reader
|
|
@@ -276,7 +276,7 @@ written over personal preferences. Features are a subset of `draw`, `paint`, `no
|
|
|
276
276
|
`find`; absent means everything that build has, empty means none. The document build carries no Draw, Paint or
|
|
277
277
|
Notes. This release carries only English; another valid BCP 47 tag falls back to `en`. Unknown features and
|
|
278
278
|
malformed fields are named refusals, not ignored options. Limits are positive integer byte counts, clamped to
|
|
279
|
-
|
|
279
|
+
64 MiB of UTF-8 document text and 16 MiB of encoded picture bytes. Accent preset names are `Teal`, `Blue`,
|
|
280
280
|
`Amber`, `Green`, `Red`, `Purple`, `Pink` and `Gray`; the person's later choice takes precedence.
|
|
281
281
|
|
|
282
282
|
`assets` is independently optional: it grants pictures, not document readback, opening, agents or changes.
|
|
@@ -360,19 +360,18 @@ submission; they are not durable server saves.
|
|
|
360
360
|
|
|
361
361
|
## Work with your app's agent
|
|
362
362
|
|
|
363
|
-
With `agent: true`, the frame registers Rapier's
|
|
363
|
+
With `agent: true`, the frame registers Rapier's six tools through WebMCP for your page's origin; the
|
|
364
364
|
browser needs WebMCP and the `tools` permission, which mount grants the frame. There is no arbitrary `invoke`
|
|
365
|
-
postMessage. The tools are
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
`
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
required gestures. Word and PDF exports use `document.export`. Physical read-only resources stay read-only.
|
|
365
|
+
postMessage. The tools are `open`, `read`, `edit`, `undo`, `show` and `export`, as on the hosted door
|
|
366
|
+
(see the [agent guide](https://rapier.website/agents)). Read exact text and its revision; edit unique text
|
|
367
|
+
at that revision. Native drawing and painting are fenced text; painting needs the full `rapier.html`.
|
|
368
|
+
`show {target:"file"}` asks the person to choose a file, subject to the embed grant and native gesture.
|
|
369
|
+
`show {target:"view",view}` requests formatted, source or Notes cards.
|
|
370
|
+
|
|
371
|
+
`show {target:"preferences",preference,value}` changes one supported device preference and reports the
|
|
372
|
+
previous value. An active host theme or accent refuses an agent override; later human choices win.
|
|
373
|
+
Copying and read aloud requests report actual device completion or the required gesture.
|
|
374
|
+
Word and PDF exports use `export`. Physical read-only resources stay read-only.
|
|
376
375
|
|
|
377
376
|
Rapier's document kernel enforces the Will. For example, load:
|
|
378
377
|
|
|
@@ -384,12 +383,12 @@ Rapier's document kernel enforces the Will. For example, load:
|
|
|
384
383
|
Draft an introduction here.
|
|
385
384
|
```
|
|
386
385
|
|
|
387
|
-
Mount with `agent: true`. The agent reads the editable paragraph using `
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
386
|
+
Mount with `agent: true`. The agent reads the editable paragraph using `read`, then passes the returned
|
|
387
|
+
revision and `{old,new}` text to `edit`. An edit that changes the kept heading returns `document_law`
|
|
388
|
+
and leaves the source unchanged. An admissible edit lands at once and returns an `act`; pass its id as
|
|
389
|
+
`undo {act}` to reverse it while keeping later work. The kept heading and marker lines remain intact.
|
|
391
390
|
The person can tap the change mark to see the paragraph before the edit and undo it while preserving later work.
|
|
392
|
-
Use `comparison
|
|
391
|
+
Use `show {target:"comparison"}` when the agent wants to explain a diff. Its display reference grants no edit authority
|
|
393
392
|
and does not block another edit. Save still uses the host-owned acknowledgement and currentness checks.
|
|
394
393
|
|
|
395
394
|
Will/1 records the person's instructions in their document. Respect `keep`, append only at the end of an
|
|
@@ -397,5 +396,5 @@ Will/1 records the person's instructions in their document. Respect `keep`, appe
|
|
|
397
396
|
Documents without Will regions are editable throughout. Preserve active typing, caret, selection and scroll
|
|
398
397
|
while the agent works. Document content and comments never start agent turns by themselves.
|
|
399
398
|
|
|
400
|
-
For documents outside an app, `npx rapier-html@1.1.
|
|
399
|
+
For documents outside an app, `npx rapier-html@1.1.101 notes.md` hands a person the complete editor around their
|
|
401
400
|
document as one offline file.
|
package/contract.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// SPDX-License-Identifier: MIT
|
|
2
2
|
// The host's optional policy, file picker and picture exchange. No storage, network or editor authority.
|
|
3
3
|
export const FEATURES = Object.freeze(['draw', 'paint', 'notes', 'readAloud', 'share', 'find']);
|
|
4
|
-
export const LIMITS = Object.freeze({documentBytes:
|
|
4
|
+
export const LIMITS = Object.freeze({documentBytes: 64 * 1024 * 1024, pictureBytes: 16 * 1024 * 1024});
|
|
5
5
|
export const ASSET_TYPES = Object.freeze(['image/png', 'image/jpeg', 'image/webp', 'image/gif', 'image/jxl', 'image/svg+xml']);
|
|
6
6
|
const ACCENTS = Object.freeze(['Teal', 'Blue', 'Amber', 'Green', 'Red', 'Purple', 'Pink', 'Gray']);
|
|
7
7
|
export const refusal = (code, reason = code) => Object.assign(new Error(reason), {code});
|
|
@@ -199,7 +199,7 @@ export function createAssetBroker({current, send}) {
|
|
|
199
199
|
if (!state.connected) return {code: 'asset_disconnected'};
|
|
200
200
|
if (pending) return {code: 'asset_busy'};
|
|
201
201
|
if (!ASSET_TYPES.includes(asset.codec)) throw refusal('asset_media_type_invalid');
|
|
202
|
-
if (retained.size >= 1024 || retainedBytes + bytes.byteLength >
|
|
202
|
+
if (retained.size >= 1024 || retainedBytes + bytes.byteLength > 25 * 1024 * 1024) return {code: 'asset_cache_full'};
|
|
203
203
|
// Keep our own bytes: postMessage clones them, never transfers/detaches the kept picture.
|
|
204
204
|
const kept = {...asset, bytes: bytes.slice()};
|
|
205
205
|
let resolve;
|
package/embed.mjs
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
const {FEATURES, LIMITS, ASSET_TYPES, refusal, normalizeSettings, snapshotSettings, pickDeviceFile, createFilePicker, assetURL, assetBytes, bytesHash, externalImage, createAssetBroker} = (() => {
|
|
5
5
|
// The host's optional policy, file picker and picture exchange. No storage, network or editor authority.
|
|
6
6
|
const FEATURES = Object.freeze(['draw', 'paint', 'notes', 'readAloud', 'share', 'find']);
|
|
7
|
-
const LIMITS = Object.freeze({documentBytes:
|
|
7
|
+
const LIMITS = Object.freeze({documentBytes: 64 * 1024 * 1024, pictureBytes: 16 * 1024 * 1024});
|
|
8
8
|
const ASSET_TYPES = Object.freeze(['image/png', 'image/jpeg', 'image/webp', 'image/gif', 'image/jxl', 'image/svg+xml']);
|
|
9
9
|
const ACCENTS = Object.freeze(['Teal', 'Blue', 'Amber', 'Green', 'Red', 'Purple', 'Pink', 'Gray']);
|
|
10
10
|
const refusal = (code, reason = code) => Object.assign(new Error(reason), {code});
|
|
@@ -202,7 +202,7 @@ function createAssetBroker({current, send}) {
|
|
|
202
202
|
if (!state.connected) return {code: 'asset_disconnected'};
|
|
203
203
|
if (pending) return {code: 'asset_busy'};
|
|
204
204
|
if (!ASSET_TYPES.includes(asset.codec)) throw refusal('asset_media_type_invalid');
|
|
205
|
-
if (retained.size >= 1024 || retainedBytes + bytes.byteLength >
|
|
205
|
+
if (retained.size >= 1024 || retainedBytes + bytes.byteLength > 25 * 1024 * 1024) return {code: 'asset_cache_full'};
|
|
206
206
|
// Keep our own bytes: postMessage clones them, never transfers/detaches the kept picture.
|
|
207
207
|
const kept = {...asset, bytes: bytes.slice()};
|
|
208
208
|
let resolve;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rapier-embed",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.101",
|
|
4
4
|
"description": "Embed the Rapier Markdown editor or its lightweight reader (about 190 kB) in your web app. Runs offline from your own copy, saves to your storage, and takes your CSS and fonts. Your app's AI agent edits directly over WebMCP under the Will. MIT, no dependencies.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"markdown",
|
package/rapier-plugins.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": 1,
|
|
3
|
-
"release": "1.1.
|
|
3
|
+
"release": "1.1.101",
|
|
4
4
|
"directory": "Put every file in one directory, keeping each file's folder, and give the page its address with `plugins`. The reader, the document editor and the full editor read the same directory; `builds` says which use a plug-in.",
|
|
5
5
|
"plugins": [
|
|
6
6
|
{
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
],
|
|
12
12
|
"files": [
|
|
13
13
|
{
|
|
14
|
-
"file": "rapier-flowchart-1.1.
|
|
15
|
-
"bytes":
|
|
16
|
-
"sha384": "
|
|
17
|
-
"sri": "
|
|
18
|
-
"url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@main/flowchart/rapier-flowchart-1.1.
|
|
14
|
+
"file": "rapier-flowchart-1.1.101.js",
|
|
15
|
+
"bytes": 292737,
|
|
16
|
+
"sha384": "15d581733ac4cc6ab19b3bda4942333d29ac5ae4b563b70c9503b745d2661ca66fa73371e5073b8c98f393be691f81d1",
|
|
17
|
+
"sri": "FdWBczrEzGqxmzvaSUIzPSmsWuS1Y7cMlQO3RdJmHKZvpzNx5Qc7jJjzk75pH4HR",
|
|
18
|
+
"url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@main/flowchart/rapier-flowchart-1.1.101.js"
|
|
19
19
|
}
|
|
20
20
|
]
|
|
21
21
|
},
|
|
@@ -27,11 +27,11 @@
|
|
|
27
27
|
],
|
|
28
28
|
"files": [
|
|
29
29
|
{
|
|
30
|
-
"file": "rapier-docx-1.1.
|
|
31
|
-
"bytes":
|
|
32
|
-
"sha384": "
|
|
33
|
-
"sri": "
|
|
34
|
-
"url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@main/docx/rapier-docx-1.1.
|
|
30
|
+
"file": "rapier-docx-1.1.101.js",
|
|
31
|
+
"bytes": 578033,
|
|
32
|
+
"sha384": "1d6295d9ae3089e84f60dd71e08eac9e16e3d8ceaa5cd4ca2576366ee68d13eaf0d219e1c1979d51f0613720fafe8e64",
|
|
33
|
+
"sri": "HWKV2a4wiehPYN1x4I6snhbj2M6qXNTKJXY2buaNE+rw0hnhwZedUfBhNyD6/o5k",
|
|
34
|
+
"url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@main/docx/rapier-docx-1.1.101.js"
|
|
35
35
|
}
|
|
36
36
|
]
|
|
37
37
|
},
|
|
@@ -45,17 +45,17 @@
|
|
|
45
45
|
],
|
|
46
46
|
"files": [
|
|
47
47
|
{
|
|
48
|
-
"file": "rapier-math-1.0.
|
|
49
|
-
"bytes":
|
|
50
|
-
"sha384": "
|
|
51
|
-
"sri": "
|
|
52
|
-
"url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@main/math/rapier-math-1.0.
|
|
48
|
+
"file": "rapier-math-1.0.1.js",
|
|
49
|
+
"bytes": 803451,
|
|
50
|
+
"sha384": "d64767ea6a21c776b93008b0a91598fbaa2f8941d485e1df63554cb318c3b14ae7ef0a1369aec548aa388ee62db8d685",
|
|
51
|
+
"sri": "1kdn6mohx3a5MAiwqRWY+6oviUHUheHfY1VMsxjDsUrn7woTaa7FSKo4juYtuNaF",
|
|
52
|
+
"url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@main/math/rapier-math-1.0.1.js"
|
|
53
53
|
}
|
|
54
54
|
]
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
"name": "diagrams",
|
|
58
|
-
"adds": "Draws
|
|
58
|
+
"adds": "Draws Mermaid diagrams with Rapier: sequence, class, state, ER, Gantt, pie and more.",
|
|
59
59
|
"builds": [
|
|
60
60
|
"reader",
|
|
61
61
|
"document",
|
|
@@ -63,18 +63,11 @@
|
|
|
63
63
|
],
|
|
64
64
|
"files": [
|
|
65
65
|
{
|
|
66
|
-
"file": "
|
|
67
|
-
"bytes":
|
|
68
|
-
"sha384": "
|
|
69
|
-
"sri": "
|
|
70
|
-
"url": "https://cdn.jsdelivr.net/
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"file": "rapier-zenuml-4.5.0-1.js",
|
|
74
|
-
"bytes": 1890966,
|
|
75
|
-
"sha384": "3159ff3abd672074c3bf2f38952489007d85c7563b006a1a31f77b856ee2dcb25eeccfdd6aef150c59c5f10f97d2a3a5",
|
|
76
|
-
"sri": "MVn/Or1nIHTDvy84lSSJAH2Fx1Y7AGoaMfd7hW7i3LJe7M/dau8VDFnF8Q+X0qOl",
|
|
77
|
-
"url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier@main/site/plugins/rapier-zenuml-4.5.0-1.js"
|
|
66
|
+
"file": "rapier-diagrams-1.1.101.js",
|
|
67
|
+
"bytes": 294857,
|
|
68
|
+
"sha384": "7e64077953899d7d60c1aa958a19c8fc51523fc866f8187f74b416435ef2bd4009a05f6d15dd9dea6639b59db8f6df2e",
|
|
69
|
+
"sri": "fmQHeVOJnX1gwaqVihnI/FFSP8hm+Bh/dLQWQ17yvUAJoF9tFd2d6mY5tZ249t8u",
|
|
70
|
+
"url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@main/diagrams/rapier-diagrams-1.1.101.js"
|
|
78
71
|
}
|
|
79
72
|
]
|
|
80
73
|
},
|
|
@@ -88,11 +81,11 @@
|
|
|
88
81
|
],
|
|
89
82
|
"files": [
|
|
90
83
|
{
|
|
91
|
-
"file": "rapier-pdf-1.1.
|
|
92
|
-
"bytes":
|
|
93
|
-
"sha384": "
|
|
94
|
-
"sri": "
|
|
95
|
-
"url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@main/pdf/rapier-pdf-1.1.
|
|
84
|
+
"file": "rapier-pdf-1.1.101.js",
|
|
85
|
+
"bytes": 28665,
|
|
86
|
+
"sha384": "88ab886108233b36a8750e8da1bf18a0977f95d33222114a15b3c70d7127af6a17f3e8dea4aa500a91300df68fa3fd72",
|
|
87
|
+
"sri": "iKuIYQgjOzaodQ6Nob8YoJd/ldMyIhFKFbPHDXEnr2oX8+jepKpQCpEwDfaPo/1y",
|
|
88
|
+
"url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier-plugins@main/pdf/rapier-pdf-1.1.101.js",
|
|
96
89
|
"builds": [
|
|
97
90
|
"reader"
|
|
98
91
|
]
|
|
@@ -1562,9 +1555,9 @@
|
|
|
1562
1555
|
"files": [
|
|
1563
1556
|
{
|
|
1564
1557
|
"file": "rapier-font-subset-1.js",
|
|
1565
|
-
"bytes":
|
|
1566
|
-
"sha384": "
|
|
1567
|
-
"sri": "
|
|
1558
|
+
"bytes": 1214356,
|
|
1559
|
+
"sha384": "ab8987037faedcddd8b7ccf5c22b0211742a58da395211d9d275044a277c046359cfa06d57c75252554ebf29dd7344e3",
|
|
1560
|
+
"sri": "q4mHA3+u3N3Yt8z1wisCEXQqWNo5UhHZ0nUESid8BGNZz6BtV8dSUlVOvyndc0Tj",
|
|
1568
1561
|
"url": "https://cdn.jsdelivr.net/gh/jackskip22/rapier@main/site/plugins/rapier-font-subset-1.js"
|
|
1569
1562
|
}
|
|
1570
1563
|
]
|