@missing-elements/h5p-offline-player 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/LICENSE +21 -0
- package/README.md +273 -0
- package/dist/VERSION +1 -0
- package/dist/frame-assets/MANIFEST.json +4 -0
- package/dist/frame-assets/fonts/h5p-core-30.woff2 +0 -0
- package/dist/frame-assets/fonts/h5p-hub-publish.woff +0 -0
- package/dist/frame-assets/fonts/h5p-hub-publish.woff2 +0 -0
- package/dist/frame-assets/fonts/h5p-theme.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/Inter-ExtraBold.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/Inter-ExtraBoldItalic.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/LICENSE.txt +92 -0
- package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-600.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-600italic.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-italic.woff2 +0 -0
- package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-regular.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/OFL.txt +88 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-600.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-600italic.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-700.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-700italic.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-italic.woff2 +0 -0
- package/dist/frame-assets/fonts/open-sans/open-sans-v40-cyrillic_cyrillic-ext_greek_greek-ext_hebrew_latin_latin-ext_math_symbols_vietnamese-regular.woff2 +0 -0
- package/dist/frame-assets/frame.bundle.js +1 -0
- package/dist/frame-assets/images/h5p.svg +16 -0
- package/dist/frame-assets/images/throbber.gif +0 -0
- package/dist/frame-assets/main.bundle.js +2 -0
- package/dist/frame-assets/styles/h5p-fonts.css +103 -0
- package/dist/frame-assets/styles/h5p.css +1643 -0
- package/dist/h5p-player.js +1780 -0
- package/dist/h5p-sw-mount.js +88 -0
- package/dist/h5p-sw.js +88 -0
- package/package.json +81 -0
- package/types/h5p-offline-player.d.ts +154 -0
- package/types/jobs/chunk-writer.d.ts +16 -0
- package/types/jobs/jobs-worker.d.ts +1 -0
- package/types/node/tsconfig.node.tsbuildinfo +1 -0
- package/types/node/vite.config.d.ts +6 -0
- package/types/node/vite.demo.config.d.ts +2 -0
- package/types/node/vite.plugins.d.ts +19 -0
- package/types/shared/chunk-store.d.ts +104 -0
- package/types/shared/constants.d.ts +67 -0
- package/types/shared/entry-names.d.ts +29 -0
- package/types/shared/eviction.d.ts +16 -0
- package/types/shared/forward-index.d.ts +85 -0
- package/types/shared/idb.d.ts +9 -0
- package/types/shared/locks.d.ts +14 -0
- package/types/shared/mime.d.ts +7 -0
- package/types/shared/mp4.d.ts +41 -0
- package/types/shared/pkg-id.d.ts +21 -0
- package/types/shared/protocol.d.ts +232 -0
- package/types/shared/range.d.ts +16 -0
- package/types/shared/source.d.ts +57 -0
- package/types/shared/stream-utils.d.ts +7 -0
- package/types/sw/frame-document.d.ts +19 -0
- package/types/sw/mount.d.ts +17 -0
- package/types/sw/package-reader.d.ts +242 -0
- package/types/sw/routes.d.ts +26 -0
- package/types/sw/stream-utils.d.ts +9 -0
- package/types/sw/sw-entry.d.ts +1 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 missing-elements
|
|
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,273 @@
|
|
|
1
|
+
# @missing-elements/h5p-offline-player
|
|
2
|
+
|
|
3
|
+
> **Not production ready.** This is an early release under active development. The API, the
|
|
4
|
+
> worker protocol and the cache layout can still change between versions, and the browser
|
|
5
|
+
> coverage is Chromium first. Try it, report what breaks, but do not put it in front of learners
|
|
6
|
+
> yet.
|
|
7
|
+
|
|
8
|
+
A browser-only H5P player, as one web component. It plays an arbitrary `.h5p` archive from a URL
|
|
9
|
+
or from disk — no server-side extraction, no backend, nothing to unpack ahead of time.
|
|
10
|
+
|
|
11
|
+
```html
|
|
12
|
+
<script type="module" src="h5p-player.js"></script>
|
|
13
|
+
<h5p-player src="https://host.example/course.h5p"></h5p-player>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Setting `src` loads, the way it does on `<video>`.
|
|
17
|
+
|
|
18
|
+
## Getting started
|
|
19
|
+
|
|
20
|
+
The player is three things: the element (`h5p-player.js`, an ES module), a Service Worker script
|
|
21
|
+
(`h5p-sw.js`) and a folder of H5P runtime files (`frame-assets/`). The worker is the one file that
|
|
22
|
+
has to be served from **your own origin**, because browsers refuse to register a worker from
|
|
23
|
+
anywhere else. The other two can come from your bundle or from a CDN.
|
|
24
|
+
|
|
25
|
+
> The package is being published to npm. Until it lands, build it from source: `git clone`,
|
|
26
|
+
> `npm install`, `npm run build`, and serve `dist/` where the snippets below say the package's
|
|
27
|
+
> files go.
|
|
28
|
+
|
|
29
|
+
**A · With a bundler** (Vite, webpack 5, Rollup):
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm i @missing-elements/h5p-offline-player
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```js
|
|
36
|
+
import '@missing-elements/h5p-offline-player'
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
```html
|
|
40
|
+
<h5p-player src="https://host.example/course.h5p" auto-resize></h5p-player>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
That is all. The element finds its worker and runtime files with
|
|
44
|
+
`new URL('./h5p-sw.js', import.meta.url)`, which these bundlers copy into the build and rewrite.
|
|
45
|
+
A bundler that does not follow that pattern, esbuild among them, leaves the files behind: then
|
|
46
|
+
serve the package's `dist/` folder from a static path and set `sw` and `assets-base` to it.
|
|
47
|
+
|
|
48
|
+
**B · No build step:**
|
|
49
|
+
|
|
50
|
+
```html
|
|
51
|
+
<script type="module"
|
|
52
|
+
src="https://cdn.jsdelivr.net/npm/@missing-elements/h5p-offline-player/dist/h5p-player.js"></script>
|
|
53
|
+
<h5p-player src="https://host.example/course.h5p" sw="/h5p-sw.js" auto-resize></h5p-player>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Copy `dist/h5p-sw.js` from the same CDN path onto your site and point `sw` at it. The frame assets
|
|
57
|
+
keep loading from the CDN. At the root its scope is `/h5p/`, not `/`, so an existing site worker
|
|
58
|
+
is left alone.
|
|
59
|
+
|
|
60
|
+
**C · An iframe, nothing on your site:** frame the hosted player page,
|
|
61
|
+
`/embed?src=<package url>`. It sizes itself through H5P's own resizer protocol and relays xAPI
|
|
62
|
+
statements to your page on request. See Setup C in the setup guide.
|
|
63
|
+
|
|
64
|
+
Requirements: the page is on `https://` or `localhost`, and the package's host sends CORS
|
|
65
|
+
headers. `Range` support on the host is optional; without it the archive is downloaded once and
|
|
66
|
+
played from the browser's cache.
|
|
67
|
+
|
|
68
|
+
```js
|
|
69
|
+
const player = document.querySelector('h5p-player')
|
|
70
|
+
player.addEventListener('xapi', (event) => send(event.detail.statement))
|
|
71
|
+
player.addEventListener('error', (event) => {
|
|
72
|
+
if (event.detail.code === 'no-cors') offerFilePicker()
|
|
73
|
+
})
|
|
74
|
+
input.addEventListener('change', () => { player.file = input.files[0] })
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The full guide, with single-worker hosts and troubleshooting, is
|
|
78
|
+
[h5p-player-setup.md](h5p-player-setup.md).
|
|
79
|
+
|
|
80
|
+
## How it works
|
|
81
|
+
|
|
82
|
+
An `.h5p` file is a zip. Normally a server unpacks it and serves the files; here a Service Worker
|
|
83
|
+
reads the archive in place and answers the H5P runtime's requests out of it:
|
|
84
|
+
|
|
85
|
+
- the archive's **central directory** is read over HTTP `Range` requests, so a 300 MB package
|
|
86
|
+
costs a few kilobytes before it starts;
|
|
87
|
+
- **large spans are pulled by several connections at once** and reassembled in order, because a
|
|
88
|
+
single connection is often capped well below the link;
|
|
89
|
+
- **small entries and scripts** are inflated once into a Cache API store;
|
|
90
|
+
- **large stored media** is sliced straight out of the archive — never extracted, never stored;
|
|
91
|
+
- **large deflated media** is inflated into 8 MB chunks by a page-side worker, and served
|
|
92
|
+
progressively as a shorter `206` so a cold video starts before extraction finishes;
|
|
93
|
+
- the **frame document** the runtime lives in is generated by the worker, with a per-response CSP.
|
|
94
|
+
|
|
95
|
+
Nothing larger than one chunk is ever held in memory. A host that does not honour `Range` is
|
|
96
|
+
handled by downloading the archive into the chunk store — indexed from its local headers as it
|
|
97
|
+
arrives, so a package laid out libraries-first boots while its media is still coming down. A host
|
|
98
|
+
with no CORS headers cannot be read by any browser, and the element says so with `error: no-cors`
|
|
99
|
+
so the page can offer a file picker instead.
|
|
100
|
+
|
|
101
|
+
## API
|
|
102
|
+
|
|
103
|
+
```html
|
|
104
|
+
<h5p-player
|
|
105
|
+
src="…" package URL — setting it loads; setting it again aborts and reloads
|
|
106
|
+
sw="…" worker URL (default: h5p-sw.js next to the element, same-origin)
|
|
107
|
+
assets-base="…" directory of the frame assets (default: next to the element)
|
|
108
|
+
libraries="…" where to get libraries a package does not carry (default: nowhere)
|
|
109
|
+
allow-origins="…" extra origins the frame's CSP should permit, space separated
|
|
110
|
+
auto-resize follow the content's own height
|
|
111
|
+
preload="auto" pull large deflated media before the content asks (default: none)
|
|
112
|
+
></h5p-player>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Video that cannot stream
|
|
116
|
+
|
|
117
|
+
Most media starts playing while the rest arrives. Two properties of a package stop that, and
|
|
118
|
+
some exports have both:
|
|
119
|
+
|
|
120
|
+
- the media is **deflated** in the zip rather than stored, so there is no byte a `Range` request
|
|
121
|
+
can reach without the whole stream up to it — and packagers routinely deflate an mp4 for a
|
|
122
|
+
0.9% saving;
|
|
123
|
+
- the mp4 is **not faststart**, so its `moov` index is the last few kilobytes of the file, and no
|
|
124
|
+
frame decodes until the final byte lands.
|
|
125
|
+
|
|
126
|
+
Together they mean a 220 MB video must transfer completely before it shows anything. Nothing on
|
|
127
|
+
the player's side shortens that: the bytes are genuinely required. What it can do is start
|
|
128
|
+
earlier.
|
|
129
|
+
|
|
130
|
+
```html
|
|
131
|
+
<h5p-player src="course.h5p" preload="auto"></h5p-player>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
After the content is up, the player pulls large deflated entries in archive order, one at a time,
|
|
135
|
+
so the wait happens while the learner is still on the first slide instead of when they press
|
|
136
|
+
play. It waits for the content to appear first — those same bytes would otherwise compete with
|
|
137
|
+
the archive reads that boot the runtime — and it never runs two at once, which would only halve
|
|
138
|
+
the rate of whichever video is needed first.
|
|
139
|
+
|
|
140
|
+
It is off by default: it spends a learner's bandwidth on media they may never reach, and that is
|
|
141
|
+
the host's call. Progress arrives as `progress` events with `phase: 'extract'`.
|
|
142
|
+
|
|
143
|
+
The real fix belongs to whoever builds the package, and the repository ships it as a script:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
npm run normalize -- course.h5p # writes course.normalized.h5p beside it
|
|
147
|
+
npm run normalize -- https://…/course.h5p --dry-run # inspect only
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
It rewrites the container and leaves the content alone: media is stored rather than deflated, an
|
|
151
|
+
mp4 whose index sits at the end is remuxed so the index comes first, entries are ordered so the
|
|
152
|
+
libraries arrive before the media, and text an exporter left stored is deflated. The package
|
|
153
|
+
grows by about 1% and any H5P host still accepts it. For the 220 MB example above, the video
|
|
154
|
+
starts after about a megabyte instead of after the last byte, and seeking works at once.
|
|
155
|
+
|
|
156
|
+
### What the frame is allowed to reach
|
|
157
|
+
|
|
158
|
+
The frame runs untrusted content under a generated CSP. Media, images and iframes are open, so
|
|
159
|
+
embedded video works; scripts are same-origin plus a short list of what content types genuinely
|
|
160
|
+
load at runtime — MathJax for H5P.MathDisplay, Google's WebFont loader, and the YouTube, Vimeo
|
|
161
|
+
and Panopto player APIs that H5P.Video puts in the document before it embeds anything.
|
|
162
|
+
|
|
163
|
+
For a host the list cannot know about — a tenant's own Panopto or Echo360 server, an in-house
|
|
164
|
+
CDN — `allow-origins` adds it:
|
|
165
|
+
|
|
166
|
+
```html
|
|
167
|
+
<h5p-player src="…" allow-origins="https://tenant.panopto.com https://cdn.corp.example"></h5p-player>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
It only ever adds hosts. Anything that is not plainly a host is dropped, so a stray value cannot
|
|
171
|
+
append directives of its own. A blocked resource names its directive and origin in the console.
|
|
172
|
+
|
|
173
|
+
The policy allows `'unsafe-eval'`. Packages that bundle EmbeddedJS — board games, older question
|
|
174
|
+
sets — compile their templates with `eval` and render nothing without it. It gives an attacker no
|
|
175
|
+
reach the archive's own scripts lack: those are served from the frame's origin and already run
|
|
176
|
+
under `'self'`, so anyone who can put a file in the package can already run what they like. What
|
|
177
|
+
the policy is for is limiting where code and data can come *from*, and this does not widen that.
|
|
178
|
+
|
|
179
|
+
### Packages without libraries
|
|
180
|
+
|
|
181
|
+
Exports from h5p.com and h5p.org routinely contain `content/` and nothing else: the site they
|
|
182
|
+
came from already has the libraries, so bundling them would be waste. Anywhere else such a
|
|
183
|
+
package cannot run, and the runtime's only symptom is a 404 for `<MainLibrary>/library.json`.
|
|
184
|
+
|
|
185
|
+
The player refuses these up front and names what is absent. `libraries` tells it where to look
|
|
186
|
+
instead:
|
|
187
|
+
|
|
188
|
+
```html
|
|
189
|
+
<!-- the official H5P content-type server, keyed on the package's mainLibrary -->
|
|
190
|
+
<h5p-player src="stripped.h5p" libraries="hub"></h5p-player>
|
|
191
|
+
|
|
192
|
+
<!-- or any .h5p that carries the library folders -->
|
|
193
|
+
<h5p-player src="stripped.h5p" libraries="/h5p/libraries-bundle.h5p"></h5p-player>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Entries then resolve against the package first and the bundle second, and the two `h5p.json`
|
|
197
|
+
manifests are merged — a stripped export also cuts `preloadedDependencies` down to the main
|
|
198
|
+
library, so without the merge an Interactive Video would load but its interactions would not. The
|
|
199
|
+
bundle is downloaded once, cached, and shared by every package that uses it.
|
|
200
|
+
|
|
201
|
+
It is off by default. `libraries="hub"` is a request to a third party on every cold load, which is
|
|
202
|
+
the host's decision to make, not the element's.
|
|
203
|
+
|
|
204
|
+
Properties: `src`, `file` (a `File` from a picker — setting it loads), `pkgId`, `state`
|
|
205
|
+
(`idle | probing | downloading | indexing | ready | error`), `scope` (read-only).
|
|
206
|
+
|
|
207
|
+
| Event | When |
|
|
208
|
+
|---|---|
|
|
209
|
+
| `ready` | The runtime is up and the content is visible |
|
|
210
|
+
| `xapi` | Any xAPI statement from the content — the only channel for results; nothing is stored |
|
|
211
|
+
| `finished` | The content reported completion, with its score |
|
|
212
|
+
| `progress` | Download or extraction progress, `fraction` 0–1 (or `null` when the total is unknown) |
|
|
213
|
+
| `resize` | The content's height changed |
|
|
214
|
+
| `statechange` | `state` changed |
|
|
215
|
+
| `error` | `code`: `no-cors`, `no-worker`, `network`, `quota`, `bad-archive`, `runtime` |
|
|
216
|
+
|
|
217
|
+
```js
|
|
218
|
+
const player = document.querySelector('h5p-player')
|
|
219
|
+
player.addEventListener('xapi', (e) => console.log(e.detail.statement))
|
|
220
|
+
player.addEventListener('error', (e) => {
|
|
221
|
+
if (e.detail.code === 'no-cors') showDownloadHint()
|
|
222
|
+
})
|
|
223
|
+
input.onchange = () => (player.file = input.files[0])
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
The element renders the content and nothing else — no URL field, no file picker, no progress bar,
|
|
227
|
+
no "open in another browser" banner. Those belong to the host page, built out of these events.
|
|
228
|
+
`index.html` in this repo is a working example of one.
|
|
229
|
+
|
|
230
|
+
## Requirements
|
|
231
|
+
|
|
232
|
+
- The page is served over `https://` or `localhost`. Service Workers do not run on `http://` or
|
|
233
|
+
`file://`.
|
|
234
|
+
- `h5p-sw.js` is served from the site's own origin — browsers reject cross-origin Service Worker
|
|
235
|
+
registration. With a bundler this is automatic. Frame assets may come from a CDN.
|
|
236
|
+
- Package URLs send CORS headers. `Range` support is optional but avoids a full download first.
|
|
237
|
+
|
|
238
|
+
Integration details, including bundler-specific setup and single-worker hosts, are in
|
|
239
|
+
[h5p-player-setup.md](h5p-player-setup.md). The design is in
|
|
240
|
+
[h5p-offline-player-architecture.md](h5p-offline-player-architecture.md).
|
|
241
|
+
|
|
242
|
+
## Development
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
npm install
|
|
246
|
+
npx playwright install chromium # once, for the browser tests
|
|
247
|
+
|
|
248
|
+
npm run dev # the demo player page on http://localhost:5173
|
|
249
|
+
npm test # unit tests plus the browser suite
|
|
250
|
+
npm run build
|
|
251
|
+
npm run normalize -- course.h5p # rewrite a package so it streams (see above)
|
|
252
|
+
npm run build:demo # the hosted demo, as Vercel builds it, into dist-demo/
|
|
253
|
+
npm run preview:demo # serve it locally with the production headers
|
|
254
|
+
npm run demo:content # rebuild the demo's content packages from their sources
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
`npm run dev` serves the player page with real content — a quiz, an interactive video, an
|
|
258
|
+
accordion and dialog cards, built from H5P hub libraries around text written for this player —
|
|
259
|
+
plus, in dev only, generated test archives under `/fixtures/` covering each path the player
|
|
260
|
+
takes: a host that honours `Range` and one that does not, 20 MB of deflated and of stored media,
|
|
261
|
+
hostile entry names, a file that is not an H5P package. `/demo/` is the two-line integration,
|
|
262
|
+
with the other ways to embed it — xAPI, a file from disk, an iframe, two players on one page —
|
|
263
|
+
linked from there.
|
|
264
|
+
|
|
265
|
+
The demo site deploys to Vercel from `vercel.json`: the pages, the element, its worker and the
|
|
266
|
+
frame assets as static files, plus one function that plays a host without `Range` support.
|
|
267
|
+
|
|
268
|
+
Working on the code? Start with [AGENTS.md](AGENTS.md).
|
|
269
|
+
|
|
270
|
+
## Licence
|
|
271
|
+
|
|
272
|
+
MIT. Bundles [h5p-standalone](https://github.com/tunapanda/h5p-standalone) (MIT) as the runtime
|
|
273
|
+
and [zip.js](https://github.com/gildas-lormeau/zip.js) (BSD-3-Clause) as the archive reader.
|
package/dist/VERSION
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.1.0
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
Copyright (c) 2016 The Inter Project Authors (https://github.com/rsms/inter)
|
|
2
|
+
|
|
3
|
+
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
4
|
+
This license is copied below, and is also available with a FAQ at:
|
|
5
|
+
http://scripts.sil.org/OFL
|
|
6
|
+
|
|
7
|
+
-----------------------------------------------------------
|
|
8
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
9
|
+
-----------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
PREAMBLE
|
|
12
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
13
|
+
development of collaborative font projects, to support the font creation
|
|
14
|
+
efforts of academic and linguistic communities, and to provide a free and
|
|
15
|
+
open framework in which fonts may be shared and improved in partnership
|
|
16
|
+
with others.
|
|
17
|
+
|
|
18
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
19
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
20
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
21
|
+
redistributed and/or sold with any software provided that any reserved
|
|
22
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
23
|
+
however, cannot be released under any other type of license. The
|
|
24
|
+
requirement for fonts to remain under this license does not apply
|
|
25
|
+
to any document created using the fonts or their derivatives.
|
|
26
|
+
|
|
27
|
+
DEFINITIONS
|
|
28
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
29
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
30
|
+
include source files, build scripts and documentation.
|
|
31
|
+
|
|
32
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
33
|
+
copyright statement(s).
|
|
34
|
+
|
|
35
|
+
"Original Version" refers to the collection of Font Software components as
|
|
36
|
+
distributed by the Copyright Holder(s).
|
|
37
|
+
|
|
38
|
+
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
39
|
+
or substituting -- in part or in whole -- any of the components of the
|
|
40
|
+
Original Version, by changing formats or by porting the Font Software to a
|
|
41
|
+
new environment.
|
|
42
|
+
|
|
43
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
44
|
+
writer or other person who contributed to the Font Software.
|
|
45
|
+
|
|
46
|
+
PERMISSION AND CONDITIONS
|
|
47
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
48
|
+
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
49
|
+
redistribute, and sell modified and unmodified copies of the Font
|
|
50
|
+
Software, subject to the following conditions:
|
|
51
|
+
|
|
52
|
+
1) Neither the Font Software nor any of its individual components,
|
|
53
|
+
in Original or Modified Versions, may be sold by itself.
|
|
54
|
+
|
|
55
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
56
|
+
redistributed and/or sold with any software, provided that each copy
|
|
57
|
+
contains the above copyright notice and this license. These can be
|
|
58
|
+
included either as stand-alone text files, human-readable headers or
|
|
59
|
+
in the appropriate machine-readable metadata fields within text or
|
|
60
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
61
|
+
|
|
62
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
63
|
+
Name(s) unless explicit written permission is granted by the corresponding
|
|
64
|
+
Copyright Holder. This restriction only applies to the primary font name as
|
|
65
|
+
presented to the users.
|
|
66
|
+
|
|
67
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
68
|
+
Software shall not be used to promote, endorse or advertise any
|
|
69
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
70
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
71
|
+
permission.
|
|
72
|
+
|
|
73
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
74
|
+
must be distributed entirely under this license, and must not be
|
|
75
|
+
distributed under any other license. The requirement for fonts to
|
|
76
|
+
remain under this license does not apply to any document created
|
|
77
|
+
using the Font Software.
|
|
78
|
+
|
|
79
|
+
TERMINATION
|
|
80
|
+
This license becomes null and void if any of the above conditions are
|
|
81
|
+
not met.
|
|
82
|
+
|
|
83
|
+
DISCLAIMER
|
|
84
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
85
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
86
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
87
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
88
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
89
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
90
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
91
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
92
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
Copyright 2020 The Open Sans Project Authors (https://github.com/googlefonts/opensans)
|
|
2
|
+
|
|
3
|
+
-----------------------------------------------------------
|
|
4
|
+
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
5
|
+
-----------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
PREAMBLE
|
|
8
|
+
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
9
|
+
development of collaborative font projects, to support the font
|
|
10
|
+
creation efforts of academic and linguistic communities, and to
|
|
11
|
+
provide a free and open framework in which fonts may be shared and
|
|
12
|
+
improved in partnership with others.
|
|
13
|
+
|
|
14
|
+
The OFL allows the licensed fonts to be used, studied, modified and
|
|
15
|
+
redistributed freely as long as they are not sold by themselves. The
|
|
16
|
+
fonts, including any derivative works, can be bundled, embedded,
|
|
17
|
+
redistributed and/or sold with any software provided that any reserved
|
|
18
|
+
names are not used by derivative works. The fonts and derivatives,
|
|
19
|
+
however, cannot be released under any other type of license. The
|
|
20
|
+
requirement for fonts to remain under this license does not apply to
|
|
21
|
+
any document created using the fonts or their derivatives.
|
|
22
|
+
|
|
23
|
+
DEFINITIONS
|
|
24
|
+
"Font Software" refers to the set of files released by the Copyright
|
|
25
|
+
Holder(s) under this license and clearly marked as such. This may
|
|
26
|
+
include source files, build scripts and documentation.
|
|
27
|
+
|
|
28
|
+
"Reserved Font Name" refers to any names specified as such after the
|
|
29
|
+
copyright statement(s).
|
|
30
|
+
|
|
31
|
+
"Original Version" refers to the collection of Font Software
|
|
32
|
+
components as distributed by the Copyright Holder(s).
|
|
33
|
+
|
|
34
|
+
"Modified Version" refers to any derivative made by adding to,
|
|
35
|
+
deleting, or substituting -- in part or in whole -- any of the
|
|
36
|
+
components of the Original Version, by changing formats or by porting
|
|
37
|
+
the Font Software to a new environment.
|
|
38
|
+
|
|
39
|
+
"Author" refers to any designer, engineer, programmer, technical
|
|
40
|
+
writer or other person who contributed to the Font Software.
|
|
41
|
+
|
|
42
|
+
PERMISSION & CONDITIONS
|
|
43
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
44
|
+
a copy of the Font Software, to use, study, copy, merge, embed,
|
|
45
|
+
modify, redistribute, and sell modified and unmodified copies of the
|
|
46
|
+
Font Software, subject to the following conditions:
|
|
47
|
+
|
|
48
|
+
1) Neither the Font Software nor any of its individual components, in
|
|
49
|
+
Original or Modified Versions, may be sold by itself.
|
|
50
|
+
|
|
51
|
+
2) Original or Modified Versions of the Font Software may be bundled,
|
|
52
|
+
redistributed and/or sold with any software, provided that each copy
|
|
53
|
+
contains the above copyright notice and this license. These can be
|
|
54
|
+
included either as stand-alone text files, human-readable headers or
|
|
55
|
+
in the appropriate machine-readable metadata fields within text or
|
|
56
|
+
binary files as long as those fields can be easily viewed by the user.
|
|
57
|
+
|
|
58
|
+
3) No Modified Version of the Font Software may use the Reserved Font
|
|
59
|
+
Name(s) unless explicit written permission is granted by the
|
|
60
|
+
corresponding Copyright Holder. This restriction only applies to the
|
|
61
|
+
primary font name as presented to the users.
|
|
62
|
+
|
|
63
|
+
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
64
|
+
Software shall not be used to promote, endorse or advertise any
|
|
65
|
+
Modified Version, except to acknowledge the contribution(s) of the
|
|
66
|
+
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
67
|
+
permission.
|
|
68
|
+
|
|
69
|
+
5) The Font Software, modified or unmodified, in part or in whole,
|
|
70
|
+
must be distributed entirely under this license, and must not be
|
|
71
|
+
distributed under any other license. The requirement for fonts to
|
|
72
|
+
remain under this license does not apply to any document created using
|
|
73
|
+
the Font Software.
|
|
74
|
+
|
|
75
|
+
TERMINATION
|
|
76
|
+
This license becomes null and void if any of the above conditions are
|
|
77
|
+
not met.
|
|
78
|
+
|
|
79
|
+
DISCLAIMER
|
|
80
|
+
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
81
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
82
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
83
|
+
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
84
|
+
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
85
|
+
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
86
|
+
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
87
|
+
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
88
|
+
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|