소스 정보
- 저장소
- alexmensch/alxm.me
- 최근 소스 활동
- 2026년 3월 17일 12:09
- 감지된 SKILL.md 언어
- 영어
- 스타
- 0
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/alexmensch/alxm.me --skill cube-css명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | cube-css |
| description | Styling (CSS architecture and fonts) design patterns for this website |
When making any styling changes to this codebase that involve fonts or CSS, you must adhere to the system that is described here.
Styles use three interlocking systems:
clamp()SCSS entry point loads layers in order: global → config → compositions → utilities → blocks
C — Composition (src/assets/scss/compositions/)
High-level macro layout. Provides structure and rhythm. Must NOT apply visual treatments (colour, font style, shadows). Suggests layout to the browser rather than enforcing it.
U — Utility (src/assets/scss/utilities/)
Single-purpose classes. Each does one job. Extend design tokens. Do NOT use !important. Do NOT combine unrelated properties (that belongs in a Block).
B — Block (src/assets/scss/blocks/)
Component-level styles. By this stage global CSS, compositions and utilities have done most of the work. Blocks handle component-specific concerns. Max ~80–100 lines per file. Use element selectors within the block namespace (.my-block img, .my-block .title) — no BEM double-underscore required, but BEM-style naming (.block__element) is used here for sub-elements.
E — Exception
State-based variations on blocks triggered by data-* attributes. Never CSS classes.
Example: <div class="[ cluster ]" data-state="repel"> → applies justify-content: space-between.
Exceptions must be concise. If a variation is so different it's unrecognisable, create a new block.
HTML Class Grouping Use square bracket delimiter to group classes by layer:
class="[ block-name ] [ compositions ] [ utilities ]"
Example: class="[ card ] [ stack flow ] [ bg-light measure-short ]"
Never hardcode CSS values. Always use design tokens via:
@use "../config/design-tokens" as dt;
dt.get-size("m") // Returns fluid clamp() size value
dt.get-color("primary") // Returns var(--color-primary)
dt.get-value("measure", "long") // Returns 65ch
dt.use("text", 3) // Mixin: applies font-size token
dt.use("weight", "bold") // Mixin: applies font-weight token
dt.use("leading", "tight")// Mixin: applies line-height token
dt.use("measure", "short")// Mixin: applies max-width token
Use the CSS custom properties defined in _variables.scss:
--flow-space (default: l size)
--gutter (default: m size)
--measure (default: 65ch / "long")
--padding (default: xs size)
--shadow-size (default: 2xs-xs size)
Color custom properties (light mode defaults, auto-switch dark mode):
--color-dark / --color-dark-shade / --color-dark-glare
--color-light / --color-light-shade / --color-light-glare
--color-primary / --color-primary-shade / --color-primary-glare
--color-secondary / --color-secondary-shade / --color-secondary-glare
Semantic color tokens (prefer these over raw color tokens):
--bg-color --text-color --accent-color
--box-shadow-color
--footer-bg --footer-text
--hero-bg --hero-header-text --hero-header-text-mark --hero-byline-text
Generated via utopia-core-scss. All values are clamp() expressions that scale between 320px and 1240px viewport width.
Named steps (t-shirt sizing):
2xs xs s m l xl 2xl 3xl none(0rem)
Transitional one-up pairs (more dramatic scaling between viewports):
2xs-xs xs-s s-m m-l l-xl xl-2xl 2xl-3xl
Use: dt.get-size("m"), or override --flow-space, --gutter, --padding custom properties.
Steps -2 through 5 — generated as CSS clamp() values.
-2 caption/small text
-1 code (slightly smaller than body)
0 body text (default)
1 slightly larger
2–5 headings h4 → h1
Global heading sizes: h1=5, h2=4, h3=3, h4=2, h5=1, h6=0
Steps -4 through 0 (prefix "step-"), for .hero__header only.
Use: dt.use("text-mega", -2) etc.
Dark mode is automatic via prefers-color-scheme: dark in _variables.scss.
Manual theme override: data-theme="artwork" on <html> (defined in _themes.scss).
Color names follow {base}-{shade/glare} convention where shade=darker, glare=lighter.
Token-based colour utilities are generated: .bg-{color}, .color-{color}, .border-color-{color}
(e.g. .bg-primary, .color-dark-shade)
@use "../config/fonts";
fonts.base // Source Serif 4, Georgia, serif (body default)
fonts.sans // Inter, Helvetica, sans-serif (with OpenType features)
Utility classes: .font-base, .font-sans
These compositions are in src/assets/scss/compositions/. Always prefer these over writing new layout CSS.
.flowVertical rhythm using the "owl" pattern (adjacent sibling combinator).
.flow > * + * {
margin-block-start: var(--flow-space);
}
Use for: simple vertical spacing between block elements. Override --flow-space contextually.
Note: After a heading, --flow-space is reduced to 2xs (tighter heading-to-content gap).
.stack / .stack-split-1Flexbox-based vertical column. Resets all child margins then adds --flow-space between siblings.
.stack — simple flex column.stack-split-1 — pushes items after child 1 to the bottom (card footer split pattern)Use: anywhere elements stack vertically, especially cards and full-height containers.
.clusterFlex wrap grouping — items flow horizontally and wrap naturally.
.cluster {
display: flex;
flex-wrap: wrap;
gap: var(--flow-space);
}
Data-attribute exceptions:
data-state="repel" — justify-content: space-betweendata-state="center" — align-items: centerUse: navigation, tag lists, button groups, any set of items that should wrap.
.sidebarTwo-column flex layout. First child = sidebar (fixed width); last child = main content (fills remaining). Automatically stacks when main content would be < 50% width. Default sidebar width: compact measure (28ch). Gap: xs size.
Data-attribute exceptions:
data-state="reversed" — swaps which child is sidebar vs maindata-state="mirrored" — flex-direction: row-reverseAlso exposes mixins: sidebar.sidebar($width, $min, $gap), sidebar.is-sidebar($width), sidebar.not-sidebar($min)
Use: any two-column layout needing responsive wrapping.
.switcherFlex that switches between horizontal and vertical at a container threshold. Items are always equal width. Current config: max 3 items across, threshold based on compact measure.
// children: flex-basis grows/shrinks around --min-width threshold
// Quantity guard: >3 items always go full-width
Use: equal-width groups (not for sidebar-style asymmetry). Product cards, step sequences.
.gridCSS Grid with auto-fit + minmax. Items fill columns automatically based on --min-item-width (default: 12rem).
.grid {
display: grid;
gap: var(--flow-space);
grid-template-columns: repeat(
auto-fit,
minmax(min(var(--min-item-width, 12rem), 100%), 1fr)
);
}
Also exposed as mixin compositions.grid (used in .artwork).
Use: galleries, card grids, any responsive multi-column layout.
.coverFull viewport-height flex column. The element with data-target is vertically centred; first/last children without data-target pin to top/bottom.
Use: hero sections, full-screen landing areas.
.boxPadding + border container with colour inheritance. Establishes a visually distinct contained region.
.box {
padding: var(--padding);
outline: 0.125rem solid transparent; // high-contrast accessibility
outline-offset: -0.125rem;
}
.box * {
color: inherit;
}
.box .box {
padding: var(--padding);
} // nested boxes inherit padding
Data-attribute exceptions:
data-shadow — offset hatch-pattern shadow (::before pseudo-element)data-outline — visible border (0.2rem solid)data-fit-content — width: fit-contentUse: any element needing a padded, visually contained region. Often combined with utility classes for background colour, border, and radius.
.centerCenters content horizontally with padding.
.center {
box-sizing: content-box;
margin-inline: auto;
padding-inline: var(--padding);
}
Data-attribute exception:
data-state="intrinsic" — flex column with align-items: center for intrinsic centeringUse: wrapping page sections for horizontal centering.
These primitives from Every Layout are not yet in the project. Add as compositions if needed:
These live in compositions/ but are project-specific adaptations, not Every Layout primitives:
.introTwo-column layout for intro sections. Uses CSS container queries.
.intro__header — sidebar-like (flex: 1 1 compact measure).intro__content — main content (flex: 2 2 short measure)data-state="reversed" — flips layout, header text-align adjusts via container query.site-headerHeader composition with baseline-aligned inner cluster and brand link.
| Class | Purpose |
|---|---|
.wrapper | Max-width 70rem, centred, horizontal gutter padding (m size) |
.gutter | padding-inline: var(--gutter) |
.measure-reset | Removes max-width constraint (--measure: none) |
.radius | border-radius: 0.25rem |
.site-wrap | overflow-x: hidden; position: relative (outermost page wrapper) |
.drop-cap | Drop cap on first <p> in the element (float + black weight) |
.visually-hidden | Screen-reader only, not visually displayed |
.font-base | Source Serif 4 serif font |
.font-sans | Inter sans-serif font |
a.arrow-shift | Animated → appended after link text on hover |
a.hover-show | Link with no underline; underline appears on hover |
Pattern: .{token}-{variant} — one utility class per token×variant combination.
.bg-{color} background color
.color-{color} text color
.border-{width} border-width (thin/normal/thick)
.border-style-{style} border-style
.border-color-{color} border-color
.flow-space-{size} --flow-space custom property
.gutter-{size} --gutter custom property
.leading-{value} line-height (loose/tight/flat)
.measure-{size} max-width (micro/compact/mini/short/medium/long/reset)
.padding-{size} --padding custom property
.shadow-{size} --shadow-size custom property
.text-{step} font-size (steps -2 through 5)
.text-mega-{step} font-size mega scale (steps -4 through 0, prefix "step-")
.weight-{value} font-weight (extra-light through black)
| Block | File | Description |
|---|---|---|
.article | _article.scss | Article layout. .article__content has padding + measure constraint. .article__photo is centred image (70% max for portrait). Reduces flow-space after headings. |
.artwork | _artwork.scss | Gallery (.artwork__gallery) uses grid mixin with 320px min-item-width. Preview uses cover pattern with data-target. |
.button | _button.scss | CTA button. Radius, sans-serif, extra-bold, no border. data-variant="ghost" = transparent bg. |
.contact-options | _contact-options.scss | Contact link list with secondary colour background. |
.footnotes | _footnotes.scss | Strips underline from footnote links. |
.frame | _frame.scss | Aspect-ratio container. Default 4:3. data-ratio variants: 16-9, 4-3, 1-1, 4-5, 5-7, 5-6, 7-9, 2-3. Add data-landscape to invert. data-fit-content uses object-fit: contain. |
.hero | _hero.scss | Hero section with secondary bg. .hero__header uses mega type scale. <mark> gets highlight treatment. |
.nav | _nav.scss | Nav links (line-height:1). data-state="active" and aria-current="page" show underline indicator. |
.quote | _quote.scss | Styled blockquote with primary colour left border. Auto-adds " quotation marks. Attribution right-aligned. |
All exceptions use data-* attributes (never extra CSS classes):
.cluster[data-state="repel"] justify-content: space-between
.cluster[data-state="center"] align-items: center
.center[data-state="intrinsic"] intrinsic centering (flex column)
.sidebar[data-state="reversed"] swap sidebar and main child roles
.sidebar[data-state="mirrored"] row-reverse direction
.intro[data-state="reversed"] flip header/content order
.button[data-variant="ghost"] transparent background
.box[data-shadow] offset hatch shadow (::before pseudo)
.box[data-outline] visible border (0.2rem solid)
.box[data-fit-content] width: fit-content
.frame[data-ratio="16-9"] set aspect ratio (many variants)
.frame[data-landscape] invert ratio to landscape
.frame[data-fit-content] object-fit: contain
.cover > [data-target] vertically centres this child
.nav a[data-state="active"] shows underline indicator
.artwork__preview [data-target] full-height centred preview
.subscribe-form__input[aria-invalid="true"] accent-color underline on invalid input
blocks/, max ~80–100 lines[data-*] exception to the block, not a new class--flow-space, --gutter, --padding custom properties or override them locally; use dt.get-size() in SCSS--bg-color, --accent-color) first; raw color tokens second; never hex valuesdt.use("text", N) mixin or .text-{step} utility; never hardcode font-size.site-footer | _site-footer.scss | Footer with --footer-bg/--footer-text colours. .site-footer__content has block + inline padding. |
.skip-link | _skip-link.scss | A11y skip nav. Absolutely positioned, visually hidden unless focused. |
.subscribe-form | _subscribe-form.scss | Email subscribe form. Tightened --flow-space. __fields wraps inputs+button. __input has underline style. __error small sans-serif, hidden when empty. Scoped .button override. |