zdashboard 2.8.6 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/cli.js +78 -514
  2. package/dist/cli.js.map +1 -1
  3. package/dist/web/assets/CodeViewer-yUtAi1hT.js +307 -0
  4. package/dist/web/assets/{FileIcon-68etP2t6.js → FileIcon-DCL9OD6I.js} +1 -1
  5. package/dist/web/assets/{FilterPills-DGfzMpn_.js → FilterPills-BD2vsIx2.js} +1 -1
  6. package/dist/web/assets/{Sidebar-N0HiMJRK.js → Sidebar-CsmNxVjL.js} +1 -1
  7. package/dist/web/assets/{Sidebar-D83uLTNy.js → Sidebar-DxeR1Shk.js} +1 -1
  8. package/dist/web/assets/{Workspace-BpSq60xh.js → Workspace-BGj3n613.js} +1 -1
  9. package/dist/web/assets/Workspace-CUepnOlM.js +1 -0
  10. package/dist/web/assets/Workspace-D0rSzljF.js +1 -0
  11. package/dist/web/assets/{Workspace-DW8xX3Tg.js → Workspace-DUK4Lm-v.js} +1 -1
  12. package/dist/web/assets/{index-DH1Mqw-g.css → index--t_ijYil.css} +1 -1
  13. package/dist/web/assets/{index-D_uh-zkI.js → index-veTBv7Qv.js} +12 -12
  14. package/dist/web/assets/{usePluginData-Bk2M7LNj.js → usePluginData-mjHueOjf.js} +1 -1
  15. package/dist/web/assets/web-BODcUPmi.js +2 -0
  16. package/dist/web/assets/web-CsCyTuDw.js +2 -0
  17. package/dist/web/assets/{web-CEB9kTEr.js → web-D6VGQFbH.js} +2 -2
  18. package/dist/web/assets/{web-CbW9uGDV.js → web-DIZjnUb4.js} +2 -2
  19. package/dist/web/index.html +2 -2
  20. package/package.json +1 -1
  21. package/dist/web/assets/CodeViewer-_jAxbWVL.js +0 -10
  22. package/dist/web/assets/ImageViewer-ChZdzYPf.js +0 -298
  23. package/dist/web/assets/Workspace-BE7p2hNz.js +0 -1
  24. package/dist/web/assets/Workspace-DjL1fdji.js +0 -2
  25. package/dist/web/assets/Workspace-DrN9--Je.js +0 -1
  26. package/dist/web/assets/web-BZukfmmT.js +0 -2
  27. package/dist/web/assets/web-CGvrDSNo.js +0 -2
  28. package/dist/web/assets/web-CLKkH6eO.js +0 -2
package/dist/cli.js CHANGED
@@ -5,45 +5,11 @@ import path9 from "path";
5
5
  import fs9 from "fs";
6
6
  import { fileURLToPath as fileURLToPath2 } from "url";
7
7
  import { access, readdir } from "fs/promises";
8
- import { parseArgs as utilParseArgs } from "util";
9
-
10
- // src/server/detect.ts
11
- import fs from "fs";
12
- import path from "path";
13
- import { execFile } from "child_process";
14
- var JUST_PROBE_TIMEOUT_MS = 5e3;
15
- var JUST_FALLBACK_TIMEOUT_MS = 3e3;
16
- function justAvailable(cwd) {
17
- const probe = (args, timeout) => new Promise((resolve) => {
18
- const child = execFile("just", args, { cwd, timeout }, (err) => resolve(!err));
19
- if (child.killed) resolve(false);
20
- });
21
- return probe(["--list", "--unsupported"], JUST_PROBE_TIMEOUT_MS).then((ok) => ok ? true : probe(["--version"], JUST_FALLBACK_TIMEOUT_MS));
22
- }
23
- async function detect(root) {
24
- const hasOpenspec = fs.existsSync(path.join(root, "openspec"));
25
- const hasDocs = fs.existsSync(path.join(root, "docs"));
26
- const hasJust = await justAvailable(root);
27
- return { hasOpenspec, hasDocs, hasJust };
28
- }
29
- async function detectLiveShape(root) {
30
- return detect(root);
31
- }
32
-
33
- // src/cli.ts
34
- import { Context } from "cordis";
35
-
36
- // src/core/server.ts
37
- import http from "http";
38
- import fs3 from "fs";
39
- import path3 from "path";
40
- import crypto from "crypto";
41
- import { fileURLToPath } from "url";
42
8
 
43
9
  // package.json
44
10
  var package_default = {
45
11
  name: "zdashboard",
46
- version: "2.8.6",
12
+ version: "2.10.0",
47
13
  description: "ZCode skill dashboard platform \u2014 pluggable viewers for zdesign/zview/zreview/zgoal",
48
14
  type: "module",
49
15
  bin: {
@@ -134,12 +100,47 @@ var package_default = {
134
100
  }
135
101
  };
136
102
 
103
+ // src/cli.ts
104
+ import { parseArgs as utilParseArgs } from "util";
105
+
106
+ // src/server/detect.ts
107
+ import fs from "fs";
108
+ import path from "path";
109
+ import { execFile } from "child_process";
110
+ var JUST_PROBE_TIMEOUT_MS = 5e3;
111
+ var JUST_FALLBACK_TIMEOUT_MS = 3e3;
112
+ function justAvailable(cwd) {
113
+ const probe = (args, timeout) => new Promise((resolve) => {
114
+ const child = execFile("just", args, { cwd, timeout }, (err) => resolve(!err));
115
+ if (child.killed) resolve(false);
116
+ });
117
+ return probe(["--list", "--unsupported"], JUST_PROBE_TIMEOUT_MS).then((ok) => ok ? true : probe(["--version"], JUST_FALLBACK_TIMEOUT_MS));
118
+ }
119
+ async function detect(root) {
120
+ const hasOpenspec = fs.existsSync(path.join(root, "openspec"));
121
+ const hasDocs = fs.existsSync(path.join(root, "docs"));
122
+ const hasJust = await justAvailable(root);
123
+ return { hasOpenspec, hasDocs, hasJust };
124
+ }
125
+ async function detectLiveShape(root) {
126
+ return detect(root);
127
+ }
128
+
129
+ // src/cli.ts
130
+ import { Context } from "cordis";
131
+
137
132
  // src/core/server.ts
133
+ import http from "http";
134
+ import fs3 from "fs";
135
+ import path3 from "path";
136
+ import crypto from "crypto";
137
+ import { fileURLToPath } from "url";
138
138
  import { Service } from "cordis";
139
139
 
140
140
  // src/core/instance.ts
141
141
  import fs2 from "fs";
142
142
  import path2 from "path";
143
+ var CURRENT_VERSION = package_default.version;
143
144
  var RECORD_FILE = ".zdev/dashboard.json";
144
145
  var VERIFY_TIMEOUT_MS = 1500;
145
146
  var STOP_POLL_MS = 2e3;
@@ -169,7 +170,8 @@ function writeRecord(root, port) {
169
170
  pid: process.pid,
170
171
  port,
171
172
  root,
172
- startedAt: (/* @__PURE__ */ new Date()).toISOString()
173
+ startedAt: (/* @__PURE__ */ new Date()).toISOString(),
174
+ version: CURRENT_VERSION
173
175
  };
174
176
  if (old?.plugins && typeof old.plugins === "object") {
175
177
  rec.plugins = old.plugins;
@@ -269,20 +271,27 @@ async function fetchWithTimeout(url) {
269
271
  async function verifyRoot(port, root) {
270
272
  try {
271
273
  const res = await fetchWithTimeout(`http://127.0.0.1:${port}/__config`);
272
- if (res.status !== 200) return false;
274
+ if (res.status !== 200) return { reusable: false };
273
275
  const body = await res.json();
274
- if (typeof body.root !== "string") return false;
275
- return body.root === root;
276
+ if (typeof body.root !== "string") return { reusable: false };
277
+ return {
278
+ reusable: body.root === root,
279
+ version: typeof body.version === "string" ? body.version : void 0
280
+ };
276
281
  } catch {
277
- return false;
282
+ return { reusable: false };
278
283
  }
279
284
  }
280
- async function findReusable(root) {
285
+ async function findReusable(root, currentVersion) {
281
286
  const rec = readRecord(root);
282
287
  if (!rec) return null;
283
288
  if (!isAlive(rec.pid)) return null;
284
- if (!await verifyRoot(rec.port, root)) return null;
285
- return rec;
289
+ const v = await verifyRoot(rec.port, root);
290
+ if (!v.reusable) return null;
291
+ if (v.version && v.version !== currentVersion) {
292
+ return { status: "stale-version", record: rec, liveVersion: v.version };
293
+ }
294
+ return { status: "reuse", record: rec };
286
295
  }
287
296
  async function stopInstance(record) {
288
297
  try {
@@ -1031,9 +1040,9 @@ var DashboardService = class extends Service3 {
1031
1040
  res.end('{"error":"method not allowed"}');
1032
1041
  });
1033
1042
  }
1034
- register(manifest6) {
1035
- this.plugins.set(manifest6.mode, manifest6);
1036
- this.ctx.effect(() => () => this.plugins.delete(manifest6.mode));
1043
+ register(manifest5) {
1044
+ this.plugins.set(manifest5.mode, manifest5);
1045
+ this.ctx.effect(() => () => this.plugins.delete(manifest5.mode));
1037
1046
  }
1038
1047
  list() {
1039
1048
  return Array.from(this.plugins.values());
@@ -1196,7 +1205,7 @@ var JustRunner = class {
1196
1205
 
1197
1206
  // src/sdk/server.ts
1198
1207
  function definePlugin(def) {
1199
- const { manifest: manifest6, setup } = def;
1208
+ const { manifest: manifest5, setup } = def;
1200
1209
  return {
1201
1210
  inject: ["server", "dashboard", "reload"],
1202
1211
  apply(ctx) {
@@ -1206,26 +1215,26 @@ function definePlugin(def) {
1206
1215
  try {
1207
1216
  fn();
1208
1217
  } catch (e) {
1209
- console.error(`[zdashboard] plugin ${manifest6.mode} dispose error:`, e);
1218
+ console.error(`[zdashboard] plugin ${manifest5.mode} dispose error:`, e);
1210
1219
  }
1211
1220
  }
1212
1221
  });
1213
- ctx.dashboard.register(manifest6);
1222
+ ctx.dashboard.register(manifest5);
1214
1223
  const respondWith = (handler) => async (req, res) => {
1215
1224
  if (res.headersSent) return;
1216
1225
  try {
1217
1226
  const data = await handler(req, res);
1218
1227
  if (data !== void 0 && !res.writableEnded) json(res, data);
1219
1228
  } catch (e) {
1220
- console.error(`[zdashboard] plugin ${manifest6.mode} route error:`, e);
1229
+ console.error(`[zdashboard] plugin ${manifest5.mode} route error:`, e);
1221
1230
  if (!res.headersSent) json(res, { error: "internal" }, 500);
1222
1231
  }
1223
1232
  };
1224
1233
  const pctx = {
1225
- mode: manifest6.mode,
1234
+ mode: manifest5.mode,
1226
1235
  config() {
1227
- const schema = manifest6.config ?? {};
1228
- const stored = ctx.server.getPluginConfig(manifest6.mode) ?? {};
1236
+ const schema = manifest5.config ?? {};
1237
+ const stored = ctx.server.getPluginConfig(manifest5.mode) ?? {};
1229
1238
  const defaults = Object.fromEntries(
1230
1239
  Object.entries(schema).map(([key, field]) => [key, field.default])
1231
1240
  );
@@ -1248,7 +1257,7 @@ function definePlugin(def) {
1248
1257
  ctx.server.static(prefix, dir);
1249
1258
  },
1250
1259
  broadcast(event, data) {
1251
- ctx.reload?.broadcast(`plugin:${manifest6.mode}:${event}`, data ?? "");
1260
+ ctx.reload?.broadcast(`plugin:${manifest5.mode}:${event}`, data ?? "");
1252
1261
  },
1253
1262
  onDispose(fn) {
1254
1263
  disposers.push(fn);
@@ -1558,459 +1567,6 @@ var apply6 = defineBuiltin({
1558
1567
  }
1559
1568
  });
1560
1569
 
1561
- // src/plugins/market/manifest.ts
1562
- var manifest5 = {
1563
- mode: "market",
1564
- label: "\u7075\u611F\u5E02\u573A",
1565
- icon: "\u2728",
1566
- description: "Logo / \u52A8\u6548 / \u8BBE\u8BA1\u7075\u611F\u6D4F\u89C8 \xB7 \u8F6C\u63D0\u793A\u8BCD\u95ED\u73AF",
1567
- order: 40
1568
- };
1569
-
1570
- // src/plugins/market/sources/logotypes.ts
1571
- var LOGOTYPES = [
1572
- // ---- tech 消费与硬件 ----
1573
- { id: "apple", name: "Apple", category: "tech" },
1574
- { id: "google", name: "Google", category: "tech" },
1575
- { id: "samsung", name: "Samsung", category: "tech" },
1576
- { id: "huawei", name: "Huawei", category: "tech" },
1577
- { id: "xiaomi", name: "Xiaomi", category: "tech" },
1578
- { id: "sony", name: "Sony", category: "tech" },
1579
- { id: "panasonic", name: "Panasonic", category: "tech" },
1580
- { id: "lg", name: "LG", category: "tech" },
1581
- { id: "nvidia", name: "NVIDIA", category: "tech" },
1582
- { id: "amd", name: "AMD", category: "tech" },
1583
- { id: "intel", name: "Intel", category: "tech" },
1584
- { id: "oracle", name: "Oracle", category: "tech" },
1585
- { id: "dell", name: "Dell", category: "tech" },
1586
- { id: "asus", name: "ASUS", category: "tech" },
1587
- { id: "lenovo", name: "Lenovo", category: "tech" },
1588
- { id: "razer", name: "Razer", category: "tech" },
1589
- { id: "logitech", name: "Logitech", category: "tech" },
1590
- { id: "nikon", name: "Nikon", category: "tech" },
1591
- { id: "tesla", name: "Tesla", category: "tech" },
1592
- { id: "nokia", name: "Nokia", category: "tech" },
1593
- { id: "oneplus", name: "OnePlus", category: "tech" },
1594
- { id: "oppo", name: "OPPO", category: "tech" },
1595
- // ---- social 社交内容 ----
1596
- { id: "facebook", name: "Facebook", category: "social" },
1597
- { id: "instagram", name: "Instagram", category: "social" },
1598
- { id: "whatsapp", name: "WhatsApp", category: "social" },
1599
- { id: "signal", name: "Signal", category: "social" },
1600
- { id: "telegram", name: "Telegram", category: "social" },
1601
- { id: "discord", name: "Discord", category: "social" },
1602
- { id: "slack", name: "Slack", category: "social" },
1603
- { id: "x", name: "X", category: "social" },
1604
- { id: "threads", name: "Threads", category: "social" },
1605
- { id: "bluesky", name: "Bluesky", category: "social" },
1606
- { id: "mastodon", name: "Mastodon", category: "social" },
1607
- { id: "reddit", name: "Reddit", category: "social" },
1608
- { id: "pinterest", name: "Pinterest", category: "social" },
1609
- { id: "tiktok", name: "TikTok", category: "social" },
1610
- { id: "youtube", name: "YouTube", category: "social" },
1611
- { id: "twitch", name: "Twitch", category: "social" },
1612
- { id: "wechat", name: "WeChat", category: "social" },
1613
- { id: "sinaweibo", name: "Sina Weibo", category: "social" },
1614
- { id: "bilibili", name: "bilibili", category: "social" },
1615
- { id: "tencentqq", name: "Tencent QQ", category: "social" },
1616
- // ---- dev 开发 ----
1617
- { id: "github", name: "GitHub", category: "dev" },
1618
- { id: "gitlab", name: "GitLab", category: "dev" },
1619
- { id: "bitbucket", name: "Bitbucket", category: "dev" },
1620
- { id: "git", name: "Git", category: "dev" },
1621
- { id: "githubactions", name: "GitHub Actions", category: "dev" },
1622
- { id: "react", name: "React", category: "dev" },
1623
- { id: "vuedotjs", name: "Vue.js", category: "dev" },
1624
- { id: "angular", name: "Angular", category: "dev" },
1625
- { id: "svelte", name: "Svelte", category: "dev" },
1626
- { id: "nextdotjs", name: "Next.js", category: "dev" },
1627
- { id: "nuxtdotjs", name: "Nuxt", category: "dev" },
1628
- { id: "astro", name: "Astro", category: "dev" },
1629
- { id: "typescript", name: "TypeScript", category: "dev" },
1630
- { id: "javascript", name: "JavaScript", category: "dev" },
1631
- { id: "nodedotjs", name: "Node.js", category: "dev" },
1632
- { id: "python", name: "Python", category: "dev" },
1633
- { id: "rust", name: "Rust", category: "dev" },
1634
- { id: "go", name: "Go", category: "dev" },
1635
- { id: "swift", name: "Swift", category: "dev" },
1636
- { id: "kotlin", name: "Kotlin", category: "dev" },
1637
- { id: "php", name: "PHP", category: "dev" },
1638
- { id: "laravel", name: "Laravel", category: "dev" },
1639
- { id: "ruby", name: "Ruby", category: "dev" },
1640
- { id: "rubyonrails", name: "Ruby on Rails", category: "dev" },
1641
- { id: "cplusplus", name: "C++", category: "dev" },
1642
- { id: "sass", name: "Sass", category: "dev" },
1643
- { id: "tailwindcss", name: "Tailwind CSS", category: "dev" },
1644
- { id: "pnpm", name: "pnpm", category: "dev" },
1645
- { id: "npm", name: "npm", category: "dev" },
1646
- { id: "yarn", name: "Yarn", category: "dev" },
1647
- { id: "vite", name: "Vite", category: "dev" },
1648
- { id: "vitest", name: "Vitest", category: "dev" },
1649
- { id: "storybook", name: "Storybook", category: "dev" },
1650
- { id: "docker", name: "Docker", category: "dev" },
1651
- { id: "kubernetes", name: "Kubernetes", category: "dev" },
1652
- { id: "terraform", name: "Terraform", category: "dev" },
1653
- { id: "ansible", name: "Ansible", category: "dev" },
1654
- { id: "jenkins", name: "Jenkins", category: "dev" },
1655
- { id: "nginx", name: "NGINX", category: "dev" },
1656
- { id: "postgresql", name: "PostgreSQL", category: "dev" },
1657
- { id: "mysql", name: "MySQL", category: "dev" },
1658
- { id: "mongodb", name: "MongoDB", category: "dev" },
1659
- { id: "redis", name: "Redis", category: "dev" },
1660
- { id: "sqlite", name: "SQLite", category: "dev" },
1661
- { id: "elasticsearch", name: "Elasticsearch", category: "dev" },
1662
- { id: "graphql", name: "GraphQL", category: "dev" },
1663
- { id: "firebase", name: "Firebase", category: "dev" },
1664
- { id: "linux", name: "Linux", category: "dev" },
1665
- { id: "ubuntu", name: "Ubuntu", category: "dev" },
1666
- { id: "archlinux", name: "Arch Linux", category: "dev" },
1667
- { id: "vim", name: "Vim", category: "dev" },
1668
- { id: "xcode", name: "Xcode", category: "dev" },
1669
- { id: "dotnet", name: ".NET", category: "dev" },
1670
- { id: "sublimetext", name: "Sublime Text", category: "dev" },
1671
- // ---- cloud 云服务 ----
1672
- { id: "googlecloud", name: "Google Cloud", category: "cloud" },
1673
- { id: "cloudflare", name: "Cloudflare", category: "cloud" },
1674
- { id: "vercel", name: "Vercel", category: "cloud" },
1675
- { id: "netlify", name: "Netlify", category: "cloud" },
1676
- { id: "heroku", name: "Heroku", category: "cloud" },
1677
- { id: "digitalocean", name: "DigitalOcean", category: "cloud" },
1678
- { id: "hetzner", name: "Hetzner", category: "cloud" },
1679
- { id: "fastly", name: "Fastly", category: "cloud" },
1680
- { id: "flydotio", name: "Fly.io", category: "cloud" },
1681
- { id: "render", name: "Render", category: "cloud" },
1682
- { id: "supabase", name: "Supabase", category: "cloud" },
1683
- { id: "alibabacloud", name: "Alibaba Cloud", category: "cloud" },
1684
- { id: "scaleway", name: "Scaleway", category: "cloud" },
1685
- // ---- finance 金融支付 ----
1686
- { id: "visa", name: "Visa", category: "finance" },
1687
- { id: "mastercard", name: "Mastercard", category: "finance" },
1688
- { id: "paypal", name: "PayPal", category: "finance" },
1689
- { id: "stripe", name: "Stripe", category: "finance" },
1690
- { id: "wise", name: "Wise", category: "finance" },
1691
- { id: "square", name: "Square", category: "finance" },
1692
- { id: "applepay", name: "Apple Pay", category: "finance" },
1693
- { id: "googlepay", name: "Google Pay", category: "finance" },
1694
- { id: "alipay", name: "Alipay", category: "finance" },
1695
- { id: "bitcoin", name: "Bitcoin", category: "finance" },
1696
- { id: "ethereum", name: "Ethereum", category: "finance" },
1697
- { id: "binance", name: "Binance", category: "finance" },
1698
- { id: "coinbase", name: "Coinbase", category: "finance" },
1699
- { id: "americanexpress", name: "American Express", category: "finance" },
1700
- // ---- media 媒体娱乐 ----
1701
- { id: "netflix", name: "Netflix", category: "media" },
1702
- { id: "spotify", name: "Spotify", category: "media" },
1703
- { id: "applemusic", name: "Apple Music", category: "media" },
1704
- { id: "soundcloud", name: "SoundCloud", category: "media" },
1705
- { id: "youtubemusic", name: "YouTube Music", category: "media" },
1706
- { id: "lastdotfm", name: "Last.fm", category: "media" },
1707
- { id: "primevideo", name: "Prime Video", category: "media" },
1708
- { id: "crunchyroll", name: "Crunchyroll", category: "media" },
1709
- { id: "vlcmediaplayer", name: "VLC Media Player", category: "media" },
1710
- { id: "unsplash", name: "Unsplash", category: "media" },
1711
- { id: "behance", name: "Behance", category: "media" },
1712
- { id: "dribbble", name: "Dribbble", category: "media" },
1713
- { id: "substack", name: "Substack", category: "media" },
1714
- { id: "pixiv", name: "pixiv", category: "media" },
1715
- // ---- gaming 游戏 ----
1716
- { id: "steam", name: "Steam", category: "gaming" },
1717
- { id: "epicgames", name: "Epic Games", category: "gaming" },
1718
- { id: "playstation", name: "PlayStation", category: "gaming" },
1719
- { id: "nintendo", name: "Nintendo", category: "gaming" },
1720
- { id: "nintendoswitch", name: "Nintendo Switch", category: "gaming" },
1721
- { id: "roblox", name: "Roblox", category: "gaming" },
1722
- { id: "unity", name: "Unity", category: "gaming" },
1723
- { id: "unrealengine", name: "Unreal Engine", category: "gaming" },
1724
- { id: "godotengine", name: "Godot Engine", category: "gaming" },
1725
- { id: "itchdotio", name: "itch.io", category: "gaming" },
1726
- { id: "riotgames", name: "Riot Games", category: "gaming" },
1727
- { id: "dota2", name: "Dota 2", category: "gaming" },
1728
- { id: "ea", name: "EA", category: "gaming" },
1729
- // ---- design 设计创作 ----
1730
- { id: "figma", name: "Figma", category: "design" },
1731
- { id: "sketch", name: "Sketch", category: "design" },
1732
- { id: "canva", name: "Canva", category: "design" },
1733
- { id: "adobe", name: "Adobe", category: "design" },
1734
- { id: "adobephotoshop", name: "Adobe Photoshop", category: "design" },
1735
- { id: "adobeillustrator", name: "Adobe Illustrator", category: "design" },
1736
- { id: "adobeaftereffects", name: "Adobe After Effects", category: "design" },
1737
- { id: "adobepremierepro", name: "Adobe Premiere Pro", category: "design" },
1738
- { id: "blender", name: "Blender", category: "design" },
1739
- { id: "affinitydesigner", name: "Affinity Designer", category: "design" },
1740
- { id: "framer", name: "Framer", category: "design" },
1741
- { id: "webflow", name: "Webflow", category: "design" },
1742
- { id: "wordpress", name: "WordPress", category: "design" },
1743
- { id: "penpot", name: "Penpot", category: "design" },
1744
- { id: "excalidraw", name: "Excalidraw", category: "design" },
1745
- { id: "miro", name: "Miro", category: "design" },
1746
- // ---- shopping 电商零售 ----
1747
- { id: "shopify", name: "Shopify", category: "shopping" },
1748
- { id: "woocommerce", name: "WooCommerce", category: "shopping" },
1749
- { id: "magento", name: "Magento", category: "shopping" },
1750
- { id: "amazon", name: "Amazon", category: "shopping" },
1751
- { id: "ebay", name: "eBay", category: "shopping" },
1752
- { id: "etsy", name: "Etsy", category: "shopping" },
1753
- { id: "ikea", name: "IKEA", category: "shopping" },
1754
- { id: "target", name: "Target", category: "shopping" },
1755
- { id: "walmart", name: "Walmart", category: "shopping" },
1756
- { id: "zalando", name: "Zalando", category: "shopping" },
1757
- // ---- productivity 效率办公 ----
1758
- { id: "notion", name: "Notion", category: "productivity" },
1759
- { id: "todoist", name: "Todoist", category: "productivity" },
1760
- { id: "asana", name: "Asana", category: "productivity" },
1761
- { id: "clickup", name: "ClickUp", category: "productivity" },
1762
- { id: "jira", name: "Jira", category: "productivity" },
1763
- { id: "confluence", name: "Confluence", category: "productivity" },
1764
- { id: "linear", name: "Linear", category: "productivity" },
1765
- { id: "zapier", name: "Zapier", category: "productivity" },
1766
- { id: "n8n", name: "n8n", category: "productivity" },
1767
- { id: "googledrive", name: "Google Drive", category: "productivity" },
1768
- { id: "googledocs", name: "Google Docs", category: "productivity" },
1769
- { id: "gmail", name: "Gmail", category: "productivity" },
1770
- { id: "dropbox", name: "Dropbox", category: "productivity" },
1771
- { id: "zoom", name: "Zoom", category: "productivity" },
1772
- { id: "googlemeet", name: "Google Meet", category: "productivity" },
1773
- // ---- ai 人工智能 ----
1774
- { id: "openai", name: "OpenAI", category: "ai" },
1775
- { id: "anthropic", name: "Anthropic", category: "ai" },
1776
- { id: "huggingface", name: "Hugging Face", category: "ai" },
1777
- { id: "tensorflow", name: "TensorFlow", category: "ai" },
1778
- { id: "pytorch", name: "PyTorch", category: "ai" },
1779
- { id: "opencv", name: "OpenCV", category: "ai" },
1780
- { id: "scikitlearn", name: "scikit-learn", category: "ai" },
1781
- { id: "jupyter", name: "Jupyter", category: "ai" },
1782
- { id: "ollama", name: "Ollama", category: "ai" },
1783
- { id: "langchain", name: "LangChain", category: "ai" },
1784
- { id: "googlegemini", name: "Google Gemini", category: "ai" }
1785
- ];
1786
-
1787
- // src/plugins/market/sources/motions.ts
1788
- var MOTIONS = [
1789
- // ---- animate.css:attention seekers 吸睛 ----
1790
- { id: "animate-bounce", name: "\u5F39\u8DF3", desc: "\u4E0A\u4E0B\u5F39\u8DF3,\u5E38\u7528\u4E8E\u5F15\u5BFC\u6CE8\u610F", cls: "animate__bounce", lib: "animate.css" },
1791
- { id: "animate-flash", name: "\u95EA\u70C1", desc: "\u900F\u660E\u5EA6\u5FEB\u901F\u95EA\u70C1", cls: "animate__flash", lib: "animate.css" },
1792
- { id: "animate-pulse", name: "\u8109\u51B2", desc: "\u7F29\u653E\u547C\u5438,\u5E38\u7528\u4E8E\u52A0\u8F7D\u4E0E\u76F4\u64AD\u72B6\u6001", cls: "animate__pulse", lib: "animate.css" },
1793
- { id: "animate-rubberband", name: "\u6A61\u76AE\u7B4B", desc: "\u5F39\u6027\u62C9\u4F38,\u5F3A\u8C03\u8DA3\u5473\u53CD\u9988", cls: "animate__rubberBand", lib: "animate.css" },
1794
- { id: "animate-shakex", name: "\u6A2A\u5411\u6296\u52A8", desc: "\u5DE6\u53F3\u6296\u52A8,\u5E38\u7528\u4E8E\u9519\u8BEF\u63D0\u793A", cls: "animate__shakeX", lib: "animate.css" },
1795
- { id: "animate-shakey", name: "\u7EB5\u5411\u6296\u52A8", desc: "\u4E0A\u4E0B\u6296\u52A8,\u8868\u5355\u6821\u9A8C\u53CD\u9988", cls: "animate__shakeY", lib: "animate.css" },
1796
- { id: "animate-headshake", name: "\u6447\u5934", desc: "\u7ED5\u7EB5\u8F74\u5C0F\u5E45\u6446\u5934", cls: "animate__headShake", lib: "animate.css" },
1797
- { id: "animate-swing", name: "\u6446\u52A8", desc: "\u9876\u90E8\u60AC\u6302\u5F0F\u5DE6\u53F3\u6446\u52A8", cls: "animate__swing", lib: "animate.css" },
1798
- { id: "animate-tada", name: "\u6B22\u547C", desc: "\u7F29\u653E\u52A0\u65CB\u8F6C\u7684\u7EC4\u5408\u5F3A\u8C03", cls: "animate__tada", lib: "animate.css" },
1799
- { id: "animate-wobble", name: "\u6447\u6643", desc: "\u5927\u5E45\u5DE6\u53F3\u6447\u6643", cls: "animate__wobble", lib: "animate.css" },
1800
- { id: "animate-jello", name: "\u679C\u51BB", desc: "\u503E\u659C\u52A0\u7F29\u653E\u7684\u679C\u51BB\u611F", cls: "animate__jello", lib: "animate.css" },
1801
- { id: "animate-heartbeat", name: "\u5FC3\u8DF3", desc: "\u53CC\u51FB\u5F0F\u5FC3\u8DF3\u7F29\u653E", cls: "animate__heartBeat", lib: "animate.css" },
1802
- // ---- animate.css:入场 ----
1803
- { id: "animate-flipinx", name: "\u7FFB\u8F6C\u5165\u573A X", desc: "\u7ED5 X \u8F74\u7FFB\u8F6C\u5165\u573A", cls: "animate__flipInX", lib: "animate.css" },
1804
- { id: "animate-flipiny", name: "\u7FFB\u8F6C\u5165\u573A Y", desc: "\u7ED5 Y \u8F74\u7FFB\u8F6C\u5165\u573A", cls: "animate__flipInY", lib: "animate.css" },
1805
- { id: "animate-fadein", name: "\u6DE1\u5165", desc: "\u900F\u660E\u5EA6\u6E10\u5165", cls: "animate__fadeIn", lib: "animate.css" },
1806
- { id: "animate-fadeindown", name: "\u6DE1\u5165\u4E0B\u79FB", desc: "\u81EA\u4E0A\u800C\u4E0B\u6DE1\u5165", cls: "animate__fadeInDown", lib: "animate.css" },
1807
- { id: "animate-fadeinleft", name: "\u6DE1\u5165\u53F3\u79FB", desc: "\u81EA\u5DE6\u5411\u53F3\u6DE1\u5165", cls: "animate__fadeInLeft", lib: "animate.css" },
1808
- { id: "animate-fadeinright", name: "\u6DE1\u5165\u5DE6\u79FB", desc: "\u81EA\u53F3\u5411\u5DE6\u6DE1\u5165", cls: "animate__fadeInRight", lib: "animate.css" },
1809
- { id: "animate-fadeinup", name: "\u6DE1\u5165\u4E0A\u79FB", desc: "\u81EA\u4E0B\u800C\u4E0A\u6DE1\u5165,\u5361\u7247\u5217\u8868\u5E38\u7528", cls: "animate__fadeInUp", lib: "animate.css" },
1810
- { id: "animate-fadeinupbig", name: "\u5927\u5E45\u6DE1\u5165\u4E0A\u79FB", desc: "\u5927\u8DDD\u79BB\u81EA\u4E0B\u800C\u4E0A\u6DE1\u5165", cls: "animate__fadeInUpBig", lib: "animate.css" },
1811
- { id: "animate-zoomin", name: "\u653E\u5927\u5165\u573A", desc: "\u7531\u5C0F\u653E\u5927\u6DE1\u5165", cls: "animate__zoomIn", lib: "animate.css" },
1812
- { id: "animate-zoomindown", name: "\u653E\u5927\u5165\u573A(\u4E0B)", desc: "\u81EA\u4E0A\u800C\u4E0B\u653E\u5927\u5165\u573A", cls: "animate__zoomInDown", lib: "animate.css" },
1813
- { id: "animate-slideindown", name: "\u6ED1\u5165(\u4E0B)", desc: "\u81EA\u4E0A\u6ED1\u5165,\u901A\u77E5\u6761\u5E38\u7528", cls: "animate__slideInDown", lib: "animate.css" },
1814
- { id: "animate-slideinleft", name: "\u6ED1\u5165(\u5DE6)", desc: "\u81EA\u5DE6\u6ED1\u5165,\u4FA7\u680F\u62BD\u5C49\u5E38\u7528", cls: "animate__slideInLeft", lib: "animate.css" },
1815
- { id: "animate-slideinright", name: "\u6ED1\u5165(\u53F3)", desc: "\u81EA\u53F3\u6ED1\u5165,\u4FA7\u680F\u62BD\u5C49\u5E38\u7528", cls: "animate__slideInRight", lib: "animate.css" },
1816
- { id: "animate-slideinup", name: "\u6ED1\u5165(\u4E0A)", desc: "\u81EA\u4E0B\u6ED1\u5165,\u5E95\u90E8\u5F39\u5C42\u5E38\u7528", cls: "animate__slideInUp", lib: "animate.css" },
1817
- { id: "animate-backindown", name: "\u56DE\u5F39\u5165\u573A(\u4E0B)", desc: "\u5E26\u56DE\u5F39\u66F2\u7EBF\u81EA\u4E0A\u800C\u4E0B\u5165\u573A", cls: "animate__backInDown", lib: "animate.css" },
1818
- { id: "animate-backinleft", name: "\u56DE\u5F39\u5165\u573A(\u5DE6)", desc: "\u5E26\u56DE\u5F39\u66F2\u7EBF\u81EA\u5DE6\u5165\u573A", cls: "animate__backInLeft", lib: "animate.css" },
1819
- { id: "animate-backinup", name: "\u56DE\u5F39\u5165\u573A(\u4E0A)", desc: "\u5E26\u56DE\u5F39\u66F2\u7EBF\u81EA\u4E0B\u800C\u4E0A\u5165\u573A", cls: "animate__backInUp", lib: "animate.css" },
1820
- { id: "animate-bouncein", name: "\u5F39\u8DF3\u5165\u573A", desc: "\u5F39\u6027\u5F39\u8DF3\u5165\u573A", cls: "animate__bounceIn", lib: "animate.css" },
1821
- { id: "animate-bounceindown", name: "\u5F39\u8DF3\u5165\u573A(\u4E0B)", desc: "\u81EA\u4E0A\u5F39\u8DF3\u5165\u573A", cls: "animate__bounceInDown", lib: "animate.css" },
1822
- { id: "animate-bounceinup", name: "\u5F39\u8DF3\u5165\u573A(\u4E0A)", desc: "\u81EA\u4E0B\u5F39\u8DF3\u5165\u573A", cls: "animate__bounceInUp", lib: "animate.css" },
1823
- { id: "animate-rotatein", name: "\u65CB\u8F6C\u5165\u573A", desc: "\u65CB\u8F6C\u6DE1\u5165", cls: "animate__rotateIn", lib: "animate.css" },
1824
- { id: "animate-rotateindownleft", name: "\u65CB\u8F6C\u5165\u573A(\u5DE6\u4E0B)", desc: "\u81EA\u5DE6\u4E0B\u89D2\u65CB\u8F6C\u6DE1\u5165", cls: "animate__rotateInDownLeft", lib: "animate.css" },
1825
- { id: "animate-lightspeedinright", name: "\u5149\u901F\u5165\u573A", desc: "\u659C\u5207\u52A0\u9AD8\u901F\u98DE\u5165", cls: "animate__lightSpeedInRight", lib: "animate.css" },
1826
- { id: "animate-rollin", name: "\u6EDA\u5165", desc: "\u6C34\u5E73\u6EDA\u8F6C\u5165\u573A", cls: "animate__rollIn", lib: "animate.css" },
1827
- { id: "animate-jackinthebox", name: "\u8DF3\u8DF3\u76D2", desc: "\u5F39\u51FA\u76D2\u5F0F\u8DA3\u5473\u5165\u573A", cls: "animate__jackInTheBox", lib: "animate.css" },
1828
- // ---- animate.css:退场 ----
1829
- { id: "animate-flipoutx", name: "\u7FFB\u8F6C\u9000\u573A X", desc: "\u7ED5 X \u8F74\u7FFB\u8F6C\u9000\u573A", cls: "animate__flipOutX", lib: "animate.css" },
1830
- { id: "animate-fadeout", name: "\u6DE1\u51FA", desc: "\u900F\u660E\u5EA6\u6E10\u51FA", cls: "animate__fadeOut", lib: "animate.css" },
1831
- { id: "animate-fadeoutdown", name: "\u6DE1\u51FA\u4E0B\u79FB", desc: "\u5411\u4E0B\u6DE1\u51FA,\u5F39\u5C42\u5173\u95ED\u5E38\u7528", cls: "animate__fadeOutDown", lib: "animate.css" },
1832
- { id: "animate-zoomout", name: "\u7F29\u5C0F\u9000\u573A", desc: "\u7F29\u5C0F\u6DE1\u51FA", cls: "animate__zoomOut", lib: "animate.css" },
1833
- { id: "animate-slideoutup", name: "\u6ED1\u51FA(\u4E0A)", desc: "\u5411\u4E0A\u6ED1\u51FA,\u901A\u77E5\u5173\u95ED\u5E38\u7528", cls: "animate__slideOutUp", lib: "animate.css" },
1834
- { id: "animate-bounceout", name: "\u5F39\u8DF3\u9000\u573A", desc: "\u5F39\u6027\u5F39\u8DF3\u9000\u573A", cls: "animate__bounceOut", lib: "animate.css" },
1835
- { id: "animate-hinge", name: "\u94F0\u94FE", desc: "\u60AC\u6302\u6446\u52A8\u5760\u843D,\u559C\u5267\u5F0F\u9000\u573A", cls: "animate__hinge", lib: "animate.css" },
1836
- // ---- hover.css:hover 反馈 ----
1837
- { id: "hover-grow", name: "\u653E\u5927", desc: "hover \u65F6\u8F7B\u5FAE\u653E\u5927", cls: "hvr-grow", lib: "hover.css" },
1838
- { id: "hover-shrink", name: "\u7F29\u5C0F", desc: "hover \u65F6\u8F7B\u5FAE\u7F29\u5C0F", cls: "hvr-shrink", lib: "hover.css" },
1839
- { id: "hover-pulse", name: "\u8109\u51B2", desc: "hover \u671F\u95F4\u7F29\u653E\u8109\u51B2", cls: "hvr-pulse", lib: "hover.css" },
1840
- { id: "hover-push", name: "\u63A8\u6324", desc: "hover \u65F6\u538B\u6241\u518D\u56DE\u5F39", cls: "hvr-push", lib: "hover.css" },
1841
- { id: "hover-pop", name: "\u5F39\u51FA", desc: "hover \u65F6\u5F39\u51FA\u653E\u5927", cls: "hvr-pop", lib: "hover.css" },
1842
- { id: "hover-bounce-in", name: "\u5F39\u5165", desc: "hover \u65F6\u5F39\u6027\u653E\u5927", cls: "hvr-bounce-in", lib: "hover.css" },
1843
- { id: "hover-bounce-out", name: "\u5F39\u51FA", desc: "hover \u65F6\u5F39\u6027\u7F29\u5C0F", cls: "hvr-bounce-out", lib: "hover.css" },
1844
- { id: "hover-rotate", name: "\u65CB\u8F6C", desc: "hover \u65F6\u65CB\u8F6C 4 \u5EA6", cls: "hvr-rotate", lib: "hover.css" },
1845
- { id: "hover-grow-rotate", name: "\u653E\u5927\u65CB\u8F6C", desc: "hover \u65F6\u653E\u5927\u5E76\u65CB\u8F6C", cls: "hvr-grow-rotate", lib: "hover.css" },
1846
- { id: "hover-float", name: "\u4E0A\u6D6E", desc: "hover \u65F6\u4E0A\u6D6E,\u6309\u94AE\u5E38\u7528", cls: "hvr-float", lib: "hover.css" },
1847
- { id: "hover-sink", name: "\u4E0B\u6C89", desc: "hover \u65F6\u4E0B\u6C89\u6309\u538B\u611F", cls: "hvr-sink", lib: "hover.css" },
1848
- { id: "hover-bob", name: "\u6D6E\u52A8", desc: "hover \u671F\u95F4\u6301\u7EED\u4E0A\u4E0B\u6D6E\u52A8", cls: "hvr-bob", lib: "hover.css" },
1849
- { id: "hover-hang", name: "\u60AC\u6302", desc: "hover \u671F\u95F4\u60AC\u6302\u6446\u52A8", cls: "hvr-hang", lib: "hover.css" },
1850
- { id: "hover-skew", name: "\u659C\u5207", desc: "hover \u65F6\u659C\u5207\u53D8\u5F62", cls: "hvr-skew", lib: "hover.css" },
1851
- { id: "hover-wobble-horizontal", name: "\u6A2A\u5411\u6447\u6446", desc: "hover \u65F6\u6C34\u5E73\u6447\u6446", cls: "hvr-wobble-horizontal", lib: "hover.css" },
1852
- { id: "hover-wobble-vertical", name: "\u7EB5\u5411\u6447\u6446", desc: "hover \u65F6\u5782\u76F4\u6447\u6446", cls: "hvr-wobble-vertical", lib: "hover.css" },
1853
- { id: "hover-buzz", name: "\u9707\u52A8", desc: "hover \u65F6\u5C0F\u5E45\u9AD8\u9891\u9707\u52A8", cls: "hvr-buzz", lib: "hover.css" },
1854
- { id: "hover-sweep-to-right", name: "\u80CC\u666F\u53F3\u626B", desc: "\u80CC\u666F\u8272\u81EA\u5DE6\u5411\u53F3\u626B\u8FC7", cls: "hvr-sweep-to-right", lib: "hover.css" },
1855
- { id: "hover-bounce-to-right", name: "\u5F39\u6027\u53F3\u586B", desc: "\u80CC\u666F\u5F39\u6027\u586B\u6EE1(\u5411\u53F3)", cls: "hvr-bounce-to-right", lib: "hover.css" },
1856
- { id: "hover-radial-out", name: "\u5F84\u5411\u6269\u6563", desc: "\u80CC\u666F\u81EA\u4E2D\u5FC3\u5706\u5F62\u6269\u6563", cls: "hvr-radial-out", lib: "hover.css" },
1857
- { id: "hover-underline-from-left", name: "\u4E0B\u5212\u7EBF\u6ED1\u5165", desc: "\u4E0B\u5212\u7EBF\u81EA\u5DE6\u6ED1\u5165", cls: "hvr-underline-from-left", lib: "hover.css" },
1858
- { id: "hover-glow", name: "\u53D1\u5149", desc: "hover \u65F6\u5916\u53D1\u5149", cls: "hvr-glow", lib: "hover.css" },
1859
- { id: "hover-shadow", name: "\u9634\u5F71", desc: "hover \u65F6\u51FA\u73B0\u6295\u5F71", cls: "hvr-shadow", lib: "hover.css" },
1860
- { id: "hover-grow-shadow", name: "\u653E\u5927\u6295\u5F71", desc: "hover \u65F6\u653E\u5927\u5E76\u6295\u5F71", cls: "hvr-grow-shadow", lib: "hover.css" },
1861
- { id: "hover-float-shadow", name: "\u4E0A\u6D6E\u6295\u5F71", desc: "hover \u65F6\u4E0A\u6D6E\u5E76\u6295\u5F71", cls: "hvr-float-shadow", lib: "hover.css" }
1862
- ];
1863
-
1864
- // src/plugins/market/sources/inspirations.ts
1865
- var INSPIRATIONS = [
1866
- { id: "shadcn", name: "shadcn/ui", desc: "\u53EF\u590D\u5236\u7C98\u8D34\u7684 React \u7EC4\u4EF6\u96C6,\u4EE3\u7801\u5F52\u4F60\u6240\u6709", url: "https://ui.shadcn.com", tags: ["react", "tailwind", "\u8BBE\u8BA1\u7CFB\u7EDF"] },
1867
- { id: "radix", name: "Radix UI", desc: "\u65E0\u6837\u5F0F\u53EF\u8BBF\u95EE\u6027 React \u57FA\u7840\u7EC4\u4EF6", url: "https://www.radix-ui.com", tags: ["react", "\u65E0\u969C\u788D", "\u57FA\u7840\u7EC4\u4EF6"] },
1868
- { id: "tailwindcss", name: "Tailwind CSS", desc: "\u539F\u5B50\u5316 CSS \u6846\u67B6\u7684\u5B98\u65B9\u7AD9\u70B9", url: "https://tailwindcss.com", tags: ["css", "\u539F\u5B50\u5316", "\u5B98\u7F51"] },
1869
- { id: "antd", name: "Ant Design", desc: "\u4F01\u4E1A\u7EA7 React \u8BBE\u8BA1\u7CFB\u7EDF\u4E0E\u7EC4\u4EF6\u5E93", url: "https://ant.design", tags: ["react", "\u8BBE\u8BA1\u7CFB\u7EDF", "\u4F01\u4E1A\u7EA7"] },
1870
- { id: "arco", name: "Arco Design", desc: "\u5B57\u8282\u8DF3\u52A8\u4F01\u4E1A\u7EA7\u8BBE\u8BA1\u7CFB\u7EDF", url: "https://arco.design", tags: ["react", "\u8BBE\u8BA1\u7CFB\u7EDF", "\u4F01\u4E1A\u7EA7"] },
1871
- { id: "semi", name: "Semi Design", desc: "\u6296\u97F3\u524D\u7AEF\u56E2\u961F\u8BBE\u8BA1\u7CFB\u7EDF", url: "https://semi.design", tags: ["react", "\u8BBE\u8BA1\u7CFB\u7EDF", "\u4E3B\u9898\u5316"] },
1872
- { id: "chakra", name: "Chakra UI", desc: "\u4EE5\u65E0\u969C\u788D\u548C\u4E3B\u9898\u8457\u79F0\u7684 React \u7EC4\u4EF6\u5E93", url: "https://chakra-ui.com", tags: ["react", "\u65E0\u969C\u788D", "\u4E3B\u9898"] },
1873
- { id: "mui", name: "MUI", desc: "Material Design \u98CE\u683C React \u7EC4\u4EF6\u5E93", url: "https://mui.com", tags: ["react", "material", "\u7EC4\u4EF6\u5E93"] },
1874
- { id: "mantine", name: "Mantine", desc: "\u7EC4\u4EF6+hooks \u9F50\u5168\u7684 React \u5168\u5BB6\u6876", url: "https://mantine.dev", tags: ["react", "\u7EC4\u4EF6\u5E93", "hooks"] },
1875
- { id: "naiveui", name: "Naive UI", desc: "Vue 3 \u5168\u7C7B\u578B\u7EC4\u4EF6\u5E93,\u4E3B\u9898\u5B9A\u5236\u7EC6", url: "https://www.naiveui.com", tags: ["vue", "\u7EC4\u4EF6\u5E93", "\u4E3B\u9898"] },
1876
- { id: "element-plus", name: "Element Plus", desc: "Vue 3 \u8001\u724C\u4F01\u4E1A\u7EA7\u7EC4\u4EF6\u5E93", url: "https://element-plus.org", tags: ["vue", "\u7EC4\u4EF6\u5E93", "\u4F01\u4E1A\u7EA7"] },
1877
- { id: "daisyui", name: "daisyUI", desc: "Tailwind \u8BED\u4E49\u5316\u7EC4\u4EF6\u7C7B\u4E0E\u591A\u4E3B\u9898", url: "https://daisyui.com", tags: ["tailwind", "css", "\u4E3B\u9898"] },
1878
- { id: "nextui", name: "NextUI", desc: "\u7F8E\u89C2\u4F18\u5148\u7684 React + Tailwind \u7EC4\u4EF6\u5E93", url: "https://nextui.org", tags: ["react", "tailwind", "\u7EC4\u4EF6\u5E93"] },
1879
- { id: "headlessui", name: "Headless UI", desc: "\u5B8C\u5168\u65E0\u6837\u5F0F\u3001\u5E26\u884C\u4E3A\u7684 React/Vue \u7EC4\u4EF6", url: "https://headlessui.com", tags: ["react", "vue", "\u65E0\u6837\u5F0F"] },
1880
- { id: "carbon", name: "Carbon Design System", desc: "IBM \u5F00\u6E90\u8BBE\u8BA1\u7CFB\u7EDF,token \u4F53\u7CFB\u6559\u79D1\u4E66", url: "https://carbondesignsystem.com", tags: ["\u8BBE\u8BA1\u7CFB\u7EDF", "token", "\u6587\u6863"] },
1881
- { id: "polaris", name: "Polaris", desc: "Shopify \u8BBE\u8BA1\u7CFB\u7EDF,\u7535\u5546\u540E\u53F0\u8303\u5F0F", url: "https://polaris.shopify.com", tags: ["\u8BBE\u8BA1\u7CFB\u7EDF", "react", "\u7535\u5546"] },
1882
- { id: "material3", name: "Material Design 3", desc: "Google \u52A8\u6001\u53D6\u8272\u4E0E\u5F62\u53D8\u8BBE\u8BA1\u89C4\u8303", url: "https://m3.material.io", tags: ["google", "\u8BBE\u8BA1\u7CFB\u7EDF", "\u52A8\u6548"] },
1883
- { id: "storybook", name: "Storybook", desc: "\u7EC4\u4EF6\u5DE5\u4F5C\u53F0\u4E0E\u6587\u6863\u7684\u4E8B\u5B9E\u6807\u51C6", url: "https://storybook.js.org", tags: ["\u7EC4\u4EF6\u6587\u6863", "\u5DE5\u4F5C\u53F0", "\u534F\u4F5C"] },
1884
- { id: "geist", name: "Geist", desc: "Vercel \u6781\u7B80\u8BBE\u8BA1\u7CFB\u7EDF", url: "https://vercel.com/geist", tags: ["\u8BBE\u8BA1\u7CFB\u7EDF", "\u6781\u7B80", "vercel"] },
1885
- { id: "openprops", name: "Open Props", desc: "\u8D85\u5B9E\u7528 CSS \u53D8\u91CF\u96C6\u5408(\u52A8\u6548/\u989C\u8272/\u5E03\u5C40)", url: "https://open-props.style", tags: ["css", "\u53D8\u91CF", "\u52A8\u6548"] },
1886
- { id: "everylayout", name: "Every Layout", desc: "\u7528 CSS \u539F\u751F\u80FD\u529B\u89E3\u51B3\u5E03\u5C40\u95EE\u9898", url: "https://every-layout.dev", tags: ["css", "\u5E03\u5C40", "\u54CD\u5E94\u5F0F"] },
1887
- { id: "animatecss", name: "Animate.css", desc: "\u6700\u6D41\u884C\u7684\u5373\u7528\u578B CSS \u52A8\u753B\u5E93\u5B98\u7F51", url: "https://animate.style", tags: ["css", "\u52A8\u6548", "\u5E93"] },
1888
- { id: "csstricks", name: "CSS-Tricks", desc: "CSS \u6280\u5DE7\u4E0E\u6A21\u5F0F\u7684\u957F\u9752\u793E\u533A", url: "https://css-tricks.com", tags: ["css", "\u6559\u7A0B", "\u6A21\u5F0F"] },
1889
- { id: "webdev", name: "web.dev", desc: "Google Web \u6700\u4F73\u5B9E\u8DF5\u4E0E\u6027\u80FD\u6307\u5357", url: "https://web.dev", tags: ["\u6027\u80FD", "\u6700\u4F73\u5B9E\u8DF5", "google"] },
1890
- { id: "excalidraw", name: "Excalidraw", desc: "\u624B\u7ED8\u98CE\u534F\u4F5C\u767D\u677F,\u5F00\u6E90\u865A\u62DF\u767D\u677F\u6807\u6746", url: "https://excalidraw.com", tags: ["\u767D\u677F", "\u624B\u7ED8\u98CE", "\u534F\u4F5C"] },
1891
- { id: "tldraw", name: "tldraw", desc: "\u65E0\u9650\u753B\u5E03 SDK \u4E0E\u7CBE\u7F8E\u767D\u677F", url: "https://www.tldraw.com", tags: ["\u767D\u677F", "\u753B\u5E03", "sdk"] },
1892
- { id: "penpot", name: "Penpot", desc: "\u5F00\u6E90 Figma \u66FF\u4EE3,\u8BBE\u8BA1\u5F00\u53D1\u540C\u6E90", url: "https://penpot.app", tags: ["\u8BBE\u8BA1\u5DE5\u5177", "\u5F00\u6E90", "\u534F\u4F5C"] },
1893
- { id: "cal", name: "Cal.com", desc: "\u5F00\u6E90\u65E5\u7A0B\u9884\u7EA6,\u4EA7\u54C1\u7AD9\u4E0E\u4EA4\u4E92\u8303\u5F0F", url: "https://cal.com", tags: ["saas", "\u65E5\u7A0B", "\u8868\u5355"] },
1894
- { id: "dub", name: "Dub", desc: "\u5F00\u6E90\u77ED\u94FE\u5E73\u53F0,\u73B0\u4EE3 SaaS \u754C\u9762\u8303\u672C", url: "https://dub.co", tags: ["saas", "\u77ED\u94FE", "\u5206\u6790"] },
1895
- { id: "twenty", name: "Twenty", desc: "\u5F00\u6E90 Notion \u98CE CRM,\u8868\u683C\u4EA4\u4E92\u6559\u79D1\u4E66", url: "https://twenty.com", tags: ["crm", "\u8868\u683C", "saas"] },
1896
- { id: "umami", name: "Umami", desc: "\u9690\u79C1\u53CB\u597D\u7684\u5F00\u6E90\u7AD9\u70B9\u7EDF\u8BA1,\u4EEA\u8868\u76D8\u7B80\u6D01", url: "https://umami.is", tags: ["\u7EDF\u8BA1", "\u9690\u79C1", "\u4EEA\u8868\u76D8"] },
1897
- { id: "plausible", name: "Plausible", desc: "\u6781\u7B80\u5F00\u6E90\u5206\u6790,\u4E00\u5C4F\u4EEA\u8868\u76D8\u8303\u5F0F", url: "https://plausible.io", tags: ["\u7EDF\u8BA1", "\u9690\u79C1", "\u6781\u7B80"] },
1898
- { id: "outline", name: "Outline", desc: "\u5F00\u6E90\u56E2\u961F wiki,\u6392\u7248\u4E0E\u5FEB\u6377\u952E\u4F53\u9A8C\u4F73", url: "https://www.getoutline.com", tags: ["\u6587\u6863", "wiki", "\u56E2\u961F"] },
1899
- { id: "plane", name: "Plane", desc: "\u5F00\u6E90\u9879\u76EE\u7BA1\u7406,issue/\u770B\u677F/\u5468\u671F", url: "https://plane.so", tags: ["\u9879\u76EE\u7BA1\u7406", "\u770B\u677F", "issue"] },
1900
- { id: "huly", name: "Huly", desc: "\u5F00\u6E90\u5168\u6808\u9879\u76EE\u7BA1\u7406,\u89C6\u89C9\u534E\u4E3D", url: "https://huly.io", tags: ["\u9879\u76EE\u7BA1\u7406", "\u89C6\u89C9", "\u5168\u6808"] },
1901
- { id: "uptime-kuma", name: "Uptime Kuma", desc: "\u81EA\u6258\u7BA1\u76D1\u63A7\u4E0E\u72B6\u6001\u9875", url: "https://uptime.kuma.pet", tags: ["\u76D1\u63A7", "\u72B6\u6001\u9875", "\u81EA\u6258\u7BA1"] },
1902
- { id: "homepage", name: "Homepage", desc: "\u73B0\u4EE3\u5316\u81EA\u6258\u7BA1\u5BFC\u822A\u4EEA\u8868\u76D8", url: "https://gethomepage.dev", tags: ["\u4EEA\u8868\u76D8", "\u5BFC\u822A", "\u81EA\u6258\u7BA1"] },
1903
- { id: "nocodb", name: "NocoDB", desc: "\u5F00\u6E90 Airtable \u66FF\u4EE3,\u6570\u636E\u5E93\u8868\u683C\u5316", url: "https://nocodb.com", tags: ["\u6570\u636E\u5E93", "\u8868\u683C", "\u4F4E\u4EE3\u7801"] },
1904
- { id: "bruno", name: "Bruno", desc: "\u79BB\u7EBF\u4F18\u5148\u5F00\u6E90 API \u5BA2\u6237\u7AEF", url: "https://www.usebruno.com", tags: ["api", "\u79BB\u7EBF\u4F18\u5148", "\u5F00\u53D1\u5DE5\u5177"] },
1905
- { id: "grafana", name: "Grafana", desc: "\u5F00\u6E90\u53EF\u89C6\u5316\u76D1\u63A7\u9762\u677F\u6807\u6746", url: "https://grafana.com/oss/grafana/", tags: ["\u76D1\u63A7", "\u53EF\u89C6\u5316", "\u4EEA\u8868\u76D8"] }
1906
- ];
1907
-
1908
- // src/plugins/market/sources/index.ts
1909
- var MARKETS = ["logos", "motions", "inspirations"];
1910
- function isMarketName(v) {
1911
- return MARKETS.includes(v);
1912
- }
1913
- function catalogFor(market) {
1914
- switch (market) {
1915
- case "logos":
1916
- return { entries: LOGOTYPES.map((e) => ({ ...e, slug: e.id })) };
1917
- case "motions":
1918
- return { entries: MOTIONS.map((e) => ({ ...e })) };
1919
- case "inspirations":
1920
- return { entries: INSPIRATIONS.map((e) => ({ ...e })) };
1921
- default:
1922
- return null;
1923
- }
1924
- }
1925
-
1926
- // src/plugins/market/index.ts
1927
- var ALLOWED_PROXY_HOSTS = ["cdn.jsdelivr.net", "data.jsdelivr.com"];
1928
- var ALLOWED_PROXY_PORTS = /* @__PURE__ */ new Set(["", "80", "443"]);
1929
- var PROXY_TIMEOUT_MS = 8e3;
1930
- var PROXY_CACHE_MAX_ENTRIES = 200;
1931
- var PROXY_CACHE_TTL_MS = 10 * 60 * 1e3;
1932
- var CATALOG_PREFIX = "/__market/catalog/";
1933
- var apply7 = defineBuiltin({
1934
- manifest: manifest5,
1935
- setup(ctx) {
1936
- const cache = /* @__PURE__ */ new Map();
1937
- ctx.route("/__market/proxy", async (req, res) => {
1938
- const raw = new URL(req.url || "/", "http://localhost").searchParams.get("url");
1939
- if (!raw) {
1940
- res.writeHead(400);
1941
- res.end("missing url");
1942
- return;
1943
- }
1944
- let target;
1945
- try {
1946
- target = new URL(raw);
1947
- } catch {
1948
- res.writeHead(400);
1949
- res.end("bad url");
1950
- return;
1951
- }
1952
- if (target.protocol !== "https:" && target.protocol !== "http:") {
1953
- res.writeHead(403);
1954
- res.end("scheme not allowed");
1955
- return;
1956
- }
1957
- if (!ALLOWED_PROXY_HOSTS.includes(target.hostname)) {
1958
- res.writeHead(403);
1959
- res.end("host not allowed");
1960
- return;
1961
- }
1962
- if (!ALLOWED_PROXY_PORTS.has(target.port)) {
1963
- res.writeHead(403);
1964
- res.end("port not allowed");
1965
- return;
1966
- }
1967
- const hit = cache.get(raw);
1968
- if (hit && Date.now() - hit.cachedAt < PROXY_CACHE_TTL_MS) {
1969
- res.writeHead(200, { "Content-Type": hit.contentType, "X-Market-Cache": "hit", "Cache-Control": "no-cache" });
1970
- res.end(hit.body);
1971
- return;
1972
- }
1973
- if (hit) cache.delete(raw);
1974
- const controller = new AbortController();
1975
- const timer = setTimeout(() => controller.abort(), PROXY_TIMEOUT_MS);
1976
- try {
1977
- const upstream = await fetch(raw, { signal: controller.signal, redirect: "error" });
1978
- if (!upstream.ok) {
1979
- res.writeHead(502);
1980
- res.end("upstream error");
1981
- return;
1982
- }
1983
- const body = await upstream.text();
1984
- const contentType = upstream.headers.get("content-type") ?? "application/octet-stream";
1985
- cache.set(raw, { body, contentType, cachedAt: Date.now() });
1986
- if (cache.size > PROXY_CACHE_MAX_ENTRIES) {
1987
- const oldest = cache.keys().next().value;
1988
- if (oldest !== void 0) cache.delete(oldest);
1989
- }
1990
- res.writeHead(200, { "Content-Type": contentType, "X-Market-Cache": "miss", "Cache-Control": "no-cache" });
1991
- res.end(body);
1992
- } catch {
1993
- if (!res.headersSent) {
1994
- res.writeHead(502);
1995
- res.end("upstream failed");
1996
- }
1997
- } finally {
1998
- clearTimeout(timer);
1999
- }
2000
- });
2001
- ctx.route("/__market/catalog", async (req, res) => {
2002
- const pathname = new URL(req.url || "/", "http://localhost").pathname;
2003
- const market = pathname.startsWith(CATALOG_PREFIX) ? pathname.slice(CATALOG_PREFIX.length).split("/")[0] : "";
2004
- if (!market || !isMarketName(market)) {
2005
- res.writeHead(404);
2006
- res.end("unknown market");
2007
- return;
2008
- }
2009
- return catalogFor(market);
2010
- });
2011
- }
2012
- });
2013
-
2014
1570
  // src/cli.ts
2015
1571
  var __dirname2 = path9.dirname(fileURLToPath2(import.meta.url));
2016
1572
  var DEFAULT_PORT = 4190;
@@ -2098,21 +1654,29 @@ async function loadExternal(ctx, dir, root) {
2098
1654
  async function main() {
2099
1655
  const args = parseArgs();
2100
1656
  const root = path9.resolve(args.dir);
2101
- const existing = await findReusable(root);
2102
- if (existing && !args.restart) {
1657
+ const found = await findReusable(root, package_default.version);
1658
+ const existing = found?.record ?? null;
1659
+ const autoUpgrade = found?.status === "stale-version";
1660
+ if (existing && !args.restart && !autoUpgrade) {
2103
1661
  const u = `http://localhost:${existing.port}` + (args.page ? `#${args.page}` : "");
2104
1662
  if (args.open) openUrl(u);
2105
1663
  console.log(`[zdashboard] \u5DF2\u590D\u7528\u5B9E\u4F8B ${u}\uFF08--restart \u53EF\u5F3A\u5236\u91CD\u5F00\uFF09`);
2106
1664
  await new Promise((resolve) => process.stdout.write("", () => resolve()));
2107
1665
  process.exit(0);
2108
1666
  }
2109
- const oldRecord = existing && args.restart ? existing : null;
1667
+ const oldRecord = existing && (args.restart || autoUpgrade) ? existing : null;
2110
1668
  if (oldRecord) {
2111
- console.log(`[zdashboard] --restart\uFF1A\u505C\u6B62\u65E7\u5B9E\u4F8B pid=${oldRecord.pid}`);
1669
+ if (autoUpgrade) {
1670
+ console.log(
1671
+ `[zdashboard] \u68C0\u6D4B\u5230\u65E7\u7248\u672C\u5B9E\u4F8B v${found.liveVersion ?? "unknown"}\uFF0C\u81EA\u52A8\u5347\u7EA7\u5230 v${package_default.version}\uFF08\u505C\u6B62\u65E7\u5B9E\u4F8B pid=${oldRecord.pid}\uFF09`
1672
+ );
1673
+ } else {
1674
+ console.log(`[zdashboard] --restart\uFF1A\u505C\u6B62\u65E7\u5B9E\u4F8B pid=${oldRecord.pid}`);
1675
+ }
2112
1676
  await stopInstance(oldRecord);
2113
1677
  }
2114
1678
  const appDir = path9.resolve(__dirname2, "web");
2115
- const BUILTIN_PLUGINS = [apply6, apply3, apply4, apply5, apply7];
1679
+ const BUILTIN_PLUGINS = [apply6, apply3, apply4, apply5];
2116
1680
  if (stripDeadPluginConfig(root, BUILTIN_PLUGINS.map((p) => p.manifest))) {
2117
1681
  console.log("[zdashboard] \u5DF2\u6E05\u7406 dashboard.json \u4E2D\u5185\u7F6E\u63D2\u4EF6\u7684\u8FC7\u65F6\u914D\u7F6E\u952E");
2118
1682
  }
@@ -2135,9 +1699,9 @@ async function main() {
2135
1699
  ctx.plugin(apply, { root });
2136
1700
  ctx.plugin(apply2, { root });
2137
1701
  ctx.plugin(DashboardService);
2138
- for (const apply8 of BUILTIN_PLUGINS) {
1702
+ for (const apply7 of BUILTIN_PLUGINS) {
2139
1703
  try {
2140
- ctx.plugin(apply8, { root });
1704
+ ctx.plugin(apply7, { root });
2141
1705
  } catch (e) {
2142
1706
  console.error("[zdashboard] builtin plugin failed:", e);
2143
1707
  }