@meddleware/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.
package/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ BSD Zero Clause License
2
+
3
+ Copyright (c) 2024 Meddleware
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted.
7
+
8
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
10
+ FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
+ PERFORMANCE OF THIS SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # @meddleware/ui
2
+
3
+ Shared Vue 3 component library for the `@meddleware` UIs. Delivers a layout shell (header, sidebar, footer), colour-mode control, and UI primitives — all styled with [`@meddleware/design-tokens`](https://www.npmjs.com/package/@meddleware/design-tokens) (Oxblood / Indigo palette).
4
+
5
+ ## Installation
6
+
7
+ ```sh
8
+ npm install @meddleware/ui @meddleware/design-tokens
9
+ # or
10
+ yarn add @meddleware/ui @meddleware/design-tokens
11
+ ```
12
+
13
+ `vue ^3.5.0` is a peer dependency — install it separately if not already present.
14
+
15
+ ## Setup
16
+
17
+ Import both CSS files once at your application entry point:
18
+
19
+ ```ts
20
+ // src/main.ts (or equivalent)
21
+ import '@meddleware/design-tokens/tokens.css' // required — registers CSS custom properties
22
+ import '@meddleware/ui/base.css' // optional — element-level defaults
23
+ import { createApp } from 'vue'
24
+ import App from './App.vue'
25
+
26
+ createApp(App).mount('#app')
27
+ ```
28
+
29
+ ## Exports
30
+
31
+ ### Layout shell
32
+
33
+ | Component | Description |
34
+ | --- | --- |
35
+ | `AppHeader` | Top navigation bar. Accepts `variant`, optional `colors` override, and named slots for dynamic content. |
36
+ | `AppSidebar` | Side navigation panel. Same API as `AppHeader`. |
37
+ | `AppFooter` | Page footer. Same API as `AppHeader`. |
38
+
39
+ All three accept a `variant` prop:
40
+
41
+ | Variant | Behaviour |
42
+ | --- | --- |
43
+ | `'dark'` | Uses `--mw-panel-dark-*` tokens — renders correctly on any page theme. |
44
+ | `'light'` | Uses `--mw-panel-light-*` tokens — renders correctly on any page theme. |
45
+ | `'transparent'` | Inherits the page background and text colour. |
46
+
47
+ ### Primitives
48
+
49
+ | Component | Description |
50
+ | --- | --- |
51
+ | `UiButton` | Styled button. |
52
+ | `UiCard` | Card container with surface background and border. |
53
+ | `UiSelect` | Styled select input. |
54
+ | `UiNotice` | Notice / alert banner. |
55
+
56
+ ### Colour mode
57
+
58
+ | Export | Type | Description |
59
+ | --- | --- | --- |
60
+ | `ColorModeControl` | Vue SFC | Presentational light / dark / system toggle. **Owns no state** — bind with `v-model`. |
61
+ | `useColorMode(default?)` | Composable | Module-singleton colour-mode state manager. Sets `data-theme` on `<html>`, persists to `localStorage`, follows system preference when mode is `'system'`. |
62
+ | `ColorMode` | Type | `'light' \| 'dark' \| 'system'` |
63
+ | `PanelVariant` | Type | `'light' \| 'dark' \| 'transparent'` |
64
+ | `PanelColors` | Type | Per-instance colour override shape for layout shell components. |
65
+
66
+ ## Theming
67
+
68
+ Global light / dark switching is handled by `useColorMode`, which sets `data-theme="dark"` on `<html>`. The semantic CSS tokens (`--bg`, `--surface`, `--text`, etc.) from `@meddleware/design-tokens` swap values automatically.
69
+
70
+ Layout shell components use the theme-independent `--mw-panel-{dark,light}-*` tokens for their `variant` prop, so a `variant="dark"` header renders correctly on a light page — and vice-versa — without any extra configuration.
71
+
72
+ ### Example: wiring colour mode
73
+
74
+ ```vue
75
+ <script setup lang="ts">
76
+ import { AppHeader, ColorModeControl, useColorMode } from '@meddleware/ui'
77
+
78
+ const { mode } = useColorMode()
79
+ </script>
80
+
81
+ <template>
82
+ <AppHeader variant="dark">
83
+ <template #actions>
84
+ <ColorModeControl v-model="mode" />
85
+ </template>
86
+ </AppHeader>
87
+ </template>
88
+ ```
89
+
90
+ ## Publishing
91
+
92
+ Published to npmjs on `v*` git tags via `.github/workflows/publish.yml` using npm trusted publishing (OIDC) — no long-lived secrets required. The workflow installs dependencies, builds `dist/`, and publishes.
93
+
94
+ To release: bump `version` in `package.json`, add a CHANGELOG entry, run `npm run build` to verify, commit, tag (`git tag v0.x.y`), push the tag.
95
+
96
+ ## License
97
+
98
+ [0BSD](./LICENSE) — BSD Zero Clause License.
package/dist/ui.css ADDED
@@ -0,0 +1,2 @@
1
+ .mw-header[data-v-ad7cd1c5]{height:var(--mw-header-height,56px);background:var(--_bg);color:var(--_text);border-bottom:1px solid var(--_border);font-family:var(--mw-font-sans);align-items:center;gap:1rem;padding:0 1rem;display:flex}.mw-header--sticky[data-v-ad7cd1c5]{z-index:50;position:sticky;top:0}.mw-header__brand[data-v-ad7cd1c5]{letter-spacing:.01em;white-space:nowrap;align-items:center;gap:.5rem;font-weight:650;display:flex}.mw-header__center[data-v-ad7cd1c5]{flex:auto;min-width:0}.mw-header__actions[data-v-ad7cd1c5]{align-items:center;gap:.5rem;margin-left:auto;display:flex}.mw-sidebar[data-v-ccf6628a]{width:var(--mw-sidebar-width,240px);background:var(--_bg);color:var(--_text);border-right:1px solid var(--_border);font-family:var(--mw-font-sans);flex-direction:column;display:flex}.mw-sidebar__head[data-v-ccf6628a]{border-bottom:1px solid var(--_border);padding:1rem}.mw-sidebar__nav[data-v-ccf6628a]{flex-direction:column;flex:auto;gap:.25rem;padding:.75rem;display:flex;overflow-y:auto}.mw-sidebar__foot[data-v-ccf6628a]{border-top:1px solid var(--_border);color:var(--_muted);padding:.75rem 1rem;font-size:.85rem}.mw-footer[data-v-060bc806]{background:var(--_bg);color:var(--_muted);border-top:1px solid var(--_border);font-family:var(--mw-font-sans);flex-wrap:wrap;align-items:center;gap:1rem;padding:.75rem 1rem;font-size:.85rem;display:flex}.mw-footer--transparent[data-v-060bc806]{border-top:1px solid var(--border)}.mw-footer__center[data-v-060bc806]{flex:auto;min-width:0}.mw-footer__end[data-v-060bc806]{margin-left:auto}.mw-mode[data-v-c982c97c]{border:1px solid var(--_border,var(--border));border-radius:var(--mw-radius,10px);background:color-mix(in srgb, var(--_text,var(--text)) 6%, transparent);gap:2px;padding:2px;display:inline-flex}.mw-mode__btn[data-v-c982c97c]{border-radius:calc(var(--mw-radius,10px) - 3px);color:var(--_text,var(--text));font:inherit;cursor:pointer;opacity:.7;background:0 0;border:0;align-items:center;gap:.35rem;padding:.25rem .5rem;font-size:.8rem;display:inline-flex}.mw-mode__btn[data-v-c982c97c]:hover{opacity:1}.mw-mode__btn.is-active[data-v-c982c97c]{opacity:1;background:color-mix(in srgb, var(--_text,var(--text)) 14%, transparent)}.mw-mode__btn[data-v-c982c97c]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}@media (width<=640px){.mw-mode__label[data-v-c982c97c]{display:none}}.mw-btn[data-v-2a324058]{border-radius:var(--mw-radius,10px);font:inherit;cursor:pointer;border:1px solid #0000;justify-content:center;align-items:center;gap:.4rem;padding:.5rem .9rem;font-weight:550;transition:filter .12s,background .12s;display:inline-flex}.mw-btn[data-v-2a324058]:disabled{opacity:.55;cursor:not-allowed}.mw-btn[data-v-2a324058]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.mw-btn--primary[data-v-2a324058]{background:var(--accent);color:var(--accent-contrast)}.mw-btn--primary[data-v-2a324058]:not(:disabled):hover{filter:brightness(1.08)}.mw-btn--secondary[data-v-2a324058]{background:var(--secondary);color:var(--secondary-contrast)}.mw-btn--secondary[data-v-2a324058]:not(:disabled):hover{filter:brightness(1.08)}.mw-btn--ghost[data-v-2a324058]{color:var(--text);border-color:var(--border);background:0 0}.mw-btn--ghost[data-v-2a324058]:not(:disabled):hover{background:var(--lift)}.mw-btn--danger[data-v-2a324058]{background:var(--danger);color:#fff}.mw-btn--danger[data-v-2a324058]:not(:disabled):hover{filter:brightness(1.08)}.mw-card[data-v-d1a4446e]{background:var(--surface);border:1px solid var(--border);border-radius:var(--mw-radius,10px);color:var(--text);overflow:hidden}.mw-card__header[data-v-d1a4446e]{border-bottom:1px solid var(--border);padding:.85rem 1rem}.mw-card__title[data-v-d1a4446e]{margin:0;font-size:1rem;font-weight:600}.mw-card__body[data-v-d1a4446e]{padding:1rem}.mw-card__footer[data-v-d1a4446e]{border-top:1px solid var(--border);background:var(--lift);padding:.75rem 1rem}.mw-select[data-v-b9468387]{position:relative}.mw-select select[data-v-b9468387]{appearance:none;background:var(--surface);width:100%;color:var(--text);border:1px solid var(--border);border-radius:var(--mw-radius,10px);font:inherit;padding:.5rem 2.5rem .5rem .7rem}.mw-select select[data-v-b9468387]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.mw-select__chevron[data-v-b9468387]{pointer-events:none;stroke:var(--muted);stroke-width:1.5px;fill:none;position:absolute;top:50%;right:.75rem;transform:translateY(-50%)}.mw-notice[data-v-7ba4f2bb]{border:1px solid var(--border);border-radius:var(--mw-radius,10px);background:var(--lift);color:var(--text);border-left-width:3px;margin:0;padding:.6rem .8rem;font-size:.9rem}.mw-notice--error[data-v-7ba4f2bb]{border-left-color:var(--danger);color:var(--danger);background:color-mix(in srgb, var(--danger) 8%, transparent)}.mw-notice--ok[data-v-7ba4f2bb]{border-left-color:var(--ok);color:var(--ok);background:color-mix(in srgb, var(--ok) 8%, transparent)}
2
+ /*$vite$:1*/
package/dist/ui.js ADDED
@@ -0,0 +1,242 @@
1
+ import { Fragment as e, computed as t, createCommentVNode as n, createElementBlock as r, createElementVNode as i, defineComponent as a, mergeProps as o, normalizeClass as s, normalizeStyle as c, openBlock as l, ref as u, renderList as d, renderSlot as f, toDisplayString as p, useModel as m, vModelSelect as h, watch as g, withDirectives as _ } from "vue";
2
+ //#region src/internal/panel.ts
3
+ function v(e, t) {
4
+ let n;
5
+ return n = e === "transparent" ? {
6
+ "--_bg": "transparent",
7
+ "--_surface": "transparent",
8
+ "--_text": "var(--text)",
9
+ "--_muted": "var(--muted)",
10
+ "--_border": "transparent"
11
+ } : e === "light" ? {
12
+ "--_bg": "var(--mw-panel-light-bg)",
13
+ "--_surface": "var(--mw-panel-light-surface)",
14
+ "--_text": "var(--mw-panel-light-text)",
15
+ "--_muted": "var(--mw-panel-light-muted)",
16
+ "--_border": "var(--mw-panel-light-border)"
17
+ } : {
18
+ "--_bg": "var(--mw-panel-dark-bg)",
19
+ "--_surface": "var(--mw-panel-dark-surface)",
20
+ "--_text": "var(--mw-panel-dark-text)",
21
+ "--_muted": "var(--mw-panel-dark-muted)",
22
+ "--_border": "var(--mw-panel-dark-border)"
23
+ }, t && (t.bg && (n["--_bg"] = t.bg), t.surface && (n["--_surface"] = t.surface), t.text && (n["--_text"] = t.text), t.muted && (n["--_muted"] = t.muted), t.border && (n["--_border"] = t.border)), n;
24
+ }
25
+ //#endregion
26
+ //#region src/components/AppHeader.vue?vue&type=script&setup=true&lang.ts
27
+ var ee = { class: "mw-header__brand" }, y = { class: "mw-header__center" }, b = { class: "mw-header__actions" }, x = /*@__PURE__*/ a({
28
+ __name: "AppHeader",
29
+ props: {
30
+ variant: { default: "dark" },
31
+ colors: {},
32
+ sticky: {
33
+ type: Boolean,
34
+ default: !0
35
+ }
36
+ },
37
+ setup(e) {
38
+ let n = e, a = t(() => v(n.variant, n.colors));
39
+ return (t, n) => (l(), r("header", {
40
+ class: s(["mw-header", [`mw-header--${e.variant}`, { "mw-header--sticky": e.sticky }]]),
41
+ style: c(a.value)
42
+ }, [
43
+ i("div", ee, [f(t.$slots, "brand", {}, void 0, !0)]),
44
+ i("div", y, [f(t.$slots, "default", {}, void 0, !0)]),
45
+ i("div", b, [f(t.$slots, "actions", {}, void 0, !0)])
46
+ ], 6));
47
+ }
48
+ }), S = (e, t) => {
49
+ let n = e.__vccOpts || e;
50
+ for (let [e, r] of t) n[e] = r;
51
+ return n;
52
+ }, C = /*#__PURE__*/ S(x, [["__scopeId", "data-v-ad7cd1c5"]]), w = {
53
+ key: 0,
54
+ class: "mw-sidebar__head"
55
+ }, T = {
56
+ class: "mw-sidebar__nav",
57
+ "aria-label": "Primary"
58
+ }, E = {
59
+ key: 1,
60
+ class: "mw-sidebar__foot"
61
+ }, D = /*#__PURE__*/ S(/* @__PURE__ */ a({
62
+ __name: "AppSidebar",
63
+ props: {
64
+ variant: { default: "dark" },
65
+ colors: {},
66
+ width: {}
67
+ },
68
+ setup(e) {
69
+ let a = e, o = t(() => {
70
+ let e = v(a.variant, a.colors);
71
+ return a.width && (e["--mw-sidebar-width"] = a.width), e;
72
+ });
73
+ return (t, a) => (l(), r("aside", {
74
+ class: s(["mw-sidebar", `mw-sidebar--${e.variant}`]),
75
+ style: c(o.value)
76
+ }, [
77
+ t.$slots.head ? (l(), r("div", w, [f(t.$slots, "head", {}, void 0, !0)])) : n("", !0),
78
+ i("nav", T, [f(t.$slots, "default", {}, void 0, !0)]),
79
+ t.$slots.foot ? (l(), r("div", E, [f(t.$slots, "foot", {}, void 0, !0)])) : n("", !0)
80
+ ], 6));
81
+ }
82
+ }), [["__scopeId", "data-v-ccf6628a"]]), O = { class: "mw-footer__start" }, k = { class: "mw-footer__center" }, A = { class: "mw-footer__end" }, j = /*#__PURE__*/ S(/* @__PURE__ */ a({
83
+ __name: "AppFooter",
84
+ props: {
85
+ variant: { default: "transparent" },
86
+ colors: {}
87
+ },
88
+ setup(e) {
89
+ let n = e, a = t(() => v(n.variant, n.colors));
90
+ return (t, n) => (l(), r("footer", {
91
+ class: s(["mw-footer", `mw-footer--${e.variant}`]),
92
+ style: c(a.value)
93
+ }, [
94
+ i("div", O, [f(t.$slots, "start", {}, void 0, !0)]),
95
+ i("div", k, [f(t.$slots, "default", {}, void 0, !0)]),
96
+ i("div", A, [f(t.$slots, "end", {}, void 0, !0)])
97
+ ], 6));
98
+ }
99
+ }), [["__scopeId", "data-v-060bc806"]]), M = {
100
+ class: "mw-mode",
101
+ role: "group",
102
+ "aria-label": "Colour mode"
103
+ }, N = [
104
+ "aria-pressed",
105
+ "title",
106
+ "onClick"
107
+ ], P = { "aria-hidden": "true" }, te = { class: "mw-mode__label" }, F = /*#__PURE__*/ S(/* @__PURE__ */ a({
108
+ __name: "ColorModeControl",
109
+ props: {
110
+ modelValue: {},
111
+ modes: { default: () => [
112
+ "light",
113
+ "dark",
114
+ "system"
115
+ ] }
116
+ },
117
+ emits: ["update:modelValue"],
118
+ setup(t) {
119
+ let n = {
120
+ light: "Light",
121
+ dark: "Dark",
122
+ system: "System"
123
+ }, a = {
124
+ light: "☀",
125
+ dark: "☾",
126
+ system: "◐"
127
+ };
128
+ return (o, c) => (l(), r("div", M, [(l(!0), r(e, null, d(t.modes, (e) => (l(), r("button", {
129
+ key: e,
130
+ type: "button",
131
+ class: s(["mw-mode__btn", { "is-active": t.modelValue === e }]),
132
+ "aria-pressed": t.modelValue === e,
133
+ title: n[e],
134
+ onClick: (t) => o.$emit("update:modelValue", e)
135
+ }, [i("span", P, p(a[e]), 1), i("span", te, p(n[e]), 1)], 10, N))), 128))]));
136
+ }
137
+ }), [["__scopeId", "data-v-c982c97c"]]), I = ["type", "disabled"], L = /*#__PURE__*/ S(/* @__PURE__ */ a({
138
+ __name: "UiButton",
139
+ props: {
140
+ variant: { default: "primary" },
141
+ type: { default: "button" },
142
+ disabled: {
143
+ type: Boolean,
144
+ default: !1
145
+ }
146
+ },
147
+ setup(e) {
148
+ return (t, n) => (l(), r("button", {
149
+ type: e.type,
150
+ disabled: e.disabled,
151
+ class: s(["mw-btn", `mw-btn--${e.variant}`])
152
+ }, [f(t.$slots, "default", {}, void 0, !0)], 10, I));
153
+ }
154
+ }), [["__scopeId", "data-v-2a324058"]]), R = { class: "mw-card" }, z = {
155
+ key: 0,
156
+ class: "mw-card__header"
157
+ }, B = { class: "mw-card__title" }, V = { class: "mw-card__body" }, H = {
158
+ key: 1,
159
+ class: "mw-card__footer"
160
+ }, U = /*#__PURE__*/ S(/* @__PURE__ */ a({
161
+ __name: "UiCard",
162
+ props: { title: {} },
163
+ setup(e) {
164
+ return (t, a) => (l(), r("section", R, [
165
+ e.title || t.$slots.header ? (l(), r("header", z, [f(t.$slots, "header", {}, () => [i("h3", B, p(e.title), 1)], !0)])) : n("", !0),
166
+ i("div", V, [f(t.$slots, "default", {}, void 0, !0)]),
167
+ t.$slots.footer ? (l(), r("footer", H, [f(t.$slots, "footer", {}, void 0, !0)])) : n("", !0)
168
+ ]));
169
+ }
170
+ }), [["__scopeId", "data-v-d1a4446e"]]), W = { class: "mw-select" }, G = /*#__PURE__*/ S(/* @__PURE__ */ a({
171
+ inheritAttrs: !1,
172
+ __name: "UiSelect",
173
+ props: {
174
+ modelValue: {},
175
+ modelModifiers: {}
176
+ },
177
+ emits: ["update:modelValue"],
178
+ setup(e) {
179
+ let t = m(e, "modelValue");
180
+ return (e, n) => (l(), r("div", W, [_(i("select", o(e.$attrs, { "onUpdate:modelValue": n[0] ||= (e) => t.value = e }), [f(e.$slots, "default", {}, void 0, !0)], 16), [[h, t.value]]), n[1] ||= i("svg", {
181
+ class: "mw-select__chevron",
182
+ xmlns: "http://www.w3.org/2000/svg",
183
+ width: "12",
184
+ height: "8",
185
+ viewBox: "0 0 12 8",
186
+ "aria-hidden": "true"
187
+ }, [i("path", { d: "M1 1l5 5 5-5" })], -1)]));
188
+ }
189
+ }), [["__scopeId", "data-v-b9468387"]]), K = ["role"], q = /*#__PURE__*/ S(/* @__PURE__ */ a({
190
+ __name: "UiNotice",
191
+ props: { type: {} },
192
+ setup(e) {
193
+ let n = e, i = t(() => {
194
+ if (n.type === "error") return "alert";
195
+ if (n.type === "ok") return "status";
196
+ });
197
+ return (t, n) => (l(), r("p", {
198
+ class: s(["mw-notice", e.type && e.type !== "info" ? `mw-notice--${e.type}` : ""]),
199
+ role: i.value
200
+ }, [f(t.$slots, "default", {}, void 0, !0)], 10, K));
201
+ }
202
+ }), [["__scopeId", "data-v-7ba4f2bb"]]), J = "mw-color-mode", Y = u("system"), X = !1;
203
+ function Z() {
204
+ return typeof window < "u" && typeof window.matchMedia == "function" && window.matchMedia("(prefers-color-scheme: dark)").matches;
205
+ }
206
+ function Q(e) {
207
+ return e === "dark" || e === "system" && Z();
208
+ }
209
+ function $(e) {
210
+ typeof document > "u" || document.documentElement.setAttribute("data-theme", Q(e) ? "dark" : "light");
211
+ }
212
+ function ne(e = "system") {
213
+ if (!X) {
214
+ X = !0;
215
+ let t = null;
216
+ try {
217
+ t = typeof localStorage < "u" ? localStorage.getItem(J) : null;
218
+ } catch {}
219
+ Y.value = t ?? e, $(Y.value), typeof window < "u" && typeof window.matchMedia == "function" && window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => {
220
+ Y.value === "system" && $("system");
221
+ }), g(Y, (e) => {
222
+ $(e);
223
+ try {
224
+ typeof localStorage < "u" && localStorage.setItem(J, e);
225
+ } catch {}
226
+ });
227
+ }
228
+ function t(e) {
229
+ Y.value = e;
230
+ }
231
+ function n() {
232
+ t(Y.value === "light" ? "dark" : Y.value === "dark" ? "system" : "light");
233
+ }
234
+ return {
235
+ mode: Y,
236
+ set: t,
237
+ cycle: n,
238
+ isDark: () => Q(Y.value)
239
+ };
240
+ }
241
+ //#endregion
242
+ export { j as AppFooter, C as AppHeader, D as AppSidebar, F as ColorModeControl, L as UiButton, U as UiCard, q as UiNotice, G as UiSelect, ne as useColorMode };
package/package.json ADDED
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "@meddleware/ui",
3
+ "version": "0.1.0",
4
+ "description": "Shared Vue 3 component library for @meddleware UIs — layout shell (header/sidebar/footer), colour-mode control, and primitives. Built on @meddleware/design-tokens.",
5
+ "license": "0BSD",
6
+ "type": "module",
7
+ "sideEffects": [
8
+ "*.css",
9
+ "*.vue"
10
+ ],
11
+ "main": "./dist/ui.js",
12
+ "module": "./dist/ui.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/ui.js"
18
+ },
19
+ "./base.css": "./dist/base.css"
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "scripts": {
25
+ "build": "vue-tsc -p tsconfig.build.json && vite build",
26
+ "type-check": "vue-tsc --noEmit"
27
+ },
28
+ "peerDependencies": {
29
+ "vue": "^3.5.0"
30
+ },
31
+ "dependencies": {
32
+ "@meddleware/design-tokens": "^0.1.1"
33
+ },
34
+ "devDependencies": {
35
+ "@vitejs/plugin-vue": "^6.0.8",
36
+ "typescript": "^6.0.0",
37
+ "vite": "^8.2.2",
38
+ "vue": "^3.5.42",
39
+ "vue-tsc": "~3.3.11"
40
+ },
41
+ "publishConfig": {
42
+ "access": "public"
43
+ }
44
+ }