@cube-nl/dmp-sdk 1.0.0-rc.3 → 1.1.0-rc.1

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 (89) hide show
  1. package/README.md +347 -25
  2. package/dist/app.d.ts +36 -2
  3. package/dist/app.js +192 -10
  4. package/dist/browser.js +6 -1
  5. package/dist/client.d.ts +2 -0
  6. package/dist/cube-sdk.js +179 -2
  7. package/dist/cube-ui.manifest.json +971 -0
  8. package/dist/index.d.ts +6 -0
  9. package/dist/index.js +4 -0
  10. package/dist/preview.d.ts +18 -0
  11. package/dist/preview.js +199 -34
  12. package/dist/size.json +6 -0
  13. package/dist/ui/aggregate-block.d.ts +73 -0
  14. package/dist/ui/aggregate-block.js +138 -0
  15. package/dist/ui/attributes.d.ts +5 -0
  16. package/dist/ui/attributes.js +72 -0
  17. package/dist/ui/block.d.ts +63 -0
  18. package/dist/ui/block.js +229 -0
  19. package/dist/ui/blocks/app-shell.d.ts +4 -0
  20. package/dist/ui/blocks/app-shell.js +167 -0
  21. package/dist/ui/blocks/board.d.ts +8 -0
  22. package/dist/ui/blocks/board.js +292 -0
  23. package/dist/ui/blocks/calc.d.ts +9 -0
  24. package/dist/ui/blocks/calc.js +240 -0
  25. package/dist/ui/blocks/chart.d.ts +7 -0
  26. package/dist/ui/blocks/chart.js +166 -0
  27. package/dist/ui/blocks/detail.d.ts +8 -0
  28. package/dist/ui/blocks/detail.js +270 -0
  29. package/dist/ui/blocks/field.d.ts +8 -0
  30. package/dist/ui/blocks/field.js +16 -0
  31. package/dist/ui/blocks/form.d.ts +8 -0
  32. package/dist/ui/blocks/form.js +153 -0
  33. package/dist/ui/blocks/gap-list.d.ts +4 -0
  34. package/dist/ui/blocks/gap-list.js +36 -0
  35. package/dist/ui/blocks/kpi.d.ts +4 -0
  36. package/dist/ui/blocks/kpi.js +74 -0
  37. package/dist/ui/blocks/period-picker.d.ts +4 -0
  38. package/dist/ui/blocks/period-picker.js +155 -0
  39. package/dist/ui/blocks/state.d.ts +4 -0
  40. package/dist/ui/blocks/state.js +135 -0
  41. package/dist/ui/blocks/table.d.ts +8 -0
  42. package/dist/ui/blocks/table.js +607 -0
  43. package/dist/ui/blocks/top.d.ts +4 -0
  44. package/dist/ui/blocks/top.js +67 -0
  45. package/dist/ui/chart-svg.d.ts +28 -0
  46. package/dist/ui/chart-svg.js +111 -0
  47. package/dist/ui/csv.d.ts +9 -0
  48. package/dist/ui/csv.js +55 -0
  49. package/dist/ui/define.d.ts +24 -0
  50. package/dist/ui/define.js +107 -0
  51. package/dist/ui/dom.d.ts +12 -0
  52. package/dist/ui/dom.js +57 -0
  53. package/dist/ui/fields.d.ts +39 -0
  54. package/dist/ui/fields.js +73 -0
  55. package/dist/ui/format.d.ts +44 -0
  56. package/dist/ui/format.js +214 -0
  57. package/dist/ui/inputs.d.ts +35 -0
  58. package/dist/ui/inputs.js +161 -0
  59. package/dist/ui/manifest.d.ts +40 -0
  60. package/dist/ui/manifest.js +878 -0
  61. package/dist/ui/period.d.ts +18 -0
  62. package/dist/ui/period.js +52 -0
  63. package/dist/ui/query.d.ts +26 -0
  64. package/dist/ui/query.js +98 -0
  65. package/dist/ui/schema.d.ts +23 -0
  66. package/dist/ui/schema.js +21 -0
  67. package/dist/ui/styles.d.ts +8 -0
  68. package/dist/ui/styles.js +51 -0
  69. package/dist/ui/texts.d.ts +134 -0
  70. package/dist/ui/texts.js +122 -0
  71. package/dist/ui/theme.d.ts +58 -0
  72. package/dist/ui/theme.js +311 -0
  73. package/dist/ui/write.d.ts +20 -0
  74. package/dist/ui/write.js +54 -0
  75. package/dist/version.d.ts +1 -1
  76. package/dist/version.js +1 -1
  77. package/dist/wireframe.d.ts +37 -0
  78. package/dist/wireframe.js +315 -0
  79. package/fonts/OFL-albert-sans.txt +93 -0
  80. package/fonts/OFL-ibm-plex-sans.txt +93 -0
  81. package/fonts/OFL-inter.txt +93 -0
  82. package/fonts/OFL-nunito-sans.txt +93 -0
  83. package/fonts/OFL-source-sans-3.txt +93 -0
  84. package/fonts/albert-sans.woff2 +0 -0
  85. package/fonts/ibm-plex-sans.woff2 +0 -0
  86. package/fonts/inter.woff2 +0 -0
  87. package/fonts/nunito-sans.woff2 +0 -0
  88. package/fonts/source-sans-3.woff2 +0 -0
  89. package/package.json +8 -3
@@ -0,0 +1,315 @@
1
+ import { DmpError } from './errors.js';
2
+ import { PreviewStore } from './preview.js';
3
+ import { isoDate } from './ui/format.js';
4
+ const FORMATS = {
5
+ tekst: 'text',
6
+ getal: 'number',
7
+ bedrag: 'currency',
8
+ datum: 'date',
9
+ keuze: 'text',
10
+ 'ja/nee': 'boolean',
11
+ };
12
+ const filled = (value) => typeof value === 'string' && value !== '';
13
+ const own = (row, key) => Object.prototype.hasOwnProperty.call(row, key);
14
+ function isGap(value) {
15
+ if (typeof value !== 'object' || value === null) {
16
+ return false;
17
+ }
18
+ const entry = value;
19
+ const waarden = entry.waarden;
20
+ return typeof entry.resource === 'string'
21
+ && /^[a-z][a-z0-9_]*$/.test(entry.resource)
22
+ && (entry.veld === undefined || filled(entry.veld))
23
+ && typeof entry.type === 'string'
24
+ && own(FORMATS, entry.type)
25
+ && (waarden === undefined || (Array.isArray(waarden) && waarden.every((item) => typeof item === 'string')))
26
+ && (entry.type !== 'keuze' || (Array.isArray(waarden) && waarden.length > 0))
27
+ && filled(entry.scherm)
28
+ && filled(entry.reden);
29
+ }
30
+ /** The valid gap entries of `ontbreekt`; malformed ones are dropped with a single warning. */
31
+ export function readGaps(value) {
32
+ if (!Array.isArray(value)) {
33
+ return [];
34
+ }
35
+ const gaps = value.filter(isGap);
36
+ const dropped = value.filter((entry) => !isGap(entry));
37
+ if (dropped.length > 0) {
38
+ console.warn(`cube-app.json ontbreekt: ${dropped.length} malformed entries ignored`, dropped);
39
+ }
40
+ return gaps;
41
+ }
42
+ export function gapFormat(type) {
43
+ return FORMATS[type];
44
+ }
45
+ /**
46
+ * A schema with the missing fields of its resource added, so a block that takes its columns from the schema shows
47
+ * them, and can filter and sort on them (the page only). They are writable: a wireframe's writes stay in the browser.
48
+ */
49
+ export function withGaps(schema, gaps) {
50
+ if (schema === null) {
51
+ return null;
52
+ }
53
+ // Only these two formats are carried by a schema field; the others follow from its type.
54
+ const shown = (type) => {
55
+ const format = gapFormat(type);
56
+ return format === 'date' || format === 'currency' ? format : null;
57
+ };
58
+ const added = gaps.flatMap(({ resource, veld, type, waarden, reden }) => {
59
+ if (resource !== schema.name || veld === undefined || schema.fields.some((field) => field.name === veld)) {
60
+ return [];
61
+ }
62
+ const format = gapFormat(type);
63
+ return [{
64
+ name: veld,
65
+ type: format === 'boolean' ? format : format === 'number' || format === 'currency' ? 'number' : 'string',
66
+ format: shown(type),
67
+ nullable: true,
68
+ readonly: false,
69
+ enum: waarden ?? null,
70
+ description: reden,
71
+ }];
72
+ });
73
+ const names = added.map((field) => field.name);
74
+ return {
75
+ ...schema,
76
+ // Mock data may hold a missing field without its format: an amount there still shows as money.
77
+ fields: [...schema.fields.map((field) => {
78
+ const gap = gaps.find(({ resource, veld }) => resource === schema.name && veld === field.name);
79
+ return gap !== undefined && field.format == null ? { ...field, format: shown(gap.type) } : field;
80
+ }), ...added],
81
+ // An empty summary means "every field of a row", which already holds the invented ones.
82
+ summary: schema.summary.length > 0 ? [...schema.summary, ...names] : schema.summary,
83
+ filterable: [...schema.filterable, ...names],
84
+ sortable: [...schema.sortable, ...names],
85
+ };
86
+ }
87
+ // FNV-1a 32-bit: a stable hash, so the same row gets the same invented value on every render and reload.
88
+ function fnv1a(text) {
89
+ let hash = 0x811c9dc5;
90
+ for (let i = 0; i < text.length; i++) {
91
+ hash = Math.imul(hash ^ text.charCodeAt(i), 0x01000193) >>> 0;
92
+ }
93
+ return hash;
94
+ }
95
+ /** An example value for a missing field of row `id`: from mock rows that carry the field, else made up by type. */
96
+ export function inventValue(gap, id, mockRows) {
97
+ const { veld, type, waarden } = gap;
98
+ const h = fnv1a(`${gap.resource}.${veld}.${String(id)}`);
99
+ if (veld !== undefined) {
100
+ const rowsWithField = mockRows.filter((row) => own(row, veld) && row[veld] !== undefined);
101
+ if (rowsWithField.length > 0) {
102
+ return rowsWithField[h % rowsWithField.length]?.[veld];
103
+ }
104
+ }
105
+ switch (type) {
106
+ case 'tekst':
107
+ return `Voorbeeld ${(h % 100) + 1}`;
108
+ case 'getal':
109
+ return h % 1000;
110
+ case 'bedrag':
111
+ return (h % 100000) / 100;
112
+ case 'datum':
113
+ return isoDate(new Date(2026, 0, 1 + (h % 365)));
114
+ case 'keuze':
115
+ return waarden !== undefined && waarden.length > 0 ? waarden[h % waarden.length] : null;
116
+ case 'ja/nee':
117
+ return h % 2 === 0;
118
+ }
119
+ }
120
+ /** The fields a query asks of resource `name`, or undefined for all of them. */
121
+ function selection(query, name) {
122
+ const fields = query?.fields;
123
+ return (Array.isArray(fields) ? fields : fields?.[name]);
124
+ }
125
+ /** The preview's own filter and sort over these rows alone, typed by value so numbers compare as numbers. */
126
+ async function locally(name, rows, { filter = {}, sort = [] }) {
127
+ const sorted = [sort].flat().join(',').split(',').map((item) => item.replace(/^[-+]/, ''));
128
+ const fields = Object.fromEntries([...rows.flatMap(Object.keys), ...Object.keys(filter), ...sorted]
129
+ .filter((key) => key !== '')
130
+ .map((key) => [key, { type: typeof rows.find((row) => row[key] != null)?.[key] }]));
131
+ const byId = new Map(rows.map((row) => [String(row.id), row]));
132
+ const store = new PreviewStore({ [name]: { schema: { fields }, rows } });
133
+ const { data } = await store.resource(name).list({ filter, sort, page: { size: 200 } });
134
+ return data.map((row) => byId.get(String(row.id)));
135
+ }
136
+ /**
137
+ * A live resource some of whose fields do not exist yet. Those fields never reach the server (naming one would be a
138
+ * 422): each row gets an invented value, a filter or sort on one applies to the returned page only, and an aggregate
139
+ * that names one is answered from the mock rows.
140
+ */
141
+ export function mixedResource(live, gaps, mock, mockRows) {
142
+ const { name } = live;
143
+ const missing = new Map(gaps.filter((gap) => gap.resource === name && gap.veld !== undefined).map((gap) => [gap.veld, gap]));
144
+ // `-field`, `sum(field)` and `field.month` all name `field`.
145
+ const names = (item) => item.split(/[-+(),.]/).some((part) => missing.has(part));
146
+ const split = (query = {}) => {
147
+ const selected = selection(query, name);
148
+ const kept = selected?.filter((field) => !missing.has(field));
149
+ const filters = Object.entries(query.filter ?? {});
150
+ const sort = [query.sort ?? []].flat();
151
+ // The live part names no missing field; the local part only missing ones.
152
+ const part = (local) => ({
153
+ filter: Object.fromEntries(filters.filter(([key]) => missing.has(key) === local)),
154
+ sort: sort.filter((item) => names(item) === local),
155
+ });
156
+ return {
157
+ // The id is what an invented value hangs on, so a narrowed request always asks for it.
158
+ live: { ...query, ...(kept && { fields: kept.includes('id') ? kept : [...kept, 'id'] }), ...part(false) },
159
+ local: part(true),
160
+ shown: (field) => selected === undefined || selected.includes(field),
161
+ };
162
+ };
163
+ const fill = (row, shown, all = false) => {
164
+ for (const [field, gap] of missing) {
165
+ // Own properties only: a field named `constructor` must not find Object's.
166
+ if ((all || shown(field)) && (!own(row, field) || row[field] == null)) {
167
+ row[field] = inventValue(gap, row.id, mockRows);
168
+ }
169
+ }
170
+ };
171
+ const merge = async (page, { local, shown }) => {
172
+ let data = page.data;
173
+ data.forEach((row) => fill(row, shown, true));
174
+ if (data.length > 0 && (local.sort.length > 0 || Object.keys(local.filter).length > 0)) {
175
+ data = await locally(name, data, local);
176
+ }
177
+ for (const row of data) {
178
+ for (const field of missing.keys()) {
179
+ if (!shown(field)) {
180
+ delete row[field];
181
+ }
182
+ }
183
+ }
184
+ return { ...page, data: data };
185
+ };
186
+ const list = async (query, init) => {
187
+ const parts = split(query);
188
+ return merge(await live.list(parts.live, init), parts);
189
+ };
190
+ const pages = async function* (query, init) {
191
+ const parts = split(query);
192
+ for await (const page of live.pages(parts.live, init)) {
193
+ yield await merge(page, parts);
194
+ }
195
+ };
196
+ return {
197
+ ...live,
198
+ list,
199
+ pages,
200
+ async *all(query, init) {
201
+ for await (const page of pages(query, init)) {
202
+ yield* page.data;
203
+ }
204
+ },
205
+ async get(id, query, init) {
206
+ const parts = split(query);
207
+ const response = await live.get(id, parts.live, init);
208
+ fill(response.data, parts.shown);
209
+ return response;
210
+ },
211
+ aggregate: (query, init) => [query.fn, query.group ?? [], Object.keys(query.filter ?? {})].flat().some(names)
212
+ ? mock.resource(name).aggregate(query)
213
+ : live.aggregate(query, init),
214
+ };
215
+ }
216
+ /**
217
+ * A wireframe's writes, answered in this browser and never sent: what is created, changed or deleted lies over the
218
+ * wrapped client's reads until the page reloads. A created row's id is `voorbeeld-<n>`. A list shows a created or
219
+ * changed row only where the query's filter puts it, so a moved board card lands in its new column.
220
+ */
221
+ export function simulatedWrites(client, name) {
222
+ const key = (row) => String(row.id);
223
+ // Created rows and whole changed copies of real ones, newest last; they stand in for the server's version.
224
+ const local = new Map();
225
+ // The server's own copy of each real row changed or deleted here: whether the server still lists it.
226
+ const origins = new Map();
227
+ const deleted = new Set();
228
+ let count = 0;
229
+ const answer = (status, data) => ({
230
+ status,
231
+ data,
232
+ meta: null,
233
+ headers: new Headers(),
234
+ etag: null,
235
+ recordVersion: null,
236
+ location: null,
237
+ replayed: false,
238
+ rateLimit: { limit: null, remaining: null, reset: null },
239
+ });
240
+ const pick = (row, query) => {
241
+ const fields = selection(query, name);
242
+ return Object.fromEntries(Object.entries(row).filter(([field]) => fields?.includes(field) ?? true));
243
+ };
244
+ const overlay = async (response, query = {}) => {
245
+ const { page } = response.meta;
246
+ const fitting = local.size > 0 ? (await locally(name, [...local.values()].reverse(), query)) : [];
247
+ const fits = new Set(fitting.map(key));
248
+ const served = new Set(origins.size > 0 ? (await locally(name, [...origins.values()], query)).map(key) : []);
249
+ const listed = new Set(response.data.map(key));
250
+ // A changed row keeps its place while the query still fits it; one only it fits now joins page 1.
251
+ const kept = response.data
252
+ .filter((row) => !deleted.has(key(row)) && (!local.has(key(row)) || fits.has(key(row))))
253
+ .map((row) => local.get(key(row)) ?? row);
254
+ const joined = fitting.filter((row) => !served.has(key(row)) && !listed.has(key(row)));
255
+ const total = page.total - [...served].filter((id) => !fits.has(id)).length + joined.length;
256
+ return {
257
+ ...response,
258
+ data: (page.number === 1 ? [...joined, ...kept] : kept).map((row) => pick(row, query)),
259
+ meta: { ...response.meta, page: { ...page, total } },
260
+ };
261
+ };
262
+ const get = async (id, query, init) => {
263
+ const copy = local.get(String(id));
264
+ if (deleted.has(String(id))) {
265
+ const detail = `No such ${name} record.`;
266
+ throw new DmpError(404, new Headers(), { status: 404, code: 'not_found', detail });
267
+ }
268
+ return copy === undefined ? client.get(id, query, init) : answer(200, pick(copy, query));
269
+ };
270
+ // The row as it is here; a real one's server copy is kept the first time it changes.
271
+ const own = async (id) => {
272
+ const { data } = await get(id);
273
+ if (!local.has(String(id))) {
274
+ origins.set(String(id), data);
275
+ }
276
+ return data;
277
+ };
278
+ const operation = async () => ({ ...answer(202, null), accepted: true });
279
+ const pages = async function* (query, init) {
280
+ for await (const page of client.pages(query, init)) {
281
+ yield await overlay(page, query);
282
+ }
283
+ };
284
+ return {
285
+ ...client,
286
+ get,
287
+ pages,
288
+ operation,
289
+ collectionOperation: operation,
290
+ list: async (query, init) => overlay(await client.list(query, init), query),
291
+ async *all(query, init) {
292
+ for await (const page of pages(query, init)) {
293
+ yield* page.data;
294
+ }
295
+ },
296
+ async create(body) {
297
+ const row = { ...body, id: `voorbeeld-${++count}` };
298
+ local.set(row.id, row);
299
+ return answer(201, { ...row });
300
+ },
301
+ async update(id, body) {
302
+ const data = await own(id);
303
+ const row = { ...data, ...body, id: data.id };
304
+ local.set(String(id), row);
305
+ return answer(200, { ...row });
306
+ },
307
+ // As the server: an id that is not there is a 404, and a delete never lowers a count for nothing.
308
+ async delete(id) {
309
+ await own(id);
310
+ local.delete(String(id));
311
+ deleted.add(String(id));
312
+ return answer(204, null);
313
+ },
314
+ };
315
+ }
@@ -0,0 +1,93 @@
1
+ Copyright 2021 The Albert Sans Project Authors (https://github.com/usted/Albert-Sans) AlbertSans-Italic[wght].ttf: Copyright 2021 The Albert Sans Project Authors (https://github.com/usted/Albert-Sans)
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
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,93 @@
1
+ Copyright 2019 IBM Corp. All rights reserved. IBMPlexSans-Italic[wdth,wght].ttf: Copyright 2019 IBM Corp. All rights reserved.
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
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.
@@ -0,0 +1,93 @@
1
+ Copyright 2016 The Inter Project Authors (https://github.com/rsms/inter) Inter-Italic[opsz,wght].ttf: Copyright 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
+ -----------------------------------------------------------
9
+ SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10
+ -----------------------------------------------------------
11
+
12
+ PREAMBLE
13
+ The goals of the Open Font License (OFL) are to stimulate worldwide
14
+ development of collaborative font projects, to support the font creation
15
+ efforts of academic and linguistic communities, and to provide a free and
16
+ open framework in which fonts may be shared and improved in partnership
17
+ with others.
18
+
19
+ The OFL allows the licensed fonts to be used, studied, modified and
20
+ redistributed freely as long as they are not sold by themselves. The
21
+ fonts, including any derivative works, can be bundled, embedded,
22
+ redistributed and/or sold with any software provided that any reserved
23
+ names are not used by derivative works. The fonts and derivatives,
24
+ however, cannot be released under any other type of license. The
25
+ requirement for fonts to remain under this license does not apply
26
+ to any document created using the fonts or their derivatives.
27
+
28
+ DEFINITIONS
29
+ "Font Software" refers to the set of files released by the Copyright
30
+ Holder(s) under this license and clearly marked as such. This may
31
+ include source files, build scripts and documentation.
32
+
33
+ "Reserved Font Name" refers to any names specified as such after the
34
+ copyright statement(s).
35
+
36
+ "Original Version" refers to the collection of Font Software components as
37
+ distributed by the Copyright Holder(s).
38
+
39
+ "Modified Version" refers to any derivative made by adding to, deleting,
40
+ or substituting -- in part or in whole -- any of the components of the
41
+ Original Version, by changing formats or by porting the Font Software to a
42
+ new environment.
43
+
44
+ "Author" refers to any designer, engineer, programmer, technical
45
+ writer or other person who contributed to the Font Software.
46
+
47
+ PERMISSION & CONDITIONS
48
+ Permission is hereby granted, free of charge, to any person obtaining
49
+ a copy of the Font Software, to use, study, copy, merge, embed, modify,
50
+ redistribute, and sell modified and unmodified copies of the Font
51
+ Software, subject to the following conditions:
52
+
53
+ 1) Neither the Font Software nor any of its individual components,
54
+ in Original or Modified Versions, may be sold by itself.
55
+
56
+ 2) Original or Modified Versions of the Font Software may be bundled,
57
+ redistributed and/or sold with any software, provided that each copy
58
+ contains the above copyright notice and this license. These can be
59
+ included either as stand-alone text files, human-readable headers or
60
+ in the appropriate machine-readable metadata fields within text or
61
+ binary files as long as those fields can be easily viewed by the user.
62
+
63
+ 3) No Modified Version of the Font Software may use the Reserved Font
64
+ Name(s) unless explicit written permission is granted by the corresponding
65
+ Copyright Holder. This restriction only applies to the primary font name as
66
+ presented to the users.
67
+
68
+ 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69
+ Software shall not be used to promote, endorse or advertise any
70
+ Modified Version, except to acknowledge the contribution(s) of the
71
+ Copyright Holder(s) and the Author(s) or with their explicit written
72
+ permission.
73
+
74
+ 5) The Font Software, modified or unmodified, in part or in whole,
75
+ must be distributed entirely under this license, and must not be
76
+ distributed under any other license. The requirement for fonts to
77
+ remain under this license does not apply to any document created
78
+ using the Font Software.
79
+
80
+ TERMINATION
81
+ This license becomes null and void if any of the above conditions are
82
+ not met.
83
+
84
+ DISCLAIMER
85
+ THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88
+ OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89
+ COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90
+ INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91
+ DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92
+ FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93
+ OTHER DEALINGS IN THE FONT SOFTWARE.