zdashboard 2.8.5 → 2.8.6

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 +468 -15
  2. package/dist/cli.js.map +1 -1
  3. package/dist/web/assets/CodeViewer-_jAxbWVL.js +10 -0
  4. package/dist/web/assets/{FileIcon-FyROY2Qe.js → FileIcon-68etP2t6.js} +1 -1
  5. package/dist/web/assets/{FilterPills-DwCH0Z96.js → FilterPills-DGfzMpn_.js} +1 -1
  6. package/dist/web/assets/ImageViewer-ChZdzYPf.js +298 -0
  7. package/dist/web/assets/{Sidebar-Cz3W5MP6.js → Sidebar-D83uLTNy.js} +1 -1
  8. package/dist/web/assets/{Sidebar-BUi2jDuu.js → Sidebar-N0HiMJRK.js} +1 -1
  9. package/dist/web/assets/Workspace-BE7p2hNz.js +1 -0
  10. package/dist/web/assets/{Workspace-ICT0FTaI.js → Workspace-BpSq60xh.js} +1 -1
  11. package/dist/web/assets/{Workspace-Db4r4oQO.js → Workspace-DW8xX3Tg.js} +1 -1
  12. package/dist/web/assets/Workspace-DjL1fdji.js +2 -0
  13. package/dist/web/assets/Workspace-DrN9--Je.js +1 -0
  14. package/dist/web/assets/{index--t_ijYil.css → index-DH1Mqw-g.css} +1 -1
  15. package/dist/web/assets/{index-BAFFLjYP.js → index-D_uh-zkI.js} +12 -12
  16. package/dist/web/assets/{usePluginData-DEpAv1Yl.js → usePluginData-Bk2M7LNj.js} +1 -1
  17. package/dist/web/assets/web-BZukfmmT.js +2 -0
  18. package/dist/web/assets/{web-D0z_1kb8.js → web-CEB9kTEr.js} +2 -2
  19. package/dist/web/assets/web-CGvrDSNo.js +2 -0
  20. package/dist/web/assets/web-CLKkH6eO.js +2 -0
  21. package/dist/web/assets/{web-S85uEYzf.js → web-CbW9uGDV.js} +2 -2
  22. package/dist/web/index.html +2 -2
  23. package/package.json +1 -1
  24. package/dist/web/assets/CodeViewer-BrquqtDE.js +0 -307
  25. package/dist/web/assets/Workspace-CafALYiK.js +0 -1
  26. package/dist/web/assets/Workspace-D-n83gau.js +0 -1
  27. package/dist/web/assets/web-BP-QGcd3.js +0 -2
  28. package/dist/web/assets/web-CE86ahqk.js +0 -2
package/dist/cli.js CHANGED
@@ -43,7 +43,7 @@ import { fileURLToPath } from "url";
43
43
  // package.json
44
44
  var package_default = {
45
45
  name: "zdashboard",
46
- version: "2.8.5",
46
+ version: "2.8.6",
47
47
  description: "ZCode skill dashboard platform \u2014 pluggable viewers for zdesign/zview/zreview/zgoal",
48
48
  type: "module",
49
49
  bin: {
@@ -1031,9 +1031,9 @@ var DashboardService = class extends Service3 {
1031
1031
  res.end('{"error":"method not allowed"}');
1032
1032
  });
1033
1033
  }
1034
- register(manifest5) {
1035
- this.plugins.set(manifest5.mode, manifest5);
1036
- this.ctx.effect(() => () => this.plugins.delete(manifest5.mode));
1034
+ register(manifest6) {
1035
+ this.plugins.set(manifest6.mode, manifest6);
1036
+ this.ctx.effect(() => () => this.plugins.delete(manifest6.mode));
1037
1037
  }
1038
1038
  list() {
1039
1039
  return Array.from(this.plugins.values());
@@ -1196,7 +1196,7 @@ var JustRunner = class {
1196
1196
 
1197
1197
  // src/sdk/server.ts
1198
1198
  function definePlugin(def) {
1199
- const { manifest: manifest5, setup } = def;
1199
+ const { manifest: manifest6, setup } = def;
1200
1200
  return {
1201
1201
  inject: ["server", "dashboard", "reload"],
1202
1202
  apply(ctx) {
@@ -1206,26 +1206,26 @@ function definePlugin(def) {
1206
1206
  try {
1207
1207
  fn();
1208
1208
  } catch (e) {
1209
- console.error(`[zdashboard] plugin ${manifest5.mode} dispose error:`, e);
1209
+ console.error(`[zdashboard] plugin ${manifest6.mode} dispose error:`, e);
1210
1210
  }
1211
1211
  }
1212
1212
  });
1213
- ctx.dashboard.register(manifest5);
1213
+ ctx.dashboard.register(manifest6);
1214
1214
  const respondWith = (handler) => async (req, res) => {
1215
1215
  if (res.headersSent) return;
1216
1216
  try {
1217
1217
  const data = await handler(req, res);
1218
1218
  if (data !== void 0 && !res.writableEnded) json(res, data);
1219
1219
  } catch (e) {
1220
- console.error(`[zdashboard] plugin ${manifest5.mode} route error:`, e);
1220
+ console.error(`[zdashboard] plugin ${manifest6.mode} route error:`, e);
1221
1221
  if (!res.headersSent) json(res, { error: "internal" }, 500);
1222
1222
  }
1223
1223
  };
1224
1224
  const pctx = {
1225
- mode: manifest5.mode,
1225
+ mode: manifest6.mode,
1226
1226
  config() {
1227
- const schema = manifest5.config ?? {};
1228
- const stored = ctx.server.getPluginConfig(manifest5.mode) ?? {};
1227
+ const schema = manifest6.config ?? {};
1228
+ const stored = ctx.server.getPluginConfig(manifest6.mode) ?? {};
1229
1229
  const defaults = Object.fromEntries(
1230
1230
  Object.entries(schema).map(([key, field]) => [key, field.default])
1231
1231
  );
@@ -1248,7 +1248,7 @@ function definePlugin(def) {
1248
1248
  ctx.server.static(prefix, dir);
1249
1249
  },
1250
1250
  broadcast(event, data) {
1251
- ctx.reload?.broadcast(`plugin:${manifest5.mode}:${event}`, data ?? "");
1251
+ ctx.reload?.broadcast(`plugin:${manifest6.mode}:${event}`, data ?? "");
1252
1252
  },
1253
1253
  onDispose(fn) {
1254
1254
  disposers.push(fn);
@@ -1558,6 +1558,459 @@ var apply6 = defineBuiltin({
1558
1558
  }
1559
1559
  });
1560
1560
 
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
+
1561
2014
  // src/cli.ts
1562
2015
  var __dirname2 = path9.dirname(fileURLToPath2(import.meta.url));
1563
2016
  var DEFAULT_PORT = 4190;
@@ -1659,7 +2112,7 @@ async function main() {
1659
2112
  await stopInstance(oldRecord);
1660
2113
  }
1661
2114
  const appDir = path9.resolve(__dirname2, "web");
1662
- const BUILTIN_PLUGINS = [apply6, apply3, apply4, apply5];
2115
+ const BUILTIN_PLUGINS = [apply6, apply3, apply4, apply5, apply7];
1663
2116
  if (stripDeadPluginConfig(root, BUILTIN_PLUGINS.map((p) => p.manifest))) {
1664
2117
  console.log("[zdashboard] \u5DF2\u6E05\u7406 dashboard.json \u4E2D\u5185\u7F6E\u63D2\u4EF6\u7684\u8FC7\u65F6\u914D\u7F6E\u952E");
1665
2118
  }
@@ -1682,9 +2135,9 @@ async function main() {
1682
2135
  ctx.plugin(apply, { root });
1683
2136
  ctx.plugin(apply2, { root });
1684
2137
  ctx.plugin(DashboardService);
1685
- for (const apply7 of BUILTIN_PLUGINS) {
2138
+ for (const apply8 of BUILTIN_PLUGINS) {
1686
2139
  try {
1687
- ctx.plugin(apply7, { root });
2140
+ ctx.plugin(apply8, { root });
1688
2141
  } catch (e) {
1689
2142
  console.error("[zdashboard] builtin plugin failed:", e);
1690
2143
  }