Concept v6.0.1 — authoritative census

Census

The authoritative census of the installed Concept theme. Ground truth is the installed theme, pulled read-only: live theme RT-C-V2 — Site Wide & Product Page Fixes. #160946684156 on kixf4x-8m.myshopify.com. Version from config/settings_schema.json → theme_version: "6.0.1".

This page supersedes every earlier count. Where another document in this system states a theme total, this one wins.

The five layers

The section layer alone would have read as COMPLETE — 101 found, 101 recorded. It is the four layers we never enumerated — blocks, snippets, JS elements, keyframes — that carry the gap.

LayerInstalledIngestedMissing
Sections (sections/*) — 98 .liquid + 3 .json section groups 101984
Theme blocks (blocks/*.liquid) 22166
Snippets (snippets/*.liquid) 981781
JS interaction/motion elements (customElements.define) 1161898
CSS @keyframes families 19217
CSS --animation-* transition tokens 660
Theme-level motion toggles (settings_schema.json) 422
Marketing-page features absent from code 0—0
4 + 6 + 81 + 98 + 17 + 2208

The --animation-* token layer is the one layer that was already complete. All six — fast, nav, nav-delay, primary, short, smooth — were named and carry their theme values in tokens.css.

Counting rule — read before citing any number

The delta list below enumerates 222 named items, not 208. The difference is not an error and not padding.

LayerNames enumeratedSet-difference (missing)Relisted for correction/context
A. Sections541
B. Theme blocks660
C. JS elements107989
D. Keyframes19172
E. Motion settings220
F. Snippets83812
Total22220814

222 − 208 = 14, and the per-layer residuals sum to 14 exactly. Those 14 are items already in our inventory that were relisted because they carry a correction or the surrounding context needed to read the group — countdown-timer and hover-button are clear examples: both were known, both were described wrongly.

Cite 208 as the gap and 222 as the enumeration. They are different questions.

CANNOT-VERIFY: which specific 14 items are the relisted overlap. LAR-1415 does not itemize them, and the strict word-boundary match that produced "18/116 named" was not published per-name. Anyone re-deriving the 208 must redo that match rather than subtract from this page.

A · Sections — 4 missing (5 enumerated)

ItemWhat it doesCandidate
main-activate-accountAccount-activation page section, 8 schema settingsno — customer-account plumbing
main-giftcard-headerGift-card page header, 3 settings. Our inventory recorded it as main-giftcard, which does not existno — naming drift to fix
header-groupShopify section group — decides which sections may be placed in the header slotyes (structural)
footer-groupSection group for the footer slotyes (structural)
overlay-groupSection group for the overlay slot. This is what makes drawers and popups placeable.yes (structural)

Section groups were never enumerated by us at all. They are not sections; they are the containers that decide what may go where. Any giveaway popup must be registered in overlay-group.json or it cannot be added in the theme editor.

Phantom entries — in our inventory, not in the theme: main-giftcard and main-password do not exist. The real files are main-giftcard-header, main-password-header, main-password-footer.

B · Theme blocks — 6 missing (6 enumerated)

Drag-and-drop, reusable in any section that accepts blocks. All six are candidates — full component entries are on Motion § 2.

ItemSettingsWhat it does
popup-link14, accepts nested blocksA link that opens an arbitrary modal built from nested blocks
spacer8Explicit vertical rhythm control inside a section
subheading10Eyebrow / kicker text above a heading
social-icons14Social account icon row; ships accessible labels
_accordion-row9One row inside an accordion block
_custom-field12An arbitrary extra field on a contact form

C · JS interaction + motion elements — 98 missing (107 enumerated)

The theme registers 116 elements via customElements.define. Our docs named 18, abstracted to "nine engine families". The families are not wrong — they are too coarse. Each hides 3–15 distinct components with their own durations and triggers.

C1 — Outside all nine families (13) — the highest-value gap

ElementBehavior + measured timingsCandidate
mouse-cursor
theme.js:1117
Custom cursor following the pointer with a 1/4 lag factor per throttled mousemove, writing --x/--y; disabled on touchyes
magnet-element
theme.js:1424
Spring-eased translate toward the pointer — Motion.spring(), duration 1.5s, magnet = 10; returns to zero on pointerleaveyes
magnet-button
theme.js:1404
HoverButton + the same pointer magnet springyes
magnet-link
theme.js:1329
HoverLink + pointer magnet springyes
spinning-text
theme.js:7383
Lays characters around a circle using CSS sin(); infinite CSS rotation; in-view at 600px marginyes
overlay-element
theme.js:1866 · 40 uses
Toggles active/pressed on mouse-cursor over a media regionyes
gesture-element
theme.js:1773 · 32 uses
Vertical swipe detection; fires gesture:swipeup/swipedown past max(25px, 15vh) with velocity > 10; longpress at 500msno — infrastructure drawers already consume
loading-bar
theme.js:1104
Page-transition progress bar; fades opacity → 0 over 1s on page:loadedyes (already on) — the system must specify its colour or it renders unstyled
progress-bar
theme.js:4877
On in-view sets --progress to (value × 0.75 × 100 / max)%; pure CSS fillyes
scroll-shadow
theme.js:4230 · 11 uses
Shadow-DOM edge-fade so cut-off content reads as scrollableyes — the horizontal roster rail needs this affordance
scrolled-images
theme.js:3045
3 rows of shuffled images; alternating rows translate opposite directions on scroll (Motion.ScrollOffset.Any, linear); min 8 per rowyes
icons-carousel
theme.js:8720
On mouseenter scrolls the full scrollWidth smoothly, returns to 0 on mouseleave; touch excludedno
comparison-highlight
theme.js:8944
Checkbox toggling .info row highlighting on a comparison-tableno

C2 — Family 1, scroll-reveal (6)

ElementBehavior + measured timingsCandidate
animate-element
theme.js:1434 · 16 uses
The actual reveal engine. Four variants: fade-in 1.5s, fade-up 1.5s (translateY(min(2rem,90%))→0), fade-up-large 1.0s (90%), zoom-out 1.3s (scale 1.3→1) — all on [0.16,1,0.3,1]. Waits for image load, resolves after 500msyes — correction C-0a
animate-picture
theme.js:1475 · 7 uses
Same engine on <picture>, no 500ms resolve delayyes — responsive rider portraits reveal through this
motion-list
theme.js:4099 · 17 uses
Grid cascade from translateY/opacity 0: desktop 50px / 0.5s / 0.1s stagger; mobile 30px / 0.3s / 0.05s staggeryes — correction C-0a; our docs recorded 75ms
split-words
theme.js:2871 · 11 uses
Splitting.js word split; each word wrapped in animate-element, 30ms per-word staggeryes
reveal-banner
theme.js:7902
Scroll-driven clip-path inset(20% 35% 0% 35% round var(--rounded-block)) → inset(0%), linear; second tracker fades overlay + slides content translateY(10%)→0yes
splitting-banner
theme.js:7949
Per-character opacity 0.3 → 1 with Motion.stagger(0.1) on enter; wrapper fades to 0 on exit; button wrapper slides translateY(100%)→0yes

C3 — Family 2, scroll-linked continuous (5)

ElementBehavior + measured timingsCandidate
parallax-element
theme.js:3717 · 6 uses
Scroll-driven translateY(data-start→data-stop), Motion.ScrollOffset.Any; auto-disabled on matchSmallyes
parallax-overlay
theme.js:3756
Animates an arbitrary CSS property named by data-target from data-start to data-stop, bound to ScrollOffset.Enteryes — the generic form is undocumented
footer-parallax
theme.js:3787
translateY(-50%→0) on ScrollOffset.Enter; desktop-onlyno
testimonial-parallax
theme.js:7941
ParallaxElement with mobileDisabled = trueno
slideshow-parallax
theme.js:7684
translateY bound to ScrollOffset.Exit; always active, mobile includedno

C4 — Family 3, hover micro-interactions (10 elements on 9 lines)

ElementBehavior + measured timingsCandidate
hover-button
theme.js:1339 · 95 uses
Hover fill-slide over 0.6s. On aria-busy="true": text fades out 0.15s, pulsing loader dots scale(1.6↔0.6) at 0.35s with 0.175s stagger, infinite alternate. The single most-used element in the theme.yes — correction C-0c
hover-link
theme.js:1319 · 39 uses
Anchor form; [data-fill] child y: 76%→0% on enter, →−76% on leave, 0.6syes
hover-element
theme.js:1414 · 14 uses
Generic [data-fill] slide, same 0.6syes
reveal-link
theme.js:1309
Pointer-tracking reveal of a [data-reveal] child, 0.2s steps(2, start); leave easing [0.61,1,0.88,1] 0.2syes
media-hover-button
theme.js:6748
Click (non-touch) builds a 2× zoom overlay at background-size: width×2px; mousemove tracks the cursorno — wrong semantics for editorial portraits
secondary-media
theme.js:3966
Flickity, no drag; mousemove picks a slide by horizontal thirds of card width (2 media → always 1; 3 → halves; 4 → thirds); returns to 0 on leaveyes
secondary-video
theme.js:8618
Plays an autoplay video-media on mouseenter, pauses on leave; skipped on touch and reduced-motionyes
next-button
theme.js:4521 · 18 uses
HoverButton subclass dispatching slider:next; self-disables from slider:*Statusyes
previous-button
theme.js:4471 · 18 uses
HoverButton subclass dispatching slider:previous; self-disablesyes
control-button
theme.js:7716
Toggles paused, dispatches slider:play/slider:pause, updates aria-labelyes — accessibility floor for any autoplaying carousel

LAR-1415 heads this group "9 undocumented components" while listing next-button / previous-button on a shared line. 10 distinct elements. Counted as 10 here.

C5 — Family 4, looping tickers (1)

ElementBehavior + measured timingsCandidate
marquee-element
theme.js:2934 · 6 uses
Sets CSS --duration to (33 − speed) × min(2.5, ceil(width / parentWidth)) seconds; optional scroll-driven translateX(parallax%→0) linear; IntersectionObserver pauses offscreenyes

The marquee duration is COMPUTED at runtime. --duration-marquee: 1.5s in tokens.css does not describe the theme marquee and never did. It is ours, and is relabelled as ours in tokens.css.

C6 — Family 5, carousels (8)

ElementBehavior + measured timingsCandidate
slider-element
theme.js:4571 · 15 uses
Native scrollLeft slider; prev/next move perPage × itemOffset; 50ms debounced scroll, 75ms scrollend fallbackyes — native scroll = free touch + keyboard
carousel-element
theme.js:3865
Flickity wrapAround + adaptiveHeight; skips animation when jumping > 3 slides; fires carousel:changeyes
slideshow-element
theme.js:7448
Flickity, wrapAround, optional autoplay at autoplaySpeed × 1000ms; refreshes animate-element in the incoming slideno
slideshow-hero
theme.js:7587
SlideshowElement + adaptiveHeight; adds hero-scrolled when the next section top crosses −30pxno
slideshow-words
theme.js:7630
On slide change resets and refreshes word animate-elements after 500 + (30 × wordCount)msno
slider-dots
theme.js:4800
Scrolls the dot list to centre the active dot (smooth unless reduced-motion)yes
media-dots
theme.js:6830
SliderDots + re-indexes on matchSmall/unmatchSmallno
tabs-element
theme.js:7027
Panel out translateY(0→2rem)/opacity 1→0 in 0.15s, then in translateY(2rem→0)/opacity 0→1 in 0.15s; fires motion-list.load() if the panel holds oneyes

C7 — Family 6, overlay enter/exit (9)

ElementBehavior + measured timingsCandidate
modal-element
theme.js:1898 · 7 uses
Base modal: adds active after a 75ms delay, waits for CSS transitionend on .fixed-modal; swipe-down feedback transform .1s linearyes
x-modal
theme.js:6869 · 13 uses
ModalElement + body-lock + append-to-body; pan-gesture close at 30% dragyes
drawer-element
theme.js:2245 · 5 uses
ModalElement + lock + append-to-body; swipe-down past 30% of layer height dismissesyes
share-drawer
theme.js:2292
On show, list items translateY(2.5rem→0)/opacity 0→1 in 0.6s [0.075,0.82,0.165,1] with 0.1s stagger after a 300ms delay; uses navigator.shareyes
quick-view
theme.js:7766
XModal fetching ?view=modal product HTML, injected after 200msyes
back-in-stock-drawer
theme.js:2335
DrawerElement auto-showing after 1000ms if an .alert result is presentno
media-lightbox-button
theme.js:6726
Dispatches lightbox:open with the current slider indexyes
social-feed
theme.js:8650
XModal with shouldCloseAll; on show, in-view triggers lookbook.animate(); arrow keys navigate postsyes
social-feed-button
2 uses
Opens the social-feed modal at a given postyes

C8 — Family 7, text reveal (2)

ElementBehavior + measured timingsCandidate
highlighted-text
theme.js:2914
Waits for the parent split-words load promise, then adds animated. The animation itself is CSS-onlyyes — this is the element behind the 7 highlight styles. Our docs describe the styles but never the element, so a build cannot wire it
text-scrolling
theme.js:7006
Each child .heading gets scroll-driven opacity [0,0,1,1,1,0,0] across viewport offsets 33vh–66vhyes — distinct from all nine families

C9 — Family 8, countdown (2 enumerated, 1 correction, 0 genuinely new)

ElementBehavior + measured timingsCandidate
number-counter
theme.js:8468
Counts up 0 → target via Motion.animate progress callback; duration from data-duration; easing [0.16,1,0.3,1]yes — correction C-0b: count-up is a separate, tenth engine
countdown-timer
theme.js:7128
setInterval at 1000ms re-rendering days/hours/mins/secs; hides on expiry. No animationn/a — a text re-render, not a motion engine

C10 — Family 9, sticky chrome (4)

ElementBehavior + measured timingsCandidate
sticky-element
theme.js:3631 · 13 uses
Adjusts --inset per requestAnimationFrame so a tall column follows scroll within header-height and bottom-gap bounds; default gap 20px, threshold 0.5pxyes
sticky-header
theme.js:1201
Throttled scroll: header-scrolled at headerHeight + 10px, header-nav-scrolled at 2 × headerHeight, header-hidden past headerBottom + 100px on scroll-downyes (already on) — three states designers must draw
custom-header
theme.js:1141
Sets --header-height via ResizeObserver; applies header-transparent when the first section allows it, removing no-animate after 500msyes — transparent-over-hero is a per-section capability we never recorded
scroll-spy
theme.js:8968
Smooth-scrolls to a target offset by header height, tracks the active link; back-to-top scrolls to 0; smooth unless reduced-motionyes

C11 — Non-motion plumbing (47 enumerated)

LAR-1415 heads this group "24 items, listed for completeness" while enumerating 47 names. Counted as 47 here. This is the largest single arithmetic slip in the source and is the main contributor to the 222-vs-208 spread.

api-button · lazy-background · cart-count · custom-select (18 uses) · quantity-input (11 uses) · quantity-label · variant-picker · product-info · product-form · product-card-info · product-buy-price · product-complementary · product-sticky-form · product-bundle-details · product-bundle-form · product-bundle-picker · product-bundle-remove-button · product-bundle-toggle-button · media-element (26 uses) · media-gallery · video-media · model-media · filters-toggle · dropdown-element · dropdown-localization · localization-form · localization-listbox · menu-details · menu-drawer · menu-toggle · details-dropdown · details-mega · accordion-details · accordions-details · footer-details · password-header · password-footer · password-main · password-modal · copy-button · qr-code · g-map · g-map-locations · testimonials-element · lookbook-element · shop-the-look · image-comparison

accordion-details, details-dropdown and details-mega carry real, specified motion — accordion opens height summaryHeight→scrollHeight in 0.25s ease then fades content in over 0.15s at a −0.1s offset; the dropdowns slide translateY(-105%)→0 in 0.6s [0.7,0,0.2,1]. They are filed as plumbing only because they are chrome rather than page components. If the rider pages ship an FAQ or a filter, their durations belong in the spec.

copy-button and qr-code are defined in assets/giftcard.js, not theme.js.

D · CSS @keyframes families — 17 missing (19 enumerated)

The three the system MUST specify

KeyframeTimingWhy it is required
hotspot2s ease infiniteThe pulsing ring on lookbook / shop-the-look hotspot markers. The Addendum-B lookbook port depends on it and it has no colour specified.
preloading1.2s infinite ease · 4 call sitesThe theme-wide loading placeholder pulse. Governs perceived load on image-heavy rider pages.
placeholder-shimmer1.3s linear infiniteSkeleton shimmer — same surfaces, same reason. Grouped with preloading: they are one loading state.
strokeAnimation1.3s cubic-bezier(0.65,0,0.35,1) forwards · 2 call sitesSVG stroke draw-on. This is how the five scribble highlight variants DRAW. The system names the variants but never the draw-on.

The rest

KeyframeTimingCandidate
scrolling-left / scrolling-rightMarquee translation, driven via animation-name + the JS-computed --durationyes — the actual marquee mechanism
appear-up / appear-downEntry keyframes applied via animation-name, not shorthandyes — used by dropdown/overlay entries
fade-in.6s cubic-bezier(.7,0,.2,1)yes — a second, distinct fade curve from the reveal engine's [0.16,1,0.3,1]. Do not merge them
fade-outExit counterpart, applied via animation-nameyes
beat.6s infinite easeno — model-viewer AR affordance
blink0.7s infiniteno — caret/indicator
dash1.4s infinite easeno — spinner stroke
rotator1.4s infinite linearno — spinner rotation
spin1s linear infinite · 2 sitesno — spinner
search-voice-pulse1.2s ease-in-out infiniteno — voice-search mic affordance
pswp-clockwise.6s linear infiniteno — PhotoSwipe vendor spinner
airReviewsShowModal / airReviewsCloseModal.6s cubic-bezier(.7,0,.2,1)no — NOT NATIVE. Air Reviews third-party app. Flagged so they are never ingested as theme motion

E · Theme-level motion toggles — 2 missing (2 enumerated)

The theme ships 4 motion-gating settings in config/settings_schema.json; our docs named 2.

SettingType / defaultWhy it matters
enable_lazy_imagedefault trueGates lazy image loading; interacts with animate-element's wait-for-image-load. This is why cascades can stagger unevenly. Must be in the spec
buttons_hoverselect, default standardTheme-level selector deciding which hover-button behavior renders site-wide. The system's "invert on hover" rule is only reachable if this setting is correct. Confirm the intended value before any button spec is signed off
enable_page_transitiontrueAlready named. The loading-bar renders on every navigation and needs a specified colour
enable_heading_revealtrueAlready named, recorded for the full picture

F · Snippets — 81 missing (83 enumerated)

The theme ships 98 snippets; our docs named 17. None are individually addressable in the theme editor, but each is the actual implementation of a designed surface — a spec that names a component without naming its snippet cannot be built mechanically. All paths are snippets/<name>.liquid.

Design-bearing — candidate yes (50)

product-card-horizontal · product-card-bundle · product-card-placeholder · collection-card · article-card · promotion-card · social-feed-card · product-badges · product-price · product-rating · product-inventory · product-thumbnail · product-media-gallery · product-video · product-breadcrumb · product-variant-picker · product-variant-picker-button · product-variant-picker-dropdown · product-variant-picker-swatch · product-variant-picker-variant · product-variants · product-bundle-variant-picker · product-complementary · buy-buttons · swatch · unit-price · free-shipping-bar · back-in-stock · newsletter-form · alert · announcements-marquee · announcements-carousel · highlighted-text · mouse-cursor · loading-bar · heading-content · section-heading · social-icons · social-sharing · social-feed-heading · background-image · background-media · background-video · corner · icon-scribble · icon-accordion · icon-announcement · icon-brand · icon-dock · icon-guarantee

Layout / plumbing — candidate no (33)

Internal, but they define the spacing and colour contract every section obeys.

section-border-style · section-gap-style · section-layout-class · section-overlay · section-size-style · section-spacing-style · js-variables · direction · facets · facets-active · facets-drawer · facets-sticky · footer-contact · footer-logo · footer-menu · footer-text · header-drawer · header-icons · header-logo · header-nav-desktop · header-nav-drawer · header-nav-mega · gift-card-recipient-form · gift-wrap-item · gift-wrap-selector · gift-wrapping · gift-wrapping-list · gift-wrapping-list-horizontal · quick-order-list-row · article-comment · subcollections · social-meta-tags · product-placeholder

The six section-*-style snippets are the highest-value item in this group. They are the single source of truth for how every section's padding, gap, border, overlay and size settings become CSS. Our token sheet was derived from theme.css and css-variables.liquid without them — which is why nine token values were wrong at authorship.

Provenance and method

Ground truth: the installed theme, pulled read-only. shopify theme list → live theme #160946684156. Pulled with shopify theme pull --theme 160946684156 --path <scratch>. No push, no theme edit, no shopify theme dev. No credential values read or recorded.

Vault-search-first: local copies searched before any pull. find /Users/driftwood/CODE -maxdepth 3 -name settings_schema.json → no results; no local theme checkout existed.

Reproducible enumeration commands

ClaimCommand
101 sectionsls <theme>/sections | wc -l → 101 (98 .liquid, 3 .json)
22 blocks / 98 snippets / 43 assets / 43 templatesls <theme>/{blocks,snippets,assets,templates} | wc -l
2357 section settings, 368 block types, 61 presetsPython parse of every {% schema %} in sections/*.liquid; 97/98 parsed — pickup-availability.liquid has no schema
116 custom elementsgrep -ohE "customElements\.define\('[a-zA-Z0-9_-]+'" <theme>/assets/*.js | sed | sort -u | wc -l → 116. Per-file: theme.js 110, collection.js 11, cart.js 10, gift-wrapping.js 6, search.js 5, password.js/quick-order-list.js 4, others 1–2
19 @keyframesgrep -ohE "@keyframes[[:space:]]+[a-zA-Z0-9_-]+" <theme>/assets/*.css | awk '{print $2}' | sort -u
6 --animation-* tokensgrep -ohE "\-\-animation-[a-zA-Z0-9-]+" <theme>/assets/*.css <theme>/snippets/*.liquid | sort -u → fast, nav, nav-delay, primary, short, smooth
184 theme settings, 4 motion-gatingPython scan of config/settings_schema.json

Marketing cross-check — roartheme.co/pages/concept

The page advertises 14 named features + "2 presets" + "50+ designed sections". All 14 verified present in the installed code by grep: size chart 9 · sibling products 4 · cart notes 3 · free-shipping message 6 · smart search 8 · advanced filtering 11 · RTL 16 · selling internationally 11 · multi-image variant 6 · quick view 9 · mega menu 8 · colour swatches 56 · sticky ATC 4 · cart recommendations confirmed at sections/cart-drawer.liquid:469.

Marketing-only phantom features: 0. Marketing understates the theme — 50+ advertised vs 98 sections installed.

Non-native content — do not ingest as Concept theme motion

A note on the false positive

A first pass over a wider 530-file / 234M-char corpus returned "116/116 named", which was a false positive — bare substring matching hit map, icon, group, video etc. inside unrelated prose and raw conversation JSON. The strict scoped result (18/116 named) is the one reported. Both runs are recorded so the number is not mistaken for a re-count. Matching used a word-boundary regex (?<![a-z0-9-])name(?![a-z0-9-]) over a concatenated corpus of exactly seven inventory-side files.

CANNOT-VERIFY

CANNOT-VERIFY: that the live theme RT-C-V2 is byte-identical to a pristine Roar Concept v6.0.1 download. RT-C-V2 is the SWAGTRON working theme and carries at least one confirmed local modification (swagmag-editorial.css). Every enumeration here is "what is installed", which is what the brief asked for as ground truth. A delta against a pristine vendor copy was not performed.

CANNOT-VERIFY: which specific 14 enumerated items are the already-named overlap between the 222 names listed and the 208 set-difference.

DISCHARGED 2026-08-30 — was: CANNOT-VERIFY that the settings-backed tokens still hold under v6.0.1. Retained rather than deleted, because the register is the history. The settings-backed tokens were re-read against the installed Concept v6.0.1 on 2026-08-30: 44 tokens traceable to a key in the live config/settings_data.json, all unchanged, zero drift. The long-quoted count of 38 was an undercount and was never enumerated. --radius-badge has no settings key and is a repo-side alias of --radius-button. The enum-to-value mapping in snippets/css-variables.liquid has not been re-read against v6.0.1 — that part of C-0d stays open.