@nexxtmove/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/dist/index.d.ts CHANGED
@@ -100,7 +100,11 @@ declare interface NexxtIconProps {
100
100
  type?: IconType;
101
101
  }
102
102
 
103
- export declare const NexxtProgressBar: DefineComponent<NexxtProgressBarProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<NexxtProgressBarProps> & Readonly<{}>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
103
+ export declare const NexxtProgressBar: DefineComponent<NexxtProgressBarProps, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
104
+ "update:currentStep": (...args: any[]) => void;
105
+ }, string, PublicProps, Readonly<NexxtProgressBarProps> & Readonly<{
106
+ "onUpdate:currentStep"?: ((...args: any[]) => any) | undefined;
107
+ }>, {}, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
104
108
 
105
109
  declare interface NexxtProgressBarProps {
106
110
  steps: number;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { defineComponent as v, ref as T, computed as u, watch as N, createBlock as g, openBlock as a, TransitionGroup as S, withCtx as d, createElementBlock as s, Fragment as p, renderList as B, createVNode as f, Transition as w, toDisplayString as m, normalizeClass as n, createCommentVNode as o, renderSlot as y, createElementVNode as r, createTextVNode as j, watchEffect as A, normalizeStyle as C, createSlots as H } from "vue";
2
- const P = /* @__PURE__ */ v({
1
+ import { defineComponent as h, ref as j, computed as v, watch as C, createBlock as x, openBlock as s, TransitionGroup as A, withCtx as f, createElementBlock as l, Fragment as S, renderList as T, createVNode as m, Transition as N, toDisplayString as b, normalizeClass as r, createCommentVNode as u, renderSlot as g, createElementVNode as o, createTextVNode as H, watchEffect as M, normalizeStyle as P, withKeys as w, withModifiers as V, createSlots as E } from "vue";
2
+ const I = /* @__PURE__ */ h({
3
3
  __name: "AnimatedNumber",
4
4
  props: {
5
5
  value: {},
@@ -7,39 +7,39 @@ const P = /* @__PURE__ */ v({
7
7
  easing: { default: "ease-out" }
8
8
  },
9
9
  setup(e) {
10
- const t = T("up"), l = u(() => String(e.value).split("")), i = u(() => `duration-${e.duration}`);
11
- return N(
10
+ const t = j("up"), i = v(() => String(e.value).split("")), a = v(() => `duration-${e.duration}`);
11
+ return C(
12
12
  () => e.value,
13
- (c, x) => {
14
- t.value = c > x ? "up" : "down";
13
+ (c, y) => {
14
+ t.value = c > y ? "up" : "down";
15
15
  }
16
- ), (c, x) => (a(), g(S, {
16
+ ), (c, y) => (s(), x(A, {
17
17
  tag: "div",
18
18
  class: "relative flex shrink-0 items-center tabular-nums",
19
19
  "aria-label": e.value,
20
- "enter-active-class": `transition-all ${i.value} ${e.easing}`,
21
- "leave-active-class": `absolute transition-all ${i.value} ${e.easing}`,
20
+ "enter-active-class": `transition-all ${a.value} ${e.easing}`,
21
+ "leave-active-class": `absolute transition-all ${a.value} ${e.easing}`,
22
22
  "enter-from-class": t.value === "up" ? "translate-y-full opacity-0" : "-translate-y-full opacity-0",
23
23
  "leave-to-class": t.value === "up" ? "-translate-y-full opacity-0" : "translate-y-full opacity-0",
24
24
  "move-class": "transition-all duration-500 ease-in-out"
25
25
  }, {
26
- default: d(() => [
27
- (a(!0), s(p, null, B(l.value, (b, h) => (a(), s("div", {
28
- key: h,
26
+ default: f(() => [
27
+ (s(!0), l(S, null, T(i.value, (d, $) => (s(), l("div", {
28
+ key: $,
29
29
  class: "relative inline-flex h-[1.5em] w-[1ch] items-center justify-center overflow-hidden",
30
30
  "aria-hidden": "true"
31
31
  }, [
32
- f(w, {
33
- "enter-active-class": `transition-transform ${i.value} ${e.easing}`,
34
- "leave-active-class": `absolute inset-0 transition-transform ${i.value} ${e.easing}`,
32
+ m(N, {
33
+ "enter-active-class": `transition-transform ${a.value} ${e.easing}`,
34
+ "leave-active-class": `absolute inset-0 transition-transform ${a.value} ${e.easing}`,
35
35
  "enter-from-class": t.value === "up" ? "translate-y-full" : "-translate-y-full",
36
36
  "leave-to-class": t.value === "up" ? "-translate-y-full" : "translate-y-full"
37
37
  }, {
38
- default: d(() => [
39
- (a(), s("span", {
40
- key: b,
38
+ default: f(() => [
39
+ (s(), l("span", {
40
+ key: d,
41
41
  class: "flex h-full w-full items-center justify-center"
42
- }, m(b), 1))
42
+ }, b(d), 1))
43
43
  ]),
44
44
  _: 2
45
45
  }, 1032, ["enter-active-class", "leave-active-class", "enter-from-class", "leave-to-class"])
@@ -48,7 +48,7 @@ const P = /* @__PURE__ */ v({
48
48
  _: 1
49
49
  }, 8, ["aria-label", "enter-active-class", "leave-active-class", "enter-from-class", "leave-to-class"]));
50
50
  }
51
- }), k = /* @__PURE__ */ v({
51
+ }), B = /* @__PURE__ */ h({
52
52
  name: "NexxtIcon",
53
53
  __name: "Icon",
54
54
  props: {
@@ -56,14 +56,14 @@ const P = /* @__PURE__ */ v({
56
56
  type: { default: "light" }
57
57
  },
58
58
  setup(e) {
59
- return (t, l) => (a(), s("i", {
60
- class: n([`fa-${e.type}`, `fa-${e.name}`, "items-center", "justify-center"])
59
+ return (t, i) => (s(), l("i", {
60
+ class: r([`fa-${e.type}`, `fa-${e.name}`, "items-center", "justify-center"])
61
61
  }, null, 2));
62
62
  }
63
- }), V = ["type", "disabled", "data-variant"], M = {
63
+ }), K = ["type", "disabled", "data-variant"], L = {
64
64
  key: 0,
65
- class: /* @__PURE__ */ n(["absolute inset-0 flex items-center justify-center rounded-lg"])
66
- }, E = /* @__PURE__ */ v({
65
+ class: /* @__PURE__ */ r(["absolute inset-0 flex items-center justify-center rounded-lg"])
66
+ }, z = /* @__PURE__ */ h({
67
67
  name: "NexxtButton",
68
68
  __name: "Button",
69
69
  props: {
@@ -75,10 +75,10 @@ const P = /* @__PURE__ */ v({
75
75
  buttonType: { default: "button" }
76
76
  },
77
77
  setup(e) {
78
- return (t, l) => (a(), s("button", {
78
+ return (t, i) => (s(), l("button", {
79
79
  type: e.buttonType,
80
80
  disabled: e.disabled,
81
- class: n([
81
+ class: r([
82
82
  "button relative flex h-10 cursor-pointer items-center justify-center overflow-hidden rounded-lg transition-colors duration-200 focus-visible:outline-3 disabled:cursor-not-allowed",
83
83
  `button-${e.variant}`,
84
84
  t.$slots.default ?? "w-10",
@@ -87,23 +87,23 @@ const P = /* @__PURE__ */ v({
87
87
  ]),
88
88
  "data-variant": e.variant
89
89
  }, [
90
- e.icon ? (a(), g(k, {
90
+ e.icon ? (s(), x(B, {
91
91
  key: 0,
92
92
  name: e.icon,
93
- class: n(["transition-all duration-200", { "order-last": e.iconRight, "opacity-0": e.loading }])
94
- }, null, 8, ["name", "class"])) : o("", !0),
95
- t.$slots.default ? (a(), s("span", {
93
+ class: r(["transition-all duration-200", { "order-last": e.iconRight, "opacity-0": e.loading }])
94
+ }, null, 8, ["name", "class"])) : u("", !0),
95
+ t.$slots.default ? (s(), l("span", {
96
96
  key: 1,
97
- class: n([
97
+ class: r([
98
98
  "inline-block transition-all duration-200",
99
99
  { "opacity-0": e.loading },
100
- e.variant === "link" ? "underline underline-offset-1" : "",
100
+ e.variant === "link" ? "body-link underline-offset-1" : "body-normal",
101
101
  e.variant === "link" && !e.loading && !e.disabled ? "hover:underline-offset-2" : ""
102
102
  ])
103
103
  }, [
104
- y(t.$slots, "default")
105
- ], 2)) : o("", !0),
106
- f(w, {
104
+ g(t.$slots, "default")
105
+ ], 2)) : u("", !0),
106
+ m(N, {
107
107
  "enter-active-class": "transition-opacity duration-200",
108
108
  "enter-from-class": "opacity-0",
109
109
  "enter-to-class": "opacity-100",
@@ -111,23 +111,23 @@ const P = /* @__PURE__ */ v({
111
111
  "leave-from-class": "opacity-100",
112
112
  "leave-to-class": "opacity-0"
113
113
  }, {
114
- default: d(() => [
115
- e.loading ? (a(), s("div", M, [
116
- f(k, {
114
+ default: f(() => [
115
+ e.loading ? (s(), l("div", L, [
116
+ m(B, {
117
117
  name: "spinner-third",
118
118
  type: "light",
119
119
  class: "fa-spin absolute text-sm"
120
120
  })
121
- ])) : o("", !0)
121
+ ])) : u("", !0)
122
122
  ]),
123
123
  _: 1
124
124
  })
125
- ], 10, V));
125
+ ], 10, K));
126
126
  }
127
- }), I = { class: "flex max-w-full items-center justify-start gap-4" }, L = { class: "block truncate text-lg font-semibold text-sapphire-500" }, z = {
127
+ }), D = { class: "flex max-w-full items-center justify-start gap-4" }, F = { class: "block truncate heading-4 text-sapphire-500" }, G = {
128
128
  key: 0,
129
129
  class: "col-span-1 col-start-2 flex justify-center"
130
- }, D = /* @__PURE__ */ v({
130
+ }, R = /* @__PURE__ */ h({
131
131
  name: "NexxtHeader",
132
132
  __name: "Header",
133
133
  props: {
@@ -138,42 +138,42 @@ const P = /* @__PURE__ */ v({
138
138
  } }
139
139
  },
140
140
  setup(e) {
141
- return (t, l) => (a(), s("div", {
142
- class: n(["header flex items-center", t.$slots.center ? "grid grid-cols-3" : ""])
141
+ return (t, i) => (s(), l("div", {
142
+ class: r(["header flex items-center", t.$slots.center ? "grid grid-cols-3" : ""])
143
143
  }, [
144
- r("div", I, [
145
- f(E, {
144
+ o("div", D, [
145
+ m(z, {
146
146
  class: "shrink-0",
147
147
  variant: "secondary",
148
148
  onClick: e.backButtonAction
149
149
  }, {
150
- default: d(() => [
151
- j(m(e.backButtonText), 1)
150
+ default: f(() => [
151
+ H(b(e.backButtonText), 1)
152
152
  ]),
153
153
  _: 1
154
154
  }, 8, ["onClick"]),
155
- r("span", L, m(e.title), 1)
155
+ o("span", F, b(e.title), 1)
156
156
  ]),
157
- t.$slots.center ? (a(), s("div", z, [
158
- y(t.$slots, "center")
159
- ])) : o("", !0),
160
- t.$slots.right ? (a(), s("div", {
157
+ t.$slots.center ? (s(), l("div", G, [
158
+ g(t.$slots, "center")
159
+ ])) : u("", !0),
160
+ t.$slots.right ? (s(), l("div", {
161
161
  key: 1,
162
- class: n(t.$slots.center ? "col-span-1 col-start-3 flex justify-end" : "ml-auto")
162
+ class: r(t.$slots.center ? "col-span-1 col-start-3 flex justify-end" : "ml-auto")
163
163
  }, [
164
- y(t.$slots, "right")
165
- ], 2)) : o("", !0)
164
+ g(t.$slots, "right")
165
+ ], 2)) : u("", !0)
166
166
  ], 2));
167
167
  }
168
- }), F = { class: "@container" }, R = { class: "flex flex-col @md:gap-2" }, q = { class: "flex items-center justify-between gap-2" }, G = ["aria-label", "aria-valuenow", "aria-valuetext"], J = {
168
+ }), q = { class: "@container" }, J = { class: "flex flex-col @md:gap-2" }, O = { class: "flex items-center justify-between gap-2" }, Q = ["aria-label", "aria-valuenow", "aria-valuetext"], U = {
169
169
  key: 0,
170
- class: "flex items-center text-sm tabular-nums @md:hidden",
170
+ class: "flex items-center small-normal tabular-nums @md:hidden",
171
171
  "aria-hidden": "true"
172
- }, K = {
172
+ }, W = {
173
173
  key: 0,
174
174
  class: "flex justify-between @max-md:order-first @max-md:justify-center",
175
175
  "aria-label": "Progress steps"
176
- }, O = ["aria-current"], Q = /* @__PURE__ */ v({
176
+ }, X = ["aria-current", "role", "tabindex", "aria-label", "onClick", "onKeydown"], Y = /* @__PURE__ */ h({
177
177
  name: "NexxtProgressBar",
178
178
  __name: "ProgressBar",
179
179
  props: {
@@ -182,46 +182,58 @@ const P = /* @__PURE__ */ v({
182
182
  progressLabel: { default: "Voortgang" },
183
183
  stepTitles: {}
184
184
  },
185
- setup(e) {
186
- const t = u(() => Math.min(Math.max(0, e.currentStep), Math.max(0, e.steps - 1))), l = u(() => e.steps > 0 ? t.value + 1 : 0), i = u(() => e.steps <= 1 ? e.steps === 1 ? 100 : 0 : t.value / (e.steps - 1) * 100), c = u(() => !!e.stepTitles?.length);
187
- return A(() => {
185
+ emits: ["update:currentStep"],
186
+ setup(e, { emit: t }) {
187
+ const i = t, a = v(() => Math.min(Math.max(0, e.currentStep), Math.max(0, e.steps - 1))), c = v(() => e.steps > 0 ? a.value + 1 : 0), y = v(() => e.steps <= 1 ? e.steps === 1 ? 100 : 0 : a.value / (e.steps - 1) * 100), d = v(() => !!e.stepTitles?.length);
188
+ return M(() => {
188
189
  e.stepTitles && e.stepTitles.length !== e.steps && console.warn(
189
190
  `[NexxtProgressBar] The "stepTitles" array length (${e.stepTitles.length}) must match the "steps" prop (${e.steps}).`
190
191
  );
191
- }), (x, b) => (a(), s("div", F, [
192
- r("div", R, [
193
- r("div", q, [
194
- r("div", {
192
+ }), ($, Z) => (s(), l("div", q, [
193
+ o("div", J, [
194
+ o("div", O, [
195
+ o("div", {
195
196
  class: "progress-bar progress-bar-bar h-2 w-full overflow-hidden rounded-full",
196
197
  role: "progressbar",
197
198
  "aria-label": e.progressLabel,
198
199
  "aria-valuemin": "0",
199
200
  "aria-valuemax": "100",
200
- "aria-valuenow": Math.round(i.value),
201
- "aria-valuetext": c.value && e.stepTitles?.[t.value] ? `Step ${l.value} of ${e.steps}: ${e.stepTitles[t.value]}` : `Step ${l.value} of ${e.steps}`
201
+ "aria-valuenow": Math.round(y.value),
202
+ "aria-valuetext": d.value && e.stepTitles?.[a.value] ? `Step ${c.value} of ${e.steps}: ${e.stepTitles[a.value]}` : `Step ${c.value} of ${e.steps}`
202
203
  }, [
203
- r("div", {
204
+ o("div", {
204
205
  class: "progress-bar-progress h-full transition-all duration-500 ease-out",
205
- style: C({ width: `${i.value}%` }),
206
+ style: P({ width: `${y.value}%` }),
206
207
  "aria-hidden": !0
207
208
  }, null, 4)
208
- ], 8, G),
209
- c.value ? (a(), s("div", J, [
210
- f(P, { value: l.value }, null, 8, ["value"]),
211
- r("span", null, "/" + m(e.steps), 1)
212
- ])) : o("", !0)
209
+ ], 8, Q),
210
+ d.value ? (s(), l("div", U, [
211
+ m(I, { value: c.value }, null, 8, ["value"]),
212
+ o("span", null, "/" + b(e.steps), 1)
213
+ ])) : u("", !0)
213
214
  ]),
214
- c.value ? (a(), s("ol", K, [
215
- (a(!0), s(p, null, B(e.stepTitles, (h, $) => (a(), s("li", {
216
- key: h,
217
- class: n(["transition-colors duration-500 @max-md:hidden @min-md:text-sm", $ === t.value ? "font-medium text-sapphire-500 @max-md:inline" : ""]),
218
- "aria-current": $ === t.value ? "step" : void 0
219
- }, m(h), 11, O))), 128))
220
- ])) : o("", !0)
215
+ d.value ? (s(), l("ol", W, [
216
+ (s(!0), l(S, null, T(e.stepTitles, (p, n) => (s(), l("li", {
217
+ key: p,
218
+ class: r(["rounded-xs transition-colors duration-500 focus-visible:outline-3 @max-md:hidden @max-md:body-normal @min-md:small-normal", [
219
+ n === a.value ? "text-sapphire-500 @max-md:inline" : "",
220
+ n < a.value ? "cursor-pointer duration-200! hover:text-sapphire-400" : ""
221
+ ]]),
222
+ "aria-current": n === a.value ? "step" : void 0,
223
+ role: n < a.value ? "button" : void 0,
224
+ tabindex: n < a.value ? 0 : void 0,
225
+ "aria-label": n < a.value ? `Ga naar ${p}` : void 0,
226
+ onClick: (k) => n < a.value && i("update:currentStep", n),
227
+ onKeydown: [
228
+ w((k) => n < a.value && i("update:currentStep", n), ["enter"]),
229
+ w(V((k) => n < a.value && i("update:currentStep", n), ["prevent"]), ["space"])
230
+ ]
231
+ }, b(p), 43, X))), 128))
232
+ ])) : u("", !0)
221
233
  ])
222
234
  ]));
223
235
  }
224
- }), W = /* @__PURE__ */ v({
236
+ }), ee = /* @__PURE__ */ h({
225
237
  name: "NexxtStepperHeader",
226
238
  __name: "StepperHeader",
227
239
  props: {
@@ -232,15 +244,15 @@ const P = /* @__PURE__ */ v({
232
244
  backButtonAction: {}
233
245
  },
234
246
  setup(e) {
235
- return (t, l) => (a(), g(D, {
247
+ return (t, i) => (s(), x(R, {
236
248
  title: e.title,
237
249
  "back-button-action": e.backButtonAction,
238
250
  "back-button-text": e.backButtonText
239
- }, H({ _: 2 }, [
251
+ }, E({ _: 2 }, [
240
252
  e.steps ? {
241
253
  name: "center",
242
- fn: d(() => [
243
- f(Q, {
254
+ fn: f(() => [
255
+ m(Y, {
244
256
  class: "w-full",
245
257
  steps: e.steps.length,
246
258
  "step-titles": e.steps,
@@ -251,8 +263,8 @@ const P = /* @__PURE__ */ v({
251
263
  } : void 0,
252
264
  t.$slots.default ? {
253
265
  name: "right",
254
- fn: d(() => [
255
- y(t.$slots, "default")
266
+ fn: f(() => [
267
+ g(t.$slots, "default")
256
268
  ]),
257
269
  key: "1"
258
270
  } : void 0
@@ -260,10 +272,10 @@ const P = /* @__PURE__ */ v({
260
272
  }
261
273
  });
262
274
  export {
263
- P as NexxtAnimatedNumber,
264
- E as NexxtButton,
265
- D as NexxtHeader,
266
- k as NexxtIcon,
267
- Q as NexxtProgressBar,
268
- W as NexxtStepperHeader
275
+ I as NexxtAnimatedNumber,
276
+ z as NexxtButton,
277
+ R as NexxtHeader,
278
+ B as NexxtIcon,
279
+ Y as NexxtProgressBar,
280
+ ee as NexxtStepperHeader
269
281
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@nexxtmove/ui",
3
3
  "type": "module",
4
- "version": "0.1.2",
4
+ "version": "0.1.4",
5
5
  "exports": {
6
6
  ".": {
7
7
  "types": "./dist/index.d.ts",
@@ -3,6 +3,7 @@
3
3
  */
4
4
 
5
5
  @import "./nexxtmove.tailwind.components.css" layer(components);
6
+ @import "./nexxtmove.tailwind.utilities.css";
6
7
 
7
8
  @theme {
8
9
  --color-gray-50: oklch(98.24% 0.00132 286.24288);
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Do not edit directly, this file was auto-generated.
3
+ */
4
+
5
+ @utility heading-1 {
6
+ @apply font-sans font-semibold text-3xl;
7
+ }
8
+
9
+ @utility heading-2 {
10
+ @apply font-sans font-semibold text-2xl;
11
+ }
12
+
13
+ @utility heading-3 {
14
+ @apply font-sans font-semibold text-xl;
15
+ }
16
+
17
+ @utility heading-4 {
18
+ @apply font-sans font-semibold text-lg;
19
+ }
20
+
21
+ @utility body-normal {
22
+ @apply font-sans text-base;
23
+ }
24
+
25
+ @utility body-link {
26
+ @apply font-sans text-base underline;
27
+ }
28
+
29
+ @utility body-italic {
30
+ @apply font-sans font-semibold text-base italic uppercase;
31
+ }
32
+
33
+ @utility small-normal {
34
+ @apply font-sans text-sm;
35
+ }
36
+
37
+ @utility small-link {
38
+ @apply font-sans text-sm underline;
39
+ }
40
+
41
+ @utility small-italic {
42
+ @apply font-sans text-sm italic uppercase;
43
+ }
44
+
45
+ @utility extra-small-normal {
46
+ @apply font-sans text-xs;
47
+ }
48
+
49
+ @utility extra-small-link {
50
+ @apply font-sans text-xs underline;
51
+ }
52
+
53
+ @utility extra-small-italic {
54
+ @apply font-sans text-xs italic uppercase;
55
+ }
56
+
57
+ @utility heading-1-serif {
58
+ @apply font-serif font-semibold text-3xl;
59
+ }
60
+
61
+ @utility heading-2-serif {
62
+ @apply font-serif font-semibold text-2xl;
63
+ }
64
+
65
+ @utility heading-3-serif {
66
+ @apply font-serif font-semibold text-xl;
67
+ }
68
+
69
+ @utility heading-4-serif {
70
+ @apply font-serif font-semibold text-lg;
71
+ }
72
+
73
+ @utility body-normal-serif {
74
+ @apply font-serif text-base;
75
+ }
76
+
77
+ @utility body-link-serif {
78
+ @apply font-serif text-base underline;
79
+ }
80
+
81
+ @utility body-italic-serif {
82
+ @apply font-serif font-semibold text-base italic uppercase;
83
+ }
84
+
85
+ @utility small-normal-serif {
86
+ @apply font-serif text-sm;
87
+ }
88
+
89
+ @utility small-link-serif {
90
+ @apply font-serif text-sm underline;
91
+ }
92
+
93
+ @utility small-italic-serif {
94
+ @apply font-serif text-sm italic uppercase;
95
+ }
96
+
97
+ @utility extra-small-normal-serif {
98
+ @apply font-serif text-xs;
99
+ }
100
+
101
+ @utility extra-small-link-serif {
102
+ @apply font-serif text-xs underline;
103
+ }
104
+
105
+ @utility extra-small-italic-serif {
106
+ @apply font-serif text-xs italic uppercase;
107
+ }
108
+
109
+ @utility heading-1-mono {
110
+ @apply font-mono text-3xl;
111
+ }
112
+
113
+ @utility heading-2-mono {
114
+ @apply font-mono text-2xl;
115
+ }
116
+
117
+ @utility heading-3-mono {
118
+ @apply font-mono text-xl;
119
+ }
120
+
121
+ @utility heading-4-mono {
122
+ @apply font-mono text-lg;
123
+ }
124
+
125
+ @utility body-normal-mono {
126
+ @apply font-mono text-base;
127
+ }
128
+
129
+ @utility body-link-mono {
130
+ @apply font-mono text-base underline;
131
+ }
132
+
133
+ @utility body-italic-mono {
134
+ @apply font-mono text-base uppercase;
135
+ }
136
+
137
+ @utility small-normal-mono {
138
+ @apply font-mono text-sm;
139
+ }
140
+
141
+ @utility small-link-mono {
142
+ @apply font-mono text-sm underline;
143
+ }
144
+
145
+ @utility small-italic-mono {
146
+ @apply font-mono text-sm uppercase;
147
+ }
148
+
149
+ @utility extra-small-normal-mono {
150
+ @apply font-mono text-xs;
151
+ }
152
+
153
+ @utility extra-small-link-mono {
154
+ @apply font-mono text-xs underline;
155
+ }
156
+
157
+ @utility extra-small-italic-mono {
158
+ @apply font-mono text-xs uppercase;
159
+ }