@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.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +273 -0
  3. package/dist/VERSION +1 -0
  4. package/dist/frame-assets/MANIFEST.json +4 -0
  5. package/dist/frame-assets/fonts/h5p-core-30.woff2 +0 -0
  6. package/dist/frame-assets/fonts/h5p-hub-publish.woff +0 -0
  7. package/dist/frame-assets/fonts/h5p-hub-publish.woff2 +0 -0
  8. package/dist/frame-assets/fonts/h5p-theme.woff2 +0 -0
  9. package/dist/frame-assets/fonts/inter/Inter-ExtraBold.woff2 +0 -0
  10. package/dist/frame-assets/fonts/inter/Inter-ExtraBoldItalic.woff2 +0 -0
  11. package/dist/frame-assets/fonts/inter/LICENSE.txt +92 -0
  12. package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-600.woff2 +0 -0
  13. package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-600italic.woff2 +0 -0
  14. package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-italic.woff2 +0 -0
  15. package/dist/frame-assets/fonts/inter/inter-v18-cyrillic_cyrillic-ext_greek_greek-ext_latin_latin-ext_vietnamese-regular.woff2 +0 -0
  16. package/dist/frame-assets/fonts/open-sans/OFL.txt +88 -0
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. package/dist/frame-assets/frame.bundle.js +1 -0
  24. package/dist/frame-assets/images/h5p.svg +16 -0
  25. package/dist/frame-assets/images/throbber.gif +0 -0
  26. package/dist/frame-assets/main.bundle.js +2 -0
  27. package/dist/frame-assets/styles/h5p-fonts.css +103 -0
  28. package/dist/frame-assets/styles/h5p.css +1643 -0
  29. package/dist/h5p-player.js +1780 -0
  30. package/dist/h5p-sw-mount.js +88 -0
  31. package/dist/h5p-sw.js +88 -0
  32. package/package.json +81 -0
  33. package/types/h5p-offline-player.d.ts +154 -0
  34. package/types/jobs/chunk-writer.d.ts +16 -0
  35. package/types/jobs/jobs-worker.d.ts +1 -0
  36. package/types/node/tsconfig.node.tsbuildinfo +1 -0
  37. package/types/node/vite.config.d.ts +6 -0
  38. package/types/node/vite.demo.config.d.ts +2 -0
  39. package/types/node/vite.plugins.d.ts +19 -0
  40. package/types/shared/chunk-store.d.ts +104 -0
  41. package/types/shared/constants.d.ts +67 -0
  42. package/types/shared/entry-names.d.ts +29 -0
  43. package/types/shared/eviction.d.ts +16 -0
  44. package/types/shared/forward-index.d.ts +85 -0
  45. package/types/shared/idb.d.ts +9 -0
  46. package/types/shared/locks.d.ts +14 -0
  47. package/types/shared/mime.d.ts +7 -0
  48. package/types/shared/mp4.d.ts +41 -0
  49. package/types/shared/pkg-id.d.ts +21 -0
  50. package/types/shared/protocol.d.ts +232 -0
  51. package/types/shared/range.d.ts +16 -0
  52. package/types/shared/source.d.ts +57 -0
  53. package/types/shared/stream-utils.d.ts +7 -0
  54. package/types/sw/frame-document.d.ts +19 -0
  55. package/types/sw/mount.d.ts +17 -0
  56. package/types/sw/package-reader.d.ts +242 -0
  57. package/types/sw/routes.d.ts +26 -0
  58. package/types/sw/stream-utils.d.ts +9 -0
  59. 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
@@ -0,0 +1,4 @@
1
+ {
2
+ "h5pStandalone": "3.8.2",
3
+ "player": "0.1.0"
4
+ }
@@ -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.
@@ -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.