ワンクリックで
portfolio-design
How Ryan designs. Use before changing style.css, page layouts in build.mjs, or adding any visual element to the site.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
How Ryan designs. Use before changing style.css, page layouts in build.mjs, or adding any visual element to the site.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
How to add or update content on this site — work entries, blog posts, talks, pages, static assets, or a whole new content type. The CMS is the filesystem.
How Ryan writes. Use whenever drafting or editing any prose for this site — work case studies, blog posts, page copy, talk abstracts, even link summaries.
Audit publishable portfolio copy, content completeness, claims, links, canonicals, redirects, images, social metadata, accessibility, and rendered presentation. Use for every public content addition or meaningful edit before it is considered ready for review or publication.
Use this skill when needing to convert street addresses into precise geographic coordinates (geocoding) or translating coordinates back into human-readable addresses (reverse geocoding). Developers can refine results using viewports, regional restrictions, or retrieve detailed location information for addresses, coordinates, or Google Place IDs, including building outlines and entrances.
Use for Google Maps Platform Environment APIs work, including Air Quality API, Pollen API, Solar API, Weather API, environmental heatmap tiles, current/forecast/history requests, Maps JavaScript API tile overlays, key security, quotas, caching, attribution, health recommendation UX, and migrations from PurpleAir or other environmental data sources.
Use for focused Google Maps JavaScript API 2D map work in either app, including API loading, map IDs/vector maps, camera, controls, Advanced Markers, info windows, data-driven styling, GeoJSON/Data layer, deck.gl overlays, WebGLOverlayView, Places widgets, geocoding, performance, accessibility, quota, security, and migration from Mapbox GL to Google Maps JS.
| name | portfolio-design |
| description | How Ryan designs. Use before changing style.css, page layouts in build.mjs, or adding any visual element to the site. |
commentsSection in build.mjs) is config-gated in site.json, loads lazily, renders only on writing detail pages, and stays out of the writer preview. Do not add further third-party scripts without updating this skill.prefers-color-scheme and the token block at the top of style.css. Never hardcode a color in a component: add or use a token.scripts/artifact-cards.mjs; cards state only facts already in the entry (real commands, real published stats). Never mock a product UI or fabricate a screenshot. Utility flows such as contact, privacy, confirmation, and error pages may omit imagery when it would be decorative.height: auto; in CSS and exact width and height attributes in the HTML matching the physical image dimensions. For dynamic detail pages, query image dimensions at build time to populate these attributes.:root)--bg / --surface — warm paper background, card surface.--ink / --muted / --faint — three-step text hierarchy. Use --muted for summaries, --faint for metadata.--line — all borders and rules.--accent / --accent-ink — one blue, used for eyebrows, hover states, and focus rings only. Never for large fills.--max (page shell) and --prose (reading measure, ~44rem). Long-form text never exceeds --prose..card) for work: metadata line, title, one-line summary, tag chips. Hover = border accent + 2px lift, nothing more..card-thumb): image-on-top, demoCard-style, using a real screenshot or a generated artifact card..row) for writing and talks: title + summary left, venue/type/date right; stacks on mobile..row-thumb): a small image on writing/talks rows, same image rules as work cards.scripts/artifact-cards.mjs) for entries with no honest screenshot to show. State only facts already in the entry copy..eyebrow) label every section in uppercase accent text..empty-state) are designed, not apologetic: sections ship before their content does (see the writing section)..subscribe) and Comments (.comments): quiet bordered-top sections at the end of writing pages. The subscribe form is a plain POST to /api/subscribe (no client JS); comments are the sanctioned giscus embed described in principle 2. See docs/EMAIL_LIST_AND_COMMENTS.md.header, main, footer, nav with aria-label).aria-current="page" on active nav.:focus-visible ring on everything interactive.prefers-reduced-motion kills all transitions.--bg in both schemes: check both when touching tokens.Run the portfolio-review skill for every public visual change. Verify file signatures and dimensions rather than trusting extensions, inspect desktop and mobile renders, and use an independent visual reviewer. For generated essay visuals, archive the final prompt and settings; the header, social preview, and inline evidence image must have distinct jobs.
A past UI pass added a Google Fonts import, 3D tilt card hovers, gradient hero text, and scroll-reveal animations. None of that matched this skill: system fonts, a simple border-and-lift hover, novelty spent on writing, not chrome. It got pulled back out. Read this skill before touching style.css or page layouts. If you want to deviate on purpose, update this skill in the same PR, don't just drift from it.