webstudio 0.264.0 → 0.265.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.
package/lib/cli.js CHANGED
@@ -15,8 +15,9 @@ import { hideBin } from "yargs/helpers";
15
15
  import { join, dirname, normalize, basename, relative } from "node:path";
16
16
  import envPaths from "env-paths";
17
17
  import { z } from "zod";
18
- import { access, constants, writeFile, mkdir, readFile, rm, readdir, cp, rename } from "node:fs/promises";
18
+ import { access, constants, writeFile, mkdir, readFile, rm, rename, readdir, cp } from "node:fs/promises";
19
19
  import { text, isCancel, cancel, log, spinner, confirm, select as select$2 } from "@clack/prompts";
20
+ import { createTRPCUntypedClient, httpBatchLink } from "@trpc/client";
20
21
  import pc from "picocolors";
21
22
  import { existsSync, createWriteStream } from "node:fs";
22
23
  import { pipeline } from "node:stream/promises";
@@ -145,48 +146,30 @@ const loadJSONFile = async (filePath) => {
145
146
  return null;
146
147
  }
147
148
  };
148
- var getLatestBuildUsingProjectId = async (params) => {
149
- const { origin, projectId, authToken } = params;
150
- const { sourceOrigin } = parseBuilderUrl(origin);
151
- const url = new URL(sourceOrigin);
152
- url.pathname = `/rest/buildId/${projectId}`;
153
- const headers = new Headers();
154
- headers.set("x-auth-token", authToken);
155
- const response = await fetch(url.href, { headers });
156
- if (response.ok) {
157
- return await response.json();
158
- }
159
- const message = await response.text();
160
- throw new Error(message.slice(0, 1e3));
161
- };
162
149
  var loadProjectDataByBuildId = async (params) => {
163
- const { sourceOrigin } = parseBuilderUrl(params.origin);
164
- const url = new URL(sourceOrigin);
165
- url.pathname = `/rest/build/${params.buildId}`;
166
- const headers = new Headers();
167
- if ("seviceToken" in params) {
168
- headers.set("Authorization", params.seviceToken);
169
- } else {
170
- headers.set("x-auth-token", params.authToken);
171
- }
172
- const response = await fetch(url.href, {
173
- headers
150
+ const headers = "seviceToken" in params ? { Authorization: params.seviceToken } : { "x-auth-token": params.authToken };
151
+ return await createTrpcClient(params.origin, headers).query(
152
+ "build.loadProjectDataByBuildId",
153
+ { buildId: params.buildId }
154
+ );
155
+ };
156
+ var createTrpcClient = (origin, headers) => {
157
+ const { sourceOrigin } = parseBuilderUrl(origin);
158
+ const url = new URL("/trpc", sourceOrigin);
159
+ return createTRPCUntypedClient({
160
+ links: [
161
+ httpBatchLink({
162
+ url: url.href,
163
+ headers
164
+ })
165
+ ]
174
166
  });
175
- if (response.ok) {
176
- return await response.json();
177
- }
178
- const message = await response.text();
179
- throw new Error(message.slice(0, 1e3));
180
167
  };
181
168
  var loadProjectDataByProjectId = async (params) => {
182
- const result = await getLatestBuildUsingProjectId(params);
183
- if (result.buildId === null) {
184
- throw new Error(`The project is not published yet`);
185
- }
186
- return await loadProjectDataByBuildId({
187
- buildId: result.buildId,
188
- origin: params.origin,
189
- authToken: params.authToken
169
+ return await createTrpcClient(params.origin, {
170
+ "x-auth-token": params.authToken
171
+ }).query("build.loadProjectDataByProjectId", {
172
+ projectId: params.projectId
190
173
  });
191
174
  };
192
175
  var buildProjectDomainPrefix = "p-";
@@ -220,6 +203,36 @@ var parseBuilderUrl = (urlStr) => {
220
203
  sourceOrigin: sourceUrl.origin
221
204
  };
222
205
  };
206
+ const wait = (duration) => new Promise((resolve) => setTimeout(resolve, duration));
207
+ const withConfigLock = async (callback) => {
208
+ const lockPath = `${GLOBAL_CONFIG_FILE}.lock`;
209
+ const start = Date.now();
210
+ while (true) {
211
+ try {
212
+ await mkdir(lockPath);
213
+ break;
214
+ } catch (error) {
215
+ const code2 = error.code;
216
+ if (code2 !== "EEXIST") {
217
+ throw error;
218
+ }
219
+ if (Date.now() - start > 1e4) {
220
+ throw new Error(`Timed out waiting for config lock ${lockPath}`);
221
+ }
222
+ await wait(50);
223
+ }
224
+ }
225
+ try {
226
+ return await callback();
227
+ } finally {
228
+ await rm(lockPath, { recursive: true, force: true });
229
+ }
230
+ };
231
+ const writeConfigFile = async (content) => {
232
+ const temporaryFile = `${GLOBAL_CONFIG_FILE}.${process.pid}.tmp`;
233
+ await writeFile(temporaryFile, content, "utf8");
234
+ await rename(temporaryFile, GLOBAL_CONFIG_FILE);
235
+ };
223
236
  const parseShareLink = (value) => {
224
237
  const url = new URL(value.replaceAll("'", ""));
225
238
  const token = url.searchParams.get("authToken");
@@ -273,16 +286,18 @@ const link = async (options) => {
273
286
  }
274
287
  }
275
288
  const { origin, projectId, token } = parseShareLink(shareLink);
276
- const currentConfig = await readFile(GLOBAL_CONFIG_FILE, "utf-8");
277
- const currentConfigJson = jsonToGlobalConfig(JSON.parse(currentConfig));
278
- const newConfig = {
279
- ...currentConfigJson,
280
- [projectId]: {
281
- origin,
282
- token
283
- }
284
- };
285
- await writeFile(GLOBAL_CONFIG_FILE, JSON.stringify(newConfig, null, 2));
289
+ await withConfigLock(async () => {
290
+ const currentConfig = await readFile(GLOBAL_CONFIG_FILE, "utf-8");
291
+ const currentConfigJson = jsonToGlobalConfig(JSON.parse(currentConfig));
292
+ const newConfig = {
293
+ ...currentConfigJson,
294
+ [projectId]: {
295
+ origin,
296
+ token
297
+ }
298
+ };
299
+ await writeConfigFile(JSON.stringify(newConfig, null, 2));
300
+ });
286
301
  log.info(`Saved credentials for project ${projectId}.
287
302
  You can find your config at ${GLOBAL_CONFIG_FILE}`);
288
303
  const localConfig = {
@@ -2644,7 +2659,7 @@ var toValue = (styleValue, transformValue) => {
2644
2659
  case "oklch":
2645
2660
  return `oklch(${c1} ${c2} ${c3} / ${alpha})`;
2646
2661
  // Fall back to color() function for less common color spaces.
2647
- // Webstudio uses colorjs internal names; map to CSS predefined color space names.
2662
+ // colorjs uses internal short names that differ from CSS predefined color space identifiers.
2648
2663
  case "p3":
2649
2664
  return `color(display-p3 ${c1} ${c2} ${c3} / ${alpha})`;
2650
2665
  case "a98rgb":
@@ -3687,10 +3702,6 @@ var commonPageFields = {
3687
3702
  )
3688
3703
  };
3689
3704
  var HomePagePath = z.string().refine((path) => path === "", "Home page path must be empty");
3690
- var HomePage = z.object({
3691
- ...commonPageFields,
3692
- path: HomePagePath
3693
- });
3694
3705
  var DefaultPagePage = z.string().refine((path) => path !== "", "Can't be empty").refine((path) => path !== "/", "Can't be just a /").refine((path) => path.endsWith("/") === false, "Can't end with a /").refine((path) => path.includes("//") === false, "Can't contain repeating /").refine(
3695
3706
  (path) => /^[-_a-z0-9*:?\\/.]*$/.test(path),
3696
3707
  "Only a-z, 0-9, -, _, /, :, ?, . and * are allowed"
@@ -3723,7 +3734,7 @@ var PagePath = DefaultPagePage.refine(
3723
3734
  );
3724
3735
  var Page = z.object({
3725
3736
  ...commonPageFields,
3726
- path: PagePath
3737
+ path: z.union([HomePagePath, PagePath])
3727
3738
  });
3728
3739
  var ProjectMeta = z.object({
3729
3740
  // All fields are optional to ensure consistency and allow for the addition of new fields without requiring migration
@@ -3753,9 +3764,123 @@ z.object({
3753
3764
  meta: ProjectMeta.optional(),
3754
3765
  compiler: CompilerSettings.optional(),
3755
3766
  redirects: z.array(PageRedirect).optional(),
3756
- homePage: HomePage,
3757
- pages: z.array(Page),
3758
- folders: z.array(Folder).refine((folders) => folders.length > 0, "Folders can't be empty")
3767
+ homePageId: PageId,
3768
+ rootFolderId: FolderId,
3769
+ pages: z.map(PageId, Page),
3770
+ folders: z.map(FolderId, Folder).refine((folders) => folders.size > 0, "Folders can't be empty")
3771
+ }).superRefine((pages, context) => {
3772
+ const homePage = pages.pages.get(pages.homePageId);
3773
+ const rootFolder = pages.folders.get(pages.rootFolderId);
3774
+ if (homePage === void 0) {
3775
+ context.addIssue({
3776
+ code: z.ZodIssueCode.custom,
3777
+ path: ["homePageId"],
3778
+ message: "Home page must reference an existing page"
3779
+ });
3780
+ }
3781
+ if (rootFolder === void 0) {
3782
+ context.addIssue({
3783
+ code: z.ZodIssueCode.custom,
3784
+ path: ["rootFolderId"],
3785
+ message: "Root folder must reference an existing folder"
3786
+ });
3787
+ }
3788
+ if (homePage !== void 0 && homePage.path !== "") {
3789
+ context.addIssue({
3790
+ code: z.ZodIssueCode.custom,
3791
+ path: ["pages", pages.homePageId, "path"],
3792
+ message: "Home page path must be empty"
3793
+ });
3794
+ }
3795
+ for (const [pageId, page] of pages.pages) {
3796
+ if (page.id !== pageId) {
3797
+ context.addIssue({
3798
+ code: z.ZodIssueCode.custom,
3799
+ path: ["pages", pageId, "id"],
3800
+ message: "Page id must match its record key"
3801
+ });
3802
+ }
3803
+ if (pageId !== pages.homePageId && page.path === "") {
3804
+ context.addIssue({
3805
+ code: z.ZodIssueCode.custom,
3806
+ path: ["pages", pageId, "path"],
3807
+ message: "Page path can't be empty"
3808
+ });
3809
+ }
3810
+ }
3811
+ for (const [folderId, folder] of pages.folders) {
3812
+ if (folder.id !== folderId) {
3813
+ context.addIssue({
3814
+ code: z.ZodIssueCode.custom,
3815
+ path: ["folders", folderId, "id"],
3816
+ message: "Folder id must match its record key"
3817
+ });
3818
+ }
3819
+ for (const [index, childId] of folder.children.entries()) {
3820
+ if (pages.pages.has(childId) === false && pages.folders.has(childId) === false) {
3821
+ context.addIssue({
3822
+ code: z.ZodIssueCode.custom,
3823
+ path: ["folders", folderId, "children", index],
3824
+ message: "Folder child must reference an existing page or folder"
3825
+ });
3826
+ }
3827
+ if (childId === pages.rootFolderId) {
3828
+ context.addIssue({
3829
+ code: z.ZodIssueCode.custom,
3830
+ path: ["folders", folderId, "children", index],
3831
+ message: "Root folder can't be nested"
3832
+ });
3833
+ }
3834
+ }
3835
+ }
3836
+ if (rootFolder !== void 0 && rootFolder.children[0] !== pages.homePageId) {
3837
+ context.addIssue({
3838
+ code: z.ZodIssueCode.custom,
3839
+ path: ["folders", pages.rootFolderId, "children"],
3840
+ message: "Root folder must start with the home page"
3841
+ });
3842
+ }
3843
+ const childParents = /* @__PURE__ */ new Map();
3844
+ for (const [folderId, folder] of pages.folders) {
3845
+ for (const [index, childId] of folder.children.entries()) {
3846
+ const parentId = childParents.get(childId);
3847
+ if (parentId !== void 0) {
3848
+ context.addIssue({
3849
+ code: z.ZodIssueCode.custom,
3850
+ path: ["folders", folderId, "children", index],
3851
+ message: `Child is already registered in folder "${parentId}"`
3852
+ });
3853
+ continue;
3854
+ }
3855
+ childParents.set(childId, folderId);
3856
+ }
3857
+ }
3858
+ const hasFolderCycle = (folderId, path = /* @__PURE__ */ new Set()) => {
3859
+ if (path.has(folderId)) {
3860
+ return true;
3861
+ }
3862
+ const folder = pages.folders.get(folderId);
3863
+ if (folder === void 0) {
3864
+ return false;
3865
+ }
3866
+ path.add(folderId);
3867
+ for (const childId of folder.children) {
3868
+ if (pages.folders.has(childId) && hasFolderCycle(childId, path)) {
3869
+ return true;
3870
+ }
3871
+ }
3872
+ path.delete(folderId);
3873
+ return false;
3874
+ };
3875
+ for (const folderId of pages.folders.keys()) {
3876
+ if (hasFolderCycle(folderId)) {
3877
+ context.addIssue({
3878
+ code: z.ZodIssueCode.custom,
3879
+ path: ["folders", folderId, "children"],
3880
+ message: "Folders can't contain cycles"
3881
+ });
3882
+ }
3883
+ }
3759
3884
  });
3760
3885
  var TextChild = z.object({
3761
3886
  type: z.literal("text"),
@@ -4241,7 +4366,8 @@ z.object({
4241
4366
  var common = {
4242
4367
  label: z.string().optional(),
4243
4368
  description: z.string().optional(),
4244
- required: z.boolean()
4369
+ required: z.boolean(),
4370
+ contentMode: z.boolean().optional()
4245
4371
  };
4246
4372
  var Tag = z.object({
4247
4373
  ...common,
@@ -5461,18 +5587,36 @@ var executeExpression = (expression) => {
5461
5587
  };
5462
5588
  var tokenRegex = new RegExp(":(?<name>\\w+)(?<modifier>[?*]?)|(?<wildcard>(?<!:\\w+)\\*)");
5463
5589
  var isPathnamePattern = (pathname) => tokenRegex.test(pathname);
5590
+ var ROOT_FOLDER_ID = "root";
5591
+ var isRootFolder = ({ id }) => id === ROOT_FOLDER_ID;
5592
+ var getPageById = (pages, pageId) => {
5593
+ return pages.pages.get(pageId);
5594
+ };
5595
+ var getAllPages = (pages) => {
5596
+ return Array.from(pages.pages.values());
5597
+ };
5598
+ var getAllFolders = (pages) => {
5599
+ return Array.from(pages.folders.values());
5600
+ };
5601
+ var getHomePage = (pages) => {
5602
+ const homePage = getPageById(pages, pages.homePageId);
5603
+ if (homePage === void 0) {
5604
+ throw new Error(`Home page "${pages.homePageId}" was not found.`);
5605
+ }
5606
+ return homePage;
5607
+ };
5464
5608
  var findPageByIdOrPath = (idOrPath, pages) => {
5465
- if (idOrPath === "" || idOrPath === "/" || idOrPath === pages.homePage.id) {
5466
- return pages.homePage;
5609
+ if (idOrPath === "" || idOrPath === "/" || idOrPath === pages.homePageId) {
5610
+ return getHomePage(pages);
5467
5611
  }
5468
- return pages.pages.find(
5612
+ return getAllPages(pages).find(
5469
5613
  (page) => page.id === idOrPath || getPagePath(page.id, pages) === idOrPath
5470
5614
  );
5471
5615
  };
5472
5616
  var getPagePath = (id, pages) => {
5473
5617
  const foldersMap = /* @__PURE__ */ new Map();
5474
5618
  const childParentMap = /* @__PURE__ */ new Map();
5475
- for (const folder of pages.folders) {
5619
+ for (const folder of getAllFolders(pages)) {
5476
5620
  foldersMap.set(folder.id, folder);
5477
5621
  for (const childId of folder.children) {
5478
5622
  childParentMap.set(childId, folder.id);
@@ -5480,7 +5624,7 @@ var getPagePath = (id, pages) => {
5480
5624
  }
5481
5625
  const paths = [];
5482
5626
  let currentId = id;
5483
- const allPages = [pages.homePage, ...pages.pages];
5627
+ const allPages = getAllPages(pages);
5484
5628
  for (const page of allPages) {
5485
5629
  if (page.id === id) {
5486
5630
  paths.push(page.path);
@@ -5499,7 +5643,7 @@ var getPagePath = (id, pages) => {
5499
5643
  return paths.reverse().join("/").replace(/\/+/g, "/");
5500
5644
  };
5501
5645
  var getStaticSiteMapXml = (pages, updatedAt) => {
5502
- const allPages = [pages.homePage, ...pages.pages];
5646
+ const allPages = getAllPages(pages);
5503
5647
  return allPages.filter((page) => (page.meta.documentType ?? "html") === "html").filter(
5504
5648
  (page) => executeExpression(page.meta.excludePageFromSearch) !== true
5505
5649
  ).filter((page) => false === isPathnamePattern(page.path)).map((page) => ({
@@ -5507,6 +5651,104 @@ var getStaticSiteMapXml = (pages, updatedAt) => {
5507
5651
  lastModified: updatedAt.split("T")[0]
5508
5652
  }));
5509
5653
  };
5654
+ var toMap = (items, normalizeItem = (item) => item) => {
5655
+ if (items instanceof Map) {
5656
+ return new Map(
5657
+ Array.from(items, ([id, item]) => [id, normalizeItem(item)])
5658
+ );
5659
+ }
5660
+ const list = Array.isArray(items) ? items : Object.values(items);
5661
+ return new Map(list.map((item) => [item.id, normalizeItem(item)]));
5662
+ };
5663
+ var normalizePage = (page) => ({
5664
+ ...page,
5665
+ meta: page.meta ?? {}
5666
+ });
5667
+ var isLegacyPages = (pages) => {
5668
+ if (typeof pages !== "object" || pages === null) {
5669
+ return false;
5670
+ }
5671
+ return "homePage" in pages && Array.isArray(pages.pages);
5672
+ };
5673
+ var isSerializedPages = (pages) => {
5674
+ if (typeof pages !== "object" || pages === null) {
5675
+ return false;
5676
+ }
5677
+ const candidate = pages;
5678
+ return typeof candidate.homePageId === "string" && typeof candidate.rootFolderId === "string" && candidate.pages !== void 0 && candidate.folders !== void 0;
5679
+ };
5680
+ var migratePages = (pages) => {
5681
+ var _a2;
5682
+ if (isSerializedPages(pages) && pages.pages instanceof Map && pages.folders instanceof Map) {
5683
+ return pages;
5684
+ }
5685
+ if (isSerializedPages(pages)) {
5686
+ return {
5687
+ meta: pages.meta,
5688
+ compiler: pages.compiler,
5689
+ redirects: pages.redirects,
5690
+ homePageId: pages.homePageId,
5691
+ rootFolderId: pages.rootFolderId,
5692
+ pages: toMap(pages.pages, normalizePage),
5693
+ folders: toMap(pages.folders)
5694
+ };
5695
+ }
5696
+ if (isLegacyPages(pages) === false) {
5697
+ throw new Error("Pages data has unsupported shape.");
5698
+ }
5699
+ const homePage = {
5700
+ ...normalizePage(pages.homePage),
5701
+ path: ""
5702
+ };
5703
+ const nextPages = /* @__PURE__ */ new Map([[homePage.id, homePage]]);
5704
+ for (const page of pages.pages) {
5705
+ if (page.id === homePage.id) {
5706
+ continue;
5707
+ }
5708
+ nextPages.set(page.id, normalizePage(page));
5709
+ }
5710
+ const nextFolders = /* @__PURE__ */ new Map();
5711
+ for (const folder of pages.folders ?? []) {
5712
+ nextFolders.set(folder.id, { ...folder, children: [...folder.children] });
5713
+ }
5714
+ const rootFolder = Array.from(nextFolders.values()).find(isRootFolder) ?? ((_a2 = pages.folders) == null ? void 0 : _a2[0]) ?? {
5715
+ id: ROOT_FOLDER_ID,
5716
+ name: "Root",
5717
+ slug: "",
5718
+ children: []
5719
+ };
5720
+ if (nextFolders.has(rootFolder.id) === false) {
5721
+ nextFolders.set(rootFolder.id, { ...rootFolder, children: [] });
5722
+ }
5723
+ const nextRootFolder = nextFolders.get(rootFolder.id);
5724
+ if (nextRootFolder === void 0) {
5725
+ throw new Error("Pages must include a root folder.");
5726
+ }
5727
+ for (const folder of nextFolders.values()) {
5728
+ folder.children = folder.children.filter(
5729
+ (childId) => childId !== homePage.id
5730
+ );
5731
+ }
5732
+ nextRootFolder.children.unshift(homePage.id);
5733
+ const referencedIds = new Set(
5734
+ Array.from(nextFolders.values()).flatMap((folder) => folder.children)
5735
+ );
5736
+ for (const page of pages.pages) {
5737
+ if (page.id !== homePage.id && referencedIds.has(page.id) === false) {
5738
+ nextRootFolder.children.push(page.id);
5739
+ referencedIds.add(page.id);
5740
+ }
5741
+ }
5742
+ return {
5743
+ meta: pages.meta,
5744
+ compiler: pages.compiler,
5745
+ redirects: pages.redirects,
5746
+ homePageId: homePage.id,
5747
+ rootFolderId: rootFolder.id,
5748
+ pages: nextPages,
5749
+ folders: nextFolders
5750
+ };
5751
+ };
5510
5752
  var identifiers = reservedIdentifiers({ includeGlobalProperties: true });
5511
5753
  var isReserved = (identifier) => identifiers.has(identifier);
5512
5754
  var normalizeJsName = (name2) => {
@@ -6892,7 +7134,7 @@ const htmlToJsx = (html2) => {
6892
7134
  }
6893
7135
  return result;
6894
7136
  };
6895
- const o$H = {
7137
+ const o$G = {
6896
7138
  category: "general",
6897
7139
  description: "Slot is a container for content that you want to reference across the project. Changes made to a Slot's children will be reflected in all other instances of that Slot.",
6898
7140
  icon: SlotComponentIcon,
@@ -6984,7 +7226,8 @@ const a$5 = {
6984
7226
  required: true,
6985
7227
  control: "code",
6986
7228
  language: "markdown",
6987
- type: "string"
7229
+ type: "string",
7230
+ contentMode: true
6988
7231
  }
6989
7232
  }
6990
7233
  };
@@ -7190,11 +7433,11 @@ var button = [
7190
7433
  { property: "text-transform", value: { type: "keyword", value: "none" } }
7191
7434
  ];
7192
7435
  var select = button;
7193
- const o$G = {};
7436
+ const o$F = {};
7194
7437
  const i$9 = {
7195
7438
  presetStyle: { body },
7196
7439
  initialProps: ["id", "class"],
7197
- props: o$G
7440
+ props: o$F
7198
7441
  };
7199
7442
  const t$g = {
7200
7443
  tag: { required: false, control: "text", type: "string" }
@@ -7283,11 +7526,11 @@ const m$8 = {
7283
7526
  }
7284
7527
  }
7285
7528
  };
7286
- const o$F = {};
7529
+ const o$E = {};
7287
7530
  const i$8 = {
7288
7531
  presetStyle: { p: p$8 },
7289
7532
  initialProps: ["id", "class"],
7290
- props: o$F
7533
+ props: o$E
7291
7534
  };
7292
7535
  const e$t = {
7293
7536
  download: {
@@ -7330,54 +7573,55 @@ const t$d = {
7330
7573
  href: {
7331
7574
  type: "string",
7332
7575
  control: "url",
7333
- required: false
7576
+ required: false,
7577
+ contentMode: true
7334
7578
  }
7335
7579
  }
7336
7580
  };
7337
7581
  const a$3 = p$7;
7338
- const o$E = {};
7582
+ const o$D = {};
7339
7583
  const e$s = {
7340
7584
  label: "Text",
7341
7585
  icon: PaintBrushIcon,
7342
7586
  presetStyle: { span },
7343
7587
  initialProps: ["id", "class"],
7344
- props: o$E
7588
+ props: o$D
7345
7589
  };
7346
- const o$D = {};
7590
+ const o$C = {};
7347
7591
  const p$6 = {
7348
7592
  label: "Bold Text",
7349
7593
  presetStyle: { b: b$4 },
7350
7594
  initialProps: ["id", "class"],
7351
- props: o$D
7595
+ props: o$C
7352
7596
  };
7353
- const o$C = {};
7597
+ const o$B = {};
7354
7598
  const e$r = {
7355
7599
  label: "Italic Text",
7356
7600
  presetStyle: { i: i$a },
7357
7601
  initialProps: ["id", "class"],
7358
- props: o$C
7602
+ props: o$B
7359
7603
  };
7360
- const o$B = {};
7361
- const o$A = {
7604
+ const o$A = {};
7605
+ const o$z = {
7362
7606
  label: "Superscript Text",
7363
7607
  presetStyle: { sup },
7364
7608
  initialProps: ["id", "class"],
7365
- props: o$B
7609
+ props: o$A
7366
7610
  };
7367
- const o$z = {};
7368
- const s$4 = {
7611
+ const o$y = {};
7612
+ const s$3 = {
7369
7613
  label: "Subscript Text",
7370
7614
  presetStyle: { sub },
7371
7615
  initialProps: ["id", "class"],
7372
- props: o$z
7616
+ props: o$y
7373
7617
  };
7374
- const o$y = {};
7618
+ const o$x = {};
7375
7619
  const e$q = {
7376
7620
  presetStyle: { button },
7377
7621
  initialProps: ["id", "class", "type", "aria-label"],
7378
- props: o$y
7622
+ props: o$x
7379
7623
  };
7380
- const o$x = {};
7624
+ const o$w = {};
7381
7625
  const p$5 = {
7382
7626
  input: [
7383
7627
  ...input,
@@ -7386,7 +7630,7 @@ const p$5 = {
7386
7630
  value: { type: "keyword", value: "block" }
7387
7631
  }
7388
7632
  ]
7389
- }, l$5 = {
7633
+ }, l$6 = {
7390
7634
  label: "Text Input",
7391
7635
  presetStyle: p$5,
7392
7636
  initialProps: [
@@ -7399,7 +7643,7 @@ const p$5 = {
7399
7643
  "required",
7400
7644
  "autofocus"
7401
7645
  ],
7402
- props: o$x
7646
+ props: o$w
7403
7647
  };
7404
7648
  const e$p = {
7405
7649
  state: {
@@ -7432,17 +7676,17 @@ const c$4 = {
7432
7676
  }
7433
7677
  }
7434
7678
  };
7435
- const o$w = {};
7436
- const r$c = {
7679
+ const o$v = {};
7680
+ const r$d = {
7437
7681
  form: [
7438
7682
  ...form,
7439
7683
  { property: "min-height", value: { type: "unit", unit: "px", value: 20 } }
7440
7684
  ]
7441
7685
  }, p$4 = {
7442
7686
  label: "Form",
7443
- presetStyle: r$c,
7687
+ presetStyle: r$d,
7444
7688
  initialProps: ["id", "class", "action"],
7445
- props: o$w
7689
+ props: o$v
7446
7690
  };
7447
7691
  const e$o = {
7448
7692
  optimize: {
@@ -7454,7 +7698,7 @@ const e$o = {
7454
7698
  },
7455
7699
  quality: { required: false, control: "number", type: "number" }
7456
7700
  };
7457
- const o$v = {
7701
+ const r$c = {
7458
7702
  img: [
7459
7703
  ...img,
7460
7704
  // Otherwise on new image insert onto canvas it can overfit screen size multiple times
@@ -7479,7 +7723,7 @@ const o$v = {
7479
7723
  }, i$7 = {
7480
7724
  category: "media",
7481
7725
  description: "Add an image asset to the page. Webstudio automatically converts images to WebP or AVIF format and makes them responsive for best performance.",
7482
- presetStyle: o$v,
7726
+ presetStyle: r$c,
7483
7727
  order: 0,
7484
7728
  initialProps: [
7485
7729
  "id",
@@ -7499,7 +7743,26 @@ const o$v = {
7499
7743
  control: "file",
7500
7744
  label: "Source",
7501
7745
  required: false,
7502
- accept: "image/*"
7746
+ accept: "image/*",
7747
+ contentMode: true
7748
+ },
7749
+ width: {
7750
+ type: "number",
7751
+ control: "number",
7752
+ required: false,
7753
+ contentMode: true
7754
+ },
7755
+ height: {
7756
+ type: "number",
7757
+ control: "number",
7758
+ required: false,
7759
+ contentMode: true
7760
+ },
7761
+ alt: {
7762
+ type: "string",
7763
+ control: "text",
7764
+ required: false,
7765
+ contentMode: true
7503
7766
  }
7504
7767
  }
7505
7768
  };
@@ -7596,7 +7859,7 @@ const t$c = {
7596
7859
  value: { type: "keyword", value: "40px" }
7597
7860
  }
7598
7861
  ]
7599
- }, l$4 = {
7862
+ }, l$5 = {
7600
7863
  presetStyle: t$c,
7601
7864
  initialProps: ["id", "class", "ordered", "start", "reversed"],
7602
7865
  props: e$m
@@ -7712,7 +7975,7 @@ const t$a = {
7712
7975
  value: { type: "keyword", value: "block" }
7713
7976
  }
7714
7977
  ]
7715
- }, l$3 = {
7978
+ }, l$4 = {
7716
7979
  label: "Text Area",
7717
7980
  presetStyle: t$a,
7718
7981
  contentModel: {
@@ -7960,7 +8223,7 @@ const i$6 = [
7960
8223
  "showControls",
7961
8224
  "controlsColor",
7962
8225
  "playsinline"
7963
- ], s$3 = {
8226
+ ], s$2 = {
7964
8227
  icon: VimeoIcon,
7965
8228
  contentModel: {
7966
8229
  category: "instance",
@@ -7969,7 +8232,13 @@ const i$6 = [
7969
8232
  },
7970
8233
  presetStyle: { div },
7971
8234
  initialProps: i$6,
7972
- props: e$i
8235
+ props: {
8236
+ ...e$i,
8237
+ url: {
8238
+ ...e$i.url,
8239
+ contentMode: true
8240
+ }
8241
+ }
7973
8242
  };
7974
8243
  const e$h = {
7975
8244
  allowFullscreen: {
@@ -8136,7 +8405,7 @@ https://support.google.com/youtube/answer/171780?hl=en#zippy=%2Cturn-on-privacy-
8136
8405
  type: "string"
8137
8406
  }
8138
8407
  };
8139
- const n$5 = [
8408
+ const i$5 = [
8140
8409
  "id",
8141
8410
  "className",
8142
8411
  "url",
@@ -8164,7 +8433,7 @@ const n$5 = [
8164
8433
  "language",
8165
8434
  "color",
8166
8435
  "playlist"
8167
- ], s$2 = {
8436
+ ], l$3 = {
8168
8437
  icon: YoutubeIcon,
8169
8438
  contentModel: {
8170
8439
  category: "instance",
@@ -8172,8 +8441,14 @@ const n$5 = [
8172
8441
  descendants: ["VimeoSpinner", "VimeoPlayButton", "VimeoPreviewImage"]
8173
8442
  },
8174
8443
  presetStyle: { div },
8175
- initialProps: n$5,
8176
- props: e$h
8444
+ initialProps: i$5,
8445
+ props: {
8446
+ ...e$h,
8447
+ url: {
8448
+ ...e$h.url,
8449
+ contentMode: true
8450
+ }
8451
+ }
8177
8452
  };
8178
8453
  const e$g = {
8179
8454
  optimize: {
@@ -8184,7 +8459,7 @@ const e$g = {
8184
8459
  },
8185
8460
  quality: { required: false, control: "number", type: "number" }
8186
8461
  };
8187
- const i$5 = {
8462
+ const i$4 = {
8188
8463
  ...i$7,
8189
8464
  category: "hidden",
8190
8465
  label: "Preview Image",
@@ -8200,7 +8475,8 @@ const i$5 = {
8200
8475
  type: "string",
8201
8476
  control: "file",
8202
8477
  label: "Source",
8203
- required: false
8478
+ required: false,
8479
+ contentMode: true
8204
8480
  }
8205
8481
  }
8206
8482
  };
@@ -8620,7 +8896,35 @@ const r$9 = {
8620
8896
  "timeStyle",
8621
8897
  "format"
8622
8898
  ],
8623
- props: e$d
8899
+ props: {
8900
+ ...e$d,
8901
+ datetime: {
8902
+ type: "string",
8903
+ control: "text",
8904
+ required: false,
8905
+ contentMode: true
8906
+ },
8907
+ language: {
8908
+ ...e$d.language,
8909
+ contentMode: true
8910
+ },
8911
+ country: {
8912
+ ...e$d.country,
8913
+ contentMode: true
8914
+ },
8915
+ dateStyle: {
8916
+ ...e$d.dateStyle,
8917
+ contentMode: true
8918
+ },
8919
+ timeStyle: {
8920
+ ...e$d.timeStyle,
8921
+ contentMode: true
8922
+ },
8923
+ format: {
8924
+ ...e$d.format,
8925
+ contentMode: true
8926
+ }
8927
+ }
8624
8928
  };
8625
8929
  const o$k = {};
8626
8930
  const o$j = {
@@ -8716,7 +9020,7 @@ const r$7 = {
8716
9020
  props: o$e
8717
9021
  };
8718
9022
  const o$d = {};
8719
- const i$4 = {
9023
+ const n$5 = {
8720
9024
  icon: VideoIcon,
8721
9025
  contentModel: {
8722
9026
  category: "instance",
@@ -8751,7 +9055,20 @@ const i$4 = {
8751
9055
  control: "file",
8752
9056
  label: "Source",
8753
9057
  required: false,
8754
- accept: ".mp4,.webm,.mpg,.mpeg,.mov"
9058
+ accept: ".mp4,.webm,.mpg,.mpeg,.mov",
9059
+ contentMode: true
9060
+ },
9061
+ width: {
9062
+ type: "number",
9063
+ control: "number",
9064
+ required: false,
9065
+ contentMode: true
9066
+ },
9067
+ height: {
9068
+ type: "number",
9069
+ control: "number",
9070
+ required: false,
9071
+ contentMode: true
8755
9072
  }
8756
9073
  }
8757
9074
  };
@@ -8773,11 +9090,11 @@ const baseComponentMetas = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.
8773
9090
  Heading: m$8,
8774
9091
  HtmlEmbed: a$6,
8775
9092
  Image: i$7,
8776
- Input: l$5,
9093
+ Input: l$6,
8777
9094
  Italic: e$r,
8778
9095
  Label: t$b,
8779
9096
  Link: p$7,
8780
- List: l$4,
9097
+ List: l$5,
8781
9098
  ListItem: p$3,
8782
9099
  MarkdownEmbed: a$5,
8783
9100
  Option: a$1,
@@ -8787,21 +9104,21 @@ const baseComponentMetas = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.
8787
9104
  RichTextLink: a$3,
8788
9105
  Select: p$2,
8789
9106
  Separator: y$2,
8790
- Slot: o$H,
9107
+ Slot: o$G,
8791
9108
  Span: e$s,
8792
- Subscript: s$4,
8793
- Superscript: o$A,
9109
+ Subscript: s$3,
9110
+ Superscript: o$z,
8794
9111
  Text: n$6,
8795
- Textarea: l$3,
9112
+ Textarea: l$4,
8796
9113
  Time: r$9,
8797
- Video: i$4,
8798
- Vimeo: s$3,
9114
+ Video: n$5,
9115
+ Vimeo: s$2,
8799
9116
  VimeoPlayButton: c$2,
8800
- VimeoPreviewImage: i$5,
9117
+ VimeoPreviewImage: i$4,
8801
9118
  VimeoSpinner: c$1,
8802
9119
  XmlNode: m$5,
8803
9120
  XmlTime: a$2,
8804
- YouTube: s$2
9121
+ YouTube: l$3
8805
9122
  }, Symbol.toStringTag, { value: "Module" }));
8806
9123
  //! SPDX-License-Identifier: LicenseRef-Webstudio,Inc-Proprietary
8807
9124
  const l$1 = (n2) => new Proxy({}, { get(w2, t2) {
@@ -10381,7 +10698,7 @@ audit=false
10381
10698
  fund=false
10382
10699
  `;
10383
10700
  const prebuild = async (options) => {
10384
- var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j, _k;
10701
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j;
10385
10702
  if (options.template.length === 0) {
10386
10703
  log.error(
10387
10704
  `Template is not provided
@@ -10430,6 +10747,8 @@ Please check webstudio --help for more details`
10430
10747
  const usedMetas = new Map(
10431
10748
  Object.entries(coreMetas)
10432
10749
  );
10750
+ const pages = migratePages(siteData.build.pages);
10751
+ const allPages = getAllPages(pages);
10433
10752
  const siteDataByPage = {};
10434
10753
  const fontAssetsByPage = {};
10435
10754
  const backgroundImageAssetsByPage = {};
@@ -10438,10 +10757,10 @@ Please check webstudio --help for more details`
10438
10757
  assetBaseUrl,
10439
10758
  assets: new Map(siteData.assets.map((asset) => [asset.id, asset])),
10440
10759
  uploadingImageAssets: [],
10441
- pages: siteData.build.pages,
10760
+ pages,
10442
10761
  source: "prebuild"
10443
10762
  });
10444
- for (const page of Object.values(siteData.pages)) {
10763
+ for (const page of allPages) {
10445
10764
  const instanceMap = new Map(siteData.build.instances);
10446
10765
  const pageInstanceSet = findTreeInstanceIds(
10447
10766
  instanceMap,
@@ -10490,7 +10809,7 @@ Please check webstudio --help for more details`
10490
10809
  dataSources,
10491
10810
  resources
10492
10811
  },
10493
- pages: siteData.pages,
10812
+ pages: allPages,
10494
10813
  page,
10495
10814
  assets: siteData.assets
10496
10815
  };
@@ -10547,10 +10866,10 @@ Please check webstudio --help for more details`
10547
10866
  // pass only used metas to not generate unused preset styles
10548
10867
  componentMetas: usedMetas,
10549
10868
  assetBaseUrl,
10550
- atomic: ((_g2 = siteData.build.pages.compiler) == null ? void 0 : _g2.atomicStyles) ?? true
10869
+ atomic: ((_g2 = pages.compiler) == null ? void 0 : _g2.atomicStyles) ?? true
10551
10870
  });
10552
10871
  await createFileIfNotExists(join(generatedDir, "index.css"), cssText);
10553
- for (const page of Object.values(siteData.pages)) {
10872
+ for (const page of allPages) {
10554
10873
  const scope = createScope([
10555
10874
  // manually maintained list of occupied identifiers
10556
10875
  "useState",
@@ -10644,13 +10963,13 @@ Please check webstudio --help for more details`
10644
10963
  metas: usedMetas,
10645
10964
  tagsOverrides: framework.tags
10646
10965
  });
10647
- const projectMeta = siteData.build.pages.meta;
10966
+ const projectMeta = pages.meta;
10648
10967
  const contactEmail = (
10649
10968
  // fallback to user email when contact email is empty string
10650
10969
  (projectMeta == null ? void 0 : projectMeta.contactEmail) || ((_i2 = siteData.user) == null ? void 0 : _i2.email) || void 0
10651
10970
  );
10652
10971
  const favIconAsset = (_j = assets.get((projectMeta == null ? void 0 : projectMeta.faviconAssetId) ?? "")) == null ? void 0 : _j.name;
10653
- const pagePath = getPagePath(page.id, siteData.build.pages);
10972
+ const pagePath = getPagePath(page.id, pages);
10654
10973
  const breakpoints = siteData.build.breakpoints.map(([_, value]) => ({
10655
10974
  id: value.id,
10656
10975
  minWidth: value.minWidth,
@@ -10770,7 +11089,7 @@ Please check webstudio --help for more details`
10770
11089
  join(generatedDir, "$resources.sitemap.xml.ts"),
10771
11090
  `
10772
11091
  export const sitemap = ${JSON.stringify(
10773
- getStaticSiteMapXml(siteData.build.pages, siteData.build.updatedAt),
11092
+ getStaticSiteMapXml(pages, siteData.build.updatedAt),
10774
11093
  null,
10775
11094
  2
10776
11095
  )};
@@ -10788,7 +11107,7 @@ Please check webstudio --help for more details`
10788
11107
  export const assets = ${JSON.stringify(assetsById, null, 2)};
10789
11108
  `
10790
11109
  );
10791
- const redirects = (_k = siteData.build.pages) == null ? void 0 : _k.redirects;
11110
+ const redirects = pages.redirects;
10792
11111
  if (redirects !== void 0 && redirects.length > 0) {
10793
11112
  for (const redirect of redirects) {
10794
11113
  const generatedBasename = generateRemixRoute(redirect.old);
@@ -10963,7 +11282,7 @@ const getDeploymentInstructions = (deployTarget) => {
10963
11282
  }
10964
11283
  };
10965
11284
  const name = "webstudio";
10966
- const version = "0.264.0";
11285
+ const version = "0.265.0";
10967
11286
  const description = "Webstudio CLI";
10968
11287
  const author = "Webstudio <github@webstudio.is>";
10969
11288
  const homepage = "https://webstudio.is";
@@ -10974,7 +11293,7 @@ const files = ["lib/*", "templates/*", "bin.js", "!*.{test,stories}.*"];
10974
11293
  const scripts = { "typecheck": "tsgo --noEmit", "build": "rm -rf lib && vite build", "test": "vitest run" };
10975
11294
  const license = "AGPL-3.0-or-later";
10976
11295
  const engines = { "node": ">=22" };
10977
- const dependencies = { "@clack/prompts": "^0.10.0", "@emotion/hash": "^0.9.2", "acorn": "^8.14.1", "acorn-walk": "^8.3.4", "change-case": "^5.4.4", "deepmerge": "^4.3.1", "env-paths": "^3.0.0", "nanoid": "^5.1.5", "p-limit": "^6.2.0", "parse5": "7.3.0", "picocolors": "^1.1.1", "reserved-identifiers": "^1.0.0", "tinyexec": "^0.3.2", "warn-once": "^0.1.1", "yargs": "^17.7.2", "zod": "^3.24.2" };
11296
+ const dependencies = { "@clack/prompts": "^0.10.0", "@emotion/hash": "^0.9.2", "@trpc/client": "^10.45.2", "acorn": "^8.14.1", "acorn-walk": "^8.3.4", "change-case": "^5.4.4", "deepmerge": "^4.3.1", "env-paths": "^3.0.0", "nanoid": "^5.1.5", "p-limit": "^6.2.0", "parse5": "7.3.0", "picocolors": "^1.1.1", "reserved-identifiers": "^1.0.0", "tinyexec": "^0.3.2", "warn-once": "^0.1.1", "yargs": "^17.7.2", "zod": "^3.24.2" };
10978
11297
  const devDependencies = { "@cloudflare/vite-plugin": "^1.1.0", "@netlify/vite-plugin-react-router": "^1.0.1", "@react-router/dev": "^7.5.3", "@react-router/fs-routes": "^7.5.3", "@remix-run/cloudflare": "^2.16.5", "@remix-run/cloudflare-pages": "^2.16.5", "@remix-run/dev": "^2.16.5", "@remix-run/node": "^2.16.5", "@remix-run/react": "^2.16.5", "@remix-run/server-runtime": "^2.16.5", "@types/react": "^18.2.70", "@types/react-dom": "^18.2.25", "@types/yargs": "^17.0.33", "@vercel/react-router": "^1.1.0", "@vitejs/plugin-react": "^4.4.1", "@webstudio-is/css-engine": "workspace:*", "@webstudio-is/http-client": "workspace:*", "@webstudio-is/image": "workspace:*", "@webstudio-is/react-sdk": "workspace:*", "@webstudio-is/sdk": "workspace:*", "@webstudio-is/sdk-components-animation": "workspace:*", "@webstudio-is/sdk-components-react": "workspace:*", "@webstudio-is/sdk-components-react-radix": "workspace:*", "@webstudio-is/sdk-components-react-remix": "workspace:*", "@webstudio-is/sdk-components-react-router": "workspace:*", "@webstudio-is/tsconfig": "workspace:*", "h3": "^1.15.1", "ipx": "^3.0.3", "isbot": "^5.1.25", "prettier": "3.5.3", "react": "18.3.0-canary-14898b6a9-20240318", "react-dom": "18.3.0-canary-14898b6a9-20240318", "react-router": "^7.5.3", "ts-expect": "^1.3.0", "vike": "^0.4.229", "vite": "^6.3.4", "vitest": "^3.1.2", "wrangler": "^3.63.2" };
10979
11298
  const packageJson = {
10980
11299
  name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webstudio",
3
- "version": "0.264.0",
3
+ "version": "0.265.0",
4
4
  "description": "Webstudio CLI",
5
5
  "author": "Webstudio <github@webstudio.is>",
6
6
  "homepage": "https://webstudio.is",
@@ -28,6 +28,7 @@
28
28
  "dependencies": {
29
29
  "@clack/prompts": "^0.10.0",
30
30
  "@emotion/hash": "^0.9.2",
31
+ "@trpc/client": "^10.45.2",
31
32
  "acorn": "^8.14.1",
32
33
  "acorn-walk": "^8.3.4",
33
34
  "change-case": "^5.4.4",
@@ -71,16 +72,16 @@
71
72
  "vite": "^6.3.4",
72
73
  "vitest": "^3.1.2",
73
74
  "wrangler": "^3.63.2",
74
- "@webstudio-is/css-engine": "0.264.0",
75
- "@webstudio-is/http-client": "0.264.0",
76
- "@webstudio-is/react-sdk": "0.264.0",
77
- "@webstudio-is/sdk": "0.264.0",
78
- "@webstudio-is/image": "0.264.0",
79
- "@webstudio-is/sdk-components-animation": "0.264.0",
80
- "@webstudio-is/sdk-components-react": "0.264.0",
81
- "@webstudio-is/sdk-components-react-radix": "0.264.0",
82
- "@webstudio-is/sdk-components-react-remix": "0.264.0",
83
- "@webstudio-is/sdk-components-react-router": "0.264.0",
75
+ "@webstudio-is/css-engine": "0.265.0",
76
+ "@webstudio-is/react-sdk": "0.265.0",
77
+ "@webstudio-is/image": "0.265.0",
78
+ "@webstudio-is/sdk": "0.265.0",
79
+ "@webstudio-is/sdk-components-animation": "0.265.0",
80
+ "@webstudio-is/sdk-components-react": "0.265.0",
81
+ "@webstudio-is/sdk-components-react-radix": "0.265.0",
82
+ "@webstudio-is/sdk-components-react-remix": "0.265.0",
83
+ "@webstudio-is/http-client": "0.265.0",
84
+ "@webstudio-is/sdk-components-react-router": "0.265.0",
84
85
  "@webstudio-is/tsconfig": "1.0.7"
85
86
  },
86
87
  "scripts": {
@@ -11,13 +11,13 @@
11
11
  "@remix-run/node": "2.16.5",
12
12
  "@remix-run/react": "2.16.5",
13
13
  "@remix-run/server-runtime": "2.16.5",
14
- "@webstudio-is/image": "0.264.0",
15
- "@webstudio-is/react-sdk": "0.264.0",
16
- "@webstudio-is/sdk": "0.264.0",
17
- "@webstudio-is/sdk-components-react": "0.264.0",
18
- "@webstudio-is/sdk-components-animation": "0.264.0",
19
- "@webstudio-is/sdk-components-react-radix": "0.264.0",
20
- "@webstudio-is/sdk-components-react-remix": "0.264.0",
14
+ "@webstudio-is/image": "0.265.0",
15
+ "@webstudio-is/react-sdk": "0.265.0",
16
+ "@webstudio-is/sdk": "0.265.0",
17
+ "@webstudio-is/sdk-components-react": "0.265.0",
18
+ "@webstudio-is/sdk-components-animation": "0.265.0",
19
+ "@webstudio-is/sdk-components-react-radix": "0.265.0",
20
+ "@webstudio-is/sdk-components-react-remix": "0.265.0",
21
21
  "isbot": "^5.1.25",
22
22
  "react": "18.3.0-canary-14898b6a9-20240318",
23
23
  "react-dom": "18.3.0-canary-14898b6a9-20240318"
@@ -10,13 +10,13 @@
10
10
  "dependencies": {
11
11
  "@react-router/dev": "^7.5.3",
12
12
  "@react-router/fs-routes": "^7.5.3",
13
- "@webstudio-is/image": "0.264.0",
14
- "@webstudio-is/react-sdk": "0.264.0",
15
- "@webstudio-is/sdk": "0.264.0",
16
- "@webstudio-is/sdk-components-animation": "0.264.0",
17
- "@webstudio-is/sdk-components-react-radix": "0.264.0",
18
- "@webstudio-is/sdk-components-react-router": "0.264.0",
19
- "@webstudio-is/sdk-components-react": "0.264.0",
13
+ "@webstudio-is/image": "0.265.0",
14
+ "@webstudio-is/react-sdk": "0.265.0",
15
+ "@webstudio-is/sdk": "0.265.0",
16
+ "@webstudio-is/sdk-components-animation": "0.265.0",
17
+ "@webstudio-is/sdk-components-react-radix": "0.265.0",
18
+ "@webstudio-is/sdk-components-react-router": "0.265.0",
19
+ "@webstudio-is/sdk-components-react": "0.265.0",
20
20
  "isbot": "^5.1.25",
21
21
  "react": "18.3.0-canary-14898b6a9-20240318",
22
22
  "react-dom": "18.3.0-canary-14898b6a9-20240318",
@@ -8,12 +8,12 @@
8
8
  "typecheck": "tsgo --noEmit"
9
9
  },
10
10
  "dependencies": {
11
- "@webstudio-is/image": "0.264.0",
12
- "@webstudio-is/react-sdk": "0.264.0",
13
- "@webstudio-is/sdk": "0.264.0",
14
- "@webstudio-is/sdk-components-react": "0.264.0",
15
- "@webstudio-is/sdk-components-animation": "0.264.0",
16
- "@webstudio-is/sdk-components-react-radix": "0.264.0",
11
+ "@webstudio-is/image": "0.265.0",
12
+ "@webstudio-is/react-sdk": "0.265.0",
13
+ "@webstudio-is/sdk": "0.265.0",
14
+ "@webstudio-is/sdk-components-react": "0.265.0",
15
+ "@webstudio-is/sdk-components-animation": "0.265.0",
16
+ "@webstudio-is/sdk-components-react-radix": "0.265.0",
17
17
  "react": "18.3.0-canary-14898b6a9-20240318",
18
18
  "react-dom": "18.3.0-canary-14898b6a9-20240318",
19
19
  "vike": "^0.4.229"