webstudio 0.212.0 → 0.214.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
@@ -2445,7 +2445,7 @@ var Json = z.object({
2445
2445
  type: z.literal("json"),
2446
2446
  defaultValue: z.unknown().optional()
2447
2447
  });
2448
- var Date = z.object({
2448
+ var Date$1 = z.object({
2449
2449
  ...common,
2450
2450
  control: z.literal("date"),
2451
2451
  // @todo not sure what type should be here
@@ -2490,7 +2490,7 @@ var PropMeta = z.union([
2490
2490
  File,
2491
2491
  Url,
2492
2492
  Json,
2493
- Date,
2493
+ Date$1,
2494
2494
  Action,
2495
2495
  TextContent,
2496
2496
  AnimationAction
@@ -2617,19 +2617,36 @@ var defaultStates = [
2617
2617
  { selector: ":focus-visible", label: "Focus Visible" },
2618
2618
  { selector: ":focus-within", label: "Focus Within" }
2619
2619
  ];
2620
+ var ContentModel = z.object({
2621
+ /*
2622
+ * instance - accepted by any parent with "instance" in children categories
2623
+ * none - accepted by parents with this component name in children categories
2624
+ */
2625
+ category: z.union([z.literal("instance"), z.literal("none")]),
2626
+ /**
2627
+ * transparent - pass through possible children from parent
2628
+ * rich-text - can be edited as rich text
2629
+ * instance - other instances accepted
2630
+ * empty - no children accepted
2631
+ * ComponentName - accept specific components with none category
2632
+ */
2633
+ children: z.array(
2634
+ z.string()
2635
+ )
2636
+ });
2620
2637
  z.object({
2621
2638
  category: z.enum(componentCategories).optional(),
2622
2639
  // container - can accept other components with dnd or be edited as text
2623
2640
  // control - usually form controls like inputs, without children
2624
2641
  // embed - images, videos or other embeddable components, without children
2625
- // rich-text-child - formatted text fragment, not listed in components list
2626
- type: z.enum(["container", "control", "embed", "rich-text-child"]),
2642
+ type: z.enum(["container", "control", "embed"]),
2627
2643
  /**
2628
2644
  * a property used as textual placeholder when no content specified while in builder
2629
2645
  * also signals to not insert components inside unless dropped explicitly
2630
2646
  */
2631
2647
  placeholder: z.string().optional(),
2632
2648
  constraints: Matchers.optional(),
2649
+ contentModel: ContentModel.optional(),
2633
2650
  // when this field is specified component receives
2634
2651
  // prop with index of same components withiin specified ancestor
2635
2652
  // important to automatically enumerate collections without
@@ -2685,37 +2702,32 @@ var descendantMeta = {
2685
2702
  type: "control",
2686
2703
  label: "Descendant",
2687
2704
  icon: PaintBrushIcon,
2705
+ contentModel: {
2706
+ category: "none",
2707
+ children: ["empty"]
2708
+ },
2688
2709
  // @todo infer possible presets
2689
- presetStyle: {},
2690
- constraints: {
2691
- relation: "parent",
2692
- component: { $in: ["HtmlEmbed", "MarkdownEmbed"] }
2693
- }
2710
+ presetStyle: {}
2694
2711
  };
2695
2712
  var blockComponent = "ws:block";
2696
2713
  var blockTemplateComponent = "ws:block-template";
2697
2714
  var blockTemplateMeta = {
2698
2715
  type: "container",
2699
2716
  icon: AddTemplateInstanceIcon,
2700
- constraints: {
2701
- relation: "parent",
2702
- component: { $eq: blockComponent }
2717
+ contentModel: {
2718
+ category: "none",
2719
+ children: ["instance"]
2703
2720
  }
2704
2721
  };
2705
2722
  var blockMeta = {
2706
2723
  type: "container",
2707
2724
  label: "Content Block",
2708
2725
  icon: ContentBlockIcon,
2709
- constraints: [
2710
- {
2711
- relation: "ancestor",
2712
- component: { $nin: [collectionComponent, blockComponent] }
2713
- },
2714
- {
2715
- relation: "child",
2716
- component: { $eq: blockTemplateComponent }
2717
- }
2718
- ]
2726
+ contentModel: {
2727
+ category: "instance",
2728
+ children: [blockTemplateComponent, "instance"]
2729
+ // @todo prevent deleting block template
2730
+ }
2719
2731
  };
2720
2732
  var coreMetas = {
2721
2733
  [rootComponent]: rootMeta,
@@ -4654,7 +4666,7 @@ const e$5 = {
4654
4666
  icon: SlotComponentIcon,
4655
4667
  order: 5
4656
4668
  };
4657
- const o$4 = {
4669
+ const o$5 = {
4658
4670
  type: "container",
4659
4671
  icon: ""
4660
4672
  };
@@ -4668,25 +4680,29 @@ const e$4 = {
4668
4680
  type: "boolean"
4669
4681
  }
4670
4682
  };
4671
- const i$4 = {
4672
- div: [
4673
- {
4674
- property: "display",
4675
- value: { type: "keyword", value: "contents" }
4676
- },
4677
- {
4678
- property: "white-space-collapse",
4679
- value: { type: "keyword", value: "collapse" }
4680
- }
4681
- ]
4682
- }, a$d = {
4683
+ const r$b = {
4683
4684
  category: "general",
4684
- type: "embed",
4685
+ type: "container",
4685
4686
  label: "HTML Embed",
4686
4687
  description: "Used to add HTML code to the page, such as an SVG or script.",
4687
4688
  icon: EmbedIcon,
4688
- presetStyle: i$4,
4689
- order: 2
4689
+ order: 2,
4690
+ contentModel: {
4691
+ category: "instance",
4692
+ children: [descendantComponent]
4693
+ },
4694
+ presetStyle: {
4695
+ div: [
4696
+ {
4697
+ property: "display",
4698
+ value: { type: "keyword", value: "contents" }
4699
+ },
4700
+ {
4701
+ property: "white-space-collapse",
4702
+ value: { type: "keyword", value: "collapse" }
4703
+ }
4704
+ ]
4705
+ }
4690
4706
  };
4691
4707
  ({
4692
4708
  props: {
@@ -4709,9 +4725,13 @@ const i$4 = {
4709
4725
  },
4710
4726
  initialProps: ["className", "clientOnly", "executeScriptOnCanvas"]
4711
4727
  });
4712
- const t$1 = {
4713
- type: "embed",
4728
+ const a$b = {
4729
+ type: "container",
4714
4730
  icon: MarkdownEmbedIcon,
4731
+ contentModel: {
4732
+ category: "instance",
4733
+ children: [descendantComponent]
4734
+ },
4715
4735
  presetStyle: {
4716
4736
  div: [
4717
4737
  {
@@ -4763,13 +4783,13 @@ var h3 = div;
4763
4783
  var h4 = div;
4764
4784
  var h5 = div;
4765
4785
  var h6 = div;
4766
- var i$3 = div;
4786
+ var i$2 = div;
4767
4787
  var img = div;
4768
- var a$c = div;
4788
+ var a$a = div;
4769
4789
  var li = div;
4770
4790
  var ul = div;
4771
4791
  var ol = div;
4772
- var p$a = div;
4792
+ var p$9 = div;
4773
4793
  var span = div;
4774
4794
  var body = [
4775
4795
  { property: "margin-top", value: { type: "unit", unit: "number", value: 0 } },
@@ -5080,7 +5100,7 @@ var button = [
5080
5100
  { property: "text-transform", value: { type: "keyword", value: "none" } }
5081
5101
  ];
5082
5102
  var select = button;
5083
- const a$b = {
5103
+ const a$9 = {
5084
5104
  body: [
5085
5105
  ...body,
5086
5106
  {
@@ -5096,7 +5116,7 @@ const a$b = {
5096
5116
  type: "container",
5097
5117
  icon: BodyIcon,
5098
5118
  states: defaultStates,
5099
- presetStyle: a$b
5119
+ presetStyle: a$9
5100
5120
  };
5101
5121
  const v$2 = {
5102
5122
  category: "general",
@@ -5118,7 +5138,7 @@ const v$2 = {
5118
5138
  },
5119
5139
  order: 0
5120
5140
  };
5121
- const s$4 = {
5141
+ const s$6 = {
5122
5142
  type: "container",
5123
5143
  icon: TextIcon,
5124
5144
  states: defaultStates,
@@ -5146,18 +5166,18 @@ const d$6 = {
5146
5166
  h6
5147
5167
  }
5148
5168
  };
5149
- const p$9 = {
5150
- p: p$a
5169
+ const p$8 = {
5170
+ p: p$9
5151
5171
  }, n$6 = {
5152
5172
  type: "container",
5153
5173
  placeholder: "Paragraph",
5154
5174
  icon: TextAlignLeftIcon,
5155
5175
  states: defaultStates,
5156
- presetStyle: p$9
5176
+ presetStyle: p$8
5157
5177
  };
5158
- const a$a = {
5178
+ const a$8 = {
5159
5179
  a: [
5160
- ...a$c,
5180
+ ...a$a,
5161
5181
  {
5162
5182
  property: "display",
5163
5183
  value: { type: "keyword", value: "inline-block" }
@@ -5167,7 +5187,7 @@ const a$a = {
5167
5187
  type: "container",
5168
5188
  placeholder: "Link",
5169
5189
  icon: LinkIcon,
5170
- presetStyle: a$a,
5190
+ presetStyle: a$8,
5171
5191
  states: [
5172
5192
  ...defaultStates,
5173
5193
  {
@@ -5181,47 +5201,47 @@ const a$a = {
5181
5201
  }
5182
5202
  ]
5183
5203
  };
5184
- const a$9 = {
5204
+ const o$4 = {
5185
5205
  ...n$5,
5186
- type: "rich-text-child"
5206
+ type: "container"
5187
5207
  };
5188
- const s$3 = {
5208
+ const s$5 = {
5189
5209
  span
5190
- }, c$7 = {
5191
- type: "rich-text-child",
5210
+ }, n$4 = {
5211
+ type: "container",
5192
5212
  label: "Text",
5193
5213
  icon: PaintBrushIcon,
5194
5214
  states: defaultStates,
5195
- presetStyle: s$3
5215
+ presetStyle: s$5
5196
5216
  };
5197
- const p$8 = {
5217
+ const p$7 = {
5198
5218
  b: b$8
5199
5219
  }, l$6 = {
5200
- type: "rich-text-child",
5220
+ type: "container",
5201
5221
  label: "Bold Text",
5202
5222
  icon: BoldIcon,
5203
5223
  states: defaultStates,
5204
- presetStyle: p$8
5224
+ presetStyle: p$7
5205
5225
  };
5206
- const r$d = {
5226
+ const i$1 = {
5207
5227
  i: [
5208
- ...i$3,
5228
+ ...i$2,
5209
5229
  {
5210
5230
  property: "font-style",
5211
5231
  value: { type: "keyword", value: "italic" }
5212
5232
  }
5213
5233
  ]
5214
- }, c$6 = {
5215
- type: "rich-text-child",
5234
+ }, c$7 = {
5235
+ type: "container",
5216
5236
  label: "Italic Text",
5217
5237
  icon: TextItalicIcon,
5218
5238
  states: defaultStates,
5219
- presetStyle: r$d
5239
+ presetStyle: i$1
5220
5240
  };
5221
5241
  const e$3 = {
5222
5242
  sup
5223
- }, a$8 = {
5224
- type: "rich-text-child",
5243
+ }, c$6 = {
5244
+ type: "container",
5225
5245
  label: "Superscript Text",
5226
5246
  icon: SuperscriptIcon,
5227
5247
  states: defaultStates,
@@ -5229,8 +5249,8 @@ const e$3 = {
5229
5249
  };
5230
5250
  const e$2 = {
5231
5251
  sub
5232
- }, a$7 = {
5233
- type: "rich-text-child",
5252
+ }, c$5 = {
5253
+ type: "container",
5234
5254
  label: "Subscript Text",
5235
5255
  icon: SubscriptIcon,
5236
5256
  states: defaultStates,
@@ -5238,7 +5258,7 @@ const e$2 = {
5238
5258
  };
5239
5259
  const l$5 = {
5240
5260
  button
5241
- }, p$7 = {
5261
+ }, p$6 = {
5242
5262
  icon: ButtonElementIcon,
5243
5263
  type: "container",
5244
5264
  presetStyle: l$5,
@@ -5248,7 +5268,7 @@ const l$5 = {
5248
5268
  { selector: ":enabled", label: "Enabled" }
5249
5269
  ]
5250
5270
  };
5251
- const r$c = {
5271
+ const r$a = {
5252
5272
  input: [
5253
5273
  ...input,
5254
5274
  {
@@ -5256,13 +5276,13 @@ const r$c = {
5256
5276
  value: { type: "keyword", value: "block" }
5257
5277
  }
5258
5278
  ]
5259
- }, c$5 = {
5279
+ }, c$4 = {
5260
5280
  category: "forms",
5261
5281
  type: "control",
5262
5282
  label: "Text Input",
5263
5283
  description: "A single-line text input for collecting string data from your users.",
5264
5284
  icon: FormTextFieldIcon,
5265
- presetStyle: r$c,
5285
+ presetStyle: r$a,
5266
5286
  order: 3,
5267
5287
  states: [
5268
5288
  ...defaultStates,
@@ -5278,7 +5298,7 @@ const r$c = {
5278
5298
  //{ selector: ":read-write", label: "Read Write" },
5279
5299
  ]
5280
5300
  };
5281
- const c$4 = {
5301
+ const c$3 = {
5282
5302
  label: "Webhook Form",
5283
5303
  icon: WebhookFormIcon,
5284
5304
  type: "container",
@@ -5290,22 +5310,22 @@ const c$4 = {
5290
5310
  { selector: "[data-state=success]", label: "Success" }
5291
5311
  ]
5292
5312
  };
5293
- const s$2 = {
5313
+ const s$4 = {
5294
5314
  form: [
5295
5315
  ...form,
5296
5316
  { property: "min-height", value: { type: "unit", unit: "px", value: 20 } }
5297
5317
  ]
5298
- }, n$4 = {
5318
+ }, n$3 = {
5299
5319
  category: "forms",
5300
5320
  type: "container",
5301
5321
  label: "Form",
5302
5322
  description: "Create filters, surveys, searches and more.",
5303
5323
  icon: FormIcon,
5304
5324
  states: defaultStates,
5305
- presetStyle: s$2,
5325
+ presetStyle: s$4,
5306
5326
  order: 0
5307
5327
  };
5308
- const a$6 = {
5328
+ const a$7 = {
5309
5329
  img: [
5310
5330
  ...img,
5311
5331
  // Otherwise on new image insert onto canvas it can overfit screen size multiple times
@@ -5333,10 +5353,10 @@ const a$6 = {
5333
5353
  description: "Add an image asset to the page. Webstudio automatically converts images to WebP or AVIF format and makes them responsive for best performance.",
5334
5354
  icon: ImageIcon,
5335
5355
  states: defaultStates,
5336
- presetStyle: a$6,
5356
+ presetStyle: a$7,
5337
5357
  order: 0
5338
5358
  };
5339
- const r$b = {
5359
+ const r$9 = {
5340
5360
  blockquote: [
5341
5361
  {
5342
5362
  property: "margin-top",
@@ -5383,14 +5403,14 @@ const r$b = {
5383
5403
  value: { type: "rgb", r: 226, g: 226, b: 226, alpha: 1 }
5384
5404
  }
5385
5405
  ]
5386
- }, i$2 = {
5406
+ }, i = {
5387
5407
  type: "container",
5388
5408
  placeholder: "Blockquote",
5389
5409
  icon: BlockquoteIcon,
5390
5410
  states: defaultStates,
5391
- presetStyle: r$b
5411
+ presetStyle: r$9
5392
5412
  };
5393
- const a$5 = {
5413
+ const a$6 = {
5394
5414
  ol: [
5395
5415
  ...ol,
5396
5416
  {
@@ -5425,9 +5445,9 @@ const a$5 = {
5425
5445
  type: "container",
5426
5446
  icon: ListIcon,
5427
5447
  states: defaultStates,
5428
- presetStyle: a$5
5448
+ presetStyle: a$6
5429
5449
  };
5430
- const a$4 = {
5450
+ const a$5 = {
5431
5451
  type: "container",
5432
5452
  placeholder: "List item",
5433
5453
  icon: ListItemIcon,
@@ -5436,7 +5456,7 @@ const a$4 = {
5436
5456
  li
5437
5457
  }
5438
5458
  };
5439
- const p$6 = {
5459
+ const p$5 = {
5440
5460
  hr: [
5441
5461
  ...hr,
5442
5462
  {
@@ -5464,16 +5484,16 @@ const p$6 = {
5464
5484
  value: { type: "keyword", value: "none" }
5465
5485
  }
5466
5486
  ]
5467
- }, n$3 = {
5487
+ }, n$2 = {
5468
5488
  category: "general",
5469
5489
  type: "embed",
5470
5490
  description: "Used to visually divide sections of content, helping to improve readability and organization within a webpage.",
5471
5491
  icon: MinusIcon,
5472
5492
  states: defaultStates,
5473
- presetStyle: p$6,
5493
+ presetStyle: p$5,
5474
5494
  order: 3
5475
5495
  };
5476
- const p$5 = {
5496
+ const p$4 = {
5477
5497
  code: [
5478
5498
  ...code,
5479
5499
  {
@@ -5507,10 +5527,10 @@ const p$5 = {
5507
5527
  description: "Use this component when you want to display code as text on the page.",
5508
5528
  icon: BracesIcon,
5509
5529
  states: defaultStates,
5510
- presetStyle: p$5,
5530
+ presetStyle: p$4,
5511
5531
  order: 5
5512
5532
  };
5513
- const a$3 = {
5533
+ const a$4 = {
5514
5534
  label: [
5515
5535
  ...label,
5516
5536
  { property: "display", value: { type: "keyword", value: "block" } }
@@ -5520,7 +5540,7 @@ const a$3 = {
5520
5540
  label: "Input Label",
5521
5541
  icon: LabelIcon,
5522
5542
  states: defaultStates,
5523
- presetStyle: a$3
5543
+ presetStyle: a$4
5524
5544
  };
5525
5545
  const l$3 = {
5526
5546
  textarea: [
@@ -5532,7 +5552,7 @@ const l$3 = {
5532
5552
  value: { type: "keyword", value: "block" }
5533
5553
  }
5534
5554
  ]
5535
- }, c$3 = {
5555
+ }, c$2 = {
5536
5556
  category: "forms",
5537
5557
  type: "control",
5538
5558
  label: "Text Area",
@@ -5554,7 +5574,7 @@ const l$3 = {
5554
5574
  //{ selector: ":read-write", label: "Read Write" },
5555
5575
  ]
5556
5576
  };
5557
- const a$2 = {
5577
+ const a$3 = {
5558
5578
  input: [
5559
5579
  ...radio,
5560
5580
  {
@@ -5562,11 +5582,11 @@ const a$2 = {
5562
5582
  value: { type: "unit", unit: "em", value: 0.5 }
5563
5583
  }
5564
5584
  ]
5565
- }, s$1 = {
5585
+ }, s$3 = {
5566
5586
  type: "control",
5567
5587
  label: "Radio",
5568
5588
  icon: RadioCheckedIcon,
5569
- presetStyle: a$2,
5589
+ presetStyle: a$3,
5570
5590
  states: [
5571
5591
  ...defaultStates,
5572
5592
  { selector: ":checked", label: "Checked" },
@@ -5602,72 +5622,76 @@ const o$3 = {
5602
5622
  { selector: ":read-write", label: "Read Write" }
5603
5623
  ]
5604
5624
  };
5605
- const r$a = {
5606
- div
5607
- }, c$2 = {
5625
+ const m$2 = {
5608
5626
  type: "container",
5609
5627
  icon: VimeoIcon,
5610
5628
  states: defaultStates,
5611
- presetStyle: r$a,
5612
- constraints: {
5613
- relation: "ancestor",
5614
- component: { $nin: ["Button", "Link", "Heading"] }
5629
+ contentModel: {
5630
+ category: "instance",
5631
+ children: [
5632
+ "instance",
5633
+ "VimeoSpinner",
5634
+ "VimeoPlayButton",
5635
+ "VimeoPreviewImage"
5636
+ ]
5637
+ },
5638
+ presetStyle: {
5639
+ div
5615
5640
  }
5616
5641
  };
5617
- const i$1 = {
5618
- div
5619
- }, c$1 = {
5642
+ const p$3 = {
5620
5643
  type: "container",
5621
5644
  icon: YoutubeIcon,
5622
5645
  states: defaultStates,
5623
- presetStyle: i$1,
5624
- constraints: {
5625
- relation: "ancestor",
5626
- component: { $nin: ["Button", "Link", "Heading"] }
5646
+ contentModel: {
5647
+ category: "instance",
5648
+ children: [
5649
+ "instance",
5650
+ "VimeoSpinner",
5651
+ "VimeoPlayButton",
5652
+ "VimeoPreviewImage"
5653
+ ]
5654
+ },
5655
+ presetStyle: {
5656
+ div
5627
5657
  }
5628
5658
  };
5629
- const i = {
5659
+ const a$2 = {
5630
5660
  ...l$4,
5631
5661
  category: "hidden",
5632
5662
  label: "Preview Image",
5633
- constraints: {
5634
- relation: "ancestor",
5635
- component: { $in: ["Vimeo", "YouTube"] }
5663
+ contentModel: {
5664
+ category: "none",
5665
+ children: ["empty"]
5636
5666
  }
5637
5667
  };
5638
- const r$9 = {
5639
- button
5640
- }, p$4 = {
5668
+ const s$2 = {
5641
5669
  category: "hidden",
5642
5670
  type: "container",
5643
- constraints: [
5644
- {
5645
- relation: "ancestor",
5646
- component: { $in: ["Vimeo", "YouTube"] }
5647
- },
5648
- {
5649
- relation: "ancestor",
5650
- component: { $neq: "Button" }
5651
- }
5652
- ],
5653
5671
  label: "Play Button",
5654
5672
  icon: ButtonElementIcon,
5655
- presetStyle: r$9,
5656
- states: defaultStates
5673
+ states: defaultStates,
5674
+ contentModel: {
5675
+ category: "none",
5676
+ children: ["instance"]
5677
+ },
5678
+ presetStyle: {
5679
+ button
5680
+ }
5657
5681
  };
5658
- const n$2 = {
5659
- div
5660
- }, m$2 = {
5682
+ const s$1 = {
5661
5683
  type: "container",
5662
- constraints: {
5663
- relation: "ancestor",
5664
- component: { $in: ["Vimeo", "YouTube"] }
5665
- },
5666
5684
  icon: BoxIcon,
5667
5685
  states: defaultStates,
5668
- presetStyle: n$2,
5669
5686
  category: "hidden",
5670
- label: "Spinner"
5687
+ label: "Spinner",
5688
+ contentModel: {
5689
+ category: "none",
5690
+ children: ["instance"]
5691
+ },
5692
+ presetStyle: {
5693
+ div
5694
+ }
5671
5695
  };
5672
5696
  const e$1 = {
5673
5697
  category: "xml",
@@ -5701,7 +5725,7 @@ const r$7 = {
5701
5725
  value: { type: "keyword", value: "block" }
5702
5726
  }
5703
5727
  ]
5704
- }, c = {
5728
+ }, c$1 = {
5705
5729
  type: "container",
5706
5730
  icon: SelectIcon,
5707
5731
  presetStyle: r$7,
@@ -5749,42 +5773,36 @@ const r$5 = {
5749
5773
  icon: HeaderIcon,
5750
5774
  type: "container",
5751
5775
  description: "Inserts children into the head of the document",
5752
- constraints: [
5753
- {
5754
- relation: "ancestor",
5755
- component: { $nin: ["HeadSlot"] }
5756
- },
5757
- {
5758
- relation: "child",
5759
- component: { $in: ["HeadLink", "HeadMeta", "HeadTitle"] }
5760
- }
5761
- ]
5776
+ contentModel: {
5777
+ category: "instance",
5778
+ children: ["HeadLink", "HeadMeta", "HeadTitle"]
5779
+ }
5762
5780
  };
5763
- const p$3 = {
5781
+ const p$2 = {
5764
5782
  category: "hidden",
5765
5783
  icon: ResourceIcon,
5766
5784
  type: "embed",
5767
- constraints: {
5768
- relation: "parent",
5769
- component: { $eq: "HeadSlot" }
5785
+ contentModel: {
5786
+ category: "none",
5787
+ children: ["empty"]
5770
5788
  }
5771
5789
  };
5772
- const p$2 = {
5790
+ const p$1 = {
5773
5791
  category: "hidden",
5774
5792
  icon: WindowInfoIcon,
5775
5793
  type: "embed",
5776
- constraints: {
5777
- relation: "parent",
5778
- component: { $eq: "HeadSlot" }
5794
+ contentModel: {
5795
+ category: "none",
5796
+ children: ["empty"]
5779
5797
  }
5780
5798
  };
5781
- const p$1 = {
5799
+ const c = {
5782
5800
  category: "hidden",
5783
5801
  icon: WindowTitleIcon,
5784
5802
  type: "container",
5785
- constraints: {
5786
- relation: "parent",
5787
- component: { $eq: "HeadSlot" }
5803
+ contentModel: {
5804
+ category: "none",
5805
+ children: ["text"]
5788
5806
  }
5789
5807
  };
5790
5808
  const r$4 = {
@@ -5801,51 +5819,51 @@ const r$4 = {
5801
5819
  };
5802
5820
  const baseComponentMetas = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5803
5821
  __proto__: null,
5804
- Blockquote: i$2,
5822
+ Blockquote: i,
5805
5823
  Body: n$7,
5806
5824
  Bold: l$6,
5807
5825
  Box: v$2,
5808
- Button: p$7,
5826
+ Button: p$6,
5809
5827
  Checkbox: d$3,
5810
5828
  CodeText: d$4,
5811
- Form: c$4,
5812
- Fragment: o$4,
5813
- HeadLink: p$3,
5814
- HeadMeta: p$2,
5829
+ Form: c$3,
5830
+ Fragment: o$5,
5831
+ HeadLink: p$2,
5832
+ HeadMeta: p$1,
5815
5833
  HeadSlot: r$5,
5816
- HeadTitle: p$1,
5834
+ HeadTitle: c,
5817
5835
  Heading: d$6,
5818
- HtmlEmbed: a$d,
5836
+ HtmlEmbed: r$b,
5819
5837
  Image: l$4,
5820
- Input: c$5,
5821
- Italic: c$6,
5838
+ Input: c$4,
5839
+ Italic: c$7,
5822
5840
  Label: m$3,
5823
5841
  Link: n$5,
5824
5842
  List: d$5,
5825
- ListItem: a$4,
5826
- MarkdownEmbed: t$1,
5843
+ ListItem: a$5,
5844
+ MarkdownEmbed: a$b,
5827
5845
  Option: r$6,
5828
5846
  Paragraph: n$6,
5829
- RadioButton: s$1,
5830
- RemixForm: n$4,
5831
- RichTextLink: a$9,
5832
- Select: c,
5833
- Separator: n$3,
5847
+ RadioButton: s$3,
5848
+ RemixForm: n$3,
5849
+ RichTextLink: o$4,
5850
+ Select: c$1,
5851
+ Separator: n$2,
5834
5852
  Slot: e$5,
5835
- Span: c$7,
5836
- Subscript: a$7,
5837
- Superscript: a$8,
5838
- Text: s$4,
5839
- Textarea: c$3,
5853
+ Span: n$4,
5854
+ Subscript: c$5,
5855
+ Superscript: c$6,
5856
+ Text: s$6,
5857
+ Textarea: c$2,
5840
5858
  Time: s,
5841
5859
  Video: r$4,
5842
- Vimeo: c$2,
5843
- VimeoPlayButton: p$4,
5844
- VimeoPreviewImage: i,
5845
- VimeoSpinner: m$2,
5860
+ Vimeo: m$2,
5861
+ VimeoPlayButton: s$2,
5862
+ VimeoPreviewImage: a$2,
5863
+ VimeoSpinner: s$1,
5846
5864
  XmlNode: e$1,
5847
5865
  XmlTime: a$1,
5848
- YouTube: c$1
5866
+ YouTube: p$3
5849
5867
  }, Symbol.toStringTag, { value: "Module" }));
5850
5868
  const o$2 = {
5851
5869
  category: "animations",
@@ -5921,10 +5939,10 @@ const animationComponentMetas = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Ob
5921
5939
  const remixComponentMetas = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
5922
5940
  __proto__: null,
5923
5941
  Body: n$7,
5924
- Form: c$4,
5942
+ Form: c$3,
5925
5943
  Link: n$5,
5926
- RemixForm: n$4,
5927
- RichTextLink: a$9
5944
+ RemixForm: n$3,
5945
+ RichTextLink: o$4
5928
5946
  }, Symbol.toStringTag, { value: "Module" }));
5929
5947
  const r = (t2) => new Proxy(
5930
5948
  {},
@@ -6069,7 +6087,7 @@ const S$1 = {
6069
6087
  }, h$1 = {
6070
6088
  type: "container",
6071
6089
  presetStyle: {
6072
- p: p$a
6090
+ p: p$9
6073
6091
  },
6074
6092
  icon: TextIcon,
6075
6093
  constraints: {
@@ -6799,10 +6817,10 @@ const createFramework$2 = async () => {
6799
6817
  const reactRouterComponentMetas = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6800
6818
  __proto__: null,
6801
6819
  Body: n$7,
6802
- Form: c$4,
6820
+ Form: c$3,
6803
6821
  Link: n$5,
6804
- RemixForm: n$4,
6805
- RichTextLink: a$9
6822
+ RemixForm: n$3,
6823
+ RichTextLink: o$4
6806
6824
  }, Symbol.toStringTag, { value: "Module" }));
6807
6825
  const createFramework$1 = async () => {
6808
6826
  const routeTemplatesDir = join("app", "route-templates");
@@ -7340,6 +7358,10 @@ Please check webstudio --help for more details`
7340
7358
  import { useResource, useVariableState } from "@webstudio-is/react-sdk/runtime";
7341
7359
  ${componentImports}
7342
7360
 
7361
+ export const projectId = "${siteData.build.projectId}";
7362
+
7363
+ export const lastPublished = "${new Date(siteData.build.createdAt).toISOString()}";
7364
+
7343
7365
  export const siteName = ${JSON.stringify(projectMeta == null ? void 0 : projectMeta.siteName)};
7344
7366
 
7345
7367
  export const breakpoints = ${JSON.stringify(breakpoints)};
@@ -7403,8 +7425,6 @@ Please check webstudio --help for more details`
7403
7425
 
7404
7426
  ${generateRemixParams(page.path)}
7405
7427
 
7406
- export const projectId = "${siteData.build.projectId}";
7407
-
7408
7428
  export const contactEmail = ${JSON.stringify(contactEmail)};
7409
7429
  `;
7410
7430
  const generatedBasename = generateRemixRoute(pagePath);
@@ -7622,7 +7642,7 @@ const getDeploymentInstructions = (deployTarget) => {
7622
7642
  }
7623
7643
  };
7624
7644
  const name = "webstudio";
7625
- const version = "0.212.0";
7645
+ const version = "0.214.0";
7626
7646
  const description = "Webstudio CLI";
7627
7647
  const author = "Webstudio <github@webstudio.is>";
7628
7648
  const homepage = "https://webstudio.is";
@@ -7670,15 +7690,15 @@ const dependencies = {
7670
7690
  zod: "^3.24.2"
7671
7691
  };
7672
7692
  const devDependencies = {
7673
- "@netlify/vite-plugin-react-router": "^1.0.0",
7674
- "@react-router/dev": "^7.4.0",
7675
- "@react-router/fs-routes": "^7.4.0",
7676
- "@remix-run/cloudflare": "^2.16.2",
7677
- "@remix-run/cloudflare-pages": "^2.16.2",
7678
- "@remix-run/dev": "^2.16.2",
7679
- "@remix-run/node": "^2.16.2",
7680
- "@remix-run/react": "^2.16.2",
7681
- "@remix-run/server-runtime": "^2.16.2",
7693
+ "@netlify/vite-plugin-react-router": "^1.0.1",
7694
+ "@react-router/dev": "^7.5.0",
7695
+ "@react-router/fs-routes": "^7.5.0",
7696
+ "@remix-run/cloudflare": "^2.16.4",
7697
+ "@remix-run/cloudflare-pages": "^2.16.4",
7698
+ "@remix-run/dev": "^2.16.4",
7699
+ "@remix-run/node": "^2.16.4",
7700
+ "@remix-run/react": "^2.16.4",
7701
+ "@remix-run/server-runtime": "^2.16.4",
7682
7702
  "@types/react": "^18.2.70",
7683
7703
  "@types/react-dom": "^18.2.25",
7684
7704
  "@types/yargs": "^17.0.33",
@@ -7700,9 +7720,9 @@ const devDependencies = {
7700
7720
  prettier: "3.5.3",
7701
7721
  react: "18.3.0-canary-14898b6a9-20240318",
7702
7722
  "react-dom": "18.3.0-canary-14898b6a9-20240318",
7703
- "react-router": "^7.4.0",
7723
+ "react-router": "^7.5.0",
7704
7724
  "ts-expect": "^1.3.0",
7705
- vike: "^0.4.227",
7725
+ vike: "^0.4.228",
7706
7726
  vite: "^5.4.11",
7707
7727
  vitest: "^3.0.8",
7708
7728
  wrangler: "^3.63.2"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webstudio",
3
- "version": "0.212.0",
3
+ "version": "0.214.0",
4
4
  "description": "Webstudio CLI",
5
5
  "author": "Webstudio <github@webstudio.is>",
6
6
  "homepage": "https://webstudio.is",
@@ -43,15 +43,15 @@
43
43
  "zod": "^3.24.2"
44
44
  },
45
45
  "devDependencies": {
46
- "@netlify/vite-plugin-react-router": "^1.0.0",
47
- "@react-router/dev": "^7.4.0",
48
- "@react-router/fs-routes": "^7.4.0",
49
- "@remix-run/cloudflare": "^2.16.2",
50
- "@remix-run/cloudflare-pages": "^2.16.2",
51
- "@remix-run/dev": "^2.16.2",
52
- "@remix-run/node": "^2.16.2",
53
- "@remix-run/react": "^2.16.2",
54
- "@remix-run/server-runtime": "^2.16.2",
46
+ "@netlify/vite-plugin-react-router": "^1.0.1",
47
+ "@react-router/dev": "^7.5.0",
48
+ "@react-router/fs-routes": "^7.5.0",
49
+ "@remix-run/cloudflare": "^2.16.4",
50
+ "@remix-run/cloudflare-pages": "^2.16.4",
51
+ "@remix-run/dev": "^2.16.4",
52
+ "@remix-run/node": "^2.16.4",
53
+ "@remix-run/react": "^2.16.4",
54
+ "@remix-run/server-runtime": "^2.16.4",
55
55
  "@types/react": "^18.2.70",
56
56
  "@types/react-dom": "^18.2.25",
57
57
  "@types/yargs": "^17.0.33",
@@ -62,23 +62,23 @@
62
62
  "prettier": "3.5.3",
63
63
  "react": "18.3.0-canary-14898b6a9-20240318",
64
64
  "react-dom": "18.3.0-canary-14898b6a9-20240318",
65
- "react-router": "^7.4.0",
65
+ "react-router": "^7.5.0",
66
66
  "ts-expect": "^1.3.0",
67
- "vike": "^0.4.227",
67
+ "vike": "^0.4.228",
68
68
  "vite": "^5.4.11",
69
69
  "vitest": "^3.0.8",
70
70
  "wrangler": "^3.63.2",
71
- "@webstudio-is/css-engine": "0.212.0",
72
- "@webstudio-is/http-client": "0.212.0",
73
- "@webstudio-is/image": "0.212.0",
74
- "@webstudio-is/react-sdk": "0.212.0",
75
- "@webstudio-is/sdk": "0.212.0",
76
- "@webstudio-is/sdk-components-animation": "0.212.0",
77
- "@webstudio-is/sdk-components-react": "0.212.0",
78
- "@webstudio-is/sdk-components-react-radix": "0.212.0",
79
- "@webstudio-is/sdk-components-react-remix": "0.212.0",
80
- "@webstudio-is/sdk-components-react-router": "0.212.0",
81
- "@webstudio-is/tsconfig": "1.0.7"
71
+ "@webstudio-is/http-client": "0.214.0",
72
+ "@webstudio-is/image": "0.214.0",
73
+ "@webstudio-is/react-sdk": "0.214.0",
74
+ "@webstudio-is/sdk": "0.214.0",
75
+ "@webstudio-is/sdk-components-animation": "0.214.0",
76
+ "@webstudio-is/sdk-components-react": "0.214.0",
77
+ "@webstudio-is/sdk-components-react-radix": "0.214.0",
78
+ "@webstudio-is/sdk-components-react-remix": "0.214.0",
79
+ "@webstudio-is/sdk-components-react-router": "0.214.0",
80
+ "@webstudio-is/tsconfig": "1.0.7",
81
+ "@webstudio-is/css-engine": "0.214.0"
82
82
  },
83
83
  "scripts": {
84
84
  "typecheck": "tsc",
@@ -12,8 +12,8 @@
12
12
  "build-cf-types": "wrangler types"
13
13
  },
14
14
  "dependencies": {
15
- "@remix-run/cloudflare": "2.16.2",
16
- "@remix-run/cloudflare-pages": "2.16.2"
15
+ "@remix-run/cloudflare": "2.16.4",
16
+ "@remix-run/cloudflare-pages": "2.16.4"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@cloudflare/workers-types": "^4.20240620.0",
@@ -3,7 +3,7 @@
3
3
  import { Links, Meta, Outlet, useMatches } from "@remix-run/react";
4
4
  // @todo think about how to make __generated__ typeable
5
5
  // @ts-ignore
6
- import { CustomCode } from "./__generated__/_index";
6
+ import { CustomCode, projectId, lastPublished } from "./__generated__/_index";
7
7
 
8
8
  const Root = () => {
9
9
  // Get language from matches
@@ -19,7 +19,11 @@ const Root = () => {
19
19
  const lang = lastMatchWithLanguage?.data?.pageMeta?.language ?? "en";
20
20
 
21
21
  return (
22
- <html lang={lang}>
22
+ <html
23
+ lang={lang}
24
+ data-ws-project={projectId}
25
+ data-ws-last-published={lastPublished}
26
+ >
23
27
  <head>
24
28
  <meta charSet="utf-8" />
25
29
  <meta name="viewport" content="width=device-width,initial-scale=1" />
@@ -23,6 +23,7 @@ import {
23
23
  PageSettingsCanonicalLink,
24
24
  } from "@webstudio-is/react-sdk/runtime";
25
25
  import {
26
+ projectId,
26
27
  Page,
27
28
  siteName,
28
29
  favIconAsset,
@@ -34,7 +35,6 @@ import {
34
35
  getResources,
35
36
  getPageMeta,
36
37
  getRemixParams,
37
- projectId,
38
38
  contactEmail,
39
39
  } from "__SERVER__";
40
40
  import { assetBaseUrl, imageLoader } from "__CONSTANTS__";
@@ -8,22 +8,22 @@
8
8
  "typecheck": "tsc"
9
9
  },
10
10
  "dependencies": {
11
- "@remix-run/node": "2.16.2",
12
- "@remix-run/react": "2.16.2",
13
- "@remix-run/server-runtime": "2.16.2",
14
- "@webstudio-is/image": "0.212.0",
15
- "@webstudio-is/react-sdk": "0.212.0",
16
- "@webstudio-is/sdk": "0.212.0",
17
- "@webstudio-is/sdk-components-react": "0.212.0",
18
- "@webstudio-is/sdk-components-animation": "0.212.0",
19
- "@webstudio-is/sdk-components-react-radix": "0.212.0",
20
- "@webstudio-is/sdk-components-react-remix": "0.212.0",
11
+ "@remix-run/node": "2.16.4",
12
+ "@remix-run/react": "2.16.4",
13
+ "@remix-run/server-runtime": "2.16.4",
14
+ "@webstudio-is/image": "0.214.0",
15
+ "@webstudio-is/react-sdk": "0.214.0",
16
+ "@webstudio-is/sdk": "0.214.0",
17
+ "@webstudio-is/sdk-components-react": "0.214.0",
18
+ "@webstudio-is/sdk-components-animation": "0.214.0",
19
+ "@webstudio-is/sdk-components-react-radix": "0.214.0",
20
+ "@webstudio-is/sdk-components-react-remix": "0.214.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"
24
24
  },
25
25
  "devDependencies": {
26
- "@remix-run/dev": "2.16.2",
26
+ "@remix-run/dev": "2.16.4",
27
27
  "@types/react": "^18.2.70",
28
28
  "@types/react-dom": "^18.2.25",
29
29
  "typescript": "5.8.2",
@@ -3,7 +3,7 @@
3
3
  import { Links, Meta, Outlet, useMatches } from "react-router";
4
4
  // @todo think about how to make __generated__ typeable
5
5
  // @ts-ignore
6
- import { CustomCode } from "./__generated__/_index";
6
+ import { CustomCode, projectId, lastPublished } from "./__generated__/_index";
7
7
 
8
8
  const Root = () => {
9
9
  // Get language from matches
@@ -19,7 +19,11 @@ const Root = () => {
19
19
  const lang = lastMatchWithLanguage?.data?.pageMeta?.language ?? "en";
20
20
 
21
21
  return (
22
- <html lang={lang}>
22
+ <html
23
+ lang={lang}
24
+ data-ws-project={projectId}
25
+ data-ws-last-published={lastPublished}
26
+ >
23
27
  <head>
24
28
  <meta charSet="utf-8" />
25
29
  <meta name="viewport" content="width=device-width,initial-scale=1" />
@@ -22,6 +22,7 @@ import {
22
22
  PageSettingsTitle,
23
23
  } from "@webstudio-is/react-sdk/runtime";
24
24
  import {
25
+ projectId,
25
26
  Page,
26
27
  siteName,
27
28
  favIconAsset,
@@ -33,7 +34,6 @@ import {
33
34
  getResources,
34
35
  getPageMeta,
35
36
  getRemixParams,
36
- projectId,
37
37
  contactEmail,
38
38
  } from "__SERVER__";
39
39
  import { assetBaseUrl, imageLoader } from "__CONSTANTS__";
@@ -8,19 +8,19 @@
8
8
  "typecheck": "tsc"
9
9
  },
10
10
  "dependencies": {
11
- "@react-router/dev": "^7.4.0",
12
- "@react-router/fs-routes": "^7.4.0",
13
- "@webstudio-is/image": "0.212.0",
14
- "@webstudio-is/react-sdk": "0.212.0",
15
- "@webstudio-is/sdk": "0.212.0",
16
- "@webstudio-is/sdk-components-animation": "0.212.0",
17
- "@webstudio-is/sdk-components-react-radix": "0.212.0",
18
- "@webstudio-is/sdk-components-react-router": "0.212.0",
19
- "@webstudio-is/sdk-components-react": "0.212.0",
11
+ "@react-router/dev": "^7.5.0",
12
+ "@react-router/fs-routes": "^7.5.0",
13
+ "@webstudio-is/image": "0.214.0",
14
+ "@webstudio-is/react-sdk": "0.214.0",
15
+ "@webstudio-is/sdk": "0.214.0",
16
+ "@webstudio-is/sdk-components-animation": "0.214.0",
17
+ "@webstudio-is/sdk-components-react-radix": "0.214.0",
18
+ "@webstudio-is/sdk-components-react-router": "0.214.0",
19
+ "@webstudio-is/sdk-components-react": "0.214.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",
23
- "react-router": "^7.4.0",
23
+ "react-router": "^7.5.0",
24
24
  "vite": "^5.4.11"
25
25
  },
26
26
  "devDependencies": {
@@ -3,8 +3,8 @@
3
3
  "start": "react-router-serve ./build/server/index.js"
4
4
  },
5
5
  "dependencies": {
6
- "@react-router/node": "^7.4.0",
7
- "@react-router/serve": "^7.4.0",
6
+ "@react-router/node": "^7.5.0",
7
+ "@react-router/serve": "^7.5.0",
8
8
  "h3": "^1.15.1",
9
9
  "ipx": "^3.0.3"
10
10
  }
@@ -4,7 +4,7 @@
4
4
  "deploy": "npx netlify-cli deploy --build --prod"
5
5
  },
6
6
  "dependencies": {
7
- "@netlify/vite-plugin-react-router": "^1.0.0",
8
- "@react-router/node": "^7.4.0"
7
+ "@netlify/vite-plugin-react-router": "^1.0.1",
8
+ "@react-router/node": "^7.5.0"
9
9
  }
10
10
  }
@@ -3,7 +3,7 @@
3
3
  "deploy": "npx vercel deploy"
4
4
  },
5
5
  "dependencies": {
6
- "@react-router/node": "^7.4.0",
6
+ "@react-router/node": "^7.5.0",
7
7
  "@vercel/react-router": "^1.1.0"
8
8
  }
9
9
  }
@@ -8,15 +8,15 @@
8
8
  "typecheck": "tsc"
9
9
  },
10
10
  "dependencies": {
11
- "@webstudio-is/image": "0.212.0",
12
- "@webstudio-is/react-sdk": "0.212.0",
13
- "@webstudio-is/sdk": "0.212.0",
14
- "@webstudio-is/sdk-components-react": "0.212.0",
15
- "@webstudio-is/sdk-components-animation": "0.212.0",
16
- "@webstudio-is/sdk-components-react-radix": "0.212.0",
11
+ "@webstudio-is/image": "0.214.0",
12
+ "@webstudio-is/react-sdk": "0.214.0",
13
+ "@webstudio-is/sdk": "0.214.0",
14
+ "@webstudio-is/sdk-components-react": "0.214.0",
15
+ "@webstudio-is/sdk-components-animation": "0.214.0",
16
+ "@webstudio-is/sdk-components-react-radix": "0.214.0",
17
17
  "react": "18.3.0-canary-14898b6a9-20240318",
18
18
  "react-dom": "18.3.0-canary-14898b6a9-20240318",
19
- "vike": "^0.4.227"
19
+ "vike": "^0.4.228"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/react": "^18.2.70",
@@ -1,10 +1,14 @@
1
1
  import { renderToString } from "react-dom/server";
2
2
  import { dangerouslySkipEscape, escapeInject } from "vike/server";
3
3
  import type { OnRenderHtmlSync } from "vike/types";
4
- // @todo think about how to make __generated__ typeable
5
- /* eslint-disable-next-line @typescript-eslint/ban-ts-comment */
6
- // @ts-ignore
7
- import { CustomCode } from "../app/__generated__/_index";
4
+ import {
5
+ CustomCode,
6
+ projectId,
7
+ lastPublished,
8
+ // @todo think about how to make __generated__ typeable
9
+ /* eslint-disable-next-line @typescript-eslint/ban-ts-comment */
10
+ // @ts-ignore
11
+ } from "../app/__generated__/_index";
8
12
 
9
13
  export const onRenderHtml: OnRenderHtmlSync = (pageContext) => {
10
14
  const lang = pageContext.data.pageMeta.language || "en";
@@ -12,7 +16,11 @@ export const onRenderHtml: OnRenderHtmlSync = (pageContext) => {
12
16
  const Page = pageContext.Page ?? (() => <></>);
13
17
  const html = dangerouslySkipEscape(
14
18
  renderToString(
15
- <html lang={lang}>
19
+ <html
20
+ lang={lang}
21
+ data-ws-project={projectId}
22
+ data-ws-last-published={lastPublished}
23
+ >
16
24
  <head>
17
25
  <meta charSet="UTF-8" />
18
26
  <meta name="viewport" content="width=device-width,initial-scale=1" />