@scalar/api-client 2.19.3 → 2.20.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 (50) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/style.css +1 -1
  3. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts +0 -9
  4. package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
  5. package/dist/v2/blocks/operation-block/OperationBlock.vue.js +126 -67
  6. package/dist/v2/blocks/operation-block/components/Header.vue.d.ts +6 -0
  7. package/dist/v2/blocks/operation-block/components/Header.vue.d.ts.map +1 -1
  8. package/dist/v2/blocks/operation-block/components/Header.vue.js +2 -2
  9. package/dist/v2/blocks/operation-block/components/Header.vue2.js +25 -24
  10. package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.d.ts +1 -1
  11. package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.d.ts.map +1 -1
  12. package/dist/v2/blocks/operation-block/helpers/build-request-cookie-header.js +1 -1
  13. package/dist/v2/blocks/operation-block/helpers/build-request.d.ts.map +1 -1
  14. package/dist/v2/blocks/operation-block/helpers/build-request.js +41 -39
  15. package/dist/v2/blocks/operation-block/helpers/har-to-fetch-request.d.ts +42 -0
  16. package/dist/v2/blocks/operation-block/helpers/har-to-fetch-request.d.ts.map +1 -0
  17. package/dist/v2/blocks/operation-block/helpers/har-to-fetch-request.js +31 -0
  18. package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.d.ts +66 -0
  19. package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.d.ts.map +1 -0
  20. package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.js +43 -0
  21. package/dist/v2/blocks/operation-block/helpers/send-request.d.ts +1 -0
  22. package/dist/v2/blocks/operation-block/helpers/send-request.d.ts.map +1 -1
  23. package/dist/v2/blocks/operation-block/helpers/send-request.js +40 -38
  24. package/dist/v2/blocks/request-block/helpers/get-default-headers.js +1 -1
  25. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts +6 -0
  26. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts.map +1 -1
  27. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.js +2 -2
  28. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue2.js +24 -23
  29. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.d.ts +2 -3
  30. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.d.ts.map +1 -1
  31. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue.js +2 -2
  32. package/dist/v2/blocks/scalar-address-bar-block/components/AddressBarHistory.vue2.js +20 -20
  33. package/dist/v2/components/sidebar/Sidebar.vue.d.ts +5 -0
  34. package/dist/v2/components/sidebar/Sidebar.vue.d.ts.map +1 -1
  35. package/dist/v2/components/sidebar/Sidebar.vue.js +60 -54
  36. package/dist/v2/features/app/app-events.d.ts.map +1 -1
  37. package/dist/v2/features/app/app-events.js +53 -42
  38. package/dist/v2/features/app/app-state.d.ts.map +1 -1
  39. package/dist/v2/features/app/app-state.js +72 -72
  40. package/dist/v2/features/app/components/AppSidebar.vue.d.ts.map +1 -1
  41. package/dist/v2/features/app/components/AppSidebar.vue.js +1 -1
  42. package/dist/v2/features/app/components/AppSidebar.vue2.js +84 -76
  43. package/dist/v2/features/collection/DocumentCollection.vue.d.ts.map +1 -1
  44. package/dist/v2/features/collection/DocumentCollection.vue.js +82 -43
  45. package/dist/v2/features/operation/Operation.vue.d.ts.map +1 -1
  46. package/dist/v2/features/operation/Operation.vue.js +2 -3
  47. package/dist/v2/workspace-events.d.ts.map +1 -1
  48. package/dist/v2/workspace-events.js +12 -6
  49. package/dist/views/Request/ResponseSection/ResponseEmpty.vue2.js +1 -1
  50. package/package.json +13 -13
@@ -1,20 +1,21 @@
1
- import { defineComponent as f, computed as d, createElementBlock as c, openBlock as s, createElementVNode as e, createVNode as o, withCtx as r, unref as m, createBlock as p, resolveDynamicComponent as x, mergeProps as v } from "vue";
2
- import { ScalarButton as h } from "@scalar/components";
1
+ import { defineComponent as g, computed as f, createElementBlock as i, openBlock as u, createElementVNode as t, createVNode as o, createBlock as p, createCommentVNode as h, unref as l, withCtx as s, resolveDynamicComponent as y, mergeProps as k } from "vue";
2
+ import { ScalarFormError as w, ScalarButton as m } from "@scalar/components";
3
+ import { ScalarIconArrowLeft as b, ScalarIconFloppyDisk as S } from "@scalar/icons";
3
4
  import { LibraryIcon as _ } from "@scalar/icons/library";
4
- import { RouterView as b } from "vue-router";
5
- import y from "../../../components/IconSelector.vue.js";
6
- import w from "./components/LabelInput.vue.js";
7
- import g from "./components/Tabs.vue.js";
8
- const k = { class: "custom-scroll h-full" }, V = {
5
+ import { RouterView as C } from "vue-router";
6
+ import V from "../../../components/IconSelector.vue.js";
7
+ import B from "./components/LabelInput.vue.js";
8
+ import D from "./components/Tabs.vue.js";
9
+ const I = { class: "custom-scroll h-full" }, N = {
9
10
  key: 0,
10
11
  class: "w-full md:mx-auto md:max-w-[720px]"
11
- }, B = ["aria-label"], C = { class: "flex flex-row items-center gap-2" }, D = { class: "group relative ml-1.25" }, N = { class: "px-1.5 py-8" }, S = {
12
+ }, U = ["aria-label"], z = { class: "flex" }, E = { class: "flex flex-row items-center gap-2" }, L = { class: "group relative ml-1.25" }, $ = { class: "px-1.5 py-8" }, j = {
12
13
  key: 1,
13
14
  class: "flex w-full flex-1 items-center justify-center"
14
- }, I = {
15
+ }, F = {
15
16
  name: "DocumentCollection"
16
- }, P = /* @__PURE__ */ f({
17
- ...I,
17
+ }, J = /* @__PURE__ */ g({
18
+ ...F,
18
19
  props: {
19
20
  documentSlug: {},
20
21
  document: {},
@@ -29,31 +30,69 @@ const k = { class: "custom-scroll h-full" }, V = {
29
30
  activeWorkspace: {},
30
31
  plugins: {}
31
32
  },
32
- setup(n) {
33
- const a = n, u = d(() => a.document?.info?.title || "Untitled Document"), i = d(
34
- () => a.document?.["x-scalar-icon"] || "interface-content-folder"
35
- );
36
- return (U, t) => (s(), c("div", k, [
37
- n.document ? (s(), c("div", V, [
38
- e("div", {
39
- "aria-label": `title: ${u.value}`,
33
+ setup(a) {
34
+ const n = a, c = f(() => n.document?.info?.title || "Untitled Document"), d = f(
35
+ () => n.document?.["x-scalar-icon"] || "interface-content-folder"
36
+ ), v = () => {
37
+ n.workspaceStore.revertDocumentChanges(n.documentSlug);
38
+ }, x = () => {
39
+ n.workspaceStore.saveDocument(n.documentSlug);
40
+ };
41
+ return (T, e) => (u(), i("div", I, [
42
+ a.document ? (u(), i("div", N, [
43
+ t("div", {
44
+ "aria-label": `title: ${c.value}`,
40
45
  class: "mx-auto flex h-fit w-full flex-col gap-2 pt-6 pb-3 md:mx-auto md:max-w-[720px]"
41
46
  }, [
42
- e("div", C, [
43
- o(y, {
44
- modelValue: i.value,
47
+ a.document["x-scalar-is-dirty"] ? (u(), p(l(w), {
48
+ key: 0,
49
+ variant: "warning"
50
+ }, {
51
+ default: s(() => [
52
+ e[4] || (e[4] = t("div", null, " You have unsaved changes. Save your work to keep your changes, or undo to revert them. ", -1)),
53
+ e[5] || (e[5] = t("div", { class: "flex-1" }, null, -1)),
54
+ t("div", z, [
55
+ o(l(m), {
56
+ size: "sm",
57
+ variant: "ghost",
58
+ onClick: v
59
+ }, {
60
+ default: s(() => [
61
+ o(l(b)),
62
+ e[2] || (e[2] = t("span", null, "Undo", -1))
63
+ ]),
64
+ _: 1
65
+ }),
66
+ o(l(m), {
67
+ size: "sm",
68
+ variant: "ghost",
69
+ onClick: x
70
+ }, {
71
+ default: s(() => [
72
+ o(l(S)),
73
+ e[3] || (e[3] = t("span", null, "Save", -1))
74
+ ]),
75
+ _: 1
76
+ })
77
+ ])
78
+ ]),
79
+ _: 1
80
+ })) : h("", !0),
81
+ t("div", E, [
82
+ o(V, {
83
+ modelValue: d.value,
45
84
  placement: "bottom-start",
46
- "onUpdate:modelValue": t[0] || (t[0] = (l) => n.eventBus.emit("document:update:icon", l))
85
+ "onUpdate:modelValue": e[0] || (e[0] = (r) => a.eventBus.emit("document:update:icon", r))
47
86
  }, {
48
- default: r(() => [
49
- o(m(h), {
87
+ default: s(() => [
88
+ o(l(m), {
50
89
  class: "hover:bg-b-2 aspect-square h-7 w-7 cursor-pointer rounded border border-transparent p-0 hover:border-inherit",
51
90
  variant: "ghost"
52
91
  }, {
53
- default: r(() => [
54
- o(m(_), {
92
+ default: s(() => [
93
+ o(l(_), {
55
94
  class: "text-c-2 size-5",
56
- src: i.value,
95
+ src: d.value,
57
96
  "stroke-width": "2"
58
97
  }, null, 8, ["src"])
59
98
  ]),
@@ -63,33 +102,33 @@ const k = { class: "custom-scroll h-full" }, V = {
63
102
  _: 1
64
103
  }, 8, ["modelValue"])
65
104
  ]),
66
- e("div", D, [
67
- o(w, {
105
+ t("div", L, [
106
+ o(B, {
68
107
  class: "text-xl font-bold",
69
108
  inputId: "documentName",
70
- modelValue: u.value,
71
- "onUpdate:modelValue": t[1] || (t[1] = (l) => n.eventBus.emit("document:update:info", { title: l }))
109
+ modelValue: c.value,
110
+ "onUpdate:modelValue": e[1] || (e[1] = (r) => a.eventBus.emit("document:update:info", { title: r }))
72
111
  }, null, 8, ["modelValue"])
73
112
  ])
74
- ], 8, B),
75
- o(g, { type: "document" }),
76
- e("div", N, [
77
- o(m(b), null, {
78
- default: r(({ Component: l }) => [
79
- (s(), p(x(l), v(a, { collectionType: "document" }), null, 16))
113
+ ], 8, U),
114
+ o(D, { type: "document" }),
115
+ t("div", $, [
116
+ o(l(C), null, {
117
+ default: s(({ Component: r }) => [
118
+ (u(), p(y(r), k(n, { collectionType: "document" }), null, 16))
80
119
  ]),
81
120
  _: 1
82
121
  })
83
122
  ])
84
- ])) : (s(), c("div", S, [...t[2] || (t[2] = [
85
- e("div", { class: "flex h-full flex-col items-center justify-center" }, [
86
- e("h1", { class: "text-2xl font-bold" }, "Document not found"),
87
- e("p", { class: "text-gray-500" }, " The document you are looking for does not exist. ")
123
+ ])) : (u(), i("div", j, [...e[6] || (e[6] = [
124
+ t("div", { class: "flex h-full flex-col items-center justify-center" }, [
125
+ t("h1", { class: "text-2xl font-bold" }, "Document not found"),
126
+ t("p", { class: "text-gray-500" }, " The document you are looking for does not exist. ")
88
127
  ], -1)
89
128
  ])]))
90
129
  ]));
91
130
  }
92
131
  });
93
132
  export {
94
- P as default
133
+ J as default
95
134
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Operation.vue.d.ts","sourceRoot":"","sources":["../../../../src/v2/features/operation/Operation.vue"],"names":[],"mappings":"AAkMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAM/D;;;;;;;GAOG;;IAGC,6CAA6C;cACnC,UAAU,CAAC,SAAS,CAAC;;IAD/B,6CAA6C;cACnC,UAAU,CAAC,SAAS,CAAC;;AAHnC,wBA0PC"}
1
+ {"version":3,"file":"Operation.vue.d.ts","sourceRoot":"","sources":["../../../../src/v2/features/operation/Operation.vue"],"names":[],"mappings":"AAiMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAElE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAM/D;;;;;;;GAOG;;IAGC,6CAA6C;cACnC,UAAU,CAAC,SAAS,CAAC;;IAD/B,6CAA6C;cACnC,UAAU,CAAC,SAAS,CAAC;;AAHnC,wBAwPC"}
@@ -69,7 +69,7 @@ const b = {
69
69
  type: "document"
70
70
  }), h = n(
71
71
  () => C(o(e.options)?.hiddenClients)
72
- ), f = "2.19.3";
72
+ ), f = "2.20.0";
73
73
  return (t, a) => e.path && e.method && e.exampleName && l.value ? (c(), x(i(p), {
74
74
  key: 0,
75
75
  appVersion: i(f),
@@ -95,8 +95,7 @@ const b = {
95
95
  server: d.value,
96
96
  servers: r.value,
97
97
  setOperationSecurity: e.document?.["x-scalar-set-operation-security"] ?? !1,
98
- totalPerformedRequests: 0,
99
- "onUpdate:servers": a[0] || (a[0] = (R) => e.eventBus.emit("ui:route:page", { name: "document.servers" }))
98
+ "onUpdate:servers": a[0] || (a[0] = (V) => e.eventBus.emit("ui:route:page", { name: "document.servers" }))
100
99
  }, null, 8, ["appVersion", "authMeta", "documentSecurity", "documentSelectedSecurity", "documentUrl", "environment", "eventBus", "exampleKey", "globalCookies", "hideClientButton", "httpClients", "layout", "method", "operation", "path", "plugins", "proxyUrl", "securitySchemes", "selectedClient", "server", "servers", "setOperationSecurity"])) : (c(), k("div", b, [...a[1] || (a[1] = [
101
100
  g("span", { class: "text-c-3" }, "Select an operation to view details", -1)
102
101
  ])]));
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-events.d.ts","sourceRoot":"","sources":["../../src/v2/workspace-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAkB,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAE3G,OAAO,EAAE,KAAK,GAAG,EAAY,MAAM,KAAK,CAAA;AAExC,KAAK,IAAI,CAAC,CAAC,SAAS,MAAM,kBAAkB,IAAI,OAAO,CAAC;IACtD,eAAe,EAAE,CACf,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAC3B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;IAClF,cAAc,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACzE,CAAC,CAAA;AAEF,KAAK,KAAK,GAAG;KACV,GAAG,IAAI,MAAM,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC;CAC9C,CAAA;AA6BD;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAAC,EAC/C,QAAQ,EACR,KAAK,EACL,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,KAAK,EAAE,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IACjC,KAAK,EAAE,KAAK,CAAA;CACb,QA+OA"}
1
+ {"version":3,"file":"workspace-events.d.ts","sourceRoot":"","sources":["../../src/v2/workspace-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,KAAK,EAAE,kBAAkB,EAAkB,iBAAiB,EAAE,MAAM,gCAAgC,CAAA;AAE3G,OAAO,EAAE,KAAK,GAAG,EAAY,MAAM,KAAK,CAAA;AAExC,KAAK,IAAI,CAAC,CAAC,SAAS,MAAM,kBAAkB,IAAI,OAAO,CAAC;IACtD,eAAe,EAAE,CACf,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAC3B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAA;IAClF,cAAc,EAAE,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACzE,CAAC,CAAA;AAEF,KAAK,KAAK,GAAG;KACV,GAAG,IAAI,MAAM,kBAAkB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC;CAC9C,CAAA;AA6BD;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAAC,EAC/C,QAAQ,EACR,KAAK,EACL,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,iBAAiB,CAAA;IAC3B,KAAK,EAAE,GAAG,CAAC,cAAc,GAAG,IAAI,CAAC,CAAA;IACjC,KAAK,EAAE,KAAK,CAAA;CACb,QAyPA"}
@@ -1,15 +1,15 @@
1
- import { generateClientMutators as i } from "@scalar/workspace-store/mutators";
2
- import { computed as p } from "vue";
3
- const r = (a, c, t) => async (o) => {
1
+ import { generateClientMutators as p } from "@scalar/workspace-store/mutators";
2
+ import { computed as c } from "vue";
3
+ const r = (a, i, t) => async (o) => {
4
4
  const n = await t[a]?.onBeforeExecute?.(o) ?? o;
5
- return await c(n), await t[a]?.onAfterExecute?.(n), n;
5
+ return await i(n), await t[a]?.onAfterExecute?.(n), n;
6
6
  };
7
7
  function l({
8
8
  eventBus: a,
9
- store: c,
9
+ store: i,
10
10
  hooks: t
11
11
  }) {
12
- const o = p(() => i(c.value)), n = ({ collectionType: e }) => e === "document" ? o.value.active() : o.value.workspace();
12
+ const o = c(() => p(i.value)), n = ({ collectionType: e }) => e === "document" ? o.value.active() : o.value.workspace();
13
13
  a.on(
14
14
  "workspace:update:active-proxy",
15
15
  (e) => r("workspace:update:active-proxy", o.value.workspace().workspace.updateActiveProxy, t)(e)
@@ -162,6 +162,9 @@ function l({
162
162
  o.value.active().operation.updateOperationRequestBodyFormValue,
163
163
  t
164
164
  )(e)
165
+ ), a.on(
166
+ "operation:reload:history",
167
+ (e) => r("operation:reload:history", o.value.active().operation.reloadOperationHistory, t)(e)
165
168
  ), a.on(
166
169
  "tag:create:tag",
167
170
  (e) => r("tag:create:tag", o.value.active().tag.createTag, t)(e)
@@ -192,6 +195,9 @@ function l({
192
195
  ), a.on(
193
196
  "tabs:update:tabs",
194
197
  (e) => r("tabs:update:tabs", o.value.workspace().tabs.updateTabs, t)(e)
198
+ ), a.on(
199
+ "hooks:on:request:complete",
200
+ (e) => r("hooks:on:request:complete", o.value.active().operation.addResponseToHistory, t)(e)
195
201
  );
196
202
  }
197
203
  export {
@@ -33,7 +33,7 @@ const W = { class: "flex-center relative flex flex-1 flex-col gap-6 p-2 capitali
33
33
  }));
34
34
  }, f = (u) => {
35
35
  u?.createNew && g.name === "request" && p();
36
- }, v = "2.19.3";
36
+ }, v = "2.20.0";
37
37
  return q(() => a.hotKeys.on(f)), R(() => a.hotKeys.off(f)), (u, e) => (l(), n("div", W, [
38
38
  s("div", {
39
39
  class: y(["flex h-[calc(100%_-_50px)] flex-col items-center justify-center", {
package/package.json CHANGED
@@ -18,7 +18,7 @@
18
18
  "rest",
19
19
  "testing"
20
20
  ],
21
- "version": "2.19.3",
21
+ "version": "2.20.0",
22
22
  "engines": {
23
23
  "node": ">=20"
24
24
  },
@@ -327,25 +327,25 @@
327
327
  "yaml": "^2.8.0",
328
328
  "zod": "^4.3.5",
329
329
  "@scalar/analytics-client": "1.0.1",
330
- "@scalar/components": "0.16.27",
330
+ "@scalar/draggable": "0.3.0",
331
+ "@scalar/components": "0.16.28",
331
332
  "@scalar/helpers": "0.2.8",
333
+ "@scalar/json-magic": "0.9.2",
332
334
  "@scalar/icons": "0.5.2",
333
- "@scalar/draggable": "0.3.0",
334
335
  "@scalar/import": "0.4.45",
335
- "@scalar/oas-utils": "0.6.24",
336
- "@scalar/json-magic": "0.9.2",
337
- "@scalar/object-utils": "1.2.22",
336
+ "@scalar/openapi-parser": "0.24.3",
337
+ "@scalar/oas-utils": "0.6.25",
338
338
  "@scalar/openapi-types": "0.5.3",
339
+ "@scalar/object-utils": "1.2.22",
339
340
  "@scalar/postman-to-openapi": "0.4.0",
340
- "@scalar/openapi-parser": "0.24.3",
341
- "@scalar/sidebar": "0.7.17",
342
- "@scalar/snippetz": "0.6.6",
343
- "@scalar/types": "0.5.8",
341
+ "@scalar/snippetz": "0.6.7",
344
342
  "@scalar/themes": "0.13.26",
345
- "@scalar/use-codemirror": "0.13.21",
346
- "@scalar/use-hooks": "0.3.6",
343
+ "@scalar/sidebar": "0.7.18",
344
+ "@scalar/types": "0.5.9",
345
+ "@scalar/use-codemirror": "0.13.22",
347
346
  "@scalar/use-toasts": "0.9.1",
348
- "@scalar/workspace-store": "0.25.3"
347
+ "@scalar/workspace-store": "0.26.0",
348
+ "@scalar/use-hooks": "0.3.6"
349
349
  },
350
350
  "devDependencies": {
351
351
  "@tailwindcss/vite": "^4.1.18",