@ac-design/design-system 2.7.0 → 2.9.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 (37) hide show
  1. package/dist/lib/compat.css +70 -10
  2. package/dist/lib/components/AcAccordionItem.vue.d.ts +9 -0
  3. package/dist/lib/components/AcAccordionItem.vue_vue_type_script_setup_true_lang.js +64 -52
  4. package/dist/lib/components/AcCard.vue_vue_type_script_setup_true_lang.js +2 -2
  5. package/dist/lib/components/AcCheckBox.vue_vue_type_script_setup_true_lang.js +46 -43
  6. package/dist/lib/components/AcCheckRadio.vue_vue_type_script_setup_true_lang.js +3 -3
  7. package/dist/lib/components/AcColorInput.vue.d.ts +4 -0
  8. package/dist/lib/components/AcColorInput.vue_vue_type_script_setup_true_lang.js +12 -2
  9. package/dist/lib/components/AcDatePicker.vue.d.ts +3 -0
  10. package/dist/lib/components/AcDatePicker.vue_vue_type_script_setup_true_lang.js +12 -2
  11. package/dist/lib/components/AcHeader.vue_vue_type_script_setup_true_lang.js +1 -1
  12. package/dist/lib/components/AcInput.vue.d.ts +2 -0
  13. package/dist/lib/components/AcInput.vue_vue_type_script_setup_true_lang.js +18 -8
  14. package/dist/lib/components/AcModal.vue_vue_type_script_setup_true_lang.js +12 -8
  15. package/dist/lib/components/AcMonthPicker.vue.d.ts +3 -0
  16. package/dist/lib/components/AcMonthPicker.vue_vue_type_script_setup_true_lang.js +12 -2
  17. package/dist/lib/components/AcNumberInput.vue.d.ts +3 -0
  18. package/dist/lib/components/AcNumberInput.vue_vue_type_script_setup_true_lang.js +11 -1
  19. package/dist/lib/components/AcSectionContent.vue.d.ts +1 -1
  20. package/dist/lib/components/AcSelect.vue.d.ts +3 -0
  21. package/dist/lib/components/AcSelect.vue_vue_type_script_setup_true_lang.js +241 -218
  22. package/dist/lib/components/AcSidePanel.vue_vue_type_script_setup_true_lang.js +11 -7
  23. package/dist/lib/components/AcSideTabs.vue.d.ts +1 -1
  24. package/dist/lib/components/AcSidebar.vue.d.ts +1 -1
  25. package/dist/lib/components/AcSidebar.vue_vue_type_script_setup_true_lang.js +1 -1
  26. package/dist/lib/components/AcSteps.vue.d.ts +3 -0
  27. package/dist/lib/components/AcSteps.vue_vue_type_script_setup_true_lang.js +33 -29
  28. package/dist/lib/components/AcSwitch.vue_vue_type_script_setup_true_lang.js +1 -1
  29. package/dist/lib/components/AcTable.vue_vue_type_script_setup_true_lang.js +83 -72
  30. package/dist/lib/components/AcTextarea.vue.d.ts +3 -0
  31. package/dist/lib/components/AcTextarea.vue_vue_type_script_setup_true_lang.js +11 -1
  32. package/dist/lib/components/AcTimePicker.vue.d.ts +3 -0
  33. package/dist/lib/components/AcTimePicker.vue_vue_type_script_setup_true_lang.js +12 -2
  34. package/dist/lib/components/AcToaster.vue.d.ts +3 -0
  35. package/dist/lib/components/AcToaster.vue_vue_type_script_setup_true_lang.js +71 -68
  36. package/dist/lib/theme.css +36 -0
  37. package/package.json +1 -1
@@ -42,6 +42,16 @@ var le = ["for"], ue = { key: 0 }, de = {
42
42
  __name: "AcTimePicker",
43
43
  props: /*@__PURE__*/ d({
44
44
  label: { default: "" },
45
+ labelClass: {
46
+ type: [
47
+ Boolean,
48
+ null,
49
+ String,
50
+ Object,
51
+ Array
52
+ ],
53
+ default: void 0
54
+ },
45
55
  placeholder: { default: "Choose time" },
46
56
  hourCycle: { default: 24 },
47
57
  minuteStep: { default: 1 },
@@ -391,13 +401,13 @@ var le = ["for"], ue = { key: 0 }, de = {
391
401
  key: 0,
392
402
  id: k,
393
403
  for: u.inline ? void 0 : `${b(E)}-trigger`,
394
- class: "mb-2 flex items-center gap-1 text-base font-medium text-heading"
404
+ class: m(["mb-2 flex items-center gap-1 text-base font-medium text-heading", u.labelClass])
395
405
  }, [
396
406
  v(e.$slots, "label-icon"),
397
407
  u.label ? (h(), s("span", ue, y(u.label), 1)) : o("", !0),
398
408
  v(e.$slots, "label-extra"),
399
409
  u.required ? (h(), s("span", de, "*")) : o("", !0)
400
- ], 8, le)) : o("", !0),
410
+ ], 10, le)) : o("", !0),
401
411
  u.hint ? (h(), s("p", {
402
412
  key: 1,
403
413
  id: M,
@@ -1,6 +1,8 @@
1
1
  export interface Props {
2
2
  /** Corner of the screen. `top-right` sits 80px from the top, under an app navbar, as cloud-ui. On phones (under 640px) toasts span the width at the same edge. */
3
3
  position?: "top-right" | "top-center" | "bottom-right" | "bottom-center";
4
+ /** Distance from the top (or bottom) edge, e.g. `"136px"` to clear a page header's buttons. Defaults to 80px at the top and 20px at the bottom; the `--ac-toaster-offset` CSS variable sets it app-wide. */
5
+ offset?: string;
4
6
  /** How many toasts show at once (phones show at most 3). Newer ones queue behind and their timers wait until they're shown. */
5
7
  max?: number;
6
8
  /** Shows the shrinking 2px time bar on every toast. A toast's own `progress` option wins. */
@@ -12,6 +14,7 @@ declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {},
12
14
  label: string;
13
15
  progress: boolean;
14
16
  max: number;
17
+ offset: string;
15
18
  position: "top-right" | "top-center" | "bottom-right" | "bottom-center";
16
19
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
17
20
  declare const _default: typeof __VLS_export;
@@ -1,6 +1,6 @@
1
1
  import e from "./AcButton.js";
2
2
  import { useToast as t } from "../composables/useToast.js";
3
- import { Fragment as n, Teleport as r, TransitionGroup as i, computed as a, createBlock as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, createVNode as u, defineComponent as d, nextTick as f, normalizeClass as p, onBeforeUnmount as m, openBlock as h, ref as g, renderList as _, resolveDynamicComponent as v, toDisplayString as y, unref as b, watch as x, withCtx as S } from "vue";
3
+ import { Fragment as n, Teleport as r, TransitionGroup as i, computed as a, createBlock as o, createCommentVNode as s, createElementBlock as c, createElementVNode as l, createVNode as u, defineComponent as d, nextTick as f, normalizeClass as p, normalizeStyle as m, onBeforeUnmount as h, openBlock as g, ref as _, renderList as v, resolveDynamicComponent as y, toDisplayString as b, unref as x, watch as S, withCtx as ee } from "vue";
4
4
  import { CircleCheck as C, CircleX as w, Info as T, TriangleAlert as E, X as D } from "@lucide/vue";
5
5
  //#region src/lib/components/AcToaster.vue?vue&type=script&setup=true&lang.ts
6
6
  var O = ["aria-label"], k = {
@@ -8,7 +8,7 @@ var O = ["aria-label"], k = {
8
8
  role: "status",
9
9
  "aria-live": "polite",
10
10
  "aria-atomic": "true"
11
- }, ee = {
11
+ }, A = {
12
12
  class: "sr-only",
13
13
  role: "alert",
14
14
  "aria-live": "assertive",
@@ -16,10 +16,11 @@ var O = ["aria-label"], k = {
16
16
  }, te = ["data-tone"], ne = { class: "flex min-w-0 flex-1 flex-col gap-0.5" }, re = { class: "text-base leading-[1.35] font-semibold break-words text-heading" }, ie = {
17
17
  key: 0,
18
18
  class: "text-[13px] leading-[1.45] break-words text-muted"
19
- }, ae = ["aria-label", "onClick"], A = ["data-toast-bar"], j = 3, M = "transition-[opacity,translate] duration-300 ease-[cubic-bezier(0.21,1.02,0.73,1)] motion-reduce:duration-150", N = /*@__PURE__*/ d({
19
+ }, j = ["aria-label", "onClick"], M = ["data-toast-bar"], N = 3, P = "transition-[opacity,translate] duration-300 ease-[cubic-bezier(0.21,1.02,0.73,1)] motion-reduce:duration-150", F = /*@__PURE__*/ d({
20
20
  __name: "AcToaster",
21
21
  props: {
22
22
  position: { default: "top-right" },
23
+ offset: { default: "" },
23
24
  max: { default: 5 },
24
25
  progress: {
25
26
  type: Boolean,
@@ -28,7 +29,7 @@ var O = ["aria-label"], k = {
28
29
  label: { default: "Notifications" }
29
30
  },
30
31
  setup(d) {
31
- let N = d, P = {
32
+ let F = d, I = {
32
33
  neutral: {
33
34
  iconClass: "",
34
35
  box: "border-border bg-surface",
@@ -58,137 +59,139 @@ var O = ["aria-label"], k = {
58
59
  box: "border-border bg-surface",
59
60
  bar: "bg-info"
60
61
  }
61
- }, F = {
62
- "top-right": "top-20 sm:right-5",
63
- "top-center": "top-20 sm:left-1/2 sm:-translate-x-1/2",
64
- "bottom-right": "bottom-5 sm:right-5",
65
- "bottom-center": "bottom-5 sm:left-1/2 sm:-translate-x-1/2"
66
- }, { toasts: I, dismiss: L } = t(), R = g(null), z = g(""), B = g(""), V = /* @__PURE__ */ new Map(), H = !1, U = /* @__PURE__ */ new Set(), W = a(() => N.position.startsWith("top")), G = a(() => I.value.slice(-N.max)), K = a(() => N.position.endsWith("right") ? "opacity-0 motion-safe:translate-x-[120%]" : W.value ? "opacity-0 motion-safe:-translate-y-2" : "opacity-0 motion-safe:translate-y-2");
67
- function q(e) {
68
- return e.duration > 0 && (e.progress ?? N.progress);
69
- }
70
- function J(e) {
71
- let t = V.get(e);
72
- t && !H && (t.started = Date.now(), t.handle = setTimeout(() => L(e), t.remaining), oe(e));
62
+ }, L = {
63
+ "top-right": "top-[var(--ac-toaster-offset,80px)] sm:right-5",
64
+ "top-center": "top-[var(--ac-toaster-offset,80px)] sm:left-1/2 sm:-translate-x-1/2",
65
+ "bottom-right": "bottom-[var(--ac-toaster-offset,20px)] sm:right-5",
66
+ "bottom-center": "bottom-[var(--ac-toaster-offset,20px)] sm:left-1/2 sm:-translate-x-1/2"
67
+ }, { toasts: R, dismiss: z } = t(), B = _(null), V = _(""), H = _(""), U = /* @__PURE__ */ new Map(), W = !1, G = /* @__PURE__ */ new Set(), K = a(() => F.position.startsWith("top")), q = a(() => R.value.slice(-F.max)), J = a(() => F.position.endsWith("right") ? "opacity-0 motion-safe:translate-x-[120%]" : K.value ? "opacity-0 motion-safe:-translate-y-2" : "opacity-0 motion-safe:translate-y-2");
68
+ function ae(e) {
69
+ return e.duration > 0 && (e.progress ?? F.progress);
73
70
  }
74
71
  function Y(e) {
75
- let t = V.get(e);
72
+ let t = U.get(e);
73
+ t && !W && (t.started = Date.now(), t.handle = setTimeout(() => z(e), t.remaining), oe(e));
74
+ }
75
+ function X(e) {
76
+ let t = U.get(e);
76
77
  t?.handle && (clearTimeout(t.handle), t.handle = void 0, t.remaining -= Date.now() - t.started, t.bar?.pause());
77
78
  }
78
79
  async function oe(e) {
79
80
  await f();
80
- let t = V.get(e);
81
+ let t = U.get(e);
81
82
  if (t?.handle) {
82
83
  if (t.bar) return t.bar.play();
83
- t.bar = (R.value?.querySelector(`[data-toast-bar="${CSS.escape(e)}"]`))?.animate([{ transform: "scaleX(1)" }, { transform: "scaleX(0)" }], {
84
+ t.bar = (B.value?.querySelector(`[data-toast-bar="${CSS.escape(e)}"]`))?.animate([{ transform: "scaleX(1)" }, { transform: "scaleX(0)" }], {
84
85
  duration: t.duration,
85
86
  fill: "forwards"
86
87
  });
87
88
  }
88
89
  }
89
- function X(e, t = !1) {
90
- Y(e), t && V.get(e)?.bar?.cancel(), V.delete(e);
91
- }
92
- function Z() {
93
- H = !0, V.forEach((e, t) => Y(t));
90
+ function Z(e, t = !1) {
91
+ X(e), t && U.get(e)?.bar?.cancel(), U.delete(e);
94
92
  }
95
93
  function Q() {
96
- H = !1, V.forEach((e, t) => J(t));
94
+ W = !0, U.forEach((e, t) => X(t));
97
95
  }
98
- function $(e) {
99
- e.currentTarget.contains(e.relatedTarget) || Q();
96
+ function $() {
97
+ W = !1, U.forEach((e, t) => Y(t));
100
98
  }
101
99
  function se(e) {
100
+ e.currentTarget.contains(e.relatedTarget) || $();
101
+ }
102
+ function ce(e) {
102
103
  let t = new Set(e.map((e) => e.id));
103
- for (let [e] of V) t.has(e) || X(e);
104
- for (let t of e) V.get(t.id)?.version !== t.version && (X(t.id, !0), t.duration > 0 && (V.set(t.id, {
104
+ for (let [e] of U) t.has(e) || Z(e);
105
+ for (let t of e) U.get(t.id)?.version !== t.version && (Z(t.id, !0), t.duration > 0 && (U.set(t.id, {
105
106
  version: t.version,
106
107
  duration: t.duration,
107
108
  remaining: t.duration,
108
109
  started: 0
109
- }), J(t.id)));
110
+ }), Y(t.id)));
110
111
  }
111
- async function ce(e) {
112
- let t = e.filter((e) => !U.has(`${e.id}:${e.version}`));
113
- if (U = new Set(e.map((e) => `${e.id}:${e.version}`)), !t.length) return;
112
+ async function le(e) {
113
+ let t = e.filter((e) => !G.has(`${e.id}:${e.version}`));
114
+ if (G = new Set(e.map((e) => `${e.id}:${e.version}`)), !t.length) return;
114
115
  let n = (e) => /[.!?…]$/.test(e.trim()) ? e.trim() : `${e.trim()}.`, r = (e) => e.flatMap((e) => [e.title, e.description ?? ""].filter(Boolean).map(n)).join(" "), i = t.filter((e) => e.tone === "error"), a = t.filter((e) => e.tone !== "error");
115
- z.value = "", B.value = "", await f(), a.length && (z.value = r(a)), i.length && (B.value = r(i));
116
+ V.value = "", H.value = "", await f(), a.length && (V.value = r(a)), i.length && (H.value = r(i));
116
117
  }
117
- function le(e) {
118
- e.action?.onClick(), L(e.id);
118
+ function ue(e) {
119
+ e.action?.onClick(), z(e.id);
119
120
  }
120
- return x(G, (e) => {
121
- se(e), ce(e);
122
- }, { immediate: !0 }), m(() => V.forEach((e) => {
121
+ return S(q, (e) => {
122
+ ce(e), le(e);
123
+ }, { immediate: !0 }), h(() => U.forEach((e) => {
123
124
  clearTimeout(e.handle), e.bar?.cancel();
124
- })), (t, a) => (h(), o(r, { to: "body" }, [l("section", {
125
+ })), (t, a) => (g(), o(r, { to: "body" }, [l("section", {
125
126
  ref_key: "root",
126
- ref: R,
127
+ ref: B,
127
128
  "aria-label": d.label,
128
129
  "data-ac-ds": "",
129
130
  "data-testid": "ac-toaster"
130
131
  }, [
131
- l("div", k, y(z.value), 1),
132
- l("div", ee, y(B.value), 1),
132
+ l("div", k, b(V.value), 1),
133
+ l("div", A, b(H.value), 1),
133
134
  u(i, {
134
135
  tag: "ol",
135
- class: p(["pointer-events-none fixed inset-x-5 z-[100] flex flex-col gap-3 sm:inset-x-auto sm:w-[384px]", F[d.position]]),
136
- "enter-active-class": M,
137
- "enter-from-class": K.value,
138
- "leave-active-class": M,
139
- "leave-to-class": K.value,
136
+ class: p(["pointer-events-none fixed inset-x-5 z-[100] flex flex-col gap-3 sm:inset-x-auto sm:w-[384px]", L[d.position]]),
137
+ style: m(d.offset ? { "--ac-toaster-offset": d.offset } : void 0),
138
+ "enter-active-class": P,
139
+ "enter-from-class": J.value,
140
+ "leave-active-class": P,
141
+ "leave-to-class": J.value,
140
142
  "move-class": "motion-safe:transition-transform motion-safe:duration-200",
141
- onPointerenter: Z,
142
- onPointerleave: Q,
143
- onFocusin: Z,
144
- onFocusout: $
143
+ onPointerenter: Q,
144
+ onPointerleave: $,
145
+ onFocusin: Q,
146
+ onFocusout: se
145
147
  }, {
146
- default: S(() => [(h(!0), c(n, null, _(G.value, (t, n) => (h(), c("li", {
148
+ default: ee(() => [(g(!0), c(n, null, v(q.value, (t, n) => (g(), c("li", {
147
149
  key: t.id,
148
150
  class: p(["pointer-events-auto relative flex items-start gap-3 overflow-hidden rounded-10 border py-3.5 pl-4 shadow-md", [
149
- P[t.tone].box,
151
+ I[t.tone].box,
150
152
  t.dismissible ? "pr-10" : "pr-4",
151
- G.value.length - 1 - n >= j && "max-sm:hidden"
153
+ q.value.length - 1 - n >= N && "max-sm:hidden"
152
154
  ]]),
153
155
  "data-ac-ds": "",
154
156
  "data-testid": "ac-toast",
155
157
  "data-tone": t.tone
156
158
  }, [
157
- P[t.tone].icon ? (h(), o(v(P[t.tone].icon), {
159
+ I[t.tone].icon ? (g(), o(y(I[t.tone].icon), {
158
160
  key: 0,
159
- class: p(["mt-px size-5 shrink-0", P[t.tone].iconClass]),
161
+ class: p(["mt-px size-5 shrink-0", I[t.tone].iconClass]),
160
162
  "stroke-width": 2.25,
161
163
  "aria-hidden": "true"
162
164
  }, null, 8, ["class"])) : s("", !0),
163
- l("div", ne, [l("p", re, y(t.title), 1), t.description ? (h(), c("p", ie, y(t.description), 1)) : s("", !0)]),
164
- t.action ? (h(), o(e, {
165
+ l("div", ne, [l("p", re, b(t.title), 1), t.description ? (g(), c("p", ie, b(t.description), 1)) : s("", !0)]),
166
+ t.action ? (g(), o(e, {
165
167
  key: 1,
166
168
  title: t.action.label,
167
169
  size: "small",
168
170
  color: "white",
169
171
  class: "-my-1 shrink-0",
170
- onClick: (e) => le(t)
172
+ onClick: (e) => ue(t)
171
173
  }, null, 8, ["title", "onClick"])) : s("", !0),
172
- t.dismissible ? (h(), c("button", {
174
+ t.dismissible ? (g(), c("button", {
173
175
  key: 2,
174
176
  type: "button",
175
177
  class: "absolute top-2 right-2 inline-flex size-6 cursor-pointer items-center justify-center rounded-6 text-muted transition-colors hover:bg-surface-sunken hover:text-heading focus-visible:ring-2 focus-visible:ring-ring focus-visible:outline-none",
176
178
  "aria-label": `Dismiss: ${t.title}`,
177
- onClick: (e) => b(L)(t.id)
178
- }, [u(b(D), {
179
+ onClick: (e) => x(z)(t.id)
180
+ }, [u(x(D), {
179
181
  class: "size-3.5",
180
182
  "aria-hidden": "true"
181
- })], 8, ae)) : s("", !0),
182
- q(t) ? (h(), c("span", {
183
+ })], 8, j)) : s("", !0),
184
+ ae(t) ? (g(), c("span", {
183
185
  key: 3,
184
186
  "data-toast-bar": t.id,
185
- class: p(["absolute bottom-0 left-0 h-0.5 w-full origin-left opacity-70 motion-reduce:hidden", P[t.tone].bar]),
187
+ class: p(["absolute bottom-0 left-0 h-0.5 w-full origin-left opacity-70 motion-reduce:hidden", I[t.tone].bar]),
186
188
  "aria-hidden": "true"
187
- }, null, 10, A)) : s("", !0)
189
+ }, null, 10, M)) : s("", !0)
188
190
  ], 10, te))), 128))]),
189
191
  _: 1
190
192
  }, 8, [
191
193
  "class",
194
+ "style",
192
195
  "enter-from-class",
193
196
  "leave-to-class"
194
197
  ])
@@ -196,4 +199,4 @@ var O = ["aria-label"], k = {
196
199
  }
197
200
  });
198
201
  //#endregion
199
- export { N as default };
202
+ export { F as default };
@@ -314,6 +314,8 @@
314
314
  --radius-14: calc(14px * var(--ac-scale));
315
315
  --radius-16: calc(16px * var(--ac-scale));
316
316
  --radius-50: calc(50px * var(--ac-scale));
317
+ /* a band inside a 14px card (a header, footer or steps strip): the card's corner less its 1px border */
318
+ --radius-14-inner: calc(var(--radius-14) - 1px);
317
319
 
318
320
  /* elevation: cloud-ui's neutral scale. Cards rest on a border, not a shadow. */
319
321
  --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);
@@ -598,6 +600,17 @@
598
600
  color: var(--color-heading);
599
601
  }
600
602
 
603
+ /* Author HTML (v-html notes, descriptions, labels): links in primary, medium and underlined, so they never rely on colour alone. */
604
+ @utility ac-rich-text {
605
+ & a {
606
+ font-weight: 500;
607
+ color: var(--color-primary);
608
+ text-decoration-line: underline;
609
+ text-decoration-color: var(--color-primary);
610
+ text-underline-offset: 2px;
611
+ }
612
+ }
613
+
601
614
  /* The standard focus treatment for form controls: a solid primary border plus a 2px primary/20 halo. */
602
615
  @utility focus-ring {
603
616
  outline: none;
@@ -633,6 +646,29 @@
633
646
  &.ac-scrollbar::-webkit-scrollbar-thumb { background-color: #b0b0b0; }
634
647
  }
635
648
 
649
+ /* Composite classes: one name for a set of utilities the components and apps keep repeating. They work with
650
+ variants like any utility (`hover:ac-transition-colors`, `max-sm:…`). */
651
+
652
+ /* A small uppercase label over a group: menu sections, panel headings, sidebar groups (11px, 600, 0.08em). */
653
+ @utility ac-overline {
654
+ @apply text-sm font-semibold tracking-[0.08em] text-muted uppercase;
655
+ }
656
+
657
+ /* Hover and selection colour changes at the standard 200ms, and none when the user asks for less motion. */
658
+ @utility ac-transition-colors {
659
+ @apply transition-colors duration-200 motion-reduce:transition-none;
660
+ }
661
+
662
+ /* Turning and sliding (a chevron opening, an arrow nudging) at 200ms, and none with reduced motion. */
663
+ @utility ac-transition-transform {
664
+ @apply transition-transform duration-200 motion-reduce:transition-none;
665
+ }
666
+
667
+ /* Keyboard focus drawn inside the element: full-width rows and headers, where an outer ring would be clipped. */
668
+ @utility ac-focus-inset {
669
+ @apply focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset focus-visible:outline-none;
670
+ }
671
+
636
672
  /* Keyframes for AcSkeleton's shimmer and AcProgress's indeterminate bar; kept here so the library ships no extra CSS file. */
637
673
  @keyframes ac-skeleton-shimmer {
638
674
  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.7.0",
3
+ "version": "2.9.0",
4
4
  "description": "AppsCode design system: Tailwind CSS v4 theme and Vue 3 components.",
5
5
  "repository": {
6
6
  "type": "git",