Getting StartedComponentsDesign TokensThemingTheme SynthesizerFrameworksAccessibilityUtilitiesServer RenderingBrowser SupportContributingChangelogApp ShellAspect GridAuth ShellCenterContainerDashboard GridFloat BarInsetMasonryPage HeaderPage LayoutResizableResponsive SwitcherSectionSettings LayoutSplit PaneStatus BarStickyToolbarAnchor NavBottom NavBreadcrumbBreadcrumb MenuCommand BarDrawerFooterLinkMenubarNavigation MenuPage IndicatorPaginationRailScroll IndicatorScroll SpyScroll To TopSidebarSkip LinkStepper NavTabsTop BarTree ViewAccordionAspect RatioAvatarAvatar GroupCardCarouselCollapsibleColor SwatchCTA BannerDividerEmpty StateFeature CardIconImageImage CompareImage HotspotsInfinite ScrollLightboxMarqueeQR CodeScroll AreaSkeletonSpinnerStackVideoVirtual ListActivity HeatmapAnimated NumberBadgeBar ListChartClockComparisonCountdown TimerData GridDescription ListDiffGaugeJSON TreeKanbanLevel MeterListMeterSparklineStatStepperTagTimelineUptimeValue CardWaveformBlockquoteCode BlockCode GroupGradient TextHighlightKbdKeyboard MapMarkdownNumber FormatProseTerminalTextTime AgoTruncateTypewriterButtonButton GroupCalendarCheckboxChipColor PickerComboboxCopy ButtonDate PickerDate Range PickerField ListFieldsetFile UploadFormHotkeyIcon ButtonImage CropperInline EditInputInput GroupKnobLabelMasked InputMulti SelectNumber InputPassword InputPin InputRadio GroupRange SliderRatingSearchSegmented ControlSelectSignature PadSliderSortable ListSwitch GroupTag InputTextareaTheme ToggleTime PickerToggleTransfer ListTree SelectAlertAnnouncementBannerCommand PaletteConfirmConnection StatusContext MenuConversationDialogDropdown MenuHover CardLoading OverlayNotification PanelPopoverProgressSheetToastTooltip
ARC UIARC Radiant Components
v4.9DocsComponentsTokensSynthesizer
Getting StartedFrameworksServer RenderingDesign TokensThemingTheme SynthesizerTypographyUtilitiesAll ComponentsAccessibilityBrowser SupportChangelogContributingStatsApp ShellAspect GridAuth ShellCenterContainerDashboard GridFloat BarInsetMasonryPage HeaderPage LayoutResizableResponsive SwitcherSectionSettings LayoutSplit PaneStatus BarStickyToolbarAnchor NavBottom NavBreadcrumbBreadcrumb MenuCommand BarDrawerFooterLinkMenubarNavigation MenuPage IndicatorPaginationRailScroll IndicatorScroll SpyScroll To TopSidebarSkip LinkStepper NavTabsTop BarTree ViewAccordionAspect RatioAvatarAvatar GroupCardCarouselCollapsibleColor SwatchCTA BannerDividerEmpty StateFeature CardIconImageImage CompareImage HotspotsInfinite ScrollLightboxMarqueeQR CodeScroll AreaSkeletonSpinnerStackVideoVirtual ListActivity HeatmapAnimated NumberBadgeBar ListChartClockComparisonCountdown TimerData GridDescription ListDiffGaugeJSON TreeKanbanLevel MeterListMeterSparklineStatStepperTagTimelineUptimeValue CardWaveformBlockquoteCode BlockCode GroupGradient TextHighlightKbdKeyboard MapMarkdownNumber FormatProseTerminalTextTime AgoTruncateTypewriterButtonButton GroupCalendarCheckboxChipColor PickerComboboxCopy ButtonDate PickerDate Range PickerField ListFieldsetFile UploadFormHotkeyIcon ButtonImage CropperInline EditInputInput GroupKnobLabelMasked InputMulti SelectNumber InputPassword InputPin InputRadio GroupRange SliderRatingSearchSegmented ControlSelectSignature PadSliderSortable ListSwitch GroupTag InputTextareaTheme ToggleTime PickerToggleTransfer ListTree SelectAlertAnnouncementBannerCommand PaletteConfirmConnection StatusContext MenuConversationDialogDropdown MenuHover CardLoading OverlayNotification PanelPopoverProgressSheetToastTooltip

Frameworks

Use ARC UI in React, Vue, Svelte, Angular, Solid, Preact, or no framework at all.

Overview

The core @arclux/arc-ui package contains Lit-based custom elements that work in any environment. Our code generator, Prism, parses the Lit source and produces a framework-native wrapper package for each framework:

  • Proper event binding (e.g. React's synthetic events)
  • TypeScript type definitions
  • Idiomatic imports for each framework
  • SSR compatibility where supported

React

Published as @arclux/arc-ui-react. Install it alongside the base stylesheet:

React wrappers use @lit/react createComponent, which handles event binding and ref forwarding.

Vue

Published as @arclux/arc-ui-vue. Install it alongside the base stylesheet:

Svelte

Published as @arclux/arc-ui-svelte. Install it alongside the base stylesheet:

Angular

Published as @arclux/arc-ui-angular. Install it alongside the base stylesheet:

Add the stylesheet to your global styles, then import the standalone components:

Solid

Published as @arclux/arc-ui-solid. Install it alongside the base stylesheet:

Preact

Published as @arclux/arc-ui-preact. Install it alongside the base stylesheet:

Without a wrapper

The wrappers are a convenience, not a requirement. Every component is a standard custom element, so <arc-button> works inside a framework template the moment the element is registered. This path has shipped since v3 and was documented nowhere; it is the right one if you would rather not add a dependency, or if you are already writing custom elements elsewhere in the app.

Register what you use, with a side-effect import per component or the whole catalog at once:

Telling your framework the tag is real

Most frameworks need one line so the compiler stops treating an unknown tag as a typo or a component of its own. Svelte and Solid need nothing.

Typed tags in JSX

React, Preact and Solid each get a generated declaration file that types every ARC tag, with the same props and enum unions as the wrapper packages.Add it to your program as a file. Atypes entry looks like the natural way to do it and silently does nothing: TypeScript resolves types as a package name and never follows an export subpath, so the name matches nothing, nothing is included, and every tag stays untyped without a diagnostic.

Swap in preact-jsx.d.ts or solid-jsx.d.ts as needed, or reference the file from one module instead:/// <reference path="./node_modules/@arclux/arc-ui/types/solid-jsx.d.ts" />

What you give up

Custom events are the whole difference, and it is not the same in every framework. Solid binds them natively (on:arc-change={handler}), and the declaration file types it. React 19 forwards unknown props to the element, so an event needs a ref and a listener. Preact is the strictest case: it lowercases the name after on, so a dashed event like arc-change cannot be reached from a plain prop at all, and a ref withaddEventListener is the only route.That listener wiring is what the wrapper packages are for. If you use custom events heavily in React or Preact, take the wrapper.

Vanilla JS / CDN

No framework needed. Use the core Web Component package directly:

Or via CDN with no build step:

For projects that can't use JavaScript, ARC UI also provides standalone CSS files.

See Also