mechanica 2.0.0-alpha.7 → 2.0.0-alpha.9

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.
@@ -658,8 +658,40 @@ function listPages(mechDir, options = {}) {
658
658
  }
659
659
  items.push(item);
660
660
  }
661
+ if (options.generated?.length) items.push(...generatedPageItems(options.generated, options, config));
661
662
  return items.sort(comparePages);
662
663
  }
664
+ /** File-less pages → list rows: one per logical path, with a `locales` union. */
665
+ function generatedPageItems(generated, options, config) {
666
+ const groups = /* @__PURE__ */ new Map();
667
+ for (const vp of generated) {
668
+ const arr = groups.get(vp.path);
669
+ if (arr) arr.push(vp);
670
+ else groups.set(vp.path, [vp]);
671
+ }
672
+ const items = [];
673
+ for (const [path, vps] of groups) {
674
+ const locales = config ? vps.map((v) => v.locale).filter(Boolean) : [];
675
+ if (options.locale && !locales.includes(options.locale)) continue;
676
+ const source = (options.locale ? vps.find((v) => v.locale === options.locale) : void 0) ?? (config ? vps.find((v) => v.locale === config.default) : void 0) ?? vps[0];
677
+ const embedded = {};
678
+ for (const dataEntry of options.data ?? []) embedded[dataEntry.id] = source.data?.[dataEntry.id] ?? {};
679
+ const dir = path.slice(1).split("/").slice(0, -1).join("/");
680
+ const item = {
681
+ path,
682
+ name: (typeof source.meta?.title === "string" ? source.meta.title : void 0) ?? path.split("/").pop() ?? path,
683
+ folderPath: dir === "" ? null : dir,
684
+ order: 0,
685
+ orderAfter: null,
686
+ draft: false,
687
+ generated: true,
688
+ ...embedded
689
+ };
690
+ if (config) item.locales = config.all.filter((code) => locales.includes(code));
691
+ items.push(item);
692
+ }
693
+ return items;
694
+ }
663
695
  /** Ordering: by folder, then explicit `orderAfter`, then `order`, then path. */
664
696
  function comparePages(a, b) {
665
697
  if (a.folderPath === b.folderPath) {
package/dist/cli.js CHANGED
@@ -1,4 +1,4 @@
1
- import { B as readImageManifest, C as getPagePath, I as UPLOADS_PREFIX, J as hasSharp, L as assetFileOf, N as setPageCodec, R as isDerivedAsset, T as listPages, U as updateImageManifest, Y as isRasterImage, a as toBlockMeta, d as readFolderData, f as readFoldersData, i as composedBlockMeta, m as readSiteLocaleOverride, n as blockAssetLinks, p as readSiteData, q as analyzeImageBuffer, r as buildRichTextCodec, t as BLOCKS_MANIFEST_FILE } from "./chunks/page-assets-BjIm0jws.js";
1
+ import { B as readImageManifest, C as getPagePath, I as UPLOADS_PREFIX, J as hasSharp, L as assetFileOf, N as setPageCodec, R as isDerivedAsset, T as listPages, U as updateImageManifest, Y as isRasterImage, a as toBlockMeta, d as readFolderData, f as readFoldersData, i as composedBlockMeta, m as readSiteLocaleOverride, n as blockAssetLinks, p as readSiteData, q as analyzeImageBuffer, r as buildRichTextCodec, t as BLOCKS_MANIFEST_FILE } from "./chunks/page-assets-BCUAuOlo.js";
2
2
  import fs from "node:fs";
3
3
  import { dirname, join, parse, relative } from "node:path";
4
4
  import { applySeoTags, auditPageHtml, buildRobotsTxt, buildSitemap, findUnknownBlocks, generateProject, isPaginatedQuery, localePath, mergeTranslation, migrateContent, paginationVariantPath, registerFieldSchemas, resolveQueryKey, templateBlockIds, validateLinks, walkSchema, walkTree } from "mechanica-shared";
@@ -302,7 +302,8 @@ async function backfillImageMeta(pages, blocksMap, mechDir, warn) {
302
302
  * `<cwd>/.mech`.
303
303
  *
304
304
  * Beyond the pages it also: rewrites + copies uploaded assets
305
- * (`/@mechanica/assets/…` → `/media/…`), warns about dead internal links,
305
+ * (`/@mechanica/assets/…` → `/media/…`, or `<assetsUrl>/media/…` when a CDN
306
+ * base is set), warns about dead internal links,
306
307
  * orphaned uploads and page-level SEO issues, emits `404.html` when a `/404`
307
308
  * page exists, and — when a site url is known (plugin `siteUrl` option or
308
309
  * `--site-url`) — injects the automatic SEO tags (canonical, `og:url`,
@@ -314,6 +315,7 @@ async function exportProject(cwd, ssr, options = {}) {
314
315
  const index = await readFile(join(cwd, "dist/index.html"), "utf-8");
315
316
  const siteUrl = options.siteUrl ?? ssr.site?.url;
316
317
  const siteName = options.siteName ?? ssr.site?.name;
318
+ const assetsBase = (options.assetsUrl ?? ssr.assetsUrl ?? "").replace(/\/+$/, "");
317
319
  const composedDefs = ssr.composedList ?? [];
318
320
  const blocks = [...ssr.blocksList.map(toBlockMeta), ...composedDefs.map(composedBlockMeta)];
319
321
  const blocksMap = new Map(blocks.map((block) => [block.id, block]));
@@ -367,7 +369,10 @@ async function exportProject(cwd, ssr, options = {}) {
367
369
  }
368
370
  setPageCodec(richText);
369
371
  const querySource = {
370
- listPages: (opts) => listPages(join(cwd, ".mech"), opts),
372
+ listPages: (opts) => listPages(join(cwd, ".mech"), {
373
+ ...opts,
374
+ generated: ssr.generatedPages
375
+ }),
371
376
  fetchJson: async ({ url, ...init }) => {
372
377
  const res = await fetch(url, init);
373
378
  if (!res.ok) throw new Error(`${url} responded ${res.status}`);
@@ -417,7 +422,7 @@ async function exportProject(cwd, ssr, options = {}) {
417
422
  if (typeof src !== "string" || !src.startsWith("/@mechanica/assets/")) return src;
418
423
  const relative = decodeURIComponent(src.slice(UPLOADS_PREFIX.length));
419
424
  referenced.add(relative);
420
- return `/${MEDIA_DIR}/${relative}`;
425
+ return `${assetsBase}/${MEDIA_DIR}/${relative}`;
421
426
  };
422
427
  const blockAssets = await readBlockAssets(cwd);
423
428
  const pageLinks = blockAssets ? (content) => {
@@ -444,6 +449,7 @@ async function exportProject(cwd, ssr, options = {}) {
444
449
  url: siteUrl,
445
450
  name: siteName
446
451
  },
452
+ assetsUrl: assetsBase || void 0,
447
453
  locales: config ?? void 0,
448
454
  render: (state) => ssr.render(state, { resolveQuery: resolveForPage(state.page?.pagination?.page ?? 1, state.page?.locale) }),
449
455
  onFile,
@@ -1361,7 +1367,9 @@ Usage:
1361
1367
  (a site url — the plugin's siteUrl option or
1362
1368
  --site-url <origin> — also turns on the automatic
1363
1369
  SEO tags and emits sitemap.xml + robots.txt;
1364
- --site-name <name> adds WebSite JSON-LD)
1370
+ --site-name <name> adds WebSite JSON-LD;
1371
+ --assets-url <origin> serves /assets and /media from
1372
+ a CDN base — files still land in export/)
1365
1373
  mechanica push [--key] Upload dist/ to a backend (--key, --host, --dir)
1366
1374
  mechanica shot <blockId> Screenshot one block via the dev preview route
1367
1375
  mechanica shot </path> Screenshot a whole page (editor overlay stripped)
@@ -1386,7 +1394,8 @@ async function run(argv) {
1386
1394
  case "build": return runBuild();
1387
1395
  case "export": return runExport({
1388
1396
  siteUrl: str(flags["site-url"]),
1389
- siteName: str(flags["site-name"])
1397
+ siteName: str(flags["site-name"]),
1398
+ assetsUrl: str(flags["assets-url"])
1390
1399
  });
1391
1400
  case "images": return runImages({ force: flags.force === true });
1392
1401
  case "push": return runPush({
package/dist/editor.css CHANGED
@@ -4802,7 +4802,7 @@ from {
4802
4802
  justify-content: flex-end;
4803
4803
  gap: 8px;
4804
4804
  margin-top: 4px;
4805
- }.mech-pages[data-v-e750b5bb] {
4805
+ }.mech-pages[data-v-665bb42e] {
4806
4806
  display: flex;
4807
4807
  align-items: stretch;
4808
4808
  justify-content: center;
@@ -4811,7 +4811,7 @@ from {
4811
4811
  max-width: 1200px;
4812
4812
  height: min(620px, 82vh);
4813
4813
  }
4814
- .mech-pages__card[data-v-e750b5bb] {
4814
+ .mech-pages__card[data-v-665bb42e] {
4815
4815
  display: flex;
4816
4816
  flex-direction: column;
4817
4817
  flex: 0 1 840px;
@@ -4821,20 +4821,20 @@ from {
4821
4821
  box-shadow: var(--mech-shadow-dialog);
4822
4822
  overflow: hidden;
4823
4823
  }
4824
- .mech-pages__header[data-v-e750b5bb] {
4824
+ .mech-pages__header[data-v-665bb42e] {
4825
4825
  display: flex;
4826
4826
  align-items: center;
4827
4827
  gap: 10px;
4828
4828
  padding: 18px 14px 12px 24px;
4829
4829
  flex: none;
4830
4830
  }
4831
- .mech-pages__title[data-v-e750b5bb] {
4831
+ .mech-pages__title[data-v-665bb42e] {
4832
4832
  margin: 0;
4833
4833
  font-size: 16px;
4834
4834
  font-weight: 600;
4835
4835
  letter-spacing: -0.01em;
4836
4836
  }
4837
- .mech-pages__count[data-v-e750b5bb] {
4837
+ .mech-pages__count[data-v-665bb42e] {
4838
4838
  padding: 2px 8px;
4839
4839
  border-radius: var(--mech-radius-pill);
4840
4840
  background: var(--mech-active);
@@ -4842,7 +4842,7 @@ from {
4842
4842
  font-size: 11.5px;
4843
4843
  font-weight: 600;
4844
4844
  }
4845
- .mech-pages__close[data-v-e750b5bb] {
4845
+ .mech-pages__close[data-v-665bb42e] {
4846
4846
  display: flex;
4847
4847
  align-items: center;
4848
4848
  justify-content: center;
@@ -4855,25 +4855,49 @@ from {
4855
4855
  border-radius: var(--mech-radius-pill);
4856
4856
  cursor: pointer;
4857
4857
  }
4858
- .mech-pages__close .vicon[data-v-e750b5bb] {
4858
+ .mech-pages__close .vicon[data-v-665bb42e] {
4859
4859
  width: 18px;
4860
4860
  height: 18px;
4861
4861
  }
4862
- .mech-pages__close[data-v-e750b5bb]:hover {
4862
+ .mech-pages__close[data-v-665bb42e]:hover {
4863
4863
  background: var(--mech-hover);
4864
4864
  color: var(--mech-fg);
4865
4865
  }
4866
- .mech-pages__toolbar[data-v-e750b5bb] {
4866
+ .mech-pages__toolbar[data-v-665bb42e] {
4867
4867
  display: flex;
4868
4868
  gap: 8px;
4869
- padding: 0 24px 14px;
4869
+ padding: 0 24px 12px;
4870
4870
  flex: none;
4871
4871
  }
4872
- .mech-pages__search-wrap[data-v-e750b5bb] {
4872
+ .mech-pages__search-wrap[data-v-665bb42e] {
4873
4873
  position: relative;
4874
4874
  flex: 1;
4875
4875
  }
4876
- .mech-pages__search-icon[data-v-e750b5bb] {
4876
+ .mech-pages__filters[data-v-665bb42e] {
4877
+ display: flex;
4878
+ align-items: center;
4879
+ justify-content: space-between;
4880
+ gap: 12px;
4881
+ padding: 0 24px 14px;
4882
+ flex: none;
4883
+ }
4884
+ .mech-pages__sort[data-v-665bb42e] {
4885
+ display: flex;
4886
+ align-items: center;
4887
+ gap: 9px;
4888
+ }
4889
+ .mech-pages__sort-label[data-v-665bb42e] {
4890
+ font-size: 10.5px;
4891
+ font-weight: 600;
4892
+ text-transform: uppercase;
4893
+ letter-spacing: 0.05em;
4894
+ color: var(--mech-muted);
4895
+ }
4896
+ .mech-pages__toggle[data-v-665bb42e] {
4897
+ flex: none;
4898
+ white-space: nowrap;
4899
+ }
4900
+ .mech-pages__search-icon[data-v-665bb42e] {
4877
4901
  position: absolute;
4878
4902
  left: 12px;
4879
4903
  top: 50%;
@@ -4883,18 +4907,18 @@ from {
4883
4907
  color: var(--mech-muted);
4884
4908
  pointer-events: none;
4885
4909
  }
4886
- .mech-pages__search[data-v-e750b5bb] {
4910
+ .mech-pages__search[data-v-665bb42e] {
4887
4911
  width: 100%;
4888
4912
  padding-left: 36px;
4889
4913
  }
4890
- .mech-pages__content[data-v-e750b5bb] {
4914
+ .mech-pages__content[data-v-665bb42e] {
4891
4915
  display: flex;
4892
4916
  gap: 14px;
4893
4917
  flex: 1;
4894
4918
  min-height: 0;
4895
4919
  padding: 0 24px 20px;
4896
4920
  }
4897
- .mech-pages__rail[data-v-e750b5bb] {
4921
+ .mech-pages__rail[data-v-665bb42e] {
4898
4922
  flex: none;
4899
4923
  width: 172px;
4900
4924
  display: flex;
@@ -4903,7 +4927,7 @@ from {
4903
4927
  overflow-y: auto;
4904
4928
  padding-right: 2px;
4905
4929
  }
4906
- .mech-pages__rail-item[data-v-e750b5bb] {
4930
+ .mech-pages__rail-item[data-v-665bb42e] {
4907
4931
  display: flex;
4908
4932
  align-items: center;
4909
4933
  gap: 8px;
@@ -4917,51 +4941,51 @@ from {
4917
4941
  color: var(--mech-fg-alt);
4918
4942
  cursor: pointer;
4919
4943
  }
4920
- .mech-pages__rail-item .vicon[data-v-e750b5bb] {
4944
+ .mech-pages__rail-item .vicon[data-v-665bb42e] {
4921
4945
  flex: none;
4922
4946
  width: 15px;
4923
4947
  height: 15px;
4924
4948
  color: var(--mech-muted);
4925
4949
  }
4926
- .mech-pages__rail-item[data-v-e750b5bb]:hover {
4950
+ .mech-pages__rail-item[data-v-665bb42e]:hover {
4927
4951
  background: var(--mech-hover);
4928
4952
  }
4929
- .mech-pages__rail-item.is-active[data-v-e750b5bb] {
4953
+ .mech-pages__rail-item.is-active[data-v-665bb42e] {
4930
4954
  background: var(--mech-accent-soft);
4931
4955
  color: var(--mech-accent);
4932
4956
  font-weight: 500;
4933
4957
  }
4934
- .mech-pages__rail-item.is-active .vicon[data-v-e750b5bb] {
4958
+ .mech-pages__rail-item.is-active .vicon[data-v-665bb42e] {
4935
4959
  color: var(--mech-accent);
4936
4960
  }
4937
- .mech-pages__rail-name[data-v-e750b5bb] {
4961
+ .mech-pages__rail-name[data-v-665bb42e] {
4938
4962
  flex: 1;
4939
4963
  min-width: 0;
4940
4964
  overflow: hidden;
4941
4965
  text-overflow: ellipsis;
4942
4966
  white-space: nowrap;
4943
4967
  }
4944
- .mech-pages__rail-count[data-v-e750b5bb] {
4968
+ .mech-pages__rail-count[data-v-665bb42e] {
4945
4969
  flex: none;
4946
4970
  font-size: 11px;
4947
4971
  color: var(--mech-placeholder);
4948
4972
  }
4949
- .mech-pages__rail-item.is-active .mech-pages__rail-count[data-v-e750b5bb] {
4973
+ .mech-pages__rail-item.is-active .mech-pages__rail-count[data-v-665bb42e] {
4950
4974
  color: var(--mech-accent);
4951
4975
  opacity: 0.7;
4952
4976
  }
4953
- .mech-pages__list[data-v-e750b5bb] {
4977
+ .mech-pages__list[data-v-665bb42e] {
4954
4978
  flex: 1;
4955
4979
  min-width: 0;
4956
4980
  overflow-y: auto;
4957
4981
  }
4958
- .mech-pages__row[data-v-e750b5bb], .mech-pages__thead[data-v-e750b5bb] {
4982
+ .mech-pages__row[data-v-665bb42e], .mech-pages__thead[data-v-665bb42e] {
4959
4983
  display: grid;
4960
4984
  grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr) 96px;
4961
4985
  align-items: center;
4962
4986
  column-gap: 12px;
4963
4987
  }
4964
- .mech-pages__thead[data-v-e750b5bb] {
4988
+ .mech-pages__thead[data-v-665bb42e] {
4965
4989
  position: sticky;
4966
4990
  top: 0;
4967
4991
  z-index: 1;
@@ -4969,14 +4993,14 @@ from {
4969
4993
  background: var(--mech-bg);
4970
4994
  box-shadow: 0 1px 0 var(--mech-border);
4971
4995
  }
4972
- .mech-pages__thead span[data-v-e750b5bb] {
4996
+ .mech-pages__thead span[data-v-665bb42e] {
4973
4997
  font-size: 10.5px;
4974
4998
  font-weight: 600;
4975
4999
  text-transform: uppercase;
4976
5000
  letter-spacing: 0.05em;
4977
5001
  color: var(--mech-muted);
4978
5002
  }
4979
- .mech-pages__group[data-v-e750b5bb] {
5003
+ .mech-pages__group[data-v-665bb42e] {
4980
5004
  display: flex;
4981
5005
  align-items: center;
4982
5006
  gap: 7px;
@@ -4995,36 +5019,36 @@ from {
4995
5019
  border-radius: var(--mech-radius-sm);
4996
5020
  cursor: pointer;
4997
5021
  }
4998
- .mech-pages__group .vicon[data-v-e750b5bb] {
5022
+ .mech-pages__group .vicon[data-v-665bb42e] {
4999
5023
  width: 13px;
5000
5024
  height: 13px;
5001
5025
  }
5002
- .mech-pages__group[data-v-e750b5bb]:hover {
5026
+ .mech-pages__group[data-v-665bb42e]:hover {
5003
5027
  color: var(--mech-fg);
5004
5028
  }
5005
- .mech-pages__row[data-v-e750b5bb] {
5029
+ .mech-pages__row[data-v-665bb42e] {
5006
5030
  padding: 0 10px;
5007
5031
  height: 38px;
5008
5032
  border-radius: var(--mech-radius-sm);
5009
5033
  cursor: pointer;
5010
5034
  }
5011
- .mech-pages__row.is-active[data-v-e750b5bb] {
5035
+ .mech-pages__row.is-active[data-v-665bb42e] {
5012
5036
  background: var(--mech-accent-soft);
5013
5037
  }
5014
- .mech-pages__cell-name[data-v-e750b5bb] {
5038
+ .mech-pages__cell-name[data-v-665bb42e] {
5015
5039
  display: flex;
5016
5040
  align-items: center;
5017
5041
  gap: 8px;
5018
5042
  min-width: 0;
5019
5043
  }
5020
- .mech-pages__name[data-v-e750b5bb] {
5044
+ .mech-pages__name[data-v-665bb42e] {
5021
5045
  font-size: 13.5px;
5022
5046
  font-weight: 500;
5023
5047
  overflow: hidden;
5024
5048
  text-overflow: ellipsis;
5025
5049
  white-space: nowrap;
5026
5050
  }
5027
- .mech-pages__badge[data-v-e750b5bb] {
5051
+ .mech-pages__badge[data-v-665bb42e] {
5028
5052
  flex: none;
5029
5053
  font-size: 10px;
5030
5054
  font-weight: 600;
@@ -5036,17 +5060,17 @@ from {
5036
5060
  border-radius: var(--mech-radius-pill);
5037
5061
  padding: 1px 7px;
5038
5062
  }
5039
- .mech-pages__badge.is-draft[data-v-e750b5bb] {
5063
+ .mech-pages__badge.is-draft[data-v-665bb42e] {
5040
5064
  color: var(--mech-muted);
5041
5065
  }
5042
- .mech-pages__locales[data-v-e750b5bb] {
5066
+ .mech-pages__locales[data-v-665bb42e] {
5043
5067
  flex: none;
5044
5068
  display: inline-flex;
5045
5069
  align-items: center;
5046
5070
  gap: 3px;
5047
5071
  margin-left: 2px;
5048
5072
  }
5049
- .mech-pages__loc[data-v-e750b5bb] {
5073
+ .mech-pages__loc[data-v-665bb42e] {
5050
5074
  min-width: 15px;
5051
5075
  padding: 1px 4px;
5052
5076
  border-radius: var(--mech-radius-sm);
@@ -5060,12 +5084,12 @@ from {
5060
5084
  letter-spacing: 0.02em;
5061
5085
  opacity: 0.5;
5062
5086
  }
5063
- .mech-pages__loc.is-on[data-v-e750b5bb] {
5087
+ .mech-pages__loc.is-on[data-v-665bb42e] {
5064
5088
  background: var(--mech-accent-soft);
5065
5089
  color: var(--mech-accent);
5066
5090
  opacity: 1;
5067
5091
  }
5068
- .mech-pages__cell-path[data-v-e750b5bb] {
5092
+ .mech-pages__cell-path[data-v-665bb42e] {
5069
5093
  min-width: 0;
5070
5094
  overflow: hidden;
5071
5095
  text-overflow: ellipsis;
@@ -5073,16 +5097,16 @@ from {
5073
5097
  font-size: 12.5px;
5074
5098
  color: var(--mech-muted);
5075
5099
  }
5076
- .mech-pages__actions[data-v-e750b5bb] {
5100
+ .mech-pages__actions[data-v-665bb42e] {
5077
5101
  display: flex;
5078
5102
  justify-content: flex-end;
5079
5103
  gap: 1px;
5080
5104
  opacity: 0;
5081
5105
  }
5082
- .mech-pages__row.is-active .mech-pages__actions[data-v-e750b5bb], .mech-pages__row:hover .mech-pages__actions[data-v-e750b5bb] {
5106
+ .mech-pages__row.is-active .mech-pages__actions[data-v-665bb42e], .mech-pages__row:hover .mech-pages__actions[data-v-665bb42e] {
5083
5107
  opacity: 1;
5084
5108
  }
5085
- .mech-pages__actions button[data-v-e750b5bb] {
5109
+ .mech-pages__actions button[data-v-665bb42e] {
5086
5110
  display: flex;
5087
5111
  align-items: center;
5088
5112
  justify-content: center;
@@ -5095,24 +5119,24 @@ from {
5095
5119
  cursor: pointer;
5096
5120
  line-height: 1;
5097
5121
  }
5098
- .mech-pages__actions button .vicon[data-v-e750b5bb] {
5122
+ .mech-pages__actions button .vicon[data-v-665bb42e] {
5099
5123
  width: 15px;
5100
5124
  height: 15px;
5101
5125
  }
5102
- .mech-pages__actions button[data-v-e750b5bb]:hover {
5126
+ .mech-pages__actions button[data-v-665bb42e]:hover {
5103
5127
  background: var(--mech-active);
5104
5128
  color: var(--mech-fg);
5105
5129
  }
5106
- .mech-pages__actions button.is-danger[data-v-e750b5bb]:hover {
5130
+ .mech-pages__actions button.is-danger[data-v-665bb42e]:hover {
5107
5131
  color: var(--mech-error);
5108
5132
  }
5109
- .mech-pages__empty[data-v-e750b5bb] {
5133
+ .mech-pages__empty[data-v-665bb42e] {
5110
5134
  padding: 24px 10px;
5111
5135
  margin: 0;
5112
5136
  color: var(--mech-muted);
5113
5137
  font-size: 13px;
5114
5138
  }
5115
- .mech-pages__preview[data-v-e750b5bb] {
5139
+ .mech-pages__preview[data-v-665bb42e] {
5116
5140
  flex: none;
5117
5141
  align-self: flex-start;
5118
5142
  max-height: 100%;
@@ -5124,18 +5148,18 @@ from {
5124
5148
  box-shadow: var(--mech-shadow-dialog);
5125
5149
  overflow: hidden;
5126
5150
  }
5127
- .mech-pages__preview-frame[data-v-e750b5bb] {
5151
+ .mech-pages__preview-frame[data-v-665bb42e] {
5128
5152
  flex: 0 1 auto;
5129
5153
  min-height: 0;
5130
5154
  overflow: hidden;
5131
5155
  background: var(--mech-app-bg);
5132
5156
  }
5133
- .mech-pages__preview-frame img[data-v-e750b5bb] {
5157
+ .mech-pages__preview-frame img[data-v-665bb42e] {
5134
5158
  display: block;
5135
5159
  width: 100%;
5136
5160
  height: auto;
5137
5161
  }
5138
- .mech-pages__preview-empty[data-v-e750b5bb] {
5162
+ .mech-pages__preview-empty[data-v-665bb42e] {
5139
5163
  display: flex;
5140
5164
  flex-direction: column;
5141
5165
  align-items: center;
@@ -5144,16 +5168,16 @@ from {
5144
5168
  padding: 48px 16px;
5145
5169
  color: var(--mech-muted);
5146
5170
  }
5147
- .mech-pages__preview-empty p[data-v-e750b5bb] {
5171
+ .mech-pages__preview-empty p[data-v-665bb42e] {
5148
5172
  margin: 8px 0 0;
5149
5173
  font-size: 13px;
5150
5174
  font-weight: 500;
5151
5175
  }
5152
- .mech-pages__preview-empty code[data-v-e750b5bb] {
5176
+ .mech-pages__preview-empty code[data-v-665bb42e] {
5153
5177
  font-size: 11.5px;
5154
5178
  color: var(--mech-placeholder);
5155
5179
  }
5156
- .mech-pages__preview-monogram[data-v-e750b5bb] {
5180
+ .mech-pages__preview-monogram[data-v-665bb42e] {
5157
5181
  display: flex;
5158
5182
  align-items: center;
5159
5183
  justify-content: center;
@@ -5164,7 +5188,7 @@ from {
5164
5188
  font-size: 22px;
5165
5189
  font-weight: 600;
5166
5190
  }
5167
- .mech-pages__preview-caption[data-v-e750b5bb] {
5191
+ .mech-pages__preview-caption[data-v-665bb42e] {
5168
5192
  flex: none;
5169
5193
  display: flex;
5170
5194
  flex-direction: column;
@@ -5172,14 +5196,14 @@ from {
5172
5196
  padding: 12px 16px 14px;
5173
5197
  border-top: 1px solid var(--mech-border);
5174
5198
  }
5175
- .mech-pages__preview-name[data-v-e750b5bb] {
5199
+ .mech-pages__preview-name[data-v-665bb42e] {
5176
5200
  font-size: 13px;
5177
5201
  font-weight: 600;
5178
5202
  overflow: hidden;
5179
5203
  text-overflow: ellipsis;
5180
5204
  white-space: nowrap;
5181
5205
  }
5182
- .mech-pages__preview-path[data-v-e750b5bb] {
5206
+ .mech-pages__preview-path[data-v-665bb42e] {
5183
5207
  font-size: 11.5px;
5184
5208
  color: var(--mech-muted);
5185
5209
  overflow: hidden;
@@ -5187,7 +5211,7 @@ from {
5187
5211
  white-space: nowrap;
5188
5212
  }
5189
5213
  @media (max-width: 1160px) {
5190
- .mech-pages__preview[data-v-e750b5bb] {
5214
+ .mech-pages__preview[data-v-665bb42e] {
5191
5215
  display: none;
5192
5216
  }
5193
5217
  }.mech-pagebar[data-v-a0f85ad0] {