@meddleware/ui 0.1.2 → 0.1.4

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/README.md CHANGED
@@ -52,6 +52,7 @@ All three accept a `variant` prop:
52
52
  | `UiCard` | Card container with surface background and border. |
53
53
  | `UiSelect` | Styled select input. |
54
54
  | `UiNotice` | Notice / alert banner. |
55
+ | `SidebarItem` | Navigation button for use inside `AppSidebar`. Accepts `label`, `icon`, `active`, and `disabled` props. |
55
56
 
56
57
  ### Colour mode
57
58
 
package/dist/base.css CHANGED
@@ -1,2 +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-5aa0ef5a]{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-5aa0ef5a]{border-bottom:1px solid var(--_border);padding:1rem}.mw-sidebar__nav[data-v-5aa0ef5a]{flex-direction:column;flex:auto;gap:.25rem;padding:.75rem;display:flex;overflow-y:auto}.mw-sidebar__foot[data-v-5aa0ef5a]{border-top:1px solid var(--_border);color:var(--_muted);padding:.75rem 1rem;font-size:.85rem}.mw-footer[data-v-c646b8e1]{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-c646b8e1]{border-top:1px solid var(--border)}.mw-footer__center[data-v-c646b8e1]{flex:auto;min-width:0}.mw-footer__end[data-v-c646b8e1]{margin-left:auto}.mw-mode[data-v-e4a6bf1d]{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-e4a6bf1d]{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-e4a6bf1d]:hover{opacity:1}.mw-mode__btn.is-active[data-v-e4a6bf1d]{opacity:1;background:color-mix(in srgb, var(--_text,var(--text)) 14%, transparent)}.mw-mode__btn[data-v-e4a6bf1d]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}@media (width<=640px){.mw-mode__label[data-v-e4a6bf1d]{display:none}}.mw-btn[data-v-299de2c3]{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-299de2c3]:disabled{opacity:.55;cursor:not-allowed}.mw-btn[data-v-299de2c3]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.mw-btn--primary[data-v-299de2c3]{background:var(--accent);color:var(--accent-contrast)}.mw-btn--primary[data-v-299de2c3]:not(:disabled):hover{filter:brightness(1.08)}.mw-btn--secondary[data-v-299de2c3]{background:var(--secondary);color:var(--secondary-contrast)}.mw-btn--secondary[data-v-299de2c3]:not(:disabled):hover{filter:brightness(1.08)}.mw-btn--ghost[data-v-299de2c3]{color:var(--text);border-color:var(--border);background:0 0}.mw-btn--ghost[data-v-299de2c3]:not(:disabled):hover{background:var(--lift)}.mw-btn--danger[data-v-299de2c3]{background:var(--danger);color:var(--mw-neutral-000)}.mw-btn--danger[data-v-299de2c3]:not(:disabled):hover{filter:brightness(1.08)}.mw-card[data-v-fd2fd7ab]{background:var(--surface);border:1px solid var(--border);border-radius:var(--mw-radius,10px);color:var(--text);overflow:hidden}.mw-card__header[data-v-fd2fd7ab]{border-bottom:1px solid var(--border);padding:.85rem 1rem}.mw-card__title[data-v-fd2fd7ab]{margin:0;font-size:1rem;font-weight:600}.mw-card__body[data-v-fd2fd7ab]{padding:1rem}.mw-card__footer[data-v-fd2fd7ab]{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-6f53d0be]{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-6f53d0be]{border-left-color:var(--danger);color:var(--danger);background:color-mix(in srgb, var(--danger) 8%, transparent)}.mw-notice--ok[data-v-6f53d0be]{border-left-color:var(--ok);color:var(--ok);background:color-mix(in srgb, var(--ok) 8%, transparent)}
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-5aa0ef5a]{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-5aa0ef5a]{border-bottom:1px solid var(--_border);padding:1rem}.mw-sidebar__nav[data-v-5aa0ef5a]{flex-direction:column;flex:auto;gap:.25rem;padding:.75rem;display:flex;overflow-y:auto}.mw-sidebar__foot[data-v-5aa0ef5a]{border-top:1px solid var(--_border);color:var(--_muted);padding:.75rem 1rem;font-size:.85rem}.mw-footer[data-v-c646b8e1]{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-c646b8e1]{border-top:1px solid var(--border)}.mw-footer__center[data-v-c646b8e1]{flex:auto;min-width:0}.mw-footer__end[data-v-c646b8e1]{margin-left:auto}.mw-mode[data-v-e4a6bf1d]{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-e4a6bf1d]{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-e4a6bf1d]:hover{opacity:1}.mw-mode__btn.is-active[data-v-e4a6bf1d]{opacity:1;background:color-mix(in srgb, var(--_text,var(--text)) 14%, transparent)}.mw-mode__btn[data-v-e4a6bf1d]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}@media (width<=640px){.mw-mode__label[data-v-e4a6bf1d]{display:none}}.mw-btn[data-v-299de2c3]{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-299de2c3]:disabled{opacity:.55;cursor:not-allowed}.mw-btn[data-v-299de2c3]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.mw-btn--primary[data-v-299de2c3]{background:var(--accent);color:var(--accent-contrast)}.mw-btn--primary[data-v-299de2c3]:not(:disabled):hover{filter:brightness(1.08)}.mw-btn--secondary[data-v-299de2c3]{background:var(--secondary);color:var(--secondary-contrast)}.mw-btn--secondary[data-v-299de2c3]:not(:disabled):hover{filter:brightness(1.08)}.mw-btn--ghost[data-v-299de2c3]{color:var(--text);border-color:var(--border);background:0 0}.mw-btn--ghost[data-v-299de2c3]:not(:disabled):hover{background:var(--lift)}.mw-btn--danger[data-v-299de2c3]{background:var(--danger);color:var(--mw-neutral-000)}.mw-btn--danger[data-v-299de2c3]:not(:disabled):hover{filter:brightness(1.08)}.mw-card[data-v-fd2fd7ab]{background:var(--surface);border:1px solid var(--border);border-radius:var(--mw-radius,10px);color:var(--text);overflow:hidden}.mw-card__header[data-v-fd2fd7ab]{border-bottom:1px solid var(--border);padding:.85rem 1rem}.mw-card__title[data-v-fd2fd7ab]{margin:0;font-size:1rem;font-weight:600}.mw-card__body[data-v-fd2fd7ab]{padding:1rem}.mw-card__footer[data-v-fd2fd7ab]{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-6f53d0be]{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-6f53d0be]{border-left-color:var(--danger);color:var(--danger);background:color-mix(in srgb, var(--danger) 8%, transparent)}.mw-notice--ok[data-v-6f53d0be]{border-left-color:var(--ok);color:var(--ok);background:color-mix(in srgb, var(--ok) 8%, transparent)}.sidebar-item[data-v-e15afdf7]{border-radius:var(--mw-radius,10px);width:100%;color:inherit;font:inherit;text-align:left;cursor:pointer;opacity:.85;background:0 0;border:0;align-items:center;gap:.6rem;padding:.55rem .7rem;display:flex}.sidebar-item[data-v-e15afdf7]:hover:not(:disabled){background:color-mix(in srgb, currentColor 10%, transparent);opacity:1}.sidebar-item.is-active[data-v-e15afdf7]{background:color-mix(in srgb, var(--accent) 26%, transparent);opacity:1}.sidebar-item[data-v-e15afdf7]:disabled{cursor:default}.sidebar-item[data-v-e15afdf7]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.sidebar-item__icon[data-v-e15afdf7]{text-align:center;width:1.1rem}
2
2
  /*$vite$:1*/
@@ -0,0 +1,12 @@
1
+ type __VLS_Props = {
2
+ label: string;
3
+ icon?: string;
4
+ active?: boolean;
5
+ disabled?: boolean;
6
+ };
7
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
8
+ disabled: boolean;
9
+ active: boolean;
10
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
11
+ declare const _default: typeof __VLS_export;
12
+ export default _default;
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export { default as UiButton } from './components/UiButton.vue';
6
6
  export { default as UiCard } from './components/UiCard.vue';
7
7
  export { default as UiSelect } from './components/UiSelect.vue';
8
8
  export { default as UiNotice } from './components/UiNotice.vue';
9
+ export { default as SidebarItem } from './components/SidebarItem.vue';
9
10
  export { useColorMode } from './composables/useColorMode.js';
10
11
  export type { ColorMode } from './composables/useColorMode.js';
11
12
  export type { PanelVariant, PanelColors } from './internal/panel.js';
package/dist/ui.js CHANGED
@@ -1,6 +1,6 @@
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";
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 ee, renderList as u, renderSlot as d, toDisplayString as f, useModel as p, vModelSelect as m, watch as te, withDirectives as ne } from "vue";
2
2
  //#region src/internal/panel.ts
3
- function v(e, t) {
3
+ function h(e, t) {
4
4
  let n;
5
5
  return n = e === "transparent" ? {
6
6
  "--_bg": "transparent",
@@ -24,7 +24,7 @@ function v(e, t) {
24
24
  }
25
25
  //#endregion
26
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({
27
+ var re = { class: "mw-header__brand" }, g = { class: "mw-header__center" }, _ = { class: "mw-header__actions" }, v = /*@__PURE__*/ a({
28
28
  __name: "AppHeader",
29
29
  props: {
30
30
  variant: { default: "dark" },
@@ -35,30 +35,30 @@ var ee = { class: "mw-header__brand" }, y = { class: "mw-header__center" }, b =
35
35
  }
36
36
  },
37
37
  setup(e) {
38
- let n = e, a = t(() => v(n.variant, n.colors));
38
+ let n = e, a = t(() => h(n.variant, n.colors));
39
39
  return (t, n) => (l(), r("header", {
40
40
  class: s(["mw-header", [`mw-header--${e.variant}`, { "mw-header--sticky": e.sticky }]]),
41
41
  style: c(a.value)
42
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)])
43
+ i("div", re, [d(t.$slots, "brand", {}, void 0, !0)]),
44
+ i("div", g, [d(t.$slots, "default", {}, void 0, !0)]),
45
+ i("div", _, [d(t.$slots, "actions", {}, void 0, !0)])
46
46
  ], 6));
47
47
  }
48
- }), S = (e, t) => {
48
+ }), y = (e, t) => {
49
49
  let n = e.__vccOpts || e;
50
50
  for (let [e, r] of t) n[e] = r;
51
51
  return n;
52
- }, C = /*#__PURE__*/ S(x, [["__scopeId", "data-v-ad7cd1c5"]]), w = {
52
+ }, b = /*#__PURE__*/ y(v, [["__scopeId", "data-v-ad7cd1c5"]]), x = {
53
53
  key: 0,
54
54
  class: "mw-sidebar__head"
55
- }, T = {
55
+ }, S = {
56
56
  class: "mw-sidebar__nav",
57
57
  "aria-label": "Primary"
58
- }, E = {
58
+ }, C = {
59
59
  key: 1,
60
60
  class: "mw-sidebar__foot"
61
- }, D = /*#__PURE__*/ S(/* @__PURE__ */ a({
61
+ }, w = /*#__PURE__*/ y(/* @__PURE__ */ a({
62
62
  __name: "AppSidebar",
63
63
  props: {
64
64
  variant: { default: "dark" },
@@ -67,44 +67,44 @@ var ee = { class: "mw-header__brand" }, y = { class: "mw-header__center" }, b =
67
67
  },
68
68
  setup(e) {
69
69
  let a = e, o = t(() => {
70
- let e = v(a.variant, a.colors);
70
+ let e = h(a.variant, a.colors);
71
71
  return a.width && (e["--mw-sidebar-width"] = a.width), e;
72
72
  });
73
73
  return (t, a) => (l(), r("aside", {
74
74
  class: s(["mw-sidebar", `mw-sidebar--${e.variant}`]),
75
75
  style: c(o.value)
76
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)
77
+ t.$slots.head ? (l(), r("div", x, [d(t.$slots, "head", {}, void 0, !0)])) : n("", !0),
78
+ i("nav", S, [d(t.$slots, "default", {}, void 0, !0)]),
79
+ t.$slots.foot ? (l(), r("div", C, [d(t.$slots, "foot", {}, void 0, !0)])) : n("", !0)
80
80
  ], 6));
81
81
  }
82
- }), [["__scopeId", "data-v-5aa0ef5a"]]), O = { class: "mw-footer__start" }, k = { class: "mw-footer__center" }, A = { class: "mw-footer__end" }, j = /*#__PURE__*/ S(/* @__PURE__ */ a({
82
+ }), [["__scopeId", "data-v-5aa0ef5a"]]), T = { class: "mw-footer__start" }, E = { class: "mw-footer__center" }, D = { class: "mw-footer__end" }, O = /*#__PURE__*/ y(/* @__PURE__ */ a({
83
83
  __name: "AppFooter",
84
84
  props: {
85
85
  variant: { default: "transparent" },
86
86
  colors: {}
87
87
  },
88
88
  setup(e) {
89
- let n = e, a = t(() => v(n.variant, n.colors));
89
+ let n = e, a = t(() => h(n.variant, n.colors));
90
90
  return (t, n) => (l(), r("footer", {
91
91
  class: s(["mw-footer", `mw-footer--${e.variant}`]),
92
92
  style: c(a.value)
93
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)])
94
+ i("div", T, [d(t.$slots, "start", {}, void 0, !0)]),
95
+ i("div", E, [d(t.$slots, "default", {}, void 0, !0)]),
96
+ i("div", D, [d(t.$slots, "end", {}, void 0, !0)])
97
97
  ], 6));
98
98
  }
99
- }), [["__scopeId", "data-v-c646b8e1"]]), M = {
99
+ }), [["__scopeId", "data-v-c646b8e1"]]), k = {
100
100
  class: "mw-mode",
101
101
  role: "group",
102
102
  "aria-label": "Colour mode"
103
- }, N = [
103
+ }, A = [
104
104
  "aria-pressed",
105
105
  "title",
106
106
  "onClick"
107
- ], P = { "aria-hidden": "true" }, te = { class: "mw-mode__label" }, F = /*#__PURE__*/ S(/* @__PURE__ */ a({
107
+ ], j = { "aria-hidden": "true" }, M = { class: "mw-mode__label" }, N = /*#__PURE__*/ y(/* @__PURE__ */ a({
108
108
  __name: "ColorModeControl",
109
109
  props: {
110
110
  modelValue: {},
@@ -125,16 +125,16 @@ var ee = { class: "mw-header__brand" }, y = { class: "mw-header__center" }, b =
125
125
  dark: "☾",
126
126
  system: "◐"
127
127
  };
128
- return (o, c) => (l(), r("div", M, [(l(!0), r(e, null, d(t.modes, (e) => (l(), r("button", {
128
+ return (o, c) => (l(), r("div", k, [(l(!0), r(e, null, u(t.modes, (e) => (l(), r("button", {
129
129
  key: e,
130
130
  type: "button",
131
131
  class: s(["mw-mode__btn", { "is-active": t.modelValue === e }]),
132
132
  "aria-pressed": t.modelValue === e,
133
133
  title: n[e],
134
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))]));
135
+ }, [i("span", j, f(a[e]), 1), i("span", M, f(n[e]), 1)], 10, A))), 128))]));
136
136
  }
137
- }), [["__scopeId", "data-v-e4a6bf1d"]]), I = ["type", "disabled"], L = /*#__PURE__*/ S(/* @__PURE__ */ a({
137
+ }), [["__scopeId", "data-v-e4a6bf1d"]]), P = ["type", "disabled"], F = /*#__PURE__*/ y(/* @__PURE__ */ a({
138
138
  __name: "UiButton",
139
139
  props: {
140
140
  variant: { default: "primary" },
@@ -149,25 +149,25 @@ var ee = { class: "mw-header__brand" }, y = { class: "mw-header__center" }, b =
149
149
  type: e.type,
150
150
  disabled: e.disabled,
151
151
  class: s(["mw-btn", `mw-btn--${e.variant}`])
152
- }, [f(t.$slots, "default", {}, void 0, !0)], 10, I));
152
+ }, [d(t.$slots, "default", {}, void 0, !0)], 10, P));
153
153
  }
154
- }), [["__scopeId", "data-v-299de2c3"]]), R = { class: "mw-card" }, z = {
154
+ }), [["__scopeId", "data-v-299de2c3"]]), ie = { class: "mw-card" }, I = {
155
155
  key: 0,
156
156
  class: "mw-card__header"
157
- }, B = { class: "mw-card__title" }, V = { class: "mw-card__body" }, H = {
157
+ }, L = { class: "mw-card__title" }, R = { class: "mw-card__body" }, z = {
158
158
  key: 1,
159
159
  class: "mw-card__footer"
160
- }, U = /*#__PURE__*/ S(/* @__PURE__ */ a({
160
+ }, B = /*#__PURE__*/ y(/* @__PURE__ */ a({
161
161
  __name: "UiCard",
162
162
  props: { title: {} },
163
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)
164
+ return (t, a) => (l(), r("section", ie, [
165
+ e.title || t.$slots.header ? (l(), r("header", I, [d(t.$slots, "header", {}, () => [i("h3", L, f(e.title), 1)], !0)])) : n("", !0),
166
+ i("div", R, [d(t.$slots, "default", {}, void 0, !0)]),
167
+ t.$slots.footer ? (l(), r("footer", z, [d(t.$slots, "footer", {}, void 0, !0)])) : n("", !0)
168
168
  ]));
169
169
  }
170
- }), [["__scopeId", "data-v-fd2fd7ab"]]), W = { class: "mw-select" }, G = /*#__PURE__*/ S(/* @__PURE__ */ a({
170
+ }), [["__scopeId", "data-v-fd2fd7ab"]]), V = { class: "mw-select" }, H = /*#__PURE__*/ y(/* @__PURE__ */ a({
171
171
  inheritAttrs: !1,
172
172
  __name: "UiSelect",
173
173
  props: {
@@ -176,8 +176,8 @@ var ee = { class: "mw-header__brand" }, y = { class: "mw-header__center" }, b =
176
176
  },
177
177
  emits: ["update:modelValue"],
178
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", {
179
+ let t = p(e, "modelValue");
180
+ return (e, n) => (l(), r("div", V, [ne(i("select", o(e.$attrs, { "onUpdate:modelValue": n[0] ||= (e) => t.value = e }), [d(e.$slots, "default", {}, void 0, !0)], 16), [[m, t.value]]), n[1] ||= i("svg", {
181
181
  class: "mw-select__chevron",
182
182
  xmlns: "http://www.w3.org/2000/svg",
183
183
  width: "12",
@@ -186,7 +186,7 @@ var ee = { class: "mw-header__brand" }, y = { class: "mw-header__center" }, b =
186
186
  "aria-hidden": "true"
187
187
  }, [i("path", { d: "M1 1l5 5 5-5" })], -1)]));
188
188
  }
189
- }), [["__scopeId", "data-v-b9468387"]]), K = ["role"], q = /*#__PURE__*/ S(/* @__PURE__ */ a({
189
+ }), [["__scopeId", "data-v-b9468387"]]), U = ["role"], W = /*#__PURE__*/ y(/* @__PURE__ */ a({
190
190
  __name: "UiNotice",
191
191
  props: { type: {} },
192
192
  setup(e) {
@@ -197,46 +197,72 @@ var ee = { class: "mw-header__brand" }, y = { class: "mw-header__center" }, b =
197
197
  return (t, n) => (l(), r("p", {
198
198
  class: s(["mw-notice", e.type && e.type !== "info" ? `mw-notice--${e.type}` : ""]),
199
199
  role: i.value
200
- }, [f(t.$slots, "default", {}, void 0, !0)], 10, K));
200
+ }, [d(t.$slots, "default", {}, void 0, !0)], 10, U));
201
201
  }
202
- }), [["__scopeId", "data-v-6f53d0be"]]), J = "mw-color-mode", Y = u("system"), X = !1;
203
- function Z() {
202
+ }), [["__scopeId", "data-v-6f53d0be"]]), G = ["disabled", "aria-current"], K = {
203
+ key: 0,
204
+ class: "sidebar-item__icon",
205
+ "aria-hidden": "true"
206
+ }, q = { class: "sidebar-item__label" }, J = /*#__PURE__*/ y(/* @__PURE__ */ a({
207
+ __name: "SidebarItem",
208
+ props: {
209
+ label: {},
210
+ icon: {},
211
+ active: {
212
+ type: Boolean,
213
+ default: !1
214
+ },
215
+ disabled: {
216
+ type: Boolean,
217
+ default: !1
218
+ }
219
+ },
220
+ setup(e) {
221
+ return (t, a) => (l(), r("button", {
222
+ type: "button",
223
+ class: s(["sidebar-item", { "is-active": e.active }]),
224
+ disabled: e.disabled,
225
+ "aria-current": e.active ? "page" : void 0
226
+ }, [e.icon ? (l(), r("span", K, f(e.icon), 1)) : n("", !0), i("span", q, f(e.label), 1)], 10, G));
227
+ }
228
+ }), [["__scopeId", "data-v-e15afdf7"]]), Y = "mw-color-mode", X = ee("system"), Z = !1;
229
+ function ae() {
204
230
  return typeof window < "u" && typeof window.matchMedia == "function" && window.matchMedia("(prefers-color-scheme: dark)").matches;
205
231
  }
206
232
  function Q(e) {
207
- return e === "dark" || e === "system" && Z();
233
+ return e === "dark" || e === "system" && ae();
208
234
  }
209
235
  function $(e) {
210
236
  typeof document > "u" || document.documentElement.setAttribute("data-theme", Q(e) ? "dark" : "light");
211
237
  }
212
- function ne(e = "system") {
213
- if (!X) {
214
- X = !0;
238
+ function oe(e = "system") {
239
+ if (!Z) {
240
+ Z = !0;
215
241
  let t = null;
216
242
  try {
217
- t = typeof localStorage < "u" ? localStorage.getItem(J) : null;
243
+ t = typeof localStorage < "u" ? localStorage.getItem(Y) : null;
218
244
  } 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) => {
245
+ X.value = t ?? e, $(X.value), typeof window < "u" && typeof window.matchMedia == "function" && window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => {
246
+ X.value === "system" && $("system");
247
+ }), te(X, (e) => {
222
248
  $(e);
223
249
  try {
224
- typeof localStorage < "u" && localStorage.setItem(J, e);
250
+ typeof localStorage < "u" && localStorage.setItem(Y, e);
225
251
  } catch {}
226
252
  });
227
253
  }
228
254
  function t(e) {
229
- Y.value = e;
255
+ X.value = e;
230
256
  }
231
257
  function n() {
232
- t(Y.value === "light" ? "dark" : Y.value === "dark" ? "system" : "light");
258
+ t(X.value === "light" ? "dark" : X.value === "dark" ? "system" : "light");
233
259
  }
234
260
  return {
235
- mode: Y,
261
+ mode: X,
236
262
  set: t,
237
263
  cycle: n,
238
- isDark: () => Q(Y.value)
264
+ isDark: () => Q(X.value)
239
265
  };
240
266
  }
241
267
  //#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 };
268
+ export { O as AppFooter, b as AppHeader, w as AppSidebar, N as ColorModeControl, J as SidebarItem, F as UiButton, B as UiCard, W as UiNotice, H as UiSelect, oe as useColorMode };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meddleware/ui",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Shared Vue 3 component library for @meddleware UIs \u2014 layout shell (header/sidebar/footer), colour-mode control, and primitives. Built on @meddleware/design-tokens.",
5
5
  "license": "0BSD",
6
6
  "type": "module",