@ac-design/design-system 2.4.1 → 2.4.3

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.
@@ -770,15 +770,21 @@ button:is([data-ac-ds], [data-ac-ds] *), input:where([type="button"], [type="res
770
770
  .ac-scrollbar:where([data-ac-ds], [data-ac-ds] *) {
771
771
  overflow: auto !important;
772
772
  scrollbar-width: thin !important;
773
- scrollbar-color: rgb(176 176 176 / 0.55) transparent !important;
773
+ scrollbar-color: transparent transparent !important;
774
+ &:hover:where([data-ac-ds], [data-ac-ds] *), &:focus-within:where([data-ac-ds], [data-ac-ds] *) {
775
+ scrollbar-color: rgb(176 176 176 / 0.55) transparent !important;
776
+ }
774
777
  &:where([data-ac-ds], [data-ac-ds] *)::-webkit-scrollbar {
775
778
  width: 4px !important;
776
779
  height: 4px !important;
777
780
  }
778
781
  &:where([data-ac-ds], [data-ac-ds] *)::-webkit-scrollbar-thumb {
779
- background-color: #b0b0b0 !important;
782
+ background-color: transparent !important;
780
783
  border-radius: 9999px !important;
781
784
  }
785
+ &:hover:where([data-ac-ds], [data-ac-ds] *)::-webkit-scrollbar-thumb, &:focus-within:where([data-ac-ds], [data-ac-ds] *)::-webkit-scrollbar-thumb {
786
+ background-color: #b0b0b0 !important;
787
+ }
782
788
  &:where([data-ac-ds], [data-ac-ds] *)::-webkit-scrollbar-track {
783
789
  background: transparent !important;
784
790
  }
@@ -32,7 +32,7 @@ export interface Props {
32
32
  isOfflineInstaller?: boolean;
33
33
  /** Replaces the built-in AppsCode list. Entries without `url` get one built from `baseUrl`; the self-host and org-type rules aren't applied. */
34
34
  apps?: AppSwitcherApp[];
35
- /** Leaves the current app out of the grid, as the old component did. */
35
+ /** Hides the current app; defaults to `true` to match the old component. */
36
36
  hideCurrent?: boolean;
37
37
  /** Accessible name of the grid button, and the panel heading. */
38
38
  label?: string;
@@ -1,35 +1,35 @@
1
1
  import { fixedFrame as e } from "./fixedFrame.js";
2
2
  import t from "./AcLogo.js";
3
3
  import n from "./AcNavbarItem.js";
4
- import { Fragment as r, Teleport as i, Transition as a, computed as o, createBlock as s, createCommentVNode as c, createElementBlock as l, createElementVNode as u, createVNode as d, defineComponent as f, mergeModels as p, nextTick as m, normalizeClass as h, normalizeStyle as g, onBeforeUnmount as ee, openBlock as _, ref as v, renderList as te, renderSlot as ne, resolveDynamicComponent as y, toDisplayString as b, unref as x, useId as re, useModel as ie, watch as ae, withCtx as oe } from "vue";
5
- import { ChartLine as se, Check as ce, Database as le, GraduationCap as ue, Grip as de, Receipt as fe, Server as pe, ServerCog as me, Telescope as he } from "@lucide/vue";
4
+ import { Fragment as r, Teleport as i, Transition as a, computed as o, createBlock as s, createCommentVNode as c, createElementBlock as l, createElementVNode as u, createVNode as d, defineComponent as f, mergeModels as p, nextTick as m, normalizeClass as h, normalizeStyle as ee, onBeforeUnmount as g, openBlock as _, ref as v, renderList as y, renderSlot as b, resolveDynamicComponent as te, toDisplayString as x, unref as S, useId as C, useModel as w, watch as T, withCtx as ne } from "vue";
5
+ import { Check as re, Grip as ie } from "@lucide/vue";
6
6
  //#region src/lib/components/AcAppSwitcher.vue?vue&type=script&setup=true&lang.ts
7
- var ge = {
7
+ var ae = {
8
8
  class: "inline-flex",
9
9
  "data-ac-ds": "",
10
10
  "data-testid": "ac-app-switcher"
11
- }, _e = {
11
+ }, oe = {
12
12
  role: "list",
13
13
  class: "grid grid-cols-3 gap-1"
14
- }, ve = [
14
+ }, se = [
15
15
  "href",
16
16
  "aria-current",
17
17
  "title",
18
18
  "onClick"
19
- ], S = ["src"], C = {
19
+ ], ce = ["src"], le = {
20
20
  key: 3,
21
21
  class: "text-lg font-semibold"
22
- }, w = { class: "w-full truncate text-xs font-medium text-heading" }, T = {
22
+ }, ue = { class: "w-full truncate text-xs font-medium text-heading" }, de = {
23
23
  key: 0,
24
24
  class: "sr-only"
25
- }, E = {
25
+ }, fe = {
26
26
  key: 1,
27
27
  class: "absolute top-1.5 right-1.5 inline-flex size-4 items-center justify-center rounded-full bg-primary text-white",
28
28
  "aria-hidden": "true"
29
- }, D = {
29
+ }, pe = {
30
30
  key: 0,
31
31
  class: "mt-2 border-t border-border pt-2"
32
- }, O = "id", k = 3, A = 6, j = /*@__PURE__*/ f({
32
+ }, E = "id", D = 3, O = 6, k = /*@__PURE__*/ f({
33
33
  __name: "AcAppSwitcher",
34
34
  props: /*@__PURE__*/ p({
35
35
  currentApp: { default: "platform" },
@@ -44,7 +44,7 @@ var ge = {
44
44
  apps: { default: void 0 },
45
45
  hideCurrent: {
46
46
  type: Boolean,
47
- default: !1
47
+ default: !0
48
48
  },
49
49
  label: { default: "AppsCode apps" },
50
50
  align: { default: "end" }
@@ -57,77 +57,71 @@ var ge = {
57
57
  }),
58
58
  emits: /*@__PURE__*/ p(["select"], ["update:open"]),
59
59
  setup(f, { emit: p }) {
60
- let j = f, M = ie(f, "open"), N = p, P = [
60
+ let k = f, A = w(f, "open"), j = p, M = [
61
61
  {
62
- name: O,
62
+ name: E,
63
63
  title: "Platform",
64
64
  port: "8080",
65
- subtitle: "Manage your platform & accounts"
65
+ subtitle: "Manage your platform & accounts",
66
+ iconUrl: "https://cdn.appscode.com/images/products/platform/platform.svg"
66
67
  },
67
68
  {
68
69
  name: "db",
69
70
  title: "KubeDB",
70
71
  port: "5996",
71
72
  subtitle: "Manage your databases",
72
- icon: le,
73
- color: "purple"
73
+ iconUrl: "https://cdn.appscode.com/images/products/kubedb/kubedb-512x512_1.svg"
74
74
  },
75
75
  {
76
76
  name: "grafana",
77
77
  title: "Grafana",
78
78
  port: "3005",
79
79
  subtitle: "Analyze your activities",
80
- icon: se,
81
- color: "yellow"
80
+ iconUrl: "https://cdn.appscode.com/images/products/others/logos/grafana.svg"
82
81
  },
83
82
  {
84
83
  name: "observe",
85
84
  title: "Observe",
86
85
  port: "5992",
87
86
  subtitle: "Observe your system",
88
- icon: he,
89
- color: "green"
87
+ iconUrl: "https://cdn.appscode.com/images/products/observe/logos/observe.png"
90
88
  },
91
89
  {
92
90
  name: "selfhost",
93
91
  title: "SelfHost",
94
92
  port: "5993",
95
93
  subtitle: "Host AppsCode on your own cluster",
96
- icon: me,
97
- color: "slate"
94
+ iconUrl: "https://cdn.appscode.com/images/products/selfhost/logos/selfhost.svg"
98
95
  },
99
96
  {
100
97
  name: "billing",
101
98
  title: "Billing",
102
99
  port: "5995",
103
100
  subtitle: "Manage your contracts, licenses & billings",
104
- icon: fe,
105
- color: "primary"
101
+ iconUrl: "https://cdn.appscode.com/images/products/billing/logos/billing.svg"
106
102
  },
107
103
  {
108
104
  name: "learn",
109
105
  title: "Learn",
110
106
  port: "5988",
111
107
  subtitle: "Be an Expert in Cloud Native technologies",
112
- icon: ue,
113
- color: "red"
108
+ iconUrl: "https://cdn.appscode.com/images/products/learn/logos/learn.svg"
114
109
  }
115
- ], F = {
110
+ ], N = {
116
111
  name: "console",
117
112
  title: "Console",
118
113
  port: "5990",
119
114
  subtitle: "Manage your kubernetes clusters",
120
- icon: pe,
121
- color: "blue"
122
- }, ye = [
115
+ iconUrl: "https://cdn.appscode.com/images/products/console/console_512x512.svg"
116
+ }, P = [
123
117
  "https://appscode.ninja",
124
118
  "https://appscode.com",
125
119
  "http://bb.test:8080"
126
- ], I = [
120
+ ], F = [
127
121
  "billing",
128
122
  "selfhost",
129
123
  "learn"
130
- ], be = {
124
+ ], I = {
131
125
  primary: "bg-primary/10 text-primary-strong ring-primary/25",
132
126
  blue: "bg-info/10 text-info-strong ring-info/25",
133
127
  green: "bg-success/10 text-success-strong ring-success/25",
@@ -135,15 +129,15 @@ var ge = {
135
129
  purple: "bg-pending/10 text-pending-strong ring-pending/25",
136
130
  red: "bg-danger/10 text-danger-strong ring-danger/25",
137
131
  slate: "bg-surface-sunken text-muted ring-border"
138
- }, L = re(), R = `${L}-panel`, z = `${L}-heading`, B = v(null), V = v(null), H = v({}), U = v(!0), W = o(() => j.currentApp === "platform" ? O : j.currentApp), xe = o(() => !ye.includes(j.baseUrl)), Se = o(() => {
139
- let e = [...P];
140
- return j.activeOrgType !== k && e.splice(1, 0, F), e.filter((e) => !xe.value || !I.includes(e.name) || e.name === "billing" && j.isOfflineInstaller && j.activeOrgType === A);
141
- }), G = o(() => (j.apps ?? Se.value).filter((e) => !j.hideCurrent || e.name !== W.value).map((e) => ({
132
+ }, L = C(), R = `${L}-panel`, z = `${L}-heading`, B = v(null), V = v(null), H = v({}), U = v(!0), W = o(() => k.currentApp === "platform" ? E : k.currentApp), me = o(() => !P.includes(k.baseUrl)), he = o(() => {
133
+ let e = [...M];
134
+ return k.activeOrgType !== D && e.splice(1, 0, N), e.filter((e) => !me.value || !F.includes(e.name) || e.name === "billing" && k.isOfflineInstaller && k.activeOrgType === O);
135
+ }), G = o(() => (k.apps ?? he.value).filter((e) => !k.hideCurrent || e.name !== W.value).map((e) => ({
142
136
  ...e,
143
- url: e.url ?? Ce(e)
137
+ url: e.url ?? ge(e)
144
138
  })));
145
- function Ce(e) {
146
- return j.baseUrl.includes("bb.test") ? `http://bb.test:${e.port}/${e.name}/` : j.baseUrl.includes("localhost") ? `http://localhost:${e.port}/${e.name}/` : `${j.baseUrl}/${e.name}/`;
139
+ function ge(e) {
140
+ return k.baseUrl.includes("bb.test") ? `http://bb.test:${e.port}/${e.name}/` : k.baseUrl.includes("localhost") ? `http://localhost:${e.port}/${e.name}/` : `${k.baseUrl}/${e.name}/`;
147
141
  }
148
142
  function K(e) {
149
143
  return e.name === W.value;
@@ -154,7 +148,7 @@ var ge = {
154
148
  function J() {
155
149
  return [...V.value?.querySelectorAll("[data-app-tile]") ?? []];
156
150
  }
157
- function we(e) {
151
+ function _e(e) {
158
152
  let t = e[0]?.offsetTop, n = e.filter((e) => e.offsetTop === t).length;
159
153
  return Math.max(n, 1);
160
154
  }
@@ -165,7 +159,7 @@ var ge = {
165
159
  function X() {
166
160
  let t = q();
167
161
  if (!t || !V.value) return;
168
- let n = t.getBoundingClientRect(), r = e(), { offsetWidth: i, offsetHeight: a } = V.value, o = r.bottom - n.bottom - 6 - 8, s = n.top - r.top - 6 - 8, c = o < a && s > o, l = (j.align === "end" ? n.right - i : n.left) - r.left;
162
+ let n = t.getBoundingClientRect(), r = e(), { offsetWidth: i, offsetHeight: a } = V.value, o = r.bottom - n.bottom - 6 - 8, s = n.top - r.top - 6 - 8, c = o < a && s > o, l = (k.align === "end" ? n.right - i : n.left) - r.left;
169
163
  U.value = !c, H.value = {
170
164
  [c ? "bottom" : "top"]: `${c ? r.bottom - n.top + 6 : n.bottom + 6 - r.top}px`,
171
165
  left: `${Math.max(8, Math.min(l, r.width - i - 8))}px`,
@@ -173,35 +167,35 @@ var ge = {
173
167
  };
174
168
  }
175
169
  function Z(e = !0) {
176
- M.value && (M.value = !1, e && q()?.focus());
170
+ A.value && (A.value = !1, e && q()?.focus());
177
171
  }
178
- function Te() {
179
- M.value ? Z() : M.value = !0;
172
+ function ve() {
173
+ A.value ? Z() : A.value = !0;
180
174
  }
181
- function Ee() {
182
- let e = [`gorg=${encodeURIComponent(j.activeOrganization)}`, "path=/"];
183
- j.rootDomain && e.push(`domain=${j.rootDomain}`), document.cookie = e.join("; ");
175
+ function ye() {
176
+ let e = [`gorg=${encodeURIComponent(k.activeOrganization)}`, "path=/"];
177
+ k.rootDomain && e.push(`domain=${k.rootDomain}`), document.cookie = e.join("; ");
184
178
  }
185
- function De(e) {
186
- e.name === "grafana" && Ee(), N("select", e);
179
+ function be(e) {
180
+ e.name === "grafana" && ye(), j("select", e);
187
181
  }
188
- function Oe(e) {
189
- e.key !== "ArrowDown" || M.value || (e.preventDefault(), M.value = !0);
182
+ function xe(e) {
183
+ e.key !== "ArrowDown" || A.value || (e.preventDefault(), A.value = !0);
190
184
  }
191
- function ke(e) {
192
- let t = J(), n = t.indexOf(document.activeElement), r = we(t), i = {
185
+ function Se(e) {
186
+ let t = J(), n = t.indexOf(document.activeElement), r = _e(t), i = {
193
187
  ArrowRight: 1,
194
188
  ArrowLeft: -1,
195
189
  ArrowDown: r,
196
190
  ArrowUp: -r
197
191
  };
198
- e.key in i && n >= 0 ? (e.preventDefault(), Y(n + i[e.key])) : e.key === "Home" || e.key === "End" ? (e.preventDefault(), Y(e.key === "Home" ? 0 : t.length - 1)) : e.key === "Escape" ? (e.preventDefault(), Z()) : e.key === "Tab" && Ae(e);
192
+ e.key in i && n >= 0 ? (e.preventDefault(), Y(n + i[e.key])) : e.key === "Home" || e.key === "End" ? (e.preventDefault(), Y(e.key === "Home" ? 0 : t.length - 1)) : e.key === "Escape" ? (e.preventDefault(), Z()) : e.key === "Tab" && Ce(e);
199
193
  }
200
- function Ae(e) {
194
+ function Ce(e) {
201
195
  let t = [...V.value?.querySelectorAll("a[href], button:not([disabled])") ?? []], n = t[0], r = t[t.length - 1];
202
196
  e.shiftKey && document.activeElement === n ? (e.preventDefault(), Z()) : !e.shiftKey && document.activeElement === r && Z();
203
197
  }
204
- function je(e) {
198
+ function we(e) {
205
199
  let t = e.target;
206
200
  q()?.contains(t) || V.value?.contains(t) || Z(!1);
207
201
  }
@@ -210,27 +204,27 @@ var ge = {
210
204
  }
211
205
  function $(e) {
212
206
  let t = e ? "addEventListener" : "removeEventListener";
213
- document[t]("pointerdown", je, !0), window[t]("scroll", Q, !0), window[t]("resize", Q);
207
+ document[t]("pointerdown", we, !0), window[t]("scroll", Q, !0), window[t]("resize", Q);
214
208
  }
215
- return ae(M, async (e) => {
209
+ return T(A, async (e) => {
216
210
  if ($(e), !e) return;
217
211
  await m(), X();
218
212
  let t = J(), n = G.value.findIndex(K);
219
213
  Y(n >= 0 && t[n] ? n : 0);
220
- }), ee(() => $(!1)), (e, o) => (_(), l("div", ge, [d(n, {
214
+ }), g(() => $(!1)), (e, o) => (_(), l("div", ae, [d(n, {
221
215
  ref_key: "trigger",
222
216
  ref: B,
223
217
  label: f.label,
224
- icon: x(de),
218
+ icon: S(ie),
225
219
  "icon-only": "",
226
220
  "aria-haspopup": "dialog",
227
- "aria-expanded": M.value,
228
- "aria-controls": M.value ? R : void 0,
229
- class: h(M.value && "bg-surface-sunken text-heading"),
221
+ "aria-expanded": A.value,
222
+ "aria-controls": A.value ? R : void 0,
223
+ class: h(A.value && "bg-surface-sunken text-heading"),
230
224
  "data-ac-ds": "",
231
225
  "data-testid": "ac-app-switcher-trigger",
232
- onClick: Te,
233
- onKeydown: Oe
226
+ onClick: ve,
227
+ onKeydown: xe
234
228
  }, null, 8, [
235
229
  "label",
236
230
  "icon",
@@ -243,7 +237,7 @@ var ge = {
243
237
  "leave-active-class": "transition duration-100 ease-in",
244
238
  "leave-to-class": "opacity-0"
245
239
  }, {
246
- default: oe(() => [M.value ? (_(), l("div", {
240
+ default: ne(() => [A.value ? (_(), l("div", {
247
241
  key: 0,
248
242
  id: R,
249
243
  ref_key: "panel",
@@ -251,16 +245,16 @@ var ge = {
251
245
  role: "dialog",
252
246
  "aria-labelledby": z,
253
247
  class: h(["ac-scrollbar fixed z-[90] flex w-[calc(340px*var(--ac-scale))] max-w-[calc(100vw-16px)] flex-col rounded-14 border border-border bg-surface p-2 shadow-lg", U.value ? "origin-top-right" : "origin-bottom-right"]),
254
- style: g(H.value),
248
+ style: ee(H.value),
255
249
  "data-ac-ds": "",
256
250
  "data-testid": "ac-app-switcher-panel",
257
- onKeydown: ke
251
+ onKeydown: Se
258
252
  }, [
259
253
  u("p", {
260
254
  id: z,
261
255
  class: "px-3 pt-2 pb-2 text-sm font-semibold tracking-[0.08em] text-muted uppercase"
262
- }, b(f.label), 1),
263
- u("ul", _e, [(_(!0), l(r, null, te(G.value, (e) => (_(), l("li", { key: e.name }, [u("a", {
256
+ }, x(f.label), 1),
257
+ u("ul", oe, [(_(!0), l(r, null, y(G.value, (e) => (_(), l("li", { key: e.name }, [u("a", {
264
258
  href: e.url,
265
259
  "data-app-tile": "",
266
260
  "aria-current": K(e) ? "page" : void 0,
@@ -268,37 +262,37 @@ var ge = {
268
262
  class: "group relative flex h-full flex-col items-center gap-2 rounded-8 px-1.5 pt-3 pb-2.5 text-center no-underline outline-none transition-colors duration-200 hover:bg-surface-sunken focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset aria-[current=page]:bg-accent",
269
263
  "data-ac-ds": "",
270
264
  "data-testid": "ac-app-switcher-app",
271
- onClick: (t) => De(e)
265
+ onClick: (t) => be(e)
272
266
  }, [
273
267
  u("span", {
274
- class: h(["relative inline-flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-10 ring-1 transition-transform duration-200 ring-inset motion-safe:group-hover:-translate-y-px", e.iconUrl || e.name === O && !e.icon ? "bg-surface ring-border" : be[e.color ?? "slate"]]),
268
+ class: h(["relative inline-flex size-10 shrink-0 items-center justify-center overflow-hidden rounded-10 ring-1 transition-transform duration-200 ring-inset motion-safe:group-hover:-translate-y-px", e.iconUrl || e.name === E && !e.icon ? "bg-surface ring-border" : I[e.color ?? "slate"]]),
275
269
  "aria-hidden": "true"
276
270
  }, [e.iconUrl ? (_(), l("img", {
277
271
  key: 0,
278
272
  src: e.iconUrl,
279
273
  alt: "",
280
274
  class: "size-7 object-contain"
281
- }, null, 8, S)) : e.icon ? (_(), s(y(e.icon), {
275
+ }, null, 8, ce)) : e.icon ? (_(), s(te(e.icon), {
282
276
  key: 1,
283
277
  class: "size-5"
284
- })) : e.name === O ? (_(), s(t, {
278
+ })) : e.name === E ? (_(), s(t, {
285
279
  key: 2,
286
280
  variant: "mark",
287
281
  size: 28,
288
282
  label: ""
289
- })) : (_(), l("span", C, b(e.title.charAt(0)), 1))], 2),
290
- u("span", w, b(e.title), 1),
291
- e.subtitle ? (_(), l("span", T, b(e.subtitle), 1)) : c("", !0),
292
- K(e) ? (_(), l("span", E, [d(x(ce), {
283
+ })) : (_(), l("span", le, x(e.title.charAt(0)), 1))], 2),
284
+ u("span", ue, x(e.title), 1),
285
+ e.subtitle ? (_(), l("span", de, x(e.subtitle), 1)) : c("", !0),
286
+ K(e) ? (_(), l("span", fe, [d(S(re), {
293
287
  class: "size-2.5",
294
288
  "stroke-width": 3
295
289
  })])) : c("", !0)
296
- ], 8, ve)]))), 128))]),
297
- e.$slots.footer ? (_(), l("div", D, [ne(e.$slots, "footer", { close: Z })])) : c("", !0)
290
+ ], 8, se)]))), 128))]),
291
+ e.$slots.footer ? (_(), l("div", pe, [b(e.$slots, "footer", { close: Z })])) : c("", !0)
298
292
  ], 38)) : c("", !0)]),
299
293
  _: 3
300
294
  })]))]));
301
295
  }
302
296
  });
303
297
  //#endregion
304
- export { j as default };
298
+ export { k as default };
@@ -615,15 +615,24 @@
615
615
  padding-inline: calc(var(--spacing) * 4);
616
616
  }
617
617
 
618
+ /* Thin scrollbar, hidden until the pointer is over the area or focus is inside it (cloud-ui's `custom-scrollbar`). */
618
619
  @utility ac-scrollbar {
619
620
  overflow: auto;
620
621
  scrollbar-width: thin;
621
- scrollbar-color: rgb(176 176 176 / 0.55) transparent;
622
+ scrollbar-color: transparent transparent;
623
+ &:hover, &:focus-within { scrollbar-color: rgb(176 176 176 / 0.55) transparent; }
622
624
  &::-webkit-scrollbar { width: 4px; height: 4px; }
623
- &::-webkit-scrollbar-thumb { background-color: #b0b0b0; border-radius: 9999px; }
625
+ &::-webkit-scrollbar-thumb { background-color: transparent; border-radius: 9999px; }
626
+ &:hover::-webkit-scrollbar-thumb, &:focus-within::-webkit-scrollbar-thumb { background-color: #b0b0b0; }
624
627
  &::-webkit-scrollbar-track { background: transparent; }
625
628
  }
626
629
 
630
+ /* With `ac-scrollbar`: keeps the thumb visible all the time (cloud-ui's `custom-scrollbar-true`). */
631
+ @utility ac-scrollbar-visible {
632
+ &.ac-scrollbar { scrollbar-color: rgb(176 176 176 / 0.55) transparent; }
633
+ &.ac-scrollbar::-webkit-scrollbar-thumb { background-color: #b0b0b0; }
634
+ }
635
+
627
636
  /* Keyframes for AcSkeleton's shimmer and AcProgress's indeterminate bar; kept here so the library ships no extra CSS file. */
628
637
  @keyframes ac-skeleton-shimmer {
629
638
  from { background-position: 150% 0; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ac-design/design-system",
3
- "version": "2.4.1",
3
+ "version": "2.4.3",
4
4
  "description": "AppsCode design system: Tailwind CSS v4 theme and Vue 3 components.",
5
5
  "repository": {
6
6
  "type": "git",