@aceshooting/lyra-ui 2.13.0 → 3.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 (76) hide show
  1. package/README.md +83 -26
  2. package/custom-elements.json +526 -13
  3. package/dist/components/attachment-chip/attachment-chip.styles.js +2 -2
  4. package/dist/components/button/button.class.d.ts +7 -9
  5. package/dist/components/button/button.class.d.ts.map +1 -1
  6. package/dist/components/button/button.class.js +12 -14
  7. package/dist/components/button/button.class.js.map +1 -1
  8. package/dist/components/button/button.styles.d.ts.map +1 -1
  9. package/dist/components/button/button.styles.js +30 -10
  10. package/dist/components/button/button.styles.js.map +1 -1
  11. package/dist/components/callout/callout.class.d.ts +4 -0
  12. package/dist/components/callout/callout.class.d.ts.map +1 -1
  13. package/dist/components/callout/callout.class.js +7 -0
  14. package/dist/components/callout/callout.class.js.map +1 -1
  15. package/dist/components/callout/callout.styles.d.ts.map +1 -1
  16. package/dist/components/callout/callout.styles.js +13 -0
  17. package/dist/components/callout/callout.styles.js.map +1 -1
  18. package/dist/components/chat-message/chat-message.styles.js +1 -1
  19. package/dist/components/code-block/code-block.styles.js +1 -1
  20. package/dist/components/date-picker/date-input.class.d.ts +4 -0
  21. package/dist/components/date-picker/date-input.class.d.ts.map +1 -1
  22. package/dist/components/date-picker/date-input.class.js +16 -0
  23. package/dist/components/date-picker/date-input.class.js.map +1 -1
  24. package/dist/components/details/details.class.d.ts +7 -2
  25. package/dist/components/details/details.class.d.ts.map +1 -1
  26. package/dist/components/details/details.class.js +23 -3
  27. package/dist/components/details/details.class.js.map +1 -1
  28. package/dist/components/dialog/dialog.styles.js +1 -1
  29. package/dist/components/heatmap/heatmap.class.d.ts +27 -0
  30. package/dist/components/heatmap/heatmap.class.d.ts.map +1 -1
  31. package/dist/components/heatmap/heatmap.class.js +125 -1
  32. package/dist/components/heatmap/heatmap.class.js.map +1 -1
  33. package/dist/components/heatmap/heatmap.styles.d.ts.map +1 -1
  34. package/dist/components/heatmap/heatmap.styles.js +27 -0
  35. package/dist/components/heatmap/heatmap.styles.js.map +1 -1
  36. package/dist/components/json-viewer/json-viewer.styles.js +1 -1
  37. package/dist/components/markdown/markdown.styles.js +1 -1
  38. package/dist/components/model-select/model-select.class.d.ts +4 -0
  39. package/dist/components/model-select/model-select.class.d.ts.map +1 -1
  40. package/dist/components/model-select/model-select.class.js +16 -1
  41. package/dist/components/model-select/model-select.class.js.map +1 -1
  42. package/dist/components/overlay/overlay.styles.d.ts.map +1 -1
  43. package/dist/components/overlay/overlay.styles.js +11 -1
  44. package/dist/components/overlay/overlay.styles.js.map +1 -1
  45. package/dist/components/responsive-panel/responsive-panel.styles.js +1 -1
  46. package/dist/components/segmented/segmented.class.d.ts +6 -4
  47. package/dist/components/segmented/segmented.class.d.ts.map +1 -1
  48. package/dist/components/segmented/segmented.class.js +3 -2
  49. package/dist/components/segmented/segmented.class.js.map +1 -1
  50. package/dist/components/segmented/segmented.styles.js +1 -1
  51. package/dist/components/tool-approval-dialog/tool-approval-dialog.class.d.ts +13 -6
  52. package/dist/components/tool-approval-dialog/tool-approval-dialog.class.d.ts.map +1 -1
  53. package/dist/components/tool-approval-dialog/tool-approval-dialog.class.js +48 -10
  54. package/dist/components/tool-approval-dialog/tool-approval-dialog.class.js.map +1 -1
  55. package/dist/components/tool-approval-dialog/tool-approval-dialog.styles.js +1 -1
  56. package/dist/components/tool-result-dialog/tool-result-dialog.styles.js +1 -1
  57. package/dist/components/tool-select-dialog/tool-select-dialog.class.d.ts +7 -0
  58. package/dist/components/tool-select-dialog/tool-select-dialog.class.d.ts.map +1 -1
  59. package/dist/components/tool-select-dialog/tool-select-dialog.class.js +31 -0
  60. package/dist/components/tool-select-dialog/tool-select-dialog.class.js.map +1 -1
  61. package/dist/components/tool-select-dialog/tool-select-dialog.styles.js +1 -1
  62. package/dist/components/widget/widget.styles.js +1 -1
  63. package/dist/components/word-cloud/word-cloud.styles.js +4 -4
  64. package/dist/internal/lyra-element.d.ts +2 -2
  65. package/dist/internal/lyra-element.js +2 -2
  66. package/dist/internal/tokens.styles.d.ts.map +1 -1
  67. package/dist/internal/tokens.styles.js +202 -198
  68. package/dist/internal/tokens.styles.js.map +1 -1
  69. package/dist/testing/happy-dom-shims.d.ts +4 -2
  70. package/dist/testing/happy-dom-shims.d.ts.map +1 -1
  71. package/dist/testing/happy-dom-shims.js +6 -2
  72. package/dist/testing/happy-dom-shims.js.map +1 -1
  73. package/dist/theme.css +58 -0
  74. package/llms-full.txt +117 -33
  75. package/llms.txt +9 -8
  76. package/package.json +9 -2
@@ -18,8 +18,10 @@
18
18
  *
19
19
  * Call `installHappyDomFormAssociatedShims()` once, in a Vitest `setupFiles` entry, before
20
20
  * importing any `lyra-ui` component. It is a no-op wherever `attachInternals` already exists
21
- * (any real browser, or an environment that already supports it) -- safe to call unconditionally
22
- * from a shared setup file used across multiple test environments.
21
+ * (any real browser, or an environment that already supports it) or where `HTMLElement` isn't
22
+ * even a global (a plain Node test environment with no DOM at all) -- safe to call
23
+ * unconditionally from a shared setup file used across multiple test environments/projects,
24
+ * including ones that mix DOM and non-DOM test files under one `setupFiles` entry.
23
25
  */
24
26
  function createStubInternals() {
25
27
  return {
@@ -43,6 +45,8 @@ function createStubInternals() {
43
45
  };
44
46
  }
45
47
  export function installHappyDomFormAssociatedShims() {
48
+ if (typeof HTMLElement === 'undefined')
49
+ return;
46
50
  if (typeof HTMLElement.prototype.attachInternals === 'function')
47
51
  return;
48
52
  HTMLElement.prototype.attachInternals = function attachInternals() {
@@ -1 +1 @@
1
- {"version":3,"file":"happy-dom-shims.js","sourceRoot":"","sources":["../../src/testing/happy-dom-shims.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAkBH,SAAS,mBAAmB;IAC1B,OAAO;QACL,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,QAAQ,CAAC,sBAAsB,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;QACnE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;QACzB,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,IAAI;QAClB,YAAY;YACV,+EAA+E;QACjF,CAAC;QACD,aAAa;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,cAAc;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,WAAW;YACT,qFAAqF;QACvF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kCAAkC;IAChD,IAAI,OAAO,WAAW,CAAC,SAAS,CAAC,eAAe,KAAK,UAAU;QAAE,OAAO;IACxE,WAAW,CAAC,SAAS,CAAC,eAAe,GAAG,SAAS,eAAe;QAC9D,OAAO,mBAAmB,EAAiC,CAAC;IAC9D,CAAC,CAAC;AACJ,CAAC;AAED;;2FAE2F;AAC3F,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACxD,OAAO,mBAAmB,EAAE,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"happy-dom-shims.js","sourceRoot":"","sources":["../../src/testing/happy-dom-shims.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAkBH,SAAS,mBAAmB;IAC1B,OAAO;QACL,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,QAAQ,CAAC,sBAAsB,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;QACnE,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;QACzB,iBAAiB,EAAE,EAAE;QACrB,YAAY,EAAE,IAAI;QAClB,YAAY;YACV,+EAA+E;QACjF,CAAC;QACD,aAAa;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,cAAc;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,WAAW;YACT,qFAAqF;QACvF,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kCAAkC;IAChD,IAAI,OAAO,WAAW,KAAK,WAAW;QAAE,OAAO;IAC/C,IAAI,OAAO,WAAW,CAAC,SAAS,CAAC,eAAe,KAAK,UAAU;QAAE,OAAO;IACxE,WAAW,CAAC,SAAS,CAAC,eAAe,GAAG,SAAS,eAAe;QAC9D,OAAO,mBAAmB,EAAiC,CAAC;IAC9D,CAAC,CAAC;AACJ,CAAC;AAED;;2FAE2F;AAC3F,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACxD,OAAO,mBAAmB,EAAE,CAAC;AAC/B,CAAC"}
package/dist/theme.css ADDED
@@ -0,0 +1,58 @@
1
+ /* Lyra's standalone theme inputs. Import this file once at the application root, then
2
+ switch `.lyra-light`/`.lyra-dark` (or data-lyra-theme) on an ancestor to change modes. */
3
+ :root,
4
+ .lyra-light,
5
+ [data-lyra-theme='light'] {
6
+ color-scheme: light;
7
+ --lyra-theme-color-surface-default: #ffffff;
8
+ --lyra-theme-color-text-normal: #1a1a1a;
9
+ --lyra-theme-color-text-quiet: #6b7280;
10
+ --lyra-theme-color-surface-border: #8a8a90;
11
+ --lyra-theme-color-border-strong: #4b5563;
12
+ --lyra-theme-color-brand-fill-loud: #0969da;
13
+ --lyra-theme-color-brand-fill-quiet: #ddf4ff;
14
+ --lyra-theme-color-brand-on-loud: #ffffff;
15
+ --lyra-theme-color-success-fill-loud: #1a7f37;
16
+ --lyra-theme-color-success-fill-quiet: #dafbe1;
17
+ --lyra-theme-color-success-on-loud: #ffffff;
18
+ --lyra-theme-color-warning-fill-loud: #9a6700;
19
+ --lyra-theme-color-warning-fill-quiet: #fff8c5;
20
+ --lyra-theme-color-warning-on-loud: #ffffff;
21
+ --lyra-theme-color-danger-fill-loud: #cf222e;
22
+ --lyra-theme-color-danger-fill-quiet: #ffebe9;
23
+ --lyra-theme-color-danger-on-loud: #ffffff;
24
+ --lyra-theme-color-neutral-fill-loud: #1a1a1a;
25
+ --lyra-theme-color-neutral-on-loud: #ffffff;
26
+ --lyra-theme-color-focus: #0969da;
27
+ --lyra-theme-color-no-data: rgb(128 128 128 / 25%);
28
+ --lyra-theme-font-family-body: system-ui, sans-serif;
29
+ --lyra-theme-font-family-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
30
+ --lyra-theme-font-size-m: 1rem;
31
+ --lyra-theme-border-radius-m: 0.375rem;
32
+ }
33
+
34
+ .lyra-dark,
35
+ [data-lyra-theme='dark'] {
36
+ color-scheme: dark;
37
+ --lyra-theme-color-surface-default: #1a1a1a;
38
+ --lyra-theme-color-text-normal: #f2f2f2;
39
+ --lyra-theme-color-text-quiet: #9aa1ac;
40
+ --lyra-theme-color-surface-border: #6b6b74;
41
+ --lyra-theme-color-border-strong: #c4c9d1;
42
+ --lyra-theme-color-brand-fill-loud: #4ea0f0;
43
+ --lyra-theme-color-brand-fill-quiet: #163650;
44
+ --lyra-theme-color-brand-on-loud: #111827;
45
+ --lyra-theme-color-success-fill-loud: #3fb950;
46
+ --lyra-theme-color-success-fill-quiet: #17411e;
47
+ --lyra-theme-color-success-on-loud: #111827;
48
+ --lyra-theme-color-warning-fill-loud: #d29922;
49
+ --lyra-theme-color-warning-fill-quiet: #3b2900;
50
+ --lyra-theme-color-warning-on-loud: #111827;
51
+ --lyra-theme-color-danger-fill-loud: #fa524a;
52
+ --lyra-theme-color-danger-fill-quiet: #4c1210;
53
+ --lyra-theme-color-danger-on-loud: #111827;
54
+ --lyra-theme-color-neutral-fill-loud: #e5e7eb;
55
+ --lyra-theme-color-neutral-on-loud: #111827;
56
+ --lyra-theme-color-focus: #4ea0f0;
57
+ --lyra-theme-color-no-data: rgb(180 180 180 / 30%);
58
+ }
package/llms-full.txt CHANGED
@@ -1,18 +1,14 @@
1
1
  # @aceshooting/lyra-ui — LLM API Reference
2
2
 
3
- `@aceshooting/lyra-ui` is a library of free, clean-room [Lit](https://lit.dev) web components — a
4
- companion to [Web Awesome](https://webawesome.com) that reimplements selected Web Awesome **Pro**
5
- components as open-source equivalents (documented compatible tag shape, attributes, slots, events,
6
- and CSS parts under a `lyra-` prefix instead of `wa-`), plus a number of extras that have no Web Awesome
7
- counterpart at all (dashboard atoms, temporal/graph widgets, chart wrappers, a map component, a
8
- file dropzone). It is **token-compatible with Web Awesome**: every component's stylesheet resolves
9
- through Web Awesome's `--wa-*` design tokens first, falling back to its own `--lyra-*` tokens, so
10
- components read as native inside a Web Awesome-themed app and are equally usable standalone with no
11
- theme at all. This document is the complete, component-by-component API reference intended for
12
- coding assistants integrating the library; for install instructions, the full component catalog, and
13
- the `<wa-*>` → `<lyra-*>` migration notes, see the package [README](./README.md) — or the shorter
14
- curated index at [`llms.txt`](./llms.txt) if you just need the shape of the library before diving in
15
- here.
3
+ `@aceshooting/lyra-ui` is a free, independent, MIT-licensed [Lit](https://lit.dev) web-component
4
+ library and an open-source alternative to Shoelace and Web Awesome. It combines accessible form
5
+ controls, layout and overlay primitives, dashboards, charts, data visualization, and Conversation &
6
+ Agent UI. Selected components retain documented Web Awesome-compatible public names under a `lyra-`
7
+ prefix to make migration easier, but Lyra has its own implementation, design tokens, localization
8
+ runtime, RTL behavior, and release surface. It has no runtime dependency on either project. This is
9
+ the complete component-by-component API reference for coding assistants integrating the library; for
10
+ installation, the full catalog, and Web Awesome/Shoelace migration notes, see the package
11
+ [README](./README.md) or the shorter curated index at [`llms.txt`](./llms.txt).
16
12
 
17
13
  Component entry points such as `components/empty/empty.js` register their custom-element tag.
18
14
  Every component also exposes a matching `.class.js` entry for subclassing or type-directed
@@ -105,21 +101,22 @@ Not a custom element itself — infrastructure every `lyra-*` component in the l
105
101
  `lyra-citation-badge`, and `lyra-menu` (which resolves its `placement` through
106
102
  `rtlAwarePlacement()` first — see `rtl.ts` below — before handing it to `place()`).
107
103
  - **`tokens.styles.ts` → `tokens`** (a `css` template prepended to every component's stylesheet) —
108
- the whole design-token layer. Every value chains through a `--wa-*` Web Awesome token first, with
109
- a hard-coded fallback, e.g. `--lyra-color-brand: var(--wa-color-brand-fill-loud, #0969da)`. Full
104
+ the whole design-token layer. Every value chains through an independent `--lyra-theme-*` custom
105
+ property and finally a hard-coded fallback, e.g. `--lyra-color-brand: var(--lyra-theme-color-brand-fill-loud, #0969da)`.
106
+ Full
110
107
  set: `--lyra-color-surface / -text / -text-quiet / -border / -brand / -brand-quiet / -success /
111
108
  -success-quiet / -warning / -warning-quiet / -danger / -danger-quiet`,
112
109
  `--lyra-color-on-brand / -on-success / -on-warning / -on-danger` (paired
113
110
  text/icon colors for content painted on the corresponding solid semantic fill; standalone light
114
- and dark fallbacks choose a contrasting foreground for each fill, while a Web Awesome theme can
115
- provide its own `*-on-loud` values), `--lyra-space-xs / -s / -m / -l`, `--lyra-radius`, `--lyra-shadow`,
111
+ and dark fallbacks choose a contrasting foreground for each fill, while a consumer's own theme
112
+ can provide its own `*-on-loud` values), `--lyra-space-xs / -s / -m / -l`, `--lyra-radius`, `--lyra-shadow`,
116
113
  `--lyra-font`, `--lyra-transition-fast` / `-base` (motion timing every animating component should
117
114
  share), `--lyra-opacity-disabled` (one shared disabled-state opacity), `--lyra-focus-ring-width` /
118
115
  `-color` / `-offset` (every `:focus-visible` rule should reference these), `--lyra-icon-button-size`
119
116
  (minimum tappable box for icon-only buttons; the glyph itself doesn't grow). Also sets
120
117
  `:host([hidden]) { display: none !important; }`, an inherited `box-sizing: border-box` reset, and
121
118
  a `prefers-color-scheme: dark` fallback that re-points the color tokens' hard-coded defaults at a
122
- dark palette (only takes effect when no real `--wa-*` theme value is present).
119
+ dark palette (only takes effect when no real `--lyra-theme-*` value is set).
123
120
  - **`prefix.ts`** — `LYRA_PREFIX = 'lyra'`; `tag(name)` → `` `lyra-${name}` ``; `defineElement(name,
124
121
  ctor)` — idempotent `customElements.define`, safe if a module is evaluated twice.
125
122
  - **`a11y.ts`** — `nextId(scope)`: monotonic id generator (e.g. `nextId('combobox-list')` →
@@ -544,6 +541,10 @@ Text field + calendar popover, **form-associated** via the shared `FormAssociate
544
541
  internal `<input>`; empty omits the attribute. Named `autoCorrect` in JS/TS (not `autocorrect`)
545
542
  to dodge a `lib.dom.d.ts` collision with `HTMLElement`'s own boolean `autocorrect` IDL member;
546
543
  the wire attribute is still the plain `autocorrect` name
544
+ - `autocomplete: string = ''`, `inputMode: string = ''` (attribute `inputmode`), and
545
+ `enterKeyHint: string = ''` (attribute `enterkeyhint`) — forwarded to the internal date input
546
+ - `autocomplete: string = ''`, `inputMode: string = ''` (`inputmode`), and `enterKeyHint: string = ''`
547
+ (`enterkeyhint`) — forwarded to the internal `<input>`.
547
548
 
548
549
  **Methods:** `show()`, `hide()`, `clear()`
549
550
 
@@ -720,15 +721,14 @@ original declarative `value`, matching native `defaultValue` behavior.
720
721
 
721
722
  ## `lyra-button`
722
723
 
723
- A generic action-button primitive, the `lyra-*` equivalent of a plain `wa-button`. Renders an
724
- internal native `<button>` (this library has no runtime dependency on Web Awesome); `type="submit"`/
724
+ A generic action-button primitive. Renders an internal native `<button>`; `type="submit"`/
725
725
  `type="reset"` are handled by the component itself via the host's own `closest('form')`, since a
726
726
  shadow-internal native button doesn't participate in an ancestor form's submission on its own.
727
727
 
728
728
  **Properties:**
729
729
  - `variant: 'neutral' | 'brand' | 'success' | 'warning' | 'danger' = 'neutral'` (reflected)
730
730
  - `appearance: 'accent' | 'filled' | 'outlined' | 'plain' = 'filled'` (reflected) — `'accent'` is a
731
- loud, high-contrast filled tier (equivalent to `wa-button`'s own runtime-default appearance),
731
+ loud, high-contrast filled tier,
732
732
  distinct from `'filled'` for `variant="neutral"` specifically (`'filled'` reads the ambient
733
733
  surface color there; `'accent'` reads a solid neutral fill)
734
734
  - `size: 'xs' | 's' | 'm' | 'l' | 'xl' = 'm'` (reflected)
@@ -737,7 +737,11 @@ shadow-internal native button doesn't participate in an ancestor form's submissi
737
737
  clearing `disabled`
738
738
  - `disabled: boolean = false` (reflected)
739
739
 
740
- **Getters/methods:** `focus(options?)`/`blur()` forwarded to the internal native `<button>`.
740
+ The shared `m` size uses `--lyra-font-size-m`. The internal button follows the host's inline size through `--lyra-button-width` (default
741
+ `100%`), and the size scale is exposed through `--lyra-button-size-xs/-s/-m/-l/-xl`.
742
+
743
+ **Getters/methods:** `click()`, `focus(options?)`, and `blur()` — forwarded to the internal native
744
+ `<button>`; `click()` also runs the component's submit/reset behavior.
741
745
 
742
746
  **Events:** none (a plain native `click` bubbles and composes through the shadow boundary
743
747
  unmodified; disabled while `disabled` or `loading`).
@@ -746,11 +750,12 @@ unmodified; disabled while `disabled` or `loading`).
746
750
 
747
751
  **CSS parts:** `base`, `label`, `start`, `end`, `spinner` (present only while `loading`).
748
752
 
749
- **Themeable custom properties:** `--lyra-button-accent`, `--lyra-button-fill`,
753
+ **Themeable custom properties:** `--lyra-button-width`, `--lyra-button-size-xs/-s/-m/-l/-xl`,
754
+ `--lyra-button-accent`, `--lyra-button-fill`,
750
755
  `--lyra-button-on-fill`, `--lyra-button-border` (each swapped by the active `variant`, default
751
756
  `neutral` falls back to plain text/surface/border tokens), `--lyra-button-accent-fill`,
752
757
  `--lyra-button-accent-on-fill` (the `appearance="accent"` fill/foreground pair; `neutral` falls
753
- back to `--wa-color-neutral-fill-loud`/`-on-loud`, every other variant reuses that variant's own
758
+ back to `--lyra-color-neutral`/`--lyra-color-on-neutral`, every other variant reuses that variant's own
754
759
  loud fill token), `--lyra-button-hover-brightness` (default `1.08`, the `:hover` filter intensity),
755
760
  `--lyra-button-active-scale` (default `0.9875`, the `:active` press-scale, disabled under
756
761
  `prefers-reduced-motion`).
@@ -1880,6 +1885,9 @@ itself (absent for `'wide'`/`collapse="none"`); and the `lyra-split-collapse-cha
1880
1885
  divider adjacent to the collapsed panel is drag/keyboard-disabled (`aria-disabled="true"`) while
1881
1886
  collapsed. `collapse="none"` (the default) is byte-for-byte identical to pre-collapse-feature behavior.
1882
1887
 
1888
+ `dividerLabel?: (index: number, panelCount: number) => string` (attribute: false) customizes the
1889
+ localized accessible label generated for each auto-inserted divider.
1890
+
1883
1891
  **Events:** `lyra-resize` (`detail: { sizes }`, fired on every drag step/release **and** every
1884
1892
  keyboard step), `lyra-split-collapse-change` (`detail: { state: 'wide'|'rail'|'floating' }`, fired only
1885
1893
  on a real `collapse`-state transition, never on every resize/render),
@@ -1959,6 +1967,8 @@ position) survives the transition.
1959
1967
  sidebar/toolbar visible during fullscreen
1960
1968
  - `compact: boolean = false` (reflected) — tighter header/body padding, same convention as
1961
1969
  `lyra-empty`'s `compact`
1970
+ - `backdropInset: string = ''` (attribute `backdrop-inset`) — overrides the fullscreen backdrop's
1971
+ CSS `inset` independently from `fullscreenInset`; when empty, it follows `fullscreenInset`
1962
1972
  - `views: WidgetView[] = []` (attribute: false) — named alternate views for the panel body, e.g. a
1963
1973
  chart/table toggle inside the same card chrome; `WidgetView { id: string; label: string; icon?:
1964
1974
  TemplateResult }`. Each entry gets a header toggle button (`[part='view-toggle']`) and a
@@ -1987,7 +1997,7 @@ empty), `label-group` (wrapper around the label and sublabel), `label`, `sublabe
1987
1997
  `backdrop`
1988
1998
 
1989
1999
  **Themeable custom properties:** `--lyra-widget-overlay-color` (default `rgb(0 0 0 / 0.5)` — the
1990
- fullscreen backdrop scrim color; component-specific since no shared `--wa-*`/`--lyra-*` overlay token
2000
+ fullscreen backdrop scrim color; component-specific since no shared `--lyra-*` overlay token
1991
2001
  exists), plus shared tokens (`--lyra-space-*`, `--lyra-color-border/-surface/-text-quiet`,
1992
2002
  `--lyra-radius`, `--lyra-shadow`, `--lyra-icon-button-size`, `--lyra-focus-ring-*`).
1993
2003
 
@@ -2269,10 +2279,15 @@ A Canvas-rendered heatmap with a DPR-aware, resize-aware redraw loop, in one of
2269
2279
  `"matrix"` (default — a `rowLabels` × `colLabels` grid of `values`) or `"calendar"` (a
2270
2280
  GitHub-style Sunday–Saturday × week grid built from `days`, colored by quartile bucket rather than
2271
2281
  the matrix mode's continuous ramp). Every cell is independently addressable despite being
2272
- canvas-drawn (no per-cell DOM node): a `pointermove` hit-test over the canvas shows `[part="tooltip"]`
2282
+ canvas-drawn (no per-cell DOM node by default): a `pointermove` hit-test over the canvas shows `[part="tooltip"]`
2273
2283
  with that cell's label + value; the canvas is `tabindex="0"` with arrow-key roving focus (a stroked
2274
2284
  ring redrawn over the focused cell on every draw, plus `[part="live-region"]` announcing it); and a
2275
- click, or Enter/Space on the focused cell, fires `lyra-cell-click`.
2285
+ click, or Enter/Space on the focused cell, fires `lyra-cell-click`.
2286
+
2287
+ Set `accessibleCells: true` (`accessible-cells`) to opt into a native-button overlay for each
2288
+ interactive matrix/calendar cell. The overlay uses localized `aria-label`s, explicit
2289
+ `aria-pressed="true"|"false"` from the controlled `selectedCell`, and roving tabindex/arrow-key
2290
+ focus; it continues to emit `lyra-cell-click` and leaves selection state consumer-controlled.
2276
2291
 
2277
2292
  **Properties:**
2278
2293
  - `rowLabels: string[] = []` (attribute: false — matrix mode only)
@@ -2312,6 +2327,11 @@ click, or Enter/Space on the focused cell, fires `lyra-cell-click`.
2312
2327
  announcement when the focused cell is the selection. Purely a controlled property — mirrors
2313
2328
  `<lyra-lite-chart>`'s `selectedIndex`, this component never mutates it itself. Unset (the default,
2314
2329
  `null`) reproduces today's exact output.
2330
+ - `accessibleCells: boolean = false` (attribute `accessible-cells`) — renders `[part="cells"]` with
2331
+ one `[part="cell"]` native button per interactive cell. Buttons expose localized `aria-label`s,
2332
+ explicit `aria-pressed` state from `selectedCell`, and a roving tabindex; the canvas becomes
2333
+ `aria-hidden` while this mode is enabled. The property is opt-in so the default canvas mode keeps
2334
+ its low DOM footprint.
2315
2335
  - `cellText?: (pos: MatrixCellPos | CalendarCellPos, value: number) => string` (attribute: false) —
2316
2336
  formats the per-cell hover tooltip and keyboard live-region announcement text; receives the cell
2317
2337
  position (`{ row, col }` in matrix mode, `{ week, weekday }` in calendar mode) and its value.
@@ -2370,7 +2390,8 @@ force a redraw manually.
2370
2390
 
2371
2391
  **Slots:** none.
2372
2392
 
2373
- **CSS parts:** `base`, `canvas`, `tooltip` (hover tooltip, positioned over the hovered cell),
2393
+ **CSS parts:** `base`, `canvas`, `cells` (opt-in per-cell overlay), `cell` (one opt-in native cell
2394
+ button), `tooltip` (hover tooltip, positioned over the hovered cell),
2374
2395
  `live-region` (visually-hidden `role="status" aria-live="polite"` element announcing the
2375
2396
  keyboard-focused cell), `legend`, `legend-lo`, `legend-hi`, `legend-annotation` (one per labeled
2376
2397
  `annotations` entry)
@@ -2623,6 +2644,8 @@ descendants of the treeitem, matching the WAI-ARIA treeitem pattern's containmen
2623
2644
  - `setSize: number = 1`, `posInSet: number = 1` (attribute: false) — this node's `aria-setsize`/
2624
2645
  `aria-posinset` values among its siblings, pushed down from `<lyra-tree>`; normally set internally,
2625
2646
  not by consumers
2647
+ - `hasChildren: boolean` (read-only getter) — reports whether `item.children` contains at least one
2648
+ child; leaf nodes never expose `aria-expanded` and cannot expand or collapse
2626
2649
 
2627
2650
  **Methods:** `expand()`, `collapse()` (each a no-op if already in that state, or a leaf), `select()`
2628
2651
  (fires `lyra-node-select`).
@@ -3169,6 +3192,10 @@ parsing (that's left entirely to the host).
3169
3192
  - `label: string = 'Drop files here or click to browse'`
3170
3193
  - `accessibleLabel: string = ''` (attribute `aria-label`) — overrides `label` as the internal
3171
3194
  dropzone/button accessible name without changing visible copy
3195
+ - `acceptedMessage: string = '{count} file(s) added.'` (attribute `accepted-message`) — live-region
3196
+ message after an accepted selection; `{count}` is replaced with the accepted count
3197
+ - `rejectedMessage: string = '{count} file(s) rejected.'` (attribute `rejected-message`) — live-region
3198
+ message after rejected files; `{count}` is replaced with the rejected count
3172
3199
 
3173
3200
  **Methods:** `openPicker()` programmatically opens the native file dialog; `focus(options?)`
3174
3201
  forwards to the interactive dropzone.
@@ -3464,6 +3491,8 @@ hand-building that chrome isn't worth it.
3464
3491
  - `closable: boolean = false` (attribute `closable`) — renders a built-in close (X) button in the
3465
3492
  header row (creating one, with no heading text, if `heading` is unset), wired to the same
3466
3493
  `close()` path Escape/backdrop-dismiss already use, with reason `'close-button'`
3494
+ - `noLightDismiss: boolean = false` (attribute `no-light-dismiss`) — prevents a backdrop click from
3495
+ closing the dialog; Escape and explicit `close()` calls remain available
3467
3496
 
3468
3497
  Also settable as a plain `aria-label` attribute (not a public JS property): overrides the panel's
3469
3498
  computed accessible name outright, winning over every other source below (a slotted heading,
@@ -3501,7 +3530,7 @@ when no heading is slotted and `heading` is unset), `body` (wrapper around the d
3501
3530
  `footer` (wrapper around the `footer` slot)
3502
3531
 
3503
3532
  **Themeable custom properties:** `--lyra-dialog-overlay-color` (default `rgb(0 0 0 / 0.5)` — the
3504
- backdrop scrim color; component-specific since no shared `--wa-*`/`--lyra-*` overlay token exists),
3533
+ backdrop scrim color; component-specific since no shared `--lyra-*` overlay token exists),
3505
3534
  `--lyra-dialog-width` (default unset/`auto` — the panel shrink-wraps to content, unchanged; set it
3506
3535
  for an assertive width instead), `--lyra-dialog-max-width` (default `32rem` — the panel's
3507
3536
  max-inline-size cap, via `min(var(--lyra-dialog-max-width, var(--lyra-dialog-width, 32rem)), 100%)`;
@@ -4161,7 +4190,7 @@ fenced/indented `<pre>`), `link` (every rendered `<a>`), `table` (every rendered
4161
4190
 
4162
4191
  **Themeable custom properties:** `--lyra-markdown-font-mono` (default `ui-monospace, SFMono-Regular,
4163
4192
  Menlo, Consolas, monospace` — the code/code-block font; component-specific since no shared
4164
- `--wa-*`/`--lyra-*` monospace token exists), plus shared tokens `--lyra-space-xs/-s/-m/-l`,
4193
+ `--lyra-*` monospace token exists), plus shared tokens `--lyra-space-xs/-s/-m/-l`,
4165
4194
  `--lyra-color-brand-quiet`, `--lyra-color-brand`, `--lyra-color-border`, `--lyra-color-text-quiet`,
4166
4195
  `--lyra-radius`.
4167
4196
 
@@ -4243,6 +4272,8 @@ conversation-surface level).
4243
4272
  - `collapsed: boolean = false` (reflected) — whether the message body is hidden; effective whenever
4244
4273
  set, independent of `collapsible` (which only controls whether the toggle button itself is
4245
4274
  rendered) — mirrors `lyra-widget`'s identical `collapsible`/`collapsed` pair
4275
+ - `attachmentsPosition: 'before'|'after' = 'after'` (attribute `attachments-position`) — places the
4276
+ `attachments` slot before or after the message body; both the visual and reading order follow it
4246
4277
 
4247
4278
  **Events:** `lyra-retry` (no detail payload; fired by the built-in retry button, only rendered when
4248
4279
  `status="failed"`), `lyra-collapse-toggle` (`detail: boolean`, the new `collapsed` state — fired when
@@ -4875,6 +4906,8 @@ wins when both are present.
4875
4906
  indeterminate state, and filename context so translators can reorder every value
4876
4907
  - `uploadFailedLabel: string = 'Upload failed'` (attribute `upload-failed-label`) — visible status
4877
4908
  text shown for `status="error"`; override for i18n/locale
4909
+ - `untitledLabel: string = 'Untitled file'` (attribute `untitled-label`) — fallback filename and
4910
+ tooltip when neither `file` nor `name` supplies a name
4878
4911
 
4879
4912
  The component identifies *which* attachment a `lyra-remove`/`lyra-retry` event is about via the
4880
4913
  platform's own `id` attribute/property rather than a second, differently-named prop. Set `id="..."`
@@ -5369,6 +5402,11 @@ emitting `lyra-change`.
5369
5402
  `<input>`'s own `autocorrect` (Safari/WebKit-specific); empty omits the attribute. Named
5370
5403
  `autoCorrect` in JS purely to dodge a `lib.dom.d.ts` typing collision — the wire attribute is
5371
5404
  still plain `autocorrect`.
5405
+ - `autocomplete: string = 'off'`, `inputMode: string = ''` (attribute `inputmode`), and
5406
+ `enterKeyHint: string = ''` (attribute `enterkeyhint`) — forwarded to the free-text input;
5407
+ they have no effect in closed-dropdown mode
5408
+ - `autocomplete: string = 'off'`, `inputMode: string = ''` (`inputmode`), and `enterKeyHint: string = ''`
5409
+ (`enterkeyhint`) — forwarded to the free-text mode's native `<input>`.
5372
5410
  - `name: string = ''` (reflected)
5373
5411
  - `disabled: boolean = false` (reflected)
5374
5412
  - `required: boolean = false` (reflected — enforced via `internals.setValidity()`)
@@ -5573,6 +5611,9 @@ shared overlay stack. First-party invention (no Web Awesome equivalent).
5573
5611
  - `searchPlaceholder: string = 'Search tools…'` (attribute `search-placeholder`)
5574
5612
  - `filter: ToolSelectFilter | null = null` (attribute: false) — overrides the built-in
5575
5613
  case-insensitive name/description substring match.
5614
+ - `autocomplete: string = ''`, `spellcheck: boolean = true`, `autocapitalize: string = ''`,
5615
+ `autoCorrect: string = ''` (`autocorrect`), `inputMode: string = ''` (`inputmode`), and
5616
+ `enterKeyHint: string = ''` (`enterkeyhint`) — forwarded to the search `<input>`.
5576
5617
 
5577
5618
  **Methods:** `close(reason: ToolSelectDialogCloseReason = 'api'): void` — closes the dialog, emits
5578
5619
  `lyra-close` with `reason`, and returns focus to whatever had it before the dialog opened.
@@ -6586,6 +6627,8 @@ and it's what every instance renders at zero extra bytes until shiki resolves.
6586
6627
  for that language — an additive, opt-in escape hatch for a build scoped to just the languages a
6587
6628
  consumer actually needs. A `language` absent from this map (or `languages` left unset) falls back
6588
6629
  to the default dynamic-import path unchanged.
6630
+ - `languagesOnly: boolean = false` (attribute `languages-only`) — skips the default shiki loader;
6631
+ use when every requested language is supplied through `languages`
6589
6632
 
6590
6633
  **Events:** `lyra-copy` (`detail: { text: string }` — always the raw `code` value, never the
6591
6634
  highlighted HTML, and always fires regardless of whether the actual OS clipboard write succeeded),
@@ -6599,7 +6642,7 @@ button is activated, same event name/shape convention as `<lyra-thinking-panel>`
6599
6642
 
6600
6643
  **Themeable custom properties:** `--lyra-code-block-max-height` (default `none` — the consumer-tunable
6601
6644
  scroll cap; only takes effect once `max-height` is set), `--lyra-code-block-font` (default
6602
- `ui-monospace, SFMono-Regular, Menlo, Consolas, monospace` — no shared `--wa-*`/`--lyra-*` monospace
6645
+ `ui-monospace, SFMono-Regular, Menlo, Consolas, monospace` — no shared `--lyra-*` monospace
6603
6646
  token exists to resolve through), plus shared tokens `--lyra-color-border`, `--lyra-radius`,
6604
6647
  `--lyra-color-surface`, `--lyra-space-xs/-s/-m`, `--lyra-font`, `--lyra-color-text-quiet`,
6605
6648
  `--lyra-color-text`, `--lyra-color-brand`/`-brand-quiet`, `--lyra-transition-fast`,
@@ -6819,6 +6862,15 @@ renders at the start of the action row, before Deny/Edit/Approve.
6819
6862
  `false` via a PROPERTY binding, e.g. `.editable=${false}` — a `?editable=${false}`
6820
6863
  boolean-attribute binding cannot override a true default). When `false`, `args` is always shown
6821
6864
  read-only and can never be changed before approval.
6865
+ - `spellcheck: boolean = false`, `autocapitalize: string = 'off'`,
6866
+ `autoCorrect: string = 'off'` (attribute `autocorrect`), `autocomplete: string = 'off'`,
6867
+ `wrap: 'hard'|'soft'|'off' = 'soft'`, `inputMode: string = ''` (attribute `inputmode`),
6868
+ and `enterKeyHint: string = ''` (attribute `enterkeyhint`) — forwarded to the raw-JSON
6869
+ textarea; the defaults keep browser editing assistance from changing JSON text
6870
+ - `spellcheck: boolean = false`, `autocapitalize: string = 'off'`, `autoCorrect: string = 'off'`
6871
+ (`autocorrect`), `autocomplete: string = 'off'`, `wrap: 'hard'|'soft'|'off' = 'soft'`,
6872
+ `inputMode: string = ''` (`inputmode`), and `enterKeyHint: string = ''` (`enterkeyhint`) —
6873
+ forwarded to the raw-JSON `<textarea>` while editing.
6822
6874
 
6823
6875
  **Methods:** `close(reason: ToolApprovalDialogCloseReason = 'api'): void` — closes the dialog, emits
6824
6876
  `lyra-close` with `reason`, and returns focus to whatever had it before the dialog opened; a no-op if
@@ -7062,6 +7114,10 @@ menu, an avatar menu, or a history row's overflow menu. Uses the WAI-ARIA "menu
7062
7114
  a no-op for existing consumers), matching `lyra-select`/`lyra-model-select`'s
7063
7115
  `this.getAttribute('aria-label') || <computed default>` precedence
7064
7116
 
7117
+ - `closeOnEscapeAnywhere: boolean = false` (attribute `close-on-escape-anywhere`) — lets Escape
7118
+ close the menu when focus is on slotted non-menu-item content inside the popup; item activation
7119
+ remains scoped to actual menu items
7120
+
7065
7121
  **Events:** `lyra-show` (no detail — fires only when `open` transitions to `true`, not for markup
7066
7122
  that renders `open` true from the start), `lyra-hide` (same first-render guard, opposite
7067
7123
  transition), `lyra-menu-select` (`detail: { value }` — a consolidated re-fire of the activated
@@ -7843,6 +7899,8 @@ capability as a row.
7843
7899
  `'Attach files'`); only affects the single-capability button (`[part='trigger']`) — the
7844
7900
  multi-capability menu's own trigger keeps its fixed `'Add attachment'` label regardless. Unset
7845
7901
  (the default) keeps the built-in English default.
7902
+ - `triggerTitle?: string` (attribute `trigger-title`) — forwards a sighted-user hover tooltip to
7903
+ both the single-capability and multi-capability trigger buttons
7846
7904
 
7847
7905
  **Events:** `lyra-pick` (`detail: { capability: 'files' | 'image'; files: FileList }`) — fired once a
7848
7906
  file-backed capability's hidden input produces a real selection. The `FileList` is an independent
@@ -8228,9 +8286,11 @@ markup.
8228
8286
 
8229
8287
  ## `lyra-callout`
8230
8288
 
8231
- An inline status, warning, or error surface.
8289
+ An inline status, warning, or error surface. Set `inline` for lightweight reactive form or mutation
8290
+ errors without panel chrome.
8232
8291
 
8233
- **Properties:** `variant`, `heading`, `closable`, `open`, and `accessibleLabel` (`accessible-label`).
8292
+ **Properties:** `variant`, `heading`, `closable`, `inline`, `open`, and `accessibleLabel`
8293
+ (`accessible-label`).
8234
8294
 
8235
8295
  **Events:** cancelable `lyra-close`; the callout hides after the event unless a listener calls
8236
8296
  `preventDefault()`.
@@ -8297,6 +8357,30 @@ properties `name`, `value`, `disabled`, and `required`, plus `label`, `hint`, an
8297
8357
 
8298
8358
  These apply across the whole library rather than to any one component:
8299
8359
 
8360
+ - **Independence and migration.** Lyra has no runtime, theme, or design-token dependency on
8361
+ Shoelace or Web Awesome. The documented `wa-*` comparisons are migration references only; Lyra's
8362
+ own `lyra-*` tokens, events, localization runtime, and implementation are the source of truth.
8363
+ For a staged Web Awesome migration, map existing `--wa-*` values to `--lyra-theme-*` explicitly
8364
+ in application CSS instead of relying on an implicit compatibility layer.
8365
+
8366
+ - **Internationalization.** Built-in UI copy, accessible names, descriptions, validation messages,
8367
+ status announcements, and empty/loading states resolve through `localize()` and the locale runtime.
8368
+ Register an application catalog with `registerLyraLocale()` or override one instance with
8369
+ `.strings`; locale fallback is exact locale, base language, then English. Date, number, byte,
8370
+ relative-time, and calendar output uses `Intl`. Consumer data and slotted content are never
8371
+ translated automatically.
8372
+
8373
+ - **RTL and direction.** Direction is inherited from `dir`/`lang`; components do not force their own
8374
+ direction. CSS logical properties mirror layout, while directional keyboard and pointer math
8375
+ consults the effective direction. Test both LTR and RTL for any component with horizontal order,
8376
+ start/end placement, drag deltas, or previous/next navigation.
8377
+
8378
+ - **Accessibility and responsive behavior.** Semantic roles live on the shadow-DOM element that owns
8379
+ them, with explicit false states for toggle/selection/expansion ARIA attributes and deliberate
8380
+ host-name forwarding. Form-associated controls preserve `ElementInternals`, reset, validity,
8381
+ focus, and native editing behavior. Reusable layouts respond to their allocated container, and
8382
+ decorative/infinite motion simplifies under `prefers-reduced-motion: reduce`.
8383
+
8300
8384
  - **Packaging.** `custom-elements.json` is now in `package.json`'s `files` allowlist and
8301
8385
  regenerated by a `prepack` script (`pnpm run manifest`) before publish, so a manifest-driven IDE/
8302
8386
  tooling integration (e.g. custom-elements-manifest-based autocomplete) does see an up-to-date copy
package/llms.txt CHANGED
@@ -1,12 +1,12 @@
1
1
  # @aceshooting/lyra-ui
2
2
 
3
- > Free, clean-room Lit web components — a companion to Web Awesome that reimplements several
4
- > Web Awesome Pro components as open-source equivalents (same attributes/slots/events/CSS parts,
5
- > just a `lyra-` prefix instead of `wa-`), plus a number of extras with no Web Awesome counterpart.
3
+ > Free, independent, MIT-licensed Lit web components — an open-source alternative to Shoelace and
4
+ > Web Awesome. Lyra combines accessible form controls, dashboards, charts, data visualization, and
5
+ > Conversation & Agent UI. Selected Web Awesome-compatible components retain documented public names
6
+ > under a `lyra-` prefix for easier migration; the implementation and design system are standalone.
6
7
 
7
- Token-compatible with Web Awesome: every component resolves its styling through Web Awesome's
8
- `--wa-*` design tokens first, with `--lyra-*` fallbacks, so it looks native inside a Web
9
- Awesome-themed app and works standalone with no theme at all.
8
+ Every component resolves its styling through this library's own `--lyra-theme-*` design tokens with
9
+ hardcoded fallbacks, so it works fully standalone with no theme or runtime dependency required.
10
10
 
11
11
  ## Docs
12
12
 
@@ -18,7 +18,8 @@ Awesome-themed app and works standalone with no theme at all.
18
18
  known gotchas) for every tag in the library — the primary resource for a coding assistant
19
19
  integrating `@aceshooting/lyra-ui`.
20
20
  - [README.md](./README.md): Install instructions, the full component catalog, `<wa-*>` →
21
- `<lyra-*>` migration notes, theming, and package-level development commands.
21
+ `<lyra-*>` and `<sl-*>` → `<lyra-*>` migration notes, theming, accessibility, i18n, RTL, and
22
+ package-level development commands.
22
23
 
23
24
  ## Component categories
24
25
 
@@ -81,5 +82,5 @@ The catalog is grouped by capability; `llms-full.txt` follows the same consumer-
81
82
  ## Also useful
82
83
 
83
84
  - Shared internals every tag builds on (`LyraElement` base class, the `FormAssociated` mixin, the
84
- floating-ui `positioner`, and the `--lyra-*`/`--wa-*` design-token layer) are documented at the
85
+ floating-ui `positioner`, and the independent `--lyra-theme-*` design-token layer) are documented at the
85
86
  top of `llms-full.txt`, along with cross-cutting packaging notes that apply to the whole library.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@aceshooting/lyra-ui",
3
- "version": "2.13.0",
4
- "description": "Free, clean-room Lit web components a companion to Web Awesome.",
3
+ "version": "3.0.0",
4
+ "description": "Free, independent Lit web components: an open-source alternative to Shoelace and Web Awesome with accessible forms, dashboards, charts, and agent UI.",
5
5
  "keywords": [
6
6
  "web-components",
7
7
  "custom-elements",
@@ -16,6 +16,11 @@
16
16
  "data-visualization",
17
17
  "chat-ui",
18
18
  "agent-ui",
19
+ "accessible-components",
20
+ "internationalization",
21
+ "rtl",
22
+ "shoelace-alternative",
23
+ "web-awesome-alternative",
19
24
  "web-awesome",
20
25
  "storybook"
21
26
  ],
@@ -50,6 +55,7 @@
50
55
  ".": "./dist/lyra.js",
51
56
  "./components/*": "./dist/components/*",
52
57
  "./internal/*": "./dist/internal/*",
58
+ "./theme.css": "./dist/theme.css",
53
59
  "./testing": "./dist/testing/happy-dom-shims.js"
54
60
  },
55
61
  "sideEffects": [
@@ -322,6 +328,7 @@
322
328
  "./src/components/zoomable-frame/zoomable-frame.ts",
323
329
  "./src/components/flag/flag-peer.ts",
324
330
  "./dist/lyra.js",
331
+ "./dist/theme.css",
325
332
  "./src/lyra.ts"
326
333
  ],
327
334
  "dependencies": {