@llumi/design-system 1.0.0 → 2.0.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 (50) hide show
  1. package/LICENSE +51 -0
  2. package/NOTICE +66 -0
  3. package/README.md +15 -205
  4. package/custom-elements.json +1184 -18
  5. package/dist/LICENSE +51 -0
  6. package/dist/NOTICE +66 -0
  7. package/dist/README.md +29 -0
  8. package/dist/adopt-global-styles-DykTxdm8.js +15 -0
  9. package/dist/base.css +2 -0
  10. package/dist/base.md +59 -0
  11. package/dist/bpmn.md +113 -0
  12. package/dist/bpmn.mjs +5076 -0
  13. package/dist/copy-button.md +128 -0
  14. package/dist/copy-button.mjs +161 -0
  15. package/dist/download-button.md +106 -0
  16. package/dist/download-button.mjs +177 -0
  17. package/dist/highlighter.md +45 -0
  18. package/dist/highlighter.mjs +403 -0
  19. package/dist/icon-button-BeLaqJmK.js +5 -0
  20. package/dist/icons-DBLWcA83.js +42 -0
  21. package/dist/index-elWLeWLs.js +7733 -0
  22. package/dist/llumi-element-DTeRDxao.js +22 -0
  23. package/dist/mermaid.md +58 -0
  24. package/dist/mermaid.mjs +254 -0
  25. package/dist/review.md +141 -0
  26. package/dist/review.mjs +1039 -690
  27. package/dist/slot-text-DW3pDxNK.js +51 -0
  28. package/dist/theme.css +2 -0
  29. package/package.json +49 -26
  30. package/dist/review.cjs +0 -172
  31. package/dist/review.css +0 -98
  32. package/dist/review.js +0 -172
  33. package/dist/types/components/review/comment-dialog.element.d.ts +0 -21
  34. package/dist/types/components/review/custom-target.utils.d.ts +0 -16
  35. package/dist/types/components/review/default-editor.element.d.ts +0 -19
  36. package/dist/types/components/review/highlight-manager.d.ts +0 -21
  37. package/dist/types/components/review/index.d.ts +0 -8
  38. package/dist/types/components/review/overall-comment-dialog.element.d.ts +0 -22
  39. package/dist/types/components/review/review-bar.element.d.ts +0 -26
  40. package/dist/types/components/review/review.element.d.ts +0 -56
  41. package/dist/types/components/review/review.machine.d.ts +0 -234
  42. package/dist/types/components/review/review.persistence.d.ts +0 -16
  43. package/dist/types/components/review/review.type.d.ts +0 -37
  44. package/dist/types/components/review/selection-comment-icons.element.d.ts +0 -17
  45. package/dist/types/components/review/selection-range.utils.d.ts +0 -6
  46. package/dist/types/components/review/sort-comments.utils.d.ts +0 -6
  47. package/dist/types/index.d.ts +0 -1
  48. package/dist/types/shared/cn.d.ts +0 -2
  49. package/dist/types/shared/icons.d.ts +0 -7
  50. package/dist/types/shared/tailwind-element.d.ts +0 -4
package/LICENSE ADDED
@@ -0,0 +1,51 @@
1
+ @llumi/design-system — LICENSE
2
+ Version 1.0 — Copyright (c) 2026 pAIrprog SAS.
3
+
4
+ This license governs use of the Llumi Design System: the "@llumi/design-system" package and the original web components, source code, styles, assets, build output, and documentation created by pAIrprog SAS and published under it (the "pAIrprog Works", and together with everything in the package, the "Software").
5
+ See Section 5 regarding third-party components. By installing, copying, or using the Software You accept this license; if You do not accept it, do not install or use the Software, and delete any copies in Your possession.
6
+
7
+ 1. DEFINITIONS
8
+ "You" means the individual or entity exercising rights under this license.
9
+ "Use" means to install, load, cache, execute, reproduce, and embed the Software.
10
+ "Modify" means to alter, adapt, translate, or otherwise create a derivative work of the Software's source code. The following are Use, not Modify:
11
+ (i) processing the Software with standard build tooling (bundling, minification, transpilation, tree-shaking, source-map generation, and the like) even if it changes the byte form, provided it does not deliberately alter the runtime behaviour of the components You use; and (ii) composing, wrapping, styling, configuring, or extending the components through their documented interfaces — CSS custom properties, attributes, properties, slots, and events — including using them inside Your own components.
12
+ "Distribute" means to make the Software, or any part of it, available to a third party in a form intended for reuse, further development, or redistribution — for example as a library, package, module, template, component set, or SDK. The following are Use, not Distribute: (i) delivering the Software to the users of Your own website, application, or product as part
13
+ of its normal operation, in any medium (web, desktop, mobile, or embedded); (ii) delivering an application or product into which the Software has been integrated to the customer for whom it was built, provided the Software is not separated out or offered on a standalone basis; and (iii) caching or mirroring the unmodified package on an internal or private registry, proxy, or CI/artifact system for Your own or Your customer's use.
14
+
15
+ 2. LICENSE GRANT
16
+ 2.1 Subject to this license, pAIrprog SAS grants You a worldwide, royalty-free, non-exclusive, non-transferable, non-sublicensable license to Use the unmodified Software for any purpose, including commercial purposes, and to embed it within Your own websites, applications, and products.
17
+ 2.2 End-user execution. pAIrprog additionally grants directly to each person who receives the Software incorporated into Your website, application, or product a royalty-free, non-exclusive right to load, cache, and execute the unmodified Software solely as part of using that website, application, or product. This is a direct grant from pAIrprog, not a sublicense by You, and it survives termination of Your license as to persons who received the Software in good faith before termination.
18
+ 2.3 Patents. pAIrprog grants You a royalty-free, non-exclusive license under pAIrprog's patent claims necessarily infringed by the unmodified Software, limited to Using it as permitted here. This patent license terminates if You initiate or join patent litigation alleging the Software infringes.
19
+
20
+ 3. CONDITIONS AND RESTRICTIONS
21
+ The grant in Section 2 is conditioned on the following. These are conditions on the copyright license: any act outside their scope is unlicensed and infringes pAIrprog's copyright, independent of contract formation. Without pAIrprog's prior written permission, You may NOT:
22
+ (a) Modify the Software or create derivative works of it, except as permitted by the definition of "Modify".
23
+ (b) Distribute, publish, sublicense, sell, resell, rent, or lease the Software (or any part of it) on a standalone basis or as a software-development resource, whether free of charge or for a fee, except as permitted by the definition of "Distribute".
24
+ (c) Intentionally remove, obscure, or alter pAIrprog's copyright, attribution, trademark, or license notices, or represent the Software as Your own work. You must retain the preserved ("/_! ... _/") license banner pAIrprog includes in each distributed file. Where Your build tooling removes source comments, You satisfy this condition by retaining the LICENSE and NOTICE files in Your source repository, or by crediting pAIrprog in Your application's third-party notices or credits.
25
+ (d) Trademarks. This license grants no rights in pAIrprog's trademarks, including "pAIrprog" and "llumi". You may make truthful, nominative references identifying the Software (e.g., "built with the Llumi Design System"), but may not, without prior written permission, (i) use the marks in a way likely to cause confusion as to source, sponsorship, or affiliation, (ii) use them in the name of Your product, service, company, or domain, (iii) incorporate them into Your own marks, or (iv) use them to endorse or promote Your products.
26
+
27
+ 4. OWNERSHIP
28
+ The Software is licensed, not sold. pAIrprog SAS retains all right, title, and interest in and to the pAIrprog Works, including all intellectual property rights. All rights not expressly granted are reserved, subject to Section 5.
29
+
30
+ 5. THIRD-PARTY COMPONENTS
31
+ The package includes or loads third-party open-source components, each licensed under its own terms (listed in the accompanying NOTICE file). This license applies only to the pAIrprog Works and does not modify, supersede, or restrict any rights You have in third-party components under their respective licenses. In case of conflict regarding a third-party component, that component's license governs.
32
+
33
+ 6. TERMINATION
34
+ This license terminates automatically if You breach any term and, where the breach is curable, fail to cure it within 30 days after becoming aware of it; it is automatically reinstated upon timely cure. Termination of Your license does not terminate the end-user execution rights granted under Section 2.2 to persons who received the Software in good faith before termination. Upon termination You must cease all Use of the Software. Sections 4, 5, and 7–9 survive termination.
35
+
36
+ 7. NO WARRANTY
37
+ TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. pAIrprog does not warrant that the Software, or any content-delivery network distributing it, will be available, uninterrupted, or error-free, and has no obligation to provide support, updates, or maintenance.
38
+
39
+ 8. LIMITATION OF LIABILITY
40
+ TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, AND GIVEN THAT THE SOFTWARE IS PROVIDED FREE OF CHARGE, pAIrprog SAS SHALL NOT BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES, OR FOR ANY LOSS OF PROFITS, DATA, OR GOODWILL, ARISING FROM OR RELATED TO THE SOFTWARE OR ITS USE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. NOTHING IN THIS LICENSE EXCLUDES OR LIMITS LIABILITY THAT CANNOT BE EXCLUDED OR LIMITED UNDER APPLICABLE LAW, INCLUDING LIABILITY FOR FRAUD (DOL), GROSS NEGLIGENCE (FAUTE LOURDE), OR DEATH OR PERSONAL INJURY.
41
+
42
+ 9. GENERAL
43
+ 9.1 Governing law and forum. This license is governed by the laws of France, without regard to conflict-of-law principles. The courts of Paris, France have exclusive jurisdiction over disputes, except that nothing in this Section deprives a consumer of the mandatory protections, or the courts, of their country of habitual residence; exclusive Paris jurisdiction applies only to parties acting in a professional capacity.
44
+ 9.2 Severability. If any provision is held invalid or unenforceable, it is limited or severed to the minimum extent necessary and the remaining provisions remain in full force; no single provision was a determining condition of the others.
45
+ 9.3 No waiver. No failure or delay in enforcing any term is a waiver of it.
46
+ 9.4 Assignment. You may not assign this license without pAIrprog's prior written consent, except to a successor to all or substantially all of Your business that assumes Your obligations. pAIrprog may freely assign.
47
+ 9.5 Versions. This license governs the version of the Software with which it is distributed. pAIrprog may release future versions of the Software under different terms; doing so does not revoke the rights granted for versions You have already obtained.
48
+ 9.6 Entire agreement. This license is the entire agreement regarding the Software and supersedes prior understandings.
49
+
50
+ For licensing inquiries, including permissions beyond this license:
51
+ contact@pairprog.io
package/NOTICE ADDED
@@ -0,0 +1,66 @@
1
+ @llumi/design-system — THIRD-PARTY NOTICES
2
+
3
+ The distributed build output (dist/*.mjs) bundles the third-party open-source
4
+ packages listed below. Each is licensed under the MIT License, reproduced in
5
+ full at the end of this file. Their copyright notices are retained here in
6
+ satisfaction of the MIT License's attribution requirement.
7
+
8
+ This file does NOT cover the peer dependencies that @llumi/design-system loads
9
+ at runtime from a CDN (e.g. lit, mermaid, xstate, bpmn-js, d3-selection,
10
+ d3-transition, d3-zoom, refractor, tinykeys, yay-machine, @floating-ui/dom).
11
+ Those are not redistributed by this package; they are fetched directly from
12
+ their own publishers and remain governed by their own licenses.
13
+
14
+ Bundled packages
15
+ -----------------
16
+ - bpmn-moddle@10.0.0
17
+ Copyright (c) 2014 camunda Services GmbH
18
+ https://github.com/bpmn-io/bpmn-moddle
19
+ - character-parser@4.0.0
20
+ Copyright (c) 2013 Forbes Lindesay
21
+ https://github.com/ForbesLindesay/character-parser
22
+ - graph-by-ivan-tulaev@1.0.0-alpha.14
23
+ Copyright (c) 2025 Ivan Tulaev
24
+ https://github.com/IvanTulaev/graph
25
+ - is-expression@4.0.0
26
+ Copyright (c) 2015 Tiancheng "Timothy" Gu
27
+ https://github.com/pugjs/is-expression
28
+ - min-dash@5.0.0
29
+ Copyright (c) 2017-present camunda Services GmbH
30
+ https://github.com/bpmn-io/min-dash
31
+ - acorn@7.4.1
32
+ Copyright (C) 2012-2018 by various contributors (see https://github.com/acornjs/acorn/blob/master/AUTHORS)
33
+ https://github.com/acornjs/acorn
34
+ - moddle@8.1.0
35
+ Copyright (c) 2014-present Camunda Services GmbH
36
+ https://github.com/bpmn-io/moddle
37
+ - moddle-xml@12.0.0
38
+ Copyright (c) 2014-present Camunda Services GmbH
39
+ https://github.com/bpmn-io/moddle-xml
40
+ - object-assign@4.1.1
41
+ Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
42
+ https://github.com/sindresorhus/object-assign
43
+ - saxen@11.0.2
44
+ Copyright (c) 2012 Vopilovskii Konstantin <flash.vkv@gmail.com>
45
+ https://github.com/nikku/saxen
46
+
47
+ ------------------------------------------------------------------------------
48
+ The MIT License (MIT)
49
+
50
+ Permission is hereby granted, free of charge, to any person obtaining a copy
51
+ of this software and associated documentation files (the "Software"), to deal
52
+ in the Software without restriction, including without limitation the rights
53
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
54
+ copies of the Software, and to permit persons to whom the Software is
55
+ furnished to do so, subject to the following conditions:
56
+
57
+ The above copyright notice and this permission notice shall be included in all
58
+ copies or substantial portions of the Software.
59
+
60
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
61
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
62
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
63
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
64
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
65
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
66
+ SOFTWARE.
package/README.md CHANGED
@@ -1,219 +1,29 @@
1
1
  # @llumi/design-system
2
2
 
3
- Framework-agnostic Web Components (built with [Lit](https://lit.dev)) for the llumi
4
- review experience. Wrap any content in `<llumi-review>` and let users attach comments to
5
- whole elements or to text selections, add an overall comment, and submit an approval or a
6
- set of comments.
3
+ ## Import via CDN (jsdelivr)
7
4
 
8
- - **Hybrid DOM** your content stays in the light DOM (so text selection, `Range`s, and
9
- the CSS Custom Highlight API work normally); the review chrome (toolbar, dialogs) renders
10
- in Shadow DOM with its styles encapsulated.
11
- - **Drop-in** — works in plain HTML or any framework that can render custom elements.
12
- - **Per-component** — each component is imported on its own (`@llumi/design-system/review`).
13
- - **Three builds per component** — ESM (the default import), plus single-file UMD and IIFE
14
- bundles for `<script>` / CDN use.
15
-
16
- ## Installation
17
-
18
- ```bash
19
- bun add @llumi/design-system
20
- # or: npm install @llumi/design-system
21
- ```
22
-
23
- `lit` is pulled in automatically as a dependency — no peer install required.
24
-
25
- ## Quick start (ESM)
26
-
27
- ```ts
28
- // Registers <llumi-review> and all of its chrome elements.
29
- // The light-DOM highlight styles are injected automatically on first use —
30
- // no separate CSS import is required.
31
- import "@llumi/design-system/review";
32
- ```
5
+ Each component ships as a self-contained ES module.
33
6
 
34
7
  ```html
35
- <llumi-review default-mode="annotating" bar-position="bottom-center">
36
- <article>
37
- <h1 data-review-id="title">Project Proposal</h1>
38
- <p data-review-selectable="intro">
39
- Select any of this text to leave a comment on the selection…
40
- </p>
41
- </article>
42
- </llumi-review>
43
-
44
8
  <script type="module">
45
- const review = document.querySelector("llumi-review");
46
- review.addEventListener("llumi-review-submit", (e) => {
47
- const { result, clearPersisted } = e.detail;
48
- // ...send `result` to the server, then on success:
49
- clearPersisted();
50
- });
9
+ import "https://cdn.jsdelivr.net/npm/@llumi/design-system@2/<component-name>.mjs";
51
10
  </script>
52
11
  ```
53
12
 
54
- ### `<script>` tag (no bundler)
55
-
56
- ```html
57
- <!-- unpkg / jsDelivr both resolve the IIFE subpath via the package `exports` field -->
58
- <script src="https://unpkg.com/@llumi/design-system/review.js"></script>
59
- <!-- jsDelivr can also take the explicit file path -->
60
- <script src="https://cdn.jsdelivr.net/npm/@llumi/design-system/dist/review.js"></script>
61
- ```
62
-
63
- This single file bundles Lit, registers the `<llumi-review>` element, and exposes a `Llumi`
64
- global. A `require()`-safe UMD/CJS build is also published at `@llumi/design-system/review.cjs`.
65
-
66
- ## Marking up content
13
+ `@2` resolves to the latest v2.
67
14
 
68
- Inside `<llumi-review>`, annotate the elements you want to be reviewable:
15
+ ## Available components
69
16
 
70
- | Attribute | Meaning |
71
- | --- | --- |
72
- | `data-review-id="<id>"` | A **whole-element** comment target. Clicking it (in annotate mode) opens a comment dialog and shows a badge when commented. |
73
- | `data-review-selectable="<id>"` | A region whose **text can be selected** to leave a selection-scoped comment. |
74
-
75
- An element may carry both attributes. The `<id>` values are yours; they are echoed back in
76
- each comment's `targetId`.
77
-
78
- ## Component API
79
-
80
- ### Attributes
81
-
82
- | Attribute | Type | Default | Description |
83
- | --- | --- | --- | --- |
84
- | `bar-position` | `top-left` \| `top-center` \| `top-right` \| `bottom-left` \| `bottom-center` \| `bottom-right` | `bottom-center` | Initial corner for the floating toolbar (which is also draggable). |
85
- | `shortcut` | string ([tinykeys](https://github.com/jamiebuilds/tinykeys) syntax) | `$mod+Shift+M` | Keyboard shortcut that toggles annotate mode. |
86
- | `default-mode` | `idle` \| `annotating` | `idle` | Whether annotate mode is on at mount. |
87
- | `persist` | `string` (attribute) | — | When set to a non-empty value, mirrors the review draft to `localStorage` under that key and restores it on load. A persisted draft takes precedence over `initialData`. Restored selection highlights are painted when annotate mode is active (consistent with how `initialData` behaves). |
88
-
89
- ### Properties (set in JS — complex values)
90
-
91
- | Property | Type | Description |
17
+ | Component | Import path | Docs |
92
18
  | --- | --- | --- |
93
- | `initialData` | `ReviewResult` | Pre-populate existing comments / overall comment. |
94
- | `customTargets` | `CustomTarget[]` | Resolve comment targets from arbitrary selectors (advanced). |
95
-
96
- ### Methods
19
+ | classless theme | `/base.css` | [base.md](./dist/base.md) |
20
+ | `<llumi-review>` | `/review.mjs` | [review.md](./dist/review.md) |
21
+ | `<llumi-bpmn>` | `/bpmn.mjs` | [bpmn.md](./dist/bpmn.md) |
22
+ | `<llumi-mermaid>` | `/mermaid.mjs` | [mermaid.md](./dist/mermaid.md) |
23
+ | `<llumi-highlighter>` | `/highlighter.mjs` | [highlighter.md](./dist/highlighter.md) |
24
+ | `<llumi-copy-button>` | `/copy-button.mjs` | [copy-button.md](./dist/copy-button.md) |
25
+ | `<llumi-download-button>` | `/download-button.mjs` | [download-button.md](./dist/download-button.md) |
97
26
 
98
- | Method | Description |
99
- | --- | --- |
100
- | `clearPersisted()` | Clears the persisted draft for this element's `persist` key. No-op when `persist` is unset. Call after a confirmed server save. |
101
-
102
- ```ts
103
- const review = document.querySelector("llumi-review");
104
- review.initialData = {
105
- status: "commented",
106
- comments: [{ commentId: "c1", targetId: "title", content: "Tighten this", createdAt: new Date().toISOString() }],
107
- };
108
- ```
109
-
110
- ### Events
111
-
112
- Both events bubble and are composed:
113
-
114
- | Event | Detail type | Fires |
115
- | --- | --- | --- |
116
- | `llumi-review-change` | `ReviewResult` | On every edit (comment added/edited/deleted, overall comment changed). |
117
- | `llumi-review-submit` | `{ result: ReviewResult, clearPersisted: () => void }` | When the user clicks Submit / Approve. `clearPersisted` clears the localStorage draft — call it after a confirmed server save. |
27
+ ## License
118
28
 
119
- ```ts
120
- type ReviewResult =
121
- | { status: "approved" }
122
- | { status: "commented"; comments: ReviewComment[]; overallComment?: string };
123
-
124
- interface ReviewComment {
125
- commentId: string;
126
- targetId: string; // the data-review-id / data-review-selectable value
127
- content: string;
128
- createdAt: string; // ISO timestamp
129
- selection?: { // present for text-selection comments
130
- startOffset: number;
131
- endOffset: number;
132
- selectedText: string;
133
- matchIndex: number;
134
- };
135
- }
136
- ```
137
-
138
- Comments in the result are ordered by their position in the document.
139
-
140
- ### Keyboard shortcuts
141
-
142
- | Keys | Action |
143
- | --- | --- |
144
- | `$mod+Shift+M` (configurable) | Toggle annotate mode |
145
- | Hold `Alt` | Temporarily reveal all targets while held |
146
- | `Escape` / `$mod+Enter` | Close the open dialog |
147
- | `$mod+Shift+Backspace` | Delete the comment being edited |
148
-
149
- (`$mod` is ⌘ on macOS, Ctrl elsewhere.)
150
-
151
- ## Custom comment editor
152
-
153
- The default editor is an auto-growing textarea. To supply your own, slot an element into
154
- the comment dialog's `editor` slot. Your element receives the current text via a `value`
155
- property and must emit these `CustomEvent`s (bubbling + composed):
156
-
157
- - `change` — `detail` is the new string value
158
- - `cancel` — request to close the dialog
159
- - `delete` — request to delete the comment
160
-
161
- ```html
162
- <llumi-comment-dialog>
163
- <my-rich-editor slot="editor"></my-rich-editor>
164
- </llumi-comment-dialog>
165
- ```
166
-
167
- ## Styling & customization
168
-
169
- No CSS setup is required. The chrome (toolbar, dialogs) ships its Tailwind styles inside
170
- each element's Shadow DOM, and the light-DOM highlight styles are injected into the
171
- document automatically when a `<llumi-review>` connects.
172
-
173
- To theme the highlight outlines, selection colors, and z-index, override these CSS custom
174
- properties. Set them on `llumi-review` (or any ancestor of your content) so they reliably
175
- override the injected defaults via inheritance:
176
-
177
- ```css
178
- llumi-review {
179
- /* whole-element outlines */
180
- --review-highlight-commented-color: oklch(0.7 0 0 / 0.3);
181
- --review-highlight-editing-color: oklch(0.6 0 0 / 0.7);
182
- /* text-selection highlights */
183
- --review-selection-commented-color: oklch(0.85 0.08 250 / 0.4);
184
- --review-selection-editing-color: oklch(0.75 0.12 250 / 0.6);
185
- --review-selection-hover-color: oklch(0.8 0.1 250 / 0.5);
186
- /* stacking */
187
- --review-z-index: 9998;
188
- }
189
- ```
190
-
191
- All `--review-*` variables defined in the injected stylesheet are overridable this way.
192
-
193
- ## Package exports
194
-
195
- | Specifier | Build |
196
- | --- | --- |
197
- | `@llumi/design-system/review` | The review component — resolves to ESM on `import`, CJS on `require` (the default entry) |
198
- | `@llumi/design-system/review.mjs` | ESM bundle (explicit) |
199
- | `@llumi/design-system/review.cjs` | UMD / CJS bundle, `require()`-safe (Lit included) |
200
- | `@llumi/design-system/review.js` | IIFE bundle, `Llumi` global (Lit included) |
201
- | `@llumi/design-system/review.css` | Light-DOM highlight styles — optional; only needed to preload them (e.g. SSR / avoid a first-paint flash), since they're otherwise auto-injected |
202
-
203
- ## Known limitation
204
-
205
- Selection highlights use the document-global CSS Custom Highlight API with fixed names, so
206
- only one active `<llumi-review>` paints selection highlights on the page at a time (this
207
- matches the original React component). Whole-element highlights and everything else work
208
- with multiple instances.
209
-
210
- ## Development
211
-
212
- ```bash
213
- bun install
214
- bun run storybook # interactive dev/docs harness
215
- bun test # logic tests (XState machine, utilities)
216
- bun run test:browser # component/DOM tests (Vitest + Playwright)
217
- bun run build # ESM + UMD + IIFE
218
- bun run ci # full gate: lint, types, tests, manifest, build
219
- ```
29
+ Free to use and embed, including commercially; no modification, redistribution, or resale. See [LICENSE](./dist/LICENSE). Bundled third-party components and their notices are listed in [NOTICE](./dist/NOTICE).