@ktbsh/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +165 -0
  2. package/dist/custom-elements.json +1427 -0
  3. package/dist/index.d.ts +13 -0
  4. package/dist/index.js +12 -0
  5. package/dist/react/alert.d.ts +20 -0
  6. package/dist/react/alert.js +30 -0
  7. package/dist/react/badge.d.ts +17 -0
  8. package/dist/react/badge.js +30 -0
  9. package/dist/react/box.d.ts +22 -0
  10. package/dist/react/box.js +30 -0
  11. package/dist/react/breadcrumb.d.ts +17 -0
  12. package/dist/react/breadcrumb.js +30 -0
  13. package/dist/react/button.d.ts +20 -0
  14. package/dist/react/button.js +30 -0
  15. package/dist/react/checkbox.d.ts +22 -0
  16. package/dist/react/checkbox.js +30 -0
  17. package/dist/react/container.d.ts +18 -0
  18. package/dist/react/container.js +30 -0
  19. package/dist/react/field.d.ts +20 -0
  20. package/dist/react/field.js +30 -0
  21. package/dist/react/heading.d.ts +19 -0
  22. package/dist/react/heading.js +30 -0
  23. package/dist/react/input.d.ts +25 -0
  24. package/dist/react/input.js +30 -0
  25. package/dist/react/label.d.ts +18 -0
  26. package/dist/react/label.js +30 -0
  27. package/dist/react/link.d.ts +21 -0
  28. package/dist/react/link.js +30 -0
  29. package/dist/react/modal.d.ts +18 -0
  30. package/dist/react/modal.js +30 -0
  31. package/dist/react/nav.d.ts +17 -0
  32. package/dist/react/nav.js +30 -0
  33. package/dist/react/pagination.d.ts +19 -0
  34. package/dist/react/pagination.js +30 -0
  35. package/dist/react/progress.d.ts +19 -0
  36. package/dist/react/progress.js +30 -0
  37. package/dist/react/radio.d.ts +22 -0
  38. package/dist/react/radio.js +30 -0
  39. package/dist/react/select.d.ts +22 -0
  40. package/dist/react/select.js +30 -0
  41. package/dist/react/skeleton.d.ts +19 -0
  42. package/dist/react/skeleton.js +30 -0
  43. package/dist/react/spinner.d.ts +18 -0
  44. package/dist/react/spinner.js +30 -0
  45. package/dist/react/stack.d.ts +21 -0
  46. package/dist/react/stack.js +30 -0
  47. package/dist/react/switch.d.ts +21 -0
  48. package/dist/react/switch.js +30 -0
  49. package/dist/react/tab-panel.d.ts +18 -0
  50. package/dist/react/tab-panel.js +30 -0
  51. package/dist/react/tab.d.ts +19 -0
  52. package/dist/react/tab.js +30 -0
  53. package/dist/react/tabs.d.ts +17 -0
  54. package/dist/react/tabs.js +30 -0
  55. package/dist/react/text.d.ts +19 -0
  56. package/dist/react/text.js +30 -0
  57. package/dist/react/textarea.d.ts +24 -0
  58. package/dist/react/textarea.js +30 -0
  59. package/dist/react/toast.d.ts +19 -0
  60. package/dist/react/toast.js +30 -0
  61. package/dist/themes/dark.css +52 -0
  62. package/dist/themes/light.css +53 -0
  63. package/dist/tokens/index.d.ts +7 -0
  64. package/dist/tokens/index.js +7 -0
  65. package/dist/tokens/semantic.d.ts +209 -0
  66. package/dist/tokens/semantic.js +102 -0
  67. package/dist/types/index.d.ts +15 -0
  68. package/dist/types/index.js +2 -0
  69. package/dist/vanilla/alert.d.ts +2 -0
  70. package/dist/vanilla/alert.js +134 -0
  71. package/dist/vanilla/alert.src.js +257 -0
  72. package/dist/vanilla/badge.d.ts +2 -0
  73. package/dist/vanilla/badge.js +89 -0
  74. package/dist/vanilla/badge.src.js +212 -0
  75. package/dist/vanilla/box.d.ts +2 -0
  76. package/dist/vanilla/box.js +100 -0
  77. package/dist/vanilla/box.src.js +270 -0
  78. package/dist/vanilla/breadcrumb.d.ts +2 -0
  79. package/dist/vanilla/breadcrumb.js +93 -0
  80. package/dist/vanilla/breadcrumb.src.js +255 -0
  81. package/dist/vanilla/button.d.ts +2 -0
  82. package/dist/vanilla/button.js +135 -0
  83. package/dist/vanilla/button.src.js +260 -0
  84. package/dist/vanilla/checkbox.d.ts +2 -0
  85. package/dist/vanilla/checkbox.js +96 -0
  86. package/dist/vanilla/checkbox.src.js +296 -0
  87. package/dist/vanilla/container.d.ts +2 -0
  88. package/dist/vanilla/container.js +79 -0
  89. package/dist/vanilla/container.src.js +222 -0
  90. package/dist/vanilla/field.d.ts +2 -0
  91. package/dist/vanilla/field.js +113 -0
  92. package/dist/vanilla/field.src.js +278 -0
  93. package/dist/vanilla/heading.d.ts +2 -0
  94. package/dist/vanilla/heading.js +75 -0
  95. package/dist/vanilla/heading.src.js +241 -0
  96. package/dist/vanilla/input.d.ts +2 -0
  97. package/dist/vanilla/input.js +121 -0
  98. package/dist/vanilla/input.src.js +326 -0
  99. package/dist/vanilla/label.d.ts +2 -0
  100. package/dist/vanilla/label.js +75 -0
  101. package/dist/vanilla/label.src.js +232 -0
  102. package/dist/vanilla/link.d.ts +2 -0
  103. package/dist/vanilla/link.js +96 -0
  104. package/dist/vanilla/link.src.js +272 -0
  105. package/dist/vanilla/modal.d.ts +2 -0
  106. package/dist/vanilla/modal.js +125 -0
  107. package/dist/vanilla/modal.src.js +251 -0
  108. package/dist/vanilla/nav.d.ts +2 -0
  109. package/dist/vanilla/nav.js +94 -0
  110. package/dist/vanilla/nav.src.js +214 -0
  111. package/dist/vanilla/pagination.d.ts +2 -0
  112. package/dist/vanilla/pagination.js +114 -0
  113. package/dist/vanilla/pagination.src.js +262 -0
  114. package/dist/vanilla/progress.d.ts +2 -0
  115. package/dist/vanilla/progress.js +108 -0
  116. package/dist/vanilla/progress.src.js +244 -0
  117. package/dist/vanilla/radio.d.ts +2 -0
  118. package/dist/vanilla/radio.js +104 -0
  119. package/dist/vanilla/radio.src.js +326 -0
  120. package/dist/vanilla/select.d.ts +2 -0
  121. package/dist/vanilla/select.js +104 -0
  122. package/dist/vanilla/select.src.js +332 -0
  123. package/dist/vanilla/skeleton.d.ts +2 -0
  124. package/dist/vanilla/skeleton.js +99 -0
  125. package/dist/vanilla/skeleton.src.js +240 -0
  126. package/dist/vanilla/spinner.d.ts +2 -0
  127. package/dist/vanilla/spinner.js +108 -0
  128. package/dist/vanilla/spinner.src.js +222 -0
  129. package/dist/vanilla/stack.d.ts +2 -0
  130. package/dist/vanilla/stack.js +83 -0
  131. package/dist/vanilla/stack.src.js +259 -0
  132. package/dist/vanilla/switch.d.ts +2 -0
  133. package/dist/vanilla/switch.js +166 -0
  134. package/dist/vanilla/switch.src.js +299 -0
  135. package/dist/vanilla/tab-panel.d.ts +2 -0
  136. package/dist/vanilla/tab-panel.js +80 -0
  137. package/dist/vanilla/tab-panel.src.js +227 -0
  138. package/dist/vanilla/tab.d.ts +2 -0
  139. package/dist/vanilla/tab.js +99 -0
  140. package/dist/vanilla/tab.src.js +253 -0
  141. package/dist/vanilla/tabs.d.ts +2 -0
  142. package/dist/vanilla/tabs.js +66 -0
  143. package/dist/vanilla/tabs.src.js +237 -0
  144. package/dist/vanilla/text.d.ts +2 -0
  145. package/dist/vanilla/text.js +74 -0
  146. package/dist/vanilla/text.src.js +232 -0
  147. package/dist/vanilla/textarea.d.ts +2 -0
  148. package/dist/vanilla/textarea.js +97 -0
  149. package/dist/vanilla/textarea.src.js +316 -0
  150. package/dist/vanilla/toast.d.ts +2 -0
  151. package/dist/vanilla/toast.js +120 -0
  152. package/dist/vanilla/toast.src.js +245 -0
  153. package/package.json +111 -0
@@ -0,0 +1,245 @@
1
+
2
+ import { render, html } from 'uhtml';
3
+
4
+ const sheet = new CSSStyleSheet();
5
+ sheet.replaceSync(":host {\n--kb-color-bg-canvas: #ffffff;\n--kb-color-bg-surface: #f6f8fa;\n--kb-color-bg-subtle: #eef1f4;\n--kb-color-bg-inverse: #1f2328;\n--kb-color-fg-default: #1f2328;\n--kb-color-fg-muted: #656d76;\n--kb-color-fg-subtle: #8c959f;\n--kb-color-fg-on-accent: #ffffff;\n--kb-color-fg-on-inverse: #ffffff;\n--kb-color-border-default: #d0d7de;\n--kb-color-border-muted: #e6ebf0;\n--kb-color-border-focus: #0969da;\n--kb-color-accent-default: #0969da;\n--kb-color-accent-hover: #0860ca;\n--kb-color-accent-subtle: #ddf4ff;\n--kb-color-danger-default: #cf222e;\n--kb-color-danger-subtle: #ffebe9;\n--kb-color-success-default: #1a7f37;\n--kb-color-success-subtle: #dafbe1;\n--kb-color-warning-default: #9a6700;\n--kb-color-warning-subtle: #fff8c5;\n--kb-space-2xs: 2px;\n--kb-space-xs: 4px;\n--kb-space-sm: 8px;\n--kb-space-md: 16px;\n--kb-space-lg: 24px;\n--kb-space-xl: 32px;\n--kb-space-2xl: 48px;\n--kb-radius-sm: 4px;\n--kb-radius-md: 8px;\n--kb-radius-lg: 12px;\n--kb-radius-full: 9999px;\n--kb-font-family-sans: ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n--kb-font-size-sm: 0.875rem;\n--kb-font-size-md: 1rem;\n--kb-font-size-lg: 1.125rem;\n--kb-font-size-xl: 1.25rem;\n--kb-font-weight-regular: 400;\n--kb-font-weight-medium: 500;\n--kb-font-weight-semibold: 600;\n--kb-line-height-tight: 1.25;\n--kb-line-height-normal: 1.5;\n--kb-shadow-sm: 0 1px 2px rgba(31, 35, 40, 0.08);\n--kb-shadow-md: 0 4px 12px rgba(31, 35, 40, 0.1);\n--kb-focus-ring: 0 0 0 3px rgba(9, 105, 218, 0.35);\n}\n\n\n :host {\n font-family: var(--kb-font-family-sans);\n }\n :host(:not([open])) {\n display: none;\n }\n :host([open]) {\n display: block;\n position: fixed;\n z-index: 1100;\n right: var(--kb-space-lg);\n bottom: var(--kb-space-lg);\n max-width: min(24rem, calc(100vw - 2 * var(--kb-space-lg)));\n box-sizing: border-box;\n }\n .root {\n display: flex;\n gap: var(--kb-space-md);\n align-items: flex-start;\n box-sizing: border-box;\n padding: var(--kb-space-md);\n border-radius: var(--kb-radius-md);\n border: 1px solid var(--kb-color-border-default);\n box-shadow: var(--kb-shadow-md);\n background: var(--kb-color-bg-canvas);\n color: var(--kb-color-fg-default);\n font-size: var(--kb-font-size-md);\n line-height: var(--kb-line-height-normal);\n }\n .info { border-color: var(--kb-color-accent-default); }\n .success { border-color: var(--kb-color-success-default); }\n .warning { border-color: var(--kb-color-warning-default); }\n .danger { border-color: var(--kb-color-danger-default); }\n .body { flex: 1; min-width: 0; }\n .title {\n margin: 0 0 var(--kb-space-2xs);\n font-weight: var(--kb-font-weight-semibold);\n }\n .close {\n flex-shrink: 0;\n min-width: 2rem;\n min-height: 2rem;\n border: none;\n border-radius: var(--kb-radius-sm);\n background: transparent;\n color: inherit;\n cursor: pointer;\n font-size: var(--kb-font-size-lg);\n line-height: 1;\n font-family: inherit;\n }\n .close:focus-visible {\n outline: none;\n box-shadow: var(--kb-focus-ring);\n }\n ");
6
+
7
+ export class KitbashToast extends HTMLElement {
8
+
9
+ static get observedAttributes() {
10
+ return ["open","tone","title"];
11
+ }
12
+
13
+ static get propTypes() {
14
+ return {"open":"Boolean","tone":"String","title":"String"};
15
+ }
16
+
17
+
18
+ get open() {
19
+ return this._props['open'];
20
+ }
21
+ set open(val) {
22
+ // External / framework property writes: re-render, do not emit kitbash-change
23
+ // (caller already knows the value they set).
24
+ this._assignProp('open', val);
25
+ this.update();
26
+ }
27
+
28
+ get tone() {
29
+ return this._props['tone'];
30
+ }
31
+ set tone(val) {
32
+ // External / framework property writes: re-render, do not emit kitbash-change
33
+ // (caller already knows the value they set).
34
+ this._assignProp('tone', val);
35
+ this.update();
36
+ }
37
+
38
+ get title() {
39
+ return this._props['title'];
40
+ }
41
+ set title(val) {
42
+ // External / framework property writes: re-render, do not emit kitbash-change
43
+ // (caller already knows the value they set).
44
+ this._assignProp('title', val);
45
+ this.update();
46
+ }
47
+
48
+
49
+ constructor() {
50
+ super();
51
+ this.attachShadow({ mode: 'open', delegatesFocus: false });
52
+
53
+ this.shadowRoot.adoptedStyleSheets = [sheet];
54
+
55
+ this._defaults = {"open":false,"tone":"info","title":""};
56
+
57
+ this._state = {};
58
+ this._props = { ...this._defaults };
59
+ this._eventHandlers = { 'click .close': function(_e, { commit }) {
60
+ commit({ props: { open: !1 } });
61
+ } };
62
+ this._eventCleanup = [];
63
+ this._renderFn = function({ props, html }) {
64
+ const tone = props.tone === "success" || props.tone === "warning" || props.tone === "danger" ? props.tone : "info", role = tone === "danger" || tone === "warning" ? "alert" : "status", title = typeof props.title === "string" && props.title.length > 0 ? props.title : "";
65
+ return html`
66
+ <div part="toast-root" class=${`root ${tone}`} role=${role}>
67
+ <div class="body" part="toast-body">
68
+ ${title ? html`<div class="title" part="toast-title">${title}</div>` : null}
69
+ <div part="toast-content"><slot></slot></div>
70
+ </div>
71
+ <button
72
+ type="button"
73
+ class="close"
74
+ part="toast-close"
75
+ aria-label="Dismiss notification"
76
+ >
77
+ \u00D7
78
+ </button>
79
+ </div>
80
+ `;
81
+ };
82
+ this._reflecting = false;
83
+ }
84
+
85
+ connectedCallback() {
86
+ // Initial attribute values are parsed by attributeChangedCallback before connectedCallback fires
87
+ this.update();
88
+
89
+ }
90
+
91
+ disconnectedCallback() {
92
+ this.cleanupEvents();
93
+ }
94
+
95
+ attributeChangedCallback(name, oldValue, newValue) {
96
+ // Skip when we caused the attribute write ourselves (avoids double update)
97
+ if (this._reflecting) return;
98
+ if (oldValue === newValue) return;
99
+
100
+ const type = this.constructor.propTypes[name];
101
+
102
+ let parsedValue = newValue;
103
+ if (newValue === null || newValue === undefined) {
104
+ parsedValue = this._defaults[name];
105
+ } else if (type === 'Number' && newValue !== '') {
106
+ // Match property coercion: empty string is not Number('') → 0
107
+ parsedValue = Number(newValue);
108
+ } else if (type === 'Boolean') {
109
+ parsedValue = newValue !== null && newValue !== 'false';
110
+ }
111
+
112
+ this._props[name] = parsedValue;
113
+
114
+ this.update();
115
+ }
116
+
117
+ /** Coerce + reflect a single prop; no re-render (caller decides). */
118
+ _assignProp(key, val) {
119
+ const type = this.constructor.propTypes[key];
120
+ let next = val;
121
+ if (type === 'Boolean') {
122
+ next = val === true || val === '';
123
+ } else if (type === 'Number' && val !== null && val !== undefined && val !== '') {
124
+ next = Number(val);
125
+ }
126
+ this._props[key] = next;
127
+
128
+ // Only reflect primitives — objects/arrays stay as properties (no [object Object] attrs)
129
+ const isPrimitive =
130
+ next === null ||
131
+ next === undefined ||
132
+ typeof next === 'string' ||
133
+ typeof next === 'number' ||
134
+ typeof next === 'boolean';
135
+
136
+ this._reflecting = true;
137
+ try {
138
+ if (type === 'Boolean') {
139
+ if (next) this.setAttribute(key, '');
140
+ else this.removeAttribute(key);
141
+ } else if (!isPrimitive) {
142
+ // property-only; drop stale attribute if any
143
+ this.removeAttribute(key);
144
+ } else if (next === null || next === undefined) {
145
+ this.removeAttribute(key);
146
+ } else {
147
+ this.setAttribute(key, String(next));
148
+ }
149
+ } finally {
150
+ this._reflecting = false;
151
+ }
152
+
153
+ }
154
+
155
+ _emitChange() {
156
+ // Shallow-copy both bags so listeners cannot mutate internal state/props via event.detail
157
+ this.dispatchEvent(new CustomEvent('kitbash-change', {
158
+ detail: {
159
+ state: { ...this._state },
160
+ props: { ...this._props },
161
+ },
162
+ bubbles: true,
163
+ composed: true
164
+ }));
165
+ }
166
+
167
+ /**
168
+ * Batch props and/or state: one uhtml update, one kitbash-change.
169
+ * Prefer this in event handlers (e.g. controlled inputs).
170
+ */
171
+ commit(patch) {
172
+ const p = patch || {};
173
+ if (p.props) {
174
+ const allowed = this.constructor.propTypes || {};
175
+ for (const key of Object.keys(p.props)) {
176
+ // Only declared props — ignore typos / stray keys
177
+ if (!Object.prototype.hasOwnProperty.call(allowed, key)) continue;
178
+ this._assignProp(key, p.props[key]);
179
+ }
180
+ }
181
+ if (p.state) {
182
+ this._state = { ...this._state, ...p.state };
183
+ }
184
+ this.update();
185
+ this._emitChange();
186
+ }
187
+
188
+ setState(newState) {
189
+ this.commit({ state: newState });
190
+ }
191
+
192
+ setProps(nextProps) {
193
+ this.commit({ props: nextProps });
194
+ }
195
+
196
+ _handlerCtx() {
197
+ // Snapshots so handlers/render cannot mutate internal bags by accident
198
+ return {
199
+ props: { ...this._props },
200
+ state: { ...this._state },
201
+ setState: this.setState.bind(this),
202
+ setProps: this.setProps.bind(this),
203
+ commit: this.commit.bind(this),
204
+ };
205
+ }
206
+
207
+ cleanupEvents() {
208
+ this._eventCleanup.forEach(cleanup => cleanup());
209
+ this._eventCleanup = [];
210
+ }
211
+
212
+ update() {
213
+ // Run the uhtml DOM diffing render cycle
214
+ render(this.shadowRoot, this._renderFn({
215
+ ...this._handlerCtx(),
216
+ html
217
+ }));
218
+ this.cleanupEvents();
219
+ this.bindEvents();
220
+
221
+ }
222
+
223
+
224
+
225
+ bindEvents() {
226
+ Object.keys(this._eventHandlers).forEach(eventSelector => {
227
+ const parts = eventSelector.split(' ');
228
+ const eventName = parts[0];
229
+ const selector = parts.slice(1).join(' ');
230
+
231
+ const targets = selector ? this.shadowRoot.querySelectorAll(selector) : [this];
232
+ targets.forEach(target => {
233
+ const handler = (e) => {
234
+ this._eventHandlers[eventSelector](e, this._handlerCtx());
235
+ };
236
+ target.addEventListener(eventName, handler);
237
+ this._eventCleanup.push(() => target.removeEventListener(eventName, handler));
238
+ });
239
+ });
240
+ }
241
+ }
242
+
243
+ if (!customElements.get('kitbash-toast')) {
244
+ customElements.define('kitbash-toast', KitbashToast);
245
+ }
package/package.json ADDED
@@ -0,0 +1,111 @@
1
+ {
2
+ "name": "@ktbsh/ui",
3
+ "version": "0.1.0",
4
+ "description": "Framework-agnostic design system components built with @ktbsh/sdk (vanilla CE + React wrappers).",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "engines": {
8
+ "bun": ">=1.3.14"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/dandrok/kitbash-ui.git"
13
+ },
14
+ "homepage": "https://github.com/dandrok/kitbash-ui#readme",
15
+ "bugs": {
16
+ "url": "https://github.com/dandrok/kitbash-ui/issues"
17
+ },
18
+ "keywords": [
19
+ "kitbash",
20
+ "design-system",
21
+ "web-components",
22
+ "custom-elements",
23
+ "react",
24
+ "typescript",
25
+ "astro",
26
+ "svelte"
27
+ ],
28
+ "sideEffects": [
29
+ "**/*.css",
30
+ "./dist/vanilla/**/*.js"
31
+ ],
32
+ "main": "./dist/index.js",
33
+ "types": "./dist/index.d.ts",
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "import": "./dist/index.js",
38
+ "default": "./dist/index.js"
39
+ },
40
+ "./package.json": "./package.json",
41
+ "./custom-elements.json": "./dist/custom-elements.json",
42
+ "./vanilla/*": {
43
+ "types": "./dist/vanilla/*.d.ts",
44
+ "import": "./dist/vanilla/*.js",
45
+ "default": "./dist/vanilla/*.js"
46
+ },
47
+ "./react/*": {
48
+ "types": "./dist/react/*.d.ts",
49
+ "import": "./dist/react/*.js",
50
+ "default": "./dist/react/*.js"
51
+ },
52
+ "./themes/*": "./dist/themes/*",
53
+ "./tokens": {
54
+ "types": "./dist/tokens/index.d.ts",
55
+ "import": "./dist/tokens/index.js",
56
+ "default": "./dist/tokens/index.js"
57
+ },
58
+ "./types": {
59
+ "types": "./dist/types/index.d.ts",
60
+ "import": "./dist/types/index.js",
61
+ "default": "./dist/types/index.js"
62
+ }
63
+ },
64
+ "files": [
65
+ "dist",
66
+ "README.md"
67
+ ],
68
+ "publishConfig": {
69
+ "access": "public"
70
+ },
71
+ "scripts": {
72
+ "tokens:build": "bun run scripts/tokens.ts build",
73
+ "tokens:check": "bun run scripts/tokens.ts check",
74
+ "package:entries": "bun run scripts/package-entries.ts",
75
+ "build": "bun run tokens:check && kitbash build && bun run package:entries",
76
+ "dev": "kitbash dev",
77
+ "format": "biome format --write .",
78
+ "lint": "biome lint .",
79
+ "check": "biome check --write .",
80
+ "ci": "biome ci .",
81
+ "typecheck": "tsc --noEmit",
82
+ "test": "bun test",
83
+ "storybook": "storybook dev -p 6006",
84
+ "build-storybook": "storybook build",
85
+ "verify": "bun run tokens:check && bun run ci && bun run typecheck && bun run build && bun run test && bun run build-storybook",
86
+ "prepack": "bun run build",
87
+ "pack:dry": "npm pack --dry-run"
88
+ },
89
+ "dependencies": {
90
+ "@ktbsh/sdk": "0.2.0"
91
+ },
92
+ "peerDependencies": {
93
+ "react": ">=18"
94
+ },
95
+ "peerDependenciesMeta": {
96
+ "react": {
97
+ "optional": true
98
+ }
99
+ },
100
+ "devDependencies": {
101
+ "@biomejs/biome": "2.5.4",
102
+ "@storybook/addon-a11y": "10.5.2",
103
+ "@storybook/addon-docs": "10.5.2",
104
+ "@storybook/web-components-vite": "10.5.2",
105
+ "@types/bun": "1.3.9",
106
+ "lit": "3.3.1",
107
+ "storybook": "10.5.2",
108
+ "typescript": "5.9.3",
109
+ "vite": "6.3.5"
110
+ }
111
+ }