rage-motion
GitHub SoyRage

504 components · 0 dependencies · MIT

Motion with technique in it

Not a folder of fades. Variable-font axes that bend to the pointer, words that morph letter by letter, carousels built on the browser's own scrolling, menus that actually trap focus.

Browse the catalogue ↓
504
components
0
dependencies
53
modules, all copyable
MIT
take it and ship it

01Everything, listed

Everything, on one screen.

Every component and the attribute that drives it. Most of the kit needs no JavaScript at the call site at all.

Entrances

  • revealdata-rm-reveal

Text

  • textRevealdata-rm-text
  • decryptdata-rm-decrypt
  • glitchdata-rm-glitch
  • shinydata-rm-shiny
  • countUpdata-rm-count
  • pressuredata-rm-pressure
  • morphdata-rm-morph
  • curvedata-rm-curve
  • odometerdata-rm-odometer
  • highlightdata-rm-highlight
  • outlinedata-rm-outline
  • rollTextdata-rm-roll
  • countdowndata-rm-countdown

Showpiece text

  • typewriterdata-rm-type
  • waveTextdata-rm-wave

Cursors

  • cursorjs
  • targetjs
  • crosshairjs
  • splashjs
  • magneticdata-rm-magnetic
  • cartoonCursorjs
  • blobCursorjs
  • trailCursorjs
  • sayCursordata-rm-say
  • spotlightCursorjs
  • arrowCursorjs
  • lensCursorjs

Cards

  • spotlightdata-rm-spotlight
  • tiltdata-rm-tilt
  • borderdata-rm-border
  • cardKitdata-rm-card-kit
  • layersdata-rm-layers
  • edgeLightdata-rm-edge
  • fandata-rm-fan
  • cardParallaxdata-rm-card-parallax

Surfaces

  • beamdata-rm-beam
  • traildata-rm-trail
  • glaredata-rm-glare
  • electricdata-rm-electric
  • blurEdgedata-rm-blur-edge
  • cornersdata-rm-corners

Fields and decoration

  • wavesjs
  • retroGridjs
  • dotGridjs
  • grainjs
  • meteorsdata-rm-meteors
  • sparklesdata-rm-sparkles
  • lampdata-rm-lamp
  • beamsdata-rm-beams
  • dotsdata-rm-dots
  • stripesdata-rm-stripes
  • scanlinedata-rm-scanline
  • meshdata-rm-mesh
  • starfielddata-rm-stars

Texture

  • ringsdata-rm-rings
  • hexGriddata-rm-hex
  • plusGriddata-rm-plus
  • diagonalsdata-rm-diagonals
  • topographydata-rm-topography
  • circuitdata-rm-circuit
  • vignettedata-rm-vignette
  • halftonedata-rm-halftone

Scroll

  • parallaxdata-rm-parallax
  • progressdata-rm-progress
  • horizontaldata-rm-horizontal
  • stackdata-rm-stack
  • scrubdata-rm-scrub
  • tracingdata-rm-tracing
  • flattendata-rm-flatten
  • stickydata-rm-sticky
  • skewdata-rm-skew
  • mosaicdata-rm-mosaic
  • zoomOutdata-rm-zoom-out
  • lineByLinedata-rm-lines-in
  • textMaskdata-rm-text-mask
  • timelinedata-rm-timeline
  • splitScrolldata-rm-split-scroll
  • revealGriddata-rm-reveal-grid
  • pinnedGallerydata-rm-pinned

More scroll

  • scrollCounterdata-rm-scroll-count
  • scrollRotatedata-rm-scroll-rotate
  • scrollScaledata-rm-scroll-scale
  • scrollBlurdata-rm-scroll-blur
  • scrollColourdata-rm-scroll-colour
  • pinStepsdata-rm-pin-steps
  • scrollDrawdata-rm-scroll-draw
  • depthLayersdata-rm-scroll-depth
  • scrollSnapSectionsdata-rm-snap-sections
  • revealMaskScrolldata-rm-scroll-mask
  • marqueeScrolldata-rm-scroll-marquee
  • scrollGradientdata-rm-scroll-gradient
  • scrollSplitdata-rm-scroll-split
  • scrollZoomPindata-rm-scroll-zoom
  • scrollTypeScaledata-rm-scroll-type

Media

  • imageRevealdata-rm-image-reveal
  • pixelatedata-rm-pixel
  • hoverPreviewdata-rm-preview
  • marqueedata-rm-marquee

Galleries

  • carouseldata-rm-carousel
  • ringdata-rm-ring
  • deckdata-rm-deck
  • imageTraildata-rm-image-trail
  • scratchdata-rm-scratch
  • dockdata-rm-dock
  • comparedata-rm-compare
  • panelsdata-rm-panels
  • orbitdata-rm-orbit
  • rippledata-rm-ripple
  • magnetLinesdata-rm-lines
  • dragdata-rm-drag
  • shuffledata-rm-shuffle
  • coverflowdata-rm-coverflow
  • thumbsdata-rm-thumbs
  • autoplaydata-rm-autoplay
  • wheeldata-rm-wheel
  • peekdata-rm-peek
  • tickerdata-rm-ticker
  • slideshowdata-rm-slideshow
  • masonrydata-rm-masonry
  • swipeStackdata-rm-swipe-stack
  • filmstripdata-rm-filmstrip
  • hoverPeekdata-rm-hover-peek
  • polaroidsdata-rm-polaroids
  • foldGallerydata-rm-fold
  • gridZoomdata-rm-grid-zoom
  • crossfadedata-rm-crossfade
  • parallaxGriddata-rm-parallax-grid
  • tiltGriddata-rm-tilt-grid
  • maskRevealdata-rm-mask-reveal
  • slatsdata-rm-slats
  • zoomStripdata-rm-zoom-strip
  • spiralGallerydata-rm-spiral
  • imageWalldata-rm-image-wall
  • flipGriddata-rm-flip-grid
  • peelStackdata-rm-peel
  • focusGriddata-rm-focus-grid
  • ribbondata-rm-ribbon
  • contactSheetdata-rm-contact-sheet

Buttons

  • filldata-rm-fill
  • shimmerdata-rm-shimmer
  • sparkdata-rm-spark
  • swapdata-rm-swap
  • confettijs
  • underlinedata-rm-underline
  • pressdata-rm-press
  • halodata-rm-halo
  • strokeDrawdata-rm-stroke
  • buttonKitdata-rm-btn

Navigation

  • pilldata-rm-pill
  • gooeydata-rm-gooey
  • condensedata-rm-condense
  • overlaydata-rm-overlay
  • tabsdata-rm-tabs
  • scrollSpydata-rm-spy
  • progressRingdata-rm-ring-progress
  • commanddata-rm-command
  • sidebardata-rm-sidebar
  • raildata-rm-rail
  • bottomNavdata-rm-bottom
  • megadata-rm-mega

Menu shapes

  • circleNavdata-rm-circle-nav
  • curtainNavdata-rm-curtain-nav
  • hoverSpreaddata-rm-hover-spread
  • breadcrumbsdata-rm-breadcrumbs
  • treeNavdata-rm-tree
  • splitNavdata-rm-split-nav
  • stackNavdata-rm-stack-nav
  • dotNavdata-rm-dot-nav

Things that open

  • accordiondata-rm-accordion
  • flipdata-rm-flip
  • expanddata-rm-expand
  • lightboxdata-rm-lightbox

Chrome

  • scrollbardata-rm-scrollbar
  • dropdowndata-rm-dropdown
  • tooltipdata-rm-tooltip
  • toggledata-rm-toggle
  • islanddata-rm-island
  • sheetdata-rm-sheet
  • segmenteddata-rm-segmented
  • frosteddata-rm-frosted
  • springModaldata-rm-modal
  • actionSheetdata-rm-actions
  • toastjs
  • contextMenudata-rm-context

Forms

  • floatLabeldata-rm-float
  • autoGrowdata-rm-grow
  • charCountdata-rm-count-chars
  • passwordToggledata-rm-password
  • validatedata-rm-validate
  • rangeFilldata-rm-range
  • fileDropdata-rm-drop
  • stepperdata-rm-steps
  • fieldFocusdata-rm-field-focus
  • submitStatedata-rm-submit
  • mascotdata-rm-mascot
  • successButtondata-rm-success
  • otpdata-rm-otp
  • padlockdata-rm-lock
  • inputKitdata-rm-input
  • searchFielddata-rm-search
  • tagsFielddata-rm-tags
  • selectFielddata-rm-select
  • clearabledata-rm-clearable
  • maskFielddata-rm-mask
  • inlineEditdata-rm-inline-edit

More forms

  • strengthMeterdata-rm-strength-meter
  • sliderPairdata-rm-slider-pair
  • ratingSliderdata-rm-rating-slider
  • colourFielddata-rm-colour
  • dateFielddata-rm-date-field
  • signaturePaddata-rm-signature
  • switchRowdata-rm-switch-row
  • quantityStepperdata-rm-quantity
  • consentBoxdata-rm-consent
  • formProgressdata-rm-form-progress
  • errorSummarydata-rm-error-summary

Feedback

  • skeletondata-rm-skeleton
  • spinnerdata-rm-spinner
  • progressBardata-rm-progress-bar
  • dotsLoaderdata-rm-dots-loader
  • pulseDotdata-rm-status
  • badgeCountdata-rm-badge
  • emptyStatedata-rm-empty

Notifications

  • toastStackdata-rm-toast-stack
  • snackbardata-rm-snackbar
  • bannerdata-rm-banner
  • inlineAlertdata-rm-inline-alert
  • pushCarddata-rm-push-card
  • belldata-rm-bell
  • counterdata-rm-counter
  • presenceDotdata-rm-presence
  • ribbonAlertdata-rm-ribbon-alert
  • statusBardata-rm-status-bar
  • progressToastdata-rm-progress-toast
  • undoBardata-rm-undo-bar
  • confirmSheetdata-rm-confirm-sheet
  • countdownNotedata-rm-countdown-note
  • stackedAvatarsdata-rm-stacked-avatars
  • typingDotsdata-rm-typing
  • liveTickerdata-rm-live-ticker
  • pillAlertdata-rm-pill-alert
  • cornerToastdata-rm-corner-toast
  • soundBadgedata-rm-sound-badge

Numbers

  • sparklinedata-rm-sparkline
  • barsdata-rm-bars
  • donutdata-rm-donut
  • gaugedata-rm-gauge
  • statdata-rm-stat
  • starsdata-rm-rating

More numbers

  • areaChartdata-rm-area-chart
  • stepChartdata-rm-step-chart
  • candlestickdata-rm-candles
  • waterfalldata-rm-waterfall
  • radardata-rm-radar
  • heatCalendardata-rm-heat-calendar
  • bulletChartdata-rm-bullet
  • funneldata-rm-funnel
  • treemapdata-rm-treemap
  • progressRingsdata-rm-activity-rings
  • comparisonBarsdata-rm-compare-bars
  • sparkBarsdata-rm-spark-bars
  • deltaBadgedata-rm-delta-badge
  • bigNumberdata-rm-big-number
  • rangeBardata-rm-range-bar
  • pieSlicesdata-rm-pie
  • scatterPlotdata-rm-scatter
  • timelineChartdata-rm-timeline-chart
  • meterRowdata-rm-meters
  • numberTickerdata-rm-number-ticker

Tasks and boards

  • taskListdata-rm-task-list
  • taskCheckdata-rm-task-check
  • taskReorderdata-rm-task-reorder
  • taskGroupdata-rm-task-group
  • kanbandata-rm-kanban
  • taskProgressdata-rm-task-progress
  • taskFilterdata-rm-task-filter
  • subtasksdata-rm-subtasks
  • taskDuedata-rm-task-due
  • taskPrioritydata-rm-task-priority
  • taskAssigneedata-rm-task-assignee
  • taskSwipedata-rm-task-swipe
  • taskUndodata-rm-task-undo
  • taskCountdata-rm-task-count
  • taskEmptydata-rm-task-empty
  • taskSearchdata-rm-task-search
  • taskBulkdata-rm-task-bulk
  • taskTimerdata-rm-task-timer
  • taskStreakdata-rm-task-streak
  • taskNotedata-rm-task-note

Profile

  • avatardata-rm-avatar
  • avatarUploaddata-rm-avatar-upload
  • profileCarddata-rm-profile-card
  • profileHeaderdata-rm-profile-header
  • userMenudata-rm-user-menu
  • accountSwitcherdata-rm-account-switcher
  • presenceRingdata-rm-presence-ring
  • followButtondata-rm-follow
  • bioRevealdata-rm-bio
  • socialRowdata-rm-social
  • statsRowdata-rm-stats
  • badgeRowdata-rm-badges
  • profileTabsdata-rm-profile-tabs
  • coverParallaxdata-rm-cover
  • identityChipdata-rm-identity

Writing and editing

  • editorToolbardata-rm-editor-toolbar
  • bubbleMenudata-rm-bubble-menu
  • slashMenudata-rm-slash-menu
  • mentionPickerdata-rm-mention-picker
  • blockHandledata-rm-block-handle
  • fencedCodedata-rm-code-block
  • markdownPreviewdata-rm-markdown-preview
  • findReplacedata-rm-find-replace
  • commentThreaddata-rm-comment-thread
  • suggestiondata-rm-suggestion
  • versionChipdata-rm-version-chip
  • outlinePanedata-rm-outline-pane
  • wordCountdata-rm-word-count
  • autosaveBadgedata-rm-autosave-badge
  • selectionToolbardata-rm-selection-toolbar
  • typewriterModedata-rm-typewriter

Calendars and time

  • monthGriddata-rm-month-grid
  • weekGriddata-rm-week-grid
  • dayTimelinedata-rm-day-timeline
  • nowLinedata-rm-now-line
  • miniCalendardata-rm-mini-calendar
  • dateRangedata-rm-date-range
  • timePickerdata-rm-time-picker
  • durationFielddata-rm-duration-field
  • timezonePilldata-rm-timezone-pill
  • availabilityGriddata-rm-availability-grid
  • bookingSlotsdata-rm-booking-slots
  • recurrenceBuilderdata-rm-recurrence
  • agendaListdata-rm-agenda-list
  • deadlinePilldata-rm-deadline-pill
  • eventChipdata-rm-event-chip
  • weekStripdata-rm-week-strip

Admin and tables

  • dataGriddata-rm-data-grid
  • columnPickerdata-rm-column-picker
  • bulkBardata-rm-bulk-bar
  • savedViewsdata-rm-saved-views
  • queryBardata-rm-query-bar
  • keyboardMapdata-rm-keyboard-map
  • logStreamdata-rm-log-stream
  • metricTiledata-rm-metric-tile
  • healthGriddata-rm-health-grid
  • auditRowdata-rm-audit-row
  • envSwitchdata-rm-env-switch
  • roleBadgedata-rm-role-badge
  • quotaMeterdata-rm-quota-meter
  • jobQueuedata-rm-job-queue
  • diffTabledata-rm-diff-table
  • exportMenudata-rm-export-menu

Media playback

  • playerBardata-rm-player-bar
  • scrubberdata-rm-scrubber
  • waveformdata-rm-waveform
  • chapterListdata-rm-chapter-list
  • captionToggledata-rm-caption-toggle
  • rateMenudata-rm-rate-menu
  • volumeDialdata-rm-volume-dial
  • pipToggledata-rm-pip-toggle
  • queueListdata-rm-queue-list
  • nowPlayingdata-rm-now-playing
  • transcriptSyncdata-rm-transcript-sync
  • thumbStripdata-rm-thumb-strip
  • liveBadgedata-rm-live-badge
  • bufferRingdata-rm-buffer-ring
  • miniPlayerdata-rm-mini-player
  • keyboardHintsdata-rm-keyboard-hints

Shop — product

  • productCarddata-rm-product-card
  • productGallerydata-rm-product-gallery
  • productZoomdata-rm-product-zoom
  • colourSwatchesdata-rm-swatches
  • sizePickerdata-rm-size-picker
  • priceTagdata-rm-price-tag
  • discountBadgedata-rm-discount-badge
  • stockMeterdata-rm-stock-meter
  • ratingStarsdata-rm-rating-stars
  • reviewSummarydata-rm-review-summary
  • addToCartdata-rm-add-to-cart
  • wishlistHeartdata-rm-wishlist
  • compareTraydata-rm-compare-tray
  • quickViewdata-rm-quick-view
  • productTabsdata-rm-product-tabs
  • variantPickerdata-rm-variant-picker
  • breadcrumbTraildata-rm-breadcrumb-trail
  • sortBardata-rm-sort-bar
  • filterPaneldata-rm-filter-panel
  • resultCountdata-rm-result-count

Shop — cart

  • cartDrawerdata-rm-cart-drawer
  • cartLinedata-rm-cart-line
  • cartTotalsdata-rm-cart-totals
  • cartEmptydata-rm-cart-empty
  • cartBadgedata-rm-cart-badge
  • miniCartdata-rm-mini-cart
  • freeShippingBardata-rm-free-shipping
  • couponFielddata-rm-coupon
  • checkoutStepsdata-rm-checkout-steps
  • orderSummarydata-rm-order-summary
  • paymentMethodsdata-rm-payment-methods
  • addressFormdata-rm-address-form
  • deliveryOptionsdata-rm-delivery-options
  • giftNotedata-rm-gift-note
  • orderConfirmdata-rm-order-confirm
  • orderTrackingdata-rm-order-tracking
  • returnRequestdata-rm-return-request
  • invoiceRowdata-rm-invoice-row
  • saveForLaterdata-rm-save-for-later
  • recentlyVieweddata-rm-recently-viewed

Shop — storefront

  • heroBannerdata-rm-hero-banner
  • collectionGriddata-rm-collection-grid
  • lookbookdata-rm-lookbook
  • categoryTilesdata-rm-category-tiles
  • saleCountdowndata-rm-sale-countdown
  • bundleBuilderdata-rm-bundle-builder
  • sizeGuidedata-rm-size-guide
  • stockNotifydata-rm-stock-notify
  • productVideodata-rm-product-video
  • swatchGallerydata-rm-swatch-gallery
  • badgeStackdata-rm-badge-stack
  • trustRowdata-rm-trust-row
  • shippingEstimatedata-rm-shipping-estimate
  • recentlyBoughtdata-rm-recently-bought
  • crossSelldata-rm-cross-sell
  • upsellRowdata-rm-upsell-row
  • giftCarddata-rm-gift-card
  • loyaltyPointsdata-rm-loyalty-points
  • referralBoxdata-rm-referral-box
  • subscribeBoxdata-rm-subscribe-box

Shop — account

  • orderListdata-rm-order-list
  • orderCarddata-rm-order-card
  • orderStatusPilldata-rm-order-status
  • trackingMapdata-rm-tracking-map
  • deliverySlotdata-rm-delivery-slot
  • addressBookdata-rm-address-book
  • addressCarddata-rm-address-card
  • paymentCardsdata-rm-payment-cards
  • subscriptionCarddata-rm-subscription-card
  • pauseSubscriptiondata-rm-pause-subscription
  • invoiceListdata-rm-invoice-list
  • downloadRowdata-rm-download-row
  • wishlistGriddata-rm-wishlist-grid
  • reviewFormdata-rm-review-form
  • reviewCarddata-rm-review-card
  • questionAnswerdata-rm-question-answer
  • supportTicketdata-rm-support-ticket
  • chatBubbledata-rm-chat-bubble
  • refundStatusdata-rm-refund-status
  • accountNavdata-rm-account-nav

Showpiece backgrounds

  • bubbleFielddata-rm-bubble-field
  • fireworksdata-rm-fireworks
  • gravityStarsdata-rm-gravity-stars
  • holeTunneldata-rm-hole-tunnel
  • radialIntrodata-rm-radial-intro
  • lightRaysdata-rm-light-rays
  • prismSplitdata-rm-prism-split
  • driftShapesdata-rm-drift-shapes
  • noiseWavedata-rm-noise-wave
  • linkWebdata-rm-link-web
  • ripplePooldata-rm-ripple-pool
  • glowOrbsdata-rm-glow-orbs

Showpiece controls

  • liquidButtondata-rm-liquid-button
  • flipButtondata-rm-flip-button
  • copyButtondata-rm-copy-button
  • themeToggledata-rm-theme-toggle
  • countButtondata-rm-count-button
  • flipCarddata-rm-flip-card
  • managementBardata-rm-management-bar
  • pinListdata-rm-pin-list
  • previewLinkCarddata-rm-preview-link
  • fileTreedata-rm-file-tree
  • presenceRowdata-rm-presence-row
  • morphIcondata-rm-morph-icon

Everything else

  • pricingTabledata-rm-pricing
  • planToggledata-rm-plan-toggle
  • featureMatrixdata-rm-feature-matrix
  • savingsBadgedata-rm-savings
  • quoteCarddata-rm-quote
  • logoWalldata-rm-logo-wall
  • ratingRowdata-rm-rating-row
  • faqListdata-rm-faq
  • helpTipdata-rm-help-tip
  • shortcutSheetdata-rm-shortcuts
  • tourStepdata-rm-tour
  • checklistCarddata-rm-checklist
  • welcomeCarddata-rm-welcome
  • footerColumnsdata-rm-footer-columns
  • announcementRowdata-rm-announcement
  • megaFooterdata-rm-mega-footer
  • sortableTabledata-rm-sortable
  • stickyHeaderTabledata-rm-sticky-head
  • rowExpanddata-rm-row-expand
  • tableEmptydata-rm-table-empty
  • codeBlockdata-rm-code
  • diffViewdata-rm-diff
  • apiRowdata-rm-api-row
  • uptimeDotsdata-rm-uptime
  • changelogFeeddata-rm-changelog
  • bentoGriddata-rm-bento
  • splitPaneldata-rm-split-panel
  • stickyAsidedata-rm-sticky-aside
  • dividerMarkdata-rm-divider
  • sectionMarkdata-rm-section-mark

Pages

  • pageTransitionjs

03Made of scrolling

Tied to position, never to a timer.

Which means every one of these runs backwards too. An animation that only plays forwards feels broken the instant somebody scrolls the other way — and most of them do.

tracing

A line drawn down the article as you read it: a real path revealed with stroke-dashoffset, which is why it can curve and why the glowing head sits exactly on it.

And here is highlight — the paragraph fills word by word as it crosses the viewport. The unlit state is a muted colour, never an opacity of zero, because prose you cannot read until you have scrolled far enough is a reading tax.

parallax

Back plate Front plate

scrub

--rm-progress runs 0 → 1 as this block crosses the viewport, and the stylesheet decides what that means. Anything expressible in CSS becomes scroll-driven without another component.

flatten

A panel lying flat as it scrolls into view

stack

01

The pin is CSS

Cards pile up and shrink as you pass them. The sticking is position: sticky; only the scale and the brightness are computed.

02

Each one lands lower

Every card sticks a little further down than the last, so the pile stays readable at the top rather than disappearing behind the front one.

03

And it degrades

Under reduced motion the whole effect is dropped and they are simply three cards, in order, at full size.

sticky

Plate for the first panel Plate for the second panel Plate for the third panel

One pinned visual

The pin is CSS. The only JavaScript decides which panel is in the reading position and swaps the image to match.

Text stays text

The panels are ordinary stacked content, so on a narrow screen you drop the sticky rule in a media query and it degrades to a normal article.

No second code path

No JavaScript branch for mobile, no separate template. The same markup, one rule lighter.

horizontal

Vertical scroll distance is mapped to horizontal travel by giving the wrapper height.

It never hijacks the wheel, so the trackpad, the keyboard and the scrollbar all keep working.

Which is exactly what the transform-and-wheel-listener version breaks, every time.

And under reduced motion it becomes a plain horizontally scrollable strip.

04Two states, one handle

Before and after, with the keyboard too.

Almost every before/after slider on the web is pointer-only, which leaves it unusable on a keyboard and invisible to a screen reader. This is a real role="slider": arrows, Home, End and an announced value. Dragging is the enhancement, not the only door.

Without motion With rage-motion

Drag it, or focus the handle and use ← →

05Hand it to your assistant

Teach these components to your AI.

Ask any assistant for a scroll reveal and it writes the same snippet it has written ten thousand times. It is not careless — it has no idea what is already in your project, so it writes the most average thing that could possibly work.

Without MCP

window.addEventListener("scroll", () => {
  document.querySelectorAll(".fade").forEach((el) => {
    if (el.getBoundingClientRect().top < innerHeight)
      el.classList.add("show");
  });
});

A layout read per element per event. And a .fade { opacity: 0 } waiting for the day the script does not load.

With MCP

<div data-rm-reveal="up" data-rm-delay="120">…</div>

It looks before it writes, finds the component you already have, and tells you why it chose it — because the reasoning travels with the component.

Claude Code
Cursor · Claude Desktop

No key, no account, no network. The server only reads files from the installed package.

06Take it with you

Three ways in.

One file

Every component depends only on core/motion.js. Take the two and go — that is how most people will use this, and it is designed for exactly that.

The package

npm i @soyrageagency/rage-motion
import { init } from "@soyrageagency/rage-motion";
import "@soyrageagency/rage-motion/css";
init();

No build

<link rel="stylesheet" href="…/rage-motion.css">
<script type="module">
  import { init } from "…/index.js";
  init();
</script>