@obvi/blueprint 1.0.9

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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Flatfile Inc.
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,443 @@
1
+ # blueprint.css
2
+
3
+ A classless-first CSS design system for beautiful technical blueprint documents.
4
+
5
+ Drop a single stylesheet onto a plain semantic HTML document and it renders as a polished blueprint — monochrome ink on paper, set in Booton, with the Obvious drafting-blue identity reserved for illustrations alone. No classes required. On top of that semantic base sits a small, zero-specificity component layer for the compositions blueprint authors keep hand-rolling.
6
+
7
+ ## What ships
8
+
9
+ - **`blueprint.css`** — the portable visual library. One file, no build step.
10
+ - **`blueprint.js`** — optional TOC-current-state and reading-progress behavior.
11
+ - **`SKILL.md`** — the canonical Blueprint authoring workflow and design contract.
12
+ - **`code-highlighting/`** — optional Prism theme, source component behavior, and vendored runtime.
13
+ - **`index.html`** — a self-demonstrating reference page built *with* the library. Every component is shown live beside its source markup.
14
+ - **`harness/`** — Puppeteer-based render + measure gate that validates the build across desktop/tablet/mobile and light/dark themes.
15
+
16
+ ## Philosophy
17
+
18
+ ### Semantic HTML is the API
19
+
20
+ The default authoring mode is plain HTML: headings, paragraphs, lists, tables, figures, quotes, definition lists, landmarks, and disclosure elements. The library styles those base elements intentionally so authors write *meaning* and the design arrives for free.
21
+
22
+ ### Classless-first, not class-only
23
+
24
+ Classes are reserved for patterns native HTML cannot express on its own — things like a primary decision panel, a typed callout family, or a true option-comparison grid. Every promoted component is a composition of real semantic elements, not a replacement for them.
25
+
26
+ ### The specificity contract
27
+
28
+ This library is engineered to eliminate the silent cascade trap that plagued the prior base sheet.
29
+
30
+ - The stylesheet is ordered with **cascade layers**:
31
+ `@layer reset, tokens, base, components, utilities`
32
+ - Every selector inside those layers is wrapped in **`:where()`**, so its specificity is zero.
33
+
34
+ That means:
35
+
36
+ 1. **Components always beat base elements** because `components` comes after `base`, regardless of selector specificity.
37
+ 2. **Your own CSS always beats the library** because unlayered author CSS sits above all layered rules.
38
+ 3. A bare authored class inside the typographic base wins with **no parent-scoping** and no `!important`.
39
+
40
+ The harness proves this with a cascade fixture.
41
+
42
+ ## Library structure
43
+
44
+ ### 1. Tokens & scales
45
+
46
+ The `tokens` layer defines:
47
+
48
+ - a neutral ink scale (the Obvious opacity-based black/white) for all text and chrome
49
+ - a dedicated illustration accent (`--bp-illustration-*`) — the only blue, used by SVG marks
50
+ - neutral document surfaces
51
+ - light/dark theme tokens via `data-obvious-theme`
52
+ - a named type scale
53
+ - a 3-step monospace label scale
54
+ - an 8px spacing rhythm
55
+ - a 1px SVG stroke token
56
+
57
+ ### 2. Classless semantic base
58
+
59
+ The `base` layer styles raw HTML at zero specificity, including:
60
+
61
+ - document landmarks (`main`, `article`, `section`, `header`, `footer`, `nav`, `aside`, `hgroup`)
62
+ - headings with automatic section numbering
63
+ - paragraphs, lists, emphasis, links, code/pre, definitions, and abbreviations
64
+ - citation + provenance (`blockquote[cite]`, `cite`, `q`, `figure`, `figcaption`, footnotes, `time`)
65
+ - semantic tables with row-header vs column-header distinction
66
+ - disclosure (`details` / `summary`)
67
+
68
+ Body text defaults to **left-aligned** — not justified.
69
+
70
+ ### 3. Component layer
71
+
72
+ Reusable primitives promoted from repeated blueprint authoring patterns:
73
+
74
+ - `.bp-lede` — narrative lede escape hatch
75
+ - `.bp-decision` — primary decision panel: an inverted `.bp-decision__bar` (kicker `.bp-label` + optional `.bp-decision__status` pill + optional `.bp-decision__meta` provenance with `<time>`), the hero `.bp-decision-stmt`, stacked `.bp-decision__tenets` (a `<dl>`), and a hatched `.bp-decision__revisit` change-condition footer. Add `.bp-decision--collapsible` on a `<details>` whose `<summary>` is the `.bp-decision__bar` (kicker + a compact `.bp-decision__title` left, `.bp-decision__meta` + `.bp-decision__caret` right) for a native, script-free collapsed form: collapsed it is just the bar, and the tenets + revisit footer reveal on expand
76
+ - `<bp-callout type="locked|invariant|ref">` — typed callout element (expands to the `.bp-callout` family below). Drafting-style: four L-shaped corner registration ticks (drawn as background gradients, no extra DOM) bracket the body instead of a box, headed by a `.bp-ctag` label (icon + compact mono caption). `--locked` uses solid ink ticks, `--invariant` adds the hatch fill with heavier ticks, `--ref` uses soft ticks. `label="…"` overrides the caption and `icon="none"` drops the glyph; the raw `.bp-callout--locked` / `--invariant` / `--ref` markup stays valid for hand-built or stored documents
77
+ - `.bp-deflist` — widened definition-list variant
78
+ - `.bp-option-grid`, `.bp-opt--rec`, `.bp-verdict` — parallel option comparisons
79
+ - `.bp-sequence` — numbered linear pipeline
80
+ - `.bp-state-grid` — state model grid
81
+ - `.bp-table-wrap` — wide-table scroll container
82
+ - `<bp-callout>` — typed callout Web Component; `type` picks the role (locked / invariant / ref) and it expands to the ticked frame, icon, and label
83
+ - `<bp-source>` — collapsible, syntax-highlighted source Web Component with copy control
84
+ - `<bp-cite>` — inline code-citation tooltip; hovering/focusing the cited text reveals the source in a top-layer popover
85
+ - `.bp-node`, `.bp-edge`, `.bp-svg-label`, `.bp-svg-meta` — SVG figure marks (the drafting-blue illustration layer)
86
+ - `.bp-stack-iso`, `.bp-stack-top`, `.bp-stack-face`, `.bp-stack-grid`, `.bp-svg-dot` — isometric solids for box/machine/conveyor illustrations with callout leaders
87
+ - `.bp-sidebar`, `.bp-toc` — the fixed contents rail: auto-numbered entries, a hairline guide track, and a gliding active marker driven by `blueprint.js`
88
+ - `.bp-contents` — a full-width, inline contents section: a calm numbered, multi-column index with dotted leaders and no active/selected state (a top-of-document index has no "current" entry; the fixed rail handles position tracking)
89
+ - `.scroll-progress`, `.bp-title-block` — document chrome
90
+
91
+ ### Compatibility and TOC state contract
92
+
93
+ Version 1.0.4 retains a transitional compatibility layer for markup emitted by current Blueprint authoring tools and stored documents. Legacy token names and `.bp-content`, `.bp-layout`, `.bp-card-grid`, `.bp-card`, `.bp-chip`, `.bp-document`, `.bp-title`, `.bp-placeholder`, `.bp-section`, `.bp-section-number`, `.bp-figure`, `.bp-figure-caption`, `.bp-table`, and `.bp-toc` remain supported while semantic HTML is preferred for new documents.
94
+
95
+ A document with section navigation uses `blueprint.js` to set **exactly one** TOC link to `aria-current="location"`. The stylesheet also recognizes `.active` and `.is-active`, but `aria-current` is canonical and provides the accessibility contract.
96
+
97
+ At 860px and below, `.bp-sidebar` and `.bp-toc` become horizontally scrollable section navigation instead of disappearing. Print hides only Blueprint TOC/sidebar chrome, not unrelated authored `nav` elements.
98
+
99
+ ## Install from npm
100
+
101
+ The package is published privately under the standard `@obvi` npm scope. Supply
102
+ an npm token with access to the organization without committing it:
103
+
104
+ ```ini
105
+ @obvi:registry=https://registry.npmjs.org
106
+ //registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN}
107
+ ```
108
+
109
+ Pin the exact package version so the stylesheet is immutable across installs:
110
+
111
+ ```bash
112
+ npm install --save-exact @obvi/blueprint@1.0.9
113
+ ```
114
+
115
+ Import the canonical stylesheet from the supported package export:
116
+
117
+ ```js
118
+ import "@obvi/blueprint/blueprint.css";
119
+ ```
120
+
121
+ For static HTML that does not use a bundler, copy the exported stylesheet from
122
+ `node_modules/@obvi/blueprint/dist/blueprint.css` into your deployed
123
+ assets and link that copy.
124
+
125
+ The npm tarball intentionally excludes the authoring `SKILL.md`, docs site,
126
+ examples, harness, and source scripts. Consumers receive only the built runtime
127
+ assets under `dist/` plus package metadata and license notices.
128
+
129
+ ## Include the stylesheet
130
+
131
+ ```html
132
+ <link rel="stylesheet" href="blueprint.css" />
133
+ ```
134
+
135
+ Set theme on the root element:
136
+
137
+ ```html
138
+ <html data-obvious-theme="light">
139
+ <html data-obvious-theme="dark">
140
+ ```
141
+
142
+ ## Fonts & offline use
143
+
144
+ The stylesheet loads the Booton variable font from the Obvious CDN (`https://obvious.ai/fonts/`). This works out of the box for online consumers.
145
+
146
+ **Self-hosting:** If you need the font available offline or want to avoid an external network dependency, download `BootonVF.woff2` and `BootonItalicsVF.woff2` from that URL, host them alongside your stylesheet, and replace the `src` URLs in the two `@font-face` blocks at the top of `blueprint.css`:
147
+
148
+ ```css
149
+ /* Before (CDN) */
150
+ src: url("https://obvious.ai/fonts/BootonVF.woff2") format("woff2");
151
+
152
+ /* After (self-hosted) */
153
+ src: url("./fonts/BootonVF.woff2") format("woff2");
154
+ ```
155
+
156
+ **Fallback:** If Booton fails to load for any reason, `--bp-sans` falls back through `system-ui → -apple-system → sans-serif`. All text remains legible; only the Booton identity is lost.
157
+
158
+ ## Example: no classes required
159
+
160
+ ```html
161
+ <section>
162
+ <h2>Recovery saga</h2>
163
+ <p>A crashed worker must never leave a session both orphaned and still-claimed.</p>
164
+ <p>Each step below is idempotent, so replaying from any checkpoint converges to a single owner.</p>
165
+ </section>
166
+ ```
167
+
168
+ The section number, heading hierarchy, and first-paragraph lede all render from structure alone.
169
+
170
+ ## Example: authored class beats the base naturally
171
+
172
+ ```html
173
+ <style>
174
+ .author-lede {
175
+ font-size: 28px;
176
+ line-height: 36px;
177
+ }
178
+ </style>
179
+
180
+ <p class="author-lede">A bare authored class wins with no parent-scoping.</p>
181
+ ```
182
+
183
+ The harness verifies that this computes to `28px / 36px`, while a sibling paragraph remains at the base `14px / 20px`.
184
+
185
+ ## Docs page
186
+
187
+ Open `index.html` in a browser. It includes:
188
+
189
+ - the semantic-first story
190
+ - the specificity contract
191
+ - token and scale samples
192
+ - citation/provenance examples
193
+ - semantic table behavior
194
+ - the full inline technical family
195
+ - every promoted component rendered live beside its source
196
+ - a theme toggle and scroll-progress bar
197
+
198
+ ## Harness
199
+
200
+ One-time setup:
201
+
202
+ ```bash
203
+ npm install
204
+ npx puppeteer browsers install chrome
205
+ ```
206
+
207
+ Run the gate:
208
+
209
+ ```bash
210
+ npm run measure
211
+ ```
212
+
213
+ This checks:
214
+
215
+ - computed hierarchy (font-size / line-height)
216
+ - the no-parent-scoping cascade contract
217
+ - no page-level horizontal overflow at `1440 / 700 / 390`
218
+ - TOC DOM state and computed visual distinction across `1440 / 861 / 860 / 390`
219
+ - initial hash, click, reload, history, down/up scroll, and document-bottom transitions
220
+ - hover, keyboard focus, reduced motion, mobile navigation, and print scoping
221
+ - light and dark themes
222
+ - the same behavioral fixture against source and packed package CSS
223
+
224
+ For screenshots:
225
+
226
+ ```bash
227
+ npm run render
228
+ ```
229
+
230
+ Both commands write to `harness/output/`.
231
+
232
+ ## Project layout
233
+
234
+ ```text
235
+ .
236
+ ├── blueprint.css
237
+ ├── blueprint.js
238
+ ├── dist/
239
+ │ ├── blueprint.css
240
+ │ ├── blueprint.js
241
+ │ └── code-highlighting/
242
+ │ ├── blueprint-code.css
243
+ │ └── blueprint-code.js
244
+ ├── index.html
245
+ ├── package.json
246
+ └── harness/
247
+ ├── README.md
248
+ ├── lib.mjs
249
+ ├── measure.mjs
250
+ ├── render.mjs
251
+ └── fixtures/
252
+ └── cascade.html
253
+ ```
254
+
255
+ ## Code highlighting: embed decision + monochrome theme
256
+
257
+ ### Decision
258
+
259
+ **Use Prism (a class-based runtime syntax highlighter) plus a CSS theme file. Do not use Shiki.**
260
+
261
+ This project’s core promise is **one portable CSS file, no build step**. A class-based runtime highlighter emits stable token classes into the DOM (`.token.keyword`, `.token.string`, etc.), and the monochrome syntax theme is therefore **just CSS**. It drops into a blueprint exactly the way `blueprint.css` does and keys off the same `data-obvious-theme` attribute for light/dark.
262
+
263
+ Shiki was considered and rejected for this use case. It is the most accurate option because it uses TextMate grammars, but it also **bakes colors inline at build time** and typically requires a rendering/build step. That fights both parts of this deliverable:
264
+
265
+ 1. the theme should be a **portable CSS file**, not generated HTML with inline styles, and
266
+ 2. blueprint documents should remain **drop-in and static** rather than requiring a compilation pipeline.
267
+
268
+ Shiki is a good choice when grammar accuracy outweighs portability. It is the wrong fit when the deliverable itself is a reusable CSS theme.
269
+
270
+ ### Why Prism instead of highlight.js?
271
+
272
+ Both Prism and highlight.js satisfy the core architectural decision because both are runtime highlighters that can be themed with CSS. Prism is the better fit here for one concrete reason: **its token taxonomy is finer-grained**.
273
+
274
+ A monochrome theme cannot rely on hue changes to separate syntax classes. It needs the highlighter to expose meaningful semantic buckets so the theme can differentiate by **luminance, weight, and italic** instead. Prism gives us stable classes like:
275
+
276
+ - `.token.keyword`
277
+ - `.token.string`
278
+ - `.token.comment`
279
+ - `.token.function`
280
+ - `.token.number`
281
+ - `.token.operator`
282
+ - `.token.punctuation`
283
+ - `.token.class-name`
284
+ - `.token.attr-name`
285
+
286
+ That richer taxonomy made it possible to create a readable hierarchy in a single neutral ink — code is text, so it stays monochrome and leaves blue to the illustrations. Prism also has a simple drop-in story for static HTML and an optional line-numbers plugin that layers on cleanly.
287
+
288
+ ### Markup contract for blueprint documents
289
+
290
+ Canonical block pattern:
291
+
292
+ ```html
293
+ <pre class="language-typescript"><code class="language-typescript">
294
+ export const answer = 42;
295
+ </code></pre>
296
+ ```
297
+
298
+ Rules:
299
+
300
+ 1. **Put the language on both elements** (`pre` and `code`) using Prism’s `language-xxx` convention.
301
+ 2. **Escape HTML-sensitive characters** inside code samples when authoring static HTML (`<`, `>`, `&`).
302
+ 3. For a filename or caption, wrap the block in a figure:
303
+
304
+ ```html
305
+ <figure class="bpc-code">
306
+ <figcaption>session-scheduler.ts</figcaption>
307
+ <pre class="language-typescript line-numbers"><code class="language-typescript">
308
+ // code…
309
+ </code></pre>
310
+ </figure>
311
+ ```
312
+
313
+ 4. Use plain inline `<code>` for short fragments in prose. Use `<pre><code>` for multi-line listings.
314
+ 5. Highlighting is **additive**. If JavaScript never runs, the document still renders readable monospace code via the base `pre` / `code` styles. The theme only adds color, weight, and optional line-number chrome on top.
315
+
316
+ ### Runtime initialization contract
317
+
318
+ Static HTML loads one self-contained browser module:
319
+
320
+ ```html
321
+ <link rel="stylesheet" href="./blueprint-code.css" />
322
+ <script type="module" src="./blueprint-code.js"></script>
323
+ ```
324
+
325
+ Application builds import the same registration entry once:
326
+
327
+ ```js
328
+ import "blueprint-css/web-components";
329
+ ```
330
+
331
+ The browser module bundles Prism core, the bounded language set, custom-element registration, and Clipboard API behavior. Consumers never load or order Prism scripts. It highlights conventional `<pre><code>` blocks and every `<bp-source>` instance.
332
+
333
+ ### Web Component integration
334
+
335
+ Use [`<bp-source>`](#bp-source) when a blueprint should show its own source without hand-authoring the repeated disclosure, toolbar, label, Prism classes, and copy control. Load the module once in the page shell or app entry; component markup needs no colocated script. The copy action uses clean source text, so Prism token spans never leak into the clipboard.
336
+
337
+ ### Files in this side-mission deliverable
338
+
339
+ - `code-highlighting/blueprint-code.css` — the portable monochrome Prism theme
340
+ - `code-highlighting/blueprint-code.js` — self-contained browser bundle: Prism + native `<bp-source>` + Clipboard API
341
+ - `code-highlighting/src/blueprint-code.js` — component source
342
+ - `code-highlighting/scripts/build.mjs` — deterministic esbuild bundle
343
+ - `code-highlighting/demo.html` — standalone multi-language demo page
344
+ - `code-highlighting/vendor/prism/` — repo-only standalone-theme fixtures (MIT)
345
+ - `code-highlighting/scripts/measure.mjs` — headless render + measurement harness
346
+
347
+ ### Token → treatment mapping
348
+
349
+ | Token role | Treatment principle |
350
+ | --- | --- |
351
+ | comment | faint gray, italic, de-emphasized |
352
+ | punctuation | muted gray; structure recedes |
353
+ | operator | muted but stronger than punctuation |
354
+ | variable / plain code | baseline code ink |
355
+ | string | mid gray, calm |
356
+ | number / constant | darker gray stop; literals pop |
357
+ | function | darker ink with medium weight |
358
+ | class-name / builtin | darker ink with medium weight |
359
+ | keyword | darkest ink, heaviest weight |
360
+ | markup tag | keyword-adjacent weight; structural |
361
+ | attr-name | mid-strong ink |
362
+ | diff inserted / deleted | differentiated by luminance/tint + the +/- glyph, not hue |
363
+
364
+ ### Verification
365
+
366
+ The demo is verified by measurement, not eyeballing.
367
+
368
+ One-time setup:
369
+
370
+ ```bash
371
+ cd code-highlighting
372
+ npm install --no-save puppeteer@23
373
+ npx puppeteer browsers install chrome
374
+ ```
375
+
376
+ Run the harness:
377
+
378
+ ```bash
379
+ node scripts/measure.mjs
380
+ ```
381
+
382
+ What it checks:
383
+
384
+ - Prism actually ran (`.token` spans exist)
385
+ - token colors resolved to the theme rather than falling back to plain text color
386
+ - at least five distinct token colors exist (the hierarchy is not flattened)
387
+ - no page-level horizontal overflow
388
+ - WCAG contrast is adequate in **both** light and dark themes
389
+ - screenshots are written to `code-highlighting/.measure/demo-light.png` and `demo-dark.png`
390
+
391
+ ### How to include the theme in a blueprint
392
+
393
+ 1. Load the base blueprint stylesheet.
394
+ 2. Load `blueprint-code.css` after it.
395
+ 3. Load or import `blueprint-code.js` once in the page shell or app entry.
396
+ 4. Use `<bp-source>` or write conventional blocks with the `language-xxx` markup contract above.
397
+
398
+ That keeps the consumer contract portable: **one CSS theme, one bounded browser module, and no Prism configuration.**
399
+ See the feature branch / open PR for the full library, docs page, and harness.
400
+
401
+ ## Web Components
402
+
403
+ Blueprint stays semantic-HTML-first. A native custom element is added only when a repeated pattern needs behavior that HTML and CSS cannot provide alone. Components render their semantic structure into light DOM so the existing Blueprint cascade and David's syntax theme remain the single visual source of truth.
404
+
405
+ ### `<bp-callout>`
406
+
407
+ `<bp-callout>` collapses the typed-callout markup (the type icon, `.bp-ctag` label, and the corner-ticked `<aside>`) into one element. The body can be bare text or block content; bare text is wrapped in a `<p>`:
408
+
409
+ ```html
410
+ <bp-callout type="invariant">
411
+ The fence token is monotonic and never reused.
412
+ </bp-callout>
413
+ ```
414
+
415
+ | Input | Contract |
416
+ | --- | --- |
417
+ | `type` | `locked` (commitment), `invariant` (must-hold rule), or `ref` / `reference` (enumerated values). Defaults to `locked`. |
418
+ | `label` | Optional caption override; defaults to the type's name. |
419
+ | `icon` | `none` drops the leading glyph. |
420
+
421
+ This is light DOM and registers from `blueprint.js`; the raw `.bp-callout` class markup remains valid for documents authored or stored without the element.
422
+
423
+ ### `<bp-source>`
424
+
425
+ `<bp-source>` turns escaped source text into a native `<details>` disclosure with an explicit language label, a Prism-highlighted `<pre><code>` block, and a copy control:
426
+
427
+ ```html
428
+ <bp-source language="typescript" open>
429
+ interface Session {
430
+ id: string;
431
+ epoch: number;
432
+ }
433
+ </bp-source>
434
+ ```
435
+
436
+ | Input | Contract |
437
+ | --- | --- |
438
+ | `language` | Explicit bounded Prism grammar or supported alias; unavailable and unknown grammars fall back to readable plain text. |
439
+ | `summary` | Optional disclosure label; defaults to `Source`. |
440
+ | `open` | Uses the native boolean disclosure state. |
441
+ | `sourceText` | Read-only clean source used by the built-in copy action. |
442
+
443
+ No author-written clipboard JavaScript or separate copy library is needed. Browsers do not expose declarative copy-to-clipboard HTML, so the Web Component owns the small native Clipboard API call internally.
@@ -0,0 +1,27 @@
1
+ # Third-party notices
2
+
3
+ ## PrismJS 1.30.0
4
+
5
+ The distributed `code-highlighting/blueprint-code.js` includes PrismJS.
6
+
7
+ MIT LICENSE
8
+
9
+ Copyright (c) 2012 Lea Verou
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in
19
+ all copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+ THE SOFTWARE.