spec-to-ui 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +2 -0
- package/README.ko.md +129 -0
- package/README.md +96 -29
- package/RELEASE.md +26 -0
- package/THIRD-PARTY.md +14 -0
- package/bin/cli.mjs +70 -91
- package/bundle-manifest.json +140 -0
- package/package.json +40 -8
- package/plugin.json +16 -0
- package/skills/design-taste-frontend/LICENSE +21 -0
- package/skills/design-taste-frontend/README.md +81 -0
- package/skills/design-taste-frontend/SKILL.md +546 -0
- package/skills/design-taste-frontend/assets/app.css +216 -0
- package/skills/design-taste-frontend/assets/base.css +105 -0
- package/skills/design-taste-frontend/assets/base.js +37 -0
- package/skills/design-taste-frontend/assets/charts.js +619 -0
- package/skills/design-taste-frontend/assets/scenes/stage.css +28 -0
- package/skills/design-taste-frontend/assets/scenes/stage.js +134 -0
- package/skills/design-taste-frontend/evals/evals.json +76 -0
- package/skills/design-taste-frontend/library/app.json +1327 -0
- package/skills/design-taste-frontend/library/directions.json +1078 -0
- package/skills/design-taste-frontend/library/heroes.json +1086 -0
- package/skills/design-taste-frontend/library/motions.json +92 -0
- package/skills/design-taste-frontend/library/palettes.json +1485 -0
- package/skills/design-taste-frontend/library/photos.json +7240 -0
- package/skills/design-taste-frontend/library/sections.json +4429 -0
- package/skills/design-taste-frontend/library/sites.json +8350 -0
- package/skills/design-taste-frontend/library/type.json +2024 -0
- package/skills/design-taste-frontend/references/app-screens.md +1199 -0
- package/skills/design-taste-frontend/references/colour.md +141 -0
- package/skills/design-taste-frontend/references/copy.md +177 -0
- package/skills/design-taste-frontend/references/critique.md +182 -0
- package/skills/design-taste-frontend/references/imagery.md +791 -0
- package/skills/design-taste-frontend/references/layout.md +292 -0
- package/skills/design-taste-frontend/references/motion.md +980 -0
- package/skills/design-taste-frontend/references/research.md +356 -0
- package/skills/design-taste-frontend/references/scenes.md +174 -0
- package/skills/design-taste-frontend/references/tells.md +115 -0
- package/skills/design-taste-frontend/references/type.md +170 -0
- package/skills/design-taste-frontend/scripts/assets.mjs +865 -0
- package/skills/design-taste-frontend/scripts/draw.mjs +584 -0
- package/skills/design-taste-frontend/scripts/inspect.mjs +308 -0
- package/skills/design-taste-frontend/scripts/lib/app-draw.mjs +203 -0
- package/skills/design-taste-frontend/scripts/lib/cdp.mjs +248 -0
- package/skills/design-taste-frontend/scripts/lib/inspection-files.mjs +9 -0
- package/skills/design-taste-frontend/scripts/lib/probe.mjs +929 -0
- package/skills/design-taste-frontend/scripts/lib/rules.mjs +243 -0
- package/skills/design-taste-frontend/scripts/lint.mjs +119 -0
- package/skills/design-taste-frontend/scripts/scenes.mjs +124 -0
- package/skills/spec-to-ui/SKILL.md +61 -0
- package/{skill → skills/spec-to-ui}/references/composition-and-validation.md +6 -0
- package/{skill → skills/spec-to-ui}/references/drafts-and-feedback.md +10 -0
- package/skills/spec-to-ui/references/requirements-supplement.md +21 -0
- package/{skill → skills/spec-to-ui}/references/review-and-handoff.md +9 -0
- package/skills/spec-to-ui/references/skill-composition.md +21 -0
- package/{skill → skills/spec-to-ui}/references/structure-and-decisions.md +4 -0
- package/skills/specframe/NOTICE.md +7 -0
- package/skills/specframe/SKILL.md +58 -0
- package/skills/specframe/agents/openai.yaml +3 -0
- package/skills/specframe/references/operating-contract.md +137 -0
- package/skills/specframe/references/visual.md +3 -0
- package/skills/specframe/references/web.md +15 -0
- package/skills/specframe/scripts/state.py +182 -0
- package/skills/ui-ux-pro-max/LICENSE +21 -0
- package/skills/ui-ux-pro-max/SKILL.md +218 -0
- package/skills/ui-ux-pro-max/data/app-interface.csv +33 -0
- package/skills/ui-ux-pro-max/data/catalog-summary.json +78 -0
- package/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/skills/ui-ux-pro-max/data/colors.csv +193 -0
- package/skills/ui-ux-pro-max/data/data-provenance.json +1348 -0
- package/skills/ui-ux-pro-max/data/google-font-licenses.json +20185 -0
- package/skills/ui-ux-pro-max/data/google-fonts.csv +1935 -0
- package/skills/ui-ux-pro-max/data/icons.csv +106 -0
- package/skills/ui-ux-pro-max/data/landing.csv +35 -0
- package/skills/ui-ux-pro-max/data/motion.csv +18 -0
- package/skills/ui-ux-pro-max/data/phosphor-icons-upstream.json +32582 -0
- package/skills/ui-ux-pro-max/data/products.csv +193 -0
- package/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/skills/ui-ux-pro-max/data/stacks/angular.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/avalonia.csv +57 -0
- package/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +60 -0
- package/skills/ui-ux-pro-max/data/stacks/javafx.csv +76 -0
- package/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/skills/ui-ux-pro-max/data/stacks/laravel.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/nextjs.csv +62 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +84 -0
- package/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +68 -0
- package/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/skills/ui-ux-pro-max/data/stacks/react.csv +67 -0
- package/skills/ui-ux-pro-max/data/stacks/shadcn.csv +69 -0
- package/skills/ui-ux-pro-max/data/stacks/svelte.csv +56 -0
- package/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/skills/ui-ux-pro-max/data/stacks/threejs.csv +54 -0
- package/skills/ui-ux-pro-max/data/stacks/uno.csv +60 -0
- package/skills/ui-ux-pro-max/data/stacks/uwp.csv +56 -0
- package/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/skills/ui-ux-pro-max/data/stacks/winui.csv +60 -0
- package/skills/ui-ux-pro-max/data/stacks/wpf.csv +57 -0
- package/skills/ui-ux-pro-max/data/styles.csv +89 -0
- package/skills/ui-ux-pro-max/data/typography.csv +75 -0
- package/skills/ui-ux-pro-max/data/ui-reasoning.csv +193 -0
- package/skills/ui-ux-pro-max/data/ux-guidelines.csv +120 -0
- package/skills/ui-ux-pro-max/references/pro-rules.md +117 -0
- package/skills/ui-ux-pro-max/references/quick-reference.md +256 -0
- package/skills/ui-ux-pro-max/scripts/core.py +993 -0
- package/skills/ui-ux-pro-max/scripts/design_system.py +1668 -0
- package/skills/ui-ux-pro-max/scripts/reasoning_contract.py +123 -0
- package/skills/ui-ux-pro-max/scripts/search.py +184 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-api.json +36 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-catalog.json +33 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-existing.csv +3 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-metadata.json +17 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-overrides.json +7 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/icons-curated.csv +4 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-core.json +23 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-package.json +13 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-react-exports.json +4 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-react-package.json +5 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/relevance-baseline.json +3366 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/relevance-cases.json +111 -0
- package/skills/ui-ux-pro-max/scripts/tests/fixtures/relevance-thresholds.json +100 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_catalog_refresh.py +354 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_catalog_summary_line_endings.py +78 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_core.py +343 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_core_data_quality.py +198 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_data_contracts.py +421 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_design_system_mode.py +233 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_design_system_stack.py +61 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_native_desktop_stack_freshness.py +179 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_relevance_evaluator.py +182 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_skill_script_paths.py +82 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_style_taxonomy.py +175 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_text_layout_resilience.py +120 -0
- package/skills/ui-ux-pro-max/scripts/tests/test_web_stack_freshness.py +191 -0
- package/skills/ui-ux-pro-max/scripts/validate_data.py +1095 -0
- package/sources.json +58 -0
- package/skill/SKILL.md +0 -68
- package/skill-manifest.json +0 -10
- /package/{skill → skills/spec-to-ui}/LICENSE +0 -0
- /package/{skill → skills/spec-to-ui}/agents/openai.yaml +0 -0
- /package/{skill → skills/spec-to-ui}/references/reference-selection.md +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.2.0",
|
|
3
|
+
"sha256": {
|
|
4
|
+
"skills/design-taste-frontend/LICENSE": "4575a543ab88dad12ccea7d97e563d0bce5b448b06072e65d3264497dad326df",
|
|
5
|
+
"skills/design-taste-frontend/README.md": "5e33fd716b3e1ffaca9340f645d44c193f9b446107fa67f0cce498d33025672c",
|
|
6
|
+
"skills/design-taste-frontend/SKILL.md": "f35f6c68339c6ddc2efd9178a08b9063f28705826fb0cd56fa6edef6dfa4fda2",
|
|
7
|
+
"skills/design-taste-frontend/assets/app.css": "16518c3a999fb81b2698137f1f743128c189272e8b1d411c4b02598c6755b67f",
|
|
8
|
+
"skills/design-taste-frontend/assets/base.css": "aa6ea21613c79e06e06dea3d33200c78590c89b0346bb976ec07947bb45ceafa",
|
|
9
|
+
"skills/design-taste-frontend/assets/base.js": "8d50416125596b84c0083d5d5ffba09add57db4b06cbf0eedac2d4999b7653bc",
|
|
10
|
+
"skills/design-taste-frontend/assets/charts.js": "a7e916594729576b7c7e37048a68508a3243fe8fbc9654775cd245232e9f8100",
|
|
11
|
+
"skills/design-taste-frontend/assets/scenes/stage.css": "b5c587dac45ac6fcc34ae7cb4aa2b3e43797b2ef5d71fd32b48483bda3fca3e0",
|
|
12
|
+
"skills/design-taste-frontend/assets/scenes/stage.js": "9ce782a94406e6a230c49ca5f87e56aff9d436da3f56416b1659421f8976bc2b",
|
|
13
|
+
"skills/design-taste-frontend/evals/evals.json": "df0ee2a248cd5445c0e1600eb095dc0d43dd312f5b4bb4316a78471ae0d22a74",
|
|
14
|
+
"skills/design-taste-frontend/library/app.json": "3678ccbe1e8d05feff6d4f07fa16a0d610aefeea5e697e842a876713ba763cf5",
|
|
15
|
+
"skills/design-taste-frontend/library/directions.json": "d71e3824af33a92d9e1ca543e17f80baa5b7a30c815df5125cfe3300a14892c1",
|
|
16
|
+
"skills/design-taste-frontend/library/heroes.json": "98d5e01104412a5fb27936f9c686f3bc0a5f76ce0793186d3de46b982c65b172",
|
|
17
|
+
"skills/design-taste-frontend/library/motions.json": "51815dd09a823c829897f99ed9ea7dc5c35bd305ac989b8a0632ea6d42a3f08b",
|
|
18
|
+
"skills/design-taste-frontend/library/palettes.json": "a14be9f45baba848c53436f4aa44eb4f1925ad3e232c5d1dcddf4f565661a525",
|
|
19
|
+
"skills/design-taste-frontend/library/photos.json": "8fc3b76bca90f44675bd99d99bb4ce95b0756c6c5d4141b7e917d11d90e61520",
|
|
20
|
+
"skills/design-taste-frontend/library/sections.json": "7c2c8a470a22501176948661f803434db8c542a511281752c717252de80c1ad8",
|
|
21
|
+
"skills/design-taste-frontend/library/sites.json": "a2bc4d0cff8ebff481f0dfd4879c106d5e1e16cb3122f9ab3702184a5e1f3502",
|
|
22
|
+
"skills/design-taste-frontend/library/type.json": "dbabf41a468775cf6cc5ea5f3c898b0663293822e167b72b02feba1ef03ebf37",
|
|
23
|
+
"skills/design-taste-frontend/references/app-screens.md": "55e937ec30de605b53a11310b446f328a3ce7403de24fff008920a00be1a5ed4",
|
|
24
|
+
"skills/design-taste-frontend/references/colour.md": "6556bcc7eed48b7bc2d0d281c28bf57c1b75e94d7ca0bde49f5d9df8c6a09351",
|
|
25
|
+
"skills/design-taste-frontend/references/copy.md": "676edbe75d5f3cfd8a793010ea9f730525ae074b231a674c2426264d3398262e",
|
|
26
|
+
"skills/design-taste-frontend/references/critique.md": "9c2f4392674530b3f02ac529fba53d82ab37b85f401c4c1989fbe98d6217f0b4",
|
|
27
|
+
"skills/design-taste-frontend/references/imagery.md": "518def6b2c643b295e13e66b09b66f2e3fc1421d3cf6c7dbb1dc749097ad2ad9",
|
|
28
|
+
"skills/design-taste-frontend/references/layout.md": "40080640719b07737afb94a8868afef87767a1ab4892814d9b6882e2d283453b",
|
|
29
|
+
"skills/design-taste-frontend/references/motion.md": "79f94d8469898d2bf6186c198ad86ddf691a67c6536eaec36a4ec101285d9a37",
|
|
30
|
+
"skills/design-taste-frontend/references/research.md": "83433646a352cae588591e05bc0a75fe1deadff55ede8851bc8dd5dd483adfc5",
|
|
31
|
+
"skills/design-taste-frontend/references/scenes.md": "733ac7258a1a28f2f6ae8205bc36ba66c563594ad0a2e2f829c5eaaba3199a61",
|
|
32
|
+
"skills/design-taste-frontend/references/tells.md": "8e6de4411c43d3108f832b3f33bb1a2a838148a72b92a176df893b67d99a0da9",
|
|
33
|
+
"skills/design-taste-frontend/references/type.md": "6353ff1d0ce2f9913628c88fbcb7dad3cc3877e61196848bce99e33a17d20611",
|
|
34
|
+
"skills/design-taste-frontend/scripts/assets.mjs": "b4b4b99b5634735f5a0b4213169cda5240ee6bbed8ed8042ad1bcf2b6607c1fa",
|
|
35
|
+
"skills/design-taste-frontend/scripts/draw.mjs": "6c2047d207d2400d3b099956dfe2ac306203b614246e66bc8760212a7f797dbf",
|
|
36
|
+
"skills/design-taste-frontend/scripts/inspect.mjs": "c0d7366f789b3f594787b37a525d1d7096104a499aac8a97ae04b405046cf02c",
|
|
37
|
+
"skills/design-taste-frontend/scripts/lib/app-draw.mjs": "aa0802d341d19b53ec14ec21746e428be49a8ec3ed7b30253194105fc18a8df6",
|
|
38
|
+
"skills/design-taste-frontend/scripts/lib/cdp.mjs": "320fb75c6454a97b88458e5c33559a1188042aa0041bd5eff53455900236c88a",
|
|
39
|
+
"skills/design-taste-frontend/scripts/lib/inspection-files.mjs": "5635c0d5fbe0f5bd012e58534bcd554ff7440a4e5c724a61a61c476c7f42e918",
|
|
40
|
+
"skills/design-taste-frontend/scripts/lib/probe.mjs": "a5a17df891e438f55f196d8233601c3c79c873755f442c1ac5c3568de4e6bb48",
|
|
41
|
+
"skills/design-taste-frontend/scripts/lib/rules.mjs": "8244aa9f53e77a59a562410310414e6b1a0f0cf002ce8f5aa792740b7f0149bf",
|
|
42
|
+
"skills/design-taste-frontend/scripts/lint.mjs": "05f2fae2f56fc051b539cdbacb43a6f78fbbfb9644bb74aa11be472ff12dcaf5",
|
|
43
|
+
"skills/design-taste-frontend/scripts/scenes.mjs": "234ec582e2b841457c33033feeeba8535f9ac285495a74d08dc533a1566c90d5",
|
|
44
|
+
"skills/spec-to-ui/LICENSE": "5a5cf5e2d4f77e84a90c4e62b7c944b813a1eb0e48265da2b175f1106fd3c9bd",
|
|
45
|
+
"skills/spec-to-ui/SKILL.md": "064f95995dfebd7c40817fa1e469749a420c6621b6cea7456a60a34cb798ad1b",
|
|
46
|
+
"skills/spec-to-ui/agents/openai.yaml": "612f0b0516e3164c37055467b88fe3d59b150d71367ed86c4ba46f703e06bdaa",
|
|
47
|
+
"skills/spec-to-ui/references/composition-and-validation.md": "ca39d4384fb055e5a303797cf0e853092e46e329f8730a1d9628eb3b82d5a972",
|
|
48
|
+
"skills/spec-to-ui/references/drafts-and-feedback.md": "f0035757e0061ac6ffed18662a0f4f3235d7c81908242ac96d4386e6c1a0f9d3",
|
|
49
|
+
"skills/spec-to-ui/references/reference-selection.md": "de1edc93ecfbfc04c52be07b430041e4464e87ac0aba77cd066b42c0a942fe9a",
|
|
50
|
+
"skills/spec-to-ui/references/requirements-supplement.md": "054949ea7558bde73f9f9bbf401d8e7f6e4389c33904c55c61b29de9002af4c6",
|
|
51
|
+
"skills/spec-to-ui/references/review-and-handoff.md": "deb827154cf47b41f586d6b2fce54b11a953b667ce5a12599e48c528159c7ad6",
|
|
52
|
+
"skills/spec-to-ui/references/skill-composition.md": "131190f69bca01ac0fd1d440cb824e567fb391087772e46dfa6066451980ce46",
|
|
53
|
+
"skills/spec-to-ui/references/structure-and-decisions.md": "ec177c0bf41680da9f502b6a23702bea3324862304a3e5efd360cc858dfeece1",
|
|
54
|
+
"skills/specframe/NOTICE.md": "61e8575dc7fb39b6a1c8a6167787894ab6f84594196f1771a11a6d9fdc310621",
|
|
55
|
+
"skills/specframe/SKILL.md": "08ff55ed8334d0964415e0b555117b7fcbe8775ed56c74366a617c3af8d5111f",
|
|
56
|
+
"skills/specframe/agents/openai.yaml": "50dde5028e04bbc372936e3f25a09ffc6a3e01b875565e7b78d69da890900478",
|
|
57
|
+
"skills/specframe/references/operating-contract.md": "e8b15b1de76224cdb7d9e85fa24c9415f9fff696c2dec7a44cecf61a8bbd275c",
|
|
58
|
+
"skills/specframe/references/visual.md": "29f6975cba0d7efa6e241c1322799e0bb7606776a4a470a09ebc76b53f199854",
|
|
59
|
+
"skills/specframe/references/web.md": "d632b55bf9760cc602b0ed565453ea66e432ba1d0694cee589de3d94afac3336",
|
|
60
|
+
"skills/specframe/scripts/state.py": "1f5353b647a8d7572a29a99902c4858cefdb542f3fb57fd84d43b00492206023",
|
|
61
|
+
"skills/ui-ux-pro-max/LICENSE": "738f69dfa83db5c347c678fb9d90e560877059f0de93a327c39001bff92dc014",
|
|
62
|
+
"skills/ui-ux-pro-max/SKILL.md": "fa35a6c6ce422cb5883a1696846ea702643fa911888dd5e4dab5668e6575c993",
|
|
63
|
+
"skills/ui-ux-pro-max/data/app-interface.csv": "331e7cf2c0b222d80c566c5f255c63cb339f65bfd02e471a720f28e4864a9f08",
|
|
64
|
+
"skills/ui-ux-pro-max/data/catalog-summary.json": "4ca9ee8697984ed678a69a3bfbb788fb7f826d564f22cae5d094df8879517217",
|
|
65
|
+
"skills/ui-ux-pro-max/data/charts.csv": "4115cf1120680f2cedef0676cb648f30c7ef4699e2a947535d4113e71ed3b12a",
|
|
66
|
+
"skills/ui-ux-pro-max/data/colors.csv": "8162429222bce22df62b564085946a30d07cc9722c58d0a3a494bd0d1d00841c",
|
|
67
|
+
"skills/ui-ux-pro-max/data/data-provenance.json": "e82fb33ed49375a300e93d9c11ccd1c1493c999e84ee7ee295e527634786e2e0",
|
|
68
|
+
"skills/ui-ux-pro-max/data/google-font-licenses.json": "35688523f2955795caa1a47c53b83099e60c1708461476f9cc3a050cf3b0148a",
|
|
69
|
+
"skills/ui-ux-pro-max/data/google-fonts.csv": "1c8c3b2ea1faf6a1012da463756def8b3889db33f2226f0343bb4daa80307d03",
|
|
70
|
+
"skills/ui-ux-pro-max/data/icons.csv": "50816c6012030178195a16ee481ebf58b47bd985d70e8ec58886cc83f6eddafc",
|
|
71
|
+
"skills/ui-ux-pro-max/data/landing.csv": "9a2edd3bb676c2a58f00ade7a062e285222d4297bfd847c8d5b056f0dbbf52d0",
|
|
72
|
+
"skills/ui-ux-pro-max/data/motion.csv": "381affe8df8ea1f66fbbda2598827f9f54299107bbe6a1b4e9b68f6b62091ceb",
|
|
73
|
+
"skills/ui-ux-pro-max/data/phosphor-icons-upstream.json": "2399325233b277b5c97a80e6a5e8941154f5d057beee4e7613db87c87d700236",
|
|
74
|
+
"skills/ui-ux-pro-max/data/products.csv": "42473f75e8dde5987bdf89ce55d8c168091b80a356cae691dd60247d80720b70",
|
|
75
|
+
"skills/ui-ux-pro-max/data/react-performance.csv": "3d925802539abac5afeb63ae8aa1960b7229ad271b3a47caed40ab2d97ad0734",
|
|
76
|
+
"skills/ui-ux-pro-max/data/stacks/angular.csv": "704be83f2bad30c7e6de01afb113ffa01e0c458762f48b7102f31ba2367b5553",
|
|
77
|
+
"skills/ui-ux-pro-max/data/stacks/astro.csv": "2c2f55fadaafc05e04cc321c8194a1a28b656e6757fe2ba316f41b16428299c6",
|
|
78
|
+
"skills/ui-ux-pro-max/data/stacks/avalonia.csv": "442fca14675a020683473e7e49f08abb27b9df0765c80efe54aef61f1a4ac258",
|
|
79
|
+
"skills/ui-ux-pro-max/data/stacks/flutter.csv": "64dba0ac17349f28bce517a0f5f48c54d9ed2e487ec0c0258303463b382f41a0",
|
|
80
|
+
"skills/ui-ux-pro-max/data/stacks/html-tailwind.csv": "d05a581d20af57b8ca0104a6d31d90a07c437d500662a96c3029fc2f9a4678ee",
|
|
81
|
+
"skills/ui-ux-pro-max/data/stacks/javafx.csv": "2e819b8d5abdd23ad4dae0991650fdb57af497aabd68b37463aa9c442944c869",
|
|
82
|
+
"skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv": "699de218b286948eaec7d15767b6e1350ee299167e49bf476d82e3ff58724e0a",
|
|
83
|
+
"skills/ui-ux-pro-max/data/stacks/laravel.csv": "854ea4daa5fc61292d22235ad33b49ba3fe22423c3de8d3cb03758ffed3b59f9",
|
|
84
|
+
"skills/ui-ux-pro-max/data/stacks/nextjs.csv": "ecd2c27b2ea0127d203ae726060efcdd7335b5e83f96b99e4f3befbbfeebd5a4",
|
|
85
|
+
"skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv": "9c0179d559abe39ad63b958b54cb29c82be1dd20706430476096ea8967bfa328",
|
|
86
|
+
"skills/ui-ux-pro-max/data/stacks/nuxtjs.csv": "3d9b54ed2d151bd9c86e9e5609b8a6f88a00c4c52fa601a30af96c49b2c4d176",
|
|
87
|
+
"skills/ui-ux-pro-max/data/stacks/react-native.csv": "ba31dd9c0c04da6bc02a74448bf121f9c0728ae5ba3b4d47b487778b0a1135b5",
|
|
88
|
+
"skills/ui-ux-pro-max/data/stacks/react.csv": "4dd176a9787e5c6306b5df94158d75955adcdc6edab41ce5286641a5842303c1",
|
|
89
|
+
"skills/ui-ux-pro-max/data/stacks/shadcn.csv": "e56cfde5b74907836ac3582a4779d5b7f3d206a702ab81b8669a1b668c3eeb51",
|
|
90
|
+
"skills/ui-ux-pro-max/data/stacks/svelte.csv": "f6e379ba802941ba26b01d4ffbe3cd39120f2587659a1d93851c707f66bc13db",
|
|
91
|
+
"skills/ui-ux-pro-max/data/stacks/swiftui.csv": "bdd9231ff3ad658f4e7c063e1eb49df2fd09ac8d90631a86df899b39833b9623",
|
|
92
|
+
"skills/ui-ux-pro-max/data/stacks/threejs.csv": "155d583b9c64da0df4b6c6cb060c02eab222505e0734d6353da02c9e2b5d982b",
|
|
93
|
+
"skills/ui-ux-pro-max/data/stacks/uno.csv": "a0474363e4225b5367214d5675fd3e075f137026f9500f0d04357882ef4f6d48",
|
|
94
|
+
"skills/ui-ux-pro-max/data/stacks/uwp.csv": "c409f08c1fbba1f1029f1acaa554e7b4471cc85517a5751c9f2e62465badcd5c",
|
|
95
|
+
"skills/ui-ux-pro-max/data/stacks/vue.csv": "b655f1ebb9dff2652d15981f31b1784c8a6d4759efd2815a14f3088257569f95",
|
|
96
|
+
"skills/ui-ux-pro-max/data/stacks/winui.csv": "e676dc1c13ee6c205c40b0746f1335150a346c7a49a0616d2545bc3d2c930c85",
|
|
97
|
+
"skills/ui-ux-pro-max/data/stacks/wpf.csv": "9781a9950b20333637b30a02e498b7efca21b618a3eeb8665836f3ac6e974da7",
|
|
98
|
+
"skills/ui-ux-pro-max/data/styles.csv": "a93a4d9d7025856575d7b7583bda020be9043013432c5af7c58af9dbdfb206b7",
|
|
99
|
+
"skills/ui-ux-pro-max/data/typography.csv": "321fc446e89024488ebae96dda93efc4d2307bd8bddb240857ad51364f6782c8",
|
|
100
|
+
"skills/ui-ux-pro-max/data/ui-reasoning.csv": "f0774dd741cecdad5eec842034bd6d5e9ea50e9f220a1910069748daa0bb8e9a",
|
|
101
|
+
"skills/ui-ux-pro-max/data/ux-guidelines.csv": "ff81ec613f70ba9fc3fcce52dbe4ae35d44b2079dbe6dc066d2d6e38c28facd5",
|
|
102
|
+
"skills/ui-ux-pro-max/references/pro-rules.md": "d28442d61c310b49c054a4ea736f89fb3008beebdbbc38c4b3a540b8f7fadf23",
|
|
103
|
+
"skills/ui-ux-pro-max/references/quick-reference.md": "0609bc7c89dacb40472465d8fc14257b56b2c43439660fc8d6fa3b8c022e1876",
|
|
104
|
+
"skills/ui-ux-pro-max/scripts/core.py": "7a4a109c200ab363c0e0fd9a5545f03dc665d5e15e4ab28fef893d5663cd30b4",
|
|
105
|
+
"skills/ui-ux-pro-max/scripts/design_system.py": "e7d1c94c4b2eada17c5551157668362659ccf9626d34dbd58e68142410f90103",
|
|
106
|
+
"skills/ui-ux-pro-max/scripts/reasoning_contract.py": "b8bac1af82aa280d3e06f00aabaeac4337e632996b07fed874e2b6ee6e9c5913",
|
|
107
|
+
"skills/ui-ux-pro-max/scripts/search.py": "d6aeb52ed42b158cb0c1bb47c9ef931f3bb4daf413bcf2390320b13f887e69fd",
|
|
108
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-api.json": "22d8dc81a7d6827b7e8b64b53e7d184210fb9759e8e294e0d5133c81cc460176",
|
|
109
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-catalog.json": "c608ad5c4084ebc50a4bbbfb69ea2456c01fd5519c457e18410fffd250ae948f",
|
|
110
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-existing.csv": "4e0761b839dc6b2187a370e82eddc0aed8a7ff10c09e28dd814bb3656dac595b",
|
|
111
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-metadata.json": "30bffc29ae348416a2de2f9c6c418e768e4578f136b0f4bac5d2f70124f2e9ba",
|
|
112
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/google-overrides.json": "6243a48a4619986768c4628e2d0c98ff195beba71ba9be5df8f0c52fc6d90c0b",
|
|
113
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/icons-curated.csv": "68362c9a700c13b96f000784a0198c1c7e117a7088a01c85744e44233038fe9d",
|
|
114
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-core.json": "ae4d0bb076240824e1b643c2270d1f8cc0952a69502ec1e622b7dedd85b930bb",
|
|
115
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-package.json": "500588c757d6de03e3d7e69b27a8b8b1f88ccf6bb0333e4c1e9b0d6a4f112475",
|
|
116
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-react-exports.json": "d79f2ee0afdbc2f87776733e145df3538a16a25d7c2fba0056bb48295dad0ded",
|
|
117
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/catalogs/phosphor-react-package.json": "1c57a1d76bcc0cdd3632d4c18b9c0e79576b4591df39831c9607e5d0eb4f2cec",
|
|
118
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/relevance-baseline.json": "0df200fc54c1cb97a52d6775e7f501509163cea8f8b73fd7268429bc1f835afe",
|
|
119
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/relevance-cases.json": "e77d36eebbf6ddc2860946a02cdb659351da6c09f2688f1ed30939a418099646",
|
|
120
|
+
"skills/ui-ux-pro-max/scripts/tests/fixtures/relevance-thresholds.json": "82f1983ee205bbc536357b0456d4b385470e6653048cb6a704be9b2b4e6d8ef2",
|
|
121
|
+
"skills/ui-ux-pro-max/scripts/tests/test_catalog_refresh.py": "3e2ca5d12702318f641ae62d0c14f22a3bcc84d84e79b863c0e947d475604adb",
|
|
122
|
+
"skills/ui-ux-pro-max/scripts/tests/test_catalog_summary_line_endings.py": "fa6ff09f0ec2c99013588c77397f5082dddebe8f467e94c5f8378ec9595f4989",
|
|
123
|
+
"skills/ui-ux-pro-max/scripts/tests/test_core.py": "3527fe2f4b852f69f07c17ddc0d615d9a6e025c924e45a33985579a94a8d2118",
|
|
124
|
+
"skills/ui-ux-pro-max/scripts/tests/test_core_data_quality.py": "3ffc6b4905c9ea26d7ac4527ab154d153584231aee71b2ae4bd017977fa09cc5",
|
|
125
|
+
"skills/ui-ux-pro-max/scripts/tests/test_data_contracts.py": "0360d6e10080c0bca214f2b0bbad582ba50702a542ce21013351aca54938df3a",
|
|
126
|
+
"skills/ui-ux-pro-max/scripts/tests/test_design_system_mode.py": "95ad2c154349f7021f55a558f8dcdd71df1a24fcf531a4364a8e49526a0865ef",
|
|
127
|
+
"skills/ui-ux-pro-max/scripts/tests/test_design_system_stack.py": "83d09ffe8cfbf7b265f362129f061dfe8e5e167ce5db43adaead197cabc9ca38",
|
|
128
|
+
"skills/ui-ux-pro-max/scripts/tests/test_native_desktop_stack_freshness.py": "3942845712b9a829323cd3568511483135f2a8c7cd79ccf61679da4b0f624dbb",
|
|
129
|
+
"skills/ui-ux-pro-max/scripts/tests/test_relevance_evaluator.py": "2fe56a4d6fe5fff15ff592274b0eeaba925146cefea6c0fa29d8f1b77c9aca1f",
|
|
130
|
+
"skills/ui-ux-pro-max/scripts/tests/test_skill_script_paths.py": "7cec24b94be771bc60bc84f8993e614bb16d4047930e1dd3d3bed91628311d44",
|
|
131
|
+
"skills/ui-ux-pro-max/scripts/tests/test_style_taxonomy.py": "cd14d0092e8a454d213aa104b53e4e70ba698491fa00fde9fdec5ca8a3d70011",
|
|
132
|
+
"skills/ui-ux-pro-max/scripts/tests/test_text_layout_resilience.py": "b51d32ee8a15505b87cb81957fb2d1b385e041e8beb4463c311d236bfd29ebd4",
|
|
133
|
+
"skills/ui-ux-pro-max/scripts/tests/test_web_stack_freshness.py": "83a6d597410f442441cdb17d0913be151404a608ada6a2487dd2bfe2fbf31e5d",
|
|
134
|
+
"skills/ui-ux-pro-max/scripts/validate_data.py": "a599aa256049cf30954d1f164721b99e453eb7e4cb8241bcab2d5573e6cf58b8",
|
|
135
|
+
"plugin.json": "1a3a9de1a7b9a9ba05b2bd7ca6a49afa77d42df356845220c9d5a04775781582",
|
|
136
|
+
"sources.json": "6f78d4d77982b188a78bdf39980a784e6ad140067b9d97805f308e2aeebd78f7",
|
|
137
|
+
"THIRD-PARTY.md": "48c06b617c63c2034c79bfe8688e70a3697aa86ba6b0620f2169eca0f6533b60",
|
|
138
|
+
"LICENSE": "5bdba41396209213fb9b427555cd87e33b3e499ed02035cfca6d37df704237cf"
|
|
139
|
+
}
|
|
140
|
+
}
|
package/package.json
CHANGED
|
@@ -1,12 +1,44 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "spec-to-ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Requirements-to-UI design plugin with coordinated companion skills for Codex.",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"bin": {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
"bin": {
|
|
7
|
+
"spec-to-ui": "bin/cli.mjs"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin/",
|
|
11
|
+
"skills/",
|
|
12
|
+
"plugin.json",
|
|
13
|
+
"bundle-manifest.json",
|
|
14
|
+
"sources.json",
|
|
15
|
+
"THIRD-PARTY.md",
|
|
16
|
+
"LICENSE",
|
|
17
|
+
"README.ko.md",
|
|
18
|
+
"RELEASE.md"
|
|
19
|
+
],
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=22"
|
|
22
|
+
},
|
|
23
|
+
"license": "SEE LICENSE IN THIRD-PARTY.md",
|
|
24
|
+
"repository": {
|
|
25
|
+
"type": "git",
|
|
26
|
+
"url": "git+https://github.com/suminkim8203/spec-to-ui.git"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://github.com/suminkim8203/spec-to-ui",
|
|
29
|
+
"bugs": {
|
|
30
|
+
"url": "https://github.com/suminkim8203/spec-to-ui/issues"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"codex",
|
|
34
|
+
"plugin",
|
|
35
|
+
"skills",
|
|
36
|
+
"ui",
|
|
37
|
+
"design",
|
|
38
|
+
"requirements"
|
|
39
|
+
],
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public",
|
|
42
|
+
"registry": "https://registry.npmjs.org/"
|
|
43
|
+
}
|
|
12
44
|
}
|
package/plugin.json
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
|
+
"name": "spec-to-ui",
|
|
4
|
+
"version": "0.2.0",
|
|
5
|
+
"description": "명세서를 화면으로 발전시키고 필요한 요구 보충·설계 스킬을 연결합니다.",
|
|
6
|
+
"extensions": {
|
|
7
|
+
"com.openai": {
|
|
8
|
+
"interface": {
|
|
9
|
+
"displayName": "spec-to-ui",
|
|
10
|
+
"shortDescription": "명세서에서 UI 설계와 미리보기까지 필요한 스킬을 연결합니다.",
|
|
11
|
+
"category": "Productivity"
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/suminkim8203/spec-to-ui"
|
|
16
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Leonxlnx
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# tasteskill v2 (`design-taste-frontend`)
|
|
2
|
+
|
|
3
|
+
A design skill for coding agents, built from a study of 247 curated sites (One Page Love and Awwwards
|
|
4
|
+
Sites of the Day, October 2026). It gives an agent an art direction instead of letting it fall back on
|
|
5
|
+
the average landing page, holds it to a strict no-ornament house style, and makes it look at its own
|
|
6
|
+
render before calling the work done.
|
|
7
|
+
|
|
8
|
+
## How it works
|
|
9
|
+
|
|
10
|
+
1. **Inventory.** The agent lists what only this client has: the name and what it means, the street,
|
|
11
|
+
the numbers, the one constraint, the materials, the hours.
|
|
12
|
+
2. **Draw.** `scripts/draw.mjs` deals three of 20 directions (each an idea engine seen on the
|
|
13
|
+
strongest studied sites); the agent picks the one that can carry something from the inventory, and
|
|
14
|
+
the script deals the rest: a hero composition, section compositions, a type system of real free
|
|
15
|
+
fonts, a palette, photographs, a motion, studied references, and under every blueprint a list of
|
|
16
|
+
where it disagrees with the house rules. Recent draws are remembered so projects do not repeat.
|
|
17
|
+
3. **Idea and live thing.** One sentence tying the client's own material to the direction's device,
|
|
18
|
+
checked against the nearest competitor, and one thing the visitor can do on the page.
|
|
19
|
+
4. **Build** from the sheet, words first, full content. When the project has no photographs of its
|
|
20
|
+
own, `scripts/assets.mjs` finds real pictures of the subject's world in open collections (its
|
|
21
|
+
street in old postcards, old maps, its materials, engravings of its trade, museum objects of its
|
|
22
|
+
kind), downloads them into the project and records their credits; the subject is drawn in code
|
|
23
|
+
only where no honest picture exists.
|
|
24
|
+
5. **Gate.** `scripts/lint.mjs` (source) and `scripts/inspect.mjs` (real browser, 1440 / 768 / 390)
|
|
25
|
+
measure the house rules: headlines of two lines or fewer, no eyebrow labels, no monospace, no
|
|
26
|
+
01/02/03, no thin rules, no gradients, no resting shadows, no cream-and-terracotta, no violet, and
|
|
27
|
+
the faults blind jurors punished: no focal point, empty screens, text covered or cut, long pins,
|
|
28
|
+
sideways rows, faded text.
|
|
29
|
+
6. **Look.** The inspector saves screenshots; the agent critiques them with an Awwwards-weighted
|
|
30
|
+
rubric, fixes the top three problems and repeats, at most three rounds.
|
|
31
|
+
|
|
32
|
+
Five rounds of blind tests against a no-skill baseline and another design skill are recorded in
|
|
33
|
+
`references/research.md` §11.
|
|
34
|
+
|
|
35
|
+
## Contents
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
SKILL.md the run, the house rules, the laws
|
|
39
|
+
references/ copy, type, colour, layout, imagery, motion, critique, tells, research
|
|
40
|
+
scripts/draw.mjs deal options / a direction / reprint / redraw; --alternatives, --photos, --site
|
|
41
|
+
scripts/assets.mjs search open image collections (Openverse, Wikimedia Commons, Art Institute of
|
|
42
|
+
Chicago, the Met) and, with --video, real footage (Wikimedia Commons, Internet
|
|
43
|
+
Archive, NASA); --get downloads with the credit, --credits prints them
|
|
44
|
+
scripts/lint.mjs static scan for banned patterns and stock phrases
|
|
45
|
+
scripts/inspect.mjs render, measure, photograph
|
|
46
|
+
scripts/lib/ zero-dependency Chrome DevTools client, the in-page probe, the rules
|
|
47
|
+
library/ directions (20), heroes, sections, type systems, palettes, photographs,
|
|
48
|
+
studied sites, motions
|
|
49
|
+
assets/base.css, base.js an optional neutral foundation
|
|
50
|
+
evals/evals.json six briefs for testing the skill against a no-skill baseline
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Requirements
|
|
54
|
+
|
|
55
|
+
Node 22 or newer and an installed Chrome, Edge or Chromium for `inspect.mjs` (it drives the browser
|
|
56
|
+
over the DevTools protocol with Node's built-in WebSocket; nothing is installed). `draw.mjs`,
|
|
57
|
+
`lint.mjs` and `assets.mjs` run on Node 18+; `assets.mjs` needs network access and no API keys. Set
|
|
58
|
+
`CHROME_PATH` if the browser is somewhere unusual.
|
|
59
|
+
|
|
60
|
+
## Install
|
|
61
|
+
|
|
62
|
+
Copy this folder to your skills directory, for example `~/.claude/skills/design-taste-frontend/`, or keep it in
|
|
63
|
+
a repository under `.claude/skills/`.
|
|
64
|
+
|
|
65
|
+
## Notes
|
|
66
|
+
|
|
67
|
+
- Photographs in the library are served by Lorem Picsum from Unsplash, under the Unsplash licence.
|
|
68
|
+
They are placeholders for atmosphere; replace them with the project's own pictures.
|
|
69
|
+
- Pictures found with `assets.mjs` keep their own licences. By default it offers only CC0, public
|
|
70
|
+
domain, CC BY and CC BY-SA, and `--get` records the title, creator, licence and source of every
|
|
71
|
+
download in `assets/credits.json`. The page must carry the credits (`--credits` prints them).
|
|
72
|
+
- `assets.mjs --video` finds short clips of the subject's world, takes a 720p-or-smaller rendition,
|
|
73
|
+
refuses files over 25 MB unless `--max-mb` is passed, and saves a poster frame with each clip; how
|
|
74
|
+
to use one on a page (muted loop, poster, stopped under reduced motion) is in
|
|
75
|
+
`references/imagery.md` §11.
|
|
76
|
+
- Fonts are loaded from Google Fonts and Fontshare. Check each face's licence for your use.
|
|
77
|
+
- The scores in `references/research.md` are model judgements from screenshots, not Awwwards scores.
|
|
78
|
+
- The draw history lives in `~/.taste-skill/history.json` (set `TASTE_SKILL_HISTORY` to move it).
|
|
79
|
+
Delete it to reset.
|
|
80
|
+
- A build takes an agent roughly 30–45 minutes and a few hundred thousand tokens with the full
|
|
81
|
+
look-and-fix loop; most of that is finding or drawing pictures when a project has no photographs.
|