Compatibility and runtime
Browser support
The supported desktop policy is the current and previous stable releases of Chromium, Firefox, and Safari. The mobile policy covers current Chrome on Android and Safari on iOS, with targeted Firefox for Android validation for select and combobox behavior.
CI runs the complete component suite in Chromium, Firefox, and WebKit. WebKit is the available cross-platform Safari engine check; release-critical mobile and assistive-technology behaviors still require the manual matrix in Accessibility testing.
Components feature-detect optional platform APIs and preserve a usable native path when an enhancement is unavailable. “Supported” therefore has two levels:
- Progressive baseline: meaningful native markup, form submission, label association, and ordinary links or controls remain available before upgrade or without JavaScript.
- Full enhancement: the custom element has upgraded and its richer popup, keyboard, focus, styling, or layout behavior is active in a supported browser.
Component pages document narrower platform caveats. In particular, read the
mobile notes for rc-select and
rc-combobox before choosing a popup mode.
Browser-only runtime
The packages are browser modules. Importing a component evaluates classes that
extend browser globals such as HTMLElement; importing the aggregate package
also evaluates the full collection. Node-only import safety, server-side custom
element rendering, declarative shadow DOM output, and hydration are not current
support contracts.
A server may emit the native fallback markup. Register components only in a client entry point:
<rc-select>
<select name="status" aria-label="Status">
<option>Draft</option>
<option>Published</option>
</select>
</rc-select>
// Client-only entry point
import '@rcarls/rc-webcomponents/rc-select/define';
Frameworks that evaluate route modules on the server should place registration behind their documented client-only boundary. The native child remains useful until the browser loads and upgrades the custom element; this is progressive enhancement, not component hydration.
Import choice
Prefer the aggregate package's per-component subpaths. They keep dependency management centralized without pulling unused components into the bundle:
import '@rcarls/rc-webcomponents/rc-button/define';
import '@rcarls/rc-webcomponents/rc-select/define';
Use @rcarls/rc-webcomponents/define only when the application genuinely wants
to register the entire collection. Likewise, import classes from component
subpaths such as @rcarls/rc-webcomponents/rc-select instead of the root class
barrel when bundle size matters. See Performance for measured
sizes.
Versioning
The collection is pre-1.0. Minor releases can contain intentional breaking API
changes, which are described by Changesets and release notes. Package versions
are locked together, so use one version across all @rcarls/* packages and
review migration notes before upgrading.