Skip to library content
PORTFOLIO / WEBSITE SYSTEMTry components

Ning Zhou / Portfolio website

The portfolio,
one design system.

A shared design system for this portfolio.
Shared typography, components and navigation for the portfolio’s pages.

Explore the components

Shared / In this library

A library of website components.

Typography, controls, artwork frames, lighting, opening scenes and navigation, collected from the portfolio website.

Project / Within each case study

Product interactions are documented in each case study.

Product screens, task flows, states and iterations are presented within each project, with their own design language.

22Website components
04Component groups
01Shared library

01 / Foundations

Design foundations.

Shared colour, type and spacing. Each project page can have its own accent.

Website accents

Colour variants of the same website system

Moonlit is the default accent; the others identify project pages. App colours and component rules remain within their respective case studies.

Background#090F10
Surface#111919
Primary text#EEE9DF
Secondary text#AAB3B0

Typography

Typography for
comfortable reading.

Headings pair Newsreader with Source Han Serif at a regular weight. Chinese headings use natural character spacing. Body copy and navigation use Hanken Grotesk and Source Han Sans. These OFL fonts are hosted with the site. Artwork, logos and product screens retain each project’s original typography.

Project overview.Display · 32–53 / 1.18
Clear headings and readable body text.Body · 17 / 1.8
Project notes and information hierarchySecondary · 15 / 1.75
Explore the project ↗UI · 14 / 1.5
01 / Image captionCaption · 13 / 1.65
THE PROJECTLabel · 12 / 1.5

Space

4 px base unit · Body width up to 640 px
4
8
12
16
24
32
48
64
96

Shape & depth

4 px1 px

Borders, surfaces and depth.

Tags use a 4 px radius. Fine borders separate content, images keep their ratio, and dialogs use a backdrop.

Icon & ornament

Icons guide actions; ornaments add detail.

Arrows indicate direction, and close and expand icons identify actions. Decorative frames and butterflies sit alongside clearly labeled controls.

Type in context

Sensing the invisible.

Body text explains the design; captions add context. Use full paragraphs to check reading rhythm at 17 px on desktop and 16 px on mobile.

01 / A wearable and companion app.

02 / Website components

The shared library.

Shared website components, grouped by purpose. Each comes with usage notes and a working preview.

显示 22 个组件

04 / Page patterns

A project page example.

FellouAI demonstrates a project-page composition: heading, body, brand image and project facts.

01 / FellouAI · Brand & launch

A clear
launch presence.

Logo studies, launch visuals, communication materials and website recommendations for an AI product.

Explore FellouAI
FellouAI gradient-orbit brand artwork
01 / FellouAI · Brand expression
Context
AI product · Brand & launch
Focus
Logo · Launch visuals · Digital touchpoints
01Section heading02Body copy03Image / Caption04Project facts

Covers and framesFrames follow image proportions. Keep subjects intact and captions outside, allowing long captions to wrap.

Website structure and project contentKeep website type and spacing consistent. This example uses FellouAI’s lavender accent while the brand image retains its own colours.

More work

02NExOExplore another project

05 / Motion & feedback

Interaction details.

Try the site’s hover effects, image previews and messages. Each demo explains how it starts, responds and ends.

Hover me

Hover or focus with Tab; click to replay the fade.

1.025×Subtle text scaling
No layout shift
320 msEnter and leave
Ease in and out
180 msKeyword emphasis
Surrounding words soften
44 pxMinimum target height
Visible keyboard focus

Motion respects the system’s reduced-motion preference. With animation off, colour and focus feedback remain.

Study 01 / Text action

Text hover and focus.

Use
Project entries, reading links and clearly labelled text actions.
Trigger
Hover scales text to 1.025× with the project accent; leaving restores it.
Keyboard & touch
Tab shows a focus outline. Touch activates directly; motion never carries essential information.
Boundaries
Disabled actions do not respond. Text scaling preserves the surrounding layout.
View states and code

Study 02 / Image dialog

Image preview and return.

Open
Click the image to reveal a large preview and backdrop. Focus moves inside.
Closed
Close or press Escape to return. Focus goes back to the image trigger.
Boundaries
The background stays inactive while the dialog is open. Tall images scroll within it.

Ready to open the preview.

NExO / Wearable detail

NExO wearable sensor’s metal structure

Study 03 / Toast feedback

Share a project.

Copy the project link to share it in a message or email.
Try copying the link below.

Sonner reference

More states

SCENARIO / SHARE A PROJECTTry it live
NExO project cover

NExO

Wearable & companion app

Copy, then paste into a message or email to share.

Action → resultSuccess confirms the copy. If automatic copying is unavailable, select the link and copy manually.

Time to readMessages dismiss after 5.5 seconds; hover or focus pauses the timer. The card retains the result after the toast disappears.

Compare other statesSimulate success, error, loading and stacking, or change position. These state demos do not copy anything.

The copy button uses the current site URL shown above. This independent JavaScript component is inspired by Sonner; it does not use the React package.

06 / Signature interactions

How the interactions work.

Each interaction includes its purpose, structure, states and usage notes. Try individual components, then view them together on the homepage.

Reference study / Kaiwen Tang

A highlight that follows the active label.

A shared outline glides between labels and resizes to their width. The text grows gently; the outline stays behind it.

01 / Selected work

Selected design projects.

Brand identities, digital products and interactive experiences.

Purpose

Sliding highlight

A shared outline follows hover and keyboard focus. Clicking a tab changes its content; hovering only previews the target.

Anatomy / What it is made of

01 · Target
A stable hit area; the label scales without changing its neighbours.
02 · Shared indicator
One absolutely positioned element follows the target bounds. It does not cover the text.
03 · Content panel
The selected tab owns the panel. Hovering alone does not replace the content.
Behavior / State → trigger → response
StateTriggerResponse
RestPointer outsideOutline returns to the selected label.
PreviewHover or keyboard focusMove and resize the outline; enlarge the label slightly.
SelectedClick, or arrow-key selectionUpdate the panel and the selected state together.
1.025× · Label scale420 ms · Shared outline48 px · Target height
Use it well

Use for a small set of related tabs. Keep the outline behind the labels and leave enough space between targets.

Keyboard, touch & reduced motion

Arrow keys, Home and End work without a mouse. Reduced motion removes travel; selection and content remain available.

Implementation referencelibrary-signatures.js / initSlidingHighlight · reference study

Website pattern / Work

One frame, six project covers.

Move between projects. The images slide inside one frame, which changes size with the cover. Switch the lamp off, or focus a row to redirect its light.

Interactive specimen

Purpose

Frame shell & ratio

Display project covers in a shared frame that adjusts to each image’s proportions.

Anatomy / What it is made of

01 · Ornament
The same border-image element remains mounted across every selection.
02 · Mat & aperture
A dark mat separates the decorative edge from the artwork. The aperture clips only the image track.
03 · Ratio constraint
Natural width and height set the ratio; available stage space limits the final size.
Behavior / State → trigger → response
StateTriggerResponse
LoadingCover dimensions unavailableUse a provisional ratio, then measure the loaded image.
ResizingSelect a differently shaped coverAnimate width and height on the existing frame.
ConstrainedSmall screen or tall imageReduce the whole frame to fit the stage; keep the image ratio.
520 ms · Width + height1 · Persistent frame20 px · Specimen border
Use it well

Use for the portfolio’s curated Work list. The Stone Roses uses its existing art-directed crop; other covers retain their intrinsic ratio.

Keyboard, touch & reduced motion

On narrow screens, the frame moves below the list. Titles and captions remain outside the clipped artwork.

Implementation referencework-hover.js / sizeFor · work-hover.css · library-signatures.js / layout

Selected artwork

Component studies / Homepage

Components of the opening scene.

Try the entrance, scroll movement, flowers, reading panel and navigation separately. The full homepage preview below shows how they fit together.

Isolated behavior study

Purpose

Curtain trigger

Open the curtain to enter the portfolio. The entry button remains separate from the decorative cloth.

Anatomy / What it is made of

01 · Entry action
One visible action starts the opening; the decoration is not an unlabeled target.
02 · Two cloth layers
Left and right panels move away from the centre together.
03 · Interaction gate
Controls behind the curtain become available once entry is released.
Behavior / State → trigger → response
StateTriggerResponse
ClosedInitial visitOffer the entry action; avoid activating hidden controls.
OpeningClick or entry gestureRun one opening sequence; repeated input does not stack animations.
OpenSequence completesRelease reading and navigation. Reset is available in this study.
1800 ms · Cloth opening2 · Moving panels1 · Entry sequence
Use it well

The specimen isolates the trigger and two moving layers. The real homepage adds cloth physics, the river and the camera sequence.

Keyboard, touch & reduced motion

Provide keyboard activation and respect reduced motion. Direct chapter links should not force readers through the entrance again.

Implementation referencecurtain-journey.js + curtain-cloth.js
See the components together / Original homepage

The full composition combines the components above. Load it only when you want to compare the complete experience.

Curtain entrance

Click the curtain or scroll down to enter. The scene opens into the river before moving back toward the window.

Starts only when you choose to explore.

Open full website

The preview is ready to load.

Interaction design / Reading preferences

Appearance and language

Choose light or dark mode, and switch between English and Chinese.

04 / Reading preferencesInteractive demo

Appearance

Change your display mode

The page colors change gradually with the watch’s movement, keeping your reading position.

Dark mode
01 / Watch enters02 / Colors transition03 / Resume reading
Change languageEnglish ↔ 简体中文

The portfolio opens in dark mode and remembers your choice. Reset preferences restores dark mode and the browser’s preferred language.

Purpose

Floral pocket-watch transition

The watch’s movement connects light and dark modes through a gradual color change. Its floral cover and gold case echo the homepage garden and artwork frames.

Anatomy / What it is made of

01 · Appearance control
The demo button and appearance menus across the portfolio use the same transition, including the homepage and project pages.
02 · Watch and movement
The watch asset was adapted from the reference photograph using AI. It swings closer, gradually slows down, and fades out.
03 · Color transition
A soft boundary follows the watch’s first swing. The new palette continues to spread as the watch swings back, with text and images visible throughout.
Behavior / State → trigger → response
StateTriggerResponse
ReadyBefore activationThe appearance control is available; the watch is hidden.
SwingingClick, Enter or SpaceThe watch swings closer as the page colors change, then fades out.
Finished or skippedEnd of motion, Escape or SkipThe selected appearance stays in place. The watch disappears and focus returns to the control.
3.4 s · Animation duration94 vh · Desktop heightFirst sweep · Synchronized colors
Use it well

The animation plays when a visitor changes appearance. The first visit uses dark mode; later visits keep the saved choice, independently of system appearance.

Keyboard, touch & reduced motion

Select Skip animation or press Escape to finish immediately. Reduced motion disables the animation. If the browser cannot show the transition, it uses a color fade or changes appearance directly.

Implementation referencereading-objects.js / change · reading-objects.css / .reading-clock-overlay · assets/reading-objects/floral-pocket-watch-v1.png

07 / Website playground

Try the components.

Switch website width, component state and accent colour. Settings affect only the preview; mobile shows the website’s narrow layout.

Desktop · Responsive widthLIVE PREVIEW

Project introduction · Moonlit · Desktop website

08 / In use & guidelines

Using the components.

Download component kit

01 / Load the foundations

Load design tokens and component styles. Wrap the page content in .nz-scope. Moonlit is the default accent.

<link rel="stylesheet" href="portfolio-tokens.css?v=850109dd80e3">
<link rel="stylesheet" href="portfolio-components.css?v=e1ba7cdd7cf4">
<main class="nz-scope" data-nz-theme="default">
  <!-- 粘贴组件代码 -->
</main>

02 / Composition and interaction

Shared controls include copyable HTML. Signature studies link to their source files and live scenes. Image dialogs use the initializer; disclosures use native browser behavior.

<script type="module">
  import { initPortfolioComponents }
    from './portfolio-components.js';
  initPortfolioComponents();
</script>
03 / Add toast feedback

The kit includes toast styles, a standalone module and a working example. Load the tokens and these files, then connect the trigger to a real action.

<link rel="stylesheet" href="portfolio-toast.css?v=991953e2c449">
<script type="module">
  import { createToastRegion } from './portfolio-toast.js';
  const feedback = createToastRegion();
  // 在实际操作完成后调用:
  feedback.show({ type: 'success', title: '代码已复制' });
  // 异步操作:show({ type: 'loading', ... }) 返回 id,
  // 完成后调用 feedback.update(id, { type: 'success', ... })。
</script>
Where the library is used

The homepage links to this library. Typography is shared across the site, and the copy-link demo uses the toast component included in the kit. Project pages also use their own layouts and scripts. The kit contains web components; native Figma components are not included.

Reference notes

Arbor ↗: a progression from foundations to components and page patterns.

Radix Themes ↗: theme switching and side-by-side states.

Sonner ↗: working demos and clear behaviour notes. The visuals and examples follow this portfolio.

鲁ICP备2026065713号-1