mirror of
https://github.com/nexu-io/open-design.git
synced 2026-06-01 03:14:35 +07:00
Merge origin/main into release/v0.8.0
This commit is contained in:
commit
0939987231
4 changed files with 124 additions and 42 deletions
|
|
@ -1964,6 +1964,8 @@
|
||||||
color: var(--text-faint);
|
color: var(--text-faint);
|
||||||
}
|
}
|
||||||
.entry-star-badge__count {
|
.entry-star-badge__count {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 5ch;
|
||||||
color: var(--text);
|
color: var(--text);
|
||||||
font-variant-numeric: tabular-nums;
|
font-variant-numeric: tabular-nums;
|
||||||
transition: opacity 160ms ease;
|
transition: opacity 160ms ease;
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
},
|
},
|
||||||
"https://open-design.ai/blog/byok-reality-check-5-things-that-break/": {
|
"https://open-design.ai/blog/byok-reality-check-5-things-that-break/": {
|
||||||
"url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/",
|
"url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/",
|
||||||
"inspectedAt": "2026-05-19T10:11:55.870Z",
|
"inspectedAt": "2026-05-21T03:04:29.361Z",
|
||||||
"result": {
|
"result": {
|
||||||
"verdict": "NEUTRAL",
|
"verdict": "NEUTRAL",
|
||||||
"coverageState": "Discovered - currently not indexed",
|
"coverageState": "Discovered - currently not indexed",
|
||||||
|
|
@ -38,7 +38,7 @@
|
||||||
},
|
},
|
||||||
"https://open-design.ai/blog/layout-layer-canvas-used-to-hide/": {
|
"https://open-design.ai/blog/layout-layer-canvas-used-to-hide/": {
|
||||||
"url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
|
"url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
|
||||||
"inspectedAt": "2026-05-19T10:12:02.175Z",
|
"inspectedAt": "2026-05-21T03:04:16.961Z",
|
||||||
"result": {
|
"result": {
|
||||||
"verdict": "PASS",
|
"verdict": "PASS",
|
||||||
"coverageState": "Submitted and indexed",
|
"coverageState": "Submitted and indexed",
|
||||||
|
|
@ -53,7 +53,7 @@
|
||||||
},
|
},
|
||||||
"https://open-design.ai/blog/open-source-alternative-to-claude-design/": {
|
"https://open-design.ai/blog/open-source-alternative-to-claude-design/": {
|
||||||
"url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
|
"url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
|
||||||
"inspectedAt": "2026-05-19T10:12:08.472Z",
|
"inspectedAt": "2026-05-21T03:04:35.481Z",
|
||||||
"result": {
|
"result": {
|
||||||
"verdict": "PASS",
|
"verdict": "PASS",
|
||||||
"coverageState": "Submitted and indexed",
|
"coverageState": "Submitted and indexed",
|
||||||
|
|
@ -68,7 +68,7 @@
|
||||||
},
|
},
|
||||||
"https://open-design.ai/blog/port-figma-workflow-open-design-plugin/": {
|
"https://open-design.ai/blog/port-figma-workflow-open-design-plugin/": {
|
||||||
"url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
|
"url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
|
||||||
"inspectedAt": "2026-05-19T10:12:14.760Z",
|
"inspectedAt": "2026-05-21T03:04:23.233Z",
|
||||||
"result": {
|
"result": {
|
||||||
"verdict": "PASS",
|
"verdict": "PASS",
|
||||||
"coverageState": "Submitted and indexed",
|
"coverageState": "Submitted and indexed",
|
||||||
|
|
@ -95,6 +95,63 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"history": [
|
"history": [
|
||||||
|
{
|
||||||
|
"url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
|
||||||
|
"inspectedAt": "2026-05-21T03:04:35.481Z",
|
||||||
|
"result": {
|
||||||
|
"verdict": "PASS",
|
||||||
|
"coverageState": "Submitted and indexed",
|
||||||
|
"pageFetchState": "SUCCESSFUL",
|
||||||
|
"indexingState": "INDEXING_ALLOWED",
|
||||||
|
"lastCrawlTime": "2026-05-15T12:22:17Z",
|
||||||
|
"googleCanonical": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
|
||||||
|
"userCanonical": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
|
||||||
|
"robotsTxtState": "ALLOWED",
|
||||||
|
"isIndexed": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/",
|
||||||
|
"inspectedAt": "2026-05-21T03:04:29.361Z",
|
||||||
|
"result": {
|
||||||
|
"verdict": "NEUTRAL",
|
||||||
|
"coverageState": "Discovered - currently not indexed",
|
||||||
|
"pageFetchState": "PAGE_FETCH_STATE_UNSPECIFIED",
|
||||||
|
"indexingState": "INDEXING_STATE_UNSPECIFIED",
|
||||||
|
"robotsTxtState": "ROBOTS_TXT_STATE_UNSPECIFIED",
|
||||||
|
"isIndexed": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
|
||||||
|
"inspectedAt": "2026-05-21T03:04:23.233Z",
|
||||||
|
"result": {
|
||||||
|
"verdict": "PASS",
|
||||||
|
"coverageState": "Submitted and indexed",
|
||||||
|
"pageFetchState": "SUCCESSFUL",
|
||||||
|
"indexingState": "INDEXING_ALLOWED",
|
||||||
|
"lastCrawlTime": "2026-05-19T09:20:41Z",
|
||||||
|
"googleCanonical": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
|
||||||
|
"userCanonical": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
|
||||||
|
"robotsTxtState": "ALLOWED",
|
||||||
|
"isIndexed": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
|
||||||
|
"inspectedAt": "2026-05-21T03:04:16.961Z",
|
||||||
|
"result": {
|
||||||
|
"verdict": "PASS",
|
||||||
|
"coverageState": "Submitted and indexed",
|
||||||
|
"pageFetchState": "SUCCESSFUL",
|
||||||
|
"indexingState": "INDEXING_ALLOWED",
|
||||||
|
"lastCrawlTime": "2026-05-19T09:20:42Z",
|
||||||
|
"googleCanonical": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
|
||||||
|
"userCanonical": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
|
||||||
|
"robotsTxtState": "ALLOWED",
|
||||||
|
"isIndexed": true
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"url": "https://open-design.ai/blog/why-we-built-open-design-as-a-skill-layer/",
|
"url": "https://open-design.ai/blog/why-we-built-open-design-as-a-skill-layer/",
|
||||||
"inspectedAt": "2026-05-20T03:04:04.911Z",
|
"inspectedAt": "2026-05-20T03:04:04.911Z",
|
||||||
|
|
@ -277,10 +334,10 @@
|
||||||
"https://open-design.ai/blog/byok-reality-check-5-things-that-break/": {
|
"https://open-design.ai/blog/byok-reality-check-5-things-that-break/": {
|
||||||
"7": {
|
"7": {
|
||||||
"url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/",
|
"url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/",
|
||||||
"queriedAt": "2026-05-19T10:12:28.984Z",
|
"queriedAt": "2026-05-21T03:04:42.848Z",
|
||||||
"windowDays": 7,
|
"windowDays": 7,
|
||||||
"startDate": "2026-05-11",
|
"startDate": "2026-05-13",
|
||||||
"endDate": "2026-05-17",
|
"endDate": "2026-05-19",
|
||||||
"clicks": 0,
|
"clicks": 0,
|
||||||
"impressions": 0,
|
"impressions": 0,
|
||||||
"ctr": 0,
|
"ctr": 0,
|
||||||
|
|
@ -288,10 +345,10 @@
|
||||||
},
|
},
|
||||||
"28": {
|
"28": {
|
||||||
"url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/",
|
"url": "https://open-design.ai/blog/byok-reality-check-5-things-that-break/",
|
||||||
"queriedAt": "2026-05-19T10:12:29.090Z",
|
"queriedAt": "2026-05-21T03:04:42.929Z",
|
||||||
"windowDays": 28,
|
"windowDays": 28,
|
||||||
"startDate": "2026-04-20",
|
"startDate": "2026-04-22",
|
||||||
"endDate": "2026-05-17",
|
"endDate": "2026-05-19",
|
||||||
"clicks": 0,
|
"clicks": 0,
|
||||||
"impressions": 0,
|
"impressions": 0,
|
||||||
"ctr": 0,
|
"ctr": 0,
|
||||||
|
|
@ -301,10 +358,10 @@
|
||||||
"https://open-design.ai/blog/layout-layer-canvas-used-to-hide/": {
|
"https://open-design.ai/blog/layout-layer-canvas-used-to-hide/": {
|
||||||
"7": {
|
"7": {
|
||||||
"url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
|
"url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
|
||||||
"queriedAt": "2026-05-19T10:12:29.196Z",
|
"queriedAt": "2026-05-21T03:04:42.455Z",
|
||||||
"windowDays": 7,
|
"windowDays": 7,
|
||||||
"startDate": "2026-05-11",
|
"startDate": "2026-05-13",
|
||||||
"endDate": "2026-05-17",
|
"endDate": "2026-05-19",
|
||||||
"clicks": 0,
|
"clicks": 0,
|
||||||
"impressions": 0,
|
"impressions": 0,
|
||||||
"ctr": 0,
|
"ctr": 0,
|
||||||
|
|
@ -312,10 +369,10 @@
|
||||||
},
|
},
|
||||||
"28": {
|
"28": {
|
||||||
"url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
|
"url": "https://open-design.ai/blog/layout-layer-canvas-used-to-hide/",
|
||||||
"queriedAt": "2026-05-19T10:12:29.334Z",
|
"queriedAt": "2026-05-21T03:04:42.571Z",
|
||||||
"windowDays": 28,
|
"windowDays": 28,
|
||||||
"startDate": "2026-04-20",
|
"startDate": "2026-04-22",
|
||||||
"endDate": "2026-05-17",
|
"endDate": "2026-05-19",
|
||||||
"clicks": 0,
|
"clicks": 0,
|
||||||
"impressions": 0,
|
"impressions": 0,
|
||||||
"ctr": 0,
|
"ctr": 0,
|
||||||
|
|
@ -325,34 +382,34 @@
|
||||||
"https://open-design.ai/blog/open-source-alternative-to-claude-design/": {
|
"https://open-design.ai/blog/open-source-alternative-to-claude-design/": {
|
||||||
"7": {
|
"7": {
|
||||||
"url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
|
"url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
|
||||||
"queriedAt": "2026-05-19T10:12:29.443Z",
|
"queriedAt": "2026-05-21T03:04:43.015Z",
|
||||||
"windowDays": 7,
|
"windowDays": 7,
|
||||||
"startDate": "2026-05-11",
|
"startDate": "2026-05-13",
|
||||||
"endDate": "2026-05-17",
|
"endDate": "2026-05-19",
|
||||||
"clicks": 1,
|
"clicks": 4,
|
||||||
"impressions": 50,
|
"impressions": 107,
|
||||||
"ctr": 0.02,
|
"ctr": 0.037383177570093455,
|
||||||
"position": 8.86
|
"position": 7.94392523364486
|
||||||
},
|
},
|
||||||
"28": {
|
"28": {
|
||||||
"url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
|
"url": "https://open-design.ai/blog/open-source-alternative-to-claude-design/",
|
||||||
"queriedAt": "2026-05-19T10:12:29.568Z",
|
"queriedAt": "2026-05-21T03:04:43.089Z",
|
||||||
"windowDays": 28,
|
"windowDays": 28,
|
||||||
"startDate": "2026-04-20",
|
"startDate": "2026-04-22",
|
||||||
"endDate": "2026-05-17",
|
"endDate": "2026-05-19",
|
||||||
"clicks": 1,
|
"clicks": 4,
|
||||||
"impressions": 50,
|
"impressions": 107,
|
||||||
"ctr": 0.02,
|
"ctr": 0.037383177570093455,
|
||||||
"position": 8.86
|
"position": 7.94392523364486
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"https://open-design.ai/blog/port-figma-workflow-open-design-plugin/": {
|
"https://open-design.ai/blog/port-figma-workflow-open-design-plugin/": {
|
||||||
"7": {
|
"7": {
|
||||||
"url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
|
"url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
|
||||||
"queriedAt": "2026-05-19T10:12:29.818Z",
|
"queriedAt": "2026-05-21T03:04:42.666Z",
|
||||||
"windowDays": 7,
|
"windowDays": 7,
|
||||||
"startDate": "2026-05-11",
|
"startDate": "2026-05-13",
|
||||||
"endDate": "2026-05-17",
|
"endDate": "2026-05-19",
|
||||||
"clicks": 0,
|
"clicks": 0,
|
||||||
"impressions": 0,
|
"impressions": 0,
|
||||||
"ctr": 0,
|
"ctr": 0,
|
||||||
|
|
@ -360,10 +417,10 @@
|
||||||
},
|
},
|
||||||
"28": {
|
"28": {
|
||||||
"url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
|
"url": "https://open-design.ai/blog/port-figma-workflow-open-design-plugin/",
|
||||||
"queriedAt": "2026-05-19T10:12:29.947Z",
|
"queriedAt": "2026-05-21T03:04:42.755Z",
|
||||||
"windowDays": 28,
|
"windowDays": 28,
|
||||||
"startDate": "2026-04-20",
|
"startDate": "2026-04-22",
|
||||||
"endDate": "2026-05-17",
|
"endDate": "2026-05-19",
|
||||||
"clicks": 0,
|
"clicks": 0,
|
||||||
"impressions": 0,
|
"impressions": 0,
|
||||||
"ctr": 0,
|
"ctr": 0,
|
||||||
|
|
|
||||||
|
|
@ -29,16 +29,20 @@ the full architecture.
|
||||||
|---|---|---|---|---|---|---|---|---|
|
|---|---|---|---|---|---|---|---|---|
|
||||||
| 31-skills-72-systems-how-the-library-works | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — |
|
| 31-skills-72-systems-how-the-library-works | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — |
|
||||||
| byok-design-workflow-claude-codex-qwen | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — |
|
| byok-design-workflow-claude-codex-qwen | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — |
|
||||||
| byok-reality-check-5-things-that-break | neutral | Discovered - currently not indexed | — | 2026-05-19 | 0 | 0 | 0.0% | — |
|
| byok-reality-check-5-things-that-break | neutral | Discovered - currently not indexed | — | 2026-05-21 | 0 | 0 | 0.0% | — |
|
||||||
| layout-layer-canvas-used-to-hide | indexed | Submitted and indexed | 2026-05-19 | 2026-05-19 | 0 | 0 | 0.0% | — |
|
| layout-layer-canvas-used-to-hide | indexed | Submitted and indexed | 2026-05-19 | 2026-05-21 | 0 | 0 | 0.0% | — |
|
||||||
| open-source-alternative-to-claude-design | indexed | Submitted and indexed | 2026-05-15 | 2026-05-19 | 50 | 1 | 2.0% | 8.9 |
|
| open-source-alternative-to-claude-design | indexed | Submitted and indexed | 2026-05-15 | 2026-05-21 | 107 | 4 | 3.7% | 7.9 |
|
||||||
| port-figma-workflow-open-design-plugin | indexed | Submitted and indexed | 2026-05-19 | 2026-05-19 | 0 | 0 | 0.0% | — |
|
| port-figma-workflow-open-design-plugin | indexed | Submitted and indexed | 2026-05-19 | 2026-05-21 | 0 | 0 | 0.0% | — |
|
||||||
| why-we-built-open-design-as-a-skill-layer | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — |
|
| why-we-built-open-design-as-a-skill-layer | neutral | Discovered - currently not indexed | — | 2026-05-20 | 0 | 0 | 0.0% | — |
|
||||||
|
|
||||||
## Recent inspections
|
## Recent inspections
|
||||||
|
|
||||||
| Inspected | Slug | Verdict | Coverage state | Canonical |
|
| Inspected | Slug | Verdict | Coverage state | Canonical |
|
||||||
|---|---|---|---|---|
|
|---|---|---|---|---|
|
||||||
|
| 2026-05-21 | open-source-alternative-to-claude-design | indexed | Submitted and indexed | https://open-design.ai/blog/open-source-alternative-to-claude-design/ |
|
||||||
|
| 2026-05-21 | byok-reality-check-5-things-that-break | neutral | Discovered - currently not indexed | — |
|
||||||
|
| 2026-05-21 | port-figma-workflow-open-design-plugin | indexed | Submitted and indexed | https://open-design.ai/blog/port-figma-workflow-open-design-plugin/ |
|
||||||
|
| 2026-05-21 | layout-layer-canvas-used-to-hide | indexed | Submitted and indexed | https://open-design.ai/blog/layout-layer-canvas-used-to-hide/ |
|
||||||
| 2026-05-20 | why-we-built-open-design-as-a-skill-layer | neutral | Discovered - currently not indexed | — |
|
| 2026-05-20 | why-we-built-open-design-as-a-skill-layer | neutral | Discovered - currently not indexed | — |
|
||||||
| 2026-05-20 | byok-design-workflow-claude-codex-qwen | neutral | Discovered - currently not indexed | — |
|
| 2026-05-20 | byok-design-workflow-claude-codex-qwen | neutral | Discovered - currently not indexed | — |
|
||||||
| 2026-05-20 | 31-skills-72-systems-how-the-library-works | neutral | Discovered - currently not indexed | — |
|
| 2026-05-20 | 31-skills-72-systems-how-the-library-works | neutral | Discovered - currently not indexed | — |
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,11 @@ import { mkdir } from 'node:fs/promises';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
|
|
||||||
const STORAGE_KEY = 'open-design:config';
|
const STORAGE_KEY = 'open-design:config';
|
||||||
|
const GITHUB_STARS_STORAGE_KEY = 'open-design:gh-stars';
|
||||||
const VISUAL_STYLE_ID = 'od-visual-stability-style';
|
const VISUAL_STYLE_ID = 'od-visual-stability-style';
|
||||||
|
// Keep this exact-route mock narrow so unrelated GitHub UI still behaves normally.
|
||||||
|
const VISUAL_GITHUB_REPO_API = 'https://api.github.com/repos/nexu-io/open-design';
|
||||||
|
const VISUAL_GITHUB_STARS = 40_000;
|
||||||
|
|
||||||
const VISUAL_CONFIG = {
|
const VISUAL_CONFIG = {
|
||||||
mode: 'daemon',
|
mode: 'daemon',
|
||||||
|
|
@ -129,9 +133,13 @@ const VISUAL_DESIGN_SYSTEMS = [
|
||||||
export async function configureVisualPage(page: Page, options: VisualPageOptions = {}): Promise<void> {
|
export async function configureVisualPage(page: Page, options: VisualPageOptions = {}): Promise<void> {
|
||||||
const projects = options.projects ?? VISUAL_PROJECTS;
|
const projects = options.projects ?? VISUAL_PROJECTS;
|
||||||
|
|
||||||
await page.addInitScript(([key, config]) => {
|
await page.addInitScript(([key, config, githubStarsKey, githubStarsCount]) => {
|
||||||
window.localStorage.setItem(key, JSON.stringify(config));
|
window.localStorage.setItem(key, JSON.stringify(config));
|
||||||
}, [STORAGE_KEY, VISUAL_CONFIG] as const);
|
window.localStorage.setItem(
|
||||||
|
githubStarsKey,
|
||||||
|
JSON.stringify({ count: githubStarsCount, ts: Date.now() }),
|
||||||
|
);
|
||||||
|
}, [STORAGE_KEY, VISUAL_CONFIG, GITHUB_STARS_STORAGE_KEY, VISUAL_GITHUB_STARS] as const);
|
||||||
|
|
||||||
await page.route('**/api/app-config', async (route) => {
|
await page.route('**/api/app-config', async (route) => {
|
||||||
await fulfillGet(route, { config: VISUAL_CONFIG });
|
await fulfillGet(route, { config: VISUAL_CONFIG });
|
||||||
|
|
@ -141,6 +149,17 @@ export async function configureVisualPage(page: Page, options: VisualPageOptions
|
||||||
await fulfillGet(route, { agents: [MOCK_AGENT] });
|
await fulfillGet(route, { agents: [MOCK_AGENT] });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
await page.route(VISUAL_GITHUB_REPO_API, async (route) => {
|
||||||
|
if (route.request().method() !== 'GET') {
|
||||||
|
await route.continue();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await route.fulfill({
|
||||||
|
json: { stargazers_count: VISUAL_GITHUB_STARS },
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
await page.route('**/api/projects', async (route) => {
|
await page.route('**/api/projects', async (route) => {
|
||||||
await fulfillGet(route, { projects });
|
await fulfillGet(route, { projects });
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue